1. (Bayesian). A new test for multinucleoside-resistant (MNR) human immunodeficiency virus type 1 (HIV-1) variants was recently developed. The test maintains 96% sensitivity, meaning that, for those with the disease, it will correctly report “positive” for 96% of them. The test is also 98% specific, meaning that, for those without the disease, 98% will be correctly reported as “negative.” MNR HIV-1 is considered to be rare (albeit emerging), with about a .1% or .001 prevalence rate. Given the prevalence rate, sensitivity, and specificity estimates, what is the probability that an individual who is reported as positive by the new test actually has the disease? If the median cost (consider this the best point estimate) is about $100,000 per positive case total and the test itself costs $1000 per administration, what is the total first-year cost for treating 100,000 individuals?

In Step 1, we calculate the probability of testing positive (P(Positive)) using the law of total probability. In Step 2, we use Bayes’ Theorem to calculate the probability of having the disease given a positive test result (P(Disease|Positive)).

#Given values
sensitivity <- 0.96  #Sensitivity of the test (probability of a true positive)
specificity <- 0.98  #Specificity of the test (probability of a true negative)
prevalence <- 0.001  #Prevalence rate of the disease in the population

#Step 1: Calculating P(Positive) using the law of total probability
p_positive <- (sensitivity * prevalence) + ((1 - specificity) * (1 - prevalence))

#Step 2: Calculating P(Disease|Positive) using Bayes' Theorem
p_disease_given_positive <- (sensitivity * prevalence) / p_positive

#Printing the results
cat("Step 1: Probability of testing positive (P(Positive)):", p_positive, "\n")
## Step 1: Probability of testing positive (P(Positive)): 0.02094
cat("Step 2: Probability of having the disease given a positive test result (P(Disease|Positive)):", p_disease_given_positive, "\n")
## Step 2: Probability of having the disease given a positive test result (P(Disease|Positive)): 0.04584527
  1. (Binomial). The probability of your organization receiving a Joint Commission inspection in any given month is .05. What is the probability that, after 24 months, you received exactly 2 inspections? What is the probability that, after 24 months, you received 2 or more inspections? What is the probability that your received fewer than 2 inspections? What is the expected number of inspections you should have received? What is the standard deviation?

For this exercise let’s use functions dbinom and pbinom to calculate probabilities for a binomial distribution.

#Given values
probability_inspection <- 0.05  #Probability of receiving an inspection in any given month
number_of_months <- 24  #Total number of months

#Step 1: Probability of receiving exactly 2 inspections after 24 months (using dbinom function)
p_exactly_2_inspections <- dbinom(2, size = number_of_months, prob = probability_inspection)

#Step 2: Probability of receiving 2 or more inspections after 24 months (using pbinom function)
p_2_or_more_inspections <- 1 - pbinom(1, size = number_of_months, prob = probability_inspection)

#Step 3: Probability of receiving fewer than 2 inspections after 24 months (using pbinom function)
p_fewer_than_2_inspections <- pbinom(1, size = number_of_months, prob = probability_inspection)

#Step 4: Expected number of inspections (mean of the binomial distribution)
expected_inspections <- number_of_months * probability_inspection

#Step 5: Standard deviation of the number of inspections (using sqrt and dbinom functions)
standard_deviation <- sqrt(number_of_months * probability_inspection * (1 - probability_inspection))

#Printing the results
cat("Step 1: Probability of exactly 2 inspections after 24 months:", p_exactly_2_inspections, "\n")
## Step 1: Probability of exactly 2 inspections after 24 months: 0.2232381
cat("Step 2: Probability of 2 or more inspections after 24 months:", p_2_or_more_inspections, "\n")
## Step 2: Probability of 2 or more inspections after 24 months: 0.3391827
cat("Step 3: Probability of fewer than 2 inspections after 24 months:", p_fewer_than_2_inspections, "\n")
## Step 3: Probability of fewer than 2 inspections after 24 months: 0.6608173
cat("Step 4: Expected number of inspections:", expected_inspections, "\n")
## Step 4: Expected number of inspections: 1.2
cat("Step 5: Standard deviation of the number of inspections:", standard_deviation, "\n")
## Step 5: Standard deviation of the number of inspections: 1.067708
  1. (Poisson). You are modeling the family practice clinic and notice that patients arrive at a rate of 10 per hour. What is the probability that exactly 3 arrive in one hour? What is the probability that more than 10 arrive in one hour? How many would you expect to arrive in 8 hours? What is the standard deviation of the appropriate probability distribution? If there are three family practice providers that can see 24 templated patients each day, what is the percent utilization and what are your recommendations?

For this exercise lets use functions dpois and ppois to calculate probabilities for a Poisson distribution.

#Given values
arrival_rate_per_hour <- 10  #Patients arrive at a rate of 10 per hour
hours <- 1  #Time period is one hour
providers <- 3  #Number of family practice providers
templated_patients_per_provider <- 24  #Each provider can see 24 templated patients

#Step 1: Probability of exactly 3 patients arriving in one hour (using dpois function)
p_exactly_3_arrivals <- dpois(3, lambda = arrival_rate_per_hour * hours)

#Step 2: Probability of more than 10 patients arriving in one hour (using 1 - ppois function)
p_more_than_10_arrivals <- 1 - ppois(10, lambda = arrival_rate_per_hour * hours)

#Step 3: Expected number of arrivals in 8 hours (use lambda * time period)
expected_arrivals_8_hours <- arrival_rate_per_hour * 8

#Step 4: Standard deviation of the number of arrivals (using sqrt and dpois functions)
standard_deviation <- sqrt(arrival_rate_per_hour * hours)

#Step 5: Calculating percent utilization
percent_utilization <- (providers * templated_patients_per_provider) / expected_arrivals_8_hours * 100

#Printing the results
cat("Step 1: Probability of exactly 3 patients arriving in one hour:", p_exactly_3_arrivals, "\n")
## Step 1: Probability of exactly 3 patients arriving in one hour: 0.007566655
cat("Step 2: Probability of more than 10 patients arriving in one hour:", p_more_than_10_arrivals, "\n")
## Step 2: Probability of more than 10 patients arriving in one hour: 0.4169602
cat("Step 3: Expected number of arrivals in 8 hours:", expected_arrivals_8_hours, "\n")
## Step 3: Expected number of arrivals in 8 hours: 80
cat("Step 4: Standard deviation of the number of arrivals:", standard_deviation, "\n")
## Step 4: Standard deviation of the number of arrivals: 3.162278
cat("Step 5: Percent utilization:", percent_utilization, "%\n")
## Step 5: Percent utilization: 90 %
  1. (Hypergeometric). Your subordinate with 30 supervisors was recently accused of favoring nurses. 15 of the subordinate’s workers are nurses and 15 are other than nurses. As evidence of malfeasance, the accuser stated that there were 6 company-paid trips to Disney World for which everyone was eligible. The supervisor sent 5 nurses and 1 non-nurse. If your subordinate acted innocently, what was the probability he/she would have selected five nurses for the trips? How many nurses would we have expected your subordinate to send? How many non-nurses would we have expected your subordinate to send?

For this exercise lets use the dhyper function to calculate the probability for a Hypergeometric distribution

#Given values
total_supervisors <- 30
total_nurses <- 15
total_non_nurses <- 15
total_trips <- 6
selected_nurses <- 5
selected_non_nurses <- 1

#Step 1: Probability of selecting 5 nurses out of 6 for the trips (using dhyper function)
p_selecting_5_nurses <- dhyper(selected_nurses, total_nurses, total_non_nurses, total_trips)

#Step 2: Expected number of nurses selected (using mean of hypergeometric distribution)
expected_nurses <- (total_nurses * total_trips) / total_supervisors

#Step 3: Expected number of non-nurses selected (using mean of hypergeometric distribution)
expected_non_nurses <- (total_non_nurses * total_trips) / total_supervisors

#Printing the results
cat("Step 1: Probability of selecting 5 nurses out of 6 for the trips:", p_selecting_5_nurses, "\n")
## Step 1: Probability of selecting 5 nurses out of 6 for the trips: 0.07586207
cat("Step 2: Expected number of nurses selected:", expected_nurses, "\n")
## Step 2: Expected number of nurses selected: 3
cat("Step 3: Expected number of non-nurses selected:", expected_non_nurses, "\n")
## Step 3: Expected number of non-nurses selected: 3
  1. (Geometric). The probability of being seriously injured in a car crash in an unspecified location is about .1% per hour. A driver is required to traverse this area for 1200 hours in the course of a year. What is the probability that the driver will be seriously injured during the course of the year? In the course of 15 months? What is the expected number of hours that a driver will drive before being seriously injured? Given that a driver has driven 1200 hours, what is the probability that he or she will be injured in the next 100 hours?

For this exercise lets use the pgeom function to calculate probabilities for a Geometric distribution.

#Given values
probability_per_hour <- 0.001
total_hours_per_year <- 1200
hours_in_15_months <- 1200 + (15 / 12 * 24)  #Assuming an average of 24 hours per month
hours_before_injury <- 100

#Step 1: Probability of being seriously injured during the course of the year (using pgeom function)
p_injured_in_year <- pgeom(total_hours_per_year, probability_per_hour, lower.tail = TRUE)

#Step 2: Probability of being seriously injured in 15 months (using pgeom function)
p_injured_in_15_months <- pgeom(hours_in_15_months, probability_per_hour, lower.tail = TRUE)

#Step 3: Expected number of hours before being seriously injured (using mean of geometric distribution)
expected_hours_before_injury <- 1 / probability_per_hour

#Step 4: Probability of being injured in the next 100 hours given 1200 hours of driving (using pgeom function)
p_injured_in_next_100_hours <- pgeom(hours_before_injury, probability_per_hour, lower.tail = TRUE)

#Printing the results
cat("Step 1: Probability of being seriously injured during the course of the year:", p_injured_in_year, "\n")
## Step 1: Probability of being seriously injured during the course of the year: 0.6992876
cat("Step 2: Probability of being seriously injured in 15 months:", p_injured_in_15_months, "\n")
## Step 2: Probability of being seriously injured in 15 months: 0.7081794
cat("Step 3: Expected number of hours before being seriously injured:", expected_hours_before_injury, "\n")
## Step 3: Expected number of hours before being seriously injured: 1000
cat("Step 4: Probability of being injured in the next 100 hours given 1200 hours of driving:", p_injured_in_next_100_hours, "\n")
## Step 4: Probability of being injured in the next 100 hours given 1200 hours of driving: 0.09611265
  1. You are working in a hospital that is running off of a primary generator which fails about once in 1000 hours. What is the probability that the generator will fail more than twice in 1000 hours? What is the expected value?

For this exercise lets use the ppois function to calculate probabilities for a Poisson distribution.

#Given values
failure_rate_per_hour <- 1 / 1000  #Probability of failure per hour
time_period <- 1000  #Total hours

#Step 1: Probability of the generator failing more than twice in 1000 hours (using ppois function)
p_failure_more_than_twice <- 1 - ppois(2, lambda = failure_rate_per_hour * time_period)

#Step 2: Expected value (mean) for the number of failures in 1000 hours (using lambda = mean of Poisson)
expected_failures <- failure_rate_per_hour * time_period

#Printing the results
cat("Step 1: Probability of the generator failing more than twice in 1000 hours:", p_failure_more_than_twice, "\n")
## Step 1: Probability of the generator failing more than twice in 1000 hours: 0.0803014
cat("Step 2: Expected value for the number of failures in 1000 hours:", expected_failures, "\n")
## Step 2: Expected value for the number of failures in 1000 hours: 1
  1. A surgical patient arrives for surgery precisely at a given time. Based on previous analysis (or a lack of knowledge assumption), you know that the waiting time is uniformly distributed from 0 to 30 minutes. What is the probability that this patient will wait more than 10 minutes? If the patient has already waited 10 minutes, what is the probability that he/she will wait at least another 5 minutes prior to being seen? What is the expected waiting time?

For this exercise lets use the punif function, which calculates probabilities for a uniform distribution.

#Given values
lower_bound <- 0  #Lower bound of the uniform distribution (in minutes)
upper_bound <- 30  #Upper bound of the uniform distribution (in minutes)

#Step 1: Probability that the patient will wait more than 10 minutes
p_waiting_more_than_10_minutes <- 1 - punif(10, min = lower_bound, max = upper_bound)

#Step 2: Probability that, having already waited 10 minutes, the patient will wait at least another 5 minutes
p_waiting_at_least_another_5_minutes <- 1 - punif(15, min = lower_bound, max = upper_bound)

#Step 3: Expected waiting time (mean of the uniform distribution)
expected_waiting_time <- (lower_bound + upper_bound) / 2

#Printing the results
cat("Step 1: Probability of waiting more than 10 minutes:", p_waiting_more_than_10_minutes, "\n")
## Step 1: Probability of waiting more than 10 minutes: 0.6666667
cat("Step 2: Probability of waiting at least another 5 minutes after already waiting 10 minutes:", p_waiting_at_least_another_5_minutes, "\n")
## Step 2: Probability of waiting at least another 5 minutes after already waiting 10 minutes: 0.5
cat("Step 3: Expected waiting time:", expected_waiting_time, "minutes\n")
## Step 3: Expected waiting time: 15 minutes
  1. Your hospital owns an old MRI, which has a manufacturer’s lifetime of about 10 years (expected value). Based on previous studies, we know that the failure of most MRIs obeys an exponential distribution. What is the expected failure time? What is the standard deviation? What is the probability that your MRI will fail after 8 years? Now assume that you have owned the machine for 8 years. Given that you already owned the machine 8 years, what is the probability that it will fail in the next two years?

For this exercise lets use the pexp function, which calculates probabilities for an exponential distribution.

#Given values
expected_lifetime <- 10  #Expected lifetime of the MRI in years

#Step 1: Expected failure time (mean of the exponential distribution)
expected_failure_time <- expected_lifetime

#Step 2: Standard deviation of the exponential distribution
standard_deviation <- 1  #For an exponential distribution, the standard deviation is equal to the mean

#Step 3: Probability that the MRI will fail after 8 years
p_failure_after_8_years <- pexp(8, rate = 1/expected_lifetime)

#Step 4: Given that you already owned the machine for 8 years, probability of failure in the next two years
p_failure_in_next_two_years <- pexp(2, rate = 1/expected_lifetime)

#Printing the results
cat("Step 1: Expected failure time:", expected_failure_time, "years\n")
## Step 1: Expected failure time: 10 years
cat("Step 2: Standard deviation of the exponential distribution:", standard_deviation, "years\n")
## Step 2: Standard deviation of the exponential distribution: 1 years
cat("Step 3: Probability of failure after 8 years:", p_failure_after_8_years, "\n")
## Step 3: Probability of failure after 8 years: 0.550671
cat("Step 4: Probability of failure in the next two years, given ownership for 8 years:", p_failure_in_next_two_years, "\n")
## Step 4: Probability of failure in the next two years, given ownership for 8 years: 0.1812692
LS0tDQp0aXRsZTogIkRhdGEgNjA1IGhvbWV3b3JrIDUiDQphdXRob3I6ICJMYXVyYSBQIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQoNCjEuIChCYXllc2lhbikuIEEgbmV3IHRlc3QgZm9yIG11bHRpbnVjbGVvc2lkZS1yZXNpc3RhbnQgKE1OUikgaHVtYW4gaW1tdW5vZGVmaWNpZW5jeSB2aXJ1cyB0eXBlIDENCihISVYtMSkgdmFyaWFudHMgd2FzIHJlY2VudGx5IGRldmVsb3BlZC4gVGhlIHRlc3QgbWFpbnRhaW5zIDk2JSBzZW5zaXRpdml0eSwgbWVhbmluZyB0aGF0LCBmb3IgdGhvc2UNCndpdGggdGhlIGRpc2Vhc2UsIGl0IHdpbGwgY29ycmVjdGx5IHJlcG9ydCDigJxwb3NpdGl2ZeKAnSBmb3IgOTYlIG9mIHRoZW0uIFRoZSB0ZXN0IGlzIGFsc28gOTglIHNwZWNpZmljLA0KbWVhbmluZyB0aGF0LCBmb3IgdGhvc2Ugd2l0aG91dCB0aGUgZGlzZWFzZSwgOTglIHdpbGwgYmUgY29ycmVjdGx5IHJlcG9ydGVkIGFzIOKAnG5lZ2F0aXZlLuKAnSBNTlIgSElWLTENCmlzIGNvbnNpZGVyZWQgdG8gYmUgcmFyZSAoYWxiZWl0IGVtZXJnaW5nKSwgd2l0aCBhYm91dCBhIC4xJSBvciAuMDAxIHByZXZhbGVuY2UgcmF0ZS4gR2l2ZW4gdGhlDQpwcmV2YWxlbmNlIHJhdGUsIHNlbnNpdGl2aXR5LCBhbmQgc3BlY2lmaWNpdHkgZXN0aW1hdGVzLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGFuIGluZGl2aWR1YWwgd2hvIGlzDQpyZXBvcnRlZCBhcyBwb3NpdGl2ZSBieSB0aGUgbmV3IHRlc3QgYWN0dWFsbHkgaGFzIHRoZSBkaXNlYXNlPyBJZiB0aGUgbWVkaWFuIGNvc3QgKGNvbnNpZGVyIHRoaXMgdGhlIGJlc3QNCnBvaW50IGVzdGltYXRlKSBpcyBhYm91dCAkMTAwLDAwMCBwZXIgcG9zaXRpdmUgY2FzZSB0b3RhbCBhbmQgdGhlIHRlc3QgaXRzZWxmIGNvc3RzICQxMDAwIHBlcg0KYWRtaW5pc3RyYXRpb24sIHdoYXQgaXMgdGhlIHRvdGFsIGZpcnN0LXllYXIgY29zdCBmb3IgdHJlYXRpbmcgMTAwLDAwMCBpbmRpdmlkdWFscz8NCg0KSW4gU3RlcCAxLCB3ZSBjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IG9mIHRlc3RpbmcgcG9zaXRpdmUgKFAoUG9zaXRpdmUpKSB1c2luZyB0aGUgbGF3IG9mIHRvdGFsIHByb2JhYmlsaXR5LiBJbiBTdGVwIDIsIHdlIHVzZSBCYXllcycgVGhlb3JlbSB0byBjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IG9mIGhhdmluZyB0aGUgZGlzZWFzZSBnaXZlbiBhIHBvc2l0aXZlIHRlc3QgcmVzdWx0IChQKERpc2Vhc2V8UG9zaXRpdmUpKS4NCg0KYGBge3J9DQojR2l2ZW4gdmFsdWVzDQpzZW5zaXRpdml0eSA8LSAwLjk2ICAjU2Vuc2l0aXZpdHkgb2YgdGhlIHRlc3QgKHByb2JhYmlsaXR5IG9mIGEgdHJ1ZSBwb3NpdGl2ZSkNCnNwZWNpZmljaXR5IDwtIDAuOTggICNTcGVjaWZpY2l0eSBvZiB0aGUgdGVzdCAocHJvYmFiaWxpdHkgb2YgYSB0cnVlIG5lZ2F0aXZlKQ0KcHJldmFsZW5jZSA8LSAwLjAwMSAgI1ByZXZhbGVuY2UgcmF0ZSBvZiB0aGUgZGlzZWFzZSBpbiB0aGUgcG9wdWxhdGlvbg0KDQojU3RlcCAxOiBDYWxjdWxhdGluZyBQKFBvc2l0aXZlKSB1c2luZyB0aGUgbGF3IG9mIHRvdGFsIHByb2JhYmlsaXR5DQpwX3Bvc2l0aXZlIDwtIChzZW5zaXRpdml0eSAqIHByZXZhbGVuY2UpICsgKCgxIC0gc3BlY2lmaWNpdHkpICogKDEgLSBwcmV2YWxlbmNlKSkNCg0KI1N0ZXAgMjogQ2FsY3VsYXRpbmcgUChEaXNlYXNlfFBvc2l0aXZlKSB1c2luZyBCYXllcycgVGhlb3JlbQ0KcF9kaXNlYXNlX2dpdmVuX3Bvc2l0aXZlIDwtIChzZW5zaXRpdml0eSAqIHByZXZhbGVuY2UpIC8gcF9wb3NpdGl2ZQ0KDQojUHJpbnRpbmcgdGhlIHJlc3VsdHMNCmNhdCgiU3RlcCAxOiBQcm9iYWJpbGl0eSBvZiB0ZXN0aW5nIHBvc2l0aXZlIChQKFBvc2l0aXZlKSk6IiwgcF9wb3NpdGl2ZSwgIlxuIikNCmNhdCgiU3RlcCAyOiBQcm9iYWJpbGl0eSBvZiBoYXZpbmcgdGhlIGRpc2Vhc2UgZ2l2ZW4gYSBwb3NpdGl2ZSB0ZXN0IHJlc3VsdCAoUChEaXNlYXNlfFBvc2l0aXZlKSk6IiwgcF9kaXNlYXNlX2dpdmVuX3Bvc2l0aXZlLCAiXG4iKQ0KDQpgYGANCg0KMi4gKEJpbm9taWFsKS4gVGhlIHByb2JhYmlsaXR5IG9mIHlvdXIgb3JnYW5pemF0aW9uIHJlY2VpdmluZyBhIEpvaW50IENvbW1pc3Npb24gaW5zcGVjdGlvbiBpbiBhbnkgZ2l2ZW4NCm1vbnRoIGlzIC4wNS4gV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCwgYWZ0ZXIgMjQgbW9udGhzLCB5b3UgcmVjZWl2ZWQgZXhhY3RseSAyIGluc3BlY3Rpb25zPyBXaGF0IGlzDQp0aGUgcHJvYmFiaWxpdHkgdGhhdCwgYWZ0ZXIgMjQgbW9udGhzLCB5b3UgcmVjZWl2ZWQgMiBvciBtb3JlIGluc3BlY3Rpb25zPyBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0DQp5b3VyIHJlY2VpdmVkIGZld2VyIHRoYW4gMiBpbnNwZWN0aW9ucz8gV2hhdCBpcyB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGluc3BlY3Rpb25zIHlvdSBzaG91bGQgaGF2ZQ0KcmVjZWl2ZWQ/IFdoYXQgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbj8NCg0KDQpGb3IgdGhpcyBleGVyY2lzZSBsZXQncyB1c2UgZnVuY3Rpb25zIGRiaW5vbSBhbmQgcGJpbm9tIHRvIGNhbGN1bGF0ZSBwcm9iYWJpbGl0aWVzIGZvciBhIGJpbm9taWFsIGRpc3RyaWJ1dGlvbi4NCmBgYHtyfQ0KI0dpdmVuIHZhbHVlcw0KcHJvYmFiaWxpdHlfaW5zcGVjdGlvbiA8LSAwLjA1ICAjUHJvYmFiaWxpdHkgb2YgcmVjZWl2aW5nIGFuIGluc3BlY3Rpb24gaW4gYW55IGdpdmVuIG1vbnRoDQpudW1iZXJfb2ZfbW9udGhzIDwtIDI0ICAjVG90YWwgbnVtYmVyIG9mIG1vbnRocw0KDQojU3RlcCAxOiBQcm9iYWJpbGl0eSBvZiByZWNlaXZpbmcgZXhhY3RseSAyIGluc3BlY3Rpb25zIGFmdGVyIDI0IG1vbnRocyAodXNpbmcgZGJpbm9tIGZ1bmN0aW9uKQ0KcF9leGFjdGx5XzJfaW5zcGVjdGlvbnMgPC0gZGJpbm9tKDIsIHNpemUgPSBudW1iZXJfb2ZfbW9udGhzLCBwcm9iID0gcHJvYmFiaWxpdHlfaW5zcGVjdGlvbikNCg0KI1N0ZXAgMjogUHJvYmFiaWxpdHkgb2YgcmVjZWl2aW5nIDIgb3IgbW9yZSBpbnNwZWN0aW9ucyBhZnRlciAyNCBtb250aHMgKHVzaW5nIHBiaW5vbSBmdW5jdGlvbikNCnBfMl9vcl9tb3JlX2luc3BlY3Rpb25zIDwtIDEgLSBwYmlub20oMSwgc2l6ZSA9IG51bWJlcl9vZl9tb250aHMsIHByb2IgPSBwcm9iYWJpbGl0eV9pbnNwZWN0aW9uKQ0KDQojU3RlcCAzOiBQcm9iYWJpbGl0eSBvZiByZWNlaXZpbmcgZmV3ZXIgdGhhbiAyIGluc3BlY3Rpb25zIGFmdGVyIDI0IG1vbnRocyAodXNpbmcgcGJpbm9tIGZ1bmN0aW9uKQ0KcF9mZXdlcl90aGFuXzJfaW5zcGVjdGlvbnMgPC0gcGJpbm9tKDEsIHNpemUgPSBudW1iZXJfb2ZfbW9udGhzLCBwcm9iID0gcHJvYmFiaWxpdHlfaW5zcGVjdGlvbikNCg0KI1N0ZXAgNDogRXhwZWN0ZWQgbnVtYmVyIG9mIGluc3BlY3Rpb25zIChtZWFuIG9mIHRoZSBiaW5vbWlhbCBkaXN0cmlidXRpb24pDQpleHBlY3RlZF9pbnNwZWN0aW9ucyA8LSBudW1iZXJfb2ZfbW9udGhzICogcHJvYmFiaWxpdHlfaW5zcGVjdGlvbg0KDQojU3RlcCA1OiBTdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG51bWJlciBvZiBpbnNwZWN0aW9ucyAodXNpbmcgc3FydCBhbmQgZGJpbm9tIGZ1bmN0aW9ucykNCnN0YW5kYXJkX2RldmlhdGlvbiA8LSBzcXJ0KG51bWJlcl9vZl9tb250aHMgKiBwcm9iYWJpbGl0eV9pbnNwZWN0aW9uICogKDEgLSBwcm9iYWJpbGl0eV9pbnNwZWN0aW9uKSkNCg0KI1ByaW50aW5nIHRoZSByZXN1bHRzDQpjYXQoIlN0ZXAgMTogUHJvYmFiaWxpdHkgb2YgZXhhY3RseSAyIGluc3BlY3Rpb25zIGFmdGVyIDI0IG1vbnRoczoiLCBwX2V4YWN0bHlfMl9pbnNwZWN0aW9ucywgIlxuIikNCmNhdCgiU3RlcCAyOiBQcm9iYWJpbGl0eSBvZiAyIG9yIG1vcmUgaW5zcGVjdGlvbnMgYWZ0ZXIgMjQgbW9udGhzOiIsIHBfMl9vcl9tb3JlX2luc3BlY3Rpb25zLCAiXG4iKQ0KY2F0KCJTdGVwIDM6IFByb2JhYmlsaXR5IG9mIGZld2VyIHRoYW4gMiBpbnNwZWN0aW9ucyBhZnRlciAyNCBtb250aHM6IiwgcF9mZXdlcl90aGFuXzJfaW5zcGVjdGlvbnMsICJcbiIpDQpjYXQoIlN0ZXAgNDogRXhwZWN0ZWQgbnVtYmVyIG9mIGluc3BlY3Rpb25zOiIsIGV4cGVjdGVkX2luc3BlY3Rpb25zLCAiXG4iKQ0KY2F0KCJTdGVwIDU6IFN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIGluc3BlY3Rpb25zOiIsIHN0YW5kYXJkX2RldmlhdGlvbiwgIlxuIikNCg0KYGBgDQoNCjMuIChQb2lzc29uKS4gWW91IGFyZSBtb2RlbGluZyB0aGUgZmFtaWx5IHByYWN0aWNlIGNsaW5pYyBhbmQgbm90aWNlIHRoYXQgcGF0aWVudHMgYXJyaXZlIGF0IGEgcmF0ZSBvZiAxMCBwZXINCmhvdXIuIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgZXhhY3RseSAzIGFycml2ZSBpbiBvbmUgaG91cj8gV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCBtb3JlIHRoYW4NCjEwIGFycml2ZSBpbiBvbmUgaG91cj8gSG93IG1hbnkgd291bGQgeW91IGV4cGVjdCB0byBhcnJpdmUgaW4gOCBob3Vycz8gV2hhdCBpcyB0aGUgc3RhbmRhcmQNCmRldmlhdGlvbiBvZiB0aGUgYXBwcm9wcmlhdGUgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uPyBJZiB0aGVyZSBhcmUgdGhyZWUgZmFtaWx5IHByYWN0aWNlIHByb3ZpZGVycyB0aGF0IGNhbg0Kc2VlIDI0IHRlbXBsYXRlZCBwYXRpZW50cyBlYWNoIGRheSwgd2hhdCBpcyB0aGUgcGVyY2VudCB1dGlsaXphdGlvbiBhbmQgd2hhdCBhcmUgeW91ciByZWNvbW1lbmRhdGlvbnM/DQoNCkZvciB0aGlzIGV4ZXJjaXNlIGxldHMgdXNlIGZ1bmN0aW9ucyBkcG9pcyBhbmQgcHBvaXMgdG8gY2FsY3VsYXRlIHByb2JhYmlsaXRpZXMgZm9yIGEgUG9pc3NvbiBkaXN0cmlidXRpb24uDQoNCmBgYHtyfQ0KI0dpdmVuIHZhbHVlcw0KYXJyaXZhbF9yYXRlX3Blcl9ob3VyIDwtIDEwICAjUGF0aWVudHMgYXJyaXZlIGF0IGEgcmF0ZSBvZiAxMCBwZXIgaG91cg0KaG91cnMgPC0gMSAgI1RpbWUgcGVyaW9kIGlzIG9uZSBob3VyDQpwcm92aWRlcnMgPC0gMyAgI051bWJlciBvZiBmYW1pbHkgcHJhY3RpY2UgcHJvdmlkZXJzDQp0ZW1wbGF0ZWRfcGF0aWVudHNfcGVyX3Byb3ZpZGVyIDwtIDI0ICAjRWFjaCBwcm92aWRlciBjYW4gc2VlIDI0IHRlbXBsYXRlZCBwYXRpZW50cw0KDQojU3RlcCAxOiBQcm9iYWJpbGl0eSBvZiBleGFjdGx5IDMgcGF0aWVudHMgYXJyaXZpbmcgaW4gb25lIGhvdXIgKHVzaW5nIGRwb2lzIGZ1bmN0aW9uKQ0KcF9leGFjdGx5XzNfYXJyaXZhbHMgPC0gZHBvaXMoMywgbGFtYmRhID0gYXJyaXZhbF9yYXRlX3Blcl9ob3VyICogaG91cnMpDQoNCiNTdGVwIDI6IFByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAxMCBwYXRpZW50cyBhcnJpdmluZyBpbiBvbmUgaG91ciAodXNpbmcgMSAtIHBwb2lzIGZ1bmN0aW9uKQ0KcF9tb3JlX3RoYW5fMTBfYXJyaXZhbHMgPC0gMSAtIHBwb2lzKDEwLCBsYW1iZGEgPSBhcnJpdmFsX3JhdGVfcGVyX2hvdXIgKiBob3VycykNCg0KI1N0ZXAgMzogRXhwZWN0ZWQgbnVtYmVyIG9mIGFycml2YWxzIGluIDggaG91cnMgKHVzZSBsYW1iZGEgKiB0aW1lIHBlcmlvZCkNCmV4cGVjdGVkX2Fycml2YWxzXzhfaG91cnMgPC0gYXJyaXZhbF9yYXRlX3Blcl9ob3VyICogOA0KDQojU3RlcCA0OiBTdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG51bWJlciBvZiBhcnJpdmFscyAodXNpbmcgc3FydCBhbmQgZHBvaXMgZnVuY3Rpb25zKQ0Kc3RhbmRhcmRfZGV2aWF0aW9uIDwtIHNxcnQoYXJyaXZhbF9yYXRlX3Blcl9ob3VyICogaG91cnMpDQoNCiNTdGVwIDU6IENhbGN1bGF0aW5nIHBlcmNlbnQgdXRpbGl6YXRpb24NCnBlcmNlbnRfdXRpbGl6YXRpb24gPC0gKHByb3ZpZGVycyAqIHRlbXBsYXRlZF9wYXRpZW50c19wZXJfcHJvdmlkZXIpIC8gZXhwZWN0ZWRfYXJyaXZhbHNfOF9ob3VycyAqIDEwMA0KDQojUHJpbnRpbmcgdGhlIHJlc3VsdHMNCmNhdCgiU3RlcCAxOiBQcm9iYWJpbGl0eSBvZiBleGFjdGx5IDMgcGF0aWVudHMgYXJyaXZpbmcgaW4gb25lIGhvdXI6IiwgcF9leGFjdGx5XzNfYXJyaXZhbHMsICJcbiIpDQpjYXQoIlN0ZXAgMjogUHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuIDEwIHBhdGllbnRzIGFycml2aW5nIGluIG9uZSBob3VyOiIsIHBfbW9yZV90aGFuXzEwX2Fycml2YWxzLCAiXG4iKQ0KY2F0KCJTdGVwIDM6IEV4cGVjdGVkIG51bWJlciBvZiBhcnJpdmFscyBpbiA4IGhvdXJzOiIsIGV4cGVjdGVkX2Fycml2YWxzXzhfaG91cnMsICJcbiIpDQpjYXQoIlN0ZXAgNDogU3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBudW1iZXIgb2YgYXJyaXZhbHM6Iiwgc3RhbmRhcmRfZGV2aWF0aW9uLCAiXG4iKQ0KY2F0KCJTdGVwIDU6IFBlcmNlbnQgdXRpbGl6YXRpb246IiwgcGVyY2VudF91dGlsaXphdGlvbiwgIiVcbiIpDQoNCmBgYA0KDQo0LiAoSHlwZXJnZW9tZXRyaWMpLiBZb3VyIHN1Ym9yZGluYXRlIHdpdGggMzAgc3VwZXJ2aXNvcnMgd2FzIHJlY2VudGx5IGFjY3VzZWQgb2YgZmF2b3JpbmcgbnVyc2VzLiAxNQ0Kb2YgdGhlIHN1Ym9yZGluYXRl4oCZcyB3b3JrZXJzIGFyZSBudXJzZXMgYW5kIDE1IGFyZSBvdGhlciB0aGFuIG51cnNlcy4gQXMgZXZpZGVuY2Ugb2YgbWFsZmVhc2FuY2UsIHRoZQ0KYWNjdXNlciBzdGF0ZWQgdGhhdCB0aGVyZSB3ZXJlIDYgY29tcGFueS1wYWlkIHRyaXBzIHRvIERpc25leSBXb3JsZCBmb3Igd2hpY2ggZXZlcnlvbmUgd2FzIGVsaWdpYmxlLg0KVGhlIHN1cGVydmlzb3Igc2VudCA1IG51cnNlcyBhbmQgMSBub24tbnVyc2UuIElmIHlvdXIgc3Vib3JkaW5hdGUgYWN0ZWQgaW5ub2NlbnRseSwgd2hhdCB3YXMgdGhlDQpwcm9iYWJpbGl0eSBoZS9zaGUgd291bGQgaGF2ZSBzZWxlY3RlZCBmaXZlIG51cnNlcyBmb3IgdGhlIHRyaXBzPyBIb3cgbWFueSBudXJzZXMgd291bGQgd2UgaGF2ZQ0KZXhwZWN0ZWQgeW91ciBzdWJvcmRpbmF0ZSB0byBzZW5kPyBIb3cgbWFueSBub24tbnVyc2VzIHdvdWxkIHdlIGhhdmUgZXhwZWN0ZWQgeW91ciBzdWJvcmRpbmF0ZSB0bw0Kc2VuZD8NCg0KDQpGb3IgdGhpcyBleGVyY2lzZSBsZXRzIHVzZSB0aGUgZGh5cGVyIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgcHJvYmFiaWxpdHkgZm9yIGEgSHlwZXJnZW9tZXRyaWMgZGlzdHJpYnV0aW9uDQoNCmBgYHtyfQ0KI0dpdmVuIHZhbHVlcw0KdG90YWxfc3VwZXJ2aXNvcnMgPC0gMzANCnRvdGFsX251cnNlcyA8LSAxNQ0KdG90YWxfbm9uX251cnNlcyA8LSAxNQ0KdG90YWxfdHJpcHMgPC0gNg0Kc2VsZWN0ZWRfbnVyc2VzIDwtIDUNCnNlbGVjdGVkX25vbl9udXJzZXMgPC0gMQ0KDQojU3RlcCAxOiBQcm9iYWJpbGl0eSBvZiBzZWxlY3RpbmcgNSBudXJzZXMgb3V0IG9mIDYgZm9yIHRoZSB0cmlwcyAodXNpbmcgZGh5cGVyIGZ1bmN0aW9uKQ0KcF9zZWxlY3RpbmdfNV9udXJzZXMgPC0gZGh5cGVyKHNlbGVjdGVkX251cnNlcywgdG90YWxfbnVyc2VzLCB0b3RhbF9ub25fbnVyc2VzLCB0b3RhbF90cmlwcykNCg0KI1N0ZXAgMjogRXhwZWN0ZWQgbnVtYmVyIG9mIG51cnNlcyBzZWxlY3RlZCAodXNpbmcgbWVhbiBvZiBoeXBlcmdlb21ldHJpYyBkaXN0cmlidXRpb24pDQpleHBlY3RlZF9udXJzZXMgPC0gKHRvdGFsX251cnNlcyAqIHRvdGFsX3RyaXBzKSAvIHRvdGFsX3N1cGVydmlzb3JzDQoNCiNTdGVwIDM6IEV4cGVjdGVkIG51bWJlciBvZiBub24tbnVyc2VzIHNlbGVjdGVkICh1c2luZyBtZWFuIG9mIGh5cGVyZ2VvbWV0cmljIGRpc3RyaWJ1dGlvbikNCmV4cGVjdGVkX25vbl9udXJzZXMgPC0gKHRvdGFsX25vbl9udXJzZXMgKiB0b3RhbF90cmlwcykgLyB0b3RhbF9zdXBlcnZpc29ycw0KDQojUHJpbnRpbmcgdGhlIHJlc3VsdHMNCmNhdCgiU3RlcCAxOiBQcm9iYWJpbGl0eSBvZiBzZWxlY3RpbmcgNSBudXJzZXMgb3V0IG9mIDYgZm9yIHRoZSB0cmlwczoiLCBwX3NlbGVjdGluZ181X251cnNlcywgIlxuIikNCmNhdCgiU3RlcCAyOiBFeHBlY3RlZCBudW1iZXIgb2YgbnVyc2VzIHNlbGVjdGVkOiIsIGV4cGVjdGVkX251cnNlcywgIlxuIikNCmNhdCgiU3RlcCAzOiBFeHBlY3RlZCBudW1iZXIgb2Ygbm9uLW51cnNlcyBzZWxlY3RlZDoiLCBleHBlY3RlZF9ub25fbnVyc2VzLCAiXG4iKQ0KDQpgYGANCg0KDQo1LiAoR2VvbWV0cmljKS4gVGhlIHByb2JhYmlsaXR5IG9mIGJlaW5nIHNlcmlvdXNseSBpbmp1cmVkIGluIGEgY2FyIGNyYXNoIGluIGFuIHVuc3BlY2lmaWVkIGxvY2F0aW9uIGlzIGFib3V0DQouMSUgcGVyIGhvdXIuIEEgZHJpdmVyIGlzIHJlcXVpcmVkIHRvIHRyYXZlcnNlIHRoaXMgYXJlYSBmb3IgMTIwMCBob3VycyBpbiB0aGUgY291cnNlIG9mIGEgeWVhci4gV2hhdCBpcw0KdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIGRyaXZlciB3aWxsIGJlIHNlcmlvdXNseSBpbmp1cmVkIGR1cmluZyB0aGUgY291cnNlIG9mIHRoZSB5ZWFyPyBJbiB0aGUgY291cnNlIG9mIDE1DQptb250aHM/IFdoYXQgaXMgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBob3VycyB0aGF0IGEgZHJpdmVyIHdpbGwgZHJpdmUgYmVmb3JlIGJlaW5nIHNlcmlvdXNseSBpbmp1cmVkPw0KR2l2ZW4gdGhhdCBhIGRyaXZlciBoYXMgZHJpdmVuIDEyMDAgaG91cnMsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgaGUgb3Igc2hlIHdpbGwgYmUgaW5qdXJlZCBpbiB0aGUNCm5leHQgMTAwIGhvdXJzPw0KDQpGb3IgdGhpcyBleGVyY2lzZSBsZXRzIHVzZSB0aGUgcGdlb20gZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHByb2JhYmlsaXRpZXMgZm9yIGEgR2VvbWV0cmljIGRpc3RyaWJ1dGlvbi4NCg0KYGBge3J9DQojR2l2ZW4gdmFsdWVzDQpwcm9iYWJpbGl0eV9wZXJfaG91ciA8LSAwLjAwMQ0KdG90YWxfaG91cnNfcGVyX3llYXIgPC0gMTIwMA0KaG91cnNfaW5fMTVfbW9udGhzIDwtIDEyMDAgKyAoMTUgLyAxMiAqIDI0KSAgI0Fzc3VtaW5nIGFuIGF2ZXJhZ2Ugb2YgMjQgaG91cnMgcGVyIG1vbnRoDQpob3Vyc19iZWZvcmVfaW5qdXJ5IDwtIDEwMA0KDQojU3RlcCAxOiBQcm9iYWJpbGl0eSBvZiBiZWluZyBzZXJpb3VzbHkgaW5qdXJlZCBkdXJpbmcgdGhlIGNvdXJzZSBvZiB0aGUgeWVhciAodXNpbmcgcGdlb20gZnVuY3Rpb24pDQpwX2luanVyZWRfaW5feWVhciA8LSBwZ2VvbSh0b3RhbF9ob3Vyc19wZXJfeWVhciwgcHJvYmFiaWxpdHlfcGVyX2hvdXIsIGxvd2VyLnRhaWwgPSBUUlVFKQ0KDQojU3RlcCAyOiBQcm9iYWJpbGl0eSBvZiBiZWluZyBzZXJpb3VzbHkgaW5qdXJlZCBpbiAxNSBtb250aHMgKHVzaW5nIHBnZW9tIGZ1bmN0aW9uKQ0KcF9pbmp1cmVkX2luXzE1X21vbnRocyA8LSBwZ2VvbShob3Vyc19pbl8xNV9tb250aHMsIHByb2JhYmlsaXR5X3Blcl9ob3VyLCBsb3dlci50YWlsID0gVFJVRSkNCg0KI1N0ZXAgMzogRXhwZWN0ZWQgbnVtYmVyIG9mIGhvdXJzIGJlZm9yZSBiZWluZyBzZXJpb3VzbHkgaW5qdXJlZCAodXNpbmcgbWVhbiBvZiBnZW9tZXRyaWMgZGlzdHJpYnV0aW9uKQ0KZXhwZWN0ZWRfaG91cnNfYmVmb3JlX2luanVyeSA8LSAxIC8gcHJvYmFiaWxpdHlfcGVyX2hvdXINCg0KI1N0ZXAgNDogUHJvYmFiaWxpdHkgb2YgYmVpbmcgaW5qdXJlZCBpbiB0aGUgbmV4dCAxMDAgaG91cnMgZ2l2ZW4gMTIwMCBob3VycyBvZiBkcml2aW5nICh1c2luZyBwZ2VvbSBmdW5jdGlvbikNCnBfaW5qdXJlZF9pbl9uZXh0XzEwMF9ob3VycyA8LSBwZ2VvbShob3Vyc19iZWZvcmVfaW5qdXJ5LCBwcm9iYWJpbGl0eV9wZXJfaG91ciwgbG93ZXIudGFpbCA9IFRSVUUpDQoNCiNQcmludGluZyB0aGUgcmVzdWx0cw0KY2F0KCJTdGVwIDE6IFByb2JhYmlsaXR5IG9mIGJlaW5nIHNlcmlvdXNseSBpbmp1cmVkIGR1cmluZyB0aGUgY291cnNlIG9mIHRoZSB5ZWFyOiIsIHBfaW5qdXJlZF9pbl95ZWFyLCAiXG4iKQ0KY2F0KCJTdGVwIDI6IFByb2JhYmlsaXR5IG9mIGJlaW5nIHNlcmlvdXNseSBpbmp1cmVkIGluIDE1IG1vbnRoczoiLCBwX2luanVyZWRfaW5fMTVfbW9udGhzLCAiXG4iKQ0KY2F0KCJTdGVwIDM6IEV4cGVjdGVkIG51bWJlciBvZiBob3VycyBiZWZvcmUgYmVpbmcgc2VyaW91c2x5IGluanVyZWQ6IiwgZXhwZWN0ZWRfaG91cnNfYmVmb3JlX2luanVyeSwgIlxuIikNCmNhdCgiU3RlcCA0OiBQcm9iYWJpbGl0eSBvZiBiZWluZyBpbmp1cmVkIGluIHRoZSBuZXh0IDEwMCBob3VycyBnaXZlbiAxMjAwIGhvdXJzIG9mIGRyaXZpbmc6IiwgcF9pbmp1cmVkX2luX25leHRfMTAwX2hvdXJzLCAiXG4iKQ0KDQpgYGANCg0KDQoNCg0KNi4gWW91IGFyZSB3b3JraW5nIGluIGEgaG9zcGl0YWwgdGhhdCBpcyBydW5uaW5nIG9mZiBvZiBhIHByaW1hcnkgZ2VuZXJhdG9yIHdoaWNoIGZhaWxzIGFib3V0IG9uY2UgaW4gMTAwMA0KaG91cnMuIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIGdlbmVyYXRvciB3aWxsIGZhaWwgbW9yZSB0aGFuIHR3aWNlIGluIDEwMDAgaG91cnM/IFdoYXQgaXMgdGhlDQpleHBlY3RlZCB2YWx1ZT8NCg0KRm9yIHRoaXMgZXhlcmNpc2UgbGV0cyB1c2UgdGhlIHBwb2lzIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBwcm9iYWJpbGl0aWVzIGZvciBhIFBvaXNzb24gZGlzdHJpYnV0aW9uLg0KDQoNCmBgYHtyfQ0KI0dpdmVuIHZhbHVlcw0KZmFpbHVyZV9yYXRlX3Blcl9ob3VyIDwtIDEgLyAxMDAwICAjUHJvYmFiaWxpdHkgb2YgZmFpbHVyZSBwZXIgaG91cg0KdGltZV9wZXJpb2QgPC0gMTAwMCAgI1RvdGFsIGhvdXJzDQoNCiNTdGVwIDE6IFByb2JhYmlsaXR5IG9mIHRoZSBnZW5lcmF0b3IgZmFpbGluZyBtb3JlIHRoYW4gdHdpY2UgaW4gMTAwMCBob3VycyAodXNpbmcgcHBvaXMgZnVuY3Rpb24pDQpwX2ZhaWx1cmVfbW9yZV90aGFuX3R3aWNlIDwtIDEgLSBwcG9pcygyLCBsYW1iZGEgPSBmYWlsdXJlX3JhdGVfcGVyX2hvdXIgKiB0aW1lX3BlcmlvZCkNCg0KI1N0ZXAgMjogRXhwZWN0ZWQgdmFsdWUgKG1lYW4pIGZvciB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzIGluIDEwMDAgaG91cnMgKHVzaW5nIGxhbWJkYSA9IG1lYW4gb2YgUG9pc3NvbikNCmV4cGVjdGVkX2ZhaWx1cmVzIDwtIGZhaWx1cmVfcmF0ZV9wZXJfaG91ciAqIHRpbWVfcGVyaW9kDQoNCiNQcmludGluZyB0aGUgcmVzdWx0cw0KY2F0KCJTdGVwIDE6IFByb2JhYmlsaXR5IG9mIHRoZSBnZW5lcmF0b3IgZmFpbGluZyBtb3JlIHRoYW4gdHdpY2UgaW4gMTAwMCBob3VyczoiLCBwX2ZhaWx1cmVfbW9yZV90aGFuX3R3aWNlLCAiXG4iKQ0KY2F0KCJTdGVwIDI6IEV4cGVjdGVkIHZhbHVlIGZvciB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzIGluIDEwMDAgaG91cnM6IiwgZXhwZWN0ZWRfZmFpbHVyZXMsICJcbiIpDQoNCmBgYA0KDQoNCjcuIEEgc3VyZ2ljYWwgcGF0aWVudCBhcnJpdmVzIGZvciBzdXJnZXJ5IHByZWNpc2VseSBhdCBhIGdpdmVuIHRpbWUuIEJhc2VkIG9uIHByZXZpb3VzIGFuYWx5c2lzIChvciBhIGxhY2sgb2YNCmtub3dsZWRnZSBhc3N1bXB0aW9uKSwgeW91IGtub3cgdGhhdCB0aGUgd2FpdGluZyB0aW1lIGlzIHVuaWZvcm1seSBkaXN0cmlidXRlZCBmcm9tIDAgdG8gMzAgbWludXRlcy4NCldoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhpcyBwYXRpZW50IHdpbGwgd2FpdCBtb3JlIHRoYW4gMTAgbWludXRlcz8gSWYgdGhlIHBhdGllbnQgaGFzIGFscmVhZHkNCndhaXRlZCAxMCBtaW51dGVzLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGhlL3NoZSB3aWxsIHdhaXQgYXQgbGVhc3QgYW5vdGhlciA1IG1pbnV0ZXMgcHJpb3IgdG8gYmVpbmcNCnNlZW4/IFdoYXQgaXMgdGhlIGV4cGVjdGVkIHdhaXRpbmcgdGltZT8NCg0KRm9yIHRoaXMgZXhlcmNpc2UgbGV0cyB1c2UgdGhlIHB1bmlmIGZ1bmN0aW9uLCB3aGljaCBjYWxjdWxhdGVzIHByb2JhYmlsaXRpZXMgZm9yIGEgdW5pZm9ybSBkaXN0cmlidXRpb24uDQoNCg0KYGBge3J9DQojR2l2ZW4gdmFsdWVzDQpsb3dlcl9ib3VuZCA8LSAwICAjTG93ZXIgYm91bmQgb2YgdGhlIHVuaWZvcm0gZGlzdHJpYnV0aW9uIChpbiBtaW51dGVzKQ0KdXBwZXJfYm91bmQgPC0gMzAgICNVcHBlciBib3VuZCBvZiB0aGUgdW5pZm9ybSBkaXN0cmlidXRpb24gKGluIG1pbnV0ZXMpDQoNCiNTdGVwIDE6IFByb2JhYmlsaXR5IHRoYXQgdGhlIHBhdGllbnQgd2lsbCB3YWl0IG1vcmUgdGhhbiAxMCBtaW51dGVzDQpwX3dhaXRpbmdfbW9yZV90aGFuXzEwX21pbnV0ZXMgPC0gMSAtIHB1bmlmKDEwLCBtaW4gPSBsb3dlcl9ib3VuZCwgbWF4ID0gdXBwZXJfYm91bmQpDQoNCiNTdGVwIDI6IFByb2JhYmlsaXR5IHRoYXQsIGhhdmluZyBhbHJlYWR5IHdhaXRlZCAxMCBtaW51dGVzLCB0aGUgcGF0aWVudCB3aWxsIHdhaXQgYXQgbGVhc3QgYW5vdGhlciA1IG1pbnV0ZXMNCnBfd2FpdGluZ19hdF9sZWFzdF9hbm90aGVyXzVfbWludXRlcyA8LSAxIC0gcHVuaWYoMTUsIG1pbiA9IGxvd2VyX2JvdW5kLCBtYXggPSB1cHBlcl9ib3VuZCkNCg0KI1N0ZXAgMzogRXhwZWN0ZWQgd2FpdGluZyB0aW1lIChtZWFuIG9mIHRoZSB1bmlmb3JtIGRpc3RyaWJ1dGlvbikNCmV4cGVjdGVkX3dhaXRpbmdfdGltZSA8LSAobG93ZXJfYm91bmQgKyB1cHBlcl9ib3VuZCkgLyAyDQoNCiNQcmludGluZyB0aGUgcmVzdWx0cw0KY2F0KCJTdGVwIDE6IFByb2JhYmlsaXR5IG9mIHdhaXRpbmcgbW9yZSB0aGFuIDEwIG1pbnV0ZXM6IiwgcF93YWl0aW5nX21vcmVfdGhhbl8xMF9taW51dGVzLCAiXG4iKQ0KY2F0KCJTdGVwIDI6IFByb2JhYmlsaXR5IG9mIHdhaXRpbmcgYXQgbGVhc3QgYW5vdGhlciA1IG1pbnV0ZXMgYWZ0ZXIgYWxyZWFkeSB3YWl0aW5nIDEwIG1pbnV0ZXM6IiwgcF93YWl0aW5nX2F0X2xlYXN0X2Fub3RoZXJfNV9taW51dGVzLCAiXG4iKQ0KY2F0KCJTdGVwIDM6IEV4cGVjdGVkIHdhaXRpbmcgdGltZToiLCBleHBlY3RlZF93YWl0aW5nX3RpbWUsICJtaW51dGVzXG4iKQ0KDQpgYGANCg0KDQo4LiBZb3VyIGhvc3BpdGFsIG93bnMgYW4gb2xkIE1SSSwgd2hpY2ggaGFzIGEgbWFudWZhY3R1cmVy4oCZcyBsaWZldGltZSBvZiBhYm91dCAxMCB5ZWFycyAoZXhwZWN0ZWQgdmFsdWUpLg0KQmFzZWQgb24gcHJldmlvdXMgc3R1ZGllcywgd2Uga25vdyB0aGF0IHRoZSBmYWlsdXJlIG9mIG1vc3QgTVJJcyBvYmV5cyBhbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb24uDQpXaGF0IGlzIHRoZSBleHBlY3RlZCBmYWlsdXJlIHRpbWU/IFdoYXQgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbj8gV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCB5b3VyDQpNUkkgd2lsbCBmYWlsIGFmdGVyIDggeWVhcnM/IE5vdyBhc3N1bWUgdGhhdCB5b3UgaGF2ZSBvd25lZCB0aGUgbWFjaGluZSBmb3IgOCB5ZWFycy4gR2l2ZW4gdGhhdCB5b3UNCmFscmVhZHkgb3duZWQgdGhlIG1hY2hpbmUgOCB5ZWFycywgd2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCBpdCB3aWxsIGZhaWwgaW4gdGhlIG5leHQgdHdvIHllYXJzPyANCg0KRm9yIHRoaXMgZXhlcmNpc2UgbGV0cyB1c2UgdGhlIHBleHAgZnVuY3Rpb24sIHdoaWNoIGNhbGN1bGF0ZXMgcHJvYmFiaWxpdGllcyBmb3IgYW4gZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uLiANCg0KYGBge3J9DQojR2l2ZW4gdmFsdWVzDQpleHBlY3RlZF9saWZldGltZSA8LSAxMCAgI0V4cGVjdGVkIGxpZmV0aW1lIG9mIHRoZSBNUkkgaW4geWVhcnMNCg0KI1N0ZXAgMTogRXhwZWN0ZWQgZmFpbHVyZSB0aW1lIChtZWFuIG9mIHRoZSBleHBvbmVudGlhbCBkaXN0cmlidXRpb24pDQpleHBlY3RlZF9mYWlsdXJlX3RpbWUgPC0gZXhwZWN0ZWRfbGlmZXRpbWUNCg0KI1N0ZXAgMjogU3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBleHBvbmVudGlhbCBkaXN0cmlidXRpb24NCnN0YW5kYXJkX2RldmlhdGlvbiA8LSAxICAjRm9yIGFuIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiwgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBpcyBlcXVhbCB0byB0aGUgbWVhbg0KDQojU3RlcCAzOiBQcm9iYWJpbGl0eSB0aGF0IHRoZSBNUkkgd2lsbCBmYWlsIGFmdGVyIDggeWVhcnMNCnBfZmFpbHVyZV9hZnRlcl84X3llYXJzIDwtIHBleHAoOCwgcmF0ZSA9IDEvZXhwZWN0ZWRfbGlmZXRpbWUpDQoNCiNTdGVwIDQ6IEdpdmVuIHRoYXQgeW91IGFscmVhZHkgb3duZWQgdGhlIG1hY2hpbmUgZm9yIDggeWVhcnMsIHByb2JhYmlsaXR5IG9mIGZhaWx1cmUgaW4gdGhlIG5leHQgdHdvIHllYXJzDQpwX2ZhaWx1cmVfaW5fbmV4dF90d29feWVhcnMgPC0gcGV4cCgyLCByYXRlID0gMS9leHBlY3RlZF9saWZldGltZSkNCg0KI1ByaW50aW5nIHRoZSByZXN1bHRzDQpjYXQoIlN0ZXAgMTogRXhwZWN0ZWQgZmFpbHVyZSB0aW1lOiIsIGV4cGVjdGVkX2ZhaWx1cmVfdGltZSwgInllYXJzXG4iKQ0KY2F0KCJTdGVwIDI6IFN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uOiIsIHN0YW5kYXJkX2RldmlhdGlvbiwgInllYXJzXG4iKQ0KY2F0KCJTdGVwIDM6IFByb2JhYmlsaXR5IG9mIGZhaWx1cmUgYWZ0ZXIgOCB5ZWFyczoiLCBwX2ZhaWx1cmVfYWZ0ZXJfOF95ZWFycywgIlxuIikNCmNhdCgiU3RlcCA0OiBQcm9iYWJpbGl0eSBvZiBmYWlsdXJlIGluIHRoZSBuZXh0IHR3byB5ZWFycywgZ2l2ZW4gb3duZXJzaGlwIGZvciA4IHllYXJzOiIsIHBfZmFpbHVyZV9pbl9uZXh0X3R3b195ZWFycywgIlxuIikNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg==