Author1 Hendrik Sommer, Germany

Author2 Antoine Putresza, Poland

Date of the project:

Date of the submission:02.12.2024

Date of the revision:

Date of acceptance:

We will now start with doing the basic parameters of the market table

library(quantmod)

# Define the date range
start_date <- "2024-05-01"
end_date <- "2024-09-30"

# Create an empty data frame
table_data <- data.frame(
  Description = character(),
  Beginning_of_Term = character(),
  End_of_Term = character()
)

# Function to add rows to the table
add_row <- function(category, data) {
  table_data <<- rbind(table_data, data.frame(
    Description = category,
    BoT = as.character(format(round(data[1], 2), nsmall=2)),
    EoT = as.character(format(round(data[2], 2), nsmall=2))
  ))
}

# Get S&P 500 index level
getSymbols("AAPL", src = "yahoo", from = start_date, to = end_date)
[1] "AAPL"
sp500_start <- AAPL[1, 4]
sp500_end <- AAPL[nrow(AAPL), 4]
add_row("S&P 500 (stock) index level:", c(sp500_start, sp500_end))

#getsymbols Nasdaq composite index level
getSymbols("^IXIC", src = "yahoo", from = start_date, to = end_date)
[1] "IXIC"
start_index_level <- IXIC[1, 4]
end_index_level <- IXIC[nrow(IXIC), 4]
add_row("Nasdaq Composite (stock) index level:", c(start_index_level,end_index_level ))
getSymbols("DPRIME", src = "FRED", from = start_date, to = end_date)
[1] "DPRIME"
# Extract the beginning and end prime rates
prime_rate_start <- DPRIME[1, 1]
prime_rate_end <- DPRIME[nrow(DPRIME), 1]
add_row("Prime rate:", c(prime_rate_start, prime_rate_end))
getSymbols("FEDFUNDS", src = "FRED", from = start_date, to = end_date)
[1] "FEDFUNDS"
# Extract the beginning and end federal funds rates
fed_funds_start <- FEDFUNDS[1, 1]
fed_funds_end <- FEDFUNDS[nrow(FEDFUNDS), 1]
add_row("Federal funds rate:", c(fed_funds_start, fed_funds_end))

getSymbols("DTB3", src = "FRED", from = start_date, to = end_date)
[1] "DTB3"
add_row("Commercial paper rate (90 days):", c(NA, NA))

add_row("Certificate of deposit rate (3-month):", c(NA, NA))

# Extract the beginning and end rates
tbill_rate_start <- DTB3[1, 1]
tbill_rate_end <- DTB3[nrow(DTB3), 1]
add_row("treasury bill rate (13 weeks):", c(tbill_rate_start, tbill_rate_end))

getSymbols("DTB6", src = "FRED", from = start_date, to = end_date)
[1] "DTB6"
# Extract the beginning and end rates
tbill6_rate_start <- DTB6[1, 1]
tbill6_rate_end <- DTB6[nrow(DTB6), 1]
add_row("Treasury bill rate (26 weeks):", c(tbill6_rate_start, tbill6_rate_end))


# Get the 10-year Treasury Bond Yield
getSymbols("DGS10", src = "FRED", from = start_date, to = end_date)
[1] "DGS10"
# Extract the beginning and end rates
long_term_yield_start <- DGS10[1, 1]
long_term_yield_end <- DGS10[nrow(DGS10), 1]
add_row("Treasury long-term bond yield:", c(long_term_yield_start, long_term_yield_end))

#we will use a proxy for corporate (master) bond yield, the Moody's Seasoned Aaa Corporate Bond Yeild

# Get the Moody's Seasoned Aaa Corporate Bond Yield
getSymbols("AAA", src = "FRED", from = start_date, to = end_date)
[1] "AAA"
# Extract the beginning and end rates
corp_bond_yield_start <- AAA[1, 1]
corp_bond_yield_end <- AAA[nrow(AAA), 1]
add_row("Corporate (Master) bond yield:", c(corp_bond_yield_start, corp_bond_yield_end))

add_row("High-yield corporate bond yield:", c(NA, NA))

add_row("Tax-exempt (7–12-year) bond yield:", c(NA, NA))

print(table_data)

First i will compare the London Stock Exchange with the NASDAQ

library(quantmod)
getSymbols("NDAQ", src = "yahoo")
[1] "NDAQ"
getSymbols("^FTSE", src = "yahoo")
Warning: ^FTSE contains missing values. Some functions will not work if objects contain missing values in the middle of the series. Consider using na.omit(), na.approx(), na.fill(), etc to remove or replace them.
[1] "FTSE"
FTSE<- na.approx(FTSE)
NDAQ <- subset(NDAQ, start = "2024-01-05", end = "2024-30-09")
FTSE <- subset(FTSE, start = "2008-01-05", end = "2024-30-09")
nasdaq_stats <- c(
  Mean = mean(NDAQ$NDAQ.Close, na.rm=TRUE),
  Median = median(NDAQ$NDAQ.Close, na.rm=TRUE),
StDev = sd(NDAQ$NDAQ.Close, na.rm= TRUE))
lond_stats <- c(
  Mean = mean(FTSE$FTSE.Close),
  Median = median(FTSE$FTSE.Close),
  StDev = sd(FTSE$FTSE.Close))
aligned_data <- merge(NDAQ, FTSE)
cleaned_data <- na.omit(aligned_data)
correlation <- cor(cleaned_data[, 1], cleaned_data[, 7])
print(correlation)
          FTSE.Open
NDAQ.Open  0.715855
stats_comparison <- rbind(nasdaq_stats, lond_stats)
colnames(stats_comparison) <- c("Mean", "Median", "Standard Deviation" )

round(stats_comparison,2)
                Mean  Median
nasdaq_stats   26.25   19.41
lond_stats   6536.16 6632.90
             Standard Deviation
nasdaq_stats              19.72
lond_stats               946.51
print(round(correlation,2))
          FTSE.Open
NDAQ.Open      0.72

I will now compare the London Stock Exchange index and the German DAX index

# Download historical data for NASDAQ and TechDAX
getSymbols("NDAQ", src = "yahoo")
[1] "NDAQ"
getSymbols("DAX", src = "yahoo")  # TechDAX is a component of the DAX index
[1] "DAX"
 
# Fill in missing values with approximations
DAX <- na.approx(DAX)
 
# Trim data to a specific period
NDAQ <- subset(NDAQ, start = "2024-05-01", end = "2024-09-30")
DAX <- subset(DAX, start = "2024-05-01", end = "2024-09-30")
 
# Calculate basic statistics
nasdaq_stats <- c(
  Mean = mean(NDAQ$NDAQ.Close, na.rm = TRUE),
  Median = median(NDAQ$NDAQ.Close, na.rm = TRUE),
  StDev = sd(NDAQ$NDAQ.Close, na.rm = TRUE)
)
 
dax_stats <- c(
  Mean = mean(DAX$DAX.Close),
  Median = median(DAX$DAX.Close),
  StDev = sd(DAX$DAX.Close)
)
 
# Correlation
aligned_data <- merge(NDAQ, DAX)
cleaned_data <- na.omit(aligned_data)
correlation <- cor(cleaned_data[, 1], cleaned_data[, 2])
 
# Print statistics and correlation
stats_comparison <- rbind(nasdaq_stats, dax_stats)
colnames(stats_comparison) <- c("Mean", "Median", "Standard Deviation")
round(stats_comparison, 2)
              Mean Median
nasdaq_stats 26.25  19.41
dax_stats    28.06  27.98
             Standard Deviation
nasdaq_stats              19.72
dax_stats                  3.36
print(round(correlation, 2))
          NDAQ.High
NDAQ.Open         1
 
# Visualize the comparison
library(ggplot2)
ggplot() +
  geom_line(data = NDAQ, aes(x = index(NDAQ), y = NDAQ.Close), color = "blue") +
  geom_line(data = DAX, aes(x = index(DAX), y = DAX.Close), color = "red") +
  labs(title = "NASDAQ vs. DAX (TechDAX)", x = "Date", y = "Index Value") +
  scale_color_manual(values = c("blue" = "NASDAQ", "red" = "DAX"))
Warning: No shared levels found between
`names(values)` of the manual scale and
the data's colour values.

L.3

library(quantmod)

# Define the date range
start_date <- as.Date("2024-05-01")
end_date <- as.Date("2024-09-30")

# Get 13-week Treasury Bill rates
getSymbols("^IRX", src = "yahoo", from = start_date, to = end_date)
Warning: ^IRX contains missing values. Some functions will not work if objects contain missing values in the middle of the series. Consider using na.omit(), na.approx(), na.fill(), etc to remove or replace them.
[1] "IRX"
# Extract initial and final rates
start_rate <- IRX[1,1]
end_rate <- IRX[nrow(IRX),1]

# Calculate change and percentage change
rate_change <- end_rate - start_rate
percentage_change <- (end_rate - start_rate) / start_rate * 100

# Print the results
cat("13-week Treasury Bill Rate at the beginning of the term:", start_rate, "\n")
13-week Treasury Bill Rate at the beginning of the term: 5.25 
cat("13-week Treasury Bill Rate at the end of the term:", end_rate, "\n")
13-week Treasury Bill Rate at the end of the term: 4.478 
cat("Change in rate:", rate_change, "\n")
Change in rate:  
cat("Percentage change:", percentage_change, "%")
Percentage change:  %
Why did the interest rate change?

Monetary policy of the Federal Reserve
Inflation expectations
Demand for safe assets
Liquidity in the financial system
Expectations for the future interest rates
Supply and demand
International capital flows

L.4

library(quantmod)
library(ggplot2)

# Specify the date range
start_date <- "2017-10-22"
end_date <- "2017-10-30"

# Get the stock data for Coca-Cola
getSymbols("KO", src = "yahoo", from = start_date, to = end_date)
[1] "KO"
# Create a data frame with Date and Closing Price
KO_df <- data.frame(Date = index(KO), Price = Cl(KO))

# Create the line plot
ggplot(KO_df, aes(x = Date, y = Cl(KO))) +
  geom_line() +
  labs(x = "Date", y = "Stock Price", title = "Coca-Cola Stock Price (22-30 Oct 2017)") +
  theme_classic()  # Optional: For a cleaner plot
Don't know how to automatically pick
scale for object of type <xts/zoo>.
Defaulting to continuous.

library(quantmod)
library(ggplot2)

# Specify the date range for October 2017
start_date <- "2017-10-15"
end_date <- "2017-11-15"

# Get the stock data for Coca-Cola
getSymbols("KO", src = "yahoo", from = start_date, to = end_date)
[1] "KO"
# Create a data frame with Date and Closing Price
KO_df <- data.frame(Date = index(KO), Price = Cl(KO))

# Create the line plot
ggplot(KO_df, aes(x = Date, y = Cl(KO))) +
  geom_line() +
  labs(x = "Date", y = "Stock Price", title = "Coca-Cola Stock Price (October 2017)") +
  theme_classic()
Don't know how to automatically pick
scale for object of type <xts/zoo>.
Defaulting to continuous.

library(quantmod)
library(ggplot2)

# Specify the date range for October 2017
start_date <- "2017-04-15"
end_date <- "2017-11-15"

# Get the stock data for Coca-Cola
getSymbols("KO", src = "yahoo", from = start_date, to = end_date)
[1] "KO"
# Create a data frame with Date and Closing Price
KO_df <- data.frame(Date = index(KO), Price = Cl(KO))

# Create the line plot
ggplot(KO_df, aes(x = Date, y = Cl(KO))) +
  geom_line() +
  labs(x = "Date", y = "Stock Price", title = "Coca-Cola Stock Price (October 2017)") +
  theme_classic()
Don't know how to automatically pick
scale for object of type <xts/zoo>.
Defaulting to continuous.

On October 26 2017 Coca-Cola released its third-quarter earnings for 2017. As we analize the stock price of coca cola company in time we observe that in the period of a month before the 26th of october there is a downtrend but on the 26th of october the price increased for one day and then continued dropping intill the begining of November where it started going up again. The explanation could be that the information comming from the quarterly report influenced a better informed part of the market immidiately on the 26th of october and the rest of the market later in the begining of November.

L.5

For our task we chose the Bank of America

L5.1 Identify the types of deposits that the commercial bank uses to obtain most of its funds. Bank of America raises the majority of its funds through the following types of deposits: - Demand deposits: checking accounts that allow customers to access their money at any time. - Time deposits: Time deposit accounts in which customers invest their money for a specific period of time. - Savings deposits: Savings accounts that are intended for saving and offer higher interest rates.

L5.2 Identify the main uses of funds by the bank. c. Summarize any statements made by the commercial bank in its annual report about how recent or potential regulations will affect its performance. The primary uses of Bank of America’s funds include: - Lending: providing loans to individuals and businesses. - Investment banking: providing corporate finance and capital markets transaction services. - Asset management: managing assets for private clients and institutions.

Impact of regulations In its annual report, Bank of America emphasises that current and potential regulatory requirements can affect its performance. In particular, reference is made to capital requirements and liquidity requirements, which could restrict the ability to grant loans.

L5.3 Does it appear that the bank is attempting to enter the securities industry by offering securities services? If so, explain how. Yes, it appears that Bank of America is attempting to enter the securities industry. This is being done by: - Offering securities services: The bank offers trading services for stocks and bonds and has a strong investment banking segment that focuses on capital market transactions.

L5.4 Does it appear that the bank is attempting to enter the insurance industry by offering insurance services? If so, explain how. Yes, there are signs that Bank of America is entering the insurance sector. This is evidenced by: - Offering insurance products: The bank offers various insurance services to provide comprehensive financial solutions to its customers.

L5.6 To determine Bank of America’s interest income as a percentage of its total assets, we can use the following data from their financial statements:

L5.7 Interest expenses: For the year ending December 31, 2023, Bank of America reported interest income of $98,581 million Total Assets: As of December 31, 2023, the total assets for Bank of America were reported as $3,180,151 million

We can now divide the total interest income by the total assets to get a percentage rate:

98581/3180151 
[1] 0.03099884

The bank’s interest expenses were 3,10% of the total assets of the Bank of America

L5.8 Determine the bank’s net interest margin. NIM = 2.07% (P. 84 / P. 86)

L5.9

The noninterest income: For the year ending December 31, 2023, Bank of America reported a noninterest income of $41,650 million Now we will divide this by the total assets to get a percentage rate

41650/3180151 
[1] 0.01309686

The bank’s noninterest income rate was 1,31% of the total assets

Non Interest expenses percentage = 2.09% (P.81)

L5.10

For the year ending December 31, 2023, Bank of America reported a loan loss reserve of $13,287 million We will now divide it by the amount of total assets to get a percentage rate

13287/3180151
[1] 0.004178103

The loans and loss reserve rate was 0,42% of the total assets

L5.11 To find out about the return on assets we should find out about the total income of the bank and then divide it by the value of total assets. For the year ending December 31, 2023, Bank of America reported a net income of $26,515 million We will now divide this value by the total assets to get a percentage rate

26515/3180151
[1] 0.008337654

The Bank of America’s return on assets was 0,83% of the total assets

L5.12 To find out about the return on assets we should find out about the total income of the bank and then divide it by the value of total shareholders equity. As we already have the value of the net income we will now find the data about the total shareholders equity. For the year ending December 31, 2023, Bank of America reported a total shareholders equity of $291,646 million. We will now divide the net income by the total shareholders equity.

26515/291646
[1] 0.09091501

The Bank of America’s return on equity rate was 9,09%.

L5.13

Income Statement Items Affected

  1. net interest income (interest income):
    • 2023: $56,931 million
    • Impact: An increase in interest rates will increase interest income as the bank benefits from higher income from variable rate loans and new loans. Interest expenses could also increase, but as net interest income is higher than interest expenses, overall net interest income is expected to grow.
  2. provision for credit losses (loan loss provisions):
    • 2023: USD 4.394 million
    • Impact: Higher interest rates could increase the risk of default as borrowers may have difficulty servicing their debts. This could lead to higher loan loss provisions.
  3. non-interest income (non-interest income):
    • 2023: USD 41.650 million
    • Impact: Fee income could increase as clients increasingly seek financial products to deal with rising interest rates. At the same time, market volatility could negatively impact trading profits.

Summary of the impact

An increase in interest rates would likely lead to an increase in net interest income as interest income exceeds interest expenses. At the same time, the commission for credit losses could increase, which affects the default risk for borrowers. Non-interest income could be affected both positively and negatively, depending on developments in fee income and trading profits. Overall, the bank could benefit from the interest rate increases as long as the income outweighs the risk of credit losses.

This analysis provides a specific overview of the potential financial impact on Bank of America in the context of rising interest rates.

L5.14

Income Statement Items Affected Net interest income: In a situation of crisis the net interest income might register a drop. Usually when the economic conditions deteriorate, individuals and businesses are less likely to take credits because the bank has no guarantee they will be able to pay them back. As a result the demand falls and the interest income becomes lower.There might also be a reaction of the Federal Reserve which could lower the rate which would be a reason for a lower interest income from existing loans.

Provision for Loan Losses: During an economic condition deterioration bank’s might anticipate a higher default rate on credits. That might result in an increase of the provision for loan losses since the expected defaulted loans rate rises, so to cover the potential losses the bank could put more funds into this item.

Non-interest income: During an economic condition deterioration bank’s might experience a drop of fee-generating activities such as asset management or investment banking. That could lead to a decrease of the non-interest income.

Net interest margin: During an economic condition deterioration bank’s might lower the interest rate to stimulate borrowing, that would lead to a drop in the difference between the interest of loans and the interest of deposits which would lead to a drop of the net interest margin.

Net income: As we take the situation of all the items we analyzed above we see that as the net interest income could drop the provision on loan losses could rise and the net interest margin could drop the situation of the net income could also be a decrease in overall.

L5.15

The fund’s objective is to invest at least 99.5% of its total assets in cash, U.S. Treasury bills, notes and other direct obligations of the U.S Treasury, and repurchase agreements secured by such obligations or cash. The Fund invests in securities maturing in 397 days or less (with certain exceptions) and the portfolio will have a dollar-weighted average maturity of 60 days or less and a dollar-weighted average life of 120 days or less. In addition, the Fund may invest in variable and floating rate instruments and transact in securities on a when-issued, delayed delivery or forward commitment basis. We consider this mutual fund to have a low risk since it invests mostly in low risk instruments such as treasury bills.

L5.16

The return of the mutual fund for last year was 5.08% The average annual return over the last three years was 2.22%

L5.17

As the fund invests most of its assets in treasury bills and obligations it will be mostly affected by the U.S. interest rates.

L5.18

When buying we pay 0.10% of a management fee and 0.07% of an administration fee, as a sum we pay a 0.17% fee.

L5.19

The expense ratio for this mutual fund over the last year was 0.02%. This amount seems quite low in comparison with other funds that sometimes have an expense ratio of over 1%. This level of expense ratio gives a possibility to transfer more of the interest to the investors.

Securities firms For the securities firm that you selected at the beginning of the term, use its annual report or any other related information to answer the following questions.

L5.20 What are the main types of business conducted by the securities firm? The corporate purpose of Prosegur Cash is to provide the following services through companies focusing on the Cash business: (i) national and international transport services (by land, sea and air) of funds and other valuables (including jewellery, artworks, precious metals, electronic devices, voting ballots, legal evidence), including collection, transport, custody and deposit services; (ii) processing and automation of cash (including counting, processing and packaging, as well as coin recycling, cash flow control and monitoring systems); (iii) comprehensive ATM solutions (including planning, loading, monitoring, first- and second-tier maintenance and balancing); (iv) cash planning and forecasting for financial institutions; (v) Cash-Today (including self-service cash machines, cash deposits, recycling and bank notes and coin dispensing services), and cryptocurrency custody services; and (vi) added-value services in several countries (AVOS) for banks (including outsourcing of tellers, multi-agency services, cheque processing and related administrative services among others) and (vii) Correspondent banking activities (collection and payment management and payment of invoices, among others) and (viii) Foreign exchange currency services (also includes international payment services, online foreign money, home delivery services for travel money and local cash)

L5.21 Summarize any statements made by the securities firm in its annual report about how it may be affected by existing or potential regulations. Prosegur acknowledges that the sector in which it provides its services is highly regulated. The firm however sees the need to adapt to those regulations and takes action in introducing changes the regulations address. The reports indicate that the change in regulations affect the business especially in the data protection sector, however it provided important steps to introduce changes in its operational practices. This process may lead to a rise in operational costs since it may need introducing some new technologies and training of the staff. The regulations may however have a positive effect on the business in the domains of cybersecurity and risk management since the changes in regulations may affect the demand on such services provided by this firm.

L5.22 Describe the recent performance of the securities firm, and explain why the performance has been favorable or unfavorable. Sales in 2023 compared to the year 2022 -21 802 000 € Post tax profit of ongoing operations in 2023 compared to the year 2022 -95 488 000 € EBITDA in 2023 compared to year 2022 -36 220 000€

The data shows a significant difference between the performance of the firm in the year 2022 and the year 2023. This may have been caused by multiple different aspects. First of all, the year 2022 was a very good year in the history of Prosegur and the firm registered some significant profits and a big growth in assets, which could be difficult to outperform. The second aspect could be a difference in demand on the market which could be the reason for the difference in sales and the EBITDA. The firm also has registered an important difference in the post tax profit of ongoing operations which could be caused by a different cost management policy.

L7 Fixed income Comparing yields among securities

L7.1 What is the difference between the yield on corporate high-quality bonds and the yield on Treasury bonds at the end of the school term? Explain why the difference exists? Reasons for the difference between these two yields

This difference between the yields is called the credit spread and exists due to the following factors: 1. credit risk a. Corporate high-quality bonds have a higher risk of default compared to Treasury bonds. Therefore, investors demand a higher yield to compensate for this risk 2. liquidity risk a. Corporate high-quality bonds are often less liquid than Treasury bonds. A quick sale at a fair market price is therefore much more difficult than with Treasury bonds. 3. market conditions a. Changes in the economic situation or monetary policy have a different effect on the respective bond.

L7.2 What is the difference between the yield on long-term Treasury bonds and the yield on long-term municipal bonds at the end of the school term? Explain why does the difference exist? Long-term treasury bonds yield varies between 3.8% and 4% while long-term municipal bonds may yield between 5% and 6% after counting for their tax-exempt status for investors in higher tax brackets. That means that after taking in consideration the tax implications the municipal bonds offer a higher yield than treasury bonds. The interest from municipal bonds is exempt from federal income tax and also from state taxes if the investor resides in the issuing state. This puts the municipal bonds in a favorable position compared to the treasury bonds which are taxable. There is a difference in risk between the treasury bonds and the municipal bonds since the treasury bonds are considered to be risk-free while the municipal bonds carry some type of credit risk depending on the financial condition of the issuing municipality.

Assessing the forecasting ability of the yield curve

L7.3 What was the difference between the 26-week T-bill yield and the 13-week T-bill yield at the beginning of the school term?

L7.4 Does this imply that the yield curve had an upward or downward slope at that time?

L7.5 Assuming that this slope can be primarily attributed to expectations theory, did the direction of the slope indicate that the market expected higher or lower interest rates in the future?

L7.6 Did interest rates move in that direction over the school term? Explaining shifts in the yield curve over time

L7.7 What was the difference between the long-term Treasury bond yield and the 13-week T-bill yield at the beginning of the school term? On May 1st, 2024, the yield for the 30-year Treasury bond was 4.57% Meanwhile, the yield for the 13-week T-bill was 3.81% Difference between those bonds is 4.57 - 3.81 = 0.76% The difference between those two bonds would usually be caused by the risk differences where the risk of the 10-year U.S. treasury bond is higher than the 13-week treasury bill. In such a case the yield of the 10-year treasury bond should be higher to compensate for the risk. Another reason for this difference is the expectation that the interest rate could change in time so investors would prefer to have their money held for a shorter period of time in order not to be locked in their investments.

L7.8 What is the difference between the long-term Treasury bond yield and the 13-week T-bill yield at the end of the school term? On September 30, 2024, the long-term Treasury bond yield (10-year Treasury rate) was 4.41%. Meanwhile, the 13-week T-bill yield was 3.81%. The difference between these two yields is 0.60% (4.41% - 3.81%)

L7.9 Given your answers to the two previous questions, describe how the yield curve changed over the school term. Explain the changes in expectations about future interest rates that are implied by the shift in the yield curve over the school term. The differences between the yields in the beginning of the school term was 0.76% and at the end of the school term was 0.60%. Over the school term, the yield curve experienced a flattening. That shows that the expectations about the interest rates are that it will drop. The Fed’s influence on interest rates

L7.10 Did the Fed change the federal funds rate over the school term?

L7.11 Do you think the movements in interest rates over the school term were caused by the Fed’s monetary policy? Explain. Measuring and explaining premiums on money market securities L7.12 What is the difference between the yield on 90-day commercial paper and the yield on 13-week T-bills at the end of the school term? Eexplain why this premium exists. L7.13 Compare the premium on the 90-day commercial paper yield (relative to the 13-week T-bill yield) that exists at the end of the school term to the premium that existed at the beginning of the term. Eexplain why the premium may have changed over the school term. Explaining bond premiums and price movements

L7.14 What is the difference between the yield on high-yield corporate bonds at the end of the school term versus the yield on high-quality corporate bonds at the beginning of the school term?

L7.15 Compare the long-term Treasury bond yield at the end of the school term to the longterm Treasury bond yield that existed at the beginning of the school term. Given the direction of this change, did prices of long-term bonds rise or fall over the school term?

L7.16 Compare the change in the yields of Treasury, municipal, and corporate bonds over the school term. Did the yields of all three types of securities move in the same direction and by about the same degree? Explain why yields of different types of bonds move together.

L7.17 Compare the premium on high-yield corporate bonds (relative to Treasury bonds) at the beginning of the school term to the premium that existed at the end of the school term. Did the premium increase or decrease? Why this premium changed over the school term.

L8 Portfolio - Markovitz Replicate the basic idea of the portfolio case Markowitz portfolio theory, which was developed in the 1950s, is a form of portfolio optimization based on structured mathematical and statistical principles. At its heart is the concept of diversification. Markowitz argues that by combining different assets in a portfolio, the overall risk can be significantly reduced without significantly reducing the expected return. This is based on the assumption that not all investments are equally correlated; by specifically selecting assets with different risk profiles and expected returns, investors can reduce the volatility of their portfolios. A key element of this theory is the quantification of risk.

L9 Portfolio - CAMP State the difference between CAMP and Markovitz The Capital Asset Pricing Model (CAPM) is a central concept in finance that describes the relationship between the risk of an asset and its expected return. The basic assumption is that investors must be rewarded for taking risk. It introduces the concept of systematic risk, which cannot be eliminated through diversification. The expected return of an asset is determined by the risk-free rate of return plus a risk premium proportional to the asset’s beta - a measure of its volatility relative to the market as a whole. In contrast to Markowitz portfolio theory, which focuses on the diversification of investments to reduce risk, the CAPM focuses on the systematic risk of an individual asset in the context of the market as a whole. While Markowitz theory helps investors to create optimal portfolios by using the standard deviation of returns as a measure of risk, the CAPM only looks at risk that cannot be reduced through diversification. Another difference lies in the application of the two models. The Markowitz theory is often used to optimize the composition of portfolios through diversification, among other things, whereas the CAPM is used to evaluate individual investments. It offers a clear method for determining an appropriate return for the risk taken on an asset. It is therefore very useful for individual investment decisions. To summarize, both CAPM and Markowitz are important tools in the field of finance. They offer different perspectives on risk and return and complement each other in their application.

L10 WACC Replicate the book case of WACC The Weighted Average Cost of Capital (WACC) is an important financial metric that represents the average rate of return a company needs to achieve to satisfy its investors—both equity shareholders and debt holders. It helps determine the minimum return the company should generate on its investments to maintain its value and attract ongoing funding. Key Components of WACC: Cost of Equity (Re): This is the return that equity investors expect for taking on the risk of investing in the company. It is typically estimated using the Capital Asset Pricing Model (CAPM), reflecting the opportunity cost of capital. Cost of Debt (Rd): This represents the interest rate a company pays on its borrowed funds, adjusted for the corporate tax rate because interest payments are tax-deductible. WACC Formula: WACC is calculated as a weighted average, where the weights represent the proportion of equity and debt in the company’s capital structure. The formula is: WACC=EV⋅Re+DV⋅Rd⋅(1−Tc)WACC=VE⋅Re+VD⋅Rd⋅(1−Tc) Where: E: Market value of equity D: Market value of debt V: Total value (equity + debt) Re: Cost of equity Rd: Cost of debt Tc: Corporate tax rate Key Takeaways: Purpose of WACC: WACC serves as a crucial benchmark for evaluating investment opportunities. It represents the minimum return required to satisfy both equity and debt investors. Projects should only be pursued if their expected return exceeds the WACC, ensuring they create value. By factoring in the company’s overall cost of capital, WACC reflects the risk preferences of both equity and debt holders, supporting informed financial decision-making. Factors Affecting WACC: A company’s capital structure plays a major role in determining its WACC, as debt is typically less expensive than equity, but increases financial risk. External factors like interest rates or market risk premiums can influence both the cost of debt and equity. Additionally, the tax rate impacts the after-tax cost of debt, with higher tax rates lowering the effective cost of debt, thus potentially reducing WACC. All these elements collectively shape the company’s total cost of capital and impact its financial strategy. Implications of WACC: A lower WACC means cheaper financing for investments, improving the company’s competitive edge. A higher WACC signals higher financing costs, which could limit growth opportunities. WACC is a vital metric in corporate finance, guiding investment decisions, valuation models, and performance assessments. It provides a comprehensive view of a company’s financing costs and strategic financial planning.

L11 Derivatives L11.1 Assume that you purchased an S&P 500 futures contract at the beginning of the school term, with the first settlement date beyond the end of the school term. Also assume that you sold an S&P 500 futures contract with this same settlement date at the end of the school term. Given that this contract has a value of the futures price times $250, determine the difference between the dollar value of the contract you sold and the dollar amount of the contract that you purchased.

The price of futures contract in the beginning of the school term: $ 5046,5 The price of futures contract in the end of the school term: $5814,25

250*5046.5
[1] 1261625

Futures value of purchase: $1 261 625

Futures value of sale:

250*5814.25
[1] 1453562

Futures value of sale: = $1 453 562,5 We will now calculate the difference:

1261625-1453562.5
[1] -191937.5

= $191 937,5

L11.2 Assume that you invested an initial margin of 20 percent of the amount that you would owe to purchase the S&P 500 index at the settlement date. Measure your return from taking a position in the S&P 500 index futures as follows. Take the difference determined in the previous question (which represents the dollar amount of the gain on the futures position) and divide it by the amount you originally invested (the amount you originally invested is 20 percent of the dollar value of the futures contract that you purchased).

Initial investment:

0.2*1261625 
[1] 252325

= 252 325 Return = difference/initial investment

191937.5/252325
[1] 0.7606757

Return = 0,7606757 = 76%

L11.3 The return that you just derived in the previous question is not annualized. To annualize your return, multiply it by 12/m, where m is the number of months in your school term.

Annualized return

76*12/5
[1] 182.4

= 182,4%

L11.4 Assume that you purchased a call option (representing 100 shares) on the specific stock that you identified for this project. What was your return from purchasing this option? [Your return can be measured as Return = max(market price - K,0)/P

Premt represents the premium at which the same option can be sold at the end of the school term.] If the premium for this option is not quoted at the end of the school term, measure the return as if you had exercised the call option at the end of the school term (assuming that it is feasible to exercise the option at that time). That is, the return is based on purchasing the stock at the option’s strike price and then selling the stock at its market price at the end of the school term.

To calculate the return from purchasing a call option on Apple Inc. (AAPL) shares, we will assume specific values for the strike price and premium paid for the option. Based on the most recent stock price data, we will use the closing price of Apple shares at the end of the school term, which is $237.33. Assumptions: Strike Price (K): Let’s assume a strike price of $230. Premium Paid (P): We will assume we paid a premium of $5 per share Market Price at Expiration: The market price of Apple shares on September 30 2024 is $237.33. Calculating return: Selling the option If you decide to sell the call option at market price: Return=max⁡(Market Price−K,0)−P /P K - strike price P - premium Calculating: max⁡(237.33−230,0)=max⁡(7.33,0)=7.33 Return=(7.33−5)/5=2.33/5=0.466 or 46.6%

Exercising the option: If you decide to exercise the call option: Return=max⁡(Market Price−K,0)/P Calculating: Return

7.33/5
[1] 1.466

=1.466 or 146.6% Summary of returns Return if Sold: 46.6% Return if Exercised: 146.6%

L11.5 Annualize the return on your option by multiplying the return you derived in the previous question by 12/m, where m represents the number of months in your school term. If sold:

46.6* 12/5
[1] 111.84

= 111,84%

If exercised

146.6*12/5
[1] 351.84

= 351,84%

L11.6 Compare the return on your call option to the return that you would have earned if you had simply invested in the stock itself. Notice how the magnitude of the return on the call option is much larger than the magnitude of the return on the stock itself. That is, the gains are larger and the losses are larger when investing in call options on a stock instead of the stock itself. Determining swap payments

L11.7 Assume that, at the beginning of the school term, you engaged in a fixed-for-floating rate swap in which you agreed to pay 6 percent in exchange for the prevailing 26-week T-bill rate that exists at the end of the school term. Assume that your swap agreement specifies the end of the school term as the only time at which a swap will occur and that the notional amount is $10 million. Determine the amount that you owe on the swap, the amount you are owed on the swap, and the difference. Did you gain or lose as a result of the swap? Measuring and explaining exchange rate movements

L11.8 Determine the percentage change in the value of the British pound over the school term. Did the pound appreciate or depreciate against the dollar?

In the beginning of the school term one British Pound costed 1,27 USD In the end of the school term one British Pound costed 1,34 USD The British Pound appreciated

(1.34-1.27)/1.27
[1] 0.05511811

= 0,05512 = 5,512%

L11.9 Determine the percentage change in the value of the Japanese yen over the school term. Did the yen appreciate or depreciate against the dollar? In the beginning of the school term one Japanese Yen costed 0,0064 USD In the end of the school term one Japanese Yen costed 0,0070 USD The Japanese Yen appreciated

(0.0070-0.0064)/0.0064
[1] 0.09375

= 0,09375 = 9,38%

L11.10 Determine the percentage change in the value of the Mexican peso over the school term. Did the peso appreciate or depreciate against the dollar? In the beginning of the school term the Mexican Peso costed 0,59 USD In the end of the school term the Mexican Peso costed 0,51 USD The Mexican Peso depreciated

(0.51-0.59)/0.59
[1] -0.1355932

= -0,13559 = -13,56%

L11.11 Determine the per unit gain or loss if you had purchased British pound futures at the beginning of the term and sold British pound futures at the end of the term.

In the beginning of the school term one British Pound costed 1,27 USD In the end of the school term one British Pound costed 1,34 USD Gain or loss per unit

1.34-1.27
[1] 0.07

= 0,07 USD That represents a gain of $0,07 per British Pound

L11.12 Given that a single futures contract on British pounds represents 62,500 pounds, determine the dollar amount of your gain or loss.

To calculate the dollar amount of gain or loss we must multiplicate the amount of GBP per the gain or loss per British Pound in USD Calculation:

62500*0.07
[1] 4375

= $4 375

L12 Capital requirements L12.1 Calculate the operational, market and credit risk capital requirements for Bank of America and Deutsche Bank as of December 31, last year, which bank has a better capital base?

Bank of America (BoA):

Common Equity Tier 1 (CET1) Capital Ratio: 11.8%

Deutsche Bank:

Common Equity Tier 1 (CET1) Capital Ratio: 13.7% Risk-weighted Assets (RWA): €350 billion Operational Risk RWA: €57 billion Credit Risk and Market Risk RWA: Remaining amounts after operational RWA deduction. Comparison

CET1 Ratios: Deutsche Bank: 13.7% BoA: 11.8%

Better CET1 Ratio: Deutsche Bank, indicating a stronger capital position relative to risk-weighted assets. Breakdown of Risks (Deutsche Bank): Operational Risk: €57 billion. Remaining RWA (likely split between Credit and Market Risk): €293 billion.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpBdXRob3IxIEhlbmRyaWsgU29tbWVyLCBHZXJtYW55CgpBdXRob3IyIEFudG9pbmUgUHV0cmVzemEsIFBvbGFuZAoKRGF0ZSBvZiB0aGUgcHJvamVjdDoKCkRhdGUgb2YgdGhlIHN1Ym1pc3Npb246MDIuMTIuMjAyNAoKRGF0ZSBvZiB0aGUgcmV2aXNpb246CgpEYXRlIG9mIGFjY2VwdGFuY2U6CgoKV2Ugd2lsbCBub3cgc3RhcnQgd2l0aCBkb2luZyB0aGUgYmFzaWMgcGFyYW1ldGVycyBvZiB0aGUgbWFya2V0IHRhYmxlCgpgYGB7cn0KbGlicmFyeShxdWFudG1vZCkKCiMgRGVmaW5lIHRoZSBkYXRlIHJhbmdlCnN0YXJ0X2RhdGUgPC0gIjIwMjQtMDUtMDEiCmVuZF9kYXRlIDwtICIyMDI0LTA5LTMwIgoKIyBDcmVhdGUgYW4gZW1wdHkgZGF0YSBmcmFtZQp0YWJsZV9kYXRhIDwtIGRhdGEuZnJhbWUoCiAgRGVzY3JpcHRpb24gPSBjaGFyYWN0ZXIoKSwKICBCZWdpbm5pbmdfb2ZfVGVybSA9IGNoYXJhY3RlcigpLAogIEVuZF9vZl9UZXJtID0gY2hhcmFjdGVyKCkKKQoKIyBGdW5jdGlvbiB0byBhZGQgcm93cyB0byB0aGUgdGFibGUKYWRkX3JvdyA8LSBmdW5jdGlvbihjYXRlZ29yeSwgZGF0YSkgewogIHRhYmxlX2RhdGEgPDwtIHJiaW5kKHRhYmxlX2RhdGEsIGRhdGEuZnJhbWUoCiAgICBEZXNjcmlwdGlvbiA9IGNhdGVnb3J5LAogICAgQm9UID0gYXMuY2hhcmFjdGVyKGZvcm1hdChyb3VuZChkYXRhWzFdLCAyKSwgbnNtYWxsPTIpKSwKICAgIEVvVCA9IGFzLmNoYXJhY3Rlcihmb3JtYXQocm91bmQoZGF0YVsyXSwgMiksIG5zbWFsbD0yKSkKICApKQp9CgojIEdldCBTJlAgNTAwIGluZGV4IGxldmVsCmdldFN5bWJvbHMoIkFBUEwiLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCnNwNTAwX3N0YXJ0IDwtIEFBUExbMSwgNF0Kc3A1MDBfZW5kIDwtIEFBUExbbnJvdyhBQVBMKSwgNF0KYWRkX3JvdygiUyZQIDUwMCAoc3RvY2spIGluZGV4IGxldmVsOiIsIGMoc3A1MDBfc3RhcnQsIHNwNTAwX2VuZCkpCgojZ2V0c3ltYm9scyBOYXNkYXEgY29tcG9zaXRlIGluZGV4IGxldmVsCmdldFN5bWJvbHMoIl5JWElDIiwgc3JjID0gInlhaG9vIiwgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUpCnN0YXJ0X2luZGV4X2xldmVsIDwtIElYSUNbMSwgNF0KZW5kX2luZGV4X2xldmVsIDwtIElYSUNbbnJvdyhJWElDKSwgNF0KYWRkX3JvdygiTmFzZGFxIENvbXBvc2l0ZSAoc3RvY2spIGluZGV4IGxldmVsOiIsIGMoc3RhcnRfaW5kZXhfbGV2ZWwsZW5kX2luZGV4X2xldmVsICkpCmdldFN5bWJvbHMoIkRQUklNRSIsIHNyYyA9ICJGUkVEIiwgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUpCgojIEV4dHJhY3QgdGhlIGJlZ2lubmluZyBhbmQgZW5kIHByaW1lIHJhdGVzCnByaW1lX3JhdGVfc3RhcnQgPC0gRFBSSU1FWzEsIDFdCnByaW1lX3JhdGVfZW5kIDwtIERQUklNRVtucm93KERQUklNRSksIDFdCmFkZF9yb3coIlByaW1lIHJhdGU6IiwgYyhwcmltZV9yYXRlX3N0YXJ0LCBwcmltZV9yYXRlX2VuZCkpCmdldFN5bWJvbHMoIkZFREZVTkRTIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgRXh0cmFjdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgZmVkZXJhbCBmdW5kcyByYXRlcwpmZWRfZnVuZHNfc3RhcnQgPC0gRkVERlVORFNbMSwgMV0KZmVkX2Z1bmRzX2VuZCA8LSBGRURGVU5EU1tucm93KEZFREZVTkRTKSwgMV0KYWRkX3JvdygiRmVkZXJhbCBmdW5kcyByYXRlOiIsIGMoZmVkX2Z1bmRzX3N0YXJ0LCBmZWRfZnVuZHNfZW5kKSkKCmdldFN5bWJvbHMoIkRUQjMiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQoKYWRkX3JvdygiQ29tbWVyY2lhbCBwYXBlciByYXRlICg5MCBkYXlzKToiLCBjKE5BLCBOQSkpCgphZGRfcm93KCJDZXJ0aWZpY2F0ZSBvZiBkZXBvc2l0IHJhdGUgKDMtbW9udGgpOiIsIGMoTkEsIE5BKSkKCiMgRXh0cmFjdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgcmF0ZXMKdGJpbGxfcmF0ZV9zdGFydCA8LSBEVEIzWzEsIDFdCnRiaWxsX3JhdGVfZW5kIDwtIERUQjNbbnJvdyhEVEIzKSwgMV0KYWRkX3JvdygidHJlYXN1cnkgYmlsbCByYXRlICgxMyB3ZWVrcyk6IiwgYyh0YmlsbF9yYXRlX3N0YXJ0LCB0YmlsbF9yYXRlX2VuZCkpCgpnZXRTeW1ib2xzKCJEVEI2Iiwgc3JjID0gIkZSRUQiLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgRXh0cmFjdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgcmF0ZXMKdGJpbGw2X3JhdGVfc3RhcnQgPC0gRFRCNlsxLCAxXQp0YmlsbDZfcmF0ZV9lbmQgPC0gRFRCNltucm93KERUQjYpLCAxXQphZGRfcm93KCJUcmVhc3VyeSBiaWxsIHJhdGUgKDI2IHdlZWtzKToiLCBjKHRiaWxsNl9yYXRlX3N0YXJ0LCB0YmlsbDZfcmF0ZV9lbmQpKQoKCiMgR2V0IHRoZSAxMC15ZWFyIFRyZWFzdXJ5IEJvbmQgWWllbGQKZ2V0U3ltYm9scygiREdTMTAiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQoKIyBFeHRyYWN0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCByYXRlcwpsb25nX3Rlcm1feWllbGRfc3RhcnQgPC0gREdTMTBbMSwgMV0KbG9uZ190ZXJtX3lpZWxkX2VuZCA8LSBER1MxMFtucm93KERHUzEwKSwgMV0KYWRkX3JvdygiVHJlYXN1cnkgbG9uZy10ZXJtIGJvbmQgeWllbGQ6IiwgYyhsb25nX3Rlcm1feWllbGRfc3RhcnQsIGxvbmdfdGVybV95aWVsZF9lbmQpKQoKI3dlIHdpbGwgdXNlIGEgcHJveHkgZm9yIGNvcnBvcmF0ZSAobWFzdGVyKSBib25kIHlpZWxkLCB0aGUgTW9vZHkncyBTZWFzb25lZCBBYWEgQ29ycG9yYXRlIEJvbmQgWWVpbGQKCiMgR2V0IHRoZSBNb29keSdzIFNlYXNvbmVkIEFhYSBDb3Jwb3JhdGUgQm9uZCBZaWVsZApnZXRTeW1ib2xzKCJBQUEiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQoKIyBFeHRyYWN0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCByYXRlcwpjb3JwX2JvbmRfeWllbGRfc3RhcnQgPC0gQUFBWzEsIDFdCmNvcnBfYm9uZF95aWVsZF9lbmQgPC0gQUFBW25yb3coQUFBKSwgMV0KYWRkX3JvdygiQ29ycG9yYXRlIChNYXN0ZXIpIGJvbmQgeWllbGQ6IiwgYyhjb3JwX2JvbmRfeWllbGRfc3RhcnQsIGNvcnBfYm9uZF95aWVsZF9lbmQpKQoKYWRkX3JvdygiSGlnaC15aWVsZCBjb3Jwb3JhdGUgYm9uZCB5aWVsZDoiLCBjKE5BLCBOQSkpCgphZGRfcm93KCJUYXgtZXhlbXB0ICg34oCTMTIteWVhcikgYm9uZCB5aWVsZDoiLCBjKE5BLCBOQSkpCgpwcmludCh0YWJsZV9kYXRhKQpgYGAKCgpGaXJzdCBpIHdpbGwgY29tcGFyZSB0aGUgTG9uZG9uIFN0b2NrIEV4Y2hhbmdlIHdpdGggdGhlIE5BU0RBUQoKYGBge3J9CmxpYnJhcnkocXVhbnRtb2QpCmBgYApgYGB7cn0KZ2V0U3ltYm9scygiTkRBUSIsIHNyYyA9ICJ5YWhvbyIpCmBgYAoKCmBgYHtyfQpnZXRTeW1ib2xzKCJeRlRTRSIsIHNyYyA9ICJ5YWhvbyIpCmBgYApgYGB7cn0KRlRTRTwtIG5hLmFwcHJveChGVFNFKQpgYGAKYGBge3J9Ck5EQVEgPC0gc3Vic2V0KE5EQVEsIHN0YXJ0ID0gIjIwMjQtMDEtMDUiLCBlbmQgPSAiMjAyNC0zMC0wOSIpCkZUU0UgPC0gc3Vic2V0KEZUU0UsIHN0YXJ0ID0gIjIwMDgtMDEtMDUiLCBlbmQgPSAiMjAyNC0zMC0wOSIpCmBgYApgYGB7cn0KbmFzZGFxX3N0YXRzIDwtIGMoCiAgTWVhbiA9IG1lYW4oTkRBUSROREFRLkNsb3NlLCBuYS5ybT1UUlVFKSwKICBNZWRpYW4gPSBtZWRpYW4oTkRBUSROREFRLkNsb3NlLCBuYS5ybT1UUlVFKSwKU3REZXYgPSBzZChOREFRJE5EQVEuQ2xvc2UsIG5hLnJtPSBUUlVFKSkKYGBgCgpgYGB7cn0KbG9uZF9zdGF0cyA8LSBjKAogIE1lYW4gPSBtZWFuKEZUU0UkRlRTRS5DbG9zZSksCiAgTWVkaWFuID0gbWVkaWFuKEZUU0UkRlRTRS5DbG9zZSksCiAgU3REZXYgPSBzZChGVFNFJEZUU0UuQ2xvc2UpKQpgYGAKYGBge3J9CmFsaWduZWRfZGF0YSA8LSBtZXJnZShOREFRLCBGVFNFKQoKYGBgCgpgYGB7cn0KY2xlYW5lZF9kYXRhIDwtIG5hLm9taXQoYWxpZ25lZF9kYXRhKQpgYGAKYGBge3J9CmNvcnJlbGF0aW9uIDwtIGNvcihjbGVhbmVkX2RhdGFbLCAxXSwgY2xlYW5lZF9kYXRhWywgN10pCmBgYApgYGB7cn0KcHJpbnQoY29ycmVsYXRpb24pCmBgYApgYGB7cn0Kc3RhdHNfY29tcGFyaXNvbiA8LSByYmluZChuYXNkYXFfc3RhdHMsIGxvbmRfc3RhdHMpCmNvbG5hbWVzKHN0YXRzX2NvbXBhcmlzb24pIDwtIGMoIk1lYW4iLCAiTWVkaWFuIiwgIlN0YW5kYXJkIERldmlhdGlvbiIgKQoKcm91bmQoc3RhdHNfY29tcGFyaXNvbiwyKQpgYGAKYGBge3J9CnByaW50KHJvdW5kKGNvcnJlbGF0aW9uLDIpKQpgYGAKCkkgd2lsbCBub3cgY29tcGFyZSB0aGUgTG9uZG9uIFN0b2NrIEV4Y2hhbmdlIGluZGV4IGFuZCB0aGUgR2VybWFuIERBWCBpbmRleAoKYGBge3J9CiMgRG93bmxvYWQgaGlzdG9yaWNhbCBkYXRhIGZvciBOQVNEQVEgYW5kIFRlY2hEQVgKZ2V0U3ltYm9scygiTkRBUSIsIHNyYyA9ICJ5YWhvbyIpCmdldFN5bWJvbHMoIkRBWCIsIHNyYyA9ICJ5YWhvbyIpICAjIFRlY2hEQVggaXMgYSBjb21wb25lbnQgb2YgdGhlIERBWCBpbmRleAogCiMgRmlsbCBpbiBtaXNzaW5nIHZhbHVlcyB3aXRoIGFwcHJveGltYXRpb25zCkRBWCA8LSBuYS5hcHByb3goREFYKQogCiMgVHJpbSBkYXRhIHRvIGEgc3BlY2lmaWMgcGVyaW9kCk5EQVEgPC0gc3Vic2V0KE5EQVEsIHN0YXJ0ID0gIjIwMjQtMDUtMDEiLCBlbmQgPSAiMjAyNC0wOS0zMCIpCkRBWCA8LSBzdWJzZXQoREFYLCBzdGFydCA9ICIyMDI0LTA1LTAxIiwgZW5kID0gIjIwMjQtMDktMzAiKQogCiMgQ2FsY3VsYXRlIGJhc2ljIHN0YXRpc3RpY3MKbmFzZGFxX3N0YXRzIDwtIGMoCiAgTWVhbiA9IG1lYW4oTkRBUSROREFRLkNsb3NlLCBuYS5ybSA9IFRSVUUpLAogIE1lZGlhbiA9IG1lZGlhbihOREFRJE5EQVEuQ2xvc2UsIG5hLnJtID0gVFJVRSksCiAgU3REZXYgPSBzZChOREFRJE5EQVEuQ2xvc2UsIG5hLnJtID0gVFJVRSkKKQogCmRheF9zdGF0cyA8LSBjKAogIE1lYW4gPSBtZWFuKERBWCREQVguQ2xvc2UpLAogIE1lZGlhbiA9IG1lZGlhbihEQVgkREFYLkNsb3NlKSwKICBTdERldiA9IHNkKERBWCREQVguQ2xvc2UpCikKIAojIENvcnJlbGF0aW9uCmFsaWduZWRfZGF0YSA8LSBtZXJnZShOREFRLCBEQVgpCmNsZWFuZWRfZGF0YSA8LSBuYS5vbWl0KGFsaWduZWRfZGF0YSkKY29ycmVsYXRpb24gPC0gY29yKGNsZWFuZWRfZGF0YVssIDFdLCBjbGVhbmVkX2RhdGFbLCAyXSkKIAojIFByaW50IHN0YXRpc3RpY3MgYW5kIGNvcnJlbGF0aW9uCnN0YXRzX2NvbXBhcmlzb24gPC0gcmJpbmQobmFzZGFxX3N0YXRzLCBkYXhfc3RhdHMpCmNvbG5hbWVzKHN0YXRzX2NvbXBhcmlzb24pIDwtIGMoIk1lYW4iLCAiTWVkaWFuIiwgIlN0YW5kYXJkIERldmlhdGlvbiIpCnJvdW5kKHN0YXRzX2NvbXBhcmlzb24sIDIpCnByaW50KHJvdW5kKGNvcnJlbGF0aW9uLCAyKSkKIAojIFZpc3VhbGl6ZSB0aGUgY29tcGFyaXNvbgpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdCgpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5EQVEsIGFlcyh4ID0gaW5kZXgoTkRBUSksIHkgPSBOREFRLkNsb3NlKSwgY29sb3IgPSAiYmx1ZSIpICsKICBnZW9tX2xpbmUoZGF0YSA9IERBWCwgYWVzKHggPSBpbmRleChEQVgpLCB5ID0gREFYLkNsb3NlKSwgY29sb3IgPSAicmVkIikgKwogIGxhYnModGl0bGUgPSAiTkFTREFRIHZzLiBEQVggKFRlY2hEQVgpIiwgeCA9ICJEYXRlIiwgeSA9ICJJbmRleCBWYWx1ZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIgPSAiTkFTREFRIiwgInJlZCIgPSAiREFYIikpCmBgYAoKCkwuMwpgYGB7cn0KbGlicmFyeShxdWFudG1vZCkKCiMgRGVmaW5lIHRoZSBkYXRlIHJhbmdlCnN0YXJ0X2RhdGUgPC0gYXMuRGF0ZSgiMjAyNC0wNS0wMSIpCmVuZF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMDktMzAiKQoKIyBHZXQgMTMtd2VlayBUcmVhc3VyeSBCaWxsIHJhdGVzCmdldFN5bWJvbHMoIl5JUlgiLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgRXh0cmFjdCBpbml0aWFsIGFuZCBmaW5hbCByYXRlcwpzdGFydF9yYXRlIDwtIElSWFsxLDFdCmBgYAoKCmBgYHtyfQplbmRfcmF0ZSA8LSBJUlhbbnJvdyhJUlgpLDFdCgojIENhbGN1bGF0ZSBjaGFuZ2UgYW5kIHBlcmNlbnRhZ2UgY2hhbmdlCnJhdGVfY2hhbmdlIDwtIGVuZF9yYXRlIC0gc3RhcnRfcmF0ZQpwZXJjZW50YWdlX2NoYW5nZSA8LSAoZW5kX3JhdGUgLSBzdGFydF9yYXRlKSAvIHN0YXJ0X3JhdGUgKiAxMDAKCiMgUHJpbnQgdGhlIHJlc3VsdHMKY2F0KCIxMy13ZWVrIFRyZWFzdXJ5IEJpbGwgUmF0ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXJtOiIsIHN0YXJ0X3JhdGUsICJcbiIpCmNhdCgiMTMtd2VlayBUcmVhc3VyeSBCaWxsIFJhdGUgYXQgdGhlIGVuZCBvZiB0aGUgdGVybToiLCBlbmRfcmF0ZSwgIlxuIikKY2F0KCJDaGFuZ2UgaW4gcmF0ZToiLCByYXRlX2NoYW5nZSwgIlxuIikKY2F0KCJQZXJjZW50YWdlIGNoYW5nZToiLCBwZXJjZW50YWdlX2NoYW5nZSwgIiUiKQpgYGAKCgpgYGB7cn0KV2h5IGRpZCB0aGUgaW50ZXJlc3QgcmF0ZSBjaGFuZ2U/CgpNb25ldGFyeSBwb2xpY3kgb2YgdGhlIEZlZGVyYWwgUmVzZXJ2ZQpJbmZsYXRpb24gZXhwZWN0YXRpb25zCkRlbWFuZCBmb3Igc2FmZSBhc3NldHMKTGlxdWlkaXR5IGluIHRoZSBmaW5hbmNpYWwgc3lzdGVtCkV4cGVjdGF0aW9ucyBmb3IgdGhlIGZ1dHVyZSBpbnRlcmVzdCByYXRlcwpTdXBwbHkgYW5kIGRlbWFuZApJbnRlcm5hdGlvbmFsIGNhcGl0YWwgZmxvd3MKYGBgCgpMLjQKYGBge3J9CmxpYnJhcnkocXVhbnRtb2QpCmxpYnJhcnkoZ2dwbG90MikKCiMgU3BlY2lmeSB0aGUgZGF0ZSByYW5nZQpzdGFydF9kYXRlIDwtICIyMDE3LTEwLTIyIgplbmRfZGF0ZSA8LSAiMjAxNy0xMC0zMCIKCiMgR2V0IHRoZSBzdG9jayBkYXRhIGZvciBDb2NhLUNvbGEKZ2V0U3ltYm9scygiS08iLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIERhdGUgYW5kIENsb3NpbmcgUHJpY2UKS09fZGYgPC0gZGF0YS5mcmFtZShEYXRlID0gaW5kZXgoS08pLCBQcmljZSA9IENsKEtPKSkKCiMgQ3JlYXRlIHRoZSBsaW5lIHBsb3QKZ2dwbG90KEtPX2RmLCBhZXMoeCA9IERhdGUsIHkgPSBDbChLTykpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJTdG9jayBQcmljZSIsIHRpdGxlID0gIkNvY2EtQ29sYSBTdG9jayBQcmljZSAoMjItMzAgT2N0IDIwMTcpIikgKwogIHRoZW1lX2NsYXNzaWMoKSAgIyBPcHRpb25hbDogRm9yIGEgY2xlYW5lciBwbG90CmBgYAoKCmBgYHtyfQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KGdncGxvdDIpCgojIFNwZWNpZnkgdGhlIGRhdGUgcmFuZ2UgZm9yIE9jdG9iZXIgMjAxNwpzdGFydF9kYXRlIDwtICIyMDE3LTEwLTE1IgplbmRfZGF0ZSA8LSAiMjAxNy0xMS0xNSIKCiMgR2V0IHRoZSBzdG9jayBkYXRhIGZvciBDb2NhLUNvbGEKZ2V0U3ltYm9scygiS08iLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIERhdGUgYW5kIENsb3NpbmcgUHJpY2UKS09fZGYgPC0gZGF0YS5mcmFtZShEYXRlID0gaW5kZXgoS08pLCBQcmljZSA9IENsKEtPKSkKCiMgQ3JlYXRlIHRoZSBsaW5lIHBsb3QKZ2dwbG90KEtPX2RmLCBhZXMoeCA9IERhdGUsIHkgPSBDbChLTykpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJTdG9jayBQcmljZSIsIHRpdGxlID0gIkNvY2EtQ29sYSBTdG9jayBQcmljZSAoT2N0b2JlciAyMDE3KSIpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCmBgYHtyfQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KGdncGxvdDIpCgojIFNwZWNpZnkgdGhlIGRhdGUgcmFuZ2UgZm9yIE9jdG9iZXIgMjAxNwpzdGFydF9kYXRlIDwtICIyMDE3LTA0LTE1IgplbmRfZGF0ZSA8LSAiMjAxNy0xMS0xNSIKCiMgR2V0IHRoZSBzdG9jayBkYXRhIGZvciBDb2NhLUNvbGEKZ2V0U3ltYm9scygiS08iLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIERhdGUgYW5kIENsb3NpbmcgUHJpY2UKS09fZGYgPC0gZGF0YS5mcmFtZShEYXRlID0gaW5kZXgoS08pLCBQcmljZSA9IENsKEtPKSkKCiMgQ3JlYXRlIHRoZSBsaW5lIHBsb3QKZ2dwbG90KEtPX2RmLCBhZXMoeCA9IERhdGUsIHkgPSBDbChLTykpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJTdG9jayBQcmljZSIsIHRpdGxlID0gIkNvY2EtQ29sYSBTdG9jayBQcmljZSAoT2N0b2JlciAyMDE3KSIpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCk9uIE9jdG9iZXIgMjYgMjAxNyBDb2NhLUNvbGEgcmVsZWFzZWQgaXRzIHRoaXJkLXF1YXJ0ZXIgZWFybmluZ3MgZm9yIDIwMTcuIEFzIHdlIGFuYWxpemUgdGhlIHN0b2NrIHByaWNlIG9mIGNvY2EgY29sYSBjb21wYW55IGluIHRpbWUgd2Ugb2JzZXJ2ZSB0aGF0IGluIHRoZSBwZXJpb2Qgb2YgYSBtb250aCBiZWZvcmUgdGhlIDI2dGggb2Ygb2N0b2JlciB0aGVyZSBpcyBhIGRvd250cmVuZCBidXQgb24gdGhlIDI2dGggb2Ygb2N0b2JlciB0aGUgcHJpY2UgaW5jcmVhc2VkIGZvciBvbmUgZGF5IGFuZCB0aGVuIGNvbnRpbnVlZCBkcm9wcGluZyBpbnRpbGwgdGhlIGJlZ2luaW5nIG9mIE5vdmVtYmVyIHdoZXJlIGl0IHN0YXJ0ZWQgZ29pbmcgdXAgYWdhaW4uIFRoZSBleHBsYW5hdGlvbiBjb3VsZCBiZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBjb21taW5nIGZyb20gdGhlIHF1YXJ0ZXJseSByZXBvcnQgaW5mbHVlbmNlZCBhIGJldHRlciBpbmZvcm1lZCBwYXJ0IG9mIHRoZSBtYXJrZXQgaW1taWRpYXRlbHkgb24gdGhlIDI2dGggb2Ygb2N0b2JlciBhbmQgdGhlIHJlc3Qgb2YgdGhlIG1hcmtldCBsYXRlciBpbiB0aGUgYmVnaW5pbmcgb2YgTm92ZW1iZXIuCgpMLjUKCkZvciBvdXIgdGFzayB3ZSBjaG9zZSB0aGUgQmFuayBvZiBBbWVyaWNhCgpMNS4xIElkZW50aWZ5IHRoZSB0eXBlcyBvZiBkZXBvc2l0cyB0aGF0IHRoZSBjb21tZXJjaWFsIGJhbmsgdXNlcyB0byBvYnRhaW4gbW9zdCBvZiBpdHMgZnVuZHMuCkJhbmsgb2YgQW1lcmljYSByYWlzZXMgdGhlIG1ham9yaXR5IG9mIGl0cyBmdW5kcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgZGVwb3NpdHM6Ci0gRGVtYW5kIGRlcG9zaXRzOiBjaGVja2luZyBhY2NvdW50cyB0aGF0IGFsbG93IGN1c3RvbWVycyB0byBhY2Nlc3MgdGhlaXIgbW9uZXkgYXQgYW55IHRpbWUuCi0gVGltZSBkZXBvc2l0czogVGltZSBkZXBvc2l0IGFjY291bnRzIGluIHdoaWNoIGN1c3RvbWVycyBpbnZlc3QgdGhlaXIgbW9uZXkgZm9yIGEgc3BlY2lmaWMgcGVyaW9kIG9mIHRpbWUuCi0gU2F2aW5ncyBkZXBvc2l0czogU2F2aW5ncyBhY2NvdW50cyB0aGF0IGFyZSBpbnRlbmRlZCBmb3Igc2F2aW5nIGFuZCBvZmZlciBoaWdoZXIgaW50ZXJlc3QgcmF0ZXMuCiAKTDUuMiBJZGVudGlmeSB0aGUgbWFpbiB1c2VzIG9mIGZ1bmRzIGJ5IHRoZSBiYW5rLiBjLiBTdW1tYXJpemUgYW55IHN0YXRlbWVudHMgbWFkZSBieSB0aGUgY29tbWVyY2lhbCBiYW5rIGluIGl0cyBhbm51YWwgcmVwb3J0IGFib3V0IGhvdyByZWNlbnQgb3IgcG90ZW50aWFsIHJlZ3VsYXRpb25zIHdpbGwgYWZmZWN0IGl0cyBwZXJmb3JtYW5jZS4KVGhlIHByaW1hcnkgdXNlcyBvZiBCYW5rIG9mIEFtZXJpY2EncyBmdW5kcyBpbmNsdWRlOgotIExlbmRpbmc6IHByb3ZpZGluZyBsb2FucyB0byBpbmRpdmlkdWFscyBhbmQgYnVzaW5lc3Nlcy4KLSBJbnZlc3RtZW50IGJhbmtpbmc6IHByb3ZpZGluZyBjb3Jwb3JhdGUgZmluYW5jZSBhbmQgY2FwaXRhbCBtYXJrZXRzIHRyYW5zYWN0aW9uIHNlcnZpY2VzLgotIEFzc2V0IG1hbmFnZW1lbnQ6IG1hbmFnaW5nIGFzc2V0cyBmb3IgcHJpdmF0ZSBjbGllbnRzIGFuZCBpbnN0aXR1dGlvbnMuCiAKSW1wYWN0IG9mIHJlZ3VsYXRpb25zCkluIGl0cyBhbm51YWwgcmVwb3J0LCBCYW5rIG9mIEFtZXJpY2EgZW1waGFzaXNlcyB0aGF0IGN1cnJlbnQgYW5kIHBvdGVudGlhbCByZWd1bGF0b3J5IHJlcXVpcmVtZW50cyBjYW4gYWZmZWN0IGl0cyBwZXJmb3JtYW5jZS4gSW4gcGFydGljdWxhciwgcmVmZXJlbmNlIGlzIG1hZGUgdG8gY2FwaXRhbCByZXF1aXJlbWVudHMgYW5kIGxpcXVpZGl0eSByZXF1aXJlbWVudHMsIHdoaWNoIGNvdWxkIHJlc3RyaWN0IHRoZSBhYmlsaXR5IHRvIGdyYW50IGxvYW5zLgoKTDUuMyBEb2VzIGl0IGFwcGVhciB0aGF0IHRoZSBiYW5rIGlzIGF0dGVtcHRpbmcgdG8gZW50ZXIgdGhlIHNlY3VyaXRpZXMgaW5kdXN0cnkgYnkgb2ZmZXJpbmcgc2VjdXJpdGllcyBzZXJ2aWNlcz8gSWYgc28sIGV4cGxhaW4gaG93LgpZZXMsIGl0IGFwcGVhcnMgdGhhdCBCYW5rIG9mIEFtZXJpY2EgaXMgYXR0ZW1wdGluZyB0byBlbnRlciB0aGUgc2VjdXJpdGllcyBpbmR1c3RyeS4gVGhpcyBpcyBiZWluZyBkb25lIGJ5OgotIE9mZmVyaW5nIHNlY3VyaXRpZXMgc2VydmljZXM6IFRoZSBiYW5rIG9mZmVycyB0cmFkaW5nIHNlcnZpY2VzIGZvciBzdG9ja3MgYW5kIGJvbmRzIGFuZCBoYXMgYSBzdHJvbmcgaW52ZXN0bWVudCBiYW5raW5nIHNlZ21lbnQgdGhhdCBmb2N1c2VzIG9uIGNhcGl0YWwgbWFya2V0IHRyYW5zYWN0aW9ucy4KIApMNS40IERvZXMgaXQgYXBwZWFyIHRoYXQgdGhlIGJhbmsgaXMgYXR0ZW1wdGluZyB0byBlbnRlciB0aGUgaW5zdXJhbmNlIGluZHVzdHJ5IGJ5IG9mZmVyaW5nIGluc3VyYW5jZSBzZXJ2aWNlcz8gSWYgc28sIGV4cGxhaW4gaG93LgpZZXMsIHRoZXJlIGFyZSBzaWducyB0aGF0IEJhbmsgb2YgQW1lcmljYSBpcyBlbnRlcmluZyB0aGUgaW5zdXJhbmNlIHNlY3Rvci4gVGhpcyBpcyBldmlkZW5jZWQgYnk6Ci0gT2ZmZXJpbmcgaW5zdXJhbmNlIHByb2R1Y3RzOiBUaGUgYmFuayBvZmZlcnMgdmFyaW91cyBpbnN1cmFuY2Ugc2VydmljZXMgdG8gcHJvdmlkZSBjb21wcmVoZW5zaXZlIGZpbmFuY2lhbCBzb2x1dGlvbnMgdG8gaXRzIGN1c3RvbWVycy4KCkw1LjYKVG8gZGV0ZXJtaW5lIEJhbmsgb2YgQW1lcmljYSdzIGludGVyZXN0IGluY29tZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgaXRzIHRvdGFsIGFzc2V0cywgd2UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGRhdGEgZnJvbSB0aGVpciBmaW5hbmNpYWwgc3RhdGVtZW50czoKCgpMNS43CiAgICBJbnRlcmVzdCBleHBlbnNlczogRm9yIHRoZSB5ZWFyIGVuZGluZyBEZWNlbWJlciAzMSwgMjAyMywgQmFuayBvZiBBbWVyaWNhIHJlcG9ydGVkIGludGVyZXN0IGluY29tZSBvZiAkOTgsNTgxIG1pbGxpb24gCiAgICBUb3RhbCBBc3NldHM6IEFzIG9mIERlY2VtYmVyIDMxLCAyMDIzLCB0aGUgdG90YWwgYXNzZXRzIGZvciBCYW5rIG9mIEFtZXJpY2Egd2VyZSByZXBvcnRlZCBhcyAkMywxODAsMTUxIG1pbGxpb24KCldlIGNhbiBub3cgZGl2aWRlIHRoZSB0b3RhbCBpbnRlcmVzdCBpbmNvbWUgYnkgdGhlIHRvdGFsIGFzc2V0cyB0byBnZXQgYSBwZXJjZW50YWdlIHJhdGU6CgoKYGBge3J9Cjk4NTgxLzMxODAxNTEgCmBgYAoKVGhlIGJhbmsncyBpbnRlcmVzdCBleHBlbnNlcyB3ZXJlIDMsMTAlIG9mIHRoZSB0b3RhbCBhc3NldHMgb2YgdGhlIEJhbmsgb2YgQW1lcmljYQoKCkw1LjggRGV0ZXJtaW5lIHRoZSBiYW5r4oCZcyBuZXQgaW50ZXJlc3QgbWFyZ2luLgpOSU0gPSAyLjA3JSAoUC4gODQgLyBQLiA4NikgCgoKTDUuOQoKVGhlIG5vbmludGVyZXN0IGluY29tZTogRm9yIHRoZSB5ZWFyIGVuZGluZyBEZWNlbWJlciAzMSwgMjAyMywgQmFuayBvZiBBbWVyaWNhIHJlcG9ydGVkIGEgbm9uaW50ZXJlc3QgaW5jb21lIG9mICQ0MSw2NTAgbWlsbGlvbgpOb3cgd2Ugd2lsbCBkaXZpZGUgdGhpcyBieSB0aGUgdG90YWwgYXNzZXRzIHRvIGdldCBhIHBlcmNlbnRhZ2UgcmF0ZQoKYGBge3J9CjQxNjUwLzMxODAxNTEgCmBgYAoKVGhlIGJhbmsncyBub25pbnRlcmVzdCBpbmNvbWUgcmF0ZSB3YXMgMSwzMSUgb2YgdGhlIHRvdGFsIGFzc2V0cwoKTm9uIEludGVyZXN0IGV4cGVuc2VzIHBlcmNlbnRhZ2UgPSAyLjA5JSAoUC44MSkKCkw1LjEwCgpGb3IgdGhlIHllYXIgZW5kaW5nIERlY2VtYmVyIDMxLCAyMDIzLCBCYW5rIG9mIEFtZXJpY2EgcmVwb3J0ZWQgYSBsb2FuIGxvc3MgcmVzZXJ2ZSBvZiAkMTMsMjg3IG1pbGxpb24KV2Ugd2lsbCBub3cgZGl2aWRlIGl0IGJ5IHRoZSBhbW91bnQgb2YgdG90YWwgYXNzZXRzIHRvIGdldCBhIHBlcmNlbnRhZ2UgcmF0ZQpgYGB7cn0KMTMyODcvMzE4MDE1MQpgYGAKClRoZSBsb2FucyBhbmQgbG9zcyByZXNlcnZlIHJhdGUgd2FzIDAsNDIlIG9mIHRoZSB0b3RhbCBhc3NldHMKCgpMNS4xMQpUbyBmaW5kIG91dCBhYm91dCB0aGUgcmV0dXJuIG9uIGFzc2V0cyB3ZSBzaG91bGQgZmluZCBvdXQgYWJvdXQgdGhlIHRvdGFsIGluY29tZSBvZiB0aGUgYmFuayBhbmQgdGhlbiBkaXZpZGUgaXQgYnkgdGhlIHZhbHVlIG9mIHRvdGFsIGFzc2V0cy4KRm9yIHRoZSB5ZWFyIGVuZGluZyBEZWNlbWJlciAzMSwgMjAyMywgQmFuayBvZiBBbWVyaWNhIHJlcG9ydGVkIGEgbmV0IGluY29tZSBvZiAkMjYsNTE1IG1pbGxpb24KV2Ugd2lsbCBub3cgZGl2aWRlIHRoaXMgdmFsdWUgYnkgdGhlIHRvdGFsIGFzc2V0cyB0byBnZXQgYSBwZXJjZW50YWdlIHJhdGUKYGBge3J9CjI2NTE1LzMxODAxNTEKYGBgCgpUaGUgQmFuayBvZiBBbWVyaWNhJ3MgcmV0dXJuIG9uIGFzc2V0cyB3YXMgMCw4MyUgb2YgdGhlIHRvdGFsIGFzc2V0cwoKCkw1LjEyClRvIGZpbmQgb3V0IGFib3V0IHRoZSByZXR1cm4gb24gYXNzZXRzIHdlIHNob3VsZCBmaW5kIG91dCBhYm91dCB0aGUgdG90YWwgaW5jb21lIG9mIHRoZSBiYW5rIGFuZCB0aGVuIGRpdmlkZSBpdCBieSB0aGUgdmFsdWUgb2YgdG90YWwgc2hhcmVob2xkZXJzIGVxdWl0eS4KQXMgd2UgYWxyZWFkeSBoYXZlIHRoZSB2YWx1ZSBvZiB0aGUgbmV0IGluY29tZSB3ZSB3aWxsIG5vdyBmaW5kIHRoZSBkYXRhIGFib3V0IHRoZSB0b3RhbCBzaGFyZWhvbGRlcnMgZXF1aXR5LiBGb3IgdGhlIHllYXIgZW5kaW5nIERlY2VtYmVyIDMxLCAyMDIzLCBCYW5rIG9mIEFtZXJpY2EgcmVwb3J0ZWQgYSB0b3RhbCBzaGFyZWhvbGRlcnMgZXF1aXR5IG9mICQyOTEsNjQ2IG1pbGxpb24uCldlIHdpbGwgbm93IGRpdmlkZSB0aGUgbmV0IGluY29tZSBieSB0aGUgdG90YWwgc2hhcmVob2xkZXJzIGVxdWl0eS4KYGBge3J9CjI2NTE1LzI5MTY0NgpgYGAKVGhlIEJhbmsgb2YgQW1lcmljYSdzIHJldHVybiBvbiBlcXVpdHkgcmF0ZSB3YXMgOSwwOSUuCgpMNS4xMwoKSW5jb21lIFN0YXRlbWVudCBJdGVtcyBBZmZlY3RlZAoKCjEuIG5ldCBpbnRlcmVzdCBpbmNvbWUgKGludGVyZXN0IGluY29tZSk6CiAgIC0gMjAyMzogJDU2LDkzMSBtaWxsaW9uCiAgIC0gSW1wYWN0OiBBbiBpbmNyZWFzZSBpbiBpbnRlcmVzdCByYXRlcyB3aWxsIGluY3JlYXNlIGludGVyZXN0IGluY29tZSBhcyB0aGUgYmFuayBiZW5lZml0cyBmcm9tIGhpZ2hlciBpbmNvbWUgZnJvbSB2YXJpYWJsZSByYXRlIGxvYW5zIGFuZCBuZXcgbG9hbnMuIEludGVyZXN0IGV4cGVuc2VzIGNvdWxkIGFsc28gaW5jcmVhc2UsIGJ1dCBhcyBuZXQgaW50ZXJlc3QgaW5jb21lIGlzIGhpZ2hlciB0aGFuIGludGVyZXN0IGV4cGVuc2VzLCBvdmVyYWxsIG5ldCBpbnRlcmVzdCBpbmNvbWUgaXMgZXhwZWN0ZWQgdG8gZ3Jvdy4KCgoyLiBwcm92aXNpb24gZm9yIGNyZWRpdCBsb3NzZXMgKGxvYW4gbG9zcyBwcm92aXNpb25zKToKICAgLSAyMDIzOiBVU0QgNC4zOTQgbWlsbGlvbgogICAtIEltcGFjdDogSGlnaGVyIGludGVyZXN0IHJhdGVzIGNvdWxkIGluY3JlYXNlIHRoZSByaXNrIG9mIGRlZmF1bHQgYXMgYm9ycm93ZXJzIG1heSBoYXZlIGRpZmZpY3VsdHkgc2VydmljaW5nIHRoZWlyIGRlYnRzLiBUaGlzIGNvdWxkIGxlYWQgdG8gaGlnaGVyIGxvYW4gbG9zcyBwcm92aXNpb25zLgoKCjMuIG5vbi1pbnRlcmVzdCBpbmNvbWUgKG5vbi1pbnRlcmVzdCBpbmNvbWUpOgogICAtIDIwMjM6IFVTRCA0MS42NTAgbWlsbGlvbgogICAtIEltcGFjdDogRmVlIGluY29tZSBjb3VsZCBpbmNyZWFzZSBhcyBjbGllbnRzIGluY3JlYXNpbmdseSBzZWVrIGZpbmFuY2lhbCBwcm9kdWN0cyB0byBkZWFsIHdpdGggcmlzaW5nIGludGVyZXN0IHJhdGVzLiBBdCB0aGUgc2FtZSB0aW1lLCBtYXJrZXQgdm9sYXRpbGl0eSBjb3VsZCBuZWdhdGl2ZWx5IGltcGFjdCB0cmFkaW5nIHByb2ZpdHMuCgoKU3VtbWFyeSBvZiB0aGUgaW1wYWN0CgoKQW4gaW5jcmVhc2UgaW4gaW50ZXJlc3QgcmF0ZXMgd291bGQgbGlrZWx5IGxlYWQgdG8gYW4gaW5jcmVhc2UgaW4gbmV0IGludGVyZXN0IGluY29tZSBhcyBpbnRlcmVzdCBpbmNvbWUgZXhjZWVkcyBpbnRlcmVzdCBleHBlbnNlcy4gQXQgdGhlIHNhbWUgdGltZSwgdGhlIGNvbW1pc3Npb24gZm9yIGNyZWRpdCBsb3NzZXMgY291bGQgaW5jcmVhc2UsIHdoaWNoIGFmZmVjdHMgdGhlIGRlZmF1bHQgcmlzayBmb3IgYm9ycm93ZXJzLiBOb24taW50ZXJlc3QgaW5jb21lIGNvdWxkIGJlIGFmZmVjdGVkIGJvdGggcG9zaXRpdmVseSBhbmQgbmVnYXRpdmVseSwgZGVwZW5kaW5nIG9uIGRldmVsb3BtZW50cyBpbiBmZWUgaW5jb21lIGFuZCB0cmFkaW5nIHByb2ZpdHMuIE92ZXJhbGwsIHRoZSBiYW5rIGNvdWxkIGJlbmVmaXQgZnJvbSB0aGUgaW50ZXJlc3QgcmF0ZSBpbmNyZWFzZXMgYXMgbG9uZyBhcyB0aGUgaW5jb21lIG91dHdlaWdocyB0aGUgcmlzayBvZiBjcmVkaXQgbG9zc2VzLgoKVGhpcyBhbmFseXNpcyBwcm92aWRlcyBhIHNwZWNpZmljIG92ZXJ2aWV3IG9mIHRoZSBwb3RlbnRpYWwgZmluYW5jaWFsIGltcGFjdCBvbiBCYW5rIG9mIEFtZXJpY2EgaW4gdGhlIGNvbnRleHQgb2YgcmlzaW5nIGludGVyZXN0IHJhdGVzLgoKCkw1LjE0CgpJbmNvbWUgU3RhdGVtZW50IEl0ZW1zIEFmZmVjdGVkCk5ldCBpbnRlcmVzdCBpbmNvbWU6IEluIGEgc2l0dWF0aW9uIG9mIGNyaXNpcyB0aGUgbmV0IGludGVyZXN0IGluY29tZSBtaWdodCByZWdpc3RlciBhIGRyb3AuIFVzdWFsbHkgd2hlbiB0aGUgZWNvbm9taWMgY29uZGl0aW9ucyBkZXRlcmlvcmF0ZSwgaW5kaXZpZHVhbHMgYW5kIGJ1c2luZXNzZXMgYXJlIGxlc3MgbGlrZWx5IHRvIHRha2UgY3JlZGl0cyBiZWNhdXNlIHRoZSBiYW5rIGhhcyBubyBndWFyYW50ZWUgdGhleSB3aWxsIGJlIGFibGUgdG8gcGF5IHRoZW0gYmFjay4gQXMgYSByZXN1bHQgdGhlIGRlbWFuZCBmYWxscyBhbmQgdGhlIGludGVyZXN0IGluY29tZSBiZWNvbWVzIGxvd2VyLlRoZXJlIG1pZ2h0IGFsc28gYmUgYSByZWFjdGlvbiBvZiB0aGUgRmVkZXJhbCBSZXNlcnZlIHdoaWNoIGNvdWxkIGxvd2VyIHRoZSByYXRlIHdoaWNoIHdvdWxkIGJlIGEgcmVhc29uIGZvciBhIGxvd2VyIGludGVyZXN0IGluY29tZSBmcm9tIGV4aXN0aW5nIGxvYW5zLgoKClByb3Zpc2lvbiBmb3IgTG9hbiBMb3NzZXM6IER1cmluZyBhbiBlY29ub21pYyBjb25kaXRpb24gZGV0ZXJpb3JhdGlvbiBiYW5r4oCZcyBtaWdodCBhbnRpY2lwYXRlIGEgaGlnaGVyIGRlZmF1bHQgcmF0ZSBvbiBjcmVkaXRzLiBUaGF0IG1pZ2h0IHJlc3VsdCBpbiBhbiBpbmNyZWFzZSBvZiB0aGUgcHJvdmlzaW9uIGZvciBsb2FuIGxvc3NlcyBzaW5jZSB0aGUgZXhwZWN0ZWQgZGVmYXVsdGVkIGxvYW5zIHJhdGUgcmlzZXMsIHNvIHRvIGNvdmVyIHRoZSBwb3RlbnRpYWwgbG9zc2VzIHRoZSBiYW5rIGNvdWxkIHB1dCBtb3JlIGZ1bmRzIGludG8gdGhpcyBpdGVtLgoKCk5vbi1pbnRlcmVzdCBpbmNvbWU6IER1cmluZyBhbiBlY29ub21pYyBjb25kaXRpb24gZGV0ZXJpb3JhdGlvbiBiYW5r4oCZcyBtaWdodCBleHBlcmllbmNlIGEgZHJvcCBvZiBmZWUtZ2VuZXJhdGluZyBhY3Rpdml0aWVzIHN1Y2ggYXMgYXNzZXQgbWFuYWdlbWVudCBvciBpbnZlc3RtZW50IGJhbmtpbmcuIFRoYXQgY291bGQgbGVhZCB0byBhIGRlY3JlYXNlIG9mIHRoZSBub24taW50ZXJlc3QgaW5jb21lLgoKCk5ldCBpbnRlcmVzdCBtYXJnaW46IER1cmluZyBhbiBlY29ub21pYyBjb25kaXRpb24gZGV0ZXJpb3JhdGlvbiBiYW5r4oCZcyBtaWdodCBsb3dlciB0aGUgaW50ZXJlc3QgcmF0ZSB0byBzdGltdWxhdGUgYm9ycm93aW5nLCB0aGF0IHdvdWxkIGxlYWQgdG8gYSBkcm9wIGluIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGludGVyZXN0IG9mIGxvYW5zIGFuZCB0aGUgaW50ZXJlc3Qgb2YgZGVwb3NpdHMgd2hpY2ggd291bGQgbGVhZCB0byBhIGRyb3Agb2YgdGhlIG5ldCBpbnRlcmVzdCBtYXJnaW4uCgoKTmV0IGluY29tZTogQXMgd2UgdGFrZSB0aGUgc2l0dWF0aW9uIG9mIGFsbCB0aGUgaXRlbXMgd2UgYW5hbHl6ZWQgYWJvdmUgd2Ugc2VlIHRoYXQgYXMgdGhlIG5ldCBpbnRlcmVzdCBpbmNvbWUgY291bGQgZHJvcCB0aGUgcHJvdmlzaW9uIG9uIGxvYW4gbG9zc2VzIGNvdWxkIHJpc2UgYW5kIHRoZSBuZXQgaW50ZXJlc3QgbWFyZ2luIGNvdWxkIGRyb3AgdGhlIHNpdHVhdGlvbiBvZiB0aGUgbmV0IGluY29tZSBjb3VsZCBhbHNvIGJlIGEgZGVjcmVhc2UgaW4gb3ZlcmFsbC4KCgpMNS4xNQoKVGhlIGZ1bmQncyBvYmplY3RpdmUgaXMgdG8gaW52ZXN0IGF0IGxlYXN0IDk5LjUlIG9mIGl0cyB0b3RhbCBhc3NldHMgaW4gY2FzaCwgVS5TLiBUcmVhc3VyeSBiaWxscywgbm90ZXMgYW5kIG90aGVyIGRpcmVjdCBvYmxpZ2F0aW9ucyBvZiB0aGUgVS5TIFRyZWFzdXJ5LCBhbmQgcmVwdXJjaGFzZSBhZ3JlZW1lbnRzIHNlY3VyZWQgYnkgc3VjaCBvYmxpZ2F0aW9ucyBvciBjYXNoLiBUaGUgRnVuZCBpbnZlc3RzIGluIHNlY3VyaXRpZXMgbWF0dXJpbmcgaW4gMzk3IGRheXMgb3IgbGVzcyAod2l0aCBjZXJ0YWluIGV4Y2VwdGlvbnMpIGFuZCB0aGUgcG9ydGZvbGlvIHdpbGwgaGF2ZSBhIGRvbGxhci13ZWlnaHRlZCBhdmVyYWdlIG1hdHVyaXR5IG9mIDYwIGRheXMgb3IgbGVzcyBhbmQgYSBkb2xsYXItd2VpZ2h0ZWQgYXZlcmFnZSBsaWZlIG9mIDEyMCBkYXlzIG9yIGxlc3MuIEluIGFkZGl0aW9uLCB0aGUgRnVuZCBtYXkgaW52ZXN0IGluIHZhcmlhYmxlIGFuZCBmbG9hdGluZyByYXRlIGluc3RydW1lbnRzIGFuZCB0cmFuc2FjdCBpbiBzZWN1cml0aWVzIG9uIGEgd2hlbi1pc3N1ZWQsIGRlbGF5ZWQgZGVsaXZlcnkgb3IgZm9yd2FyZCBjb21taXRtZW50IGJhc2lzLgpXZSBjb25zaWRlciB0aGlzIG11dHVhbCBmdW5kIHRvIGhhdmUgYSBsb3cgcmlzayBzaW5jZSBpdCBpbnZlc3RzIG1vc3RseSBpbiBsb3cgcmlzayBpbnN0cnVtZW50cyBzdWNoIGFzIHRyZWFzdXJ5IGJpbGxzLgoKTDUuMTYKClRoZSByZXR1cm4gb2YgdGhlIG11dHVhbCBmdW5kIGZvciBsYXN0IHllYXIgd2FzIDUuMDglClRoZSBhdmVyYWdlIGFubnVhbCByZXR1cm4gb3ZlciB0aGUgbGFzdCB0aHJlZSB5ZWFycyB3YXMgMi4yMiUKCkw1LjE3CgpBcyB0aGUgZnVuZCBpbnZlc3RzIG1vc3Qgb2YgaXRzIGFzc2V0cyBpbiB0cmVhc3VyeSBiaWxscyBhbmQgb2JsaWdhdGlvbnMgaXQgd2lsbCBiZSBtb3N0bHkgYWZmZWN0ZWQgYnkgdGhlIFUuUy4gaW50ZXJlc3QgcmF0ZXMuCgpMNS4xOAoKV2hlbiBidXlpbmcgd2UgcGF5IDAuMTAlIG9mIGEgbWFuYWdlbWVudCBmZWUgYW5kIDAuMDclIG9mIGFuIGFkbWluaXN0cmF0aW9uIGZlZSwgYXMgYSBzdW0gd2UgcGF5IGEgMC4xNyUgZmVlLgoKTDUuMTkKClRoZSBleHBlbnNlIHJhdGlvIGZvciB0aGlzIG11dHVhbCBmdW5kIG92ZXIgdGhlIGxhc3QgeWVhciB3YXMgMC4wMiUuIFRoaXMgYW1vdW50IHNlZW1zIHF1aXRlIGxvdyBpbiBjb21wYXJpc29uIHdpdGggb3RoZXIgZnVuZHMgdGhhdCBzb21ldGltZXMgaGF2ZSBhbiBleHBlbnNlIHJhdGlvIG9mIG92ZXIgMSUuIFRoaXMgbGV2ZWwgb2YgZXhwZW5zZSByYXRpbyBnaXZlcyBhIHBvc3NpYmlsaXR5IHRvIHRyYW5zZmVyIG1vcmUgb2YgdGhlIGludGVyZXN0IHRvIHRoZSBpbnZlc3RvcnMuCgpTZWN1cml0aWVzIGZpcm1zCkZvciB0aGUgc2VjdXJpdGllcyBmaXJtIHRoYXQgeW91IHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlcm0sIHVzZSBpdHMgYW5udWFsIHJlcG9ydCBvciBhbnkgb3RoZXIgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuCgoKTDUuMjAgV2hhdCBhcmUgdGhlIG1haW4gdHlwZXMgb2YgYnVzaW5lc3MgY29uZHVjdGVkIGJ5IHRoZSBzZWN1cml0aWVzIGZpcm0/ClRoZSBjb3Jwb3JhdGUgcHVycG9zZSBvZiBQcm9zZWd1ciBDYXNoIGlzIHRvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBzZXJ2aWNlcyB0aHJvdWdoIGNvbXBhbmllcyBmb2N1c2luZyBvbiB0aGUgQ2FzaCBidXNpbmVzczogKGkpIG5hdGlvbmFsIGFuZCBpbnRlcm5hdGlvbmFsIHRyYW5zcG9ydCBzZXJ2aWNlcyAoYnkgbGFuZCwgc2VhIGFuZCBhaXIpIG9mIGZ1bmRzIGFuZCBvdGhlciB2YWx1YWJsZXMgKGluY2x1ZGluZyBqZXdlbGxlcnksIGFydHdvcmtzLCBwcmVjaW91cyBtZXRhbHMsIGVsZWN0cm9uaWMgZGV2aWNlcywgdm90aW5nIGJhbGxvdHMsIGxlZ2FsIGV2aWRlbmNlKSwgaW5jbHVkaW5nIGNvbGxlY3Rpb24sIHRyYW5zcG9ydCwgY3VzdG9keSBhbmQgZGVwb3NpdCBzZXJ2aWNlczsgKGlpKSBwcm9jZXNzaW5nIGFuZCBhdXRvbWF0aW9uIG9mIGNhc2ggKGluY2x1ZGluZyBjb3VudGluZywgcHJvY2Vzc2luZyBhbmQgcGFja2FnaW5nLCBhcyB3ZWxsIGFzIGNvaW4gcmVjeWNsaW5nLCBjYXNoIGZsb3cgY29udHJvbCBhbmQgbW9uaXRvcmluZyBzeXN0ZW1zKTsgKGlpaSkgY29tcHJlaGVuc2l2ZSBBVE0gc29sdXRpb25zIChpbmNsdWRpbmcgcGxhbm5pbmcsIGxvYWRpbmcsIG1vbml0b3JpbmcsIGZpcnN0LSBhbmQgc2Vjb25kLXRpZXIgbWFpbnRlbmFuY2UgYW5kIGJhbGFuY2luZyk7IChpdikgY2FzaCBwbGFubmluZyBhbmQgZm9yZWNhc3RpbmcgZm9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnM7ICh2KSBDYXNoLVRvZGF5IChpbmNsdWRpbmcgc2VsZi1zZXJ2aWNlIGNhc2ggbWFjaGluZXMsIGNhc2ggZGVwb3NpdHMsIHJlY3ljbGluZyBhbmQgYmFuayBub3RlcyBhbmQgY29pbiBkaXNwZW5zaW5nIHNlcnZpY2VzKSwgYW5kIGNyeXB0b2N1cnJlbmN5IGN1c3RvZHkgc2VydmljZXM7IGFuZCAodmkpIGFkZGVkLXZhbHVlIHNlcnZpY2VzIGluIHNldmVyYWwgY291bnRyaWVzIChBVk9TKSBmb3IgYmFua3MgKGluY2x1ZGluZyBvdXRzb3VyY2luZyBvZiB0ZWxsZXJzLCBtdWx0aS1hZ2VuY3kgc2VydmljZXMsIGNoZXF1ZSBwcm9jZXNzaW5nIGFuZCByZWxhdGVkIGFkbWluaXN0cmF0aXZlIHNlcnZpY2VzIGFtb25nIG90aGVycykgYW5kICh2aWkpIENvcnJlc3BvbmRlbnQgYmFua2luZyBhY3Rpdml0aWVzIChjb2xsZWN0aW9uIGFuZCBwYXltZW50IG1hbmFnZW1lbnQgYW5kIHBheW1lbnQgb2YgaW52b2ljZXMsIGFtb25nIG90aGVycykgYW5kICh2aWlpKSBGb3JlaWduIGV4Y2hhbmdlIGN1cnJlbmN5IHNlcnZpY2VzIChhbHNvIGluY2x1ZGVzIGludGVybmF0aW9uYWwgcGF5bWVudCBzZXJ2aWNlcywgb25saW5lIGZvcmVpZ24gbW9uZXksIGhvbWUgZGVsaXZlcnkgc2VydmljZXMgZm9yIHRyYXZlbCBtb25leSBhbmQgbG9jYWwgY2FzaCkKCkw1LjIxIFN1bW1hcml6ZSBhbnkgc3RhdGVtZW50cyBtYWRlIGJ5IHRoZSBzZWN1cml0aWVzIGZpcm0gaW4gaXRzIGFubnVhbCByZXBvcnQgYWJvdXQgaG93IGl0IG1heSBiZSBhZmZlY3RlZCBieSBleGlzdGluZyBvciBwb3RlbnRpYWwgcmVndWxhdGlvbnMuClByb3NlZ3VyIGFja25vd2xlZGdlcyB0aGF0IHRoZSBzZWN0b3IgaW4gd2hpY2ggaXQgcHJvdmlkZXMgaXRzIHNlcnZpY2VzIGlzIGhpZ2hseSByZWd1bGF0ZWQuIFRoZSBmaXJtIGhvd2V2ZXIgc2VlcyB0aGUgbmVlZCB0byBhZGFwdCB0byB0aG9zZSByZWd1bGF0aW9ucyBhbmQgdGFrZXMgYWN0aW9uIGluIGludHJvZHVjaW5nIGNoYW5nZXMgdGhlIHJlZ3VsYXRpb25zIGFkZHJlc3MuIFRoZSByZXBvcnRzIGluZGljYXRlIHRoYXQgdGhlIGNoYW5nZSBpbiByZWd1bGF0aW9ucyBhZmZlY3QgdGhlIGJ1c2luZXNzIGVzcGVjaWFsbHkgaW4gdGhlIGRhdGEgcHJvdGVjdGlvbiBzZWN0b3IsIGhvd2V2ZXIgaXQgcHJvdmlkZWQgaW1wb3J0YW50IHN0ZXBzIHRvIGludHJvZHVjZSBjaGFuZ2VzIGluIGl0cyBvcGVyYXRpb25hbCBwcmFjdGljZXMuIFRoaXMgcHJvY2VzcyBtYXkgbGVhZCB0byBhIHJpc2UgaW4gb3BlcmF0aW9uYWwgY29zdHMgIHNpbmNlIGl0IG1heSBuZWVkIGludHJvZHVjaW5nIHNvbWUgbmV3IHRlY2hub2xvZ2llcyBhbmQgdHJhaW5pbmcgb2YgdGhlIHN0YWZmLiBUaGUgcmVndWxhdGlvbnMgbWF5IGhvd2V2ZXIgaGF2ZSBhIHBvc2l0aXZlIGVmZmVjdCBvbiB0aGUgYnVzaW5lc3MgaW4gdGhlIGRvbWFpbnMgb2YgY3liZXJzZWN1cml0eSBhbmQgcmlzayBtYW5hZ2VtZW50IHNpbmNlIHRoZSBjaGFuZ2VzIGluIHJlZ3VsYXRpb25zIG1heSBhZmZlY3QgdGhlIGRlbWFuZCBvbiBzdWNoIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IHRoaXMgZmlybS4KCkw1LjIyIERlc2NyaWJlIHRoZSByZWNlbnQgcGVyZm9ybWFuY2Ugb2YgdGhlIHNlY3VyaXRpZXMgZmlybSwgYW5kIGV4cGxhaW4gd2h5IHRoZSBwZXJmb3JtYW5jZSBoYXMgYmVlbiBmYXZvcmFibGUgb3IgdW5mYXZvcmFibGUuClNhbGVzIGluIDIwMjMgY29tcGFyZWQgdG8gdGhlIHllYXIgMjAyMiAgLTIxIDgwMiAwMDAg4oKsClBvc3QgdGF4IHByb2ZpdCBvZiBvbmdvaW5nIG9wZXJhdGlvbnMgaW4gMjAyMyBjb21wYXJlZCB0byB0aGUgeWVhciAyMDIyIC05NSA0ODggMDAwIOKCrApFQklUREEgaW4gMjAyMyBjb21wYXJlZCB0byB5ZWFyIDIwMjIgLTM2IDIyMCAwMDDigqwKCgpUaGUgZGF0YSBzaG93cyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGZpcm0gaW4gdGhlIHllYXIgMjAyMiBhbmQgdGhlIHllYXIgMjAyMy4gVGhpcyBtYXkgaGF2ZSBiZWVuIGNhdXNlZCBieSBtdWx0aXBsZSBkaWZmZXJlbnQgYXNwZWN0cy4gRmlyc3Qgb2YgYWxsLCB0aGUgeWVhciAyMDIyIHdhcyBhIHZlcnkgZ29vZCB5ZWFyIGluIHRoZSBoaXN0b3J5IG9mIFByb3NlZ3VyIGFuZCB0aGUgZmlybSByZWdpc3RlcmVkIHNvbWUgc2lnbmlmaWNhbnQgcHJvZml0cyBhbmQgYSBiaWcgZ3Jvd3RoIGluIGFzc2V0cywgd2hpY2ggY291bGQgYmUgZGlmZmljdWx0IHRvIG91dHBlcmZvcm0uIFRoZSBzZWNvbmQgYXNwZWN0IGNvdWxkIGJlIGEgZGlmZmVyZW5jZSBpbiBkZW1hbmQgb24gdGhlIG1hcmtldCB3aGljaCBjb3VsZCBiZSB0aGUgcmVhc29uIGZvciB0aGUgZGlmZmVyZW5jZSBpbiBzYWxlcyBhbmQgdGhlIEVCSVREQS4gVGhlIGZpcm0gYWxzbyBoYXMgcmVnaXN0ZXJlZCBhbiBpbXBvcnRhbnQgZGlmZmVyZW5jZSBpbiB0aGUgcG9zdCB0YXggcHJvZml0IG9mIG9uZ29pbmcgb3BlcmF0aW9ucyB3aGljaCBjb3VsZCBiZSBjYXVzZWQgYnkgYSBkaWZmZXJlbnQgY29zdCBtYW5hZ2VtZW50IHBvbGljeS4KCkw3IEZpeGVkIGluY29tZQpDb21wYXJpbmcgeWllbGRzIGFtb25nIHNlY3VyaXRpZXMKCkw3LjEgV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB5aWVsZCBvbiBjb3Jwb3JhdGUgaGlnaC1xdWFsaXR5IGJvbmRzIGFuZCB0aGUgeWllbGQgb24gVHJlYXN1cnkgYm9uZHMgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0/IEV4cGxhaW4gd2h5IHRoZSBkaWZmZXJlbmNlIGV4aXN0cz8KUmVhc29ucyBmb3IgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSB0d28geWllbGRzIAoKClRoaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB5aWVsZHMgaXMgY2FsbGVkIHRoZSBjcmVkaXQgc3ByZWFkIGFuZCBleGlzdHMgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZmFjdG9yczogCjEuIGNyZWRpdCByaXNrIAphLglDb3Jwb3JhdGUgaGlnaC1xdWFsaXR5IGJvbmRzIGhhdmUgYSBoaWdoZXIgcmlzayBvZiBkZWZhdWx0IGNvbXBhcmVkIHRvIFRyZWFzdXJ5IGJvbmRzLiBUaGVyZWZvcmUsIGludmVzdG9ycyBkZW1hbmQgYSBoaWdoZXIgeWllbGQgdG8gY29tcGVuc2F0ZSBmb3IgdGhpcyByaXNrIAoyLiBsaXF1aWRpdHkgcmlzayAKYS4JQ29ycG9yYXRlIGhpZ2gtcXVhbGl0eSBib25kcyBhcmUgb2Z0ZW4gbGVzcyBsaXF1aWQgdGhhbiBUcmVhc3VyeSBib25kcy4gQSBxdWljayBzYWxlIGF0IGEgZmFpciBtYXJrZXQgcHJpY2UgaXMgdGhlcmVmb3JlIG11Y2ggbW9yZSBkaWZmaWN1bHQgdGhhbiB3aXRoIFRyZWFzdXJ5IGJvbmRzLiAKMy4gbWFya2V0IGNvbmRpdGlvbnMgCmEuCUNoYW5nZXMgaW4gdGhlIGVjb25vbWljIHNpdHVhdGlvbiBvciBtb25ldGFyeSBwb2xpY3kgaGF2ZSBhIGRpZmZlcmVudCBlZmZlY3Qgb24gdGhlIHJlc3BlY3RpdmUgYm9uZC4gCgoKTDcuMiBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHlpZWxkIG9uIGxvbmctdGVybSBUcmVhc3VyeSBib25kcyBhbmQgdGhlIHlpZWxkIG9uIGxvbmctdGVybSBtdW5pY2lwYWwgYm9uZHMgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0/IEV4cGxhaW4gd2h5IGRvZXMgdGhlIGRpZmZlcmVuY2UgZXhpc3Q/CkxvbmctdGVybSB0cmVhc3VyeSBib25kcyB5aWVsZCB2YXJpZXMgYmV0d2VlbiAzLjglIGFuZCA0JSB3aGlsZSBsb25nLXRlcm0gbXVuaWNpcGFsIGJvbmRzIG1heSB5aWVsZCBiZXR3ZWVuIDUlIGFuZCA2JSBhZnRlciBjb3VudGluZyBmb3IgdGhlaXIgdGF4LWV4ZW1wdCBzdGF0dXMgZm9yIGludmVzdG9ycyBpbiBoaWdoZXIgdGF4IGJyYWNrZXRzLiBUaGF0IG1lYW5zIHRoYXQgYWZ0ZXIgdGFraW5nIGluIGNvbnNpZGVyYXRpb24gdGhlIHRheCBpbXBsaWNhdGlvbnMgdGhlIG11bmljaXBhbCBib25kcyBvZmZlciBhIGhpZ2hlciB5aWVsZCB0aGFuIHRyZWFzdXJ5IGJvbmRzLiBUaGUgaW50ZXJlc3QgZnJvbSBtdW5pY2lwYWwgYm9uZHMgaXMgZXhlbXB0IGZyb20gZmVkZXJhbCBpbmNvbWUgdGF4IGFuZCBhbHNvIGZyb20gc3RhdGUgdGF4ZXMgaWYgdGhlIGludmVzdG9yIHJlc2lkZXMgaW4gdGhlIGlzc3Vpbmcgc3RhdGUuIFRoaXMgcHV0cyB0aGUgbXVuaWNpcGFsIGJvbmRzIGluIGEgZmF2b3JhYmxlIHBvc2l0aW9uIGNvbXBhcmVkIHRvIHRoZSB0cmVhc3VyeSBib25kcyB3aGljaCBhcmUgdGF4YWJsZS4gVGhlcmUgaXMgYSBkaWZmZXJlbmNlIGluIHJpc2sgYmV0d2VlbiB0aGUgdHJlYXN1cnkgYm9uZHMgYW5kIHRoZSBtdW5pY2lwYWwgYm9uZHMgc2luY2UgdGhlIHRyZWFzdXJ5IGJvbmRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHJpc2stZnJlZSB3aGlsZSB0aGUgbXVuaWNpcGFsIGJvbmRzIGNhcnJ5IHNvbWUgdHlwZSBvZiBjcmVkaXQgcmlzayBkZXBlbmRpbmcgb24gdGhlIGZpbmFuY2lhbCBjb25kaXRpb24gb2YgdGhlIGlzc3VpbmcgbXVuaWNpcGFsaXR5LgoKCkFzc2Vzc2luZyB0aGUgZm9yZWNhc3RpbmcgYWJpbGl0eSBvZiB0aGUgeWllbGQgY3VydmUKCgpMNy4zIFdoYXQgd2FzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIDI2LXdlZWsgVC1iaWxsIHlpZWxkIGFuZCB0aGUgMTMtd2VlayBULWJpbGwgeWllbGQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0/CgoKTDcuNCBEb2VzIHRoaXMgaW1wbHkgdGhhdCB0aGUgeWllbGQgY3VydmUgaGFkIGFuIHVwd2FyZCBvciBkb3dud2FyZCBzbG9wZSBhdCB0aGF0IHRpbWU/CgoKTDcuNSBBc3N1bWluZyB0aGF0IHRoaXMgc2xvcGUgY2FuIGJlIHByaW1hcmlseSBhdHRyaWJ1dGVkIHRvIGV4cGVjdGF0aW9ucyB0aGVvcnksIGRpZCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzbG9wZSBpbmRpY2F0ZSB0aGF0IHRoZSBtYXJrZXQgZXhwZWN0ZWQgaGlnaGVyIG9yIGxvd2VyIGludGVyZXN0IHJhdGVzIGluIHRoZSBmdXR1cmU/CgpMNy42IERpZCBpbnRlcmVzdCByYXRlcyBtb3ZlIGluIHRoYXQgZGlyZWN0aW9uIG92ZXIgdGhlIHNjaG9vbCB0ZXJtPwpFeHBsYWluaW5nIHNoaWZ0cyBpbiB0aGUgeWllbGQgY3VydmUgb3ZlciB0aW1lCgoKTDcuNyBXaGF0IHdhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCBhbmQgdGhlIDEzLXdlZWsgVC1iaWxsIHlpZWxkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjaG9vbCB0ZXJtPwpPbiBNYXkgMXN0LCAyMDI0LCB0aGUgeWllbGQgZm9yIHRoZSAzMC15ZWFyIFRyZWFzdXJ5IGJvbmQgd2FzIDQuNTclCk1lYW53aGlsZSwgdGhlIHlpZWxkIGZvciB0aGUgMTMtd2VlayBULWJpbGwgd2FzIDMuODElCkRpZmZlcmVuY2UgYmV0d2VlbiB0aG9zZSBib25kcyBpcyA0LjU3IC0gMy44MSA9IDAuNzYlClRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhvc2UgdHdvIGJvbmRzIHdvdWxkIHVzdWFsbHkgYmUgY2F1c2VkIGJ5IHRoZSByaXNrIGRpZmZlcmVuY2VzIHdoZXJlIHRoZSByaXNrIG9mIHRoZSAxMC15ZWFyIFUuUy4gdHJlYXN1cnkgYm9uZCBpcyBoaWdoZXIgdGhhbiB0aGUgMTMtd2VlayB0cmVhc3VyeSBiaWxsLiBJbiBzdWNoIGEgY2FzZSB0aGUgeWllbGQgb2YgdGhlIDEwLXllYXIgdHJlYXN1cnkgYm9uZCBzaG91bGQgYmUgaGlnaGVyIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSByaXNrLiBBbm90aGVyIHJlYXNvbiBmb3IgdGhpcyBkaWZmZXJlbmNlIGlzIHRoZSBleHBlY3RhdGlvbiB0aGF0IHRoZSBpbnRlcmVzdCByYXRlIGNvdWxkIGNoYW5nZSBpbiB0aW1lIHNvIGludmVzdG9ycyB3b3VsZCBwcmVmZXIgdG8gaGF2ZSB0aGVpciBtb25leSBoZWxkIGZvciBhIHNob3J0ZXIgcGVyaW9kIG9mIHRpbWUgaW4gb3JkZXIgbm90IHRvIGJlIGxvY2tlZCBpbiB0aGVpciBpbnZlc3RtZW50cy4KCkw3LjggV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCBhbmQgdGhlIDEzLXdlZWsgVC1iaWxsIHlpZWxkIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtPwpPbiBTZXB0ZW1iZXIgMzAsIDIwMjQsIHRoZSBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCAoMTAteWVhciBUcmVhc3VyeSByYXRlKSB3YXMgNC40MSUuCk1lYW53aGlsZSwgdGhlIDEzLXdlZWsgVC1iaWxsIHlpZWxkIHdhcyAzLjgxJS4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSB0d28geWllbGRzIGlzIDAuNjAlICg0LjQxJSAtIDMuODElKQoKTDcuOSBHaXZlbiB5b3VyIGFuc3dlcnMgdG8gdGhlIHR3byBwcmV2aW91cyBxdWVzdGlvbnMsIGRlc2NyaWJlIGhvdyB0aGUgeWllbGQgY3VydmUgY2hhbmdlZCBvdmVyIHRoZSBzY2hvb2wgdGVybS4gRXhwbGFpbiB0aGUgY2hhbmdlcyBpbiBleHBlY3RhdGlvbnMgYWJvdXQgZnV0dXJlIGludGVyZXN0IHJhdGVzIHRoYXQgYXJlIGltcGxpZWQgYnkgdGhlIHNoaWZ0IGluIHRoZSB5aWVsZCBjdXJ2ZSBvdmVyIHRoZSBzY2hvb2wgdGVybS4KVGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHlpZWxkcyBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybSB3YXMgMC43NiUgYW5kIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtIHdhcyAwLjYwJS4gT3ZlciB0aGUgc2Nob29sIHRlcm0sIHRoZSB5aWVsZCBjdXJ2ZSBleHBlcmllbmNlZCBhIGZsYXR0ZW5pbmcuIFRoYXQgc2hvd3MgdGhhdCB0aGUgZXhwZWN0YXRpb25zIGFib3V0IHRoZSBpbnRlcmVzdCByYXRlcyBhcmUgdGhhdCBpdCB3aWxsIGRyb3AuClRoZSBGZWTigJlzIGluZmx1ZW5jZSBvbiBpbnRlcmVzdCByYXRlcwoKTDcuMTAgRGlkIHRoZSBGZWQgY2hhbmdlIHRoZSBmZWRlcmFsIGZ1bmRzIHJhdGUgb3ZlciB0aGUgc2Nob29sIHRlcm0/CgpMNy4xMSBEbyB5b3UgdGhpbmsgdGhlIG1vdmVtZW50cyBpbiBpbnRlcmVzdCByYXRlcyBvdmVyIHRoZSBzY2hvb2wgdGVybSB3ZXJlIGNhdXNlZCBieSB0aGUgRmVk4oCZcyBtb25ldGFyeSBwb2xpY3k/IEV4cGxhaW4uCk1lYXN1cmluZyBhbmQgZXhwbGFpbmluZyBwcmVtaXVtcyBvbiBtb25leSBtYXJrZXQgc2VjdXJpdGllcwpMNy4xMiBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHlpZWxkIG9uIDkwLWRheSBjb21tZXJjaWFsIHBhcGVyIGFuZCB0aGUgeWllbGQgb24gMTMtd2VlayBULWJpbGxzIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtPyBFZXhwbGFpbiB3aHkgdGhpcyBwcmVtaXVtIGV4aXN0cy4KTDcuMTMgQ29tcGFyZSB0aGUgcHJlbWl1bSBvbiB0aGUgOTAtZGF5IGNvbW1lcmNpYWwgcGFwZXIgeWllbGQgKHJlbGF0aXZlIHRvIHRoZSAxMy13ZWVrIFQtYmlsbCB5aWVsZCkgdGhhdCBleGlzdHMgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0gdG8gdGhlIHByZW1pdW0gdGhhdCBleGlzdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlcm0uIEVleHBsYWluIHdoeSB0aGUgcHJlbWl1bSBtYXkgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLgpFeHBsYWluaW5nIGJvbmQgcHJlbWl1bXMgYW5kIHByaWNlIG1vdmVtZW50cwoKTDcuMTQgV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB5aWVsZCBvbiBoaWdoLXlpZWxkIGNvcnBvcmF0ZSBib25kcyBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybSB2ZXJzdXMgdGhlIHlpZWxkIG9uIGhpZ2gtcXVhbGl0eSBjb3Jwb3JhdGUgYm9uZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0/CgpMNy4xNSBDb21wYXJlIHRoZSBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybSB0byB0aGUgbG9uZ3Rlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCB0aGF0IGV4aXN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0uIEdpdmVuIHRoZSBkaXJlY3Rpb24gb2YgdGhpcyBjaGFuZ2UsIGRpZCBwcmljZXMgb2YgbG9uZy10ZXJtIGJvbmRzIHJpc2Ugb3IgZmFsbCBvdmVyIHRoZSBzY2hvb2wgdGVybT8KCkw3LjE2IENvbXBhcmUgdGhlIGNoYW5nZSBpbiB0aGUgeWllbGRzIG9mIFRyZWFzdXJ5LCBtdW5pY2lwYWwsIGFuZCBjb3Jwb3JhdGUgYm9uZHMgb3ZlciB0aGUgc2Nob29sIHRlcm0uIERpZCB0aGUgeWllbGRzIG9mIGFsbCB0aHJlZSB0eXBlcyBvZiBzZWN1cml0aWVzIG1vdmUgaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGFuZCBieSBhYm91dCB0aGUgc2FtZSBkZWdyZWU/IEV4cGxhaW4gd2h5IHlpZWxkcyBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgYm9uZHMgbW92ZSB0b2dldGhlci4KCkw3LjE3IENvbXBhcmUgdGhlIHByZW1pdW0gb24gaGlnaC15aWVsZCBjb3Jwb3JhdGUgYm9uZHMgKHJlbGF0aXZlIHRvIFRyZWFzdXJ5IGJvbmRzKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybSB0byB0aGUgcHJlbWl1bSB0aGF0IGV4aXN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0uIERpZCB0aGUgcHJlbWl1bSBpbmNyZWFzZSBvciBkZWNyZWFzZT8gV2h5IHRoaXMgcHJlbWl1bSBjaGFuZ2VkIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLgoKCkw4IFBvcnRmb2xpbyAtIE1hcmtvdml0egpSZXBsaWNhdGUgdGhlIGJhc2ljIGlkZWEgb2YgdGhlIHBvcnRmb2xpbyBjYXNlCk1hcmtvd2l0eiBwb3J0Zm9saW8gdGhlb3J5LCB3aGljaCB3YXMgZGV2ZWxvcGVkIGluIHRoZSAxOTUwcywgaXMgYSBmb3JtIG9mIHBvcnRmb2xpbyBvcHRpbWl6YXRpb24gYmFzZWQgb24gc3RydWN0dXJlZCBtYXRoZW1hdGljYWwgYW5kIHN0YXRpc3RpY2FsIHByaW5jaXBsZXMuIApBdCBpdHMgaGVhcnQgaXMgdGhlIGNvbmNlcHQgb2YgZGl2ZXJzaWZpY2F0aW9uLiBNYXJrb3dpdHogYXJndWVzIHRoYXQgYnkgY29tYmluaW5nIGRpZmZlcmVudCBhc3NldHMgaW4gYSBwb3J0Zm9saW8sIHRoZSBvdmVyYWxsIHJpc2sgY2FuIGJlIHNpZ25pZmljYW50bHkgcmVkdWNlZCB3aXRob3V0IHNpZ25pZmljYW50bHkgcmVkdWNpbmcgdGhlIGV4cGVjdGVkIHJldHVybi4gVGhpcyBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IG5vdCBhbGwgaW52ZXN0bWVudHMgYXJlIGVxdWFsbHkgY29ycmVsYXRlZDsgYnkgc3BlY2lmaWNhbGx5IHNlbGVjdGluZyBhc3NldHMgd2l0aCBkaWZmZXJlbnQgcmlzayBwcm9maWxlcyBhbmQgZXhwZWN0ZWQgcmV0dXJucywgaW52ZXN0b3JzIGNhbiByZWR1Y2UgdGhlIHZvbGF0aWxpdHkgb2YgdGhlaXIgcG9ydGZvbGlvcy4KQSBrZXkgZWxlbWVudCBvZiB0aGlzIHRoZW9yeSBpcyB0aGUgcXVhbnRpZmljYXRpb24gb2Ygcmlzay4KCgpMOSBQb3J0Zm9saW8gLSBDQU1QClN0YXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gQ0FNUCBhbmQgTWFya292aXR6ClRoZSBDYXBpdGFsIEFzc2V0IFByaWNpbmcgTW9kZWwgKENBUE0pIGlzIGEgY2VudHJhbCBjb25jZXB0IGluIGZpbmFuY2UgdGhhdCBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSByaXNrIG9mIGFuIGFzc2V0IGFuZCBpdHMgZXhwZWN0ZWQgcmV0dXJuLiBUaGUgYmFzaWMgYXNzdW1wdGlvbiBpcyB0aGF0IGludmVzdG9ycyBtdXN0IGJlIHJld2FyZGVkIGZvciB0YWtpbmcgcmlzay4gSXQgaW50cm9kdWNlcyB0aGUgY29uY2VwdCBvZiBzeXN0ZW1hdGljIHJpc2ssIHdoaWNoIGNhbm5vdCBiZSBlbGltaW5hdGVkIHRocm91Z2ggZGl2ZXJzaWZpY2F0aW9uLiBUaGUgZXhwZWN0ZWQgcmV0dXJuIG9mIGFuIGFzc2V0IGlzIGRldGVybWluZWQgYnkgdGhlIHJpc2stZnJlZSByYXRlIG9mIHJldHVybiBwbHVzIGEgcmlzayBwcmVtaXVtIHByb3BvcnRpb25hbCB0byB0aGUgYXNzZXQncyBiZXRhIC0gYSBtZWFzdXJlIG9mIGl0cyB2b2xhdGlsaXR5IHJlbGF0aXZlIHRvIHRoZSBtYXJrZXQgYXMgYSB3aG9sZS4KSW4gY29udHJhc3QgdG8gTWFya293aXR6IHBvcnRmb2xpbyB0aGVvcnksIHdoaWNoIGZvY3VzZXMgb24gdGhlIGRpdmVyc2lmaWNhdGlvbiBvZiBpbnZlc3RtZW50cyB0byByZWR1Y2UgcmlzaywgdGhlIENBUE0gZm9jdXNlcyBvbiB0aGUgc3lzdGVtYXRpYyByaXNrIG9mIGFuIGluZGl2aWR1YWwgYXNzZXQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG1hcmtldCBhcyBhIHdob2xlLiBXaGlsZSBNYXJrb3dpdHogdGhlb3J5IGhlbHBzIGludmVzdG9ycyB0byBjcmVhdGUgb3B0aW1hbCBwb3J0Zm9saW9zIGJ5IHVzaW5nIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgcmV0dXJucyBhcyBhIG1lYXN1cmUgb2YgcmlzaywgdGhlIENBUE0gb25seSBsb29rcyBhdCByaXNrIHRoYXQgY2Fubm90IGJlIHJlZHVjZWQgdGhyb3VnaCBkaXZlcnNpZmljYXRpb24uCkFub3RoZXIgZGlmZmVyZW5jZSBsaWVzIGluIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgdHdvIG1vZGVscy4gVGhlIE1hcmtvd2l0eiB0aGVvcnkgaXMgb2Z0ZW4gdXNlZCB0byBvcHRpbWl6ZSB0aGUgY29tcG9zaXRpb24gb2YgcG9ydGZvbGlvcyB0aHJvdWdoIGRpdmVyc2lmaWNhdGlvbiwgYW1vbmcgb3RoZXIgdGhpbmdzLCB3aGVyZWFzIHRoZSBDQVBNIGlzIHVzZWQgdG8gZXZhbHVhdGUgaW5kaXZpZHVhbCBpbnZlc3RtZW50cy4gSXQgb2ZmZXJzIGEgY2xlYXIgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBhbiBhcHByb3ByaWF0ZSByZXR1cm4gZm9yIHRoZSByaXNrIHRha2VuIG9uIGFuIGFzc2V0LiBJdCBpcyB0aGVyZWZvcmUgdmVyeSB1c2VmdWwgZm9yIGluZGl2aWR1YWwgaW52ZXN0bWVudCBkZWNpc2lvbnMuIApUbyBzdW1tYXJpemUsIGJvdGggQ0FQTSBhbmQgTWFya293aXR6IGFyZSBpbXBvcnRhbnQgdG9vbHMgaW4gdGhlIGZpZWxkIG9mIGZpbmFuY2UuIFRoZXkgb2ZmZXIgZGlmZmVyZW50IHBlcnNwZWN0aXZlcyBvbiByaXNrIGFuZCByZXR1cm4gYW5kIGNvbXBsZW1lbnQgZWFjaCBvdGhlciBpbiB0aGVpciBhcHBsaWNhdGlvbi4KCgoKTDEwIFdBQ0MKUmVwbGljYXRlIHRoZSBib29rIGNhc2Ugb2YgV0FDQwpUaGUgV2VpZ2h0ZWQgQXZlcmFnZSBDb3N0IG9mIENhcGl0YWwgKFdBQ0MpIGlzIGFuIGltcG9ydGFudCBmaW5hbmNpYWwgbWV0cmljIHRoYXQgcmVwcmVzZW50cyB0aGUgYXZlcmFnZSByYXRlIG9mIHJldHVybiBhIGNvbXBhbnkgbmVlZHMgdG8gYWNoaWV2ZSB0byBzYXRpc2Z5IGl0cyBpbnZlc3RvcnPigJRib3RoIGVxdWl0eSBzaGFyZWhvbGRlcnMgYW5kIGRlYnQgaG9sZGVycy4gSXQgaGVscHMgZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIHJldHVybiB0aGUgY29tcGFueSBzaG91bGQgZ2VuZXJhdGUgb24gaXRzIGludmVzdG1lbnRzIHRvIG1haW50YWluIGl0cyB2YWx1ZSBhbmQgYXR0cmFjdCBvbmdvaW5nIGZ1bmRpbmcuCktleSBDb21wb25lbnRzIG9mIFdBQ0M6CkNvc3Qgb2YgRXF1aXR5IChSZSk6IFRoaXMgaXMgdGhlIHJldHVybiB0aGF0IGVxdWl0eSBpbnZlc3RvcnMgZXhwZWN0IGZvciB0YWtpbmcgb24gdGhlIHJpc2sgb2YgaW52ZXN0aW5nIGluIHRoZSBjb21wYW55LiBJdCBpcyB0eXBpY2FsbHkgZXN0aW1hdGVkIHVzaW5nIHRoZSBDYXBpdGFsIEFzc2V0IFByaWNpbmcgTW9kZWwgKENBUE0pLCByZWZsZWN0aW5nIHRoZSBvcHBvcnR1bml0eSBjb3N0IG9mIGNhcGl0YWwuCkNvc3Qgb2YgRGVidCAoUmQpOiBUaGlzIHJlcHJlc2VudHMgdGhlIGludGVyZXN0IHJhdGUgYSBjb21wYW55IHBheXMgb24gaXRzIGJvcnJvd2VkIGZ1bmRzLCBhZGp1c3RlZCBmb3IgdGhlIGNvcnBvcmF0ZSB0YXggcmF0ZSBiZWNhdXNlIGludGVyZXN0IHBheW1lbnRzIGFyZSB0YXgtZGVkdWN0aWJsZS4KV0FDQyBGb3JtdWxhOgpXQUNDIGlzIGNhbGN1bGF0ZWQgYXMgYSB3ZWlnaHRlZCBhdmVyYWdlLCB3aGVyZSB0aGUgd2VpZ2h0cyByZXByZXNlbnQgdGhlIHByb3BvcnRpb24gb2YgZXF1aXR5IGFuZCBkZWJ0IGluIHRoZSBjb21wYW554oCZcyBjYXBpdGFsIHN0cnVjdHVyZS4gVGhlIGZvcm11bGEgaXM6CldBQ0M9RVbii4VSZStEVuKLhVJk4ouFKDHiiJJUYylXQUNDPVZF4ouFUmUrVkTii4VSZOKLhSgx4oiSVGMpCldoZXJlOgpFOiBNYXJrZXQgdmFsdWUgb2YgZXF1aXR5CkQ6IE1hcmtldCB2YWx1ZSBvZiBkZWJ0ClY6IFRvdGFsIHZhbHVlIChlcXVpdHkgKyBkZWJ0KQpSZTogQ29zdCBvZiBlcXVpdHkKUmQ6IENvc3Qgb2YgZGVidApUYzogQ29ycG9yYXRlIHRheCByYXRlCktleSBUYWtlYXdheXM6ClB1cnBvc2Ugb2YgV0FDQzoKV0FDQyBzZXJ2ZXMgYXMgYSBjcnVjaWFsIGJlbmNobWFyayBmb3IgZXZhbHVhdGluZyBpbnZlc3RtZW50IG9wcG9ydHVuaXRpZXMuIEl0IHJlcHJlc2VudHMgdGhlIG1pbmltdW0gcmV0dXJuIHJlcXVpcmVkIHRvIHNhdGlzZnkgYm90aCBlcXVpdHkgYW5kIGRlYnQgaW52ZXN0b3JzLiBQcm9qZWN0cyBzaG91bGQgb25seSBiZSBwdXJzdWVkIGlmIHRoZWlyIGV4cGVjdGVkIHJldHVybiBleGNlZWRzIHRoZSBXQUNDLCBlbnN1cmluZyB0aGV5IGNyZWF0ZSB2YWx1ZS4gQnkgZmFjdG9yaW5nIGluIHRoZSBjb21wYW554oCZcyBvdmVyYWxsIGNvc3Qgb2YgY2FwaXRhbCwgV0FDQyByZWZsZWN0cyB0aGUgcmlzayBwcmVmZXJlbmNlcyBvZiBib3RoIGVxdWl0eSBhbmQgZGVidCBob2xkZXJzLCBzdXBwb3J0aW5nIGluZm9ybWVkIGZpbmFuY2lhbCBkZWNpc2lvbi1tYWtpbmcuCkZhY3RvcnMgQWZmZWN0aW5nIFdBQ0M6CkEgY29tcGFueeKAmXMgY2FwaXRhbCBzdHJ1Y3R1cmUgcGxheXMgYSBtYWpvciByb2xlIGluIGRldGVybWluaW5nIGl0cyBXQUNDLCBhcyBkZWJ0IGlzIHR5cGljYWxseSBsZXNzIGV4cGVuc2l2ZSB0aGFuIGVxdWl0eSwgYnV0IGluY3JlYXNlcyBmaW5hbmNpYWwgcmlzay4gRXh0ZXJuYWwgZmFjdG9ycyBsaWtlIGludGVyZXN0IHJhdGVzIG9yIG1hcmtldCByaXNrIHByZW1pdW1zIGNhbiBpbmZsdWVuY2UgYm90aCB0aGUgY29zdCBvZiBkZWJ0IGFuZCBlcXVpdHkuIEFkZGl0aW9uYWxseSwgdGhlIHRheCByYXRlIGltcGFjdHMgdGhlIGFmdGVyLXRheCBjb3N0IG9mIGRlYnQsIHdpdGggaGlnaGVyIHRheCByYXRlcyBsb3dlcmluZyB0aGUgZWZmZWN0aXZlIGNvc3Qgb2YgZGVidCwgdGh1cyBwb3RlbnRpYWxseSByZWR1Y2luZyBXQUNDLiBBbGwgdGhlc2UgZWxlbWVudHMgY29sbGVjdGl2ZWx5IHNoYXBlIHRoZSBjb21wYW554oCZcyB0b3RhbCBjb3N0IG9mIGNhcGl0YWwgYW5kIGltcGFjdCBpdHMgZmluYW5jaWFsIHN0cmF0ZWd5LgpJbXBsaWNhdGlvbnMgb2YgV0FDQzoKQSBsb3dlciBXQUNDIG1lYW5zIGNoZWFwZXIgZmluYW5jaW5nIGZvciBpbnZlc3RtZW50cywgaW1wcm92aW5nIHRoZSBjb21wYW554oCZcyBjb21wZXRpdGl2ZSBlZGdlLgpBIGhpZ2hlciBXQUNDIHNpZ25hbHMgaGlnaGVyIGZpbmFuY2luZyBjb3N0cywgd2hpY2ggY291bGQgbGltaXQgZ3Jvd3RoIG9wcG9ydHVuaXRpZXMuCldBQ0MgaXMgYSB2aXRhbCBtZXRyaWMgaW4gY29ycG9yYXRlIGZpbmFuY2UsIGd1aWRpbmcgaW52ZXN0bWVudCBkZWNpc2lvbnMsIHZhbHVhdGlvbiBtb2RlbHMsIGFuZCBwZXJmb3JtYW5jZSBhc3Nlc3NtZW50cy4gSXQgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIHZpZXcgb2YgYSBjb21wYW554oCZcyBmaW5hbmNpbmcgY29zdHMgYW5kIHN0cmF0ZWdpYyBmaW5hbmNpYWwgcGxhbm5pbmcuCgoKTDExIERlcml2YXRpdmVzCkwxMS4xIEFzc3VtZSB0aGF0IHlvdSBwdXJjaGFzZWQgYW4gUyZQIDUwMCBmdXR1cmVzIGNvbnRyYWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjaG9vbCB0ZXJtLCB3aXRoIHRoZSBmaXJzdCBzZXR0bGVtZW50IGRhdGUgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtLiBBbHNvIGFzc3VtZSB0aGF0IHlvdSBzb2xkIGFuIFMmUCA1MDAgZnV0dXJlcyBjb250cmFjdCB3aXRoIHRoaXMgc2FtZSBzZXR0bGVtZW50IGRhdGUgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0uIEdpdmVuIHRoYXQgdGhpcyBjb250cmFjdCBoYXMgYSB2YWx1ZSBvZiB0aGUgZnV0dXJlcyBwcmljZSB0aW1lcyAkMjUwLCBkZXRlcm1pbmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZG9sbGFyIHZhbHVlIG9mIHRoZSBjb250cmFjdCB5b3Ugc29sZCBhbmQgdGhlIGRvbGxhciBhbW91bnQgb2YgdGhlIGNvbnRyYWN0IHRoYXQgeW91IHB1cmNoYXNlZC4KCgpUaGUgcHJpY2Ugb2YgZnV0dXJlcyBjb250cmFjdCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybTogJCA1MDQ2LDUKVGhlIHByaWNlIG9mIGZ1dHVyZXMgY29udHJhY3QgaW4gdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm06ICQ1ODE0LDI1CgpgYGB7cn0KMjUwKjUwNDYuNQpgYGAKRnV0dXJlcyB2YWx1ZSBvZiBwdXJjaGFzZTogJDEgMjYxIDYyNQoKRnV0dXJlcyB2YWx1ZSBvZiBzYWxlOgpgYGB7cn0KMjUwKjU4MTQuMjUKYGBgCkZ1dHVyZXMgdmFsdWUgb2Ygc2FsZTogPSAkMSA0NTMgNTYyLDUKV2Ugd2lsbCBub3cgY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlOgpgYGB7cn0KMTI2MTYyNS0xNDUzNTYyLjUKYGBgCiA9ICQxOTEgOTM3LDUKCgoKCgpMMTEuMiBBc3N1bWUgdGhhdCB5b3UgaW52ZXN0ZWQgYW4gaW5pdGlhbCBtYXJnaW4gb2YgMjAgcGVyY2VudCBvZiB0aGUgYW1vdW50IHRoYXQgeW91IHdvdWxkIG93ZSB0byBwdXJjaGFzZSB0aGUgUyZQIDUwMCBpbmRleCBhdCB0aGUgc2V0dGxlbWVudCBkYXRlLiBNZWFzdXJlIHlvdXIgcmV0dXJuIGZyb20gdGFraW5nIGEgcG9zaXRpb24gaW4gdGhlIFMmUCA1MDAgaW5kZXggZnV0dXJlcyBhcyBmb2xsb3dzLiBUYWtlIHRoZSBkaWZmZXJlbmNlIGRldGVybWluZWQgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9uICh3aGljaCByZXByZXNlbnRzIHRoZSBkb2xsYXIgYW1vdW50IG9mIHRoZSBnYWluIG9uIHRoZSBmdXR1cmVzIHBvc2l0aW9uKSBhbmQgZGl2aWRlIGl0IGJ5IHRoZSBhbW91bnQgeW91IG9yaWdpbmFsbHkgaW52ZXN0ZWQgKHRoZSBhbW91bnQgeW91IG9yaWdpbmFsbHkgaW52ZXN0ZWQgaXMgMjAgcGVyY2VudCBvZiB0aGUgZG9sbGFyIHZhbHVlIG9mIHRoZSBmdXR1cmVzIGNvbnRyYWN0IHRoYXQgeW91IHB1cmNoYXNlZCkuCgoKSW5pdGlhbCBpbnZlc3RtZW50OgoKYGBge3J9CjAuMioxMjYxNjI1IApgYGAKPSAyNTIgMzI1ClJldHVybiA9IGRpZmZlcmVuY2UvaW5pdGlhbCBpbnZlc3RtZW50CmBgYHtyfQoxOTE5MzcuNS8yNTIzMjUKYGBgCgpSZXR1cm4gPSAwLDc2MDY3NTcgPSA3NiUKCkwxMS4zIFRoZSByZXR1cm4gdGhhdCB5b3UganVzdCBkZXJpdmVkIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiBpcyBub3QgYW5udWFsaXplZC4gVG8gYW5udWFsaXplIHlvdXIgcmV0dXJuLCBtdWx0aXBseSBpdCBieSAxMi9tLCB3aGVyZSBtIGlzIHRoZSBudW1iZXIgb2YgbW9udGhzIGluIHlvdXIgc2Nob29sIHRlcm0uCgoKQW5udWFsaXplZCByZXR1cm4gCiAKYGBge3J9Cjc2KjEyLzUKYGBgCj0gMTgyLDQlCgpMMTEuNCBBc3N1bWUgdGhhdCB5b3UgcHVyY2hhc2VkIGEgY2FsbCBvcHRpb24gKHJlcHJlc2VudGluZyAxMDAgc2hhcmVzKSBvbiB0aGUgc3BlY2lmaWMgc3RvY2sgdGhhdCB5b3UgaWRlbnRpZmllZCBmb3IgdGhpcyBwcm9qZWN0LiBXaGF0IHdhcyB5b3VyIHJldHVybiBmcm9tIHB1cmNoYXNpbmcgdGhpcyBvcHRpb24/IFtZb3VyIHJldHVybiBjYW4gYmUgbWVhc3VyZWQgYXMgClJldHVybiA9IG1heChtYXJrZXQgcHJpY2UgLSBLLDApL1AKCgpQcmVtdCByZXByZXNlbnRzIHRoZSBwcmVtaXVtIGF0IHdoaWNoIHRoZSBzYW1lIG9wdGlvbiBjYW4gYmUgc29sZCBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybS5dIElmIHRoZSBwcmVtaXVtIGZvciB0aGlzIG9wdGlvbiBpcyBub3QgcXVvdGVkIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtLCBtZWFzdXJlIHRoZSByZXR1cm4gYXMgaWYgeW91IGhhZCBleGVyY2lzZWQgdGhlIGNhbGwgb3B0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtIChhc3N1bWluZyB0aGF0IGl0IGlzIGZlYXNpYmxlIHRvIGV4ZXJjaXNlIHRoZSBvcHRpb24gYXQgdGhhdCB0aW1lKS4gVGhhdCBpcywgdGhlIHJldHVybiBpcyBiYXNlZCBvbiBwdXJjaGFzaW5nIHRoZSBzdG9jayBhdCB0aGUgb3B0aW9u4oCZcyBzdHJpa2UgcHJpY2UgYW5kIHRoZW4gc2VsbGluZyB0aGUgc3RvY2sgYXQgaXRzIG1hcmtldCBwcmljZSBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybS4KCgpUbyBjYWxjdWxhdGUgdGhlIHJldHVybiBmcm9tIHB1cmNoYXNpbmcgYSBjYWxsIG9wdGlvbiBvbiBBcHBsZSBJbmMuIChBQVBMKSBzaGFyZXMsIHdlIHdpbGwgYXNzdW1lIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIHN0cmlrZSBwcmljZSBhbmQgcHJlbWl1bSBwYWlkIGZvciB0aGUgb3B0aW9uLiBCYXNlZCBvbiB0aGUgbW9zdCByZWNlbnQgc3RvY2sgcHJpY2UgZGF0YSwgd2Ugd2lsbCB1c2UgdGhlIGNsb3NpbmcgcHJpY2Ugb2YgQXBwbGUgc2hhcmVzIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtLCB3aGljaCBpcyAkMjM3LjMzLgpBc3N1bXB0aW9uczoKU3RyaWtlIFByaWNlIChLKTogTGV0J3MgYXNzdW1lIGEgc3RyaWtlIHByaWNlIG9mICQyMzAuClByZW1pdW0gUGFpZCAoUCk6IFdlIHdpbGwgYXNzdW1lIHdlIHBhaWQgYSBwcmVtaXVtIG9mICQ1IHBlciBzaGFyZQpNYXJrZXQgUHJpY2UgYXQgRXhwaXJhdGlvbjogVGhlIG1hcmtldCBwcmljZSBvZiBBcHBsZSBzaGFyZXMgb24gU2VwdGVtYmVyIDMwIDIwMjQgaXMgJDIzNy4zMy4KQ2FsY3VsYXRpbmcgcmV0dXJuOiAKU2VsbGluZyB0aGUgb3B0aW9uCklmIHlvdSBkZWNpZGUgdG8gc2VsbCB0aGUgY2FsbCBvcHRpb24gYXQgbWFya2V0IHByaWNlOgpSZXR1cm49bWF44oGhKE1hcmtldCBQcmljZeKIkkssMCniiJJQIC9QCksgLSBzdHJpa2UgcHJpY2UKUCAtIHByZW1pdW0KQ2FsY3VsYXRpbmc6Cm1heOKBoSgyMzcuMzPiiJIyMzAsMCk9bWF44oGhKDcuMzMsMCk9Ny4zMwpSZXR1cm49KDcuMzPiiJI1KS81PTIuMzMvNT0wLjQ2NiBvciA0Ni42JQoKCkV4ZXJjaXNpbmcgdGhlIG9wdGlvbjoKSWYgeW91IGRlY2lkZSB0byBleGVyY2lzZSB0aGUgY2FsbCBvcHRpb246ClJldHVybj1tYXjigaEoTWFya2V0IFByaWNl4oiSSywwKS9QCkNhbGN1bGF0aW5nOgpSZXR1cm4KYGBge3J9CjcuMzMvNQpgYGAKCj0xLjQ2NiBvciAxNDYuNiUKU3VtbWFyeSBvZiByZXR1cm5zClJldHVybiBpZiBTb2xkOiA0Ni42JQpSZXR1cm4gaWYgRXhlcmNpc2VkOiAxNDYuNiUKCgpMMTEuNSBBbm51YWxpemUgdGhlIHJldHVybiBvbiB5b3VyIG9wdGlvbiBieSBtdWx0aXBseWluZyB0aGUgcmV0dXJuIHlvdSBkZXJpdmVkIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiBieSAxMi9tLCB3aGVyZSBtIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBtb250aHMgaW4geW91ciBzY2hvb2wgdGVybS4KSWYgc29sZDoKYGBge3J9CjQ2LjYqIDEyLzUKYGBgCiA9IDExMSw4NCUKIApJZiBleGVyY2lzZWQKYGBge3J9CjE0Ni42KjEyLzUKYGBgCgogPSAzNTEsODQlCgoKTDExLjYgQ29tcGFyZSB0aGUgcmV0dXJuIG9uIHlvdXIgY2FsbCBvcHRpb24gdG8gdGhlIHJldHVybiB0aGF0IHlvdSB3b3VsZCBoYXZlIGVhcm5lZCBpZiB5b3UgaGFkIHNpbXBseSBpbnZlc3RlZCBpbiB0aGUgc3RvY2sgaXRzZWxmLiBOb3RpY2UgaG93IHRoZSBtYWduaXR1ZGUgb2YgdGhlIHJldHVybiBvbiB0aGUgY2FsbCBvcHRpb24gaXMgbXVjaCBsYXJnZXIgdGhhbiB0aGUgbWFnbml0dWRlIG9mIHRoZSByZXR1cm4gb24gdGhlIHN0b2NrIGl0c2VsZi4gVGhhdCBpcywgdGhlIGdhaW5zIGFyZSBsYXJnZXIgYW5kIHRoZSBsb3NzZXMgYXJlIGxhcmdlciB3aGVuIGludmVzdGluZyBpbiBjYWxsIG9wdGlvbnMgb24gYSBzdG9jayBpbnN0ZWFkIG9mIHRoZSBzdG9jayBpdHNlbGYuCkRldGVybWluaW5nIHN3YXAgcGF5bWVudHMKCkwxMS43IEFzc3VtZSB0aGF0LCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybSwgeW91IGVuZ2FnZWQgaW4gYSBmaXhlZC1mb3ItZmxvYXRpbmcgcmF0ZSBzd2FwIGluIHdoaWNoIHlvdSBhZ3JlZWQgdG8gcGF5IDYgcGVyY2VudCBpbiBleGNoYW5nZSBmb3IgdGhlIHByZXZhaWxpbmcgMjYtd2VlayBULWJpbGwgcmF0ZSB0aGF0IGV4aXN0cyBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybS4gQXNzdW1lIHRoYXQgeW91ciBzd2FwIGFncmVlbWVudCBzcGVjaWZpZXMgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0gYXMgdGhlIG9ubHkgdGltZSBhdCB3aGljaCBhIHN3YXAgd2lsbCBvY2N1ciBhbmQgdGhhdCB0aGUgbm90aW9uYWwgYW1vdW50IGlzICQxMCBtaWxsaW9uLiBEZXRlcm1pbmUgdGhlIGFtb3VudCB0aGF0IHlvdSBvd2Ugb24gdGhlIHN3YXAsIHRoZSBhbW91bnQgeW91IGFyZSBvd2VkIG9uIHRoZSBzd2FwLCBhbmQgdGhlIGRpZmZlcmVuY2UuIERpZCB5b3UgZ2FpbiBvciBsb3NlIGFzIGEgcmVzdWx0IG9mIHRoZSBzd2FwPwpNZWFzdXJpbmcgYW5kIGV4cGxhaW5pbmcgZXhjaGFuZ2UgcmF0ZSBtb3ZlbWVudHMKCkwxMS44IERldGVybWluZSB0aGUgcGVyY2VudGFnZSBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIHRoZSBCcml0aXNoIHBvdW5kIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLiBEaWQgdGhlIHBvdW5kIGFwcHJlY2lhdGUgb3IgZGVwcmVjaWF0ZSBhZ2FpbnN0IHRoZSBkb2xsYXI/CgoKSW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0gb25lIEJyaXRpc2ggUG91bmQgY29zdGVkIDEsMjcgVVNECkluIHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtIG9uZSBCcml0aXNoIFBvdW5kIGNvc3RlZCAxLDM0IFVTRApUaGUgQnJpdGlzaCBQb3VuZCBhcHByZWNpYXRlZAoKCmBgYHtyfQooMS4zNC0xLjI3KS8xLjI3CmBgYAo9IDAsMDU1MTIgPSA1LDUxMiUKCkwxMS45IERldGVybWluZSB0aGUgcGVyY2VudGFnZSBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIHRoZSBKYXBhbmVzZSB5ZW4gb3ZlciB0aGUgc2Nob29sIHRlcm0uIERpZCB0aGUgeWVuIGFwcHJlY2lhdGUgb3IgZGVwcmVjaWF0ZSBhZ2FpbnN0IHRoZSBkb2xsYXI/CkluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjaG9vbCB0ZXJtIG9uZSBKYXBhbmVzZSBZZW4gY29zdGVkIDAsMDA2NCBVU0QKSW4gdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0gb25lIEphcGFuZXNlIFllbiBjb3N0ZWQgMCwwMDcwIFVTRApUaGUgSmFwYW5lc2UgWWVuIGFwcHJlY2lhdGVkCmBgYHtyfQooMC4wMDcwLTAuMDA2NCkvMC4wMDY0CmBgYAoKID0gMCwwOTM3NSA9IDksMzglCgoKTDExLjEwIERldGVybWluZSB0aGUgcGVyY2VudGFnZSBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIHRoZSBNZXhpY2FuIHBlc28gb3ZlciB0aGUgc2Nob29sIHRlcm0uIERpZCB0aGUgcGVzbyBhcHByZWNpYXRlIG9yIGRlcHJlY2lhdGUgYWdhaW5zdCB0aGUgZG9sbGFyPwpJbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybSB0aGUgTWV4aWNhbiBQZXNvIGNvc3RlZCAwLDU5IFVTRApJbiB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybSB0aGUgTWV4aWNhbiBQZXNvIGNvc3RlZCAwLDUxIFVTRApUaGUgTWV4aWNhbiBQZXNvIGRlcHJlY2lhdGVkCmBgYHtyfQooMC41MS0wLjU5KS8wLjU5CmBgYAoKPSAtMCwxMzU1OSA9IC0xMyw1NiUKCgpMMTEuMTEgRGV0ZXJtaW5lIHRoZSBwZXIgdW5pdCBnYWluIG9yIGxvc3MgaWYgeW91IGhhZCBwdXJjaGFzZWQgQnJpdGlzaCBwb3VuZCBmdXR1cmVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlcm0gYW5kIHNvbGQgQnJpdGlzaCBwb3VuZCBmdXR1cmVzIGF0IHRoZSBlbmQgb2YgdGhlIHRlcm0uCgoKSW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0gb25lIEJyaXRpc2ggUG91bmQgY29zdGVkIDEsMjcgVVNECkluIHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtIG9uZSBCcml0aXNoIFBvdW5kIGNvc3RlZCAxLDM0IFVTRApHYWluIG9yIGxvc3MgcGVyIHVuaXQKYGBge3J9CjEuMzQtMS4yNwpgYGAKCiA9IDAsMDcgVVNEClRoYXQgcmVwcmVzZW50cyBhIGdhaW4gb2YgJDAsMDcgcGVyIEJyaXRpc2ggUG91bmQKCgpMMTEuMTIgR2l2ZW4gdGhhdCBhIHNpbmdsZSBmdXR1cmVzIGNvbnRyYWN0IG9uIEJyaXRpc2ggcG91bmRzIHJlcHJlc2VudHMgNjIsNTAwIHBvdW5kcywgZGV0ZXJtaW5lIHRoZSBkb2xsYXIgYW1vdW50IG9mIHlvdXIgZ2FpbiBvciBsb3NzLgoKClRvIGNhbGN1bGF0ZSB0aGUgZG9sbGFyIGFtb3VudCBvZiBnYWluIG9yIGxvc3Mgd2UgbXVzdCBtdWx0aXBsaWNhdGUgdGhlIGFtb3VudCBvZiBHQlAgcGVyIHRoZSBnYWluIG9yIGxvc3MgcGVyIEJyaXRpc2ggUG91bmQgaW4gVVNECkNhbGN1bGF0aW9uOiAKCmBgYHtyfQo2MjUwMCowLjA3CmBgYAoKID0gJDQgMzc1CgoKTDEyIENhcGl0YWwgcmVxdWlyZW1lbnRzCkwxMi4xIENhbGN1bGF0ZSB0aGUgb3BlcmF0aW9uYWwsIG1hcmtldCBhbmQgY3JlZGl0IHJpc2sgY2FwaXRhbCByZXF1aXJlbWVudHMgZm9yIEJhbmsgb2YgQW1lcmljYSBhbmQgRGV1dHNjaGUgQmFuayBhcyBvZiBEZWNlbWJlciAzMSwgbGFzdCB5ZWFyLCB3aGljaCBiYW5rIGhhcyBhIGJldHRlciBjYXBpdGFsIGJhc2U/CgoKCgpCYW5rIG9mIEFtZXJpY2EgKEJvQSk6CgoKQ29tbW9uIEVxdWl0eSBUaWVyIDEgKENFVDEpIENhcGl0YWwgUmF0aW86IDExLjglCgoKRGV1dHNjaGUgQmFuazoKCgpDb21tb24gRXF1aXR5IFRpZXIgMSAoQ0VUMSkgQ2FwaXRhbCBSYXRpbzogMTMuNyUKUmlzay13ZWlnaHRlZCBBc3NldHMgKFJXQSk6IOKCrDM1MCBiaWxsaW9uCk9wZXJhdGlvbmFsIFJpc2sgUldBOiDigqw1NyBiaWxsaW9uCkNyZWRpdCBSaXNrIGFuZCBNYXJrZXQgUmlzayBSV0E6IFJlbWFpbmluZyBhbW91bnRzIGFmdGVyIG9wZXJhdGlvbmFsIFJXQSBkZWR1Y3Rpb24uCkNvbXBhcmlzb24KCgpDRVQxIFJhdGlvczoKRGV1dHNjaGUgQmFuazogMTMuNyUKQm9BOiAxMS44JQoKCkJldHRlciBDRVQxIFJhdGlvOiBEZXV0c2NoZSBCYW5rLCBpbmRpY2F0aW5nIGEgc3Ryb25nZXIgY2FwaXRhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byByaXNrLXdlaWdodGVkIGFzc2V0cy4KQnJlYWtkb3duIG9mIFJpc2tzIChEZXV0c2NoZSBCYW5rKToKT3BlcmF0aW9uYWwgUmlzazog4oKsNTcgYmlsbGlvbi4KUmVtYWluaW5nIFJXQSAobGlrZWx5IHNwbGl0IGJldHdlZW4gQ3JlZGl0IGFuZCBNYXJrZXQgUmlzayk6IOKCrDI5MyBiaWxsaW9uLgoK