Introduction

The Diffusion Index is a powerful tool in economic analysis that summarizes the proportion of indicators showing improvement versus decline. In this project, I have constructed a Diffusion Index for the United States using three critical economic variables: the unemployment rate (UNRATE), the industrial production index (INDPRO), and the consumer sentiment index (UMCSENT). These variables provide insights into labor market conditions, production activity, and consumer confidence, making them vital for assessing economic trends.

To evaluate the effectiveness of our Diffusion Index, I compare it to the Chicago Fed National Activity Index: Diffusion Index (CFNAIDIFF), a widely-used measure of economic performance. This comparison includes calculating the correlation coefficient and plotting both indexes side by side to analyze their alignment and trends. The results offer insights into how well our custom index mirrors broader economic activity and what it reveals about the current state of the U.S. economy.

library(plotly)
library(htmlwidgets)
library(tidyverse)
library(quantmod)
library(ggplot2)
library(scales)

start_date <- as.Date("2000-01-01")
end_date <- as.Date("2024-10-01")

getSymbols(c("UNRATE", "INDPRO", "UMCSENT"), src = "FRED", from = start_date, to = end_date)
data <- data.frame(
  date = index(UNRATE),
  unemployment = coredata(UNRATE),
  industrial_production = coredata(INDPRO),
  consumer_sentiment = coredata(UMCSENT)
)

data <- na.omit(data)

Methods

To create the Diffusion Index, I selected three key economic variables from the U.S. economy: the unemployment rate (UNRATE), the industrial production index (INDPRO), and the consumer sentiment index (UMCSENT). These variables were retrieved from the Federal Reserve Economic Data (FRED) platform. Each variable represents critical aspects of economic performance: labor market conditions, industrial activity, and consumer confidence, respectively.

Calculating the Diffusion Index

The Diffusion Index was constructed by analyzing the month-over-month changes in each variable. Specifically: - A positive change in INDPRO or UMCSENT was marked as an improvement, while a negative change indicated a decline. - For UNRATE, a decrease was considered an improvement since lower unemployment signals economic strength.

For each period, the proportion of improving variables was calculated and scaled to a percentage (0–100), with the formula:

\[ \text{Diffusion Index} = \frac{\text{Number of Improving Variables}}{\text{Total Variables}} \times 100 \]

data <- data %>%
  mutate(
    unem_change = c(0, diff(UNRATE)) < 0,
    ip_change = c(0, diff(INDPRO)) > 0,
    cs_change = c(0, diff(UMCSENT)) > 0
  )

data <- data %>%
  mutate(
    diffusion_index = rowMeans(select(., unem_change, ip_change, cs_change), na.rm = TRUE) * 100
  )

To smooth out short-term fluctuations, I computed a 6-month moving average of the Diffusion Index.

Comparison with CFNAIDIFF

To evaluate the effectiveness of the custom Diffusion Index, I compared it to the Chicago Fed National Activity Index: Diffusion Index (CFNAIDIFF), a widely recognized measure of economic activity. The comparison involved: 1. Calculating the Pearson correlation coefficient to quantify the alignment between the two indices.

[1] "CFNAIDIFF"
[1] "Correlation coefficient: 0.41"
[1] "Correlation coefficient with smooth data: 0.41"
  1. Visualizing both series side by side using ggplot2 to assess trends and divergences.

Results

Correlation Between Diffusion Index and CFNAIDIFF

The custom Diffusion Index, calculated using three key economic variables (unemployment rate, industrial production, and consumer sentiment), shows a moderate positive correlation with the Chicago Fed National Activity Index: Diffusion Index (CFNAIDIFF). The calculated correlation coefficient is approximately 0.41, indicating that while the two indices align in some trends, they are not perfectly synchronized.

This correlation suggests that the custom Diffusion Index captures important elements of broader economic activity but is less comprehensive than CFNAIDIFF, which incorporates a larger number of indicators. The moderate correlation highlights the validity of the custom index as a simpler, more focused measure of economic activity while acknowledging that some nuances captured by CFNAIDIFF may not be fully represented.

Downward Trend Observed

The plot reveals a clear downward trend in both the custom Diffusion Index and CFNAIDIFF in recent months. This decline is particularly noticeable in the 6-month moving average of the custom Diffusion Index (blue line) and aligns with the CFNAIDIFF (red line). This suggests a weakening in economic momentum as fewer variables are showing consistent improvement.

Key observations about the downward trend include:

  1. Post-2022 Performance:
    • Following the post-pandemic recovery in 2020 and 2021, both indices show a gradual weakening trend starting in late 2022, suggesting reduced economic growth or a potential cooling phase in the economy.
  2. Magnitude of the Decline:
    • The raw Diffusion Index (green line) shows greater volatility, while the smoother (blue line) provides a clearer picture of sustained decline. The CFNAIDIFF also mirrors this downward movement, reinforcing the likelihood of a broad-based slowdown.
  3. Economic Implications:
    • This downward trend may reflect challenges such as slowing industrial production, cooling consumer sentiment, and persistent uncertainties in labor market conditions. The alignment of both indices during this period strengthens the argument for a potential deceleration in economic activity.

Overall Findings

The custom Diffusion Index effectively tracks major trends in CFNAIDIFF, particularly during significant economic turning points. The observed downward trend in recent months signals that economic activity may be losing momentum, with fewer indicators showing improvement. While the correlation of 0.41 highlights that the custom index is not a perfect substitute for CFNAIDIFF, it remains a useful tool for tracking broad economic dynamics.

LS0tCnRpdGxlOiAiRGlmZnVzaW9uIEluZGV4IEFuYWx5c2lzIEVDT042NjM1LTAxIgpzdWJ0aXRsZTogIlVuaXZlcnNpdHkgb2YgTmV3IEhhdmVuIC0gUG9tcGVhIFNjaG9vbCBvZiBCdXNpbmVzcyIKYXV0aG9yOiAiTmFnYSBTYWkgUHJhc2FudGggRGl2dmVsYSAoMDA4NzY1ODMpIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBJbnRyb2R1Y3Rpb24KClRoZSBEaWZmdXNpb24gSW5kZXggaXMgYSBwb3dlcmZ1bCB0b29sIGluIGVjb25vbWljIGFuYWx5c2lzIHRoYXQgc3VtbWFyaXplcyB0aGUgcHJvcG9ydGlvbiBvZiBpbmRpY2F0b3JzIHNob3dpbmcgaW1wcm92ZW1lbnQgdmVyc3VzIGRlY2xpbmUuIEluIHRoaXMgcHJvamVjdCwgSSBoYXZlIGNvbnN0cnVjdGVkIGEgRGlmZnVzaW9uIEluZGV4IGZvciB0aGUgVW5pdGVkIFN0YXRlcyB1c2luZyB0aHJlZSBjcml0aWNhbCBlY29ub21pYyB2YXJpYWJsZXM6IHRoZSB1bmVtcGxveW1lbnQgcmF0ZSAoVU5SQVRFKSwgdGhlIGluZHVzdHJpYWwgcHJvZHVjdGlvbiBpbmRleCAoSU5EUFJPKSwgYW5kIHRoZSBjb25zdW1lciBzZW50aW1lbnQgaW5kZXggKFVNQ1NFTlQpLiBUaGVzZSB2YXJpYWJsZXMgcHJvdmlkZSBpbnNpZ2h0cyBpbnRvIGxhYm9yIG1hcmtldCBjb25kaXRpb25zLCBwcm9kdWN0aW9uIGFjdGl2aXR5LCBhbmQgY29uc3VtZXIgY29uZmlkZW5jZSwgbWFraW5nIHRoZW0gdml0YWwgZm9yIGFzc2Vzc2luZyBlY29ub21pYyB0cmVuZHMuCgpUbyBldmFsdWF0ZSB0aGUgZWZmZWN0aXZlbmVzcyBvZiBvdXIgRGlmZnVzaW9uIEluZGV4LCBJIGNvbXBhcmUgaXQgdG8gdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IEluZGV4OiBEaWZmdXNpb24gSW5kZXggKENGTkFJRElGRiksIGEgd2lkZWx5LXVzZWQgbWVhc3VyZSBvZiBlY29ub21pYyBwZXJmb3JtYW5jZS4gVGhpcyBjb21wYXJpc29uIGluY2x1ZGVzIGNhbGN1bGF0aW5nIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBhbmQgcGxvdHRpbmcgYm90aCBpbmRleGVzIHNpZGUgYnkgc2lkZSB0byBhbmFseXplIHRoZWlyIGFsaWdubWVudCBhbmQgdHJlbmRzLiBUaGUgcmVzdWx0cyBvZmZlciBpbnNpZ2h0cyBpbnRvIGhvdyB3ZWxsIG91ciBjdXN0b20gaW5kZXggbWlycm9ycyBicm9hZGVyIGVjb25vbWljIGFjdGl2aXR5IGFuZCB3aGF0IGl0IHJldmVhbHMgYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFUuUy4gZWNvbm9teS4KCmBgYHtyIERhdGEtcHJlcGFyYXRpb24sIGVjaG89VFJVRSwgcmVzdWx0cz0naGlkZSd9CmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGh0bWx3aWRnZXRzKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShxdWFudG1vZCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHNjYWxlcykKCnN0YXJ0X2RhdGUgPC0gYXMuRGF0ZSgiMjAwMC0wMS0wMSIpCmVuZF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMTAtMDEiKQoKZ2V0U3ltYm9scyhjKCJVTlJBVEUiLCAiSU5EUFJPIiwgIlVNQ1NFTlQiKSwgc3JjID0gIkZSRUQiLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCmRhdGEgPC0gZGF0YS5mcmFtZSgKICBkYXRlID0gaW5kZXgoVU5SQVRFKSwKICB1bmVtcGxveW1lbnQgPSBjb3JlZGF0YShVTlJBVEUpLAogIGluZHVzdHJpYWxfcHJvZHVjdGlvbiA9IGNvcmVkYXRhKElORFBSTyksCiAgY29uc3VtZXJfc2VudGltZW50ID0gY29yZWRhdGEoVU1DU0VOVCkKKQoKZGF0YSA8LSBuYS5vbWl0KGRhdGEpCgpgYGAKCgojIyBNZXRob2RzCgpUbyBjcmVhdGUgdGhlIERpZmZ1c2lvbiBJbmRleCwgSSBzZWxlY3RlZCB0aHJlZSBrZXkgZWNvbm9taWMgdmFyaWFibGVzIGZyb20gdGhlIFUuUy4gZWNvbm9teTogdGhlIHVuZW1wbG95bWVudCByYXRlIChVTlJBVEUpLCB0aGUgaW5kdXN0cmlhbCBwcm9kdWN0aW9uIGluZGV4IChJTkRQUk8pLCBhbmQgdGhlIGNvbnN1bWVyIHNlbnRpbWVudCBpbmRleCAoVU1DU0VOVCkuIFRoZXNlIHZhcmlhYmxlcyB3ZXJlIHJldHJpZXZlZCBmcm9tIHRoZSBGZWRlcmFsIFJlc2VydmUgRWNvbm9taWMgRGF0YSAoRlJFRCkgcGxhdGZvcm0uIEVhY2ggdmFyaWFibGUgcmVwcmVzZW50cyBjcml0aWNhbCBhc3BlY3RzIG9mIGVjb25vbWljIHBlcmZvcm1hbmNlOiBsYWJvciBtYXJrZXQgY29uZGl0aW9ucywgaW5kdXN0cmlhbCBhY3Rpdml0eSwgYW5kIGNvbnN1bWVyIGNvbmZpZGVuY2UsIHJlc3BlY3RpdmVseS4KCiMjIyBDYWxjdWxhdGluZyB0aGUgRGlmZnVzaW9uIEluZGV4ClRoZSBEaWZmdXNpb24gSW5kZXggd2FzIGNvbnN0cnVjdGVkIGJ5IGFuYWx5emluZyB0aGUgbW9udGgtb3Zlci1tb250aCBjaGFuZ2VzIGluIGVhY2ggdmFyaWFibGUuIFNwZWNpZmljYWxseToKLSBBIHBvc2l0aXZlIGNoYW5nZSBpbiAqKklORFBSTyoqIG9yICoqVU1DU0VOVCoqIHdhcyBtYXJrZWQgYXMgYW4gaW1wcm92ZW1lbnQsIHdoaWxlIGEgbmVnYXRpdmUgY2hhbmdlIGluZGljYXRlZCBhIGRlY2xpbmUuCi0gRm9yICoqVU5SQVRFKiosIGEgZGVjcmVhc2Ugd2FzIGNvbnNpZGVyZWQgYW4gaW1wcm92ZW1lbnQgc2luY2UgbG93ZXIgdW5lbXBsb3ltZW50IHNpZ25hbHMgZWNvbm9taWMgc3RyZW5ndGguCgpGb3IgZWFjaCBwZXJpb2QsIHRoZSBwcm9wb3J0aW9uIG9mIGltcHJvdmluZyB2YXJpYWJsZXMgd2FzIGNhbGN1bGF0ZWQgYW5kIHNjYWxlZCB0byBhIHBlcmNlbnRhZ2UgKDDigJMxMDApLCB3aXRoIHRoZSBmb3JtdWxhOgoKXFsKXHRleHR7RGlmZnVzaW9uIEluZGV4fSA9IFxmcmFje1x0ZXh0e051bWJlciBvZiBJbXByb3ZpbmcgVmFyaWFibGVzfX17XHRleHR7VG90YWwgVmFyaWFibGVzfX0gXHRpbWVzIDEwMApcXQpgYGB7cn0KZGF0YSA8LSBkYXRhICU+JQogIG11dGF0ZSgKICAgIHVuZW1fY2hhbmdlID0gYygwLCBkaWZmKFVOUkFURSkpIDwgMCwKICAgIGlwX2NoYW5nZSA9IGMoMCwgZGlmZihJTkRQUk8pKSA+IDAsCiAgICBjc19jaGFuZ2UgPSBjKDAsIGRpZmYoVU1DU0VOVCkpID4gMAogICkKCmRhdGEgPC0gZGF0YSAlPiUKICBtdXRhdGUoCiAgICBkaWZmdXNpb25faW5kZXggPSByb3dNZWFucyhzZWxlY3QoLiwgdW5lbV9jaGFuZ2UsIGlwX2NoYW5nZSwgY3NfY2hhbmdlKSwgbmEucm0gPSBUUlVFKSAqIDEwMAogICkKYGBgCgpUbyBzbW9vdGggb3V0IHNob3J0LXRlcm0gZmx1Y3R1YXRpb25zLCBJIGNvbXB1dGVkIGEgNi1tb250aCBtb3ZpbmcgYXZlcmFnZSBvZiB0aGUgRGlmZnVzaW9uIEluZGV4LgoKCmBgYHtyIGludGVyYWN0aXZlLXBsb3QsIGVjaG89RkFMU0V9CmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHpvbykKCnBsb3RfZGF0YSA8LSBkYXRhICU+JQogIGFycmFuZ2UoZGF0ZSkgJT4lCiAgbXV0YXRlKG1vdmluZ19hdmVyYWdlID0gem9vOjpyb2xsbWVhbihkaWZmdXNpb25faW5kZXgsIGsgPSA2LCBmaWxsID0gTkEsIGFsaWduID0gInJpZ2h0IikpCgpwbG90bHlfb2JqZWN0IDwtIHBsb3RfbHkocGxvdF9kYXRhLCB4ID0gfmRhdGUpICU+JQogIGFkZF9saW5lcyh5ID0gfmRpZmZ1c2lvbl9pbmRleCwgbmFtZSA9ICJSYXcgRGlmZnVzaW9uIEluZGV4IiwgbGluZSA9IGxpc3QoY29sb3IgPSAibGlnaHRncmVlbiIpKSAlPiUKICBhZGRfbGluZXMoeSA9IH5tb3ZpbmdfYXZlcmFnZSwgbmFtZSA9ICI2LU1vbnRoIE1vdmluZyBBdmVyYWdlIiwgbGluZSA9IGxpc3QoY29sb3IgPSAiYmx1ZSIpKSAlPiUKICBhZGRfbGluZXMoeSA9IDAsIG5hbWUgPSAiQmFzZWxpbmUgKDApIiwgbGluZSA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBkYXNoID0gImRhc2giKSkgJT4lCiAgbGF5b3V0KAogICAgdGl0bGUgPSAiQ1QgRWNvbm9taWMgU2NvcmVjYXJkOiBEaWZmdXNpb24gSW5kZXgiLAogICAgeGF4aXMgPSBsaXN0KAogICAgICB0aXRsZSA9ICJEYXRlIiwKICAgICAgcmFuZ2VzbGlkZXIgPSBsaXN0KHZpc2libGUgPSBUUlVFKSAgIyBFbmFibGUgc2xpZGVyIGZvciBkYXRlcwogICAgKSwKICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOZXQgUmlzaW5nICglKSIpLAogICAgbGVnZW5kID0gbGlzdCgKICAgICAgb3JpZW50YXRpb24gPSAiaCIsICAjIEhvcml6b250YWwgbGVnZW5kCiAgICAgIHggPSAwLjUsICAgICAgICAgICAgIyBDZW50ZXJlZCBob3Jpem9udGFsbHkKICAgICAgeSA9IC45NSwgICAgICAgICAgICAjIFBvc2l0aW9uIGFib3ZlIHRoZSBwbG90CiAgICAgIHhhbmNob3IgPSAiY2VudGVyIiwgIyBBbGlnbiB0byB0aGUgY2VudGVyCiAgICAgIHlhbmNob3IgPSAiYm90dG9tIiAgIyBBbGlnbiBib3R0b20gb2YgdGhlIGxlZ2VuZCB0byB0aGUgdG9wIG9mIHRoZSBwbG90CiAgICApCiAgKQoKCnBsb3RseV9vYmplY3QKCmBgYAoKCiMjIyBDb21wYXJpc29uIHdpdGggQ0ZOQUlESUZGClRvIGV2YWx1YXRlIHRoZSBlZmZlY3RpdmVuZXNzIG9mIHRoZSBjdXN0b20gRGlmZnVzaW9uIEluZGV4LCBJIGNvbXBhcmVkIGl0IHRvIHRoZSBDaGljYWdvIEZlZCBOYXRpb25hbCBBY3Rpdml0eSBJbmRleDogRGlmZnVzaW9uIEluZGV4IChDRk5BSURJRkYpLCBhIHdpZGVseSByZWNvZ25pemVkIG1lYXN1cmUgb2YgZWNvbm9taWMgYWN0aXZpdHkuIFRoZSBjb21wYXJpc29uIGludm9sdmVkOgoxLiBDYWxjdWxhdGluZyB0aGUgKipQZWFyc29uIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50KiogdG8gcXVhbnRpZnkgdGhlIGFsaWdubWVudCBiZXR3ZWVuIHRoZSB0d28gaW5kaWNlcy4KCmBgYHtyLCBlY2hvPUZBTFNFfQoKZ2V0U3ltYm9scygiQ0ZOQUlESUZGIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKY2ZuYWlkaWZmIDwtIGRhdGEuZnJhbWUoCiAgZGF0ZSA9IGluZGV4KENGTkFJRElGRiksCiAgY2ZuYWlkaWZmID0gY29yZWRhdGEoQ0ZOQUlESUZGKQopCgpmaW5hbF9kYXRhIDwtIG1lcmdlKGRhdGEsIGNmbmFpZGlmZiwgYnkgPSAiZGF0ZSIpCgpmaW5hbF9kYXRhIDwtIGZpbmFsX2RhdGEgJT4lCiAgZmlsdGVyKCFpcy5uYSh1bmVtX2NoYW5nZSkgJiAhaXMubmEoaXBfY2hhbmdlKSAmICFpcy5uYShjc19jaGFuZ2UpKQoKcGxvdF9kYXRhIDwtIGZpbmFsX2RhdGEgJT4lCiAgYXJyYW5nZShkYXRlKSAlPiUKICBtdXRhdGUobW92aW5nX2F2ZXJhZ2UgPSB6b286OnJvbGxtZWFuKGRpZmZ1c2lvbl9pbmRleCwgayA9IDYsIGZpbGwgPSBOQSwgYWxpZ24gPSAicmlnaHQiKSkKCmNvcnJlbGF0aW9uIDwtIGNvcihmaW5hbF9kYXRhJGRpZmZ1c2lvbl9pbmRleCwgZmluYWxfZGF0YSRDRk5BSURJRkYsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQoKY29ycmVsYXRpb25fc21vb3RoIDwtY29yKHBsb3RfZGF0YSRtb3ZpbmdfYXZlcmFnZSwgcGxvdF9kYXRhJENGTkFJRElGRiwgdXNlID0gImNvbXBsZXRlLm9icyIpCnByaW50KHBhc3RlKCJDb3JyZWxhdGlvbiBjb2VmZmljaWVudDoiLCByb3VuZChjb3JyZWxhdGlvbiwgMikpKQpwcmludChwYXN0ZSgiQ29ycmVsYXRpb24gY29lZmZpY2llbnQgd2l0aCBzbW9vdGggZGF0YToiLCByb3VuZChjb3JyZWxhdGlvbiwgMikpKQpgYGAKMi4gVmlzdWFsaXppbmcgYm90aCBzZXJpZXMgc2lkZSBieSBzaWRlIHVzaW5nIGBnZ3Bsb3QyYCB0byBhc3Nlc3MgdHJlbmRzIGFuZCBkaXZlcmdlbmNlcy4KYGBge3IgZWNobz1GQUxTRX0KaW50ZXJhY3RpdmVfcGxvdCA8LSBwbG90X2x5KCkgJT4lCiAgIyBQbG90IERpZmZ1c2lvbiBJbmRleCAobGVmdCB5LWF4aXMpCiAgYWRkX2xpbmVzKAogICAgZGF0YSA9IHBsb3RfZGF0YSwKICAgIHggPSB+ZGF0ZSwKICAgIHkgPSB+ZGlmZnVzaW9uX2luZGV4LAogICAgbmFtZSA9ICJEaWZmdXNpb24gSW5kZXgiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAibGlnaHRncmVlbiIsIHdpZHRoID0gMiksCiAgICB5YXhpcyA9ICJ5IiAgIyBBc3NpZ24gdG8gdGhlIHByaW1hcnkgeS1heGlzCiAgKSAlPiUKICAjIEFkZCBzbW9vdGhlciBmb3IgRGlmZnVzaW9uIEluZGV4IChsZWZ0IHktYXhpcykKICBhZGRfbGluZXMoCiAgICBkYXRhID0gcGxvdF9kYXRhLAogICAgeCA9IH5kYXRlLAogICAgeSA9IH5tb3ZpbmdfYXZlcmFnZSwKICAgIG5hbWUgPSAiRGlmZnVzaW9uIEluZGV4IFNtb290aGVyIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImJsdWUiLCB3aWR0aCA9IDIsIGRhc2ggPSAic29saWQiKSwKICAgIHlheGlzID0gInkiICAjIEFzc2lnbiB0byB0aGUgcHJpbWFyeSB5LWF4aXMKICApICU+JQogICMgUGxvdCBDRk5BSURJRkYgb24gdGhlIHNlY29uZGFyeSB5LWF4aXMgKHJpZ2h0KQogIGFkZF9saW5lcygKICAgIGRhdGEgPSBwbG90X2RhdGEsCiAgICB4ID0gfmRhdGUsCiAgICB5ID0gfkNGTkFJRElGRiwKICAgIG5hbWUgPSAiQ0ZOQUlESUZGIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJlZCIsIHdpZHRoID0gMiksCiAgICB5YXhpcyA9ICJ5MiIgICMgQXNzaWduIHRvIHRoZSBzZWNvbmRhcnkgeS1heGlzCiAgKSAlPiUKICAjIExheW91dCB3aXRoIHR3byB5LWF4ZXMKICBsYXlvdXQoCiAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICJEaWZmdXNpb24gSW5kZXggdnMgQ0ZOQUlESUZGIiksCiAgICB4YXhpcyA9IGxpc3QoCiAgICAgIHRpdGxlID0gIkRhdGUiLAogICAgICByYW5nZXNsaWRlciA9IGxpc3QodmlzaWJsZSA9IFRSVUUpICAjIEFkZCBzbGlkZXIgdG8gc2VsZWN0IGRhdGUgcmFuZ2UKICAgICksCiAgICB5YXhpcyA9IGxpc3QoCiAgICAgIHRpdGxlID0gIkRpZmZ1c2lvbiBJbmRleCAoMC0xMDApIiwKICAgICAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gImxpZ2h0Z3JlZW4iKSwKICAgICAgc2hvd2dyaWQgPSBUUlVFCiAgICApLAogICAgeWF4aXMyID0gbGlzdCgKICAgICAgdGl0bGUgPSAiQ0ZOQUlESUZGICgtMSB0byAxKSIsCiAgICAgIG92ZXJsYXlpbmcgPSAieSIsICAjIE92ZXJsYXkgb24gdGhlIHNhbWUgY2hhcnQKICAgICAgc2lkZSA9ICJyaWdodCIsICAgICMgUGxhY2Ugb24gdGhlIHJpZ2h0IHNpZGUKICAgICAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gInJlZCIpLAogICAgICBzaG93Z3JpZCA9IEZBTFNFCiAgICApLAogICAgbGVnZW5kID0gbGlzdCgKICAgICAgb3JpZW50YXRpb24gPSAiaCIsICAjIEhvcml6b250YWwgbGVnZW5kCiAgICAgIHggPSAwLjUsICAgICAgICAgICAgIyBDZW50ZXJlZCBob3Jpem9udGFsbHkKICAgICAgeSA9IC45NSwgICAgICAgICAgICAjIFBvc2l0aW9uIGFib3ZlIHRoZSBwbG90CiAgICAgIHhhbmNob3IgPSAiY2VudGVyIiwgIyBBbGlnbiB0byB0aGUgY2VudGVyCiAgICAgIHlhbmNob3IgPSAiYm90dG9tIiAgIyBBbGlnbiBib3R0b20gb2YgdGhlIGxlZ2VuZCB0byB0aGUgdG9wIG9mIHRoZSBwbG90CiAgICApCiAgKQoKIyBEaXNwbGF5IHRoZSBpbnRlcmFjdGl2ZSBwbG90CmludGVyYWN0aXZlX3Bsb3QKYGBgCiMjIFJlc3VsdHMKCiMjIyBDb3JyZWxhdGlvbiBCZXR3ZWVuIERpZmZ1c2lvbiBJbmRleCBhbmQgQ0ZOQUlESUZGClRoZSBjdXN0b20gRGlmZnVzaW9uIEluZGV4LCBjYWxjdWxhdGVkIHVzaW5nIHRocmVlIGtleSBlY29ub21pYyB2YXJpYWJsZXMgKHVuZW1wbG95bWVudCByYXRlLCBpbmR1c3RyaWFsIHByb2R1Y3Rpb24sIGFuZCBjb25zdW1lciBzZW50aW1lbnQpLCBzaG93cyBhIG1vZGVyYXRlIHBvc2l0aXZlIGNvcnJlbGF0aW9uIHdpdGggdGhlIENoaWNhZ28gRmVkIE5hdGlvbmFsIEFjdGl2aXR5IEluZGV4OiBEaWZmdXNpb24gSW5kZXggKENGTkFJRElGRikuIFRoZSBjYWxjdWxhdGVkIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGlzIGFwcHJveGltYXRlbHkgKiowLjQxKiosIGluZGljYXRpbmcgdGhhdCB3aGlsZSB0aGUgdHdvIGluZGljZXMgYWxpZ24gaW4gc29tZSB0cmVuZHMsIHRoZXkgYXJlIG5vdCBwZXJmZWN0bHkgc3luY2hyb25pemVkLgoKVGhpcyBjb3JyZWxhdGlvbiBzdWdnZXN0cyB0aGF0IHRoZSBjdXN0b20gRGlmZnVzaW9uIEluZGV4IGNhcHR1cmVzIGltcG9ydGFudCBlbGVtZW50cyBvZiBicm9hZGVyIGVjb25vbWljIGFjdGl2aXR5IGJ1dCBpcyBsZXNzIGNvbXByZWhlbnNpdmUgdGhhbiBDRk5BSURJRkYsIHdoaWNoIGluY29ycG9yYXRlcyBhIGxhcmdlciBudW1iZXIgb2YgaW5kaWNhdG9ycy4gVGhlIG1vZGVyYXRlIGNvcnJlbGF0aW9uIGhpZ2hsaWdodHMgdGhlIHZhbGlkaXR5IG9mIHRoZSBjdXN0b20gaW5kZXggYXMgYSBzaW1wbGVyLCBtb3JlIGZvY3VzZWQgbWVhc3VyZSBvZiBlY29ub21pYyBhY3Rpdml0eSB3aGlsZSBhY2tub3dsZWRnaW5nIHRoYXQgc29tZSBudWFuY2VzIGNhcHR1cmVkIGJ5IENGTkFJRElGRiBtYXkgbm90IGJlIGZ1bGx5IHJlcHJlc2VudGVkLgoKIyMjIERvd253YXJkIFRyZW5kIE9ic2VydmVkClRoZSBwbG90IHJldmVhbHMgYSBjbGVhciAqKmRvd253YXJkIHRyZW5kKiogaW4gYm90aCB0aGUgY3VzdG9tIERpZmZ1c2lvbiBJbmRleCBhbmQgQ0ZOQUlESUZGIGluIHJlY2VudCBtb250aHMuIFRoaXMgZGVjbGluZSBpcyBwYXJ0aWN1bGFybHkgbm90aWNlYWJsZSBpbiB0aGUgNi1tb250aCBtb3ZpbmcgYXZlcmFnZSBvZiB0aGUgY3VzdG9tIERpZmZ1c2lvbiBJbmRleCAoYmx1ZSBsaW5lKSBhbmQgYWxpZ25zIHdpdGggdGhlIENGTkFJRElGRiAocmVkIGxpbmUpLiBUaGlzIHN1Z2dlc3RzIGEgd2Vha2VuaW5nIGluIGVjb25vbWljIG1vbWVudHVtIGFzIGZld2VyIHZhcmlhYmxlcyBhcmUgc2hvd2luZyBjb25zaXN0ZW50IGltcHJvdmVtZW50LgoKIyMjIyBLZXkgb2JzZXJ2YXRpb25zIGFib3V0IHRoZSBkb3dud2FyZCB0cmVuZCBpbmNsdWRlOgoxLiAqKlBvc3QtMjAyMiBQZXJmb3JtYW5jZToqKgogICAtIEZvbGxvd2luZyB0aGUgcG9zdC1wYW5kZW1pYyByZWNvdmVyeSBpbiAyMDIwIGFuZCAyMDIxLCBib3RoIGluZGljZXMgc2hvdyBhIGdyYWR1YWwgd2Vha2VuaW5nIHRyZW5kIHN0YXJ0aW5nIGluIGxhdGUgMjAyMiwgc3VnZ2VzdGluZyByZWR1Y2VkIGVjb25vbWljIGdyb3d0aCBvciBhIHBvdGVudGlhbCBjb29saW5nIHBoYXNlIGluIHRoZSBlY29ub215LgoKMi4gKipNYWduaXR1ZGUgb2YgdGhlIERlY2xpbmU6KioKICAgLSBUaGUgcmF3IERpZmZ1c2lvbiBJbmRleCAoZ3JlZW4gbGluZSkgc2hvd3MgZ3JlYXRlciB2b2xhdGlsaXR5LCB3aGlsZSB0aGUgc21vb3RoZXIgKGJsdWUgbGluZSkgcHJvdmlkZXMgYSBjbGVhcmVyIHBpY3R1cmUgb2Ygc3VzdGFpbmVkIGRlY2xpbmUuIFRoZSBDRk5BSURJRkYgYWxzbyBtaXJyb3JzIHRoaXMgZG93bndhcmQgbW92ZW1lbnQsIHJlaW5mb3JjaW5nIHRoZSBsaWtlbGlob29kIG9mIGEgYnJvYWQtYmFzZWQgc2xvd2Rvd24uCgozLiAqKkVjb25vbWljIEltcGxpY2F0aW9uczoqKgogICAtIFRoaXMgZG93bndhcmQgdHJlbmQgbWF5IHJlZmxlY3QgY2hhbGxlbmdlcyBzdWNoIGFzIHNsb3dpbmcgaW5kdXN0cmlhbCBwcm9kdWN0aW9uLCBjb29saW5nIGNvbnN1bWVyIHNlbnRpbWVudCwgYW5kIHBlcnNpc3RlbnQgdW5jZXJ0YWludGllcyBpbiBsYWJvciBtYXJrZXQgY29uZGl0aW9ucy4gVGhlIGFsaWdubWVudCBvZiBib3RoIGluZGljZXMgZHVyaW5nIHRoaXMgcGVyaW9kIHN0cmVuZ3RoZW5zIHRoZSBhcmd1bWVudCBmb3IgYSBwb3RlbnRpYWwgZGVjZWxlcmF0aW9uIGluIGVjb25vbWljIGFjdGl2aXR5LgoKIyMjIE92ZXJhbGwgRmluZGluZ3MKVGhlIGN1c3RvbSBEaWZmdXNpb24gSW5kZXggZWZmZWN0aXZlbHkgdHJhY2tzIG1ham9yIHRyZW5kcyBpbiBDRk5BSURJRkYsIHBhcnRpY3VsYXJseSBkdXJpbmcgc2lnbmlmaWNhbnQgZWNvbm9taWMgdHVybmluZyBwb2ludHMuIFRoZSBvYnNlcnZlZCBkb3dud2FyZCB0cmVuZCBpbiByZWNlbnQgbW9udGhzIHNpZ25hbHMgdGhhdCBlY29ub21pYyBhY3Rpdml0eSBtYXkgYmUgbG9zaW5nIG1vbWVudHVtLCB3aXRoIGZld2VyIGluZGljYXRvcnMgc2hvd2luZyBpbXByb3ZlbWVudC4gV2hpbGUgdGhlIGNvcnJlbGF0aW9uIG9mIDAuNDEgaGlnaGxpZ2h0cyB0aGF0IHRoZSBjdXN0b20gaW5kZXggaXMgbm90IGEgcGVyZmVjdCBzdWJzdGl0dXRlIGZvciBDRk5BSURJRkYsIGl0IHJlbWFpbnMgYSB1c2VmdWwgdG9vbCBmb3IgdHJhY2tpbmcgYnJvYWQgZWNvbm9taWMgZHluYW1pY3MuCgoK