#1(A)

# Set parameters
N <- 1000
p <- 0.5
iterations <- 5000

# Initialize vector to store results
odds_ratios <- numeric(iterations)

# Simulate data and calculate odds ratios
for (i in 1:iterations) {
  # Generate sample of Bernoulli random variables
  sample_data <- rbinom(N, 1, p)
  
  # Calculate sample average
  sample_average <- mean(sample_data)
  
  # Calculate odds ratio
  odds_ratio <- sample_average / (1 - sample_average)
  
  # Store result
  odds_ratios[i] <- odds_ratio
}

# Plot histogram of simulated odds ratios
hist(odds_ratios, freq = FALSE, breaks = 30, main = "Histogram of Simulated Odds Ratios",
     xlab = "Odds Ratio", ylab = "Density")

# Calculate mean and variance of odds ratios
mean_odds_ratio <- mean(odds_ratios)
var_odds_ratio <- var(odds_ratios)

# Calculate standard error using Delta method
se_delta_method <- sqrt((1/(1-p)^3)*(p/N))

# Plot normal distribution with mean and standard error
curve(dnorm(x, mean = mean_odds_ratio, sd = se_delta_method), 
      col = "blue", lwd = 2, add = TRUE)

#1(B)

# Set parameters
N_values <- c(10, 30, 50, 100, 500)
p <- 0.5
iterations <- 5000

# Function to calculate standard error using Delta method
calculate_se_delta_method <- function(p, N) {
  return(sqrt((1/(1-p)^3)*(p/N)))
}

# Function to simulate data and plot histogram for given N
simulate_and_plot <- function(N) {
  # Initialize vector to store results
  odds_ratios <- numeric(iterations)
  
  # Simulate data and calculate odds ratios
  for (i in 1:iterations) {
    # Generate sample of Bernoulli random variables
    sample_data <- rbinom(N, 1, p)
    
    # Calculate sample average
    sample_average <- mean(sample_data)
    
    # Calculate odds ratio
    odds_ratio <- sample_average / (1 - sample_average)
    
    # Store result
    odds_ratios[i] <- odds_ratio
  }
  
  # Plot histogram of simulated odds ratios
  hist(odds_ratios, freq = FALSE, breaks = 30, 
       main = paste("Histogram of Simulated Odds Ratios (N =", N, ")"),
       xlab = "Odds Ratio", ylab = "Density")
  
  # Calculate mean and variance of odds ratios
  mean_odds_ratio <- mean(odds_ratios)
  var_odds_ratio <- var(odds_ratios)
  
  # Calculate standard error using Delta method
  se_delta_method <- calculate_se_delta_method(p, N)
  
  # Plot normal distribution with mean and standard error
  curve(dnorm(x, mean = mean_odds_ratio, sd = se_delta_method), 
        col = "blue", lwd = 2, add = TRUE)
  
  # Add legend
  legend("topright", legend = "Normal Curve", col = "blue", lwd = 2)
}

# Loop over different values of N
for (N in N_values) {
  simulate_and_plot(N)
}

#2(A)

# Function to compute g(p)
compute_g <- function(p) {
  return(p / (1 - p))
}

# Function to compute delta method approximation for expected value
compute_expected_value <- function(sample_mean) {
  return(sample_mean / (1 - sample_mean))
}

# Function to compute delta method approximation for variance
compute_variance <- function(sample_mean, N, p) {
  g_prime <- 1 / ((1 - p)^2)
  var_x_bar <- p * (1 - p) / N
  return((g_prime^2 * var_x_bar) / (p / (1 - p)))
}

# Set the sample sizes and true parameters
sample_sizes <- c(10, 30, 100, 1000)
true_parameters <- c(0.01, 0.1, 0.25, 0.5, 0.75, 0.9, 0.99)

# Store results
results <- data.frame()

# Loop through each simulation configuration
for (N in sample_sizes) {
  for (p in true_parameters) {
    # Repeat 100 times for each configuration
    for (i in 1:100) {
      # Step 1: Sample Generation
      sample_data <- rbinom(N, 1, p)
      
      # Step 2: Compute Sample Mean
      sample_mean <- mean(sample_data)
      
      # Step 3: Calculate g(X_bar)
      g_x_bar <- compute_g(sample_mean)
      
      # Step 4: Compute Delta Method Approximation for Expected Value
      estimated_expected_value <- compute_expected_value(sample_mean)
      
      # Step 5: Compute Delta Method Approximation for Variance
      estimated_variance <- compute_variance(sample_mean, N, p)
      
      # Store results
      result <- data.frame(Sample_Size = N,
                           True_Parameter = p,
                           Estimated_Expected_Value = estimated_expected_value,
                           Estimated_Variance = estimated_variance)
      results <- rbind(results, result)
    }
  }
}

# Save results to CSV
write.csv(results, file = "delta_method_results_monday.csv", row.names = FALSE)

#2(A) (Another solution for finding Samples)

# Function to generate samples and compute delta method estimates
generate_samples <- function(sample_sizes, true_parameters) {
  # Function to compute g(p)
  compute_g <- function(p) {
    return(p / (1 - p))
  }
  
  # Function to compute delta method approximation for expected value
  compute_expected_value <- function(sample_mean) {
    return(sample_mean / (1 - sample_mean))
  }
  
  # Function to compute delta method approximation for variance
  compute_variance <- function(sample_mean, N, p) {
    g_prime <- 1 / ((1 - p)^2)
    var_x_bar <- p * (1 - p) / N
    return((g_prime^2 * var_x_bar) / (p / (1 - p)))
  }
  
  # Store results
  results <- list()
  
  # Loop through each simulation configuration
  for (N in sample_sizes) {
    for (p in true_parameters) {
      sample_data <- list()
      estimates <- list()
      
      # Repeat 100 times for each configuration
      for (i in 1:100) {
        # Step 1: Sample Generation
        sample_data[[i]] <- rbinom(N, 1, p)
        
        # Step 2: Compute Sample Mean
        sample_mean <- mean(sample_data[[i]])
        
        # Step 3: Calculate g(X_bar)
        g_x_bar <- compute_g(sample_mean)
        
        # Step 4: Compute Delta Method Approximation for Expected Value
        estimated_expected_value <- compute_expected_value(sample_mean)
        
        # Step 5: Compute Delta Method Approximation for Variance
        estimated_variance <- compute_variance(sample_mean, N, p)
        
        # Store estimates
        estimates[[i]] <- list(Estimated_Expected_Value = estimated_expected_value,
                               Estimated_Variance = estimated_variance)
      }
      
      # Store results for this configuration
      results[[paste("N_", N, "_p_", p, sep = "")]] <- list(Sample_Data = sample_data,
                                                            Estimates = estimates)
    }
  }
  
  return(results)
}

# Usage:
# Define sample sizes and true parameters
sample_sizes <- c(10, 30, 100, 1000)
true_parameters <- c(0.01, 0.1, 0.25, 0.5, 0.75, 0.9, 0.99)

# Generate samples and compute estimates
samples <- generate_samples(sample_sizes, true_parameters)

# Access samples for a particular configuration
# For example, to access sample data for N = 10 and p = 0.5
sample_data_1 <- samples[["N_10_p_0.5"]][["Sample_Data"]]
sample_data_2 <- samples[["N_30_p_0.5"]][["Sample_Data"]]
sample_data_3<- samples[["N_100_p_0.5"]][["Sample_Data"]]
sample_data_4<- samples[["N_1000_p_0.5"]][["Sample_Data"]]
#sample_data
sample_data_2
[[1]]
 [1] 1 0 1 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1

[[2]]
 [1] 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 1

[[3]]
 [1] 1 0 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 0

[[4]]
 [1] 1 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 0

[[5]]
 [1] 0 1 1 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 0

[[6]]
 [1] 0 0 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1

[[7]]
 [1] 0 0 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 0 0 1 0 1 1

[[8]]
 [1] 0 1 0 1 0 0 0 0 1 0 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 1

[[9]]
 [1] 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0

[[10]]
 [1] 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0

[[11]]
 [1] 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 0 1

[[12]]
 [1] 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 1 0 0

[[13]]
 [1] 0 1 0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 0 1 0 0 1 0 0 1

[[14]]
 [1] 1 0 0 1 1 1 0 1 1 1 1 0 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 1 0 1

[[15]]
 [1] 0 1 0 0 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0

[[16]]
 [1] 0 0 0 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 0

[[17]]
 [1] 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0

[[18]]
 [1] 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0

[[19]]
 [1] 0 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0

[[20]]
 [1] 1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 1 0 0 0 0

[[21]]
 [1] 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0

[[22]]
 [1] 0 0 0 1 0 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 1 1 1 1 1 0 1 0 0 1

[[23]]
 [1] 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0

[[24]]
 [1] 1 0 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0

[[25]]
 [1] 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1

[[26]]
 [1] 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 1 1 0 1

[[27]]
 [1] 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 1 0 1 1 0

[[28]]
 [1] 1 1 1 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 0

[[29]]
 [1] 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 0 0 1 1 1 1 0 1

[[30]]
 [1] 1 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0

[[31]]
 [1] 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 1 0

[[32]]
 [1] 1 1 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 1 1 0

[[33]]
 [1] 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 0 0 0 1 1 0

[[34]]
 [1] 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1

[[35]]
 [1] 1 0 0 0 1 1 1 0 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 1 1

[[36]]
 [1] 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 1

[[37]]
 [1] 0 1 1 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0

[[38]]
 [1] 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0

[[39]]
 [1] 1 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 0 1 0

[[40]]
 [1] 1 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0

[[41]]
 [1] 1 0 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 0 0 0

[[42]]
 [1] 0 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0

[[43]]
 [1] 0 0 1 1 1 1 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 0 1

[[44]]
 [1] 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0

[[45]]
 [1] 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0

[[46]]
 [1] 0 1 0 1 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0

[[47]]
 [1] 1 0 0 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0

[[48]]
 [1] 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0

[[49]]
 [1] 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0

[[50]]
 [1] 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 0

[[51]]
 [1] 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 0 1

[[52]]
 [1] 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 1

[[53]]
 [1] 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 1 1 0 0 1

[[54]]
 [1] 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0

[[55]]
 [1] 1 0 1 0 1 0 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0

[[56]]
 [1] 1 1 1 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0

[[57]]
 [1] 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 1

[[58]]
 [1] 0 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0

[[59]]
 [1] 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 0 0

[[60]]
 [1] 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 0 1 0 0 0

[[61]]
 [1] 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0

[[62]]
 [1] 1 1 1 0 1 0 0 1 0 1 0 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 0

[[63]]
 [1] 0 1 1 0 1 1 0 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1

[[64]]
 [1] 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0

[[65]]
 [1] 1 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 1

[[66]]
 [1] 0 1 0 0 1 1 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1

[[67]]
 [1] 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1

[[68]]
 [1] 0 1 0 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 1 0

[[69]]
 [1] 1 0 1 1 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 0

[[70]]
 [1] 1 1 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 0

[[71]]
 [1] 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 0

[[72]]
 [1] 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 1 0 1

[[73]]
 [1] 0 1 0 0 0 1 0 0 1 1 1 0 1 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 1 1

[[74]]
 [1] 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 1

[[75]]
 [1] 1 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0

[[76]]
 [1] 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 0 1

[[77]]
 [1] 1 1 0 0 1 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 0 1 0 1 1 1 1 1

[[78]]
 [1] 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 0

[[79]]
 [1] 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 1 1

[[80]]
 [1] 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1

[[81]]
 [1] 1 1 1 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0

[[82]]
 [1] 1 1 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 0

[[83]]
 [1] 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 0 1 0 1 0 0 1

[[84]]
 [1] 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1 0 0

[[85]]
 [1] 1 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1

[[86]]
 [1] 0 0 1 1 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1

[[87]]
 [1] 0 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1

[[88]]
 [1] 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 1 1 0 1 1 1 1 0 0 0

[[89]]
 [1] 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0

[[90]]
 [1] 0 0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 1 0

[[91]]
 [1] 0 1 1 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 1 1 1 1

[[92]]
 [1] 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 0 1 0 0 0 1

[[93]]
 [1] 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 1 1 0 0 0

[[94]]
 [1] 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0

[[95]]
 [1] 1 0 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 1 1

[[96]]
 [1] 1 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 0 0

[[97]]
 [1] 1 1 0 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 0 1

[[98]]
 [1] 1 1 1 1 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 0 0 1

[[99]]
 [1] 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0

[[100]]
 [1] 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0
LS0tDQp0aXRsZTogIlN0YXQgUHJvamVjdF8oTW91dHVzaGkpIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQojMShBKQ0KYGBge3J9DQojIFNldCBwYXJhbWV0ZXJzDQpOIDwtIDEwMDANCnAgPC0gMC41DQppdGVyYXRpb25zIDwtIDUwMDANCg0KIyBJbml0aWFsaXplIHZlY3RvciB0byBzdG9yZSByZXN1bHRzDQpvZGRzX3JhdGlvcyA8LSBudW1lcmljKGl0ZXJhdGlvbnMpDQoNCiMgU2ltdWxhdGUgZGF0YSBhbmQgY2FsY3VsYXRlIG9kZHMgcmF0aW9zDQpmb3IgKGkgaW4gMTppdGVyYXRpb25zKSB7DQogICMgR2VuZXJhdGUgc2FtcGxlIG9mIEJlcm5vdWxsaSByYW5kb20gdmFyaWFibGVzDQogIHNhbXBsZV9kYXRhIDwtIHJiaW5vbShOLCAxLCBwKQ0KICANCiAgIyBDYWxjdWxhdGUgc2FtcGxlIGF2ZXJhZ2UNCiAgc2FtcGxlX2F2ZXJhZ2UgPC0gbWVhbihzYW1wbGVfZGF0YSkNCiAgDQogICMgQ2FsY3VsYXRlIG9kZHMgcmF0aW8NCiAgb2Rkc19yYXRpbyA8LSBzYW1wbGVfYXZlcmFnZSAvICgxIC0gc2FtcGxlX2F2ZXJhZ2UpDQogIA0KICAjIFN0b3JlIHJlc3VsdA0KICBvZGRzX3JhdGlvc1tpXSA8LSBvZGRzX3JhdGlvDQp9DQoNCiMgUGxvdCBoaXN0b2dyYW0gb2Ygc2ltdWxhdGVkIG9kZHMgcmF0aW9zDQpoaXN0KG9kZHNfcmF0aW9zLCBmcmVxID0gRkFMU0UsIGJyZWFrcyA9IDMwLCBtYWluID0gIkhpc3RvZ3JhbSBvZiBTaW11bGF0ZWQgT2RkcyBSYXRpb3MiLA0KICAgICB4bGFiID0gIk9kZHMgUmF0aW8iLCB5bGFiID0gIkRlbnNpdHkiKQ0KDQojIENhbGN1bGF0ZSBtZWFuIGFuZCB2YXJpYW5jZSBvZiBvZGRzIHJhdGlvcw0KbWVhbl9vZGRzX3JhdGlvIDwtIG1lYW4ob2Rkc19yYXRpb3MpDQp2YXJfb2Rkc19yYXRpbyA8LSB2YXIob2Rkc19yYXRpb3MpDQoNCiMgQ2FsY3VsYXRlIHN0YW5kYXJkIGVycm9yIHVzaW5nIERlbHRhIG1ldGhvZA0Kc2VfZGVsdGFfbWV0aG9kIDwtIHNxcnQoKDEvKDEtcCleMykqKHAvTikpDQoNCiMgUGxvdCBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggbWVhbiBhbmQgc3RhbmRhcmQgZXJyb3INCmN1cnZlKGRub3JtKHgsIG1lYW4gPSBtZWFuX29kZHNfcmF0aW8sIHNkID0gc2VfZGVsdGFfbWV0aG9kKSwgDQogICAgICBjb2wgPSAiYmx1ZSIsIGx3ZCA9IDIsIGFkZCA9IFRSVUUpDQpgYGANCg0KDQojMShCKQ0KDQpgYGB7cn0NCiMgU2V0IHBhcmFtZXRlcnMNCk5fdmFsdWVzIDwtIGMoMTAsIDMwLCA1MCwgMTAwLCA1MDApDQpwIDwtIDAuNQ0KaXRlcmF0aW9ucyA8LSA1MDAwDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHN0YW5kYXJkIGVycm9yIHVzaW5nIERlbHRhIG1ldGhvZA0KY2FsY3VsYXRlX3NlX2RlbHRhX21ldGhvZCA8LSBmdW5jdGlvbihwLCBOKSB7DQogIHJldHVybihzcXJ0KCgxLygxLXApXjMpKihwL04pKSkNCn0NCg0KIyBGdW5jdGlvbiB0byBzaW11bGF0ZSBkYXRhIGFuZCBwbG90IGhpc3RvZ3JhbSBmb3IgZ2l2ZW4gTg0Kc2ltdWxhdGVfYW5kX3Bsb3QgPC0gZnVuY3Rpb24oTikgew0KICAjIEluaXRpYWxpemUgdmVjdG9yIHRvIHN0b3JlIHJlc3VsdHMNCiAgb2Rkc19yYXRpb3MgPC0gbnVtZXJpYyhpdGVyYXRpb25zKQ0KICANCiAgIyBTaW11bGF0ZSBkYXRhIGFuZCBjYWxjdWxhdGUgb2RkcyByYXRpb3MNCiAgZm9yIChpIGluIDE6aXRlcmF0aW9ucykgew0KICAgICMgR2VuZXJhdGUgc2FtcGxlIG9mIEJlcm5vdWxsaSByYW5kb20gdmFyaWFibGVzDQogICAgc2FtcGxlX2RhdGEgPC0gcmJpbm9tKE4sIDEsIHApDQogICAgDQogICAgIyBDYWxjdWxhdGUgc2FtcGxlIGF2ZXJhZ2UNCiAgICBzYW1wbGVfYXZlcmFnZSA8LSBtZWFuKHNhbXBsZV9kYXRhKQ0KICAgIA0KICAgICMgQ2FsY3VsYXRlIG9kZHMgcmF0aW8NCiAgICBvZGRzX3JhdGlvIDwtIHNhbXBsZV9hdmVyYWdlIC8gKDEgLSBzYW1wbGVfYXZlcmFnZSkNCiAgICANCiAgICAjIFN0b3JlIHJlc3VsdA0KICAgIG9kZHNfcmF0aW9zW2ldIDwtIG9kZHNfcmF0aW8NCiAgfQ0KICANCiAgIyBQbG90IGhpc3RvZ3JhbSBvZiBzaW11bGF0ZWQgb2RkcyByYXRpb3MNCiAgaGlzdChvZGRzX3JhdGlvcywgZnJlcSA9IEZBTFNFLCBicmVha3MgPSAzMCwgDQogICAgICAgbWFpbiA9IHBhc3RlKCJIaXN0b2dyYW0gb2YgU2ltdWxhdGVkIE9kZHMgUmF0aW9zIChOID0iLCBOLCAiKSIpLA0KICAgICAgIHhsYWIgPSAiT2RkcyBSYXRpbyIsIHlsYWIgPSAiRGVuc2l0eSIpDQogIA0KICAjIENhbGN1bGF0ZSBtZWFuIGFuZCB2YXJpYW5jZSBvZiBvZGRzIHJhdGlvcw0KICBtZWFuX29kZHNfcmF0aW8gPC0gbWVhbihvZGRzX3JhdGlvcykNCiAgdmFyX29kZHNfcmF0aW8gPC0gdmFyKG9kZHNfcmF0aW9zKQ0KICANCiAgIyBDYWxjdWxhdGUgc3RhbmRhcmQgZXJyb3IgdXNpbmcgRGVsdGEgbWV0aG9kDQogIHNlX2RlbHRhX21ldGhvZCA8LSBjYWxjdWxhdGVfc2VfZGVsdGFfbWV0aG9kKHAsIE4pDQogIA0KICAjIFBsb3Qgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoIG1lYW4gYW5kIHN0YW5kYXJkIGVycm9yDQogIGN1cnZlKGRub3JtKHgsIG1lYW4gPSBtZWFuX29kZHNfcmF0aW8sIHNkID0gc2VfZGVsdGFfbWV0aG9kKSwgDQogICAgICAgIGNvbCA9ICJibHVlIiwgbHdkID0gMiwgYWRkID0gVFJVRSkNCiAgDQogICMgQWRkIGxlZ2VuZA0KICBsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gIk5vcm1hbCBDdXJ2ZSIsIGNvbCA9ICJibHVlIiwgbHdkID0gMikNCn0NCg0KIyBMb29wIG92ZXIgZGlmZmVyZW50IHZhbHVlcyBvZiBODQpmb3IgKE4gaW4gTl92YWx1ZXMpIHsNCiAgc2ltdWxhdGVfYW5kX3Bsb3QoTikNCn0NCmBgYA0KDQoNCiMyKEEpDQpgYGB7cn0NCiMgRnVuY3Rpb24gdG8gY29tcHV0ZSBnKHApDQpjb21wdXRlX2cgPC0gZnVuY3Rpb24ocCkgew0KICByZXR1cm4ocCAvICgxIC0gcCkpDQp9DQoNCiMgRnVuY3Rpb24gdG8gY29tcHV0ZSBkZWx0YSBtZXRob2QgYXBwcm94aW1hdGlvbiBmb3IgZXhwZWN0ZWQgdmFsdWUNCmNvbXB1dGVfZXhwZWN0ZWRfdmFsdWUgPC0gZnVuY3Rpb24oc2FtcGxlX21lYW4pIHsNCiAgcmV0dXJuKHNhbXBsZV9tZWFuIC8gKDEgLSBzYW1wbGVfbWVhbikpDQp9DQoNCiMgRnVuY3Rpb24gdG8gY29tcHV0ZSBkZWx0YSBtZXRob2QgYXBwcm94aW1hdGlvbiBmb3IgdmFyaWFuY2UNCmNvbXB1dGVfdmFyaWFuY2UgPC0gZnVuY3Rpb24oc2FtcGxlX21lYW4sIE4sIHApIHsNCiAgZ19wcmltZSA8LSAxIC8gKCgxIC0gcCleMikNCiAgdmFyX3hfYmFyIDwtIHAgKiAoMSAtIHApIC8gTg0KICByZXR1cm4oKGdfcHJpbWVeMiAqIHZhcl94X2JhcikgLyAocCAvICgxIC0gcCkpKQ0KfQ0KDQojIFNldCB0aGUgc2FtcGxlIHNpemVzIGFuZCB0cnVlIHBhcmFtZXRlcnMNCnNhbXBsZV9zaXplcyA8LSBjKDEwLCAzMCwgMTAwLCAxMDAwKQ0KdHJ1ZV9wYXJhbWV0ZXJzIDwtIGMoMC4wMSwgMC4xLCAwLjI1LCAwLjUsIDAuNzUsIDAuOSwgMC45OSkNCg0KIyBTdG9yZSByZXN1bHRzDQpyZXN1bHRzIDwtIGRhdGEuZnJhbWUoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gY29uZmlndXJhdGlvbg0KZm9yIChOIGluIHNhbXBsZV9zaXplcykgew0KICBmb3IgKHAgaW4gdHJ1ZV9wYXJhbWV0ZXJzKSB7DQogICAgIyBSZXBlYXQgMTAwIHRpbWVzIGZvciBlYWNoIGNvbmZpZ3VyYXRpb24NCiAgICBmb3IgKGkgaW4gMToxMDApIHsNCiAgICAgICMgU3RlcCAxOiBTYW1wbGUgR2VuZXJhdGlvbg0KICAgICAgc2FtcGxlX2RhdGEgPC0gcmJpbm9tKE4sIDEsIHApDQogICAgICANCiAgICAgICMgU3RlcCAyOiBDb21wdXRlIFNhbXBsZSBNZWFuDQogICAgICBzYW1wbGVfbWVhbiA8LSBtZWFuKHNhbXBsZV9kYXRhKQ0KICAgICAgDQogICAgICAjIFN0ZXAgMzogQ2FsY3VsYXRlIGcoWF9iYXIpDQogICAgICBnX3hfYmFyIDwtIGNvbXB1dGVfZyhzYW1wbGVfbWVhbikNCiAgICAgIA0KICAgICAgIyBTdGVwIDQ6IENvbXB1dGUgRGVsdGEgTWV0aG9kIEFwcHJveGltYXRpb24gZm9yIEV4cGVjdGVkIFZhbHVlDQogICAgICBlc3RpbWF0ZWRfZXhwZWN0ZWRfdmFsdWUgPC0gY29tcHV0ZV9leHBlY3RlZF92YWx1ZShzYW1wbGVfbWVhbikNCiAgICAgIA0KICAgICAgIyBTdGVwIDU6IENvbXB1dGUgRGVsdGEgTWV0aG9kIEFwcHJveGltYXRpb24gZm9yIFZhcmlhbmNlDQogICAgICBlc3RpbWF0ZWRfdmFyaWFuY2UgPC0gY29tcHV0ZV92YXJpYW5jZShzYW1wbGVfbWVhbiwgTiwgcCkNCiAgICAgIA0KICAgICAgIyBTdG9yZSByZXN1bHRzDQogICAgICByZXN1bHQgPC0gZGF0YS5mcmFtZShTYW1wbGVfU2l6ZSA9IE4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlX1BhcmFtZXRlciA9IHAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFc3RpbWF0ZWRfRXhwZWN0ZWRfVmFsdWUgPSBlc3RpbWF0ZWRfZXhwZWN0ZWRfdmFsdWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFc3RpbWF0ZWRfVmFyaWFuY2UgPSBlc3RpbWF0ZWRfdmFyaWFuY2UpDQogICAgICByZXN1bHRzIDwtIHJiaW5kKHJlc3VsdHMsIHJlc3VsdCkNCiAgICB9DQogIH0NCn0NCg0KIyBTYXZlIHJlc3VsdHMgdG8gQ1NWDQp3cml0ZS5jc3YocmVzdWx0cywgZmlsZSA9ICJkZWx0YV9tZXRob2RfcmVzdWx0c19tb25kYXkuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQoNCmBgYA0KDQoNCiMyKEEpIChBbm90aGVyIHNvbHV0aW9uIGZvciBmaW5kaW5nIFNhbXBsZXMpDQoNCmBgYHtyfQ0KIyBGdW5jdGlvbiB0byBnZW5lcmF0ZSBzYW1wbGVzIGFuZCBjb21wdXRlIGRlbHRhIG1ldGhvZCBlc3RpbWF0ZXMNCmdlbmVyYXRlX3NhbXBsZXMgPC0gZnVuY3Rpb24oc2FtcGxlX3NpemVzLCB0cnVlX3BhcmFtZXRlcnMpIHsNCiAgIyBGdW5jdGlvbiB0byBjb21wdXRlIGcocCkNCiAgY29tcHV0ZV9nIDwtIGZ1bmN0aW9uKHApIHsNCiAgICByZXR1cm4ocCAvICgxIC0gcCkpDQogIH0NCiAgDQogICMgRnVuY3Rpb24gdG8gY29tcHV0ZSBkZWx0YSBtZXRob2QgYXBwcm94aW1hdGlvbiBmb3IgZXhwZWN0ZWQgdmFsdWUNCiAgY29tcHV0ZV9leHBlY3RlZF92YWx1ZSA8LSBmdW5jdGlvbihzYW1wbGVfbWVhbikgew0KICAgIHJldHVybihzYW1wbGVfbWVhbiAvICgxIC0gc2FtcGxlX21lYW4pKQ0KICB9DQogIA0KICAjIEZ1bmN0aW9uIHRvIGNvbXB1dGUgZGVsdGEgbWV0aG9kIGFwcHJveGltYXRpb24gZm9yIHZhcmlhbmNlDQogIGNvbXB1dGVfdmFyaWFuY2UgPC0gZnVuY3Rpb24oc2FtcGxlX21lYW4sIE4sIHApIHsNCiAgICBnX3ByaW1lIDwtIDEgLyAoKDEgLSBwKV4yKQ0KICAgIHZhcl94X2JhciA8LSBwICogKDEgLSBwKSAvIE4NCiAgICByZXR1cm4oKGdfcHJpbWVeMiAqIHZhcl94X2JhcikgLyAocCAvICgxIC0gcCkpKQ0KICB9DQogIA0KICAjIFN0b3JlIHJlc3VsdHMNCiAgcmVzdWx0cyA8LSBsaXN0KCkNCiAgDQogICMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiBjb25maWd1cmF0aW9uDQogIGZvciAoTiBpbiBzYW1wbGVfc2l6ZXMpIHsNCiAgICBmb3IgKHAgaW4gdHJ1ZV9wYXJhbWV0ZXJzKSB7DQogICAgICBzYW1wbGVfZGF0YSA8LSBsaXN0KCkNCiAgICAgIGVzdGltYXRlcyA8LSBsaXN0KCkNCiAgICAgIA0KICAgICAgIyBSZXBlYXQgMTAwIHRpbWVzIGZvciBlYWNoIGNvbmZpZ3VyYXRpb24NCiAgICAgIGZvciAoaSBpbiAxOjEwMCkgew0KICAgICAgICAjIFN0ZXAgMTogU2FtcGxlIEdlbmVyYXRpb24NCiAgICAgICAgc2FtcGxlX2RhdGFbW2ldXSA8LSByYmlub20oTiwgMSwgcCkNCiAgICAgICAgDQogICAgICAgICMgU3RlcCAyOiBDb21wdXRlIFNhbXBsZSBNZWFuDQogICAgICAgIHNhbXBsZV9tZWFuIDwtIG1lYW4oc2FtcGxlX2RhdGFbW2ldXSkNCiAgICAgICAgDQogICAgICAgICMgU3RlcCAzOiBDYWxjdWxhdGUgZyhYX2JhcikNCiAgICAgICAgZ194X2JhciA8LSBjb21wdXRlX2coc2FtcGxlX21lYW4pDQogICAgICAgIA0KICAgICAgICAjIFN0ZXAgNDogQ29tcHV0ZSBEZWx0YSBNZXRob2QgQXBwcm94aW1hdGlvbiBmb3IgRXhwZWN0ZWQgVmFsdWUNCiAgICAgICAgZXN0aW1hdGVkX2V4cGVjdGVkX3ZhbHVlIDwtIGNvbXB1dGVfZXhwZWN0ZWRfdmFsdWUoc2FtcGxlX21lYW4pDQogICAgICAgIA0KICAgICAgICAjIFN0ZXAgNTogQ29tcHV0ZSBEZWx0YSBNZXRob2QgQXBwcm94aW1hdGlvbiBmb3IgVmFyaWFuY2UNCiAgICAgICAgZXN0aW1hdGVkX3ZhcmlhbmNlIDwtIGNvbXB1dGVfdmFyaWFuY2Uoc2FtcGxlX21lYW4sIE4sIHApDQogICAgICAgIA0KICAgICAgICAjIFN0b3JlIGVzdGltYXRlcw0KICAgICAgICBlc3RpbWF0ZXNbW2ldXSA8LSBsaXN0KEVzdGltYXRlZF9FeHBlY3RlZF9WYWx1ZSA9IGVzdGltYXRlZF9leHBlY3RlZF92YWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFc3RpbWF0ZWRfVmFyaWFuY2UgPSBlc3RpbWF0ZWRfdmFyaWFuY2UpDQogICAgICB9DQogICAgICANCiAgICAgICMgU3RvcmUgcmVzdWx0cyBmb3IgdGhpcyBjb25maWd1cmF0aW9uDQogICAgICByZXN1bHRzW1twYXN0ZSgiTl8iLCBOLCAiX3BfIiwgcCwgc2VwID0gIiIpXV0gPC0gbGlzdChTYW1wbGVfRGF0YSA9IHNhbXBsZV9kYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXN0aW1hdGVzID0gZXN0aW1hdGVzKQ0KICAgIH0NCiAgfQ0KICANCiAgcmV0dXJuKHJlc3VsdHMpDQp9DQoNCiMgVXNhZ2U6DQojIERlZmluZSBzYW1wbGUgc2l6ZXMgYW5kIHRydWUgcGFyYW1ldGVycw0Kc2FtcGxlX3NpemVzIDwtIGMoMTAsIDMwLCAxMDAsIDEwMDApDQp0cnVlX3BhcmFtZXRlcnMgPC0gYygwLjAxLCAwLjEsIDAuMjUsIDAuNSwgMC43NSwgMC45LCAwLjk5KQ0KDQojIEdlbmVyYXRlIHNhbXBsZXMgYW5kIGNvbXB1dGUgZXN0aW1hdGVzDQpzYW1wbGVzIDwtIGdlbmVyYXRlX3NhbXBsZXMoc2FtcGxlX3NpemVzLCB0cnVlX3BhcmFtZXRlcnMpDQoNCiMgQWNjZXNzIHNhbXBsZXMgZm9yIGEgcGFydGljdWxhciBjb25maWd1cmF0aW9uDQojIEZvciBleGFtcGxlLCB0byBhY2Nlc3Mgc2FtcGxlIGRhdGEgZm9yIE4gPSAxMCBhbmQgcCA9IDAuNQ0Kc2FtcGxlX2RhdGFfMSA8LSBzYW1wbGVzW1siTl8xMF9wXzAuNSJdXVtbIlNhbXBsZV9EYXRhIl1dDQpzYW1wbGVfZGF0YV8yIDwtIHNhbXBsZXNbWyJOXzMwX3BfMC41Il1dW1siU2FtcGxlX0RhdGEiXV0NCnNhbXBsZV9kYXRhXzM8LSBzYW1wbGVzW1siTl8xMDBfcF8wLjUiXV1bWyJTYW1wbGVfRGF0YSJdXQ0Kc2FtcGxlX2RhdGFfNDwtIHNhbXBsZXNbWyJOXzEwMDBfcF8wLjUiXV1bWyJTYW1wbGVfRGF0YSJdXQ0KI3NhbXBsZV9kYXRhDQpzYW1wbGVfZGF0YV8yDQpgYGANCg0K