library(tidyverse); library(arrow); library(gt); library(ggrepel); library(scales)
library(cfbfastR)
options(cfb.lib_only = TRUE)
source("../R/02_team_game_metrics.R")
source("../R/04_storyline_engine.R")
source("../R/05_viz_style.R")

TEAM <- "Syracuse"; OPP <- "North Carolina"
SEASON <- params$season; WEEK <- params$week
FIG_DIR <- sprintf("figures/%d_wk%02d_story", SEASON, WEEK)
SCOPE   <- sprintf("%d Week %d | %s at %s (OT)", SEASON, WEEK, TEAM, OPP)
cur <- read_parquet("~/cfb-data/processed/team_game_metrics_2026.parquet")
fbs <- readRDS("~/cfb-data/fbs_teams_2026.rds")

su    <- cur |> filter(team == TEAM) |> arrange(week)
su8   <- su |> filter(week == WEEK)
peers <- cur |> filter(team %in% fbs, !low_volume, is_fbs_matchup, week == WEEK)

pr <- function(col, hb = TRUE) {
  v <- peers[[col]]
  as.integer(round(rank(if (hb) -v else v, na.last = "keep")[peers$team == TEAM]))
}
n_peers <- nrow(peers)

sched <- suppressWarnings(cfbd_game_info(SEASON, team = TEAM)) |>
  filter(!is.na(home_points)) |> arrange(week) |>
  mutate(opp    = ifelse(home_team == TEAM, away_team, home_team),
         su_pts = ifelse(home_team == TEAM, home_points, away_points),
         op_pts = ifelse(home_team == TEAM, away_points, home_points),
         margin = su_pts - op_pts,
         one_score = abs(margin) <= 8,
         label  = sprintf("Wk %d %s", week, opp))

Exhibit 1 — The best offensive game of the season

off <- su |>
  left_join(sched |> select(week, opp, margin), by = "week") |>
  mutate(is_wk8 = week == WEEK,
         lab = sprintf("wk%d\n%s", week, opp))

p_off <- ggplot(off, aes(week, off_epa_play)) +
  geom_hline(yintercept = 0, color = SU$muted, linewidth = 0.4) +
  geom_line(color = SU$orange, linewidth = 1) +
  geom_point(aes(size = is_wk8), color = SU$orange) +
  geom_text_repel(data = filter(off, is_wk8),
                  aes(label = sprintf("%s\n%+.3f — %s of %d",
                                      opp, off_epa_play,
                                      scales::ordinal(pr("off_epa_play")), n_peers)),
                  nudge_y = 0.07, size = 3.5, fontface = "bold",
                  segment.color = NA, lineheight = 0.95, force = 0) +
  scale_size_manual(values = c(`FALSE` = 2.4, `TRUE` = 4.4), guide = "none") +
  scale_x_continuous(breaks = off$week, labels = off$lab) +
  labs(
    title = sprintf("%s's offense has climbed all season, and peaked against %s", TEAM, OPP),
    subtitle = sprintf(
      "EPA per play by game | Week 2 low of %+.3f to a season high of %+.3f | Week 1 came against an FCS opponent",
      min(off$off_epa_play), max(off$off_epa_play)),
    x = NULL, y = "Offensive EPA per play",
    caption = su_caption("2026 season to date")
  ) +
  theme_su(legend_pos = "none") +
  theme(axis.text.x = element_text(size = 7.5))

save_fig(p_off, "01_offense_season_arc", height = 5)

tibble::tibble(
  Metric = c("Net EPA per play", "Offensive EPA per play", "Rushing EPA per play",
             "Passing EPA per play", "Standard-downs success rate",
             "Points per scoring opportunity"),
  Value = c(su8$net_epa_play, su8$off_epa_play, su8$off_epa_rush,
            su8$off_epa_pass, su8$off_sr_standard, su8$off_pts_per_opp),
  Rank = c(sprintf("%s of %d", scales::ordinal(pr("net_epa_play")), n_peers),
           sprintf("%s of %d", scales::ordinal(pr("off_epa_play")), n_peers),
           sprintf("%s of %d", scales::ordinal(pr("off_epa_rush")), n_peers),
           sprintf("%s of %d", scales::ordinal(pr("off_epa_pass")), n_peers),
           sprintf("%s of %d", scales::ordinal(pr("off_sr_standard")), n_peers),
           sprintf("%s of %d", scales::ordinal(pr("off_pts_per_opp")), n_peers))
) |>
  gt() |>
  tab_header(
    title = md(sprintf("**%s was the seventh-most efficient team in the country on Saturday**", TEAM)),
    subtitle = md("Week 8 ranks among FBS teams that played FBS opponents")
  ) |>
  fmt_number(columns = Value, decimals = 3) |>
  cols_align("center", columns = -Metric) |>
  tab_style(style = cell_text(weight = "bold"), locations = cells_body(columns = Metric)) |>
  tab_style(style = list(cell_fill(color = "#FFF3E6"), cell_text(weight = "bold")),
            locations = cells_body(rows = Metric == "Net EPA per play")) |>
  tab_source_note(md(paste0("**", su_caption(SCOPE), "**"))) |>
  gt_theme_su()
Syracuse was the seventh-most efficient team in the country on Saturday
Week 8 ranks among FBS teams that played FBS opponents
Metric Value Rank
Net EPA per play 0.258 7th of 112
Offensive EPA per play 0.232 19th of 112
Rushing EPA per play 0.271 15th of 112
Passing EPA per play 0.178 27th of 112
Standard-downs success rate 0.550 21st of 112
Points per scoring opportunity 4.800 28th of 112
Data: CollegeFootballData via cfbfastR | 2026 Week 8 | Syracuse at North Carolina (OT)

Exhibit 2 — The defense bent all afternoon

tibble::tibble(
  Metric = c("Success rate allowed", "Havoc rate", "EPA allowed per play",
             "Opponent scoring opportunities", "Points allowed per opportunity"),
  Value = c(su8$def_success_rate, su8$def_havoc_core, su8$def_epa_play,
            su8$def_scoring_opps, su8$def_pts_per_opp),
  Rank = c(sprintf("%s of %d", scales::ordinal(pr("def_success_rate", FALSE)), n_peers),
           sprintf("%s of %d", scales::ordinal(pr("def_havoc_core")), n_peers),
           sprintf("%s of %d", scales::ordinal(pr("def_epa_play", FALSE)), n_peers),
           "—", "—")
) |>
  gt() |>
  tab_header(
    title = md("**North Carolina moved the ball at will and was held to four field goals**"),
    subtitle = md(sprintf(
      "UNC reached scoring range %d times to Syracuse's %d, and scored %.2f points per trip",
      su8$def_scoring_opps, su8$off_scoring_opps, su8$def_pts_per_opp))
  ) |>
  fmt_number(columns = Value, decimals = 3) |>
  cols_align("center", columns = -Metric) |>
  tab_style(style = cell_text(weight = "bold"), locations = cells_body(columns = Metric)) |>
  tab_style(style = list(cell_fill(color = "#FFF3E6"), cell_text(weight = "bold")),
            locations = cells_body(rows = Metric %in%
                                     c("Success rate allowed", "Havoc rate"))) |>
  tab_source_note(md(paste0("**", su_caption(SCOPE),
    "** — EPA allowed ranked mid-pack because Syracuse forced field goals; ",
    "success rate allowed is the truer measure of how easily UNC moved."))) |>
  gt_theme_su()
North Carolina moved the ball at will and was held to four field goals
UNC reached scoring range 8 times to Syracuse’s 5, and scored 3.75 points per trip
Metric Value Rank
Success rate allowed 0.464 84th of 112
Havoc rate 0.029 82nd of 112
EPA allowed per play −0.027 48th of 112
Opponent scoring opportunities 8.000 —
Points allowed per opportunity 3.750 —
Data: CollegeFootballData via cfbfastR | 2026 Week 8 | Syracuse at North Carolina (OT) — EPA allowed ranked mid-pack because Syracuse forced field goals; success rate allowed is the truer measure of how easily UNC moved.

Success rate allowed has now sat between .440 and .473 in every game since Week 3 — the one part of this team that has not changed all season.

Exhibit 3 — Five one-score games in seven

m <- sched |>
  mutate(lab = sprintf("Wk %d  %s", week, opp),
         lab = factor(lab, levels = rev(lab)),
         outcome = ifelse(margin > 0, "Win", "Loss"))

p_margin <- ggplot(m, aes(x = margin, y = lab)) +
  # NOTE: y here is a discrete factor, so any annotation must use -Inf/Inf or a
  # real factor level -- a numeric y breaks continuous-scale training.
  annotate("rect", xmin = -8, xmax = 8, ymin = -Inf, ymax = Inf,
           fill = SU$orange, alpha = 0.08) +
  geom_vline(xintercept = 0, color = SU$muted, linewidth = 0.5) +
  geom_segment(aes(x = 0, xend = margin, yend = lab, color = outcome),
               linewidth = 1.6) +
  geom_point(aes(color = outcome), size = 3.4) +
  geom_text(aes(label = sprintf("%+d", margin),
                hjust = ifelse(margin > 0, -0.45, 1.45)),
            size = 3.3, fontface = "bold", color = SU$ink) +
  scale_color_manual(values = c(Win = SU$orange, Loss = SU$blue), name = NULL) +
  scale_x_continuous(expand = expansion(mult = c(0.14, 0.14))) +
  labs(
    title = sprintf("%d of Syracuse's 7 games have been decided by one score",
                    sum(sched$one_score)),
    subtitle = sprintf(
      "Final margin by game | Shaded band: within 8 points | Syracuse is %d-%d in those games, and %d-%d overall",
      sum(sched$one_score & sched$margin > 0), sum(sched$one_score & sched$margin < 0),
      sum(sched$margin > 0), sum(sched$margin < 0)),
    x = "Final margin", y = NULL,
    caption = su_caption("2026 season to date")
  ) +
  theme_su(legend_pos = "top")

save_fig(p_margin, "03_one_score_games", height = 5.5)

Exhibit 4 — Dominant and barely ahead

scores <- bind_rows(
  read_parquet(sprintf("~/cfb-data/raw/pbp_inseason/pbp_%d_wk%02d.parquet", SEASON, WEEK)) |>
    transmute(game_id, team = pos_team, pts = pos_team_score),
  read_parquet(sprintf("~/cfb-data/raw/pbp_inseason/pbp_%d_wk%02d.parquet", SEASON, WEEK)) |>
    transmute(game_id, team = def_pos_team, pts = def_pos_team_score)
) |>
  filter(!is.na(team), !is.na(pts), pts >= 0, pts <= 100) |>
  group_by(game_id, team) |> summarise(final = max(pts), .groups = "drop") |>
  group_by(game_id) |> filter(n() == 2) |>
  mutate(margin = final - rev(final)) |> ungroup() |>
  filter(abs(margin) <= 80)

j <- peers |> inner_join(scores, by = c("game_id", "team")) |>
  mutate(is_su = team == TEAM)

p_sc <- ggplot(j, aes(net_epa_play, margin)) +
  geom_hline(yintercept = 0, color = SU$muted, linewidth = 0.4) +
  geom_vline(xintercept = 0, color = SU$muted, linewidth = 0.4) +
  geom_point(data = filter(j, !is_su), color = SU$muted, alpha = 0.5, size = 2.2) +
  geom_point(data = filter(j, is_su), color = SU$orange, size = 4.2) +
  geom_text_repel(data = filter(j, is_su),
    aes(label = sprintf("%s\n%+.3f net EPA, won by %d", team, net_epa_play, margin)),
    nudge_y = 16, nudge_x = -0.04, size = 3.4, fontface = "bold",
    segment.color = SU$orange, lineheight = 0.95) +
  labs(
    title = sprintf("Only %d teams outplayed their opponent by more than Syracuse did — and most of them won comfortably",
                    sum(j$net_epa_play > j$net_epa_play[j$is_su])),
    subtitle = sprintf("Net EPA per play against final margin | %d FBS-vs-FBS team-games in Week %d",
                       nrow(j), WEEK),
    x = "Net EPA per play (offense minus defense allowed)", y = "Final margin",
    caption = su_caption(SCOPE)
  ) +
  theme_su(legend_pos = "none")

save_fig(p_sc, "04_dominant_but_close", height = 6)

Figures written to disk

figs <- list.files(FIG_DIR, pattern = "\\.png$", full.names = TRUE)
if (length(figs) == 0) cat("No figures written.\n") else {
  cat("300-dpi PNGs ready for the piece:\n\n")
  for (f in figs) cat("  ", f, "  (", round(file.info(f)$size/1024), " KB)\n", sep = "")
  cat("\nCopy the gt tables from the browser into Google Docs — they paste as\n")
  cat("native editable tables.\n")
}
## 300-dpi PNGs ready for the piece:
## 
##   figures/2026_wk08_story/01_offense_season_arc.png  (149 KB)
##   figures/2026_wk08_story/03_one_score_games.png  (133 KB)
##   figures/2026_wk08_story/04_dominant_but_close.png  (228 KB)
## 
## Copy the gt tables from the browser into Google Docs — they paste as
## native editable tables.
LS0tCnRpdGxlOiAiU3lyYWN1c2UncyBCZXN0IE9mZmVuc2l2ZSBHYW1lIFdhcyBTdGlsbCBhIE9uZS1Qb2ludCBXaW4iCnN1YnRpdGxlOiAiV2VlayA4IDIwMjYg4oCUIFN5cmFjdXNlIDMxLCBOb3J0aCBDYXJvbGluYSAzMCAoT1QpIOKAlCBleGhpYml0cyBmb3IgcHVibGljYXRpb24iCmF1dGhvcjogIkNocmlzIEppbWVuZXoiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCIKcGFyYW1zOgogIHNlYXNvbjogMjAyNgogIHdlZWs6IDgKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogZmxhdGx5CiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICBkZl9wcmludDogcGFnZWQKICAgIGNvZGVfZG93bmxvYWQ6IHllcwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIEVOQ09ESU5HOiBhIHNoZWxsIHdpdGggbm8gTEFORyBzZXQgc3RhcnRzIFIgaW4gdGhlIEMgLyBVUy1BU0NJSSBsb2NhbGUsIGFuZAojIGd0IGFuZCBnZ3Bsb3QgdGhlbiBFU0NBUEUgZXZlcnkgbm9uLUFTQ0lJIGNoYXJhY3Rlci4gRm9yY2UgVVRGLTggc28gZW0gZGFzaGVzCiMgc3Vydml2ZSBpbnRvIHB1YmxpY2F0aW9uLXJlYWR5IG91dHB1dC4KZm9yIChsb2MgaW4gYygiZW5fVVMuVVRGLTgiLCAiQy5VVEYtOCIsICJVVEYtOCIpKSB7CiAgaWYgKG56Y2hhcihzdXBwcmVzc1dhcm5pbmdzKFN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsIGxvYykpKSkgYnJlYWsKfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA2LCBkcGkgPSAxNTApCmBgYAoKYGBge3IgbGlicmFyaWVzfQpsaWJyYXJ5KHRpZHl2ZXJzZSk7IGxpYnJhcnkoYXJyb3cpOyBsaWJyYXJ5KGd0KTsgbGlicmFyeShnZ3JlcGVsKTsgbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoY2ZiZmFzdFIpCmBgYAoKYGBge3Igc3R5bGV9Cm9wdGlvbnMoY2ZiLmxpYl9vbmx5ID0gVFJVRSkKc291cmNlKCIuLi9SLzAyX3RlYW1fZ2FtZV9tZXRyaWNzLlIiKQpzb3VyY2UoIi4uL1IvMDRfc3RvcnlsaW5lX2VuZ2luZS5SIikKc291cmNlKCIuLi9SLzA1X3Zpel9zdHlsZS5SIikKClRFQU0gPC0gIlN5cmFjdXNlIjsgT1BQIDwtICJOb3J0aCBDYXJvbGluYSIKU0VBU09OIDwtIHBhcmFtcyRzZWFzb247IFdFRUsgPC0gcGFyYW1zJHdlZWsKRklHX0RJUiA8LSBzcHJpbnRmKCJmaWd1cmVzLyVkX3drJTAyZF9zdG9yeSIsIFNFQVNPTiwgV0VFSykKU0NPUEUgICA8LSBzcHJpbnRmKCIlZCBXZWVrICVkIHwgJXMgYXQgJXMgKE9UKSIsIFNFQVNPTiwgV0VFSywgVEVBTSwgT1BQKQpgYGAKCmBgYHtyIGRhdGF9CmN1ciA8LSByZWFkX3BhcnF1ZXQoIn4vY2ZiLWRhdGEvcHJvY2Vzc2VkL3RlYW1fZ2FtZV9tZXRyaWNzXzIwMjYucGFycXVldCIpCmZicyA8LSByZWFkUkRTKCJ+L2NmYi1kYXRhL2Zic190ZWFtc18yMDI2LnJkcyIpCgpzdSAgICA8LSBjdXIgfD4gZmlsdGVyKHRlYW0gPT0gVEVBTSkgfD4gYXJyYW5nZSh3ZWVrKQpzdTggICA8LSBzdSB8PiBmaWx0ZXIod2VlayA9PSBXRUVLKQpwZWVycyA8LSBjdXIgfD4gZmlsdGVyKHRlYW0gJWluJSBmYnMsICFsb3dfdm9sdW1lLCBpc19mYnNfbWF0Y2h1cCwgd2VlayA9PSBXRUVLKQoKcHIgPC0gZnVuY3Rpb24oY29sLCBoYiA9IFRSVUUpIHsKICB2IDwtIHBlZXJzW1tjb2xdXQogIGFzLmludGVnZXIocm91bmQocmFuayhpZiAoaGIpIC12IGVsc2UgdiwgbmEubGFzdCA9ICJrZWVwIilbcGVlcnMkdGVhbSA9PSBURUFNXSkpCn0Kbl9wZWVycyA8LSBucm93KHBlZXJzKQoKc2NoZWQgPC0gc3VwcHJlc3NXYXJuaW5ncyhjZmJkX2dhbWVfaW5mbyhTRUFTT04sIHRlYW0gPSBURUFNKSkgfD4KICBmaWx0ZXIoIWlzLm5hKGhvbWVfcG9pbnRzKSkgfD4gYXJyYW5nZSh3ZWVrKSB8PgogIG11dGF0ZShvcHAgICAgPSBpZmVsc2UoaG9tZV90ZWFtID09IFRFQU0sIGF3YXlfdGVhbSwgaG9tZV90ZWFtKSwKICAgICAgICAgc3VfcHRzID0gaWZlbHNlKGhvbWVfdGVhbSA9PSBURUFNLCBob21lX3BvaW50cywgYXdheV9wb2ludHMpLAogICAgICAgICBvcF9wdHMgPSBpZmVsc2UoaG9tZV90ZWFtID09IFRFQU0sIGF3YXlfcG9pbnRzLCBob21lX3BvaW50cyksCiAgICAgICAgIG1hcmdpbiA9IHN1X3B0cyAtIG9wX3B0cywKICAgICAgICAgb25lX3Njb3JlID0gYWJzKG1hcmdpbikgPD0gOCwKICAgICAgICAgbGFiZWwgID0gc3ByaW50ZigiV2sgJWQgJXMiLCB3ZWVrLCBvcHApKQpgYGAKCiMjIEV4aGliaXQgMSDigJQgVGhlIGJlc3Qgb2ZmZW5zaXZlIGdhbWUgb2YgdGhlIHNlYXNvbgoKYGBge3IgZXhoaWJpdC0xLCBmaWcuYXNwID0gMC41fQpvZmYgPC0gc3UgfD4KICBsZWZ0X2pvaW4oc2NoZWQgfD4gc2VsZWN0KHdlZWssIG9wcCwgbWFyZ2luKSwgYnkgPSAid2VlayIpIHw+CiAgbXV0YXRlKGlzX3drOCA9IHdlZWsgPT0gV0VFSywKICAgICAgICAgbGFiID0gc3ByaW50Zigid2slZFxuJXMiLCB3ZWVrLCBvcHApKQoKcF9vZmYgPC0gZ2dwbG90KG9mZiwgYWVzKHdlZWssIG9mZl9lcGFfcGxheSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9IFNVJG11dGVkLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX2xpbmUoY29sb3IgPSBTVSRvcmFuZ2UsIGxpbmV3aWR0aCA9IDEpICsKICBnZW9tX3BvaW50KGFlcyhzaXplID0gaXNfd2s4KSwgY29sb3IgPSBTVSRvcmFuZ2UpICsKICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGZpbHRlcihvZmYsIGlzX3drOCksCiAgICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHNwcmludGYoIiVzXG4lKy4zZiDigJQgJXMgb2YgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcCwgb2ZmX2VwYV9wbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6b3JkaW5hbChwcigib2ZmX2VwYV9wbGF5IikpLCBuX3BlZXJzKSksCiAgICAgICAgICAgICAgICAgIG51ZGdlX3kgPSAwLjA3LCBzaXplID0gMy41LCBmb250ZmFjZSA9ICJib2xkIiwKICAgICAgICAgICAgICAgICAgc2VnbWVudC5jb2xvciA9IE5BLCBsaW5laGVpZ2h0ID0gMC45NSwgZm9yY2UgPSAwKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYyhgRkFMU0VgID0gMi40LCBgVFJVRWAgPSA0LjQpLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBvZmYkd2VlaywgbGFiZWxzID0gb2ZmJGxhYikgKwogIGxhYnMoCiAgICB0aXRsZSA9IHNwcmludGYoIiVzJ3Mgb2ZmZW5zZSBoYXMgY2xpbWJlZCBhbGwgc2Vhc29uLCBhbmQgcGVha2VkIGFnYWluc3QgJXMiLCBURUFNLCBPUFApLAogICAgc3VidGl0bGUgPSBzcHJpbnRmKAogICAgICAiRVBBIHBlciBwbGF5IGJ5IGdhbWUgfCBXZWVrIDIgbG93IG9mICUrLjNmIHRvIGEgc2Vhc29uIGhpZ2ggb2YgJSsuM2YgfCBXZWVrIDEgY2FtZSBhZ2FpbnN0IGFuIEZDUyBvcHBvbmVudCIsCiAgICAgIG1pbihvZmYkb2ZmX2VwYV9wbGF5KSwgbWF4KG9mZiRvZmZfZXBhX3BsYXkpKSwKICAgIHggPSBOVUxMLCB5ID0gIk9mZmVuc2l2ZSBFUEEgcGVyIHBsYXkiLAogICAgY2FwdGlvbiA9IHN1X2NhcHRpb24oIjIwMjYgc2Vhc29uIHRvIGRhdGUiKQogICkgKwogIHRoZW1lX3N1KGxlZ2VuZF9wb3MgPSAibm9uZSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNy41KSkKCnNhdmVfZmlnKHBfb2ZmLCAiMDFfb2ZmZW5zZV9zZWFzb25fYXJjIiwgaGVpZ2h0ID0gNSkKYGBgCgpgYGB7ciBleGhpYml0LTFifQp0aWJibGU6OnRpYmJsZSgKICBNZXRyaWMgPSBjKCJOZXQgRVBBIHBlciBwbGF5IiwgIk9mZmVuc2l2ZSBFUEEgcGVyIHBsYXkiLCAiUnVzaGluZyBFUEEgcGVyIHBsYXkiLAogICAgICAgICAgICAgIlBhc3NpbmcgRVBBIHBlciBwbGF5IiwgIlN0YW5kYXJkLWRvd25zIHN1Y2Nlc3MgcmF0ZSIsCiAgICAgICAgICAgICAiUG9pbnRzIHBlciBzY29yaW5nIG9wcG9ydHVuaXR5IiksCiAgVmFsdWUgPSBjKHN1OCRuZXRfZXBhX3BsYXksIHN1OCRvZmZfZXBhX3BsYXksIHN1OCRvZmZfZXBhX3J1c2gsCiAgICAgICAgICAgIHN1OCRvZmZfZXBhX3Bhc3MsIHN1OCRvZmZfc3Jfc3RhbmRhcmQsIHN1OCRvZmZfcHRzX3Blcl9vcHApLAogIFJhbmsgPSBjKHNwcmludGYoIiVzIG9mICVkIiwgc2NhbGVzOjpvcmRpbmFsKHByKCJuZXRfZXBhX3BsYXkiKSksIG5fcGVlcnMpLAogICAgICAgICAgIHNwcmludGYoIiVzIG9mICVkIiwgc2NhbGVzOjpvcmRpbmFsKHByKCJvZmZfZXBhX3BsYXkiKSksIG5fcGVlcnMpLAogICAgICAgICAgIHNwcmludGYoIiVzIG9mICVkIiwgc2NhbGVzOjpvcmRpbmFsKHByKCJvZmZfZXBhX3J1c2giKSksIG5fcGVlcnMpLAogICAgICAgICAgIHNwcmludGYoIiVzIG9mICVkIiwgc2NhbGVzOjpvcmRpbmFsKHByKCJvZmZfZXBhX3Bhc3MiKSksIG5fcGVlcnMpLAogICAgICAgICAgIHNwcmludGYoIiVzIG9mICVkIiwgc2NhbGVzOjpvcmRpbmFsKHByKCJvZmZfc3Jfc3RhbmRhcmQiKSksIG5fcGVlcnMpLAogICAgICAgICAgIHNwcmludGYoIiVzIG9mICVkIiwgc2NhbGVzOjpvcmRpbmFsKHByKCJvZmZfcHRzX3Blcl9vcHAiKSksIG5fcGVlcnMpKQopIHw+CiAgZ3QoKSB8PgogIHRhYl9oZWFkZXIoCiAgICB0aXRsZSA9IG1kKHNwcmludGYoIioqJXMgd2FzIHRoZSBzZXZlbnRoLW1vc3QgZWZmaWNpZW50IHRlYW0gaW4gdGhlIGNvdW50cnkgb24gU2F0dXJkYXkqKiIsIFRFQU0pKSwKICAgIHN1YnRpdGxlID0gbWQoIldlZWsgOCByYW5rcyBhbW9uZyBGQlMgdGVhbXMgdGhhdCBwbGF5ZWQgRkJTIG9wcG9uZW50cyIpCiAgKSB8PgogIGZtdF9udW1iZXIoY29sdW1ucyA9IFZhbHVlLCBkZWNpbWFscyA9IDMpIHw+CiAgY29sc19hbGlnbigiY2VudGVyIiwgY29sdW1ucyA9IC1NZXRyaWMpIHw+CiAgdGFiX3N0eWxlKHN0eWxlID0gY2VsbF90ZXh0KHdlaWdodCA9ICJib2xkIiksIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IE1ldHJpYykpIHw+CiAgdGFiX3N0eWxlKHN0eWxlID0gbGlzdChjZWxsX2ZpbGwoY29sb3IgPSAiI0ZGRjNFNiIpLCBjZWxsX3RleHQod2VpZ2h0ID0gImJvbGQiKSksCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkocm93cyA9IE1ldHJpYyA9PSAiTmV0IEVQQSBwZXIgcGxheSIpKSB8PgogIHRhYl9zb3VyY2Vfbm90ZShtZChwYXN0ZTAoIioqIiwgc3VfY2FwdGlvbihTQ09QRSksICIqKiIpKSkgfD4KICBndF90aGVtZV9zdSgpCmBgYAoKIyMgRXhoaWJpdCAyIOKAlCBUaGUgZGVmZW5zZSBiZW50IGFsbCBhZnRlcm5vb24KCmBgYHtyIGV4aGliaXQtMn0KdGliYmxlOjp0aWJibGUoCiAgTWV0cmljID0gYygiU3VjY2VzcyByYXRlIGFsbG93ZWQiLCAiSGF2b2MgcmF0ZSIsICJFUEEgYWxsb3dlZCBwZXIgcGxheSIsCiAgICAgICAgICAgICAiT3Bwb25lbnQgc2NvcmluZyBvcHBvcnR1bml0aWVzIiwgIlBvaW50cyBhbGxvd2VkIHBlciBvcHBvcnR1bml0eSIpLAogIFZhbHVlID0gYyhzdTgkZGVmX3N1Y2Nlc3NfcmF0ZSwgc3U4JGRlZl9oYXZvY19jb3JlLCBzdTgkZGVmX2VwYV9wbGF5LAogICAgICAgICAgICBzdTgkZGVmX3Njb3Jpbmdfb3Bwcywgc3U4JGRlZl9wdHNfcGVyX29wcCksCiAgUmFuayA9IGMoc3ByaW50ZigiJXMgb2YgJWQiLCBzY2FsZXM6Om9yZGluYWwocHIoImRlZl9zdWNjZXNzX3JhdGUiLCBGQUxTRSkpLCBuX3BlZXJzKSwKICAgICAgICAgICBzcHJpbnRmKCIlcyBvZiAlZCIsIHNjYWxlczo6b3JkaW5hbChwcigiZGVmX2hhdm9jX2NvcmUiKSksIG5fcGVlcnMpLAogICAgICAgICAgIHNwcmludGYoIiVzIG9mICVkIiwgc2NhbGVzOjpvcmRpbmFsKHByKCJkZWZfZXBhX3BsYXkiLCBGQUxTRSkpLCBuX3BlZXJzKSwKICAgICAgICAgICAi4oCUIiwgIuKAlCIpCikgfD4KICBndCgpIHw+CiAgdGFiX2hlYWRlcigKICAgIHRpdGxlID0gbWQoIioqTm9ydGggQ2Fyb2xpbmEgbW92ZWQgdGhlIGJhbGwgYXQgd2lsbCBhbmQgd2FzIGhlbGQgdG8gZm91ciBmaWVsZCBnb2FscyoqIiksCiAgICBzdWJ0aXRsZSA9IG1kKHNwcmludGYoCiAgICAgICJVTkMgcmVhY2hlZCBzY29yaW5nIHJhbmdlICVkIHRpbWVzIHRvIFN5cmFjdXNlJ3MgJWQsIGFuZCBzY29yZWQgJS4yZiBwb2ludHMgcGVyIHRyaXAiLAogICAgICBzdTgkZGVmX3Njb3Jpbmdfb3Bwcywgc3U4JG9mZl9zY29yaW5nX29wcHMsIHN1OCRkZWZfcHRzX3Blcl9vcHApKQogICkgfD4KICBmbXRfbnVtYmVyKGNvbHVtbnMgPSBWYWx1ZSwgZGVjaW1hbHMgPSAzKSB8PgogIGNvbHNfYWxpZ24oImNlbnRlciIsIGNvbHVtbnMgPSAtTWV0cmljKSB8PgogIHRhYl9zdHlsZShzdHlsZSA9IGNlbGxfdGV4dCh3ZWlnaHQgPSAiYm9sZCIpLCBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSBNZXRyaWMpKSB8PgogIHRhYl9zdHlsZShzdHlsZSA9IGxpc3QoY2VsbF9maWxsKGNvbG9yID0gIiNGRkYzRTYiKSwgY2VsbF90ZXh0KHdlaWdodCA9ICJib2xkIikpLAogICAgICAgICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KHJvd3MgPSBNZXRyaWMgJWluJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiU3VjY2VzcyByYXRlIGFsbG93ZWQiLCAiSGF2b2MgcmF0ZSIpKSkgfD4KICB0YWJfc291cmNlX25vdGUobWQocGFzdGUwKCIqKiIsIHN1X2NhcHRpb24oU0NPUEUpLAogICAgIioqIOKAlCBFUEEgYWxsb3dlZCByYW5rZWQgbWlkLXBhY2sgYmVjYXVzZSBTeXJhY3VzZSBmb3JjZWQgZmllbGQgZ29hbHM7ICIsCiAgICAic3VjY2VzcyByYXRlIGFsbG93ZWQgaXMgdGhlIHRydWVyIG1lYXN1cmUgb2YgaG93IGVhc2lseSBVTkMgbW92ZWQuIikpKSB8PgogIGd0X3RoZW1lX3N1KCkKYGBgCgpTdWNjZXNzIHJhdGUgYWxsb3dlZCBoYXMgbm93IHNhdCBiZXR3ZWVuIC40NDAgYW5kIC40NzMgaW4gZXZlcnkgZ2FtZSBzaW5jZQpXZWVrIDMg4oCUIHRoZSBvbmUgcGFydCBvZiB0aGlzIHRlYW0gdGhhdCBoYXMgbm90IGNoYW5nZWQgYWxsIHNlYXNvbi4KCiMjIEV4aGliaXQgMyDigJQgRml2ZSBvbmUtc2NvcmUgZ2FtZXMgaW4gc2V2ZW4KCmBgYHtyIGV4aGliaXQtMywgZmlnLmFzcCA9IDAuNTV9Cm0gPC0gc2NoZWQgfD4KICBtdXRhdGUobGFiID0gc3ByaW50ZigiV2sgJWQgICVzIiwgd2Vlaywgb3BwKSwKICAgICAgICAgbGFiID0gZmFjdG9yKGxhYiwgbGV2ZWxzID0gcmV2KGxhYikpLAogICAgICAgICBvdXRjb21lID0gaWZlbHNlKG1hcmdpbiA+IDAsICJXaW4iLCAiTG9zcyIpKQoKcF9tYXJnaW4gPC0gZ2dwbG90KG0sIGFlcyh4ID0gbWFyZ2luLCB5ID0gbGFiKSkgKwogICMgTk9URTogeSBoZXJlIGlzIGEgZGlzY3JldGUgZmFjdG9yLCBzbyBhbnkgYW5ub3RhdGlvbiBtdXN0IHVzZSAtSW5mL0luZiBvciBhCiAgIyByZWFsIGZhY3RvciBsZXZlbCAtLSBhIG51bWVyaWMgeSBicmVha3MgY29udGludW91cy1zY2FsZSB0cmFpbmluZy4KICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtOCwgeG1heCA9IDgsIHltaW4gPSAtSW5mLCB5bWF4ID0gSW5mLAogICAgICAgICAgIGZpbGwgPSBTVSRvcmFuZ2UsIGFscGhhID0gMC4wOCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gU1UkbXV0ZWQsIGxpbmV3aWR0aCA9IDAuNSkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IDAsIHhlbmQgPSBtYXJnaW4sIHllbmQgPSBsYWIsIGNvbG9yID0gb3V0Y29tZSksCiAgICAgICAgICAgICAgIGxpbmV3aWR0aCA9IDEuNikgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gb3V0Y29tZSksIHNpemUgPSAzLjQpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3ByaW50ZigiJStkIiwgbWFyZ2luKSwKICAgICAgICAgICAgICAgIGhqdXN0ID0gaWZlbHNlKG1hcmdpbiA+IDAsIC0wLjQ1LCAxLjQ1KSksCiAgICAgICAgICAgIHNpemUgPSAzLjMsIGZvbnRmYWNlID0gImJvbGQiLCBjb2xvciA9IFNVJGluaykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFdpbiA9IFNVJG9yYW5nZSwgTG9zcyA9IFNVJGJsdWUpLCBuYW1lID0gTlVMTCkgKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4xNCwgMC4xNCkpKSArCiAgbGFicygKICAgIHRpdGxlID0gc3ByaW50ZigiJWQgb2YgU3lyYWN1c2UncyA3IGdhbWVzIGhhdmUgYmVlbiBkZWNpZGVkIGJ5IG9uZSBzY29yZSIsCiAgICAgICAgICAgICAgICAgICAgc3VtKHNjaGVkJG9uZV9zY29yZSkpLAogICAgc3VidGl0bGUgPSBzcHJpbnRmKAogICAgICAiRmluYWwgbWFyZ2luIGJ5IGdhbWUgfCBTaGFkZWQgYmFuZDogd2l0aGluIDggcG9pbnRzIHwgU3lyYWN1c2UgaXMgJWQtJWQgaW4gdGhvc2UgZ2FtZXMsIGFuZCAlZC0lZCBvdmVyYWxsIiwKICAgICAgc3VtKHNjaGVkJG9uZV9zY29yZSAmIHNjaGVkJG1hcmdpbiA+IDApLCBzdW0oc2NoZWQkb25lX3Njb3JlICYgc2NoZWQkbWFyZ2luIDwgMCksCiAgICAgIHN1bShzY2hlZCRtYXJnaW4gPiAwKSwgc3VtKHNjaGVkJG1hcmdpbiA8IDApKSwKICAgIHggPSAiRmluYWwgbWFyZ2luIiwgeSA9IE5VTEwsCiAgICBjYXB0aW9uID0gc3VfY2FwdGlvbigiMjAyNiBzZWFzb24gdG8gZGF0ZSIpCiAgKSArCiAgdGhlbWVfc3UobGVnZW5kX3BvcyA9ICJ0b3AiKQoKc2F2ZV9maWcocF9tYXJnaW4sICIwM19vbmVfc2NvcmVfZ2FtZXMiLCBoZWlnaHQgPSA1LjUpCmBgYAoKIyMgRXhoaWJpdCA0IOKAlCBEb21pbmFudCBhbmQgYmFyZWx5IGFoZWFkCgpgYGB7ciBleGhpYml0LTQsIGZpZy5hc3AgPSAwLjZ9CnNjb3JlcyA8LSBiaW5kX3Jvd3MoCiAgcmVhZF9wYXJxdWV0KHNwcmludGYoIn4vY2ZiLWRhdGEvcmF3L3BicF9pbnNlYXNvbi9wYnBfJWRfd2slMDJkLnBhcnF1ZXQiLCBTRUFTT04sIFdFRUspKSB8PgogICAgdHJhbnNtdXRlKGdhbWVfaWQsIHRlYW0gPSBwb3NfdGVhbSwgcHRzID0gcG9zX3RlYW1fc2NvcmUpLAogIHJlYWRfcGFycXVldChzcHJpbnRmKCJ+L2NmYi1kYXRhL3Jhdy9wYnBfaW5zZWFzb24vcGJwXyVkX3drJTAyZC5wYXJxdWV0IiwgU0VBU09OLCBXRUVLKSkgfD4KICAgIHRyYW5zbXV0ZShnYW1lX2lkLCB0ZWFtID0gZGVmX3Bvc190ZWFtLCBwdHMgPSBkZWZfcG9zX3RlYW1fc2NvcmUpCikgfD4KICBmaWx0ZXIoIWlzLm5hKHRlYW0pLCAhaXMubmEocHRzKSwgcHRzID49IDAsIHB0cyA8PSAxMDApIHw+CiAgZ3JvdXBfYnkoZ2FtZV9pZCwgdGVhbSkgfD4gc3VtbWFyaXNlKGZpbmFsID0gbWF4KHB0cyksIC5ncm91cHMgPSAiZHJvcCIpIHw+CiAgZ3JvdXBfYnkoZ2FtZV9pZCkgfD4gZmlsdGVyKG4oKSA9PSAyKSB8PgogIG11dGF0ZShtYXJnaW4gPSBmaW5hbCAtIHJldihmaW5hbCkpIHw+IHVuZ3JvdXAoKSB8PgogIGZpbHRlcihhYnMobWFyZ2luKSA8PSA4MCkKCmogPC0gcGVlcnMgfD4gaW5uZXJfam9pbihzY29yZXMsIGJ5ID0gYygiZ2FtZV9pZCIsICJ0ZWFtIikpIHw+CiAgbXV0YXRlKGlzX3N1ID0gdGVhbSA9PSBURUFNKQoKcF9zYyA8LSBnZ3Bsb3QoaiwgYWVzKG5ldF9lcGFfcGxheSwgbWFyZ2luKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gU1UkbXV0ZWQsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gU1UkbXV0ZWQsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihqLCAhaXNfc3UpLCBjb2xvciA9IFNVJG11dGVkLCBhbHBoYSA9IDAuNSwgc2l6ZSA9IDIuMikgKwogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihqLCBpc19zdSksIGNvbG9yID0gU1Ukb3JhbmdlLCBzaXplID0gNC4yKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBmaWx0ZXIoaiwgaXNfc3UpLAogICAgYWVzKGxhYmVsID0gc3ByaW50ZigiJXNcbiUrLjNmIG5ldCBFUEEsIHdvbiBieSAlZCIsIHRlYW0sIG5ldF9lcGFfcGxheSwgbWFyZ2luKSksCiAgICBudWRnZV95ID0gMTYsIG51ZGdlX3ggPSAtMC4wNCwgc2l6ZSA9IDMuNCwgZm9udGZhY2UgPSAiYm9sZCIsCiAgICBzZWdtZW50LmNvbG9yID0gU1Ukb3JhbmdlLCBsaW5laGVpZ2h0ID0gMC45NSkgKwogIGxhYnMoCiAgICB0aXRsZSA9IHNwcmludGYoIk9ubHkgJWQgdGVhbXMgb3V0cGxheWVkIHRoZWlyIG9wcG9uZW50IGJ5IG1vcmUgdGhhbiBTeXJhY3VzZSBkaWQg4oCUIGFuZCBtb3N0IG9mIHRoZW0gd29uIGNvbWZvcnRhYmx5IiwKICAgICAgICAgICAgICAgICAgICBzdW0oaiRuZXRfZXBhX3BsYXkgPiBqJG5ldF9lcGFfcGxheVtqJGlzX3N1XSkpLAogICAgc3VidGl0bGUgPSBzcHJpbnRmKCJOZXQgRVBBIHBlciBwbGF5IGFnYWluc3QgZmluYWwgbWFyZ2luIHwgJWQgRkJTLXZzLUZCUyB0ZWFtLWdhbWVzIGluIFdlZWsgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIG5yb3coaiksIFdFRUspLAogICAgeCA9ICJOZXQgRVBBIHBlciBwbGF5IChvZmZlbnNlIG1pbnVzIGRlZmVuc2UgYWxsb3dlZCkiLCB5ID0gIkZpbmFsIG1hcmdpbiIsCiAgICBjYXB0aW9uID0gc3VfY2FwdGlvbihTQ09QRSkKICApICsKICB0aGVtZV9zdShsZWdlbmRfcG9zID0gIm5vbmUiKQoKc2F2ZV9maWcocF9zYywgIjA0X2RvbWluYW50X2J1dF9jbG9zZSIsIGhlaWdodCA9IDYpCmBgYAoKIyMgRmlndXJlcyB3cml0dGVuIHRvIGRpc2sKCmBgYHtyIG1hbmlmZXN0fQpmaWdzIDwtIGxpc3QuZmlsZXMoRklHX0RJUiwgcGF0dGVybiA9ICJcXC5wbmckIiwgZnVsbC5uYW1lcyA9IFRSVUUpCmlmIChsZW5ndGgoZmlncykgPT0gMCkgY2F0KCJObyBmaWd1cmVzIHdyaXR0ZW4uXG4iKSBlbHNlIHsKICBjYXQoIjMwMC1kcGkgUE5HcyByZWFkeSBmb3IgdGhlIHBpZWNlOlxuXG4iKQogIGZvciAoZiBpbiBmaWdzKSBjYXQoIiAgIiwgZiwgIiAgKCIsIHJvdW5kKGZpbGUuaW5mbyhmKSRzaXplLzEwMjQpLCAiIEtCKVxuIiwgc2VwID0gIiIpCiAgY2F0KCJcbkNvcHkgdGhlIGd0IHRhYmxlcyBmcm9tIHRoZSBicm93c2VyIGludG8gR29vZ2xlIERvY3Mg4oCUIHRoZXkgcGFzdGUgYXNcbiIpCiAgY2F0KCJuYXRpdmUgZWRpdGFibGUgdGFibGVzLlxuIikKfQpgYGAK