1. table gives the demand schedule and the supply schedule for high school graduates. Assume that the supply and demand curves are straight line. Wage rate Quantity demanded Quantity supplied (dollars per hour) (hours per month) (hours per month) 6 9,000 4,000 8 8,000 5,000 10 7,000 6,000 12 6,000 7,000 14 5,000 8,000
  1. Draw the demand curve and the supply curve for high school graduates. What is the equilibrium wage and the equilibrium quantity of employment? What is the number of hours of labor unemployed?
# Load necessary library
library(ggplot2)

# Define the data
data <- data.frame(
  Wage = c(6, 8, 10, 12, 14),
  Quantity_Demanded = c(9000, 8000, 7000, 6000, 5000),
  Quantity_Supplied = c(4000, 5000, 6000, 7000, 8000)
)

# Fit linear models for demand and supply
demand_model <- lm(Quantity_Demanded ~ Wage, data = data)
supply_model <- lm(Quantity_Supplied ~ Wage, data = data)

# Create a sequence of wages for plotting
wage_seq <- seq(min(data$Wage), max(data$Wage), length.out = 100)

# Predict quantities using the models
demand_pred <- predict(demand_model, newdata = data.frame(Wage = wage_seq))
supply_pred <- predict(supply_model, newdata = data.frame(Wage = wage_seq))

# Convert predictions to data frame for plotting
demand_df <- data.frame(Wage = wage_seq, Quantity = demand_pred, Type = "Demand")
supply_df <- data.frame(Wage = wage_seq, Quantity = supply_pred, Type = "Supply")

# Combine into a single data frame
plot_data <- rbind(demand_df, supply_df)

# Plot the demand and supply curves
ggplot(plot_data, aes(x = Wage, y = Quantity, color = Type)) +
  geom_line() +
  geom_point(data = data, aes(y = Quantity_Demanded, color = "Demand"), size = 3) +
  geom_point(data = data, aes(y = Quantity_Supplied, color = "Supply"), size = 3) +
  labs(title = "Demand and Supply Curves for High School Graduates",
       x = "Wage Rate (dollars per hour)",
       y = "Quantity (hours per month)",
       color = "Legend") +
  theme_minimal()


# Find equilibrium wage and quantity
equilibrium_wage <- uniroot(function(w) {
  predict(demand_model, newdata = data.frame(Wage = w)) - 
  predict(supply_model, newdata = data.frame(Wage = w))
}, interval = c(min(data$Wage), max(data$Wage)))

equilibrium_quantity <- predict(demand_model, newdata = data.frame(Wage = equilibrium_wage$root))

# Calculate unemployment
quantity_supplied_at_eq_wage <- predict(supply_model, newdata = data.frame(Wage = equilibrium_wage$root))
unemployed_hours <- quantity_supplied_at_eq_wage - equilibrium_quantity

# Print the results
cat("Equilibrium Wage: $", round(equilibrium_wage$root, 2), "\n")
Equilibrium Wage: $ 11 
cat("Equilibrium Quantity: ", round(equilibrium_quantity, 2), " hours\n")
Equilibrium Quantity:  6500  hours
# quantity demanded equals quantity supplied
cat("Unemployed Hours at Equilibrium Wage: ", round(unemployed_hours, 2), " hours\n")
Unemployed Hours at Equilibrium Wage:  0  hours
  1. If a minimum wage is set at $8 an hour, how many hours do high school graduateswork? How many hours of labor are unemployed? Why?
cat("the minimum wage is less than the equilibrium wage. In this case, the equilibrium will remain the same as before. They work 6500 hours and Unemployed Hours at Equilibrium Wage is still 0")
the minimum wage is less than the equilibrium wage. In this case, the equilibrium will remain the same as before. They work 6500 hours and Unemployed Hours at Equilibrium Wage is still 0
  1. If a minimum wage is set at $12 an hour, what are the number of hours of labor employed and the number of hours of labor unemployed?
# Define the minimum wage
min_wage_12 <- 12

# Calculate quantity demanded and supplied at minimum wage of $12
quantity_demanded_at_min_wage_12 <- predict(demand_model, newdata = data.frame(Wage = min_wage_12))
quantity_supplied_at_min_wage_12 <- predict(supply_model, newdata = data.frame(Wage = min_wage_12))

# Determine employed and unemployed hours
employed_hours_at_12 <- min(quantity_demanded_at_min_wage_12, quantity_supplied_at_min_wage_12)
unemployed_hours_at_12 <- quantity_supplied_at_min_wage_12 - employed_hours_at_12

# Print the results
cat("At a minimum wage of $", min_wage_12, " per hour:\n", sep = "")
At a minimum wage of $12 per hour:
cat("Hours worked by high school graduates: ", round(employed_hours_at_12, 2), " hours\n")
Hours worked by high school graduates:  6000  hours
cat("Unemployed hours of labor: ", round(unemployed_hours_at_12, 2), " hours\n")
Unemployed hours of labor:  1000  hours
  1. Do you expect the unemployment to increase or decrease in the long run? Why? Explain clearly, no need to draw a graph here.
cat("In the long run, unemployment is expected to increase. Both supply and demand will be more elastic and  higer wages means less resources can be arrange to each single one. Therefore there must be increase unemployment")
In the long run, unemployment is expected to increase. Both supply and demand will be more elastic and  higer wages means less resources can be arrange to each single one. Therefore there must be increase unemployment
  1. Using the midpoint method, calculate the price elasticity of demand and the price elasticity of supply between the initial equilibrium price and the new equilibrium price when the minimum wage of $12 was imposed.
# Define the initial and new price
P_initial <- 11
P_new <- 12

# Define the initial and new quantity demanded (interpolated)
Qd_initial <- 6500
Qd_new <- 6000

# Define the initial and new quantity supplied (interpolated)
Qs_initial <- (6000 + 7000) / 2
Qs_new <- 7000

# Calculate the price elasticity of demand using the midpoint method
Ed <- ((Qd_initial - Qd_new) / ((Qd_new + Qd_initial) / 2)) /
      ((P_new - P_initial) / ((P_new + P_initial) / 2))

# Calculate the price elasticity of supply using the midpoint method
Es <- ((Qs_new - Qs_initial) / ((Qs_new + Qs_initial) / 2)) /
      ((P_new - P_initial) / ((P_new + P_initial) / 2))

# Print the results
cat("Price Elasticity of Demand:",Ed)
Price Elasticity of Demand: 0.92
cat("\nPrice Elasticity of Supply:",Es)

Price Elasticity of Supply: 0.8518519
  1. Suppose some mechanical robots can also perform the same tasks as these workers. Suppose also that the minimum wage rate remains at $12 while at the same time the price of mechanical robots increases by 10%. If the cross-price elasticity of demand between robots and high school graduates is 5. What will happen to the unemployment?
cat("The cross-price elasticity being positive indicates that robots and high school graduates are substitutes. A 10% increase in the price of robots leads to a 50% increase in demand for high school graduates. At the $12 minimum wage, demand rises to 9,000 hours, exceeding the 7,000 hours supplied. As a result, unemployment drops to zero, and the minimum wage is no longer binding.")
The cross-price elasticity being positive indicates that robots and high school graduates are substitutes. A 10% increase in the price of robots leads to a 50% increase in demand for high school graduates. At the $12 minimum wage, demand rises to 9,000 hours, exceeding the 7,000 hours supplied. As a result, unemployment drops to zero, and the minimum wage is no longer binding.
  1. Assume the supply curve for cigars is a typical, upward-sloping straight line, and the demand curve for cigars is a typical, downward-sloping straight line. Suppose the equilibrium quantity in the market for cigars is 1,000 per month when there is no tax. Suppose that the government imposes a sales tax of $3 per cigar. As a result of the sales tax the effective price paid by the buyer increased from $10 to $12. The government’s tax revenue amounts to $1800 per month.
  1. Using a clearly labeled diagram, show the effect of this tax in the cigar market.
  1. Assume the supply curve for cigars is a typical, upward-sloping straight line, and the demand curve for cigars is a typical, downward-sloping straight line. Suppose the equilibrium quantity in the market for cigars is 1,000 per month when there is no tax. Suppose that the government imposes a sales tax of $3 per cigar. As a result of the sales tax the effective price paid by the buyer increased from $10 to $12. The government’s tax revenue amounts to $1800 per month.
  1. Using a clearly labeled diagram, show the effect of this tax in the cigar market.
# Load necessary library
library(ggplot2)

# Define parameters
quantity_no_tax <- 600
price_no_tax <- 12
quantity_with_tax <- 1000
price_with_tax <- 10
tax <- 3

# Define demand and supply functions
demand <- function(Q) {
  price_demand <- 22 - 0.01 * Q # Example parameters for demand curve
  return(price_demand)
}

supply_no_tax <- function(Q) {
  price_supply_no_tax <- 0.01 * Q + 6 # Example parameters for supply curve without tax
  return(price_supply_no_tax)
}

supply_with_tax <- function(Q) {
  price_supply_with_tax <- supply_no_tax(Q) + tax
  return(price_supply_with_tax)
}

# Create data for plotting
Q <- seq(0, 1200, by=10)
data <- data.frame(
  Quantity = Q,
  Demand = demand(Q),
  Supply_No_Tax = supply_no_tax(Q),
  Supply_With_Tax = supply_with_tax(Q)
)

# Plot
ggplot(data, aes(x=Quantity)) +
  geom_line(aes(y=Demand, color="Demand"), size=1) +
  geom_line(aes(y=Supply_No_Tax, color="Supply No Tax"), size=1) +
  geom_line(aes(y=Supply_With_Tax, color="Supply With Tax"), size=1, linetype="dashed") +
  labs(title="Cigar Market with and without Sales Tax",
       x="Quantity",
       y="Price",
       color="Legend") +
  scale_color_manual(values=c("Demand"="blue", "Supply No Tax"="green", "Supply With Tax"="orange")) +
  theme_minimal()

  1. What is the price received by the sellers?
#Price Received by Sellers=Effective Price Paid by Buyers−Sales Tax=12-3
cat("9")
9
  1. Which curve is more elastic: the demand curve or the supply curve? Explain.
cat("Seems buyers pay $2 of tax where sells pay $1, supply curve should be more elastic")
Seems buyers pay $2 of tax where sells pay $1, supply curve should be more elastic
  1. Does the consumer surplus increase or decrease? By how much? (Please label the appropriate area on your graph as well as provide numbers)
# suppose interact point with supply no tax (X, Y) with supply with tax (a, b), area will be a*(b-Y) + (X-a)*(b-Y)/2
# 600*2 + 400 = 1600
cat("Decrease since more neeed to be paid by buyers and consume less per unit. By $1600")
Decrease since more neeed to be paid by buyers and consume less per unit. By $1600
  1. Does the producer surplus increase or decrease? By how much?
# a * (Y-9) + (X-a)*(Y-9)/2
# 600 + 400/2 = 800 
cat("Decrease in $800")
Decrease in $800
  1. Are there any dead weight losses? If yes, how big is the DWL?
# (X-a)*(b-Y)/2 + (X-a)*(Y-9)/2 = 400 + 200 = 600
cat("Deadweight Loss: Yes, DWL exists due to the tax, in amount of $600")
Deadweight Loss: Yes, DWL exists due to the tax, in amount of $600
  1. What will be the effect of this Cigar tax on the consumer surplus in the market for Cigarettes? Illustrate with a simple diagram.
cat("Since cigarettes and cigars are substitutes, imposing a tax on cigars will lead to an increase in demand for cigarettes. This will cause the demand curve for cigarettes to shift upward.")
Since cigarettes and cigars are substitutes, imposing a tax on cigars will lead to an increase in demand for cigarettes. This will cause the demand curve for cigarettes to shift upward.
#we draw a sample curve
# Load necessary library
library(ggplot2)

# Define simplified functions
supply <- function(Q) { 5 + 0.02 * Q }
demand1 <- function(Q) { 20 - 0.02 * Q }
demand2 <- function(Q) { 15 - 0.02 * Q } # Parallel to demand1, shifted downward

# Create data for plotting
Q <- seq(0, 1000, by=10)
data <- data.frame(
  Quantity = Q,
  Supply = supply(Q),
  Demand1 = demand1(Q),
  Demand2 = demand2(Q)
)

# Plot
ggplot(data, aes(x=Quantity)) +
  geom_line(aes(y=Supply, color="Supply"), size=1) +
  geom_line(aes(y=Demand1, color="Demand Curve 1"), size=1) +
  geom_line(aes(y=Demand2, color="Demand Curve 2"), size=1, linetype="dashed") +
  labs(title="Supply and Parallel Demand Curves",
       x="Quantity",
       y="Price",
       color="Legend") +
  scale_color_manual(values=c("Supply"="green", "Demand Curve 1"="blue", "Demand Curve 2"="red")) +
  theme_minimal()


cat("Suppose two interation points with red (p, q) and with blue (u, v) then initial consumer surplus will be area inside Y-axis, red demand curve, supply curve, and point (p, q). Instead after shifting it will be area inside Y-axis, y=v, blue demand curve and point (u, v)")
Suppose two interation points with red (p, q) and with blue (u, v) then initial consumer surplus will be area inside Y-axis, red demand curve, supply curve, and point (p, q). Instead after shifting it will be area inside Y-axis, y=v, blue demand curve and point (u, v)
LS0tDQp0aXRsZTogIk1pY3JvQXNzbjEiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KMSkNCnRhYmxlIGdpdmVzIHRoZSBkZW1hbmQgc2NoZWR1bGUgYW5kIHRoZSBzdXBwbHkgc2NoZWR1bGUgZm9yIGhpZ2ggc2Nob29sIGdyYWR1YXRlcy4NCkFzc3VtZSB0aGF0IHRoZSBzdXBwbHkgYW5kIGRlbWFuZCBjdXJ2ZXMgYXJlIHN0cmFpZ2h0IGxpbmUuDQpXYWdlIHJhdGUgUXVhbnRpdHkgZGVtYW5kZWQgUXVhbnRpdHkgc3VwcGxpZWQNCihkb2xsYXJzIHBlciBob3VyKSAoaG91cnMgcGVyIG1vbnRoKSAoaG91cnMgcGVyIG1vbnRoKQ0KNiA5LDAwMCA0LDAwMA0KOCA4LDAwMCA1LDAwMA0KMTAgNywwMDAgNiwwMDANCjEyIDYsMDAwIDcsMDAwDQoxNCA1LDAwMCA4LDAwMA0KYSkNCkRyYXcgdGhlIGRlbWFuZCBjdXJ2ZSBhbmQgdGhlIHN1cHBseSBjdXJ2ZSBmb3IgaGlnaCBzY2hvb2wgZ3JhZHVhdGVzLiBXaGF0IGlzIHRoZSBlcXVpbGlicml1bSB3YWdlIGFuZCB0aGUgZXF1aWxpYnJpdW0gcXVhbnRpdHkgb2YgZW1wbG95bWVudD8gV2hhdCBpcyB0aGUgbnVtYmVyIG9mIGhvdXJzIG9mIGxhYm9yIHVuZW1wbG95ZWQ/DQpgYGB7cn0NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIERlZmluZSB0aGUgZGF0YQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBXYWdlID0gYyg2LCA4LCAxMCwgMTIsIDE0KSwNCiAgUXVhbnRpdHlfRGVtYW5kZWQgPSBjKDkwMDAsIDgwMDAsIDcwMDAsIDYwMDAsIDUwMDApLA0KICBRdWFudGl0eV9TdXBwbGllZCA9IGMoNDAwMCwgNTAwMCwgNjAwMCwgNzAwMCwgODAwMCkNCikNCg0KIyBGaXQgbGluZWFyIG1vZGVscyBmb3IgZGVtYW5kIGFuZCBzdXBwbHkNCmRlbWFuZF9tb2RlbCA8LSBsbShRdWFudGl0eV9EZW1hbmRlZCB+IFdhZ2UsIGRhdGEgPSBkYXRhKQ0Kc3VwcGx5X21vZGVsIDwtIGxtKFF1YW50aXR5X1N1cHBsaWVkIH4gV2FnZSwgZGF0YSA9IGRhdGEpDQoNCiMgQ3JlYXRlIGEgc2VxdWVuY2Ugb2Ygd2FnZXMgZm9yIHBsb3R0aW5nDQp3YWdlX3NlcSA8LSBzZXEobWluKGRhdGEkV2FnZSksIG1heChkYXRhJFdhZ2UpLCBsZW5ndGgub3V0ID0gMTAwKQ0KDQojIFByZWRpY3QgcXVhbnRpdGllcyB1c2luZyB0aGUgbW9kZWxzDQpkZW1hbmRfcHJlZCA8LSBwcmVkaWN0KGRlbWFuZF9tb2RlbCwgbmV3ZGF0YSA9IGRhdGEuZnJhbWUoV2FnZSA9IHdhZ2Vfc2VxKSkNCnN1cHBseV9wcmVkIDwtIHByZWRpY3Qoc3VwcGx5X21vZGVsLCBuZXdkYXRhID0gZGF0YS5mcmFtZShXYWdlID0gd2FnZV9zZXEpKQ0KDQojIENvbnZlcnQgcHJlZGljdGlvbnMgdG8gZGF0YSBmcmFtZSBmb3IgcGxvdHRpbmcNCmRlbWFuZF9kZiA8LSBkYXRhLmZyYW1lKFdhZ2UgPSB3YWdlX3NlcSwgUXVhbnRpdHkgPSBkZW1hbmRfcHJlZCwgVHlwZSA9ICJEZW1hbmQiKQ0Kc3VwcGx5X2RmIDwtIGRhdGEuZnJhbWUoV2FnZSA9IHdhZ2Vfc2VxLCBRdWFudGl0eSA9IHN1cHBseV9wcmVkLCBUeXBlID0gIlN1cHBseSIpDQoNCiMgQ29tYmluZSBpbnRvIGEgc2luZ2xlIGRhdGEgZnJhbWUNCnBsb3RfZGF0YSA8LSByYmluZChkZW1hbmRfZGYsIHN1cHBseV9kZikNCg0KIyBQbG90IHRoZSBkZW1hbmQgYW5kIHN1cHBseSBjdXJ2ZXMNCmdncGxvdChwbG90X2RhdGEsIGFlcyh4ID0gV2FnZSwgeSA9IFF1YW50aXR5LCBjb2xvciA9IFR5cGUpKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZGF0YSwgYWVzKHkgPSBRdWFudGl0eV9EZW1hbmRlZCwgY29sb3IgPSAiRGVtYW5kIiksIHNpemUgPSAzKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGRhdGEsIGFlcyh5ID0gUXVhbnRpdHlfU3VwcGxpZWQsIGNvbG9yID0gIlN1cHBseSIpLCBzaXplID0gMykgKw0KICBsYWJzKHRpdGxlID0gIkRlbWFuZCBhbmQgU3VwcGx5IEN1cnZlcyBmb3IgSGlnaCBTY2hvb2wgR3JhZHVhdGVzIiwNCiAgICAgICB4ID0gIldhZ2UgUmF0ZSAoZG9sbGFycyBwZXIgaG91cikiLA0KICAgICAgIHkgPSAiUXVhbnRpdHkgKGhvdXJzIHBlciBtb250aCkiLA0KICAgICAgIGNvbG9yID0gIkxlZ2VuZCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgRmluZCBlcXVpbGlicml1bSB3YWdlIGFuZCBxdWFudGl0eQ0KZXF1aWxpYnJpdW1fd2FnZSA8LSB1bmlyb290KGZ1bmN0aW9uKHcpIHsNCiAgcHJlZGljdChkZW1hbmRfbW9kZWwsIG5ld2RhdGEgPSBkYXRhLmZyYW1lKFdhZ2UgPSB3KSkgLSANCiAgcHJlZGljdChzdXBwbHlfbW9kZWwsIG5ld2RhdGEgPSBkYXRhLmZyYW1lKFdhZ2UgPSB3KSkNCn0sIGludGVydmFsID0gYyhtaW4oZGF0YSRXYWdlKSwgbWF4KGRhdGEkV2FnZSkpKQ0KDQplcXVpbGlicml1bV9xdWFudGl0eSA8LSBwcmVkaWN0KGRlbWFuZF9tb2RlbCwgbmV3ZGF0YSA9IGRhdGEuZnJhbWUoV2FnZSA9IGVxdWlsaWJyaXVtX3dhZ2Ukcm9vdCkpDQoNCiMgQ2FsY3VsYXRlIHVuZW1wbG95bWVudA0KcXVhbnRpdHlfc3VwcGxpZWRfYXRfZXFfd2FnZSA8LSBwcmVkaWN0KHN1cHBseV9tb2RlbCwgbmV3ZGF0YSA9IGRhdGEuZnJhbWUoV2FnZSA9IGVxdWlsaWJyaXVtX3dhZ2Ukcm9vdCkpDQp1bmVtcGxveWVkX2hvdXJzIDwtIHF1YW50aXR5X3N1cHBsaWVkX2F0X2VxX3dhZ2UgLSBlcXVpbGlicml1bV9xdWFudGl0eQ0KDQojIFByaW50IHRoZSByZXN1bHRzDQpjYXQoIkVxdWlsaWJyaXVtIFdhZ2U6ICQiLCByb3VuZChlcXVpbGlicml1bV93YWdlJHJvb3QsIDIpLCAiXG4iKQ0KY2F0KCJFcXVpbGlicml1bSBRdWFudGl0eTogIiwgcm91bmQoZXF1aWxpYnJpdW1fcXVhbnRpdHksIDIpLCAiIGhvdXJzXG4iKQ0KIyBxdWFudGl0eSBkZW1hbmRlZCBlcXVhbHMgcXVhbnRpdHkgc3VwcGxpZWQNCmNhdCgiVW5lbXBsb3llZCBIb3VycyBhdCBFcXVpbGlicml1bSBXYWdlOiAiLCByb3VuZCh1bmVtcGxveWVkX2hvdXJzLCAyKSwgIiBob3Vyc1xuIikNCmBgYA0KDQpiKQ0KSWYgYSBtaW5pbXVtIHdhZ2UgaXMgc2V0IGF0ICQ4IGFuIGhvdXIsIGhvdyBtYW55IGhvdXJzIGRvIGhpZ2ggc2Nob29sIGdyYWR1YXRlc3dvcms/IEhvdyBtYW55IGhvdXJzIG9mIGxhYm9yIGFyZSB1bmVtcGxveWVkPyBXaHk/DQpgYGB7cn0NCmNhdCgidGhlIG1pbmltdW0gd2FnZSBpcyBsZXNzIHRoYW4gdGhlIGVxdWlsaWJyaXVtIHdhZ2UuIEluIHRoaXMgY2FzZSwgdGhlIGVxdWlsaWJyaXVtIHdpbGwgcmVtYWluIHRoZSBzYW1lIGFzIGJlZm9yZS4gVGhleSB3b3JrIDY1MDAgaG91cnMgYW5kIFVuZW1wbG95ZWQgSG91cnMgYXQgRXF1aWxpYnJpdW0gV2FnZSBpcyBzdGlsbCAwIikNCg0KYGBgDQpjKQ0KSWYgYSBtaW5pbXVtIHdhZ2UgaXMgc2V0IGF0ICQxMiBhbiBob3VyLCB3aGF0IGFyZSB0aGUgbnVtYmVyIG9mIGhvdXJzIG9mIGxhYm9yDQplbXBsb3llZCBhbmQgdGhlIG51bWJlciBvZiBob3VycyBvZiBsYWJvciB1bmVtcGxveWVkPw0KYGBge3J9DQojIERlZmluZSB0aGUgbWluaW11bSB3YWdlDQptaW5fd2FnZV8xMiA8LSAxMg0KDQojIENhbGN1bGF0ZSBxdWFudGl0eSBkZW1hbmRlZCBhbmQgc3VwcGxpZWQgYXQgbWluaW11bSB3YWdlIG9mICQxMg0KcXVhbnRpdHlfZGVtYW5kZWRfYXRfbWluX3dhZ2VfMTIgPC0gcHJlZGljdChkZW1hbmRfbW9kZWwsIG5ld2RhdGEgPSBkYXRhLmZyYW1lKFdhZ2UgPSBtaW5fd2FnZV8xMikpDQpxdWFudGl0eV9zdXBwbGllZF9hdF9taW5fd2FnZV8xMiA8LSBwcmVkaWN0KHN1cHBseV9tb2RlbCwgbmV3ZGF0YSA9IGRhdGEuZnJhbWUoV2FnZSA9IG1pbl93YWdlXzEyKSkNCg0KIyBEZXRlcm1pbmUgZW1wbG95ZWQgYW5kIHVuZW1wbG95ZWQgaG91cnMNCmVtcGxveWVkX2hvdXJzX2F0XzEyIDwtIG1pbihxdWFudGl0eV9kZW1hbmRlZF9hdF9taW5fd2FnZV8xMiwgcXVhbnRpdHlfc3VwcGxpZWRfYXRfbWluX3dhZ2VfMTIpDQp1bmVtcGxveWVkX2hvdXJzX2F0XzEyIDwtIHF1YW50aXR5X3N1cHBsaWVkX2F0X21pbl93YWdlXzEyIC0gZW1wbG95ZWRfaG91cnNfYXRfMTINCg0KIyBQcmludCB0aGUgcmVzdWx0cw0KY2F0KCJBdCBhIG1pbmltdW0gd2FnZSBvZiAkIiwgbWluX3dhZ2VfMTIsICIgcGVyIGhvdXI6XG4iLCBzZXAgPSAiIikNCmNhdCgiSG91cnMgd29ya2VkIGJ5IGhpZ2ggc2Nob29sIGdyYWR1YXRlczogIiwgcm91bmQoZW1wbG95ZWRfaG91cnNfYXRfMTIsIDIpLCAiIGhvdXJzXG4iKQ0KY2F0KCJVbmVtcGxveWVkIGhvdXJzIG9mIGxhYm9yOiAiLCByb3VuZCh1bmVtcGxveWVkX2hvdXJzX2F0XzEyLCAyKSwgIiBob3Vyc1xuIikNCg0KYGBgDQpkKQ0KRG8geW91IGV4cGVjdCB0aGUgdW5lbXBsb3ltZW50IHRvIGluY3JlYXNlIG9yIGRlY3JlYXNlIGluIHRoZSBsb25nIHJ1bj8gV2h5Pw0KRXhwbGFpbiBjbGVhcmx5LCBubyBuZWVkIHRvIGRyYXcgYSBncmFwaCBoZXJlLg0KDQpgYGB7cn0NCmNhdCgiSW4gdGhlIGxvbmcgcnVuLCB1bmVtcGxveW1lbnQgaXMgZXhwZWN0ZWQgdG8gaW5jcmVhc2UuIEJvdGggc3VwcGx5IGFuZCBkZW1hbmQgd2lsbCBiZSBtb3JlIGVsYXN0aWMgYW5kICBoaWdlciB3YWdlcyBtZWFucyBsZXNzIHJlc291cmNlcyBjYW4gYmUgYXJyYW5nZSB0byBlYWNoIHNpbmdsZSBvbmUuIFRoZXJlZm9yZSB0aGVyZSBtdXN0IGJlIGluY3JlYXNlIHVuZW1wbG95bWVudCIpDQoNCmBgYA0KZSkNClVzaW5nIHRoZSBtaWRwb2ludCBtZXRob2QsIGNhbGN1bGF0ZSB0aGUgcHJpY2UgZWxhc3RpY2l0eSBvZiBkZW1hbmQgYW5kIHRoZSBwcmljZQ0KZWxhc3RpY2l0eSBvZiBzdXBwbHkgYmV0d2VlbiB0aGUgaW5pdGlhbCBlcXVpbGlicml1bSBwcmljZSBhbmQgdGhlIG5ldyBlcXVpbGlicml1bQ0KcHJpY2Ugd2hlbiB0aGUgbWluaW11bSB3YWdlIG9mICQxMiB3YXMgaW1wb3NlZC4NCg0KYGBge3J9DQojIERlZmluZSB0aGUgaW5pdGlhbCBhbmQgbmV3IHByaWNlDQpQX2luaXRpYWwgPC0gMTENClBfbmV3IDwtIDEyDQoNCiMgRGVmaW5lIHRoZSBpbml0aWFsIGFuZCBuZXcgcXVhbnRpdHkgZGVtYW5kZWQgKGludGVycG9sYXRlZCkNClFkX2luaXRpYWwgPC0gNjUwMA0KUWRfbmV3IDwtIDYwMDANCg0KIyBEZWZpbmUgdGhlIGluaXRpYWwgYW5kIG5ldyBxdWFudGl0eSBzdXBwbGllZCAoaW50ZXJwb2xhdGVkKQ0KUXNfaW5pdGlhbCA8LSAoNjAwMCArIDcwMDApIC8gMg0KUXNfbmV3IDwtIDcwMDANCg0KIyBDYWxjdWxhdGUgdGhlIHByaWNlIGVsYXN0aWNpdHkgb2YgZGVtYW5kIHVzaW5nIHRoZSBtaWRwb2ludCBtZXRob2QNCkVkIDwtICgoUWRfaW5pdGlhbCAtIFFkX25ldykgLyAoKFFkX25ldyArIFFkX2luaXRpYWwpIC8gMikpIC8NCiAgICAgICgoUF9uZXcgLSBQX2luaXRpYWwpIC8gKChQX25ldyArIFBfaW5pdGlhbCkgLyAyKSkNCg0KIyBDYWxjdWxhdGUgdGhlIHByaWNlIGVsYXN0aWNpdHkgb2Ygc3VwcGx5IHVzaW5nIHRoZSBtaWRwb2ludCBtZXRob2QNCkVzIDwtICgoUXNfbmV3IC0gUXNfaW5pdGlhbCkgLyAoKFFzX25ldyArIFFzX2luaXRpYWwpIC8gMikpIC8NCiAgICAgICgoUF9uZXcgLSBQX2luaXRpYWwpIC8gKChQX25ldyArIFBfaW5pdGlhbCkgLyAyKSkNCg0KIyBQcmludCB0aGUgcmVzdWx0cw0KY2F0KCJQcmljZSBFbGFzdGljaXR5IG9mIERlbWFuZDoiLEVkKQ0KY2F0KCJcblByaWNlIEVsYXN0aWNpdHkgb2YgU3VwcGx5OiIsRXMpDQoNCg0KYGBgDQpmKQ0KU3VwcG9zZSBzb21lIG1lY2hhbmljYWwgcm9ib3RzIGNhbiBhbHNvIHBlcmZvcm0gdGhlIHNhbWUgdGFza3MgYXMgdGhlc2Ugd29ya2Vycy4NClN1cHBvc2UgYWxzbyB0aGF0IHRoZSBtaW5pbXVtIHdhZ2UgcmF0ZSByZW1haW5zIGF0ICQxMiB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lDQp0aGUgcHJpY2Ugb2YgbWVjaGFuaWNhbCByb2JvdHMgaW5jcmVhc2VzIGJ5IDEwJS4gSWYgdGhlIGNyb3NzLXByaWNlIGVsYXN0aWNpdHkgb2YNCmRlbWFuZCBiZXR3ZWVuIHJvYm90cyBhbmQgaGlnaCBzY2hvb2wgZ3JhZHVhdGVzIGlzIDUuIFdoYXQgd2lsbCBoYXBwZW4gdG8gdGhlDQp1bmVtcGxveW1lbnQ/DQoNCmBgYHtyfQ0KY2F0KCJUaGUgY3Jvc3MtcHJpY2UgZWxhc3RpY2l0eSBiZWluZyBwb3NpdGl2ZSBpbmRpY2F0ZXMgdGhhdCByb2JvdHMgYW5kIGhpZ2ggc2Nob29sIGdyYWR1YXRlcyBhcmUgc3Vic3RpdHV0ZXMuIEEgMTAlIGluY3JlYXNlIGluIHRoZSBwcmljZSBvZiByb2JvdHMgbGVhZHMgdG8gYSA1MCUgaW5jcmVhc2UgaW4gZGVtYW5kIGZvciBoaWdoIHNjaG9vbCBncmFkdWF0ZXMuIEF0IHRoZSAkMTIgbWluaW11bSB3YWdlLCBkZW1hbmQgcmlzZXMgdG8gOSwwMDAgaG91cnMsIGV4Y2VlZGluZyB0aGUgNywwMDAgaG91cnMgc3VwcGxpZWQuIEFzIGEgcmVzdWx0LCB1bmVtcGxveW1lbnQgZHJvcHMgdG8gemVybywgYW5kIHRoZSBtaW5pbXVtIHdhZ2UgaXMgbm8gbG9uZ2VyIGJpbmRpbmcuIikNCg0KYGBgDQoyKQ0KQXNzdW1lIHRoZSBzdXBwbHkgY3VydmUgZm9yIGNpZ2FycyBpcyBhIHR5cGljYWwsIHVwd2FyZC1zbG9waW5nIHN0cmFpZ2h0IGxpbmUsIGFuZCB0aGUNCmRlbWFuZCBjdXJ2ZSBmb3IgY2lnYXJzIGlzIGEgdHlwaWNhbCwgZG93bndhcmQtc2xvcGluZyBzdHJhaWdodCBsaW5lLiBTdXBwb3NlIHRoZQ0KZXF1aWxpYnJpdW0gcXVhbnRpdHkgaW4gdGhlIG1hcmtldCBmb3IgY2lnYXJzIGlzIDEsMDAwIHBlciBtb250aCB3aGVuIHRoZXJlIGlzIG5vIHRheC4NClN1cHBvc2UgdGhhdCB0aGUgZ292ZXJubWVudCBpbXBvc2VzIGEgc2FsZXMgdGF4IG9mICQzIHBlciBjaWdhci4gQXMgYSByZXN1bHQgb2YgdGhlIHNhbGVzDQp0YXggdGhlIGVmZmVjdGl2ZSBwcmljZSBwYWlkIGJ5IHRoZSBidXllciBpbmNyZWFzZWQgZnJvbSAkMTAgdG8gJDEyLiBUaGUgZ292ZXJubWVudOKAmXMNCnRheCByZXZlbnVlIGFtb3VudHMgdG8gJDE4MDAgcGVyIG1vbnRoLg0KYSkNClVzaW5nIGEgY2xlYXJseSBsYWJlbGVkIGRpYWdyYW0sIHNob3cgdGhlIGVmZmVjdCBvZiB0aGlzIHRheCBpbiB0aGUgY2lnYXIgbWFya2V0Lg0KDQoNCjIpDQpBc3N1bWUgdGhlIHN1cHBseSBjdXJ2ZSBmb3IgY2lnYXJzIGlzIGEgdHlwaWNhbCwgdXB3YXJkLXNsb3Bpbmcgc3RyYWlnaHQgbGluZSwgYW5kIHRoZQ0KZGVtYW5kIGN1cnZlIGZvciBjaWdhcnMgaXMgYSB0eXBpY2FsLCBkb3dud2FyZC1zbG9waW5nIHN0cmFpZ2h0IGxpbmUuIFN1cHBvc2UgdGhlDQplcXVpbGlicml1bSBxdWFudGl0eSBpbiB0aGUgbWFya2V0IGZvciBjaWdhcnMgaXMgMSwwMDAgcGVyIG1vbnRoIHdoZW4gdGhlcmUgaXMgbm8gdGF4Lg0KU3VwcG9zZSB0aGF0IHRoZSBnb3Zlcm5tZW50IGltcG9zZXMgYSBzYWxlcyB0YXggb2YgJDMgcGVyIGNpZ2FyLiBBcyBhIHJlc3VsdCBvZiB0aGUgc2FsZXMNCnRheCB0aGUgZWZmZWN0aXZlIHByaWNlIHBhaWQgYnkgdGhlIGJ1eWVyIGluY3JlYXNlZCBmcm9tICQxMCB0byAkMTIuIFRoZSBnb3Zlcm5tZW504oCZcw0KdGF4IHJldmVudWUgYW1vdW50cyB0byAkMTgwMCBwZXIgbW9udGguDQphKSANClVzaW5nIGEgY2xlYXJseSBsYWJlbGVkIGRpYWdyYW0sIHNob3cgdGhlIGVmZmVjdCBvZiB0aGlzIHRheCBpbiB0aGUgY2lnYXIgbWFya2V0Lg0KDQpgYGB7cn0NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIERlZmluZSBwYXJhbWV0ZXJzDQpxdWFudGl0eV9ub190YXggPC0gNjAwDQpwcmljZV9ub190YXggPC0gMTINCnF1YW50aXR5X3dpdGhfdGF4IDwtIDEwMDANCnByaWNlX3dpdGhfdGF4IDwtIDEwDQp0YXggPC0gMw0KDQojIERlZmluZSBkZW1hbmQgYW5kIHN1cHBseSBmdW5jdGlvbnMNCmRlbWFuZCA8LSBmdW5jdGlvbihRKSB7DQogIHByaWNlX2RlbWFuZCA8LSAyMiAtIDAuMDEgKiBRICMgRXhhbXBsZSBwYXJhbWV0ZXJzIGZvciBkZW1hbmQgY3VydmUNCiAgcmV0dXJuKHByaWNlX2RlbWFuZCkNCn0NCg0Kc3VwcGx5X25vX3RheCA8LSBmdW5jdGlvbihRKSB7DQogIHByaWNlX3N1cHBseV9ub190YXggPC0gMC4wMSAqIFEgKyA2ICMgRXhhbXBsZSBwYXJhbWV0ZXJzIGZvciBzdXBwbHkgY3VydmUgd2l0aG91dCB0YXgNCiAgcmV0dXJuKHByaWNlX3N1cHBseV9ub190YXgpDQp9DQoNCnN1cHBseV93aXRoX3RheCA8LSBmdW5jdGlvbihRKSB7DQogIHByaWNlX3N1cHBseV93aXRoX3RheCA8LSBzdXBwbHlfbm9fdGF4KFEpICsgdGF4DQogIHJldHVybihwcmljZV9zdXBwbHlfd2l0aF90YXgpDQp9DQoNCiMgQ3JlYXRlIGRhdGEgZm9yIHBsb3R0aW5nDQpRIDwtIHNlcSgwLCAxMjAwLCBieT0xMCkNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgUXVhbnRpdHkgPSBRLA0KICBEZW1hbmQgPSBkZW1hbmQoUSksDQogIFN1cHBseV9Ob19UYXggPSBzdXBwbHlfbm9fdGF4KFEpLA0KICBTdXBwbHlfV2l0aF9UYXggPSBzdXBwbHlfd2l0aF90YXgoUSkNCikNCg0KIyBQbG90DQpnZ3Bsb3QoZGF0YSwgYWVzKHg9UXVhbnRpdHkpKSArDQogIGdlb21fbGluZShhZXMoeT1EZW1hbmQsIGNvbG9yPSJEZW1hbmQiKSwgc2l6ZT0xKSArDQogIGdlb21fbGluZShhZXMoeT1TdXBwbHlfTm9fVGF4LCBjb2xvcj0iU3VwcGx5IE5vIFRheCIpLCBzaXplPTEpICsNCiAgZ2VvbV9saW5lKGFlcyh5PVN1cHBseV9XaXRoX1RheCwgY29sb3I9IlN1cHBseSBXaXRoIFRheCIpLCBzaXplPTEsIGxpbmV0eXBlPSJkYXNoZWQiKSArDQogIGxhYnModGl0bGU9IkNpZ2FyIE1hcmtldCB3aXRoIGFuZCB3aXRob3V0IFNhbGVzIFRheCIsDQogICAgICAgeD0iUXVhbnRpdHkiLA0KICAgICAgIHk9IlByaWNlIiwNCiAgICAgICBjb2xvcj0iTGVnZW5kIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIkRlbWFuZCI9ImJsdWUiLCAiU3VwcGx5IE5vIFRheCI9ImdyZWVuIiwgIlN1cHBseSBXaXRoIFRheCI9Im9yYW5nZSIpKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KYikNCldoYXQgaXMgdGhlIHByaWNlIHJlY2VpdmVkIGJ5IHRoZSBzZWxsZXJzPw0KDQpgYGB7cn0NCiNQcmljZSBSZWNlaXZlZCBieSBTZWxsZXJzPUVmZmVjdGl2ZSBQcmljZSBQYWlkIGJ5IEJ1eWVyc+KIklNhbGVzIFRheD0xMi0zDQpjYXQoIjkiKQ0KYGBgDQoNCmMpDQpXaGljaCBjdXJ2ZSBpcyBtb3JlIGVsYXN0aWM6IHRoZSBkZW1hbmQgY3VydmUgb3IgdGhlIHN1cHBseSBjdXJ2ZT8gRXhwbGFpbi4NCg0KYGBge3J9DQpjYXQoIlNlZW1zIGJ1eWVycyBwYXkgJDIgb2YgdGF4IHdoZXJlIHNlbGxzIHBheSAkMSwgc3VwcGx5IGN1cnZlIHNob3VsZCBiZSBtb3JlIGVsYXN0aWMiKQ0KYGBgDQoNCmQpDQpEb2VzIHRoZSBjb25zdW1lciBzdXJwbHVzIGluY3JlYXNlIG9yIGRlY3JlYXNlPyBCeSBob3cgbXVjaD8NCihQbGVhc2UgbGFiZWwgdGhlIGFwcHJvcHJpYXRlIGFyZWEgb24geW91ciBncmFwaCBhcyB3ZWxsIGFzIHByb3ZpZGUgbnVtYmVycykNCmBgYHtyfQ0KIyBzdXBwb3NlIGludGVyYWN0IHBvaW50IHdpdGggc3VwcGx5IG5vIHRheCAoWCwgWSkgd2l0aCBzdXBwbHkgd2l0aCB0YXggKGEsIGIpLCBhcmVhIHdpbGwgYmUgYSooYi1ZKSArIChYLWEpKihiLVkpLzINCiMgNjAwKjIgKyA0MDAgPSAxNjAwDQpjYXQoIkRlY3JlYXNlIHNpbmNlIG1vcmUgbmVlZWQgdG8gYmUgcGFpZCBieSBidXllcnMgYW5kIGNvbnN1bWUgbGVzcyBwZXIgdW5pdC4gQnkgJDE2MDAiKQ0KDQpgYGANCg0KZSkNCkRvZXMgdGhlIHByb2R1Y2VyIHN1cnBsdXMgaW5jcmVhc2Ugb3IgZGVjcmVhc2U/IEJ5IGhvdyBtdWNoPw0KDQpgYGB7cn0NCiMgYSAqIChZLTkpICsgKFgtYSkqKFktOSkvMg0KIyA2MDAgKyA0MDAvMiA9IDgwMCANCmNhdCgiRGVjcmVhc2UgaW4gJDgwMCIpDQpgYGANCmYpDQpBcmUgdGhlcmUgYW55IGRlYWQgd2VpZ2h0IGxvc3Nlcz8gSWYgeWVzLCBob3cgYmlnIGlzIHRoZSBEV0w/DQoNCmBgYHtyfQ0KIyAoWC1hKSooYi1ZKS8yICsgKFgtYSkqKFktOSkvMiA9IDQwMCArIDIwMCA9IDYwMA0KY2F0KCJEZWFkd2VpZ2h0IExvc3M6IFllcywgRFdMIGV4aXN0cyBkdWUgdG8gdGhlIHRheCwgaW4gYW1vdW50IG9mICQ2MDAiKQ0KYGBgDQpnKQ0KV2hhdCB3aWxsIGJlIHRoZSBlZmZlY3Qgb2YgdGhpcyBDaWdhciB0YXggb24gdGhlIGNvbnN1bWVyIHN1cnBsdXMgaW4gdGhlIG1hcmtldCBmb3INCkNpZ2FyZXR0ZXM/IElsbHVzdHJhdGUgd2l0aCBhIHNpbXBsZSBkaWFncmFtLg0KDQpgYGB7cn0NCmNhdCgiU2luY2UgY2lnYXJldHRlcyBhbmQgY2lnYXJzIGFyZSBzdWJzdGl0dXRlcywgaW1wb3NpbmcgYSB0YXggb24gY2lnYXJzIHdpbGwgbGVhZCB0byBhbiBpbmNyZWFzZSBpbiBkZW1hbmQgZm9yIGNpZ2FyZXR0ZXMuIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGVtYW5kIGN1cnZlIGZvciBjaWdhcmV0dGVzIHRvIHNoaWZ0IHVwd2FyZC4iKQ0KDQojd2UgZHJhdyBhIHNhbXBsZSBjdXJ2ZQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJ5DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRGVmaW5lIHNpbXBsaWZpZWQgZnVuY3Rpb25zDQpzdXBwbHkgPC0gZnVuY3Rpb24oUSkgeyA1ICsgMC4wMiAqIFEgfQ0KZGVtYW5kMSA8LSBmdW5jdGlvbihRKSB7IDIwIC0gMC4wMiAqIFEgfQ0KZGVtYW5kMiA8LSBmdW5jdGlvbihRKSB7IDE1IC0gMC4wMiAqIFEgfSAjIFBhcmFsbGVsIHRvIGRlbWFuZDEsIHNoaWZ0ZWQgZG93bndhcmQNCg0KIyBDcmVhdGUgZGF0YSBmb3IgcGxvdHRpbmcNClEgPC0gc2VxKDAsIDEwMDAsIGJ5PTEwKQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBRdWFudGl0eSA9IFEsDQogIFN1cHBseSA9IHN1cHBseShRKSwNCiAgRGVtYW5kMSA9IGRlbWFuZDEoUSksDQogIERlbWFuZDIgPSBkZW1hbmQyKFEpDQopDQoNCiMgUGxvdA0KZ2dwbG90KGRhdGEsIGFlcyh4PVF1YW50aXR5KSkgKw0KICBnZW9tX2xpbmUoYWVzKHk9U3VwcGx5LCBjb2xvcj0iU3VwcGx5IiksIHNpemU9MSkgKw0KICBnZW9tX2xpbmUoYWVzKHk9RGVtYW5kMSwgY29sb3I9IkRlbWFuZCBDdXJ2ZSAxIiksIHNpemU9MSkgKw0KICBnZW9tX2xpbmUoYWVzKHk9RGVtYW5kMiwgY29sb3I9IkRlbWFuZCBDdXJ2ZSAyIiksIHNpemU9MSwgbGluZXR5cGU9ImRhc2hlZCIpICsNCiAgbGFicyh0aXRsZT0iU3VwcGx5IGFuZCBQYXJhbGxlbCBEZW1hbmQgQ3VydmVzIiwNCiAgICAgICB4PSJRdWFudGl0eSIsDQogICAgICAgeT0iUHJpY2UiLA0KICAgICAgIGNvbG9yPSJMZWdlbmQiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiU3VwcGx5Ij0iZ3JlZW4iLCAiRGVtYW5kIEN1cnZlIDEiPSJibHVlIiwgIkRlbWFuZCBDdXJ2ZSAyIj0icmVkIikpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmNhdCgiU3VwcG9zZSB0d28gaW50ZXJhdGlvbiBwb2ludHMgd2l0aCByZWQgKHAsIHEpIGFuZCB3aXRoIGJsdWUgKHUsIHYpIHRoZW4gaW5pdGlhbCBjb25zdW1lciBzdXJwbHVzIHdpbGwgYmUgYXJlYSBpbnNpZGUgWS1heGlzLCByZWQgZGVtYW5kIGN1cnZlLCBzdXBwbHkgY3VydmUsIGFuZCBwb2ludCAocCwgcSkuIEluc3RlYWQgYWZ0ZXIgc2hpZnRpbmcgaXQgd2lsbCBiZSBhcmVhIGluc2lkZSBZLWF4aXMsIHk9diwgYmx1ZSBkZW1hbmQgY3VydmUgYW5kIHBvaW50ICh1LCB2KSIpDQoNCmBgYA==