During the Summer of 2021, data from ICE facility inspections was compiled into a series of spreadsheets. The impetus for the project was Nathan Craig who was interested in collating the data to examine them for trends, patterns, and anomalies. The work was performed by three students funded under a National Science Foundation grant awarded to Dr. Neil Harvey (NMSU) and Dr. Jeremy Slack (NMSU). The students who performed the work were Juan Becerra (Stanford), Avigail Turima Romo (Columbia), and Daniela Navarro Verdugo (CSSLO). The three students worked with Nathan Craig (NMSU and AVID) to develop a workflow for compiling individual report significant incident summary forms and inspection cover letters into a series of spreadsheets.

This document is a preliminary proof of concept and initial exploratory data analysis (Tukey 1977). Goals of the document are to:

  • illustrate the kinds of analysis possible with the tabulation of ICE inspection data
  • demonstrate code for reading the spreadsheet
  • show specific wrangling methods unique to the data structure
  • provide preliminary exploratory plot of select variables from the Significant Incident Summary Sheets.

The data are presently incomplete and represent results compiled as of 2021-07-05.

# Load necessary libraries

# Reading and wrangling
library(googlesheets4)
library(readr)
library(tidyverse)
library(janitor)
library(lubridate)
library(DT)

# Plotting
library(ggplot2)
library(RColorBrewer)

# Tables
library(kableExtra)

# Load custom function
source("function_clean_facility_names.R", local = knitr::knit_global())

1 Introduction

1.1 Method for Reading G-324A-19-inc form

The code for this report is specific to data logged in the G-324A-19 form and the incident summaries portion of that form. The incident summary portion of this form is probably the most complex data structure in the project and also contains the largest volume of quantitative information. Therefore, it seemed like a good place to start with an initial proof of concept.

At the outset, there were issues reading in the Google Sheet. Several of the numeric columns read into R as lists which was undesirable. In the Google Sheet, Craig set the columns to plain text rather than auto and the data read in fine as character columns. This seemed to resolve the issue for a time, and it was possible to use the type_convert() function from the readr library (Wickham and Hester 2020) to convert these columns to numbers. Additional steps were taken to use the read_sheet function of the googlesheets4 library (Bryan 2021) to explicitly set the column types to character.

There were also some issues using lubridate (Spinu, Grolemund, and Wickham 2021) to wrangle the month and year fields to a proper date. Craig was not able to discern the cause of the issue. However, changing the month format on the incident sheet from abbreviated to fully written out months solved the issue. Those changes were made in the master Google Sheet and the data were called using the googlesheets4 library.

# Read in Sheet G-324A-19
df_324 <- read_sheet("https://docs.google.com/spreadsheets/d/1im5VSi3bIEi13O8WQ56wEIXSyNEstbGMylXXgD9bAG0/edit#gid=1858227071",
                 sheet="G-324A-19",
                 col_names = TRUE,
                 col_types = "c") %>% 
  clean_names() %>% 
  
  # Run custom cleaning function
  clean_facility_names() %>% 
  
  # df specific changes
  mutate(facility = as.factor(facility),
         state = as.factor(state),
         date = mdy(inspection_date),
         current_inspection_date_from = mdy(current_inspection_date_from),
         current_inspection_date_to = mdy(current_inspection_date_to)
         ) %>% 
  relocate(date, .before = inspection_date) %>% 
  mutate_at(c(20:49), as.numeric)
# Read Google Sheet incident worksheet, convert to data frame, and wrangle
df_324_inc <- read_sheet("https://docs.google.com/spreadsheets/d/1im5VSi3bIEi13O8WQ56wEIXSyNEstbGMylXXgD9bAG0/edit#gid=1858227071",
                 sheet="G-324A-19-inc",
                 col_types = "c") %>% 
  clean_names() %>%
  
  # Run custom cleaning function
  clean_facility_names() %>% 


  # df_specific changes
  unite(date, year:month) %>% 
  mutate(facility = as.factor(facility),
         state = as.factor(state),
         date = ym(date)
         ) %>% 
  mutate_at(c(6:76), as.numeric)

At present 199 out of approximately 300 are complete. The inspections range in time from 2019-08-22 to 2021-05-27.

1.2 Summary Tables

Summary tables help to provide an overview of how many instances occur within particular category of data or how frequent a particular issue is recorded at a given facility. Summary tables are generated using a combination of group_by with summarize with the results piped to kable and kableExtra.

df_facility <- df_324 %>% 
  group_by(facility) %>% 
  summarise(n_inspections = n()) %>% 
  ungroup() 
  
df_facility %>% 
  kable(caption = "Inspections Reviewed by Facility",
        col.names = c("Facility", "Inspections Reviewed")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 1.1: Inspections Reviewed by Facility
Facility Inspections Reviewed
Adams County Correctional Center 2
Adelanto ICE Processing Center - East 2
Adelanto ICE Processing Center - West 2
Alamance County Detention Center 1
Alamance County Jail 1
Allen Parish Public Safety Complex 2
Aurora ICE Processing Center 2
Aurora ICE Processing Center II - Annex 2
Baker County Detention Center 2
Bergen County Jail 2
Bluebonnet Detention Center 1
Boone County Jail 2
Bossier Parish Corrections Center 1
Bristol County Jail and House of Correction 2
Brooks County Detention Center 1
Broward Transitional Center 2
Butler County Jail 1
Calhoun County Correctional Center 2
Cambria County Prison 1
Caroline Detention Facility 2
Carver County Jail 1
Cass County Jail 1
Catahoula Correctional Center 2
CCA Florence Correctional Center 1
Chase County Detention Center 1
Chippewa County Correctional Facility 1
Christian County Jail 1
Cibola County Correctional Center 2
Clay County Jail 2
Clinton County Correctional Facility 2
Coastal Bend Detention Center 1
David L. Moss Criminal Justice Center 2
Desert View Annex 2
Dodge County Detention Facility 2
Donald W. Wyatt Detention Facility 2
Dorchester County Detention Center 3
Douglas County Department of Corrections 1
East Hidalgo Detention Center 1
Eden Detention Center 1
El Paso Service Processing Center 2
El Valle Detention Facility 1
Elizabeth Contract Detention Facility 2
Eloy Detention Center 2
Essex County Correctional Facility 2
Etowah County Jail 1
Florence Service Processing Center 2
Folkston ICE Processing Center 1
Folkston ICE Processing Center Annex 1
Freeborn County Adult Detention Center 2
Geauga County Jail 2
Glades County Detention Center 1
Golden State Annex 3
Hall County Department of Corrections 1
Hardin County Jail 2
Henderson Detention Center 1
Houston Contract Detention Facility 2
Howard County Detention Center 1
Hudson County Corrections and Rehabilitation Center 2
Immigration Centers of America - Farmville 1
Imperial Regional Detention Facility 2
Irwin County Detention Center 1
Jackson Parish Correctional Center 2
Jena LaSalle Detention Facility 1
Jerome Combs Detention Center 2
Joe Corley Processing Center 2
Johnson County Corrections Center 1
Kay County Detention Center 2
Krome North Service Processing Center 1
Krome Service Processing Center 2
La Palma Correctional Center 1
Laredo Processing Center 2
LaSalle Correctional Center 1
LaSalle County Regional Detention Center 1
LaSalle ICE Processing Center 1
Limestone County Detention Center 2
McHenry County Adult Correctional Facility 1
Mesa Verde ICE Processing Facility 1
Monroe County Inmate Dormitory 1
Montgomery County Jail 1
Montgomery Processing Center 2
Morgan County Adult Detention Center 1
Morrow County Correctional Facility 1
Northern Oregon Correctional Facility 1
Northwest ICE Processing Center 2
Nye County Detention Center 2
Okmulgee County Jail - Moore Detention Facility 1
Orange County Correctional Facility 2
Otay Mesa Detention Center 2
Otero County Processing Center 2
Pike County Correctional Facility 2
Pine Prairie ICE Processing Center 2
Platte County Detention Center 1
Plymouth County Correctional Facility 1
Polk County Adult Detention Center 2
Port Isabel Service Processing Center 2
Prairieland Detention Center 2
Pulaski County Detention Center 2
Richwood Correctional Center 2
Rio Grande Detention Center 2
River Correctional Center 3
Robert A. Deyton Detention Facility 2
Rolling Plains Detention Center 1
Saint Clair County Jail 1
San Luis Regional Detention Center 2
Seneca County Jail 2
Shawnee County Department of Corrections - Adult Detention Center 1
Sherburne County Jail 2
Sheriff Al Cannon Detention Center 1
South Louisiana ICE Processing Center 2
South Texas ICE Processing Center 1
Stewart Detention Center 2
Strafford County Department of Corrections 2
T. Don Hutto Residential Center 1
Teller County Jail 2
Torrance County Detention Facility 1
Val Verde Correctional Facility 1
Wakulla County Detention Facility 2
Washoe County Detention Center 1
Webb County Detention Center 2
West Texas Detention Facility 1
Western Tennessee Detention Facility 1
Willacy County Regional Detention Facility 2
Winn Correctional Center 2
Worcester County Jail 1
York County Prison 2
Yuba County Jail 2

1.3 Facet Plots

Facet plots are produced for several categories of data. Within each category, columns are pivoted longer and plotted by date. Graphing is done using the ggplot2 library (Wickham et al. 2021) with the facet_wrap function to provide a means to compare multiple facilities simultaneously. Such a plot can help identify trends and guide more specific questions.

2 Assaults

The ICE G-324A Significant Incident Summary sheet contains information on a number of different kinds of assaults. Specifically, there are four categories of assaults listed:

  • Detained Person on Staff with Serious Injury
  • Detained Person on Staff without Serious Injury
  • Detained Person on Detained Person with Serious Injury
  • Detained Person on Detained Person without Serious Injury

Conspicuously absent from this list of assault types are assaults on detained persons by staff. This is deeply concerning because already initial review of inspection forms and prior news stories indicates that staff assaults on detained persons do occur. For example, at the Bristol County County Jail and House of Corrections independent investigation by the Massachusetts Office of Attorney General (MAOG) found that facility staff found a “planned and deliberate-use of force against the ICE detainees that was disproportionate to the security needs at that time and unnecessarily caused, or risked causing, harm to all involved” (MA AG 2020, ii). The MOAG found that facility staff used “a flash bang grenade, pepper-ball launchers, pepper spray canisters, anti-riot shields, and canines–against detainees who had exhibited calm and nonviolent behavior for at least an hour before this operation” (MA AG 2020, ii). Investigations found that staff “deployed these weapons both indiscriminately upon entry and also specifically against detainees who were not combative, assaultive, or otherwise actively resisting staff” (MA AG 2020, ii).

While the aforementioned Bristol County Jail may be a particularly egregious instance of staff assaulting detained persons, it is not an isolated case. For example, video evidence from the Torrance County Detention Facility in Estancia NM shows CoreCivic’s private facility staff pepper spraying persons detained by ICE on hunger strike (Swetlitz 2020). Review of inspections has also revealed additional inappropriate use of force incidents. The omission of a field to record instances of staff assaulting detained persons occludes and obscures real instances of violence. As the inspections process is a detention reform designed to make a more humane system of civil incarceration, the omission of categories for logging staff physical mistreatment of detained persons raises serious questions about the inspections processes ability to record significant and documented civil and human rights violations.

2.1 Summary Tables

df_assaults <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       detainee_physical_assault_on_staff_with_serious_injury:
       detainee_on_detainee_physical_assault_fight_with_no_serious_injury
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_assaults = sum(c_across(
       detainee_physical_assault_on_staff_with_serious_injury:
       detainee_on_detainee_physical_assault_fight_with_no_serious_injury
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  detainee_physical_assault_on_staff_with_serious_injury:total_assaults,
               names_to = "assault_type",
               values_to = "assault_count") %>% 
  
  # Remove NA Values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(assault_type = factor(assault_type, levels = c(
    "detainee_physical_assault_on_staff_with_serious_injury",
    "detainee_physical_assault_on_staff_with_no_serious_injury",
    "detainee_on_detainee_physical_assault_fight_with_serious_injury",
    "detainee_on_detainee_physical_assault_fight_with_no_serious_injury",
    "total_assaults"
  )))
df_assaults %>% 
  group_by(assault_type) %>% 
  summarise(`Total Assaults by Type` = sum(assault_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Assaults by Type",
        col.names = c("Assault Type", "Total Assault Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 2.1: Total Assaults by Type
Assault Type Total Assault Type
detainee_physical_assault_on_staff_with_serious_injury 13
detainee_physical_assault_on_staff_with_no_serious_injury 333
detainee_on_detainee_physical_assault_fight_with_serious_injury 126
detainee_on_detainee_physical_assault_fight_with_no_serious_injury 2926
total_assaults 3390
df_assaults %>% 
  group_by(facility) %>% 
  summarise(total_assaults = sum(assault_count)) %>% 
  arrange(desc(total_assaults)) %>% 
  ungroup() %>% 
  kable(caption = "Total Assaults by Facility",
        col.names = c("Facility", "Total Assaults by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 2.1: Total Assaults by Facility
Facility Total Assaults by Facility
Krome Service Processing Center 470
Adelanto ICE Processing Center - West 390
Prairieland Detention Center 330
South Texas ICE Processing Center 312
Adelanto ICE Processing Center - East 264
Otero County Processing Center 240
Aurora ICE Processing Center 222
Aurora ICE Processing Center II - Annex 222
Stewart Detention Center 218
Eloy Detention Center 216
Otay Mesa Detention Center 200
El Paso Service Processing Center 192
Winn Correctional Center 172
Essex County Correctional Facility 146
Imperial Regional Detention Facility 136
LaSalle ICE Processing Center 128
Hudson County Corrections and Rehabilitation Center 118
Immigration Centers of America - Farmville 108
River Correctional Center 106
Caroline Detention Facility 104
Jena LaSalle Detention Facility 98
Yuba County Jail 96
Adams County Correctional Center 94
La Palma Correctional Center 92
Bergen County Jail 86
Northwest ICE Processing Center 78
Catahoula Correctional Center 72
Mesa Verde ICE Processing Facility 72
Port Isabel Service Processing Center 70
Folkston ICE Processing Center 68
Bluebonnet Detention Center 64
Montgomery Processing Center 60
Pulaski County Detention Center 60
Sherburne County Jail 60
Houston Contract Detention Facility 58
Pine Prairie ICE Processing Center 58
Baker County Detention Center 54
Calhoun County Correctional Center 54
Limestone County Detention Center 50
Polk County Adult Detention Center 50
Irwin County Detention Center 48
McHenry County Adult Correctional Facility 48
Strafford County Department of Corrections 46
Allen Parish Public Safety Complex 45
Krome North Service Processing Center 40
Elizabeth Contract Detention Facility 34
Nye County Detention Center 34
Pike County Correctional Facility 32
Webb County Detention Center 32
CCA Florence Correctional Center 30
Joe Corley Processing Center 30
Wakulla County Detention Facility 30
David L. Moss Criminal Justice Center 28
Johnson County Corrections Center 28
Orange County Correctional Facility 26
Richwood Correctional Center 26
Bossier Parish Corrections Center 24
Florence Service Processing Center 24
Folkston ICE Processing Center Annex 24
Freeborn County Adult Detention Center 24
Okmulgee County Jail - Moore Detention Facility 24
Clinton County Correctional Facility 22
Jackson Parish Correctional Center 22
Rio Grande Detention Center 22
Bristol County Jail and House of Correction 20
Morgan County Adult Detention Center 20
Plymouth County Correctional Facility 20
Cambria County Prison 18
Glades County Detention Center 16
Hall County Department of Corrections 16
York County Prison 16
Henderson Detention Center 14
Seneca County Jail 14
Broward Transitional Center 12
Butler County Jail 12
Donald W. Wyatt Detention Facility 12
Hardin County Jail 12
Torrance County Detention Facility 12
Coastal Bend Detention Center 10
Dodge County Detention Facility 10
Eden Detention Center 10
El Valle Detention Facility 10
Howard County Detention Center 10
Boone County Jail 8
Sheriff Al Cannon Detention Center 8
Worcester County Jail 7
Geauga County Jail 6
Jerome Combs Detention Center 6
Kay County Detention Center 6
Montgomery County Jail 6
Saint Clair County Jail 6
Val Verde Correctional Facility 6
Clay County Jail 4
Laredo Processing Center 4
Northern Oregon Correctional Facility 4
San Luis Regional Detention Center 4
Teller County Jail 4
Carver County Jail 2
Cass County Jail 2
Monroe County Inmate Dormitory 2
Rolling Plains Detention Center 2
Shawnee County Department of Corrections - Adult Detention Center 2
South Louisiana ICE Processing Center 2
West Texas Detention Facility 2
Alamance County Detention Center 0
Brooks County Detention Center 0
Chippewa County Correctional Facility 0
Christian County Jail 0
Cibola County Correctional Center 0
Desert View Annex 0
Dorchester County Detention Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Golden State Annex 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Robert A. Deyton Detention Facility 0
T. Don Hutto Residential Center 0
Washoe County Detention Center 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

2.2 Facet of Assaults by Plot

The figure below is a facet plot of the assault categories present on the G-324A SIS form.

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"

# Create the labels
plot_labels <- c(
    "Detained Person on Staff w. Serious Injury",
    "Detained Person on Staff w/o Serious Injury",
    "Detained Person on Detained Person w. Serous Injury",
    "Detained Person on Detained Person w/o Serous Injury",
    "Total Assaults")

df_assaults %>% 
  # Calling the plot and formatting
  ggplot(aes(x=date, y = assault_count, linetype=assault_type))+
  geom_line(aes(color = assault_type), size =.65) +
  
  # Set the line type
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Assault Type:",
    guide = guide_legend(nrow = 5)
    )+
  
  # Setting the color
  scale_color_manual(
    values = plot_colors,
    labels = plot_labels,
  name = "Assault Type:"
  )+

  labs(title = "Reported Assaults")+
  ylab("Number of Assaults")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

3 Disciplinary

As a matter of law, ICE detention is not punitive it is purely administrative civil holding to ensure that individuals are present for their immigration proceedings. Despite that fact, there is a tremendous amount of punitive disciplinary measures that take place in ICE detention. Some of this information on discipline in ICE detention is logged in facility inspections. As seen in the tables below, during the current sample period there were more than 42,000 disciplinary infractions.

3.1 Summary Tables

df_discipline <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       disciplinary_infractions:
       sanctions_over_60_days
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_disciplinary = sum(c_across(
       disciplinary_infractions:
       sanctions_over_60_days
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  disciplinary_infractions:total_disciplinary,
               names_to = "disciplinary_type",
               values_to = "disciplinary_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(disciplinary_type = factor(disciplinary_type, levels =c(
    "disciplinary_infractions",
    "disciplinary_infractions_guilty",
    "disciplinary_appeals",
    "disciplinary_appeals_found_in_favor_of_detainee",
    "sanctions_over_60_days",
    "total_disciplinary"
  )))
df_discipline %>% 
  group_by(disciplinary_type) %>% 
  summarise(`Total Disciplinary by Type` = sum(disciplinary_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Disciplinary by Type",
        col.names = c("Discipline Type", "Total Discipline Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 3.1: Total Disciplinary by Type
Discipline Type Total Discipline Type
disciplinary_infractions 25089
disciplinary_infractions_guilty 19610
disciplinary_appeals 1234
disciplinary_appeals_found_in_favor_of_detainee 295
sanctions_over_60_days 30
total_disciplinary 45547
df_discipline %>% 
  group_by(facility) %>% 
  summarise(total_disciplinary = sum(disciplinary_count)) %>% 
  arrange(desc(total_disciplinary)) %>% 
  ungroup() %>% 
  kable(caption = "Total Discipline by Facility",
        col.names = c("Facility", "Total Discipline by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 3.1: Total Discipline by Facility
Facility Total Discipline by Facility
Eloy Detention Center 7128
La Palma Correctional Center 6954
Krome Service Processing Center 4888
Sherburne County Jail 4070
Immigration Centers of America - Farmville 3808
Yuba County Jail 3712
Stewart Detention Center 3068
Aurora ICE Processing Center 2678
Aurora ICE Processing Center II - Annex 2678
Otay Mesa Detention Center 2504
Winn Correctional Center 2264
Calhoun County Correctional Center 2098
Montgomery Processing Center 2060
Caroline Detention Facility 1954
Bluebonnet Detention Center 1926
Otero County Processing Center 1924
South Texas ICE Processing Center 1912
Prairieland Detention Center 1596
Bergen County Jail 1432
Essex County Correctional Facility 1304
Adelanto ICE Processing Center - West 1284
El Paso Service Processing Center 1246
Imperial Regional Detention Facility 1240
Jena LaSalle Detention Facility 1234
Bristol County Jail and House of Correction 1186
LaSalle ICE Processing Center 1176
Clinton County Correctional Facility 1166
Northwest ICE Processing Center 1070
Polk County Adult Detention Center 1010
River Correctional Center 924
Laredo Processing Center 888
Port Isabel Service Processing Center 848
Glades County Detention Center 822
Folkston ICE Processing Center 814
McHenry County Adult Correctional Facility 796
Adams County Correctional Center 756
Pulaski County Detention Center 746
Adelanto ICE Processing Center - East 742
Irwin County Detention Center 680
Pine Prairie ICE Processing Center 638
Hudson County Corrections and Rehabilitation Center 592
York County Prison 586
Butler County Jail 566
Pike County Correctional Facility 560
Folkston ICE Processing Center Annex 502
David L. Moss Criminal Justice Center 498
Dodge County Detention Facility 496
Freeborn County Adult Detention Center 492
Mesa Verde ICE Processing Facility 482
Houston Contract Detention Facility 480
Orange County Correctional Facility 480
Krome North Service Processing Center 438
Torrance County Detention Facility 420
Strafford County Department of Corrections 400
Webb County Detention Center 322
Baker County Detention Center 312
Florence Service Processing Center 310
Donald W. Wyatt Detention Facility 262
Plymouth County Correctional Facility 252
Jackson Parish Correctional Center 234
Eden Detention Center 230
Joe Corley Processing Center 214
Johnson County Corrections Center 204
CCA Florence Correctional Center 186
Limestone County Detention Center 176
Okmulgee County Jail - Moore Detention Facility 176
Jerome Combs Detention Center 174
Broward Transitional Center 166
Allen Parish Public Safety Complex 158
Elizabeth Contract Detention Facility 152
Kay County Detention Center 144
Henderson Detention Center 136
Hardin County Jail 132
Wakulla County Detention Facility 128
Worcester County Jail 125
El Valle Detention Facility 124
Nye County Detention Center 112
Catahoula Correctional Center 88
Geauga County Jail 88
Bossier Parish Corrections Center 80
Montgomery County Jail 80
Hall County Department of Corrections 66
Cambria County Prison 64
Seneca County Jail 62
Howard County Detention Center 54
Rio Grande Detention Center 54
Cibola County Correctional Center 48
Chippewa County Correctional Facility 44
Cass County Jail 40
Coastal Bend Detention Center 40
Golden State Annex 40
Morgan County Adult Detention Center 40
Washoe County Detention Center 40
Richwood Correctional Center 28
South Louisiana ICE Processing Center 28
Sheriff Al Cannon Detention Center 24
Carver County Jail 22
Saint Clair County Jail 20
Northern Oregon Correctional Facility 18
Shawnee County Department of Corrections - Adult Detention Center 18
Teller County Jail 16
Rolling Plains Detention Center 12
Christian County Jail 8
Monroe County Inmate Dormitory 8
San Luis Regional Detention Center 8
T. Don Hutto Residential Center 8
West Texas Detention Facility 8
Clay County Jail 4
Desert View Annex 2
Alamance County Detention Center 0
Boone County Jail 0
Brooks County Detention Center 0
Dorchester County Detention Center 0
East Hidalgo Detention Center 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Robert A. Deyton Detention Facility 0
Val Verde Correctional Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

3.2 Facet Plot of Disciplinary by Facility

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(6, "Paired")
plot_colors[6] <- "#000000"

# Create plot labels

plot_labels <- c(
    "Disciplinary Infractions",
    "Disciplinary Infractions - Guilty",
    "Disciplinary Appeals",
    "Disciplinary Appeals in Favor of Detainee",
    "Sanctions Over 60 Days",
    "Total Disciplinary")


df_discipline %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date,
             y = disciplinary_count,
             linetype = disciplinary_type))+
  geom_line(aes(color = disciplinary_type), size = .65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Disciplinary Type:",
    guide = guide_legend(nrow = 6)
    )+
  
  # Setting the color
  scale_color_manual(
  values = plot_colors,
  labels = plot_labels,
  name = "Disciplinary Type:"
  )+

  labs(title = "Disciplinary")+
  ylab("Number of Disciplinary Infractions")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =6))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

4 Solitary

4.1 Summary Tables

Of the present 163 inspections reviewed so far, there are more than 34,000 instances of solitary. That is roughly 208 instances of solitary per inspection.

df_solitary <- df_324_inc %>%
  
  # Select a subset of columns to work with
  select(id,
         facility,
         date,
         detainees_placed_in_administrative_segregation:
           detainees_placed_in_segregation_for_mental_health_reasons) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create new total column
  mutate(total_segregation = sum(c_across(detainees_placed_in_administrative_segregation:
                 detainees_placed_in_segregation_for_mental_health_reasons))) %>% 
  
  # Tidy
  pivot_longer(.,
               cols= detainees_placed_in_administrative_segregation:
                 total_segregation,
               names_to = "segregation_type",
               values_to = "segregation_count") %>% 
  
  # Remove NA
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(segregation_type = factor(segregation_type, levels = c(
    "detainees_placed_in_administrative_segregation",
    "detainees_placed_in_disciplinary_segregation",
    "detainees_placed_in_segregation_for_medical_reasons",
    "detainees_placed_in_segregation_for_mental_health_reasons",
    "total_segregation"
  )))
df_solitary %>% 
  group_by(segregation_type) %>% 
  summarise(`Total Solitary by Type` = sum(segregation_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Solitary by Type",
        col.names = c("Solitary Type", "Total Solitary Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 4.1: Total Solitary by Type
Solitary Type Total Solitary Type
detainees_placed_in_administrative_segregation 17236
detainees_placed_in_disciplinary_segregation 9551
detainees_placed_in_segregation_for_medical_reasons 9869
detainees_placed_in_segregation_for_mental_health_reasons 1003
total_segregation 37336
df_solitary %>% 
  group_by(facility) %>% 
  summarise(total_segregation = sum(segregation_count)) %>% 
  arrange(desc(total_segregation)) %>% 
  ungroup() %>% 
  kable(caption = "Total Solitary by Facility",
        col.names = c("Facility", "Total Solitary by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 4.1: Total Solitary by Facility
Facility Total Solitary by Facility
Krome Service Processing Center 10882
Eloy Detention Center 4556
El Paso Service Processing Center 3310
Prairieland Detention Center 2788
Henderson Detention Center 2638
Krome North Service Processing Center 2510
Winn Correctional Center 2474
Caroline Detention Facility 2438
Otero County Processing Center 2332
La Palma Correctional Center 2198
Adelanto ICE Processing Center - West 2178
Irwin County Detention Center 2172
River Correctional Center 1898
Stewart Detention Center 1814
South Texas ICE Processing Center 1696
Adams County Correctional Center 1456
York County Prison 1418
Montgomery Processing Center 1324
Adelanto ICE Processing Center - East 1308
Otay Mesa Detention Center 1266
Jackson Parish Correctional Center 1248
Aurora ICE Processing Center 1138
Aurora ICE Processing Center II - Annex 1138
Northwest ICE Processing Center 1028
Immigration Centers of America - Farmville 1006
Imperial Regional Detention Facility 1006
Glades County Detention Center 974
Port Isabel Service Processing Center 932
LaSalle ICE Processing Center 928
Sherburne County Jail 796
Pulaski County Detention Center 688
Catahoula Correctional Center 662
Pike County Correctional Facility 606
Jena LaSalle Detention Facility 602
Pine Prairie ICE Processing Center 554
Baker County Detention Center 468
McHenry County Adult Correctional Facility 462
Bluebonnet Detention Center 452
Florence Service Processing Center 388
Bergen County Jail 372
Houston Contract Detention Facility 372
Bristol County Jail and House of Correction 360
Wakulla County Detention Facility 342
Polk County Adult Detention Center 296
Calhoun County Correctional Center 274
Freeborn County Adult Detention Center 256
Richwood Correctional Center 256
Yuba County Jail 224
Hudson County Corrections and Rehabilitation Center 220
Essex County Correctional Facility 213
Limestone County Detention Center 206
Clinton County Correctional Facility 196
Donald W. Wyatt Detention Facility 194
Plymouth County Correctional Facility 176
El Valle Detention Facility 172
Dodge County Detention Facility 162
Geauga County Jail 150
Allen Parish Public Safety Complex 142
LaSalle Correctional Center 140
Okmulgee County Jail - Moore Detention Facility 140
Johnson County Corrections Center 136
Saint Clair County Jail 134
Elizabeth Contract Detention Facility 132
Folkston ICE Processing Center 126
Jerome Combs Detention Center 124
Joe Corley Processing Center 120
Nye County Detention Center 120
Mesa Verde ICE Processing Facility 108
Seneca County Jail 102
Kay County Detention Center 92
Worcester County Jail 82
Eden Detention Center 78
Clay County Jail 76
Butler County Jail 72
Torrance County Detention Facility 58
Hardin County Jail 56
Bossier Parish Corrections Center 54
Webb County Detention Center 54
Chippewa County Correctional Facility 50
David L. Moss Criminal Justice Center 46
Cambria County Prison 44
Montgomery County Jail 42
Strafford County Department of Corrections 42
Washoe County Detention Center 42
Hall County Department of Corrections 40
Rio Grande Detention Center 36
CCA Florence Correctional Center 34
Cibola County Correctional Center 32
Boone County Jail 28
Golden State Annex 26
Folkston ICE Processing Center Annex 24
Desert View Annex 22
Laredo Processing Center 22
Cass County Jail 20
Morgan County Adult Detention Center 20
Alamance County Detention Center 16
Teller County Jail 16
Northern Oregon Correctional Facility 14
Sheriff Al Cannon Detention Center 14
Carver County Jail 10
Howard County Detention Center 10
Orange County Correctional Facility 8
Shawnee County Department of Corrections - Adult Detention Center 6
Christian County Jail 4
Rolling Plains Detention Center 4
San Luis Regional Detention Center 4
Brooks County Detention Center 0
Broward Transitional Center 0
Coastal Bend Detention Center 0
Dorchester County Detention Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
LaSalle County Regional Detention Center 0
Monroe County Inmate Dormitory 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Robert A. Deyton Detention Facility 0
South Louisiana ICE Processing Center 0
T. Don Hutto Residential Center 0
Val Verde Correctional Facility 0
West Texas Detention Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

4.2 Facet Plots of Solitary by Facility

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Administrative",
    "Disciplinary",
    "Medical",
    "Mental Health",
    "Total")

df_solitary %>% 

# Calling the plot and formatting
  ggplot(aes(x=date,
             y = segregation_count,
             linetype = segregation_type))+
  geom_line(aes(color = segregation_type), size = .65) +
  
  # Set the color
  scale_color_manual(
  values = plot_colors,
  name = "Solitary Type:",
  labels = plot_labels)+
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
      name = "Solitary Type:",
    labels = plot_labels)+
  
  
  labs(title = "Reported Use of Solitary")+
  ylab("Number of Individuals Palced in Solitary")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+
    facet_wrap(~ facility, ncol=3)

4.3 Solitary Over 60 Days

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"

# Call the dataframe and select cols
df_324 %>% 
  select(id,
         facility,
         state,
         date,
         fac_operator,
         admin_seg_60_ice,
         disc_seg_60_ice) %>% 
  drop_na() %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Generate total col
  mutate(total_seg_60 = sum(c_across(
       admin_seg_60_ice:
       disc_seg_60_ice
  ))) %>%
  
  # Make tidy and filter
  pivot_longer(cols = admin_seg_60_ice:disc_seg_60_ice,
               names_to = "segregation_60_type",
               values_to = "segregation_60_count") %>%
  filter(segregation_60_type %in% c("admin_seg_60_ice", "disc_seg_60_ice")&
           segregation_60_count > 0) %>%
  
  # Initiate the plot and sort by sum
  ggplot(aes(x = segregation_60_count,
             y=reorder(fac_operator, segregation_60_count, sum),
             fill=segregation_60_type))+
  geom_bar(stat = "identity")+
  
  # Set the color fill
  scale_fill_brewer(type = "qual",
                    palette = "Paired",
                    name = "Segregation > 60 Type",
                    labels = c("Administrative",
                               "Disciplinary"))+
  labs(title= "Segregation > 60 Days by Facility Operator",
        x = "Segregation > 60 Days Count",
        y = "Facility Operator")+
  theme(legend.position = "bottom")

5 Use of Force

5.1 Summary Tables

df_force <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       immediate_use_of_force_incidents:
       strip_searches
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_use_of_force = sum(c_across(
       immediate_use_of_force_incidents:
       strip_searches
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  immediate_use_of_force_incidents:total_use_of_force,
               names_to = "use_of_force_type",
               values_to = "use_of_force_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factors
  mutate(use_of_force_type = factor(use_of_force_type, levels = c(
    "immediate_use_of_force_incidents",
    "calculated_use_of_force_incidents",
    "uses_of_force_with_chemical_agents",
    "incidents_where_non_lethal_weapons_were_used",
    "number_of_times_4_5_point_restraints_were_used",
    "use_of_force_with_serious_injury",
    "strip_searches",
    "total_use_of_force"
  )))
df_force %>% 
  group_by(use_of_force_type) %>% 
  summarise(`Total Use of Force by Type` = sum(use_of_force_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Use of Force by Type",
        col.names = c("Use of Force Type", "Total Use of Force Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 5.1: Total Use of Force by Type
Use of Force Type Total Use of Force Type
immediate_use_of_force_incidents 1184
calculated_use_of_force_incidents 325
uses_of_force_with_chemical_agents 362
incidents_where_non_lethal_weapons_were_used 18
number_of_times_4_5_point_restraints_were_used 97
use_of_force_with_serious_injury 2
strip_searches 20629
total_use_of_force 19170
df_force %>% 
  group_by(facility) %>% 
  summarise(total_use_of_force = sum(use_of_force_count)) %>% 
  arrange(desc(total_use_of_force)) %>% 
  ungroup() %>% 
  kable(caption = "Total Use of Force by Facility",
        col.names = c("Facility", "Total Use of Force by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 5.1: Total Use of Force by Facility
Facility Total Use of Force by Facility
Immigration Centers of America - Farmville 10782
La Palma Correctional Center 6022
Sheriff Al Cannon Detention Center 4854
Worcester County Jail 3348
Essex County Correctional Facility 2620
Hudson County Corrections and Rehabilitation Center 2294
York County Prison 2017
Cambria County Prison 1500
Pike County Correctional Facility 1120
Hall County Department of Corrections 916
Teller County Jail 876
Northern Oregon Correctional Facility 862
Eloy Detention Center 496
Bergen County Jail 294
Calhoun County Correctional Center 282
South Texas ICE Processing Center 254
Port Isabel Service Processing Center 234
Stewart Detention Center 174
Adelanto ICE Processing Center - West 164
Sherburne County Jail 150
Northwest ICE Processing Center 138
Bristol County Jail and House of Correction 130
Glades County Detention Center 126
Folkston ICE Processing Center 122
Otay Mesa Detention Center 120
Montgomery Processing Center 116
LaSalle ICE Processing Center 112
Baker County Detention Center 92
Krome Service Processing Center 80
Aurora ICE Processing Center 66
Aurora ICE Processing Center II - Annex 66
El Paso Service Processing Center 66
Jena LaSalle Detention Facility 66
River Correctional Center 66
Mesa Verde ICE Processing Facility 60
Pine Prairie ICE Processing Center 56
Donald W. Wyatt Detention Facility 54
Wakulla County Detention Facility 54
McHenry County Adult Correctional Facility 46
Irwin County Detention Center 42
Pulaski County Detention Center 42
Limestone County Detention Center 40
Prairieland Detention Center 40
Imperial Regional Detention Facility 38
Winn Correctional Center 36
Strafford County Department of Corrections 33
Bluebonnet Detention Center 32
Caroline Detention Facility 32
Johnson County Corrections Center 28
Adelanto ICE Processing Center - East 26
Jackson Parish Correctional Center 26
Boone County Jail 24
Houston Contract Detention Facility 24
Okmulgee County Jail - Moore Detention Facility 24
Morrow County Correctional Facility 22
Catahoula Correctional Center 20
Polk County Adult Detention Center 20
Dodge County Detention Facility 18
Orange County Correctional Facility 18
Otero County Processing Center 18
Yuba County Jail 18
CCA Florence Correctional Center 16
Plymouth County Correctional Facility 16
Shawnee County Department of Corrections - Adult Detention Center 16
Torrance County Detention Facility 16
Butler County Jail 14
Adams County Correctional Center 12
David L. Moss Criminal Justice Center 12
Eden Detention Center 12
Elizabeth Contract Detention Facility 12
Joe Corley Processing Center 12
Webb County Detention Center 12
Bossier Parish Corrections Center 10
Freeborn County Adult Detention Center 10
Krome North Service Processing Center 10
Broward Transitional Center 8
Clinton County Correctional Facility 8
Nye County Detention Center 8
Rio Grande Detention Center 8
Clay County Jail 6
Richwood Correctional Center 6
Val Verde Correctional Facility 6
Florence Service Processing Center 4
Folkston ICE Processing Center Annex 4
Hardin County Jail 4
Henderson Detention Center 4
Morgan County Adult Detention Center 4
Seneca County Jail 4
South Louisiana ICE Processing Center 4
Allen Parish Public Safety Complex 2
El Valle Detention Facility 2
Geauga County Jail 2
Howard County Detention Center 2
Kay County Detention Center 2
Rolling Plains Detention Center 2
Cass County Jail 1
Alamance County Detention Center 0
Brooks County Detention Center 0
Carver County Jail 0
Chippewa County Correctional Facility 0
Christian County Jail 0
Cibola County Correctional Center 0
Coastal Bend Detention Center 0
Desert View Annex 0
Dorchester County Detention Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Golden State Annex 0
Jerome Combs Detention Center 0
Laredo Processing Center 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Monroe County Inmate Dormitory 0
Montgomery County Jail 0
Platte County Detention Center 0
Robert A. Deyton Detention Facility 0
Saint Clair County Jail 0
San Luis Regional Detention Center 0
T. Don Hutto Residential Center 0
Washoe County Detention Center 0
West Texas Detention Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

5.2 Facet Plot of Use of Force by Facility

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(8, "Paired")
plot_colors[8] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Immediate Use of Force Incidents",
    "Calculated Use of Force Incidents",
    "Uses of Force with Chemical Agents",
    "Incidents Where Non-Lethal Weapons Were Used",
    "Times 4/5 Point Restraints Used",
    "Use of Force With Serious Injury",
    "Strip Searches",
    "Total Disciplinary")

df_force %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = use_of_force_count, linetype=use_of_force_type))+
  geom_line(aes(color = use_of_force_type), size = .65) +
  
  # setting the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Use of Force Type:",
    guide = guide_legend(nrow = 8)
    )+
  
  # Setting the color
  scale_color_manual(
  values = plot_colors,
  labels = plot_labels,
  name = "Use of Force Type:",
  )+

  labs(title = "Disciplinary")+
  ylab("Number of Disciplinary Infractions")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

    # Set the legend to multiple rows
  guides(col = guide_legend(nrow =8))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

6 Sexual Abuse and Assault

6.1 Allegations

6.1.1 Summary Tables

df_sex_alleg <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       sexual_abuse_allegations_detainee_on_detainee:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_sexual_abuse_allegations = sum(c_across(
       sexual_abuse_allegations_detainee_on_detainee:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  sexual_abuse_allegations_detainee_on_detainee:total_sexual_abuse_allegations,
               names_to = "sexual_abuse_allegations_type",
               values_to = "sexual_abuse_allegations_count") %>%
  
  # Remove NA
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(sexual_abuse_allegations_type = factor(sexual_abuse_allegations_type, levels = c(
    "sexual_abuse_allegations_detainee_on_detainee",
    "sexual_abuse_allegations_inmate_on_detainee",
    "sexual_abuse_allegations_detainee_on_inmate",
    "sexual_abuse_allegations_detainee_on_staff_contractor_volunteer",
    "sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29",
    "total_sexual_abuse_allegations"
  )))
df_sex_alleg %>% 
  group_by(sexual_abuse_allegations_type) %>% 
  summarise(`Sexual Abuse and Assault Allegations by Type` = sum(sexual_abuse_allegations_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sexual Abuse and Assault Allegations by Type",
        col.names = c("Allegation Type", "Total Allegation Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 6.1: Total Sexual Abuse and Assault Allegations by Type
Allegation Type Total Allegation Type
sexual_abuse_allegations_detainee_on_detainee 495
sexual_abuse_allegations_inmate_on_detainee 32
sexual_abuse_allegations_detainee_on_inmate 15
sexual_abuse_allegations_detainee_on_staff_contractor_volunteer 189
sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29 17
total_sexual_abuse_allegations 744
df_sex_alleg %>% 
  group_by(facility) %>% 
  summarise(total_sexual_abuse_allegations = sum(sexual_abuse_allegations_count)) %>% 
  arrange(desc(total_sexual_abuse_allegations)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sexual Abuse and Assault Allegations by Facility",
        col.names = c("Facility", "Total Allegations by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 6.1: Total Sexual Abuse and Assault Allegations by Facility
Facility Total Allegations by Facility
Otay Mesa Detention Center 160
Eloy Detention Center 122
Adelanto ICE Processing Center - West 102
Krome Service Processing Center 70
El Paso Service Processing Center 66
York County Prison 58
Montgomery Processing Center 44
South Texas ICE Processing Center 44
Northwest ICE Processing Center 36
Western Tennessee Detention Facility 36
Imperial Regional Detention Facility 32
Essex County Correctional Facility 24
Irwin County Detention Center 24
Adelanto ICE Processing Center - East 22
Bluebonnet Detention Center 22
Dodge County Detention Facility 22
Jackson Parish Correctional Center 22
LaSalle ICE Processing Center 22
Otero County Processing Center 22
Webb County Detention Center 22
Folkston ICE Processing Center 20
Caroline Detention Facility 18
Clinton County Correctional Facility 18
Yuba County Jail 18
Aurora ICE Processing Center 16
Aurora ICE Processing Center II - Annex 16
Calhoun County Correctional Center 16
CCA Florence Correctional Center 16
Hardin County Jail 16
Port Isabel Service Processing Center 16
Glades County Detention Center 14
Jena LaSalle Detention Facility 14
Okmulgee County Jail - Moore Detention Facility 14
Stewart Detention Center 14
Bergen County Jail 12
Eden Detention Center 12
Houston Contract Detention Facility 12
La Palma Correctional Center 12
Mesa Verde ICE Processing Facility 12
Prairieland Detention Center 12
Winn Correctional Center 12
Broward Transitional Center 8
Geauga County Jail 8
Joe Corley Processing Center 8
Limestone County Detention Center 8
Nye County Detention Center 8
Pine Prairie ICE Processing Center 8
Rio Grande Detention Center 8
River Correctional Center 8
Sherburne County Jail 8
Strafford County Department of Corrections 8
Baker County Detention Center 6
Florence Service Processing Center 6
Northern Oregon Correctional Facility 6
Torrance County Detention Facility 6
Adams County Correctional Center 4
Bristol County Jail and House of Correction 4
David L. Moss Criminal Justice Center 4
El Valle Detention Facility 4
Folkston ICE Processing Center Annex 4
Hall County Department of Corrections 4
Henderson Detention Center 4
Hudson County Corrections and Rehabilitation Center 4
Laredo Processing Center 4
McHenry County Adult Correctional Facility 4
Morgan County Adult Detention Center 4
Plymouth County Correctional Facility 4
Seneca County Jail 4
Val Verde Correctional Facility 4
Wakulla County Detention Facility 4
Bossier Parish Corrections Center 2
Cass County Jail 2
Chippewa County Correctional Facility 2
Cibola County Correctional Center 2
Clay County Jail 2
Dorchester County Detention Center 2
Elizabeth Contract Detention Facility 2
Freeborn County Adult Detention Center 2
Immigration Centers of America - Farmville 2
Kay County Detention Center 2
Krome North Service Processing Center 2
Monroe County Inmate Dormitory 2
Montgomery County Jail 2
Orange County Correctional Facility 2
Pike County Correctional Facility 2
Pulaski County Detention Center 2
Richwood Correctional Center 2
Rolling Plains Detention Center 2
Shawnee County Department of Corrections - Adult Detention Center 2
Sheriff Al Cannon Detention Center 2
South Louisiana ICE Processing Center 2
West Texas Detention Facility 2
Worcester County Jail 2
Alamance County Detention Center 0
Allen Parish Public Safety Complex 0
Boone County Jail 0
Brooks County Detention Center 0
Butler County Jail 0
Cambria County Prison 0
Carver County Jail 0
Catahoula Correctional Center 0
Christian County Jail 0
Coastal Bend Detention Center 0
Desert View Annex 0
Donald W. Wyatt Detention Facility 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Golden State Annex 0
Howard County Detention Center 0
Jerome Combs Detention Center 0
Johnson County Corrections Center 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Polk County Adult Detention Center 0
Robert A. Deyton Detention Facility 0
Saint Clair County Jail 0
San Luis Regional Detention Center 0
T. Don Hutto Residential Center 0
Teller County Jail 0
Washoe County Detention Center 0
Willacy County Regional Detention Facility 0

6.1.2 Facet Plot of Sexual Abuse and Assault Allegations by Facility

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(6, "Paired")
plot_colors[6] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Sexual Abuse Allegations - Detainee on Detainee",
    "Sexual Abuse Allegations - Inmate on Detainee",
    "Sexual Abuse Allegations - Detainee on Inmate",
    "Sexual Abuse Allegations - Staff/Contractor/Volunteer on Detainee",
    "Number of Sexual Abuse Allegations - Detainee on Staff/Contractor/Volunteer",
    "Total Sexual Abuse Allegations")

df_sex_alleg %>% 
  # Calling the plot and formatting
  ggplot(aes(x=date, y = sexual_abuse_allegations_count, linetype=sexual_abuse_allegations_type))+
  geom_line(aes(color = sexual_abuse_allegations_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Sexual Abuse Allegation Type:",
    guide = guide_legend(nrow = 6)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
                     labels = plot_labels,
                     name = "Sexual Abuse Allegation Type:")+

  labs(title = "Sexual Abuse Allegations")+
  ylab("Number of Allegations")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

    # Set the legend to multiple rows
  guides(col = guide_legend(nrow =8))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

6.2 Substantiated Allegations

6.2.1 Summary Tables

df_sex_alleg_sub <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       sexual_abuse_allegations_detainee_on_detainee_2:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_sexual_abuse_allegations = sum(c_across(
       sexual_abuse_allegations_detainee_on_detainee_2:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  sexual_abuse_allegations_detainee_on_detainee_2:total_sexual_abuse_allegations,
               names_to = "sexual_abuse_substantiated_type",
               values_to = "sexual_abuse_substantiated_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(sexual_abuse_substantiated_type= factor(sexual_abuse_substantiated_type, levels =c(
    "sexual_abuse_allegations_detainee_on_detainee_2",
    "sexual_abuse_allegations_inmate_on_detainee_2",
    "sexual_abuse_allegations_detainee_on_inmate_2",
    "sexual_abuse_allegations_staff_contractor_volunteer_on_detainee",
    "sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34",
    "total_sexual_abuse_allegations"
  )))
df_sex_alleg_sub %>% 
  group_by(sexual_abuse_substantiated_type) %>% 
  summarise(`Sexual Abuse and Assault Allegations Substantiated by Type` = sum(sexual_abuse_substantiated_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Substantiated Sexual Abuse and Assault Allegations by Type",
        col.names = c("Substantiated Allegation Type", "Total Substantiated Allegation Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 6.2: Total Substantiated Sexual Abuse and Assault Allegations by Type
Substantiated Allegation Type Total Substantiated Allegation Type
sexual_abuse_allegations_detainee_on_detainee_2 82
sexual_abuse_allegations_inmate_on_detainee_2 10
sexual_abuse_allegations_detainee_on_inmate_2 3
sexual_abuse_allegations_staff_contractor_volunteer_on_detainee 6
sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34 1
total_sexual_abuse_allegations 102
df_sex_alleg_sub %>% 
  group_by(facility) %>% 
  summarise(total_sexual_abuse_substantiated = sum(sexual_abuse_substantiated_count)) %>% 
  arrange(desc(total_sexual_abuse_substantiated)) %>% 
  ungroup() %>% 
  kable(caption = "Total Substantiated Sexual Abuse and Assault Allegations by Facility",
        col.names = c("Facility", "Total Substantiated Allegations by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 6.2: Total Substantiated Sexual Abuse and Assault Allegations by Facility
Facility Total Substantiated Allegations by Facility
Otay Mesa Detention Center 40
Eloy Detention Center 34
Krome Service Processing Center 26
York County Prison 18
Geauga County Jail 8
Folkston ICE Processing Center 6
Irwin County Detention Center 6
Webb County Detention Center 6
CCA Florence Correctional Center 4
Clay County Jail 4
Morgan County Adult Detention Center 4
Otero County Processing Center 4
Stewart Detention Center 4
Yuba County Jail 4
Baker County Detention Center 2
Bergen County Jail 2
Bluebonnet Detention Center 2
Chippewa County Correctional Facility 2
Dodge County Detention Facility 2
El Paso Service Processing Center 2
El Valle Detention Facility 2
Essex County Correctional Facility 2
Hardin County Jail 2
Joe Corley Processing Center 2
La Palma Correctional Center 2
LaSalle ICE Processing Center 2
Mesa Verde ICE Processing Facility 2
Monroe County Inmate Dormitory 2
Northern Oregon Correctional Facility 2
Okmulgee County Jail - Moore Detention Facility 2
Torrance County Detention Facility 2
Winn Correctional Center 2
Adams County Correctional Center 0
Adelanto ICE Processing Center - East 0
Adelanto ICE Processing Center - West 0
Alamance County Detention Center 0
Allen Parish Public Safety Complex 0
Aurora ICE Processing Center 0
Aurora ICE Processing Center II - Annex 0
Boone County Jail 0
Bossier Parish Corrections Center 0
Bristol County Jail and House of Correction 0
Brooks County Detention Center 0
Broward Transitional Center 0
Butler County Jail 0
Calhoun County Correctional Center 0
Cambria County Prison 0
Caroline Detention Facility 0
Carver County Jail 0
Cass County Jail 0
Catahoula Correctional Center 0
Christian County Jail 0
Cibola County Correctional Center 0
Clinton County Correctional Facility 0
Coastal Bend Detention Center 0
David L. Moss Criminal Justice Center 0
Desert View Annex 0
Donald W. Wyatt Detention Facility 0
Dorchester County Detention Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Eden Detention Center 0
Elizabeth Contract Detention Facility 0
Florence Service Processing Center 0
Folkston ICE Processing Center Annex 0
Freeborn County Adult Detention Center 0
Glades County Detention Center 0
Golden State Annex 0
Hall County Department of Corrections 0
Henderson Detention Center 0
Houston Contract Detention Facility 0
Howard County Detention Center 0
Hudson County Corrections and Rehabilitation Center 0
Immigration Centers of America - Farmville 0
Imperial Regional Detention Facility 0
Jackson Parish Correctional Center 0
Jena LaSalle Detention Facility 0
Jerome Combs Detention Center 0
Johnson County Corrections Center 0
Kay County Detention Center 0
Krome North Service Processing Center 0
Laredo Processing Center 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Limestone County Detention Center 0
McHenry County Adult Correctional Facility 0
Montgomery County Jail 0
Montgomery Processing Center 0
Morrow County Correctional Facility 0
Northwest ICE Processing Center 0
Nye County Detention Center 0
Orange County Correctional Facility 0
Pike County Correctional Facility 0
Pine Prairie ICE Processing Center 0
Platte County Detention Center 0
Plymouth County Correctional Facility 0
Polk County Adult Detention Center 0
Port Isabel Service Processing Center 0
Prairieland Detention Center 0
Pulaski County Detention Center 0
Richwood Correctional Center 0
Rio Grande Detention Center 0
River Correctional Center 0
Robert A. Deyton Detention Facility 0
Rolling Plains Detention Center 0
Saint Clair County Jail 0
San Luis Regional Detention Center 0
Seneca County Jail 0
Shawnee County Department of Corrections - Adult Detention Center 0
Sherburne County Jail 0
Sheriff Al Cannon Detention Center 0
South Louisiana ICE Processing Center 0
South Texas ICE Processing Center 0
Strafford County Department of Corrections 0
T. Don Hutto Residential Center 0
Teller County Jail 0
Val Verde Correctional Facility 0
Wakulla County Detention Facility 0
Washoe County Detention Center 0
West Texas Detention Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

6.2.2 Facet Plot of Substantiated Sexual Abuse and Assault Allegations

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(6, "Paired")
plot_colors[6] <- "#000000"

# Create the labels
plot_labels <- c(
    "Sexual Abuse Allegations - Detainee on Detainee",
    "Sexual Abuse Allegations - Inmate on Detainee",
    "Sexual Abuse Allegations - Detainee on Inmate",
    "Sexual Abuse Allegations - Staff/Contractor/Volunteer on Detainee",
    "Number of Sexual Abuse Allegations - Detainee on Staff/Contractor/Volunteer",
    "Total Sexual Abuse Allegations")

df_sex_alleg_sub %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = sexual_abuse_substantiated_count, linetype=sexual_abuse_substantiated_type))+
  geom_line(aes(color = sexual_abuse_substantiated_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Sexual Abuse Allegation Type:",
    guide = guide_legend(nrow = 6)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
                     labels = plot_labels,
                     name = "Sexual Abuse Allegation Type:")+

  labs(title = "Sexual Abuse Allegations Substantiated")+
  ylab("Number of Allegations")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =8))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

7 Medical

7.1 Medical Observation

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(3, "Paired")
plot_colors[3] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Detainees in Medical Observation",
    "Detainees in Mental Health Observation",
    "Total Individuals in Medical or Mental Health Observation")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       detainees_in_medical_observation:
       detainees_in_mental_health_observation
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_mental_medical_observation = sum(c_across(
       detainees_in_medical_observation:
       detainees_in_mental_health_observation
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  detainees_in_medical_observation:total_mental_medical_observation,
               names_to = "medical_mental_observation_type",
               values_to = "medical_mental_observation_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(medical_mental_observation_type = factor(medical_mental_observation_type, levels = c(
    "detainees_in_medical_observation",
    "detainees_in_mental_health_observation",
    "total_mental_medical_observation"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = medical_mental_observation_count, linetype=medical_mental_observation_type))+
  geom_line(aes(color = medical_mental_observation_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Observation Type:",
    guide = guide_legend(nrow = 3)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
                     labels = plot_labels,
                     name = "Observation Type:",)+

  labs(title = "Medical and Mental Health Observation")+
  ylab("Number of Individuals in Observation")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =3))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

7.2 Infections Disease

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(2, "Paired")

# Create plot labels
plot_labels <- c(
    "Infectious Disease Reported",
    "Infectious Disease Confirmed")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       infectious_disease_reported:
       infections_disease_confirmed
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # # Create a new total column
  # # In this case not used
  # mutate(total_infections_disease_report_confirmed = sum(c_across(
  #      infectious_disease_reported:
  #      infections_disease_confirmed
  # ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  infectious_disease_reported:infections_disease_confirmed,
               names_to = "infectious_disease_type",
               values_to = "infectious_disease_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(infectious_disease_type = factor(infectious_disease_type, levels = c(
    "infectious_disease_reported",
    "infections_disease_confirmed"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = infectious_disease_count, linetype=infectious_disease_type))+
  geom_line(aes(color = infectious_disease_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Category:",
    guide = guide_legend(nrow = 2)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
    labels = plot_labels,
    name = "Category:")+

  labs(title = "Infectious Diseases Reported and Confirmed")+
  ylab("Count")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =3))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

7.3 Medical and Mental Health Referrals

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Outside Medical Referrals",
    "Detainees Transported to Off-Site Hospitals for Emergency Reasons",
    "Admissions to Off-Site Hospitals for Medical Reasons",
    "Admissions to Off-Site Hospitals for Mental Health Reasons",
    "Total Referrals")


df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       outside_medical_referrals:
       admissions_to_off_site_hospitals_for_mental_health_reasons
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_referrals = sum(c_across(
       outside_medical_referrals:
       admissions_to_off_site_hospitals_for_mental_health_reasons
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  outside_medical_referrals:total_referrals,
               names_to = "referral_type",
               values_to = "referral_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(referral_type= factor(referral_type, levels = c(
    "outside_medical_referrals",
    "detainees_transported_to_off_site_hospitals_for_emergency_care",
    "admissions_to_off_site_hospitals_for_medical_reasons",
    "admissions_to_off_site_hospitals_for_mental_health_reasons",
    "total_referrals"
  ))) %>% 
  
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = referral_count, linetype=referral_type))+
  geom_line(aes(color = referral_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Referral Type:",
    guide = guide_legend(nrow = 5)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
    labels = plot_labels,
    name = "Referral Type:")+

  labs(title = "Medical and Mental Health Referrals")+
  ylab("Number of Referrals")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

7.4 Sick Call Requests and Encounters

df_sick_call <- df_324_inc %>%
  
  # Select a subset of columns to work with
  select(id,
         facility,
         date,
         sick_call_requests,
         sick_call_encounters) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create new total column
  mutate(total_sick_call = sick_call_requests,
         sick_call_encounters) %>% 
  
  # Tidy
  pivot_longer(.,
               cols= sick_call_requests:
         sick_call_encounters,
               names_to = "sick_call_type",
               values_to = "sick_call_count") %>% 
  
  # Remove NA
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(sick_call_type = factor(sick_call_type, levels = c(
    "sick_call_requests",
    "sick_call_encounters",
    "total_sick_call"
  )))
df_sick_call %>% 
  group_by(sick_call_type) %>% 
  summarise(`Total Sick Call by Type` = sum(sick_call_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sick Call by Type",
        col.names = c("Type", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 7.1: Total Sick Call by Type
Type Total
sick_call_requests 648941
sick_call_encounters 639104
df_sick_call %>% 
  group_by(facility) %>% 
  summarise(total_sick_call = sum(sick_call_count)) %>% 
  arrange(desc(total_sick_call)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sick Call Requests/Encounters by Facility",
        col.names = c("Facility", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 7.1: Total Sick Call Requests/Encounters by Facility
Facility Total
Adelanto ICE Processing Center - East 66777
Adelanto ICE Processing Center - West 66777
Port Isabel Service Processing Center 59808
South Texas ICE Processing Center 48814
Rio Grande Detention Center 48309
Montgomery Processing Center 44111
Otay Mesa Detention Center 42973
Eloy Detention Center 39798
Prairieland Detention Center 36952
Otero County Processing Center 30388
Imperial Regional Detention Facility 30196
Broward Transitional Center 30028
River Correctional Center 29224
Polk County Adult Detention Center 29048
El Paso Service Processing Center 28326
Henderson Detention Center 27056
Stewart Detention Center 26994
Jackson Parish Correctional Center 26363
Houston Contract Detention Facility 23860
Irwin County Detention Center 23626
Aurora ICE Processing Center 23178
Aurora ICE Processing Center II - Annex 23178
Krome Service Processing Center 23057
Essex County Correctional Facility 21902
Webb County Detention Center 21685
El Valle Detention Facility 19821
Winn Correctional Center 19786
Joe Corley Processing Center 16756
LaSalle ICE Processing Center 16400
La Palma Correctional Center 16032
Adams County Correctional Center 16025
Immigration Centers of America - Farmville 15811
Calhoun County Correctional Center 15122
York County Prison 14910
Jena LaSalle Detention Facility 14429
Florence Service Processing Center 14358
Bossier Parish Corrections Center 12884
Orange County Correctional Facility 12745
Elizabeth Contract Detention Facility 11870
Catahoula Correctional Center 11612
Laredo Processing Center 11282
Sherburne County Jail 11064
Mesa Verde ICE Processing Facility 10336
Folkston ICE Processing Center 9572
McHenry County Adult Correctional Facility 9245
Pine Prairie ICE Processing Center 9024
Torrance County Detention Facility 7766
Caroline Detention Facility 7762
South Louisiana ICE Processing Center 7608
Bluebonnet Detention Center 6309
Donald W. Wyatt Detention Facility 5965
Hudson County Corrections and Rehabilitation Center 5771
Baker County Detention Center 4575
Pulaski County Detention Center 4533
Richwood Correctional Center 4210
Folkston ICE Processing Center Annex 3778
Johnson County Corrections Center 3628
Okmulgee County Jail - Moore Detention Facility 3524
Pike County Correctional Facility 3480
Yuba County Jail 3432
Geauga County Jail 3299
Wakulla County Detention Facility 3161
Allen Parish Public Safety Complex 3052
CCA Florence Correctional Center 2830
T. Don Hutto Residential Center 2682
Clinton County Correctional Facility 2416
Clay County Jail 2351
Limestone County Detention Center 2334
Bristol County Jail and House of Correction 2266
David L. Moss Criminal Justice Center 2174
Bergen County Jail 2162
Kay County Detention Center 2026
Krome North Service Processing Center 1955
Carver County Jail 1940
Hardin County Jail 1688
Northwest ICE Processing Center 1616
Golden State Annex 1181
Butler County Jail 1174
Jerome Combs Detention Center 1086
Worcester County Jail 1060
Freeborn County Adult Detention Center 959
Nye County Detention Center 913
Morgan County Adult Detention Center 876
Boone County Jail 828
Cambria County Prison 742
Dodge County Detention Facility 709
Montgomery County Jail 658
Val Verde Correctional Facility 649
LaSalle Correctional Center 546
Howard County Detention Center 526
Strafford County Department of Corrections 507
Rolling Plains Detention Center 456
Northern Oregon Correctional Facility 414
Chippewa County Correctional Facility 385
Alamance County Detention Center 360
West Texas Detention Facility 334
Saint Clair County Jail 320
Coastal Bend Detention Center 296
Cibola County Correctional Center 259
Teller County Jail 220
Morrow County Correctional Facility 184
Platte County Detention Center 156
Shawnee County Department of Corrections - Adult Detention Center 132
Seneca County Jail 105
Desert View Annex 65
LaSalle County Regional Detention Center 62
Christian County Jail 24
Brooks County Detention Center 21
San Luis Regional Detention Center 19
Washoe County Detention Center 14
Dorchester County Detention Center 0
East Hidalgo Detention Center 0
Eden Detention Center 0
Robert A. Deyton Detention Facility 0
Sheriff Al Cannon Detention Center 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0
# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(3, "Paired")
plot_colors[3] <- "#000000"

# Create labels
plot_labels <- c(
    "Sick Call Requests",
    "Sick Call Encounters",
    "Total Sick Calls")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       sick_call_requests:
       sick_call_encounters
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_sick_calls = sum(c_across(
       sick_call_requests:
       sick_call_encounters
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  sick_call_requests:total_sick_calls,
               names_to = "sick_call_type",
               values_to = "sick_call_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(sick_call_type = factor(sick_call_type, levels = c(
    "sick_call_requests",
    "sick_call_encounters",
    "total_sick_calls"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = sick_call_count, linetype=sick_call_type))+
  geom_line(aes(color = sick_call_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Sick Call Type:",
    guide = guide_legend(nrow = 3)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
    labels = plot_labels,
    name = "Sick Call Type:")+

  labs(title = "Sick Calls")+
  ylab("Number of Sick Calls")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =3))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

7.5 Suicide Attempts and Watches

The following shows Suicide Attempts and Suicide Watches based on the status of the data as of 2021-07-05. The numbers are subject to change.

df_suicide <- df_324_inc %>%
  
  # Select a subset of columns to work with
  select(id,
         facility,
         date,
         suicide_attempts_or_self_harm,
         suicide_watches_constant_watch_mental_health_observation) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create new total column
  mutate(total_suicide = suicide_attempts_or_self_harm +
         suicide_watches_constant_watch_mental_health_observation) %>% 
  
  # Tidy
  pivot_longer(.,
               cols= suicide_attempts_or_self_harm:
               total_suicide,
               names_to = "suicide_type",
               values_to = "suicide_count") %>% 
  
  # Remove NA
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(segregation_type = factor(suicide_type, levels = c(
    "suicide_attempts_or_self_harm",
    "suicide_watches_constant_watch_mental_health_observation",
    "total_suicide"
  )))
df_suicide %>% 
  group_by(suicide_type) %>% 
  summarise(`Total Suicide Attempt or Watch by Type` = sum(suicide_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Suicide Attempt or Watch by Type",
        col.names = c("Type", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 7.2: Total Suicide Attempt or Watch by Type
Type Total
suicide_attempts_or_self_harm 244
suicide_watches_constant_watch_mental_health_observation 5122
total_suicide 5364
df_suicide %>% 
  group_by(facility) %>% 
  summarise(total_suicide = sum(suicide_count)) %>% 
  arrange(desc(total_suicide)) %>% 
  ungroup() %>% 
  kable(caption = "Total Suicide Attempt or Watch by Facility",
        col.names = c("Facility", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 7.2: Total Suicide Attempt or Watch by Facility
Facility Total
Adelanto ICE Processing Center - East 878
Adelanto ICE Processing Center - West 878
Henderson Detention Center 750
Aurora ICE Processing Center 606
Aurora ICE Processing Center II - Annex 606
Bergen County Jail 468
La Palma Correctional Center 402
Bristol County Jail and House of Correction 390
Port Isabel Service Processing Center 358
Otay Mesa Detention Center 282
Stewart Detention Center 272
Eloy Detention Center 246
York County Prison 214
Otero County Processing Center 192
Montgomery Processing Center 182
Irwin County Detention Center 178
Prairieland Detention Center 158
South Texas ICE Processing Center 158
Essex County Correctional Facility 156
Caroline Detention Facility 144
Pike County Correctional Facility 144
Imperial Regional Detention Facility 134
Folkston ICE Processing Center 122
River Correctional Center 122
Polk County Adult Detention Center 114
Nye County Detention Center 106
Florence Service Processing Center 104
Glades County Detention Center 102
LaSalle ICE Processing Center 102
Winn Correctional Center 92
El Valle Detention Facility 86
Immigration Centers of America - Farmville 86
El Paso Service Processing Center 84
Krome Service Processing Center 74
Sherburne County Jail 74
Houston Contract Detention Facility 68
Jena LaSalle Detention Facility 68
Broward Transitional Center 64
Joe Corley Processing Center 64
Adams County Correctional Center 62
Northwest ICE Processing Center 58
Baker County Detention Center 56
Limestone County Detention Center 56
Carver County Jail 54
Hudson County Corrections and Rehabilitation Center 54
Mesa Verde ICE Processing Facility 52
Elizabeth Contract Detention Facility 50
Pulaski County Detention Center 50
Pine Prairie ICE Processing Center 48
Webb County Detention Center 48
Jackson Parish Correctional Center 46
Plymouth County Correctional Facility 42
Rio Grande Detention Center 40
Calhoun County Correctional Center 38
CCA Florence Correctional Center 36
McHenry County Adult Correctional Facility 32
Strafford County Department of Corrections 32
David L. Moss Criminal Justice Center 30
South Louisiana ICE Processing Center 30
Donald W. Wyatt Detention Facility 24
Folkston ICE Processing Center Annex 24
Yuba County Jail 24
Butler County Jail 22
Orange County Correctional Facility 22
Torrance County Detention Facility 22
Worcester County Jail 22
Johnson County Corrections Center 20
Shawnee County Department of Corrections - Adult Detention Center 20
Bluebonnet Detention Center 18
Boone County Jail 18
Allen Parish Public Safety Complex 16
Catahoula Correctional Center 16
Clinton County Correctional Facility 16
Kay County Detention Center 14
Alamance County Detention Center 12
Val Verde Correctional Facility 12
Wakulla County Detention Facility 12
Bossier Parish Corrections Center 10
Dodge County Detention Facility 10
Howard County Detention Center 10
Okmulgee County Jail - Moore Detention Facility 10
Seneca County Jail 10
Clay County Jail 8
Geauga County Jail 8
Krome North Service Processing Center 8
Laredo Processing Center 8
Richwood Correctional Center 8
Robert A. Deyton Detention Facility 8
San Luis Regional Detention Center 8
Coastal Bend Detention Center 6
Golden State Annex 6
Sheriff Al Cannon Detention Center 6
Freeborn County Adult Detention Center 4
Hardin County Jail 4
LaSalle Correctional Center 4
Morgan County Adult Detention Center 4
Cambria County Prison 2
Chippewa County Correctional Facility 2
Desert View Annex 2
Hall County Department of Corrections 2
Jerome Combs Detention Center 2
Northern Oregon Correctional Facility 2
West Texas Detention Facility 2
Brooks County Detention Center 0
Cass County Jail 0
Christian County Jail 0
Cibola County Correctional Center 0
Dorchester County Detention Center 0
East Hidalgo Detention Center 0
Eden Detention Center 0
LaSalle County Regional Detention Center 0
Monroe County Inmate Dormitory 0
Montgomery County Jail 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Rolling Plains Detention Center 0
Saint Clair County Jail 0
T. Don Hutto Residential Center 0
Teller County Jail 0
Washoe County Detention Center 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0
# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(2, "Paired")

# Create plot labels
plot_labels <- c(
      "Suicide Attempts or Self Harm",
      "Suicide Watches/Constant Watch/Mental Health Observation")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       suicide_attempts_or_self_harm,
       suicide_watches_constant_watch_mental_health_observation
       ) %>% 
  drop_na() %>% 
 
  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  c(suicide_attempts_or_self_harm,
       suicide_watches_constant_watch_mental_health_observation),
               names_to = "suicide_type",
               values_to = "suicide_count") %>% 
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(suicide_type = factor(suicide_type, levels = c(
    "suicide_attempts_or_self_harm",
    "suicide_watches_constant_watch_mental_health_observation"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = suicide_count))+
  geom_line(aes(color=suicide_type), size = .65) +
  
  # Set the color
  scale_color_manual(
    values = plot_colors,
    labels = plot_labels,
    name = "Type:"
    )+
  
  labs(title = "Suicide Attempts and Watches")+
  ylab("Number of Attempts or Watches")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 5),
    legend.position = "bottom"
    )+
  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol = 3)

7.6 Hunger Strikes

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date, hunger_strikes) %>% 

  group_by(facility) %>% 
  summarise(total_hunger_strike = sum(hunger_strikes)) %>% 
  arrange(desc(total_hunger_strike)) %>% 
  ungroup() %>% 
  kable(caption = "Total Hunger Strikes by Facility",
        col.names = c("Facility", "Total Hunger Strikes")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 7.3: Total Hunger Strikes by Facility
Facility Total Hunger Strikes
Bossier Parish Corrections Center 136
Krome Service Processing Center 71
La Palma Correctional Center 62
LaSalle ICE Processing Center 53
Otero County Processing Center 51
Jena LaSalle Detention Facility 49
Otay Mesa Detention Center 48
El Paso Service Processing Center 46
Port Isabel Service Processing Center 35
Adelanto ICE Processing Center - East 28
Adelanto ICE Processing Center - West 28
Montgomery Processing Center 18
Prairieland Detention Center 17
Bergen County Jail 15
Irwin County Detention Center 14
Okmulgee County Jail - Moore Detention Facility 14
Johnson County Corrections Center 13
Imperial Regional Detention Facility 11
South Texas ICE Processing Center 11
Florence Service Processing Center 8
Teller County Jail 8
Butler County Jail 7
Houston Contract Detention Facility 7
Immigration Centers of America - Farmville 6
Elizabeth Contract Detention Facility 5
Folkston ICE Processing Center 5
Plymouth County Correctional Facility 5
Sherburne County Jail 5
Torrance County Detention Facility 5
David L. Moss Criminal Justice Center 4
Joe Corley Processing Center 4
Henderson Detention Center 3
York County Prison 3
Calhoun County Correctional Center 2
Caroline Detention Facility 2
Golden State Annex 2
McHenry County Adult Correctional Facility 2
Nye County Detention Center 2
Polk County Adult Detention Center 2
Wakulla County Detention Facility 2
Broward Transitional Center 1
Cambria County Prison 1
Catahoula Correctional Center 1
CCA Florence Correctional Center 1
Clinton County Correctional Facility 1
Desert View Annex 1
El Valle Detention Facility 1
Hudson County Corrections and Rehabilitation Center 1
Northern Oregon Correctional Facility 1
Pulaski County Detention Center 1
Alamance County Detention Center 0
Boone County Jail 0
Brooks County Detention Center 0
Carver County Jail 0
Cass County Jail 0
Chippewa County Correctional Facility 0
Christian County Jail 0
Clay County Jail 0
Coastal Bend Detention Center 0
Donald W. Wyatt Detention Facility 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Eden Detention Center 0
Essex County Correctional Facility 0
Folkston ICE Processing Center Annex 0
Glades County Detention Center 0
Hall County Department of Corrections 0
Hardin County Jail 0
Laredo Processing Center 0
Limestone County Detention Center 0
Mesa Verde ICE Processing Facility 0
Montgomery County Jail 0
Morgan County Adult Detention Center 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Rio Grande Detention Center 0
Robert A. Deyton Detention Facility 0
Rolling Plains Detention Center 0
Saint Clair County Jail 0
Seneca County Jail 0
Shawnee County Department of Corrections - Adult Detention Center 0
Sheriff Al Cannon Detention Center 0
Strafford County Department of Corrections 0
T. Don Hutto Residential Center 0
Val Verde Correctional Facility 0
Washoe County Detention Center 0
Webb County Detention Center 0
West Texas Detention Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0
Worcester County Jail 0
Adams County Correctional Center NA
Alamance County Jail NA
Allen Parish Public Safety Complex NA
Aurora ICE Processing Center NA
Aurora ICE Processing Center II - Annex NA
Baker County Detention Center NA
Bluebonnet Detention Center NA
Bristol County Jail and House of Correction NA
Chase County Detention Center NA
Cibola County Correctional Center NA
Dodge County Detention Facility NA
Dorchester County Detention Center NA
Eloy Detention Center NA
Etowah County Jail NA
Freeborn County Adult Detention Center NA
Geauga County Jail NA
Howard County Detention Center NA
Jackson Parish Correctional Center NA
Jerome Combs Detention Center NA
Kay County Detention Center NA
Krome North Service Processing Center NA
LaSalle Correctional Center NA
LaSalle County Regional Detention Center NA
Monroe County Inmate Dormitory NA
Northwest ICE Processing Center NA
Orange County Correctional Facility NA
Pike County Correctional Facility NA
Pine Prairie ICE Processing Center NA
Richwood Correctional Center NA
River Correctional Center NA
San Luis Regional Detention Center NA
South Louisiana ICE Processing Center NA
Stewart Detention Center NA
Winn Correctional Center NA
Yuba County Jail NA
NA NA
# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(2, "Paired")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       hunger_strikes
       ) %>% 
  drop_na() %>% 
 

  # Calling the plot and formatting
  ggplot(aes(x=date, y = hunger_strikes))+
  geom_line(size = .65) +
  
  # scale_color_manual(
  #   values = plot_colors,
  #   labels = c(
  #     "Suicide Attempts or Self Harm",
  #     "Suicide Watches/Constant Watch/Mental Health Observation"
  #     ),
  #   name = "Type:"
  #   )+
  # 
  labs(title = "Hunger Strikes")+
  ylab("Number of Hunger Strikes")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 5),
    legend.position = "bottom"
    )+
  
  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol = 3)

8 Cause of Death

8.1 Suicide as Cause of Death

Bar plot of ICE and non-ICE deaths by suicide plotted by facility as of 2021-07-05.

df_324 %>% 
  select(id,
         facility,
         state,
         date,
         fac_operator,
         cod_suicide_ice,
         cod_suicide_not_ice) %>% 
  drop_na() %>% 
  filter(cod_suicide_ice>0|cod_suicide_not_ice >0) %>% 
  mutate(cod_suicide_total = cod_suicide_ice + cod_suicide_not_ice) %>% 
  
  # Here one could call datatable() or kable()
  # to get a list of the facilities and count
  
  # Initiate the plot
  ggplot(aes(x=cod_suicide_total, y=facility))+
  geom_boxplot()+
  scale_x_continuous(breaks = c(1,2))+
  labs(title = "Cause of Death Suicide",
       subtitle = "Includes ICE and non-ICE Deaths by Suicide")+
  xlab("COD Suicide Total")+
  ylab("Facility")

9 Observations

Observations made on the data as they accumulate are logged below.

9.1 28 May 2021

  1. Adelanto ICE Processing Center - East and West have identical data for 2020, but the numbers are different for 2019 with East being much lower than west. Craig checked the inspections and the numbers are different for East and West in 2019 while they are in fact the same for 2020. Note that 2020 is a remote inspection. However, it is significant that the two are comparable in one instance and not comparable in another case.

  2. Almance County Jail and Chase County Detention Center both seem to register blank for solitary. Craig suspects this is because there were not cases of solitary reported.

9.2 27 May 2021

One of the important early observations has to do with the naming of facilities. ICE is often inconsistent with facility naming and the names do often change over time. Both the changing of names and inconsistent naming conventions can cause confusion as well as error when tabulating results.

  1. The graphs for “Adelanto ICE Processing Center - East” and “Adelanto ICE Processing Center - West” are identical. This is consistent with information Craig recalls seeing in one of the inspections, that the numbers for the facilities are “merged” or combined.

    • For facet graphing consider filtering. For analysis purposes may need to treat the two facilities as “merged”
  2. Adelanto ICE Processing Center West” should be combined with “Adelanto ICE Processing Center - West.” It appears that ICE is not consistently naming the facilities, in one case the name lacks a dash character which causes them to be graphed separately.

    • The dash was added to Adelanto West.
  3. It would be good to check if there really two facilities in Almance County. There are entries listed for “Almance County Detention Center” and “Almance County Jail.”

    • Need to verify that these are in fact distinct facilities.
  4. Aurora ICE Processing Center II - Annex” and “Aurora II Annex” should probably be combined. Need to check the inspections to verify.

    • Aurora II Annex (CO) - Jan. 29, 2021" was changed to”Aurora ICE Processing Center II - Annex (CO) - Jan. 29, 2021"

10 References

Bryan, Jennifer. 2021. Googlesheets4: Access Google Sheets Using the Sheets API V4. https://github.com/tidyverse/googlesheets4.
MA AG. 2020. “Investigation into the Events of May 1, 2020 at the c. Carlos Carreiro Immigration Detention Center, Unit b, Bristol County Sheriffs Office.” Boston, MA. https://www.mass.gov/doc/ago-report-into-bcso-response-to-may-1-disturbance/download.
Spinu, Vitalie, Garrett Grolemund, and Hadley Wickham. 2021. Lubridate: Make Dealing with Dates a Little Easier. https://CRAN.R-project.org/package=lubridate.
Swetlitz, Ike. 2020. “’Suddenly They Started Gassing Us’: Cuban Migrants Tell of Shocking Attack at ICE Prison.” https://www.theguardian.com/us-news/2020/jul/02/cuban-migrants-detention-ice-facility-new-mexico.
Tukey, John Wilder. 1977. Exploratory Data Analysis. Addison-Wesley Series in Behavioral Science. Reading, Mass: Addison-Wesley Pub. Co.
Wickham, Hadley, Winston Chang, Lionel Henry, Thomas Lin Pedersen, Kohske Takahashi, Claus Wilke, Kara Woo, Hiroaki Yutani, and Dewey Dunnington. 2021. Ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://CRAN.R-project.org/package=ggplot2.
Wickham, Hadley, and Jim Hester. 2020. Readr: Read Rectangular Text Data. https://CRAN.R-project.org/package=readr.
LS0tDQp0aXRsZTogIlByZWxpbWluYXJ5IFJlYWRpbmcgYW5kIEdyYXBoaW5nIG9mIEluc3BlY3Rpb24gRGF0YSINCmF1dGhvcjogIk5hdGhhbiBDcmFpZyINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVBICVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOiANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQpiaWJsaW9ncmFwaHk6IFtjaXRhdGlvbnMuYmliLCBwYWNrYWdlcy5iaWJdDQotLS0NCg0KRHVyaW5nIHRoZSBTdW1tZXIgb2YgMjAyMSwgZGF0YSBmcm9tIElDRSBmYWNpbGl0eSBpbnNwZWN0aW9ucyB3YXMgY29tcGlsZWQgaW50byBhIHNlcmllcyBvZiBzcHJlYWRzaGVldHMuIFRoZSBpbXBldHVzIGZvciB0aGUgcHJvamVjdCB3YXMgTmF0aGFuIENyYWlnIHdobyB3YXMgaW50ZXJlc3RlZCBpbiBjb2xsYXRpbmcgdGhlIGRhdGEgdG8gZXhhbWluZSB0aGVtIGZvciB0cmVuZHMsIHBhdHRlcm5zLCBhbmQgYW5vbWFsaWVzLiBUaGUgd29yayB3YXMgcGVyZm9ybWVkIGJ5IHRocmVlIHN0dWRlbnRzIGZ1bmRlZCB1bmRlciBhIE5hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiBncmFudCBhd2FyZGVkIHRvIERyLiBOZWlsIEhhcnZleSAoTk1TVSkgYW5kIERyLiBKZXJlbXkgU2xhY2sgKE5NU1UpLiBUaGUgc3R1ZGVudHMgd2hvIHBlcmZvcm1lZCB0aGUgd29yayB3ZXJlIEp1YW4gQmVjZXJyYSAoU3RhbmZvcmQpLCBBdmlnYWlsIFR1cmltYSBSb21vIChDb2x1bWJpYSksIGFuZCBEYW5pZWxhIE5hdmFycm8gVmVyZHVnbyAoQ1NTTE8pLiBUaGUgdGhyZWUgc3R1ZGVudHMgd29ya2VkIHdpdGggTmF0aGFuIENyYWlnIChOTVNVIGFuZCBBVklEKSB0byBkZXZlbG9wIGEgd29ya2Zsb3cgZm9yIGNvbXBpbGluZyBpbmRpdmlkdWFsIHJlcG9ydCBzaWduaWZpY2FudCBpbmNpZGVudCBzdW1tYXJ5IGZvcm1zIGFuZCBpbnNwZWN0aW9uIGNvdmVyIGxldHRlcnMgaW50byBhIHNlcmllcyBvZiBzcHJlYWRzaGVldHMuDQoNClRoaXMgZG9jdW1lbnQgaXMgYSBwcmVsaW1pbmFyeSBwcm9vZiBvZiBjb25jZXB0IGFuZCBpbml0aWFsIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgW0B0dWtleTE5NzddLiBHb2FscyBvZiB0aGUgZG9jdW1lbnQgYXJlIHRvOg0KDQotICAgaWxsdXN0cmF0ZSB0aGUga2luZHMgb2YgYW5hbHlzaXMgcG9zc2libGUgd2l0aCB0aGUgdGFidWxhdGlvbiBvZiBJQ0UgaW5zcGVjdGlvbiBkYXRhDQotICAgZGVtb25zdHJhdGUgY29kZSBmb3IgcmVhZGluZyB0aGUgc3ByZWFkc2hlZXQNCi0gICBzaG93IHNwZWNpZmljIHdyYW5nbGluZyBtZXRob2RzIHVuaXF1ZSB0byB0aGUgZGF0YSBzdHJ1Y3R1cmUNCi0gICBwcm92aWRlIHByZWxpbWluYXJ5IGV4cGxvcmF0b3J5IHBsb3Qgb2Ygc2VsZWN0IHZhcmlhYmxlcyBmcm9tIHRoZSBTaWduaWZpY2FudCBJbmNpZGVudCBTdW1tYXJ5IFNoZWV0cy4NCg0KVGhlIGRhdGEgYXJlIHByZXNlbnRseSBpbmNvbXBsZXRlIGFuZCByZXByZXNlbnQgcmVzdWx0cyBjb21waWxlZCBhcyBvZiBgciBTeXMuRGF0ZSgpYC4NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQoJZWNobyA9IFRSVUUsDQoJbWVzc2FnZSA9IEZBTFNFLA0KCXdhcm5pbmcgPSBGQUxTRQ0KKQ0KYGBgDQoNCmBgYHtyIGxvYWQtbGlicmFyaWVzfQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCg0KIyBSZWFkaW5nIGFuZCB3cmFuZ2xpbmcNCmxpYnJhcnkoZ29vZ2xlc2hlZXRzNCkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShEVCkNCg0KIyBQbG90dGluZw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCiMgVGFibGVzDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgTG9hZCBjdXN0b20gZnVuY3Rpb24NCnNvdXJjZSgiZnVuY3Rpb25fY2xlYW5fZmFjaWxpdHlfbmFtZXMuUiIsIGxvY2FsID0ga25pdHI6OmtuaXRfZ2xvYmFsKCkpDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24NCg0KIyMgTWV0aG9kIGZvciBSZWFkaW5nIEctMzI0QS0xOS1pbmMgZm9ybQ0KDQpUaGUgY29kZSBmb3IgdGhpcyByZXBvcnQgaXMgc3BlY2lmaWMgdG8gZGF0YSBsb2dnZWQgaW4gdGhlIEctMzI0QS0xOSBmb3JtIGFuZCB0aGUgaW5jaWRlbnQgc3VtbWFyaWVzIHBvcnRpb24gb2YgdGhhdCBmb3JtLiBUaGUgaW5jaWRlbnQgc3VtbWFyeSBwb3J0aW9uIG9mIHRoaXMgZm9ybSBpcyBwcm9iYWJseSB0aGUgbW9zdCBjb21wbGV4IGRhdGEgc3RydWN0dXJlIGluIHRoZSBwcm9qZWN0IGFuZCBhbHNvIGNvbnRhaW5zIHRoZSBsYXJnZXN0IHZvbHVtZSBvZiBxdWFudGl0YXRpdmUgaW5mb3JtYXRpb24uIFRoZXJlZm9yZSwgaXQgc2VlbWVkIGxpa2UgYSBnb29kIHBsYWNlIHRvIHN0YXJ0IHdpdGggYW4gaW5pdGlhbCBwcm9vZiBvZiBjb25jZXB0Lg0KDQpBdCB0aGUgb3V0c2V0LCB0aGVyZSB3ZXJlIGlzc3VlcyByZWFkaW5nIGluIHRoZSBHb29nbGUgU2hlZXQuIFNldmVyYWwgb2YgdGhlIG51bWVyaWMgY29sdW1ucyByZWFkIGludG8gUiBhcyBsaXN0cyB3aGljaCB3YXMgdW5kZXNpcmFibGUuIEluIHRoZSBHb29nbGUgU2hlZXQsIENyYWlnIHNldCB0aGUgY29sdW1ucyB0byBgcGxhaW4gdGV4dGAgcmF0aGVyIHRoYW4gYGF1dG9gIGFuZCB0aGUgZGF0YSByZWFkIGluIGZpbmUgYXMgY2hhcmFjdGVyIGNvbHVtbnMuIFRoaXMgc2VlbWVkIHRvIHJlc29sdmUgdGhlIGlzc3VlIGZvciBhIHRpbWUsIGFuZCBpdCB3YXMgcG9zc2libGUgdG8gdXNlIHRoZSBgdHlwZV9jb252ZXJ0KClgIGZ1bmN0aW9uIGZyb20gdGhlIGByZWFkcmAgbGlicmFyeSBbQFItcmVhZHJdIHRvIGNvbnZlcnQgdGhlc2UgY29sdW1ucyB0byBudW1iZXJzLiBBZGRpdGlvbmFsIHN0ZXBzIHdlcmUgdGFrZW4gdG8gdXNlIHRoZSBgcmVhZF9zaGVldGAgZnVuY3Rpb24gb2YgdGhlIGBnb29nbGVzaGVldHM0YCBsaWJyYXJ5IFtAUi1nb29nbGVzaGVldHM0XSB0byBleHBsaWNpdGx5IHNldCB0aGUgY29sdW1uIHR5cGVzIHRvIGNoYXJhY3Rlci4NCg0KVGhlcmUgd2VyZSBhbHNvIHNvbWUgaXNzdWVzIHVzaW5nIGBsdWJyaWRhdGVgIFtAUi1sdWJyaWRhdGVdIHRvIHdyYW5nbGUgdGhlIG1vbnRoIGFuZCB5ZWFyIGZpZWxkcyB0byBhIHByb3BlciBkYXRlLiBDcmFpZyB3YXMgbm90IGFibGUgdG8gZGlzY2VybiB0aGUgY2F1c2Ugb2YgdGhlIGlzc3VlLiBIb3dldmVyLCBjaGFuZ2luZyB0aGUgbW9udGggZm9ybWF0IG9uIHRoZSBpbmNpZGVudCBzaGVldCBmcm9tIGFiYnJldmlhdGVkIHRvIGZ1bGx5IHdyaXR0ZW4gb3V0IG1vbnRocyBzb2x2ZWQgdGhlIGlzc3VlLiBUaG9zZSBjaGFuZ2VzIHdlcmUgbWFkZSBpbiB0aGUgbWFzdGVyIEdvb2dsZSBTaGVldCBhbmQgdGhlIGRhdGEgd2VyZSBjYWxsZWQgdXNpbmcgdGhlIGBnb29nbGVzaGVldHM0YCBsaWJyYXJ5Lg0KDQpgYGB7ciByZWFkLWRhdGEtMzI0fQ0KIyBSZWFkIGluIFNoZWV0IEctMzI0QS0xOQ0KZGZfMzI0IDwtIHJlYWRfc2hlZXQoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFpbTVWU2kzYklFaTEzTzhXUTU2d0VJWFN5TkVzdGJHTXlsWFhnRDliQUcwL2VkaXQjZ2lkPTE4NTgyMjcwNzEiLA0KICAgICAgICAgICAgICAgICBzaGVldD0iRy0zMjRBLTE5IiwNCiAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gImMiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KICANCiAgIyBSdW4gY3VzdG9tIGNsZWFuaW5nIGZ1bmN0aW9uDQogIGNsZWFuX2ZhY2lsaXR5X25hbWVzKCkgJT4lIA0KICANCiAgIyBkZiBzcGVjaWZpYyBjaGFuZ2VzDQogIG11dGF0ZShmYWNpbGl0eSA9IGFzLmZhY3RvcihmYWNpbGl0eSksDQogICAgICAgICBzdGF0ZSA9IGFzLmZhY3RvcihzdGF0ZSksDQogICAgICAgICBkYXRlID0gbWR5KGluc3BlY3Rpb25fZGF0ZSksDQogICAgICAgICBjdXJyZW50X2luc3BlY3Rpb25fZGF0ZV9mcm9tID0gbWR5KGN1cnJlbnRfaW5zcGVjdGlvbl9kYXRlX2Zyb20pLA0KICAgICAgICAgY3VycmVudF9pbnNwZWN0aW9uX2RhdGVfdG8gPSBtZHkoY3VycmVudF9pbnNwZWN0aW9uX2RhdGVfdG8pDQogICAgICAgICApICU+JSANCiAgcmVsb2NhdGUoZGF0ZSwgLmJlZm9yZSA9IGluc3BlY3Rpb25fZGF0ZSkgJT4lIA0KICBtdXRhdGVfYXQoYygyMDo0OSksIGFzLm51bWVyaWMpDQpgYGANCg0KYGBge3IgcmVhZC1kYXRhLTMyNC1pbmNpZGVudH0NCiMgUmVhZCBHb29nbGUgU2hlZXQgaW5jaWRlbnQgd29ya3NoZWV0LCBjb252ZXJ0IHRvIGRhdGEgZnJhbWUsIGFuZCB3cmFuZ2xlDQpkZl8zMjRfaW5jIDwtIHJlYWRfc2hlZXQoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFpbTVWU2kzYklFaTEzTzhXUTU2d0VJWFN5TkVzdGJHTXlsWFhnRDliQUcwL2VkaXQjZ2lkPTE4NTgyMjcwNzEiLA0KICAgICAgICAgICAgICAgICBzaGVldD0iRy0zMjRBLTE5LWluYyIsDQogICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9ICJjIikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JQ0KICANCiAgIyBSdW4gY3VzdG9tIGNsZWFuaW5nIGZ1bmN0aW9uDQogIGNsZWFuX2ZhY2lsaXR5X25hbWVzKCkgJT4lIA0KDQoNCiAgIyBkZl9zcGVjaWZpYyBjaGFuZ2VzDQogIHVuaXRlKGRhdGUsIHllYXI6bW9udGgpICU+JSANCiAgbXV0YXRlKGZhY2lsaXR5ID0gYXMuZmFjdG9yKGZhY2lsaXR5KSwNCiAgICAgICAgIHN0YXRlID0gYXMuZmFjdG9yKHN0YXRlKSwNCiAgICAgICAgIGRhdGUgPSB5bShkYXRlKQ0KICAgICAgICAgKSAlPiUgDQogIG11dGF0ZV9hdChjKDY6NzYpLCBhcy5udW1lcmljKQ0KYGBgDQoNCkF0IHByZXNlbnQgYHIgbnJvdyhkZl8zMjQpYCBvdXQgb2YgYXBwcm94aW1hdGVseSAzMDAgYXJlIGNvbXBsZXRlLiBUaGUgaW5zcGVjdGlvbnMgcmFuZ2UgaW4gdGltZSBmcm9tIGByIG1pbihkZl8zMjQkZGF0ZSwgbmEucm0gPSBUUlVFKWAgdG8gYHIgbWF4KGRmXzMyNCRkYXRlLCBuYS5ybSA9IFRSVUUpYC4NCg0KIyMgU3VtbWFyeSBUYWJsZXMNCg0KU3VtbWFyeSB0YWJsZXMgaGVscCB0byBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIGhvdyBtYW55IGluc3RhbmNlcyBvY2N1ciB3aXRoaW4gcGFydGljdWxhciBjYXRlZ29yeSBvZiBkYXRhIG9yIGhvdyBmcmVxdWVudCBhIHBhcnRpY3VsYXIgaXNzdWUgaXMgcmVjb3JkZWQgYXQgYSBnaXZlbiBmYWNpbGl0eS4gU3VtbWFyeSB0YWJsZXMgYXJlIGdlbmVyYXRlZCB1c2luZyBhIGNvbWJpbmF0aW9uIG9mIGBncm91cF9ieWAgd2l0aCBgc3VtbWFyaXplYCB3aXRoIHRoZSByZXN1bHRzIHBpcGVkIHRvIGBrYWJsZWAgYW5kIGBrYWJsZUV4dHJhYC4NCg0KYGBge3IgaW5zcGVjdGlvbi1jb3VudH0NCmRmX2ZhY2lsaXR5IDwtIGRmXzMyNCAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZShuX2luc3BlY3Rpb25zID0gbigpKSAlPiUgDQogIHVuZ3JvdXAoKSANCiAgDQpkZl9mYWNpbGl0eSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiSW5zcGVjdGlvbnMgUmV2aWV3ZWQgYnkgRmFjaWxpdHkiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJGYWNpbGl0eSIsICJJbnNwZWN0aW9ucyBSZXZpZXdlZCIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyBGYWNldCBQbG90cw0KDQpGYWNldCBwbG90cyBhcmUgcHJvZHVjZWQgZm9yIHNldmVyYWwgY2F0ZWdvcmllcyBvZiBkYXRhLiBXaXRoaW4gZWFjaCBjYXRlZ29yeSwgY29sdW1ucyBhcmUgcGl2b3RlZCBsb25nZXIgYW5kIHBsb3R0ZWQgYnkgZGF0ZS4gR3JhcGhpbmcgaXMgZG9uZSB1c2luZyB0aGUgYGdncGxvdDJgIGxpYnJhcnkgW0BSLWdncGxvdDJdIHdpdGggdGhlIGBmYWNldF93cmFwYCBmdW5jdGlvbiB0byBwcm92aWRlIGEgbWVhbnMgdG8gY29tcGFyZSBtdWx0aXBsZSBmYWNpbGl0aWVzIHNpbXVsdGFuZW91c2x5LiBTdWNoIGEgcGxvdCBjYW4gaGVscCBpZGVudGlmeSB0cmVuZHMgYW5kIGd1aWRlIG1vcmUgc3BlY2lmaWMgcXVlc3Rpb25zLg0KDQojIEFzc2F1bHRzDQoNClRoZSBJQ0UgRy0zMjRBIFNpZ25pZmljYW50IEluY2lkZW50IFN1bW1hcnkgc2hlZXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24gYSBudW1iZXIgb2YgZGlmZmVyZW50IGtpbmRzIG9mIGFzc2F1bHRzLiBTcGVjaWZpY2FsbHksIHRoZXJlIGFyZSBmb3VyIGNhdGVnb3JpZXMgb2YgYXNzYXVsdHMgbGlzdGVkOg0KDQotICAgRGV0YWluZWQgUGVyc29uIG9uIFN0YWZmIHdpdGggU2VyaW91cyBJbmp1cnkNCi0gICBEZXRhaW5lZCBQZXJzb24gb24gU3RhZmYgd2l0aG91dCBTZXJpb3VzIEluanVyeQ0KLSAgIERldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gd2l0aCBTZXJpb3VzIEluanVyeQ0KLSAgIERldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gd2l0aG91dCBTZXJpb3VzIEluanVyeQ0KDQpDb25zcGljdW91c2x5IGFic2VudCBmcm9tIHRoaXMgbGlzdCBvZiBhc3NhdWx0IHR5cGVzIGFyZSBhc3NhdWx0cyBvbiBkZXRhaW5lZCBwZXJzb25zIGJ5IHN0YWZmLiBUaGlzIGlzIGRlZXBseSBjb25jZXJuaW5nIGJlY2F1c2UgYWxyZWFkeSBpbml0aWFsIHJldmlldyBvZiBpbnNwZWN0aW9uIGZvcm1zIGFuZCBwcmlvciBuZXdzIHN0b3JpZXMgaW5kaWNhdGVzIHRoYXQgc3RhZmYgYXNzYXVsdHMgb24gZGV0YWluZWQgcGVyc29ucyBkbyBvY2N1ci4gRm9yIGV4YW1wbGUsIGF0IHRoZSBCcmlzdG9sIENvdW50eSBDb3VudHkgSmFpbCBhbmQgSG91c2Ugb2YgQ29ycmVjdGlvbnMgaW5kZXBlbmRlbnQgaW52ZXN0aWdhdGlvbiBieSB0aGUgTWFzc2FjaHVzZXR0cyBPZmZpY2Ugb2YgQXR0b3JuZXkgR2VuZXJhbCAoTUFPRykgZm91bmQgdGhhdCBmYWNpbGl0eSBzdGFmZiBmb3VuZCBhICJwbGFubmVkIGFuZCBkZWxpYmVyYXRlLXVzZSBvZiBmb3JjZSBhZ2FpbnN0IHRoZSBJQ0UgZGV0YWluZWVzIHRoYXQgd2FzIGRpc3Byb3BvcnRpb25hdGUgdG8gdGhlIHNlY3VyaXR5IG5lZWRzIGF0IHRoYXQgdGltZSBhbmQgdW5uZWNlc3NhcmlseSBjYXVzZWQsIG9yIHJpc2tlZCBjYXVzaW5nLCBoYXJtIHRvIGFsbCBpbnZvbHZlZCIgW0BtYWFnMjAyMCwgaWldLiBUaGUgTU9BRyBmb3VuZCB0aGF0IGZhY2lsaXR5IHN0YWZmIHVzZWQgImEgZmxhc2ggYmFuZyBncmVuYWRlLCBwZXBwZXItYmFsbCBsYXVuY2hlcnMsIHBlcHBlciBzcHJheSBjYW5pc3RlcnMsIGFudGktcmlvdCBzaGllbGRzLCBhbmQgY2FuaW5lcy0tYWdhaW5zdCBkZXRhaW5lZXMgd2hvIGhhZCBleGhpYml0ZWQgY2FsbSBhbmQgbm9udmlvbGVudCBiZWhhdmlvciBmb3IgYXQgbGVhc3QgYW4gaG91ciBiZWZvcmUgdGhpcyBvcGVyYXRpb24iIFtAbWFhZzIwMjAsIGlpXS4gSW52ZXN0aWdhdGlvbnMgZm91bmQgdGhhdCBzdGFmZiAiZGVwbG95ZWQgdGhlc2Ugd2VhcG9ucyBib3RoIGluZGlzY3JpbWluYXRlbHkgdXBvbiBlbnRyeSBhbmQgYWxzbyBzcGVjaWZpY2FsbHkgYWdhaW5zdCBkZXRhaW5lZXMgd2hvIHdlcmUgbm90IGNvbWJhdGl2ZSwgYXNzYXVsdGl2ZSwgb3Igb3RoZXJ3aXNlIGFjdGl2ZWx5IHJlc2lzdGluZyBzdGFmZiIgW0BtYWFnMjAyMCwgaWldLg0KDQpXaGlsZSB0aGUgYWZvcmVtZW50aW9uZWQgQnJpc3RvbCBDb3VudHkgSmFpbCBtYXkgYmUgYSBwYXJ0aWN1bGFybHkgZWdyZWdpb3VzIGluc3RhbmNlIG9mIHN0YWZmIGFzc2F1bHRpbmcgZGV0YWluZWQgcGVyc29ucywgaXQgaXMgbm90IGFuIGlzb2xhdGVkIGNhc2UuIEZvciBleGFtcGxlLCBbdmlkZW8gZXZpZGVuY2VdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9SlBfUGZPaGRMdU0pIGZyb20gdGhlIFRvcnJhbmNlIENvdW50eSBEZXRlbnRpb24gRmFjaWxpdHkgaW4gRXN0YW5jaWEgTk0gc2hvd3MgQ29yZUNpdmljJ3MgcHJpdmF0ZSBmYWNpbGl0eSBzdGFmZiBwZXBwZXIgc3ByYXlpbmcgcGVyc29ucyBkZXRhaW5lZCBieSBJQ0Ugb24gaHVuZ2VyIHN0cmlrZSBbQHN3ZXRsaXR6MjAyMF0uIFJldmlldyBvZiBpbnNwZWN0aW9ucyBoYXMgYWxzbyByZXZlYWxlZCBhZGRpdGlvbmFsIGluYXBwcm9wcmlhdGUgdXNlIG9mIGZvcmNlIGluY2lkZW50cy4gVGhlIG9taXNzaW9uIG9mIGEgZmllbGQgdG8gcmVjb3JkIGluc3RhbmNlcyBvZiBzdGFmZiBhc3NhdWx0aW5nIGRldGFpbmVkIHBlcnNvbnMgb2NjbHVkZXMgYW5kIG9ic2N1cmVzIHJlYWwgaW5zdGFuY2VzIG9mIHZpb2xlbmNlLiBBcyB0aGUgaW5zcGVjdGlvbnMgcHJvY2VzcyBpcyBhIGRldGVudGlvbiByZWZvcm0gZGVzaWduZWQgdG8gbWFrZSBhIG1vcmUgaHVtYW5lIHN5c3RlbSBvZiBjaXZpbCBpbmNhcmNlcmF0aW9uLCB0aGUgb21pc3Npb24gb2YgY2F0ZWdvcmllcyBmb3IgbG9nZ2luZyBzdGFmZiBwaHlzaWNhbCBtaXN0cmVhdG1lbnQgb2YgZGV0YWluZWQgcGVyc29ucyByYWlzZXMgc2VyaW91cyBxdWVzdGlvbnMgYWJvdXQgdGhlIGluc3BlY3Rpb25zIHByb2Nlc3NlcyBhYmlsaXR5IHRvIHJlY29yZCBzaWduaWZpY2FudCBhbmQgZG9jdW1lbnRlZCBjaXZpbCBhbmQgaHVtYW4gcmlnaHRzIHZpb2xhdGlvbnMuDQoNCiMjIFN1bW1hcnkgVGFibGVzDQoNCmBgYHtyIGFzc2F1bHQtZGZ9DQpkZl9hc3NhdWx0cyA8LSBkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLA0KICAgICAgIGRldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfb25fc3RhZmZfd2l0aF9zZXJpb3VzX2luanVyeToNCiAgICAgICBkZXRhaW5lZV9vbl9kZXRhaW5lZV9waHlzaWNhbF9hc3NhdWx0X2ZpZ2h0X3dpdGhfbm9fc2VyaW91c19pbmp1cnkNCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIGEgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfYXNzYXVsdHMgPSBzdW0oY19hY3Jvc3MoDQogICAgICAgZGV0YWluZWVfcGh5c2ljYWxfYXNzYXVsdF9vbl9zdGFmZl93aXRoX3NlcmlvdXNfaW5qdXJ5Og0KICAgICAgIGRldGFpbmVlX29uX2RldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfZmlnaHRfd2l0aF9ub19zZXJpb3VzX2luanVyeQ0KICApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgZGV0YWluZWVfcGh5c2ljYWxfYXNzYXVsdF9vbl9zdGFmZl93aXRoX3NlcmlvdXNfaW5qdXJ5OnRvdGFsX2Fzc2F1bHRzLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiYXNzYXVsdF90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJhc3NhdWx0X2NvdW50IikgJT4lIA0KICANCiAgIyBSZW1vdmUgTkEgVmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKGFzc2F1bHRfdHlwZSA9IGZhY3Rvcihhc3NhdWx0X3R5cGUsIGxldmVscyA9IGMoDQogICAgImRldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfb25fc3RhZmZfd2l0aF9zZXJpb3VzX2luanVyeSIsDQogICAgImRldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfb25fc3RhZmZfd2l0aF9ub19zZXJpb3VzX2luanVyeSIsDQogICAgImRldGFpbmVlX29uX2RldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfZmlnaHRfd2l0aF9zZXJpb3VzX2luanVyeSIsDQogICAgImRldGFpbmVlX29uX2RldGFpbmVlX3BoeXNpY2FsX2Fzc2F1bHRfZmlnaHRfd2l0aF9ub19zZXJpb3VzX2luanVyeSIsDQogICAgInRvdGFsX2Fzc2F1bHRzIg0KICApKSkNCmBgYA0KDQpgYGB7ciBhc3NhdWx0LXN1bW1hcnl9DQpkZl9hc3NhdWx0cyAlPiUgDQogIGdyb3VwX2J5KGFzc2F1bHRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYFRvdGFsIEFzc2F1bHRzIGJ5IFR5cGVgID0gc3VtKGFzc2F1bHRfY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgQXNzYXVsdHMgYnkgVHlwZSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkFzc2F1bHQgVHlwZSIsICJUb3RhbCBBc3NhdWx0IFR5cGUiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkNCg0KDQpkZl9hc3NhdWx0cyAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9hc3NhdWx0cyA9IHN1bShhc3NhdWx0X2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfYXNzYXVsdHMpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgQXNzYXVsdHMgYnkgRmFjaWxpdHkiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJGYWNpbGl0eSIsICJUb3RhbCBBc3NhdWx0cyBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyBGYWNldCBvZiBBc3NhdWx0cyBieSBQbG90DQoNClRoZSBmaWd1cmUgYmVsb3cgaXMgYSBmYWNldCBwbG90IG9mIHRoZSBhc3NhdWx0IGNhdGVnb3JpZXMgcHJlc2VudCBvbiB0aGUgRy0zMjRBIFNJUyBmb3JtLg0KDQpgYGB7ciBhc3NhdWx0LWZhY2V0LCBmaWcuaGVpZ2h0PTQwfQ0KDQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzIGFuZCBtb2RpZnkNCiMgdGhlIGxhc3QgY29sb3IgdG8gYmUgYmxhY2sgZm9yIHRvdGFscy4NCnBsb3RfY29sb3JzIDwtIGJyZXdlci5wYWwoNSwgIlBhaXJlZCIpDQpwbG90X2NvbG9yc1s1XSA8LSAiIzAwMDAwMCINCg0KIyBDcmVhdGUgdGhlIGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiRGV0YWluZWQgUGVyc29uIG9uIFN0YWZmIHcuIFNlcmlvdXMgSW5qdXJ5IiwNCiAgICAiRGV0YWluZWQgUGVyc29uIG9uIFN0YWZmIHcvbyBTZXJpb3VzIEluanVyeSIsDQogICAgIkRldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gdy4gU2Vyb3VzIEluanVyeSIsDQogICAgIkRldGFpbmVkIFBlcnNvbiBvbiBEZXRhaW5lZCBQZXJzb24gdy9vIFNlcm91cyBJbmp1cnkiLA0KICAgICJUb3RhbCBBc3NhdWx0cyIpDQoNCmRmX2Fzc2F1bHRzICU+JSANCiAgIyBDYWxsaW5nIHRoZSBwbG90IGFuZCBmb3JtYXR0aW5nDQogIGdncGxvdChhZXMoeD1kYXRlLCB5ID0gYXNzYXVsdF9jb3VudCwgbGluZXR5cGU9YXNzYXVsdF90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBhc3NhdWx0X3R5cGUpLCBzaXplID0uNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5lIHR5cGUNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKA0KICAgIHZhbHVlcyA9IHBsb3RfbGluZXMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJBc3NhdWx0IFR5cGU6IiwNCiAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChucm93ID0gNSkNCiAgICApKw0KICANCiAgIyBTZXR0aW5nIHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogIG5hbWUgPSAiQXNzYXVsdCBUeXBlOiINCiAgKSsNCg0KICBsYWJzKHRpdGxlID0gIlJlcG9ydGVkIEFzc2F1bHRzIikrDQogIHlsYWIoIk51bWJlciBvZiBBc3NhdWx0cyIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCg0KICAjIFNldCB0aGUgbGVnZW5kIHRvIG11bHRpcGxlIHJvd3MNCiAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID01KSkrDQogIA0KICAjIFdyYXANCiAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sPTMpDQpgYGANCg0KIyBEaXNjaXBsaW5hcnkNCg0KQXMgYSBtYXR0ZXIgb2YgbGF3LCBJQ0UgZGV0ZW50aW9uIGlzIG5vdCBwdW5pdGl2ZSBpdCBpcyBwdXJlbHkgYWRtaW5pc3RyYXRpdmUgY2l2aWwgaG9sZGluZyB0byBlbnN1cmUgdGhhdCBpbmRpdmlkdWFscyBhcmUgcHJlc2VudCBmb3IgdGhlaXIgaW1taWdyYXRpb24gcHJvY2VlZGluZ3MuIERlc3BpdGUgdGhhdCBmYWN0LCB0aGVyZSBpcyBhIHRyZW1lbmRvdXMgYW1vdW50IG9mIHB1bml0aXZlIGRpc2NpcGxpbmFyeSBtZWFzdXJlcyB0aGF0IHRha2UgcGxhY2UgaW4gSUNFIGRldGVudGlvbi4gU29tZSBvZiB0aGlzIGluZm9ybWF0aW9uIG9uIGRpc2NpcGxpbmUgaW4gSUNFIGRldGVudGlvbiBpcyBsb2dnZWQgaW4gZmFjaWxpdHkgaW5zcGVjdGlvbnMuIEFzIHNlZW4gaW4gdGhlIHRhYmxlcyBiZWxvdywgZHVyaW5nIHRoZSBjdXJyZW50IHNhbXBsZSBwZXJpb2QgdGhlcmUgd2VyZSBtb3JlIHRoYW4gNDIsMDAwIGRpc2NpcGxpbmFyeSBpbmZyYWN0aW9ucy4NCg0KIyMgU3VtbWFyeSBUYWJsZXMNCg0KYGBge3J9DQpkZl9kaXNjaXBsaW5lIDwtIGRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFN1YnNldCB0aGUgZGYgdG8gb25seSB0aGUgdXNlZCBjb2xzDQogIHNlbGVjdChpZCwgZmFjaWxpdHksIGRhdGUsDQogICAgICAgZGlzY2lwbGluYXJ5X2luZnJhY3Rpb25zOg0KICAgICAgIHNhbmN0aW9uc19vdmVyXzYwX2RheXMNCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIGEgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfZGlzY2lwbGluYXJ5ID0gc3VtKGNfYWNyb3NzKA0KICAgICAgIGRpc2NpcGxpbmFyeV9pbmZyYWN0aW9uczoNCiAgICAgICBzYW5jdGlvbnNfb3Zlcl82MF9kYXlzDQogICkpKSAlPiUgDQoNCiAgIyBDYWxsIGEgcmFuZ2Ugb2YgdGFibGUgY29sdW1ucyBhbmQgcGl2b3QgbG9uZw0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9ICBkaXNjaXBsaW5hcnlfaW5mcmFjdGlvbnM6dG90YWxfZGlzY2lwbGluYXJ5LA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiZGlzY2lwbGluYXJ5X3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImRpc2NpcGxpbmFyeV9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKGRpc2NpcGxpbmFyeV90eXBlID0gZmFjdG9yKGRpc2NpcGxpbmFyeV90eXBlLCBsZXZlbHMgPWMoDQogICAgImRpc2NpcGxpbmFyeV9pbmZyYWN0aW9ucyIsDQogICAgImRpc2NpcGxpbmFyeV9pbmZyYWN0aW9uc19ndWlsdHkiLA0KICAgICJkaXNjaXBsaW5hcnlfYXBwZWFscyIsDQogICAgImRpc2NpcGxpbmFyeV9hcHBlYWxzX2ZvdW5kX2luX2Zhdm9yX29mX2RldGFpbmVlIiwNCiAgICAic2FuY3Rpb25zX292ZXJfNjBfZGF5cyIsDQogICAgInRvdGFsX2Rpc2NpcGxpbmFyeSINCiAgKSkpDQpgYGANCg0KYGBge3J9DQpkZl9kaXNjaXBsaW5lICU+JSANCiAgZ3JvdXBfYnkoZGlzY2lwbGluYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGBUb3RhbCBEaXNjaXBsaW5hcnkgYnkgVHlwZWAgPSBzdW0oZGlzY2lwbGluYXJ5X2NvdW50KSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIERpc2NpcGxpbmFyeSBieSBUeXBlIiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRGlzY2lwbGluZSBUeXBlIiwgIlRvdGFsIERpc2NpcGxpbmUgVHlwZSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKQ0KDQoNCmRmX2Rpc2NpcGxpbmUgJT4lIA0KICBncm91cF9ieShmYWNpbGl0eSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfZGlzY2lwbGluYXJ5ID0gc3VtKGRpc2NpcGxpbmFyeV9jb3VudCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX2Rpc2NpcGxpbmFyeSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBEaXNjaXBsaW5lIGJ5IEZhY2lsaXR5IiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRmFjaWxpdHkiLCAiVG90YWwgRGlzY2lwbGluZSBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyBGYWNldCBQbG90IG9mIERpc2NpcGxpbmFyeSBieSBGYWNpbGl0eQ0KDQpgYGB7ciBkaXNjaXBsaW5hcnktZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAiZG90dGVkIg0KICAgICkNCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMgYW5kIG1vZGlmeQ0KIyB0aGUgbGFzdCBjb2xvciB0byBiZSBibGFjayBmb3IgdG90YWxzLg0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCg2LCAiUGFpcmVkIikNCnBsb3RfY29sb3JzWzZdIDwtICIjMDAwMDAwIg0KDQojIENyZWF0ZSBwbG90IGxhYmVscw0KDQpwbG90X2xhYmVscyA8LSBjKA0KICAgICJEaXNjaXBsaW5hcnkgSW5mcmFjdGlvbnMiLA0KICAgICJEaXNjaXBsaW5hcnkgSW5mcmFjdGlvbnMgLSBHdWlsdHkiLA0KICAgICJEaXNjaXBsaW5hcnkgQXBwZWFscyIsDQogICAgIkRpc2NpcGxpbmFyeSBBcHBlYWxzIGluIEZhdm9yIG9mIERldGFpbmVlIiwNCiAgICAiU2FuY3Rpb25zIE92ZXIgNjAgRGF5cyIsDQogICAgIlRvdGFsIERpc2NpcGxpbmFyeSIpDQoNCg0KZGZfZGlzY2lwbGluZSAlPiUgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsDQogICAgICAgICAgICAgeSA9IGRpc2NpcGxpbmFyeV9jb3VudCwNCiAgICAgICAgICAgICBsaW5ldHlwZSA9IGRpc2NpcGxpbmFyeV90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBkaXNjaXBsaW5hcnlfdHlwZSksIHNpemUgPSAuNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5ldHlwZQ0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9saW5lcywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIkRpc2NpcGxpbmFyeSBUeXBlOiIsDQogICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQobnJvdyA9IDYpDQogICAgKSsNCiAgDQogICMgU2V0dGluZyB0aGUgY29sb3INCiAgc2NhbGVfY29sb3JfbWFudWFsKA0KICB2YWx1ZXMgPSBwbG90X2NvbG9ycywNCiAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogIG5hbWUgPSAiRGlzY2lwbGluYXJ5IFR5cGU6Ig0KICApKw0KDQogIGxhYnModGl0bGUgPSAiRGlzY2lwbGluYXJ5IikrDQogIHlsYWIoIk51bWJlciBvZiBEaXNjaXBsaW5hcnkgSW5mcmFjdGlvbnMiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQoNCiAgIyBTZXQgdGhlIGxlZ2VuZCB0byBtdWx0aXBsZSByb3dzDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9NikpKw0KICANCiAgIyBXcmFwDQogIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbD0zKQ0KYGBgDQoNCiMgU29saXRhcnkNCg0KIyMgU3VtbWFyeSBUYWJsZXMNCg0KT2YgdGhlIHByZXNlbnQgMTYzIGluc3BlY3Rpb25zIHJldmlld2VkIHNvIGZhciwgdGhlcmUgYXJlIG1vcmUgdGhhbiAzNCwwMDAgaW5zdGFuY2VzIG9mIHNvbGl0YXJ5LiBUaGF0IGlzIHJvdWdobHkgMjA4IGluc3RhbmNlcyBvZiBzb2xpdGFyeSBwZXIgaW5zcGVjdGlvbi4NCg0KYGBge3J9DQpkZl9zb2xpdGFyeSA8LSBkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTZWxlY3QgYSBzdWJzZXQgb2YgY29sdW1ucyB0byB3b3JrIHdpdGgNCiAgc2VsZWN0KGlkLA0KICAgICAgICAgZmFjaWxpdHksDQogICAgICAgICBkYXRlLA0KICAgICAgICAgZGV0YWluZWVzX3BsYWNlZF9pbl9hZG1pbmlzdHJhdGl2ZV9zZWdyZWdhdGlvbjoNCiAgICAgICAgICAgZGV0YWluZWVzX3BsYWNlZF9pbl9zZWdyZWdhdGlvbl9mb3JfbWVudGFsX2hlYWx0aF9yZWFzb25zKSAlPiUgDQogIA0KICAjIE5lZWQgdGhlIHJvd3dpc2UgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIHJvdy1hdC1hLXRpbWUNCiAgIyBpbiB0aGUgZm9sbG93aW5nIG11dGF0ZSBmdW5jdGlvbg0KICByb3d3aXNlKGlkKSAlPiUgDQogIA0KICAjIENyZWF0ZSBuZXcgdG90YWwgY29sdW1uDQogIG11dGF0ZSh0b3RhbF9zZWdyZWdhdGlvbiA9IHN1bShjX2Fjcm9zcyhkZXRhaW5lZXNfcGxhY2VkX2luX2FkbWluaXN0cmF0aXZlX3NlZ3JlZ2F0aW9uOg0KICAgICAgICAgICAgICAgICBkZXRhaW5lZXNfcGxhY2VkX2luX3NlZ3JlZ2F0aW9uX2Zvcl9tZW50YWxfaGVhbHRoX3JlYXNvbnMpKSkgJT4lIA0KICANCiAgIyBUaWR5DQogIHBpdm90X2xvbmdlciguLA0KICAgICAgICAgICAgICAgY29scz0gZGV0YWluZWVzX3BsYWNlZF9pbl9hZG1pbmlzdHJhdGl2ZV9zZWdyZWdhdGlvbjoNCiAgICAgICAgICAgICAgICAgdG90YWxfc2VncmVnYXRpb24sDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJzZWdyZWdhdGlvbl90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzZWdyZWdhdGlvbl9jb3VudCIpICU+JSANCiAgDQogICMgUmVtb3ZlIE5BDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHNlZ3JlZ2F0aW9uX3R5cGUgPSBmYWN0b3Ioc2VncmVnYXRpb25fdHlwZSwgbGV2ZWxzID0gYygNCiAgICAiZGV0YWluZWVzX3BsYWNlZF9pbl9hZG1pbmlzdHJhdGl2ZV9zZWdyZWdhdGlvbiIsDQogICAgImRldGFpbmVlc19wbGFjZWRfaW5fZGlzY2lwbGluYXJ5X3NlZ3JlZ2F0aW9uIiwNCiAgICAiZGV0YWluZWVzX3BsYWNlZF9pbl9zZWdyZWdhdGlvbl9mb3JfbWVkaWNhbF9yZWFzb25zIiwNCiAgICAiZGV0YWluZWVzX3BsYWNlZF9pbl9zZWdyZWdhdGlvbl9mb3JfbWVudGFsX2hlYWx0aF9yZWFzb25zIiwNCiAgICAidG90YWxfc2VncmVnYXRpb24iDQogICkpKQ0KYGBgDQoNCmBgYHtyfQ0KZGZfc29saXRhcnkgJT4lIA0KICBncm91cF9ieShzZWdyZWdhdGlvbl90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShgVG90YWwgU29saXRhcnkgYnkgVHlwZWAgPSBzdW0oc2VncmVnYXRpb25fY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU29saXRhcnkgYnkgVHlwZSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIlNvbGl0YXJ5IFR5cGUiLCAiVG90YWwgU29saXRhcnkgVHlwZSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKQ0KDQoNCmRmX3NvbGl0YXJ5ICU+JSANCiAgZ3JvdXBfYnkoZmFjaWxpdHkpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3NlZ3JlZ2F0aW9uID0gc3VtKHNlZ3JlZ2F0aW9uX2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfc2VncmVnYXRpb24pKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU29saXRhcnkgYnkgRmFjaWxpdHkiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJGYWNpbGl0eSIsICJUb3RhbCBTb2xpdGFyeSBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyBGYWNldCBQbG90cyBvZiBTb2xpdGFyeSBieSBGYWNpbGl0eQ0KDQpgYGB7ciBzb2xpdGFyeS1mYWNldCwgZmlnLmhlaWdodD00MH0NCiMgR2VuZXJhdGluZyBhIGxpbmV0eXBlIHZlY3RvciBmb3IgdXNlIGluIHRoZSBwbG90DQpwbG90X2xpbmVzIDwtIGMoDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAiZG90dGVkIg0KICAgICkNCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMgYW5kIG1vZGlmeQ0KIyB0aGUgbGFzdCBjb2xvciB0byBiZSBibGFjayBmb3IgdG90YWxzLg0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCg1LCAiUGFpcmVkIikNCnBsb3RfY29sb3JzWzVdIDwtICIjMDAwMDAwIg0KDQojIENyZWF0ZSBwbG90IGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiQWRtaW5pc3RyYXRpdmUiLA0KICAgICJEaXNjaXBsaW5hcnkiLA0KICAgICJNZWRpY2FsIiwNCiAgICAiTWVudGFsIEhlYWx0aCIsDQogICAgIlRvdGFsIikNCg0KZGZfc29saXRhcnkgJT4lIA0KDQojIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsDQogICAgICAgICAgICAgeSA9IHNlZ3JlZ2F0aW9uX2NvdW50LA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gc2VncmVnYXRpb25fdHlwZSkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gc2VncmVnYXRpb25fdHlwZSksIHNpemUgPSAuNjUpICsNCiAgDQogICMgU2V0IHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwoDQogIHZhbHVlcyA9IHBsb3RfY29sb3JzLA0KICBuYW1lID0gIlNvbGl0YXJ5IFR5cGU6IiwNCiAgbGFiZWxzID0gcGxvdF9sYWJlbHMpKw0KICANCiAgIyBTZXQgdGhlIGxpbmV0eXBlDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBwbG90X2xpbmVzLA0KICAgICAgbmFtZSA9ICJTb2xpdGFyeSBUeXBlOiIsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMpKw0KICANCiAgDQogIGxhYnModGl0bGUgPSAiUmVwb3J0ZWQgVXNlIG9mIFNvbGl0YXJ5IikrDQogIHlsYWIoIk51bWJlciBvZiBJbmRpdmlkdWFscyBQYWxjZWQgaW4gU29saXRhcnkiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQogICAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sPTMpDQpgYGANCg0KIyMgU29saXRhcnkgT3ZlciA2MCBEYXlzDQoNCmBgYHtyIHNvbGl0YXJ5LTYwLWZhY2V0fQ0KDQojIFVzZSBDb2xvciBCcmV3ZXIgdG8gc2V0IGNvbG9ycyBhbmQgbW9kaWZ5DQojIHRoZSBsYXN0IGNvbG9yIHRvIGJlIGJsYWNrIGZvciB0b3RhbHMuDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDUsICJQYWlyZWQiKQ0KcGxvdF9jb2xvcnNbNV0gPC0gIiMwMDAwMDAiDQoNCiMgQ2FsbCB0aGUgZGF0YWZyYW1lIGFuZCBzZWxlY3QgY29scw0KZGZfMzI0ICU+JSANCiAgc2VsZWN0KGlkLA0KICAgICAgICAgZmFjaWxpdHksDQogICAgICAgICBzdGF0ZSwNCiAgICAgICAgIGRhdGUsDQogICAgICAgICBmYWNfb3BlcmF0b3IsDQogICAgICAgICBhZG1pbl9zZWdfNjBfaWNlLA0KICAgICAgICAgZGlzY19zZWdfNjBfaWNlKSAlPiUgDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIE5lZWQgdGhlIHJvd3dpc2UgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIHJvdy1hdC1hLXRpbWUNCiAgIyBpbiB0aGUgZm9sbG93aW5nIG11dGF0ZSBmdW5jdGlvbg0KICByb3d3aXNlKGlkKSAlPiUgDQogIA0KICAjIEdlbmVyYXRlIHRvdGFsIGNvbA0KICBtdXRhdGUodG90YWxfc2VnXzYwID0gc3VtKGNfYWNyb3NzKA0KICAgICAgIGFkbWluX3NlZ182MF9pY2U6DQogICAgICAgZGlzY19zZWdfNjBfaWNlDQogICkpKSAlPiUNCiAgDQogICMgTWFrZSB0aWR5IGFuZCBmaWx0ZXINCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBhZG1pbl9zZWdfNjBfaWNlOmRpc2Nfc2VnXzYwX2ljZSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInNlZ3JlZ2F0aW9uXzYwX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInNlZ3JlZ2F0aW9uXzYwX2NvdW50IikgJT4lDQogIGZpbHRlcihzZWdyZWdhdGlvbl82MF90eXBlICVpbiUgYygiYWRtaW5fc2VnXzYwX2ljZSIsICJkaXNjX3NlZ182MF9pY2UiKSYNCiAgICAgICAgICAgc2VncmVnYXRpb25fNjBfY291bnQgPiAwKSAlPiUNCiAgDQogICMgSW5pdGlhdGUgdGhlIHBsb3QgYW5kIHNvcnQgYnkgc3VtDQogIGdncGxvdChhZXMoeCA9IHNlZ3JlZ2F0aW9uXzYwX2NvdW50LA0KICAgICAgICAgICAgIHk9cmVvcmRlcihmYWNfb3BlcmF0b3IsIHNlZ3JlZ2F0aW9uXzYwX2NvdW50LCBzdW0pLA0KICAgICAgICAgICAgIGZpbGw9c2VncmVnYXRpb25fNjBfdHlwZSkpKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikrDQogIA0KICAjIFNldCB0aGUgY29sb3IgZmlsbA0KICBzY2FsZV9maWxsX2JyZXdlcih0eXBlID0gInF1YWwiLA0KICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlBhaXJlZCIsDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiU2VncmVnYXRpb24gPiA2MCBUeXBlIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQWRtaW5pc3RyYXRpdmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjaXBsaW5hcnkiKSkrDQogIGxhYnModGl0bGU9ICJTZWdyZWdhdGlvbiA+IDYwIERheXMgYnkgRmFjaWxpdHkgT3BlcmF0b3IiLA0KICAgICAgICB4ID0gIlNlZ3JlZ2F0aW9uID4gNjAgRGF5cyBDb3VudCIsDQogICAgICAgIHkgPSAiRmFjaWxpdHkgT3BlcmF0b3IiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQpgYGANCg0KIyBVc2Ugb2YgRm9yY2UNCg0KIyMgU3VtbWFyeSBUYWJsZXMNCg0KYGBge3J9DQpkZl9mb3JjZSA8LSBkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLA0KICAgICAgIGltbWVkaWF0ZV91c2Vfb2ZfZm9yY2VfaW5jaWRlbnRzOg0KICAgICAgIHN0cmlwX3NlYXJjaGVzDQogICAgICAgKSAlPiUgDQogIA0KICAjIE5lZWQgdGhlIHJvd3dpc2UgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIHJvdy1hdC1hLXRpbWUNCiAgIyBpbiB0aGUgZm9sbG93aW5nIG11dGF0ZSBmdW5jdGlvbg0KICByb3d3aXNlKGlkKSAlPiUgDQogIA0KICAjIENyZWF0ZSBhIG5ldyB0b3RhbCBjb2x1bW4NCiAgbXV0YXRlKHRvdGFsX3VzZV9vZl9mb3JjZSA9IHN1bShjX2Fjcm9zcygNCiAgICAgICBpbW1lZGlhdGVfdXNlX29mX2ZvcmNlX2luY2lkZW50czoNCiAgICAgICBzdHJpcF9zZWFyY2hlcw0KICApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgaW1tZWRpYXRlX3VzZV9vZl9mb3JjZV9pbmNpZGVudHM6dG90YWxfdXNlX29mX2ZvcmNlLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidXNlX29mX2ZvcmNlX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInVzZV9vZl9mb3JjZV9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvcnMNCiAgbXV0YXRlKHVzZV9vZl9mb3JjZV90eXBlID0gZmFjdG9yKHVzZV9vZl9mb3JjZV90eXBlLCBsZXZlbHMgPSBjKA0KICAgICJpbW1lZGlhdGVfdXNlX29mX2ZvcmNlX2luY2lkZW50cyIsDQogICAgImNhbGN1bGF0ZWRfdXNlX29mX2ZvcmNlX2luY2lkZW50cyIsDQogICAgInVzZXNfb2ZfZm9yY2Vfd2l0aF9jaGVtaWNhbF9hZ2VudHMiLA0KICAgICJpbmNpZGVudHNfd2hlcmVfbm9uX2xldGhhbF93ZWFwb25zX3dlcmVfdXNlZCIsDQogICAgIm51bWJlcl9vZl90aW1lc180XzVfcG9pbnRfcmVzdHJhaW50c193ZXJlX3VzZWQiLA0KICAgICJ1c2Vfb2ZfZm9yY2Vfd2l0aF9zZXJpb3VzX2luanVyeSIsDQogICAgInN0cmlwX3NlYXJjaGVzIiwNCiAgICAidG90YWxfdXNlX29mX2ZvcmNlIg0KICApKSkNCmBgYA0KDQpgYGB7cn0NCmRmX2ZvcmNlICU+JSANCiAgZ3JvdXBfYnkodXNlX29mX2ZvcmNlX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGBUb3RhbCBVc2Ugb2YgRm9yY2UgYnkgVHlwZWAgPSBzdW0odXNlX29mX2ZvcmNlX2NvdW50KSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFVzZSBvZiBGb3JjZSBieSBUeXBlIiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiVXNlIG9mIEZvcmNlIFR5cGUiLCAiVG90YWwgVXNlIG9mIEZvcmNlIFR5cGUiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkNCg0KDQpkZl9mb3JjZSAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF91c2Vfb2ZfZm9yY2UgPSBzdW0odXNlX29mX2ZvcmNlX2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfdXNlX29mX2ZvcmNlKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFVzZSBvZiBGb3JjZSBieSBGYWNpbGl0eSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkZhY2lsaXR5IiwgIlRvdGFsIFVzZSBvZiBGb3JjZSBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyBGYWNldCBQbG90IG9mIFVzZSBvZiBGb3JjZSBieSBGYWNpbGl0eQ0KDQpgYGB7ciB1c2UtZm9yY2UtZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzIGFuZCBtb2RpZnkNCiMgdGhlIGxhc3QgY29sb3IgdG8gYmUgYmxhY2sgZm9yIHRvdGFscy4NCnBsb3RfY29sb3JzIDwtIGJyZXdlci5wYWwoOCwgIlBhaXJlZCIpDQpwbG90X2NvbG9yc1s4XSA8LSAiIzAwMDAwMCINCg0KIyBDcmVhdGUgcGxvdCBsYWJlbHMNCnBsb3RfbGFiZWxzIDwtIGMoDQogICAgIkltbWVkaWF0ZSBVc2Ugb2YgRm9yY2UgSW5jaWRlbnRzIiwNCiAgICAiQ2FsY3VsYXRlZCBVc2Ugb2YgRm9yY2UgSW5jaWRlbnRzIiwNCiAgICAiVXNlcyBvZiBGb3JjZSB3aXRoIENoZW1pY2FsIEFnZW50cyIsDQogICAgIkluY2lkZW50cyBXaGVyZSBOb24tTGV0aGFsIFdlYXBvbnMgV2VyZSBVc2VkIiwNCiAgICAiVGltZXMgNC81IFBvaW50IFJlc3RyYWludHMgVXNlZCIsDQogICAgIlVzZSBvZiBGb3JjZSBXaXRoIFNlcmlvdXMgSW5qdXJ5IiwNCiAgICAiU3RyaXAgU2VhcmNoZXMiLA0KICAgICJUb3RhbCBEaXNjaXBsaW5hcnkiKQ0KDQpkZl9mb3JjZSAlPiUgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSB1c2Vfb2ZfZm9yY2VfY291bnQsIGxpbmV0eXBlPXVzZV9vZl9mb3JjZV90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSB1c2Vfb2ZfZm9yY2VfdHlwZSksIHNpemUgPSAuNjUpICsNCiAgDQogICMgc2V0dGluZyB0aGUgbGluZXR5cGUNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKA0KICAgIHZhbHVlcyA9IHBsb3RfbGluZXMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJVc2Ugb2YgRm9yY2UgVHlwZToiLA0KICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSA4KQ0KICAgICkrDQogIA0KICAjIFNldHRpbmcgdGhlIGNvbG9yDQogIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgdmFsdWVzID0gcGxvdF9jb2xvcnMsDQogIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICBuYW1lID0gIlVzZSBvZiBGb3JjZSBUeXBlOiIsDQogICkrDQoNCiAgbGFicyh0aXRsZSA9ICJEaXNjaXBsaW5hcnkiKSsNCiAgeWxhYigiTnVtYmVyIG9mIERpc2NpcGxpbmFyeSBJbmZyYWN0aW9ucyIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCg0KICAgICMgU2V0IHRoZSBsZWdlbmQgdG8gbXVsdGlwbGUgcm93cw0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPTgpKSsNCiAgDQogICMgV3JhcA0KICBmYWNldF93cmFwKH4gZmFjaWxpdHksIG5jb2w9MykNCmBgYA0KDQojIFNleHVhbCBBYnVzZSBhbmQgQXNzYXVsdA0KDQojIyBBbGxlZ2F0aW9ucw0KDQojIyMgU3VtbWFyeSBUYWJsZXMNCg0KYGBge3J9DQpkZl9zZXhfYWxsZWcgPC0gZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fZGV0YWluZWU6DQogICAgICAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyXzI5DQogICAgICAgKSAlPiUgDQogIA0KICAjIE5lZWQgdGhlIHJvd3dpc2UgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIHJvdy1hdC1hLXRpbWUNCiAgIyBpbiB0aGUgZm9sbG93aW5nIG11dGF0ZSBmdW5jdGlvbg0KICByb3d3aXNlKGlkKSAlPiUgDQogIA0KICAjIENyZWF0ZSBhIG5ldyB0b3RhbCBjb2x1bW4NCiAgbXV0YXRlKHRvdGFsX3NleHVhbF9hYnVzZV9hbGxlZ2F0aW9ucyA9IHN1bShjX2Fjcm9zcygNCiAgICAgICBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fZGV0YWluZWU6DQogICAgICAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyXzI5DQogICkpKSAlPiUgDQoNCiAgIyBDYWxsIGEgcmFuZ2Ugb2YgdGFibGUgY29sdW1ucyBhbmQgcGl2b3QgbG9uZw0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9ICBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fZGV0YWluZWU6dG90YWxfc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkENCiAgZHJvcF9uYSgpICU+JSANCiAgDQogICMgRXhwbGljaXRseSBkZWZpbmUgZmFjdG9yIGxldmVscw0KICBtdXRhdGUoc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX3R5cGUgPSBmYWN0b3Ioc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX3R5cGUsIGxldmVscyA9IGMoDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9kZXRhaW5lZSIsDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19pbm1hdGVfb25fZGV0YWluZWUiLA0KICAgICJzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25faW5tYXRlIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyXzI5IiwNCiAgICAidG90YWxfc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zIg0KICApKSkNCmBgYA0KDQpgYGB7cn0NCmRmX3NleF9hbGxlZyAlPiUgDQogIGdyb3VwX2J5KHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc190eXBlKSAlPiUgDQogIHN1bW1hcmlzZShgU2V4dWFsIEFidXNlIGFuZCBBc3NhdWx0IEFsbGVnYXRpb25zIGJ5IFR5cGVgID0gc3VtKHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19jb3VudCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBTZXh1YWwgQWJ1c2UgYW5kIEFzc2F1bHQgQWxsZWdhdGlvbnMgYnkgVHlwZSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkFsbGVnYXRpb24gVHlwZSIsICJUb3RhbCBBbGxlZ2F0aW9uIFR5cGUiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkNCg0KDQpkZl9zZXhfYWxsZWcgJT4lIA0KICBncm91cF9ieShmYWNpbGl0eSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zID0gc3VtKHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19jb3VudCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX3NleHVhbF9hYnVzZV9hbGxlZ2F0aW9ucykpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBTZXh1YWwgQWJ1c2UgYW5kIEFzc2F1bHQgQWxsZWdhdGlvbnMgYnkgRmFjaWxpdHkiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJGYWNpbGl0eSIsICJUb3RhbCBBbGxlZ2F0aW9ucyBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyMgRmFjZXQgUGxvdCBvZiBTZXh1YWwgQWJ1c2UgYW5kIEFzc2F1bHQgQWxsZWdhdGlvbnMgYnkgRmFjaWxpdHkNCg0KYGBge3Igc2V4dWFsLWFidXNlLWFsbGVnYXRpb24tZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAiZG90dGVkIg0KICAgICkNCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMgYW5kIG1vZGlmeQ0KIyB0aGUgbGFzdCBjb2xvciB0byBiZSBibGFjayBmb3IgdG90YWxzLg0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCg2LCAiUGFpcmVkIikNCnBsb3RfY29sb3JzWzZdIDwtICIjMDAwMDAwIg0KDQojIENyZWF0ZSBwbG90IGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gRGV0YWluZWUgb24gRGV0YWluZWUiLA0KICAgICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMgLSBJbm1hdGUgb24gRGV0YWluZWUiLA0KICAgICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMgLSBEZXRhaW5lZSBvbiBJbm1hdGUiLA0KICAgICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMgLSBTdGFmZi9Db250cmFjdG9yL1ZvbHVudGVlciBvbiBEZXRhaW5lZSIsDQogICAgIk51bWJlciBvZiBTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMgLSBEZXRhaW5lZSBvbiBTdGFmZi9Db250cmFjdG9yL1ZvbHVudGVlciIsDQogICAgIlRvdGFsIFNleHVhbCBBYnVzZSBBbGxlZ2F0aW9ucyIpDQoNCmRmX3NleF9hbGxlZyAlPiUgDQogICMgQ2FsbGluZyB0aGUgcGxvdCBhbmQgZm9ybWF0dGluZw0KICBnZ3Bsb3QoYWVzKHg9ZGF0ZSwgeSA9IHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19jb3VudCwgbGluZXR5cGU9c2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX3R5cGUpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc190eXBlKSxzaXplPS42NSkgKw0KICANCiAgIyBTZXQgdGhlIGxpbmV0eXBlDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBwbG90X2xpbmVzLA0KICAgIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICAgIG5hbWUgPSAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb24gVHlwZToiLA0KICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSA2KQ0KICAgICkrDQogIA0KICAjIFNldCB0aGUgY29sb3INCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBsb3RfY29sb3JzLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9uIFR5cGU6IikrDQoNCiAgbGFicyh0aXRsZSA9ICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMiKSsNCiAgeWxhYigiTnVtYmVyIG9mIEFsbGVnYXRpb25zIikrDQogIHhsYWIoIkRhdGUiKSsNCiAgdGhlbWUoDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSINCiAgICApKw0KDQogICAgIyBTZXQgdGhlIGxlZ2VuZCB0byBtdWx0aXBsZSByb3dzDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9OCkpKw0KICANCiAgIyBXcmFwDQogIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbD0zKQ0KYGBgDQoNCiMjIFN1YnN0YW50aWF0ZWQgQWxsZWdhdGlvbnMNCg0KIyMjIFN1bW1hcnkgVGFibGVzDQoNCmBgYHtyfQ0KZGZfc2V4X2FsbGVnX3N1YiA8LSBkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLA0KICAgICAgIHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9kZXRhaW5lZV8yOg0KICAgICAgIHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9zdGFmZl9jb250cmFjdG9yX3ZvbHVudGVlcl8zNA0KICAgICAgICkgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyBDcmVhdGUgYSBuZXcgdG90YWwgY29sdW1uDQogIG11dGF0ZSh0b3RhbF9zZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnMgPSBzdW0oY19hY3Jvc3MoDQogICAgICAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX2RldGFpbmVlXzI6DQogICAgICAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyXzM0DQogICkpKSAlPiUgDQoNCiAgIyBDYWxsIGEgcmFuZ2Ugb2YgdGFibGUgY29sdW1ucyBhbmQgcGl2b3QgbG9uZw0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9ICBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fZGV0YWluZWVfMjp0b3RhbF9zZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnMsDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHNleHVhbF9hYnVzZV9zdWJzdGFudGlhdGVkX3R5cGU9IGZhY3RvcihzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF90eXBlLCBsZXZlbHMgPWMoDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9kZXRhaW5lZV8yIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2lubWF0ZV9vbl9kZXRhaW5lZV8yIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX2lubWF0ZV8yIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyX29uX2RldGFpbmVlIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX3N0YWZmX2NvbnRyYWN0b3Jfdm9sdW50ZWVyXzM0IiwNCiAgICAidG90YWxfc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zIg0KICApKSkNCmBgYA0KDQpgYGB7cn0NCmRmX3NleF9hbGxlZ19zdWIgJT4lIA0KICBncm91cF9ieShzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShgU2V4dWFsIEFidXNlIGFuZCBBc3NhdWx0IEFsbGVnYXRpb25zIFN1YnN0YW50aWF0ZWQgYnkgVHlwZWAgPSBzdW0oc2V4dWFsX2FidXNlX3N1YnN0YW50aWF0ZWRfY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU3Vic3RhbnRpYXRlZCBTZXh1YWwgQWJ1c2UgYW5kIEFzc2F1bHQgQWxsZWdhdGlvbnMgYnkgVHlwZSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIlN1YnN0YW50aWF0ZWQgQWxsZWdhdGlvbiBUeXBlIiwgIlRvdGFsIFN1YnN0YW50aWF0ZWQgQWxsZWdhdGlvbiBUeXBlIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpDQoNCg0KZGZfc2V4X2FsbGVnX3N1YiAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9zZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZCA9IHN1bShzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF9jb3VudCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX3NleHVhbF9hYnVzZV9zdWJzdGFudGlhdGVkKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFN1YnN0YW50aWF0ZWQgU2V4dWFsIEFidXNlIGFuZCBBc3NhdWx0IEFsbGVnYXRpb25zIGJ5IEZhY2lsaXR5IiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRmFjaWxpdHkiLCAiVG90YWwgU3Vic3RhbnRpYXRlZCBBbGxlZ2F0aW9ucyBieSBGYWNpbGl0eSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQojIyMgRmFjZXQgUGxvdCBvZiBTdWJzdGFudGlhdGVkIFNleHVhbCBBYnVzZSBhbmQgQXNzYXVsdCBBbGxlZ2F0aW9ucw0KDQpgYGB7ciBzZXh1YWwtYWJ1c2Utc3Vic3RhbnRpYXRlZC1mYWNldCwgZmlnLmhlaWdodD00MH0NCiMgR2VuZXJhdGluZyBhIGxpbmV0eXBlIHZlY3RvciBmb3IgdXNlIGluIHRoZSBwbG90DQpwbG90X2xpbmVzIDwtIGMoDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJkb3R0ZWQiDQogICAgKQ0KDQojIFVzZSBDb2xvciBCcmV3ZXIgdG8gc2V0IGNvbG9ycyBhbmQgbW9kaWZ5DQojIHRoZSBsYXN0IGNvbG9yIHRvIGJlIGJsYWNrIGZvciB0b3RhbHMuDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDYsICJQYWlyZWQiKQ0KcGxvdF9jb2xvcnNbNl0gPC0gIiMwMDAwMDAiDQoNCiMgQ3JlYXRlIHRoZSBsYWJlbHMNCnBsb3RfbGFiZWxzIDwtIGMoDQogICAgIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9ucyAtIERldGFpbmVlIG9uIERldGFpbmVlIiwNCiAgICAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gSW5tYXRlIG9uIERldGFpbmVlIiwNCiAgICAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gRGV0YWluZWUgb24gSW5tYXRlIiwNCiAgICAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gU3RhZmYvQ29udHJhY3Rvci9Wb2x1bnRlZXIgb24gRGV0YWluZWUiLA0KICAgICJOdW1iZXIgb2YgU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gRGV0YWluZWUgb24gU3RhZmYvQ29udHJhY3Rvci9Wb2x1bnRlZXIiLA0KICAgICJUb3RhbCBTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMiKQ0KDQpkZl9zZXhfYWxsZWdfc3ViICU+JSANCiAgDQogICMgQ2FsbGluZyB0aGUgcGxvdCBhbmQgZm9ybWF0dGluZw0KICBnZ3Bsb3QoYWVzKHg9ZGF0ZSwgeSA9IHNleHVhbF9hYnVzZV9zdWJzdGFudGlhdGVkX2NvdW50LCBsaW5ldHlwZT1zZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF90eXBlKSxzaXplPS42NSkgKw0KICANCiAgIyBTZXQgdGhlIGxpbmV0eXBlDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBwbG90X2xpbmVzLA0KICAgIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICAgIG5hbWUgPSAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb24gVHlwZToiLA0KICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSA2KQ0KICAgICkrDQogIA0KICAjIFNldCB0aGUgY29sb3INCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBsb3RfY29sb3JzLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9uIFR5cGU6IikrDQoNCiAgbGFicyh0aXRsZSA9ICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMgU3Vic3RhbnRpYXRlZCIpKw0KICB5bGFiKCJOdW1iZXIgb2YgQWxsZWdhdGlvbnMiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQoNCiAgIyBTZXQgdGhlIGxlZ2VuZCB0byBtdWx0aXBsZSByb3dzDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9OCkpKw0KICANCiAgIyBXcmFwDQogIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbD0zKQ0KYGBgDQoNCiMgTWVkaWNhbA0KDQojIyBNZWRpY2FsIE9ic2VydmF0aW9uDQoNCmBgYHtyIG1lZGljYWwtbWVudGFsLW9ic2VydmF0aW9uLWZhY2V0LCBmaWcuaGVpZ2h0PTQwfQ0KIyBHZW5lcmF0aW5nIGEgbGluZXR5cGUgdmVjdG9yIGZvciB1c2UgaW4gdGhlIHBsb3QNCnBsb3RfbGluZXMgPC0gYygNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDMsICJQYWlyZWQiKQ0KcGxvdF9jb2xvcnNbM10gPC0gIiMwMDAwMDAiDQoNCiMgQ3JlYXRlIHBsb3QgbGFiZWxzDQpwbG90X2xhYmVscyA8LSBjKA0KICAgICJEZXRhaW5lZXMgaW4gTWVkaWNhbCBPYnNlcnZhdGlvbiIsDQogICAgIkRldGFpbmVlcyBpbiBNZW50YWwgSGVhbHRoIE9ic2VydmF0aW9uIiwNCiAgICAiVG90YWwgSW5kaXZpZHVhbHMgaW4gTWVkaWNhbCBvciBNZW50YWwgSGVhbHRoIE9ic2VydmF0aW9uIikNCg0KZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBkZXRhaW5lZXNfaW5fbWVkaWNhbF9vYnNlcnZhdGlvbjoNCiAgICAgICBkZXRhaW5lZXNfaW5fbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbg0KICAgICAgICkgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyBDcmVhdGUgYSBuZXcgdG90YWwgY29sdW1uDQogIG11dGF0ZSh0b3RhbF9tZW50YWxfbWVkaWNhbF9vYnNlcnZhdGlvbiA9IHN1bShjX2Fjcm9zcygNCiAgICAgICBkZXRhaW5lZXNfaW5fbWVkaWNhbF9vYnNlcnZhdGlvbjoNCiAgICAgICBkZXRhaW5lZXNfaW5fbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbg0KICApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgZGV0YWluZWVzX2luX21lZGljYWxfb2JzZXJ2YXRpb246dG90YWxfbWVudGFsX21lZGljYWxfb2JzZXJ2YXRpb24sDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJtZWRpY2FsX21lbnRhbF9vYnNlcnZhdGlvbl90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJtZWRpY2FsX21lbnRhbF9vYnNlcnZhdGlvbl9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKG1lZGljYWxfbWVudGFsX29ic2VydmF0aW9uX3R5cGUgPSBmYWN0b3IobWVkaWNhbF9tZW50YWxfb2JzZXJ2YXRpb25fdHlwZSwgbGV2ZWxzID0gYygNCiAgICAiZGV0YWluZWVzX2luX21lZGljYWxfb2JzZXJ2YXRpb24iLA0KICAgICJkZXRhaW5lZXNfaW5fbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbiIsDQogICAgInRvdGFsX21lbnRhbF9tZWRpY2FsX29ic2VydmF0aW9uIg0KICApKSkgJT4lIA0KICANCiAgIyBDYWxsaW5nIHRoZSBwbG90IGFuZCBmb3JtYXR0aW5nDQogIGdncGxvdChhZXMoeD1kYXRlLCB5ID0gbWVkaWNhbF9tZW50YWxfb2JzZXJ2YXRpb25fY291bnQsIGxpbmV0eXBlPW1lZGljYWxfbWVudGFsX29ic2VydmF0aW9uX3R5cGUpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IG1lZGljYWxfbWVudGFsX29ic2VydmF0aW9uX3R5cGUpLHNpemU9LjY1KSArDQogIA0KICAjIFNldCB0aGUgbGluZXR5cGUNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKA0KICAgIHZhbHVlcyA9IHBsb3RfbGluZXMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJPYnNlcnZhdGlvbiBUeXBlOiIsDQogICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQobnJvdyA9IDMpDQogICAgKSsNCiAgDQogICMgU2V0IHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiT2JzZXJ2YXRpb24gVHlwZToiLCkrDQoNCiAgbGFicyh0aXRsZSA9ICJNZWRpY2FsIGFuZCBNZW50YWwgSGVhbHRoIE9ic2VydmF0aW9uIikrDQogIHlsYWIoIk51bWJlciBvZiBJbmRpdmlkdWFscyBpbiBPYnNlcnZhdGlvbiIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCg0KICAjIFNldCB0aGUgbGVnZW5kIHRvIG11bHRpcGxlIHJvd3MNCiAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID0zKSkrDQogIA0KICAjIFdyYXANCiAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sPTMpDQogIA0KYGBgDQoNCiMjIEluZmVjdGlvbnMgRGlzZWFzZQ0KDQpgYGB7ciBpbmZlY3Rpb3VzLWRpc2Vhc2UtZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIg0KICAgICkNCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMNCnBsb3RfY29sb3JzIDwtIGJyZXdlci5wYWwoMiwgIlBhaXJlZCIpDQoNCiMgQ3JlYXRlIHBsb3QgbGFiZWxzDQpwbG90X2xhYmVscyA8LSBjKA0KICAgICJJbmZlY3Rpb3VzIERpc2Vhc2UgUmVwb3J0ZWQiLA0KICAgICJJbmZlY3Rpb3VzIERpc2Vhc2UgQ29uZmlybWVkIikNCg0KZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBpbmZlY3Rpb3VzX2Rpc2Vhc2VfcmVwb3J0ZWQ6DQogICAgICAgaW5mZWN0aW9uc19kaXNlYXNlX2NvbmZpcm1lZA0KICAgICAgICkgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyAjIENyZWF0ZSBhIG5ldyB0b3RhbCBjb2x1bW4NCiAgIyAjIEluIHRoaXMgY2FzZSBub3QgdXNlZA0KICAjIG11dGF0ZSh0b3RhbF9pbmZlY3Rpb25zX2Rpc2Vhc2VfcmVwb3J0X2NvbmZpcm1lZCA9IHN1bShjX2Fjcm9zcygNCiAgIyAgICAgIGluZmVjdGlvdXNfZGlzZWFzZV9yZXBvcnRlZDoNCiAgIyAgICAgIGluZmVjdGlvbnNfZGlzZWFzZV9jb25maXJtZWQNCiAgIyApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgaW5mZWN0aW91c19kaXNlYXNlX3JlcG9ydGVkOmluZmVjdGlvbnNfZGlzZWFzZV9jb25maXJtZWQsDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJpbmZlY3Rpb3VzX2Rpc2Vhc2VfdHlwZSIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiaW5mZWN0aW91c19kaXNlYXNlX2NvdW50IikgJT4lDQogIA0KICAjIFJlbW92ZSBOQSB2YWx1ZXMNCiAgZHJvcF9uYSgpICU+JSANCiAgDQogICMgRXhwbGljaXRseSBkZWZpbmUgZmFjdG9yIGxldmVscw0KICBtdXRhdGUoaW5mZWN0aW91c19kaXNlYXNlX3R5cGUgPSBmYWN0b3IoaW5mZWN0aW91c19kaXNlYXNlX3R5cGUsIGxldmVscyA9IGMoDQogICAgImluZmVjdGlvdXNfZGlzZWFzZV9yZXBvcnRlZCIsDQogICAgImluZmVjdGlvbnNfZGlzZWFzZV9jb25maXJtZWQiDQogICkpKSAlPiUgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSBpbmZlY3Rpb3VzX2Rpc2Vhc2VfY291bnQsIGxpbmV0eXBlPWluZmVjdGlvdXNfZGlzZWFzZV90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBpbmZlY3Rpb3VzX2Rpc2Vhc2VfdHlwZSksc2l6ZT0uNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5ldHlwZQ0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9saW5lcywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIkNhdGVnb3J5OiIsDQogICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQobnJvdyA9IDIpDQogICAgKSsNCiAgDQogICMgU2V0IHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJDYXRlZ29yeToiKSsNCg0KICBsYWJzKHRpdGxlID0gIkluZmVjdGlvdXMgRGlzZWFzZXMgUmVwb3J0ZWQgYW5kIENvbmZpcm1lZCIpKw0KICB5bGFiKCJDb3VudCIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCg0KICAjIFNldCB0aGUgbGVnZW5kIHRvIG11bHRpcGxlIHJvd3MNCiAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID0zKSkrDQogIA0KICAjIFdyYXANCiAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sPTMpDQogIA0KICANCmBgYA0KDQojIyBNZWRpY2FsIGFuZCBNZW50YWwgSGVhbHRoIFJlZmVycmFscw0KDQpgYGB7ciByZWZlcnJhbHMtZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDUsICJQYWlyZWQiKQ0KcGxvdF9jb2xvcnNbNV0gPC0gIiMwMDAwMDAiDQoNCiMgQ3JlYXRlIHBsb3QgbGFiZWxzDQpwbG90X2xhYmVscyA8LSBjKA0KICAgICJPdXRzaWRlIE1lZGljYWwgUmVmZXJyYWxzIiwNCiAgICAiRGV0YWluZWVzIFRyYW5zcG9ydGVkIHRvIE9mZi1TaXRlIEhvc3BpdGFscyBmb3IgRW1lcmdlbmN5IFJlYXNvbnMiLA0KICAgICJBZG1pc3Npb25zIHRvIE9mZi1TaXRlIEhvc3BpdGFscyBmb3IgTWVkaWNhbCBSZWFzb25zIiwNCiAgICAiQWRtaXNzaW9ucyB0byBPZmYtU2l0ZSBIb3NwaXRhbHMgZm9yIE1lbnRhbCBIZWFsdGggUmVhc29ucyIsDQogICAgIlRvdGFsIFJlZmVycmFscyIpDQoNCg0KZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBvdXRzaWRlX21lZGljYWxfcmVmZXJyYWxzOg0KICAgICAgIGFkbWlzc2lvbnNfdG9fb2ZmX3NpdGVfaG9zcGl0YWxzX2Zvcl9tZW50YWxfaGVhbHRoX3JlYXNvbnMNCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIGEgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfcmVmZXJyYWxzID0gc3VtKGNfYWNyb3NzKA0KICAgICAgIG91dHNpZGVfbWVkaWNhbF9yZWZlcnJhbHM6DQogICAgICAgYWRtaXNzaW9uc190b19vZmZfc2l0ZV9ob3NwaXRhbHNfZm9yX21lbnRhbF9oZWFsdGhfcmVhc29ucw0KICApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgb3V0c2lkZV9tZWRpY2FsX3JlZmVycmFsczp0b3RhbF9yZWZlcnJhbHMsDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJyZWZlcnJhbF90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyZWZlcnJhbF9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHJlZmVycmFsX3R5cGU9IGZhY3RvcihyZWZlcnJhbF90eXBlLCBsZXZlbHMgPSBjKA0KICAgICJvdXRzaWRlX21lZGljYWxfcmVmZXJyYWxzIiwNCiAgICAiZGV0YWluZWVzX3RyYW5zcG9ydGVkX3RvX29mZl9zaXRlX2hvc3BpdGFsc19mb3JfZW1lcmdlbmN5X2NhcmUiLA0KICAgICJhZG1pc3Npb25zX3RvX29mZl9zaXRlX2hvc3BpdGFsc19mb3JfbWVkaWNhbF9yZWFzb25zIiwNCiAgICAiYWRtaXNzaW9uc190b19vZmZfc2l0ZV9ob3NwaXRhbHNfZm9yX21lbnRhbF9oZWFsdGhfcmVhc29ucyIsDQogICAgInRvdGFsX3JlZmVycmFscyINCiAgKSkpICU+JSANCiAgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSByZWZlcnJhbF9jb3VudCwgbGluZXR5cGU9cmVmZXJyYWxfdHlwZSkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gcmVmZXJyYWxfdHlwZSksc2l6ZT0uNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5ldHlwZQ0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9saW5lcywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIlJlZmVycmFsIFR5cGU6IiwNCiAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChucm93ID0gNSkNCiAgICApKw0KICANCiAgIyBTZXQgdGhlIGNvbG9yDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBwbG90X2NvbG9ycywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIlJlZmVycmFsIFR5cGU6IikrDQoNCiAgbGFicyh0aXRsZSA9ICJNZWRpY2FsIGFuZCBNZW50YWwgSGVhbHRoIFJlZmVycmFscyIpKw0KICB5bGFiKCJOdW1iZXIgb2YgUmVmZXJyYWxzIikrDQogIHhsYWIoIkRhdGUiKSsNCiAgdGhlbWUoDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSINCiAgICApKw0KDQogICMgU2V0IHRoZSBsZWdlbmQgdG8gbXVsdGlwbGUgcm93cw0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPTUpKSsNCiAgDQogICMgV3JhcA0KICBmYWNldF93cmFwKH4gZmFjaWxpdHksIG5jb2w9MykNCmBgYA0KDQojIyBTaWNrIENhbGwgUmVxdWVzdHMgYW5kIEVuY291bnRlcnMNCg0KDQoNCmBgYHtyfQ0KZGZfc2lja19jYWxsIDwtIGRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFNlbGVjdCBhIHN1YnNldCBvZiBjb2x1bW5zIHRvIHdvcmsgd2l0aA0KICBzZWxlY3QoaWQsDQogICAgICAgICBmYWNpbGl0eSwNCiAgICAgICAgIGRhdGUsDQogICAgICAgICBzaWNrX2NhbGxfcmVxdWVzdHMsDQogICAgICAgICBzaWNrX2NhbGxfZW5jb3VudGVycykgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyBDcmVhdGUgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfc2lja19jYWxsID0gc2lja19jYWxsX3JlcXVlc3RzLA0KICAgICAgICAgc2lja19jYWxsX2VuY291bnRlcnMpICU+JSANCiAgDQogICMgVGlkeQ0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9IHNpY2tfY2FsbF9yZXF1ZXN0czoNCiAgICAgICAgIHNpY2tfY2FsbF9lbmNvdW50ZXJzLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2lja19jYWxsX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInNpY2tfY2FsbF9jb3VudCIpICU+JSANCiAgDQogICMgUmVtb3ZlIE5BDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHNpY2tfY2FsbF90eXBlID0gZmFjdG9yKHNpY2tfY2FsbF90eXBlLCBsZXZlbHMgPSBjKA0KICAgICJzaWNrX2NhbGxfcmVxdWVzdHMiLA0KICAgICJzaWNrX2NhbGxfZW5jb3VudGVycyIsDQogICAgInRvdGFsX3NpY2tfY2FsbCINCiAgKSkpDQpgYGANCg0KYGBge3J9DQpkZl9zaWNrX2NhbGwgJT4lIA0KICBncm91cF9ieShzaWNrX2NhbGxfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYFRvdGFsIFNpY2sgQ2FsbCBieSBUeXBlYCA9IHN1bShzaWNrX2NhbGxfY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU2ljayBDYWxsIGJ5IFR5cGUiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJUeXBlIiwgIlRvdGFsIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpDQoNCmRmX3NpY2tfY2FsbCAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9zaWNrX2NhbGwgPSBzdW0oc2lja19jYWxsX2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfc2lja19jYWxsKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFNpY2sgQ2FsbCBSZXF1ZXN0cy9FbmNvdW50ZXJzIGJ5IEZhY2lsaXR5IiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRmFjaWxpdHkiLCAiVG90YWwiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkgJT4lIA0KICBzY3JvbGxfYm94KGhlaWdodCA9ICIzMDBweCIpDQpgYGANCg0KDQoNCg0KDQpgYGB7ciBzaWNrLWNhbGxzLCBmaWcuaGVpZ2h0PTQwfQ0KIyBHZW5lcmF0aW5nIGEgbGluZXR5cGUgdmVjdG9yIGZvciB1c2UgaW4gdGhlIHBsb3QNCnBsb3RfbGluZXMgPC0gYygNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDMsICJQYWlyZWQiKQ0KcGxvdF9jb2xvcnNbM10gPC0gIiMwMDAwMDAiDQoNCiMgQ3JlYXRlIGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiU2ljayBDYWxsIFJlcXVlc3RzIiwNCiAgICAiU2ljayBDYWxsIEVuY291bnRlcnMiLA0KICAgICJUb3RhbCBTaWNrIENhbGxzIikNCg0KZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBzaWNrX2NhbGxfcmVxdWVzdHM6DQogICAgICAgc2lja19jYWxsX2VuY291bnRlcnMNCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIGEgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfc2lja19jYWxscyA9IHN1bShjX2Fjcm9zcygNCiAgICAgICBzaWNrX2NhbGxfcmVxdWVzdHM6DQogICAgICAgc2lja19jYWxsX2VuY291bnRlcnMNCiAgKSkpICU+JSANCg0KICAjIENhbGwgYSByYW5nZSBvZiB0YWJsZSBjb2x1bW5zIGFuZCBwaXZvdCBsb25nDQogIHBpdm90X2xvbmdlciguLA0KICAgICAgICAgICAgICAgY29scz0gIHNpY2tfY2FsbF9yZXF1ZXN0czp0b3RhbF9zaWNrX2NhbGxzLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2lja19jYWxsX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInNpY2tfY2FsbF9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHNpY2tfY2FsbF90eXBlID0gZmFjdG9yKHNpY2tfY2FsbF90eXBlLCBsZXZlbHMgPSBjKA0KICAgICJzaWNrX2NhbGxfcmVxdWVzdHMiLA0KICAgICJzaWNrX2NhbGxfZW5jb3VudGVycyIsDQogICAgInRvdGFsX3NpY2tfY2FsbHMiDQogICkpKSAlPiUgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSBzaWNrX2NhbGxfY291bnQsIGxpbmV0eXBlPXNpY2tfY2FsbF90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBzaWNrX2NhbGxfdHlwZSksc2l6ZT0uNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5ldHlwZQ0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9saW5lcywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIlNpY2sgQ2FsbCBUeXBlOiIsDQogICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQobnJvdyA9IDMpDQogICAgKSsNCiAgDQogICMgU2V0IHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJTaWNrIENhbGwgVHlwZToiKSsNCg0KICBsYWJzKHRpdGxlID0gIlNpY2sgQ2FsbHMiKSsNCiAgeWxhYigiTnVtYmVyIG9mIFNpY2sgQ2FsbHMiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQoNCiAgIyBTZXQgdGhlIGxlZ2VuZCB0byBtdWx0aXBsZSByb3dzDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9MykpKw0KICANCiAgIyBXcmFwDQogIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbD0zKQ0KYGBgDQoNCiMjIFN1aWNpZGUgQXR0ZW1wdHMgYW5kIFdhdGNoZXMNCg0KVGhlIGZvbGxvd2luZyBzaG93cyBTdWljaWRlIEF0dGVtcHRzIGFuZCBTdWljaWRlIFdhdGNoZXMgYmFzZWQgb24gdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBhcyBvZiBgciBTeXMuRGF0ZSgpYC4gVGhlIG51bWJlcnMgYXJlIHN1YmplY3QgdG8gY2hhbmdlLg0KDQpgYGB7cn0NCmRmX3N1aWNpZGUgPC0gZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU2VsZWN0IGEgc3Vic2V0IG9mIGNvbHVtbnMgdG8gd29yayB3aXRoDQogIHNlbGVjdChpZCwNCiAgICAgICAgIGZhY2lsaXR5LA0KICAgICAgICAgZGF0ZSwNCiAgICAgICAgIHN1aWNpZGVfYXR0ZW1wdHNfb3Jfc2VsZl9oYXJtLA0KICAgICAgICAgc3VpY2lkZV93YXRjaGVzX2NvbnN0YW50X3dhdGNoX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24pICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIG5ldyB0b3RhbCBjb2x1bW4NCiAgbXV0YXRlKHRvdGFsX3N1aWNpZGUgPSBzdWljaWRlX2F0dGVtcHRzX29yX3NlbGZfaGFybSArDQogICAgICAgICBzdWljaWRlX3dhdGNoZXNfY29uc3RhbnRfd2F0Y2hfbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbikgJT4lIA0KICANCiAgIyBUaWR5DQogIHBpdm90X2xvbmdlciguLA0KICAgICAgICAgICAgICAgY29scz0gc3VpY2lkZV9hdHRlbXB0c19vcl9zZWxmX2hhcm06DQogICAgICAgICAgICAgICB0b3RhbF9zdWljaWRlLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic3VpY2lkZV90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzdWljaWRlX2NvdW50IikgJT4lIA0KICANCiAgIyBSZW1vdmUgTkENCiAgZHJvcF9uYSgpICU+JSANCiAgDQogICMgRXhwbGljaXRseSBzZXQgZmFjdG9yIGxldmVscw0KICBtdXRhdGUoc2VncmVnYXRpb25fdHlwZSA9IGZhY3RvcihzdWljaWRlX3R5cGUsIGxldmVscyA9IGMoDQogICAgInN1aWNpZGVfYXR0ZW1wdHNfb3Jfc2VsZl9oYXJtIiwNCiAgICAic3VpY2lkZV93YXRjaGVzX2NvbnN0YW50X3dhdGNoX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24iLA0KICAgICJ0b3RhbF9zdWljaWRlIg0KICApKSkNCmBgYA0KDQpgYGB7cn0NCmRmX3N1aWNpZGUgJT4lIA0KICBncm91cF9ieShzdWljaWRlX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGBUb3RhbCBTdWljaWRlIEF0dGVtcHQgb3IgV2F0Y2ggYnkgVHlwZWAgPSBzdW0oc3VpY2lkZV9jb3VudCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBTdWljaWRlIEF0dGVtcHQgb3IgV2F0Y2ggYnkgVHlwZSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIlR5cGUiLCAiVG90YWwiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkNCg0KZGZfc3VpY2lkZSAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9zdWljaWRlID0gc3VtKHN1aWNpZGVfY291bnQpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9zdWljaWRlKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFN1aWNpZGUgQXR0ZW1wdCBvciBXYXRjaCBieSBGYWNpbGl0eSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkZhY2lsaXR5IiwgIlRvdGFsIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpICU+JSANCiAgc2Nyb2xsX2JveChoZWlnaHQgPSAiMzAwcHgiKQ0KYGBgDQoNCg0KYGBge3Igc3VpY2lkZS1mYWNldCwgZmlnLmhlaWdodD00MH0NCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMgYW5kIG1vZGlmeQ0KIyB0aGUgbGFzdCBjb2xvciB0byBiZSBibGFjayBmb3IgdG90YWxzLg0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCgyLCAiUGFpcmVkIikNCg0KIyBDcmVhdGUgcGxvdCBsYWJlbHMNCnBsb3RfbGFiZWxzIDwtIGMoDQogICAgICAiU3VpY2lkZSBBdHRlbXB0cyBvciBTZWxmIEhhcm0iLA0KICAgICAgIlN1aWNpZGUgV2F0Y2hlcy9Db25zdGFudCBXYXRjaC9NZW50YWwgSGVhbHRoIE9ic2VydmF0aW9uIikNCg0KZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBzdWljaWRlX2F0dGVtcHRzX29yX3NlbGZfaGFybSwNCiAgICAgICBzdWljaWRlX3dhdGNoZXNfY29uc3RhbnRfd2F0Y2hfbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbg0KICAgICAgICkgJT4lIA0KICBkcm9wX25hKCkgJT4lIA0KIA0KICAjIENhbGwgYSByYW5nZSBvZiB0YWJsZSBjb2x1bW5zIGFuZCBwaXZvdCBsb25nDQogIHBpdm90X2xvbmdlciguLA0KICAgICAgICAgICAgICAgY29scz0gIGMoc3VpY2lkZV9hdHRlbXB0c19vcl9zZWxmX2hhcm0sDQogICAgICAgc3VpY2lkZV93YXRjaGVzX2NvbnN0YW50X3dhdGNoX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24pLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic3VpY2lkZV90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzdWljaWRlX2NvdW50IikgJT4lIA0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHN1aWNpZGVfdHlwZSA9IGZhY3RvcihzdWljaWRlX3R5cGUsIGxldmVscyA9IGMoDQogICAgInN1aWNpZGVfYXR0ZW1wdHNfb3Jfc2VsZl9oYXJtIiwNCiAgICAic3VpY2lkZV93YXRjaGVzX2NvbnN0YW50X3dhdGNoX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24iDQogICkpKSAlPiUgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSBzdWljaWRlX2NvdW50KSkrDQogIGdlb21fbGluZShhZXMoY29sb3I9c3VpY2lkZV90eXBlKSwgc2l6ZSA9IC42NSkgKw0KICANCiAgIyBTZXQgdGhlIGNvbG9yDQogIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBwbG90X2NvbG9ycywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIlR5cGU6Ig0KICAgICkrDQogIA0KICBsYWJzKHRpdGxlID0gIlN1aWNpZGUgQXR0ZW1wdHMgYW5kIFdhdGNoZXMiKSsNCiAgeWxhYigiTnVtYmVyIG9mIEF0dGVtcHRzIG9yIFdhdGNoZXMiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQogICMgU2V0IHRoZSBsZWdlbmQgdG8gbXVsdGlwbGUgcm93cw0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPTUpKSsNCiAgDQogICMgV3JhcA0KICBmYWNldF93cmFwKH4gZmFjaWxpdHksIG5jb2wgPSAzKQ0KDQoNCmBgYA0KDQojIyBIdW5nZXIgU3RyaWtlcw0KDQpgYGB7ciBodW5nZXItc3RyaWtlLXN1bW1hcnl9DQpkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLCBodW5nZXJfc3RyaWtlcykgJT4lIA0KDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9odW5nZXJfc3RyaWtlID0gc3VtKGh1bmdlcl9zdHJpa2VzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfaHVuZ2VyX3N0cmlrZSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBIdW5nZXIgU3RyaWtlcyBieSBGYWNpbGl0eSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkZhY2lsaXR5IiwgIlRvdGFsIEh1bmdlciBTdHJpa2VzIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpICU+JSANCiAgc2Nyb2xsX2JveChoZWlnaHQgPSAiMzAwcHgiKQ0KYGBgDQoNCg0KDQoNCmBgYHtyIGh1bmdlci1zdHJpa2UtZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIFVzZSBDb2xvciBCcmV3ZXIgdG8gc2V0IGNvbG9ycyBhbmQgbW9kaWZ5DQojIHRoZSBsYXN0IGNvbG9yIHRvIGJlIGJsYWNrIGZvciB0b3RhbHMuDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDIsICJQYWlyZWQiKQ0KDQpkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLA0KICAgICAgIGh1bmdlcl9zdHJpa2VzDQogICAgICAgKSAlPiUgDQogIGRyb3BfbmEoKSAlPiUgDQogDQoNCiAgIyBDYWxsaW5nIHRoZSBwbG90IGFuZCBmb3JtYXR0aW5nDQogIGdncGxvdChhZXMoeD1kYXRlLCB5ID0gaHVuZ2VyX3N0cmlrZXMpKSsNCiAgZ2VvbV9saW5lKHNpemUgPSAuNjUpICsNCiAgDQogICMgc2NhbGVfY29sb3JfbWFudWFsKA0KICAjICAgdmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICMgICBsYWJlbHMgPSBjKA0KICAjICAgICAiU3VpY2lkZSBBdHRlbXB0cyBvciBTZWxmIEhhcm0iLA0KICAjICAgICAiU3VpY2lkZSBXYXRjaGVzL0NvbnN0YW50IFdhdGNoL01lbnRhbCBIZWFsdGggT2JzZXJ2YXRpb24iDQogICMgICAgICksDQogICMgICBuYW1lID0gIlR5cGU6Ig0KICAjICAgKSsNCiAgIyANCiAgbGFicyh0aXRsZSA9ICJIdW5nZXIgU3RyaWtlcyIpKw0KICB5bGFiKCJOdW1iZXIgb2YgSHVuZ2VyIFN0cmlrZXMiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQogIA0KICAjIFNldCB0aGUgbGVnZW5kIHRvIG11bHRpcGxlIHJvd3MNCiAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID01KSkrDQogIA0KICAjIFdyYXANCiAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sID0gMykNCmBgYA0KDQojIENhdXNlIG9mIERlYXRoDQoNCiMjIFN1aWNpZGUgYXMgQ2F1c2Ugb2YgRGVhdGgNCg0KQmFyIHBsb3Qgb2YgSUNFIGFuZCBub24tSUNFIGRlYXRocyBieSBzdWljaWRlIHBsb3R0ZWQgYnkgZmFjaWxpdHkgYXMgb2YgYHIgU3lzLkRhdGUoKWAuDQoNCmBgYHtyIHN1aWNpZGUtY29kLXBsb3R9DQpkZl8zMjQgJT4lIA0KICBzZWxlY3QoaWQsDQogICAgICAgICBmYWNpbGl0eSwNCiAgICAgICAgIHN0YXRlLA0KICAgICAgICAgZGF0ZSwNCiAgICAgICAgIGZhY19vcGVyYXRvciwNCiAgICAgICAgIGNvZF9zdWljaWRlX2ljZSwNCiAgICAgICAgIGNvZF9zdWljaWRlX25vdF9pY2UpICU+JSANCiAgZHJvcF9uYSgpICU+JSANCiAgZmlsdGVyKGNvZF9zdWljaWRlX2ljZT4wfGNvZF9zdWljaWRlX25vdF9pY2UgPjApICU+JSANCiAgbXV0YXRlKGNvZF9zdWljaWRlX3RvdGFsID0gY29kX3N1aWNpZGVfaWNlICsgY29kX3N1aWNpZGVfbm90X2ljZSkgJT4lIA0KICANCiAgIyBIZXJlIG9uZSBjb3VsZCBjYWxsIGRhdGF0YWJsZSgpIG9yIGthYmxlKCkNCiAgIyB0byBnZXQgYSBsaXN0IG9mIHRoZSBmYWNpbGl0aWVzIGFuZCBjb3VudA0KICANCiAgIyBJbml0aWF0ZSB0aGUgcGxvdA0KICBnZ3Bsb3QoYWVzKHg9Y29kX3N1aWNpZGVfdG90YWwsIHk9ZmFjaWxpdHkpKSsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDEsMikpKw0KICBsYWJzKHRpdGxlID0gIkNhdXNlIG9mIERlYXRoIFN1aWNpZGUiLA0KICAgICAgIHN1YnRpdGxlID0gIkluY2x1ZGVzIElDRSBhbmQgbm9uLUlDRSBEZWF0aHMgYnkgU3VpY2lkZSIpKw0KICB4bGFiKCJDT0QgU3VpY2lkZSBUb3RhbCIpKw0KICB5bGFiKCJGYWNpbGl0eSIpDQpgYGANCg0KIyBPYnNlcnZhdGlvbnMNCg0KT2JzZXJ2YXRpb25zIG1hZGUgb24gdGhlIGRhdGEgYXMgdGhleSBhY2N1bXVsYXRlIGFyZSBsb2dnZWQgYmVsb3cuDQoNCiMjIDI4IE1heSAyMDIxDQoNCjEuICBBZGVsYW50byBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgLSBFYXN0IGFuZCBXZXN0IGhhdmUgaWRlbnRpY2FsIGRhdGEgZm9yIDIwMjAsIGJ1dCB0aGUgbnVtYmVycyBhcmUgZGlmZmVyZW50IGZvciAyMDE5IHdpdGggRWFzdCBiZWluZyBtdWNoIGxvd2VyIHRoYW4gd2VzdC4gQ3JhaWcgY2hlY2tlZCB0aGUgaW5zcGVjdGlvbnMgYW5kIHRoZSBudW1iZXJzIGFyZSBkaWZmZXJlbnQgZm9yIEVhc3QgYW5kIFdlc3QgaW4gMjAxOSB3aGlsZSB0aGV5IGFyZSBpbiBmYWN0IHRoZSBzYW1lIGZvciAyMDIwLiBOb3RlIHRoYXQgMjAyMCBpcyBhIHJlbW90ZSBpbnNwZWN0aW9uLiBIb3dldmVyLCBpdCBpcyBzaWduaWZpY2FudCB0aGF0IHRoZSB0d28gYXJlIGNvbXBhcmFibGUgaW4gb25lIGluc3RhbmNlIGFuZCBub3QgY29tcGFyYWJsZSBpbiBhbm90aGVyIGNhc2UuDQoNCjIuICBBbG1hbmNlIENvdW50eSBKYWlsIGFuZCBDaGFzZSBDb3VudHkgRGV0ZW50aW9uIENlbnRlciBib3RoIHNlZW0gdG8gcmVnaXN0ZXIgYmxhbmsgZm9yIHNvbGl0YXJ5LiBDcmFpZyBzdXNwZWN0cyB0aGlzIGlzIGJlY2F1c2UgdGhlcmUgd2VyZSBub3QgY2FzZXMgb2Ygc29saXRhcnkgcmVwb3J0ZWQuDQoNCiMjIDI3IE1heSAyMDIxDQoNCk9uZSBvZiB0aGUgaW1wb3J0YW50IGVhcmx5IG9ic2VydmF0aW9ucyBoYXMgdG8gZG8gd2l0aCB0aGUgbmFtaW5nIG9mIGZhY2lsaXRpZXMuIElDRSBpcyBvZnRlbiBpbmNvbnNpc3RlbnQgd2l0aCBmYWNpbGl0eSBuYW1pbmcgYW5kIHRoZSBuYW1lcyBkbyBvZnRlbiBjaGFuZ2Ugb3ZlciB0aW1lLiBCb3RoIHRoZSBjaGFuZ2luZyBvZiBuYW1lcyBhbmQgaW5jb25zaXN0ZW50IG5hbWluZyBjb252ZW50aW9ucyBjYW4gY2F1c2UgY29uZnVzaW9uIGFzIHdlbGwgYXMgZXJyb3Igd2hlbiB0YWJ1bGF0aW5nIHJlc3VsdHMuDQoNCjEuICBUaGUgZ3JhcGhzIGZvciAiKipBZGVsYW50byBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgLSBFYXN0KioiIGFuZCAiKipBZGVsYW50byBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgLSBXZXN0KioiIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGluZm9ybWF0aW9uIENyYWlnIHJlY2FsbHMgc2VlaW5nIGluIG9uZSBvZiB0aGUgaW5zcGVjdGlvbnMsIHRoYXQgdGhlIG51bWJlcnMgZm9yIHRoZSBmYWNpbGl0aWVzIGFyZSAibWVyZ2VkIiBvciBjb21iaW5lZC4NCg0KICAgIC0gICBGb3IgZmFjZXQgZ3JhcGhpbmcgY29uc2lkZXIgZmlsdGVyaW5nLiBGb3IgYW5hbHlzaXMgcHVycG9zZXMgbWF5IG5lZWQgdG8gdHJlYXQgdGhlIHR3byBmYWNpbGl0aWVzIGFzICJtZXJnZWQiDQoNCjIuICAiKipBZGVsYW50byBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgV2VzdCoqIiBzaG91bGQgYmUgY29tYmluZWQgd2l0aCAiKipBZGVsYW50byBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgLSBXZXN0KioiLiBJdCBhcHBlYXJzIHRoYXQgSUNFIGlzIG5vdCBjb25zaXN0ZW50bHkgbmFtaW5nIHRoZSBmYWNpbGl0aWVzLCBpbiBvbmUgY2FzZSB0aGUgbmFtZSBsYWNrcyBhIGRhc2ggY2hhcmFjdGVyIHdoaWNoIGNhdXNlcyB0aGVtIHRvIGJlIGdyYXBoZWQgc2VwYXJhdGVseS4NCg0KICAgIC0gICBUaGUgZGFzaCB3YXMgYWRkZWQgdG8gQWRlbGFudG8gV2VzdC4NCg0KMy4gIEl0IHdvdWxkIGJlIGdvb2QgdG8gY2hlY2sgaWYgdGhlcmUgcmVhbGx5IHR3byBmYWNpbGl0aWVzIGluIEFsbWFuY2UgQ291bnR5LiBUaGVyZSBhcmUgZW50cmllcyBsaXN0ZWQgZm9yICIqKkFsbWFuY2UgQ291bnR5IERldGVudGlvbiBDZW50ZXIqKiIgYW5kICIqKkFsbWFuY2UgQ291bnR5IEphaWwqKiIuDQoNCiAgICAtICAgTmVlZCB0byB2ZXJpZnkgdGhhdCB0aGVzZSBhcmUgaW4gZmFjdCBkaXN0aW5jdCBmYWNpbGl0aWVzLg0KDQo0LiAgIioqQXVyb3JhIElDRSBQcm9jZXNzaW5nIENlbnRlciBJSSAtIEFubmV4KioiIGFuZCAiKipBdXJvcmEgSUkgQW5uZXgqKiIgc2hvdWxkIHByb2JhYmx5IGJlIGNvbWJpbmVkLiBOZWVkIHRvIGNoZWNrIHRoZSBpbnNwZWN0aW9ucyB0byB2ZXJpZnkuDQoNCiAgICAtICAgIioqQXVyb3JhIElJIEFubmV4IChDTykgLSBKYW4uIDI5LCAyMDIxIioqIHdhcyBjaGFuZ2VkIHRvICIqKkF1cm9yYSBJQ0UgUHJvY2Vzc2luZyBDZW50ZXIgSUkgLSBBbm5leCAoQ08pIC0gSmFuLiAyOSwgMjAyMSoqIg0KDQojIFJlZmVyZW5jZXMNCg0KOjo6IHsjcmVmc30NCjo6Og0KDQpgYGB7ciBwYWNrYWdlLXJlZmVyZW5jZXMsIGVjaG89RkFMU0V9DQprbml0cjo6d3JpdGVfYmliKGZpbGUgPSAncGFja2FnZXMuYmliJykNCmBgYA0K