GitHub

Check out my github repository for more content and updates on this project.

The codes below will allow the computation of the BNA score for any city in Europe. The coding languages are a combination of R and SQL, with a few lines passed onto the Command Prompt.

Case study: Cambridge, UK

Workflow step by step

1. Establish a connection with the PostgreSQL server and establish basic parameters of analysis.

Within this step, three major things are performed, assuming that the user has created a database on its PostgreSQL. To test connection an empty table on the database called “test” was created on the public schema.

- Create connection and test it

library(RPostgreSQL)
# LOAD POSTGRESQL DRIVER
driver <- dbDriver("PostgreSQL")
# CREATE CONNECTION TO THE POSTGRESQL DATABASE
# THE CONNECTION VARIABLE WILL BE USED FOR ALL FURTHER OPERATIONS
connection <- dbConnect(
  driver, 
  dbname = db_name,
  host = local_host, 
  port = port_num,
  user = user_name, 
  password = rstudioapi::askForPassword("Database password")
)
ifelse(
  !dbExistsTable(connection, "test"),
  "The connection to the database was not possible.",
  "The connection to the database was successful!"
)
[1] "The connection to the database was successful!"
# DISCONNECT: Important when modifying the database on pgadmin4
# dbDisconnect(connection)

- Set up database

NOTICE:  extension "hstore" already exists, skipping
NOTICE:  extension "postgis" already exists, skipping
NOTICE:  extension "pgrouting" already exists, skipping
NOTICE:  schema "destinations" already exists, skipping
NOTICE:  schema "generated" already exists, skipping
NOTICE:  schema "received" already exists, skipping

- Establish Study Area and other important variables

Not only the name of the study area should be established, but also the number of subdivisions for the grid, the coordinate reference system to work with, and the biking distance that will be assumed for the connectivity analysis.

sa_name = "Cambridge"
subdivisions = 4
sa_crs = 3857
biking_distance = 3000 ## in meters
paste("You are running the BNA score for", sa_name, "within a biking distance of", biking_distance/1000, "km.")
[1] "You are running the BNA score for Cambridge within a biking distance of 3 km."

2. Obtain study area boundary with osmdata.

Extract the study area boundary considering a buffer of half the biking distance established.

# FUNCTION TO EXTRACT STUDY AREA BOUNDARY WITH OSM AND WRITE IT TO THE DATABASE
sa_bb <- function (study_area, dist, crs, conn){
  # GET DATA FROM OSM
  library(osmdata)
  library(sf)
  study_area_bb <- study_area %>% 
    getbb(format_out = "sf_polygon") %>%
    st_transform(crs = crs)
  
  ## ADD A BUFFER TO THE BOUNDARY
  study_area_bb <-study_area_bb %>% 
    st_buffer(dist = 0.5*dist)
  
  # DELETE EXISTING BOUNDARY
  library(sqldf)
  sqldf(
    "DROP TABLE IF EXISTS received.sa_boundary",
    connection = conn
  )
  # UPLOAD BOUNDARY TO POSTGRESQL DATABASE
  library(RPostgreSQL)
  dbWriteTable(conn, c("received","sa_boundary"), study_area_bb)
  
  study_area_bb
}
boundary <- sa_bb(
  study_area = sa_name, 
  dist = biking_distance,
  crs = sa_crs, 
  conn = connection
)
library(tmap)
tmap_mode("view")
tmap mode set to interactive viewing
qtm(
  shp = boundary, 
  fill = NULL, 
  borders = "red", 
  basemaps = "OpenStreetMap"
)

3. Obtain the .osm file from Overpass API

# FUNCTION TO DOWNLOAD OSM DATA WITH THE OVERPASS API 
sa_download <- function(conn){
  # OBTAIN THE EXTENT OF THE STUDY AREA AS A BOUNDING BOX
  sa_extent <- dbGetQuery(conn,
        "SELECT
        ST_Extent((ST_Transform(geometry,4326)))
        FROM received.sa_boundary") 
  
  library(stringr)
  sa_coord <- toString(sa_extent) %>% 
    str_extract_all("\\-*\\d+\\.*\\d*") %>% 
    unlist() %>% 
    toString()
    
  # CONSTRUCT THE API LINE TO REQUEST THE DATA
  api <- paste(
    'https://overpass-api.de/api/map?bbox=',
    sa_coord,
    sep = ''
  )
  
  # CREATE A NEW TEMPORAL DIRECTORY TO DOWNLOAD THE INFO
  cd <- getwd()
  ifelse(
    !file.exists(file.path(cd,'temp')),
    dir.create(file.path(cd,'temp')), 
    "Directory already exists"
  )
  
  # ESTABLISH THE NAME OF THE FILE WHERE THE OVERPASS API WILL DOWNLOAD ITS DATA
  osm_file <- file.path(cd,'temp','overpass.osm')
  
  # REQUEST THE DATA FROM THE API
  library(utils)
  download.file(url = api, destfile = osm_file, extra = '-nv -O') 
  
  ifelse(
    file.exists(file.path(cd,'temp','overpass.osm')),
    "OMS data successfully downloaded!",
    "OSM data was not downloaded, please try again or download manually."
  )
  
}
# DOWNLOAD THE DATA FROM OSM WITH OVERPASS API
sa_download(conn = connection)
trying URL 'https://overpass-api.de/api/map?bbox=0.0551641725691649, 52.1496753485212, 0.19802494271238, 52.2454796501678'
Content type 'application/osm3s+xml' length unknown
downloaded 87.0 MB
[1] "OMS data successfully downloaded!"

4. Load data into the PostgreSQL database.

- Obtain configuration files

# CREATE A NEW TEMPORAL DIRECTORY TO DOWNLOAD THE INFO
cd <- getwd()
ifelse(
  !file.exists(file.path(cd,'temp')),
  dir.create(file.path(cd,'temp')), 
  "Directory already exists"
)
[1] "Directory already exists"
# ESTABLISH THE NAME OF THE FILES 
pfbstyle_file <- file.path(cd,'temp','pfb.style')
mapconfig_file <- file.path(cd,"temp","mapconfig.xml")
mapconfigbikes_file <- file.path(cd,"temp","mapconfig_for_bicycles.xml")
# CHECK IF THEY ARE DOWNLOADED
if(
  file.exists(file.path(pfbstyle_file)) & 
  file.exists(file.path(mapconfig_file)) &
  file.exists(file.path(mapconfigbikes_file))
){
  "Files are already downloaded!"
} else {
 # ESTABLISH THE URLS
  pfbstyle_url <- "https://raw.githubusercontent.com/azavea/pfb-network-connectivity/develop/src/analysis/import/pfb.style"
  
  mapconfig_url <- "https://raw.githubusercontent.com/pgRouting/osm2pgrouting/master/mapconfig.xml"
  
  mapconfigbikes_url <- 
  "https://raw.githubusercontent.com/pgRouting/osm2pgrouting/master/mapconfig_for_bicycles.xml"
  
  # REQUEST THE DATA
  library(utils)
  download.file(url = pfbstyle_url, destfile = pfbstyle_file)
  download.file(url = mapconfig_url, destfile = mapconfig_file)
  download.file(url = mapconfigbikes_url, destfile = mapconfigbikes_file) 
}
[1] "Files are already downloaded!"

- Load data with osm2pgsql and osm2pgrouting

NOTE: To run this command set path variables for osm2pgsql and osm2pgrouting and create a password file on %APPDATA%/postgresql/pgpass.conf with the format hostname:port:database:username:password.

Replace variables between %:

system(
  command = "osm2pgsql -c -d %DBNAME% -U %USERNAME% -H %HOSTNAME% -W --create --prefix sa_full -S %CURRENTDIRECTORY/temp/pfb.style% %CURRENTDIRECTORY/temp/overpass.osm% --cache 600",
  show.output.on.console = TRUE
  )

system(
  command = "osm2pgrouting -f %CURRENTDIRECTORY/temp/overpass.osm% -h %HOSTNAME% --password %DBPASSWORD% -d %DBNAME% --username %USERNAME% --schema received --prefix sa_all_ --conf %CURRENTDIRECTORY/temp/mapconfig.xml% --clean",
  show.output.on.console = TRUE
)

system(
  command = "osm2pgrouting -f %CURRENTDIRECTORY/temp/overpass.osm% -h %HOSTNAME% --password %DBPASSWORD% -d %DBNAME% --username %USERNAME% --schema received --prefix sa_bike_ --conf %CURRENTDIRECTORY/temp/mapconfig_for_bicycles.xml% --clean",
  show.output.on.console = TRUE
)

5. Organize and prepare the database

On this step, several SQL queries are being run to organize the tables, clip them to the study area outline, merge it with the osm2pgsql data among other things. The scripts include mainly the code that PfB already uses, but with some modifications like changing feet to meters, mph to km/h, and others. Basically, 4 steps are taken:

- Organize tables

Which drops unused columns and projects data to the already established CRS. It also cleans the database for a new analysis to be run if the study area is changed for example.

- Clip data into boundary

Which clips the data into the boundary of the study area selected.

- Populate way table

Which does modifications to the following columns on the ways table:

> one way
> width
> functional class
> paths
> speed limit
> lanes
> park
> bike infrastructure
> class adjustments

- Populate intersection table

Which does modifications to the following columns on the intersection table.

> legs
> signalized
> stops
> rrfb
> island

An example of how the tables look like after this step:

SELECT * FROM received.sa_ways LIMIT 10;
SELECT * FROM received.sa_ways_int LIMIT 10;

The code for this step is not included as it is basically the same as the PfB code, and is actually quite long. However, it can be examined through the Rmd file for this R Notebook.

One additional value that I was considering on adding is slope, however I have not gone through with the complete implementation of the variable yet. This would also affect step 6.

6. Calculate stress

The same as step 5, this step considers mainly SQL queries already performed by PfB. It will mainly alter the columns meant to host the stress rank for segments and intersections. It considers different cases to do the classification. The scripts that can be further examined on the Rmd file are:

> motorway trunk
> higher order
> lower order
> living street
> track
> path
> one way reset
> motorway trunk intersection
> primary intersection
> secondary intersection
> tertiary intersection
> lower intersection

7. Build network

On this step the network is built by creating two tables: vertices and links. As the last 2 steps, the code won’t be include but can be analyzed on the Rmd file.

8. Generate population grid

So, this is one of the main differences regarding the PfB approach and mine. Instead of using US census blocks I used a population grid of 1 km2 for the entire European territory. Since its area is quite big, I created a subdivision code to split the data, considering partial populations for each new cell depending on the mother cell. To do this I followed two steps:

- Download data from EUROSTAT and load into DB

## Download data and load to PostgreSQL
if (!dbExistsTable(connection, c("received","geostat"))){
  
  # CREATE A NEW TEMPORAL DIRECTORY TO DOWNLOAD THE INFO
  cd <- getwd()
  ifelse(
    !file.exists(file.path(cd,'temp')),
    dir.create(file.path(cd,'temp')), 
    "Directory already exists"
  )
  
  # ESTABLISH THE NAME OF THE FILE WHERE THE GEOSTAT DATA WILL BE DOWNLOADED AND UNZIPPED
  geostat_file <- file.path(cd,'temp','geostat.zip')
  geostat_exdir <- file.path(cd,"temp","geostat")
  
  if (!file.exists(geostat_exdir)){
    # DEFINE THE URL FROM WHERE THE DATA COMES
  
    geostat_url <- 
      "https://ec.europa.eu/eurostat/cache/GISCO/geodatafiles/GEOSTAT-grid-POP-1K-2011-V2-0-1.zip"
    
    # DOWNLOAD THE FILE, UNZIP IT AND DELETE .ZIP
    
    library(utils)
    download.file(url = geostat_url, destfile = geostat_file)
    unzip(geostat_file, exdir = geostat_exdir)
    file.remove(geostat_file)
  }
  
  # CALL DATA INTO R AND REPROJECT
  library(sf)
  
  table_path <- file.path(
    geostat_exdir,
    "Version 2_0_1/GEOSTAT_grid_POP_1K_2011_V2_0_1.csv"
  )
  
  grid_path <- file.path(
    geostat_exdir,
    "Version 2_0_1/GEOSTATReferenceGrid/Grid_ETRS89_LAEA_1K-ref_GEOSTAT_POP_2011_V2_0_1.shp"
  )
  
  pop_table <- st_read(table_path)
  names(pop_table) <- pop_table %>% names() %>% tolower()
  
  pop_grid <- st_read(grid_path)
  pop_grid_t <- pop_grid %>% st_transform(crs = sa_crs)
  names(pop_grid_t) <- pop_grid_t %>% names() %>% tolower()
  
  # LOAD TO POSTGRESQL
  library(sqldf)
  sqldf(
    "
  DROP TABLE IF EXISTS received.pop_grid;
  DROP TABLE IF EXISTS received.pop_table;
    ",
  connection = connection
  )
  
  dbWriteTable(
    conn = connection,
    name = c("received","pop_grid"),
    value = pop_grid_t
  )
  
  dbWriteTable(
    conn = connection,
    name = c("received","pop_table"),
    value = pop_table
  )
  
  #### Join tables on data base and extract study area
  
  sqldf(
    "
-- Create join between .csv and .shp
DROP TABLE IF EXISTS received.geostat;
DROP INDEX IF EXISTS received.geostat_geom_idx;
CREATE TABLE received.geostat AS
 SELECT grid.grd_id, grid.geometry, tab.tot_p, tab.cntr_code, tab.year, tab.tot_p_con_dt
    FROM received.pop_grid grid, received.pop_table tab
    WHERE grid.grd_id = tab.grd_id;
CREATE INDEX geostat_geom_idx
  ON received.geostat
  USING gist
  (geometry);
  
DROP TABLE IF EXISTS received.pop_grid;
DROP TABLE IF EXISTS received.pop_table;
    ",
    connection = connection
  )
} else {
  "GEOSTAT data already loaded to database."
}
[1] "GEOSTAT data already loaded to database."
Warning message:
In postgresqlExecStatement(conn, statement, ...) :
  RS-DBI driver warning: (unrecognized PostgreSQL field type geometry (id:56267) in column 5)

- Generate subdivision with a grid, adding partial population and unique ID

sqldf::sqldf(
  "
DROP TABLE IF EXISTS received.sa_geostat;
DROP INDEX IF EXISTS received.sa_geostat_geom_idx;
-- Extract the grids concerning only the study area
CREATE TABLE received.sa_geostat AS
    SELECT  DISTINCT geo.grd_id, 
            CAST(geo.tot_p AS INTEGER), 
            geo.cntr_code, 
            geo.geometry
    FROM received.geostat geo, received.sa_ways w
    WHERE ST_Intersects(geo.geometry, w.geom);
CREATE INDEX sa_geostat_geom_idx
  ON received.sa_geostat
  USING gist
  (geometry);  
  ",
  connection = connection 
)
NOTICE:  index "sa_geostat_geom_idx" does not exist, skipping
## Establish a function to create grid with different number of subdivisions, defaults to 9
grid <- function(s = 9){
  ## Call it as an sf object and then transform it to CRS:3035 to create grid
  library(sf)
  library(dplyr, quietly = TRUE)
  
  sa_pop_1km2 <- st_read(
    dsn = connection,
    layer = c("received", "sa_geostat")
  ) %>% 
    st_transform(crs = 3035)
  
  ## Determine number of horizontal and vertical cells
  h <- as.integer(as.numeric(diff(st_bbox(sa_pop_1km2)[c(1, 3)]))/1000)
  v <- as.integer(as.numeric(diff(st_bbox(sa_pop_1km2)[c(2, 4)]))/1000)
  
  ## Make grid
  grid <- sa_pop_1km2 %>% 
    st_make_grid(n=c(h*sqrt(s),v*sqrt(s)), what = "polygons") %>%
    st_sf() %>% 
    mutate(id = 1:n()) %>% 
    st_intersection(sa_pop_1km2)
  
  ## Filter grid by area of intersection because there are small polygons created.
  
  grid$area <- grid %>% st_geometry() %>% st_area() %>% as.numeric()
  
  grid <- grid %>% filter(area > 1)
  
  grid$area <- NULL
  
  grid <- within(grid, cell_id <- paste(grd_id,"C",id, sep = ""))
  
  grid$id <- NULL
  
  grid$partial_p <- grid$tot_p/s
  
  grid %>% st_transform(crs = sa_crs)
}
sa_grid <- grid(s = subdivisions) # Always consider a squared number to make an even division
sqldf::sqldf(
  "DROP TABLE IF EXISTS generated.sa_pop_grid",
  connection = connection
)
## Load data into data base
RPostgreSQL::dbWriteTable(
  conn = connection,
  name = c("generated","sa_pop_grid"),
  value = sa_grid
)
[1] TRUE
library(tmap)
tmap_mode("view")
tmap mode set to interactive viewing
qtm(
  shp = sa_grid, 
  fill = NULL, 
  borders = "red", 
  basemaps = "OpenStreetMap"
)

Plotting the grid on this step can allow the analyst decide on a better number of subdivisions, depending on the study area. I hope to automatize this on a later effort.

- Prepare the population grid table

This step is only generating new columns on my new Population Grid table. It follows the same logic as the PfB and therefore won’t be included on this document explicitly.

9. Reachable roads scripts

This is the core of the whole BNA analysis, where the actual network analysis is performed. This step might take some computation time. It is again the same as PfB, and can be reviewed with more detail on the Rmd file. It basically uses pgrouting, therefore the Dijkstra algorithm to compute the driving distance considering the configuration established on step 7. It does it for the two levels of traffic stress:

> High stress
> Low stress

10. Establish connected population grids and compute their accessibility

On this step basically four procedures take place:

- Connect population grids

Where a new table sa_connected_pop_grid is created to summarize the connected cells by establishing them as source and target, including if they are connected by the low or high stress network, and obtaining the minimum the costs between cells.

- Compute population access

The access computation on this step fills up the sa_pop_grid table created on step 8, according to the PfB methodology.

To compute access on this an the next step, a weighting procedure is used, as the methodology of PfB does, which can be accessed here.

A quick glance of the weights used, mainly for step 11:

Scoring Category Measure
People = 15 Population = N/A
Opportunity = 20 Employment = 35
K-12 Education = 35
Technical/vocational school = 10
Higher Education = 20
Core Services = 20 Doctor offices/clinics = 20
Dentist offices = 10
Hospitals = 20
Pharmacies = 10
Supermarkets = 25
Social services = 15
Recreation = 15 Parks = 40
Recreational trails = 35
Community centers = 25
Retail = 15 Retail shopping = N/A
Transit = 15 Station/transit centers = N/A

It is important to note that this reproduction of the BNA for Europe does not include employment data, as until now, I have not located a source to provide this information as open data for the whole Europe. Therefore, the final results will show this category but with 0 or NA values.

- Extract common destinations

Which uses the osm polygons and points generated by osm2pgsql. The destinations included are:

> Colleges
> Community centers
> Dentists
> Doctors
> Hospitals
> Parks
> Pharmacies
> Retail
> Schools
> Social services
> Supermarkets
> Transit
> Universities

- Compute access to common destinations

Where the access to the destinations established before is computed. Access to recreational trails and bike paths is also included.

Once again, on this step I do not include the SQL codes, however they can be accessed through the Rmd file.

11. Compute overall access

During this step the overall access is computed for each population grid, meaning that we can already observe the BNA score spatial behavior within our study area.

12. Compute overall score for the whole study area

For this step a new table is generated in the database sa_score_inputs to store the preliminary results. The code can be accessed on the Rmd file.

Results

The overall results obtained include the final score for the whole city, as well as the score per destination category. The total population and stress network is also calculated. The results can be observed on the following table.

Score/Value
Overall Score 72.41
Population 141307
Length of Low Stress Network (km) 1604.9
Length of High Stress Network (km) 243.9
People
Total People 76.81
Opportunity
Employment 0
K-12 Education 80.97
Technical/vocational school 78.19
Higher Education 76.45
Total Opportunity 51.45
Core Services
Doctor offices/clinics 79.67
Dentist offices 76.24
Hospitals 68.47
Pharmacies 74.61
Supermarkets 85.05
Social services 82
Total Core Services 78.28
Retail
Total Retail shopping 79.26
Recreation
Parks 83.87
Recreational trails 93.65
Community centers 71.69
Total Recreation 84.25
Transit
Total Transit 69.42

We can plot the results to have a quick view of the output, including the high and low stress network in an interactive way.

library(sf)
bna_score <- st_read(
  dsn = connection,
  layer = c("generated","sa_pop_grid")
)
stress_network <- st_read(
  dsn = connection,
  query = "SELECT ft_seg_stress, tf_seg_stress, geom FROM received.sa_ways"
)
bna_pal <- c("#FC7151","#DC7E6A","#C98875","#C08B83","#AD9396",
             "#9C9A9F","#929EAC","#78AAC5","#6FADCB","#49BFE6")
bna_breaks <- c(6,12,18,24,30,36,42,48,54,100)
stress_network$ft_stress <- ifelse(stress_network$ft_seg_stress == 1,"low stress","high stress")
stress_network$tf_stress <- ifelse(stress_network$tf_seg_stress == 1,"low stress","high stress")
library(tmap)
tmap_mode("view")
tmap mode set to interactive viewing
int_map <- 
  tmap::tmap_leaflet(
     tmap::tm_view(
     basemaps = c(
       "CartoDB.Positron",
       "CartoDB.DarkMatter",
       "OpenStreetMap.Mapnik"
     )
   ) +
     tmap::tm_shape(bna_score) +
     tmap::tm_polygons(
       col = "overall_score",
       style = "fixed",
       breaks = bna_breaks,
       palette = bna_pal,
       alpha = 0.8,
       title = "BNA score",
       border.col = NULL,
       colorNA = NULL,
       showNA = FALSE
      ) +
     tmap::tm_shape(stress_network) +
     tmap::tm_lines(
       col = "ft_stress", 
       colorNA = NULL,
       showNA = FALSE,
       palette = c("firebrick1", "deepskyblue3"),
       title.col = "Stress network"
      ) +
     tmap::tm_shape(stress_network) +
     tmap::tm_lines(
       col = "tf_stress", 
       colorNA = NULL,
       showNA = FALSE,
       palette = c("firebrick1", "deepskyblue3"),
       legend.col.show = FALSE
      )
  )
int_map

Observations

  • The total time that this particular city took to compute its BNA, including plots, overpass download, but without GEOSTAT data download on system, upload on file, and processing on database was 38.9 minutes. Adding the GEOSTAT processing to the workflow adds around 5 minutes. Of course this is also subject to internet speed and computer performance. I run my analysis on an Asus F541U, Intel Core i7, 8GB RAM and 256 GB SSD, with Windows 10 OS.

  • What can be observed for the whole analysis is that the resulting BNA score is highly influenced by the fact that the job/employment data was not included yet. However, this was an attempt to reproduce the score as close as possible as PfB apply their methodology, just to explore its reproducibility.

  • My plan next is to exclude this variable from the BNA score computation, and perhaps include some other variables that would suit the European context better.

  • My final goal for the moment is to try to validate the scoring methodology for Europe. I picked a city in the UK as I know there is Origin-Destination data available that could be used as a validation method.

LS0tDQp0aXRsZTogIkJOQSBzY29yZSBmb3IgRXVyb3BlIg0Kc3VidGl0bGU6IEFuIGF0dGVtcHQgdG8gcmVwcm9kdWNlIHRoZSBQZW9wbGUgZm9yIEJpa2VzIEJOQSBzY29yZQ0KYXV0aG9yOiBMb3JlbmEgQWJhZA0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0aGVtZTogam91cm5hbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGRmX3ByaW50OiB0aWJibGUNCi0tLQ0KWyFbR2l0SHViXShHaXRIdWItTWFyay0zMnB4LnBuZyAiQ2xpY2sgaGVyZSB0byByZWRpcmVjdCB0byBteSByZXBvc2l0b3J5IildKGh0dHBzOi8vZ2l0aHViLmNvbS9sb3JlYWJhZDYvbWFzdGVycy10aGVzaXMtZ2VvdGVjaCkgDQoNCipDaGVjayBvdXQgbXkgZ2l0aHViIHJlcG9zaXRvcnkgZm9yIG1vcmUgY29udGVudCBhbmQgdXBkYXRlcyBvbiB0aGlzIHByb2plY3QuKg0KDQpUaGUgY29kZXMgYmVsb3cgd2lsbCBhbGxvdyB0aGUgY29tcHV0YXRpb24gb2YgdGhlIFtCTkEgc2NvcmVdKGh0dHBzOi8vYm5hLnBlb3BsZWZvcmJpa2VzLm9yZy8jLykgZm9yIGFueSBjaXR5IGluIEV1cm9wZS4gVGhlIGNvZGluZyBsYW5ndWFnZXMgYXJlIGEgY29tYmluYXRpb24gb2YgUiBhbmQgU1FMLCB3aXRoIGEgZmV3IGxpbmVzIHBhc3NlZCBvbnRvIHRoZSBDb21tYW5kIFByb21wdC4NCg0KIyBDYXNlIHN0dWR5OiBDYW1icmlkZ2UsIFVLIHsudGFic2V0fQ0KDQojIyBXb3JrZmxvdyBzdGVwIGJ5IHN0ZXAgDQoNCiMjIyAxLiBFc3RhYmxpc2ggYSBjb25uZWN0aW9uIHdpdGggdGhlIFBvc3RncmVTUUwgc2VydmVyIGFuZCBlc3RhYmxpc2ggYmFzaWMgcGFyYW1ldGVycyBvZiBhbmFseXNpcy4NCg0KV2l0aGluIHRoaXMgc3RlcCwgdGhyZWUgbWFqb3IgdGhpbmdzIGFyZSBwZXJmb3JtZWQsIGFzc3VtaW5nIHRoYXQgdGhlIHVzZXIgaGFzIGNyZWF0ZWQgYSBkYXRhYmFzZSBvbiBpdHMgUG9zdGdyZVNRTC4gVG8gdGVzdCBjb25uZWN0aW9uIGFuIGVtcHR5IHRhYmxlIG9uIHRoZSBkYXRhYmFzZSBjYWxsZWQgInRlc3QiIHdhcyBjcmVhdGVkIG9uIHRoZSBwdWJsaWMgc2NoZW1hLg0KDQojIyMjIC0gQ3JlYXRlIGNvbm5lY3Rpb24gYW5kIHRlc3QgaXQNCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0Kc3RhcnQgPC0gU3lzLnRpbWUoKQ0KYGBgDQoNCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0NCmRiX25hbWUgPSAiYm5hX2V1cm9wZSINCmxvY2FsX2hvc3QgPSAibG9jYWxob3N0Ig0KcG9ydF9udW0gPSA1NDMyDQp1c2VyX25hbWUgPSAicG9zdGdyZXMiDQpgYGANCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBpbmNsdWRlID0gVFJVRSwgd2FybmluZyA9IEZBTFNFfQ0KbGlicmFyeShSUG9zdGdyZVNRTCkNCg0KIyBMT0FEIFBPU1RHUkVTUUwgRFJJVkVSDQpkcml2ZXIgPC0gZGJEcml2ZXIoIlBvc3RncmVTUUwiKQ0KIyBDUkVBVEUgQ09OTkVDVElPTiBUTyBUSEUgUE9TVEdSRVNRTCBEQVRBQkFTRQ0KIyBUSEUgQ09OTkVDVElPTiBWQVJJQUJMRSBXSUxMIEJFIFVTRUQgRk9SIEFMTCBGVVJUSEVSIE9QRVJBVElPTlMNCmNvbm5lY3Rpb24gPC0gZGJDb25uZWN0KA0KICBkcml2ZXIsIA0KICBkYm5hbWUgPSBkYl9uYW1lLA0KICBob3N0ID0gbG9jYWxfaG9zdCwgDQogIHBvcnQgPSBwb3J0X251bSwNCiAgdXNlciA9IHVzZXJfbmFtZSwgDQogIHBhc3N3b3JkID0gcnN0dWRpb2FwaTo6YXNrRm9yUGFzc3dvcmQoIkRhdGFiYXNlIHBhc3N3b3JkIikNCikNCg0KaWZlbHNlKA0KICAhZGJFeGlzdHNUYWJsZShjb25uZWN0aW9uLCAidGVzdCIpLA0KICAiVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlIHdhcyBub3QgcG9zc2libGUuIiwNCiAgIlRoZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSB3YXMgc3VjY2Vzc2Z1bCEiDQopDQoNCiMgRElTQ09OTkVDVDogSW1wb3J0YW50IHdoZW4gbW9kaWZ5aW5nIHRoZSBkYXRhYmFzZSBvbiBwZ2FkbWluNA0KIyBkYkRpc2Nvbm5lY3QoY29ubmVjdGlvbikNCmBgYA0KDQojIyMjIC0gU2V0IHVwIGRhdGFiYXNlDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBlY2hvID0gVFJVRX0NCkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyBoc3RvcmU7DQpDUkVBVEUgRVhURU5TSU9OIElGIE5PVCBFWElTVFMgcG9zdGdpczsNCkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyBwZ3JvdXRpbmc7DQpDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMgZGVzdGluYXRpb25zOw0KQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTIGdlbmVyYXRlZDsNCkNSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyByZWNlaXZlZDsNCmBgYA0KDQojIyMjIC0gRXN0YWJsaXNoIFN0dWR5IEFyZWEgYW5kIG90aGVyIGltcG9ydGFudCB2YXJpYWJsZXMNCg0KTm90IG9ubHkgdGhlIG5hbWUgb2YgdGhlIHN0dWR5IGFyZWEgc2hvdWxkIGJlIGVzdGFibGlzaGVkLCBidXQgYWxzbyB0aGUgbnVtYmVyIG9mIHN1YmRpdmlzaW9ucyBmb3IgdGhlIGdyaWQsIHRoZSBjb29yZGluYXRlIHJlZmVyZW5jZSBzeXN0ZW0gdG8gd29yayB3aXRoLCBhbmQgdGhlIGJpa2luZyBkaXN0YW5jZSB0aGF0IHdpbGwgYmUgYXNzdW1lZCBmb3IgdGhlIGNvbm5lY3Rpdml0eSBhbmFseXNpcy4gDQoNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpzYV9uYW1lID0gIkNhbWJyaWRnZSINCnN1YmRpdmlzaW9ucyA9IDQNCnNhX2NycyA9IDM4NTcNCmJpa2luZ19kaXN0YW5jZSA9IDMwMDAgIyMgaW4gbWV0ZXJzDQpwYXN0ZSgiWW91IGFyZSBydW5uaW5nIHRoZSBCTkEgc2NvcmUgZm9yIiwgc2FfbmFtZSwgIndpdGhpbiBhIGJpa2luZyBkaXN0YW5jZSBvZiIsIGJpa2luZ19kaXN0YW5jZS8xMDAwLCAia20uIikNCmBgYA0KDQojIyMgMi4gT2J0YWluIHN0dWR5IGFyZWEgYm91bmRhcnkgd2l0aCBgb3NtZGF0YWAuDQoNCkV4dHJhY3QgdGhlIHN0dWR5IGFyZWEgYm91bmRhcnkgY29uc2lkZXJpbmcgYSBidWZmZXIgb2YgaGFsZiB0aGUgYmlraW5nIGRpc3RhbmNlIGVzdGFibGlzaGVkLiANCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBpbmNsdWRlID0gVFJVRSwgd2FybmluZyA9IEZBTFNFfQ0KIyBGVU5DVElPTiBUTyBFWFRSQUNUIFNUVURZIEFSRUEgQk9VTkRBUlkgV0lUSCBPU00gQU5EIFdSSVRFIElUIFRPIFRIRSBEQVRBQkFTRQ0Kc2FfYmIgPC0gZnVuY3Rpb24gKHN0dWR5X2FyZWEsIGRpc3QsIGNycywgY29ubil7DQogICMgR0VUIERBVEEgRlJPTSBPU00NCiAgbGlicmFyeShvc21kYXRhKQ0KICBsaWJyYXJ5KHNmKQ0KICBzdHVkeV9hcmVhX2JiIDwtIHN0dWR5X2FyZWEgJT4lIA0KICAgIGdldGJiKGZvcm1hdF9vdXQgPSAic2ZfcG9seWdvbiIpICU+JQ0KICAgIHN0X3RyYW5zZm9ybShjcnMgPSBjcnMpDQogIA0KICAjIyBBREQgQSBCVUZGRVIgVE8gVEhFIEJPVU5EQVJZDQogIHN0dWR5X2FyZWFfYmIgPC1zdHVkeV9hcmVhX2JiICU+JSANCiAgICBzdF9idWZmZXIoZGlzdCA9IDAuNSpkaXN0KQ0KICANCiAgIyBERUxFVEUgRVhJU1RJTkcgQk9VTkRBUlkNCiAgbGlicmFyeShzcWxkZikNCiAgc3FsZGYoDQogICAgIkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IiwNCiAgICBjb25uZWN0aW9uID0gY29ubg0KICApDQoNCiAgIyBVUExPQUQgQk9VTkRBUlkgVE8gUE9TVEdSRVNRTCBEQVRBQkFTRQ0KICBsaWJyYXJ5KFJQb3N0Z3JlU1FMKQ0KICBkYldyaXRlVGFibGUoY29ubiwgYygicmVjZWl2ZWQiLCJzYV9ib3VuZGFyeSIpLCBzdHVkeV9hcmVhX2JiKQ0KICANCiAgc3R1ZHlfYXJlYV9iYg0KfQ0KDQpib3VuZGFyeSA8LSBzYV9iYigNCiAgc3R1ZHlfYXJlYSA9IHNhX25hbWUsIA0KICBkaXN0ID0gYmlraW5nX2Rpc3RhbmNlLA0KICBjcnMgPSBzYV9jcnMsIA0KICBjb25uID0gY29ubmVjdGlvbg0KKQ0KYGBgDQoNCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0PSA4LCBlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFfQ0KbGlicmFyeSh0bWFwKQ0KdG1hcF9tb2RlKCJ2aWV3IikNCnF0bSgNCiAgc2hwID0gYm91bmRhcnksIA0KICBmaWxsID0gTlVMTCwgDQogIGJvcmRlcnMgPSAicmVkIiwgDQogIGJhc2VtYXBzID0gIk9wZW5TdHJlZXRNYXAiDQopDQpgYGANCg0KIyMjIDMuIE9idGFpbiB0aGUgYC5vc21gIGZpbGUgZnJvbSAqKk92ZXJwYXNzIEFQSSoqDQoNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQojIEZVTkNUSU9OIFRPIERPV05MT0FEIE9TTSBEQVRBIFdJVEggVEhFIE9WRVJQQVNTIEFQSSANCnNhX2Rvd25sb2FkIDwtIGZ1bmN0aW9uKGNvbm4pew0KICAjIE9CVEFJTiBUSEUgRVhURU5UIE9GIFRIRSBTVFVEWSBBUkVBIEFTIEEgQk9VTkRJTkcgQk9YDQogIHNhX2V4dGVudCA8LSBkYkdldFF1ZXJ5KGNvbm4sDQogICAgICAgICJTRUxFQ1QNCiAgICAgICAgU1RfRXh0ZW50KChTVF9UcmFuc2Zvcm0oZ2VvbWV0cnksNDMyNikpKQ0KICAgICAgICBGUk9NIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IikgDQogIA0KICBsaWJyYXJ5KHN0cmluZ3IpDQogIHNhX2Nvb3JkIDwtIHRvU3RyaW5nKHNhX2V4dGVudCkgJT4lIA0KICAgIHN0cl9leHRyYWN0X2FsbCgiXFwtKlxcZCtcXC4qXFxkKiIpICU+JSANCiAgICB1bmxpc3QoKSAlPiUgDQogICAgdG9TdHJpbmcoKQ0KICAgIA0KICAjIENPTlNUUlVDVCBUSEUgQVBJIExJTkUgVE8gUkVRVUVTVCBUSEUgREFUQQ0KICBhcGkgPC0gcGFzdGUoDQogICAgJ2h0dHBzOi8vb3ZlcnBhc3MtYXBpLmRlL2FwaS9tYXA/YmJveD0nLA0KICAgIHNhX2Nvb3JkLA0KICAgIHNlcCA9ICcnDQogICkNCiAgDQogICMgQ1JFQVRFIEEgTkVXIFRFTVBPUkFMIERJUkVDVE9SWSBUTyBET1dOTE9BRCBUSEUgSU5GTw0KICBjZCA8LSBnZXR3ZCgpDQogIGlmZWxzZSgNCiAgICAhZmlsZS5leGlzdHMoZmlsZS5wYXRoKGNkLCd0ZW1wJykpLA0KICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKGNkLCd0ZW1wJykpLCANCiAgICAiRGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIg0KICApDQogIA0KICAjIEVTVEFCTElTSCBUSEUgTkFNRSBPRiBUSEUgRklMRSBXSEVSRSBUSEUgT1ZFUlBBU1MgQVBJIFdJTEwgRE9XTkxPQUQgSVRTIERBVEENCiAgb3NtX2ZpbGUgPC0gZmlsZS5wYXRoKGNkLCd0ZW1wJywnb3ZlcnBhc3Mub3NtJykNCiAgDQogICMgUkVRVUVTVCBUSEUgREFUQSBGUk9NIFRIRSBBUEkNCiAgbGlicmFyeSh1dGlscykNCiAgZG93bmxvYWQuZmlsZSh1cmwgPSBhcGksIGRlc3RmaWxlID0gb3NtX2ZpbGUsIGV4dHJhID0gJy1udiAtTycpIA0KICANCiAgaWZlbHNlKA0KICAgIGZpbGUuZXhpc3RzKGZpbGUucGF0aChjZCwndGVtcCcsJ292ZXJwYXNzLm9zbScpKSwNCiAgICAiT01TIGRhdGEgc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQhIiwNCiAgICAiT1NNIGRhdGEgd2FzIG5vdCBkb3dubG9hZGVkLCBwbGVhc2UgdHJ5IGFnYWluIG9yIGRvd25sb2FkIG1hbnVhbGx5LiINCiAgKQ0KICANCn0NCg0KIyBET1dOTE9BRCBUSEUgREFUQSBGUk9NIE9TTSBXSVRIIE9WRVJQQVNTIEFQSQ0Kc2FfZG93bmxvYWQoY29ubiA9IGNvbm5lY3Rpb24pDQpgYGANCg0KIyMjIDQuIExvYWQgZGF0YSBpbnRvIHRoZSBQb3N0Z3JlU1FMIGRhdGFiYXNlLiANCg0KIyMjIyAtIE9idGFpbiBjb25maWd1cmF0aW9uIGZpbGVzDQoNCmBgYHtyLCBjb2xsYXBzZSA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRX0NCiMgQ1JFQVRFIEEgTkVXIFRFTVBPUkFMIERJUkVDVE9SWSBUTyBET1dOTE9BRCBUSEUgSU5GTw0KY2QgPC0gZ2V0d2QoKQ0KaWZlbHNlKA0KICAhZmlsZS5leGlzdHMoZmlsZS5wYXRoKGNkLCd0ZW1wJykpLA0KICBkaXIuY3JlYXRlKGZpbGUucGF0aChjZCwndGVtcCcpKSwgDQogICJEaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMiDQopDQoNCiMgRVNUQUJMSVNIIFRIRSBOQU1FIE9GIFRIRSBGSUxFUyANCnBmYnN0eWxlX2ZpbGUgPC0gZmlsZS5wYXRoKGNkLCd0ZW1wJywncGZiLnN0eWxlJykNCm1hcGNvbmZpZ19maWxlIDwtIGZpbGUucGF0aChjZCwidGVtcCIsIm1hcGNvbmZpZy54bWwiKQ0KbWFwY29uZmlnYmlrZXNfZmlsZSA8LSBmaWxlLnBhdGgoY2QsInRlbXAiLCJtYXBjb25maWdfZm9yX2JpY3ljbGVzLnhtbCIpDQoNCiMgQ0hFQ0sgSUYgVEhFWSBBUkUgRE9XTkxPQURFRA0KaWYoDQogIGZpbGUuZXhpc3RzKGZpbGUucGF0aChwZmJzdHlsZV9maWxlKSkgJiANCiAgZmlsZS5leGlzdHMoZmlsZS5wYXRoKG1hcGNvbmZpZ19maWxlKSkgJg0KICBmaWxlLmV4aXN0cyhmaWxlLnBhdGgobWFwY29uZmlnYmlrZXNfZmlsZSkpDQopew0KICAiRmlsZXMgYXJlIGFscmVhZHkgZG93bmxvYWRlZCEiDQp9IGVsc2Ugew0KICMgRVNUQUJMSVNIIFRIRSBVUkxTDQogIHBmYnN0eWxlX3VybCA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F6YXZlYS9wZmItbmV0d29yay1jb25uZWN0aXZpdHkvZGV2ZWxvcC9zcmMvYW5hbHlzaXMvaW1wb3J0L3BmYi5zdHlsZSINCiAgDQogIG1hcGNvbmZpZ191cmwgPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9wZ1JvdXRpbmcvb3NtMnBncm91dGluZy9tYXN0ZXIvbWFwY29uZmlnLnhtbCINCiAgDQogIG1hcGNvbmZpZ2Jpa2VzX3VybCA8LSANCiAgImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9wZ1JvdXRpbmcvb3NtMnBncm91dGluZy9tYXN0ZXIvbWFwY29uZmlnX2Zvcl9iaWN5Y2xlcy54bWwiDQogIA0KICAjIFJFUVVFU1QgVEhFIERBVEENCiAgbGlicmFyeSh1dGlscykNCiAgZG93bmxvYWQuZmlsZSh1cmwgPSBwZmJzdHlsZV91cmwsIGRlc3RmaWxlID0gcGZic3R5bGVfZmlsZSkNCiAgZG93bmxvYWQuZmlsZSh1cmwgPSBtYXBjb25maWdfdXJsLCBkZXN0ZmlsZSA9IG1hcGNvbmZpZ19maWxlKQ0KICBkb3dubG9hZC5maWxlKHVybCA9IG1hcGNvbmZpZ2Jpa2VzX3VybCwgZGVzdGZpbGUgPSBtYXBjb25maWdiaWtlc19maWxlKSANCn0NCmBgYA0KDQoNCiMjIyMgLSBMb2FkIGRhdGEgd2l0aCBgb3NtMnBnc3FsYCBhbmQgYG9zbTJwZ3JvdXRpbmdgDQoNCioqTk9URToqKiBUbyBydW4gdGhpcyBjb21tYW5kIFtzZXQgcGF0aCB2YXJpYWJsZXNdKGh0dHBzOi8vbGVhcm5vc20ub3JnL2VuL29zbS1kYXRhL29zbTJwZ3NxbC8pIGZvciBgb3NtMnBnc3FsYCBhbmQgYG9zbTJwZ3JvdXRpbmdgIGFuZCBbY3JlYXRlIGEgcGFzc3dvcmQgZmlsZV0oaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy85LjEvbGlicHEtcGdwYXNzLmh0bWwpIG9uICVBUFBEQVRBJS9wb3N0Z3Jlc3FsL3BncGFzcy5jb25mIHdpdGggdGhlIGZvcm1hdCBob3N0bmFtZTpwb3J0OmRhdGFiYXNlOnVzZXJuYW1lOnBhc3N3b3JkLg0KDQpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9DQpzeXN0ZW0oDQogIGNvbW1hbmQgPSAib3NtMnBnc3FsIC1jIC1kIGJuYV9ldXJvcGUgLVUgcG9zdGdyZXMgLUggbG9jYWxob3N0IC1XIC0tY3JlYXRlIC0tcHJlZml4IHNhX2Z1bGwgLVMgRTovR2VvVGVjaC9UaGVzaXMvVGhlc2lzX1JfUHJvamVjdC90ZW1wL3BmYi5zdHlsZSBFOi9HZW9UZWNoL1RoZXNpcy9UaGVzaXNfUl9Qcm9qZWN0L3RlbXAvb3ZlcnBhc3Mub3NtIC0tY2FjaGUgNjAwIiwNCiAgc2hvdy5vdXRwdXQub24uY29uc29sZSA9IFRSVUUNCiAgKQ0KDQpzeXN0ZW0oDQogIGNvbW1hbmQgPSAib3NtMnBncm91dGluZyAtZiBFOi9HZW9UZWNoL1RoZXNpcy9UaGVzaXNfUl9Qcm9qZWN0L3RlbXAvb3ZlcnBhc3Mub3NtIC1oIGxvY2FsaG9zdCAtZCBibmFfZXVyb3BlIC0tdXNlcm5hbWUgcG9zdGdyZXMgLS1zY2hlbWEgcmVjZWl2ZWQgLS1wcmVmaXggc2FfYWxsXyAtLWNvbmYgRTovR2VvVGVjaC9UaGVzaXMvVGhlc2lzX1JfUHJvamVjdC90ZW1wL21hcGNvbmZpZy54bWwgLS1jbGVhbiIsDQogIHNob3cub3V0cHV0Lm9uLmNvbnNvbGUgPSBUUlVFDQopDQoNCnN5c3RlbSgNCiAgY29tbWFuZCA9ICJvc20ycGdyb3V0aW5nIC1mIEU6L0dlb1RlY2gvVGhlc2lzL1RoZXNpc19SX1Byb2plY3QvdGVtcC9vdmVycGFzcy5vc20gLWggbG9jYWxob3N0ICAtZCBibmFfZXVyb3BlIC0tdXNlcm5hbWUgcG9zdGdyZXMgLS1zY2hlbWEgcmVjZWl2ZWQgLS1wcmVmaXggc2FfYmlrZV8gLS1jb25mIEU6L0dlb1RlY2gvVGhlc2lzL1RoZXNpc19SX1Byb2plY3QvdGVtcC9tYXBjb25maWdfZm9yX2JpY3ljbGVzLnhtbCAtLWNsZWFuIiwNCiAgc2hvdy5vdXRwdXQub24uY29uc29sZSA9IFRSVUUNCikNCmBgYA0KDQpSZXBsYWNlIHZhcmlhYmxlcyBiZXR3ZWVuIGAlYDoNCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gRkFMU0UsIGluY2x1ZGUgPSBUUlVFLCB3YXJuaW5nID0gRkFMU0V9DQpzeXN0ZW0oDQogIGNvbW1hbmQgPSAib3NtMnBnc3FsIC1jIC1kICVEQk5BTUUlIC1VICVVU0VSTkFNRSUgLUggJUhPU1ROQU1FJSAtVyAtLWNyZWF0ZSAtLXByZWZpeCBzYV9mdWxsIC1TICVDVVJSRU5URElSRUNUT1JZL3RlbXAvcGZiLnN0eWxlJSAlQ1VSUkVOVERJUkVDVE9SWS90ZW1wL292ZXJwYXNzLm9zbSUgLS1jYWNoZSA2MDAiLA0KICBzaG93Lm91dHB1dC5vbi5jb25zb2xlID0gVFJVRQ0KICApDQoNCnN5c3RlbSgNCiAgY29tbWFuZCA9ICJvc20ycGdyb3V0aW5nIC1mICVDVVJSRU5URElSRUNUT1JZL3RlbXAvb3ZlcnBhc3Mub3NtJSAtaCAlSE9TVE5BTUUlIC0tcGFzc3dvcmQgJURCUEFTU1dPUkQlIC1kICVEQk5BTUUlIC0tdXNlcm5hbWUgJVVTRVJOQU1FJSAtLXNjaGVtYSByZWNlaXZlZCAtLXByZWZpeCBzYV9hbGxfIC0tY29uZiAlQ1VSUkVOVERJUkVDVE9SWS90ZW1wL21hcGNvbmZpZy54bWwlIC0tY2xlYW4iLA0KICBzaG93Lm91dHB1dC5vbi5jb25zb2xlID0gVFJVRQ0KKQ0KDQpzeXN0ZW0oDQogIGNvbW1hbmQgPSAib3NtMnBncm91dGluZyAtZiAlQ1VSUkVOVERJUkVDVE9SWS90ZW1wL292ZXJwYXNzLm9zbSUgLWggJUhPU1ROQU1FJSAtLXBhc3N3b3JkICVEQlBBU1NXT1JEJSAtZCAlREJOQU1FJSAtLXVzZXJuYW1lICVVU0VSTkFNRSUgLS1zY2hlbWEgcmVjZWl2ZWQgLS1wcmVmaXggc2FfYmlrZV8gLS1jb25mICVDVVJSRU5URElSRUNUT1JZL3RlbXAvbWFwY29uZmlnX2Zvcl9iaWN5Y2xlcy54bWwlIC0tY2xlYW4iLA0KICBzaG93Lm91dHB1dC5vbi5jb25zb2xlID0gVFJVRQ0KKQ0KYGBgDQoNCiMjIyA1LiBPcmdhbml6ZSBhbmQgcHJlcGFyZSB0aGUgZGF0YWJhc2UgDQoNCk9uIHRoaXMgc3RlcCwgc2V2ZXJhbCBTUUwgcXVlcmllcyBhcmUgYmVpbmcgcnVuIHRvIG9yZ2FuaXplIHRoZSB0YWJsZXMsIGNsaXAgdGhlbSB0byB0aGUgc3R1ZHkgYXJlYSBvdXRsaW5lLCBtZXJnZSBpdCB3aXRoIHRoZSAqb3NtMnBnc3FsKiBkYXRhIGFtb25nIG90aGVyIHRoaW5ncy4gVGhlIHNjcmlwdHMgaW5jbHVkZSBtYWlubHkgdGhlIGNvZGUgdGhhdCBQZkIgYWxyZWFkeSB1c2VzLCBidXQgd2l0aCBzb21lIG1vZGlmaWNhdGlvbnMgbGlrZSBjaGFuZ2luZyBmZWV0IHRvIG1ldGVycywgbXBoIHRvIGttL2gsIGFuZCBvdGhlcnMuIEJhc2ljYWxseSwgNCBzdGVwcyBhcmUgdGFrZW46DQoNCiMjIyMgLSBPcmdhbml6ZSB0YWJsZXMNCg0KV2hpY2ggZHJvcHMgdW51c2VkIGNvbHVtbnMgYW5kIHByb2plY3RzIGRhdGEgdG8gdGhlIGFscmVhZHkgZXN0YWJsaXNoZWQgQ1JTLiBJdCBhbHNvIGNsZWFucyB0aGUgZGF0YWJhc2UgZm9yIGEgbmV3IGFuYWx5c2lzIHRvIGJlIHJ1biBpZiB0aGUgc3R1ZHkgYXJlYSBpcyBjaGFuZ2VkIGZvciBleGFtcGxlLiANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQotLSBPUkdBTklaRSBORVdMWSBDUkVBVEVEIFRBQkxFUw0KDQotLSBkZWxldGUgZXhpc3RpbmcgdGFibGVzDQoNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Z1bGxfbGluZTsNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQ7DQpEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb247DQpEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9mdWxsX3JvYWRzOw0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5czsNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXNfaW50Ow0KDQotLSBtb3ZlIHRhYmxlcyB0byByZWNlaXZlZCBzY2hlbWENCkFMVEVSIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuc2FfZnVsbF9saW5lIFNFVCBTQ0hFTUEgcmVjZWl2ZWQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcHVibGljLnNhX2Z1bGxfcG9pbnQgU0VUIFNDSEVNQSByZWNlaXZlZDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuc2FfZnVsbF9wb2x5Z29uIFNFVCBTQ0hFTUEgcmVjZWl2ZWQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcHVibGljLnNhX2Z1bGxfcm9hZHMgU0VUIFNDSEVNQSByZWNlaXZlZDsNCg0KLS0gZHJvcCB1bnVzZWQgdGFibGVzDQpEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfcG9pbnRzb2ZpbnRlcmVzdDsNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Jpa2VfcG9pbnRzb2ZpbnRlcmVzdDsNCg0KLS0gZHJvcCB1bnVzZWQgY29sdW1ucw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyB0YWdfaWQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGxlbmd0aDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgbGVuZ3RoX207DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHgxOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyB5MTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgeDI7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHkyOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyBjb3N0Ow0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyByZXZlcnNlX2Nvc3Q7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNvc3RfczsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgcmV2ZXJzZV9jb3N0X3M7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHJ1bGU7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIG1heHNwZWVkX2ZvcndhcmQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIG1heHNwZWVkX2JhY2t3YXJkOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyBzb3VyY2Vfb3NtOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyB0YXJnZXRfb3NtOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyBwcmlvcml0eTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgb25lX3dheTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgb25ld2F5Ow0KDQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXNfdmVydGljZXNfcGdyIERST1AgQ09MVU1OIElGIEVYSVNUUyBjbnQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXNfdmVydGljZXNfcGdyIERST1AgQ09MVU1OIElGIEVYSVNUUyBjaGs7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXNfdmVydGljZXNfcGdyIERST1AgQ09MVU1OIElGIEVYSVNUUyBlaW47DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXNfdmVydGljZXNfcGdyIERST1AgQ09MVU1OIElGIEVYSVNUUyBlb3V0Ow0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzX3ZlcnRpY2VzX3BnciBEUk9QIENPTFVNTiBJRiBFWElTVFMgbG9uOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzX3ZlcnRpY2VzX3BnciBEUk9QIENPTFVNTiBJRiBFWElTVFMgbGF0Ow0KDQotLSBjaGFuZ2UgY29sdW1uIG5hbWVzDQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgUkVOQU1FIENPTFVNTiBnaWQgVE8gcm9hZF9pZDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBSRU5BTUUgQ09MVU1OIHRoZV9nZW9tIFRPIGdlb207DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgUkVOQU1FIENPTFVNTiBzb3VyY2UgVE8gaW50ZXJzZWN0aW9uX2Zyb207DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgUkVOQU1FIENPTFVNTiB0YXJnZXQgVE8gaW50ZXJzZWN0aW9uX3RvOw0KDQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXNfdmVydGljZXNfcGdyIFJFTkFNRSBDT0xVTU4gaWQgVE8gaW50X2lkOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzX3ZlcnRpY2VzX3BnciBSRU5BTUUgQ09MVU1OIHRoZV9nZW9tIFRPIGdlb207DQoNCi0tIGNoYW5nZSBuYW1lcyBvZiB0YWJsZXMNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBSRU5BTUUgVE8gc2Ffd2F5czsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5c192ZXJ0aWNlc19wZ3IgUkVOQU1FIFRPICBzYV93YXlzX2ludDsNCg0KLS0gY3JlYXRlIG5ldyBjb2x1bW5zDQoNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBmdW5jdGlvbmFsX2NsYXNzIFRFWFQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgcGF0aF9pZCBJTlRFR0VSOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHNwZWVkX2xpbWl0IElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBvbmVfd2F5X2NhciBWQVJDSEFSKDIpOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIG9uZV93YXkgVkFSQ0hBUigyKTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyB3aWR0aCBJTlQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgZnRfYmlrZV9pbmZyYSBURVhUOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGZ0X2Jpa2VfaW5mcmFfd2lkdGggRkxPQVQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgdGZfYmlrZV9pbmZyYSBURVhUOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHRmX2Jpa2VfaW5mcmFfd2lkdGggRkxPQVQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgZnRfbGFuZXMgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHRmX2xhbmVzIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBmdF9jcm9zc19sYW5lcyBJTlQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgdGZfY3Jvc3NfbGFuZXMgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHR3bHRsX2Nyb3NzX2xhbmVzIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBmdF9wYXJrIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyB0Zl9wYXJrIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBmdF9zZWdfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBmdF9pbnRfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyB0Zl9zZWdfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyB0Zl9pbnRfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyB4d2FsayBJTlQ7DQoNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzX2ludCBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgbGVncyBJTlQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHNpZ25hbGl6ZWQgQk9PTEVBTjsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzX2ludCBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgc3RvcHMgQk9PTEVBTjsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzX2ludCBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgcnJmYiBCT09MRUFOOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXNfaW50IEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBpc2xhbmQgQk9PTEVBTjsNCg0KLS0gaW5kZXhlcw0KRFJPUCBJTkRFWCBJRiBFWElTVFMgcmVjZWl2ZWQuaWR4X3NhX3dheXNfb3NtOw0KRFJPUCBJTkRFWCBJRiBFWElTVFMgcmVjZWl2ZWQuaWR4X3NhX3dheXNfaW50X29zbTsNCkRST1AgSU5ERVggSUYgRVhJU1RTIHJlY2VpdmVkLmlkeF9zYV9hbGxfZnVsbHdheXM7DQpEUk9QIElOREVYIElGIEVYSVNUUyByZWNlaXZlZC5pZHhfc2FfYWxsX2Z1bGxwb2ludHM7DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfb3NtIE9OIHJlY2VpdmVkLnNhX3dheXMgKG9zbV9pZCk7DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfaW50X29zbSBPTiByZWNlaXZlZC5zYV93YXlzX2ludCAob3NtX2lkKTsNCkNSRUFURSBJTkRFWCBpZHhfc2FfYWxsX2Z1bGx3YXlzIE9OIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSAob3NtX2lkKTsNCkNSRUFURSBJTkRFWCBpZHhfc2FfYWxsX2Z1bGxwb2ludHMgT04gcmVjZWl2ZWQuc2FfZnVsbF9wb2ludCAob3NtX2lkKTsNCg0KQU5BTFlaRSByZWNlaXZlZC5zYV93YXlzIChvc21faWQsZ2VvbSk7DQpBTkFMWVpFIHJlY2VpdmVkLnNhX2Jpa2Vfd2F5cyAodGhlX2dlb20pOw0KQU5BTFlaRSByZWNlaXZlZC5zYV93YXlzX2ludCAob3NtX2lkKTsNCkFOQUxZWkUgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIChvc21faWQpOw0KQU5BTFlaRSByZWNlaXZlZC5zYV9mdWxsX3BvaW50IChvc21faWQpOw0KDQotLSBhZGQgaW4gY3ljbGV3YXkgZGF0YSB0aGF0IGlzIG1pc3NpbmcgZnJvbSBmaXJzdCBvc20ycGdyb3V0aW5nIGNhbGwNCklOU0VSVCBJTlRPIHJlY2VpdmVkLnNhX3dheXMgKA0KICAgIG5hbWUsIGludGVyc2VjdGlvbl9mcm9tLCBpbnRlcnNlY3Rpb25fdG8sIG9zbV9pZCwgZ2VvbQ0KKQ0KU0VMRUNUICBuYW1lLA0KICAgICAgICAoU0VMRUNUICAgICBpLmludF9pZA0KICAgICAgICBGUk9NICAgICAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpDQogICAgICAgIFdIRVJFICAgICAgIGkuZ2VvbSA8Iz4gcmVjZWl2ZWQuc2FfYmlrZV93YXlzLnRoZV9nZW9tIDwgMjANCiAgICAgICAgT1JERVIgQlkgICAgU1RfRGlzdGFuY2UoU1RfU3RhcnRQb2ludChyZWNlaXZlZC5zYV9iaWtlX3dheXMudGhlX2dlb20pLGkuZ2VvbSkgQVNDDQogICAgICAgIExJTUlUICAgICAgIDEpLA0KICAgICAgICAoU0VMRUNUICAgICBpLmludF9pZA0KICAgICAgICBGUk9NICAgICAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpDQogICAgICAgIFdIRVJFICAgICAgIGkuZ2VvbSA8Iz4gcmVjZWl2ZWQuc2FfYmlrZV93YXlzLnRoZV9nZW9tIDwgMjANCiAgICAgICAgT1JERVIgQlkgICAgU1RfRGlzdGFuY2UoU1RfRW5kUG9pbnQocmVjZWl2ZWQuc2FfYmlrZV93YXlzLnRoZV9nZW9tKSxpLmdlb20pIEFTQw0KICAgICAgICBMSU1JVCAgICAgICAxKSwNCiAgICAgICAgb3NtX2lkLA0KICAgICAgICB0aGVfZ2VvbQ0KRlJPTSAgICByZWNlaXZlZC5zYV9iaWtlX3dheXMNCldIRVJFICAgTk9UIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3Mg0KICAgICAgICAgICAgV0hFUkUgICB3Mi5vc21faWQgPSByZWNlaXZlZC5zYV9iaWtlX3dheXMub3NtX2lkDQopOw0KDQpEUk9QIElOREVYIElGIEVYSVNUUyByZWNlaXZlZC5pZHhfc2Ffd2F5c19pbnRzX3N0b3A7DQpEUk9QIElOREVYIElGIEVYSVNUUyByZWNlaXZlZC5pZHhfc2Ffd2F5c19ycmZiOw0KRFJPUCBJTkRFWCBJRiBFWElTVFMgcmVjZWl2ZWQuaWR4X3NhX3dheXNfaXNsYW5kOw0KQ1JFQVRFIElOREVYIGlkeF9zYV93YXlzX2ludHNfc3RvcCBPTiByZWNlaXZlZC5zYV93YXlzX2ludCAoc2lnbmFsaXplZCxzdG9wcyk7DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfcnJmYiBPTiByZWNlaXZlZC5zYV93YXlzX2ludCAocnJmYik7DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfaXNsYW5kIE9OIHJlY2VpdmVkLnNhX3dheXNfaW50IChpc2xhbmQpOw0KDQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBTFRFUiBDT0xVTU4gZ2VvbSBUWVBFIGdlb21ldHJ5KGxpbmVzdHJpbmcsP3NhX2NycykNClVTSU5HIFNUX1RyYW5zZm9ybShnZW9tLD9zYV9jcnMpOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Jpa2Vfd2F5cyBBTFRFUiBDT0xVTU4gdGhlX2dlb20gVFlQRSBnZW9tZXRyeShsaW5lc3RyaW5nLD9zYV9jcnMpDQpVU0lORyBTVF9UcmFuc2Zvcm0odGhlX2dlb20sP3NhX2Nycyk7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgQUxURVIgQ09MVU1OIGdlb20gVFlQRSBnZW9tZXRyeShwb2ludCw/c2FfY3JzKQ0KVVNJTkcgU1RfVHJhbnNmb3JtKGdlb20sP3NhX2Nycyk7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIEFMVEVSIENPTFVNTiB3YXkgVFlQRSBnZW9tZXRyeShsaW5lc3RyaW5nLD9zYV9jcnMpDQpVU0lORyBTVF9UcmFuc2Zvcm0od2F5LD9zYV9jcnMpOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQgQUxURVIgQ09MVU1OIHdheSBUWVBFIGdlb21ldHJ5KHBvaW50LD9zYV9jcnMpDQpVU0lORyBTVF9UcmFuc2Zvcm0od2F5LD9zYV9jcnMpOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbiBBTFRFUiBDT0xVTU4gd2F5IFRZUEUgZ2VvbWV0cnkocG9seWdvbiw/c2FfY3JzKQ0KVVNJTkcgU1RfVHJhbnNmb3JtKHdheSw/c2FfY3JzKTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9mdWxsX3JvYWRzIEFMVEVSIENPTFVNTiB3YXkgVFlQRSBnZW9tZXRyeShsaW5lc3RyaW5nLD9zYV9jcnMpDQpVU0lORyBTVF9UcmFuc2Zvcm0od2F5LD9zYV9jcnMpOw0KDQpTRUxFQ1QgKiBGUk9NIHJlY2VpdmVkLnNhX2Z1bGxfcm9hZHM7DQoNCmBgYA0KDQojIyMjIC0gQ2xpcCBkYXRhIGludG8gYm91bmRhcnkNCg0KV2hpY2ggY2xpcHMgdGhlIGRhdGEgaW50byB0aGUgYm91bmRhcnkgb2YgdGhlIHN0dWR5IGFyZWEgc2VsZWN0ZWQuDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCg0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgRFJPUCBDT05TVFJBSU5UIElGIEVYSVNUUyBzYV9hbGxfd2F5c19zb3VyY2VfZmtleSBDQVNDQURFOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgRFJPUCBDT05TVFJBSU5UIElGIEVYSVNUUyBzYV9hbGxfd2F5c190YXJnZXRfZmtleSBDQVNDQURFOw0KDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV93YXlzX2ludCBBUyBpbnRlcnNlY3Rpb25zDQogICAgVVNJTkcgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYm91bmRhcnkNCiAgICBXSEVSRSBOT1QgU1RfRFdpdGhpbihpbnRlcnNlY3Rpb25zLmdlb20sIGJvdW5kYXJ5Lmdlb21ldHJ5LCAxMDAwKTsNCg0KREVMRVRFIEZST00gcmVjZWl2ZWQuc2Ffd2F5cyBBUyB3YXlzDQogICAgVVNJTkcgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYm91bmRhcnkNCiAgICBXSEVSRSBOT1QgU1RfRFdpdGhpbih3YXlzLmdlb20sIGJvdW5kYXJ5Lmdlb21ldHJ5LCAxMDAwKTsNCg0KREVMRVRFIEZST00gcmVjZWl2ZWQuc2FfZnVsbF9saW5lIEFTIGxpbmVzDQogICAgVVNJTkcgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYm91bmRhcnkNCiAgICBXSEVSRSBOT1QgU1RfRFdpdGhpbihsaW5lcy53YXksIGJvdW5kYXJ5Lmdlb21ldHJ5LCAxMDAwKTsNCg0KREVMRVRFIEZST00gcmVjZWl2ZWQuc2FfZnVsbF9wb2ludCBBUyBwb2ludHMNCiAgICBVU0lORyByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBib3VuZGFyeQ0KICAgIFdIRVJFIE5PVCBTVF9EV2l0aGluKHBvaW50cy53YXksIGJvdW5kYXJ5Lmdlb21ldHJ5LCAxMDAwKTsNCg0KREVMRVRFIEZST00gcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uIEFTIHBvbHlnb25zDQogICAgVVNJTkcgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYm91bmRhcnkNCiAgICBXSEVSRSBOT1QgU1RfRFdpdGhpbihwb2x5Z29ucy53YXksIGJvdW5kYXJ5Lmdlb21ldHJ5LCAxMDAwKTsNCg0KREVMRVRFIEZST00gcmVjZWl2ZWQuc2FfZnVsbF9yb2FkcyBBUyByb2Fkcw0KICAgIFVTSU5HIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGJvdW5kYXJ5DQogICAgV0hFUkUgTk9UIFNUX0RXaXRoaW4ocm9hZHMud2F5LCBib3VuZGFyeS5nZW9tZXRyeSwgMTAwMCk7DQogICAgDQpTRUxFQ1QgKiBGUk9NIHJlY2VpdmVkLnNhX2Z1bGxfcm9hZHM7DQpgYGANCg0KIyMjIyAtIFBvcHVsYXRlIHdheSB0YWJsZQ0KDQpXaGljaCBkb2VzIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGZvbGxvd2luZyBjb2x1bW5zIG9uIHRoZSB3YXlzIHRhYmxlOg0KDQojIyMjIyA+IG9uZSB3YXkNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgb25lX3dheV9jYXIgPSBOVUxMOw0KDQotLSBmdCBkaXJlY3Rpb24NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBvbmVfd2F5X2NhciA9ICdmdCcNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgdHJpbShvc20ub25ld2F5KSBJTiAoJzEnLCd5ZXMnKTsNCg0KLS0gdGYgZGlyZWN0aW9uDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgb25lX3dheV9jYXIgPSAndGYnDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIHRyaW0ob3NtLm9uZXdheSkgPSAnLTEnOw0KDQpgYGANCg0KIyMjIyMgPiB3aWR0aA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIHdpZHRoID0gTlVMTDsNCg0KLS0gZmVldA0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHdpZHRoID0gc3Vic3RyaW5nKG9zbS53aWR0aCBmcm9tICdcZCtcLj9cZD9cZD8nKTo6RkxPQVQvMy4yODA4NA0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20ud2lkdGggSVMgTk9UIE5VTEwNCkFORCAgICAgb3NtLndpZHRoIExJS0UgJyUgZnQnOw0KDQotLSBtZXRlcnMNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICB3aWR0aCA9IHN1YnN0cmluZyhvc20ud2lkdGggZnJvbSAnXGQrXC4/XGQ/XGQ/Jyk6OkZMT0FUDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS53aWR0aCBJUyBOT1QgTlVMTA0KQU5EICAgICBvc20ud2lkdGggTElLRSAnJSBtJzsNCg0KLS0gbm8gdW5pdHMgKGRlZmF1bHQ9bWV0ZXJzKQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHdpZHRoID0gc3Vic3RyaW5nKG9zbS53aWR0aCBmcm9tICdcZCtcLj9cZD9cZD8nKTo6RkxPQVQNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLndpZHRoIElTIE5PVCBOVUxMDQpBTkQgICAgIHN1YnN0cmluZyhvc20ud2lkdGggZnJvbSAnXGQrXC4/XGQ/XGQ/Jyk6OkZMT0FUIDwgMjA7DQoNCi0tIFRoaW5ncyBjaGFuZ2VkOiBJJ2QgcmF0aGVyIGhhdmUgd2lkdGggaW4gbWV0ZXJzLCBzbyBJIGNoYW5nZWQgYWxsIHRoZSBjb252ZXJzaW9uIGZhY3RvcnMuDQpgYGANCg0KIyMjIyMgPiBmdW5jdGlvbmFsIGNsYXNzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnVuY3Rpb25hbF9jbGFzcyA9IE5VTEw7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdW5jdGlvbmFsX2NsYXNzID0gb3NtLmhpZ2h3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLmhpZ2h3YXkgSU4gKA0KICAgICAgICAgICAgJ21vdG9yd2F5JywNCiAgICAgICAgICAgICd0ZXJ0aWFyeScsDQogICAgICAgICAgICAndHJ1bmsnLA0KICAgICAgICAgICAgJ3RlcnRpYXJ5X2xpbmsnLA0KICAgICAgICAgICAgJ21vdG9yd2F5X2xpbmsnLA0KICAgICAgICAgICAgJ3NlY29uZGFyeV9saW5rJywNCiAgICAgICAgICAgICdwcmltYXJ5X2xpbmsnLA0KICAgICAgICAgICAgJ3RydW5rX2xpbmsnLA0KICAgICAgICAgICAgJ3VuY2xhc3NpZmllZCcsDQogICAgICAgICAgICAncmVzaWRlbnRpYWwnLA0KICAgICAgICAgICAgJ3NlY29uZGFyeScsDQogICAgICAgICAgICAncHJpbWFyeScsDQogICAgICAgICAgICAnbGl2aW5nX3N0cmVldCcNCik7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3RyYWNrJw0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20uaGlnaHdheSA9ICd0cmFjaycNCkFORCAgICAgb3NtLnRyYWNrdHlwZSA9ICdncmFkZTEnOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdwYXRoJw0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20uaGlnaHdheSBJTiAoJ2N5Y2xld2F5JywncGF0aCcpOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdwYXRoJywNCiAgICAgICAgeHdhbGsgPSAxDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS5oaWdod2F5ID0gJ2Zvb3R3YXknDQpBTkQgICAgIG9zbS5mb290d2F5ID0gJ2Nyb3NzaW5nJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAncGF0aCcNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLmhpZ2h3YXkgPSAnZm9vdHdheScNCkFORCAgICAgb3NtLmJpY3ljbGUgPSAnZGVzaWduYXRlZCcNCkFORCAgICAgKG9zbS5hY2Nlc3MgSVMgTlVMTCBPUiBvc20uYWNjZXNzIE5PVCBJTiAoJ25vJywncHJpdmF0ZScpKQ0KQU5EICAgICBDT0FMRVNDRShyZWNlaXZlZC5zYV93YXlzLndpZHRoLDApID49IDg7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3BhdGgnDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS5oaWdod2F5PSdzZXJ2aWNlJw0KQU5EICAgICBvc20uYmljeWNsZT0nZGVzaWduYXRlZCc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdW5jdGlvbmFsX2NsYXNzID0gJ2xpdmluZ19zdHJlZXQnDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS5oaWdod2F5ID0gJ3BlZGVzdHJpYW4nDQpBTkQgICAgIG9zbS5iaWN5Y2xlIElOICgneWVzJywncGVybWlzc2l2ZScsICdkZXNpZ25hdGVkJykNCkFORCAgICAgKG9zbS5hY2Nlc3MgSVMgTlVMTCBPUiBvc20uYWNjZXNzIE5PVCBJTiAoJ25vJywncHJpdmF0ZScpKTsNCg0KLS0gcmVtb3ZlIHN0dWZmIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byByb3V0ZSBvdmVyDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV93YXlzIFdIRVJFIGZ1bmN0aW9uYWxfY2xhc3MgSVMgTlVMTDsNCg0KLS0gcmVtb3ZlIG9ycGhhbnMNCkRFTEVURSBGUk9NIHJlY2VpdmVkLnNhX3dheXMNCldIRVJFICAgTk9UIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3DQogICAgICAgICAgICBXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX3RvIElOICh3LmludGVyc2VjdGlvbl90byx3LmludGVyc2VjdGlvbl9mcm9tKQ0KICAgICAgICAgICAgQU5EICAgICB3LnJvYWRfaWQgIT0gcmVjZWl2ZWQuc2Ffd2F5cy5yb2FkX2lkDQopDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgdw0KICAgICAgICAgICAgV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLmludGVyc2VjdGlvbl9mcm9tIElOICh3LmludGVyc2VjdGlvbl90byx3LmludGVyc2VjdGlvbl9mcm9tKQ0KICAgICAgICAgICAgQU5EICAgICB3LnJvYWRfaWQgIT0gcmVjZWl2ZWQuc2Ffd2F5cy5yb2FkX2lkDQopOw0KDQotLSByZW1vdmUgb2Jzb2xldGUgaW50ZXJzZWN0aW9ucw0KREVMRVRFIEZST00gcmVjZWl2ZWQuc2Ffd2F5c19pbnQNCldIRVJFIE5PVCBFWElTVFMgKA0KICAgIFNFTEVDVCAgMQ0KICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3DQogICAgV0hFUkUgICBpbnRfaWQgSU4gKHcuaW50ZXJzZWN0aW9uX3RvLHcuaW50ZXJzZWN0aW9uX2Zyb20pDQopOw0KDQpgYGANCg0KIyMjIyMgPiBwYXRocw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQoNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGdlbmVyYXRlZC5zYV9wYXRoczsNCkRST1AgSU5ERVggSUYgRVhJU1RTIHJlY2VpdmVkLmlkeF9zYV93YXlzX3BhdGhfaWQ7DQoNCkNSRUFURSBUQUJMRSBnZW5lcmF0ZWQuc2FfcGF0aHMgKA0KICAgIHBhdGhfaWQgU0VSSUFMIFBSSU1BUlkgS0VZLA0KICAgIGdlb20gZ2VvbWV0cnkobXVsdGlsaW5lc3RyaW5nLCA/c2FfY3JzKSwNCiAgICByb2FkX2lkcyBJTlRFR0VSW10sDQogICAgcGF0aF9sZW5ndGggSU5URUdFUiwNCiAgICBiYm94X2xlbmd0aCBJTlRFR0VSDQopOw0KDQotLSBjb21iaW5lIGNvbnRpZ3VvdXMgcGF0aHMNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9wYXRocyAoZ2VvbSkNClNFTEVDVCAgU1RfQ29sbGVjdGlvbkV4dHJhY3QoDQogICAgICAgICAgICBTVF9TZXRTUklEKA0KICAgICAgICAgICAgICAgIHVubmVzdChTVF9DbHVzdGVySW50ZXJzZWN0aW5nKGdlb20pKSwNCiAgICAgICAgICAgICAgICA/c2FfY3JzDQogICAgICAgICAgICApLA0KICAgICAgICAgICAgMiAgIC0tbGluZXN0cmluZ3MNCiAgICAgICAgKQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAncGF0aCc7DQoNCi0tIGdldCByYXcgbGVuZ3Rocw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcGF0aHMNClNFVCAgICAgcGF0aF9sZW5ndGggPSBTVF9MZW5ndGgoZ2VvbSk7DQoNCi0tIGdldCBib3VuZGluZyBib3ggbGVuZ3Rocw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcGF0aHMNClNFVCAgICAgYmJveF9sZW5ndGggPSBTVF9MZW5ndGgoDQogICAgICAgICAgICBTVF9TZXRTUklEKA0KICAgICAgICAgICAgICAgIFNUX01ha2VMaW5lKA0KICAgICAgICAgICAgICAgICAgICBTVF9NYWtlUG9pbnQoU1RfWE1pbihnZW9tKSwgU1RfWU1pbihnZW9tKSksDQogICAgICAgICAgICAgICAgICAgIFNUX01ha2VQb2ludChTVF9YTWF4KGdlb20pLCBTVF9ZTWF4KGdlb20pKQ0KICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgP3NhX2Nycw0KICAgICAgICAgICAgKQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfcGF0aHNfZ2VvbSBPTiBnZW5lcmF0ZWQuc2FfcGF0aHMgVVNJTkcgR0lTVCAoZ2VvbSk7DQpBTkFMWVpFIGdlbmVyYXRlZC5zYV9wYXRocyAoZ2VvbSk7DQoNCi0tIHNldCBwYXRoX2lkIG9uIGVhY2ggcm9hZCBzZWdtZW50IChpZiBwYXRoKQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHBhdGhfaWQgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIHBhdGhzLnBhdGhfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BhdGhzIHBhdGhzDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMocmVjZWl2ZWQuc2Ffd2F5cy5nZW9tLHBhdGhzLmdlb20pDQogICAgICAgICAgICBBTkQgICAgIFNUX0NvdmVyZWRCeShyZWNlaXZlZC5zYV93YXlzLmdlb20scGF0aHMuZ2VvbSkNCiAgICAgICAgICAgIExJTUlUICAgMQ0KICAgICAgICApDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAncGF0aCc7DQoNCi0tIGdldCBzdHJhZ2dsZXJzDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgcGF0aF9pZCA9IHBhdGhzLnBhdGhfaWQNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BhdGhzIHBhdGhzDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMuZnVuY3Rpb25hbF9jbGFzcyA9ICdwYXRoJw0KQU5EICAgICByZWNlaXZlZC5zYV93YXlzLnBhdGhfaWQgSVMgTlVMTA0KQU5EICAgICBTVF9JbnRlcnNlY3RzKHJlY2VpdmVkLnNhX3dheXMuZ2VvbSxwYXRocy5nZW9tKQ0KQU5EICAgICBTVF9Db3ZlcmVkQnkocmVjZWl2ZWQuc2Ffd2F5cy5nZW9tLFNUX0J1ZmZlcihwYXRocy5nZW9tLDEpKTsNCg0KLS0gc2V0IGluZGV4DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfcGF0aF9pZCBPTiByZWNlaXZlZC5zYV93YXlzIChwYXRoX2lkKTsNCkFOQUxZWkUgcmVjZWl2ZWQuc2Ffd2F5cyAocGF0aF9pZCk7DQoNCi0tIHNldCByb2FkX2lkcw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcGF0aHMNClNFVCAgICAgcm9hZF9pZHMgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIHJvYWRfaWQNCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cw0KICAgICAgICAgICAgV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLnBhdGhfaWQgPSBnZW5lcmF0ZWQuc2FfcGF0aHMucGF0aF9pZA0KICAgICAgICApKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBhaWR4X3NhX3BhdGhzX3JvYWRfaWRzIE9OIGdlbmVyYXRlZC5zYV9wYXRocyBVU0lORyBHSU4gKHJvYWRfaWRzKTsNCkFOQUxZWkUgZ2VuZXJhdGVkLnNhX3BhdGhzIChyb2FkX2lkcyk7DQoNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BhdGhzOw0KYGBgDQoNCiMjIyMjID4gc3BlZWQgbGltaXQNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBzcGVlZF9saW1pdCA9IE5VTEw7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBzcGVlZF9saW1pdCA9IHN1YnN0cmluZyhvc20ubWF4c3BlZWQgZnJvbSAnXGQrJyk6OklOVA0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZDsNCg0KLS0gVGhpbmdzIGNoYW5nZWQ6cmVtb3ZlZCBsYXN0IGxpbmUgd2hlcmUgdGhleSBwcm9tcHRlZCBmb3Igc3BlZWRzIGluIG1waC4NCmBgYA0KDQojIyMjIyA+IGxhbmVzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfbGFuZXMgPSBOVUxMLCB0Zl9sYW5lcyA9IE5VTEwsIGZ0X2Nyb3NzX2xhbmVzID0gTlVMTCwgdGZfY3Jvc3NfbGFuZXMgPSBOVUxMOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfbGFuZXMgPQ0KICAgICAgICAgICAgQ0FTRSAgICBXSEVOIG9zbS4idHVybjpsYW5lczpmb3J3YXJkIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBhcnJheV9sZW5ndGgoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfc3BsaXRfdG9fYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NtLiJ0dXJuOmxhbmVzOmZvcndhcmQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXHwnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAtLSBvbmx5IG9uZSBkaW1lbnNpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4idHVybjpsYW5lcyIgSVMgTk9UIE5VTEwgQU5EIHJlY2VpdmVkLnNhX3dheXMub25lX3dheV9jYXIgPSAnZnQnDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGFycmF5X2xlbmd0aCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9zcGxpdF90b19hcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc20uInR1cm46bGFuZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXHwnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAtLSBvbmx5IG9uZSBkaW1lbnNpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4ibGFuZXM6Zm9yd2FyZCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgc3Vic3RyaW5nKG9zbS4ibGFuZXM6Zm9yd2FyZCIgRlJPTSAnXFxkKycpOjpJTlQNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImxhbmVzIiBJUyBOT1QgTlVMTCBBTkQgcmVjZWl2ZWQuc2Ffd2F5cy5vbmVfd2F5X2NhciA9ICdmdCcNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgc3Vic3RyaW5nKG9zbS4ibGFuZXMiIEZST00gJ1xcZCsnKTo6SU5UDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lcyIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgY2VpbChzdWJzdHJpbmcob3NtLiJsYW5lcyIgRlJPTSAnXFxkKycpOjpGTE9BVCAvIDIpDQogICAgICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgdGZfbGFuZXMgPQ0KICAgICAgICAgICAgICAgICAgICBDQVNFICAgIFdIRU4gb3NtLiJ0dXJuOmxhbmVzOmJhY2t3YXJkIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGFycmF5X2xlbmd0aCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwX3NwbGl0X3RvX2FycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NtLiJ0dXJuOmxhbmVzOmJhY2t3YXJkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXHwnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgLS0gb25seSBvbmUgZGltZW5zaW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJ0dXJuOmxhbmVzIiBJUyBOT1QgTlVMTCBBTkQgcmVjZWl2ZWQuc2Ffd2F5cy5vbmVfd2F5X2NhciA9ICd0ZicNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBhcnJheV9sZW5ndGgoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9zcGxpdF90b19hcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbS4idHVybjpsYW5lcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFx8Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIC0tIG9ubHkgb25lIGRpbWVuc2lvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4ibGFuZXM6YmFja3dhcmQiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgc3Vic3RyaW5nKG9zbS4ibGFuZXM6YmFja3dhcmQiIEZST00gJ1xcZCsnKTo6SU5UDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImxhbmVzIiBJUyBOT1QgTlVMTCBBTkQgcmVjZWl2ZWQuc2Ffd2F5cy5vbmVfd2F5X2NhciA9ICd0ZicNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBzdWJzdHJpbmcob3NtLiJsYW5lcyIgRlJPTSAnXFxkKycpOjpJTlQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4ibGFuZXMiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgY2VpbChzdWJzdHJpbmcob3NtLiJsYW5lcyIgRlJPTSAnXFxkKycpOjpGTE9BVCAvIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICBmdF9jcm9zc19sYW5lcyA9DQogICAgICAgICAgICBDQVNFICAgIFdIRU4gb3NtLiJ0dXJuOmxhbmVzOmZvcndhcmQiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGFycmF5X2xlbmd0aCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3JlbW92ZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfc3BsaXRfdG9fYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbS4idHVybjpsYW5lczpmb3J3YXJkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcfCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaWdodCcgICAgIC0tIGRvbid0IGNvbnNpZGVyIHJpZ2h0LW9ubHkgbGFuZXMgZm9yIGNyb3NzaW5nIHN0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAtLSBvbmx5IG9uZSBkaW1lbnNpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4idHVybjpsYW5lcyIgSVMgTk9UIE5VTEwgQU5EIHJlY2VpdmVkLnNhX3dheXMub25lX3dheV9jYXIgPSAnZnQnDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGFycmF5X2xlbmd0aCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3JlbW92ZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfc3BsaXRfdG9fYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbS4idHVybjpsYW5lcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXHwnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmlnaHQnICAgICAtLSBkb24ndCBjb25zaWRlciByaWdodC1vbmx5IGxhbmVzIGZvciBjcm9zc2luZyBzdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgLS0gb25seSBvbmUgZGltZW5zaW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImxhbmVzOmZvcndhcmQiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIHN1YnN0cmluZyhvc20uImxhbmVzOmZvcndhcmQiIEZST00gJ1xcZCsnKTo6SU5UDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lcyIgSVMgTk9UIE5VTEwgQU5EIHJlY2VpdmVkLnNhX3dheXMub25lX3dheV9jYXIgPSAnZnQnDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIHN1YnN0cmluZyhvc20uImxhbmVzIiBGUk9NICdcXGQrJyk6OklOVA0KICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4ibGFuZXMiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGNlaWwoc3Vic3RyaW5nKG9zbS4ibGFuZXMiIEZST00gJ1xcZCsnKTo6RkxPQVQgLyAyKQ0KICAgICAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHRmX2Nyb3NzX2xhbmVzID0NCiAgICAgICAgICAgIENBU0UgICAgV0hFTiBvc20uInR1cm46bGFuZXM6YmFja3dhcmQiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGFycmF5X2xlbmd0aCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3JlbW92ZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfc3BsaXRfdG9fYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbS4idHVybjpsYW5lczpiYWNrd2FyZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXHwnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmlnaHQnICAgICAtLSBkb24ndCBjb25zaWRlciByaWdodC1vbmx5IGxhbmVzIGZvciBjcm9zc2luZyBzdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgLS0gb25seSBvbmUgZGltZW5zaW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInR1cm46bGFuZXMiIElTIE5PVCBOVUxMIEFORCByZWNlaXZlZC5zYV93YXlzLm9uZV93YXlfY2FyID0gJ3RmJw0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBhcnJheV9sZW5ndGgoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9yZW1vdmUoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwX3NwbGl0X3RvX2FycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc20uInR1cm46bGFuZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFx8Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpZ2h0JyAgICAgLS0gZG9uJ3QgY29uc2lkZXIgcmlnaHQtb25seSBsYW5lcyBmb3IgY3Jvc3Npbmcgc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgIC0tIG9ubHkgb25lIGRpbWVuc2lvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lczpiYWNrd2FyZCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgc3Vic3RyaW5nKG9zbS4ibGFuZXM6YmFja3dhcmQiIEZST00gJ1xcZCsnKTo6SU5UDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lcyIgSVMgTk9UIE5VTEwgQU5EIHJlY2VpdmVkLnNhX3dheXMub25lX3dheV9jYXIgPSAndGYnDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIHN1YnN0cmluZyhvc20uImxhbmVzIiBGUk9NICdcXGQrJyk6OklOVA0KICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4ibGFuZXMiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGNlaWwoc3Vic3RyaW5nKG9zbS4ibGFuZXMiIEZST00gJ1xcZCsnKTo6RkxPQVQgLyAyKQ0KICAgICAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHR3bHRsX2Nyb3NzX2xhbmVzID0NCiAgICAgICAgICAgIENBU0UgICAgV0hFTiBvc20uImxhbmVzOmJvdGhfd2F5cyIgSVMgTk9UIE5VTEwgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJ0dXJuOmxhbmVzOmJvdGhfd2F5cyIgSVMgTk9UIE5VTEwgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgIEVMU0UgTlVMTA0KICAgICAgICAgICAgICAgICAgICBFTkQNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQ7DQoNCi0tIFRoaW5ncyBjaGFuZ2VkOiBUaGUgb3JpZ2luYWwgcXVlcnkgdXNlZCBvbmVfd2F5IGNvbHVtbiwgYnV0IHRoYXQgb25lIGlzIG5vdCBwb3B1bGF0ZWQgeWV0LCBzbyBJIGNoYW5nZWQgaXQgdG8gb25lX3dheV9jYXINCmBgYA0KDQojIyMjIyA+IHBhcmsNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfcGFyayA9IE5VTEwsIHRmX3BhcmsgPSBOVUxMOw0KDQotLSBib3RoDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfcGFyayA9IENBU0UgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAncGFyYWxsZWwnIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdwYXJhbGVsbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ2RpYWdvbmFsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAncGVycGVuZGljdWxhcicgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ25vX3BhcmtpbmcnIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdub19zdG9wcGluZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHRmX3BhcmsgPSBDQVNFICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ3BhcmFsbGVsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAncGFyYWxlbGwnIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdkaWFnb25hbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ3BlcnBlbmRpY3VsYXInIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdub19wYXJraW5nJyBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAnbm9fc3RvcHBpbmcnIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkOw0KDQotLSByaWdodA0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X3BhcmsgPSBDQVNFICBXSEVOIG9zbS4icGFya2luZzpsYW5lOnJpZ2h0IiA9ICdwYXJhbGxlbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOnJpZ2h0IiA9ICdwYXJhbGVsbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOnJpZ2h0IiA9ICdkaWFnb25hbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOnJpZ2h0IiA9ICdwZXJwZW5kaWN1bGFyJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6cmlnaHQiID0gJ25vX3BhcmtpbmcnIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpyaWdodCIgPSAnbm9fc3RvcHBpbmcnIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkOw0KDQotLSBsZWZ0DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgdGZfcGFyayA9IENBU0UgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6bGVmdCIgPSAncGFyYWxsZWwnIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpsZWZ0IiA9ICdwYXJhbGVsbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmxlZnQiID0gJ2RpYWdvbmFsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6bGVmdCIgPSAncGVycGVuZGljdWxhcicgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmxlZnQiID0gJ25vX3BhcmtpbmcnIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpsZWZ0IiA9ICdub19zdG9wcGluZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQ7DQoNCmBgYA0KDQojIyMjIyA+IGJpa2UgaW5mcmFzdHJ1Y3R1cmUNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9iaWtlX2luZnJhID0gTlVMTCwgdGZfYmlrZV9pbmZyYSA9IE5VTEw7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGZ0IGRpcmVjdGlvbg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X2Jpa2VfaW5mcmEgPSBDQVNFDQoNCiAgICAgICAgICAgIC0tIDpib3RoDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aCIgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgVEhFTiAnc2hhcnJvdycNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6Ym90aDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdsYW5lJw0KICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aCIgPSAndHJhY2snDQogICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICBXSEVOIChvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICd0cmFjaycgQU5EIG9zbS4ib25ld2F5OmJpY3ljbGUiID0gJ25vJykNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgIFdIRU4gKG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAndHJhY2snIEFORCBvc20uIm9uZXdheTpiaWN5Y2xlIiA9ICdubycpDQogICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICBXSEVOIChvc20uY3ljbGV3YXkgPSAndHJhY2snIEFORCBvc20uIm9uZXdheTpiaWN5Y2xlIiA9ICdubycpDQogICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQoNCiAgICAgICAgICAgIC0tIG9uZS13YXk9ZnQNCiAgICAgICAgICAgIFdIRU4gb25lX3dheV9jYXIgPSAnZnQnDQogICAgICAgICAgICAgICAgVEhFTiBDQVNFICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ3NoYXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmxlZnQ6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBzdHVmZiBmcm9tIHR3by13YXkgdGhhdCBhbHNvIGFwcGxpZXMgdG8gb25lLXdheT1mdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ3NoYXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheSIgPSAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAtLSBvbmUtd2F5PXRmDQogICAgICAgICAgICBXSEVOIG9uZV93YXlfY2FyID0gJ3RmJw0KICAgICAgICAgICAgICAgIFRIRU4gQ0FTRSAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ29wcG9zaXRlX2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ29wcG9zaXRlX2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ29wcG9zaXRlX2xhbmUnIEFORCBvc20uImN5Y2xld2F5OnJpZ2h0OmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdvcHBvc2l0ZV9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnb3Bwb3NpdGVfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXkiID0gJ29wcG9zaXRlX3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIChvbmVfd2F5X2NhciA9ICd0ZicgQU5EIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnb3Bwb3NpdGVfdHJhY2snKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIChvbmVfd2F5X2NhciA9ICd0ZicgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ29wcG9zaXRlX3RyYWNrJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgIC0tIHR3by13YXkNCiAgICAgICAgICAgIFdIRU4gb25lX3dheV9jYXIgSVMgTlVMTA0KICAgICAgICAgICAgICAgIFRIRU4gQ0FTRSAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ3NoYXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheSIgPSAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgRU5ELA0KDQogICAgICAgIHRmX2Jpa2VfaW5mcmEgPSBDQVNFDQoNCiAgICAgICAgICAgIC0tIDpib3RoDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aCIgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgVEhFTiAnc2hhcnJvdycNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6Ym90aDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdsYW5lJw0KICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aCIgPSAndHJhY2snDQogICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICBXSEVOIChvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICd0cmFjaycgQU5EIG9zbS4ib25ld2F5OmJpY3ljbGUiID0gJ25vJykNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgIFdIRU4gKG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAndHJhY2snIEFORCBvc20uIm9uZXdheTpiaWN5Y2xlIiA9ICdubycpDQogICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICBXSEVOIChvc20uY3ljbGV3YXkgPSAndHJhY2snIEFORCBvc20uIm9uZXdheTpiaWN5Y2xlIiA9ICdubycpDQogICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQoNCiAgICAgICAgICAgIC0tIG9uZS13YXk9dGYNCiAgICAgICAgICAgIFdIRU4gb25lX3dheV9jYXIgPSAndGYnDQogICAgICAgICAgICAgICAgVEhFTiBDQVNFICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnc2hhcnJvdycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ2xhbmUnIEFORCBvc20uImN5Y2xld2F5OnJpZ2h0OmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBzdHVmZiBmcm9tIHR3by13YXkgdGhhdCBhbHNvIGFwcGxpZXMgdG8gb25lLXdheT10Zg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ3NoYXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnc2hhcnJvdycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpsZWZ0OmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheSIgPSAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgIC0tIG9uZS13YXk9ZnQNCiAgICAgICAgICAgIFdIRU4gb25lX3dheV9jYXIgPSAnZnQnDQogICAgICAgICAgICAgICAgVEhFTiBDQVNFICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnb3Bwb3NpdGVfbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnb3Bwb3NpdGVfbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnb3Bwb3NpdGVfbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ29wcG9zaXRlX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdvcHBvc2l0ZV9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheSIgPSAnb3Bwb3NpdGVfdHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gKG9uZV93YXlfY2FyID0gJ3RmJyBBTkQgb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdvcHBvc2l0ZV90cmFjaycpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gKG9uZV93YXlfY2FyID0gJ3RmJyBBTkQgb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnb3Bwb3NpdGVfdHJhY2snKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgLS0gdHdvLXdheQ0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciBJUyBOVUxMDQogICAgICAgICAgICAgICAgVEhFTiBDQVNFICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ3NoYXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmxlZnQ6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZDsNCg0KLS0gdXBkYXRlIG9uZV93YXkgYmFzZWQgb24gYmlrZSBpbmZyYQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIG9uZV93YXkgPSBOVUxMOw0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIG9uZV93YXkgPSBvbmVfd2F5X2Nhcg0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvbmVfd2F5X2NhciA9ICdmdCcNCkFORCAgICAgTk9UICh0Zl9iaWtlX2luZnJhIElTIE5PVCBOVUxMIE9SIENPQUxFU0NFKG9zbS4ib25ld2F5OmJpY3ljbGUiLCd5ZXMnKSA9ICdubycpOw0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIG9uZV93YXkgPSBvbmVfd2F5X2Nhcg0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvbmVfd2F5X2NhciA9ICd0ZicNCkFORCAgICAgTk9UIChmdF9iaWtlX2luZnJhIElTIE5PVCBOVUxMIE9SIENPQUxFU0NFKG9zbS4ib25ld2F5OmJpY3ljbGUiLCd5ZXMnKSA9ICdubycpOw0KDQotLSBnZXQgZmFjaWxpdHkgd2lkdGhzDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfYmlrZV9pbmZyYV93aWR0aCA9IENBU0UNCg0KICAgICAgICAgICAgLS0gZmVldA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBMSUtFICclIGZ0Jw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpyaWdodDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVC8zLjI4MDg0DQogICAgICAgICAgICBXSEVOIG9uZV93YXlfY2FyID0gJ2Z0JyBBTkQgb3NtLiJjeWNsZXdheTpsZWZ0OndpZHRoIiBMSUtFICclIGZ0Jw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpsZWZ0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FULzMuMjgwODQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoOndpZHRoIiBMSUtFICclIGZ0Jw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpib3RoOndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FULzMuMjgwODQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTp3aWR0aCIgTElLRSAnJSBmdCcNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQvMy4yODA4NA0KDQogICAgICAgICAgICAtLSBtZXRlcnMNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodDp3aWR0aCIgTElLRSAnJSBtJw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpyaWdodDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICdmdCcgQU5EIG9zbS4iY3ljbGV3YXk6bGVmdDp3aWR0aCIgTElLRSAnJSBtJw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpsZWZ0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aDp3aWR0aCIgTElLRSAnJSBtJw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpib3RoOndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6d2lkdGgiIExJS0UgJyUgbScNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCg0KICAgICAgICAgICAgLS0gbm8gdW5pdHMgKGRlZmF1bHQ9bWV0ZXJzKQ0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpyaWdodDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICdmdCcgQU5EIG9zbS4iY3ljbGV3YXk6bGVmdDp3aWR0aCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6bGVmdDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGg6d2lkdGgiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmJvdGg6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTp3aWR0aCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBmdF9iaWtlX2luZnJhIElTIE5PVCBOVUxMOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgdGZfYmlrZV9pbmZyYV93aWR0aCA9IENBU0UNCg0KICAgICAgICAgICAgLS0gZmVldA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQ6d2lkdGgiIExJS0UgJyUgZnQnDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmxlZnQ6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQvMy4yODA4NA0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICd0ZicgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIExJS0UgJyUgZnQnDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FULzMuMjgwODQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoOndpZHRoIiBMSUtFICclIGZ0Jw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpib3RoOndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FULzMuMjgwODQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTp3aWR0aCIgTElLRSAnJSBmdCcNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQvMy4yODA4NA0KDQogICAgICAgICAgICAtLSBtZXRlcnMNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0OndpZHRoIiBMSUtFICclIG0nDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmxlZnQ6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb25lX3dheV9jYXIgPSAndGYnIEFORCBvc20uImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBMSUtFICclIG0nDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aDp3aWR0aCIgTElLRSAnJSBtJw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpib3RoOndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6d2lkdGgiIExJS0UgJyUgbScNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCg0KICAgICAgICAgICAgLS0gbm8gdW5pdHMgKGRlZmF1bHQ9bWV0ZXJzKQ0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQ6d2lkdGgiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmxlZnQ6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb25lX3dheV9jYXIgPSAndGYnIEFORCBvc20uImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpyaWdodDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGg6d2lkdGgiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmJvdGg6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTp3aWR0aCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICB0Zl9iaWtlX2luZnJhIElTIE5PVCBOVUxMOw0KDQpgYGANCg0KIyMjIyMgPiBjbGFzcyBhZGp1c3RtZW50cw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAndGVydGlhcnknDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgSU4gKCdyZXNpZGVudGlhbCcsJ3VuY2xhc3NpZmllZCcpDQpBTkQgICAgICgNCiAgICAgICAgICAgIGZ0X2Jpa2VfaW5mcmEgSU4gKCd0cmFjaycsJ2J1ZmZlcmVkX2xhbmUnLCdsYW5lJykNCiAgICAgICAgT1IgIHRmX2Jpa2VfaW5mcmEgSU4gKCd0cmFjaycsJ2J1ZmZlcmVkX2xhbmUnLCdsYW5lJykNCiAgICAgICAgT1IgIGZ0X2xhbmVzID4gMQ0KICAgICAgICBPUiAgdGZfbGFuZXMgPiAxDQogICAgICAgIE9SICBzcGVlZF9saW1pdCA+PSA1MA0KICAgICAgICApOw0KDQotLSBUaGluZ3MgY2hhbmdlZDogc3BlZWQgbGltaXQgZnJvbSAzMCBtcGggdG8gNTAga21oDQpgYGANCg0KIyMjIyAtIFBvcHVsYXRlIGludGVyc2VjdGlvbiB0YWJsZQ0KDQpXaGljaCBkb2VzIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGZvbGxvd2luZyBjb2x1bW5zIG9uIHRoZSBpbnRlcnNlY3Rpb24gdGFibGUuDQoNCiMjIyMjID4gbGVncw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBsZWdzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChyb2FkX2lkKQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzDQogICAgICAgICAgICBXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfaW50LmludF9pZCBJTiAoaW50ZXJzZWN0aW9uX2Zyb20saW50ZXJzZWN0aW9uX3RvKQ0KKTsNCg0KYGBgDQoNCiMjIyMjID4gc2lnbmFsaXplZA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFIHJlY2VpdmVkLnNhX3dheXNfaW50IFNFVCBzaWduYWxpemVkID0gJ2YnOw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gdHJhZmZpYyBzaWduYWxzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBzaWduYWxpemVkID0gJ3QnDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfaW50Lm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLmhpZ2h3YXkgPSAndHJhZmZpY19zaWduYWxzJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBzaWduYWxpemVkID0gJ3QnDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMsDQogICAgICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIGludF9pZCA9IHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX3RvDQpBTkQgICAgIG9zbS4idHJhZmZpY19zaWduYWxzOmRpcmVjdGlvbiIgPSAnZm9yd2FyZCc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQNClNFVCAgICAgc2lnbmFsaXplZCA9ICd0Jw0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzLA0KICAgICAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBpbnRfaWQgPSByZWNlaXZlZC5zYV93YXlzLmludGVyc2VjdGlvbl9mcm9tDQpBTkQgICAgIG9zbS4idHJhZmZpY19zaWduYWxzOmRpcmVjdGlvbiIgPSAnYmFja3dhcmQnOw0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBIQVdLcyBhbmQgb3RoZXIgdmFyaWFudHMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfaW50DQpTRVQgICAgIHNpZ25hbGl6ZWQgPSAndCcNCldIRVJFICAgbGVncyA+IDINCkFORCAgICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50IG9zbQ0KICAgICAgICAgICAgV0hFUkUgICBvc20uaGlnaHdheSA9ICdjcm9zc2luZycNCiAgICAgICAgICAgIEFORCAgICAgb3NtLmNyb3NzaW5nIElOICgndHJhZmZpY19zaWduYWxzJywncGVsaWNhbicsJ3RvdWNhbicpDQogICAgICAgICAgICBBTkQgICAgIFNUX0RXaXRoaW4ocmVjZWl2ZWQuc2Ffd2F5c19pbnQuZ2VvbSwgb3NtLndheSwgMjUpDQogICAgICAgICk7DQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIENhcHR1cmUgc2lnbmFscyBmcm9tIG90aGVyIHBvaW50cw0KLS0gb24gdGhlIGludGVyc2VjdGlvbg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQNClNFVCAgICAgc2lnbmFsaXplZCA9ICd0Jw0KV0hFUkUgICBsZWdzID4gMg0KQU5EICAgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCiAgICAgICAgICAgIFdIRVJFICAgaS5zaWduYWxpemVkDQogICAgICAgICAgICBBTkQgICAgIFNUX0RXaXRoaW4ocmVjZWl2ZWQuc2Ffd2F5c19pbnQuZ2VvbSwgaS5nZW9tLCAyNSkNCiAgICAgICAgKTsNCg0KYGBgDQoNCiMjIyMjID4gc3RvcHMNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSByZWNlaXZlZC5zYV93YXlzX2ludCBTRVQgc3RvcHMgPSAnZic7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQNClNFVCAgICAgc3RvcHMgPSAndCcNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludCBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20uaGlnaHdheSA9ICdzdG9wJw0KQU5EICAgICBvc20uc3RvcCA9ICdhbGwnOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfaW50DQpTRVQgICAgIHN0b3BzID0gJ3QnDQpXSEVSRSAgIGxlZ3MgPiAyDQpBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaQ0KICAgICAgICAgICAgV0hFUkUgICBpLnN0b3BzDQogICAgICAgICAgICBBTkQgICAgIFNUX0RXaXRoaW4ocmVjZWl2ZWQuc2Ffd2F5c19pbnQuZ2VvbSwgaS5nZW9tLCAyNSkNCiAgICAgICAgKTsNCg0KYGBgDQoNCiMjIyMjID4gcnJmYg0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFIHJlY2VpdmVkLnNhX3dheXNfaW50IFNFVCBycmZiID0gRkFMU0U7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQNClNFVCAgICAgcnJmYiA9IFRSVUUNCldIRVJFICAgbGVncyA+IDINCkFORCAgICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50IG9zbQ0KICAgICAgICAgICAgV0hFUkUgICBvc20uaGlnaHdheSA9ICdjcm9zc2luZycNCiAgICAgICAgICAgIEFORCAgICAgb3NtLmZsYXNoaW5nX2xpZ2h0cyA9ICd5ZXMnDQogICAgICAgICAgICBBTkQgICAgIFNUX0RXaXRoaW4ocmVjZWl2ZWQuc2Ffd2F5c19pbnQuZ2VvbSwgb3NtLndheSwgMjUpDQogICAgICAgICk7DQpgYGANCg0KIyMjIyMgPiBpc2xhbmQNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSByZWNlaXZlZC5zYV93YXlzX2ludCBTRVQgaXNsYW5kID0gRkFMU0U7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQNClNFVCAgICAgaXNsYW5kID0gVFJVRQ0KV0hFUkUgICBsZWdzID4gMg0KQU5EICAgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQgb3NtDQogICAgICAgICAgICBXSEVSRSAgIG9zbS5oaWdod2F5ID0gJ2Nyb3NzaW5nJw0KICAgICAgICAgICAgQU5EICAgICBvc20uY3Jvc3NpbmcgPSAnaXNsYW5kJw0KICAgICAgICAgICAgQU5EICAgICBTVF9EV2l0aGluKHJlY2VpdmVkLnNhX3dheXNfaW50Lmdlb20sIG9zbS53YXksIDI1KQ0KICAgICAgICApOw0KYGBgDQoNCkFuIGV4YW1wbGUgb2YgaG93IHRoZSB0YWJsZXMgbG9vayBsaWtlIGFmdGVyIHRoaXMgc3RlcDoNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIHRhYi5jYXAgPSAiV2F5cyB0YWJsZSJ9DQpTRUxFQ1QgKiBGUk9NIHJlY2VpdmVkLnNhX3dheXMgTElNSVQgMTA7DQpgYGANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIHRhYi5jYXAgPSAiSW50ZXJzZWN0aW9uIHRhYmxlIHRhYmxlIn0NClNFTEVDVCAqIEZST00gcmVjZWl2ZWQuc2Ffd2F5c19pbnQgTElNSVQgMTA7DQpgYGANCg0KVGhlIGNvZGUgZm9yIHRoaXMgc3RlcCBpcyBub3QgaW5jbHVkZWQgYXMgaXQgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHRoZSBQZkIgY29kZSwgYW5kIGlzIGFjdHVhbGx5IHF1aXRlIGxvbmcuIEhvd2V2ZXIsIGl0IGNhbiBiZSBleGFtaW5lZCB0aHJvdWdoIHRoZSAqUm1kKiBmaWxlIGZvciB0aGlzIFIgTm90ZWJvb2suDQoNCk9uZSBhZGRpdGlvbmFsIHZhbHVlIHRoYXQgSSB3YXMgY29uc2lkZXJpbmcgb24gYWRkaW5nIGlzIHNsb3BlLCBob3dldmVyIEkgaGF2ZSBub3QgZ29uZSB0aHJvdWdoIHdpdGggdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2YXJpYWJsZSB5ZXQuIFRoaXMgd291bGQgYWxzbyBhZmZlY3Qgc3RlcCA2LiANCg0KIyMjIDYuIENhbGN1bGF0ZSBzdHJlc3MNCg0KVGhlIHNhbWUgYXMgc3RlcCA1LCB0aGlzIHN0ZXAgY29uc2lkZXJzIG1haW5seSBTUUwgcXVlcmllcyBhbHJlYWR5IHBlcmZvcm1lZCBieSBQZkIuIEl0IHdpbGwgbWFpbmx5IGFsdGVyIHRoZSBjb2x1bW5zIG1lYW50IHRvIGhvc3QgdGhlIHN0cmVzcyByYW5rIGZvciBzZWdtZW50cyBhbmQgaW50ZXJzZWN0aW9ucy4gSXQgY29uc2lkZXJzIGRpZmZlcmVudCBjYXNlcyB0byBkbyB0aGUgY2xhc3NpZmljYXRpb24uIFRoZSBzY3JpcHRzIHRoYXQgY2FuIGJlIGZ1cnRoZXIgZXhhbWluZWQgb24gdGhlICpSbWQqIGZpbGUgYXJlOg0KDQojIyMjIyA+IG1vdG9yd2F5IHRydW5rDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X3NlZ19zdHJlc3MgPSBOVUxMLCB0Zl9zZWdfc3RyZXNzID0gTlVMTA0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzIElOICgnbW90b3J3YXknLCdtb3RvcndheV9saW5rJywndHJ1bmsnLCd0cnVua19saW5rJyk7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfc2VnX3N0cmVzcyA9IDMsIHRmX3NlZ19zdHJlc3MgPSAzDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgSU4gKCdtb3RvcndheScsJ21vdG9yd2F5X2xpbmsnLCd0cnVuaycsJ3RydW5rX2xpbmsnKTsNCmBgYA0KDQojIyMjIyA+IGhpZ2hlciBvcmRlcg0KDQpgYGB7ciBoaWdoZXIgb3JkZXIsIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0Kc3RyZXNzX2hpZ2hlcl9vcmRlcl93YXlzIDwtIGZ1bmN0aW9uKA0KICBjbGFzcywgDQogIGRlZmF1bHRfc3BlZWQsIA0KICBkZWZhdWx0X2xhbmVzLCANCiAgZGVmYXVsdF9wYXJraW5nLA0KICBkZWZhdWx0X3Bhcmtpbmdfd2lkdGgsDQogIGRlZmF1bHRfZmFjaWxpdHlfd2lkdGgNCiAgKQ0Kew0KICBzcWxkZigNCiAgICBwYXN0ZTAoDQogICAgICAiDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X3NlZ19zdHJlc3MgPSBOVUxMLCB0Zl9zZWdfc3RyZXNzID0gTlVMTA0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzIElOICgnIiwgY2xhc3MsICInLCciLCBjbGFzcywgIid8fCdfbGluaycpOw0KDQotLSBmdCBkaXJlY3Rpb24NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9zZWdfc3RyZXNzID0NCiAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgIFdIRU4gZnRfYmlrZV9pbmZyYSA9ICd0cmFjaycgVEhFTiAxDQogICAgICAgICAgICBXSEVOIGZ0X2Jpa2VfaW5mcmEgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPiA2MCBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgPSAxIFRIRU4gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMSBUSEVOIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8IDUwIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgIFdIRU4gZnRfYmlrZV9pbmZyYSA9ICdsYW5lJyBBTkQgQ09BTEVTQ0UoZnRfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMCAgLS0gYmlrZSBsYW5lIHdpdGggbm8gcGFya2luZw0KICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA+IDUwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPD0gMzANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAyIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBXSEVOIGZ0X2Jpa2VfaW5mcmEgPSAnbGFuZScgQU5EIENPQUxFU0NFKGZ0X3BhcmssIiwgZGVmYXVsdF9wYXJraW5nLCAiKSA9IDENCiAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfYmlrZV9pbmZyYV93aWR0aCwiLCBkZWZhdWx0X2ZhY2lsaXR5X3dpZHRoLCAiKSArICIsIGRlZmF1bHRfcGFya2luZ193aWR0aCwgIiA+PSA1ICAgLS0gdHJlYXQgYXMgYnVmZmVyZWQgbGFuZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA+IDYwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDYwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDwgNTAgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9iaWtlX2luZnJhX3dpZHRoLCIsIGRlZmF1bHRfZmFjaWxpdHlfd2lkdGgsICIpICsgIiwgZGVmYXVsdF9wYXJraW5nX3dpZHRoLCAiID49IDQgICAtLSB0cmVhdCBhcyBiaWtlIGxhbmUgd2l0aCBubyBwYXJraW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID4gNTAgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA0MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8PSAzMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDIgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIC0tIHNoYXJlZCBsYW5lDQogICAgICAgICAgICAgICAgICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDw9IDMwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID0gMSBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgRU5ELA0KICAgICAgICB0Zl9zZWdfc3RyZXNzID0NCiAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgIFdIRU4gdGZfYmlrZV9pbmZyYSA9ICd0cmFjaycgVEhFTiAxDQogICAgICAgICAgICBXSEVOIHRmX2Jpa2VfaW5mcmEgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPiA2MCBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgPSAxIFRIRU4gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMSBUSEVOIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8IDUwIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgIFdIRU4gdGZfYmlrZV9pbmZyYSA9ICdsYW5lJyBBTkQgQ09BTEVTQ0UodGZfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMCAgLS0gYmlrZSBsYW5lIHdpdGggbm8gcGFya2luZw0KICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA+IDUwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPD0gMzANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAyIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBXSEVOIHRmX2Jpa2VfaW5mcmEgPSAnbGFuZScgQU5EIENPQUxFU0NFKHRmX3BhcmssIiwgZGVmYXVsdF9wYXJraW5nLCAiKSA9IDENCiAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfYmlrZV9pbmZyYV93aWR0aCwiLCBkZWZhdWx0X2ZhY2lsaXR5X3dpZHRoLCAiKSArICIsIGRlZmF1bHRfcGFya2luZ193aWR0aCwgIiA+PSA1ICAgLS0gdHJlYXQgYXMgYnVmZmVyZWQgbGFuZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA+IDYwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDYwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDwgNTAgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9iaWtlX2luZnJhX3dpZHRoLCIsIGRlZmF1bHRfZmFjaWxpdHlfd2lkdGgsICIpICsgIiwgZGVmYXVsdF9wYXJraW5nX3dpZHRoLCAiID49IDQgICAtLSB0cmVhdCBhcyBiaWtlIGxhbmUgd2l0aCBubyBwYXJraW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID4gNTAgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA0MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8PSAzMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDIgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIC0tIHNoYXJlZCBsYW5lDQogICAgICAgICAgICAgICAgICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDw9IDMwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID0gMSBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgRU5EDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgSU4gKCciLCBjbGFzcywgIicsJyIsIGNsYXNzLCAiJ3x8J19saW5rJyk7DQogICAgICAiDQogICAgKSwNCiAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KICApDQp9DQoNCnN0cmVzc19oaWdoZXJfb3JkZXJfd2F5cygNCiAgY2xhc3MgPSAicHJpbWFyeSIsIA0KICBkZWZhdWx0X3NwZWVkID0gNzAsIA0KICBkZWZhdWx0X2xhbmVzID0gMiwgDQogIGRlZmF1bHRfcGFya2luZyA9IDEsDQogIGRlZmF1bHRfcGFya2luZ193aWR0aCA9IDIuNSwNCiAgZGVmYXVsdF9mYWNpbGl0eV93aWR0aCA9IDEuNQ0KKQ0KDQpzdHJlc3NfaGlnaGVyX29yZGVyX3dheXMoDQogIGNsYXNzID0gInNlY29uZGFyeSIsIA0KICBkZWZhdWx0X3NwZWVkID0gNzAsIA0KICBkZWZhdWx0X2xhbmVzID0gMiwgDQogIGRlZmF1bHRfcGFya2luZyA9IDEsDQogIGRlZmF1bHRfcGFya2luZ193aWR0aCA9IDIuNSwNCiAgZGVmYXVsdF9mYWNpbGl0eV93aWR0aCA9IDEuNQ0KKQ0KDQpzdHJlc3NfaGlnaGVyX29yZGVyX3dheXMoDQogIGNsYXNzID0gInRlcnRpYXJ5IiwgDQogIGRlZmF1bHRfc3BlZWQgPSA1MCwgDQogIGRlZmF1bHRfbGFuZXMgPSAxLCANCiAgZGVmYXVsdF9wYXJraW5nID0gMSwNCiAgZGVmYXVsdF9wYXJraW5nX3dpZHRoID0gMi41LA0KICBkZWZhdWx0X2ZhY2lsaXR5X3dpZHRoID0gMS41DQopDQoNCiMgVGhpbmdzIGNoYW5nZWQ6IHNwZWVkcyAtIDQwbXBoPTcwa21oIDM1bXBoPTYwa21oIDMwbXBoPTUwa21oIDI1bXBoPTQwa21oIDIwbXBoPTMwa21oLCB3aWR0aCAtIDE1ZnQ9NW0gMTNmdD00bSA4ZnQ9Mi41bSA1ZnQ9MS41bSAyN2Z0PThtIDE5ZnQ9Nm0NCmBgYA0KDQojIyMjIyA+IGxvd2VyIG9yZGVyDQoNCmBgYHtyIGxvd2VyIG9yZGVyLCBpbmNsdWRlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCg0Kc3RyZXNzX2xvd2VyX29yZGVyX3dheXMgPC0gZnVuY3Rpb24oDQogIGNsYXNzLCANCiAgZGVmYXVsdF9zcGVlZCwgDQogIGRlZmF1bHRfbGFuZXMsIA0KICBkZWZhdWx0X3BhcmtpbmcsDQogIGRlZmF1bHRfcm9hZHdheV93aWR0aA0KICApDQp7DQogIHNxbGRmKA0KICAgIHBhc3RlMCgNCiAgICAgICINClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfc2VnX3N0cmVzcz1OVUxMLCB0Zl9zZWdfc3RyZXNzPU5VTEwNCiAgV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJyIsIGNsYXNzLCAiJzsNCiAgDQogIFVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KICBTRVQgICAgIGZ0X3NlZ19zdHJlc3MgPQ0KICAgICAgICAgICAgICBDQVNFDQogICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA0MA0KICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpICsgQ09BTEVTQ0UodGZfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMiAgICAtLSBwYXJraW5nIG9uIGJvdGggc2lkZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHdpZHRoLCIsIGRlZmF1bHRfcm9hZHdheV93aWR0aCwgIikgPj0gOA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICBDQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcGFya2luZyBvbiBvbmUgc2lkZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uod2lkdGgsIiwgZGVmYXVsdF9yb2Fkd2F5X3dpZHRoLCAiKSA+PSA2DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8PSAzMCBUSEVOIDENCiAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgIEVORCwNCiAgICAgICAgICB0Zl9zZWdfc3RyZXNzID0NCiAgICAgICAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNDANCiAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X3BhcmssIiwgZGVmYXVsdF9wYXJraW5nLCAiKSArIENPQUxFU0NFKHRmX3BhcmssIiwgZGVmYXVsdF9wYXJraW5nLCAiKSA9IDIgICAgLS0gcGFya2luZyBvbiBib3RoIHNpZGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3aWR0aCwiLCBkZWZhdWx0X3JvYWR3YXlfd2lkdGgsICIpID49IDgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgQ0FTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHBhcmtpbmcgb24gb25lIHNpZGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHdpZHRoLCIsIGRlZmF1bHRfcm9hZHdheV93aWR0aCwgIikgPj0gNg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPD0gMzAgVEhFTiAxDQogICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICBFTkQNCiAgV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJyIsIGNsYXNzLCAiJzsNCiAgDQogICAgICAiDQogICAgKSwNCiAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KICApDQp9DQoNCg0KDQpzdHJlc3NfbG93ZXJfb3JkZXJfd2F5cygNCiAgY2xhc3MgPSAicmVzaWRlbnRpYWwiLCANCiAgZGVmYXVsdF9zcGVlZCA9IDQwLCANCiAgZGVmYXVsdF9sYW5lcyA9IDEsIA0KICBkZWZhdWx0X3BhcmtpbmcgPSAxLA0KICBkZWZhdWx0X3JvYWR3YXlfd2lkdGggPSA4DQopDQoNCnN0cmVzc19sb3dlcl9vcmRlcl93YXlzKA0KICBjbGFzcyA9ICJ1bmNsYXNzaWZpZWQiLCANCiAgZGVmYXVsdF9zcGVlZCA9IDQwLCANCiAgZGVmYXVsdF9sYW5lcyA9IDEsIA0KICBkZWZhdWx0X3BhcmtpbmcgPSAxLA0KICBkZWZhdWx0X3JvYWR3YXlfd2lkdGggPSA4DQopDQoNCiMgUmVtYXJrOiB3aHkgZG8gdGhleSB1c2UgZGVmYXVsdF9sYW5lcyBpZiB0aGUgZnVuY3Rpb24gZG9lcyBub3QgdXNlIGl0Pw0KYGBgDQoNCiMjIyMjID4gbGl2aW5nIHN0cmVldA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9zZWdfc3RyZXNzID0gTlVMTCwgdGZfc2VnX3N0cmVzcyA9IE5VTEwNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdsaXZpbmdfc3RyZWV0JzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X3NlZ19zdHJlc3MgPSAzLA0KICAgICAgICB0Zl9zZWdfc3RyZXNzID0gMw0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAnbGl2aW5nX3N0cmVldCcNCkFORCAgICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS5iaWN5Y2xlID0gJ25vJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X3NlZ19zdHJlc3MgPSBDT0FMRVNDRShmdF9zZWdfc3RyZXNzLDEpLA0KICAgICAgICB0Zl9zZWdfc3RyZXNzID0gQ09BTEVTQ0UodGZfc2VnX3N0cmVzcywxKQ0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJ2xpdmluZ19zdHJlZXQnOw0KYGBgDQoNCiMjIyMjID4gdHJhY2sNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfc2VnX3N0cmVzcyA9IE5VTEwsIHRmX3NlZ19zdHJlc3MgPSBOVUxMDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAndHJhY2snOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfc2VnX3N0cmVzcyA9IDEsDQogICAgICAgIHRmX3NlZ19zdHJlc3MgPSAxDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAndHJhY2snOw0KYGBgDQoNCiMjIyMjID4gcGF0aA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9zZWdfc3RyZXNzID0gTlVMTCwgdGZfc2VnX3N0cmVzcyA9IE5VTEwNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdwYXRoJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X3NlZ19zdHJlc3MgPSAxLA0KICAgICAgICB0Zl9zZWdfc3RyZXNzID0gMQ0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3BhdGgnOw0KYGBgDQoNCiMjIyMjID4gb25lIHdheSByZXNldA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X3NlZ19zdHJlc3MgPSBOVUxMDQpXSEVSRSAgIG9uZV93YXkgPSAndGYnOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgdGZfc2VnX3N0cmVzcyA9IE5VTEwNCldIRVJFICAgb25lX3dheSA9ICdmdCc7DQoNCi0tIHJlc2V0IG9wcG9zaXRlIHN0cmVzcyBmb3Igb25lLXdheQ0KYGBgDQoNCiMjIyMjID4gbW90b3J3YXkgdHJ1bmsgaW50ZXJzZWN0aW9uDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X2ludF9zdHJlc3MgPSAxLCB0Zl9pbnRfc3RyZXNzID0gMQ0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzIElOICgnbW90b3J3YXknLCd0cnVuaycpOw0KDQotLSBhc3N1bWUgbG93IHN0cmVzcywgc2luY2UgdGhlc2UganVuY2lvbnMgd291bGQgYWx3YXlzIGJlIGNvbnRyb2xsZWQgb3IgZnJlZSBmbG93aW5nDQpgYGANCg0KIyMjIyMgPiBwcmltYXJ5IGludGVyc2VjdGlvbg0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9pbnRfc3RyZXNzID0gMSwgdGZfaW50X3N0cmVzcyA9IDENCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdwcmltYXJ5JzsNCg0KLS0gYXNzdW1lIGxvdyBzdHJlc3MsIHNpbmNlIHRoZXNlIGp1bmNpb25zIHdvdWxkIGFsd2F5cyBiZSBjb250cm9sbGVkIG9yIGZyZWUgZmxvd2luZw0KYGBgDQoNCiMjIyMjID4gc2Vjb25kYXJ5IGludGVyc2VjdGlvbiANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfaW50X3N0cmVzcyA9IDEsIHRmX2ludF9zdHJlc3MgPSAxDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAnc2Vjb25kYXJ5JzsNCg0KLS0gYXNzdW1lIGxvdyBzdHJlc3MsIHNpbmNlIHRoZXNlIGp1bmNpb25zIHdvdWxkIGFsd2F5cyBiZSBjb250cm9sbGVkIG9yIGZyZWUgZmxvd2luZw0KYGBgDQoNCiMjIyMjID4gdGVydGlhcnkgaW50ZXJzZWN0aW9uIA0KDQpgYGB7ciB0ZXJ0aWFyeSBpbnRlcnNlY3Rpb24sIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0Kc3RyZXNzX3RlcnRpYXJ5X2ludCA8LSBmdW5jdGlvbigNCiAgcHJpbWFyeV9zcGVlZCwgDQogIHNlY29uZGFyeV9zcGVlZCwgDQogIHByaW1hcnlfbGFuZXMsIA0KICBzZWNvbmRhcnlfbGFuZXMNCiAgKQ0Kew0KICBzcWxkZigNCiAgICBwYXN0ZTAoDQogICAgICAiDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X2ludF9zdHJlc3MgPSAxLCB0Zl9pbnRfc3RyZXNzID0gMQ0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3RlcnRpYXJ5JzsNCg0KLS0gZnQNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9pbnRfc3RyZXNzID0gMw0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAndGVydGlhcnknDQpBTkQgICAgIHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX3RvID0gaS5pbnRfaWQNCkFORCAgICAgTk9UIGkuc2lnbmFsaXplZA0KQU5EICAgICBOT1QgaS5zdG9wcw0KQU5EICAgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgdw0KICAgICAgICAgICAgV0hFUkUgICBpLmludF9pZCBJTiAody5pbnRlcnNlY3Rpb25fdG8sdy5pbnRlcnNlY3Rpb25fZnJvbSkNCiAgICAgICAgICAgIEFORCAgICAgQ09BTEVTQ0UocmVjZWl2ZWQuc2Ffd2F5cy5uYW1lLCdhJykgIT0gQ09BTEVTQ0Uody5uYW1lLCdiJykNCiAgICAgICAgICAgIEFORCAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ21vdG9yd2F5JywndHJ1bmsnKSBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAtLSB0d28gd2F5IHByaW1hcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAncHJpbWFyeScgQU5EIHcub25lX3dheSBJUyBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA+IDQgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIG9uZSB3YXkgcHJpbWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdwcmltYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPiAyIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA2MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gdHdvIHdheSBzZWNvbmRhcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAnc2Vjb25kYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA+IDQgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSBvbmUgd2F5IHNlY29uZGFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdzZWNvbmRhcnknIEFORCB3Lm9uZV93YXkgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID4gMiBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICBFTkQNCik7DQoNCg0KLS0gdGYNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICB0Zl9pbnRfc3RyZXNzID0gMw0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAndGVydGlhcnknDQpBTkQgICAgIHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX2Zyb20gPSBpLmludF9pZA0KQU5EICAgICBOT1QgaS5zaWduYWxpemVkDQpBTkQgICAgIE5PVCBpLnN0b3BzDQpBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3DQogICAgICAgICAgICBXSEVSRSAgIGkuaW50X2lkIElOICh3LmludGVyc2VjdGlvbl90byx3LmludGVyc2VjdGlvbl9mcm9tKQ0KICAgICAgICAgICAgQU5EICAgICBDT0FMRVNDRShyZWNlaXZlZC5zYV93YXlzLm5hbWUsJ2EnKSAhPSBDT0FMRVNDRSh3Lm5hbWUsJ2InKQ0KICAgICAgICAgICAgQU5EICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzIElOICgnbW90b3J3YXknLCd0cnVuaycpIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgIC0tIHR3byB3YXkgcHJpbWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdwcmltYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gb25lIHdheSBwcmltYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3ByaW1hcnknIEFORCB3Lm9uZV93YXkgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA+IDIgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDYwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSB0d28gd2F5IHNlY29uZGFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdzZWNvbmRhcnknIEFORCB3Lm9uZV93YXkgSVMgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIG9uZSB3YXkgc2Vjb25kYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3NlY29uZGFyeScgQU5EIHcub25lX3dheSBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPiAyIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgIEVORA0KKTsNCg0KICAgICAgIg0KICAgICksDQogIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uDQopDQp9DQoNCnN0cmVzc190ZXJ0aWFyeV9pbnQoDQogIHByaW1hcnlfc3BlZWQgPSA3MCwNCiAgc2Vjb25kYXJ5X3NwZWVkID0gNzAsDQogIHByaW1hcnlfbGFuZXMgPSAyLA0KICBzZWNvbmRhcnlfbGFuZXMgPSAyDQopDQoNCmBgYA0KDQojIyMjIyA+IGxvd2VyIGludGVyc2VjdGlvbiANCg0KYGBge3IgbG93ZXIgaW50ZXJzZWN0aW9uLCBpbmNsdWRlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCnN0cmVzc19sb3dlcl9pbnQgPC0gZnVuY3Rpb24oDQogIHByaW1hcnlfc3BlZWQsDQogIHNlY29uZGFyeV9zcGVlZCwNCiAgdGVydGlhcnlfc3BlZWQsDQogIHByaW1hcnlfbGFuZXMsDQogIHNlY29uZGFyeV9sYW5lcywNCiAgdGVydGlhcnlfbGFuZXMNCikNCnsNCiAgc3FsZGYoDQogICAgcGFzdGUwKA0KICAgICAgIg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9pbnRfc3RyZXNzID0gMSwgdGZfaW50X3N0cmVzcyA9IDENCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ3Jlc2lkZW50aWFsJywndW5jbGFzc2lmaWVkJywnbGl2aW5nX3N0cmVldCcsJ3RyYWNrJywncGF0aCcpOw0KDQotLSBmdA0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X2ludF9zdHJlc3MgPSAzDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ3Jlc2lkZW50aWFsJywndW5jbGFzc2lmaWVkJywnbGl2aW5nX3N0cmVldCcsJ3RyYWNrJywncGF0aCcpDQpBTkQgICAgIHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX3RvID0gaS5pbnRfaWQNCkFORCAgICAgTk9UIGkuc2lnbmFsaXplZA0KQU5EICAgICBOT1QgaS5zdG9wcw0KQU5EICAgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgdw0KICAgICAgICAgICAgV0hFUkUgICBpLmludF9pZCBJTiAody5pbnRlcnNlY3Rpb25fdG8sdy5pbnRlcnNlY3Rpb25fZnJvbSkNCiAgICAgICAgICAgIEFORCAgICAgQ09BTEVTQ0UocmVjZWl2ZWQuc2Ffd2F5cy5uYW1lLCdhJykgIT0gQ09BTEVTQ0Uody5uYW1lLCdiJykNCiAgICAgICAgICAgIEFORCAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ21vdG9yd2F5JywndHJ1bmsnKSBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAtLSB0d28gd2F5IHByaW1hcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAncHJpbWFyeScgQU5EIHcub25lX3dheSBJUyBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA+IDQgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIG9uZSB3YXkgcHJpbWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdwcmltYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPiAyIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA2MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gdHdvIHdheSBzZWNvbmRhcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAnc2Vjb25kYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA+IDQgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSBvbmUgd2F5IHNlY29uZGFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdzZWNvbmRhcnknIEFORCB3Lm9uZV93YXkgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID4gMiBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIHR3byB3YXkgdGVydGlhcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAndGVydGlhcnknIEFORCB3Lm9uZV93YXkgSVMgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA+IDQgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gb25lIHdheSB0ZXJ0aWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICd0ZXJ0aWFyeScgQU5EIHcub25lX3dheSBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA+IDIgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgIEVORA0KKTsNCg0KDQotLSB0Zg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHRmX2ludF9zdHJlc3MgPSAzDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ3Jlc2lkZW50aWFsJywndW5jbGFzc2lmaWVkJywnbGl2aW5nX3N0cmVldCcsJ3RyYWNrJywncGF0aCcpDQpBTkQgICAgIHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX2Zyb20gPSBpLmludF9pZA0KQU5EICAgICBOT1QgaS5zaWduYWxpemVkDQpBTkQgICAgIE5PVCBpLnN0b3BzDQpBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3DQogICAgICAgICAgICBXSEVSRSAgIGkuaW50X2lkIElOICh3LmludGVyc2VjdGlvbl90byx3LmludGVyc2VjdGlvbl9mcm9tKQ0KICAgICAgICAgICAgQU5EICAgICBDT0FMRVNDRShyZWNlaXZlZC5zYV93YXlzLm5hbWUsJ2EnKSAhPSBDT0FMRVNDRSh3Lm5hbWUsJ2InKQ0KICAgICAgICAgICAgQU5EICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzIElOICgnbW90b3J3YXknLCd0cnVuaycpIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgIC0tIHR3byB3YXkgcHJpbWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdwcmltYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gb25lIHdheSBwcmltYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3ByaW1hcnknIEFORCB3Lm9uZV93YXkgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA+IDIgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDYwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSB0d28gd2F5IHNlY29uZGFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdzZWNvbmRhcnknIEFORCB3Lm9uZV93YXkgSVMgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIG9uZSB3YXkgc2Vjb25kYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3NlY29uZGFyeScgQU5EIHcub25lX3dheSBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPiAyIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gdHdvIHdheSB0ZXJ0aWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICd0ZXJ0aWFyeScgQU5EIHcub25lX3dheSBJUyBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSBvbmUgd2F5IHRlcnRpYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3RlcnRpYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID4gMiBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgRU5EDQopOw0KDQogICAgICAiDQogICAgKSwNCiAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KICApDQp9DQoNCnN0cmVzc19sb3dlcl9pbnQoDQogIHByaW1hcnlfc3BlZWQgPSA3MCwNCiAgc2Vjb25kYXJ5X3NwZWVkID0gNzAsDQogIHRlcnRpYXJ5X3NwZWVkID0gNTAsDQogIHByaW1hcnlfbGFuZXMgPSAyLA0KICBzZWNvbmRhcnlfbGFuZXMgPSAyLA0KICB0ZXJ0aWFyeV9sYW5lcyA9IDENCikNCg0KYGBgDQoNCiMjIyMjID4gbGluayBpbnRlcnNlY3Rpb24NCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfaW50X3N0cmVzcyA9IDEsIHRmX2ludF9zdHJlc3MgPSAxDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgTElLRSAnJV9saW5rJzsNCmBgYA0KDQpBbiBleGFtcGxlIG9mIGhvdyB0aGUgdGFibGVzIGxvb2sgbGlrZSBhZnRlciB0aGlzIHN0ZXA6DQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCB0YWIuY2FwID0gIldheXMgdGFibGUifQ0KU0VMRUNUIG9zbV9pZCwgbmFtZSwgZnRfc2VnX3N0cmVzcywgdGZfc2VnX3N0cmVzcywgZnRfaW50X3N0cmVzcywgdGZfaW50X3N0cmVzcyBGUk9NIHJlY2VpdmVkLnNhX3dheXMgTElNSVQgMTA7DQpgYGANCg0KIyMjIDcuIEJ1aWxkIG5ldHdvcmsNCg0KT24gdGhpcyBzdGVwIHRoZSBuZXR3b3JrIGlzIGJ1aWx0IGJ5IGNyZWF0aW5nIHR3byB0YWJsZXM6IHZlcnRpY2VzIGFuZCBsaW5rcy4gQXMgdGhlIGxhc3QgMiBzdGVwcywgdGhlIGNvZGUgd29uJ3QgYmUgaW5jbHVkZSBidXQgY2FuIGJlIGFuYWx5emVkIG9uIHRoZSAqUm1kKiBmaWxlLiANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQ7DQpEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rOw0KDQotLSBjcmVhdGUgbmV3IHRhYmxlcw0KQ1JFQVRFIFRBQkxFIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgKA0KICAgIHZlcnRfaWQgU0VSSUFMIFBSSU1BUlkgS0VZLA0KICAgIHJvYWRfaWQgSU5URUdFUiwNCiAgICB2ZXJ0X2Nvc3QgSU5URUdFUiwNCiAgICBnZW9tIGdlb21ldHJ5KHBvaW50LD9zYV9jcnMpDQopOw0KDQpDUkVBVEUgVEFCTEUgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoDQogICAgbGlua19pZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgaW50X2lkIElOVEVHRVIsDQogICAgdHVybl9hbmdsZSBJTlRFR0VSLA0KICAgIGludF9jcm9zc2luZyBCT09MRUFOLA0KICAgIGludF9zdHJlc3MgSU5URUdFUiwNCiAgICBzb3VyY2VfdmVydCBJTlRFR0VSLA0KICAgIHNvdXJjZV9yb2FkX2lkIElOVEVHRVIsDQogICAgc291cmNlX3JvYWRfZGlyIFZBUkNIQVIoMiksDQogICAgc291cmNlX3JvYWRfYXppIElOVEVHRVIsDQogICAgc291cmNlX3JvYWRfbGVuZ3RoIElOVEVHRVIsDQogICAgc291cmNlX3N0cmVzcyBJTlRFR0VSLA0KICAgIHRhcmdldF92ZXJ0IElOVEVHRVIsDQogICAgdGFyZ2V0X3JvYWRfaWQgSU5URUdFUiwNCiAgICB0YXJnZXRfcm9hZF9kaXIgVkFSQ0hBUigyKSwNCiAgICB0YXJnZXRfcm9hZF9hemkgSU5URUdFUiwNCiAgICB0YXJnZXRfcm9hZF9sZW5ndGggSU5URUdFUiwNCiAgICB0YXJnZXRfc3RyZXNzIElOVEVHRVIsDQogICAgbGlua19jb3N0IElOVEVHRVIsDQogICAgbGlua19zdHJlc3MgSU5URUdFUiwNCiAgICBnZW9tIGdlb21ldHJ5KGxpbmVzdHJpbmcsP3NhX2NycykNCik7DQoNCi0tIGNyZWF0ZSB2ZXJ0aWNlcw0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCAocm9hZF9pZCwgZ2VvbSkNClNFTEVDVCAgd2F5cy5yb2FkX2lkLA0KICAgICAgICBTVF9MaW5lSW50ZXJwb2xhdGVQb2ludCh3YXlzLmdlb20sMC41KQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHdheXM7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV93YXlzX25ldF92ZXJ0X2dlb20gT04gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCBVU0lORyBnaXN0IChnZW9tKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19uZXRfdmVydF9yb2FkaWQgT04gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCAocm9hZF9pZCk7DQpBTkFMWVpFIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQ7DQoNCi0tLS0tLS0tLS0tLS0tLQ0KLS0gYWRkIGxpbmtzIC0tDQotLS0tLS0tLS0tLS0tLS0NCi0tIHR3by13YXkgdG8gdHdvLXdheQ0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoaW50X2lkLCBzb3VyY2VfdmVydCwgdGFyZ2V0X3ZlcnQsIGdlb20pDQpTRUxFQ1QgIGludHMuaW50X2lkLA0KICAgICAgICB2ZXJ0MS52ZXJ0X2lkLA0KICAgICAgICB2ZXJ0Mi52ZXJ0X2lkLA0KICAgICAgICBTVF9NYWtlbGluZSh2ZXJ0MS5nZW9tLHZlcnQyLmdlb20pDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGludHMsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQyLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMg0KV0hFUkUgICB2ZXJ0MS5yb2FkX2lkID0gcm9hZHMxLnJvYWRfaWQNCkFORCAgICAgdmVydDIucm9hZF9pZCA9IHJvYWRzMi5yb2FkX2lkDQpBTkQgICAgIGludHMuaW50X2lkIElOIChyb2FkczEuaW50ZXJzZWN0aW9uX2Zyb20sIHJvYWRzMS5pbnRlcnNlY3Rpb25fdG8pDQpBTkQgICAgIGludHMuaW50X2lkIElOIChyb2FkczIuaW50ZXJzZWN0aW9uX2Zyb20sIHJvYWRzMi5pbnRlcnNlY3Rpb25fdG8pDQpBTkQgICAgIHJvYWRzMS5vbmVfd2F5IElTIE5VTEwNCkFORCAgICAgcm9hZHMyLm9uZV93YXkgSVMgTlVMTA0KQU5EICAgICByb2FkczEucm9hZF9pZCAhPSByb2FkczIucm9hZF9pZDsNCg0KLS0gdHdvLXdheSB0byBmcm9tLXRvDQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQsIHNvdXJjZV92ZXJ0LCB0YXJnZXRfdmVydCwgZ2VvbSkNClNFTEVDVCAgaW50cy5pbnRfaWQsDQogICAgICAgIHZlcnQxLnZlcnRfaWQsDQogICAgICAgIHZlcnQyLnZlcnRfaWQsDQogICAgICAgIFNUX01ha2VsaW5lKHZlcnQxLmdlb20sdmVydDIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaW50cywNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDIsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHZlcnQxLnJvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB2ZXJ0Mi5yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQNCkFORCAgICAgaW50cy5pbnRfaWQgSU4gKHJvYWRzMS5pbnRlcnNlY3Rpb25fZnJvbSwgcm9hZHMxLmludGVyc2VjdGlvbl90bykNCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczIuaW50ZXJzZWN0aW9uX2Zyb20NCkFORCAgICAgcm9hZHMxLm9uZV93YXkgSVMgTlVMTA0KQU5EICAgICByb2FkczIub25lX3dheSA9ICdmdCcNCkFORCAgICAgcm9hZHMxLnJvYWRfaWQgIT0gcm9hZHMyLnJvYWRfaWQ7DQoNCi0tIHR3by13YXkgdG8gdG8tZnJvbQ0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoaW50X2lkLCBzb3VyY2VfdmVydCwgdGFyZ2V0X3ZlcnQsIGdlb20pDQpTRUxFQ1QgIGludHMuaW50X2lkLA0KICAgICAgICB2ZXJ0MS52ZXJ0X2lkLA0KICAgICAgICB2ZXJ0Mi52ZXJ0X2lkLA0KICAgICAgICBTVF9NYWtlbGluZSh2ZXJ0MS5nZW9tLHZlcnQyLmdlb20pDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGludHMsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQyLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMg0KV0hFUkUgICB2ZXJ0MS5yb2FkX2lkID0gcm9hZHMxLnJvYWRfaWQNCkFORCAgICAgdmVydDIucm9hZF9pZCA9IHJvYWRzMi5yb2FkX2lkDQpBTkQgICAgIGludHMuaW50X2lkIElOIChyb2FkczEuaW50ZXJzZWN0aW9uX2Zyb20sIHJvYWRzMS5pbnRlcnNlY3Rpb25fdG8pDQpBTkQgICAgIGludHMuaW50X2lkID0gcm9hZHMyLmludGVyc2VjdGlvbl90bw0KQU5EICAgICByb2FkczEub25lX3dheSBJUyBOVUxMDQpBTkQgICAgIHJvYWRzMi5vbmVfd2F5ID0gJ3RmJw0KQU5EICAgICByb2FkczEucm9hZF9pZCAhPSByb2FkczIucm9hZF9pZDsNCg0KLS0gZnJvbS10byB0byB0d28td2F5DQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQsIHNvdXJjZV92ZXJ0LCB0YXJnZXRfdmVydCwgZ2VvbSkNClNFTEVDVCAgaW50cy5pbnRfaWQsDQogICAgICAgIHZlcnQxLnZlcnRfaWQsDQogICAgICAgIHZlcnQyLnZlcnRfaWQsDQogICAgICAgIFNUX01ha2VsaW5lKHZlcnQxLmdlb20sdmVydDIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaW50cywNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDIsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHZlcnQxLnJvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB2ZXJ0Mi5yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQNCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczEuaW50ZXJzZWN0aW9uX3RvDQpBTkQgICAgIGludHMuaW50X2lkIElOIChyb2FkczIuaW50ZXJzZWN0aW9uX2Zyb20sIHJvYWRzMi5pbnRlcnNlY3Rpb25fdG8pDQpBTkQgICAgIHJvYWRzMS5vbmVfd2F5ID0gJ2Z0Jw0KQU5EICAgICByb2FkczIub25lX3dheSBJUyBOVUxMDQpBTkQgICAgIHJvYWRzMS5yb2FkX2lkICE9IHJvYWRzMi5yb2FkX2lkOw0KDQotLSBmcm9tLXRvIHRvIGZyb20tdG8NCklOU0VSVCBJTlRPIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsgKGludF9pZCwgc291cmNlX3ZlcnQsIHRhcmdldF92ZXJ0LCBnZW9tKQ0KU0VMRUNUICBpbnRzLmludF9pZCwNCiAgICAgICAgdmVydDEudmVydF9pZCwNCiAgICAgICAgdmVydDIudmVydF9pZCwNCiAgICAgICAgU1RfTWFrZWxpbmUodmVydDEuZ2VvbSx2ZXJ0Mi5nZW9tKQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpbnRzLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MiwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczINCldIRVJFICAgdmVydDEucm9hZF9pZCA9IHJvYWRzMS5yb2FkX2lkDQpBTkQgICAgIHZlcnQyLnJvYWRfaWQgPSByb2FkczIucm9hZF9pZA0KQU5EICAgICBpbnRzLmludF9pZCA9IHJvYWRzMS5pbnRlcnNlY3Rpb25fdG8NCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczIuaW50ZXJzZWN0aW9uX2Zyb20NCkFORCAgICAgcm9hZHMxLm9uZV93YXkgPSAnZnQnDQpBTkQgICAgIHJvYWRzMi5vbmVfd2F5ID0gJ2Z0Jw0KQU5EICAgICByb2FkczEucm9hZF9pZCAhPSByb2FkczIucm9hZF9pZDsNCg0KLS0gZnJvbS10byB0byB0by1mcm9tDQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQsIHNvdXJjZV92ZXJ0LCB0YXJnZXRfdmVydCwgZ2VvbSkNClNFTEVDVCAgaW50cy5pbnRfaWQsDQogICAgICAgIHZlcnQxLnZlcnRfaWQsDQogICAgICAgIHZlcnQyLnZlcnRfaWQsDQogICAgICAgIFNUX01ha2VsaW5lKHZlcnQxLmdlb20sdmVydDIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaW50cywNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDIsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHZlcnQxLnJvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB2ZXJ0Mi5yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQNCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczEuaW50ZXJzZWN0aW9uX3RvDQpBTkQgICAgIGludHMuaW50X2lkID0gcm9hZHMyLmludGVyc2VjdGlvbl90bw0KQU5EICAgICByb2FkczEub25lX3dheSA9ICdmdCcNCkFORCAgICAgcm9hZHMyLm9uZV93YXkgPSAndGYnDQpBTkQgICAgIHJvYWRzMS5yb2FkX2lkICE9IHJvYWRzMi5yb2FkX2lkOw0KDQotLSB0by1mcm9tIHRvIHR3by13YXkNCklOU0VSVCBJTlRPIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsgKGludF9pZCwgc291cmNlX3ZlcnQsIHRhcmdldF92ZXJ0LCBnZW9tKQ0KU0VMRUNUICBpbnRzLmludF9pZCwNCiAgICAgICAgdmVydDEudmVydF9pZCwNCiAgICAgICAgdmVydDIudmVydF9pZCwNCiAgICAgICAgU1RfTWFrZWxpbmUodmVydDEuZ2VvbSx2ZXJ0Mi5nZW9tKQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpbnRzLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MiwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczINCldIRVJFICAgdmVydDEucm9hZF9pZCA9IHJvYWRzMS5yb2FkX2lkDQpBTkQgICAgIHZlcnQyLnJvYWRfaWQgPSByb2FkczIucm9hZF9pZA0KQU5EICAgICBpbnRzLmludF9pZCA9IHJvYWRzMS5pbnRlcnNlY3Rpb25fZnJvbQ0KQU5EICAgICBpbnRzLmludF9pZCBJTiAocm9hZHMyLmludGVyc2VjdGlvbl9mcm9tLCByb2FkczIuaW50ZXJzZWN0aW9uX3RvKQ0KQU5EICAgICByb2FkczEub25lX3dheSA9ICd0ZicNCkFORCAgICAgcm9hZHMyLm9uZV93YXkgSVMgTlVMTA0KQU5EICAgICByb2FkczEucm9hZF9pZCAhPSByb2FkczIucm9hZF9pZDsNCg0KLS0gdG8tZnJvbSB0byB0by1mcm9tDQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQsIHNvdXJjZV92ZXJ0LCB0YXJnZXRfdmVydCwgZ2VvbSkNClNFTEVDVCAgaW50cy5pbnRfaWQsDQogICAgICAgIHZlcnQxLnZlcnRfaWQsDQogICAgICAgIHZlcnQyLnZlcnRfaWQsDQogICAgICAgIFNUX01ha2VsaW5lKHZlcnQxLmdlb20sdmVydDIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaW50cywNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDIsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHZlcnQxLnJvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB2ZXJ0Mi5yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQNCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczEuaW50ZXJzZWN0aW9uX2Zyb20NCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczIuaW50ZXJzZWN0aW9uX3RvDQpBTkQgICAgIHJvYWRzMS5vbmVfd2F5ID0gJ3RmJw0KQU5EICAgICByb2FkczIub25lX3dheSA9ICd0ZicNCkFORCAgICAgcm9hZHMxLnJvYWRfaWQgIT0gcm9hZHMyLnJvYWRfaWQ7DQoNCi0tIHRvLWZyb20gdG8gZnJvbS10bw0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoaW50X2lkLCBzb3VyY2VfdmVydCwgdGFyZ2V0X3ZlcnQsIGdlb20pDQpTRUxFQ1QgIGludHMuaW50X2lkLA0KICAgICAgICB2ZXJ0MS52ZXJ0X2lkLA0KICAgICAgICB2ZXJ0Mi52ZXJ0X2lkLA0KICAgICAgICBTVF9NYWtlbGluZSh2ZXJ0MS5nZW9tLHZlcnQyLmdlb20pDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGludHMsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQyLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMg0KV0hFUkUgICB2ZXJ0MS5yb2FkX2lkID0gcm9hZHMxLnJvYWRfaWQNCkFORCAgICAgdmVydDIucm9hZF9pZCA9IHJvYWRzMi5yb2FkX2lkDQpBTkQgICAgIGludHMuaW50X2lkID0gcm9hZHMxLmludGVyc2VjdGlvbl9mcm9tDQpBTkQgICAgIGludHMuaW50X2lkID0gcm9hZHMyLmludGVyc2VjdGlvbl9mcm9tDQpBTkQgICAgIHJvYWRzMS5vbmVfd2F5ID0gJ3RmJw0KQU5EICAgICByb2FkczIub25lX3dheSA9ICdmdCcNCkFORCAgICAgcm9hZHMxLnJvYWRfaWQgIT0gcm9hZHMyLnJvYWRfaWQ7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfbmV0X3ZlcnRfcm9hZF9pZCBPTiByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IChyb2FkX2lkKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19uZXRfbGlua19pbnRfaWQgT04gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoaW50X2lkKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19uZXRfbGlua19zcmNfdHJndCBPTiByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChzb3VyY2VfdmVydCx0YXJnZXRfdmVydCk7DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfbmV0X2xpbmtfc3JjX3JkaWQgT04gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoc291cmNlX3JvYWRfaWQpOw0KQ1JFQVRFIElOREVYIGlkeF9zYV93YXlzX25ldF9saW5rX3RndF9yZGlkIE9OIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsgKHRhcmdldF9yb2FkX2lkKTsNCkFOQUxZWkUgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluazsNCg0KLS1zZXQgc291cmNlIGFuZCB0YXJnZXQgcm9hZHMNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBzb3VyY2Vfcm9hZF9pZCA9IHNfdmVydC5yb2FkX2lkLA0KICAgICAgICB0YXJnZXRfcm9hZF9pZCA9IHRfdmVydC5yb2FkX2lkDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgc192ZXJ0LA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHRfdmVydA0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLnNvdXJjZV92ZXJ0ID0gc192ZXJ0LnZlcnRfaWQNCkFORCAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay50YXJnZXRfdmVydCA9IHRfdmVydC52ZXJ0X2lkOw0KDQotLXNvdXJjZV9yb2FkX2Rpcg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIHNvdXJjZV9yb2FkX2RpciA9IENBU0UgIFdIRU4gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay5pbnRfaWQgPSByb2FkLmludGVyc2VjdGlvbl90bw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnZnQnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgJ3RmJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuc291cmNlX3JvYWRfaWQgPSByb2FkLnJvYWRfaWQ7DQoNCi0tdGFyZ2V0X3JvYWRfZGlyDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgdGFyZ2V0X3JvYWRfZGlyID0gQ0FTRSAgV0hFTiByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLmludF9pZCA9IHJvYWQuaW50ZXJzZWN0aW9uX3RvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdmdCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAndGYnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHJvYWQNCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay50YXJnZXRfcm9hZF9pZCA9IHJvYWQucm9hZF9pZDsNCg0KLS1zZXQgYXppbXV0aHMgYW5kIHR1cm4gYW5nbGVzDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgc291cmNlX3JvYWRfYXppID0gQ0FTRSAgV0hFTiBzb3VyY2Vfcm9hZF9kaXIgPSAndGYnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gZGVncmVlcyhTVF9BemltdXRoKFNUX0xpbmVJbnRlcnBvbGF0ZVBvaW50KHJvYWRzMS5nZW9tLDAuNSksU1RfU3RhcnRQb2ludChyb2FkczEuZ2VvbSkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIGRlZ3JlZXMoU1RfQXppbXV0aChTVF9MaW5lSW50ZXJwb2xhdGVQb2ludChyb2FkczEuZ2VvbSwwLjUpLFNUX0VuZFBvaW50KHJvYWRzMS5nZW9tKSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgdGFyZ2V0X3JvYWRfYXppID0gQ0FTRSAgV0hFTiB0YXJnZXRfcm9hZF9kaXIgPSAndGYnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gZGVncmVlcyhTVF9BemltdXRoKFNUX1N0YXJ0UG9pbnQocm9hZHMyLmdlb20pLFNUX0xpbmVJbnRlcnBvbGF0ZVBvaW50KHJvYWRzMi5nZW9tLDAuNSkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIGRlZ3JlZXMoU1RfQXppbXV0aChTVF9FbmRQb2ludChyb2FkczIuZ2VvbSksU1RfTGluZUludGVycG9sYXRlUG9pbnQocm9hZHMyLmdlb20sMC41KSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczINCldIRVJFICAgc291cmNlX3JvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB0YXJnZXRfcm9hZF9pZCA9IHJvYWRzMi5yb2FkX2lkOw0KDQpVUERBVEUgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICB0dXJuX2FuZ2xlID0gKHRhcmdldF9yb2FkX2F6aSAtIHNvdXJjZV9yb2FkX2F6aSArIDM2MCkgJSAzNjA7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHNldCB0dXJuIGluZm8gLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGFzc3VtZSBjcm9zc2luZyBpcyB0cnVlIHVubGVzcyBwcm92ZW4gb3RoZXJ3aXNlDQpVUERBVEUgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayBTRVQgaW50X2Nyb3NzaW5nID0gVFJVRTsNCg0KLS0gc2V0IHJpZ2h0IHR1cm5zDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgaW50X2Nyb3NzaW5nID0gRkFMU0UNCldIRVJFICAgbGlua19pZCA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgICAgIHIubGlua19pZA0KICAgICAgICAgICAgRlJPTSAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayByDQogICAgICAgICAgICBXSEVSRSAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLnNvdXJjZV9yb2FkX2lkID0gci5zb3VyY2Vfcm9hZF9pZA0KICAgICAgICAgICAgQU5EICAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay5pbnRfaWQgPSByLmludF9pZA0KICAgICAgICAgICAgT1JERVIgQlkgICAgKHNpbihyYWRpYW5zKHIudHVybl9hbmdsZSkpPjApOjpJTlQgREVTQywNCiAgICAgICAgICAgICAgICAgICAgICAgIENBU0UgICAgV0hFTiBzaW4ocmFkaWFucyhyLnR1cm5fYW5nbGUpKT4wDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gY29zKHJhZGlhbnMoci50dXJuX2FuZ2xlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAtY29zKHJhZGlhbnMoci50dXJuX2FuZ2xlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIEFTQw0KICAgICAgICAgICAgTElNSVQgICAgICAgMQ0KKTsNCg0KLS1zZXQgbGVuZ3Rocw0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIHNvdXJjZV9yb2FkX2xlbmd0aCA9IFNUX0xlbmd0aChyb2FkczEuZ2VvbSksDQogICAgICAgIHRhcmdldF9yb2FkX2xlbmd0aCA9IFNUX0xlbmd0aChyb2FkczIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHNvdXJjZV9yb2FkX2lkID0gcm9hZHMxLnJvYWRfaWQNCkFORCAgICAgdGFyZ2V0X3JvYWRfaWQgPSByb2FkczIucm9hZF9pZDsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBzZXQgbGluayBzdHJlc3MgLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS1zb3VyY2Vfc3RyZXNzDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgc291cmNlX3N0cmVzcyA9IENBU0UgV0hFTiByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLmludF9pZCA9IHJvYWQuaW50ZXJzZWN0aW9uX3RvIFRIRU4gcm9hZC5mdF9zZWdfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHJvYWQudGZfc2VnX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZA0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLnNvdXJjZV9yb2FkX2lkID0gcm9hZC5yb2FkX2lkOw0KDQotLWludF9zdHJlc3MNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBpbnRfc3RyZXNzID0gcm9hZHMuZnRfaW50X3N0cmVzcw0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuc291cmNlX3JvYWRfaWQgPSByb2Fkcy5yb2FkX2lkDQpBTkQgICAgIHNvdXJjZV9yb2FkX2RpciA9ICdmdCc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBpbnRfc3RyZXNzID0gcm9hZHMudGZfaW50X3N0cmVzcw0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuc291cmNlX3JvYWRfaWQgPSByb2Fkcy5yb2FkX2lkDQpBTkQgICAgIHNvdXJjZV9yb2FkX2RpciA9ICd0Zic7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBpbnRfc3RyZXNzID0gMQ0KV0hFUkUgICBOT1QgaW50X2Nyb3NzaW5nOzsNCg0KLS10YXJnZXRfc3RyZXNzDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgdGFyZ2V0X3N0cmVzcyA9IENBU0UgICAgV0hFTiByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLmludF9pZCA9IHJvYWQuaW50ZXJzZWN0aW9uX3RvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIHJvYWQudGZfc2VnX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHJvYWQuZnRfc2VnX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsudGFyZ2V0X3JvYWRfaWQgPSByb2FkLnJvYWRfaWQ7DQoNCi0tbGlua19zdHJlc3MNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBsaW5rX3N0cmVzcyA9IEdSRUFURVNUKHNvdXJjZV9zdHJlc3MsaW50X3N0cmVzcyx0YXJnZXRfc3RyZXNzKTsNCg0KLS0tLS0tLS0tLS0tLS0NCi0tIHNldCBjb3N0IC0tDQotLS0tLS0tLS0tLS0tLQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIGxpbmtfY29zdCA9IFJPVU5EKChzb3VyY2Vfcm9hZF9sZW5ndGggKyB0YXJnZXRfcm9hZF9sZW5ndGgpIC8gMik7DQoNCi0tIFJlbWFyazogd2hhdCBpcyB2ZXJ0X2Nvc3QgY3JlYXRlZCBhcyBhIGNvbHVtbiBvbiB0aGUgdmVydGljZXMgaWYgaXQgaXMgbm90IGdvaW5nIHRvIGJlIHVzZWQ/DQoNClNFTEVDVCAqIEZST00gcmVjZWl2ZWQuc2Ffd2F5cyBMSU1JVCAwOw0KYGBgDQoNCiMjIyA4LiBHZW5lcmF0ZSBwb3B1bGF0aW9uIGdyaWQNCg0KU28sIHRoaXMgaXMgb25lIG9mIHRoZSBtYWluIGRpZmZlcmVuY2VzIHJlZ2FyZGluZyB0aGUgUGZCIGFwcHJvYWNoIGFuZCBtaW5lLiBJbnN0ZWFkIG9mIHVzaW5nIFVTIGNlbnN1cyBibG9ja3MgSSB1c2VkIGEgcG9wdWxhdGlvbiBncmlkIG9mIDEga21eMl4gZm9yIHRoZSBlbnRpcmUgRXVyb3BlYW4gdGVycml0b3J5LiBTaW5jZSBpdHMgYXJlYSBpcyBxdWl0ZSBiaWcsIEkgY3JlYXRlZCBhIHN1YmRpdmlzaW9uIGNvZGUgdG8gc3BsaXQgdGhlIGRhdGEsIGNvbnNpZGVyaW5nIHBhcnRpYWwgcG9wdWxhdGlvbnMgZm9yIGVhY2ggbmV3IGNlbGwgZGVwZW5kaW5nIG9uIHRoZSBtb3RoZXIgY2VsbC4gVG8gZG8gdGhpcyBJIGZvbGxvd2VkIHR3byBzdGVwczoNCg0KIyMjIyAtIERvd25sb2FkIGRhdGEgZnJvbSBbRVVST1NUQVRdKGh0dHBzOi8vZWMuZXVyb3BhLmV1L2V1cm9zdGF0L3dlYi9naXNjby9nZW9kYXRhL3JlZmVyZW5jZS1kYXRhL3BvcHVsYXRpb24tZGlzdHJpYnV0aW9uLWRlbW9ncmFwaHkvZ2Vvc3RhdCkgYW5kIGxvYWQgaW50byBEQg0KDQpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQ0KIyMgRG93bmxvYWQgZGF0YSBhbmQgbG9hZCB0byBQb3N0Z3JlU1FMDQppZiAoIWRiRXhpc3RzVGFibGUoY29ubmVjdGlvbiwgYygicmVjZWl2ZWQiLCJnZW9zdGF0IikpKXsNCiAgDQogICMgQ1JFQVRFIEEgTkVXIFRFTVBPUkFMIERJUkVDVE9SWSBUTyBET1dOTE9BRCBUSEUgSU5GTw0KICBjZCA8LSBnZXR3ZCgpDQogIGlmZWxzZSgNCiAgICAhZmlsZS5leGlzdHMoZmlsZS5wYXRoKGNkLCd0ZW1wJykpLA0KICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKGNkLCd0ZW1wJykpLCANCiAgICAiRGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIg0KICApDQogIA0KICAjIEVTVEFCTElTSCBUSEUgTkFNRSBPRiBUSEUgRklMRSBXSEVSRSBUSEUgR0VPU1RBVCBEQVRBIFdJTEwgQkUgRE9XTkxPQURFRCBBTkQgVU5aSVBQRUQNCiAgZ2Vvc3RhdF9maWxlIDwtIGZpbGUucGF0aChjZCwndGVtcCcsJ2dlb3N0YXQuemlwJykNCiAgZ2Vvc3RhdF9leGRpciA8LSBmaWxlLnBhdGgoY2QsInRlbXAiLCJnZW9zdGF0IikNCiAgDQogIGlmICghZmlsZS5leGlzdHMoZ2Vvc3RhdF9leGRpcikpew0KICAgICMgREVGSU5FIFRIRSBVUkwgRlJPTSBXSEVSRSBUSEUgREFUQSBDT01FUw0KICANCiAgICBnZW9zdGF0X3VybCA8LSANCiAgICAgICJodHRwczovL2VjLmV1cm9wYS5ldS9ldXJvc3RhdC9jYWNoZS9HSVNDTy9nZW9kYXRhZmlsZXMvR0VPU1RBVC1ncmlkLVBPUC0xSy0yMDExLVYyLTAtMS56aXAiDQogICAgDQogICAgIyBET1dOTE9BRCBUSEUgRklMRSwgVU5aSVAgSVQgQU5EIERFTEVURSAuWklQDQogICAgDQogICAgbGlicmFyeSh1dGlscykNCiAgICBkb3dubG9hZC5maWxlKHVybCA9IGdlb3N0YXRfdXJsLCBkZXN0ZmlsZSA9IGdlb3N0YXRfZmlsZSkNCiAgICB1bnppcChnZW9zdGF0X2ZpbGUsIGV4ZGlyID0gZ2Vvc3RhdF9leGRpcikNCiAgICBmaWxlLnJlbW92ZShnZW9zdGF0X2ZpbGUpDQogIH0NCiAgDQogICMgQ0FMTCBEQVRBIElOVE8gUiBBTkQgUkVQUk9KRUNUDQogIGxpYnJhcnkoc2YpDQogIA0KICB0YWJsZV9wYXRoIDwtIGZpbGUucGF0aCgNCiAgICBnZW9zdGF0X2V4ZGlyLA0KICAgICJWZXJzaW9uIDJfMF8xL0dFT1NUQVRfZ3JpZF9QT1BfMUtfMjAxMV9WMl8wXzEuY3N2Ig0KICApDQogIA0KICBncmlkX3BhdGggPC0gZmlsZS5wYXRoKA0KICAgIGdlb3N0YXRfZXhkaXIsDQogICAgIlZlcnNpb24gMl8wXzEvR0VPU1RBVFJlZmVyZW5jZUdyaWQvR3JpZF9FVFJTODlfTEFFQV8xSy1yZWZfR0VPU1RBVF9QT1BfMjAxMV9WMl8wXzEuc2hwIg0KICApDQogIA0KICBwb3BfdGFibGUgPC0gc3RfcmVhZCh0YWJsZV9wYXRoKQ0KICBuYW1lcyhwb3BfdGFibGUpIDwtIHBvcF90YWJsZSAlPiUgbmFtZXMoKSAlPiUgdG9sb3dlcigpDQogIA0KICBwb3BfZ3JpZCA8LSBzdF9yZWFkKGdyaWRfcGF0aCkNCiAgcG9wX2dyaWRfdCA8LSBwb3BfZ3JpZCAlPiUgc3RfdHJhbnNmb3JtKGNycyA9IHNhX2NycykNCiAgbmFtZXMocG9wX2dyaWRfdCkgPC0gcG9wX2dyaWRfdCAlPiUgbmFtZXMoKSAlPiUgdG9sb3dlcigpDQogIA0KICAjIExPQUQgVE8gUE9TVEdSRVNRTA0KICBsaWJyYXJ5KHNxbGRmKQ0KICBzcWxkZigNCiAgICAiDQogIERST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnBvcF9ncmlkOw0KICBEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5wb3BfdGFibGU7DQogICAgIiwNCiAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24NCiAgKQ0KICANCiAgZGJXcml0ZVRhYmxlKA0KICAgIGNvbm4gPSBjb25uZWN0aW9uLA0KICAgIG5hbWUgPSBjKCJyZWNlaXZlZCIsInBvcF9ncmlkIiksDQogICAgdmFsdWUgPSBwb3BfZ3JpZF90DQogICkNCiAgDQogIGRiV3JpdGVUYWJsZSgNCiAgICBjb25uID0gY29ubmVjdGlvbiwNCiAgICBuYW1lID0gYygicmVjZWl2ZWQiLCJwb3BfdGFibGUiKSwNCiAgICB2YWx1ZSA9IHBvcF90YWJsZQ0KICApDQogIA0KICAjIyMjIEpvaW4gdGFibGVzIG9uIGRhdGEgYmFzZSBhbmQgZXh0cmFjdCBzdHVkeSBhcmVhDQogIA0KICBzcWxkZigNCiAgICAiDQotLSBDcmVhdGUgam9pbiBiZXR3ZWVuIC5jc3YgYW5kIC5zaHANCg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuZ2Vvc3RhdDsNCkRST1AgSU5ERVggSUYgRVhJU1RTIHJlY2VpdmVkLmdlb3N0YXRfZ2VvbV9pZHg7DQoNCkNSRUFURSBUQUJMRSByZWNlaXZlZC5nZW9zdGF0IEFTDQogU0VMRUNUIGdyaWQuZ3JkX2lkLCBncmlkLmdlb21ldHJ5LCB0YWIudG90X3AsIHRhYi5jbnRyX2NvZGUsIHRhYi55ZWFyLCB0YWIudG90X3BfY29uX2R0DQogICAgRlJPTSByZWNlaXZlZC5wb3BfZ3JpZCBncmlkLCByZWNlaXZlZC5wb3BfdGFibGUgdGFiDQogICAgV0hFUkUgZ3JpZC5ncmRfaWQgPSB0YWIuZ3JkX2lkOw0KDQpDUkVBVEUgSU5ERVggZ2Vvc3RhdF9nZW9tX2lkeA0KICBPTiByZWNlaXZlZC5nZW9zdGF0DQogIFVTSU5HIGdpc3QNCiAgKGdlb21ldHJ5KTsNCiAgDQpEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5wb3BfZ3JpZDsNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnBvcF90YWJsZTsNCiAgICAiLA0KICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uDQogICkNCn0gZWxzZSB7DQogICJHRU9TVEFUIGRhdGEgYWxyZWFkeSBsb2FkZWQgdG8gZGF0YWJhc2UuIg0KfQ0KYGBgDQoNCiMjIyMgLSBHZW5lcmF0ZSBzdWJkaXZpc2lvbiB3aXRoIGEgZ3JpZCwgYWRkaW5nIHBhcnRpYWwgcG9wdWxhdGlvbiBhbmQgdW5pcXVlIElEDQoNCmBgYHtyLCB3YXJuaW5nID0gRkFMU0V9DQpzcWxkZjo6c3FsZGYoDQogICINCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2dlb3N0YXQ7DQpEUk9QIElOREVYIElGIEVYSVNUUyByZWNlaXZlZC5zYV9nZW9zdGF0X2dlb21faWR4Ow0KDQotLSBFeHRyYWN0IHRoZSBncmlkcyBjb25jZXJuaW5nIG9ubHkgdGhlIHN0dWR5IGFyZWENCg0KQ1JFQVRFIFRBQkxFIHJlY2VpdmVkLnNhX2dlb3N0YXQgQVMNCglTRUxFQ1QgCURJU1RJTkNUIGdlby5ncmRfaWQsIA0KCQkJQ0FTVChnZW8udG90X3AgQVMgSU5URUdFUiksIA0KCQkJZ2VvLmNudHJfY29kZSwgDQoJCQlnZW8uZ2VvbWV0cnkNCglGUk9NIHJlY2VpdmVkLmdlb3N0YXQgZ2VvLCByZWNlaXZlZC5zYV93YXlzIHcNCiAJV0hFUkUgU1RfSW50ZXJzZWN0cyhnZW8uZ2VvbWV0cnksIHcuZ2VvbSk7DQoNCkNSRUFURSBJTkRFWCBzYV9nZW9zdGF0X2dlb21faWR4DQogIE9OIHJlY2VpdmVkLnNhX2dlb3N0YXQNCiAgVVNJTkcgZ2lzdA0KICAoZ2VvbWV0cnkpOyAgDQogICIsDQogIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uIA0KKQ0KDQojIyBFc3RhYmxpc2ggYSBmdW5jdGlvbiB0byBjcmVhdGUgZ3JpZCB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2Ygc3ViZGl2aXNpb25zLCBkZWZhdWx0cyB0byA5DQoNCmdyaWQgPC0gZnVuY3Rpb24ocyA9IDkpew0KICAjIyBDYWxsIGl0IGFzIGFuIHNmIG9iamVjdCBhbmQgdGhlbiB0cmFuc2Zvcm0gaXQgdG8gQ1JTOjMwMzUgdG8gY3JlYXRlIGdyaWQNCiAgbGlicmFyeShzZikNCiAgbGlicmFyeShkcGx5ciwgcXVpZXRseSA9IFRSVUUpDQogIA0KICBzYV9wb3BfMWttMiA8LSBzdF9yZWFkKA0KICAgIGRzbiA9IGNvbm5lY3Rpb24sDQogICAgbGF5ZXIgPSBjKCJyZWNlaXZlZCIsICJzYV9nZW9zdGF0IikNCiAgKSAlPiUgDQogICAgc3RfdHJhbnNmb3JtKGNycyA9IDMwMzUpDQogIA0KICAjIyBEZXRlcm1pbmUgbnVtYmVyIG9mIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNlbGxzDQogIGggPC0gYXMuaW50ZWdlcihhcy5udW1lcmljKGRpZmYoc3RfYmJveChzYV9wb3BfMWttMilbYygxLCAzKV0pKS8xMDAwKQ0KICB2IDwtIGFzLmludGVnZXIoYXMubnVtZXJpYyhkaWZmKHN0X2Jib3goc2FfcG9wXzFrbTIpW2MoMiwgNCldKSkvMTAwMCkNCiAgDQogICMjIE1ha2UgZ3JpZA0KICBncmlkIDwtIHNhX3BvcF8xa20yICU+JSANCiAgICBzdF9tYWtlX2dyaWQobj1jKGgqc3FydChzKSx2KnNxcnQocykpLCB3aGF0ID0gInBvbHlnb25zIikgJT4lDQogICAgc3Rfc2YoKSAlPiUgDQogICAgbXV0YXRlKGlkID0gMTpuKCkpICU+JSANCiAgICBzdF9pbnRlcnNlY3Rpb24oc2FfcG9wXzFrbTIpDQogIA0KICAjIyBGaWx0ZXIgZ3JpZCBieSBhcmVhIG9mIGludGVyc2VjdGlvbiBiZWNhdXNlIHRoZXJlIGFyZSBzbWFsbCBwb2x5Z29ucyBjcmVhdGVkLg0KICANCiAgZ3JpZCRhcmVhIDwtIGdyaWQgJT4lIHN0X2dlb21ldHJ5KCkgJT4lIHN0X2FyZWEoKSAlPiUgYXMubnVtZXJpYygpDQogIA0KICBncmlkIDwtIGdyaWQgJT4lIGZpbHRlcihhcmVhID4gMSkNCiAgDQogIGdyaWQkYXJlYSA8LSBOVUxMDQogIA0KICBncmlkIDwtIHdpdGhpbihncmlkLCBjZWxsX2lkIDwtIHBhc3RlKGdyZF9pZCwiQyIsaWQsIHNlcCA9ICIiKSkNCiAgDQogIGdyaWQkaWQgPC0gTlVMTA0KICANCiAgZ3JpZCRwYXJ0aWFsX3AgPC0gZ3JpZCR0b3RfcC9zDQogIA0KICBncmlkICU+JSBzdF90cmFuc2Zvcm0oY3JzID0gc2FfY3JzKQ0KfQ0KDQpzYV9ncmlkIDwtIGdyaWQocyA9IHN1YmRpdmlzaW9ucykgIyBBbHdheXMgY29uc2lkZXIgYSBzcXVhcmVkIG51bWJlciB0byBtYWtlIGFuIGV2ZW4gZGl2aXNpb24NCg0Kc3FsZGY6OnNxbGRmKA0KICAiRFJPUCBUQUJMRSBJRiBFWElTVFMgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIiwNCiAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24NCikNCg0KIyMgTG9hZCBkYXRhIGludG8gZGF0YSBiYXNlDQpSUG9zdGdyZVNRTDo6ZGJXcml0ZVRhYmxlKA0KICBjb25uID0gY29ubmVjdGlvbiwNCiAgbmFtZSA9IGMoImdlbmVyYXRlZCIsInNhX3BvcF9ncmlkIiksDQogIHZhbHVlID0gc2FfZ3JpZA0KKQ0KYGBgDQoNCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0PSA4LCAgZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRX0NCmxpYnJhcnkodG1hcCkNCnRtYXBfbW9kZSgidmlldyIpDQpxdG0oDQogIHNocCA9IHNhX2dyaWQsIA0KICBmaWxsID0gTlVMTCwgDQogIGJvcmRlcnMgPSAicmVkIiwgDQogIGJhc2VtYXBzID0gIk9wZW5TdHJlZXRNYXAiDQopDQpgYGANCg0KUGxvdHRpbmcgdGhlIGdyaWQgb24gdGhpcyBzdGVwIGNhbiBhbGxvdyB0aGUgYW5hbHlzdCBkZWNpZGUgb24gYSBiZXR0ZXIgbnVtYmVyIG9mIHN1YmRpdmlzaW9ucywgZGVwZW5kaW5nIG9uIHRoZSBzdHVkeSBhcmVhLiBJIGhvcGUgdG8gYXV0b21hdGl6ZSB0aGlzIG9uIGEgbGF0ZXIgZWZmb3J0LiANCg0KIyMjIyAtIFByZXBhcmUgdGhlIHBvcHVsYXRpb24gZ3JpZCB0YWJsZQ0KDQpUaGlzIHN0ZXAgaXMgb25seSBnZW5lcmF0aW5nIG5ldyBjb2x1bW5zIG9uIG15IG5ldyBQb3B1bGF0aW9uIEdyaWQgdGFibGUuIEl0IGZvbGxvd3MgdGhlIHNhbWUgbG9naWMgYXMgdGhlIFBmQiBhbmQgdGhlcmVmb3JlIHdvbid0IGJlIGluY2x1ZGVkIG9uIHRoaXMgZG9jdW1lbnQgZXhwbGljaXRseS4gDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgcm9hZF9pZHM7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBvcF9sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwb3BfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBvcF9zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgZW1wX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGVtcF9oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgZW1wX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBzY2hvb2xzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHNjaG9vbHNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHNjaG9vbHNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHVuaXZlcnNpdGllc19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyB1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHVuaXZlcnNpdGllc19zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgY29sbGVnZXNfbG93X3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgY29sbGVnZXNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNvbGxlZ2VzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBkb2N0b3JzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGRvY3RvcnNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGRvY3RvcnNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGRlbnRpc3RzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGRlbnRpc3RzX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBkZW50aXN0c19zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgaG9zcGl0YWxzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGhvc3BpdGFsc19oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgaG9zcGl0YWxzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwaGFybWFjaWVzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBoYXJtYWNpZXNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHJldGFpbF9sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyByZXRhaWxfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHJldGFpbF9zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgc3VwZXJtYXJrZXRzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHN1cGVybWFya2V0c19oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgc3VwZXJtYXJrZXRzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBzb2NpYWxfc2VydmljZXNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBhcmtzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHBhcmtzX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwYXJrc19zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdHJhaWxzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRyYWlsc19oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdHJhaWxzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgY29tbXVuaXR5X2NlbnRlcnNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRyYW5zaXRfbG93X3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdHJhbnNpdF9oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdHJhbnNpdF9zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgb3ZlcmFsbF9zY29yZTsNCg0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcm9hZF9pZHMgSU5URUdFUltdOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcG9wX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcG9wX2hpZ2hfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHBvcF9zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGVtcF9sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGVtcF9oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBlbXBfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzY2hvb2xzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gc2Nob29sc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzY2hvb2xzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gdW5pdmVyc2l0aWVzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHVuaXZlcnNpdGllc19zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGNvbGxlZ2VzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gY29sbGVnZXNfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gY29sbGVnZXNfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBkb2N0b3JzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gZG9jdG9yc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBkb2N0b3JzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gZGVudGlzdHNfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBkZW50aXN0c19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBkZW50aXN0c19zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGhvc3BpdGFsc19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGhvc3BpdGFsc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBob3NwaXRhbHNfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBwaGFybWFjaWVzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBwaGFybWFjaWVzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcmV0YWlsX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcmV0YWlsX2hpZ2hfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHJldGFpbF9zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHN1cGVybWFya2V0c19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzdXBlcm1hcmtldHNfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gc29jaWFsX3NlcnZpY2VzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcGFya3NfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBwYXJrc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBwYXJrc19zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHRyYWlsc19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHRyYWlsc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiB0cmFpbHNfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGNvbW11bml0eV9jZW50ZXJzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gdHJhbnNpdF9sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHRyYW5zaXRfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gdHJhbnNpdF9zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIG92ZXJhbGxfc2NvcmUgRkxPQVQ7DQoNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCnNxbGRmKA0KICAiDQotLSBpbmRleGVzDQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfc2FfcG9wX2dyaWRfY2VsbF9pZCBPTiBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgKGNlbGxfaWQpOw0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX3BvcF9ncmlkX2dlb20gT04gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFVTSU5HIEdJU1QgKGdlb21ldHJ5KTsNCkFOQUxZWkUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KICAiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KYGBgDQoNCmBgYHtzcWwgYWRkX3JvYWRfaWRzLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFLCBvdXRwdXQudmFyID0gIm91dHB1dCJ9DQoNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdG1wX2dlb21fYnVmZmVyOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gdG1wX2dlb21fYnVmZmVyIGdlb21ldHJ5KG11bHRpcG9seWdvbiwgP3NhX2Nycyk7DQoNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHRtcF9nZW9tX2J1ZmZlciA9IFNUX011bHRpKFNUX0J1ZmZlcihnZW9tZXRyeSw1KSk7DQpDUkVBVEUgSU5ERVggdHNpZHhfc2FfcG9wX2dyaWRfY2VsbGlkYnVmZmdlb21zIE9OIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBVU0lORyBHSVNUICh0bXBfZ2VvbV9idWZmZXIpOw0KQU5BTFlaRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgKHRtcF9nZW9tX2J1ZmZlcik7DQoNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHJvYWRfaWRzID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICB3YXlzLnJvYWRfaWQNCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3YXlzDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLnRtcF9nZW9tX2J1ZmZlcix3YXlzLmdlb20pDQogICAgICAgICAgICBBTkQgICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNUX0NvbnRhaW5zKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC50bXBfZ2VvbV9idWZmZXIsd2F5cy5nZW9tKQ0KICAgICAgICAgICAgICAgICAgICBPUiAgU1RfTGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUX0ludGVyc2VjdGlvbihnZW5lcmF0ZWQuc2FfcG9wX2dyaWQudG1wX2dlb21fYnVmZmVyLHdheXMuZ2VvbSkNCiAgICAgICAgICAgICAgICAgICAgICAgICkgPiAxMA0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkpOw0KDQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRtcF9nZW9tX2J1ZmZlcjsNCg0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0Kc3FsZGYoDQogICINCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggYWlkeF9zYV9wb3BfZ3JpZF9yb2FkX2lkcyBPTiBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgVVNJTkcgR0lOIChyb2FkX2lkcyk7DQpBTkFMWVpFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCAocm9hZF9pZHMpOw0KICAiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KYGBgDQoNCiMjIyA5LiBSZWFjaGFibGUgcm9hZHMgc2NyaXB0cw0KDQpUaGlzIGlzIHRoZSBjb3JlIG9mIHRoZSB3aG9sZSBCTkEgYW5hbHlzaXMsIHdoZXJlIHRoZSBhY3R1YWwgbmV0d29yayBhbmFseXNpcyBpcyBwZXJmb3JtZWQuIFRoaXMgc3RlcCBtaWdodCB0YWtlIHNvbWUgY29tcHV0YXRpb24gdGltZS4gSXQgaXMgYWdhaW4gdGhlIHNhbWUgYXMgUGZCLCBhbmQgY2FuIGJlIHJldmlld2VkIHdpdGggbW9yZSBkZXRhaWwgb24gdGhlICpSbWQqIGZpbGUuIEl0IGJhc2ljYWxseSB1c2VzICpwZ3JvdXRpbmcqLCB0aGVyZWZvcmUgdGhlIERpamtzdHJhIGFsZ29yaXRobSB0byBjb21wdXRlIHRoZSAqKmRyaXZpbmcgZGlzdGFuY2UqKiBjb25zaWRlcmluZyB0aGUgY29uZmlndXJhdGlvbiBlc3RhYmxpc2hlZCBvbiBzdGVwIDcuIEl0IGRvZXMgaXQgZm9yIHRoZSB0d28gbGV2ZWxzIG9mIHRyYWZmaWMgc3RyZXNzOg0KDQojIyMjIyA+IEhpZ2ggc3RyZXNzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3M7DQoNCkNSRUFURSBUQUJMRSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2hpZ2hfc3RyZXNzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgYmFzZV9yb2FkIElOVCwNCiAgICB0YXJnZXRfcm9hZCBJTlQsDQogICAgdG90YWxfY29zdCBGTE9BVA0KKTsNCg0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2hpZ2hfc3RyZXNzOw0KYGBgDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3MgKA0KICAgIGJhc2Vfcm9hZCwNCiAgICB0YXJnZXRfcm9hZCwNCiAgICB0b3RhbF9jb3N0DQopDQpTRUxFQ1QgIHIxLnJvYWRfaWQsDQogICAgICAgIHYyLnJvYWRfaWQsDQogICAgICAgIHNoZWRzLmFnZ19jb3N0DQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgcjEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdjEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdjIsDQogICAgICAgIHBncl9kcml2aW5nRGlzdGFuY2UoJw0KICAgICAgICAgICAgU0VMRUNUICBsaW5rX2lkIEFTIGlkLA0KICAgICAgICAgICAgICAgICAgICBzb3VyY2VfdmVydCBBUyBzb3VyY2UsDQogICAgICAgICAgICAgICAgICAgIHRhcmdldF92ZXJ0IEFTIHRhcmdldCwNCiAgICAgICAgICAgICAgICAgICAgbGlua19jb3N0IEFTIGNvc3QNCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaycsDQogICAgICAgICAgICB2MS52ZXJ0X2lkLA0KICAgICAgICAgICAgP2Jpa2luZ19kaXN0YW5jZSwgLS12YWx1ZSB1c2VkIGluIFBmQiBhcHByb2FjaCwgbWlnaHQgY2hhbmdlIGxhdGVyLCBpdCBpcyBpbiBtZXRlcnMgYW5kIGFzc3VtZXMgYSBtYXggMTAgbWludXRlIHRyaXAgYXQgMTBtcGgNCiAgICAgICAgICAgIGRpcmVjdGVkIDo9IHRydWUNCiAgICAgICAgKSBzaGVkcw0KLS1XSEVSRSByMS5yb2FkX2lkICUgOnRocmVhZF9udW0gPSA6dGhyZWFkX25vDQotLUFORA0KV0hFUkUNCkVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGIuZ2VvbWV0cnkscjEuZ2VvbSkNCikNCkFORCAgICAgcjEucm9hZF9pZCA9IHYxLnJvYWRfaWQNCkFORCAgICAgdjIudmVydF9pZCA9IHNoZWRzLm5vZGU7DQoNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19oaWdoX3N0cmVzczsNCmBgYA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpDUkVBVEUgVU5JUVVFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX3JjaGJscmRzaGlzdHJzc19iIE9OIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3MgKGJhc2Vfcm9hZCwgdGFyZ2V0X3JvYWQpOw0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX3JjaGJscmRzaGlzdHJzc190IE9OIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3MgKHRhcmdldF9yb2FkKTsNCg0KLS0gY2hlY2sgb24gdGhpcywgZG9lcyBub3Qgd29yayBnb29kIGJlY2F1c2U6IEtleSAoYmFzZV9yb2FkLCB0YXJnZXRfcm9hZCk9KDE3OTgsIDMxOTMpIGlzIGR1cGxpY2F0ZWQuDQpgYGANCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0KbGlicmFyeShzcWxkZikNCnNxbGRmKA0KICAiDQpWQUNVVU0gQU5BTFlaRSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2hpZ2hfc3RyZXNzOw0KICAiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KDQojIyBJIHJ1biB0aGlzIHdpdGggdGhlIGxpYnJhcnkgYmVjYXVzZSBSIGRvZXMgbm90IGFsbG93IHNxbCBjb2RlIHdpdGhvdXQgc2VsZWN0IG91dHB1dA0KIyMgQWxzbywgU1FMIGRvZXMgbm90IGFsbG93IHRvIHJ1biBhIFZBQ1VVTSBBTkFMWVpFIGFzIGEgc2VyaWVzIG9mIHF1ZXJpZXMsIHNvIGl0IGhhcyB0byBiZSBhbG9uZS4gDQpgYGANCg0KIyMjIyMgPiBMb3cgc3RyZXNzDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3M7DQoNCkNSRUFURSBUQUJMRSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3MgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBiYXNlX3JvYWQgSU5ULA0KICAgIHRhcmdldF9yb2FkIElOVCwNCiAgICB0b3RhbF9jb3N0IEZMT0FUDQopOw0KDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzczsNCmBgYA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3MgKA0KICAgIGJhc2Vfcm9hZCwNCiAgICB0YXJnZXRfcm9hZCwNCiAgICB0b3RhbF9jb3N0DQopDQpTRUxFQ1QgIHIxLnJvYWRfaWQsDQogICAgICAgIHYyLnJvYWRfaWQsDQogICAgICAgIHNoZWRzLmFnZ19jb3N0DQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgcjEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdjEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdjIsDQogICAgICAgIHBncl9kcml2aW5nRGlzdGFuY2UoJw0KICAgICAgICAgICAgU0VMRUNUICBsaW5rX2lkIEFTIGlkLA0KICAgICAgICAgICAgICAgICAgICBzb3VyY2VfdmVydCBBUyBzb3VyY2UsDQogICAgICAgICAgICAgICAgICAgIHRhcmdldF92ZXJ0IEFTIHRhcmdldCwNCiAgICAgICAgICAgICAgICAgICAgbGlua19jb3N0IEFTIGNvc3QNCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KICAgICAgICAgICAgV0hFUkUgICBsaW5rX3N0cmVzcyA9IDEnLA0KICAgICAgICAgICAgdjEudmVydF9pZCwNCiAgICAgICAgICAgID9iaWtpbmdfZGlzdGFuY2UsDQogICAgICAgICAgICBkaXJlY3RlZCA6PSB0cnVlDQogICAgICAgICkgc2hlZHMNCi0tV0hFUkUgcjEucm9hZF9pZCAlIDp0aHJlYWRfbnVtID0gOnRocmVhZF9ubw0KLS1BTkQNCldIRVJFDQpFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhiLmdlb21ldHJ5LHIxLmdlb20pDQopDQpBTkQgICAgIHIxLnJvYWRfaWQgPSB2MS5yb2FkX2lkDQpBTkQgICAgIHYyLnZlcnRfaWQgPSBzaGVkcy5ub2RlOw0KDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzczsNCmBgYA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfc2FfcmNoYmxyZHNsb3dzdHJzc19iIE9OIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzcyAoYmFzZV9yb2FkKTsNCkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9zYV9yY2hibHJkc2xvd3N0cnNzX3QgT04gZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzICh0YXJnZXRfcm9hZCk7DQoNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzOw0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCmxpYnJhcnkoc3FsZGYpDQpzcWxkZigNCiAgIg0KVkFDVVVNIEFOQUxZWkUgZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzIChiYXNlX3JvYWQsdGFyZ2V0X3JvYWQpOw0KICAiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KDQojIyBJIHJ1biB0aGlzIHdpdGggdGhlIGxpYnJhcnkgYmVjYXVzZSBSIGRvZXMgbm90IGFsbG93IHNxbCBjb2RlIHdpdGhvdXQgc2VsZWN0IG91dHB1dA0KIyMgQWxzbywgU1FMIGRvZXMgbm90IGFsbG93IHRvIHJ1biBhIFZBQ1VVTSBBTkFMWVpFIGFzIGEgc2VyaWVzIG9mIHF1ZXJpZXMsIHNvIGl0IGhhcyB0byBiZSBhbG9uZS4gDQpgYGANCg0KIyMjIDEwLiBFc3RhYmxpc2ggY29ubmVjdGVkIHBvcHVsYXRpb24gZ3JpZHMgYW5kIGNvbXB1dGUgdGhlaXIgYWNjZXNzaWJpbGl0eQ0KDQpPbiB0aGlzIHN0ZXAgYmFzaWNhbGx5IGZvdXIgcHJvY2VkdXJlcyB0YWtlIHBsYWNlOg0KDQojIyMjIC0gQ29ubmVjdCBwb3B1bGF0aW9uIGdyaWRzDQoNCldoZXJlIGEgbmV3IHRhYmxlIGBzYV9jb25uZWN0ZWRfcG9wX2dyaWRgIGlzIGNyZWF0ZWQgdG8gc3VtbWFyaXplIHRoZSBjb25uZWN0ZWQgY2VsbHMgYnkgZXN0YWJsaXNoaW5nIHRoZW0gYXMgc291cmNlIGFuZCB0YXJnZXQsIGluY2x1ZGluZyBpZiB0aGV5IGFyZSBjb25uZWN0ZWQgYnkgdGhlIGxvdyBvciBoaWdoIHN0cmVzcyBuZXR3b3JrLCBhbmQgb2J0YWluaW5nIHRoZSBtaW5pbXVtIHRoZSBjb3N0cyBiZXR3ZWVuIGNlbGxzLiANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NCg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZDsNCg0KQ1JFQVRFIFRBQkxFIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBzb3VyY2VfY2VsbGlkIFZBUkNIQVIoMTgpLA0KICAgIHRhcmdldF9jZWxsaWQgVkFSQ0hBUigxOCksDQogICAgbG93X3N0cmVzcyBCT09MRUFOLA0KICAgIGxvd19zdHJlc3NfY29zdCBJTlQsDQogICAgaGlnaF9zdHJlc3MgQk9PTEVBTiwNCiAgICBoaWdoX3N0cmVzc19jb3N0IElOVA0KKTsNCg0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCAoDQogICAgc291cmNlX2NlbGxpZCwgdGFyZ2V0X2NlbGxpZCwNCiAgICBsb3dfc3RyZXNzLCBsb3dfc3RyZXNzX2Nvc3QsIGhpZ2hfc3RyZXNzLCBoaWdoX3N0cmVzc19jb3N0DQopDQpTRUxFQ1QgIHNvdXJjZS5jZWxsX2lkLA0KICAgICAgICB0YXJnZXQuY2VsbF9pZCwNCiAgICAgICAgRkFMU0UsDQogICAgICAgICgNCiAgICAgICAgICAgIFNFTEVDVCAgTUlOKGxzLnRvdGFsX2Nvc3QpDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzcyBscw0KICAgICAgICAgICAgV0hFUkUgICBscy5iYXNlX3JvYWQgPSBBTlkoc291cmNlLnJvYWRfaWRzKQ0KICAgICAgICAgICAgQU5EICAgICBscy50YXJnZXRfcm9hZCA9IEFOWSh0YXJnZXQucm9hZF9pZHMpDQogICAgICAgICksDQogICAgICAgIFRSVUUsDQogICAgICAgICgNCiAgICAgICAgICAgIFNFTEVDVCAgTUlOKGhzLnRvdGFsX2Nvc3QpDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzcyBocyAtLVRoZXkgdGFrZSBpdCBmcm9tIHRoZSBsb3cgc3RyZXNzIGJlY2F1c2UgdGhlc2Ugcm9hZHMgY2FuIGFsc28gYmUgYWNjZXNzZWQgYnkgY2Fycy4gRG9pbmcgaXQgd2l0aCBoaWdoIHN0cmVzcyB0YWtlcyBhIGxvdCBvZiB0aW1lIGJlY2F1c2UgdGhleSBhcmUgbGlrZSAyIG1pbGxpb24gcmVjb3Jkcywgd2hpbGUgbG93IGFyZSAzMDAgdGhvdXNhbmQuIFRoaXMgaXMgd2h5IHRoZXkgdXBkYXRlIGFmdGVyd2FyZHMuIA0KICAgICAgICAgICAgV0hFUkUgICBocy5iYXNlX3JvYWQgPSBBTlkoc291cmNlLnJvYWRfaWRzKQ0KICAgICAgICAgICAgQU5EICAgICBocy50YXJnZXRfcm9hZCA9IEFOWSh0YXJnZXQucm9hZF9pZHMpDQogICAgICAgICkNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIHNvdXJjZSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIHRhcmdldCwNCiAgICAgICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkNCldIRVJFICAgU1RfSW50ZXJzZWN0cyhzb3VyY2UuZ2VvbWV0cnkscmVjZWl2ZWQuc2FfYm91bmRhcnkuZ2VvbWV0cnkpDQpBTkQgICAgIFNUX0RXaXRoaW4oc291cmNlLmdlb21ldHJ5LHRhcmdldC5nZW9tZXRyeSw/YmlraW5nX2Rpc3RhbmNlKTsNCg0KLS0gc2V0IGxvd19zdHJlc3MNClVQREFURSAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KU0VUICAgICBsb3dfc3RyZXNzID0gVFJVRQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBzb3VyY2UsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCB0YXJnZXQNCiAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gc291cmNlLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gdGFyZ2V0LmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgc291cmNlLnJvYWRfaWRzICYmIHRhcmdldC5yb2FkX2lkcw0KICAgICAgICApDQpPUiAgICAgICgNCiAgICAgICAgICAgIGxvd19zdHJlc3NfY29zdCBJUyBOT1QgTlVMTA0KICAgICAgICBBTkQgQ0FTRSAgICBXSEVOIENPQUxFU0NFKGhpZ2hfc3RyZXNzX2Nvc3QsMCkgPSAwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICBFTFNFIGxvd19zdHJlc3NfY29zdDo6RkxPQVQgLyBoaWdoX3N0cmVzc19jb3N0IDw9IDEuMjUNCiAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICk7DQogICAgICAgIA0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9DQpsaWJyYXJ5KHNxbGRmKQ0Kc3FsZGYoDQogICINCi0tIGluZGV4ZXMNCkNSRUFURSBVTklRVUUgSU5ERVggaWR4X3NhX2NlbGxwYWlycyBPTiBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIChzb3VyY2VfY2VsbGlkLHRhcmdldF9jZWxsaWQpOw0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX2NlbGxwYWlyc19sc3RyZXNzIE9OIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgKGxvd19zdHJlc3MpIFdIRVJFIGxvd19zdHJlc3MgSVMgVFJVRTsNCkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9zYV9jZWxscGFpcnNfaHN0cmVzcyBPTiBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIChoaWdoX3N0cmVzcykgV0hFUkUgaGlnaF9zdHJlc3MgSVMgVFJVRTsNCkFOQUxZWkUgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZDsNCiAgIiwNCiAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24NCikNCiMjIEkgcnVuIHRoaXMgd2l0aCB0aGUgbGlicmFyeSBiZWNhdXNlIFIgZG9lcyBub3QgYWxsb3cgc3FsIGNvZGUgd2l0aG91dCBzZWxlY3Qgb3V0cHV0DQojIyBBbHNvLCBTUUwgZG9lcyBub3QgYWxsb3cgdG8gcnVuIGEgVkFDVVVNIEFOQUxZWkUgYXMgYSBzZXJpZXMgb2YgcXVlcmllcywgc28gaXQgaGFzIHRvIGJlIGFsb25lLiANCmBgYA0KDQojIyMjIC0gQ29tcHV0ZSBwb3B1bGF0aW9uIGFjY2Vzcw0KDQpUaGUgYWNjZXNzIGNvbXB1dGF0aW9uIG9uIHRoaXMgc3RlcCBmaWxscyB1cCB0aGUgYHNhX3BvcF9ncmlkYCB0YWJsZSBjcmVhdGVkIG9uICpzdGVwIDgqLCBhY2NvcmRpbmcgdG8gdGhlIFtQZkIgbWV0aG9kb2xvZ3ldKGh0dHBzOi8vYm5hLnBlb3BsZWZvcmJpa2VzLm9yZy8jL21ldGhvZG9sb2d5KS4NCg0KVG8gY29tcHV0ZSBhY2Nlc3Mgb24gdGhpcyBhbiB0aGUgbmV4dCBzdGVwLCBhIHdlaWdodGluZyBwcm9jZWR1cmUgaXMgdXNlZCwgYXMgdGhlIG1ldGhvZG9sb2d5IG9mIFBmQiBkb2VzLCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgW2hlcmVdKGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9wZmItcHVibGljLWRvY3VtZW50cy9TY29yaW5nLmNhdGVnb3JpZXMueGxzeCkuIA0KDQpBIHF1aWNrIGdsYW5jZSBvZiB0aGUgd2VpZ2h0cyB1c2VkLCBtYWlubHkgZm9yICpzdGVwIDExKjoNCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KdGJsIDwtIGRhdGEuZnJhbWUoDQogIHNjb3JjYXQgPSBjZWxsX3NwZWMoDQogICAgYygNCiAgICAgIHJlcCgiUGVvcGxlID0gMTUiLDEpLA0KICAgICAgcmVwKCJPcHBvcnR1bml0eSA9IDIwIiw0KSwNCiAgICAgIHJlcCgiQ29yZSBTZXJ2aWNlcyA9IDIwIiw2KSwNCiAgICAgIHJlcCgiUmVjcmVhdGlvbiA9IDE1IiwzKSwNCiAgICAgIHJlcCgiUmV0YWlsID0gMTUiLDEpLA0KICAgICAgcmVwKCJUcmFuc2l0ID0gMTUiLDEpDQogICAgKQ0KICApLA0KICBtZWFzdXJlID0gY2VsbF9zcGVjKA0KICAgIGMoDQogICAgICAiUG9wdWxhdGlvbiA9IE4vQSIsDQogICAgICAiRW1wbG95bWVudCA9IDM1IiwNCiAgICAgICJLLTEyIEVkdWNhdGlvbiA9IDM1IiwNCiAgICAgICJUZWNobmljYWwvdm9jYXRpb25hbCBzY2hvb2wgPSAxMCIsDQogICAgICAiSGlnaGVyIEVkdWNhdGlvbiA9IDIwIiwNCiAgICAgICJEb2N0b3Igb2ZmaWNlcy9jbGluaWNzID0gMjAiLA0KICAgICAgIkRlbnRpc3Qgb2ZmaWNlcyA9IDEwIiwNCiAgICAgICJIb3NwaXRhbHMgPSAyMCIsDQogICAgICAiUGhhcm1hY2llcyA9IDEwIiwNCiAgICAgICJTdXBlcm1hcmtldHMgPSAyNSIsDQogICAgICAiU29jaWFsIHNlcnZpY2VzID0gMTUiLA0KICAgICAgIlBhcmtzID0gNDAiLA0KICAgICAgIlJlY3JlYXRpb25hbCB0cmFpbHMgPSAzNSIsDQogICAgICAiQ29tbXVuaXR5IGNlbnRlcnMgPSAyNSIsDQogICAgICAiUmV0YWlsIHNob3BwaW5nID0gTi9BIiwNCiAgICAgICJTdGF0aW9uL3RyYW5zaXQgY2VudGVycyA9IE4vQSINCiAgICApDQogICkNCikNCg0KY29sbmFtZXModGJsKSA8LSBjKCJTY29yaW5nIENhdGVnb3J5IiwgIk1lYXN1cmUiKQ0KDQprYWJsZSh0YmwsIGFsaWduID0gImMiLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCAiYm9yZGVyZWQiLCBmb250X3NpemUgPSAxMCwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICBjb2xsYXBzZV9yb3dzKGNvbHVtbnMgPSAxLCB2YWxpZ24gPSAidG9wIikNCmBgYA0KDQpJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoaXMgcmVwcm9kdWN0aW9uIG9mIHRoZSBCTkEgZm9yIEV1cm9wZSBkb2VzIG5vdCBpbmNsdWRlICplbXBsb3ltZW50KiBkYXRhLCBhcyB1bnRpbCBub3csIEkgaGF2ZSBub3QgbG9jYXRlZCBhIHNvdXJjZSB0byBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24gYXMgb3BlbiBkYXRhIGZvciB0aGUgd2hvbGUgRXVyb3BlLiBUaGVyZWZvcmUsIHRoZSBmaW5hbCByZXN1bHRzIHdpbGwgc2hvdyB0aGlzIGNhdGVnb3J5IGJ1dCB3aXRoIDAgb3IgTkEgdmFsdWVzLiANCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0NCiMjIEVzdGFibGlzaCB2YXJpYWJsZXMgdG8gZ2l2ZSBzY29yZXMgdG8gcG9wdWxhdGlvbiBhY2Nlc3MuIA0KbWF4X3Njb3JlID0gMQ0Kc3RlcDEgPSAwLjAzDQpzY29yZTEgPSAwLjENCnN0ZXAyID0gMC4yDQpzY29yZTIgPSAwLjQNCnN0ZXAzID0gMC41DQpzY29yZTMgPSAwLjgNCmBgYA0KDQpgYGB7c3FsIHBvcCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gbG93IHN0cmVzcyBhY2Nlc3MNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oYmxvY2tzMi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBibG9ja3MyDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBjYi5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgY2IudGFyZ2V0X2NlbGxpZCA9IGJsb2NrczIuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBjYi5sb3dfc3RyZXNzDQogICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGJsb2NrczIucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgYmxvY2tzMg0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2INCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgY2Iuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGNiLnRhcmdldF9jZWxsaWQgPSBibG9ja3MyLmNlbGxfaWQNCiAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gcG9wX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgIFdIRU4gP3N0ZXAxID0gMCBUSEVOID9tYXhfc2NvcmUgKiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgPSA/c3RlcDMgVEhFTiA/c2NvcmUzDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzID0gP3N0ZXAyIFRIRU4gP3Njb3JlMg0KICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcyA9ID9zdGVwMSBUSEVOID9zY29yZTENCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgPiA/c3RlcDMNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP3Njb3JlMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICg/bWF4X3Njb3JlIC0gP3Njb3JlMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzIC0gP3N0ZXAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoMSAtID9zdGVwMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcyA+ID9zdGVwMg0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/c2NvcmUyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKD9zY29yZTMgLSA/c2NvcmUyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgLSA/c3RlcDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICg/c3RlcDMgLSA/c3RlcDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgPiA/c3RlcDENCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP3Njb3JlMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICg/c2NvcmUyIC0gP3Njb3JlMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzIC0gP3N0ZXAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoP3N0ZXAyIC0gP3N0ZXAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgID9zY29yZTENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyA/c3RlcDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBFTkQ7DQogICAgICAgICAgICAgICAgICAgIA0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7ICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQojIyMjIC0gRXh0cmFjdCBjb21tb24gZGVzdGluYXRpb25zIA0KDQpXaGljaCB1c2VzIHRoZSBvc20gcG9seWdvbnMgYW5kIHBvaW50cyBnZW5lcmF0ZWQgYnkgYG9zbTJwZ3NxbGAuIFRoZSBkZXN0aW5hdGlvbnMgaW5jbHVkZWQgYXJlOg0KDQpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQ0KY2x1c3Rlcl9jb2xsZWdlcyA9IDEwMA0KY2x1c3Rlcl9jb21tdW5pdHlfY2VudGVycyA9IDUwDQpjbHVzdGVyX2RvY3RvcnMgPSA1MA0KY2x1c3Rlcl9kZW50aXN0cyA9IDUwDQpjbHVzdGVyX2hvc3BpdGFscyA9IDUwDQpjbHVzdGVyX3BoYXJtYWNpZXMgPSA1MA0KY2x1c3Rlcl9wYXJrcyA9IDUwDQpjbHVzdGVyX3JldGFpbCA9IDUwDQpjbHVzdGVyX3RyYW5zaXQgPSA3NQ0KY2x1c3Rlcl91bml2ZXJzaXRpZXMgPSAxNTANCmBgYA0KDQojIyMjIyA+IENvbGxlZ2VzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlczsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyAoDQogICAgaWQgU0VSSUFMIFBSSU1BUlkgS0VZLA0KICAgIGNlbGxfaWQgQ0hBUkFDVEVSIFZBUllJTkcoMTgpW10sDQogICAgb3NtX2lkIEJJR0lOVCwNCiAgICBjb2xsZWdlX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KG11bHRpcG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9jb2xsZWdlcykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSA9ICdjb2xsZWdlJzsNCg0KLS0gc2V0IHBvaW50cyBvbiBwb2x5Z29ucw0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9jb2xsZWdlc19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyAoDQogICAgb3NtX2lkLCBjb2xsZWdlX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5ID0gJ2NvbGxlZ2UnDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyBzDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMocy5nZW9tX3BvbHkscmVjZWl2ZWQuc2FfZnVsbF9wb2ludC53YXkpDQogICAgICAgICk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9jb2xsZWdlc19nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMgKGdlb21fcHQpOw0KDQotLSBzZXQgY2VsbF9pZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5nZW9tX3B0LGNiLmdlb21ldHJ5KQ0KICAgICAgICApKTsNCg0KLS0gYmxvY2sgaW5kZXgNCkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGFpZHhfZGVzdGluYXRpb25zX3NhX2NvbGxlZ2VzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyAoY2VsbF9pZCk7DQoNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzOw0KYGBgDQoNCiMjIyMjID4gQ29tbXVuaXR5IGNlbnRlcnMNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnM7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgY2VudGVyX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KG11bHRpcG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9jb21tdW5pdHlfY2VudGVycykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSBJTiAoJ2NvbW11bml0eV9jZW50cmUnLCdjb21tdW5pdHlfY2VudGVyJyk7DQoNCi0tIHNldCBwb2ludHMgb24gcG9seWdvbnMNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpTRVQgICAgIGdlb21fcHQgPSBTVF9DZW50cm9pZChnZW9tX3BvbHkpOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfY29tbXVuaXR5X2NlbnRlcnNfZ2VvbXBseSBPTiBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgKA0KICAgIG9zbV9pZCwgY2VudGVyX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5IElOICgnY29tbXVuaXR5X2NlbnRyZScsJ2NvbW11bml0eV9jZW50ZXInKQ0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfY29tbXVuaXR5X2NlbnRlcnNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX2NvbW11bml0eV9jZW50ZXJzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycyAoY2VsbF9pZCk7DQoNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzOw0KYGBgDQoNCiMjIyMjID4gRGVudGlzdHMNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIGRlbnRpc3RzX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KG11bHRpcG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9kZW50aXN0cykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSA9ICdkZW50aXN0JzsNCg0KLS0gc2V0IHBvaW50cyBvbiBwb2x5Z29ucw0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9kZW50aXN0c19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyAoDQogICAgb3NtX2lkLCBkZW50aXN0c19uYW1lLCBnZW9tX3B0DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQNCldIRVJFICAgYW1lbml0eSA9ICdkZW50aXN0Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfZGVudGlzdHNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX2RlbnRpc3RzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyAoY2VsbF9pZCk7DQoNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzOw0KDQpgYGANCg0KIyMjIyMgPiBEb2N0b3JzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgZG9jdG9yc19uYW1lIFRFWFQsDQogICAgcG9wX2xvd19zdHJlc3MgSU5ULA0KICAgIHBvcF9oaWdoX3N0cmVzcyBJTlQsDQogICAgcG9wX3Njb3JlIEZMT0FULA0KICAgIGdlb21fcHQgZ2VvbWV0cnkocG9pbnQsID9zYV9jcnMpLA0KICAgIGdlb21fcG9seSBnZW9tZXRyeShtdWx0aXBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9kb2N0b3JzKSksMyksMCkpDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbg0KV0hFUkUgICBhbWVuaXR5IElOICgnY2xpbmljJywnZG9jdG9ycycpOw0KDQotLSBzZXQgcG9pbnRzIG9uIHBvbHlnb25zDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpTRVQgICAgIGdlb21fcHQgPSBTVF9DZW50cm9pZChnZW9tX3BvbHkpOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfZG9jdG9yc19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycyAoDQogICAgb3NtX2lkLCBkb2N0b3JzX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5IElOICgnY2xpbmljJywnZG9jdG9ycycpDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX2RvY3RvcnNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RvY3RvcnMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9kb2N0b3JzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2RvY3RvcnMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2FfZG9jdG9yczsNCmBgYA0KDQojIyMjIyA+IEhvc3BpdGFscyANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFsczsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgaG9zcGl0YWxfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9ob3NwaXRhbHMpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgSU4gKCdob3NwaXRhbHMnLCdob3NwaXRhbCcpOw0KDQotLSBzZXQgcG9pbnRzIG9uIHBvbHlnb25zDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9ob3NwaXRhbHNfZ2VvbXBseSBPTiBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzIFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgKA0KICAgIG9zbV9pZCwgaG9zcGl0YWxfbmFtZSwgZ2VvbV9wdA0KKQ0KU0VMRUNUICBvc21faWQsDQogICAgICAgIG5hbWUsDQogICAgICAgIHdheQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgIGFtZW5pdHkgSU4gKCdob3NwaXRhbHMnLCdob3NwaXRhbCcpDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfaG9zcGl0YWxzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX2hvc3BpdGFsc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscyAoY2VsbF9pZCk7DQpTRUxFQ1QgKiBGUk9NIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHM7DQpgYGANCg0KIyMjIyMgPiBQYXJrcw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2FfcGFya3M7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2FfcGFya3MgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgcGFya19uYW1lIFRFWFQsDQogICAgcG9wX2xvd19zdHJlc3MgSU5ULA0KICAgIHBvcF9oaWdoX3N0cmVzcyBJTlQsDQogICAgcG9wX3Njb3JlIEZMT0FULA0KICAgIGdlb21fcHQgZ2VvbWV0cnkocG9pbnQsID9zYV9jcnMpLA0KICAgIGdlb21fcG9seSBnZW9tZXRyeShtdWx0aXBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyAoDQogICAgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIFNUX011bHRpKFNUX0J1ZmZlcihTVF9Db2xsZWN0aW9uRXh0cmFjdCh1bm5lc3QoU1RfQ2x1c3RlcldpdGhpbih3YXksP2NsdXN0ZXJfcGFya3MpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAncGFyaycNCiAgICAgICAgT1IgbGVpc3VyZSA9ICdwYXJrJw0KICAgICAgICBPUiBsZWlzdXJlID0gJ25hdHVyZV9yZXNlcnZlJw0KICAgICAgICBPUiBsZWlzdXJlID0gJ3BsYXlncm91bmQnOw0KDQotLSBzZXQgcG9pbnRzIG9uIHBvbHlnb25zDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KU0VUICAgICBnZW9tX3B0ID0gU1RfQ2VudHJvaWQoZ2VvbV9wb2x5KTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3BhcmtzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3BhcmtzIFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyAoZ2VvbV9wb2x5KTsNCg0KLS0gaW5zZXJ0IHBvaW50cw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX3BhcmtzICgNCiAgICBvc21faWQsIHBhcmtfbmFtZSwgZ2VvbV9wdA0KKQ0KU0VMRUNUICBvc21faWQsDQogICAgICAgIG5hbWUsDQogICAgICAgIHdheQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgICgNCiAgICAgICAgICAgIGFtZW5pdHkgPSAncGFyaycNCiAgICAgICAgT1IgIGxlaXN1cmUgPSAncGFyaycNCiAgICAgICAgT1IgIGxlaXN1cmUgPSAnbmF0dXJlX3Jlc2VydmUnDQogICAgICAgIE9SICBsZWlzdXJlID0gJ3BsYXlncm91bmQnDQogICAgICAgICkNCkFORCAgICAgTk9UIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3BhcmtzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3BhcmtzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfcGFya3MgVVNJTkcgR0lTVCAoZ2VvbV9wdCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5nZW9tX3BvbHksY2IuZ2VvbWV0cnkpDQogICAgICAgICAgICBPUiAgICAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BhcmtzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9wYXJrc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyBVU0lORyBHSU4gKGNlbGxfaWQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfcGFya3MgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2FfcGFya3M7DQpgYGANCg0KIyMjIyMgPiBQaGFybWFjaWVzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgcGhhcm1hY3lfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcyAoDQogICAgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIFNUX011bHRpKFNUX0J1ZmZlcihTVF9Db2xsZWN0aW9uRXh0cmFjdCh1bm5lc3QoU1RfQ2x1c3RlcldpdGhpbih3YXksP2NsdXN0ZXJfcGhhcm1hY2llcykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSA9ICdwaGFybWFjeSc7DQoNCi0tIHNldCBwb2ludHMgb24gcG9seWdvbnMNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9waGFybWFjaWVzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzICgNCiAgICBvc21faWQsIHBoYXJtYWN5X25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5ID0gJ3BoYXJtYWN5Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcyBzDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMocy5nZW9tX3BvbHkscmVjZWl2ZWQuc2FfZnVsbF9wb2ludC53YXkpDQogICAgICAgICk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9waGFybWFjaWVzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgKGdlb21fcHQpOw0KDQotLSBzZXQgY2VsbF9pZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcy5nZW9tX3B0LGNiLmdlb21ldHJ5KQ0KICAgICAgICApKTsNCg0KLS0gYmxvY2sgaW5kZXgNCkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGFpZHhfc2FfcGhhcm1hY2llc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzIChjZWxsX2lkKTsNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXM7DQpgYGANCg0KIyMjIyMgPiBSZXRhaWwNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZGVzdGluYXRpb25zLnNhX3JldGFpbDsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0DQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9yZXRhaWwpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGxhbmR1c2UgPSAncmV0YWlsJzsNCg0KLS0gc2V0IHBvaW50cyBvbiBwb2x5Z29ucw0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpTRVQgICAgIGdlb21fcHQgPSBTVF9DZW50cm9pZChnZW9tX3BvbHkpOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfcmV0YWlsX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3JldGFpbCBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsIChnZW9tX3BvbHkpOw0KDQotLSBzZXQgY2VsbF9pZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3JldGFpbC5nZW9tX3BvbHksY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9yZXRhaWxfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsOw0KYGBgDQoNCiMjIyMjID4gU2Nob29scw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2Ffc2Nob29sczsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIHNjaG9vbF9uYW1lIFRFWFQsDQogICAgcG9wX2xvd19zdHJlc3MgSU5ULA0KICAgIHBvcF9oaWdoX3N0cmVzcyBJTlQsDQogICAgcG9wX3Njb3JlIEZMT0FULA0KICAgIGdlb21fcHQgZ2VvbWV0cnkocG9pbnQsID9zYV9jcnMpLA0KICAgIGdlb21fcG9seSBnZW9tZXRyeShwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvaW50cyBmcm9tIHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scyAoDQogICAgb3NtX2lkLCBzY2hvb2xfbmFtZSwgZ2VvbV9wdCwgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgU1RfQ2VudHJvaWQod2F5KSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbg0KV0hFUkUgICBhbWVuaXR5ID0gJ3NjaG9vbCc7DQoNCi0tIHJlbW92ZSBzdWJhcmVhcyB0aGF0IGFyZSBtaXN0YWtlbmx5IGRlc2lnbmF0ZWQgYXMgYW1lbml0eT1zY2hvb2wNCkRFTEVURSBGUk9NIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9Db250YWlucyhzLmdlb21fcG9seSxkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5nZW9tX3BvbHkpDQogICAgICAgICAgICBBTkQgICAgIHMuaWQgIT0gZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuaWQNCik7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9zY2hvb2xzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzICgNCiAgICBvc21faWQsIHNjaG9vbF9uYW1lLCBnZW9tX3B0DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQNCldIRVJFICAgYW1lbml0eSA9ICdzY2hvb2wnDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3NjaG9vbHNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9zY2hvb2xzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2Ffc2Nob29sczsNCmBgYA0KDQojIyMjIyA+IFNvY2lhbCBzZXJ2aWNlcw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyAoDQogICAgaWQgU0VSSUFMIFBSSU1BUlkgS0VZLA0KICAgIGNlbGxfaWQgQ0hBUkFDVEVSIFZBUllJTkcoMTgpW10sDQogICAgb3NtX2lkIEJJR0lOVCwNCiAgICBzZXJ2aWNlX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KHBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9pbnRzIGZyb20gcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMgKA0KICAgIG9zbV9pZCwgc2VydmljZV9uYW1lLCBnZW9tX3B0LCBnZW9tX3BvbHkNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICBTVF9DZW50cm9pZCh3YXkpLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAnc29jaWFsX2ZhY2lsaXR5JzsNCg0KLS0gcmVtb3ZlIHN1YmFyZWFzIHRoYXQgYXJlIGFscmVhZHkgY292ZXJlZA0KREVMRVRFIEZST00gZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9Db250YWlucyhzLmdlb21fcG9seSxkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcG9seSkNCiAgICAgICAgICAgIEFORCAgICAgcy5pZCAhPSBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmlkDQopOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2Ffc29jaWFsX3NlcnZpY2VzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzICgNCiAgICBvc21faWQsIHNlcnZpY2VfbmFtZSwgZ2VvbV9wdA0KKQ0KU0VMRUNUICBvc21faWQsDQogICAgICAgIG5hbWUsDQogICAgICAgIHdheQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgIGFtZW5pdHkgPSAnc29jaWFsX2ZhY2lsaXR5Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3NvY2lhbF9zZXJ2aWNlc19nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9zb2NpYWxfc2VydmljZXNfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzOw0KYGBgDQoNCiMjIyMjID4gU3VwZXJtYXJrZXRzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHM7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIHN1cGVybWFya2V0X25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KHBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9pbnRzIGZyb20gcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMgKA0KICAgIG9zbV9pZCwgc3VwZXJtYXJrZXRfbmFtZSwgZ2VvbV9wdCwgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgU1RfQ2VudHJvaWQod2F5KSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbg0KV0hFUkUgICBzaG9wID0gJ3N1cGVybWFya2V0JzsNCg0KLS0gcmVtb3ZlIHN1YmFyZWFzIHRoYXQgYXJlIGFscmVhZHkgY292ZXJlZA0KREVMRVRFIEZST00gZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9Db250YWlucyhzLmdlb21fcG9seSxkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcG9seSkNCiAgICAgICAgICAgIEFORCAgICAgcy5pZCAhPSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmlkDQopOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2Ffc3VwZXJtYXJrZXRzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzICgNCiAgICBvc21faWQsIHN1cGVybWFya2V0X25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBzaG9wID0gJ3N1cGVybWFya2V0Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3N1cGVybWFya2V0c19nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9zdXBlcm1hcmtldHNfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzOw0KYGBgDQoNCiMjIyMjID4gVHJhbnNpdA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdDsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0ICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIHRyYW5zaXRfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkocG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2ludHMgZnJvbSBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX3RyYW5zaXQgKA0KICAgIG9zbV9pZCwgdHJhbnNpdF9uYW1lLCBnZW9tX3B0LCBnZW9tX3BvbHkNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICBTVF9DZW50cm9pZCh3YXkpLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAnYnVzX3N0YXRpb24nDQpPUiAgICAgIHJhaWx3YXkgPSAnc3RhdGlvbicNCk9SICAgICAgcHVibGljX3RyYW5zcG9ydCA9ICdzdGF0aW9uJzsNCg0KLS0gcmVtb3ZlIHN1YmFyZWFzDQpERUxFVEUgRlJPTSBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfQ29udGFpbnMocy5nZW9tX3BvbHksZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wb2x5KQ0KICAgICAgICAgICAgQU5EICAgICBzLmlkICE9IGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0LmlkDQopOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfdHJhbnNpdF9nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdCAoDQogICAgZ2VvbV9wdA0KKQ0KU0VMRUNUICBTVF9DZW50cm9pZChTVF9Db2xsZWN0aW9uRXh0cmFjdCh1bm5lc3QoU1RfQ2x1c3RlcldpdGhpbih3YXksP2NsdXN0ZXJfdHJhbnNpdCkpLDEpKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgICgNCiAgICAgICAgICAgIGFtZW5pdHkgPSAnYnVzX3N0YXRpb24nDQogICAgICAgIE9SICByYWlsd2F5ID0gJ3N0YXRpb24nDQogICAgICAgIE9SICBwdWJsaWNfdHJhbnNwb3J0ID0gJ3N0YXRpb24nDQogICAgICAgICkNCkFORCAgICAgTk9UIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9EV2l0aGluKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5LDUwKQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfdHJhbnNpdF9nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX3RyYW5zaXQgVVNJTkcgR0lTVCAoZ2VvbV9wdCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdC5nZW9tX3BvbHksY2IuZ2VvbWV0cnkpDQogICAgICAgICAgICBPUiAgICAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX3RyYW5zaXRfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdCBVU0lORyBHSU4gKGNlbGxfaWQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdCAoY2VsbF9pZCk7DQpTRUxFQ1QgKiBGUk9NIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0Ow0KYGBgDQoNCiMjIyMjID4gVW5pdmVyc2l0aWVzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXM7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIGNvbGxlZ2VfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl91bml2ZXJzaXRpZXMpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAndW5pdmVyc2l0eSc7DQoNCi0tIHNldCBwb2ludHMgb24gcG9seWdvbnMNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcw0KU0VUICAgICBnZW9tX3B0ID0gU1RfQ2VudHJvaWQoZ2VvbV9wb2x5KTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3VuaXZlcnNpdGllc19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcyAoZ2VvbV9wb2x5KTsNCg0KLS0gaW5zZXJ0IHBvaW50cw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcyAoDQogICAgb3NtX2lkLCBjb2xsZWdlX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5ID0gJ3VuaXZlcnNpdHknDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfdW5pdmVyc2l0aWVzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX3VuaXZlcnNpdGllc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcyAoY2VsbF9pZCk7DQpTRUxFQ1QgKiBGUk9NIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXM7DQpgYGANCg0KIyMjIyAtIENvbXB1dGUgYWNjZXNzIHRvIGNvbW1vbiBkZXN0aW5hdGlvbnMNCg0KV2hlcmUgdGhlIGFjY2VzcyB0byB0aGUgZGVzdGluYXRpb25zIGVzdGFibGlzaGVkIGJlZm9yZSBpcyBjb21wdXRlZC4gQWNjZXNzIHRvIHJlY3JlYXRpb25hbCB0cmFpbHMgYW5kIGJpa2UgcGF0aHMgaXMgYWxzbyBpbmNsdWRlZC4NCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0KDQptYXhfc2NvcmUgPSAxDQoNCiMjIFNjb3JlcyBmaXJzdCBncm91cDogY29sbGVnZXMsIGhvc3BpdGFscywgc29jaWFsIHNlcnZpY2VzLCB1bml2ZXJzaXRpZXMNCkFmaXJzdCA9IDAuNw0KQXNlY29uZCA9IDANCkF0aGlyZCA9IDANCg0KIyMgU2NvcmVzIHNlY29uZCBncm91cDogY29tbXVuaXR5IGNlbnRlcnMsIGRlbnRpc3RzLCBwaGFybWFjaWVzLCByZXRhaWwNCkJmaXJzdCA9IDAuNCANCkJzZWNvbmQgPSAwLjIgDQpCdGhpcmQgPSAwLjEgDQoNCiMjIFNjb3JlcyB0aGlyZCBncm91cDogcGFya3MsIHNjaG9vbHMNCkNmaXJzdCA9IDAuMyANCkNzZWNvbmQgPSAwLjIgDQpDdGhpcmQgPSAwLjIgDQoNCiMjIFNjb3JlcyBmb3VydGggZ3JvdXA6IHN1cGVybWFya2V0cw0KRGZpcnN0ID0gMC42IA0KRHNlY29uZCA9IDAuMiANCkR0aGlyZCA9IDANCg0KIyMgU2NvcmVzIGZpZnRoIGdyb3VwOiB0cmFpbHMNCkVmaXJzdCA9IDAuNyANCkVzZWNvbmQgPSAwLjIgDQpFdGhpcmQgPSAwDQptaW5fcGF0aF9sZW5ndGg9NDgwMCANCm1pbl9iYm94X2xlbmd0aD0zMzAwIA0KDQojIyBTY29yZXMgc2l4dGggZ3JvdXA6IHRyYW5zaXQNCkZmaXJzdCA9IDAuNiANCkZzZWNvbmQgPSAwIA0KRnRoaXJkID0gMA0KDQpgYGANCg0KYGBge3NxbCBjb2xsZWdlcywgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBjb2xsZWdlc19sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBjb2xsZWdlc19zY29yZSA9ICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb2xsZWdlc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb2xsZWdlc19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzID0gY29sbGVnZXNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9BZmlyc3QgPSAwIFRIRU4gY29sbGVnZXNfbG93X3N0cmVzczo6RkxPQVQgLyBjb2xsZWdlc19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0FzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCkgKiAoY29sbGVnZXNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChjb2xsZWdlc19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QXRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbGxlZ2VzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29sbGVnZXNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0IC0gP0FzZWNvbmQpICogKGNvbGxlZ2VzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChjb2xsZWdlc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29sbGVnZXNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb2xsZWdlc19sb3dfc3RyZXNzID0gMiBUSEVOID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29sbGVnZXNfbG93X3N0cmVzcyA9IDMgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQgKyA/QXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QWZpcnN0ICsgP0FzZWNvbmQgKyA/QXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9BZmlyc3QgLSA/QXNlY29uZCAtID9BdGhpcmQpICogKGNvbGxlZ2VzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChjb2xsZWdlc19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIGNvbGxlZ2UgaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNClNFVCAgICAgcG9wX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMuY2VsbF9pZCkNCiAgICAgICAgKSwNCiAgICAgICAgcG9wX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzDQpTRVQgICAgIHBvcF9zY29yZSA9IENBU0UgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQoNCmBgYHtzcWwgY29tY2VuLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQotLSBzZXQgYmxvY2stYmFzZWQgcmF3IG51bWJlcnMNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5sb3dfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKSwNCiAgICAgICAgY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzZXQgYmxvY2stYmFzZWQgc2NvcmUNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIGNvbW11bml0eV9jZW50ZXJzX3Njb3JlID0gICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzID0gY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0JmaXJzdCA9IDAgVEhFTiBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOjpGTE9BVCAvIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Cc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0KSAqIChjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOjpGTE9BVCAtIDEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QnRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzID0gMSBUSEVOID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kKSAqIChjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QmZpcnN0ICsgP0JzZWNvbmQgKyA/QnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kIC0gP0J0aGlyZCkgKiAoY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzczo6RkxPQVQgLSAzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQoNCi0tIHNldCBwb3B1bGF0aW9uIHNoZWQgZm9yIGVhY2ggY29tbXVuaXR5IGNlbnRlciBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycw0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgZGVudGlzdCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBkZW50aXN0c19sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIGRlbnRpc3RzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBkZW50aXN0c19zY29yZSA9ICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRlbnRpc3RzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkZW50aXN0c19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkZW50aXN0c19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRlbnRpc3RzX2hpZ2hfc3RyZXNzID0gZGVudGlzdHNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9CZmlyc3QgPSAwIFRIRU4gZGVudGlzdHNfbG93X3N0cmVzczo6RkxPQVQgLyBkZW50aXN0c19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0JzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCkgKiAoZGVudGlzdHNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChkZW50aXN0c19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QnRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRlbnRpc3RzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZGVudGlzdHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0IC0gP0JzZWNvbmQpICogKGRlbnRpc3RzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChkZW50aXN0c19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZGVudGlzdHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkZW50aXN0c19sb3dfc3RyZXNzID0gMiBUSEVOID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZGVudGlzdHNfbG93X3N0cmVzcyA9IDMgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQgKyA/QnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QmZpcnN0ICsgP0JzZWNvbmQgKyA/QnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9CZmlyc3QgLSA/QnNlY29uZCAtID9CdGhpcmQpICogKGRlbnRpc3RzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChkZW50aXN0c19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIGRlbnRpc3RzIGRlc3RpbmF0aW9uIGluIHRoZSBuZWlnaGJvcmhvb2QNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuY2VsbF9pZCkNCiAgICAgICAgICAgIEFORCAgICAgY2JzLmxvd19zdHJlc3MNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IGFzIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCBkb2N0b3JzLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiICwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBkb2N0b3JzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIGRvY3RvcnNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBkb2N0b3JzX3Njb3JlID0gQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkb2N0b3JzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRvY3RvcnNfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkb2N0b3JzX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkb2N0b3JzX2hpZ2hfc3RyZXNzID0gZG9jdG9yc19sb3dfc3RyZXNzIFRIRU4gP21heF9zY29yZQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QmZpcnN0ID0gMCBUSEVOIGRvY3RvcnNfbG93X3N0cmVzczo6RkxPQVQgLyBkb2N0b3JzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Cc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0KSAqIChkb2N0b3JzX2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChkb2N0b3JzX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0J0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19sb3dfc3RyZXNzID0gMSBUSEVOID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19sb3dfc3RyZXNzID0gMiBUSEVOID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0IC0gP0JzZWNvbmQpICogKGRvY3RvcnNfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZG9jdG9yc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19sb3dfc3RyZXNzID0gMSBUSEVOID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19sb3dfc3RyZXNzID0gMiBUSEVOID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkb2N0b3JzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QmZpcnN0ICsgP0JzZWNvbmQgKyA/QnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kIC0gP0J0aGlyZCkgKiAoZG9jdG9yc19sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChkb2N0b3JzX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIGRvY3RvcnMgZGVzdGluYXRpb24gaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycw0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCBob3NwaXRhbHMsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgaG9zcGl0YWxzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBob3NwaXRhbHNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgaG9zcGl0YWxzX3Njb3JlID0gICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGhvc3BpdGFsc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfaGlnaF9zdHJlc3MgPSBob3NwaXRhbHNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9BZmlyc3QgPSAwIFRIRU4gaG9zcGl0YWxzX2xvd19zdHJlc3M6OkZMT0FUIC8gaG9zcGl0YWxzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QXNlY29uZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0KSAqIChob3NwaXRhbHNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChob3NwaXRhbHNfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0F0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0IC0gP0FzZWNvbmQpICogKGhvc3BpdGFsc19sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoaG9zcGl0YWxzX2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGhvc3BpdGFsc19sb3dfc3RyZXNzID0gMyBUSEVOID9BZmlyc3QgKyA/QXNlY29uZCArID9BdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9BZmlyc3QgKyA/QXNlY29uZCArID9BdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCAtID9Bc2Vjb25kIC0gP0F0aGlyZCkgKiAoaG9zcGl0YWxzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChob3NwaXRhbHNfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBob3NwaXRhbHMgZGVzdGluYXRpb24gaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgcGFya3MsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgcGFya3NfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBwYXJrc19oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgcGFya3Nfc2NvcmUgPSAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwYXJrc19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfaGlnaF9zdHJlc3MgPSBwYXJrc19sb3dfc3RyZXNzIFRIRU4gP21heF9zY29yZQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/Q2ZpcnN0ID0gMCBUSEVOIHBhcmtzX2xvd19zdHJlc3M6OkZMT0FUIC8gcGFya3NfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0NzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/Q2ZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9DZmlyc3QpICogKHBhcmtzX2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChwYXJrc19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9DdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBhcmtzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0NmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwYXJrc19sb3dfc3RyZXNzID0gMiBUSEVOID9DZmlyc3QgKyA/Q3NlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/Q2ZpcnN0ICsgP0NzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/Q2ZpcnN0IC0gP0NzZWNvbmQpICogKHBhcmtzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHBhcmtzX2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwYXJrc19sb3dfc3RyZXNzID0gMSBUSEVOID9DZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfbG93X3N0cmVzcyA9IDIgVEhFTiA/Q2ZpcnN0ICsgP0NzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfbG93X3N0cmVzcyA9IDMgVEhFTiA/Q2ZpcnN0ICsgP0NzZWNvbmQgKyA/Q3RoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9DZmlyc3QgKyA/Q3NlY29uZCArID9DdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/Q2ZpcnN0IC0gP0NzZWNvbmQgLSA/Q3RoaXJkKSAqIChwYXJrc19sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChwYXJrc19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBwYXJrIGluIHRoZSBuZWlnaGJvcmhvb2QNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3BhcmtzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3BhcmtzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcGFya3MuY2VsbF9pZCkNCiAgICAgICAgICAgIEFORCAgICAgY2JzLmxvd19zdHJlc3MNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IGFzIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGFya3MuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCBwaGFybWFjaWVzLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQotLSBzZXQgYmxvY2stYmFzZWQgcmF3IG51bWJlcnMNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHBoYXJtYWNpZXNfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5sb3dfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKSwNCiAgICAgICAgcGhhcm1hY2llc19oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzZXQgYmxvY2stYmFzZWQgc2NvcmUNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHBoYXJtYWNpZXNfc2NvcmUgPSAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwaGFybWFjaWVzX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcyA9IHBoYXJtYWNpZXNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9CZmlyc3QgPSAwIFRIRU4gcGhhcm1hY2llc19sb3dfc3RyZXNzOjpGTE9BVCAvIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Cc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9CZmlyc3QpICogKHBoYXJtYWNpZXNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChwaGFybWFjaWVzX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9CdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGhhcm1hY2llc19sb3dfc3RyZXNzID0gMSBUSEVOID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBoYXJtYWNpZXNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0IC0gP0JzZWNvbmQpICogKHBoYXJtYWNpZXNfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBoYXJtYWNpZXNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwaGFybWFjaWVzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwaGFybWFjaWVzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0IC0gP0JzZWNvbmQgLSA/QnRoaXJkKSAqIChwaGFybWFjaWVzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChwaGFybWFjaWVzX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQoNCi0tIHNldCBwb3B1bGF0aW9uIHNoZWQgZm9yIGVhY2ggcGhhcm1hY2llcyBkZXN0aW5hdGlvbiBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuY2VsbF9pZCkNCiAgICAgICAgKSwNCiAgICAgICAgcG9wX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzDQpTRVQgICAgIHBvcF9zY29yZSA9IENBU0UgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQpgYGB7c3FsIHJldGFpbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICByZXRhaWxfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcmV0YWlsLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIHJldGFpbF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcmV0YWlsLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICByZXRhaWxfc2NvcmUgPSAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiByZXRhaWxfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcmV0YWlsX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcmV0YWlsX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiByZXRhaWxfaGlnaF9zdHJlc3MgPSByZXRhaWxfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0JmaXJzdCA9IDAgVEhFTiByZXRhaWxfbG93X3N0cmVzczo6RkxPQVQgLyByZXRhaWxfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0JzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9CZmlyc3QpICogKHJldGFpbF9sb3dfc3RyZXNzOjpGTE9BVCAtIDEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAocmV0YWlsX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0J0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcmV0YWlsX2xvd19zdHJlc3MgPSAxIFRIRU4gP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiByZXRhaWxfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kKSAqIChyZXRhaWxfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAocmV0YWlsX2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiByZXRhaWxfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHJldGFpbF9sb3dfc3RyZXNzID0gMiBUSEVOID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiByZXRhaWxfbG93X3N0cmVzcyA9IDMgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQgKyA/QnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9CZmlyc3QgKyA/QnNlY29uZCArID9CdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0IC0gP0JzZWNvbmQgLSA/QnRoaXJkKSAqIChyZXRhaWxfbG93X3N0cmVzczo6RkxPQVQgLSAzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAocmV0YWlsX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIHJldGFpbCBkZXN0aW5hdGlvbiBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwNClNFVCAgICAgcG9wX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcmV0YWlsLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcmV0YWlsLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3JldGFpbC5nZW9tX3BvbHksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpTRVQgICAgIHBvcF9zY29yZSA9IENBU0UgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQpgYGB7c3FsIHNjaG9vbHMsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc2Nob29sc19sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBzY2hvb2xzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc2Nob29sc19zY29yZSA9IENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc2Nob29sc19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzY2hvb2xzX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc2Nob29sc19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc2Nob29sc19oaWdoX3N0cmVzcyA9IHNjaG9vbHNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0NmaXJzdCA9IDAgVEhFTiBzY2hvb2xzX2xvd19zdHJlc3M6OkZMT0FUIC8gc2Nob29sc19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/Q3NlY29uZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9DZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0NmaXJzdCkgKiAoc2Nob29sc19sb3dfc3RyZXNzOjpGTE9BVCAtIDEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc2Nob29sc19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9DdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/Q2ZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/Q2ZpcnN0ICsgP0NzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0NmaXJzdCArID9Dc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0NmaXJzdCAtID9Dc2Vjb25kKSAqIChzY2hvb2xzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHNjaG9vbHNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/Q2ZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/Q2ZpcnN0ICsgP0NzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc2Nob29sc19sb3dfc3RyZXNzID0gMyBUSEVOID9DZmlyc3QgKyA/Q3NlY29uZCArID9DdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0NmaXJzdCArID9Dc2Vjb25kICsgP0N0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9DZmlyc3QgLSA/Q3NlY29uZCAtID9DdGhpcmQpICogKHNjaG9vbHNfbG93X3N0cmVzczo6RkxPQVQgLSAzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc2Nob29sc19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBzY2hvb2wgaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scw0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCBzb2NzZXJ2LCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQoNCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc29jaWFsX3NlcnZpY2VzX3Njb3JlID0gQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyA9IHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzIFRIRU4gP21heF9zY29yZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9BZmlyc3QgPSAwIFRIRU4gc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3M6OkZMT0FUIC8gc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0FzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9BZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0KSAqIChzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QXRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzID0gMiBUSEVOID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCAtID9Bc2Vjb25kKSAqIChzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzID0gMSBUSEVOID9BZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzcyA9IDMgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQgKyA/QXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0FmaXJzdCArID9Bc2Vjb25kICsgP0F0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCAtID9Bc2Vjb25kIC0gP0F0aGlyZCkgKiAoc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBzb2NpYWwgc2VydmljZSBkZXN0aW5hdGlvbiBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMNClNFVCAgICAgcG9wX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCBzdXBlcm1hcmtldHMsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc3VwZXJtYXJrZXRzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgc3VwZXJtYXJrZXRzX3Njb3JlID0gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc3VwZXJtYXJrZXRzX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyA9IHN1cGVybWFya2V0c19sb3dfc3RyZXNzIFRIRU4gP21heF9zY29yZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9EZmlyc3QgPSAwIFRIRU4gc3VwZXJtYXJrZXRzX2xvd19zdHJlc3M6OkZMT0FUIC8gc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0RzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9EZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/RGZpcnN0KSAqIChzdXBlcm1hcmtldHNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/RHRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc3VwZXJtYXJrZXRzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0RmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19sb3dfc3RyZXNzID0gMiBUSEVOID9EZmlyc3QgKyA/RHNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9EZmlyc3QgKyA/RHNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0RmaXJzdCAtID9Ec2Vjb25kKSAqIChzdXBlcm1hcmtldHNfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19sb3dfc3RyZXNzID0gMSBUSEVOID9EZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzdXBlcm1hcmtldHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/RGZpcnN0ICsgP0RzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzdXBlcm1hcmtldHNfbG93X3N0cmVzcyA9IDMgVEhFTiA/RGZpcnN0ICsgP0RzZWNvbmQgKyA/RHRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0RmaXJzdCArID9Ec2Vjb25kICsgP0R0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0RmaXJzdCAtID9Ec2Vjb25kIC0gP0R0aGlyZCkgKiAoc3VwZXJtYXJrZXRzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBzdXBlcm1hcmtldCBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMNClNFVCAgICAgcG9wX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCB0cmFpbHMsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIGxvdyBzdHJlc3MgYWNjZXNzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICB0cmFpbHNfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQocGF0aF9pZCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BhdGhzDQogICAgICAgICAgICBXSEVSRSAgIHBhdGhfbGVuZ3RoID4gP21pbl9wYXRoX2xlbmd0aA0KICAgICAgICAgICAgQU5EICAgICBiYm94X2xlbmd0aCA+ID9taW5fYmJveF9sZW5ndGgNCiAgICAgICAgICAgIEFORCAgICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3MgbHMNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgbHMudGFyZ2V0X3JvYWQgPSBBTlkoZ2VuZXJhdGVkLnNhX3BhdGhzLnJvYWRfaWRzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBscy5iYXNlX3JvYWQgPSBBTlkoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLnJvYWRfaWRzKQ0KICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICB0cmFpbHNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKHBhdGhfaWQpDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wYXRocw0KICAgICAgICAgICAgV0hFUkUgICBwYXRoX2xlbmd0aCA+ID9taW5fcGF0aF9sZW5ndGgNCiAgICAgICAgICAgIEFORCAgICAgYmJveF9sZW5ndGggPiA/bWluX2Jib3hfbGVuZ3RoDQogICAgICAgICAgICBBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19oaWdoX3N0cmVzcyBocw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBocy50YXJnZXRfcm9hZCA9IEFOWShnZW5lcmF0ZWQuc2FfcGF0aHMucm9hZF9pZHMpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGhzLmJhc2Vfcm9hZCA9IEFOWShnZW5lcmF0ZWQuc2FfcG9wX2dyaWQucm9hZF9pZHMpDQogICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgdHJhaWxzX3Njb3JlID0gIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2hpZ2hfc3RyZXNzID0gdHJhaWxzX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9FZmlyc3QgPSAwIFRIRU4gdHJhaWxzX2xvd19zdHJlc3M6OkZMT0FUIC8gdHJhaWxzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Fc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0VmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/RWZpcnN0KSAqICh0cmFpbHNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHRyYWlsc19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9FdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19sb3dfc3RyZXNzID0gMSBUSEVOID9FZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0VmaXJzdCArID9Fc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9FZmlyc3QgKyA/RXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9FZmlyc3QgLSA/RXNlY29uZCkgKiAodHJhaWxzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHRyYWlsc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0VmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFpbHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/RWZpcnN0ICsgP0VzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0VmaXJzdCArID9Fc2Vjb25kICsgP0V0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/RWZpcnN0ICsgP0VzZWNvbmQgKyA/RXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0VmaXJzdCAtID9Fc2Vjb25kIC0gP0V0aGlyZCkgKiAodHJhaWxzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHRyYWlsc19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgdHJhbnNpdCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICB0cmFuc2l0X2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0LmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIHRyYW5zaXRfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0LmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICB0cmFuc2l0X3Njb3JlID0gICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYW5zaXRfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhbnNpdF9oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYW5zaXRfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYW5zaXRfaGlnaF9zdHJlc3MgPSB0cmFuc2l0X2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9GZmlyc3QgPSAwIFRIRU4gdHJhbnNpdF9sb3dfc3RyZXNzOjpGTE9BVCAvIHRyYW5zaXRfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0ZzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/RmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9GZmlyc3QpICogKHRyYW5zaXRfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHRyYW5zaXRfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/RnRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2xvd19zdHJlc3MgPSAxIFRIRU4gP0ZmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2xvd19zdHJlc3MgPSAyIFRIRU4gP0ZmaXJzdCArID9Gc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9GZmlyc3QgKyA/RnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9GZmlyc3QgLSA/RnNlY29uZCkgKiAodHJhbnNpdF9sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh0cmFuc2l0X2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2xvd19zdHJlc3MgPSAxIFRIRU4gP0ZmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2xvd19zdHJlc3MgPSAyIFRIRU4gP0ZmaXJzdCArID9Gc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYW5zaXRfbG93X3N0cmVzcyA9IDMgVEhFTiA/RmZpcnN0ICsgP0ZzZWNvbmQgKyA/RnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9GZmlyc3QgKyA/RnNlY29uZCArID9GdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/RmZpcnN0IC0gP0ZzZWNvbmQgLSA/RnRoaXJkKSAqICh0cmFuc2l0X2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHRyYW5zaXRfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQoNCi0tIHNldCBwb3B1bGF0aW9uIHNoZWQgZm9yIGVhY2ggcGFyayBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0DQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuY2VsbF9pZCkNCiAgICAgICAgKSwNCiAgICAgICAgcG9wX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0LmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0DQpTRVQgICAgIHBvcF9zY29yZSA9IENBU0UgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQpgYGB7c3FsIHVuaXZlcnNpdGllcywgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICB1bml2ZXJzaXRpZXNfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICB1bml2ZXJzaXRpZXNfc2NvcmUgPSAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB1bml2ZXJzaXRpZXNfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzID0gdW5pdmVyc2l0aWVzX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0FmaXJzdCA9IDAgVEhFTiB1bml2ZXJzaXRpZXNfbG93X3N0cmVzczo6RkxPQVQgLyB1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QXNlY29uZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9BZmlyc3QpICogKHVuaXZlcnNpdGllc19sb3dfc3RyZXNzOjpGTE9BVCAtIDEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9BdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB1bml2ZXJzaXRpZXNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0FmaXJzdCArID9Bc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0FmaXJzdCArID9Bc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0IC0gP0FzZWNvbmQpICogKHVuaXZlcnNpdGllc19sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHVuaXZlcnNpdGllc19sb3dfc3RyZXNzID0gMiBUSEVOID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHVuaXZlcnNpdGllc19sb3dfc3RyZXNzID0gMyBUSEVOID9BZmlyc3QgKyA/QXNlY29uZCArID9BdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QWZpcnN0ICsgP0FzZWNvbmQgKyA/QXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0IC0gP0FzZWNvbmQgLSA/QXRoaXJkKSAqICh1bml2ZXJzaXRpZXNfbG93X3N0cmVzczo6RkxPQVQgLSAzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIHVuaXZlcnNpdHkgaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOyAgICAgICAgICAgICAgICAgICAgICAgIA0KYGBgDQoNCk9uY2UgYWdhaW4sIG9uIHRoaXMgc3RlcCBJIGRvIG5vdCBpbmNsdWRlIHRoZSBTUUwgY29kZXMsIGhvd2V2ZXIgdGhleSBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYFJtZGAgZmlsZS4NCg0KIyMjIDExLiBDb21wdXRlIG92ZXJhbGwgYWNjZXNzDQoNCkR1cmluZyB0aGlzIHN0ZXAgdGhlIG92ZXJhbGwgYWNjZXNzIGlzIGNvbXB1dGVkIGZvciBlYWNoIHBvcHVsYXRpb24gZ3JpZCwgbWVhbmluZyB0aGF0IHdlIGNhbiBhbHJlYWR5IG9ic2VydmUgdGhlIEJOQSBzY29yZSBzcGF0aWFsIGJlaGF2aW9yIHdpdGhpbiBvdXIgc3R1ZHkgYXJlYS4gDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9DQp0b3RhbCA9IDEwMA0KcGVvcGxlID0gMTUNCm9wcG9ydHVuaXR5ID0gMjANCmNvcmVfc2VydmljZXMgPSAyMA0KcmV0YWlsID0gMTUNCnJlY3JlYXRpb24gPSAxNQ0KdHJhbnNpdCA9IDE1DQpgYGANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgb3ZlcmFsbF9zY29yZSA9ID90b3RhbCAqDQogICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgP3Blb3BsZSAqIENPQUxFU0NFKHBvcF9zY29yZSwwKQ0KICAgICAgICAgICAgICAgICsgP29wcG9ydHVuaXR5ICoNCiAgICAgICAgICAgICAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICBXSEVOICAgIENPQUxFU0NFKHNjaG9vbHNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKGNvbGxlZ2VzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRSh1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgIEVMU0UgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM1ICogQ09BTEVTQ0UoZW1wX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMzUgKiBDT0FMRVNDRShzY2hvb2xzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMSAqIENPQUxFU0NFKGNvbGxlZ2VzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMiAqIENPQUxFU0NFKHVuaXZlcnNpdGllc19zY29yZSwwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4zNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgKyA/Y29yZV9zZXJ2aWNlcyAqDQogICAgICAgICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiAgICBDT0FMRVNDRShkb2N0b3JzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShkZW50aXN0c19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UoaG9zcGl0YWxzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShwaGFybWFjaWVzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMiAqIENPQUxFU0NFKGRvY3RvcnNfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4xICogQ09BTEVTQ0UoZGVudGlzdHNfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4yICogQ09BTEVTQ0UoaG9zcGl0YWxzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMSAqIENPQUxFU0NFKHBoYXJtYWNpZXNfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4yNSAqIENPQUxFU0NFKHN1cGVybWFya2V0c19zY29yZSwwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjE1ICogQ09BTEVTQ0Uoc29jaWFsX3NlcnZpY2VzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRvY3RvcnNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZGVudGlzdHNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4xDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaG9zcGl0YWxzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4xDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMjUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4xNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICArID9yZXRhaWwgKiBDT0FMRVNDRShyZXRhaWxfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICArID9yZWNyZWF0aW9uICoNCiAgICAgICAgICAgICAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICBXSEVOICAgIENPQUxFU0NFKHBhcmtzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRSh0cmFpbHNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICBFTFNFICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40ICogQ09BTEVTQ0UocGFya3Nfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4zNSAqIENPQUxFU0NFKHRyYWlsc19zY29yZSwwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjI1ICogQ09BTEVTQ0UoY29tbXVuaXR5X2NlbnRlcnNfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMzUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjI1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICsgP3RyYW5zaXQgKiBDT0FMRVNDRSh0cmFuc2l0X3Njb3JlLDApDQogICAgICAgICAgICApIC8NCiAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICA/cGVvcGxlDQogICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzY2hvb2xzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShjb2xsZWdlc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UodW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICBFTFNFID9vcHBvcnR1bml0eQ0KICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGRvY3RvcnNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKGRlbnRpc3RzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShob3NwaXRhbHNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKHN1cGVybWFya2V0c19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0Uoc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICBFTFNFID9jb3JlX3NlcnZpY2VzDQogICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UocmV0YWlsX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgRUxTRSA/cmV0YWlsDQogICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UocGFya3NfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKHRyYWlsc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UoY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgIEVMU0UgP3JlY3JlYXRpb24NCiAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0cmFuc2l0X2hpZ2hfc3RyZXNzLDApID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgIEVMU0UgP3RyYW5zaXQNCiAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGIuZ2VvbWV0cnksZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5KQ0KICAgICAgICApOw0KICAgICAgICANClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCiMjIyAxMi4gQ29tcHV0ZSBvdmVyYWxsIHNjb3JlIGZvciB0aGUgd2hvbGUgc3R1ZHkgYXJlYQ0KDQpGb3IgdGhpcyBzdGVwIGEgbmV3IHRhYmxlIGlzIGdlbmVyYXRlZCBpbiB0aGUgZGF0YWJhc2UgYHNhX3Njb3JlX2lucHV0c2AgdG8gc3RvcmUgdGhlIHByZWxpbWluYXJ5IHJlc3VsdHMuIFRoZSBjb2RlIGNhbiBiZSBhY2Nlc3NlZCBvbiB0aGUgYFJtZGAgZmlsZS4gDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQoNCkRST1AgVEFCTEUgSUYgRVhJU1RTIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHM7DQoNCkNSRUFURSBUQUJMRSBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2F0ZWdvcnkgVEVYVCwNCiAgICBzY29yZV9uYW1lIFRFWFQsDQogICAgc2NvcmUgTlVNRVJJQygxNiw0KSwNCiAgICBub3RlcyBURVhULA0KICAgIGh1bWFuX2V4cGxhbmF0aW9uIFRFWFQsDQogICAgdXNlX3BvcCBCT09MRUFOLA0KICAgIHVzZV9lbXAgQk9PTEVBTiwNCiAgICB1c2VfazEyIEJPT0xFQU4sDQogICAgdXNlX3RlY2ggQk9PTEVBTiwNCiAgICB1c2VfdW5pdiBCT09MRUFOLA0KICAgIHVzZV9kb2N0b3IgQk9PTEVBTiwNCiAgICB1c2VfZGVudGlzdCBCT09MRUFOLA0KICAgIHVzZV9ob3NwaXRhbCBCT09MRUFOLA0KICAgIHVzZV9waGFybWFjeSBCT09MRUFOLA0KICAgIHVzZV9yZXRhaWwgQk9PTEVBTiwNCiAgICB1c2VfZ3JvY2VyeSBCT09MRUFOLA0KICAgIHVzZV9zb2NpYWxfc3ZjcyBCT09MRUFOLA0KICAgIHVzZV9wYXJrcyBCT09MRUFOLA0KICAgIHVzZV90cmFpbHMgQk9PTEVBTiwNCiAgICB1c2VfY29tbV9jdHJzIEJPT0xFQU4sDQogICAgdXNlX3RyYW5zaXQgQk9PTEVBTg0KKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gdGVtcG9yYXJ5IHRhYmxlIG9mIHRvdGFsIHBvcHVsYXRpb24NCi0tIGZvciB3ZWlnaHRpbmcgcHVycG9zZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIHRtcF9wb3A7DQpDUkVBVEUgVEVNUCBUQUJMRSB0bXBfcG9wICgNCiAgICBvdmVyYWxsIElOVEVHRVIsDQogICAgazEyIElOVEVHRVIsDQogICAgdGVjaCBJTlRFR0VSLA0KICAgIHVuaXYgSU5URUdFUiwNCiAgICBkb2N0b3IgSU5URUdFUiwNCiAgICBkZW50aXN0IElOVEVHRVIsDQogICAgaG9zcGl0YWwgSU5URUdFUiwNCiAgICBwaGFybWFjeSBJTlRFR0VSLA0KICAgIHJldGFpbCBJTlRFR0VSLA0KICAgIGdyb2NlcnkgSU5URUdFUiwNCiAgICBzb2NpYWxfc3ZjcyBJTlRFR0VSLA0KICAgIHBhcmtzIElOVEVHRVIsDQogICAgdHJhaWxzIElOVEVHRVIsDQogICAgY29tbV9jdHJzIElOVEVHRVIsDQogICAgdHJhbnNpdCBJTlRFR0VSDQopOw0KDQpJTlNFUlQgSU5UTyB0bXBfcG9wICgNCiAgICBvdmVyYWxsLCBrMTIsIHRlY2gsIHVuaXYsIGRvY3RvciwgZGVudGlzdCwgaG9zcGl0YWwsIHBoYXJtYWN5LA0KICAgIHJldGFpbCwgZ3JvY2VyeSwgc29jaWFsX3N2Y3MsIHBhcmtzLCB0cmFpbHMsIGNvbW1fY3RycywgdHJhbnNpdA0KKQ0KU0VMRUNUICBTVU0ocGFydGlhbF9wKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShzY2hvb2xzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShjb2xsZWdlc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UodW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShkb2N0b3JzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShkZW50aXN0c19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UoaG9zcGl0YWxzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShwaGFybWFjaWVzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShyZXRhaWxfaGlnaF9zdHJlc3MsMCkgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCBFTkQpLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIENPQUxFU0NFKHN1cGVybWFya2V0c19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0Uoc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShwYXJrc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UodHJhaWxzX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UodHJhbnNpdF9oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCkNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzOw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBwb3B1bGF0aW9uDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBtZWRpYW4gcG9wIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1Blb3BsZScsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgYWNjZXNzIHRvIHBvcHVsYXRpb24nLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICB0byBwb3B1bGF0aW9uIGFjY2Vzc2libGUgb3ZlcmFsbCwgZXhwcmVzc2VkIGFzDQogICAgICAgICAgICB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgYSByYXRpbyBvZiBsb3cgc3RyZXNzIHRvIGhpZ2ggc3RyZXNzIGFjY2VzcyBhYm92ZSB0aGlzIG51bWJlciwNCiAgICAgICAgICAgIGhhbGYgaGF2ZSBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBwb3AgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUGVvcGxlJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiBhY2Nlc3MgdG8gcG9wdWxhdGlvbicsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICB0byBwb3B1bGF0aW9uIGFjY2Vzc2libGUgb3ZlcmFsbCwgZXhwcmVzc2VkIGFzDQogICAgICAgICAgICB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBhIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzIGFib3ZlIHRoaXMgbnVtYmVyLA0KICAgICAgICAgICAgNzAlIGhhdmUgYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgcG9wIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1Blb3BsZScsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgYWNjZXNzIHRvIHBvcHVsYXRpb24nLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICB0byBwb3B1bGF0aW9uIGFjY2Vzc2libGUgb3ZlcmFsbCwgZXhwcmVzc2VkIGFzDQogICAgICAgICAgICB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBhIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzIGFib3ZlIHRoaXMgbnVtYmVyLA0KICAgICAgICAgICAgMzAlIGhhdmUgYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBhdmcgcG9wIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1Blb3BsZScsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byBwb3B1bGF0aW9uJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgdG8gcG9wdWxhdGlvbiBhY2Nlc3NpYmxlIG92ZXJhbGwsIGV4cHJlc3NlZCBhcw0KICAgICAgICAgICAgdGhlIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICB0aGlzIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX3BvcA0KKQ0KU0VMRUNUICAnUGVvcGxlJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHBvcHVsYXRpb24nLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3Aub3ZlcmFsbCA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogcG9wX3Njb3JlIC8gdG1wX3BvcC5vdmVyYWxsIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIHBvcHVsYXRpb24gc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBwb3B1bGF0aW9uIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gZW1wbG95bWVudA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gbWVkaWFuIGpvYnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIGFjY2VzcyB0byBlbXBsb3ltZW50JywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBlbXBfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBlbXBfbG93X3N0cmVzczo6RkxPQVQvZW1wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBlbXBsb3ltZW50IGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgdG8gZW1wbG95bWVudCBhY2Nlc3NpYmxlIG92ZXJhbGwsIGV4cHJlc3NlZCBhcw0KICAgICAgICAgICAgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGEgcmF0aW8gb2YgbG93IHN0cmVzcyB0byBoaWdoIHN0cmVzcyBhY2Nlc3MgYWJvdmUgdGhpcyBudW1iZXIsDQogICAgICAgICAgICBoYWxmIGhhdmUgYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgam9icyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgYWNjZXNzIHRvIGVtcGxveW1lbnQnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGVtcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGVtcF9sb3dfc3RyZXNzOjpGTE9BVC9lbXBfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGVtcGxveW1lbnQgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICB0byBlbXBsb3ltZW50IGFjY2Vzc2libGUgb3ZlcmFsbCwgZXhwcmVzc2VkIGFzDQogICAgICAgICAgICB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBhIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzIGFib3ZlIHRoaXMgbnVtYmVyLA0KICAgICAgICAgICAgNzAlIGhhdmUgYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgam9icyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgYWNjZXNzIHRvIGVtcGxveW1lbnQnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGVtcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGVtcF9sb3dfc3RyZXNzOjpGTE9BVC9lbXBfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGVtcGxveW1lbnQgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICB0byBlbXBsb3ltZW50IGFjY2Vzc2libGUgb3ZlcmFsbCwgZXhwcmVzc2VkIGFzDQogICAgICAgICAgICB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBhIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzIGFib3ZlIHRoaXMgbnVtYmVyLA0KICAgICAgICAgICAgMzAlIGhhdmUgYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBhdmcgam9icyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byBlbXBsb3ltZW50JywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShlbXBfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShlbXBfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKGVtcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBlbXBsb3ltZW50IGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgdG8gZW1wbG95bWVudCBhY2Nlc3NpYmxlIG92ZXJhbGwsIGV4cHJlc3NlZCBhcw0KICAgICAgICAgICAgdGhlIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICB0aGlzIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX2VtcA0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gam9icycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC5vdmVyYWxsID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBlbXBfc2NvcmUgLyB0bXBfcG9wLm92ZXJhbGwgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgZW1wbG95bWVudCBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIGVtcGxveW1lbnQgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gc2Nob29scw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSBzY2hvb2wgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byBzY2hvb2xzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShzY2hvb2xzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0oc2Nob29sc19sb3dfc3RyZXNzKSAvIFNVTShzY2hvb2xzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiBzY2hvb2xzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgc2Nob29scy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gc2Nob29scyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2Ygc2Nob29sIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gc2Nob29sc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHNjaG9vbHNfbG93X3N0cmVzczo6RkxPQVQvc2Nob29sc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2Ygc2Nob29scyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHNjaG9vbHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBzY2hvb2xzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIHNjaG9vbHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHNjaG9vbCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHNjaG9vbHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzY2hvb2xzX2xvd19zdHJlc3M6OkZMT0FUL3NjaG9vbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHNjaG9vbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzY2hvb2xzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBzY2hvb2xzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgc2Nob29scyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2Ygc2Nob29sIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gc2Nob29sc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHNjaG9vbHNfbG93X3N0cmVzczo6RkxPQVQvc2Nob29sc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2Ygc2Nob29scyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHNjaG9vbHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHNjaG9vbHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX2sxMg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gSzEyIHNjaG9vbHMnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AuazEyID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBzY2hvb2xzX3Njb3JlIC8gdG1wX3BvcC5rMTIgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgSzEyIHNjaG9vbHMgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBLMTIgc2Nob29scyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzY2hvb2wgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2Nob29sIGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2Ygc2Nob29scyBpbiB0aGUgc3R1ZHkgYXJlYSBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZg0KICAgICAgICAgICAgYWxsIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBzY2hvb2xzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNjaG9vbCBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdNZWRpYW4gc2Nob29sIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHNjaG9vbHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggc2Nob29sIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgaGFsZiBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzY2hvb2wgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjaG9vbCBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBzY2hvb2xzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHNjaG9vbCBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2Ygc2Nob29scyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2Nob29sIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY2hvb2wgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gc2Nob29scw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBzY2hvb2wgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBzY2hvb2xzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gdGVjaG5pY2FsL3ZvY2F0aW9uYWwgY29sbGVnZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgdGVjaG5pY2FsL3ZvY2F0aW9uYWwgY29sbGVnZSBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0oY29sbGVnZXNfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShjb2xsZWdlc19sb3dfc3RyZXNzKSAvIFNVTShjb2xsZWdlc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiBjb2xsZWdlcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2UgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBjb2xsZWdlc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGNvbGxlZ2VzX2xvd19zdHJlc3M6OkZMT0FUL2NvbGxlZ2VzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgY29sbGVnZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gY29sbGVnZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBjb2xsZWdlc19sb3dfc3RyZXNzOjpGTE9BVC9jb2xsZWdlc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSBjb2xsZWdlcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2UgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBjb2xsZWdlc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGNvbGxlZ2VzX2xvd19zdHJlc3M6OkZMT0FUL2NvbGxlZ2VzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfdGVjaA0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnRlY2ggPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIGNvbGxlZ2VzX3Njb3JlIC8gdG1wX3BvcC50ZWNoIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcyBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBjb2xsZWdlIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdBdmVyYWdlIGNvbGxlZ2UgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBjb2xsZWdlcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIGNvbGxlZ2VzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29sbGVnZSBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdNZWRpYW4gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2UgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGNvbGxlZ2UgZXhwcmVzc2VkIGFzIGEgbWVkaWFuIG9mIGFsbA0KICAgICAgICAgICAgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29sbGVnZSBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2UgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGNvbGxlZ2UgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBjb2xsZWdlcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29sbGVnZSBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2UgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGNvbGxlZ2UgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBjb2xsZWdlcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSB1bml2ZXJzaXRpZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgdW5pdmVyc2l0eSBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHVuaXZlcnNpdGllcycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0odW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0odW5pdmVyc2l0aWVzX2xvd19zdHJlc3MpIC8gU1VNKHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgdW5pdmVyc2l0aWVzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgdW5pdmVyc2l0aWVzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiB1bml2ZXJzaXRpZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIHVuaXZlcnNpdHkgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB1bml2ZXJzaXRpZXNfbG93X3N0cmVzczo6RkxPQVQvdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB1bml2ZXJzaXRpZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB1bml2ZXJzaXRpZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB1bml2ZXJzaXRpZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgdW5pdmVyc2l0aWVzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiB1bml2ZXJzaXR5IGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgdW5pdmVyc2l0aWVzX2xvd19zdHJlc3M6OkZMT0FUL3VuaXZlcnNpdGllc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgdW5pdmVyc2l0aWVzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdW5pdmVyc2l0aWVzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB1bml2ZXJzaXRpZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSB1bml2ZXJzaXRpZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHVuaXZlcnNpdHkgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB1bml2ZXJzaXRpZXNfbG93X3N0cmVzczo6RkxPQVQvdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB1bml2ZXJzaXRpZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB1bml2ZXJzaXRpZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHVuaXZlcnNpdGllcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfdW5pdg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gdW5pdmVyc2l0aWVzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnVuaXYgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIHVuaXZlcnNpdGllc19zY29yZSAvIHRtcF9wb3AudW5pdiBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSB1bml2ZXJzaXRpZXMgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyB1bml2ZXJzaXRpZXMgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gdW5pdmVyc2l0eSBwb3Agc2hlZCBhdmVyYWdlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSB1bml2ZXJzaXR5IGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2YgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mDQogICAgICAgICAgICBhbGwgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSB1bml2ZXJzaXR5IHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ01lZGlhbiB1bml2ZXJzaXR5IHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHVuaXZlcnNpdGllcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCB1bml2ZXJzaXR5IGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHVuaXZlcnNpdGllcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgdW5pdmVyc2l0eSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gdW5pdmVyc2l0eSBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgdW5pdmVyc2l0eSBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byB1bml2ZXJzaXRpZXMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggdW5pdmVyc2l0eSBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHVuaXZlcnNpdGllcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiB1bml2ZXJzaXRpZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHVuaXZlcnNpdHkgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHVuaXZlcnNpdHkgcG9wIHNoZWQgMzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHVuaXZlcnNpdHkgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdW5pdmVyc2l0aWVzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHVuaXZlcnNpdHkgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICB1bml2ZXJzaXRpZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSB1bml2ZXJzaXR5IGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGRvY3RvcnMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgZG9jdG9ycyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gZG9jdG9ycycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0oZG9jdG9yc19oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKGRvY3RvcnNfbG93X3N0cmVzcykgLyBTVU0oZG9jdG9yc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgZG9jdG9ycyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IGRvY3RvcnMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIGRvY3RvcnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgZG9jdG9ycyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGRvY3RvcnNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBkb2N0b3JzX2xvd19zdHJlc3M6OkZMT0FUL2RvY3RvcnNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGRvY3RvcnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBkb2N0b3JzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgZG9jdG9ycyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBkb2N0b3JzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIGRvY3RvcnMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBkb2N0b3JzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgZG9jdG9yc19sb3dfc3RyZXNzOjpGTE9BVC9kb2N0b3JzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBkb2N0b3JzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gZG9jdG9ycyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgZG9jdG9ycyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIGRvY3RvcnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgZG9jdG9ycyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGRvY3RvcnNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBkb2N0b3JzX2xvd19zdHJlc3M6OkZMT0FUL2RvY3RvcnNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGRvY3RvcnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBkb2N0b3JzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBkb2N0b3JzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9kb2N0b3INCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gZG9jdG9ycycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC5kb2N0b3IgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIGRvY3RvcnNfc2NvcmUgLyB0bXBfcG9wLmRvY3RvciBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBkb2N0b3JzIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgZG9jdG9ycyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBkb2N0b3JzIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2UgZG9jdG9ycyBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIGRvY3RvcnMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgZG9jdG9ycyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RvY3RvcnMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBkb2N0b3JzIHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnTWVkaWFuIGRvY3RvcnMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gZG9jdG9ycw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBkb2N0b3JzIG9mZmljZSBleHByZXNzZWQgYXMgYSBtZWRpYW4gb2YgYWxsDQogICAgICAgICAgICBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgZG9jdG9ycyBvZmZpY2UgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gZG9jdG9ycyBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBkb2N0b3JzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGRvY3RvcnMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggZG9jdG9ycyBvZmZpY2UgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIGRvY3RvcnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIGRvY3RvcnMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gZG9jdG9ycyBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBkb2N0b3JzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGRvY3RvcnMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggZG9jdG9ycyBvZmZpY2UgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIGRvY3RvcnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIGRvY3RvcnMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gZGVudGlzdHMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgZGVudGlzdHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGRlbnRpc3RzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShkZW50aXN0c19oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKGRlbnRpc3RzX2xvd19zdHJlc3MpIC8gU1VNKGRlbnRpc3RzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiBkZW50aXN0cyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IGRlbnRpc3RzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiBkZW50aXN0cyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiBkZW50aXN0cyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGRlbnRpc3RzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgZGVudGlzdHNfbG93X3N0cmVzczo6RkxPQVQvZGVudGlzdHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGRlbnRpc3RzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gZGVudGlzdHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBkZW50aXN0cyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBkZW50aXN0cyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiBkZW50aXN0cyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGRlbnRpc3RzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgZGVudGlzdHNfbG93X3N0cmVzczo6RkxPQVQvZGVudGlzdHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGRlbnRpc3RzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gZGVudGlzdHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIGRlbnRpc3RzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgZGVudGlzdHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgZGVudGlzdHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBkZW50aXN0c19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGRlbnRpc3RzX2xvd19zdHJlc3M6OkZMT0FUL2RlbnRpc3RzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBkZW50aXN0cyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIGRlbnRpc3RzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBkZW50aXN0cyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfZGVudGlzdA0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byBkZW50aXN0cycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC5kZW50aXN0ID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBkZW50aXN0c19zY29yZSAvIHRtcF9wb3AuZGVudGlzdCBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBkZW50aXN0cyBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIGRlbnRpc3RzIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGRlbnRpc3RzIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2UgZGVudGlzdHMgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiBkZW50aXN0cyBpbiB0aGUgc3R1ZHkgYXJlYSBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZg0KICAgICAgICAgICAgYWxsIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgZGVudGlzdHMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBkZW50aXN0cyBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBkZW50aXN0cyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBkZW50aXN0cw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBkZW50aXN0cyBvZmZpY2UgZXhwcmVzc2VkIGFzIGEgbWVkaWFuIG9mIGFsbA0KICAgICAgICAgICAgZGVudGlzdHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgZGVudGlzdHMgb2ZmaWNlIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gZGVudGlzdHMgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgZGVudGlzdHMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gZGVudGlzdHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggZGVudGlzdHMgb2ZmaWNlIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgZGVudGlzdHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgZGVudGlzdHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIGRlbnRpc3RzIG9mZmljZSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGRlbnRpc3RzIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIGRlbnRpc3RzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGRlbnRpc3RzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGRlbnRpc3RzIG9mZmljZSBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBkZW50aXN0cyBvZmZpY2UgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBob3NwaXRhbHMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgaG9zcGl0YWxzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byBob3NwaXRhbHMnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKGhvc3BpdGFsc19oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKGhvc3BpdGFsc19sb3dfc3RyZXNzKSAvIFNVTShob3NwaXRhbHNfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnTnVtYmVyIG9mIGhvc3BpdGFscyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IGhvc3BpdGFscy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gaG9zcGl0YWxzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIGhvc3BpdGFscyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGhvc3BpdGFsc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGhvc3BpdGFsc19sb3dfc3RyZXNzOjpGTE9BVC9ob3NwaXRhbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGhvc3BpdGFscyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIGhvc3BpdGFscyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIGhvc3BpdGFscyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBob3NwaXRhbHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgaG9zcGl0YWxzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gaG9zcGl0YWxzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgaG9zcGl0YWxzX2xvd19zdHJlc3M6OkZMT0FUL2hvc3BpdGFsc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgaG9zcGl0YWxzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gaG9zcGl0YWxzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBob3NwaXRhbHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSBob3NwaXRhbHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgaG9zcGl0YWxzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gaG9zcGl0YWxzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgaG9zcGl0YWxzX2xvd19zdHJlc3M6OkZMT0FUL2hvc3BpdGFsc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgaG9zcGl0YWxzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gaG9zcGl0YWxzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBob3NwaXRhbHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX2hvc3BpdGFsDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIGhvc3BpdGFscycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC5ob3NwaXRhbCA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogaG9zcGl0YWxzX3Njb3JlIC8gdG1wX3BvcC5ob3NwaXRhbCBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBob3NwaXRhbCBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIGhvc3BpdGFsIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGhvc3BpdGFscyBwb3Agc2hlZCBhdmVyYWdlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIGhvc3BpdGFscyBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIGhvc3BpdGFscyBpbiB0aGUgc3R1ZHkgYXJlYSBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZg0KICAgICAgICAgICAgYWxsIGhvc3BpdGFscyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIGhvc3BpdGFscyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gaG9zcGl0YWxzIHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnTWVkaWFuIGhvc3BpdGFscyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBob3NwaXRhbHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggaG9zcGl0YWwgZXhwcmVzc2VkIGFzIGEgbWVkaWFuIG9mIGFsbA0KICAgICAgICAgICAgaG9zcGl0YWxzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBob3NwaXRhbHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgaGFsZiBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBob3NwaXRhbCBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gaG9zcGl0YWxzIHBvcCBzaGVkIDcwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIGhvc3BpdGFscyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBob3NwaXRhbHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggaG9zcGl0YWwgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBob3NwaXRhbHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgaG9zcGl0YWxzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDcwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBob3NwaXRhbCBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gaG9zcGl0YWxzIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIGhvc3BpdGFscyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBob3NwaXRhbHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggaG9zcGl0YWwgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBob3NwaXRhbHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgaG9zcGl0YWxzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBob3NwaXRhbCBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gcGhhcm1hY2llcw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSBwaGFybWFjaWVzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byBwaGFybWFjaWVzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwaGFybWFjaWVzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocGhhcm1hY2llc19sb3dfc3RyZXNzKSAvIFNVTShwaGFybWFjaWVzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiBwaGFybWFjaWVzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgcGhhcm1hY2llcy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gcGhhcm1hY2llcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiBwaGFybWFjaWVzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBoYXJtYWNpZXNfbG93X3N0cmVzczo6RkxPQVQvcGhhcm1hY2llc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcGhhcm1hY2llcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHBoYXJtYWNpZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBwaGFybWFjaWVzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIHBoYXJtYWNpZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgcGhhcm1hY2llcyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwaGFybWFjaWVzX2xvd19zdHJlc3M6OkZMT0FUL3BoYXJtYWNpZXNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBoYXJtYWNpZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBwaGFybWFjaWVzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBwaGFybWFjaWVzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgcGhhcm1hY2llcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY29yZSBvZiBwaGFybWFjaWVzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcGhhcm1hY2llc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBoYXJtYWNpZXNfbG93X3N0cmVzczo6RkxPQVQvcGhhcm1hY2llc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcGhhcm1hY2llcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHBoYXJtYWNpZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHBoYXJtYWNpZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX3BoYXJtYWN5DQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHBoYXJtYWNpZXMnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AucGhhcm1hY3kgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIHBoYXJtYWNpZXNfc2NvcmUgLyB0bXBfcG9wLnBoYXJtYWN5IEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIHBoYXJtYWNpZXMgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBwaGFybWFjaWVzIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBoYXJtYWNpZXMgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBwaGFybWFjaWVzIGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2YgcGhhcm1hY2llcyBpbiB0aGUgc3R1ZHkgYXJlYSBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZg0KICAgICAgICAgICAgYWxsIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwaGFybWFjaWVzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBoYXJtYWNpZXMgcG9wIHNoZWQgbWVkaWFuIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gcGhhcm1hY2llcyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBwaGFybWFjaWVzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHBoYXJtYWN5IGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgaGFsZiBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBwaGFybWFjeSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwaGFybWFjaWVzIHBvcCBzaGVkIDcwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHBoYXJtYWNpZXMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gcGhhcm1hY2llcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBwaGFybWFjeSBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcGhhcm1hY2llcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgcGhhcm1hY3kgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcGhhcm1hY2llcyBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBwaGFybWFjaWVzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHBoYXJtYWNpZXMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggcGhhcm1hY3kgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBwaGFybWFjaWVzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHBoYXJtYWN5IGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHJldGFpbA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSByZXRhaWwgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmV0YWlsJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gcmV0YWlsJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShyZXRhaWxfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShyZXRhaWxfbG93X3N0cmVzcykgLyBTVU0ocmV0YWlsX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiByZXRhaWwgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSByZXRhaWwuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIHJldGFpbCBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZXRhaWwnLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIHJldGFpbCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHJldGFpbF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHJldGFpbF9sb3dfc3RyZXNzOjpGTE9BVC9yZXRhaWxfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHJldGFpbCBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHJldGFpbCBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHJldGFpbCB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSByZXRhaWwgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmV0YWlsJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiByZXRhaWwgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiByZXRhaWxfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSByZXRhaWxfbG93X3N0cmVzczo6RkxPQVQvcmV0YWlsX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiByZXRhaWwgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byByZXRhaWwgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHJldGFpbCB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHJldGFpbCBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZXRhaWwnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHJldGFpbCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHJldGFpbF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHJldGFpbF9sb3dfc3RyZXNzOjpGTE9BVC9yZXRhaWxfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHJldGFpbCBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHJldGFpbCBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgcmV0YWlsIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9yZXRhaWwNCikNClNFTEVDVCAgJ1JldGFpbCcsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byByZXRhaWwnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AucmV0YWlsID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiByZXRhaWxfc2NvcmUgLyB0bXBfcG9wLnJldGFpbCBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSByZXRhaWwgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyByZXRhaWwgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcmV0YWlsIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZXRhaWwnLA0KICAgICAgICAnQXZlcmFnZSByZXRhaWwgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3JldGFpbC5nZW9tX3BvbHksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcmV0YWlsIHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JldGFpbCcsDQogICAgICAgICdNZWRpYW4gcmV0YWlsIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHJldGFpbA0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCByZXRhaWwgY2x1c3RlciBleHByZXNzZWQgYXMgYSBtZWRpYW4gb2YgYWxsDQogICAgICAgICAgICByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHJldGFpbCBjbHVzdGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHJldGFpbCBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3JldGFpbA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcmV0YWlsLmdlb21fcG9seSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSByZXRhaWwgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmV0YWlsJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSByZXRhaWwgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gcmV0YWlsDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHJldGFpbCBjbHVzdGVyIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgcmV0YWlsIGNsdXN0ZXJzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHJldGFpbCBjbHVzdGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgcmV0YWlsIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwuZ2VvbV9wb2x5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHJldGFpbCBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZXRhaWwnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHJldGFpbCBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byByZXRhaWwNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggcmV0YWlsIGNsdXN0ZXIgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcmV0YWlsIGNsdXN0ZXJzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSByZXRhaWwgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3JldGFpbC5nZW9tX3BvbHksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gc3VwZXJtYXJrZXRzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIHN1cGVybWFya2V0cyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gc3VwZXJtYXJrZXRzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShzdXBlcm1hcmtldHNfbG93X3N0cmVzcykgLyBTVU0oc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiBzdXBlcm1hcmtldHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSBzdXBlcm1hcmtldHMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIHN1cGVybWFya2V0cyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiBzdXBlcm1hcmtldHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzdXBlcm1hcmtldHNfbG93X3N0cmVzczo6RkxPQVQvc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBzdXBlcm1hcmtldHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzdXBlcm1hcmtldHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBzdXBlcm1hcmtldHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgc3VwZXJtYXJrZXRzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHN1cGVybWFya2V0cyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHN1cGVybWFya2V0c19sb3dfc3RyZXNzOjpGTE9BVC9zdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHN1cGVybWFya2V0cyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHN1cGVybWFya2V0cyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2Ygc3VwZXJtYXJrZXRzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgc3VwZXJtYXJrZXRzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHN1cGVybWFya2V0cyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHN1cGVybWFya2V0c19sb3dfc3RyZXNzOjpGTE9BVC9zdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHN1cGVybWFya2V0cyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHN1cGVybWFya2V0cyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2Ygc3VwZXJtYXJrZXRzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9ncm9jZXJ5DQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIGdyb2Nlcnkgc3RvcmVzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLmdyb2NlcnkgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIHN1cGVybWFya2V0c19zY29yZSAvIHRtcF9wb3AuZ3JvY2VyeSBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBncm9jZXJ5IHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgZ3JvY2VyeSBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzdXBlcm1hcmtldHMgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzdXBlcm1hcmtldHMgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHN1cGVybWFya2V0cyBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBzdXBlcm1hcmtldHMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gc3VwZXJtYXJrZXRzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHN1cGVybWFya2V0IGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHN1cGVybWFya2V0cyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2Ygc3VwZXJtYXJrZXRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgc3VwZXJtYXJrZXRzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzdXBlcm1hcmtldHMgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc3VwZXJtYXJrZXRzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHN1cGVybWFya2V0cw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBzdXBlcm1hcmtldCBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHN1cGVybWFya2V0cyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHN1cGVybWFya2V0cyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc3VwZXJtYXJrZXRzIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHN1cGVybWFya2V0cyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBzdXBlcm1hcmtldHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggc3VwZXJtYXJrZXQgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2Ygc3VwZXJtYXJrZXRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBzdXBlcm1hcmtldHMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHNvY2lhbF9zZXJ2aWNlcw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSBzb2NpYWxfc2VydmljZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHNvY2lhbCBzZXJ2aWNlcycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0oc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0oc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3MpIC8gU1VNKHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2Ygc29jaWFsIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgc29jaWFsIHNlcnZpY2VzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiBzb2NpYWxfc2VydmljZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2Ygc29jaWFsIHNlcnZpY2VzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0Ugc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3M6OkZMT0FUL3NvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2Ygc29jaWFsIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gc29jaWFsIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2Ygc29jaWFsIHNlcnZpY2VzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIHNvY2lhbF9zZXJ2aWNlcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiBzb2NpYWwgc2VydmljZXMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzczo6RkxPQVQvc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBzb2NpYWwgc2VydmljZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzb2NpYWwgc2VydmljZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHNvY2lhbCBzZXJ2aWNlcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHNvY2lhbF9zZXJ2aWNlcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY29yZSBvZiBzb2NpYWwgc2VydmljZXMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzczo6RkxPQVQvc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBzb2NpYWwgc2VydmljZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzb2NpYWwgc2VydmljZXMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHNvY2lhbCBzZXJ2aWNlcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2Vfc29jaWFsX3N2Y3MNCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gc29jaWFsIHNlcnZpY2VzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnNvY2lhbF9zdmNzID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBzb2NpYWxfc2VydmljZXNfc2NvcmUgLyB0bXBfcG9wLnNvY2lhbF9zdmNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIHNvY2lhbCBzZXJ2aWNlcyBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIHNvY2lhbCBzZXJ2aWNlcyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzb2NpYWxfc2VydmljZXMgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzb2NpYWxfc2VydmljZXMgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiBzb2NpYWwgc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBzb2NpYWwgc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBzb2NpYWxfc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNvY2lhbF9zZXJ2aWNlcyBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBzb2NpYWxfc2VydmljZXMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gc29jaWFsIHNlcnZpY2VzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHNvY2lhbCBzZXJ2aWNlIGxvY2F0aW9uIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHNvY2lhbCBzZXJ2aWNlcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2Ygc29jaWFsIHNlcnZpY2VzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgc29jaWFsX3NlcnZpY2VzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzb2NpYWxfc2VydmljZXMgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc29jaWFsX3NlcnZpY2VzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHNvY2lhbCBzZXJ2aWNlcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBzb2NpYWwgc2VydmljZSBsb2NhdGlvbiBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHNvY2lhbCBzZXJ2aWNlcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBzb2NpYWwgc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHNvY2lhbF9zZXJ2aWNlcyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc29jaWFsX3NlcnZpY2VzIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNvY2lhbF9zZXJ2aWNlcyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBzb2NpYWwgc2VydmljZXMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggc29jaWFsIHNlcnZpY2UgbG9jYXRpb24gZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBzb2NpYWwgc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2Ygc29jaWFsIHNlcnZpY2VzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBzb2NpYWxfc2VydmljZXMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHBhcmtzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIHBhcmtzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byBwYXJrcycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocGFya3NfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwYXJrc19sb3dfc3RyZXNzKSAvIFNVTShwYXJrc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgcGFya3MgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSBwYXJrcy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gcGFya3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgcGFya3MgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwYXJrc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBhcmtzX2xvd19zdHJlc3M6OkZMT0FUL3BhcmtzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwYXJrcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHBhcmtzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgcGFya3Mgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgcGFya3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgcGFya3MgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwYXJrc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBhcmtzX2xvd19zdHJlc3M6OkZMT0FUL3BhcmtzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwYXJrcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHBhcmtzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBwYXJrcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHBhcmtzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHBhcmtzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcGFya3NfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwYXJrc19sb3dfc3RyZXNzOjpGTE9BVC9wYXJrc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcGFya3MgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBwYXJrcyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgcGFya3Mgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX3BhcmtzDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHBhcmtzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnBhcmtzID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBwYXJrc19zY29yZSAvIHRtcF9wb3AucGFya3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgcGFya3Mgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBwYXJrcyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwYXJrcyBwb3Agc2hlZCBhdmVyYWdlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICdBdmVyYWdlIHBhcmtzIGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2YgcGFya3MgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBwYXJrcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGFya3MNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BhcmtzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcGFya3MgcG9wIHNoZWQgbWVkaWFuIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICdNZWRpYW4gcGFya3MgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gcGFya3MNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggcGFya3MgZXhwcmVzc2VkIGFzIGEgbWVkaWFuIG9mIGFsbA0KICAgICAgICAgICAgcGFya3MgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgcGFya3MgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGFya3MuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwYXJrcyBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBwYXJrcyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBwYXJrcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBwYXJrcyBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDcwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBwYXJrcyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3BhcmtzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBhcmtzIHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHBhcmtzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHBhcmtzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHBhcmtzIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgcGFya3MgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcGFya3MgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHBhcmtzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGFya3MNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BhcmtzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gdHJhaWxzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIHRyYWlscyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdHJhaWxzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTSh0cmFpbHNfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTSh0cmFpbHNfbG93X3N0cmVzcykgLyBTVU0odHJhaWxzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiB0cmFpbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSB0cmFpbHMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIHRyYWlscyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiB0cmFpbHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB0cmFpbHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB0cmFpbHNfbG93X3N0cmVzczo6RkxPQVQvdHJhaWxzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0cmFpbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0cmFpbHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB0cmFpbHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgdHJhaWxzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHRyYWlscyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHRyYWlsc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHRyYWlsc19sb3dfc3RyZXNzOjpGTE9BVC90cmFpbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHRyYWlscyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRyYWlscyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdHJhaWxzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgdHJhaWxzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHRyYWlscyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHRyYWlsc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHRyYWlsc19sb3dfc3RyZXNzOjpGTE9BVC90cmFpbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHRyYWlscyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRyYWlscyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdHJhaWxzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV90cmFpbHMNCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gdHJhaWxzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnRyYWlscyA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogdHJhaWxzX3Njb3JlIC8gdG1wX3BvcC50cmFpbHMgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgdHJhaWxzIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgdHJhaWxzIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBjb21tdW5pdHlfY2VudGVycw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSBjb21tdW5pdHlfY2VudGVycyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gY29tbXVuaXR5IGNlbnRlcnMnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0oY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcykgLyBTVU0oY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnTnVtYmVyIG9mIGNvbW11bml0eSBjZW50ZXJzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgY29tbXVuaXR5IGNlbnRlcnMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIGNvbW11bml0eSBjZW50ZXJzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIGNvbW11bml0eSBjZW50ZXJzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOjpGTE9BVC9jb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgY29tbXVuaXR5IGNlbnRlcnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIGNvbW11bml0eSBjZW50ZXJzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIGNvbW11bml0eSBjZW50ZXJzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIGNvbW11bml0eSBjZW50ZXJzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzOjpGTE9BVC9jb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgY29tbXVuaXR5IGNlbnRlcnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgY29tbXVuaXR5IGNlbnRlcnMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY29yZSBvZiBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzczo6RkxPQVQvY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGNvbW11bml0eSBjZW50ZXJzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gY29tbXVuaXR5IGNlbnRlcnMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIGNvbW11bml0eSBjZW50ZXJzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9jb21tX2N0cnMNCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gY29tbXVuaXR5IGNlbnRlcnMnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AuY29tbV9jdHJzID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBjb21tdW5pdHlfY2VudGVyc19zY29yZSAvIHRtcF9wb3AuY29tbV9jdHJzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIGNvbW11bml0eSBjZW50ZXJzIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgY29tbXVuaXR5IGNlbnRlcnMgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29tbXVuaXR5IGNlbnRlcnMgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnQXZlcmFnZSBjb21tdW5pdHkgY2VudGVycyBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIGNvbW11bml0eSBjZW50ZXJzIGluIHRoZSBzdHVkeSBhcmVhIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mDQogICAgICAgICAgICBhbGwgY29tbXVuaXR5IGNlbnRlcnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGNvbW11bml0eSBjZW50ZXJzIHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnTWVkaWFuIGNvbW11bml0eSBjZW50ZXJzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGNvbW11bml0eSBjZW50ZXJzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGNvbW11bml0eSBjZW50ZXJzIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIGNvbW11bml0eSBjZW50ZXJzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIGNvbW11bml0eSBjZW50ZXJzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29tbXVuaXR5IGNlbnRlcnMgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgY29tbXVuaXR5IGNlbnRlcnMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gY29tbXVuaXR5IGNlbnRlcnMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggY29tbXVuaXR5IGNlbnRlcnMgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgY29tbXVuaXR5IGNlbnRlcnMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBjb21tdW5pdHkgY2VudGVycyBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBjb21tdW5pdHkgY2VudGVycyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBjb21tdW5pdHkgY2VudGVycw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBjb21tdW5pdHkgY2VudGVycyBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIGNvbW11bml0eSBjZW50ZXJzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIGNvbW11bml0eSBjZW50ZXJzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBjb21tdW5pdHkgY2VudGVycyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHRyYW5zaXQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgdHJhbnNpdCBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdUcmFuc2l0JywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdHJhbnNpdCcsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0odHJhbnNpdF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHRyYW5zaXRfbG93X3N0cmVzcykgLyBTVU0odHJhbnNpdF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgdHJhbnNpdCBzdGF0aW9ucyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IHRyYW5zaXQgc3RhdGlvbnMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIHRyYW5zaXQgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnVHJhbnNpdCcsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgdHJhbnNpdCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHRyYW5zaXRfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB0cmFuc2l0X2xvd19zdHJlc3M6OkZMT0FUL3RyYW5zaXRfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHRyYW5zaXQgc3RhdGlvbnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0cmFuc2l0IHN0YXRpb25zIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdHJhbnNpdCBzdGF0aW9ucyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSB0cmFuc2l0IGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1RyYW5zaXQnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHRyYW5zaXQgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB0cmFuc2l0X2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgdHJhbnNpdF9sb3dfc3RyZXNzOjpGTE9BVC90cmFuc2l0X2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0cmFuc2l0IHN0YXRpb25zIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdHJhbnNpdCBzdGF0aW9ucyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdHJhbnNpdCBzdGF0aW9ucyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHRyYW5zaXQgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnVHJhbnNpdCcsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgdHJhbnNpdCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHRyYW5zaXRfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB0cmFuc2l0X2xvd19zdHJlc3M6OkZMT0FUL3RyYW5zaXRfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHRyYW5zaXQgc3RhdGlvbnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0cmFuc2l0IHN0YXRpb25zIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB0cmFuc2l0IHN0YXRpb25zIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV90cmFuc2l0DQopDQpTRUxFQ1QgICdUcmFuc2l0JywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHRyYW5zaXQnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AudHJhbnNpdCA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogdHJhbnNpdF9zY29yZSAvIHRtcF9wb3AudHJhbnNpdCBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSB0cmFuc2l0IHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgdHJhbnNpdCBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSB0cmFuc2l0IHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdUcmFuc2l0JywNCiAgICAgICAgJ0F2ZXJhZ2UgdHJhbnNpdCBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCB0cmFuc2l0IHN0YXRpb25zIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgdHJhbnNpdCBzdGF0aW9ucyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSB0cmFuc2l0IHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1RyYW5zaXQnLA0KICAgICAgICAnTWVkaWFuIHRyYW5zaXQgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdHJhbnNpdCBzdGF0aW9ucw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCB0cmFuc2l0IHN0YXRpb25zIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgaGFsZiBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSB0cmFuc2l0IHN0YXRpb24gZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0DQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0Lmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gdHJhbnNpdCBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdUcmFuc2l0JywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSB0cmFuc2l0IHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRyYW5zaXQgc3RhdGlvbnMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggdHJhbnNpdCBzdGF0aW9ucyBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgdHJhbnNpdCBzdGF0aW9ucyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgdHJhbnNpdCBzdGF0aW9uIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdC5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHRyYW5zaXQgcG9wIHNoZWQgMzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnVHJhbnNpdCcsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgdHJhbnNpdCBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byB0cmFuc2l0IHN0YXRpb25zDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHRyYW5zaXQgc3RhdGlvbnMgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICB0cmFuc2l0IHN0YXRpb25zIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgMzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHRyYW5zaXQgc3RhdGlvbiBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHM7DQpgYGANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRSwgb3V0cHV0LnZhciA9ICJibmFfc2NvcmVfdGFibGUifQ0KDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXM7DQoNCkNSRUFURSBUQUJMRSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBzY29yZV9pZCBURVhULA0KICAgIHNjb3JlX29yaWdpbmFsIE5VTUVSSUMoMTYsNCksDQogICAgc2NvcmVfbm9ybWFsaXplZCBOVU1FUklDKDE2LDQpLA0KICAgIGh1bWFuX2V4cGxhbmF0aW9uIFRFWFQNCik7DQoNCi0tIHBvcHVsYXRpb24NCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAncGVvcGxlJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9wb3A7DQoNCi0tIGVtcGxveW1lbnQNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnb3Bwb3J0dW5pdHlfZW1wbG95bWVudCcsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfZW1wOw0KDQotLSBrMTIgZWR1Y2F0aW9uDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ29wcG9ydHVuaXR5X2sxMl9lZHVjYXRpb24nLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX2sxMjsNCg0KLS0gdGVjaCBzY2hvb2wNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnb3Bwb3J0dW5pdHlfdGVjaG5pY2FsX3ZvY2F0aW9uYWxfY29sbGVnZScsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfdGVjaDsNCg0KLS0gaGlnaGVyIGVkDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ29wcG9ydHVuaXR5X2hpZ2hlcl9lZHVjYXRpb24nLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX3VuaXY7DQoNCi0tIG9wcG9ydHVuaXR5DQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ29wcG9ydHVuaXR5JywNCiAgICAgICAgKA0KICAgICAgICAgICAgMC4zNSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnb3Bwb3J0dW5pdHlfZW1wbG95bWVudCcpDQogICAgICAgICAgICArIDAuMzUgKiAoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ29wcG9ydHVuaXR5X2sxMl9lZHVjYXRpb24nKQ0KICAgICAgICAgICAgKyAwLjEgKiAoc2VsZWN0IHNjb3JlX29yaWdpbmFsIGZyb20gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIHdoZXJlIHNjb3JlX2lkID0gJ29wcG9ydHVuaXR5X3RlY2huaWNhbF92b2NhdGlvbmFsX2NvbGxlZ2UnKQ0KICAgICAgICAgICAgKyAwLjIgKiAoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ29wcG9ydHVuaXR5X2hpZ2hlcl9lZHVjYXRpb24nKQ0KICAgICAgICApIC8NCiAgICAgICAgKA0KICAgICAgICAgICAgMC4zNQ0KICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgc2Nob29sc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gMC4zNQ0KICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgY29sbGVnZXNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMQ0KICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjINCiAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgKSwNCiAgICAgICAgTlVMTDsNCg0KLS0gZG9jdG9ycw0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdjb3JlX3NlcnZpY2VzX2RvY3RvcnMnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX2RvY3RvcjsNCg0KLS0gZGVudGlzdHMNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnY29yZV9zZXJ2aWNlc19kZW50aXN0cycsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfZGVudGlzdDsNCg0KLS0gaG9zcGl0YWxzDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ2NvcmVfc2VydmljZXNfaG9zcGl0YWxzJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9ob3NwaXRhbDsNCg0KLS0gcGhhcm1hY2llcw0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdjb3JlX3NlcnZpY2VzX3BoYXJtYWNpZXMnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX3BoYXJtYWN5Ow0KDQotLSBncm9jZXJ5DQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ2NvcmVfc2VydmljZXNfZ3JvY2VyeScsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfZ3JvY2VyeTsNCg0KLS0gc29jaWFsIHNlcnZpY2VzDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ2NvcmVfc2VydmljZXNfc29jaWFsX3NlcnZpY2VzJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9zb2NpYWxfc3ZjczsNCg0KLS0gY29yZSBzZXJ2aWNlcw0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdjb3JlX3NlcnZpY2VzJywNCiAgICAgICAgQ0FTRQ0KICAgICAgICBXSEVOIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQogICAgICAgICAgICBXSEVSRSAgIGRvY3RvcnNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICBPUiAgICAgIGRlbnRpc3RzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgT1IgICAgICBob3NwaXRhbHNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICBPUiAgICAgIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICBPUiAgICAgIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgIE9SICAgICAgc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICApDQogICAgICAgICAgICBUSEVOICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgIDAuMiAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlc19kb2N0b3JzJykNCiAgICAgICAgICAgICAgICAgICAgICAgICsgMC4xICogKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdjb3JlX3NlcnZpY2VzX2RlbnRpc3RzJykNCiAgICAgICAgICAgICAgICAgICAgICAgICsgMC4yICogKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdjb3JlX3NlcnZpY2VzX2hvc3BpdGFscycpDQogICAgICAgICAgICAgICAgICAgICAgICArIDAuMSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlc19waGFybWFjaWVzJykNCiAgICAgICAgICAgICAgICAgICAgICAgICsgMC4yNSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlc19ncm9jZXJ5JykNCiAgICAgICAgICAgICAgICAgICAgICAgICsgMC4xNSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlc19zb2NpYWxfc2VydmljZXMnKQ0KICAgICAgICAgICAgICAgICAgICApIC8NCiAgICAgICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGRvY3RvcnNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4yDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgZGVudGlzdHNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgaG9zcGl0YWxzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjI1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMTUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICBFTFNFIE5VTEwNCiAgICAgICAgRU5ELA0KICAgICAgICBOVUxMOw0KDQotLSByZXRhaWwNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAncmV0YWlsJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9yZXRhaWw7DQoNCi0tIHBhcmtzDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ3JlY3JlYXRpb25fcGFya3MnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX3BhcmtzOw0KDQotLSB0cmFpbHMNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAncmVjcmVhdGlvbl90cmFpbHMnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX3RyYWlsczsNCg0KLS0gY29tbXVuaXR5X2NlbnRlcnMNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAncmVjcmVhdGlvbl9jb21tdW5pdHlfY2VudGVycycsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfY29tbV9jdHJzOw0KDQotLSByZWNyZWF0aW9uDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ3JlY3JlYXRpb24nLA0KICAgICAgICBDQVNFDQogICAgICAgIFdIRU4gRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCiAgICAgICAgICAgIFdIRVJFICAgcGFya3NfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICBPUiAgICAgIHRyYWlsc19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgIE9SICAgICAgY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICkNCiAgICAgICAgICAgIFRIRU4gICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgMC40ICogKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdyZWNyZWF0aW9uX3BhcmtzJykNCiAgICAgICAgICAgICAgICAgICAgICAgICsgMC4zNSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAncmVjcmVhdGlvbl90cmFpbHMnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjI1ICogKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdyZWNyZWF0aW9uX2NvbW11bml0eV9jZW50ZXJzJykNCiAgICAgICAgICAgICAgICAgICAgKSAvDQogICAgICAgICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBwYXJrc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSB0cmFpbHNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMzUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjI1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgRUxTRSBOVUxMDQogICAgICAgIEVORCwNCiAgICAgICAgTlVMTDsNCg0KLS0gdHJhbnNpdA0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICd0cmFuc2l0JywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV90cmFuc2l0Ow0KDQotLSBjYWxjdWxhdGUgb3ZlcmFsbCBuZWlnaGJvcmhvb2Qgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnb3ZlcmFsbF9zY29yZScsDQogICAgICAgICgNCiAgICAgICAgICAgID9wZW9wbGUgKiBDT0FMRVNDRSgoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ3Blb3BsZScpLDApDQogICAgICAgICAgICArID9vcHBvcnR1bml0eSAqIENPQUxFU0NFKChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnb3Bwb3J0dW5pdHknKSwwKQ0KICAgICAgICAgICAgKyA/Y29yZV9zZXJ2aWNlcyAqIENPQUxFU0NFKChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlcycpLDApDQogICAgICAgICAgICArID9yZXRhaWwgKiBDT0FMRVNDRSgoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ3JldGFpbCcpLDApDQogICAgICAgICAgICArID9yZWNyZWF0aW9uICogQ09BTEVTQ0UoKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdyZWNyZWF0aW9uJyksMCkNCiAgICAgICAgICAgICsgP3RyYW5zaXQgKiBDT0FMRVNDRSgoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ3RyYW5zaXQnKSwwKQ0KICAgICAgICApIC8NCiAgICAgICAgKA0KICAgICAgICAgICAgP3Blb3BsZSArID9vcHBvcnR1bml0eQ0KICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgZG9jdG9yc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gP2NvcmVfc2VydmljZXMNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgZGVudGlzdHNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID9jb3JlX3NlcnZpY2VzDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGhvc3BpdGFsc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gP2NvcmVfc2VydmljZXMNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgcGhhcm1hY2llc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gP2NvcmVfc2VydmljZXMNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiA/Y29yZV9zZXJ2aWNlcw0KICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID9jb3JlX3NlcnZpY2VzDQogICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSByZXRhaWxfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID9yZXRhaWwNCiAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIHBhcmtzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiA/cmVjcmVhdGlvbg0KICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSB0cmFpbHNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID9yZWNyZWF0aW9uDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiA/cmVjcmVhdGlvbg0KICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgdHJhbnNpdF9oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gP3RyYW5zaXQNCiAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgKSwNCiAgICAgICAgTlVMTDsNCg0KLS0gbm9ybWFsaXplDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3Jlcw0KU0VUICAgICBzY29yZV9ub3JtYWxpemVkID0gc2NvcmVfb3JpZ2luYWwgKiA/dG90YWw7DQoNCi0tIHBvcHVsYXRpb24NCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAncG9wdWxhdGlvbl90b3RhbCcsDQogICAgICAgICgNCiAgICAgICAgICAgIFNFTEVDVCBTVU0ocGFydGlhbF9wKSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhiLmdlb21ldHJ5LGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICAnVG90YWwgcG9wdWxhdGlvbiBvZiBib3VuZGFyeSc7DQoNCg0KLS0gaGlnaCBhbmQgbG93IHN0cmVzcyB0b3RhbCBtaWxlYWdlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAndG90YWxfa21fbG93X3N0cmVzcycsDQogICAgKA0KICAgICAgICBTRUxFQ1QNCiAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICBTVU0oU1RfTGVuZ3RoKFNUX0ludGVyc2VjdGlvbih3Lmdlb20sIGIuZ2VvbWV0cnkpKSAqDQogICAgICAgICAgICAgICAgICAgIENBU0UgZnRfc2VnX3N0cmVzcyBXSEVOIDEgVEhFTiAxIEVMU0UgMCBFTkQpICsNCiAgICAgICAgICAgICAgICBTVU0oU1RfTGVuZ3RoKFNUX0ludGVyc2VjdGlvbih3Lmdlb20sIGIuZ2VvbWV0cnkpKSAqDQogICAgICAgICAgICAgICAgICAgIENBU0UgdGZfc2VnX3N0cmVzcyBXSEVOIDEgVEhFTiAxIEVMU0UgMCBFTkQpDQogICAgICAgICAgICApIC8gMTAwMCBhcyBkaXN0DQogICAgICAgIEZST00gcmVjZWl2ZWQuc2Ffd2F5cyBhcyB3LCByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgIFdIRVJFIFNUX0ludGVyc2VjdHMody5nZW9tLCBiLmdlb21ldHJ5KQ0KICAgICksDQogICAgJ1RvdGFsIGxvdy1zdHJlc3Mga20nOw0KDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAndG90YWxfa21faGlnaF9zdHJlc3MnLA0KICAgICgNCiAgICAgICAgU0VMRUNUDQogICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgU1VNKFNUX0xlbmd0aChTVF9JbnRlcnNlY3Rpb24ody5nZW9tLCBiLmdlb21ldHJ5KSkgKg0KICAgICAgICAgICAgICAgICAgICBDQVNFIGZ0X3NlZ19zdHJlc3MgV0hFTiAzIFRIRU4gMSBFTFNFIDAgRU5EKSArDQogICAgICAgICAgICAgICAgU1VNKFNUX0xlbmd0aChTVF9JbnRlcnNlY3Rpb24ody5nZW9tLCBiLmdlb21ldHJ5KSkgKg0KICAgICAgICAgICAgICAgICAgICBDQVNFIHRmX3NlZ19zdHJlc3MgV0hFTiAzIFRIRU4gMSBFTFNFIDAgRU5EKQ0KICAgICAgICAgICAgKSAvIDEwMDAgYXMgZGlzdA0KICAgICAgICBGUk9NIHJlY2VpdmVkLnNhX3dheXMgYXMgdywgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICBXSEVSRSBTVF9JbnRlcnNlY3RzKHcuZ2VvbSwgYi5nZW9tZXRyeSkNCiAgICApLA0KICAgICdUb3RhbCBoaWdoLXN0cmVzcyBrbSc7DQoNClVQREFURSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMNClNFVCAgICBzY29yZV9ub3JtYWxpemVkID0gUk9VTkQoc2NvcmVfb3JpZ2luYWwsIDEpDQpXSEVSRSAgc2NvcmVfaWQgaW4gKCd0b3RhbF9rbV9sb3dfc3RyZXNzJywgJ3RvdGFsX2ttX2hpZ2hfc3RyZXNzJyk7DQoNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzDQpgYGANCg0KIyMgUmVzdWx0cyANCg0KVGhlIG92ZXJhbGwgcmVzdWx0cyBvYnRhaW5lZCBpbmNsdWRlIHRoZSBmaW5hbCBzY29yZSBmb3IgdGhlIHdob2xlIGNpdHksIGFzIHdlbGwgYXMgdGhlIHNjb3JlIHBlciBkZXN0aW5hdGlvbiBjYXRlZ29yeS4gVGhlIHRvdGFsIHBvcHVsYXRpb24gYW5kIHN0cmVzcyBuZXR3b3JrIGlzIGFsc28gY2FsY3VsYXRlZC4gVGhlIHJlc3VsdHMgY2FuIGJlIG9ic2VydmVkIG9uIHRoZSBmb2xsb3dpbmcgdGFibGUuIA0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9DQpibmFfZGlzcGxheSA8LSBibmFfc2NvcmVfdGFibGUNCg0KYm5hX2Rpc3BsYXkkY2F0ZWdvcnkgPC0gYygNCiAgIlRvdGFsIFBlb3BsZSIsDQogICJFbXBsb3ltZW50IiwNCiAgIkstMTIgRWR1Y2F0aW9uIiwNCiAgIlRlY2huaWNhbC92b2NhdGlvbmFsIHNjaG9vbCIsDQogICJIaWdoZXIgRWR1Y2F0aW9uIiwNCiAgIlRvdGFsIE9wcG9ydHVuaXR5IiwNCiAgIkRvY3RvciBvZmZpY2VzL2NsaW5pY3MiLA0KICAiRGVudGlzdCBvZmZpY2VzIiwNCiAgIkhvc3BpdGFscyIsDQogICJQaGFybWFjaWVzIiwNCiAgIlN1cGVybWFya2V0cyIsDQogICJTb2NpYWwgc2VydmljZXMiLA0KICAiVG90YWwgQ29yZSBTZXJ2aWNlcyIsDQogICJUb3RhbCBSZXRhaWwgc2hvcHBpbmciLA0KICAiUGFya3MiLA0KICAiUmVjcmVhdGlvbmFsIHRyYWlscyIsDQogICJDb21tdW5pdHkgY2VudGVycyIsDQogICJUb3RhbCBSZWNyZWF0aW9uIiwNCiAgIlRvdGFsIFRyYW5zaXQiLA0KICAiT3ZlcmFsbCBTY29yZSIsDQogICJQb3B1bGF0aW9uIiwNCiAgIkxlbmd0aCBvZiBMb3cgU3RyZXNzIE5ldHdvcmsgKGttKSIsDQogICJMZW5ndGggb2YgSGlnaCBTdHJlc3MgTmV0d29yayAoa20pIg0KKQ0KDQpibmFfZGlzcGxheSRpZCA8LSBOVUxMDQpibmFfZGlzcGxheSRzY29yZV9pZCA8LSBOVUxMDQoNCmJuYV9kaXNwbGF5JHNjb3JlIDwtIGJuYV9kaXNwbGF5JHNjb3JlX25vcm1hbGl6ZWQNCmJuYV9kaXNwbGF5WzIxLDVdIDwtIHJvdW5kKGJuYV9kaXNwbGF5WzIxLDFdLDApDQoNCmJuYV9kaXNwbGF5JHNjb3JlX29yaWdpbmFsIDwtIE5VTEwNCmJuYV9kaXNwbGF5JHNjb3JlX25vcm1hbGl6ZWQgPC0gTlVMTA0KDQpibmFfZGlzcGxheSA8LSBibmFfZGlzcGxheVtjKDIwOjIzLDE6MTkpLF0NCnJvdy5uYW1lcyhibmFfZGlzcGxheSkgPC0gTlVMTA0KDQpibmFfZGlzcGxheSA8LSBibmFfZGlzcGxheSAlPiUgbXV0YXRlKA0KICBjYXRlZ29yeSA9IGNlbGxfc3BlYygNCiAgICBjYXRlZ29yeSwNCiAgICBib2xkID0gaWZlbHNlKA0KICAgICAgZ3JlcGwoIlRvdGFsIixjYXRlZ29yeSksDQogICAgICBULCANCiAgICAgIEYNCiAgICApDQogICksDQogIHNjb3JlID0gY2VsbF9zcGVjKA0KICAgIHNjb3JlLA0KICAgICJodG1sIiwgDQogICAgY29sb3IgPSBpZmVsc2UoDQogICAgICBzY29yZSA+PSA1NCAmIHNjb3JlIDwgMTAwLA0KICAgICAgIiMwMDlhY2QiLA0KICAgICAgaWZlbHNlKA0KICAgICAgICBzY29yZSA8IDU0LA0KICAgICAgICAiI2ZmMzAzMCIsDQogICAgICAgICIjNjY2NjY2Ig0KICAgICAgICApDQogICAgKQ0KICApDQopDQoNCmNvbG5hbWVzKGJuYV9kaXNwbGF5KSA8LSBjKCJwb3BvdmVyIiwiIiwiU2NvcmUvVmFsdWUiKQ0KDQprYWJsZSgNCiAgYm5hX2Rpc3BsYXlbMjozXSwgDQogIGFsaWduID0gYygibCIsInIiKSwgDQogIGZvcm1hdCA9ICJodG1sIiwgDQogIGVzY2FwZSA9IEYNCikgJT4lIA0KICAga2FibGVfc3R5bGluZygNCiAgICAgImhvdmVyIiwNCiAgICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgICBwb3NpdGlvbiA9ICJjZW50ZXIiDQogICkgJT4lIA0KICBncm91cF9yb3dzKCJQZW9wbGUiLCA1LCA1KSAlPiUgDQogIGdyb3VwX3Jvd3MoIk9wcG9ydHVuaXR5IiwgNiwgMTApICU+JSANCiAgZ3JvdXBfcm93cygiQ29yZSBTZXJ2aWNlcyIsIDExLCAxNykgJT4lIA0KICBncm91cF9yb3dzKCJSZXRhaWwiLCAxOCwgMTgpICU+JQ0KICBncm91cF9yb3dzKCJSZWNyZWF0aW9uIiwgMTksIDIyKSAlPiUgDQogIGdyb3VwX3Jvd3MoIlRyYW5zaXQiLCAyMywgMjMpDQpgYGANCg0KV2UgY2FuIHBsb3QgdGhlIHJlc3VsdHMgdG8gaGF2ZSBhIHF1aWNrIHZpZXcgb2YgdGhlIG91dHB1dCwgaW5jbHVkaW5nIHRoZSBoaWdoIGFuZCBsb3cgc3RyZXNzIG5ldHdvcmsgaW4gYW4gaW50ZXJhY3RpdmUgd2F5LiANCg0KYGBge3IsIHdhcm5pbmcgPSBGQUxTRX0NCmxpYnJhcnkoc2YpDQpibmFfc2NvcmUgPC0gc3RfcmVhZCgNCiAgZHNuID0gY29ubmVjdGlvbiwNCiAgbGF5ZXIgPSBjKCJnZW5lcmF0ZWQiLCJzYV9wb3BfZ3JpZCIpDQopDQoNCnN0cmVzc19uZXR3b3JrIDwtIHN0X3JlYWQoDQogIGRzbiA9IGNvbm5lY3Rpb24sDQogIHF1ZXJ5ID0gIlNFTEVDVCBmdF9zZWdfc3RyZXNzLCB0Zl9zZWdfc3RyZXNzLCBnZW9tIEZST00gcmVjZWl2ZWQuc2Ffd2F5cyINCikNCmBgYA0KDQpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodD0gOCwgIGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0V9DQpibmFfcGFsIDwtIGMoIiNGQzcxNTEiLCIjREM3RTZBIiwiI0M5ODg3NSIsIiNDMDhCODMiLCIjQUQ5Mzk2IiwNCiAgICAgICAgICAgICAiIzlDOUE5RiIsIiM5MjlFQUMiLCIjNzhBQUM1IiwiIzZGQURDQiIsIiM0OUJGRTYiKQ0KDQpibmFfYnJlYWtzIDwtIGMoNiwxMiwxOCwyNCwzMCwzNiw0Miw0OCw1NCwxMDApDQoNCnN0cmVzc19uZXR3b3JrJGZ0X3N0cmVzcyA8LSBpZmVsc2Uoc3RyZXNzX25ldHdvcmskZnRfc2VnX3N0cmVzcyA9PSAxLCJsb3cgc3RyZXNzIiwiaGlnaCBzdHJlc3MiKQ0Kc3RyZXNzX25ldHdvcmskdGZfc3RyZXNzIDwtIGlmZWxzZShzdHJlc3NfbmV0d29yayR0Zl9zZWdfc3RyZXNzID09IDEsImxvdyBzdHJlc3MiLCJoaWdoIHN0cmVzcyIpDQoNCmxpYnJhcnkodG1hcCkNCnRtYXBfbW9kZSgidmlldyIpDQppbnRfbWFwIDwtIA0KICB0bWFwOjp0bWFwX2xlYWZsZXQoDQogICAgIHRtYXA6OnRtX3ZpZXcoDQogICAgIGJhc2VtYXBzID0gYygNCiAgICAgICAiQ2FydG9EQi5Qb3NpdHJvbiIsDQogICAgICAgIkNhcnRvREIuRGFya01hdHRlciIsDQogICAgICAgIk9wZW5TdHJlZXRNYXAuTWFwbmlrIg0KICAgICApDQogICApICsNCiAgICAgdG1hcDo6dG1fc2hhcGUoYm5hX3Njb3JlKSArDQogICAgIHRtYXA6OnRtX3BvbHlnb25zKA0KICAgICAgIGNvbCA9ICJvdmVyYWxsX3Njb3JlIiwNCiAgICAgICBzdHlsZSA9ICJmaXhlZCIsDQogICAgICAgYnJlYWtzID0gYm5hX2JyZWFrcywNCiAgICAgICBwYWxldHRlID0gYm5hX3BhbCwNCiAgICAgICBhbHBoYSA9IDAuOCwNCiAgICAgICB0aXRsZSA9ICJCTkEgc2NvcmUiLA0KICAgICAgIGJvcmRlci5jb2wgPSBOVUxMLA0KICAgICAgIGNvbG9yTkEgPSBOVUxMLA0KICAgICAgIHNob3dOQSA9IEZBTFNFDQogICAgICApICsNCiAgICAgdG1hcDo6dG1fc2hhcGUoc3RyZXNzX25ldHdvcmspICsNCiAgICAgdG1hcDo6dG1fbGluZXMoDQogICAgICAgY29sID0gImZ0X3N0cmVzcyIsIA0KICAgICAgIGNvbG9yTkEgPSBOVUxMLA0KICAgICAgIHNob3dOQSA9IEZBTFNFLA0KICAgICAgIHBhbGV0dGUgPSBjKCJmaXJlYnJpY2sxIiwgImRlZXBza3libHVlMyIpLA0KICAgICAgIHRpdGxlLmNvbCA9ICJTdHJlc3MgbmV0d29yayINCiAgICAgICkgKw0KICAgICB0bWFwOjp0bV9zaGFwZShzdHJlc3NfbmV0d29yaykgKw0KICAgICB0bWFwOjp0bV9saW5lcygNCiAgICAgICBjb2wgPSAidGZfc3RyZXNzIiwgDQogICAgICAgY29sb3JOQSA9IE5VTEwsDQogICAgICAgc2hvd05BID0gRkFMU0UsDQogICAgICAgcGFsZXR0ZSA9IGMoImZpcmVicmljazEiLCAiZGVlcHNreWJsdWUzIiksDQogICAgICAgbGVnZW5kLmNvbC5zaG93ID0gRkFMU0UNCiAgICAgICkNCiAgKQ0KDQppbnRfbWFwDQpgYGANCg0KIyMgT2JzZXJ2YXRpb25zDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQ0KZW5kIDwtIFN5cy50aW1lKCkNCg0KZHVyYXRpb24gPC0gZW5kIC0gc3RhcnQNCg0KZHVyYXRpb24NCg0KZGJEaXNjb25uZWN0KGNvbm5lY3Rpb24pDQpgYGANCg0KKiBUaGUgdG90YWwgdGltZSB0aGF0IHRoaXMgcGFydGljdWxhciBjaXR5IHRvb2sgdG8gY29tcHV0ZSBpdHMgQk5BLCBpbmNsdWRpbmcgcGxvdHMsIG92ZXJwYXNzIGRvd25sb2FkLCBidXQgd2l0aG91dCBgR0VPU1RBVGAgZGF0YSBkb3dubG9hZCBvbiBzeXN0ZW0sIHVwbG9hZCBvbiBmaWxlLCBhbmQgcHJvY2Vzc2luZyBvbiBkYXRhYmFzZSB3YXMgKipgciByb3VuZChhcy5udW1lcmljKGR1cmF0aW9uKSwyKWAgbWludXRlcyoqLiBBZGRpbmcgdGhlIGBHRU9TVEFUYCBwcm9jZXNzaW5nIHRvIHRoZSB3b3JrZmxvdyBhZGRzIGFyb3VuZCA1IG1pbnV0ZXMuIE9mIGNvdXJzZSB0aGlzIGlzIGFsc28gc3ViamVjdCB0byBpbnRlcm5ldCBzcGVlZCBhbmQgY29tcHV0ZXIgcGVyZm9ybWFuY2UuIEkgcnVuIG15IGFuYWx5c2lzIG9uIGFuIEFzdXMgRjU0MVUsIEludGVsIENvcmUgaTcsIDhHQiBSQU0gYW5kIDI1NiBHQiBTU0QsIHdpdGggV2luZG93cyAxMCBPUy4NCg0KKiBXaGF0IGNhbiBiZSBvYnNlcnZlZCBmb3IgdGhlIHdob2xlIGFuYWx5c2lzIGlzIHRoYXQgdGhlIHJlc3VsdGluZyBCTkEgc2NvcmUgaXMgaGlnaGx5IGluZmx1ZW5jZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgam9iL2VtcGxveW1lbnQgZGF0YSBpcyBub3QgYXZhaWxhYmxlLiBIb3dldmVyLCB0aGlzIHdhcyBhbiBhdHRlbXB0IHRvIHJlcHJvZHVjZSB0aGUgc2NvcmUgYXMgY2xvc2UgYXMgcG9zc2libGUgYXMgUGZCIGFwcGx5IHRoZWlyIG1ldGhvZG9sb2d5LCBqdXN0IHRvIGV4cGxvcmUgaXRzIHJlcHJvZHVjaWJpbGl0eS4gDQoNCiogTXkgcGxhbiBuZXh0IGlzIHRvIGV4Y2x1ZGUgdGhpcyB2YXJpYWJsZSBmcm9tIHRoZSBCTkEgc2NvcmUgY29tcHV0YXRpb24sIGFuZCBwZXJoYXBzIGluY2x1ZGUgc29tZSBvdGhlciB2YXJpYWJsZXMgdGhhdCB3b3VsZCBzdWl0IHRoZSBFdXJvcGVhbiBjb250ZXh0IGJldHRlci4gDQoNCiogTXkgZmluYWwgZ29hbCBmb3IgdGhlIG1vbWVudCBpcyB0byB0cnkgdG8gdmFsaWRhdGUgdGhlIHNjb3JpbmcgbWV0aG9kb2xvZ3kgZm9yIEV1cm9wZS4gSSBwaWNrZWQgYSBjaXR5IGluIHRoZSBVSyBhcyBJIGtub3cgdGhlcmUgaXMgT3JpZ2luLURlc3RpbmF0aW9uIGRhdGEgYXZhaWxhYmxlIHRoYXQgY291bGQgYmUgdXNlZCBhcyBhIHZhbGlkYXRpb24gbWV0aG9kLiA=