Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active April 19, 2017 19:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/cb749ed23f778b46ef496f7dff478aa8 to your computer and use it in GitHub Desktop.
Save timelyportfolio/cb749ed23f778b46ef496f7dff478aa8 to your computer and use it in GitHub Desktop.
flextable and d3horizonR in R
license: mit

d3horizonR + flextable

David Gohel's flextable provides nice compact tables from R. Since horizon charts love small spaces, I wanted to demonstrate the combination of flextable and d3horizonR. d3horizonR is very alpha right now and a WIP, so the code below requires some manual manipulation and hacks to make it work. Once off my open source break, I will attempt to improve this.

Code

library(d3horizonR) # devtools::install_github("timelyportfolio/d3horizonR")
library(quantmod)

# get some stock data to use for our horizon charts
getSymbols("AAPL", from = "2016-01-01")
getSymbols("AMZN", from = "2016-01-01")
getSymbols("MSFT", from = "2016-01-01")

# cumulative rate of change function
croc <- function(stock) {return(stock[,6]/head(stock,1)[[6]] - 1)}

# test our croc function
plot(croc(AAPL))

# merge croc-transformed stock prices
stocks_croc <- merge(croc(AAPL), croc(AMZN), croc(MSFT))
colnames(stocks_croc) <- c("Apple", "Amazon", "Microsoft")
# visually inspect our croc-transformed stocks
plot.zoo(stocks_croc)

# make a quick d3 horizon chart
d3horizon(
  unname(lapply(stocks_croc, as.vector)),
  options = d3horizonOptions(
    # apply consistent scale to all the stocks
    extent = range(stocks_croc),
    height = 30,
    mode = "offset"
  ),
  width = 200,
  height = "auto"
)

# now try to integrate into a flextable
library(dplyr)
library(tidyr)
library(flextable) # devtools::install_github("davidgohel/flextable")
library(htmltools)

horizon_chr <- function(values, width = 200, height="auto", options=d3horizonOptions()) {
  htmltools::HTML(as.character(
    as.tags(
      d3horizon(
        list(values),
        options = options,
        height = height,
        width = width
      )
    )
  ))
}

tidyr::gather(as.data.frame(stocks_croc),stock) %>%
  group_by(stock) %>%
  summarise(
    croc = horizon_chr(
      value,
      options = d3horizonOptions(
        extent = range(stocks_croc),
        mode = "offset"
      ),
    )
  ) %>%
  flextable() %>%
  tabwid() %>%
  tagList(
    htmlwidgets:::widget_dependencies("d3horizon", package="d3horizonR")
  ) %>%
  browsable()

Screenshot

screenshot of stocks in a flextable

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgew0KICAvLyBJZiB3aW5kb3cuSFRNTFdpZGdldHMgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGVuIHVzZSBpdDsgb3RoZXJ3aXNlIGNyZWF0ZSBhDQogIC8vIG5ldyBvYmplY3QuIFRoaXMgYWxsb3dzIHByZWNlZGluZyBjb2RlIHRvIHNldCBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZQ0KICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLg0KICB3aW5kb3cuSFRNTFdpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHMgfHwge307DQoNCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLg0KICB2YXIgdmlld2VyTW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy52aWV3ZXJNb2RlID0NCiAgICAgIC9cYnZpZXdlcl9wYW5lPTFcYi8udGVzdCh3aW5kb3cubG9jYXRpb24pOw0KDQogIC8vIFNlZSBpZiB3ZSdyZSBydW5uaW5nIGluIFNoaW55IG1vZGUuIElmIG5vdCwgaXQncyBhIHN0YXRpYyBkb2N1bWVudC4NCiAgLy8gTm90ZSB0aGF0IHN0YXRpYyB3aWRnZXRzIGNhbiBhcHBlYXIgaW4gYm90aCBTaGlueSBhbmQgc3RhdGljIG1vZGVzLCBidXQNCiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4NCiAgdmFyIHNoaW55TW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy5zaGlueU1vZGUgPQ0KICAgICAgdHlwZW9mKHdpbmRvdy5TaGlueSkgIT09ICJ1bmRlZmluZWQiICYmICEhd2luZG93LlNoaW55Lm91dHB1dEJpbmRpbmdzOw0KDQogIC8vIFdlIGNhbid0IGNvdW50IG9uIGpRdWVyeSBiZWluZyBhdmFpbGFibGUsIHNvIHdlIGltcGxlbWVudCBvdXIgb3duDQogIC8vIHZlcnNpb24gaWYgbmVjZXNzYXJ5Lg0KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3Rvcikgew0KICAgIGlmICh0eXBlb2YoalF1ZXJ5KSAhPT0gInVuZGVmaW5lZCIgJiYgc2NvcGUgaW5zdGFuY2VvZiBqUXVlcnkpIHsNCiAgICAgIHJldHVybiBzY29wZS5maW5kKHNlbGVjdG9yKTsNCiAgICB9DQogICAgaWYgKHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwpIHsNCiAgICAgIHJldHVybiBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7DQogICAgaWYgKHZhbHVlID09PSBudWxsKQ0KICAgICAgcmV0dXJuIFtdOw0KICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQ0KICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIHJldHVybiBbdmFsdWVdOw0KICB9DQoNCiAgLy8gSW1wbGVtZW50IGpRdWVyeSdzIGV4dGVuZA0KICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICByZXR1cm4gdGFyZ2V0Ow0KICAgIH0NCiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsNCiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7DQogICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsNCiAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHRhcmdldDsNCiAgfQ0KDQogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4NCiAgZnVuY3Rpb24gZm9yRWFjaCh2YWx1ZXMsIGNhbGxiYWNrLCB0aGlzQXJnKSB7DQogICAgaWYgKHZhbHVlcy5mb3JFYWNoKSB7DQogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7DQogICAgfSBlbHNlIHsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIFJlcGxhY2VzIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiBmdW5jU291cmNlLg0KICAvLw0KICAvLyBOb3RlIHRoYXQgZnVuY1NvdXJjZSBzaG91bGQgbm90IEJFIHRoZSBuZXcgbWV0aG9kLCBpdCBzaG91bGQgYmUgYSBmdW5jdGlvbg0KICAvLyB0aGF0IFJFVFVSTlMgdGhlIG5ldyBtZXRob2QuIGZ1bmNTb3VyY2UgcmVjZWl2ZXMgYSBzaW5nbGUgYXJndW1lbnQgdGhhdCBpcw0KICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4NCiAgLy8gbWV0aG9kIGNhbiBiZSBjYWxsZWQgbGlrZSBhIHJlZ3VsYXIgZnVuY3Rpb24sIGl0IGhhcyB0aGUgdGFyZ2V0IHBlcm1hbmVudGx5DQogIC8vIGJvdW5kIHRvIGl0IHNvICJ0aGlzIiB3aWxsIHdvcmsgY29ycmVjdGx5Lg0KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsNCiAgICB2YXIgc3VwZXJGdW5jID0gdGFyZ2V0W21ldGhvZE5hbWVdIHx8IGZ1bmN0aW9uKCkge307DQogICAgdmFyIHN1cGVyRnVuY0JvdW5kID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsNCiAgICB9Ow0KICAgIHRhcmdldFttZXRob2ROYW1lXSA9IGZ1bmNTb3VyY2Uoc3VwZXJGdW5jQm91bmQpOw0KICB9DQoNCiAgLy8gQWRkIGEgbWV0aG9kIHRvIGRlbGVnYXRvciB0aGF0LCB3aGVuIGludm9rZWQsIGNhbGxzDQogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbg0KICAvLyB0aGUgZGVsZWdhdGVlLCBidXQgdGhlcmUgd2FzIG9uZSBvbiBkZWxlZ2F0b3IgYmVmb3JlDQogIC8vIGRlbGVnYXRlTWV0aG9kIHdhcyBjYWxsZWQsIHRoZW4gdGhlIG9yaWdpbmFsIHZlcnNpb24NCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLg0KICAvLyBGb3IgZXhhbXBsZToNCiAgLy8NCiAgLy8gdmFyIGEgPSB7DQogIC8vICAgbWV0aG9kMTogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMScpOyB9DQogIC8vICAgbWV0aG9kMjogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMicpOyB9DQogIC8vIH07DQogIC8vIHZhciBiID0gew0KICAvLyAgIG1ldGhvZDE6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYjEnKTsgfQ0KICAvLyB9Ow0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMSIpOw0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMiIpOw0KICAvLyBhLm1ldGhvZDEoKTsNCiAgLy8gYS5tZXRob2QyKCk7DQogIC8vDQogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4NCiAgZnVuY3Rpb24gZGVsZWdhdGVNZXRob2QoZGVsZWdhdG9yLCBkZWxlZ2F0ZWUsIG1ldGhvZE5hbWUpIHsNCiAgICB2YXIgaW5oZXJpdGVkID0gZGVsZWdhdG9yW21ldGhvZE5hbWVdOw0KICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHRhcmdldCA9IGRlbGVnYXRlZTsNCiAgICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZWVbbWV0aG9kTmFtZV07DQoNCiAgICAgIC8vIFRoZSBtZXRob2QgZG9lc24ndCBleGlzdCBvbiB0aGUgZGVsZWdhdGVlLiBJbnN0ZWFkLA0KICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIG9uIHRoZSBkZWxlZ2F0b3IsIGlmIGl0IGV4aXN0cy4NCiAgICAgIGlmICghbWV0aG9kKSB7DQogICAgICAgIHRhcmdldCA9IGRlbGVnYXRvcjsNCiAgICAgICAgbWV0aG9kID0gaW5oZXJpdGVkOw0KICAgICAgfQ0KDQogICAgICBpZiAobWV0aG9kKSB7DQogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOw0KICAgICAgfQ0KICAgIH07DQogIH0NCg0KICAvLyBJbXBsZW1lbnQgYSB2YWd1ZSBmYWNzaW1pbGllIG9mIGpRdWVyeSdzIGRhdGEgbWV0aG9kDQogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsNCiAgICAgIHJldHVybiBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXTsNCiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgew0KICAgICAgZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV0gPSB2YWx1ZTsNCiAgICAgIHJldHVybiBlbDsNCiAgICB9IGVsc2Ugew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBlbGVtZW50RGF0YTogIiArDQogICAgICAgIGFyZ3VtZW50cy5sZW5ndGgpOw0KICAgIH0NCiAgfQ0KDQogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleA0KICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csICJcXCQmIik7DQogIH0NCg0KICBmdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7DQogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOw0KICAgIHJldHVybiByZS50ZXN0KGVsLmNsYXNzTmFtZSk7DQogIH0NCg0KICAvLyBlbGVtZW50cyAtIGFycmF5IChvciBhcnJheS1saWtlIG9iamVjdCkgb2YgSFRNTCBlbGVtZW50cw0KICAvLyBjbGFzc05hbWUgLSBjbGFzcyBuYW1lIHRvIHRlc3QgZm9yDQogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsNCiAgLy8gICBpZiBmYWxzZSwgb25seSByZXR1cm4gZWxlbWVudHMgKndpdGhvdXQqIGdpdmVuIGNsYXNzTmFtZQ0KICBmdW5jdGlvbiBmaWx0ZXJCeUNsYXNzKGVsZW1lbnRzLCBjbGFzc05hbWUsIGluY2x1ZGUpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgIGlmIChoYXNDbGFzcyhlbGVtZW50c1tpXSwgY2xhc3NOYW1lKSA9PSBpbmNsdWRlKQ0KICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOw0KICAgIH0NCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmMsIGZhbHNlKTsNCiAgICB9IGVsc2UgaWYgKG9iai5hdHRhY2hFdmVudCkgew0KICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gb2ZmKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5yZW1vdmVFdmVudExpc3RlbmVyKQ0KICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7DQogICAgZWxzZSBpZiAob2JqLmRldGFjaEV2ZW50KSB7DQogICAgICBvYmouZGV0YWNoRXZlbnQoZXZlbnROYW1lLCBmdW5jKTsNCiAgICB9DQogIH0NCg0KICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aA0KICAvLyB0aGUgInBhZGRpbmciIENTUyBwcm9wZXJ0eQ0KICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcGFkZGluZw0KICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7DQogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJudW1iZXIiKQ0KICAgICAgdmFsdWUgPSBbdmFsdWVdOw0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzBdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVswXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVszXX07DQogICAgfQ0KICB9DQoNCiAgLy8gQ29udmVydCBhbiB1bnBhY2tlZCBwYWRkaW5nIG9iamVjdCB0byBhIENTUyB2YWx1ZQ0KICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgew0KICAgIHJldHVybiBwYWRkaW5nT2JqLnRvcCArICJweCAiICsgcGFkZGluZ09iai5yaWdodCArICJweCAiICsgcGFkZGluZ09iai5ib3R0b20gKyAicHggIiArIHBhZGRpbmdPYmoubGVmdCArICJweCI7DQogIH0NCg0KICAvLyBNYWtlcyBhIG51bWJlciBzdWl0YWJsZSBmb3IgQ1NTDQogIGZ1bmN0aW9uIHB4KHgpIHsNCiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikNCiAgICAgIHJldHVybiB4ICsgInB4IjsNCiAgICBlbHNlDQogICAgICByZXR1cm4geDsNCiAgfQ0KDQogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuDQogIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIG51bGwsIG9yIGFuIG9iamVjdCB3aXRoIGZpbGwsIHBhZGRpbmcsDQogIC8vIGRlZmF1bHRXaWR0aCwgZGVmYXVsdEhlaWdodCBmaWVsZHMuDQogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgew0KICAgIHZhciBzaXppbmdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2h0bWx3aWRnZXQtc2l6aW5nJ10iKTsNCiAgICBpZiAoIXNpemluZ0VsKQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgdmFyIHNwID0gSlNPTi5wYXJzZShzaXppbmdFbC50ZXh0Q29udGVudCB8fCBzaXppbmdFbC50ZXh0IHx8ICJ7fSIpOw0KICAgIGlmICh2aWV3ZXJNb2RlKSB7DQogICAgICByZXR1cm4gc3Audmlld2VyOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gc3AuYnJvd3NlcjsNCiAgICB9DQogIH0NCg0KICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLg0KICAvLyAgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgeWllbGRzIGENCiAgLy8gICBmdW5jdGlvbi4gT3IsIGNhbiBiZSBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggImNvZGUiIGFuZCAiZGF0YSINCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nDQogIC8vICAgb2YgSlMgdGhhdCdzIGFuIGV4cHIgdGhhdCB5aWVsZHMgYSBmdW5jdGlvbiwgYW5kICJkYXRhIiBzaG91bGQgYmUNCiAgLy8gICBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgd2hlbiB0aGF0DQogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLg0KICAvLyBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgdGhhdCB3aWxsIGJlICJ0aGlzIiBmb3IgZWFjaCBmdW5jdGlvbg0KICAvLyAgIGV4ZWN1dGlvbi4NCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlDQogIC8vICAgc2FtZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gYWxsIGZ1bmN0aW9ucy4pDQogIGZ1bmN0aW9uIGV2YWxBbmRSdW4odGFza3MsIHRhcmdldCwgYXJncykgew0KICAgIGlmICh0YXNrcykgew0KICAgICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykgew0KICAgICAgICB2YXIgdGhlc2VBcmdzID0gYXJnczsNCiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsNCiAgICAgICAgICB0aGVzZUFyZ3MgPSB0aGVzZUFyZ3MuY29uY2F0KFt0YXNrLmRhdGFdKTsNCiAgICAgICAgICB0YXNrID0gdGFzay5jb2RlOw0KICAgICAgICB9DQogICAgICAgIHZhciB0YXNrRnVuYyA9IGV2YWwoIigiICsgdGFzayArICIpIik7DQogICAgICAgIGlmICh0eXBlb2YodGFza0Z1bmMpICE9PSAiZnVuY3Rpb24iKSB7DQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOw0KICAgICAgICB9DQogICAgICAgIHRhc2tGdW5jLmFwcGx5KHRhcmdldCwgdGhlc2VBcmdzKTsNCiAgICAgIH0pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGluaXRTaXppbmcoZWwpIHsNCiAgICB2YXIgc2l6aW5nID0gc2l6aW5nUG9saWN5KGVsKTsNCiAgICBpZiAoIXNpemluZykNCiAgICAgIHJldHVybjsNCg0KICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsNCiAgICBpZiAoIWNlbCkNCiAgICAgIHJldHVybjsNCg0KICAgIGlmICh0eXBlb2Yoc2l6aW5nLnBhZGRpbmcpICE9PSAidW5kZWZpbmVkIikgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW4gPSAiMCI7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOw0KICAgIH0NCg0KICAgIGlmIChzaXppbmcuZmlsbCkgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOw0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9ICIxMDAlIjsNCiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsNCiAgICAgIGlmIChjZWwpIHsNCiAgICAgICAgY2VsLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsNCiAgICAgICAgdmFyIHBhZCA9IHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpOw0KICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5yaWdodCA9IHBhZC5yaWdodCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5ib3R0b20gPSBwYWQuYm90dG9tICsgInB4IjsNCiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7DQogICAgICAgIGVsLnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7DQogICAgICB9DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwNCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRIZWlnaHQ7IH0NCiAgICAgIH07DQoNCiAgICB9IGVsc2Ugew0KICAgICAgZWwuc3R5bGUud2lkdGggPSBweChzaXppbmcud2lkdGgpOw0KICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LA0KICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0OyB9DQogICAgICB9Ow0KICAgIH0NCiAgfQ0KDQogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzDQogIHZhciBkZWZhdWx0cyA9IHsNCiAgICBmaW5kOiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7DQogICAgfSwNCiAgICByZW5kZXJFcnJvcjogZnVuY3Rpb24oZWwsIGVycikgew0KICAgICAgdmFyICRlbCA9ICQoZWwpOw0KDQogICAgICB0aGlzLmNsZWFyRXJyb3IoZWwpOw0KDQogICAgICAvLyBBZGQgYWxsIHRoZXNlIGVycm9yIGNsYXNzZXMsIGFzIFNoaW55IGRvZXMNCiAgICAgIHZhciBlcnJDbGFzcyA9ICJzaGlueS1vdXRwdXQtZXJyb3IiOw0KICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7DQogICAgICAgIC8vIHVzZSB0aGUgY2xhc3NlcyBvZiB0aGUgZXJyb3IgY29uZGl0aW9uIGFzIENTUyBjbGFzcyBuYW1lcw0KICAgICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiAiICsgJC5tYXAoYXNBcnJheShlcnIudHlwZSksIGZ1bmN0aW9uKHR5cGUpIHsNCiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOw0KICAgICAgICB9KS5qb2luKCIgIik7DQogICAgICB9DQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7DQoNCiAgICAgIC8vIElzIGVsIGlubGluZSBvciBibG9jaz8gSWYgaW5saW5lIG9yIGlubGluZS1ibG9jaywganVzdCBkaXNwbGF5Om5vbmUgaXQNCiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLg0KICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuY3NzKCJkaXNwbGF5Iik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBkaXNwbGF5KTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgICRlbC5oaWRlKCk7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JTcGFuID0gJCgiPHNwYW4+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpOw0KICAgICAgICAgIGVycm9yU3Bhbi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKSB7DQogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlDQogICAgICAgIC8vIGVsLCBhbmQgcG9zaXRpb24gdGhlIGVycm9yIHRvIGJlIG9uIHRvcCBvZiB0aGUgZWwuDQogICAgICAgIC8vIE1hcmsgaXQgd2l0aCBhIHVuaXF1ZSBJRCBhbmQgQ1NTIGNsYXNzIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIuDQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JEaXYgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKGVyckNsYXNzKS5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIikNCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQ0KICAgICAgICAgICAgLy8gc2V0dGluZyB3aWR0aCBjYW4gcHVzaCBvdXQgdGhlIHBhZ2Ugc2l6ZSwgZm9yY2luZyBvdGhlcndpc2UNCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3INCiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHRvIHNocmluazsgc28gdXNlIG1heC13aWR0aCBpbnN0ZWFkDQogICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQ0KICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsNCiAgICAgICAgICBlcnJvckRpdi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JEaXYpOw0KDQogICAgICAgICAgLy8gUmVhbGx5IGR1bWIgd2F5IHRvIGtlZXAgdGhlIHNpemUvcG9zaXRpb24gb2YgdGhlIGVycm9yIGluIHN5bmMgd2l0aA0KICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZWxlbWVudCBhcyB0aGUgd2luZG93IGlzIHJlc2l6ZWQgb3Igd2hhdGV2ZXIuDQogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBpZiAoIWVycm9yRGl2WzBdLnBhcmVudEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRJZCk7DQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yRGl2DQogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpDQogICAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpDQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2xlYXJFcnJvcjogZnVuY3Rpb24oZWwpIHsNCiAgICAgIHZhciAkZWwgPSAkKGVsKTsNCiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBudWxsKTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgIGlmIChkaXNwbGF5KQ0KICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsNCiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsNCiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIil7DQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOw0KICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOw0KICAgICAgfQ0KICAgIH0sDQogICAgc2l6aW5nOiB7fQ0KICB9Ow0KDQogIC8vIENhbGxlZCBieSB3aWRnZXQgYmluZGluZ3MgdG8gcmVnaXN0ZXIgYSBuZXcgdHlwZSBvZiB3aWRnZXQuIFRoZSBkZWZpbml0aW9uDQogIC8vIG9iamVjdCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6DQogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlDQogIC8vICAgdXNlZCBieSBkZWZhdWx0IGFzIHRoZSBDU1MgY2xhc3NuYW1lIHRvIGxvb2sgZm9yLg0KICAvLyAtIGluaXRpYWxpemUgKG9wdGlvbmFsKSAtIEEgZnVuY3Rpb24oZWwpIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkDQogIC8vICAgdmFsdWUgdG8gcmVuZGVyVmFsdWUuDQogIC8vIC0gcmVuZGVyVmFsdWUgKHJlcXVpcmVkKSAtIEEgZnVuY3Rpb24oZWwsIGRhdGEsIGluaXRWYWx1ZSkgdGhhdCB3aWxsIGJlDQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICBlbGVtZW50OyBTaGlueSBhcHBzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyDQogIC8vICAgZWxlbWVudCwgYXMgdGhlIGRhdGEgY2hhbmdlcy4NCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsNCiAgICBpZiAoIWRlZmluaXRpb24ubmFtZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgbmFtZSIpOw0KICAgIH0NCiAgICBpZiAoIWRlZmluaXRpb24udHlwZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgdHlwZSIpOw0KICAgIH0NCiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG91dHB1dCB3aWRnZXRzDQogICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0gIm91dHB1dCIpIHsNCiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsNCiAgICB9DQogICAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgLm5hbWUgaXMgYSB2YWxpZCBDU1MgY2xhc3NuYW1lDQoNCiAgICAvLyBTdXBwb3J0IG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucy4gT2xkLXN0eWxlIGNsYXNzLWJvdW5kDQogICAgLy8gZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0ICJvYmplY3QiIHBlciB3aWRnZXQgcGVyIHR5cGUvY2xhc3Mgb2YNCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cw0KICAgIC8vIHRha2UgZWwgYW5kIGluc3RhbmNlIGFyZ3VtZW50cywgYmVjYXVzZSB0aGUgd2lkZ2V0IG9iamVjdCBjYW4ndA0KICAgIC8vIHN0b3JlIHRoZW0uIE5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQNCiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0DQogICAgLy8gcHJvdmlkZSByZW5kZXJWYWx1ZSBvciByZXNpemUgbWV0aG9kcyBhdCBhbGwsIGp1c3QgdGhlIHNpbmdsZSBtZXRob2QNCiAgICAvLyAgIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpDQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4NCiAgICAvLyBUaGlzIGVuYWJsZXMgYSBmYXIgbW9yZSBuYXR1cmFsIHByb2dyYW1taW5nIHN0eWxlIGZvciB0aGUgd2lkZ2V0DQogICAgLy8gYXV0aG9yLCB3aG8gY2FuIHN0b3JlIHBlci1pbnN0YW5jZSBzdGF0ZSB1c2luZyBlaXRoZXIgT08tc3R5bGUNCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzDQogICAgLy8gaXMgaW4gY29udHJhc3QgdG8gd2hhdCBjYW4gb25seSBiZSBjYWxsZWQgQy1zdHlsZSBwc2V1ZG8tT08gd2hpY2ggaXMNCiAgICAvLyB3aGF0IHdlIHJlcXVpcmVkIGJlZm9yZSkuDQogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgew0KICAgICAgZGVmaW5pdGlvbiA9IGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZmluaXRpb24pOw0KICAgIH0NCg0KICAgIGlmICghZGVmaW5pdGlvbi5yZW5kZXJWYWx1ZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgcmVuZGVyVmFsdWUgZnVuY3Rpb24iKTsNCiAgICB9DQoNCiAgICAvLyBGb3Igc3RhdGljIHJlbmRlcmluZyAobm9uLVNoaW55KSwgdXNlIGEgc2ltcGxlIHdpZGdldCByZWdpc3RyYXRpb24NCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28NCiAgICAvLyBjb250YWluIHN0YXRpYyB3aWRnZXRzLg0KICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107DQogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLg0KICAgIHZhciBzdGF0aWNCaW5kaW5nID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7DQogICAgb3ZlcnJpZGVNZXRob2Qoc3RhdGljQmluZGluZywgImZpbmQiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsNCiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IHN1cGVyZnVuYyhzY29wZSk7DQogICAgICAgIC8vIEZpbHRlciBvdXQgU2hpbnkgb3V0cHV0cywgd2Ugb25seSB3YW50IHRoZSBzdGF0aWMga2luZA0KICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOw0KICAgICAgfTsNCiAgICB9KTsNCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOw0KDQogICAgaWYgKHNoaW55TW9kZSkgew0KICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4NCiAgICAgIC8vIFRoZSBkZWZpbml0aW9uIGl0c2VsZiB3aWxsIG5vdCBiZSB0aGUgb3V0cHV0IGJpbmRpbmcsIGluc3RlYWQNCiAgICAgIC8vIHdlIHdpbGwgbWFrZSBhbiBvdXRwdXQgYmluZGluZyBvYmplY3QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlDQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kDQogICAgICAvLyBuYW1lIChyZW5kZXJWYWx1ZSkgZm9yIGh0bWx3aWRnZXRzIGRlZmluaXRpb24gYW5kIFNoaW55IGJpbmRpbmdzDQogICAgICAvLyBidXQgdGhleSBhY3R1YWxseSBoYXZlIHF1aXRlIGRpZmZlcmVudCBzZW1hbnRpY3MgKHRoZSBTaGlueQ0KICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0DQogICAgICAvLyBzdHJpcHMgb2ZmIGJlZm9yZSBjYWxsaW5nIGh0bWx3aWRnZXRzIHJlbmRlclZhbHVlKS4gV2UgY2FuJ3QNCiAgICAgIC8vIGp1c3QgaWdub3JlIHRoZSBkaWZmZXJlbmNlIGJlY2F1c2UgaW4gc29tZSB3aWRnZXRzIGl0J3MgaGVscGZ1bA0KICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZg0KICAgICAgLy8gd2UncmUgbm90IGRlbGVnYXRpbmcsIHRoZW4gdGhhdCBjYWxsIHdpbGwgZ28gdG8gdGhlIFNoaW55DQogICAgICAvLyB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGh0bWx3aWRnZXRzIHZlcnNpb24uDQoNCiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHdpdGggZGVmaW5pdGlvbiwgd2l0aG91dCBtdXRhdGluZyBlaXRoZXIuDQogICAgICB2YXIgYmluZGluZ0RlZiA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOw0KDQogICAgICAvLyBUaGlzIG9iamVjdCB3aWxsIGJlIG91ciBhY3R1YWwgU2hpbnkgYmluZGluZy4NCiAgICAgIHZhciBzaGlueUJpbmRpbmcgPSBuZXcgU2hpbnkuT3V0cHV0QmluZGluZygpOw0KDQogICAgICAvLyBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHdlJ2xsIHdhbnQgdG8gc2ltcGx5IHVzZSB0aGUgYmluZGluZ0RlZidzDQogICAgICAvLyB2ZXJzaW9uIG9mIG1ldGhvZHMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvDQogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwNCiAgICAgIC8vIG1ldGhvZHMgaW4gdGhlIGZ1dHVyZSwgYW5kIHdlIHdhbnQgdGhlbSB0byBiZSBvdmVycmlkZWFibGUgYnkNCiAgICAgIC8vIEhUTUxXaWRnZXQgYmluZGluZyBkZWZpbml0aW9ucywgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoaXMNCiAgICAgIC8vIGxpc3QuDQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJnZXRJZCIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUNoYW5nZSIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7DQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJyZW5kZXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiY2xlYXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7DQoNCiAgICAgIC8vIFRoZSBmaW5kLCByZW5kZXJWYWx1ZSwgYW5kIHJlc2l6ZSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB3ZQ0KICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLmZpbmQgPSBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7DQoNCiAgICAgICAgLy8gT25seSByZXR1cm4gZWxlbWVudHMgdGhhdCBhcmUgU2hpbnkgb3V0cHV0cywgbm90IHN0YXRpYyBvbmVzDQogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7DQoNCiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdoYXRldmVyIGNhdXNlZCBTaGlueSB0byB0aGluayB0aGVyZSBtaWdodCBiZQ0KICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuDQogICAgICAgIC8vIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvdHMgb2YgZGlmZmVyZW50IGh0bWx3aWRnZXRzIGJpbmRpbmdzLCB3ZQ0KICAgICAgICAvLyBzY2hlZHVsZSBleGVjdXRpb24gZm9yIGxhdGVyLS1ubyBuZWVkIHRvIHN0YXRpY1JlbmRlciBtdWx0aXBsZQ0KICAgICAgICAvLyB0aW1lcy4NCiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSBkeW5hbWljUmVzdWx0cy5sZW5ndGgpDQogICAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXIoKTsNCg0KICAgICAgICByZXR1cm4gZHluYW1pY1Jlc3VsdHM7DQogICAgICB9Ow0KDQogICAgICAvLyBXcmFwIHJlbmRlclZhbHVlIHRvIGhhbmRsZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBpc24ndA0KICAgICAgLy8gc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFNoaW55IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLnJlbmRlclZhbHVlID0gZnVuY3Rpb24oZWwsIGRhdGEpIHsNCiAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMNCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2ldKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWJpbmRpbmdEZWYucmVuZGVyT25OdWxsVmFsdWUpIHsNCiAgICAgICAgICBpZiAoZGF0YS54ID09PSBudWxsKSB7DQogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7DQogICAgICAgICAgaW5pdFNpemluZyhlbCk7DQoNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7DQogICAgICAgICAgaWYgKGJpbmRpbmdEZWYuaW5pdGlhbGl6ZSkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGJpbmRpbmdEZWYuaW5pdGlhbGl6ZShlbCwgZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgcmVzdWx0KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgU2hpbnkucmVuZGVyRGVwZW5kZW5jaWVzKGRhdGEuZGVwcyk7DQogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsNCiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7DQogICAgICB9Ow0KDQogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQNCiAgICAgIGlmIChiaW5kaW5nRGVmLnJlc2l6ZSkgew0KICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuDQogICAgICAgICAgLy8gY2FsbGVkLCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHdpZGdldHMuDQogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgew0KICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgfQ0KDQogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7DQogICAgfQ0KICB9Ow0KDQogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOw0KICBmdW5jdGlvbiBzY2hlZHVsZVN0YXRpY1JlbmRlcigpIHsNCiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgew0KICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsNCiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOw0KICAgICAgfSwgMSk7DQogICAgfQ0KICB9DQoNCiAgLy8gUmVuZGVyIHN0YXRpYyB3aWRnZXRzIGFmdGVyIHRoZSBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nDQogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgYmluZGluZ3MgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsNCiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOw0KICAgICAgZm9yRWFjaChtYXRjaGVzLCBmdW5jdGlvbihlbCkgew0KICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOw0KDQogICAgICAgIGlmIChoYXNDbGFzcyhlbCwgImh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCIpKQ0KICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOw0KDQogICAgICAgIHZhciBpbml0UmVzdWx0Ow0KICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7DQogICAgICAgICAgaW5pdFJlc3VsdCA9IGJpbmRpbmcuaW5pdGlhbGl6ZShlbCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgKTsNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsNCiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsNCiAgICAgICAgICB2YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBzaXplID0gew0KICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApDQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQ0KICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICBsYXN0U2l6ZSA9IHNpemU7DQogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOw0KICAgICAgICAgIH07DQoNCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsNCg0KICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBjYXNlcyB3aGVyZSB3ZSdyZSBydW5uaW5nIGluIGEgU2hpbnkNCiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dA0KICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzDQogICAgICAgICAgLy8gYW4gcm1hcmtkb3duIGRvY3VtZW50IHRoYXQgaGFzIHJ1bnRpbWU6c2hpbnkgYW5kIHdpZGdldA0KICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8NCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMNCiAgICAgICAgICAvLyB3aWRnZXRzLCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuDQogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAic2hvd24uaHRtbHdpZGdldHMgc2hvd24uYnMudGFiLmh0bWx3aWRnZXRzIHNob3duLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoDQogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLg0KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUNCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LA0KICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlDQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4NCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsNCiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcg0KICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cw0KICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4NCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOw0KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsNCiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsNCiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOw0KICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzDQogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7DQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOw0KICB9DQoNCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuDQogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsNCiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICB9LCBmYWxzZSk7DQogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsNCiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7DQogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7DQogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsNCiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0NCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQ0KICAgICAga2V5ID0gMTsNCg0KICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOw0KICAgIGlmICghbGluaykgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsNCiAgICB9DQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgew0KICAgIHZhciBuYW1lcyA9IFtdOw0KICAgIHZhciBsZW5ndGg7DQogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgew0KICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpDQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOw0KICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsNCiAgICAgICAgfQ0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7DQogICAgfQ0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGl0ZW07DQogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgew0KICAgICAgICBpdGVtID0ge307DQogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsNCiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOw0KICAgICAgICB9DQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgew0KICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5Ow0KICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgew0KICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7DQogICAgICAgICAgICAgIHJldHVybiByb3dbaV0NCiAgICAgICAgICB9KQ0KICAgICAgfSk7DQogICAgICByZXR1cm4gbmV3QXJyYXk7DQogIH07DQogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkDQogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcg0KICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLg0KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgew0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOw0KICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsNCiAgICAgIGlmICghZXNjYXBlTW9kZSkgew0KICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7DQogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOw0KICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsNCiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7DQogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107DQogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7DQogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7DQogICAgfQ0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUNCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7DQogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsNCiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQ0KICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgew0KICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlDQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikNCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOw0KICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QNCiAgICAgICAgICBvID0gb1twYXJ0XTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfTsNCg0KICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuDQogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pDQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7DQogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsNCiAgfTsNCg0KICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwNCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUNCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0DQogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLg0KICAvLw0KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgew0KICAgICAgc2VsZWN0b3IgPSBzY29wZTsNCiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7DQogICAgfQ0KDQogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7DQogICAgaWYgKGVsID09PSBudWxsKSB7DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9IGVsc2Ugew0KICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7DQogICAgfQ0KICB9Ow0KDQogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZA0KICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdA0KICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQNCiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuDQogIC8vDQogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4NCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICBzZWxlY3RvciA9IHNjb3BlOw0KICAgICAgc2NvcGUgPSBkb2N1bWVudDsNCiAgICB9DQoNCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOw0KICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7DQogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsNCiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7DQogICAgICBpZiAoaGFuZGxlcikgew0KICAgICAgICBoYW5kbGVyKCk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlDQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOw0KICB9Ow0KDQogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuDQogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nDQogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoDQogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLg0KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7DQogICAgdmFyIHJlc3VsdCA9IHsNCiAgICAgIG5hbWU6IGRlZm4ubmFtZSwNCiAgICAgIHR5cGU6IGRlZm4udHlwZSwNCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgfSwNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsNCiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOw0KICAgICAgfSwNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7DQogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7DQogICAgICB9DQogICAgfTsNCg0KICAgIGlmIChkZWZuLmZpbmQpDQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsNCiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikNCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7DQogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikNCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOw0KDQogICAgcmV0dXJuIHJlc3VsdDsNCiAgfQ0KfSkoKTsNCg0K"></script>
<link href="data:text/css;charset=utf-8,%2Etabwid%20table%7B%0Aborder%2Dcollapse%3Acollapse%3B%0Aline%2Dheight%3A1%3B%0Amargin%2Dleft%3Aauto%3B%0Amargin%2Dright%3Aauto%3B%0Aborder%2Dwidth%3A%200%3B%0Adisplay%3A%20table%3B%0A%7D%0A%2Etabwid%20th%7B%0Apadding%3A0%3B%0A%7D%0A%2Etabwid%20td%20%7B%0Aline%2Dheight%3A%201em%3B%0Apadding%3A%200%3B%0A%7D%0A%2Etabwid%20thead%20%7B%0Abackground%2Dcolor%3A%20transparent%3B%0A%7D%0A%2Etabwid%20table%20tr%20%7B%0Abackground%2Dcolor%3A%20transparent%3B%0A%7D%0A%2Etabwid%20table%20tr%3Anth%2Dchild%282n%29%20%7B%0Abackground%2Dcolor%3A%20transparent%3B%0A%7D%0A%2Etabwid%20img%20%7B%0Abackground%2Dcolor%3A%20transparent%3B%0Apadding%3A%200%3B%0Aborder%3A%200%3B%0Aborder%2Dradius%3A%200%3B%0Amargin%3A%200%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogJ3RhYndpZCcsCgogIHR5cGU6ICdvdXRwdXQnLAoKICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewoKICAgIC8vIFRPRE86IGRlZmluZSBzaGFyZWQgdmFyaWFibGVzIGZvciB0aGlzIGluc3RhbmNlCgogICAgcmV0dXJuIHsKCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbih4KSB7CgogICAgICAgIC8vIFRPRE86IGNvZGUgdG8gcmVuZGVyIHRoZSB3aWRnZXQsIGUuZy4KICAgICAgICBlbC5pbm5lckhUTUwgPSB4Lmh0bWw7CgogICAgICAgIHZhciBzaGVldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgc2hlZXQuaW5uZXJIVE1MID0geC5jc3M7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzaGVldCk7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSBudWxsOwogICAgICAgIGVsLnN0eWxlLmhlaWdodCA9IG51bGw7CgogICAgICB9LAoKICAgICAgcmVzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7CgogICAgICB9CgogICAgfTsKICB9Cn0pOwo="></script>
<link href="data:text/css;charset=utf-8,%2Ed3horizon%20%2Ehorizon%20%7B%0Aborder%2Dtop%3A%20solid%201px%20%23000%3B%0Aborder%2Dbottom%3A%20solid%201px%20%23000%3B%0Aoverflow%3A%20hidden%3B%0Aposition%3A%20relative%3B%0A%7D%0A%2Ed3horizon%20%2Ehorizon%20%2B%20%2Ehorizon%20%7B%0Aborder%2Dtop%3A%20none%3B%0A%7D%0A%2Ed3horizon%20%2Ehorizon%20canvas%20%7B%0Adisplay%3A%20block%3B%0Aimage%2Drendering%3A%20pixelated%3B%0A%7D%0A%2Ed3horizon%20%2Ehorizon%20%2Etitle%2C%0A%2Ed3horizon%20%2Ehorizon%20%2Evalue%20%7B%0Abottom%3A%200%3B%0Aline%2Dheight%3A%2030px%3B%0Amargin%3A%200%206px%3B%0Aposition%3A%20absolute%3B%0Afont%2Dfamily%3A%20sans%2Dserif%3B%0Atext%2Dshadow%3A%200%201px%200%20rgba%28255%2C255%2C255%2C%2E5%29%3B%0Awhite%2Dspace%3A%20nowrap%3B%0A%7D%0A%2Ed3horizon%20%2Ehorizon%20%2Etitle%20%7B%0Aleft%3A%200%3B%0A%7D%0A%2Ed3horizon%20%2Ehorizon%20%2Evalue%20%7B%0Aright%3A%200%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2dpdGh1Yi5jb20va21hbmRvdi9kMy1ob3Jpem9uLWNoYXJ0IFZlcnNpb24gMC4wLjYuIENvcHlyaWdodCAyMDE2IEtpcmlsIE1hbmRvdi4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQogICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShyZXF1aXJlKCdkMy1zZWxlY3Rpb24nKSwgcmVxdWlyZSgnZDMtc2NhbGUnKSwgcmVxdWlyZSgnZDMtYXhpcycpLCByZXF1aXJlKCdkMy1hcnJheScpKSA6DQogICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZDMtc2VsZWN0aW9uJywgJ2QzLXNjYWxlJywgJ2QzLWF4aXMnLCAnZDMtYXJyYXknXSwgZmFjdG9yeSkgOg0KICAgIChmYWN0b3J5KGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMykpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGQzU2VsZWN0aW9uLGQzU2NhbGUsZDNBeGlzLGQzQXJyYXkpIHsgJ3VzZSBzdHJpY3QnOw0KDQpmdW5jdGlvbiBob3Jpem9uICgpIHsNCg0KICAgIC8vIGRlZmF1bHQgc2V0dGluZ3M6DQogICAgLy92YXIgY29sb3JzID0gWycjMDg1MTljJywnIzMxODJiZCcsJyM2YmFlZDYnLCcjYmRkN2U3JywnI2JhZTRiMycsJyM3NGM0NzYnLCcjMzFhMzU0JywnIzAwNmQyYyddLA0KICAgIC8vdmFyIGNvbG9ycyA9IFsnIzQ1NzViNCcsICcjNzRhZGQxJywgJyNhYmQ5ZTknLCAnI2UwZjNmOCcsICcjZmVlMDkwJywgJyNmZGFlNjEnLCAnI2Y0NmQ0MycsICcjZDczMDI3J10sDQogICAgLy92YXIgY29sb3JzID0gWyIjNWU0ZmEyIiwgIiMzMjg4YmQiLCAiIzY2YzJhNSIsICIjYWJkZGE0IiwgIiNlNmY1OTgiLCAiI2ZlZTA4YiIsICIjZmRhZTYxIiwgIiNmNDZkNDMiLCAiI2Q1M2U0ZiIsICIjOWUwMTQyIl0sDQogICAgdmFyIGNvbG9ycyA9IFsiIzMxMzY5NSIsICIjNDU3NWI0IiwgIiM3NGFkZDEiLCAiI2FiZDllOSIsICIjZmVlMDkwIiwgIiNmZGFlNjEiLCAiI2Y0NmQ0MyIsICIjZDczMDI3Il0sDQogICAgICAgIGJhbmRzID0gY29sb3JzLmxlbmd0aCA+PiAxLCAvLyBudW1iZXIgb2YgYmFuZHMgaW4gZWFjaCBkaXJlY3Rpb24gKHBvc2l0aXZlIC8gbmVnYXRpdmUpDQogICAgICAgIHdpZHRoID0gMTAwMCwgLy8gd2lkdGggaW4gcGl4ZWxzDQogICAgICAgIGhlaWdodCA9IDMwLA0KICAgICAgICBvZmZzZXRYID0gMCwNCiAgICAgICAgc3RlcCA9IDEsDQogICAgICAgIHNwYWNpbmcgPSAwLA0KICAgICAgICBtb2RlID0gJ29mZnNldCcsDQogICAgICAgIGF4aXMgPSBudWxsLA0KICAgICAgICB0aXRsZSA9IG51bGwsDQogICAgICAgIGV4dGVudCA9IG51bGwsIC8vIHRoZSBleHRlbnQgaXMgZGVyaXZlZCBmcm9tIHRoZSBkYXRhLCB1bmxlc3MgZXhwbGljaXRseSBzZXQgdmlhIC5leHRlbnQoW21pbiwgbWF4XSkNCiAgICAgICAgLy94ID0gZDMuc2NhbGVMaW5lYXIoKSwgLy8gVE9ETzogdXNlIG9yZGluYWwgc2NhbGUgaW5zdGVhZD8NCiAgICAgICAgeCA9IG51bGwsDQogICAgICAgIHkgPSBkM1NjYWxlLnNjYWxlTGluZWFyKCkucmFuZ2UoWzAsIGhlaWdodF0pLA0KICAgICAgICBjYW52YXMgPSBudWxsOw0KDQogICAgLy8gQXBwZW5kcyBhIGNhbnZhcyBlbGVtZW50IHRvIHRoZSBjdXJyZW50IGVsZW1lbnQNCiAgICAvLyBhbmQgZHJhd3MgYSBob3Jpem9uIGdyYXBoIGJhc2VkIG9uIGRhdGEgJiBzZXR0aW5ncw0KICAgIGZ1bmN0aW9uIGhvcml6b25DaGFydChkYXRhKSB7DQoNCiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IGQzU2VsZWN0aW9uLnNlbGVjdCh0aGlzKTsNCiAgICAgICAgdmFyIGRJbmNyZW1lbnQgPSBzdGVwICsgc3BhY2luZzsNCg0KICAgICAgICAvLyB1cGRhdGUgdGhlIHdpZHRoDQogICAgICAgIC8vd2lkdGggPSBob3Jpem9uLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDsNCiAgICAgICAgd2lkdGggPSBkSW5jcmVtZW50ICogZGF0YS5sZW5ndGg7DQogICAgICAgIGNhbnZhcyA9IHNlbGVjdGlvbi5hcHBlbmQoJ2NhbnZhcycpOw0KDQogICAgICAgIGNhbnZhcw0KICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgd2lkdGgpDQogICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0KTsNCg0KICAgICAgICBzZWxlY3Rpb24uYXBwZW5kKCdzcGFuJykNCiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICd0aXRsZScpDQogICAgICAgICAgICAudGV4dCh0aXRsZSk7DQoNCiAgICAgICAgc2VsZWN0aW9uLmFwcGVuZCgnc3BhbicpDQogICAgICAgICAgICAuYXR0cignY2xhc3MnLCAndmFsdWUnKTsNCg0KICAgICAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgLy9jb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlOw0KICAgICAgICAvL2NvbnRleHQudHJhbnNsYXRlKG1hcmdpbi5sZWZ0LCBtYXJnaW4udG9wKTsNCg0KICAgICAgICAvLyB1cGRhdGUgdGhlIHkgc2NhbGUsIGJhc2VkIG9uIHRoZSBkYXRhIGV4dGVudHMNCiAgICAgICAgdmFyIF9leHRlbnQgPSBleHRlbnQgfHwgZDNBcnJheS5leHRlbnQoZGF0YSk7DQoNCiAgICAgICAgdmFyIG1heCA9IE1hdGgubWF4KC1fZXh0ZW50WzBdLCBfZXh0ZW50WzFdKTsNCiAgICAgICAgeS5kb21haW4oWzAsIG1heF0pOw0KICAgICAgICAvL3ggPSBkMy5zY2FsZVRpbWUoKS5kb21haW5bXTsNCiAgICAgICAgYXhpcyA9IGQzQXhpcy5heGlzVG9wKHgpLnRpY2tzKDUpOw0KDQogICAgICAgIC8vIERyYXcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAvL2NvbnRleHQudHJhbnNsYXRlKDAuNSwgMC41KTsNCg0KICAgICAgICAvLyB0aGUgZGF0YSBmcmFtZSBjdXJyZW50bHkgYmVpbmcgc2hvd246DQogICAgICAgIHZhciBpbmNyZW1lbnQgPSBzdGVwICsgc3BhY2luZywNCiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSB+fk1hdGgubWF4KDAsIC0ob2Zmc2V0WCAvIGluY3JlbWVudCkpLA0KICAgICAgICAgICAgZW5kSW5kZXggPSB+fk1hdGgubWluKGRhdGEubGVuZ3RoLCBzdGFydEluZGV4ICsgd2lkdGggLyBpbmNyZW1lbnQpOw0KDQogICAgICAgIC8vIHNraXAgZHJhd2luZyBpZiB0aGVyZSdzIG5vIGRhdGEgdG8gYmUgZHJhd24NCiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiBkYXRhLmxlbmd0aCkgcmV0dXJuOw0KDQoNCiAgICAgICAgLy8gd2UgYXJlIGRyYXdpbmcgcG9zaXRpdmUgJiBuZWdhdGl2ZSBiYW5kcyBzZXBhcmF0ZWx5IHRvIGF2b2lkIG11dGF0aW5nIGNhbnZhcyBzdGF0ZQ0KICAgICAgICAvLyBodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9jYW52YXMvcGVyZm9ybWFuY2UvDQoNCiAgICAgICAgdmFyIG5lZ2F0aXZlID0gZmFsc2U7DQogICAgICAgIC8vIGRyYXcgcG9zaXRpdmUgYmFuZHMNCiAgICAgICAgZm9yICh2YXIgYiA9IDA7IGIgPCBiYW5kczsgYisrKSB7DQogICAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGNvbG9yc1tiYW5kcyArIGJdOw0KDQogICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHJhbmdlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGJhbmQgaW5kZXguDQogICAgICAgICAgICB2YXIgYkV4dGVudHMgPSAoYiArIDEgLSBiYW5kcykgKiBoZWlnaHQ7DQogICAgICAgICAgICB5LnJhbmdlKFtiYW5kcyAqIGhlaWdodCArIGJFeHRlbnRzLCBiRXh0ZW50c10pOw0KDQogICAgICAgICAgICAvLyBvbmx5IHRoZSBjdXJyZW50IGRhdGEgZnJhbWUgaXMgYmVpbmcgZHJhd24gaS5lLiB3aGF0J3MgdmlzaWJsZToNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4LCB2YWx1ZTsgaSA8IGVuZEluZGV4OyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFbaV07DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlIDw9IDApIHsgbmVnYXRpdmUgPSB0cnVlOyBjb250aW51ZTsgfQ0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTsNCiAgICAgICAgICAgICAgICBjb250ZXh0LmZpbGxSZWN0KG9mZnNldFggKyBpICogaW5jcmVtZW50LCB5KHZhbHVlKSwgc3RlcCwgeSgwKSAtIHkodmFsdWUpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIGRyYXcgbmVnYXRpdmUgYmFuZHMNCiAgICAgICAgaWYgKG5lZ2F0aXZlKSB7DQoNCiAgICAgICAgICAgIC8vIG1pcnJvciB0aGUgbmVnYXRpdmUgYmFuZHMsIGJ5IGZsaXBwaW5nIHRoZSBjYW52YXMNCiAgICAgICAgICAgIGlmIChtb2RlID09PSAnb2Zmc2V0Jykgew0KICAgICAgICAgICAgICAgIGNvbnRleHQudHJhbnNsYXRlKDAsIGhlaWdodCk7DQogICAgICAgICAgICAgICAgY29udGV4dC5zY2FsZSgxLCAtMSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBiYW5kczsgYisrKSB7DQogICAgICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBjb2xvcnNbYmFuZHMgLSBiIC0gMV07DQoNCiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHJhbmdlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGJhbmQgaW5kZXguDQogICAgICAgICAgICAgICAgYkV4dGVudHMgPSAoYiArIDEgLSBiYW5kcykgKiBoZWlnaHQ7DQogICAgICAgICAgICAgICAgeS5yYW5nZShbYmFuZHMgKiBoZWlnaHQgKyBiRXh0ZW50cywgYkV4dGVudHNdKTsNCg0KICAgICAgICAgICAgICAgIC8vIG9ubHkgdGhlIGN1cnJlbnQgZGF0YSBmcmFtZSBpcyBiZWluZyBkcmF3biBpLmUuIHdoYXQncyB2aXNpYmxlOg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSBzdGFydEluZGV4LCBudmFsdWU7IGogPCBlbmRJbmRleDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgIG52YWx1ZSA9IGRhdGFbal07DQogICAgICAgICAgICAgICAgICAgIGlmIChudmFsdWUgPj0gMCkgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmlsbFJlY3Qob2Zmc2V0WCArIGogKiBpbmNyZW1lbnQsIHkoLW52YWx1ZSksIHN0ZXAsIHkoMCkgLSB5KC1udmFsdWUpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvKg0KICAgICAgICAvLyBPZmZzY3JlZW4gRHJhdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZU9mZnNjcmVlbkNhbnZhcyh3aWR0aCxoZWlnaHQpew0KICAgICAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOw0KICAgICAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7DQogICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0Ow0KICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBvZmZzY3JlZW5DYW52YXMgPSBjcmVhdGVPZmZzY3JlZW5DYW52YXMoaW5jcmVtZW50ICogZGF0YS5sZW5ndGgsIGhlaWdodCk7DQogICAgICAgIHZhciBvZmZzY3JlZW5Db250ZXh0ID0gb2Zmc2NyZWVuQ2FudmFzLmdldENvbnRleHQoJzJkJyk7DQogICAgICAgIC8vIGRyYXcgZWFjaCBiYW5kOg0KICAgICAgICBmb3IgKHZhciBiID0gMDsgYiA8IGJhbmRzOyBiKyspIHsNCiAgICAgICAgICAgIG9mZnNjcmVlbkNvbnRleHQuZmlsbFN0eWxlID0gY29sb3JzW2JdOw0KDQogICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHJhbmdlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGJhbmQgaW5kZXguDQogICAgICAgICAgICB2YXIgeTAgPSAoYiArIDEgLSBiYW5kcykgKiBoZWlnaHQ7DQogICAgICAgICAgICB5LnJhbmdlKFtiYW5kcyAqIGhlaWdodCArIHkwLCB5MF0pOw0KDQogICAgICAgICAgICAvLyBkcmF3IHRoZSB3aG9sZSBwZXJpb2Qgb24gYW4gb2Zmc2NyZWVuIGNhbnZhcw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBvZmZzY3JlZW5Db250ZXh0LmZpbGxSZWN0KGkgKiBpbmNyZW1lbnQsIHkoZGF0YVtpXSksIHN0ZXAsIHkoMCkgLSB5KGRhdGFbaV0pKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBvbnNjcmVlbkltYWdlOw0KICAgICAgICBfZHJhdyA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgb25zY3JlZW5JbWFnZSA9IG9mZnNjcmVlbkNvbnRleHQuZ2V0SW1hZ2VEYXRhKC1vZmZzZXRYLCAwLCB3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIGNvbnRleHQucHV0SW1hZ2VEYXRhKG9uc2NyZWVuSW1hZ2UsIDAsIDApOw0KDQogICAgICAgICAgICAvL2NvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgLy9jb250ZXh0LnRyYW5zbGF0ZShvZmZzZXRYLCAwKTsNCiAgICAgICAgICAgIC8vY29udGV4dC5kcmF3SW1hZ2Uob2Zmc2NyZWVuQ2FudmFzLCBvZmZzZXRYLCAwKTsNCiAgICAgICAgfTsNCiAgICAgICAgKi8NCiAgICB9DQoNCiAgICBob3Jpem9uQ2hhcnQuYXhpcyA9IGZ1bmN0aW9uIChfKSB7DQogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGF4aXMgPSBfLCBob3Jpem9uQ2hhcnQpIDogYXhpczsNCiAgICB9Ow0KDQogICAgaG9yaXpvbkNoYXJ0LmNhbnZhcyA9IGZ1bmN0aW9uIChfKSB7DQogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNhbnZhcyA9IF8sIGhvcml6b25DaGFydCkgOiBjYW52YXM7DQogICAgfTsNCg0KICAgIC8vIEFycmF5IG9mIGNvbG9ycyByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBiYW5kcw0KICAgIGhvcml6b25DaGFydC5jb2xvcnMgPSBmdW5jdGlvbiAoXykgew0KICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjb2xvcnM7DQogICAgICAgIGNvbG9ycyA9IF87DQoNCiAgICAgICAgLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYmFuZHMNCiAgICAgICAgYmFuZHMgPSBjb2xvcnMubGVuZ3RoID4+IDE7DQoNCiAgICAgICAgcmV0dXJuIGhvcml6b25DaGFydDsNCiAgICB9Ow0KDQogICAgLy8gZ2V0L3NldCB0aGUgaGVpZ2h0IG9mIHRoZSBncmFwaA0KICAgIGhvcml6b25DaGFydC5oZWlnaHQgPSBmdW5jdGlvbiAoXykgew0KICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChoZWlnaHQgPSBfLCBob3Jpem9uQ2hhcnQpIDogaGVpZ2h0Ow0KICAgIH07DQoNCiAgICAvLyBnZXQvc2V0IHRoZSBzdGVwIG9mIHRoZSBncmFwaCwgaS5lLiB0aGUgd2lkdGggb2YgZWFjaCBiYXINCiAgICBob3Jpem9uQ2hhcnQuc3RlcCA9IGZ1bmN0aW9uIChfKSB7DQogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0ZXAgPSBfLCBob3Jpem9uQ2hhcnQpIDogc3RlcDsNCiAgICB9Ow0KDQogICAgLy8gZ2V0L3NldCB0aGUgc3BhY2luZyBiZXR3ZWVuIHRoZSBiYXJzIG9mIHRoZSBncmFwaA0KICAgIGhvcml6b25DaGFydC5zcGFjaW5nID0gZnVuY3Rpb24gKF8pIHsNCiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2luZyA9IF8sIGhvcml6b25DaGFydCkgOiBzcGFjaW5nOw0KICAgIH07DQoNCiAgICAvLyBnZXQvc2V0IHRoZSB0aXRsZSBvZiB0aGUgaG9yaXpvbg0KICAgIGhvcml6b25DaGFydC50aXRsZSA9IGZ1bmN0aW9uIChfKSB7DQogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpdGxlID0gXywgaG9yaXpvbkNoYXJ0KSA6IHRpdGxlOw0KICAgIH07DQoNCiAgICAvLyBtaXJyb3Igb3Igb2Zmc2V0DQogICAgaG9yaXpvbkNoYXJ0Lm1vZGUgPSBmdW5jdGlvbiAoXykgew0KICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtb2RlID0gXywgaG9yaXpvbkNoYXJ0KSA6IG1vZGU7DQogICAgfTsNCg0KICAgIC8vIGdldC9zZXQgdGhlIGV4dGVudHMgb2YgdGhlIFkgYXhpcy4gSWYgbm90IHNldCB0aGUgZXh0ZW50cyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBkYXRhDQogICAgaG9yaXpvbkNoYXJ0LmV4dGVudCA9IGZ1bmN0aW9uIChfKSB7DQogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IF8sIGhvcml6b25DaGFydCkgOiBleHRlbnQ7DQogICAgfTsNCg0KICAgIGhvcml6b25DaGFydC5vZmZzZXRYID0gZnVuY3Rpb24gKF8pIHsNCiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2Zmc2V0WCA9IF8sIGhvcml6b25DaGFydCkgOiBvZmZzZXRYOw0KICAgIH07DQoNCiAgICAvLyB0aGUgZGF0YSBmcmFtZSBjdXJyZW50bHkgYmVpbmcgc2hvd246DQogICAgaG9yaXpvbkNoYXJ0LmluZGV4RXh0ZW50ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICB2YXIgaW5jcmVtZW50ID0gc3RlcCArIHNwYWNpbmcsDQogICAgICAgICAgICBzdGFydEluZGV4ID0gLW9mZnNldFggLyBpbmNyZW1lbnQsDQogICAgICAgICAgICBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyB3aWR0aCAvIGluY3JlbWVudDsNCg0KICAgICAgICByZXR1cm4gW3N0YXJ0SW5kZXgsIGVuZEluZGV4XTsNCiAgICB9Ow0KDQogICAgcmV0dXJuIGhvcml6b25DaGFydDsNCg0KfQ0KDQp2YXIgSFRNTFdpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHM7DQoNCkhUTUxXaWRnZXRzLndpZGdldCh7DQoNCiAgbmFtZTogJ2QzaG9yaXpvbicsDQoNCiAgdHlwZTogJ291dHB1dCcsDQoNCiAgZmFjdG9yeTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCg0KICAgIHJldHVybiB7DQoNCiAgICAgIGNoYXJ0OiBudWxsLA0KDQogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oeCkgew0KICAgICAgICB2YXIgaG9yaXpvbkNoYXJ0Ow0KDQogICAgICAgIGlmKHRoaXMuY2hhcnQpIHsNCiAgICAgICAgICBob3Jpem9uQ2hhcnQgPSB0aGlzLmNoYXJ0Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXMuY2hhcnQgPSBob3Jpem9uQ2hhcnQgPSBob3Jpem9uKCk7DQogICAgICAgIH0NCg0KDQogICAgICAgIE9iamVjdC5rZXlzKHgub3B0aW9ucykubWFwKGZ1bmN0aW9uKGt5KSB7DQogICAgICAgICAgaWYoaG9yaXpvbkNoYXJ0W2t5XSkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgaG9yaXpvbkNoYXJ0W2t5XSh4Lm9wdGlvbnNba3ldKTsNCiAgICAgICAgICAgIH0gY2F0Y2goZSkgew0KICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdvcHRpb24gJyArIGt5ICsgImRvZXMgbm90IHNlZW0gc3VwcG9ydGVkLiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgLy8gYmFkIGhhY2sgdG8gZml0IGNoYXJ0IGJ5IGZvcmNpbmcgc3RlcA0KICAgICAgICAvLyAgbmVlZCB0byBmaXggdGhpcw0KICAgICAgICBob3Jpem9uQ2hhcnQuc3RlcChlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aC94LmRhdGFbMF0ubGVuZ3RoKTsNCg0KICAgICAgICB2YXIgaG9yaXpvbnMgPSBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdEFsbCgnLmhvcml6b24nKQ0KICAgICAgICAgIC5kYXRhKHguZGF0YSkNCiAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoJ2RpdicpDQogICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2hvcml6b24nKQ0KICAgICAgICAgIC5lYWNoKGhvcml6b25DaGFydCk7DQoNCiAgICAgIH0sDQoNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24od2lkdGgsIGhlaWdodCkgew0KDQogICAgICAgIC8vIFRPRE86IGNvZGUgdG8gcmUtcmVuZGVyIHRoZSB3aWRnZXQgd2l0aCBhIG5ldyBzaXplDQoNCiAgICAgIH0NCg0KICAgIH07DQogIH0NCn0pOw0KDQp9KSkpOw0KfSx7ImQzLWFycmF5IjoyLCJkMy1heGlzIjozLCJkMy1zY2FsZSI6OCwiZDMtc2VsZWN0aW9uIjo5fV0sMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWFycmF5LyBWZXJzaW9uIDEuMS4xLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7DQoNCnZhciBhc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7DQogIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsNCn07DQoNCnZhciBiaXNlY3RvciA9IGZ1bmN0aW9uKGNvbXBhcmUpIHsNCiAgaWYgKGNvbXBhcmUubGVuZ3RoID09PSAxKSBjb21wYXJlID0gYXNjZW5kaW5nQ29tcGFyYXRvcihjb21wYXJlKTsNCiAgcmV0dXJuIHsNCiAgICBsZWZ0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsNCiAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7DQogICAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDsNCiAgICAgIHdoaWxlIChsbyA8IGhpKSB7DQogICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxOw0KICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpIDwgMCkgbG8gPSBtaWQgKyAxOw0KICAgICAgICBlbHNlIGhpID0gbWlkOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGxvOw0KICAgIH0sDQogICAgcmlnaHQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkgew0KICAgICAgaWYgKGxvID09IG51bGwpIGxvID0gMDsNCiAgICAgIGlmIChoaSA9PSBudWxsKSBoaSA9IGEubGVuZ3RoOw0KICAgICAgd2hpbGUgKGxvIDwgaGkpIHsNCiAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7DQogICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPiAwKSBoaSA9IG1pZDsNCiAgICAgICAgZWxzZSBsbyA9IG1pZCArIDE7DQogICAgICB9DQogICAgICByZXR1cm4gbG87DQogICAgfQ0KICB9Ow0KfTsNCg0KZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihmKSB7DQogIHJldHVybiBmdW5jdGlvbihkLCB4KSB7DQogICAgcmV0dXJuIGFzY2VuZGluZyhmKGQpLCB4KTsNCiAgfTsNCn0NCg0KdmFyIGFzY2VuZGluZ0Jpc2VjdCA9IGJpc2VjdG9yKGFzY2VuZGluZyk7DQp2YXIgYmlzZWN0UmlnaHQgPSBhc2NlbmRpbmdCaXNlY3QucmlnaHQ7DQp2YXIgYmlzZWN0TGVmdCA9IGFzY2VuZGluZ0Jpc2VjdC5sZWZ0Ow0KDQp2YXIgcGFpcnMgPSBmdW5jdGlvbihhcnJheSwgZikgew0KICBpZiAoZiA9PSBudWxsKSBmID0gcGFpcjsNCiAgdmFyIGkgPSAwLCBuID0gYXJyYXkubGVuZ3RoIC0gMSwgcCA9IGFycmF5WzBdLCBwYWlycyA9IG5ldyBBcnJheShuIDwgMCA/IDAgOiBuKTsNCiAgd2hpbGUgKGkgPCBuKSBwYWlyc1tpXSA9IGYocCwgcCA9IGFycmF5WysraV0pOw0KICByZXR1cm4gcGFpcnM7DQp9Ow0KDQpmdW5jdGlvbiBwYWlyKGEsIGIpIHsNCiAgcmV0dXJuIFthLCBiXTsNCn0NCg0KdmFyIGNyb3NzID0gZnVuY3Rpb24oYSwgYiwgZikgew0KICB2YXIgbmEgPSBhLmxlbmd0aCwgbmIgPSBiLmxlbmd0aCwgYyA9IG5ldyBBcnJheShuYSAqIG5iKSwgaWEsIGliLCBpYywgdmE7DQogIGlmIChmID09IG51bGwpIGYgPSBwYWlyOw0KICBmb3IgKGlhID0gaWMgPSAwOyBpYSA8IG5hOyArK2lhKSBmb3IgKHZhID0gYVtpYV0sIGliID0gMDsgaWIgPCBuYjsgKytpYiwgKytpYykgY1tpY10gPSBmKHZhLCBiW2liXSk7DQogIHJldHVybiBjOw0KfTsNCg0KdmFyIGRlc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7DQogIHJldHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjsNCn07DQoNCnZhciBudW1iZXIgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7DQp9Ow0KDQp2YXIgdmFyaWFuY2UgPSBmdW5jdGlvbihhcnJheSwgZikgew0KICB2YXIgbiA9IGFycmF5Lmxlbmd0aCwNCiAgICAgIG0gPSAwLA0KICAgICAgYSwNCiAgICAgIGQsDQogICAgICBzID0gMCwNCiAgICAgIGkgPSAtMSwNCiAgICAgIGogPSAwOw0KDQogIGlmIChmID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKCFpc05hTihhID0gbnVtYmVyKGFycmF5W2ldKSkpIHsNCiAgICAgICAgZCA9IGEgLSBtOw0KICAgICAgICBtICs9IGQgLyArK2o7DQogICAgICAgIHMgKz0gZCAqIChhIC0gbSk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgZWxzZSB7DQogICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgIGlmICghaXNOYU4oYSA9IG51bWJlcihmKGFycmF5W2ldLCBpLCBhcnJheSkpKSkgew0KICAgICAgICBkID0gYSAtIG07DQogICAgICAgIG0gKz0gZCAvICsrajsNCiAgICAgICAgcyArPSBkICogKGEgLSBtKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICBpZiAoaiA+IDEpIHJldHVybiBzIC8gKGogLSAxKTsNCn07DQoNCnZhciBkZXZpYXRpb24gPSBmdW5jdGlvbihhcnJheSwgZikgew0KICB2YXIgdiA9IHZhcmlhbmNlKGFycmF5LCBmKTsNCiAgcmV0dXJuIHYgPyBNYXRoLnNxcnQodikgOiB2Ow0KfTsNCg0KdmFyIGV4dGVudCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7DQogIHZhciBpID0gLTEsDQogICAgICBuID0gYXJyYXkubGVuZ3RoLA0KICAgICAgYSwNCiAgICAgIGIsDQogICAgICBjOw0KDQogIGlmIChmID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+PSBiKSB7IGEgPSBjID0gYjsgYnJlYWs7IH0NCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwpIHsNCiAgICAgIGlmIChhID4gYikgYSA9IGI7DQogICAgICBpZiAoYyA8IGIpIGMgPSBiOw0KICAgIH0NCiAgfQ0KDQogIGVsc2Ugew0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmKGFycmF5W2ldLCBpLCBhcnJheSkpICE9IG51bGwgJiYgYiA+PSBiKSB7IGEgPSBjID0gYjsgYnJlYWs7IH0NCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZihhcnJheVtpXSwgaSwgYXJyYXkpKSAhPSBudWxsKSB7DQogICAgICBpZiAoYSA+IGIpIGEgPSBiOw0KICAgICAgaWYgKGMgPCBiKSBjID0gYjsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gW2EsIGNdOw0KfTsNCg0KdmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlOw0KDQp2YXIgc2xpY2UgPSBhcnJheS5zbGljZTsNCnZhciBtYXAgPSBhcnJheS5tYXA7DQoNCnZhciBjb25zdGFudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB4Ow0KICB9Ow0KfTsNCg0KdmFyIGlkZW50aXR5ID0gZnVuY3Rpb24oeCkgew0KICByZXR1cm4geDsNCn07DQoNCnZhciByYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7DQogIHN0YXJ0ID0gK3N0YXJ0LCBzdG9wID0gK3N0b3AsIHN0ZXAgPSAobiA9IGFyZ3VtZW50cy5sZW5ndGgpIDwgMiA/IChzdG9wID0gc3RhcnQsIHN0YXJ0ID0gMCwgMSkgOiBuIDwgMyA/IDEgOiArc3RlcDsNCg0KICB2YXIgaSA9IC0xLA0KICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKSB8IDAsDQogICAgICByYW5nZSA9IG5ldyBBcnJheShuKTsNCg0KICB3aGlsZSAoKytpIDwgbikgew0KICAgIHJhbmdlW2ldID0gc3RhcnQgKyBpICogc3RlcDsNCiAgfQ0KDQogIHJldHVybiByYW5nZTsNCn07DQoNCnZhciBlMTAgPSBNYXRoLnNxcnQoNTApOw0KdmFyIGU1ID0gTWF0aC5zcXJ0KDEwKTsNCnZhciBlMiA9IE1hdGguc3FydCgyKTsNCg0KdmFyIHRpY2tzID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIGNvdW50KSB7DQogIHZhciBzdGVwID0gdGlja1N0ZXAoc3RhcnQsIHN0b3AsIGNvdW50KTsNCiAgcmV0dXJuIHJhbmdlKA0KICAgIE1hdGguY2VpbChzdGFydCAvIHN0ZXApICogc3RlcCwNCiAgICBNYXRoLmZsb29yKHN0b3AgLyBzdGVwKSAqIHN0ZXAgKyBzdGVwIC8gMiwgLy8gaW5jbHVzaXZlDQogICAgc3RlcA0KICApOw0KfTsNCg0KZnVuY3Rpb24gdGlja1N0ZXAoc3RhcnQsIHN0b3AsIGNvdW50KSB7DQogIHZhciBzdGVwMCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgwLCBjb3VudCksDQogICAgICBzdGVwMSA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXAwKSAvIE1hdGguTE4xMCkpLA0KICAgICAgZXJyb3IgPSBzdGVwMCAvIHN0ZXAxOw0KICBpZiAoZXJyb3IgPj0gZTEwKSBzdGVwMSAqPSAxMDsNCiAgZWxzZSBpZiAoZXJyb3IgPj0gZTUpIHN0ZXAxICo9IDU7DQogIGVsc2UgaWYgKGVycm9yID49IGUyKSBzdGVwMSAqPSAyOw0KICByZXR1cm4gc3RvcCA8IHN0YXJ0ID8gLXN0ZXAxIDogc3RlcDE7DQp9DQoNCnZhciBzdHVyZ2VzID0gZnVuY3Rpb24odmFsdWVzKSB7DQogIHJldHVybiBNYXRoLmNlaWwoTWF0aC5sb2codmFsdWVzLmxlbmd0aCkgLyBNYXRoLkxOMikgKyAxOw0KfTsNCg0KdmFyIGhpc3RvZ3JhbSA9IGZ1bmN0aW9uKCkgew0KICB2YXIgdmFsdWUgPSBpZGVudGl0eSwNCiAgICAgIGRvbWFpbiA9IGV4dGVudCwNCiAgICAgIHRocmVzaG9sZCA9IHN0dXJnZXM7DQoNCiAgZnVuY3Rpb24gaGlzdG9ncmFtKGRhdGEpIHsNCiAgICB2YXIgaSwNCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLA0KICAgICAgICB4LA0KICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXkobik7DQoNCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICB2YWx1ZXNbaV0gPSB2YWx1ZShkYXRhW2ldLCBpLCBkYXRhKTsNCiAgICB9DQoNCiAgICB2YXIgeHogPSBkb21haW4odmFsdWVzKSwNCiAgICAgICAgeDAgPSB4elswXSwNCiAgICAgICAgeDEgPSB4elsxXSwNCiAgICAgICAgdHogPSB0aHJlc2hvbGQodmFsdWVzLCB4MCwgeDEpOw0KDQogICAgLy8gQ29udmVydCBudW1iZXIgb2YgdGhyZXNob2xkcyBpbnRvIHVuaWZvcm0gdGhyZXNob2xkcy4NCiAgICBpZiAoIUFycmF5LmlzQXJyYXkodHopKSB0eiA9IHRpY2tzKHgwLCB4MSwgdHopOw0KDQogICAgLy8gUmVtb3ZlIGFueSB0aHJlc2hvbGRzIG91dHNpZGUgdGhlIGRvbWFpbi4NCiAgICB2YXIgbSA9IHR6Lmxlbmd0aDsNCiAgICB3aGlsZSAodHpbMF0gPD0geDApIHR6LnNoaWZ0KCksIC0tbTsNCiAgICB3aGlsZSAodHpbbSAtIDFdID49IHgxKSB0ei5wb3AoKSwgLS1tOw0KDQogICAgdmFyIGJpbnMgPSBuZXcgQXJyYXkobSArIDEpLA0KICAgICAgICBiaW47DQoNCiAgICAvLyBJbml0aWFsaXplIGJpbnMuDQogICAgZm9yIChpID0gMDsgaSA8PSBtOyArK2kpIHsNCiAgICAgIGJpbiA9IGJpbnNbaV0gPSBbXTsNCiAgICAgIGJpbi54MCA9IGkgPiAwID8gdHpbaSAtIDFdIDogeDA7DQogICAgICBiaW4ueDEgPSBpIDwgbSA/IHR6W2ldIDogeDE7DQogICAgfQ0KDQogICAgLy8gQXNzaWduIGRhdGEgdG8gYmlucyBieSB2YWx1ZSwgaWdub3JpbmcgYW55IG91dHNpZGUgdGhlIGRvbWFpbi4NCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICB4ID0gdmFsdWVzW2ldOw0KICAgICAgaWYgKHgwIDw9IHggJiYgeCA8PSB4MSkgew0KICAgICAgICBiaW5zW2Jpc2VjdFJpZ2h0KHR6LCB4LCAwLCBtKV0ucHVzaChkYXRhW2ldKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gYmluczsNCiAgfQ0KDQogIGhpc3RvZ3JhbS52YWx1ZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KF8pLCBoaXN0b2dyYW0pIDogdmFsdWU7DQogIH07DQoNCiAgaGlzdG9ncmFtLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudChbX1swXSwgX1sxXV0pLCBoaXN0b2dyYW0pIDogZG9tYWluOw0KICB9Ow0KDQogIGhpc3RvZ3JhbS50aHJlc2hvbGRzID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRocmVzaG9sZCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IEFycmF5LmlzQXJyYXkoXykgPyBjb25zdGFudChzbGljZS5jYWxsKF8pKSA6IGNvbnN0YW50KF8pLCBoaXN0b2dyYW0pIDogdGhyZXNob2xkOw0KICB9Ow0KDQogIHJldHVybiBoaXN0b2dyYW07DQp9Ow0KDQp2YXIgcXVhbnRpbGUgPSBmdW5jdGlvbihhcnJheSwgcCwgZikgew0KICBpZiAoZiA9PSBudWxsKSBmID0gbnVtYmVyOw0KICBpZiAoIShuID0gYXJyYXkubGVuZ3RoKSkgcmV0dXJuOw0KICBpZiAoKHAgPSArcCkgPD0gMCB8fCBuIDwgMikgcmV0dXJuICtmKGFycmF5WzBdLCAwLCBhcnJheSk7DQogIGlmIChwID49IDEpIHJldHVybiArZihhcnJheVtuIC0gMV0sIG4gLSAxLCBhcnJheSk7DQogIHZhciBuLA0KICAgICAgaCA9IChuIC0gMSkgKiBwLA0KICAgICAgaSA9IE1hdGguZmxvb3IoaCksDQogICAgICBhID0gK2YoYXJyYXlbaV0sIGksIGFycmF5KSwNCiAgICAgIGIgPSArZihhcnJheVtpICsgMV0sIGkgKyAxLCBhcnJheSk7DQogIHJldHVybiBhICsgKGIgLSBhKSAqIChoIC0gaSk7DQp9Ow0KDQp2YXIgZnJlZWRtYW5EaWFjb25pcyA9IGZ1bmN0aW9uKHZhbHVlcywgbWluLCBtYXgpIHsNCiAgdmFsdWVzID0gbWFwLmNhbGwodmFsdWVzLCBudW1iZXIpLnNvcnQoYXNjZW5kaW5nKTsNCiAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvICgyICogKHF1YW50aWxlKHZhbHVlcywgMC43NSkgLSBxdWFudGlsZSh2YWx1ZXMsIDAuMjUpKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTsNCn07DQoNCnZhciBzY290dCA9IGZ1bmN0aW9uKHZhbHVlcywgbWluLCBtYXgpIHsNCiAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvICgzLjUgKiBkZXZpYXRpb24odmFsdWVzKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTsNCn07DQoNCnZhciBtYXggPSBmdW5jdGlvbihhcnJheSwgZikgew0KICB2YXIgaSA9IC0xLA0KICAgICAgbiA9IGFycmF5Lmxlbmd0aCwNCiAgICAgIGEsDQogICAgICBiOw0KDQogIGlmIChmID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+PSBiKSB7IGEgPSBiOyBicmVhazsgfQ0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID4gYSkgYSA9IGI7DQogIH0NCg0KICBlbHNlIHsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZihhcnJheVtpXSwgaSwgYXJyYXkpKSAhPSBudWxsICYmIGIgPj0gYikgeyBhID0gYjsgYnJlYWs7IH0NCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZihhcnJheVtpXSwgaSwgYXJyYXkpKSAhPSBudWxsICYmIGIgPiBhKSBhID0gYjsNCiAgfQ0KDQogIHJldHVybiBhOw0KfTsNCg0KdmFyIG1lYW4gPSBmdW5jdGlvbihhcnJheSwgZikgew0KICB2YXIgcyA9IDAsDQogICAgICBuID0gYXJyYXkubGVuZ3RoLA0KICAgICAgYSwNCiAgICAgIGkgPSAtMSwNCiAgICAgIGogPSBuOw0KDQogIGlmIChmID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpc05hTihhID0gbnVtYmVyKGFycmF5W2ldKSkpIHMgKz0gYTsgZWxzZSAtLWo7DQogIH0NCg0KICBlbHNlIHsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpc05hTihhID0gbnVtYmVyKGYoYXJyYXlbaV0sIGksIGFycmF5KSkpKSBzICs9IGE7IGVsc2UgLS1qOw0KICB9DQoNCiAgaWYgKGopIHJldHVybiBzIC8gajsNCn07DQoNCnZhciBtZWRpYW4gPSBmdW5jdGlvbihhcnJheSwgZikgew0KICB2YXIgbnVtYmVycyA9IFtdLA0KICAgICAgbiA9IGFycmF5Lmxlbmd0aCwNCiAgICAgIGEsDQogICAgICBpID0gLTE7DQoNCiAgaWYgKGYgPT0gbnVsbCkgew0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWlzTmFOKGEgPSBudW1iZXIoYXJyYXlbaV0pKSkgbnVtYmVycy5wdXNoKGEpOw0KICB9DQoNCiAgZWxzZSB7DQogICAgd2hpbGUgKCsraSA8IG4pIGlmICghaXNOYU4oYSA9IG51bWJlcihmKGFycmF5W2ldLCBpLCBhcnJheSkpKSkgbnVtYmVycy5wdXNoKGEpOw0KICB9DQoNCiAgcmV0dXJuIHF1YW50aWxlKG51bWJlcnMuc29ydChhc2NlbmRpbmcpLCAwLjUpOw0KfTsNCg0KdmFyIG1lcmdlID0gZnVuY3Rpb24oYXJyYXlzKSB7DQogIHZhciBuID0gYXJyYXlzLmxlbmd0aCwNCiAgICAgIG0sDQogICAgICBpID0gLTEsDQogICAgICBqID0gMCwNCiAgICAgIG1lcmdlZCwNCiAgICAgIGFycmF5Ow0KDQogIHdoaWxlICgrK2kgPCBuKSBqICs9IGFycmF5c1tpXS5sZW5ndGg7DQogIG1lcmdlZCA9IG5ldyBBcnJheShqKTsNCg0KICB3aGlsZSAoLS1uID49IDApIHsNCiAgICBhcnJheSA9IGFycmF5c1tuXTsNCiAgICBtID0gYXJyYXkubGVuZ3RoOw0KICAgIHdoaWxlICgtLW0gPj0gMCkgew0KICAgICAgbWVyZ2VkWy0tal0gPSBhcnJheVttXTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gbWVyZ2VkOw0KfTsNCg0KdmFyIG1pbiA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7DQogIHZhciBpID0gLTEsDQogICAgICBuID0gYXJyYXkubGVuZ3RoLA0KICAgICAgYSwNCiAgICAgIGI7DQoNCiAgaWYgKGYgPT0gbnVsbCkgew0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID49IGIpIHsgYSA9IGI7IGJyZWFrOyB9DQogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjsNCiAgfQ0KDQogIGVsc2Ugew0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmKGFycmF5W2ldLCBpLCBhcnJheSkpICE9IG51bGwgJiYgYiA+PSBiKSB7IGEgPSBiOyBicmVhazsgfQ0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmKGFycmF5W2ldLCBpLCBhcnJheSkpICE9IG51bGwgJiYgYSA+IGIpIGEgPSBiOw0KICB9DQoNCiAgcmV0dXJuIGE7DQp9Ow0KDQp2YXIgcGVybXV0ZSA9IGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7DQogIHZhciBpID0gaW5kZXhlcy5sZW5ndGgsIHBlcm11dGVzID0gbmV3IEFycmF5KGkpOw0KICB3aGlsZSAoaS0tKSBwZXJtdXRlc1tpXSA9IGFycmF5W2luZGV4ZXNbaV1dOw0KICByZXR1cm4gcGVybXV0ZXM7DQp9Ow0KDQp2YXIgc2NhbiA9IGZ1bmN0aW9uKGFycmF5LCBjb21wYXJlKSB7DQogIGlmICghKG4gPSBhcnJheS5sZW5ndGgpKSByZXR1cm47DQogIHZhciBpID0gMCwNCiAgICAgIG4sDQogICAgICBqID0gMCwNCiAgICAgIHhpLA0KICAgICAgeGogPSBhcnJheVtqXTsNCg0KICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7DQoNCiAgd2hpbGUgKCsraSA8IG4pIGlmIChjb21wYXJlKHhpID0gYXJyYXlbaV0sIHhqKSA8IDAgfHwgY29tcGFyZSh4aiwgeGopICE9PSAwKSB4aiA9IHhpLCBqID0gaTsNCg0KICBpZiAoY29tcGFyZSh4aiwgeGopID09PSAwKSByZXR1cm4gajsNCn07DQoNCnZhciBzaHVmZmxlID0gZnVuY3Rpb24oYXJyYXksIGkwLCBpMSkgew0KICB2YXIgbSA9IChpMSA9PSBudWxsID8gYXJyYXkubGVuZ3RoIDogaTEpIC0gKGkwID0gaTAgPT0gbnVsbCA/IDAgOiAraTApLA0KICAgICAgdCwNCiAgICAgIGk7DQoNCiAgd2hpbGUgKG0pIHsNCiAgICBpID0gTWF0aC5yYW5kb20oKSAqIG0tLSB8IDA7DQogICAgdCA9IGFycmF5W20gKyBpMF07DQogICAgYXJyYXlbbSArIGkwXSA9IGFycmF5W2kgKyBpMF07DQogICAgYXJyYXlbaSArIGkwXSA9IHQ7DQogIH0NCg0KICByZXR1cm4gYXJyYXk7DQp9Ow0KDQp2YXIgc3VtID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCiAgdmFyIHMgPSAwLA0KICAgICAgbiA9IGFycmF5Lmxlbmd0aCwNCiAgICAgIGEsDQogICAgICBpID0gLTE7DQoNCiAgaWYgKGYgPT0gbnVsbCkgew0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoYSA9ICthcnJheVtpXSkgcyArPSBhOyAvLyBOb3RlOiB6ZXJvIGFuZCBudWxsIGFyZSBlcXVpdmFsZW50Lg0KICB9DQoNCiAgZWxzZSB7DQogICAgd2hpbGUgKCsraSA8IG4pIGlmIChhID0gK2YoYXJyYXlbaV0sIGksIGFycmF5KSkgcyArPSBhOw0KICB9DQoNCiAgcmV0dXJuIHM7DQp9Ow0KDQp2YXIgdHJhbnNwb3NlID0gZnVuY3Rpb24obWF0cml4KSB7DQogIGlmICghKG4gPSBtYXRyaXgubGVuZ3RoKSkgcmV0dXJuIFtdOw0KICBmb3IgKHZhciBpID0gLTEsIG0gPSBtaW4obWF0cml4LCBsZW5ndGgpLCB0cmFuc3Bvc2UgPSBuZXcgQXJyYXkobSk7ICsraSA8IG07KSB7DQogICAgZm9yICh2YXIgaiA9IC0xLCBuLCByb3cgPSB0cmFuc3Bvc2VbaV0gPSBuZXcgQXJyYXkobik7ICsraiA8IG47KSB7DQogICAgICByb3dbal0gPSBtYXRyaXhbal1baV07DQogICAgfQ0KICB9DQogIHJldHVybiB0cmFuc3Bvc2U7DQp9Ow0KDQpmdW5jdGlvbiBsZW5ndGgoZCkgew0KICByZXR1cm4gZC5sZW5ndGg7DQp9DQoNCnZhciB6aXAgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIHRyYW5zcG9zZShhcmd1bWVudHMpOw0KfTsNCg0KZXhwb3J0cy5iaXNlY3QgPSBiaXNlY3RSaWdodDsNCmV4cG9ydHMuYmlzZWN0UmlnaHQgPSBiaXNlY3RSaWdodDsNCmV4cG9ydHMuYmlzZWN0TGVmdCA9IGJpc2VjdExlZnQ7DQpleHBvcnRzLmFzY2VuZGluZyA9IGFzY2VuZGluZzsNCmV4cG9ydHMuYmlzZWN0b3IgPSBiaXNlY3RvcjsNCmV4cG9ydHMuY3Jvc3MgPSBjcm9zczsNCmV4cG9ydHMuZGVzY2VuZGluZyA9IGRlc2NlbmRpbmc7DQpleHBvcnRzLmRldmlhdGlvbiA9IGRldmlhdGlvbjsNCmV4cG9ydHMuZXh0ZW50ID0gZXh0ZW50Ow0KZXhwb3J0cy5oaXN0b2dyYW0gPSBoaXN0b2dyYW07DQpleHBvcnRzLnRocmVzaG9sZEZyZWVkbWFuRGlhY29uaXMgPSBmcmVlZG1hbkRpYWNvbmlzOw0KZXhwb3J0cy50aHJlc2hvbGRTY290dCA9IHNjb3R0Ow0KZXhwb3J0cy50aHJlc2hvbGRTdHVyZ2VzID0gc3R1cmdlczsNCmV4cG9ydHMubWF4ID0gbWF4Ow0KZXhwb3J0cy5tZWFuID0gbWVhbjsNCmV4cG9ydHMubWVkaWFuID0gbWVkaWFuOw0KZXhwb3J0cy5tZXJnZSA9IG1lcmdlOw0KZXhwb3J0cy5taW4gPSBtaW47DQpleHBvcnRzLnBhaXJzID0gcGFpcnM7DQpleHBvcnRzLnBlcm11dGUgPSBwZXJtdXRlOw0KZXhwb3J0cy5xdWFudGlsZSA9IHF1YW50aWxlOw0KZXhwb3J0cy5yYW5nZSA9IHJhbmdlOw0KZXhwb3J0cy5zY2FuID0gc2NhbjsNCmV4cG9ydHMuc2h1ZmZsZSA9IHNodWZmbGU7DQpleHBvcnRzLnN1bSA9IHN1bTsNCmV4cG9ydHMudGlja3MgPSB0aWNrczsNCmV4cG9ydHMudGlja1N0ZXAgPSB0aWNrU3RlcDsNCmV4cG9ydHMudHJhbnNwb3NlID0gdHJhbnNwb3NlOw0KZXhwb3J0cy52YXJpYW5jZSA9IHZhcmlhbmNlOw0KZXhwb3J0cy56aXAgPSB6aXA7DQoNCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7DQoNCn0pKSk7DQoNCn0se31dLDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpew0KLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1heGlzLyBWZXJzaW9uIDEuMC42LiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7DQoNCnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsNCg0KdmFyIGlkZW50aXR5ID0gZnVuY3Rpb24oeCkgew0KICByZXR1cm4geDsNCn07DQoNCnZhciB0b3AgPSAxOw0KdmFyIHJpZ2h0ID0gMjsNCnZhciBib3R0b20gPSAzOw0KdmFyIGxlZnQgPSA0Ow0KdmFyIGVwc2lsb24gPSAxZS02Ow0KDQpmdW5jdGlvbiB0cmFuc2xhdGVYKHgpIHsNCiAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHggKyAiLDApIjsNCn0NCg0KZnVuY3Rpb24gdHJhbnNsYXRlWSh5KSB7DQogIHJldHVybiAidHJhbnNsYXRlKDAsIiArIHkgKyAiKSI7DQp9DQoNCmZ1bmN0aW9uIGNlbnRlcihzY2FsZSkgew0KICB2YXIgb2Zmc2V0ID0gc2NhbGUuYmFuZHdpZHRoKCkgLyAyOw0KICBpZiAoc2NhbGUucm91bmQoKSkgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpOw0KICByZXR1cm4gZnVuY3Rpb24oZCkgew0KICAgIHJldHVybiBzY2FsZShkKSArIG9mZnNldDsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gZW50ZXJpbmcoKSB7DQogIHJldHVybiAhdGhpcy5fX2F4aXM7DQp9DQoNCmZ1bmN0aW9uIGF4aXMob3JpZW50LCBzY2FsZSkgew0KICB2YXIgdGlja0FyZ3VtZW50cyA9IFtdLA0KICAgICAgdGlja1ZhbHVlcyA9IG51bGwsDQogICAgICB0aWNrRm9ybWF0ID0gbnVsbCwNCiAgICAgIHRpY2tTaXplSW5uZXIgPSA2LA0KICAgICAgdGlja1NpemVPdXRlciA9IDYsDQogICAgICB0aWNrUGFkZGluZyA9IDMsDQogICAgICBrID0gb3JpZW50ID09PSB0b3AgfHwgb3JpZW50ID09PSBsZWZ0ID8gLTEgOiAxLA0KICAgICAgeCwgeSA9IG9yaWVudCA9PT0gbGVmdCB8fCBvcmllbnQgPT09IHJpZ2h0ID8gKHggPSAieCIsICJ5IikgOiAoeCA9ICJ5IiwgIngiKSwNCiAgICAgIHRyYW5zZm9ybSA9IG9yaWVudCA9PT0gdG9wIHx8IG9yaWVudCA9PT0gYm90dG9tID8gdHJhbnNsYXRlWCA6IHRyYW5zbGF0ZVk7DQoNCiAgZnVuY3Rpb24gYXhpcyhjb250ZXh0KSB7DQogICAgdmFyIHZhbHVlcyA9IHRpY2tWYWx1ZXMgPT0gbnVsbCA/IChzY2FsZS50aWNrcyA/IHNjYWxlLnRpY2tzLmFwcGx5KHNjYWxlLCB0aWNrQXJndW1lbnRzKSA6IHNjYWxlLmRvbWFpbigpKSA6IHRpY2tWYWx1ZXMsDQogICAgICAgIGZvcm1hdCA9IHRpY2tGb3JtYXQgPT0gbnVsbCA/IChzY2FsZS50aWNrRm9ybWF0ID8gc2NhbGUudGlja0Zvcm1hdC5hcHBseShzY2FsZSwgdGlja0FyZ3VtZW50cykgOiBpZGVudGl0eSkgOiB0aWNrRm9ybWF0LA0KICAgICAgICBzcGFjaW5nID0gTWF0aC5tYXgodGlja1NpemVJbm5lciwgMCkgKyB0aWNrUGFkZGluZywNCiAgICAgICAgcmFuZ2UgPSBzY2FsZS5yYW5nZSgpLA0KICAgICAgICByYW5nZTAgPSByYW5nZVswXSArIDAuNSwNCiAgICAgICAgcmFuZ2UxID0gcmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gKyAwLjUsDQogICAgICAgIHBvc2l0aW9uID0gKHNjYWxlLmJhbmR3aWR0aCA/IGNlbnRlciA6IGlkZW50aXR5KShzY2FsZS5jb3B5KCkpLA0KICAgICAgICBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0LA0KICAgICAgICBwYXRoID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSwNCiAgICAgICAgdGljayA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoIi50aWNrIikuZGF0YSh2YWx1ZXMsIHNjYWxlKS5vcmRlcigpLA0KICAgICAgICB0aWNrRXhpdCA9IHRpY2suZXhpdCgpLA0KICAgICAgICB0aWNrRW50ZXIgPSB0aWNrLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCAidGljayIpLA0KICAgICAgICBsaW5lID0gdGljay5zZWxlY3QoImxpbmUiKSwNCiAgICAgICAgdGV4dCA9IHRpY2suc2VsZWN0KCJ0ZXh0Iik7DQoNCiAgICBwYXRoID0gcGF0aC5tZXJnZShwYXRoLmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwgIi50aWNrIikNCiAgICAgICAgLmF0dHIoImNsYXNzIiwgImRvbWFpbiIpDQogICAgICAgIC5hdHRyKCJzdHJva2UiLCAiIzAwMCIpKTsNCg0KICAgIHRpY2sgPSB0aWNrLm1lcmdlKHRpY2tFbnRlcik7DQoNCiAgICBsaW5lID0gbGluZS5tZXJnZSh0aWNrRW50ZXIuYXBwZW5kKCJsaW5lIikNCiAgICAgICAgLmF0dHIoInN0cm9rZSIsICIjMDAwIikNCiAgICAgICAgLmF0dHIoeCArICIyIiwgayAqIHRpY2tTaXplSW5uZXIpDQogICAgICAgIC5hdHRyKHkgKyAiMSIsIDAuNSkNCiAgICAgICAgLmF0dHIoeSArICIyIiwgMC41KSk7DQoNCiAgICB0ZXh0ID0gdGV4dC5tZXJnZSh0aWNrRW50ZXIuYXBwZW5kKCJ0ZXh0IikNCiAgICAgICAgLmF0dHIoImZpbGwiLCAiIzAwMCIpDQogICAgICAgIC5hdHRyKHgsIGsgKiBzcGFjaW5nKQ0KICAgICAgICAuYXR0cih5LCAwLjUpDQogICAgICAgIC5hdHRyKCJkeSIsIG9yaWVudCA9PT0gdG9wID8gIjBlbSIgOiBvcmllbnQgPT09IGJvdHRvbSA/ICIwLjcxZW0iIDogIjAuMzJlbSIpKTsNCg0KICAgIGlmIChjb250ZXh0ICE9PSBzZWxlY3Rpb24pIHsNCiAgICAgIHBhdGggPSBwYXRoLnRyYW5zaXRpb24oY29udGV4dCk7DQogICAgICB0aWNrID0gdGljay50cmFuc2l0aW9uKGNvbnRleHQpOw0KICAgICAgbGluZSA9IGxpbmUudHJhbnNpdGlvbihjb250ZXh0KTsNCiAgICAgIHRleHQgPSB0ZXh0LnRyYW5zaXRpb24oY29udGV4dCk7DQoNCiAgICAgIHRpY2tFeGl0ID0gdGlja0V4aXQudHJhbnNpdGlvbihjb250ZXh0KQ0KICAgICAgICAgIC5hdHRyKCJvcGFjaXR5IiwgZXBzaWxvbikNCiAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gaXNGaW5pdGUoZCA9IHBvc2l0aW9uKGQpKSA/IHRyYW5zZm9ybShkKSA6IHRoaXMuZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iKTsgfSk7DQoNCiAgICAgIHRpY2tFbnRlcg0KICAgICAgICAgIC5hdHRyKCJvcGFjaXR5IiwgZXBzaWxvbikNCiAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyB2YXIgcCA9IHRoaXMucGFyZW50Tm9kZS5fX2F4aXM7IHJldHVybiB0cmFuc2Zvcm0ocCAmJiBpc0Zpbml0ZShwID0gcChkKSkgPyBwIDogcG9zaXRpb24oZCkpOyB9KTsNCiAgICB9DQoNCiAgICB0aWNrRXhpdC5yZW1vdmUoKTsNCg0KICAgIHBhdGgNCiAgICAgICAgLmF0dHIoImQiLCBvcmllbnQgPT09IGxlZnQgfHwgb3JpZW50ID09IHJpZ2h0DQogICAgICAgICAgICA/ICJNIiArIGsgKiB0aWNrU2l6ZU91dGVyICsgIiwiICsgcmFuZ2UwICsgIkgwLjVWIiArIHJhbmdlMSArICJIIiArIGsgKiB0aWNrU2l6ZU91dGVyDQogICAgICAgICAgICA6ICJNIiArIHJhbmdlMCArICIsIiArIGsgKiB0aWNrU2l6ZU91dGVyICsgIlYwLjVIIiArIHJhbmdlMSArICJWIiArIGsgKiB0aWNrU2l6ZU91dGVyKTsNCg0KICAgIHRpY2sNCiAgICAgICAgLmF0dHIoIm9wYWNpdHkiLCAxKQ0KICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gdHJhbnNmb3JtKHBvc2l0aW9uKGQpKTsgfSk7DQoNCiAgICBsaW5lDQogICAgICAgIC5hdHRyKHggKyAiMiIsIGsgKiB0aWNrU2l6ZUlubmVyKTsNCg0KICAgIHRleHQNCiAgICAgICAgLmF0dHIoeCwgayAqIHNwYWNpbmcpDQogICAgICAgIC50ZXh0KGZvcm1hdCk7DQoNCiAgICBzZWxlY3Rpb24uZmlsdGVyKGVudGVyaW5nKQ0KICAgICAgICAuYXR0cigiZmlsbCIsICJub25lIikNCiAgICAgICAgLmF0dHIoImZvbnQtc2l6ZSIsIDEwKQ0KICAgICAgICAuYXR0cigiZm9udC1mYW1pbHkiLCAic2Fucy1zZXJpZiIpDQogICAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsIG9yaWVudCA9PT0gcmlnaHQgPyAic3RhcnQiIDogb3JpZW50ID09PSBsZWZ0ID8gImVuZCIgOiAibWlkZGxlIik7DQoNCiAgICBzZWxlY3Rpb24NCiAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7IHRoaXMuX19heGlzID0gcG9zaXRpb247IH0pOw0KICB9DQoNCiAgYXhpcy5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGF4aXMpIDogc2NhbGU7DQogIH07DQoNCiAgYXhpcy50aWNrcyA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aWNrQXJndW1lbnRzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpLCBheGlzOw0KICB9Ow0KDQogIGF4aXMudGlja0FyZ3VtZW50cyA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrQXJndW1lbnRzID0gXyA9PSBudWxsID8gW10gOiBzbGljZS5jYWxsKF8pLCBheGlzKSA6IHRpY2tBcmd1bWVudHMuc2xpY2UoKTsNCiAgfTsNCg0KICBheGlzLnRpY2tWYWx1ZXMgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1ZhbHVlcyA9IF8gPT0gbnVsbCA/IG51bGwgOiBzbGljZS5jYWxsKF8pLCBheGlzKSA6IHRpY2tWYWx1ZXMgJiYgdGlja1ZhbHVlcy5zbGljZSgpOw0KICB9Ow0KDQogIGF4aXMudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrRm9ybWF0ID0gXywgYXhpcykgOiB0aWNrRm9ybWF0Ow0KICB9Ow0KDQogIGF4aXMudGlja1NpemUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1NpemVJbm5lciA9IHRpY2tTaXplT3V0ZXIgPSArXywgYXhpcykgOiB0aWNrU2l6ZUlubmVyOw0KICB9Ow0KDQogIGF4aXMudGlja1NpemVJbm5lciA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZUlubmVyID0gK18sIGF4aXMpIDogdGlja1NpemVJbm5lcjsNCiAgfTsNCg0KICBheGlzLnRpY2tTaXplT3V0ZXIgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1NpemVPdXRlciA9ICtfLCBheGlzKSA6IHRpY2tTaXplT3V0ZXI7DQogIH07DQoNCiAgYXhpcy50aWNrUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrUGFkZGluZyA9ICtfLCBheGlzKSA6IHRpY2tQYWRkaW5nOw0KICB9Ow0KDQogIHJldHVybiBheGlzOw0KfQ0KDQpmdW5jdGlvbiBheGlzVG9wKHNjYWxlKSB7DQogIHJldHVybiBheGlzKHRvcCwgc2NhbGUpOw0KfQ0KDQpmdW5jdGlvbiBheGlzUmlnaHQoc2NhbGUpIHsNCiAgcmV0dXJuIGF4aXMocmlnaHQsIHNjYWxlKTsNCn0NCg0KZnVuY3Rpb24gYXhpc0JvdHRvbShzY2FsZSkgew0KICByZXR1cm4gYXhpcyhib3R0b20sIHNjYWxlKTsNCn0NCg0KZnVuY3Rpb24gYXhpc0xlZnQoc2NhbGUpIHsNCiAgcmV0dXJuIGF4aXMobGVmdCwgc2NhbGUpOw0KfQ0KDQpleHBvcnRzLmF4aXNUb3AgPSBheGlzVG9wOw0KZXhwb3J0cy5heGlzUmlnaHQgPSBheGlzUmlnaHQ7DQpleHBvcnRzLmF4aXNCb3R0b20gPSBheGlzQm90dG9tOw0KZXhwb3J0cy5heGlzTGVmdCA9IGF4aXNMZWZ0Ow0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHt9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsNCi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtY29sbGVjdGlvbi8gVmVyc2lvbiAxLjAuMy4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnOw0KDQp2YXIgcHJlZml4ID0gIiQiOw0KDQpmdW5jdGlvbiBNYXAoKSB7fQ0KDQpNYXAucHJvdG90eXBlID0gbWFwLnByb3RvdHlwZSA9IHsNCiAgY29uc3RydWN0b3I6IE1hcCwNCiAgaGFzOiBmdW5jdGlvbihrZXkpIHsNCiAgICByZXR1cm4gKHByZWZpeCArIGtleSkgaW4gdGhpczsNCiAgfSwNCiAgZ2V0OiBmdW5jdGlvbihrZXkpIHsNCiAgICByZXR1cm4gdGhpc1twcmVmaXggKyBrZXldOw0KICB9LA0KICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsNCiAgICB0aGlzW3ByZWZpeCArIGtleV0gPSB2YWx1ZTsNCiAgICByZXR1cm4gdGhpczsNCiAgfSwNCiAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHsNCiAgICB2YXIgcHJvcGVydHkgPSBwcmVmaXggKyBrZXk7DQogICAgcmV0dXJuIHByb3BlcnR5IGluIHRoaXMgJiYgZGVsZXRlIHRoaXNbcHJvcGVydHldOw0KICB9LA0KICBjbGVhcjogZnVuY3Rpb24oKSB7DQogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTsNCiAgfSwNCiAga2V5czogZnVuY3Rpb24oKSB7DQogICAgdmFyIGtleXMgPSBbXTsNCiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkga2V5cy5wdXNoKHByb3BlcnR5LnNsaWNlKDEpKTsNCiAgICByZXR1cm4ga2V5czsNCiAgfSwNCiAgdmFsdWVzOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWVzID0gW107DQogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIHZhbHVlcy5wdXNoKHRoaXNbcHJvcGVydHldKTsNCiAgICByZXR1cm4gdmFsdWVzOw0KICB9LA0KICBlbnRyaWVzOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgZW50cmllcyA9IFtdOw0KICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBlbnRyaWVzLnB1c2goe2tleTogcHJvcGVydHkuc2xpY2UoMSksIHZhbHVlOiB0aGlzW3Byb3BlcnR5XX0pOw0KICAgIHJldHVybiBlbnRyaWVzOw0KICB9LA0KICBzaXplOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgc2l6ZSA9IDA7DQogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpICsrc2l6ZTsNCiAgICByZXR1cm4gc2l6ZTsNCiAgfSwNCiAgZW1wdHk6IGZ1bmN0aW9uKCkgew0KICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSByZXR1cm4gZmFsc2U7DQogICAgcmV0dXJuIHRydWU7DQogIH0sDQogIGVhY2g6IGZ1bmN0aW9uKGYpIHsNCiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgZih0aGlzW3Byb3BlcnR5XSwgcHJvcGVydHkuc2xpY2UoMSksIHRoaXMpOw0KICB9DQp9Ow0KDQpmdW5jdGlvbiBtYXAob2JqZWN0LCBmKSB7DQogIHZhciBtYXAgPSBuZXcgTWFwOw0KDQogIC8vIENvcHkgY29uc3RydWN0b3IuDQogIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApIG9iamVjdC5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsgbWFwLnNldChrZXksIHZhbHVlKTsgfSk7DQoNCiAgLy8gSW5kZXggYXJyYXkgYnkgbnVtZXJpYyBpbmRleCBvciBzcGVjaWZpZWQga2V5IGZ1bmN0aW9uLg0KICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHsNCiAgICB2YXIgaSA9IC0xLA0KICAgICAgICBuID0gb2JqZWN0Lmxlbmd0aCwNCiAgICAgICAgbzsNCg0KICAgIGlmIChmID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGksIG9iamVjdFtpXSk7DQogICAgZWxzZSB3aGlsZSAoKytpIDwgbikgbWFwLnNldChmKG8gPSBvYmplY3RbaV0sIGksIG9iamVjdCksIG8pOw0KICB9DQoNCiAgLy8gQ29udmVydCBvYmplY3QgdG8gbWFwLg0KICBlbHNlIGlmIChvYmplY3QpIGZvciAodmFyIGtleSBpbiBvYmplY3QpIG1hcC5zZXQoa2V5LCBvYmplY3Rba2V5XSk7DQoNCiAgcmV0dXJuIG1hcDsNCn0NCg0KdmFyIG5lc3QgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGtleXMgPSBbXSwNCiAgICAgIHNvcnRLZXlzID0gW10sDQogICAgICBzb3J0VmFsdWVzLA0KICAgICAgcm9sbHVwLA0KICAgICAgbmVzdDsNCg0KICBmdW5jdGlvbiBhcHBseShhcnJheSwgZGVwdGgsIGNyZWF0ZVJlc3VsdCwgc2V0UmVzdWx0KSB7DQogICAgaWYgKGRlcHRoID49IGtleXMubGVuZ3RoKSByZXR1cm4gcm9sbHVwICE9IG51bGwNCiAgICAgICAgPyByb2xsdXAoYXJyYXkpIDogKHNvcnRWYWx1ZXMgIT0gbnVsbA0KICAgICAgICA/IGFycmF5LnNvcnQoc29ydFZhbHVlcykNCiAgICAgICAgOiBhcnJheSk7DQoNCiAgICB2YXIgaSA9IC0xLA0KICAgICAgICBuID0gYXJyYXkubGVuZ3RoLA0KICAgICAgICBrZXkgPSBrZXlzW2RlcHRoKytdLA0KICAgICAgICBrZXlWYWx1ZSwNCiAgICAgICAgdmFsdWUsDQogICAgICAgIHZhbHVlc0J5S2V5ID0gbWFwKCksDQogICAgICAgIHZhbHVlcywNCiAgICAgICAgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KCk7DQoNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKHZhbHVlcyA9IHZhbHVlc0J5S2V5LmdldChrZXlWYWx1ZSA9IGtleSh2YWx1ZSA9IGFycmF5W2ldKSArICIiKSkgew0KICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB2YWx1ZXNCeUtleS5zZXQoa2V5VmFsdWUsIFt2YWx1ZV0pOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIHZhbHVlc0J5S2V5LmVhY2goZnVuY3Rpb24odmFsdWVzLCBrZXkpIHsNCiAgICAgIHNldFJlc3VsdChyZXN1bHQsIGtleSwgYXBwbHkodmFsdWVzLCBkZXB0aCwgY3JlYXRlUmVzdWx0LCBzZXRSZXN1bHQpKTsNCiAgICB9KTsNCg0KICAgIHJldHVybiByZXN1bHQ7DQogIH0NCg0KICBmdW5jdGlvbiBlbnRyaWVzKG1hcCQkMSwgZGVwdGgpIHsNCiAgICBpZiAoKytkZXB0aCA+IGtleXMubGVuZ3RoKSByZXR1cm4gbWFwJCQxOw0KICAgIHZhciBhcnJheSwgc29ydEtleSA9IHNvcnRLZXlzW2RlcHRoIC0gMV07DQogICAgaWYgKHJvbGx1cCAhPSBudWxsICYmIGRlcHRoID49IGtleXMubGVuZ3RoKSBhcnJheSA9IG1hcCQkMS5lbnRyaWVzKCk7DQogICAgZWxzZSBhcnJheSA9IFtdLCBtYXAkJDEuZWFjaChmdW5jdGlvbih2LCBrKSB7IGFycmF5LnB1c2goe2tleTogaywgdmFsdWVzOiBlbnRyaWVzKHYsIGRlcHRoKX0pOyB9KTsNCiAgICByZXR1cm4gc29ydEtleSAhPSBudWxsID8gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7IH0pIDogYXJyYXk7DQogIH0NCg0KICByZXR1cm4gbmVzdCA9IHsNCiAgICBvYmplY3Q6IGZ1bmN0aW9uKGFycmF5KSB7IHJldHVybiBhcHBseShhcnJheSwgMCwgY3JlYXRlT2JqZWN0LCBzZXRPYmplY3QpOyB9LA0KICAgIG1hcDogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGFwcGx5KGFycmF5LCAwLCBjcmVhdGVNYXAsIHNldE1hcCk7IH0sDQogICAgZW50cmllczogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGVudHJpZXMoYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU1hcCwgc2V0TWFwKSwgMCk7IH0sDQogICAga2V5OiBmdW5jdGlvbihkKSB7IGtleXMucHVzaChkKTsgcmV0dXJuIG5lc3Q7IH0sDQogICAgc29ydEtleXM6IGZ1bmN0aW9uKG9yZGVyKSB7IHNvcnRLZXlzW2tleXMubGVuZ3RoIC0gMV0gPSBvcmRlcjsgcmV0dXJuIG5lc3Q7IH0sDQogICAgc29ydFZhbHVlczogZnVuY3Rpb24ob3JkZXIpIHsgc29ydFZhbHVlcyA9IG9yZGVyOyByZXR1cm4gbmVzdDsgfSwNCiAgICByb2xsdXA6IGZ1bmN0aW9uKGYpIHsgcm9sbHVwID0gZjsgcmV0dXJuIG5lc3Q7IH0NCiAgfTsNCn07DQoNCmZ1bmN0aW9uIGNyZWF0ZU9iamVjdCgpIHsNCiAgcmV0dXJuIHt9Ow0KfQ0KDQpmdW5jdGlvbiBzZXRPYmplY3Qob2JqZWN0LCBrZXksIHZhbHVlKSB7DQogIG9iamVjdFtrZXldID0gdmFsdWU7DQp9DQoNCmZ1bmN0aW9uIGNyZWF0ZU1hcCgpIHsNCiAgcmV0dXJuIG1hcCgpOw0KfQ0KDQpmdW5jdGlvbiBzZXRNYXAobWFwJCQxLCBrZXksIHZhbHVlKSB7DQogIG1hcCQkMS5zZXQoa2V5LCB2YWx1ZSk7DQp9DQoNCmZ1bmN0aW9uIFNldCgpIHt9DQoNCnZhciBwcm90byA9IG1hcC5wcm90b3R5cGU7DQoNClNldC5wcm90b3R5cGUgPSBzZXQucHJvdG90eXBlID0gew0KICBjb25zdHJ1Y3RvcjogU2V0LA0KICBoYXM6IHByb3RvLmhhcywNCiAgYWRkOiBmdW5jdGlvbih2YWx1ZSkgew0KICAgIHZhbHVlICs9ICIiOw0KICAgIHRoaXNbcHJlZml4ICsgdmFsdWVdID0gdmFsdWU7DQogICAgcmV0dXJuIHRoaXM7DQogIH0sDQogIHJlbW92ZTogcHJvdG8ucmVtb3ZlLA0KICBjbGVhcjogcHJvdG8uY2xlYXIsDQogIHZhbHVlczogcHJvdG8ua2V5cywNCiAgc2l6ZTogcHJvdG8uc2l6ZSwNCiAgZW1wdHk6IHByb3RvLmVtcHR5LA0KICBlYWNoOiBwcm90by5lYWNoDQp9Ow0KDQpmdW5jdGlvbiBzZXQob2JqZWN0LCBmKSB7DQogIHZhciBzZXQgPSBuZXcgU2V0Ow0KDQogIC8vIENvcHkgY29uc3RydWN0b3IuDQogIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXQpIG9iamVjdC5lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IHNldC5hZGQodmFsdWUpOyB9KTsNCg0KICAvLyBPdGhlcndpc2UsIGFzc3VtZSBpdOKAmXMgYW4gYXJyYXkuDQogIGVsc2UgaWYgKG9iamVjdCkgew0KICAgIHZhciBpID0gLTEsIG4gPSBvYmplY3QubGVuZ3RoOw0KICAgIGlmIChmID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBzZXQuYWRkKG9iamVjdFtpXSk7DQogICAgZWxzZSB3aGlsZSAoKytpIDwgbikgc2V0LmFkZChmKG9iamVjdFtpXSwgaSwgb2JqZWN0KSk7DQogIH0NCg0KICByZXR1cm4gc2V0Ow0KfQ0KDQp2YXIga2V5cyA9IGZ1bmN0aW9uKG1hcCkgew0KICB2YXIga2V5cyA9IFtdOw0KICBmb3IgKHZhciBrZXkgaW4gbWFwKSBrZXlzLnB1c2goa2V5KTsNCiAgcmV0dXJuIGtleXM7DQp9Ow0KDQp2YXIgdmFsdWVzID0gZnVuY3Rpb24obWFwKSB7DQogIHZhciB2YWx1ZXMgPSBbXTsNCiAgZm9yICh2YXIga2V5IGluIG1hcCkgdmFsdWVzLnB1c2gobWFwW2tleV0pOw0KICByZXR1cm4gdmFsdWVzOw0KfTsNCg0KdmFyIGVudHJpZXMgPSBmdW5jdGlvbihtYXApIHsNCiAgdmFyIGVudHJpZXMgPSBbXTsNCiAgZm9yICh2YXIga2V5IGluIG1hcCkgZW50cmllcy5wdXNoKHtrZXk6IGtleSwgdmFsdWU6IG1hcFtrZXldfSk7DQogIHJldHVybiBlbnRyaWVzOw0KfTsNCg0KZXhwb3J0cy5uZXN0ID0gbmVzdDsNCmV4cG9ydHMuc2V0ID0gc2V0Ow0KZXhwb3J0cy5tYXAgPSBtYXA7DQpleHBvcnRzLmtleXMgPSBrZXlzOw0KZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7DQpleHBvcnRzLmVudHJpZXMgPSBlbnRyaWVzOw0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHt9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsNCi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtY29sb3IvIFZlcnNpb24gMS4wLjMuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIGRlZmluZSA9IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHsNCiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7DQogIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yOw0KfTsNCg0KZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikgew0KICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTsNCiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldOw0KICByZXR1cm4gcHJvdG90eXBlOw0KfQ0KDQpmdW5jdGlvbiBDb2xvcigpIHt9DQoNCnZhciBkYXJrZXIgPSAwLjc7DQp2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyOw0KDQp2YXIgcmVJID0gIlxccyooWystXT9cXGQrKVxccyoiOw0KdmFyIHJlTiA9ICJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiOw0KdmFyIHJlUCA9ICJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIjsNCnZhciByZUhleDMgPSAvXiMoWzAtOWEtZl17M30pJC87DQp2YXIgcmVIZXg2ID0gL14jKFswLTlhLWZdezZ9KSQvOw0KdmFyIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoIl5yZ2JcXCgiICsgW3JlSSwgcmVJLCByZUldICsgIlxcKSQiKTsNCnZhciByZVJnYlBlcmNlbnQgPSBuZXcgUmVnRXhwKCJecmdiXFwoIiArIFtyZVAsIHJlUCwgcmVQXSArICJcXCkkIik7DQp2YXIgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoIl5yZ2JhXFwoIiArIFtyZUksIHJlSSwgcmVJLCByZU5dICsgIlxcKSQiKTsNCnZhciByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cCgiXnJnYmFcXCgiICsgW3JlUCwgcmVQLCByZVAsIHJlTl0gKyAiXFwpJCIpOw0KdmFyIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5oc2xcXCgiICsgW3JlTiwgcmVQLCByZVBdICsgIlxcKSQiKTsNCnZhciByZUhzbGFQZXJjZW50ID0gbmV3IFJlZ0V4cCgiXmhzbGFcXCgiICsgW3JlTiwgcmVQLCByZVAsIHJlTl0gKyAiXFwpJCIpOw0KDQp2YXIgbmFtZWQgPSB7DQogIGFsaWNlYmx1ZTogMHhmMGY4ZmYsDQogIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsDQogIGFxdWE6IDB4MDBmZmZmLA0KICBhcXVhbWFyaW5lOiAweDdmZmZkNCwNCiAgYXp1cmU6IDB4ZjBmZmZmLA0KICBiZWlnZTogMHhmNWY1ZGMsDQogIGJpc3F1ZTogMHhmZmU0YzQsDQogIGJsYWNrOiAweDAwMDAwMCwNCiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLA0KICBibHVlOiAweDAwMDBmZiwNCiAgYmx1ZXZpb2xldDogMHg4YTJiZTIsDQogIGJyb3duOiAweGE1MmEyYSwNCiAgYnVybHl3b29kOiAweGRlYjg4NywNCiAgY2FkZXRibHVlOiAweDVmOWVhMCwNCiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsDQogIGNob2NvbGF0ZTogMHhkMjY5MWUsDQogIGNvcmFsOiAweGZmN2Y1MCwNCiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLA0KICBjb3Juc2lsazogMHhmZmY4ZGMsDQogIGNyaW1zb246IDB4ZGMxNDNjLA0KICBjeWFuOiAweDAwZmZmZiwNCiAgZGFya2JsdWU6IDB4MDAwMDhiLA0KICBkYXJrY3lhbjogMHgwMDhiOGIsDQogIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLA0KICBkYXJrZ3JheTogMHhhOWE5YTksDQogIGRhcmtncmVlbjogMHgwMDY0MDAsDQogIGRhcmtncmV5OiAweGE5YTlhOSwNCiAgZGFya2toYWtpOiAweGJkYjc2YiwNCiAgZGFya21hZ2VudGE6IDB4OGIwMDhiLA0KICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsDQogIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLA0KICBkYXJrb3JjaGlkOiAweDk5MzJjYywNCiAgZGFya3JlZDogMHg4YjAwMDAsDQogIGRhcmtzYWxtb246IDB4ZTk5NjdhLA0KICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLA0KICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YiwNCiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsDQogIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLA0KICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSwNCiAgZGFya3Zpb2xldDogMHg5NDAwZDMsDQogIGRlZXBwaW5rOiAweGZmMTQ5MywNCiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLA0KICBkaW1ncmF5OiAweDY5Njk2OSwNCiAgZGltZ3JleTogMHg2OTY5NjksDQogIGRvZGdlcmJsdWU6IDB4MWU5MGZmLA0KICBmaXJlYnJpY2s6IDB4YjIyMjIyLA0KICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsDQogIGZvcmVzdGdyZWVuOiAweDIyOGIyMiwNCiAgZnVjaHNpYTogMHhmZjAwZmYsDQogIGdhaW5zYm9ybzogMHhkY2RjZGMsDQogIGdob3N0d2hpdGU6IDB4ZjhmOGZmLA0KICBnb2xkOiAweGZmZDcwMCwNCiAgZ29sZGVucm9kOiAweGRhYTUyMCwNCiAgZ3JheTogMHg4MDgwODAsDQogIGdyZWVuOiAweDAwODAwMCwNCiAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLA0KICBncmV5OiAweDgwODA4MCwNCiAgaG9uZXlkZXc6IDB4ZjBmZmYwLA0KICBob3RwaW5rOiAweGZmNjliNCwNCiAgaW5kaWFucmVkOiAweGNkNWM1YywNCiAgaW5kaWdvOiAweDRiMDA4MiwNCiAgaXZvcnk6IDB4ZmZmZmYwLA0KICBraGFraTogMHhmMGU2OGMsDQogIGxhdmVuZGVyOiAweGU2ZTZmYSwNCiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsDQogIGxhd25ncmVlbjogMHg3Y2ZjMDAsDQogIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsDQogIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsDQogIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLA0KICBsaWdodGN5YW46IDB4ZTBmZmZmLA0KICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsDQogIGxpZ2h0Z3JheTogMHhkM2QzZDMsDQogIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLA0KICBsaWdodGdyZXk6IDB4ZDNkM2QzLA0KICBsaWdodHBpbms6IDB4ZmZiNmMxLA0KICBsaWdodHNhbG1vbjogMHhmZmEwN2EsDQogIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLA0KICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLA0KICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksDQogIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSwNCiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLA0KICBsaWdodHllbGxvdzogMHhmZmZmZTAsDQogIGxpbWU6IDB4MDBmZjAwLA0KICBsaW1lZ3JlZW46IDB4MzJjZDMyLA0KICBsaW5lbjogMHhmYWYwZTYsDQogIG1hZ2VudGE6IDB4ZmYwMGZmLA0KICBtYXJvb246IDB4ODAwMDAwLA0KICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSwNCiAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsDQogIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsDQogIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsDQogIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSwNCiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSwNCiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLA0KICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLA0KICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LA0KICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLA0KICBtaW50Y3JlYW06IDB4ZjVmZmZhLA0KICBtaXN0eXJvc2U6IDB4ZmZlNGUxLA0KICBtb2NjYXNpbjogMHhmZmU0YjUsDQogIG5hdmFqb3doaXRlOiAweGZmZGVhZCwNCiAgbmF2eTogMHgwMDAwODAsDQogIG9sZGxhY2U6IDB4ZmRmNWU2LA0KICBvbGl2ZTogMHg4MDgwMDAsDQogIG9saXZlZHJhYjogMHg2YjhlMjMsDQogIG9yYW5nZTogMHhmZmE1MDAsDQogIG9yYW5nZXJlZDogMHhmZjQ1MDAsDQogIG9yY2hpZDogMHhkYTcwZDYsDQogIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLA0KICBwYWxlZ3JlZW46IDB4OThmYjk4LA0KICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSwNCiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsDQogIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LA0KICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LA0KICBwZXJ1OiAweGNkODUzZiwNCiAgcGluazogMHhmZmMwY2IsDQogIHBsdW06IDB4ZGRhMGRkLA0KICBwb3dkZXJibHVlOiAweGIwZTBlNiwNCiAgcHVycGxlOiAweDgwMDA4MCwNCiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksDQogIHJlZDogMHhmZjAwMDAsDQogIHJvc3licm93bjogMHhiYzhmOGYsDQogIHJveWFsYmx1ZTogMHg0MTY5ZTEsDQogIHNhZGRsZWJyb3duOiAweDhiNDUxMywNCiAgc2FsbW9uOiAweGZhODA3MiwNCiAgc2FuZHlicm93bjogMHhmNGE0NjAsDQogIHNlYWdyZWVuOiAweDJlOGI1NywNCiAgc2Vhc2hlbGw6IDB4ZmZmNWVlLA0KICBzaWVubmE6IDB4YTA1MjJkLA0KICBzaWx2ZXI6IDB4YzBjMGMwLA0KICBza3libHVlOiAweDg3Y2VlYiwNCiAgc2xhdGVibHVlOiAweDZhNWFjZCwNCiAgc2xhdGVncmF5OiAweDcwODA5MCwNCiAgc2xhdGVncmV5OiAweDcwODA5MCwNCiAgc25vdzogMHhmZmZhZmEsDQogIHNwcmluZ2dyZWVuOiAweDAwZmY3ZiwNCiAgc3RlZWxibHVlOiAweDQ2ODJiNCwNCiAgdGFuOiAweGQyYjQ4YywNCiAgdGVhbDogMHgwMDgwODAsDQogIHRoaXN0bGU6IDB4ZDhiZmQ4LA0KICB0b21hdG86IDB4ZmY2MzQ3LA0KICB0dXJxdW9pc2U6IDB4NDBlMGQwLA0KICB2aW9sZXQ6IDB4ZWU4MmVlLA0KICB3aGVhdDogMHhmNWRlYjMsDQogIHdoaXRlOiAweGZmZmZmZiwNCiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsDQogIHllbGxvdzogMHhmZmZmMDAsDQogIHllbGxvd2dyZWVuOiAweDlhY2QzMg0KfTsNCg0KZGVmaW5lKENvbG9yLCBjb2xvciwgew0KICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTsNCiAgfSwNCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnJnYigpICsgIiI7DQogIH0NCn0pOw0KDQpmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHsNCiAgdmFyIG07DQogIGZvcm1hdCA9IChmb3JtYXQgKyAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7DQogIHJldHVybiAobSA9IHJlSGV4My5leGVjKGZvcm1hdCkpID8gKG0gPSBwYXJzZUludChtWzFdLCAxNiksIG5ldyBSZ2IoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHgwZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZiksIDEpKSAvLyAjZjAwDQogICAgICA6IChtID0gcmVIZXg2LmV4ZWMoZm9ybWF0KSkgPyByZ2JuKHBhcnNlSW50KG1bMV0sIDE2KSkgLy8gI2ZmMDAwMA0KICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKQ0KICAgICAgOiAobSA9IHJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKQ0KICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpDQogICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKQ0KICAgICAgOiAobSA9IHJlSHNsUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSkNCiAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSkNCiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkNCiAgICAgIDogZm9ybWF0ID09PSAidHJhbnNwYXJlbnQiID8gbmV3IFJnYihOYU4sIE5hTiwgTmFOLCAwKQ0KICAgICAgOiBudWxsOw0KfQ0KDQpmdW5jdGlvbiByZ2JuKG4pIHsNCiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTsNCn0NCg0KZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7DQogIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjsNCiAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7DQp9DQoNCmZ1bmN0aW9uIHJnYkNvbnZlcnQobykgew0KICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7DQogIGlmICghbykgcmV0dXJuIG5ldyBSZ2I7DQogIG8gPSBvLnJnYigpOw0KICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpOw0KfQ0KDQpmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHJnYkNvbnZlcnQocikgOiBuZXcgUmdiKHIsIGcsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHsNCiAgdGhpcy5yID0gK3I7DQogIHRoaXMuZyA9ICtnOw0KICB0aGlzLmIgPSArYjsNCiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7DQp9DQoNCmRlZmluZShSZ2IsIHJnYiwgZXh0ZW5kKENvbG9yLCB7DQogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7DQogICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspOw0KICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7DQogIH0sDQogIGRhcmtlcjogZnVuY3Rpb24oaykgew0KICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOw0KICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7DQogIH0sDQogIHJnYjogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXM7DQogIH0sDQogIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gKDAgPD0gdGhpcy5yICYmIHRoaXMuciA8PSAyNTUpDQogICAgICAgICYmICgwIDw9IHRoaXMuZyAmJiB0aGlzLmcgPD0gMjU1KQ0KICAgICAgICAmJiAoMCA8PSB0aGlzLmIgJiYgdGhpcy5iIDw9IDI1NSkNCiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTsNCiAgfSwNCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpOw0KICAgIHJldHVybiAoYSA9PT0gMSA/ICJyZ2IoIiA6ICJyZ2JhKCIpDQogICAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMucikgfHwgMCkpICsgIiwgIg0KICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmcpIHx8IDApKSArICIsICINCiAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5iKSB8fCAwKSkNCiAgICAgICAgKyAoYSA9PT0gMSA/ICIpIiA6ICIsICIgKyBhICsgIikiKTsNCiAgfQ0KfSkpOw0KDQpmdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHsNCiAgaWYgKGEgPD0gMCkgaCA9IHMgPSBsID0gTmFOOw0KICBlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjsNCiAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOOw0KICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTsNCn0NCg0KZnVuY3Rpb24gaHNsQ29udmVydChvKSB7DQogIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpOw0KICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7DQogIGlmICghbykgcmV0dXJuIG5ldyBIc2w7DQogIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbzsNCiAgbyA9IG8ucmdiKCk7DQogIHZhciByID0gby5yIC8gMjU1LA0KICAgICAgZyA9IG8uZyAvIDI1NSwNCiAgICAgIGIgPSBvLmIgLyAyNTUsDQogICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSwNCiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLA0KICAgICAgaCA9IE5hTiwNCiAgICAgIHMgPSBtYXggLSBtaW4sDQogICAgICBsID0gKG1heCArIG1pbikgLyAyOw0KICBpZiAocykgew0KICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2Ow0KICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjsNCiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7DQogICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjsNCiAgICBoICo9IDYwOw0KICB9IGVsc2Ugew0KICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoOw0KICB9DQogIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7DQp9DQoNCmZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7DQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydChoKSA6IG5ldyBIc2woaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOw0KfQ0KDQpmdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkgew0KICB0aGlzLmggPSAraDsNCiAgdGhpcy5zID0gK3M7DQogIHRoaXMubCA9ICtsOw0KICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsNCn0NCg0KZGVmaW5lKEhzbCwgaHNsLCBleHRlbmQoQ29sb3IsIHsNCiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsNCiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7DQogICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7DQogIH0sDQogIGRhcmtlcjogZnVuY3Rpb24oaykgew0KICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOw0KICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICByZ2I6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLA0KICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsDQogICAgICAgIGwgPSB0aGlzLmwsDQogICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsDQogICAgICAgIG0xID0gMiAqIGwgLSBtMjsNCiAgICByZXR1cm4gbmV3IFJnYigNCiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSwNCiAgICAgIGhzbDJyZ2IoaCwgbTEsIG0yKSwNCiAgICAgIGhzbDJyZ2IoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLA0KICAgICAgdGhpcy5vcGFjaXR5DQogICAgKTsNCiAgfSwNCiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSkNCiAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKQ0KICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOw0KICB9DQp9KSk7DQoNCi8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi8NCmZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7DQogIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjANCiAgICAgIDogaCA8IDE4MCA/IG0yDQogICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwDQogICAgICA6IG0xKSAqIDI1NTsNCn0NCg0KdmFyIGRlZzJyYWQgPSBNYXRoLlBJIC8gMTgwOw0KdmFyIHJhZDJkZWcgPSAxODAgLyBNYXRoLlBJOw0KDQp2YXIgS24gPSAxODsNCnZhciBYbiA9IDAuOTUwNDcwOw0KdmFyIFluID0gMTsNCnZhciBabiA9IDEuMDg4ODMwOw0KdmFyIHQwID0gNCAvIDI5Ow0KdmFyIHQxID0gNiAvIDI5Ow0KdmFyIHQyID0gMyAqIHQxICogdDE7DQp2YXIgdDMgPSB0MSAqIHQxICogdDE7DQoNCmZ1bmN0aW9uIGxhYkNvbnZlcnQobykgew0KICBpZiAobyBpbnN0YW5jZW9mIExhYikgcmV0dXJuIG5ldyBMYWIoby5sLCBvLmEsIG8uYiwgby5vcGFjaXR5KTsNCiAgaWYgKG8gaW5zdGFuY2VvZiBIY2wpIHsNCiAgICB2YXIgaCA9IG8uaCAqIGRlZzJyYWQ7DQogICAgcmV0dXJuIG5ldyBMYWIoby5sLCBNYXRoLmNvcyhoKSAqIG8uYywgTWF0aC5zaW4oaCkgKiBvLmMsIG8ub3BhY2l0eSk7DQogIH0NCiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pOw0KICB2YXIgYiA9IHJnYjJ4eXooby5yKSwNCiAgICAgIGEgPSByZ2IyeHl6KG8uZyksDQogICAgICBsID0gcmdiMnh5eihvLmIpLA0KICAgICAgeCA9IHh5ejJsYWIoKDAuNDEyNDU2NCAqIGIgKyAwLjM1NzU3NjEgKiBhICsgMC4xODA0Mzc1ICogbCkgLyBYbiksDQogICAgICB5ID0geHl6MmxhYigoMC4yMTI2NzI5ICogYiArIDAuNzE1MTUyMiAqIGEgKyAwLjA3MjE3NTAgKiBsKSAvIFluKSwNCiAgICAgIHogPSB4eXoybGFiKCgwLjAxOTMzMzkgKiBiICsgMC4xMTkxOTIwICogYSArIDAuOTUwMzA0MSAqIGwpIC8gWm4pOw0KICByZXR1cm4gbmV3IExhYigxMTYgKiB5IC0gMTYsIDUwMCAqICh4IC0geSksIDIwMCAqICh5IC0geiksIG8ub3BhY2l0eSk7DQp9DQoNCmZ1bmN0aW9uIGxhYihsLCBhLCBiLCBvcGFjaXR5KSB7DQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gbGFiQ29udmVydChsKSA6IG5ldyBMYWIobCwgYSwgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOw0KfQ0KDQpmdW5jdGlvbiBMYWIobCwgYSwgYiwgb3BhY2l0eSkgew0KICB0aGlzLmwgPSArbDsNCiAgdGhpcy5hID0gK2E7DQogIHRoaXMuYiA9ICtiOw0KICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsNCn0NCg0KZGVmaW5lKExhYiwgbGFiLCBleHRlbmQoQ29sb3IsIHsNCiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsNCiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgKyBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMuYSwgdGhpcy5iLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsNCiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgLSBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMuYSwgdGhpcy5iLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICByZ2I6IGZ1bmN0aW9uKCkgew0KICAgIHZhciB5ID0gKHRoaXMubCArIDE2KSAvIDExNiwNCiAgICAgICAgeCA9IGlzTmFOKHRoaXMuYSkgPyB5IDogeSArIHRoaXMuYSAvIDUwMCwNCiAgICAgICAgeiA9IGlzTmFOKHRoaXMuYikgPyB5IDogeSAtIHRoaXMuYiAvIDIwMDsNCiAgICB5ID0gWW4gKiBsYWIyeHl6KHkpOw0KICAgIHggPSBYbiAqIGxhYjJ4eXooeCk7DQogICAgeiA9IFpuICogbGFiMnh5eih6KTsNCiAgICByZXR1cm4gbmV3IFJnYigNCiAgICAgIHh5ejJyZ2IoIDMuMjQwNDU0MiAqIHggLSAxLjUzNzEzODUgKiB5IC0gMC40OTg1MzE0ICogeiksIC8vIEQ2NSAtPiBzUkdCDQogICAgICB4eXoycmdiKC0wLjk2OTI2NjAgKiB4ICsgMS44NzYwMTA4ICogeSArIDAuMDQxNTU2MCAqIHopLA0KICAgICAgeHl6MnJnYiggMC4wNTU2NDM0ICogeCAtIDAuMjA0MDI1OSAqIHkgKyAxLjA1NzIyNTIgKiB6KSwNCiAgICAgIHRoaXMub3BhY2l0eQ0KICAgICk7DQogIH0NCn0pKTsNCg0KZnVuY3Rpb24geHl6MmxhYih0KSB7DQogIHJldHVybiB0ID4gdDMgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDsNCn0NCg0KZnVuY3Rpb24gbGFiMnh5eih0KSB7DQogIHJldHVybiB0ID4gdDEgPyB0ICogdCAqIHQgOiB0MiAqICh0IC0gdDApOw0KfQ0KDQpmdW5jdGlvbiB4eXoycmdiKHgpIHsNCiAgcmV0dXJuIDI1NSAqICh4IDw9IDAuMDAzMTMwOCA/IDEyLjkyICogeCA6IDEuMDU1ICogTWF0aC5wb3coeCwgMSAvIDIuNCkgLSAwLjA1NSk7DQp9DQoNCmZ1bmN0aW9uIHJnYjJ4eXooeCkgew0KICByZXR1cm4gKHggLz0gMjU1KSA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTsNCn0NCg0KZnVuY3Rpb24gaGNsQ29udmVydChvKSB7DQogIGlmIChvIGluc3RhbmNlb2YgSGNsKSByZXR1cm4gbmV3IEhjbChvLmgsIG8uYywgby5sLCBvLm9wYWNpdHkpOw0KICBpZiAoIShvIGluc3RhbmNlb2YgTGFiKSkgbyA9IGxhYkNvbnZlcnQobyk7DQogIHZhciBoID0gTWF0aC5hdGFuMihvLmIsIG8uYSkgKiByYWQyZGVnOw0KICByZXR1cm4gbmV3IEhjbChoIDwgMCA/IGggKyAzNjAgOiBoLCBNYXRoLnNxcnQoby5hICogby5hICsgby5iICogby5iKSwgby5sLCBvLm9wYWNpdHkpOw0KfQ0KDQpmdW5jdGlvbiBoY2woaCwgYywgbCwgb3BhY2l0eSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQoaCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gSGNsKGgsIGMsIGwsIG9wYWNpdHkpIHsNCiAgdGhpcy5oID0gK2g7DQogIHRoaXMuYyA9ICtjOw0KICB0aGlzLmwgPSArbDsNCiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7DQp9DQoNCmRlZmluZShIY2wsIGhjbCwgZXh0ZW5kKENvbG9yLCB7DQogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7DQogICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCArIEtuICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTsNCiAgfSwNCiAgZGFya2VyOiBmdW5jdGlvbihrKSB7DQogICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCAtIEtuICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTsNCiAgfSwNCiAgcmdiOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gbGFiQ29udmVydCh0aGlzKS5yZ2IoKTsNCiAgfQ0KfSkpOw0KDQp2YXIgQSA9IC0wLjE0ODYxOw0KdmFyIEIgPSArMS43ODI3NzsNCnZhciBDID0gLTAuMjkyMjc7DQp2YXIgRCA9IC0wLjkwNjQ5Ow0KdmFyIEUgPSArMS45NzI5NDsNCnZhciBFRCA9IEUgKiBEOw0KdmFyIEVCID0gRSAqIEI7DQp2YXIgQkNfREEgPSBCICogQyAtIEQgKiBBOw0KDQpmdW5jdGlvbiBjdWJlaGVsaXhDb252ZXJ0KG8pIHsNCiAgaWYgKG8gaW5zdGFuY2VvZiBDdWJlaGVsaXgpIHJldHVybiBuZXcgQ3ViZWhlbGl4KG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7DQogIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdiQ29udmVydChvKTsNCiAgdmFyIHIgPSBvLnIgLyAyNTUsDQogICAgICBnID0gby5nIC8gMjU1LA0KICAgICAgYiA9IG8uYiAvIDI1NSwNCiAgICAgIGwgPSAoQkNfREEgKiBiICsgRUQgKiByIC0gRUIgKiBnKSAvIChCQ19EQSArIEVEIC0gRUIpLA0KICAgICAgYmwgPSBiIC0gbCwNCiAgICAgIGsgPSAoRSAqIChnIC0gbCkgLSBDICogYmwpIC8gRCwNCiAgICAgIHMgPSBNYXRoLnNxcnQoayAqIGsgKyBibCAqIGJsKSAvIChFICogbCAqICgxIC0gbCkpLCAvLyBOYU4gaWYgbD0wIG9yIGw9MQ0KICAgICAgaCA9IHMgPyBNYXRoLmF0YW4yKGssIGJsKSAqIHJhZDJkZWcgLSAxMjAgOiBOYU47DQogIHJldHVybiBuZXcgQ3ViZWhlbGl4KGggPCAwID8gaCArIDM2MCA6IGgsIHMsIGwsIG8ub3BhY2l0eSk7DQp9DQoNCmZ1bmN0aW9uIGN1YmVoZWxpeChoLCBzLCBsLCBvcGFjaXR5KSB7DQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY3ViZWhlbGl4Q29udmVydChoKSA6IG5ldyBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOw0KfQ0KDQpmdW5jdGlvbiBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkgew0KICB0aGlzLmggPSAraDsNCiAgdGhpcy5zID0gK3M7DQogIHRoaXMubCA9ICtsOw0KICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsNCn0NCg0KZGVmaW5lKEN1YmVoZWxpeCwgY3ViZWhlbGl4LCBleHRlbmQoQ29sb3IsIHsNCiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsNCiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7DQogICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7DQogIH0sDQogIGRhcmtlcjogZnVuY3Rpb24oaykgew0KICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOw0KICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICByZ2I6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBoID0gaXNOYU4odGhpcy5oKSA/IDAgOiAodGhpcy5oICsgMTIwKSAqIGRlZzJyYWQsDQogICAgICAgIGwgPSArdGhpcy5sLA0KICAgICAgICBhID0gaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMgKiBsICogKDEgLSBsKSwNCiAgICAgICAgY29zaCA9IE1hdGguY29zKGgpLA0KICAgICAgICBzaW5oID0gTWF0aC5zaW4oaCk7DQogICAgcmV0dXJuIG5ldyBSZ2IoDQogICAgICAyNTUgKiAobCArIGEgKiAoQSAqIGNvc2ggKyBCICogc2luaCkpLA0KICAgICAgMjU1ICogKGwgKyBhICogKEMgKiBjb3NoICsgRCAqIHNpbmgpKSwNCiAgICAgIDI1NSAqIChsICsgYSAqIChFICogY29zaCkpLA0KICAgICAgdGhpcy5vcGFjaXR5DQogICAgKTsNCiAgfQ0KfSkpOw0KDQpleHBvcnRzLmNvbG9yID0gY29sb3I7DQpleHBvcnRzLnJnYiA9IHJnYjsNCmV4cG9ydHMuaHNsID0gaHNsOw0KZXhwb3J0cy5sYWIgPSBsYWI7DQpleHBvcnRzLmhjbCA9IGhjbDsNCmV4cG9ydHMuY3ViZWhlbGl4ID0gY3ViZWhlbGl4Ow0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHt9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsNCi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtZm9ybWF0LyBWZXJzaW9uIDEuMi4wLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7DQoNCi8vIENvbXB1dGVzIHRoZSBkZWNpbWFsIGNvZWZmaWNpZW50IGFuZCBleHBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIG51bWJlciB4IHdpdGgNCi8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLg0KLy8gRm9yIGV4YW1wbGUsIGZvcm1hdERlY2ltYWwoMS4yMykgcmV0dXJucyBbIjEyMyIsIDBdLg0KdmFyIGZvcm1hdERlY2ltYWwgPSBmdW5jdGlvbih4LCBwKSB7DQogIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHkNCiAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTsNCg0KICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRvRXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcZFwuXGQrZVstK11cZCsNCiAgLy8gKGUuZy4sIDEuMmUrMykgb3IgdGhlIGZvcm0gXGRlWy0rXVxkKyAoZS5nLiwgMWUrMykuDQogIHJldHVybiBbDQogICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2llbnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCwNCiAgICAreC5zbGljZShpICsgMSkNCiAgXTsNCn07DQoNCnZhciBleHBvbmVudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIHggPSBmb3JtYXREZWNpbWFsKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47DQp9Ow0KDQp2YXIgZm9ybWF0R3JvdXAgPSBmdW5jdGlvbihncm91cGluZywgdGhvdXNhbmRzKSB7DQogIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgd2lkdGgpIHsNCiAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCwNCiAgICAgICAgdCA9IFtdLA0KICAgICAgICBqID0gMCwNCiAgICAgICAgZyA9IGdyb3VwaW5nWzBdLA0KICAgICAgICBsZW5ndGggPSAwOw0KDQogICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7DQogICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTsNCiAgICAgIHQucHVzaCh2YWx1ZS5zdWJzdHJpbmcoaSAtPSBnLCBpICsgZykpOw0KICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrOw0KICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTsNCiAgICB9DQoNCiAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpOw0KICB9Ow0KfTsNCg0KdmFyIGZvcm1hdE51bWVyYWxzID0gZnVuY3Rpb24obnVtZXJhbHMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1swLTldL2csIGZ1bmN0aW9uKGkpIHsNCiAgICAgIHJldHVybiBudW1lcmFsc1sraV07DQogICAgfSk7DQogIH07DQp9Ow0KDQp2YXIgZm9ybWF0RGVmYXVsdCA9IGZ1bmN0aW9uKHgsIHApIHsNCiAgeCA9IHgudG9QcmVjaXNpb24ocCk7DQoNCiAgb3V0OiBmb3IgKHZhciBuID0geC5sZW5ndGgsIGkgPSAxLCBpMCA9IC0xLCBpMTsgaSA8IG47ICsraSkgew0KICAgIHN3aXRjaCAoeFtpXSkgew0KICAgICAgY2FzZSAiLiI6IGkwID0gaTEgPSBpOyBicmVhazsNCiAgICAgIGNhc2UgIjAiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhazsNCiAgICAgIGNhc2UgImUiOiBicmVhayBvdXQ7DQogICAgICBkZWZhdWx0OiBpZiAoaTAgPiAwKSBpMCA9IDA7IGJyZWFrOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBpMCA+IDAgPyB4LnNsaWNlKDAsIGkwKSArIHguc2xpY2UoaTEgKyAxKSA6IHg7DQp9Ow0KDQp2YXIgcHJlZml4RXhwb25lbnQ7DQoNCnZhciBmb3JtYXRQcmVmaXhBdXRvID0gZnVuY3Rpb24oeCwgcCkgew0KICB2YXIgZCA9IGZvcm1hdERlY2ltYWwoeCwgcCk7DQogIGlmICghZCkgcmV0dXJuIHggKyAiIjsNCiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSwNCiAgICAgIGV4cG9uZW50ID0gZFsxXSwNCiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSwNCiAgICAgIG4gPSBjb2VmZmljaWVudC5sZW5ndGg7DQogIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnQNCiAgICAgIDogaSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oIjAiKQ0KICAgICAgOiBpID4gMCA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGkpICsgIi4iICsgY29lZmZpY2llbnQuc2xpY2UoaSkNCiAgICAgIDogIjAuIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbigiMCIpICsgZm9ybWF0RGVjaW1hbCh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IQ0KfTsNCg0KdmFyIGZvcm1hdFJvdW5kZWQgPSBmdW5jdGlvbih4LCBwKSB7DQogIHZhciBkID0gZm9ybWF0RGVjaW1hbCh4LCBwKTsNCiAgaWYgKCFkKSByZXR1cm4geCArICIiOw0KICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLA0KICAgICAgZXhwb25lbnQgPSBkWzFdOw0KICByZXR1cm4gZXhwb25lbnQgPCAwID8gIjAuIiArIG5ldyBBcnJheSgtZXhwb25lbnQpLmpvaW4oIjAiKSArIGNvZWZmaWNpZW50DQogICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyAiLiIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpDQogICAgICA6IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGV4cG9uZW50IC0gY29lZmZpY2llbnQubGVuZ3RoICsgMikuam9pbigiMCIpOw0KfTsNCg0KdmFyIGZvcm1hdFR5cGVzID0gew0KICAiIjogZm9ybWF0RGVmYXVsdCwNCiAgIiUiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiAoeCAqIDEwMCkudG9GaXhlZChwKTsgfSwNCiAgImIiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDIpOyB9LA0KICAiYyI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggKyAiIjsgfSwNCiAgImQiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDEwKTsgfSwNCiAgImUiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvRXhwb25lbnRpYWwocCk7IH0sDQogICJmIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0ZpeGVkKHApOyB9LA0KICAiZyI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9QcmVjaXNpb24ocCk7IH0sDQogICJvIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZyg4KTsgfSwNCiAgInAiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiBmb3JtYXRSb3VuZGVkKHggKiAxMDAsIHApOyB9LA0KICAiciI6IGZvcm1hdFJvdW5kZWQsDQogICJzIjogZm9ybWF0UHJlZml4QXV0bywNCiAgIlgiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOyB9LA0KICAieCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpOyB9DQp9Ow0KDQovLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdDQp2YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXC1cKCBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC5cZCspPyhbYS16JV0pPyQvaTsNCg0KZnVuY3Rpb24gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikgew0KICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpOw0KfQ0KDQpmb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZTsgLy8gaW5zdGFuY2VvZg0KDQpmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7DQogIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIiArIHNwZWNpZmllcik7DQoNCiAgdmFyIG1hdGNoLA0KICAgICAgZmlsbCA9IG1hdGNoWzFdIHx8ICIgIiwNCiAgICAgIGFsaWduID0gbWF0Y2hbMl0gfHwgIj4iLA0KICAgICAgc2lnbiA9IG1hdGNoWzNdIHx8ICItIiwNCiAgICAgIHN5bWJvbCA9IG1hdGNoWzRdIHx8ICIiLA0KICAgICAgemVybyA9ICEhbWF0Y2hbNV0sDQogICAgICB3aWR0aCA9IG1hdGNoWzZdICYmICttYXRjaFs2XSwNCiAgICAgIGNvbW1hID0gISFtYXRjaFs3XSwNCiAgICAgIHByZWNpc2lvbiA9IG1hdGNoWzhdICYmICttYXRjaFs4XS5zbGljZSgxKSwNCiAgICAgIHR5cGUgPSBtYXRjaFs5XSB8fCAiIjsNCg0KICAvLyBUaGUgIm4iIHR5cGUgaXMgYW4gYWxpYXMgZm9yICIsZyIuDQogIGlmICh0eXBlID09PSAibiIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9ICJnIjsNCg0KICAvLyBNYXAgaW52YWxpZCB0eXBlcyB0byB0aGUgZGVmYXVsdCBmb3JtYXQuDQogIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgdHlwZSA9ICIiOw0KDQogIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLg0KICBpZiAoemVybyB8fCAoZmlsbCA9PT0gIjAiICYmIGFsaWduID09PSAiPSIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9ICIwIiwgYWxpZ24gPSAiPSI7DQoNCiAgdGhpcy5maWxsID0gZmlsbDsNCiAgdGhpcy5hbGlnbiA9IGFsaWduOw0KICB0aGlzLnNpZ24gPSBzaWduOw0KICB0aGlzLnN5bWJvbCA9IHN5bWJvbDsNCiAgdGhpcy56ZXJvID0gemVybzsNCiAgdGhpcy53aWR0aCA9IHdpZHRoOw0KICB0aGlzLmNvbW1hID0gY29tbWE7DQogIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uOw0KICB0aGlzLnR5cGUgPSB0eXBlOw0KfQ0KDQpGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0aGlzLmZpbGwNCiAgICAgICsgdGhpcy5hbGlnbg0KICAgICAgKyB0aGlzLnNpZ24NCiAgICAgICsgdGhpcy5zeW1ib2wNCiAgICAgICsgKHRoaXMuemVybyA/ICIwIiA6ICIiKQ0KICAgICAgKyAodGhpcy53aWR0aCA9PSBudWxsID8gIiIgOiBNYXRoLm1heCgxLCB0aGlzLndpZHRoIHwgMCkpDQogICAgICArICh0aGlzLmNvbW1hID8gIiwiIDogIiIpDQogICAgICArICh0aGlzLnByZWNpc2lvbiA9PSBudWxsID8gIiIgOiAiLiIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKQ0KICAgICAgKyB0aGlzLnR5cGU7DQp9Ow0KDQp2YXIgaWRlbnRpdHkgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiB4Ow0KfTsNCg0KdmFyIHByZWZpeGVzID0gWyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdOw0KDQp2YXIgZm9ybWF0TG9jYWxlID0gZnVuY3Rpb24obG9jYWxlKSB7DQogIHZhciBncm91cCA9IGxvY2FsZS5ncm91cGluZyAmJiBsb2NhbGUudGhvdXNhbmRzID8gZm9ybWF0R3JvdXAobG9jYWxlLmdyb3VwaW5nLCBsb2NhbGUudGhvdXNhbmRzKSA6IGlkZW50aXR5LA0KICAgICAgY3VycmVuY3kgPSBsb2NhbGUuY3VycmVuY3ksDQogICAgICBkZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwsDQogICAgICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA/IGZvcm1hdE51bWVyYWxzKGxvY2FsZS5udW1lcmFscykgOiBpZGVudGl0eSwNCiAgICAgIHBlcmNlbnQgPSBsb2NhbGUucGVyY2VudCB8fCAiJSI7DQoNCiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllcikgew0KICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpOw0KDQogICAgdmFyIGZpbGwgPSBzcGVjaWZpZXIuZmlsbCwNCiAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sDQogICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbiwNCiAgICAgICAgc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCwNCiAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLA0KICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCwNCiAgICAgICAgY29tbWEgPSBzcGVjaWZpZXIuY29tbWEsDQogICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sDQogICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTsNCg0KICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4Lg0KICAgIC8vIEZvciBTSS1wcmVmaXgsIHRoZSBzdWZmaXggaXMgbGF6aWx5IGNvbXB1dGVkLg0KICAgIHZhciBwcmVmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5WzBdIDogc3ltYm9sID09PSAiIyIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/ICIwIiArIHR5cGUudG9Mb3dlckNhc2UoKSA6ICIiLA0KICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5WzFdIDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogIiI7DQoNCiAgICAvLyBXaGF0IGZvcm1hdCBmdW5jdGlvbiBzaG91bGQgd2UgdXNlPw0KICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlPw0KICAgIC8vIENhbiB0aGlzIHR5cGUgZ2VuZXJhdGUgZXhwb25lbnRpYWwgbm90YXRpb24/DQogICAgdmFyIGZvcm1hdFR5cGUgPSBmb3JtYXRUeXBlc1t0eXBlXSwNCiAgICAgICAgbWF5YmVTdWZmaXggPSAhdHlwZSB8fCAvW2RlZmdwcnMlXS8udGVzdCh0eXBlKTsNCg0KICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gaWYgbm90IHNwZWNpZmllZCwNCiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLg0KICAgIC8vIEZvciBzaWduaWZpY2FudCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzEsIDIxXS4NCiAgICAvLyBGb3IgZml4ZWQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFswLCAyMF0uDQogICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09IG51bGwgPyAodHlwZSA/IDYgOiAxMikNCiAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpDQogICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpOw0KDQogICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7DQogICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsDQogICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsDQogICAgICAgICAgaSwgbiwgYzsNCg0KICAgICAgaWYgKHR5cGUgPT09ICJjIikgew0KICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7DQogICAgICAgIHZhbHVlID0gIiI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB2YWx1ZSA9ICt2YWx1ZTsNCg0KICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuDQogICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwOw0KICAgICAgICB2YWx1ZSA9IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pOw0KDQogICAgICAgIC8vIElmIGEgbmVnYXRpdmUgdmFsdWUgcm91bmRzIHRvIHplcm8gZHVyaW5nIGZvcm1hdHRpbmcsIHRyZWF0IGFzIHBvc2l0aXZlLg0KICAgICAgICBpZiAodmFsdWVOZWdhdGl2ZSAmJiArdmFsdWUgPT09IDApIHZhbHVlTmVnYXRpdmUgPSBmYWxzZTsNCg0KICAgICAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC4NCiAgICAgICAgdmFsdWVQcmVmaXggPSAodmFsdWVOZWdhdGl2ZSA/IChzaWduID09PSAiKCIgPyBzaWduIDogIi0iKSA6IHNpZ24gPT09ICItIiB8fCBzaWduID09PSAiKCIgPyAiIiA6IHNpZ24pICsgdmFsdWVQcmVmaXg7DQogICAgICAgIHZhbHVlU3VmZml4ID0gdmFsdWVTdWZmaXggKyAodHlwZSA9PT0gInMiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiAiIikgKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSAiKCIgPyAiKSIgOiAiIik7DQoNCiAgICAgICAgLy8gQnJlYWsgdGhlIGZvcm1hdHRlZCB2YWx1ZSBpbnRvIHRoZSBpbnRlZ2VyIOKAnHZhbHVl4oCdIHBhcnQgdGhhdCBjYW4gYmUNCiAgICAgICAgLy8gZ3JvdXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhhdCBpcyBub3QuDQogICAgICAgIGlmIChtYXliZVN1ZmZpeCkgew0KICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDsNCiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCA0OCA+IGMgfHwgYyA+IDU3KSB7DQogICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gKGMgPT09IDQ2ID8gZGVjaW1hbCArIHZhbHVlLnNsaWNlKGkgKyAxKSA6IHZhbHVlLnNsaWNlKGkpKSArIHZhbHVlU3VmZml4Ow0KICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGkpOw0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCAiMCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuDQogICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTsNCg0KICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy4NCiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyB2YWx1ZVN1ZmZpeC5sZW5ndGgsDQogICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6ICIiOw0KDQogICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgIjAiLCBncm91cGluZyBpcyBhcHBsaWVkIGFmdGVyIHBhZGRpbmcuDQogICAgICBpZiAoY29tbWEgJiYgemVybykgdmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSAiIjsNCg0KICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuDQogICAgICBzd2l0Y2ggKGFsaWduKSB7DQogICAgICAgIGNhc2UgIjwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmc7IGJyZWFrOw0KICAgICAgICBjYXNlICI9IjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhazsNCiAgICAgICAgY2FzZSAiXiI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7DQogICAgICB9DQoNCiAgICAgIHJldHVybiBudW1lcmFscyh2YWx1ZSk7DQogICAgfQ0KDQogICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gc3BlY2lmaWVyICsgIiI7DQogICAgfTsNCg0KICAgIHJldHVybiBmb3JtYXQ7DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSkgew0KICAgIHZhciBmID0gbmV3Rm9ybWF0KChzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSwgc3BlY2lmaWVyLnR5cGUgPSAiZiIsIHNwZWNpZmllcikpLA0KICAgICAgICBlID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMsDQogICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLA0KICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1s4ICsgZSAvIDNdOw0KICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDsNCiAgICB9Ow0KICB9DQoNCiAgcmV0dXJuIHsNCiAgICBmb3JtYXQ6IG5ld0Zvcm1hdCwNCiAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZpeA0KICB9Ow0KfTsNCg0KdmFyIGxvY2FsZTsNCg0KDQoNCmRlZmF1bHRMb2NhbGUoew0KICBkZWNpbWFsOiAiLiIsDQogIHRob3VzYW5kczogIiwiLA0KICBncm91cGluZzogWzNdLA0KICBjdXJyZW5jeTogWyIkIiwgIiJdDQp9KTsNCg0KZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7DQogIGxvY2FsZSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTsNCiAgZXhwb3J0cy5mb3JtYXQgPSBsb2NhbGUuZm9ybWF0Ow0KICBleHBvcnRzLmZvcm1hdFByZWZpeCA9IGxvY2FsZS5mb3JtYXRQcmVmaXg7DQogIHJldHVybiBsb2NhbGU7DQp9DQoNCnZhciBwcmVjaXNpb25GaXhlZCA9IGZ1bmN0aW9uKHN0ZXApIHsNCiAgcmV0dXJuIE1hdGgubWF4KDAsIC1leHBvbmVudChNYXRoLmFicyhzdGVwKSkpOw0KfTsNCg0KdmFyIHByZWNpc2lvblByZWZpeCA9IGZ1bmN0aW9uKHN0ZXAsIHZhbHVlKSB7DQogIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyAtIGV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7DQp9Ow0KDQp2YXIgcHJlY2lzaW9uUm91bmQgPSBmdW5jdGlvbihzdGVwLCBtYXgpIHsNCiAgc3RlcCA9IE1hdGguYWJzKHN0ZXApLCBtYXggPSBNYXRoLmFicyhtYXgpIC0gc3RlcDsNCiAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cG9uZW50KG1heCkgLSBleHBvbmVudChzdGVwKSkgKyAxOw0KfTsNCg0KZXhwb3J0cy5mb3JtYXREZWZhdWx0TG9jYWxlID0gZGVmYXVsdExvY2FsZTsNCmV4cG9ydHMuZm9ybWF0TG9jYWxlID0gZm9ybWF0TG9jYWxlOw0KZXhwb3J0cy5mb3JtYXRTcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXI7DQpleHBvcnRzLnByZWNpc2lvbkZpeGVkID0gcHJlY2lzaW9uRml4ZWQ7DQpleHBvcnRzLnByZWNpc2lvblByZWZpeCA9IHByZWNpc2lvblByZWZpeDsNCmV4cG9ydHMucHJlY2lzaW9uUm91bmQgPSBwcmVjaXNpb25Sb3VuZDsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWludGVycG9sYXRlLyBWZXJzaW9uIDEuMS40LiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnZDMtY29sb3InKSkgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnZDMtY29sb3InXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pLGdsb2JhbC5kMykpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsZDNDb2xvcikgeyAndXNlIHN0cmljdCc7DQoNCmZ1bmN0aW9uIGJhc2lzKHQxLCB2MCwgdjEsIHYyLCB2Mykgew0KICB2YXIgdDIgPSB0MSAqIHQxLCB0MyA9IHQyICogdDE7DQogIHJldHVybiAoKDEgLSAzICogdDEgKyAzICogdDIgLSB0MykgKiB2MA0KICAgICAgKyAoNCAtIDYgKiB0MiArIDMgKiB0MykgKiB2MQ0KICAgICAgKyAoMSArIDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2Mg0KICAgICAgKyB0MyAqIHYzKSAvIDY7DQp9DQoNCnZhciBiYXNpcyQxID0gZnVuY3Rpb24odmFsdWVzKSB7DQogIHZhciBuID0gdmFsdWVzLmxlbmd0aCAtIDE7DQogIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgdmFyIGkgPSB0IDw9IDAgPyAodCA9IDApIDogdCA+PSAxID8gKHQgPSAxLCBuIC0gMSkgOiBNYXRoLmZsb29yKHQgKiBuKSwNCiAgICAgICAgdjEgPSB2YWx1ZXNbaV0sDQogICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSwNCiAgICAgICAgdjAgPSBpID4gMCA/IHZhbHVlc1tpIC0gMV0gOiAyICogdjEgLSB2MiwNCiAgICAgICAgdjMgPSBpIDwgbiAtIDEgPyB2YWx1ZXNbaSArIDJdIDogMiAqIHYyIC0gdjE7DQogICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpOw0KICB9Ow0KfTsNCg0KdmFyIGJhc2lzQ2xvc2VkID0gZnVuY3Rpb24odmFsdWVzKSB7DQogIHZhciBuID0gdmFsdWVzLmxlbmd0aDsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICB2YXIgaSA9IE1hdGguZmxvb3IoKCh0ICU9IDEpIDwgMCA/ICsrdCA6IHQpICogbiksDQogICAgICAgIHYwID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sDQogICAgICAgIHYxID0gdmFsdWVzW2kgJSBuXSwNCiAgICAgICAgdjIgPSB2YWx1ZXNbKGkgKyAxKSAlIG5dLA0KICAgICAgICB2MyA9IHZhbHVlc1soaSArIDIpICUgbl07DQogICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpOw0KICB9Ow0KfTsNCg0KdmFyIGNvbnN0YW50ID0gZnVuY3Rpb24oeCkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHg7DQogIH07DQp9Ow0KDQpmdW5jdGlvbiBsaW5lYXIoYSwgZCkgew0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIHJldHVybiBhICsgdCAqIGQ7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHsNCiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7DQogICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGh1ZShhLCBiKSB7DQogIHZhciBkID0gYiAtIGE7DQogIHJldHVybiBkID8gbGluZWFyKGEsIGQgPiAxODAgfHwgZCA8IC0xODAgPyBkIC0gMzYwICogTWF0aC5yb3VuZChkIC8gMzYwKSA6IGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7DQp9DQoNCmZ1bmN0aW9uIGdhbW1hKHkpIHsNCiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHsNCiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHsNCiAgdmFyIGQgPSBiIC0gYTsNCiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTsNCn0NCg0KdmFyIHJnYiQxID0gKChmdW5jdGlvbiByZ2JHYW1tYSh5KSB7DQogIHZhciBjb2xvciQkMSA9IGdhbW1hKHkpOw0KDQogIGZ1bmN0aW9uIHJnYiQkMShzdGFydCwgZW5kKSB7DQogICAgdmFyIHIgPSBjb2xvciQkMSgoc3RhcnQgPSBkM0NvbG9yLnJnYihzdGFydCkpLnIsIChlbmQgPSBkM0NvbG9yLnJnYihlbmQpKS5yKSwNCiAgICAgICAgZyA9IGNvbG9yJCQxKHN0YXJ0LmcsIGVuZC5nKSwNCiAgICAgICAgYiA9IGNvbG9yJCQxKHN0YXJ0LmIsIGVuZC5iKSwNCiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOw0KICAgIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgICBzdGFydC5yID0gcih0KTsNCiAgICAgIHN0YXJ0LmcgPSBnKHQpOw0KICAgICAgc3RhcnQuYiA9IGIodCk7DQogICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsNCiAgICAgIHJldHVybiBzdGFydCArICIiOw0KICAgIH07DQogIH0NCg0KICByZ2IkJDEuZ2FtbWEgPSByZ2JHYW1tYTsNCg0KICByZXR1cm4gcmdiJCQxOw0KfSkpKDEpOw0KDQpmdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7DQogIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHsNCiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsDQogICAgICAgIHIgPSBuZXcgQXJyYXkobiksDQogICAgICAgIGcgPSBuZXcgQXJyYXkobiksDQogICAgICAgIGIgPSBuZXcgQXJyYXkobiksDQogICAgICAgIGksIGNvbG9yJCQxOw0KICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIGNvbG9yJCQxID0gZDNDb2xvci5yZ2IoY29sb3JzW2ldKTsNCiAgICAgIHJbaV0gPSBjb2xvciQkMS5yIHx8IDA7DQogICAgICBnW2ldID0gY29sb3IkJDEuZyB8fCAwOw0KICAgICAgYltpXSA9IGNvbG9yJCQxLmIgfHwgMDsNCiAgICB9DQogICAgciA9IHNwbGluZShyKTsNCiAgICBnID0gc3BsaW5lKGcpOw0KICAgIGIgPSBzcGxpbmUoYik7DQogICAgY29sb3IkJDEub3BhY2l0eSA9IDE7DQogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICAgIGNvbG9yJCQxLnIgPSByKHQpOw0KICAgICAgY29sb3IkJDEuZyA9IGcodCk7DQogICAgICBjb2xvciQkMS5iID0gYih0KTsNCiAgICAgIHJldHVybiBjb2xvciQkMSArICIiOw0KICAgIH07DQogIH07DQp9DQoNCnZhciByZ2JCYXNpcyA9IHJnYlNwbGluZShiYXNpcyQxKTsNCnZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGluZShiYXNpc0Nsb3NlZCk7DQoNCnZhciBhcnJheSA9IGZ1bmN0aW9uKGEsIGIpIHsNCiAgdmFyIG5iID0gYiA/IGIubGVuZ3RoIDogMCwNCiAgICAgIG5hID0gYSA/IE1hdGgubWluKG5iLCBhLmxlbmd0aCkgOiAwLA0KICAgICAgeCA9IG5ldyBBcnJheShuYiksDQogICAgICBjID0gbmV3IEFycmF5KG5iKSwNCiAgICAgIGk7DQoNCiAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIHhbaV0gPSB2YWx1ZShhW2ldLCBiW2ldKTsNCiAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ldID0gYltpXTsNCg0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSBjW2ldID0geFtpXSh0KTsNCiAgICByZXR1cm4gYzsNCiAgfTsNCn07DQoNCnZhciBkYXRlID0gZnVuY3Rpb24oYSwgYikgew0KICB2YXIgZCA9IG5ldyBEYXRlOw0KICByZXR1cm4gYSA9ICthLCBiIC09IGEsIGZ1bmN0aW9uKHQpIHsNCiAgICByZXR1cm4gZC5zZXRUaW1lKGEgKyBiICogdCksIGQ7DQogIH07DQp9Ow0KDQp2YXIgbnVtYmVyID0gZnVuY3Rpb24oYSwgYikgew0KICByZXR1cm4gYSA9ICthLCBiIC09IGEsIGZ1bmN0aW9uKHQpIHsNCiAgICByZXR1cm4gYSArIGIgKiB0Ow0KICB9Ow0KfTsNCg0KdmFyIG9iamVjdCA9IGZ1bmN0aW9uKGEsIGIpIHsNCiAgdmFyIGkgPSB7fSwNCiAgICAgIGMgPSB7fSwNCiAgICAgIGs7DQoNCiAgaWYgKGEgPT09IG51bGwgfHwgdHlwZW9mIGEgIT09ICJvYmplY3QiKSBhID0ge307DQogIGlmIChiID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSAib2JqZWN0IikgYiA9IHt9Ow0KDQogIGZvciAoayBpbiBiKSB7DQogICAgaWYgKGsgaW4gYSkgew0KICAgICAgaVtrXSA9IHZhbHVlKGFba10sIGJba10pOw0KICAgIH0gZWxzZSB7DQogICAgICBjW2tdID0gYltrXTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIGZvciAoayBpbiBpKSBjW2tdID0gaVtrXSh0KTsNCiAgICByZXR1cm4gYzsNCiAgfTsNCn07DQoNCnZhciByZUEgPSAvWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2c7DQp2YXIgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCAiZyIpOw0KDQpmdW5jdGlvbiB6ZXJvKGIpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBiOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBvbmUoYikgew0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIHJldHVybiBiKHQpICsgIiI7DQogIH07DQp9DQoNCnZhciBzdHJpbmcgPSBmdW5jdGlvbihhLCBiKSB7DQogIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYg0KICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYQ0KICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYg0KICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55DQogICAgICBpID0gLTEsIC8vIGluZGV4IGluIHMNCiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzDQogICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzDQoNCiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLg0KICBhID0gYSArICIiLCBiID0gYiArICIiOw0KDQogIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuDQogIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSkNCiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkgew0KICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYg0KICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7DQogICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmcNCiAgICAgIGVsc2Ugc1srK2ldID0gYnM7DQogICAgfQ0KICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoDQogICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmcNCiAgICAgIGVsc2Ugc1srK2ldID0gYm07DQogICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnMNCiAgICAgIHNbKytpXSA9IG51bGw7DQogICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7DQogICAgfQ0KICAgIGJpID0gcmVCLmxhc3RJbmRleDsNCiAgfQ0KDQogIC8vIEFkZCByZW1haW5zIG9mIGIuDQogIGlmIChiaSA8IGIubGVuZ3RoKSB7DQogICAgYnMgPSBiLnNsaWNlKGJpKTsNCiAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmcNCiAgICBlbHNlIHNbKytpXSA9IGJzOw0KICB9DQoNCiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guDQogIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuDQogIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXQ0KICAgICAgPyBvbmUocVswXS54KQ0KICAgICAgOiB6ZXJvKGIpKQ0KICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7DQogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsNCiAgICAgICAgICByZXR1cm4gcy5qb2luKCIiKTsNCiAgICAgICAgfSk7DQp9Ow0KDQp2YXIgdmFsdWUgPSBmdW5jdGlvbihhLCBiKSB7DQogIHZhciB0ID0gdHlwZW9mIGIsIGM7DQogIHJldHVybiBiID09IG51bGwgfHwgdCA9PT0gImJvb2xlYW4iID8gY29uc3RhbnQoYikNCiAgICAgIDogKHQgPT09ICJudW1iZXIiID8gbnVtYmVyDQogICAgICA6IHQgPT09ICJzdHJpbmciID8gKChjID0gZDNDb2xvci5jb2xvcihiKSkgPyAoYiA9IGMsIHJnYiQxKSA6IHN0cmluZykNCiAgICAgIDogYiBpbnN0YW5jZW9mIGQzQ29sb3IuY29sb3IgPyByZ2IkMQ0KICAgICAgOiBiIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGUNCiAgICAgIDogQXJyYXkuaXNBcnJheShiKSA/IGFycmF5DQogICAgICA6IGlzTmFOKGIpID8gb2JqZWN0DQogICAgICA6IG51bWJlcikoYSwgYik7DQp9Ow0KDQp2YXIgcm91bmQgPSBmdW5jdGlvbihhLCBiKSB7DQogIHJldHVybiBhID0gK2EsIGIgLT0gYSwgZnVuY3Rpb24odCkgew0KICAgIHJldHVybiBNYXRoLnJvdW5kKGEgKyBiICogdCk7DQogIH07DQp9Ow0KDQp2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7DQoNCnZhciBpZGVudGl0eSA9IHsNCiAgdHJhbnNsYXRlWDogMCwNCiAgdHJhbnNsYXRlWTogMCwNCiAgcm90YXRlOiAwLA0KICBza2V3WDogMCwNCiAgc2NhbGVYOiAxLA0KICBzY2FsZVk6IDENCn07DQoNCnZhciBkZWNvbXBvc2UgPSBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7DQogIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7DQogIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDsNCiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYOw0KICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTsNCiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDsNCiAgcmV0dXJuIHsNCiAgICB0cmFuc2xhdGVYOiBlLA0KICAgIHRyYW5zbGF0ZVk6IGYsDQogICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcywNCiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsDQogICAgc2NhbGVYOiBzY2FsZVgsDQogICAgc2NhbGVZOiBzY2FsZVkNCiAgfTsNCn07DQoNCnZhciBjc3NOb2RlOw0KdmFyIGNzc1Jvb3Q7DQp2YXIgY3NzVmlldzsNCnZhciBzdmdOb2RlOw0KDQpmdW5jdGlvbiBwYXJzZUNzcyh2YWx1ZSkgew0KICBpZiAodmFsdWUgPT09ICJub25lIikgcmV0dXJuIGlkZW50aXR5Ow0KICBpZiAoIWNzc05vZGUpIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSwgY3NzUm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgY3NzVmlldyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3Ow0KICBjc3NOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IHZhbHVlOw0KICB2YWx1ZSA9IGNzc1ZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShjc3NSb290LmFwcGVuZENoaWxkKGNzc05vZGUpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKTsNCiAgY3NzUm9vdC5yZW1vdmVDaGlsZChjc3NOb2RlKTsNCiAgdmFsdWUgPSB2YWx1ZS5zbGljZSg3LCAtMSkuc3BsaXQoIiwiKTsNCiAgcmV0dXJuIGRlY29tcG9zZSgrdmFsdWVbMF0sICt2YWx1ZVsxXSwgK3ZhbHVlWzJdLCArdmFsdWVbM10sICt2YWx1ZVs0XSwgK3ZhbHVlWzVdKTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHsNCiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTsNCiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsICJnIik7DQogIHN2Z05vZGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCB2YWx1ZSk7DQogIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5Ow0KICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDsNCiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTsNCn0NCg0KZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7DQoNCiAgZnVuY3Rpb24gcG9wKHMpIHsNCiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgIiAiIDogIiI7DQogIH0NCg0KICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsNCiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikgew0KICAgICAgdmFyIGkgPSBzLnB1c2goInRyYW5zbGF0ZSgiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTsNCiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pOw0KICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHsNCiAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7DQogICAgaWYgKGEgIT09IGIpIHsNCiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aA0KICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTsNCiAgICB9IGVsc2UgaWYgKGIpIHsNCiAgICAgIHMucHVzaChwb3AocykgKyAicm90YXRlKCIgKyBiICsgZGVnUGFyZW4pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHsNCiAgICBpZiAoYSAhPT0gYikgew0KICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pOw0KICAgIH0gZWxzZSBpZiAoYikgew0KICAgICAgcy5wdXNoKHBvcChzKSArICJza2V3WCgiICsgYiArIGRlZ1BhcmVuKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkgew0KICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7DQogICAgICB2YXIgaSA9IHMucHVzaChwb3AocykgKyAic2NhbGUoIiwgbnVsbCwgIiwiLCBudWxsLCAiKSIpOw0KICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7DQogICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkgew0KICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsNCiAgICB2YXIgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMNCiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycw0KICAgIGEgPSBwYXJzZShhKSwgYiA9IHBhcnNlKGIpOw0KICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpOw0KICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpOw0KICAgIHNrZXdYKGEuc2tld1gsIGIuc2tld1gsIHMsIHEpOw0KICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTsNCiAgICBhID0gYiA9IG51bGw7IC8vIGdjDQogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICAgIHZhciBpID0gLTEsIG4gPSBxLmxlbmd0aCwgbzsNCiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7DQogICAgICByZXR1cm4gcy5qb2luKCIiKTsNCiAgICB9Ow0KICB9Ow0KfQ0KDQp2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgInB4LCAiLCAicHgpIiwgImRlZykiKTsNCnZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCAiLCAiLCAiKSIsICIpIik7DQoNCnZhciByaG8gPSBNYXRoLlNRUlQyOw0KdmFyIHJobzIgPSAyOw0KdmFyIHJobzQgPSA0Ow0KdmFyIGVwc2lsb24yID0gMWUtMTI7DQoNCmZ1bmN0aW9uIGNvc2goeCkgew0KICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjsNCn0NCg0KZnVuY3Rpb24gc2luaCh4KSB7DQogIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyOw0KfQ0KDQpmdW5jdGlvbiB0YW5oKHgpIHsNCiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7DQp9DQoNCi8vIHAwID0gW3V4MCwgdXkwLCB3MF0NCi8vIHAxID0gW3V4MSwgdXkxLCB3MV0NCnZhciB6b29tID0gZnVuY3Rpb24ocDAsIHAxKSB7DQogIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcwID0gcDBbMl0sDQogICAgICB1eDEgPSBwMVswXSwgdXkxID0gcDFbMV0sIHcxID0gcDFbMl0sDQogICAgICBkeCA9IHV4MSAtIHV4MCwNCiAgICAgIGR5ID0gdXkxIC0gdXkwLA0KICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSwNCiAgICAgIGksDQogICAgICBTOw0KDQogIC8vIFNwZWNpYWwgY2FzZSBmb3IgdTAg4omFIHUxLg0KICBpZiAoZDIgPCBlcHNpbG9uMikgew0KICAgIFMgPSBNYXRoLmxvZyh3MSAvIHcwKSAvIHJobzsNCiAgICBpID0gZnVuY3Rpb24odCkgew0KICAgICAgcmV0dXJuIFsNCiAgICAgICAgdXgwICsgdCAqIGR4LA0KICAgICAgICB1eTAgKyB0ICogZHksDQogICAgICAgIHcwICogTWF0aC5leHAocmhvICogdCAqIFMpDQogICAgICBdOw0KICAgIH07DQogIH0NCg0KICAvLyBHZW5lcmFsIGNhc2UuDQogIGVsc2Ugew0KICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksDQogICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLA0KICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSwNCiAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLA0KICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7DQogICAgUyA9IChyMSAtIHIwKSAvIHJobzsNCiAgICBpID0gZnVuY3Rpb24odCkgew0KICAgICAgdmFyIHMgPSB0ICogUywNCiAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSwNCiAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7DQogICAgICByZXR1cm4gWw0KICAgICAgICB1eDAgKyB1ICogZHgsDQogICAgICAgIHV5MCArIHUgKiBkeSwNCiAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMCkNCiAgICAgIF07DQogICAgfTsNCiAgfQ0KDQogIGkuZHVyYXRpb24gPSBTICogMTAwMDsNCg0KICByZXR1cm4gaTsNCn07DQoNCmZ1bmN0aW9uIGhzbCQxKGh1ZSQkMSkgew0KICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICAgIHZhciBoID0gaHVlJCQxKChzdGFydCA9IGQzQ29sb3IuaHNsKHN0YXJ0KSkuaCwgKGVuZCA9IGQzQ29sb3IuaHNsKGVuZCkpLmgpLA0KICAgICAgICBzID0gbm9nYW1tYShzdGFydC5zLCBlbmQucyksDQogICAgICAgIGwgPSBub2dhbW1hKHN0YXJ0LmwsIGVuZC5sKSwNCiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOw0KICAgIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgICBzdGFydC5oID0gaCh0KTsNCiAgICAgIHN0YXJ0LnMgPSBzKHQpOw0KICAgICAgc3RhcnQubCA9IGwodCk7DQogICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsNCiAgICAgIHJldHVybiBzdGFydCArICIiOw0KICAgIH07DQogIH0NCn0NCg0KdmFyIGhzbCQyID0gaHNsJDEoaHVlKTsNCnZhciBoc2xMb25nID0gaHNsJDEobm9nYW1tYSk7DQoNCmZ1bmN0aW9uIGxhYiQxKHN0YXJ0LCBlbmQpIHsNCiAgdmFyIGwgPSBub2dhbW1hKChzdGFydCA9IGQzQ29sb3IubGFiKHN0YXJ0KSkubCwgKGVuZCA9IGQzQ29sb3IubGFiKGVuZCkpLmwpLA0KICAgICAgYSA9IG5vZ2FtbWEoc3RhcnQuYSwgZW5kLmEpLA0KICAgICAgYiA9IG5vZ2FtbWEoc3RhcnQuYiwgZW5kLmIpLA0KICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOw0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIHN0YXJ0LmwgPSBsKHQpOw0KICAgIHN0YXJ0LmEgPSBhKHQpOw0KICAgIHN0YXJ0LmIgPSBiKHQpOw0KICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOw0KICAgIHJldHVybiBzdGFydCArICIiOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBoY2wkMShodWUkJDEpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgICB2YXIgaCA9IGh1ZSQkMSgoc3RhcnQgPSBkM0NvbG9yLmhjbChzdGFydCkpLmgsIChlbmQgPSBkM0NvbG9yLmhjbChlbmQpKS5oKSwNCiAgICAgICAgYyA9IG5vZ2FtbWEoc3RhcnQuYywgZW5kLmMpLA0KICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksDQogICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsNCiAgICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgICAgc3RhcnQuaCA9IGgodCk7DQogICAgICBzdGFydC5jID0gYyh0KTsNCiAgICAgIHN0YXJ0LmwgPSBsKHQpOw0KICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7DQogICAgICByZXR1cm4gc3RhcnQgKyAiIjsNCiAgICB9Ow0KICB9DQp9DQoNCnZhciBoY2wkMiA9IGhjbCQxKGh1ZSk7DQp2YXIgaGNsTG9uZyA9IGhjbCQxKG5vZ2FtbWEpOw0KDQpmdW5jdGlvbiBjdWJlaGVsaXgkMShodWUkJDEpIHsNCiAgcmV0dXJuIChmdW5jdGlvbiBjdWJlaGVsaXhHYW1tYSh5KSB7DQogICAgeSA9ICt5Ow0KDQogICAgZnVuY3Rpb24gY3ViZWhlbGl4JCQxKHN0YXJ0LCBlbmQpIHsNCiAgICAgIHZhciBoID0gaHVlJCQxKChzdGFydCA9IGQzQ29sb3IuY3ViZWhlbGl4KHN0YXJ0KSkuaCwgKGVuZCA9IGQzQ29sb3IuY3ViZWhlbGl4KGVuZCkpLmgpLA0KICAgICAgICAgIHMgPSBub2dhbW1hKHN0YXJ0LnMsIGVuZC5zKSwNCiAgICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksDQogICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOw0KICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICAgICAgc3RhcnQuaCA9IGgodCk7DQogICAgICAgIHN0YXJ0LnMgPSBzKHQpOw0KICAgICAgICBzdGFydC5sID0gbChNYXRoLnBvdyh0LCB5KSk7DQogICAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOw0KICAgICAgICByZXR1cm4gc3RhcnQgKyAiIjsNCiAgICAgIH07DQogICAgfQ0KDQogICAgY3ViZWhlbGl4JCQxLmdhbW1hID0gY3ViZWhlbGl4R2FtbWE7DQoNCiAgICByZXR1cm4gY3ViZWhlbGl4JCQxOw0KICB9KSgxKTsNCn0NCg0KdmFyIGN1YmVoZWxpeCQyID0gY3ViZWhlbGl4JDEoaHVlKTsNCnZhciBjdWJlaGVsaXhMb25nID0gY3ViZWhlbGl4JDEobm9nYW1tYSk7DQoNCnZhciBxdWFudGl6ZSA9IGZ1bmN0aW9uKGludGVycG9sYXRvciwgbikgew0KICB2YXIgc2FtcGxlcyA9IG5ldyBBcnJheShuKTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHNhbXBsZXNbaV0gPSBpbnRlcnBvbGF0b3IoaSAvIChuIC0gMSkpOw0KICByZXR1cm4gc2FtcGxlczsNCn07DQoNCmV4cG9ydHMuaW50ZXJwb2xhdGUgPSB2YWx1ZTsNCmV4cG9ydHMuaW50ZXJwb2xhdGVBcnJheSA9IGFycmF5Ow0KZXhwb3J0cy5pbnRlcnBvbGF0ZUJhc2lzID0gYmFzaXMkMTsNCmV4cG9ydHMuaW50ZXJwb2xhdGVCYXNpc0Nsb3NlZCA9IGJhc2lzQ2xvc2VkOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZURhdGUgPSBkYXRlOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZU51bWJlciA9IG51bWJlcjsNCmV4cG9ydHMuaW50ZXJwb2xhdGVPYmplY3QgPSBvYmplY3Q7DQpleHBvcnRzLmludGVycG9sYXRlUm91bmQgPSByb3VuZDsNCmV4cG9ydHMuaW50ZXJwb2xhdGVTdHJpbmcgPSBzdHJpbmc7DQpleHBvcnRzLmludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3M7DQpleHBvcnRzLmludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc7DQpleHBvcnRzLmludGVycG9sYXRlWm9vbSA9IHpvb207DQpleHBvcnRzLmludGVycG9sYXRlUmdiID0gcmdiJDE7DQpleHBvcnRzLmludGVycG9sYXRlUmdiQmFzaXMgPSByZ2JCYXNpczsNCmV4cG9ydHMuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZCA9IHJnYkJhc2lzQ2xvc2VkOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhzbCA9IGhzbCQyOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhzbExvbmcgPSBoc2xMb25nOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUxhYiA9IGxhYiQxOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhjbCA9IGhjbCQyOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhjbExvbmcgPSBoY2xMb25nOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeCA9IGN1YmVoZWxpeCQyOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXhMb25nOw0KZXhwb3J0cy5xdWFudGl6ZSA9IHF1YW50aXplOw0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHsiZDMtY29sb3IiOjV9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsNCi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtc2NhbGUvIFZlcnNpb24gMS4wLjUuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdkMy1hcnJheScpLCByZXF1aXJlKCdkMy1jb2xsZWN0aW9uJyksIHJlcXVpcmUoJ2QzLWludGVycG9sYXRlJyksIHJlcXVpcmUoJ2QzLWZvcm1hdCcpLCByZXF1aXJlKCdkMy10aW1lJyksIHJlcXVpcmUoJ2QzLXRpbWUtZm9ybWF0JyksIHJlcXVpcmUoJ2QzLWNvbG9yJykpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ2QzLWFycmF5JywgJ2QzLWNvbGxlY3Rpb24nLCAnZDMtaW50ZXJwb2xhdGUnLCAnZDMtZm9ybWF0JywgJ2QzLXRpbWUnLCAnZDMtdGltZS1mb3JtYXQnLCAnZDMtY29sb3InXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMykpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsZDNBcnJheSxkM0NvbGxlY3Rpb24sZDNJbnRlcnBvbGF0ZSxkM0Zvcm1hdCxkM1RpbWUsZDNUaW1lRm9ybWF0LGQzQ29sb3IpIHsgJ3VzZSBzdHJpY3QnOw0KDQp2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGU7DQoNCnZhciBtYXAkMSA9IGFycmF5Lm1hcDsNCnZhciBzbGljZSA9IGFycmF5LnNsaWNlOw0KDQp2YXIgaW1wbGljaXQgPSB7bmFtZTogImltcGxpY2l0In07DQoNCmZ1bmN0aW9uIG9yZGluYWwocmFuZ2UkJDEpIHsNCiAgdmFyIGluZGV4ID0gZDNDb2xsZWN0aW9uLm1hcCgpLA0KICAgICAgZG9tYWluID0gW10sDQogICAgICB1bmtub3duID0gaW1wbGljaXQ7DQoNCiAgcmFuZ2UkJDEgPSByYW5nZSQkMSA9PSBudWxsID8gW10gOiBzbGljZS5jYWxsKHJhbmdlJCQxKTsNCg0KICBmdW5jdGlvbiBzY2FsZShkKSB7DQogICAgdmFyIGtleSA9IGQgKyAiIiwgaSA9IGluZGV4LmdldChrZXkpOw0KICAgIGlmICghaSkgew0KICAgICAgaWYgKHVua25vd24gIT09IGltcGxpY2l0KSByZXR1cm4gdW5rbm93bjsNCiAgICAgIGluZGV4LnNldChrZXksIGkgPSBkb21haW4ucHVzaChkKSk7DQogICAgfQ0KICAgIHJldHVybiByYW5nZSQkMVsoaSAtIDEpICUgcmFuZ2UkJDEubGVuZ3RoXTsNCiAgfQ0KDQogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTsNCiAgICBkb21haW4gPSBbXSwgaW5kZXggPSBkM0NvbGxlY3Rpb24ubWFwKCk7DQogICAgdmFyIGkgPSAtMSwgbiA9IF8ubGVuZ3RoLCBkLCBrZXk7DQogICAgd2hpbGUgKCsraSA8IG4pIGlmICghaW5kZXguaGFzKGtleSA9IChkID0gX1tpXSkgKyAiIikpIGluZGV4LnNldChrZXksIGRvbWFpbi5wdXNoKGQpKTsNCiAgICByZXR1cm4gc2NhbGU7DQogIH07DQoNCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UkJDEgPSBzbGljZS5jYWxsKF8pLCBzY2FsZSkgOiByYW5nZSQkMS5zbGljZSgpOw0KICB9Ow0KDQogIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBvcmRpbmFsKCkNCiAgICAgICAgLmRvbWFpbihkb21haW4pDQogICAgICAgIC5yYW5nZShyYW5nZSQkMSkNCiAgICAgICAgLnVua25vd24odW5rbm93bik7DQogIH07DQoNCiAgcmV0dXJuIHNjYWxlOw0KfQ0KDQpmdW5jdGlvbiBiYW5kKCkgew0KICB2YXIgc2NhbGUgPSBvcmRpbmFsKCkudW5rbm93bih1bmRlZmluZWQpLA0KICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluLA0KICAgICAgb3JkaW5hbFJhbmdlID0gc2NhbGUucmFuZ2UsDQogICAgICByYW5nZSQkMSA9IFswLCAxXSwNCiAgICAgIHN0ZXAsDQogICAgICBiYW5kd2lkdGgsDQogICAgICByb3VuZCA9IGZhbHNlLA0KICAgICAgcGFkZGluZ0lubmVyID0gMCwNCiAgICAgIHBhZGRpbmdPdXRlciA9IDAsDQogICAgICBhbGlnbiA9IDAuNTsNCg0KICBkZWxldGUgc2NhbGUudW5rbm93bjsNCg0KICBmdW5jdGlvbiByZXNjYWxlKCkgew0KICAgIHZhciBuID0gZG9tYWluKCkubGVuZ3RoLA0KICAgICAgICByZXZlcnNlID0gcmFuZ2UkJDFbMV0gPCByYW5nZSQkMVswXSwNCiAgICAgICAgc3RhcnQgPSByYW5nZSQkMVtyZXZlcnNlIC0gMF0sDQogICAgICAgIHN0b3AgPSByYW5nZSQkMVsxIC0gcmV2ZXJzZV07DQogICAgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMSwgbiAtIHBhZGRpbmdJbm5lciArIHBhZGRpbmdPdXRlciAqIDIpOw0KICAgIGlmIChyb3VuZCkgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7DQogICAgc3RhcnQgKz0gKHN0b3AgLSBzdGFydCAtIHN0ZXAgKiAobiAtIHBhZGRpbmdJbm5lcikpICogYWxpZ247DQogICAgYmFuZHdpZHRoID0gc3RlcCAqICgxIC0gcGFkZGluZ0lubmVyKTsNCiAgICBpZiAocm91bmQpIHN0YXJ0ID0gTWF0aC5yb3VuZChzdGFydCksIGJhbmR3aWR0aCA9IE1hdGgucm91bmQoYmFuZHdpZHRoKTsNCiAgICB2YXIgdmFsdWVzID0gZDNBcnJheS5yYW5nZShuKS5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gc3RhcnQgKyBzdGVwICogaTsgfSk7DQogICAgcmV0dXJuIG9yZGluYWxSYW5nZShyZXZlcnNlID8gdmFsdWVzLnJldmVyc2UoKSA6IHZhbHVlcyk7DQogIH0NCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7DQogIH07DQoNCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UkJDEgPSBbK19bMF0sICtfWzFdXSwgcmVzY2FsZSgpKSA6IHJhbmdlJCQxLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gcmFuZ2UkJDEgPSBbK19bMF0sICtfWzFdXSwgcm91bmQgPSB0cnVlLCByZXNjYWxlKCk7DQogIH07DQoNCiAgc2NhbGUuYmFuZHdpZHRoID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGJhbmR3aWR0aDsNCiAgfTsNCg0KICBzY2FsZS5zdGVwID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHN0ZXA7DQogIH07DQoNCiAgc2NhbGUucm91bmQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmQgPSAhIV8sIHJlc2NhbGUoKSkgOiByb3VuZDsNCiAgfTsNCg0KICBzY2FsZS5wYWRkaW5nID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IHBhZGRpbmdPdXRlciA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjsNCiAgfTsNCg0KICBzY2FsZS5wYWRkaW5nSW5uZXIgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogcGFkZGluZ0lubmVyOw0KICB9Ow0KDQogIHNjYWxlLnBhZGRpbmdPdXRlciA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nT3V0ZXIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBwYWRkaW5nT3V0ZXI7DQogIH07DQoNCiAgc2NhbGUuYWxpZ24gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxpZ24gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBhbGlnbjsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGJhbmQoKQ0KICAgICAgICAuZG9tYWluKGRvbWFpbigpKQ0KICAgICAgICAucmFuZ2UocmFuZ2UkJDEpDQogICAgICAgIC5yb3VuZChyb3VuZCkNCiAgICAgICAgLnBhZGRpbmdJbm5lcihwYWRkaW5nSW5uZXIpDQogICAgICAgIC5wYWRkaW5nT3V0ZXIocGFkZGluZ091dGVyKQ0KICAgICAgICAuYWxpZ24oYWxpZ24pOw0KICB9Ow0KDQogIHJldHVybiByZXNjYWxlKCk7DQp9DQoNCmZ1bmN0aW9uIHBvaW50aXNoKHNjYWxlKSB7DQogIHZhciBjb3B5ID0gc2NhbGUuY29weTsNCg0KICBzY2FsZS5wYWRkaW5nID0gc2NhbGUucGFkZGluZ091dGVyOw0KICBkZWxldGUgc2NhbGUucGFkZGluZ0lubmVyOw0KICBkZWxldGUgc2NhbGUucGFkZGluZ091dGVyOw0KDQogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gcG9pbnRpc2goY29weSgpKTsNCiAgfTsNCg0KICByZXR1cm4gc2NhbGU7DQp9DQoNCmZ1bmN0aW9uIHBvaW50KCkgew0KICByZXR1cm4gcG9pbnRpc2goYmFuZCgpLnBhZGRpbmdJbm5lcigxKSk7DQp9DQoNCnZhciBjb25zdGFudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB4Ow0KICB9Ow0KfTsNCg0KdmFyIG51bWJlciA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuICt4Ow0KfTsNCg0KdmFyIHVuaXQgPSBbMCwgMV07DQoNCmZ1bmN0aW9uIGRlaW50ZXJwb2xhdGVMaW5lYXIoYSwgYikgew0KICByZXR1cm4gKGIgLT0gKGEgPSArYSkpDQogICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuICh4IC0gYSkgLyBiOyB9DQogICAgICA6IGNvbnN0YW50KGIpOw0KfQ0KDQpmdW5jdGlvbiBkZWludGVycG9sYXRlQ2xhbXAoZGVpbnRlcnBvbGF0ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oYSwgYikgew0KICAgIHZhciBkID0gZGVpbnRlcnBvbGF0ZShhID0gK2EsIGIgPSArYik7DQogICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggPD0gYSA/IDAgOiB4ID49IGIgPyAxIDogZCh4KTsgfTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gcmVpbnRlcnBvbGF0ZUNsYW1wKHJlaW50ZXJwb2xhdGUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsNCiAgICB2YXIgciA9IHJlaW50ZXJwb2xhdGUoYSA9ICthLCBiID0gK2IpOw0KICAgIHJldHVybiBmdW5jdGlvbih0KSB7IHJldHVybiB0IDw9IDAgPyBhIDogdCA+PSAxID8gYiA6IHIodCk7IH07DQogIH07DQp9DQoNCmZ1bmN0aW9uIGJpbWFwKGRvbWFpbiwgcmFuZ2UkJDEsIGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpIHsNCiAgdmFyIGQwID0gZG9tYWluWzBdLCBkMSA9IGRvbWFpblsxXSwgcjAgPSByYW5nZSQkMVswXSwgcjEgPSByYW5nZSQkMVsxXTsNCiAgaWYgKGQxIDwgZDApIGQwID0gZGVpbnRlcnBvbGF0ZShkMSwgZDApLCByMCA9IHJlaW50ZXJwb2xhdGUocjEsIHIwKTsNCiAgZWxzZSBkMCA9IGRlaW50ZXJwb2xhdGUoZDAsIGQxKSwgcjAgPSByZWludGVycG9sYXRlKHIwLCByMSk7DQogIHJldHVybiBmdW5jdGlvbih4KSB7IHJldHVybiByMChkMCh4KSk7IH07DQp9DQoNCmZ1bmN0aW9uIHBvbHltYXAoZG9tYWluLCByYW5nZSQkMSwgZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSkgew0KICB2YXIgaiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlJCQxLmxlbmd0aCkgLSAxLA0KICAgICAgZCA9IG5ldyBBcnJheShqKSwNCiAgICAgIHIgPSBuZXcgQXJyYXkoaiksDQogICAgICBpID0gLTE7DQoNCiAgLy8gUmV2ZXJzZSBkZXNjZW5kaW5nIGRvbWFpbnMuDQogIGlmIChkb21haW5bal0gPCBkb21haW5bMF0pIHsNCiAgICBkb21haW4gPSBkb21haW4uc2xpY2UoKS5yZXZlcnNlKCk7DQogICAgcmFuZ2UkJDEgPSByYW5nZSQkMS5zbGljZSgpLnJldmVyc2UoKTsNCiAgfQ0KDQogIHdoaWxlICgrK2kgPCBqKSB7DQogICAgZFtpXSA9IGRlaW50ZXJwb2xhdGUoZG9tYWluW2ldLCBkb21haW5baSArIDFdKTsNCiAgICByW2ldID0gcmVpbnRlcnBvbGF0ZShyYW5nZSQkMVtpXSwgcmFuZ2UkJDFbaSArIDFdKTsNCiAgfQ0KDQogIHJldHVybiBmdW5jdGlvbih4KSB7DQogICAgdmFyIGkgPSBkM0FycmF5LmJpc2VjdChkb21haW4sIHgsIDEsIGopIC0gMTsNCiAgICByZXR1cm4gcltpXShkW2ldKHgpKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gY29weShzb3VyY2UsIHRhcmdldCkgew0KICByZXR1cm4gdGFyZ2V0DQogICAgICAuZG9tYWluKHNvdXJjZS5kb21haW4oKSkNCiAgICAgIC5yYW5nZShzb3VyY2UucmFuZ2UoKSkNCiAgICAgIC5pbnRlcnBvbGF0ZShzb3VyY2UuaW50ZXJwb2xhdGUoKSkNCiAgICAgIC5jbGFtcChzb3VyY2UuY2xhbXAoKSk7DQp9DQoNCi8vIGRlaW50ZXJwb2xhdGUoYSwgYikoeCkgdGFrZXMgYSBkb21haW4gdmFsdWUgeCBpbiBbYSxiXSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgdCBpbiBbMCwxXS4NCi8vIHJlaW50ZXJwb2xhdGUoYSwgYikodCkgdGFrZXMgYSBwYXJhbWV0ZXIgdCBpbiBbMCwxXSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBkb21haW4gdmFsdWUgeCBpbiBbYSxiXS4NCmZ1bmN0aW9uIGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSkgew0KICB2YXIgZG9tYWluID0gdW5pdCwNCiAgICAgIHJhbmdlJCQxID0gdW5pdCwNCiAgICAgIGludGVycG9sYXRlJCQxID0gZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZSwNCiAgICAgIGNsYW1wID0gZmFsc2UsDQogICAgICBwaWVjZXdpc2UsDQogICAgICBvdXRwdXQsDQogICAgICBpbnB1dDsNCg0KICBmdW5jdGlvbiByZXNjYWxlKCkgew0KICAgIHBpZWNld2lzZSA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlJCQxLmxlbmd0aCkgPiAyID8gcG9seW1hcCA6IGJpbWFwOw0KICAgIG91dHB1dCA9IGlucHV0ID0gbnVsbDsNCiAgICByZXR1cm4gc2NhbGU7DQogIH0NCg0KICBmdW5jdGlvbiBzY2FsZSh4KSB7DQogICAgcmV0dXJuIChvdXRwdXQgfHwgKG91dHB1dCA9IHBpZWNld2lzZShkb21haW4sIHJhbmdlJCQxLCBjbGFtcCA/IGRlaW50ZXJwb2xhdGVDbGFtcChkZWludGVycG9sYXRlKSA6IGRlaW50ZXJwb2xhdGUsIGludGVycG9sYXRlJCQxKSkpKCt4KTsNCiAgfQ0KDQogIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkpIHsNCiAgICByZXR1cm4gKGlucHV0IHx8IChpbnB1dCA9IHBpZWNld2lzZShyYW5nZSQkMSwgZG9tYWluLCBkZWludGVycG9sYXRlTGluZWFyLCBjbGFtcCA/IHJlaW50ZXJwb2xhdGVDbGFtcChyZWludGVycG9sYXRlKSA6IHJlaW50ZXJwb2xhdGUpKSkoK3kpOw0KICB9Ow0KDQogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSBtYXAkMS5jYWxsKF8sIG51bWJlciksIHJlc2NhbGUoKSkgOiBkb21haW4uc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSQkMSA9IHNsaWNlLmNhbGwoXyksIHJlc2NhbGUoKSkgOiByYW5nZSQkMS5zbGljZSgpOw0KICB9Ow0KDQogIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIHJhbmdlJCQxID0gc2xpY2UuY2FsbChfKSwgaW50ZXJwb2xhdGUkJDEgPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlUm91bmQsIHJlc2NhbGUoKTsNCiAgfTsNCg0KICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9ICEhXywgcmVzY2FsZSgpKSA6IGNsYW1wOw0KICB9Ow0KDQogIHNjYWxlLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlJCQxID0gXywgcmVzY2FsZSgpKSA6IGludGVycG9sYXRlJCQxOw0KICB9Ow0KDQogIHJldHVybiByZXNjYWxlKCk7DQp9DQoNCnZhciB0aWNrRm9ybWF0ID0gZnVuY3Rpb24oZG9tYWluLCBjb3VudCwgc3BlY2lmaWVyKSB7DQogIHZhciBzdGFydCA9IGRvbWFpblswXSwNCiAgICAgIHN0b3AgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdLA0KICAgICAgc3RlcCA9IGQzQXJyYXkudGlja1N0ZXAoc3RhcnQsIHN0b3AsIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50KSwNCiAgICAgIHByZWNpc2lvbjsNCiAgc3BlY2lmaWVyID0gZDNGb3JtYXQuZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciA9PSBudWxsID8gIixmIiA6IHNwZWNpZmllcik7DQogIHN3aXRjaCAoc3BlY2lmaWVyLnR5cGUpIHsNCiAgICBjYXNlICJzIjogew0KICAgICAgdmFyIHZhbHVlID0gTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSk7DQogICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBkM0Zvcm1hdC5wcmVjaXNpb25QcmVmaXgoc3RlcCwgdmFsdWUpKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbjsNCiAgICAgIHJldHVybiBkM0Zvcm1hdC5mb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSk7DQogICAgfQ0KICAgIGNhc2UgIiI6DQogICAgY2FzZSAiZSI6DQogICAgY2FzZSAiZyI6DQogICAgY2FzZSAicCI6DQogICAgY2FzZSAiciI6IHsNCiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IGQzRm9ybWF0LnByZWNpc2lvblJvdW5kKHN0ZXAsIE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09ICJlIik7DQogICAgICBicmVhazsNCiAgICB9DQogICAgY2FzZSAiZiI6DQogICAgY2FzZSAiJSI6IHsNCiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IGQzRm9ybWF0LnByZWNpc2lvbkZpeGVkKHN0ZXApKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gIiUiKSAqIDI7DQogICAgICBicmVhazsNCiAgICB9DQogIH0NCiAgcmV0dXJuIGQzRm9ybWF0LmZvcm1hdChzcGVjaWZpZXIpOw0KfTsNCg0KZnVuY3Rpb24gbGluZWFyaXNoKHNjYWxlKSB7DQogIHZhciBkb21haW4gPSBzY2FsZS5kb21haW47DQoNCiAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkgew0KICAgIHZhciBkID0gZG9tYWluKCk7DQogICAgcmV0dXJuIGQzQXJyYXkudGlja3MoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCk7DQogIH07DQoNCiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHsNCiAgICByZXR1cm4gdGlja0Zvcm1hdChkb21haW4oKSwgY291bnQsIHNwZWNpZmllcik7DQogIH07DQoNCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGNvdW50KSB7DQogICAgdmFyIGQgPSBkb21haW4oKSwNCiAgICAgICAgaSA9IGQubGVuZ3RoIC0gMSwNCiAgICAgICAgbiA9IGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50LA0KICAgICAgICBzdGFydCA9IGRbMF0sDQogICAgICAgIHN0b3AgPSBkW2ldLA0KICAgICAgICBzdGVwID0gZDNBcnJheS50aWNrU3RlcChzdGFydCwgc3RvcCwgbik7DQoNCiAgICBpZiAoc3RlcCkgew0KICAgICAgc3RlcCA9IGQzQXJyYXkudGlja1N0ZXAoTWF0aC5mbG9vcihzdGFydCAvIHN0ZXApICogc3RlcCwgTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXAsIG4pOw0KICAgICAgZFswXSA9IE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXA7DQogICAgICBkW2ldID0gTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXA7DQogICAgICBkb21haW4oZCk7DQogICAgfQ0KDQogICAgcmV0dXJuIHNjYWxlOw0KICB9Ow0KDQogIHJldHVybiBzY2FsZTsNCn0NCg0KZnVuY3Rpb24gbGluZWFyKCkgew0KICB2YXIgc2NhbGUgPSBjb250aW51b3VzKGRlaW50ZXJwb2xhdGVMaW5lYXIsIGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGVOdW1iZXIpOw0KDQogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gY29weShzY2FsZSwgbGluZWFyKCkpOw0KICB9Ow0KDQogIHJldHVybiBsaW5lYXJpc2goc2NhbGUpOw0KfQ0KDQpmdW5jdGlvbiBpZGVudGl0eSgpIHsNCiAgdmFyIGRvbWFpbiA9IFswLCAxXTsNCg0KICBmdW5jdGlvbiBzY2FsZSh4KSB7DQogICAgcmV0dXJuICt4Ow0KICB9DQoNCiAgc2NhbGUuaW52ZXJ0ID0gc2NhbGU7DQoNCiAgc2NhbGUuZG9tYWluID0gc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gbWFwJDEuY2FsbChfLCBudW1iZXIpLCBzY2FsZSkgOiBkb21haW4uc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGlkZW50aXR5KCkuZG9tYWluKGRvbWFpbik7DQogIH07DQoNCiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7DQp9DQoNCnZhciBuaWNlID0gZnVuY3Rpb24oZG9tYWluLCBpbnRlcnZhbCkgew0KICBkb21haW4gPSBkb21haW4uc2xpY2UoKTsNCg0KICB2YXIgaTAgPSAwLA0KICAgICAgaTEgPSBkb21haW4ubGVuZ3RoIC0gMSwNCiAgICAgIHgwID0gZG9tYWluW2kwXSwNCiAgICAgIHgxID0gZG9tYWluW2kxXSwNCiAgICAgIHQ7DQoNCiAgaWYgKHgxIDwgeDApIHsNCiAgICB0ID0gaTAsIGkwID0gaTEsIGkxID0gdDsNCiAgICB0ID0geDAsIHgwID0geDEsIHgxID0gdDsNCiAgfQ0KDQogIGRvbWFpbltpMF0gPSBpbnRlcnZhbC5mbG9vcih4MCk7DQogIGRvbWFpbltpMV0gPSBpbnRlcnZhbC5jZWlsKHgxKTsNCiAgcmV0dXJuIGRvbWFpbjsNCn07DQoNCmZ1bmN0aW9uIGRlaW50ZXJwb2xhdGUoYSwgYikgew0KICByZXR1cm4gKGIgPSBNYXRoLmxvZyhiIC8gYSkpDQogICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgubG9nKHggLyBhKSAvIGI7IH0NCiAgICAgIDogY29uc3RhbnQoYik7DQp9DQoNCmZ1bmN0aW9uIHJlaW50ZXJwb2xhdGUoYSwgYikgew0KICByZXR1cm4gYSA8IDANCiAgICAgID8gZnVuY3Rpb24odCkgeyByZXR1cm4gLU1hdGgucG93KC1iLCB0KSAqIE1hdGgucG93KC1hLCAxIC0gdCk7IH0NCiAgICAgIDogZnVuY3Rpb24odCkgeyByZXR1cm4gTWF0aC5wb3coYiwgdCkgKiBNYXRoLnBvdyhhLCAxIC0gdCk7IH07DQp9DQoNCmZ1bmN0aW9uIHBvdzEwKHgpIHsNCiAgcmV0dXJuIGlzRmluaXRlKHgpID8gKygiMWUiICsgeCkgOiB4IDwgMCA/IDAgOiB4Ow0KfQ0KDQpmdW5jdGlvbiBwb3dwKGJhc2UpIHsNCiAgcmV0dXJuIGJhc2UgPT09IDEwID8gcG93MTANCiAgICAgIDogYmFzZSA9PT0gTWF0aC5FID8gTWF0aC5leHANCiAgICAgIDogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5wb3coYmFzZSwgeCk7IH07DQp9DQoNCmZ1bmN0aW9uIGxvZ3AoYmFzZSkgew0KICByZXR1cm4gYmFzZSA9PT0gTWF0aC5FID8gTWF0aC5sb2cNCiAgICAgIDogYmFzZSA9PT0gMTAgJiYgTWF0aC5sb2cxMA0KICAgICAgfHwgYmFzZSA9PT0gMiAmJiBNYXRoLmxvZzINCiAgICAgIHx8IChiYXNlID0gTWF0aC5sb2coYmFzZSksIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgubG9nKHgpIC8gYmFzZTsgfSk7DQp9DQoNCmZ1bmN0aW9uIHJlZmxlY3QoZikgew0KICByZXR1cm4gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiAtZigteCk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGxvZygpIHsNCiAgdmFyIHNjYWxlID0gY29udGludW91cyhkZWludGVycG9sYXRlLCByZWludGVycG9sYXRlKS5kb21haW4oWzEsIDEwXSksDQogICAgICBkb21haW4gPSBzY2FsZS5kb21haW4sDQogICAgICBiYXNlID0gMTAsDQogICAgICBsb2dzID0gbG9ncCgxMCksDQogICAgICBwb3dzID0gcG93cCgxMCk7DQoNCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsNCiAgICBsb2dzID0gbG9ncChiYXNlKSwgcG93cyA9IHBvd3AoYmFzZSk7DQogICAgaWYgKGRvbWFpbigpWzBdIDwgMCkgbG9ncyA9IHJlZmxlY3QobG9ncyksIHBvd3MgPSByZWZsZWN0KHBvd3MpOw0KICAgIHJldHVybiBzY2FsZTsNCiAgfQ0KDQogIHNjYWxlLmJhc2UgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFzZSA9ICtfLCByZXNjYWxlKCkpIDogYmFzZTsNCiAgfTsNCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7DQogIH07DQoNCiAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkgew0KICAgIHZhciBkID0gZG9tYWluKCksDQogICAgICAgIHUgPSBkWzBdLA0KICAgICAgICB2ID0gZFtkLmxlbmd0aCAtIDFdLA0KICAgICAgICByOw0KDQogICAgaWYgKHIgPSB2IDwgdSkgaSA9IHUsIHUgPSB2LCB2ID0gaTsNCg0KICAgIHZhciBpID0gbG9ncyh1KSwNCiAgICAgICAgaiA9IGxvZ3ModiksDQogICAgICAgIHAsDQogICAgICAgIGssDQogICAgICAgIHQsDQogICAgICAgIG4gPSBjb3VudCA9PSBudWxsID8gMTAgOiArY291bnQsDQogICAgICAgIHogPSBbXTsNCg0KICAgIGlmICghKGJhc2UgJSAxKSAmJiBqIC0gaSA8IG4pIHsNCiAgICAgIGkgPSBNYXRoLnJvdW5kKGkpIC0gMSwgaiA9IE1hdGgucm91bmQoaikgKyAxOw0KICAgICAgaWYgKHUgPiAwKSBmb3IgKDsgaSA8IGo7ICsraSkgew0KICAgICAgICBmb3IgKGsgPSAxLCBwID0gcG93cyhpKTsgayA8IGJhc2U7ICsraykgew0KICAgICAgICAgIHQgPSBwICogazsNCiAgICAgICAgICBpZiAodCA8IHUpIGNvbnRpbnVlOw0KICAgICAgICAgIGlmICh0ID4gdikgYnJlYWs7DQogICAgICAgICAgei5wdXNoKHQpOw0KICAgICAgICB9DQogICAgICB9IGVsc2UgZm9yICg7IGkgPCBqOyArK2kpIHsNCiAgICAgICAgZm9yIChrID0gYmFzZSAtIDEsIHAgPSBwb3dzKGkpOyBrID49IDE7IC0taykgew0KICAgICAgICAgIHQgPSBwICogazsNCiAgICAgICAgICBpZiAodCA8IHUpIGNvbnRpbnVlOw0KICAgICAgICAgIGlmICh0ID4gdikgYnJlYWs7DQogICAgICAgICAgei5wdXNoKHQpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIHogPSBkM0FycmF5LnRpY2tzKGksIGosIE1hdGgubWluKGogLSBpLCBuKSkubWFwKHBvd3MpOw0KICAgIH0NCg0KICAgIHJldHVybiByID8gei5yZXZlcnNlKCkgOiB6Ow0KICB9Ow0KDQogIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7DQogICAgaWYgKHNwZWNpZmllciA9PSBudWxsKSBzcGVjaWZpZXIgPSBiYXNlID09PSAxMCA/ICIuMGUiIDogIiwiOw0KICAgIGlmICh0eXBlb2Ygc3BlY2lmaWVyICE9PSAiZnVuY3Rpb24iKSBzcGVjaWZpZXIgPSBkM0Zvcm1hdC5mb3JtYXQoc3BlY2lmaWVyKTsNCiAgICBpZiAoY291bnQgPT09IEluZmluaXR5KSByZXR1cm4gc3BlY2lmaWVyOw0KICAgIGlmIChjb3VudCA9PSBudWxsKSBjb3VudCA9IDEwOw0KICAgIHZhciBrID0gTWF0aC5tYXgoMSwgYmFzZSAqIGNvdW50IC8gc2NhbGUudGlja3MoKS5sZW5ndGgpOyAvLyBUT0RPIGZhc3QgZXN0aW1hdGU/DQogICAgcmV0dXJuIGZ1bmN0aW9uKGQpIHsNCiAgICAgIHZhciBpID0gZCAvIHBvd3MoTWF0aC5yb3VuZChsb2dzKGQpKSk7DQogICAgICBpZiAoaSAqIGJhc2UgPCBiYXNlIC0gMC41KSBpICo9IGJhc2U7DQogICAgICByZXR1cm4gaSA8PSBrID8gc3BlY2lmaWVyKGQpIDogIiI7DQogICAgfTsNCiAgfTsNCg0KICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGRvbWFpbihuaWNlKGRvbWFpbigpLCB7DQogICAgICBmbG9vcjogZnVuY3Rpb24oeCkgeyByZXR1cm4gcG93cyhNYXRoLmZsb29yKGxvZ3MoeCkpKTsgfSwNCiAgICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHBvd3MoTWF0aC5jZWlsKGxvZ3MoeCkpKTsgfQ0KICAgIH0pKTsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGNvcHkoc2NhbGUsIGxvZygpLmJhc2UoYmFzZSkpOw0KICB9Ow0KDQogIHJldHVybiBzY2FsZTsNCn0NCg0KZnVuY3Rpb24gcmFpc2UoeCwgZXhwb25lbnQpIHsNCiAgcmV0dXJuIHggPCAwID8gLU1hdGgucG93KC14LCBleHBvbmVudCkgOiBNYXRoLnBvdyh4LCBleHBvbmVudCk7DQp9DQoNCmZ1bmN0aW9uIHBvdygpIHsNCiAgdmFyIGV4cG9uZW50ID0gMSwNCiAgICAgIHNjYWxlID0gY29udGludW91cyhkZWludGVycG9sYXRlLCByZWludGVycG9sYXRlKSwNCiAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbjsNCg0KICBmdW5jdGlvbiBkZWludGVycG9sYXRlKGEsIGIpIHsNCiAgICByZXR1cm4gKGIgPSByYWlzZShiLCBleHBvbmVudCkgLSAoYSA9IHJhaXNlKGEsIGV4cG9uZW50KSkpDQogICAgICAgID8gZnVuY3Rpb24oeCkgeyByZXR1cm4gKHJhaXNlKHgsIGV4cG9uZW50KSAtIGEpIC8gYjsgfQ0KICAgICAgICA6IGNvbnN0YW50KGIpOw0KICB9DQoNCiAgZnVuY3Rpb24gcmVpbnRlcnBvbGF0ZShhLCBiKSB7DQogICAgYiA9IHJhaXNlKGIsIGV4cG9uZW50KSAtIChhID0gcmFpc2UoYSwgZXhwb25lbnQpKTsNCiAgICByZXR1cm4gZnVuY3Rpb24odCkgeyByZXR1cm4gcmFpc2UoYSArIGIgKiB0LCAxIC8gZXhwb25lbnQpOyB9Ow0KICB9DQoNCiAgc2NhbGUuZXhwb25lbnQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXhwb25lbnQgPSArXywgZG9tYWluKGRvbWFpbigpKSkgOiBleHBvbmVudDsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGNvcHkoc2NhbGUsIHBvdygpLmV4cG9uZW50KGV4cG9uZW50KSk7DQogIH07DQoNCiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7DQp9DQoNCmZ1bmN0aW9uIHNxcnQoKSB7DQogIHJldHVybiBwb3coKS5leHBvbmVudCgwLjUpOw0KfQ0KDQpmdW5jdGlvbiBxdWFudGlsZSQxKCkgew0KICB2YXIgZG9tYWluID0gW10sDQogICAgICByYW5nZSQkMSA9IFtdLA0KICAgICAgdGhyZXNob2xkcyA9IFtdOw0KDQogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7DQogICAgdmFyIGkgPSAwLCBuID0gTWF0aC5tYXgoMSwgcmFuZ2UkJDEubGVuZ3RoKTsNCiAgICB0aHJlc2hvbGRzID0gbmV3IEFycmF5KG4gLSAxKTsNCiAgICB3aGlsZSAoKytpIDwgbikgdGhyZXNob2xkc1tpIC0gMV0gPSBkM0FycmF5LnF1YW50aWxlKGRvbWFpbiwgaSAvIG4pOw0KICAgIHJldHVybiBzY2FsZTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHNjYWxlKHgpIHsNCiAgICBpZiAoIWlzTmFOKHggPSAreCkpIHJldHVybiByYW5nZSQkMVtkM0FycmF5LmJpc2VjdCh0aHJlc2hvbGRzLCB4KV07DQogIH0NCg0KICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7DQogICAgdmFyIGkgPSByYW5nZSQkMS5pbmRleE9mKHkpOw0KICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl0gOiBbDQogICAgICBpID4gMCA/IHRocmVzaG9sZHNbaSAtIDFdIDogZG9tYWluWzBdLA0KICAgICAgaSA8IHRocmVzaG9sZHMubGVuZ3RoID8gdGhyZXNob2xkc1tpXSA6IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV0NCiAgICBdOw0KICB9Ow0KDQogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTsNCiAgICBkb21haW4gPSBbXTsNCiAgICBmb3IgKHZhciBpID0gMCwgbiA9IF8ubGVuZ3RoLCBkOyBpIDwgbjsgKytpKSBpZiAoZCA9IF9baV0sIGQgIT0gbnVsbCAmJiAhaXNOYU4oZCA9ICtkKSkgZG9tYWluLnB1c2goZCk7DQogICAgZG9tYWluLnNvcnQoZDNBcnJheS5hc2NlbmRpbmcpOw0KICAgIHJldHVybiByZXNjYWxlKCk7DQogIH07DQoNCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UkJDEgPSBzbGljZS5jYWxsKF8pLCByZXNjYWxlKCkpIDogcmFuZ2UkJDEuc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS5xdWFudGlsZXMgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhyZXNob2xkcy5zbGljZSgpOw0KICB9Ow0KDQogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gcXVhbnRpbGUkMSgpDQogICAgICAgIC5kb21haW4oZG9tYWluKQ0KICAgICAgICAucmFuZ2UocmFuZ2UkJDEpOw0KICB9Ow0KDQogIHJldHVybiBzY2FsZTsNCn0NCg0KZnVuY3Rpb24gcXVhbnRpemUoKSB7DQogIHZhciB4MCA9IDAsDQogICAgICB4MSA9IDEsDQogICAgICBuID0gMSwNCiAgICAgIGRvbWFpbiA9IFswLjVdLA0KICAgICAgcmFuZ2UkJDEgPSBbMCwgMV07DQoNCiAgZnVuY3Rpb24gc2NhbGUoeCkgew0KICAgIGlmICh4IDw9IHgpIHJldHVybiByYW5nZSQkMVtkM0FycmF5LmJpc2VjdChkb21haW4sIHgsIDAsIG4pXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7DQogICAgdmFyIGkgPSAtMTsNCiAgICBkb21haW4gPSBuZXcgQXJyYXkobik7DQogICAgd2hpbGUgKCsraSA8IG4pIGRvbWFpbltpXSA9ICgoaSArIDEpICogeDEgLSAoaSAtIG4pICogeDApIC8gKG4gKyAxKTsNCiAgICByZXR1cm4gc2NhbGU7DQogIH0NCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSArX1swXSwgeDEgPSArX1sxXSwgcmVzY2FsZSgpKSA6IFt4MCwgeDFdOw0KICB9Ow0KDQogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG4gPSAocmFuZ2UkJDEgPSBzbGljZS5jYWxsKF8pKS5sZW5ndGggLSAxLCByZXNjYWxlKCkpIDogcmFuZ2UkJDEuc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7DQogICAgdmFyIGkgPSByYW5nZSQkMS5pbmRleE9mKHkpOw0KICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl0NCiAgICAgICAgOiBpIDwgMSA/IFt4MCwgZG9tYWluWzBdXQ0KICAgICAgICA6IGkgPj0gbiA/IFtkb21haW5bbiAtIDFdLCB4MV0NCiAgICAgICAgOiBbZG9tYWluW2kgLSAxXSwgZG9tYWluW2ldXTsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHF1YW50aXplKCkNCiAgICAgICAgLmRvbWFpbihbeDAsIHgxXSkNCiAgICAgICAgLnJhbmdlKHJhbmdlJCQxKTsNCiAgfTsNCg0KICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsNCn0NCg0KZnVuY3Rpb24gdGhyZXNob2xkKCkgew0KICB2YXIgZG9tYWluID0gWzAuNV0sDQogICAgICByYW5nZSQkMSA9IFswLCAxXSwNCiAgICAgIG4gPSAxOw0KDQogIGZ1bmN0aW9uIHNjYWxlKHgpIHsNCiAgICBpZiAoeCA8PSB4KSByZXR1cm4gcmFuZ2UkJDFbZDNBcnJheS5iaXNlY3QoZG9tYWluLCB4LCAwLCBuKV07DQogIH0NCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gc2xpY2UuY2FsbChfKSwgbiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlJCQxLmxlbmd0aCAtIDEpLCBzY2FsZSkgOiBkb21haW4uc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSQkMSA9IHNsaWNlLmNhbGwoXyksIG4gPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZSQkMS5sZW5ndGggLSAxKSwgc2NhbGUpIDogcmFuZ2UkJDEuc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7DQogICAgdmFyIGkgPSByYW5nZSQkMS5pbmRleE9mKHkpOw0KICAgIHJldHVybiBbZG9tYWluW2kgLSAxXSwgZG9tYWluW2ldXTsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRocmVzaG9sZCgpDQogICAgICAgIC5kb21haW4oZG9tYWluKQ0KICAgICAgICAucmFuZ2UocmFuZ2UkJDEpOw0KICB9Ow0KDQogIHJldHVybiBzY2FsZTsNCn0NCg0KdmFyIGR1cmF0aW9uU2Vjb25kID0gMTAwMDsNCnZhciBkdXJhdGlvbk1pbnV0ZSA9IGR1cmF0aW9uU2Vjb25kICogNjA7DQp2YXIgZHVyYXRpb25Ib3VyID0gZHVyYXRpb25NaW51dGUgKiA2MDsNCnZhciBkdXJhdGlvbkRheSA9IGR1cmF0aW9uSG91ciAqIDI0Ow0KdmFyIGR1cmF0aW9uV2VlayA9IGR1cmF0aW9uRGF5ICogNzsNCnZhciBkdXJhdGlvbk1vbnRoID0gZHVyYXRpb25EYXkgKiAzMDsNCnZhciBkdXJhdGlvblllYXIgPSBkdXJhdGlvbkRheSAqIDM2NTsNCg0KZnVuY3Rpb24gZGF0ZSh0KSB7DQogIHJldHVybiBuZXcgRGF0ZSh0KTsNCn0NCg0KZnVuY3Rpb24gbnVtYmVyJDEodCkgew0KICByZXR1cm4gdCBpbnN0YW5jZW9mIERhdGUgPyArdCA6ICtuZXcgRGF0ZSgrdCk7DQp9DQoNCmZ1bmN0aW9uIGNhbGVuZGFyKHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwgZm9ybWF0JCQxKSB7DQogIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZUxpbmVhciwgZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZU51bWJlciksDQogICAgICBpbnZlcnQgPSBzY2FsZS5pbnZlcnQsDQogICAgICBkb21haW4gPSBzY2FsZS5kb21haW47DQoNCiAgdmFyIGZvcm1hdE1pbGxpc2Vjb25kID0gZm9ybWF0JCQxKCIuJUwiKSwNCiAgICAgIGZvcm1hdFNlY29uZCA9IGZvcm1hdCQkMSgiOiVTIiksDQogICAgICBmb3JtYXRNaW51dGUgPSBmb3JtYXQkJDEoIiVJOiVNIiksDQogICAgICBmb3JtYXRIb3VyID0gZm9ybWF0JCQxKCIlSSAlcCIpLA0KICAgICAgZm9ybWF0RGF5ID0gZm9ybWF0JCQxKCIlYSAlZCIpLA0KICAgICAgZm9ybWF0V2VlayA9IGZvcm1hdCQkMSgiJWIgJWQiKSwNCiAgICAgIGZvcm1hdE1vbnRoID0gZm9ybWF0JCQxKCIlQiIpLA0KICAgICAgZm9ybWF0WWVhciA9IGZvcm1hdCQkMSgiJVkiKTsNCg0KICB2YXIgdGlja0ludGVydmFscyA9IFsNCiAgICBbc2Vjb25kLCAgMSwgICAgICBkdXJhdGlvblNlY29uZF0sDQogICAgW3NlY29uZCwgIDUsICA1ICogZHVyYXRpb25TZWNvbmRdLA0KICAgIFtzZWNvbmQsIDE1LCAxNSAqIGR1cmF0aW9uU2Vjb25kXSwNCiAgICBbc2Vjb25kLCAzMCwgMzAgKiBkdXJhdGlvblNlY29uZF0sDQogICAgW21pbnV0ZSwgIDEsICAgICAgZHVyYXRpb25NaW51dGVdLA0KICAgIFttaW51dGUsICA1LCAgNSAqIGR1cmF0aW9uTWludXRlXSwNCiAgICBbbWludXRlLCAxNSwgMTUgKiBkdXJhdGlvbk1pbnV0ZV0sDQogICAgW21pbnV0ZSwgMzAsIDMwICogZHVyYXRpb25NaW51dGVdLA0KICAgIFsgIGhvdXIsICAxLCAgICAgIGR1cmF0aW9uSG91ciAgXSwNCiAgICBbICBob3VyLCAgMywgIDMgKiBkdXJhdGlvbkhvdXIgIF0sDQogICAgWyAgaG91ciwgIDYsICA2ICogZHVyYXRpb25Ib3VyICBdLA0KICAgIFsgIGhvdXIsIDEyLCAxMiAqIGR1cmF0aW9uSG91ciAgXSwNCiAgICBbICAgZGF5LCAgMSwgICAgICBkdXJhdGlvbkRheSAgIF0sDQogICAgWyAgIGRheSwgIDIsICAyICogZHVyYXRpb25EYXkgICBdLA0KICAgIFsgIHdlZWssICAxLCAgICAgIGR1cmF0aW9uV2VlayAgXSwNCiAgICBbIG1vbnRoLCAgMSwgICAgICBkdXJhdGlvbk1vbnRoIF0sDQogICAgWyBtb250aCwgIDMsICAzICogZHVyYXRpb25Nb250aCBdLA0KICAgIFsgIHllYXIsICAxLCAgICAgIGR1cmF0aW9uWWVhciAgXQ0KICBdOw0KDQogIGZ1bmN0aW9uIHRpY2tGb3JtYXQoZGF0ZSkgew0KICAgIHJldHVybiAoc2Vjb25kKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1pbGxpc2Vjb25kDQogICAgICAgIDogbWludXRlKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdFNlY29uZA0KICAgICAgICA6IGhvdXIoZGF0ZSkgPCBkYXRlID8gZm9ybWF0TWludXRlDQogICAgICAgIDogZGF5KGRhdGUpIDwgZGF0ZSA/IGZvcm1hdEhvdXINCiAgICAgICAgOiBtb250aChkYXRlKSA8IGRhdGUgPyAod2VlayhkYXRlKSA8IGRhdGUgPyBmb3JtYXREYXkgOiBmb3JtYXRXZWVrKQ0KICAgICAgICA6IHllYXIoZGF0ZSkgPCBkYXRlID8gZm9ybWF0TW9udGgNCiAgICAgICAgOiBmb3JtYXRZZWFyKShkYXRlKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHRpY2tJbnRlcnZhbChpbnRlcnZhbCwgc3RhcnQsIHN0b3AsIHN0ZXApIHsNCiAgICBpZiAoaW50ZXJ2YWwgPT0gbnVsbCkgaW50ZXJ2YWwgPSAxMDsNCg0KICAgIC8vIElmIGEgZGVzaXJlZCB0aWNrIGNvdW50IGlzIHNwZWNpZmllZCwgcGljayBhIHJlYXNvbmFibGUgdGljayBpbnRlcnZhbA0KICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgdGhlIGRvbWFpbiBhbmQgYSByb3VnaCBlc3RpbWF0ZSBvZiB0aWNrIHNpemUuDQogICAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgaW50ZXJ2YWwgaXMgYWxyZWFkeSBhIHRpbWUgaW50ZXJ2YWwgYW5kIHVzZSBpdC4NCiAgICBpZiAodHlwZW9mIGludGVydmFsID09PSAibnVtYmVyIikgew0KICAgICAgdmFyIHRhcmdldCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBpbnRlcnZhbCwNCiAgICAgICAgICBpID0gZDNBcnJheS5iaXNlY3RvcihmdW5jdGlvbihpKSB7IHJldHVybiBpWzJdOyB9KS5yaWdodCh0aWNrSW50ZXJ2YWxzLCB0YXJnZXQpOw0KICAgICAgaWYgKGkgPT09IHRpY2tJbnRlcnZhbHMubGVuZ3RoKSB7DQogICAgICAgIHN0ZXAgPSBkM0FycmF5LnRpY2tTdGVwKHN0YXJ0IC8gZHVyYXRpb25ZZWFyLCBzdG9wIC8gZHVyYXRpb25ZZWFyLCBpbnRlcnZhbCk7DQogICAgICAgIGludGVydmFsID0geWVhcjsNCiAgICAgIH0gZWxzZSBpZiAoaSkgew0KICAgICAgICBpID0gdGlja0ludGVydmFsc1t0YXJnZXQgLyB0aWNrSW50ZXJ2YWxzW2kgLSAxXVsyXSA8IHRpY2tJbnRlcnZhbHNbaV1bMl0gLyB0YXJnZXQgPyBpIC0gMSA6IGldOw0KICAgICAgICBzdGVwID0gaVsxXTsNCiAgICAgICAgaW50ZXJ2YWwgPSBpWzBdOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgc3RlcCA9IGQzQXJyYXkudGlja1N0ZXAoc3RhcnQsIHN0b3AsIGludGVydmFsKTsNCiAgICAgICAgaW50ZXJ2YWwgPSBtaWxsaXNlY29uZDsNCiAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gc3RlcCA9PSBudWxsID8gaW50ZXJ2YWwgOiBpbnRlcnZhbC5ldmVyeShzdGVwKTsNCiAgfQ0KDQogIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkpIHsNCiAgICByZXR1cm4gbmV3IERhdGUoaW52ZXJ0KHkpKTsNCiAgfTsNCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBkb21haW4obWFwJDEuY2FsbChfLCBudW1iZXIkMSkpIDogZG9tYWluKCkubWFwKGRhdGUpOw0KICB9Ow0KDQogIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oaW50ZXJ2YWwsIHN0ZXApIHsNCiAgICB2YXIgZCA9IGRvbWFpbigpLA0KICAgICAgICB0MCA9IGRbMF0sDQogICAgICAgIHQxID0gZFtkLmxlbmd0aCAtIDFdLA0KICAgICAgICByID0gdDEgPCB0MCwNCiAgICAgICAgdDsNCiAgICBpZiAocikgdCA9IHQwLCB0MCA9IHQxLCB0MSA9IHQ7DQogICAgdCA9IHRpY2tJbnRlcnZhbChpbnRlcnZhbCwgdDAsIHQxLCBzdGVwKTsNCiAgICB0ID0gdCA/IHQucmFuZ2UodDAsIHQxICsgMSkgOiBbXTsgLy8gaW5jbHVzaXZlIHN0b3ANCiAgICByZXR1cm4gciA/IHQucmV2ZXJzZSgpIDogdDsNCiAgfTsNCg0KICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikgew0KICAgIHJldHVybiBzcGVjaWZpZXIgPT0gbnVsbCA/IHRpY2tGb3JtYXQgOiBmb3JtYXQkJDEoc3BlY2lmaWVyKTsNCiAgfTsNCg0KICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oaW50ZXJ2YWwsIHN0ZXApIHsNCiAgICB2YXIgZCA9IGRvbWFpbigpOw0KICAgIHJldHVybiAoaW50ZXJ2YWwgPSB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgc3RlcCkpDQogICAgICAgID8gZG9tYWluKG5pY2UoZCwgaW50ZXJ2YWwpKQ0KICAgICAgICA6IHNjYWxlOw0KICB9Ow0KDQogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gY29weShzY2FsZSwgY2FsZW5kYXIoeWVhciwgbW9udGgsIHdlZWssIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kLCBmb3JtYXQkJDEpKTsNCiAgfTsNCg0KICByZXR1cm4gc2NhbGU7DQp9DQoNCnZhciB0aW1lID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBjYWxlbmRhcihkM1RpbWUudGltZVllYXIsIGQzVGltZS50aW1lTW9udGgsIGQzVGltZS50aW1lV2VlaywgZDNUaW1lLnRpbWVEYXksIGQzVGltZS50aW1lSG91ciwgZDNUaW1lLnRpbWVNaW51dGUsIGQzVGltZS50aW1lU2Vjb25kLCBkM1RpbWUudGltZU1pbGxpc2Vjb25kLCBkM1RpbWVGb3JtYXQudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyMDAwLCAwLCAxKSwgbmV3IERhdGUoMjAwMCwgMCwgMildKTsNCn07DQoNCnZhciB1dGNUaW1lID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBjYWxlbmRhcihkM1RpbWUudXRjWWVhciwgZDNUaW1lLnV0Y01vbnRoLCBkM1RpbWUudXRjV2VlaywgZDNUaW1lLnV0Y0RheSwgZDNUaW1lLnV0Y0hvdXIsIGQzVGltZS51dGNNaW51dGUsIGQzVGltZS51dGNTZWNvbmQsIGQzVGltZS51dGNNaWxsaXNlY29uZCwgZDNUaW1lRm9ybWF0LnV0Y0Zvcm1hdCkuZG9tYWluKFtEYXRlLlVUQygyMDAwLCAwLCAxKSwgRGF0ZS5VVEMoMjAwMCwgMCwgMildKTsNCn07DQoNCnZhciBjb2xvcnMgPSBmdW5jdGlvbihzKSB7DQogIHJldHVybiBzLm1hdGNoKC8uezZ9L2cpLm1hcChmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuICIjIiArIHg7DQogIH0pOw0KfTsNCg0KdmFyIGNhdGVnb3J5MTAgPSBjb2xvcnMoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpOw0KDQp2YXIgY2F0ZWdvcnkyMGIgPSBjb2xvcnMoIjM5M2I3OTUyNTRhMzZiNmVjZjljOWVkZTYzNzkzOThjYTI1MmI1Y2Y2YmNlZGI5YzhjNmQzMWJkOWUzOWU3YmE1MmU3Y2I5NDg0M2MzOWFkNDk0YWQ2NjE2YmU3OTY5YzdiNDE3M2E1NTE5NGNlNmRiZGRlOWVkNiIpOw0KDQp2YXIgY2F0ZWdvcnkyMGMgPSBjb2xvcnMoIjMxODJiZDZiYWVkNjllY2FlMWM2ZGJlZmU2NTUwZGZkOGQzY2ZkYWU2YmZkZDBhMjMxYTM1NDc0YzQ3NmExZDk5YmM3ZTljMDc1NmJiMTllOWFjOGJjYmRkY2RhZGFlYjYzNjM2Mzk2OTY5NmJkYmRiZGQ5ZDlkOSIpOw0KDQp2YXIgY2F0ZWdvcnkyMCA9IGNvbG9ycygiMWY3N2I0YWVjN2U4ZmY3ZjBlZmZiYjc4MmNhMDJjOThkZjhhZDYyNzI4ZmY5ODk2OTQ2N2JkYzViMGQ1OGM1NjRiYzQ5Yzk0ZTM3N2MyZjdiNmQyN2Y3ZjdmYzdjN2M3YmNiZDIyZGJkYjhkMTdiZWNmOWVkYWU1Iik7DQoNCnZhciBjdWJlaGVsaXgkMSA9IGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nKGQzQ29sb3IuY3ViZWhlbGl4KDMwMCwgMC41LCAwLjApLCBkM0NvbG9yLmN1YmVoZWxpeCgtMjQwLCAwLjUsIDEuMCkpOw0KDQp2YXIgd2FybSA9IGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nKGQzQ29sb3IuY3ViZWhlbGl4KC0xMDAsIDAuNzUsIDAuMzUpLCBkM0NvbG9yLmN1YmVoZWxpeCg4MCwgMS41MCwgMC44KSk7DQoNCnZhciBjb29sID0gZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmcoZDNDb2xvci5jdWJlaGVsaXgoMjYwLCAwLjc1LCAwLjM1KSwgZDNDb2xvci5jdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpOw0KDQp2YXIgcmFpbmJvdyA9IGQzQ29sb3IuY3ViZWhlbGl4KCk7DQoNCnZhciByYWluYm93JDEgPSBmdW5jdGlvbih0KSB7DQogIGlmICh0IDwgMCB8fCB0ID4gMSkgdCAtPSBNYXRoLmZsb29yKHQpOw0KICB2YXIgdHMgPSBNYXRoLmFicyh0IC0gMC41KTsNCiAgcmFpbmJvdy5oID0gMzYwICogdCAtIDEwMDsNCiAgcmFpbmJvdy5zID0gMS41IC0gMS41ICogdHM7DQogIHJhaW5ib3cubCA9IDAuOCAtIDAuOSAqIHRzOw0KICByZXR1cm4gcmFpbmJvdyArICIiOw0KfTsNCg0KZnVuY3Rpb24gcmFtcChyYW5nZSQkMSkgew0KICB2YXIgbiA9IHJhbmdlJCQxLmxlbmd0aDsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICByZXR1cm4gcmFuZ2UkJDFbTWF0aC5tYXgoMCwgTWF0aC5taW4obiAtIDEsIE1hdGguZmxvb3IodCAqIG4pKSldOw0KICB9Ow0KfQ0KDQp2YXIgdmlyaWRpcyA9IHJhbXAoY29sb3JzKCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSk7DQoNCnZhciBtYWdtYSA9IHJhbXAoY29sb3JzKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSk7DQoNCnZhciBpbmZlcm5vID0gcmFtcChjb2xvcnMoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNCIpKTsNCg0KdmFyIHBsYXNtYSA9IHJhbXAoY29sb3JzKCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7DQoNCmZ1bmN0aW9uIHNlcXVlbnRpYWwoaW50ZXJwb2xhdG9yKSB7DQogIHZhciB4MCA9IDAsDQogICAgICB4MSA9IDEsDQogICAgICBjbGFtcCA9IGZhbHNlOw0KDQogIGZ1bmN0aW9uIHNjYWxlKHgpIHsNCiAgICB2YXIgdCA9ICh4IC0geDApIC8gKHgxIC0geDApOw0KICAgIHJldHVybiBpbnRlcnBvbGF0b3IoY2xhbXAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0KSkgOiB0KTsNCiAgfQ0KDQogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9ICtfWzBdLCB4MSA9ICtfWzFdLCBzY2FsZSkgOiBbeDAsIHgxXTsNCiAgfTsNCg0KICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9ICEhXywgc2NhbGUpIDogY2xhbXA7DQogIH07DQoNCiAgc2NhbGUuaW50ZXJwb2xhdG9yID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRvciA9IF8sIHNjYWxlKSA6IGludGVycG9sYXRvcjsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHNlcXVlbnRpYWwoaW50ZXJwb2xhdG9yKS5kb21haW4oW3gwLCB4MV0pLmNsYW1wKGNsYW1wKTsNCiAgfTsNCg0KICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsNCn0NCg0KZXhwb3J0cy5zY2FsZUJhbmQgPSBiYW5kOw0KZXhwb3J0cy5zY2FsZVBvaW50ID0gcG9pbnQ7DQpleHBvcnRzLnNjYWxlSWRlbnRpdHkgPSBpZGVudGl0eTsNCmV4cG9ydHMuc2NhbGVMaW5lYXIgPSBsaW5lYXI7DQpleHBvcnRzLnNjYWxlTG9nID0gbG9nOw0KZXhwb3J0cy5zY2FsZU9yZGluYWwgPSBvcmRpbmFsOw0KZXhwb3J0cy5zY2FsZUltcGxpY2l0ID0gaW1wbGljaXQ7DQpleHBvcnRzLnNjYWxlUG93ID0gcG93Ow0KZXhwb3J0cy5zY2FsZVNxcnQgPSBzcXJ0Ow0KZXhwb3J0cy5zY2FsZVF1YW50aWxlID0gcXVhbnRpbGUkMTsNCmV4cG9ydHMuc2NhbGVRdWFudGl6ZSA9IHF1YW50aXplOw0KZXhwb3J0cy5zY2FsZVRocmVzaG9sZCA9IHRocmVzaG9sZDsNCmV4cG9ydHMuc2NhbGVUaW1lID0gdGltZTsNCmV4cG9ydHMuc2NhbGVVdGMgPSB1dGNUaW1lOw0KZXhwb3J0cy5zY2hlbWVDYXRlZ29yeTEwID0gY2F0ZWdvcnkxMDsNCmV4cG9ydHMuc2NoZW1lQ2F0ZWdvcnkyMGIgPSBjYXRlZ29yeTIwYjsNCmV4cG9ydHMuc2NoZW1lQ2F0ZWdvcnkyMGMgPSBjYXRlZ29yeTIwYzsNCmV4cG9ydHMuc2NoZW1lQ2F0ZWdvcnkyMCA9IGNhdGVnb3J5MjA7DQpleHBvcnRzLmludGVycG9sYXRlQ3ViZWhlbGl4RGVmYXVsdCA9IGN1YmVoZWxpeCQxOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZVJhaW5ib3cgPSByYWluYm93JDE7DQpleHBvcnRzLmludGVycG9sYXRlV2FybSA9IHdhcm07DQpleHBvcnRzLmludGVycG9sYXRlQ29vbCA9IGNvb2w7DQpleHBvcnRzLmludGVycG9sYXRlVmlyaWRpcyA9IHZpcmlkaXM7DQpleHBvcnRzLmludGVycG9sYXRlTWFnbWEgPSBtYWdtYTsNCmV4cG9ydHMuaW50ZXJwb2xhdGVJbmZlcm5vID0gaW5mZXJubzsNCmV4cG9ydHMuaW50ZXJwb2xhdGVQbGFzbWEgPSBwbGFzbWE7DQpleHBvcnRzLnNjYWxlU2VxdWVudGlhbCA9IHNlcXVlbnRpYWw7DQoNCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7DQoNCn0pKSk7DQoNCn0seyJkMy1hcnJheSI6MiwiZDMtY29sbGVjdGlvbiI6NCwiZDMtY29sb3IiOjUsImQzLWZvcm1hdCI6NiwiZDMtaW50ZXJwb2xhdGUiOjcsImQzLXRpbWUiOjExLCJkMy10aW1lLWZvcm1hdCI6MTB9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsNCi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtc2VsZWN0aW9uLyBWZXJzaW9uIDEuMC41LiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7DQoNCnZhciB4aHRtbCA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjsNCg0KdmFyIG5hbWVzcGFjZXMgPSB7DQogIHN2ZzogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwNCiAgeGh0bWw6IHhodG1sLA0KICB4bGluazogImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLA0KICB4bWw6ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLA0KICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIg0KfTsNCg0KdmFyIG5hbWVzcGFjZSA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gIiIsIGkgPSBwcmVmaXguaW5kZXhPZigiOiIpOw0KICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gInhtbG5zIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpOw0KICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7DQp9Ow0KDQpmdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsDQogICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJOw0KICAgIHJldHVybiB1cmkgPT09IHhodG1sICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IHhodG1sDQogICAgICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKQ0KICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7DQogIH07DQp9DQoNCnZhciBjcmVhdG9yID0gZnVuY3Rpb24obmFtZSkgew0KICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7DQogIHJldHVybiAoZnVsbG5hbWUubG9jYWwNCiAgICAgID8gY3JlYXRvckZpeGVkDQogICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7DQp9Ow0KDQp2YXIgbmV4dElkID0gMDsNCg0KZnVuY3Rpb24gbG9jYWwoKSB7DQogIHJldHVybiBuZXcgTG9jYWw7DQp9DQoNCmZ1bmN0aW9uIExvY2FsKCkgew0KICB0aGlzLl8gPSAiQCIgKyAoKytuZXh0SWQpLnRvU3RyaW5nKDM2KTsNCn0NCg0KTG9jYWwucHJvdG90eXBlID0gbG9jYWwucHJvdG90eXBlID0gew0KICBjb25zdHJ1Y3RvcjogTG9jYWwsDQogIGdldDogZnVuY3Rpb24obm9kZSkgew0KICAgIHZhciBpZCA9IHRoaXMuXzsNCiAgICB3aGlsZSAoIShpZCBpbiBub2RlKSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybjsNCiAgICByZXR1cm4gbm9kZVtpZF07DQogIH0sDQogIHNldDogZnVuY3Rpb24obm9kZSwgdmFsdWUpIHsNCiAgICByZXR1cm4gbm9kZVt0aGlzLl9dID0gdmFsdWU7DQogIH0sDQogIHJlbW92ZTogZnVuY3Rpb24obm9kZSkgew0KICAgIHJldHVybiB0aGlzLl8gaW4gbm9kZSAmJiBkZWxldGUgbm9kZVt0aGlzLl9dOw0KICB9LA0KICB0b1N0cmluZzogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMuXzsNCiAgfQ0KfTsNCg0KdmFyIG1hdGNoZXIgPSBmdW5jdGlvbihzZWxlY3Rvcikgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7DQogIH07DQp9Ow0KDQppZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgew0KICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCiAgaWYgKCFlbGVtZW50Lm1hdGNoZXMpIHsNCiAgICB2YXIgdmVuZG9yTWF0Y2hlcyA9IGVsZW1lbnQud2Via2l0TWF0Y2hlc1NlbGVjdG9yDQogICAgICAgIHx8IGVsZW1lbnQubXNNYXRjaGVzU2VsZWN0b3INCiAgICAgICAgfHwgZWxlbWVudC5tb3pNYXRjaGVzU2VsZWN0b3INCiAgICAgICAgfHwgZWxlbWVudC5vTWF0Y2hlc1NlbGVjdG9yOw0KICAgIG1hdGNoZXIgPSBmdW5jdGlvbihzZWxlY3Rvcikgew0KICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdmVuZG9yTWF0Y2hlcy5jYWxsKHRoaXMsIHNlbGVjdG9yKTsNCiAgICAgIH07DQogICAgfTsNCiAgfQ0KfQ0KDQp2YXIgbWF0Y2hlciQxID0gbWF0Y2hlcjsNCg0KdmFyIGZpbHRlckV2ZW50cyA9IHt9Ow0KDQpleHBvcnRzLmV2ZW50ID0gbnVsbDsNCg0KaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIpIHsNCiAgdmFyIGVsZW1lbnQkMSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCiAgaWYgKCEoIm9ubW91c2VlbnRlciIgaW4gZWxlbWVudCQxKSkgew0KICAgIGZpbHRlckV2ZW50cyA9IHttb3VzZWVudGVyOiAibW91c2VvdmVyIiwgbW91c2VsZWF2ZTogIm1vdXNlb3V0In07DQogIH0NCn0NCg0KZnVuY3Rpb24gZmlsdGVyQ29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHsNCiAgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIsIGluZGV4LCBncm91cCk7DQogIHJldHVybiBmdW5jdGlvbihldmVudCkgew0KICAgIHZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldDsNCiAgICBpZiAoIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRoaXMgJiYgIShyZWxhdGVkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpICYgOCkpKSB7DQogICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTsNCiAgICB9DQogIH07DQp9DQoNCmZ1bmN0aW9uIGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKSB7DQogIHJldHVybiBmdW5jdGlvbihldmVudDEpIHsNCiAgICB2YXIgZXZlbnQwID0gZXhwb3J0cy5ldmVudDsgLy8gRXZlbnRzIGNhbiBiZSByZWVudHJhbnQgKGUuZy4sIGZvY3VzKS4NCiAgICBleHBvcnRzLmV2ZW50ID0gZXZlbnQxOw0KICAgIHRyeSB7DQogICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIHRoaXMuX19kYXRhX18sIGluZGV4LCBncm91cCk7DQogICAgfSBmaW5hbGx5IHsNCiAgICAgIGV4cG9ydHMuZXZlbnQgPSBldmVudDA7DQogICAgfQ0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHsNCiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpIHsNCiAgICB2YXIgbmFtZSA9ICIiLCBpID0gdC5pbmRleE9mKCIuIik7DQogICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsNCiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9Ow0KICB9KTsNCn0NCg0KZnVuY3Rpb24gb25SZW1vdmUodHlwZW5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciBvbiA9IHRoaXMuX19vbjsNCiAgICBpZiAoIW9uKSByZXR1cm47DQogICAgZm9yICh2YXIgaiA9IDAsIGkgPSAtMSwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikgew0KICAgICAgaWYgKG8gPSBvbltqXSwgKCF0eXBlbmFtZS50eXBlIHx8IG8udHlwZSA9PT0gdHlwZW5hbWUudHlwZSkgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7DQogICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVyZSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBvblsrK2ldID0gbzsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKCsraSkgb24ubGVuZ3RoID0gaTsNCiAgICBlbHNlIGRlbGV0ZSB0aGlzLl9fb247DQogIH07DQp9DQoNCmZ1bmN0aW9uIG9uQWRkKHR5cGVuYW1lLCB2YWx1ZSwgY2FwdHVyZSkgew0KICB2YXIgd3JhcCA9IGZpbHRlckV2ZW50cy5oYXNPd25Qcm9wZXJ0eSh0eXBlbmFtZS50eXBlKSA/IGZpbHRlckNvbnRleHRMaXN0ZW5lciA6IGNvbnRleHRMaXN0ZW5lcjsNCiAgcmV0dXJuIGZ1bmN0aW9uKGQsIGksIGdyb3VwKSB7DQogICAgdmFyIG9uID0gdGhpcy5fX29uLCBvLCBsaXN0ZW5lciA9IHdyYXAodmFsdWUsIGksIGdyb3VwKTsNCiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7DQogICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHsNCiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5jYXB0dXJlKTsNCiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLmNhcHR1cmUgPSBjYXB0dXJlKTsNCiAgICAgICAgby52YWx1ZSA9IHZhbHVlOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgfQ0KICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgY2FwdHVyZSk7DQogICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgY2FwdHVyZTogY2FwdHVyZX07DQogICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dOw0KICAgIGVsc2Ugb24ucHVzaChvKTsNCiAgfTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9vbiA9IGZ1bmN0aW9uKHR5cGVuYW1lLCB2YWx1ZSwgY2FwdHVyZSkgew0KICB2YXIgdHlwZW5hbWVzID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyAiIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0Ow0KDQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgew0KICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247DQogICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikgew0KICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7DQogICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7DQogICAgICAgICAgcmV0dXJuIG8udmFsdWU7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuOw0KICB9DQoNCiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7DQogIGlmIChjYXB0dXJlID09IG51bGwpIGNhcHR1cmUgPSBmYWxzZTsNCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgdGhpcy5lYWNoKG9uKHR5cGVuYW1lc1tpXSwgdmFsdWUsIGNhcHR1cmUpKTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQpmdW5jdGlvbiBjdXN0b21FdmVudChldmVudDEsIGxpc3RlbmVyLCB0aGF0LCBhcmdzKSB7DQogIHZhciBldmVudDAgPSBleHBvcnRzLmV2ZW50Ow0KICBldmVudDEuc291cmNlRXZlbnQgPSBleHBvcnRzLmV2ZW50Ow0KICBleHBvcnRzLmV2ZW50ID0gZXZlbnQxOw0KICB0cnkgew0KICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmdzKTsNCiAgfSBmaW5hbGx5IHsNCiAgICBleHBvcnRzLmV2ZW50ID0gZXZlbnQwOw0KICB9DQp9DQoNCnZhciBzb3VyY2VFdmVudCA9IGZ1bmN0aW9uKCkgew0KICB2YXIgY3VycmVudCA9IGV4cG9ydHMuZXZlbnQsIHNvdXJjZTsNCiAgd2hpbGUgKHNvdXJjZSA9IGN1cnJlbnQuc291cmNlRXZlbnQpIGN1cnJlbnQgPSBzb3VyY2U7DQogIHJldHVybiBjdXJyZW50Ow0KfTsNCg0KdmFyIHBvaW50ID0gZnVuY3Rpb24obm9kZSwgZXZlbnQpIHsNCiAgdmFyIHN2ZyA9IG5vZGUub3duZXJTVkdFbGVtZW50IHx8IG5vZGU7DQoNCiAgaWYgKHN2Zy5jcmVhdGVTVkdQb2ludCkgew0KICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpOw0KICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTsNCiAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShub2RlLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7DQogICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTsNCiAgfQ0KDQogIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgcmV0dXJuIFtldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbm9kZS5jbGllbnRMZWZ0LCBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBub2RlLmNsaWVudFRvcF07DQp9Ow0KDQp2YXIgbW91c2UgPSBmdW5jdGlvbihub2RlKSB7DQogIHZhciBldmVudCA9IHNvdXJjZUV2ZW50KCk7DQogIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlcykgZXZlbnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTsNCiAgcmV0dXJuIHBvaW50KG5vZGUsIGV2ZW50KTsNCn07DQoNCmZ1bmN0aW9uIG5vbmUoKSB7fQ0KDQp2YXIgc2VsZWN0b3IgPSBmdW5jdGlvbihzZWxlY3Rvcikgew0KICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IG5vbmUgOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsNCiAgfTsNCn07DQoNCnZhciBzZWxlY3Rpb25fc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0KSB7DQogIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpOw0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7DQogICAgICAgIGlmICgiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOw0KICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsNCn07DQoNCmZ1bmN0aW9uIGVtcHR5KCkgew0KICByZXR1cm4gW107DQp9DQoNCnZhciBzZWxlY3RvckFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQogIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgfTsNCn07DQoNCnZhciBzZWxlY3Rpb25fc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0KSB7DQogIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpOw0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7DQogICAgICAgIHBhcmVudHMucHVzaChub2RlKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHBhcmVudHMpOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9maWx0ZXIgPSBmdW5jdGlvbihtYXRjaCkgew0KICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNoZXIkMShtYXRjaCk7DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgew0KICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7DQogICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsNCn07DQoNCnZhciBzcGFyc2UgPSBmdW5jdGlvbih1cGRhdGUpIHsNCiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTsNCn07DQoNCnZhciBzZWxlY3Rpb25fZW50ZXIgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTsNCn07DQoNCmZ1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsIGRhdHVtKSB7DQogIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50Ow0KICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7DQogIHRoaXMuX25leHQgPSBudWxsOw0KICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7DQogIHRoaXMuX19kYXRhX18gPSBkYXR1bTsNCn0NCg0KRW50ZXJOb2RlLnByb3RvdHlwZSA9IHsNCiAgY29uc3RydWN0b3I6IEVudGVyTm9kZSwNCiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSwNCiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sDQogIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sDQogIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH0NCn07DQoNCnZhciBjb25zdGFudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB4Ow0KICB9Ow0KfTsNCg0KdmFyIGtleVByZWZpeCA9ICIkIjsgLy8gUHJvdGVjdCBhZ2FpbnN0IGtleXMgbGlrZSDigJxfX3Byb3RvX1/igJ0uDQoNCmZ1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7DQogIHZhciBpID0gMCwNCiAgICAgIG5vZGUsDQogICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCwNCiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsNCg0KICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLg0KICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci4NCiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLg0KICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgew0KICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOw0KICAgICAgdXBkYXRlW2ldID0gbm9kZTsNCiAgICB9IGVsc2Ugew0KICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7DQogICAgfQ0KICB9DQoNCiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC4NCiAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7DQogICAgaWYgKG5vZGUgPSBncm91cFtpXSkgew0KICAgICAgZXhpdFtpXSA9IG5vZGU7DQogICAgfQ0KICB9DQp9DQoNCmZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7DQogIHZhciBpLA0KICAgICAgbm9kZSwNCiAgICAgIG5vZGVCeUtleVZhbHVlID0ge30sDQogICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCwNCiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCwNCiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksDQogICAgICBrZXlWYWx1ZTsNCg0KICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS4NCiAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0Lg0KICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkgew0KICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCiAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5UHJlZml4ICsga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApOw0KICAgICAgaWYgKGtleVZhbHVlIGluIG5vZGVCeUtleVZhbHVlKSB7DQogICAgICAgIGV4aXRbaV0gPSBub2RlOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbm9kZTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uDQogIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuDQogIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci4NCiAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgew0KICAgIGtleVZhbHVlID0ga2V5UHJlZml4ICsga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKTsNCiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSkgew0KICAgICAgdXBkYXRlW2ldID0gbm9kZTsNCiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOw0KICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbnVsbDsNCiAgICB9IGVsc2Ugew0KICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7DQogICAgfQ0KICB9DQoNCiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuDQogIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7DQogICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZXNbaV1dID09PSBub2RlKSkgew0KICAgICAgZXhpdFtpXSA9IG5vZGU7DQogICAgfQ0KICB9DQp9DQoNCnZhciBzZWxlY3Rpb25fZGF0YSA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsNCiAgaWYgKCF2YWx1ZSkgew0KICAgIGRhdGEgPSBuZXcgQXJyYXkodGhpcy5zaXplKCkpLCBqID0gLTE7DQogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKGQpIHsgZGF0YVsrK2pdID0gZDsgfSk7DQogICAgcmV0dXJuIGRhdGE7DQogIH0NCg0KICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsDQogICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cywNCiAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwczsNCg0KICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB2YWx1ZSA9IGNvbnN0YW50KHZhbHVlKTsNCg0KICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSwNCiAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sDQogICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLA0KICAgICAgICBkYXRhID0gdmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpLA0KICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsDQogICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSwNCiAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksDQogICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOw0KDQogICAgYmluZChwYXJlbnQsIGdyb3VwLCBlbnRlckdyb3VwLCB1cGRhdGVHcm91cCwgZXhpdEdyb3VwLCBkYXRhLCBrZXkpOw0KDQogICAgLy8gTm93IGNvbm5lY3QgdGhlIGVudGVyIG5vZGVzIHRvIHRoZWlyIGZvbGxvd2luZyB1cGRhdGUgbm9kZSwgc3VjaCB0aGF0DQogICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSwNCiAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS4NCiAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMCwgcHJldmlvdXMsIG5leHQ7IGkwIDwgZGF0YUxlbmd0aDsgKytpMCkgew0KICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHsNCiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsgMTsNCiAgICAgICAgd2hpbGUgKCEobmV4dCA9IHVwZGF0ZUdyb3VwW2kxXSkgJiYgKytpMSA8IGRhdGFMZW5ndGgpOw0KICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uKHVwZGF0ZSwgcGFyZW50cyk7DQogIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjsNCiAgdXBkYXRlLl9leGl0ID0gZXhpdDsNCiAgcmV0dXJuIHVwZGF0ZTsNCn07DQoNCnZhciBzZWxlY3Rpb25fZXhpdCA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX21lcmdlID0gZnVuY3Rpb24oc2VsZWN0aW9uKSB7DQoNCiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHsNCiAgICAgICAgbWVyZ2VbaV0gPSBub2RlOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGZvciAoOyBqIDwgbTA7ICsraikgew0KICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07DQogIH0NCg0KICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMpOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9vcmRlciA9IGZ1bmN0aW9uKCkgew0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHsNCiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09IG5vZGUubmV4dFNpYmxpbmcpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7DQogICAgICAgIG5leHQgPSBub2RlOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiB0aGlzOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9zb3J0ID0gZnVuY3Rpb24oY29tcGFyZSkgew0KICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7DQoNCiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikgew0KICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjsNCiAgfQ0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7DQogICAgICB9DQogICAgfQ0KICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTsNCiAgfQ0KDQogIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7DQp9Ow0KDQpmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikgew0KICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47DQp9DQoNCnZhciBzZWxlY3Rpb25fY2FsbCA9IGZ1bmN0aW9uKCkgew0KICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07DQogIGFyZ3VtZW50c1swXSA9IHRoaXM7DQogIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9ub2RlcyA9IGZ1bmN0aW9uKCkgew0KICB2YXIgbm9kZXMgPSBuZXcgQXJyYXkodGhpcy5zaXplKCkpLCBpID0gLTE7DQogIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgbm9kZXNbKytpXSA9IHRoaXM7IH0pOw0KICByZXR1cm4gbm9kZXM7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX25vZGUgPSBmdW5jdGlvbigpIHsNCg0KICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikgew0KICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkgew0KICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsNCiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gbnVsbDsNCn07DQoNCnZhciBzZWxlY3Rpb25fc2l6ZSA9IGZ1bmN0aW9uKCkgew0KICB2YXIgc2l6ZSA9IDA7DQogIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgKytzaXplOyB9KTsNCiAgcmV0dXJuIHNpemU7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX2VtcHR5ID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiAhdGhpcy5ub2RlKCk7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX2VhY2ggPSBmdW5jdGlvbihjYWxsYmFjaykgew0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gdGhpczsNCn07DQoNCmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgdmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdmFsdWUpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgdmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsNCiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHYpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgdmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7DQogICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7DQogIH07DQp9DQoNCnZhciBzZWxlY3Rpb25fYXR0ciA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7DQogIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsNCg0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsNCiAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpOw0KICAgIHJldHVybiBmdWxsbmFtZS5sb2NhbA0KICAgICAgICA/IG5vZGUuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKQ0KICAgICAgICA6IG5vZGUuZ2V0QXR0cmlidXRlKGZ1bGxuYW1lKTsNCiAgfQ0KDQogIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwNCiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iDQogICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKQ0KICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTsNCn07DQoNCnZhciBkZWZhdWx0VmlldyA9IGZ1bmN0aW9uKG5vZGUpIHsNCiAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZQ0KICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvdw0KICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50DQp9Ow0KDQpmdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7DQogICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTsNCiAgfTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9zdHlsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgew0KICB2YXIgbm9kZTsNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxDQogICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbA0KICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uDQogICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpDQogICAgICA6IGRlZmF1bHRWaWV3KG5vZGUgPSB0aGlzLm5vZGUoKSkNCiAgICAgICAgICAuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKQ0KICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpOw0KfTsNCg0KZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgZGVsZXRlIHRoaXNbbmFtZV07DQogIH07DQp9DQoNCmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdOw0KICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7DQogIH07DQp9DQoNCnZhciBzZWxlY3Rpb25fcHJvcGVydHkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDENCiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsDQogICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvbg0KICAgICAgICAgIDogcHJvcGVydHlDb25zdGFudCkobmFtZSwgdmFsdWUpKQ0KICAgICAgOiB0aGlzLm5vZGUoKVtuYW1lXTsNCn07DQoNCmZ1bmN0aW9uIGNsYXNzQXJyYXkoc3RyaW5nKSB7DQogIHJldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxzKy8pOw0KfQ0KDQpmdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkgew0KICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTsNCn0NCg0KZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHsNCiAgdGhpcy5fbm9kZSA9IG5vZGU7DQogIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSB8fCAiIik7DQp9DQoNCkNsYXNzTGlzdC5wcm90b3R5cGUgPSB7DQogIGFkZDogZnVuY3Rpb24obmFtZSkgew0KICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsNCiAgICBpZiAoaSA8IDApIHsNCiAgICAgIHRoaXMuX25hbWVzLnB1c2gobmFtZSk7DQogICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOw0KICAgIH0NCiAgfSwNCiAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7DQogICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpOw0KICAgIGlmIChpID49IDApIHsNCiAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTsNCiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIHRoaXMuX25hbWVzLmpvaW4oIiAiKSk7DQogICAgfQ0KICB9LA0KICBjb250YWluczogZnVuY3Rpb24obmFtZSkgew0KICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7DQogIH0NCn07DQoNCmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHsNCiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsNCiAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTsNCn0NCg0KZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykgew0KICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOw0KICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pOw0KfQ0KDQpmdW5jdGlvbiBjbGFzc2VkVHJ1ZShuYW1lcykgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTsNCiAgfTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9jbGFzc2VkID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsNCiAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgIiIpOw0KDQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgew0KICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOw0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7DQogICAgcmV0dXJuIHRydWU7DQogIH0NCg0KICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWUNCiAgICAgID8gY2xhc3NlZFRydWUNCiAgICAgIDogY2xhc3NlZEZhbHNlKShuYW1lcywgdmFsdWUpKTsNCn07DQoNCmZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7DQogIHRoaXMudGV4dENvbnRlbnQgPSAiIjsNCn0NCg0KZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7DQogIH07DQp9DQoNCmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyAiIiA6IHY7DQogIH07DQp9DQoNCnZhciBzZWxlY3Rpb25fdGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7DQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoDQogICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsDQogICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KICAgICAgICAgID8gdGV4dEZ1bmN0aW9uDQogICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSkNCiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7DQp9Ow0KDQpmdW5jdGlvbiBodG1sUmVtb3ZlKCkgew0KICB0aGlzLmlubmVySFRNTCA9ICIiOw0KfQ0KDQpmdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gIiIgOiB2Ow0KICB9Ow0KfQ0KDQp2YXIgc2VsZWN0aW9uX2h0bWwgPSBmdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aA0KICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbA0KICAgICAgICAgID8gaHRtbFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgICAgICA/IGh0bWxGdW5jdGlvbg0KICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpDQogICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDsNCn07DQoNCmZ1bmN0aW9uIHJhaXNlKCkgew0KICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOw0KfQ0KDQp2YXIgc2VsZWN0aW9uX3JhaXNlID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0aGlzLmVhY2gocmFpc2UpOw0KfTsNCg0KZnVuY3Rpb24gbG93ZXIoKSB7DQogIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7DQp9DQoNCnZhciBzZWxlY3Rpb25fbG93ZXIgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIHRoaXMuZWFjaChsb3dlcik7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX2FwcGVuZCA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rpb24iID8gbmFtZSA6IGNyZWF0b3IobmFtZSk7DQogIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7DQogIH0pOw0KfTsNCg0KZnVuY3Rpb24gY29uc3RhbnROdWxsKCkgew0KICByZXR1cm4gbnVsbDsNCn0NCg0KdmFyIHNlbGVjdGlvbl9pbnNlcnQgPSBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHsNCiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rpb24iID8gbmFtZSA6IGNyZWF0b3IobmFtZSksDQogICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09ICJmdW5jdGlvbiIgPyBiZWZvcmUgOiBzZWxlY3RvcihiZWZvcmUpOw0KICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTsNCiAgfSk7DQp9Ow0KDQpmdW5jdGlvbiByZW1vdmUoKSB7DQogIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7DQogIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9yZW1vdmUgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9kYXR1bSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoDQogICAgICA/IHRoaXMucHJvcGVydHkoIl9fZGF0YV9fIiwgdmFsdWUpDQogICAgICA6IHRoaXMubm9kZSgpLl9fZGF0YV9fOw0KfTsNCg0KZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChub2RlLCB0eXBlLCBwYXJhbXMpIHsNCiAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLA0KICAgICAgZXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7DQoNCiAgaWYgKGV2ZW50KSB7DQogICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTsNCiAgfSBlbHNlIHsNCiAgICBldmVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTsNCiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDsNCiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpOw0KICB9DQoNCiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsNCn0NCg0KZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7DQogIH07DQp9DQoNCnZhciBzZWxlY3Rpb25fZGlzcGF0Y2ggPSBmdW5jdGlvbih0eXBlLCBwYXJhbXMpIHsNCiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gImZ1bmN0aW9uIg0KICAgICAgPyBkaXNwYXRjaEZ1bmN0aW9uDQogICAgICA6IGRpc3BhdGNoQ29uc3RhbnQpKHR5cGUsIHBhcmFtcykpOw0KfTsNCg0KdmFyIHJvb3QgPSBbbnVsbF07DQoNCmZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHsNCiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzOw0KICB0aGlzLl9wYXJlbnRzID0gcGFyZW50czsNCn0NCg0KZnVuY3Rpb24gc2VsZWN0aW9uKCkgew0KICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTsNCn0NCg0KU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7DQogIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sDQogIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCwNCiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLA0KICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsDQogIGRhdGE6IHNlbGVjdGlvbl9kYXRhLA0KICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLA0KICBleGl0OiBzZWxlY3Rpb25fZXhpdCwNCiAgbWVyZ2U6IHNlbGVjdGlvbl9tZXJnZSwNCiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlciwNCiAgc29ydDogc2VsZWN0aW9uX3NvcnQsDQogIGNhbGw6IHNlbGVjdGlvbl9jYWxsLA0KICBub2Rlczogc2VsZWN0aW9uX25vZGVzLA0KICBub2RlOiBzZWxlY3Rpb25fbm9kZSwNCiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsDQogIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksDQogIGVhY2g6IHNlbGVjdGlvbl9lYWNoLA0KICBhdHRyOiBzZWxlY3Rpb25fYXR0ciwNCiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSwNCiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSwNCiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsDQogIHRleHQ6IHNlbGVjdGlvbl90ZXh0LA0KICBodG1sOiBzZWxlY3Rpb25faHRtbCwNCiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSwNCiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlciwNCiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLA0KICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsDQogIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSwNCiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSwNCiAgb246IHNlbGVjdGlvbl9vbiwNCiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaA0KfTsNCg0KdmFyIHNlbGVjdCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQogIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciDQogICAgICA/IG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKV1dLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSkNCiAgICAgIDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QpOw0KfTsNCg0KdmFyIHNlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQogIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciDQogICAgICA/IG5ldyBTZWxlY3Rpb24oW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pDQogICAgICA6IG5ldyBTZWxlY3Rpb24oW3NlbGVjdG9yID09IG51bGwgPyBbXSA6IHNlbGVjdG9yXSwgcm9vdCk7DQp9Ow0KDQp2YXIgdG91Y2ggPSBmdW5jdGlvbihub2RlLCB0b3VjaGVzLCBpZGVudGlmaWVyKSB7DQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgaWRlbnRpZmllciA9IHRvdWNoZXMsIHRvdWNoZXMgPSBzb3VyY2VFdmVudCgpLmNoYW5nZWRUb3VjaGVzOw0KDQogIGZvciAodmFyIGkgPSAwLCBuID0gdG91Y2hlcyA/IHRvdWNoZXMubGVuZ3RoIDogMCwgdG91Y2g7IGkgPCBuOyArK2kpIHsNCiAgICBpZiAoKHRvdWNoID0gdG91Y2hlc1tpXSkuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgew0KICAgICAgcmV0dXJuIHBvaW50KG5vZGUsIHRvdWNoKTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gbnVsbDsNCn07DQoNCnZhciB0b3VjaGVzID0gZnVuY3Rpb24obm9kZSwgdG91Y2hlcykgew0KICBpZiAodG91Y2hlcyA9PSBudWxsKSB0b3VjaGVzID0gc291cmNlRXZlbnQoKS50b3VjaGVzOw0KDQogIGZvciAodmFyIGkgPSAwLCBuID0gdG91Y2hlcyA/IHRvdWNoZXMubGVuZ3RoIDogMCwgcG9pbnRzID0gbmV3IEFycmF5KG4pOyBpIDwgbjsgKytpKSB7DQogICAgcG9pbnRzW2ldID0gcG9pbnQobm9kZSwgdG91Y2hlc1tpXSk7DQogIH0NCg0KICByZXR1cm4gcG9pbnRzOw0KfTsNCg0KZXhwb3J0cy5jcmVhdG9yID0gY3JlYXRvcjsNCmV4cG9ydHMubG9jYWwgPSBsb2NhbDsNCmV4cG9ydHMubWF0Y2hlciA9IG1hdGNoZXIkMTsNCmV4cG9ydHMubW91c2UgPSBtb3VzZTsNCmV4cG9ydHMubmFtZXNwYWNlID0gbmFtZXNwYWNlOw0KZXhwb3J0cy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlczsNCmV4cG9ydHMuc2VsZWN0ID0gc2VsZWN0Ow0KZXhwb3J0cy5zZWxlY3RBbGwgPSBzZWxlY3RBbGw7DQpleHBvcnRzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsNCmV4cG9ydHMuc2VsZWN0b3IgPSBzZWxlY3RvcjsNCmV4cG9ydHMuc2VsZWN0b3JBbGwgPSBzZWxlY3RvckFsbDsNCmV4cG9ydHMudG91Y2ggPSB0b3VjaDsNCmV4cG9ydHMudG91Y2hlcyA9IHRvdWNoZXM7DQpleHBvcnRzLndpbmRvdyA9IGRlZmF1bHRWaWV3Ow0KZXhwb3J0cy5jdXN0b21FdmVudCA9IGN1c3RvbUV2ZW50Ow0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHt9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLXRpbWUtZm9ybWF0LyBWZXJzaW9uIDIuMC41LiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnZDMtdGltZScpKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdkMy10aW1lJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSxnbG9iYWwuZDMpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLGQzVGltZSkgeyAndXNlIHN0cmljdCc7DQoNCmZ1bmN0aW9uIGxvY2FsRGF0ZShkKSB7DQogIGlmICgwIDw9IGQueSAmJiBkLnkgPCAxMDApIHsNCiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKC0xLCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKTsNCiAgICBkYXRlLnNldEZ1bGxZZWFyKGQueSk7DQogICAgcmV0dXJuIGRhdGU7DQogIH0NCiAgcmV0dXJuIG5ldyBEYXRlKGQueSwgZC5tLCBkLmQsIGQuSCwgZC5NLCBkLlMsIGQuTCk7DQp9DQoNCmZ1bmN0aW9uIHV0Y0RhdGUoZCkgew0KICBpZiAoMCA8PSBkLnkgJiYgZC55IDwgMTAwKSB7DQogICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQygtMSwgZC5tLCBkLmQsIGQuSCwgZC5NLCBkLlMsIGQuTCkpOw0KICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoZC55KTsNCiAgICByZXR1cm4gZGF0ZTsNCiAgfQ0KICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoZC55LCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7DQp9DQoNCmZ1bmN0aW9uIG5ld1llYXIoeSkgew0KICByZXR1cm4ge3k6IHksIG06IDAsIGQ6IDEsIEg6IDAsIE06IDAsIFM6IDAsIEw6IDB9Ow0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRMb2NhbGUobG9jYWxlKSB7DQogIHZhciBsb2NhbGVfZGF0ZVRpbWUgPSBsb2NhbGUuZGF0ZVRpbWUsDQogICAgICBsb2NhbGVfZGF0ZSA9IGxvY2FsZS5kYXRlLA0KICAgICAgbG9jYWxlX3RpbWUgPSBsb2NhbGUudGltZSwNCiAgICAgIGxvY2FsZV9wZXJpb2RzID0gbG9jYWxlLnBlcmlvZHMsDQogICAgICBsb2NhbGVfd2Vla2RheXMgPSBsb2NhbGUuZGF5cywNCiAgICAgIGxvY2FsZV9zaG9ydFdlZWtkYXlzID0gbG9jYWxlLnNob3J0RGF5cywNCiAgICAgIGxvY2FsZV9tb250aHMgPSBsb2NhbGUubW9udGhzLA0KICAgICAgbG9jYWxlX3Nob3J0TW9udGhzID0gbG9jYWxlLnNob3J0TW9udGhzOw0KDQogIHZhciBwZXJpb2RSZSA9IGZvcm1hdFJlKGxvY2FsZV9wZXJpb2RzKSwNCiAgICAgIHBlcmlvZExvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfcGVyaW9kcyksDQogICAgICB3ZWVrZGF5UmUgPSBmb3JtYXRSZShsb2NhbGVfd2Vla2RheXMpLA0KICAgICAgd2Vla2RheUxvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfd2Vla2RheXMpLA0KICAgICAgc2hvcnRXZWVrZGF5UmUgPSBmb3JtYXRSZShsb2NhbGVfc2hvcnRXZWVrZGF5cyksDQogICAgICBzaG9ydFdlZWtkYXlMb29rdXAgPSBmb3JtYXRMb29rdXAobG9jYWxlX3Nob3J0V2Vla2RheXMpLA0KICAgICAgbW9udGhSZSA9IGZvcm1hdFJlKGxvY2FsZV9tb250aHMpLA0KICAgICAgbW9udGhMb29rdXAgPSBmb3JtYXRMb29rdXAobG9jYWxlX21vbnRocyksDQogICAgICBzaG9ydE1vbnRoUmUgPSBmb3JtYXRSZShsb2NhbGVfc2hvcnRNb250aHMpLA0KICAgICAgc2hvcnRNb250aExvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfc2hvcnRNb250aHMpOw0KDQogIHZhciBmb3JtYXRzID0gew0KICAgICJhIjogZm9ybWF0U2hvcnRXZWVrZGF5LA0KICAgICJBIjogZm9ybWF0V2Vla2RheSwNCiAgICAiYiI6IGZvcm1hdFNob3J0TW9udGgsDQogICAgIkIiOiBmb3JtYXRNb250aCwNCiAgICAiYyI6IG51bGwsDQogICAgImQiOiBmb3JtYXREYXlPZk1vbnRoLA0KICAgICJlIjogZm9ybWF0RGF5T2ZNb250aCwNCiAgICAiSCI6IGZvcm1hdEhvdXIyNCwNCiAgICAiSSI6IGZvcm1hdEhvdXIxMiwNCiAgICAiaiI6IGZvcm1hdERheU9mWWVhciwNCiAgICAiTCI6IGZvcm1hdE1pbGxpc2Vjb25kcywNCiAgICAibSI6IGZvcm1hdE1vbnRoTnVtYmVyLA0KICAgICJNIjogZm9ybWF0TWludXRlcywNCiAgICAicCI6IGZvcm1hdFBlcmlvZCwNCiAgICAiUyI6IGZvcm1hdFNlY29uZHMsDQogICAgIlUiOiBmb3JtYXRXZWVrTnVtYmVyU3VuZGF5LA0KICAgICJ3IjogZm9ybWF0V2Vla2RheU51bWJlciwNCiAgICAiVyI6IGZvcm1hdFdlZWtOdW1iZXJNb25kYXksDQogICAgIngiOiBudWxsLA0KICAgICJYIjogbnVsbCwNCiAgICAieSI6IGZvcm1hdFllYXIsDQogICAgIlkiOiBmb3JtYXRGdWxsWWVhciwNCiAgICAiWiI6IGZvcm1hdFpvbmUsDQogICAgIiUiOiBmb3JtYXRMaXRlcmFsUGVyY2VudA0KICB9Ow0KDQogIHZhciB1dGNGb3JtYXRzID0gew0KICAgICJhIjogZm9ybWF0VVRDU2hvcnRXZWVrZGF5LA0KICAgICJBIjogZm9ybWF0VVRDV2Vla2RheSwNCiAgICAiYiI6IGZvcm1hdFVUQ1Nob3J0TW9udGgsDQogICAgIkIiOiBmb3JtYXRVVENNb250aCwNCiAgICAiYyI6IG51bGwsDQogICAgImQiOiBmb3JtYXRVVENEYXlPZk1vbnRoLA0KICAgICJlIjogZm9ybWF0VVRDRGF5T2ZNb250aCwNCiAgICAiSCI6IGZvcm1hdFVUQ0hvdXIyNCwNCiAgICAiSSI6IGZvcm1hdFVUQ0hvdXIxMiwNCiAgICAiaiI6IGZvcm1hdFVUQ0RheU9mWWVhciwNCiAgICAiTCI6IGZvcm1hdFVUQ01pbGxpc2Vjb25kcywNCiAgICAibSI6IGZvcm1hdFVUQ01vbnRoTnVtYmVyLA0KICAgICJNIjogZm9ybWF0VVRDTWludXRlcywNCiAgICAicCI6IGZvcm1hdFVUQ1BlcmlvZCwNCiAgICAiUyI6IGZvcm1hdFVUQ1NlY29uZHMsDQogICAgIlUiOiBmb3JtYXRVVENXZWVrTnVtYmVyU3VuZGF5LA0KICAgICJ3IjogZm9ybWF0VVRDV2Vla2RheU51bWJlciwNCiAgICAiVyI6IGZvcm1hdFVUQ1dlZWtOdW1iZXJNb25kYXksDQogICAgIngiOiBudWxsLA0KICAgICJYIjogbnVsbCwNCiAgICAieSI6IGZvcm1hdFVUQ1llYXIsDQogICAgIlkiOiBmb3JtYXRVVENGdWxsWWVhciwNCiAgICAiWiI6IGZvcm1hdFVUQ1pvbmUsDQogICAgIiUiOiBmb3JtYXRMaXRlcmFsUGVyY2VudA0KICB9Ow0KDQogIHZhciBwYXJzZXMgPSB7DQogICAgImEiOiBwYXJzZVNob3J0V2Vla2RheSwNCiAgICAiQSI6IHBhcnNlV2Vla2RheSwNCiAgICAiYiI6IHBhcnNlU2hvcnRNb250aCwNCiAgICAiQiI6IHBhcnNlTW9udGgsDQogICAgImMiOiBwYXJzZUxvY2FsZURhdGVUaW1lLA0KICAgICJkIjogcGFyc2VEYXlPZk1vbnRoLA0KICAgICJlIjogcGFyc2VEYXlPZk1vbnRoLA0KICAgICJIIjogcGFyc2VIb3VyMjQsDQogICAgIkkiOiBwYXJzZUhvdXIyNCwNCiAgICAiaiI6IHBhcnNlRGF5T2ZZZWFyLA0KICAgICJMIjogcGFyc2VNaWxsaXNlY29uZHMsDQogICAgIm0iOiBwYXJzZU1vbnRoTnVtYmVyLA0KICAgICJNIjogcGFyc2VNaW51dGVzLA0KICAgICJwIjogcGFyc2VQZXJpb2QsDQogICAgIlMiOiBwYXJzZVNlY29uZHMsDQogICAgIlUiOiBwYXJzZVdlZWtOdW1iZXJTdW5kYXksDQogICAgInciOiBwYXJzZVdlZWtkYXlOdW1iZXIsDQogICAgIlciOiBwYXJzZVdlZWtOdW1iZXJNb25kYXksDQogICAgIngiOiBwYXJzZUxvY2FsZURhdGUsDQogICAgIlgiOiBwYXJzZUxvY2FsZVRpbWUsDQogICAgInkiOiBwYXJzZVllYXIsDQogICAgIlkiOiBwYXJzZUZ1bGxZZWFyLA0KICAgICJaIjogcGFyc2Vab25lLA0KICAgICIlIjogcGFyc2VMaXRlcmFsUGVyY2VudA0KICB9Ow0KDQogIC8vIFRoZXNlIHJlY3Vyc2l2ZSBkaXJlY3RpdmUgZGVmaW5pdGlvbnMgbXVzdCBiZSBkZWZlcnJlZC4NCiAgZm9ybWF0cy54ID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlLCBmb3JtYXRzKTsNCiAgZm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCBmb3JtYXRzKTsNCiAgZm9ybWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgZm9ybWF0cyk7DQogIHV0Y0Zvcm1hdHMueCA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZSwgdXRjRm9ybWF0cyk7DQogIHV0Y0Zvcm1hdHMuWCA9IG5ld0Zvcm1hdChsb2NhbGVfdGltZSwgdXRjRm9ybWF0cyk7DQogIHV0Y0Zvcm1hdHMuYyA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZVRpbWUsIHV0Y0Zvcm1hdHMpOw0KDQogIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIsIGZvcm1hdHMpIHsNCiAgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkgew0KICAgICAgdmFyIHN0cmluZyA9IFtdLA0KICAgICAgICAgIGkgPSAtMSwNCiAgICAgICAgICBqID0gMCwNCiAgICAgICAgICBuID0gc3BlY2lmaWVyLmxlbmd0aCwNCiAgICAgICAgICBjLA0KICAgICAgICAgIHBhZCwNCiAgICAgICAgICBmb3JtYXQ7DQoNCiAgICAgIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSkgZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKTsNCg0KICAgICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgICAgaWYgKHNwZWNpZmllci5jaGFyQ29kZUF0KGkpID09PSAzNykgew0KICAgICAgICAgIHN0cmluZy5wdXNoKHNwZWNpZmllci5zbGljZShqLCBpKSk7DQogICAgICAgICAgaWYgKChwYWQgPSBwYWRzW2MgPSBzcGVjaWZpZXIuY2hhckF0KCsraSldKSAhPSBudWxsKSBjID0gc3BlY2lmaWVyLmNoYXJBdCgrK2kpOw0KICAgICAgICAgIGVsc2UgcGFkID0gYyA9PT0gImUiID8gIiAiIDogIjAiOw0KICAgICAgICAgIGlmIChmb3JtYXQgPSBmb3JtYXRzW2NdKSBjID0gZm9ybWF0KGRhdGUsIHBhZCk7DQogICAgICAgICAgc3RyaW5nLnB1c2goYyk7DQogICAgICAgICAgaiA9IGkgKyAxOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIHN0cmluZy5wdXNoKHNwZWNpZmllci5zbGljZShqLCBpKSk7DQogICAgICByZXR1cm4gc3RyaW5nLmpvaW4oIiIpOw0KICAgIH07DQogIH0NCg0KICBmdW5jdGlvbiBuZXdQYXJzZShzcGVjaWZpZXIsIG5ld0RhdGUpIHsNCiAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7DQogICAgICB2YXIgZCA9IG5ld1llYXIoMTkwMCksDQogICAgICAgICAgaSA9IHBhcnNlU3BlY2lmaWVyKGQsIHNwZWNpZmllciwgc3RyaW5nICs9ICIiLCAwKTsNCiAgICAgIGlmIChpICE9IHN0cmluZy5sZW5ndGgpIHJldHVybiBudWxsOw0KDQogICAgICAvLyBUaGUgYW0tcG0gZmxhZyBpcyAwIGZvciBBTSwgYW5kIDEgZm9yIFBNLg0KICAgICAgaWYgKCJwIiBpbiBkKSBkLkggPSBkLkggJSAxMiArIGQucCAqIDEyOw0KDQogICAgICAvLyBDb252ZXJ0IGRheS1vZi13ZWVrIGFuZCB3ZWVrLW9mLXllYXIgdG8gZGF5LW9mLXllYXIuDQogICAgICBpZiAoIlciIGluIGQgfHwgIlUiIGluIGQpIHsNCiAgICAgICAgaWYgKCEoInciIGluIGQpKSBkLncgPSAiVyIgaW4gZCA/IDEgOiAwOw0KICAgICAgICB2YXIgZGF5ID0gIloiIGluIGQgPyB1dGNEYXRlKG5ld1llYXIoZC55KSkuZ2V0VVRDRGF5KCkgOiBuZXdEYXRlKG5ld1llYXIoZC55KSkuZ2V0RGF5KCk7DQogICAgICAgIGQubSA9IDA7DQogICAgICAgIGQuZCA9ICJXIiBpbiBkID8gKGQudyArIDYpICUgNyArIGQuVyAqIDcgLSAoZGF5ICsgNSkgJSA3IDogZC53ICsgZC5VICogNyAtIChkYXkgKyA2KSAlIDc7DQogICAgICB9DQoNCiAgICAgIC8vIElmIGEgdGltZSB6b25lIGlzIHNwZWNpZmllZCwgYWxsIGZpZWxkcyBhcmUgaW50ZXJwcmV0ZWQgYXMgVVRDIGFuZCB0aGVuDQogICAgICAvLyBvZmZzZXQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgdGltZSB6b25lLg0KICAgICAgaWYgKCJaIiBpbiBkKSB7DQogICAgICAgIGQuSCArPSBkLlogLyAxMDAgfCAwOw0KICAgICAgICBkLk0gKz0gZC5aICUgMTAwOw0KICAgICAgICByZXR1cm4gdXRjRGF0ZShkKTsNCiAgICAgIH0NCg0KICAgICAgLy8gT3RoZXJ3aXNlLCBhbGwgZmllbGRzIGFyZSBpbiBsb2NhbCB0aW1lLg0KICAgICAgcmV0dXJuIG5ld0RhdGUoZCk7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlU3BlY2lmaWVyKGQsIHNwZWNpZmllciwgc3RyaW5nLCBqKSB7DQogICAgdmFyIGkgPSAwLA0KICAgICAgICBuID0gc3BlY2lmaWVyLmxlbmd0aCwNCiAgICAgICAgbSA9IHN0cmluZy5sZW5ndGgsDQogICAgICAgIGMsDQogICAgICAgIHBhcnNlOw0KDQogICAgd2hpbGUgKGkgPCBuKSB7DQogICAgICBpZiAoaiA+PSBtKSByZXR1cm4gLTE7DQogICAgICBjID0gc3BlY2lmaWVyLmNoYXJDb2RlQXQoaSsrKTsNCiAgICAgIGlmIChjID09PSAzNykgew0KICAgICAgICBjID0gc3BlY2lmaWVyLmNoYXJBdChpKyspOw0KICAgICAgICBwYXJzZSA9IHBhcnNlc1tjIGluIHBhZHMgPyBzcGVjaWZpZXIuY2hhckF0KGkrKykgOiBjXTsNCiAgICAgICAgaWYgKCFwYXJzZSB8fCAoKGogPSBwYXJzZShkLCBzdHJpbmcsIGopKSA8IDApKSByZXR1cm4gLTE7DQogICAgICB9IGVsc2UgaWYgKGMgIT0gc3RyaW5nLmNoYXJDb2RlQXQoaisrKSkgew0KICAgICAgICByZXR1cm4gLTE7DQogICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIGo7DQogIH0NCg0KICBmdW5jdGlvbiBwYXJzZVBlcmlvZChkLCBzdHJpbmcsIGkpIHsNCiAgICB2YXIgbiA9IHBlcmlvZFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsNCiAgICByZXR1cm4gbiA/IChkLnAgPSBwZXJpb2RMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KICB9DQoNCiAgZnVuY3Rpb24gcGFyc2VTaG9ydFdlZWtkYXkoZCwgc3RyaW5nLCBpKSB7DQogICAgdmFyIG4gPSBzaG9ydFdlZWtkYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7DQogICAgcmV0dXJuIG4gPyAoZC53ID0gc2hvcnRXZWVrZGF5TG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShkLCBzdHJpbmcsIGkpIHsNCiAgICB2YXIgbiA9IHdlZWtkYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7DQogICAgcmV0dXJuIG4gPyAoZC53ID0gd2Vla2RheUxvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQogIH0NCg0KICBmdW5jdGlvbiBwYXJzZVNob3J0TW9udGgoZCwgc3RyaW5nLCBpKSB7DQogICAgdmFyIG4gPSBzaG9ydE1vbnRoUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOw0KICAgIHJldHVybiBuID8gKGQubSA9IHNob3J0TW9udGhMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KICB9DQoNCiAgZnVuY3Rpb24gcGFyc2VNb250aChkLCBzdHJpbmcsIGkpIHsNCiAgICB2YXIgbiA9IG1vbnRoUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOw0KICAgIHJldHVybiBuID8gKGQubSA9IG1vbnRoTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlTG9jYWxlRGF0ZVRpbWUoZCwgc3RyaW5nLCBpKSB7DQogICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV9kYXRlVGltZSwgc3RyaW5nLCBpKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlTG9jYWxlRGF0ZShkLCBzdHJpbmcsIGkpIHsNCiAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX2RhdGUsIHN0cmluZywgaSk7DQogIH0NCg0KICBmdW5jdGlvbiBwYXJzZUxvY2FsZVRpbWUoZCwgc3RyaW5nLCBpKSB7DQogICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV90aW1lLCBzdHJpbmcsIGkpOw0KICB9DQoNCiAgZnVuY3Rpb24gZm9ybWF0U2hvcnRXZWVrZGF5KGQpIHsNCiAgICByZXR1cm4gbG9jYWxlX3Nob3J0V2Vla2RheXNbZC5nZXREYXkoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRXZWVrZGF5KGQpIHsNCiAgICByZXR1cm4gbG9jYWxlX3dlZWtkYXlzW2QuZ2V0RGF5KCldOw0KICB9DQoNCiAgZnVuY3Rpb24gZm9ybWF0U2hvcnRNb250aChkKSB7DQogICAgcmV0dXJuIGxvY2FsZV9zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldOw0KICB9DQoNCiAgZnVuY3Rpb24gZm9ybWF0TW9udGgoZCkgew0KICAgIHJldHVybiBsb2NhbGVfbW9udGhzW2QuZ2V0TW9udGgoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRQZXJpb2QoZCkgew0KICAgIHJldHVybiBsb2NhbGVfcGVyaW9kc1srKGQuZ2V0SG91cnMoKSA+PSAxMildOw0KICB9DQoNCiAgZnVuY3Rpb24gZm9ybWF0VVRDU2hvcnRXZWVrZGF5KGQpIHsNCiAgICByZXR1cm4gbG9jYWxlX3Nob3J0V2Vla2RheXNbZC5nZXRVVENEYXkoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRVVENXZWVrZGF5KGQpIHsNCiAgICByZXR1cm4gbG9jYWxlX3dlZWtkYXlzW2QuZ2V0VVRDRGF5KCldOw0KICB9DQoNCiAgZnVuY3Rpb24gZm9ybWF0VVRDU2hvcnRNb250aChkKSB7DQogICAgcmV0dXJuIGxvY2FsZV9zaG9ydE1vbnRoc1tkLmdldFVUQ01vbnRoKCldOw0KICB9DQoNCiAgZnVuY3Rpb24gZm9ybWF0VVRDTW9udGgoZCkgew0KICAgIHJldHVybiBsb2NhbGVfbW9udGhzW2QuZ2V0VVRDTW9udGgoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRVVENQZXJpb2QoZCkgew0KICAgIHJldHVybiBsb2NhbGVfcGVyaW9kc1srKGQuZ2V0VVRDSG91cnMoKSA+PSAxMildOw0KICB9DQoNCiAgcmV0dXJuIHsNCiAgICBmb3JtYXQ6IGZ1bmN0aW9uKHNwZWNpZmllcikgew0KICAgICAgdmFyIGYgPSBuZXdGb3JtYXQoc3BlY2lmaWVyICs9ICIiLCBmb3JtYXRzKTsNCiAgICAgIGYudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTsNCiAgICAgIHJldHVybiBmOw0KICAgIH0sDQogICAgcGFyc2U6IGZ1bmN0aW9uKHNwZWNpZmllcikgew0KICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIgKz0gIiIsIGxvY2FsRGF0ZSk7DQogICAgICBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07DQogICAgICByZXR1cm4gcDsNCiAgICB9LA0KICAgIHV0Y0Zvcm1hdDogZnVuY3Rpb24oc3BlY2lmaWVyKSB7DQogICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gIiIsIHV0Y0Zvcm1hdHMpOw0KICAgICAgZi50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9Ow0KICAgICAgcmV0dXJuIGY7DQogICAgfSwNCiAgICB1dGNQYXJzZTogZnVuY3Rpb24oc3BlY2lmaWVyKSB7DQogICAgICB2YXIgcCA9IG5ld1BhcnNlKHNwZWNpZmllciwgdXRjRGF0ZSk7DQogICAgICBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07DQogICAgICByZXR1cm4gcDsNCiAgICB9DQogIH07DQp9DQoNCnZhciBwYWRzID0geyItIjogIiIsICJfIjogIiAiLCAiMCI6ICIwIn07DQp2YXIgbnVtYmVyUmUgPSAvXlxzKlxkKy87DQp2YXIgcGVyY2VudFJlID0gL14lLzsNCnZhciByZXF1b3RlUmUgPSAvW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2c7DQoNCmZ1bmN0aW9uIHBhZCh2YWx1ZSwgZmlsbCwgd2lkdGgpIHsNCiAgdmFyIHNpZ24gPSB2YWx1ZSA8IDAgPyAiLSIgOiAiIiwNCiAgICAgIHN0cmluZyA9IChzaWduID8gLXZhbHVlIDogdmFsdWUpICsgIiIsDQogICAgICBsZW5ndGggPSBzdHJpbmcubGVuZ3RoOw0KICByZXR1cm4gc2lnbiArIChsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgKyBzdHJpbmcgOiBzdHJpbmcpOw0KfQ0KDQpmdW5jdGlvbiByZXF1b3RlKHMpIHsNCiAgcmV0dXJuIHMucmVwbGFjZShyZXF1b3RlUmUsICJcXCQmIik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFJlKG5hbWVzKSB7DQogIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIG5hbWVzLm1hcChyZXF1b3RlKS5qb2luKCJ8IikgKyAiKSIsICJpIik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdExvb2t1cChuYW1lcykgew0KICB2YXIgbWFwID0ge30sIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsNCiAgd2hpbGUgKCsraSA8IG4pIG1hcFtuYW1lc1tpXS50b0xvd2VyQ2FzZSgpXSA9IGk7DQogIHJldHVybiBtYXA7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlV2Vla2RheU51bWJlcihkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOw0KICByZXR1cm4gbiA/IChkLncgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJTdW5kYXkoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOw0KICByZXR1cm4gbiA/IChkLlUgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJNb25kYXkoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOw0KICByZXR1cm4gbiA/IChkLlcgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZUZ1bGxZZWFyKGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA0KSk7DQogIHJldHVybiBuID8gKGQueSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlWWVhcihkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOw0KICByZXR1cm4gbiA/IChkLnkgPSArblswXSArICgrblswXSA+IDY4ID8gMTkwMCA6IDIwMDApLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlWm9uZShkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSAvXihaKXwoWystXVxkXGQpKD86XDo/KFxkXGQpKT8vLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA2KSk7DQogIHJldHVybiBuID8gKGQuWiA9IG5bMV0gPyAwIDogLShuWzJdICsgKG5bM10gfHwgIjAwIikpLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlTW9udGhOdW1iZXIoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsNCiAgcmV0dXJuIG4gPyAoZC5tID0gblswXSAtIDEsIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VEYXlPZk1vbnRoKGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7DQogIHJldHVybiBuID8gKGQuZCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlRGF5T2ZZZWFyKGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7DQogIHJldHVybiBuID8gKGQubSA9IDAsIGQuZCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlSG91cjI0KGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7DQogIHJldHVybiBuID8gKGQuSCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlTWludXRlcyhkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOw0KICByZXR1cm4gbiA/IChkLk0gPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZVNlY29uZHMoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsNCiAgcmV0dXJuIG4gPyAoZC5TID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VNaWxsaXNlY29uZHMoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsNCiAgcmV0dXJuIG4gPyAoZC5MID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VMaXRlcmFsUGVyY2VudChkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBwZXJjZW50UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTsNCiAgcmV0dXJuIG4gPyBpICsgblswXS5sZW5ndGggOiAtMTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0RGF5T2ZNb250aChkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXREYXRlKCksIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRIb3VyMjQoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0SG91cnMoKSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdEhvdXIxMihkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRIb3VycygpICUgMTIgfHwgMTIsIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXREYXlPZlllYXIoZCwgcCkgew0KICByZXR1cm4gcGFkKDEgKyBkM1RpbWUudGltZURheS5jb3VudChkM1RpbWUudGltZVllYXIoZCksIGQpLCBwLCAzKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0TWlsbGlzZWNvbmRzKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldE1pbGxpc2Vjb25kcygpLCBwLCAzKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0TW9udGhOdW1iZXIoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0TW9udGgoKSArIDEsIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRNaW51dGVzKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldE1pbnV0ZXMoKSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFNlY29uZHMoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0U2Vjb25kcygpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlclN1bmRheShkLCBwKSB7DQogIHJldHVybiBwYWQoZDNUaW1lLnRpbWVTdW5kYXkuY291bnQoZDNUaW1lLnRpbWVZZWFyKGQpLCBkKSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXIoZCkgew0KICByZXR1cm4gZC5nZXREYXkoKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlck1vbmRheShkLCBwKSB7DQogIHJldHVybiBwYWQoZDNUaW1lLnRpbWVNb25kYXkuY291bnQoZDNUaW1lLnRpbWVZZWFyKGQpLCBkKSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFllYXIoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0RnVsbFllYXIoKSAlIDEwMCwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdEZ1bGxZZWFyKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldEZ1bGxZZWFyKCkgJSAxMDAwMCwgcCwgNCk7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFpvbmUoZCkgew0KICB2YXIgeiA9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKTsNCiAgcmV0dXJuICh6ID4gMCA/ICItIiA6ICh6ICo9IC0xLCAiKyIpKQ0KICAgICAgKyBwYWQoeiAvIDYwIHwgMCwgIjAiLCAyKQ0KICAgICAgKyBwYWQoeiAlIDYwLCAiMCIsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENEYXlPZk1vbnRoKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldFVUQ0RhdGUoKSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFVUQ0hvdXIyNChkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRVVENIb3VycygpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDSG91cjEyKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldFVUQ0hvdXJzKCkgJSAxMiB8fCAxMiwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFVUQ0RheU9mWWVhcihkLCBwKSB7DQogIHJldHVybiBwYWQoMSArIGQzVGltZS51dGNEYXkuY291bnQoZDNUaW1lLnV0Y1llYXIoZCksIGQpLCBwLCAzKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDTWlsbGlzZWNvbmRzKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldFVUQ01pbGxpc2Vjb25kcygpLCBwLCAzKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDTW9udGhOdW1iZXIoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0VVRDTW9udGgoKSArIDEsIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENNaW51dGVzKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldFVUQ01pbnV0ZXMoKSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFVUQ1NlY29uZHMoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0VVRDU2Vjb25kcygpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlclN1bmRheShkLCBwKSB7DQogIHJldHVybiBwYWQoZDNUaW1lLnV0Y1N1bmRheS5jb3VudChkM1RpbWUudXRjWWVhcihkKSwgZCksIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyKGQpIHsNCiAgcmV0dXJuIGQuZ2V0VVRDRGF5KCk7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtOdW1iZXJNb25kYXkoZCwgcCkgew0KICByZXR1cm4gcGFkKGQzVGltZS51dGNNb25kYXkuY291bnQoZDNUaW1lLnV0Y1llYXIoZCksIGQpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDWWVhcihkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDRnVsbFllYXIoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDWm9uZSgpIHsNCiAgcmV0dXJuICIrMDAwMCI7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdExpdGVyYWxQZXJjZW50KCkgew0KICByZXR1cm4gIiUiOw0KfQ0KDQp2YXIgbG9jYWxlJDE7DQoNCg0KDQoNCg0KZGVmYXVsdExvY2FsZSh7DQogIGRhdGVUaW1lOiAiJXgsICVYIiwNCiAgZGF0ZTogIiUtbS8lLWQvJVkiLA0KICB0aW1lOiAiJS1JOiVNOiVTICVwIiwNCiAgcGVyaW9kczogWyJBTSIsICJQTSJdLA0KICBkYXlzOiBbIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5Il0sDQogIHNob3J0RGF5czogWyJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiXSwNCiAgbW9udGhzOiBbIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiXSwNCiAgc2hvcnRNb250aHM6IFsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiXQ0KfSk7DQoNCmZ1bmN0aW9uIGRlZmF1bHRMb2NhbGUoZGVmaW5pdGlvbikgew0KICBsb2NhbGUkMSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTsNCiAgZXhwb3J0cy50aW1lRm9ybWF0ID0gbG9jYWxlJDEuZm9ybWF0Ow0KICBleHBvcnRzLnRpbWVQYXJzZSA9IGxvY2FsZSQxLnBhcnNlOw0KICBleHBvcnRzLnV0Y0Zvcm1hdCA9IGxvY2FsZSQxLnV0Y0Zvcm1hdDsNCiAgZXhwb3J0cy51dGNQYXJzZSA9IGxvY2FsZSQxLnV0Y1BhcnNlOw0KICByZXR1cm4gbG9jYWxlJDE7DQp9DQoNCnZhciBpc29TcGVjaWZpZXIgPSAiJVktJW0tJWRUJUg6JU06JVMuJUxaIjsNCg0KZnVuY3Rpb24gZm9ybWF0SXNvTmF0aXZlKGRhdGUpIHsNCiAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKTsNCn0NCg0KdmFyIGZvcm1hdElzbyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nDQogICAgPyBmb3JtYXRJc29OYXRpdmUNCiAgICA6IGV4cG9ydHMudXRjRm9ybWF0KGlzb1NwZWNpZmllcik7DQoNCmZ1bmN0aW9uIHBhcnNlSXNvTmF0aXZlKHN0cmluZykgew0KICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHN0cmluZyk7DQogIHJldHVybiBpc05hTihkYXRlKSA/IG51bGwgOiBkYXRlOw0KfQ0KDQp2YXIgcGFyc2VJc28gPSArbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpDQogICAgPyBwYXJzZUlzb05hdGl2ZQ0KICAgIDogZXhwb3J0cy51dGNQYXJzZShpc29TcGVjaWZpZXIpOw0KDQpleHBvcnRzLnRpbWVGb3JtYXREZWZhdWx0TG9jYWxlID0gZGVmYXVsdExvY2FsZTsNCmV4cG9ydHMudGltZUZvcm1hdExvY2FsZSA9IGZvcm1hdExvY2FsZTsNCmV4cG9ydHMuaXNvRm9ybWF0ID0gZm9ybWF0SXNvOw0KZXhwb3J0cy5pc29QYXJzZSA9IHBhcnNlSXNvOw0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHsiZDMtdGltZSI6MTF9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLXRpbWUvIFZlcnNpb24gMS4wLjYuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIHQwID0gbmV3IERhdGU7DQp2YXIgdDEgPSBuZXcgRGF0ZTsNCg0KZnVuY3Rpb24gbmV3SW50ZXJ2YWwoZmxvb3JpLCBvZmZzZXRpLCBjb3VudCwgZmllbGQpIHsNCg0KICBmdW5jdGlvbiBpbnRlcnZhbChkYXRlKSB7DQogICAgcmV0dXJuIGZsb29yaShkYXRlID0gbmV3IERhdGUoK2RhdGUpKSwgZGF0ZTsNCiAgfQ0KDQogIGludGVydmFsLmZsb29yID0gaW50ZXJ2YWw7DQoNCiAgaW50ZXJ2YWwuY2VpbCA9IGZ1bmN0aW9uKGRhdGUpIHsNCiAgICByZXR1cm4gZmxvb3JpKGRhdGUgPSBuZXcgRGF0ZShkYXRlIC0gMSkpLCBvZmZzZXRpKGRhdGUsIDEpLCBmbG9vcmkoZGF0ZSksIGRhdGU7DQogIH07DQoNCiAgaW50ZXJ2YWwucm91bmQgPSBmdW5jdGlvbihkYXRlKSB7DQogICAgdmFyIGQwID0gaW50ZXJ2YWwoZGF0ZSksDQogICAgICAgIGQxID0gaW50ZXJ2YWwuY2VpbChkYXRlKTsNCiAgICByZXR1cm4gZGF0ZSAtIGQwIDwgZDEgLSBkYXRlID8gZDAgOiBkMTsNCiAgfTsNCg0KICBpbnRlcnZhbC5vZmZzZXQgPSBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogICAgcmV0dXJuIG9mZnNldGkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSwgc3RlcCA9PSBudWxsID8gMSA6IE1hdGguZmxvb3Ioc3RlcCkpLCBkYXRlOw0KICB9Ow0KDQogIGludGVydmFsLnJhbmdlID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHsNCiAgICB2YXIgcmFuZ2UgPSBbXTsNCiAgICBzdGFydCA9IGludGVydmFsLmNlaWwoc3RhcnQpOw0KICAgIHN0ZXAgPSBzdGVwID09IG51bGwgPyAxIDogTWF0aC5mbG9vcihzdGVwKTsNCiAgICBpZiAoIShzdGFydCA8IHN0b3ApIHx8ICEoc3RlcCA+IDApKSByZXR1cm4gcmFuZ2U7IC8vIGFsc28gaGFuZGxlcyBJbnZhbGlkIERhdGUNCiAgICBkbyByYW5nZS5wdXNoKG5ldyBEYXRlKCtzdGFydCkpOyB3aGlsZSAob2Zmc2V0aShzdGFydCwgc3RlcCksIGZsb29yaShzdGFydCksIHN0YXJ0IDwgc3RvcCkNCiAgICByZXR1cm4gcmFuZ2U7DQogIH07DQoNCiAgaW50ZXJ2YWwuZmlsdGVyID0gZnVuY3Rpb24odGVzdCkgew0KICAgIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogICAgICBpZiAoZGF0ZSA+PSBkYXRlKSB3aGlsZSAoZmxvb3JpKGRhdGUpLCAhdGVzdChkYXRlKSkgZGF0ZS5zZXRUaW1lKGRhdGUgLSAxKTsNCiAgICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogICAgICBpZiAoZGF0ZSA+PSBkYXRlKSB3aGlsZSAoLS1zdGVwID49IDApIHdoaWxlIChvZmZzZXRpKGRhdGUsIDEpLCAhdGVzdChkYXRlKSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eQ0KICAgIH0pOw0KICB9Ow0KDQogIGlmIChjb3VudCkgew0KICAgIGludGVydmFsLmNvdW50ID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICAgICAgdDAuc2V0VGltZSgrc3RhcnQpLCB0MS5zZXRUaW1lKCtlbmQpOw0KICAgICAgZmxvb3JpKHQwKSwgZmxvb3JpKHQxKTsNCiAgICAgIHJldHVybiBNYXRoLmZsb29yKGNvdW50KHQwLCB0MSkpOw0KICAgIH07DQoNCiAgICBpbnRlcnZhbC5ldmVyeSA9IGZ1bmN0aW9uKHN0ZXApIHsNCiAgICAgIHN0ZXAgPSBNYXRoLmZsb29yKHN0ZXApOw0KICAgICAgcmV0dXJuICFpc0Zpbml0ZShzdGVwKSB8fCAhKHN0ZXAgPiAwKSA/IG51bGwNCiAgICAgICAgICA6ICEoc3RlcCA+IDEpID8gaW50ZXJ2YWwNCiAgICAgICAgICA6IGludGVydmFsLmZpbHRlcihmaWVsZA0KICAgICAgICAgICAgICA/IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGZpZWxkKGQpICUgc3RlcCA9PT0gMDsgfQ0KICAgICAgICAgICAgICA6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGludGVydmFsLmNvdW50KDAsIGQpICUgc3RlcCA9PT0gMDsgfSk7DQogICAgfTsNCiAgfQ0KDQogIHJldHVybiBpbnRlcnZhbDsNCn0NCg0KdmFyIG1pbGxpc2Vjb25kID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQogIC8vIG5vb3ANCn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiBlbmQgLSBzdGFydDsNCn0pOw0KDQovLyBBbiBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuDQptaWxsaXNlY29uZC5ldmVyeSA9IGZ1bmN0aW9uKGspIHsNCiAgayA9IE1hdGguZmxvb3Ioayk7DQogIGlmICghaXNGaW5pdGUoaykgfHwgIShrID4gMCkpIHJldHVybiBudWxsOw0KICBpZiAoIShrID4gMSkpIHJldHVybiBtaWxsaXNlY29uZDsNCiAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgICBkYXRlLnNldFRpbWUoTWF0aC5mbG9vcihkYXRlIC8gaykgKiBrKTsNCiAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICAgIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBrKTsNCiAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gazsNCiAgfSk7DQp9Ow0KDQp2YXIgbWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmQucmFuZ2U7DQoNCnZhciBkdXJhdGlvblNlY29uZCA9IDFlMzsNCnZhciBkdXJhdGlvbk1pbnV0ZSA9IDZlNDsNCnZhciBkdXJhdGlvbkhvdXIgPSAzNmU1Ow0KdmFyIGR1cmF0aW9uRGF5ID0gODY0ZTU7DQp2YXIgZHVyYXRpb25XZWVrID0gNjA0OGU1Ow0KDQp2YXIgc2Vjb25kID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICBkYXRlLnNldFRpbWUoTWF0aC5mbG9vcihkYXRlIC8gZHVyYXRpb25TZWNvbmQpICogZHVyYXRpb25TZWNvbmQpOw0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25TZWNvbmQpOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uU2Vjb25kOw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRVVENTZWNvbmRzKCk7DQp9KTsNCg0KdmFyIHNlY29uZHMgPSBzZWNvbmQucmFuZ2U7DQoNCnZhciBtaW51dGUgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBkdXJhdGlvbk1pbnV0ZSkgKiBkdXJhdGlvbk1pbnV0ZSk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbk1pbnV0ZSk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGU7DQp9LCBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiBkYXRlLmdldE1pbnV0ZXMoKTsNCn0pOw0KDQp2YXIgbWludXRlcyA9IG1pbnV0ZS5yYW5nZTsNCg0KdmFyIGhvdXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIHZhciBvZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiBkdXJhdGlvbk1pbnV0ZSAlIGR1cmF0aW9uSG91cjsNCiAgaWYgKG9mZnNldCA8IDApIG9mZnNldCArPSBkdXJhdGlvbkhvdXI7DQogIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKCgrZGF0ZSAtIG9mZnNldCkgLyBkdXJhdGlvbkhvdXIpICogZHVyYXRpb25Ib3VyICsgb2Zmc2V0KTsNCn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uSG91cik7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25Ib3VyOw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRIb3VycygpOw0KfSk7DQoNCnZhciBob3VycyA9IGhvdXIucmFuZ2U7DQoNCnZhciBkYXkgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIHN0ZXApOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbkRheTsNCn0sIGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpIC0gMTsNCn0pOw0KDQp2YXIgZGF5cyA9IGRheS5yYW5nZTsNCg0KZnVuY3Rpb24gd2Vla2RheShpKSB7DQogIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gKGRhdGUuZ2V0RGF5KCkgKyA3IC0gaSkgJSA3KTsNCiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOw0KICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgc3RlcCAqIDcpOw0KICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogICAgcmV0dXJuIChlbmQgLSBzdGFydCAtIChlbmQuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIHN0YXJ0LmdldFRpbWV6b25lT2Zmc2V0KCkpICogZHVyYXRpb25NaW51dGUpIC8gZHVyYXRpb25XZWVrOw0KICB9KTsNCn0NCg0KdmFyIHN1bmRheSA9IHdlZWtkYXkoMCk7DQp2YXIgbW9uZGF5ID0gd2Vla2RheSgxKTsNCnZhciB0dWVzZGF5ID0gd2Vla2RheSgyKTsNCnZhciB3ZWRuZXNkYXkgPSB3ZWVrZGF5KDMpOw0KdmFyIHRodXJzZGF5ID0gd2Vla2RheSg0KTsNCnZhciBmcmlkYXkgPSB3ZWVrZGF5KDUpOw0KdmFyIHNhdHVyZGF5ID0gd2Vla2RheSg2KTsNCg0KdmFyIHN1bmRheXMgPSBzdW5kYXkucmFuZ2U7DQp2YXIgbW9uZGF5cyA9IG1vbmRheS5yYW5nZTsNCnZhciB0dWVzZGF5cyA9IHR1ZXNkYXkucmFuZ2U7DQp2YXIgd2VkbmVzZGF5cyA9IHdlZG5lc2RheS5yYW5nZTsNCnZhciB0aHVyc2RheXMgPSB0aHVyc2RheS5yYW5nZTsNCnZhciBmcmlkYXlzID0gZnJpZGF5LnJhbmdlOw0KdmFyIHNhdHVyZGF5cyA9IHNhdHVyZGF5LnJhbmdlOw0KDQp2YXIgbW9udGggPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIGRhdGUuc2V0RGF0ZSgxKTsNCiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsNCn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBzdGVwKTsNCn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgcmV0dXJuIGVuZC5nZXRNb250aCgpIC0gc3RhcnQuZ2V0TW9udGgoKSArIChlbmQuZ2V0RnVsbFllYXIoKSAtIHN0YXJ0LmdldEZ1bGxZZWFyKCkpICogMTI7DQp9LCBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiBkYXRlLmdldE1vbnRoKCk7DQp9KTsNCg0KdmFyIG1vbnRocyA9IG1vbnRoLnJhbmdlOw0KDQp2YXIgeWVhciA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgZGF0ZS5zZXRNb250aCgwLCAxKTsNCiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsNCn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBzdGVwKTsNCn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgcmV0dXJuIGVuZC5nZXRGdWxsWWVhcigpIC0gc3RhcnQuZ2V0RnVsbFllYXIoKTsNCn0sIGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTsNCn0pOw0KDQovLyBBbiBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuDQp5ZWFyLmV2ZXJ5ID0gZnVuY3Rpb24oaykgew0KICByZXR1cm4gIWlzRmluaXRlKGsgPSBNYXRoLmZsb29yKGspKSB8fCAhKGsgPiAwKSA/IG51bGwgOiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogICAgZGF0ZS5zZXRGdWxsWWVhcihNYXRoLmZsb29yKGRhdGUuZ2V0RnVsbFllYXIoKSAvIGspICogayk7DQogICAgZGF0ZS5zZXRNb250aCgwLCAxKTsNCiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOw0KICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogICAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBzdGVwICogayk7DQogIH0pOw0KfTsNCg0KdmFyIHllYXJzID0geWVhci5yYW5nZTsNCg0KdmFyIHV0Y01pbnV0ZSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgZGF0ZS5zZXRVVENTZWNvbmRzKDAsIDApOw0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25NaW51dGUpOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uTWludXRlOw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRVVENNaW51dGVzKCk7DQp9KTsNCg0KdmFyIHV0Y01pbnV0ZXMgPSB1dGNNaW51dGUucmFuZ2U7DQoNCnZhciB1dGNIb3VyID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICBkYXRlLnNldFVUQ01pbnV0ZXMoMCwgMCwgMCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbkhvdXIpOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uSG91cjsNCn0sIGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIGRhdGUuZ2V0VVRDSG91cnMoKTsNCn0pOw0KDQp2YXIgdXRjSG91cnMgPSB1dGNIb3VyLnJhbmdlOw0KDQp2YXIgdXRjRGF5ID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApOw0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwKTsNCn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkRheTsNCn0sIGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIGRhdGUuZ2V0VVRDRGF0ZSgpIC0gMTsNCn0pOw0KDQp2YXIgdXRjRGF5cyA9IHV0Y0RheS5yYW5nZTsNCg0KZnVuY3Rpb24gdXRjV2Vla2RheShpKSB7DQogIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogICAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpIC0gKGRhdGUuZ2V0VVRDRGF5KCkgKyA3IC0gaSkgJSA3KTsNCiAgICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApOw0KICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogICAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpICsgc3RlcCAqIDcpOw0KICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbldlZWs7DQogIH0pOw0KfQ0KDQp2YXIgdXRjU3VuZGF5ID0gdXRjV2Vla2RheSgwKTsNCnZhciB1dGNNb25kYXkgPSB1dGNXZWVrZGF5KDEpOw0KdmFyIHV0Y1R1ZXNkYXkgPSB1dGNXZWVrZGF5KDIpOw0KdmFyIHV0Y1dlZG5lc2RheSA9IHV0Y1dlZWtkYXkoMyk7DQp2YXIgdXRjVGh1cnNkYXkgPSB1dGNXZWVrZGF5KDQpOw0KdmFyIHV0Y0ZyaWRheSA9IHV0Y1dlZWtkYXkoNSk7DQp2YXIgdXRjU2F0dXJkYXkgPSB1dGNXZWVrZGF5KDYpOw0KDQp2YXIgdXRjU3VuZGF5cyA9IHV0Y1N1bmRheS5yYW5nZTsNCnZhciB1dGNNb25kYXlzID0gdXRjTW9uZGF5LnJhbmdlOw0KdmFyIHV0Y1R1ZXNkYXlzID0gdXRjVHVlc2RheS5yYW5nZTsNCnZhciB1dGNXZWRuZXNkYXlzID0gdXRjV2VkbmVzZGF5LnJhbmdlOw0KdmFyIHV0Y1RodXJzZGF5cyA9IHV0Y1RodXJzZGF5LnJhbmdlOw0KdmFyIHV0Y0ZyaWRheXMgPSB1dGNGcmlkYXkucmFuZ2U7DQp2YXIgdXRjU2F0dXJkYXlzID0gdXRjU2F0dXJkYXkucmFuZ2U7DQoNCnZhciB1dGNNb250aCA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgZGF0ZS5zZXRVVENEYXRlKDEpOw0KICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApOw0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldFVUQ01vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSArIHN0ZXApOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gZW5kLmdldFVUQ01vbnRoKCkgLSBzdGFydC5nZXRVVENNb250aCgpICsgKGVuZC5nZXRVVENGdWxsWWVhcigpIC0gc3RhcnQuZ2V0VVRDRnVsbFllYXIoKSkgKiAxMjsNCn0sIGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIGRhdGUuZ2V0VVRDTW9udGgoKTsNCn0pOw0KDQp2YXIgdXRjTW9udGhzID0gdXRjTW9udGgucmFuZ2U7DQoNCnZhciB1dGNZZWFyID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICBkYXRlLnNldFVUQ01vbnRoKDAsIDEpOw0KICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApOw0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSArIHN0ZXApOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gZW5kLmdldFVUQ0Z1bGxZZWFyKCkgLSBzdGFydC5nZXRVVENGdWxsWWVhcigpOw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRVVENGdWxsWWVhcigpOw0KfSk7DQoNCi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4NCnV0Y1llYXIuZXZlcnkgPSBmdW5jdGlvbihrKSB7DQogIHJldHVybiAhaXNGaW5pdGUoayA9IE1hdGguZmxvb3IoaykpIHx8ICEoayA+IDApID8gbnVsbCA6IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRVVENGdWxsWWVhcigpIC8gaykgKiBrKTsNCiAgICBkYXRlLnNldFVUQ01vbnRoKDAsIDEpOw0KICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7DQogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSArIHN0ZXAgKiBrKTsNCiAgfSk7DQp9Ow0KDQp2YXIgdXRjWWVhcnMgPSB1dGNZZWFyLnJhbmdlOw0KDQpleHBvcnRzLnRpbWVJbnRlcnZhbCA9IG5ld0ludGVydmFsOw0KZXhwb3J0cy50aW1lTWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZDsNCmV4cG9ydHMudGltZU1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kczsNCmV4cG9ydHMudXRjTWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZDsNCmV4cG9ydHMudXRjTWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzOw0KZXhwb3J0cy50aW1lU2Vjb25kID0gc2Vjb25kOw0KZXhwb3J0cy50aW1lU2Vjb25kcyA9IHNlY29uZHM7DQpleHBvcnRzLnV0Y1NlY29uZCA9IHNlY29uZDsNCmV4cG9ydHMudXRjU2Vjb25kcyA9IHNlY29uZHM7DQpleHBvcnRzLnRpbWVNaW51dGUgPSBtaW51dGU7DQpleHBvcnRzLnRpbWVNaW51dGVzID0gbWludXRlczsNCmV4cG9ydHMudGltZUhvdXIgPSBob3VyOw0KZXhwb3J0cy50aW1lSG91cnMgPSBob3VyczsNCmV4cG9ydHMudGltZURheSA9IGRheTsNCmV4cG9ydHMudGltZURheXMgPSBkYXlzOw0KZXhwb3J0cy50aW1lV2VlayA9IHN1bmRheTsNCmV4cG9ydHMudGltZVdlZWtzID0gc3VuZGF5czsNCmV4cG9ydHMudGltZVN1bmRheSA9IHN1bmRheTsNCmV4cG9ydHMudGltZVN1bmRheXMgPSBzdW5kYXlzOw0KZXhwb3J0cy50aW1lTW9uZGF5ID0gbW9uZGF5Ow0KZXhwb3J0cy50aW1lTW9uZGF5cyA9IG1vbmRheXM7DQpleHBvcnRzLnRpbWVUdWVzZGF5ID0gdHVlc2RheTsNCmV4cG9ydHMudGltZVR1ZXNkYXlzID0gdHVlc2RheXM7DQpleHBvcnRzLnRpbWVXZWRuZXNkYXkgPSB3ZWRuZXNkYXk7DQpleHBvcnRzLnRpbWVXZWRuZXNkYXlzID0gd2VkbmVzZGF5czsNCmV4cG9ydHMudGltZVRodXJzZGF5ID0gdGh1cnNkYXk7DQpleHBvcnRzLnRpbWVUaHVyc2RheXMgPSB0aHVyc2RheXM7DQpleHBvcnRzLnRpbWVGcmlkYXkgPSBmcmlkYXk7DQpleHBvcnRzLnRpbWVGcmlkYXlzID0gZnJpZGF5czsNCmV4cG9ydHMudGltZVNhdHVyZGF5ID0gc2F0dXJkYXk7DQpleHBvcnRzLnRpbWVTYXR1cmRheXMgPSBzYXR1cmRheXM7DQpleHBvcnRzLnRpbWVNb250aCA9IG1vbnRoOw0KZXhwb3J0cy50aW1lTW9udGhzID0gbW9udGhzOw0KZXhwb3J0cy50aW1lWWVhciA9IHllYXI7DQpleHBvcnRzLnRpbWVZZWFycyA9IHllYXJzOw0KZXhwb3J0cy51dGNNaW51dGUgPSB1dGNNaW51dGU7DQpleHBvcnRzLnV0Y01pbnV0ZXMgPSB1dGNNaW51dGVzOw0KZXhwb3J0cy51dGNIb3VyID0gdXRjSG91cjsNCmV4cG9ydHMudXRjSG91cnMgPSB1dGNIb3VyczsNCmV4cG9ydHMudXRjRGF5ID0gdXRjRGF5Ow0KZXhwb3J0cy51dGNEYXlzID0gdXRjRGF5czsNCmV4cG9ydHMudXRjV2VlayA9IHV0Y1N1bmRheTsNCmV4cG9ydHMudXRjV2Vla3MgPSB1dGNTdW5kYXlzOw0KZXhwb3J0cy51dGNTdW5kYXkgPSB1dGNTdW5kYXk7DQpleHBvcnRzLnV0Y1N1bmRheXMgPSB1dGNTdW5kYXlzOw0KZXhwb3J0cy51dGNNb25kYXkgPSB1dGNNb25kYXk7DQpleHBvcnRzLnV0Y01vbmRheXMgPSB1dGNNb25kYXlzOw0KZXhwb3J0cy51dGNUdWVzZGF5ID0gdXRjVHVlc2RheTsNCmV4cG9ydHMudXRjVHVlc2RheXMgPSB1dGNUdWVzZGF5czsNCmV4cG9ydHMudXRjV2VkbmVzZGF5ID0gdXRjV2VkbmVzZGF5Ow0KZXhwb3J0cy51dGNXZWRuZXNkYXlzID0gdXRjV2VkbmVzZGF5czsNCmV4cG9ydHMudXRjVGh1cnNkYXkgPSB1dGNUaHVyc2RheTsNCmV4cG9ydHMudXRjVGh1cnNkYXlzID0gdXRjVGh1cnNkYXlzOw0KZXhwb3J0cy51dGNGcmlkYXkgPSB1dGNGcmlkYXk7DQpleHBvcnRzLnV0Y0ZyaWRheXMgPSB1dGNGcmlkYXlzOw0KZXhwb3J0cy51dGNTYXR1cmRheSA9IHV0Y1NhdHVyZGF5Ow0KZXhwb3J0cy51dGNTYXR1cmRheXMgPSB1dGNTYXR1cmRheXM7DQpleHBvcnRzLnV0Y01vbnRoID0gdXRjTW9udGg7DQpleHBvcnRzLnV0Y01vbnRocyA9IHV0Y01vbnRoczsNCmV4cG9ydHMudXRjWWVhciA9IHV0Y1llYXI7DQpleHBvcnRzLnV0Y1llYXJzID0gdXRjWWVhcnM7DQoNCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7DQoNCn0pKSk7DQoNCn0se31dfSx7fSxbMV0pOw0K"></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget-7542ac142954069e6c20" class="tabwid html-widget" style="width:960px;height:500px;">
</div>
<script type="application/json" data-for="htmlwidget-7542ac142954069e6c20">{"x":{"html":"<table><col width=\"23\"><col width=\"19\"><thead><tr><th class=\"cc9ba6f653828bbf0c8e7835948f227e6\" style=\"height:7pt;\"><p style=\"margin:0pt;text-align:right;border-bottom: 0pt solid rgba(0,0,0,1.00);border-top: 0pt solid rgba(0,0,0,1.00);border-left: 0pt solid rgba(0,0,0,1.00);border-right: 0pt solid rgba(0,0,0,1.00);padding-top:2pt;padding-bottom:2pt;padding-left:2pt;padding-right:2pt;background-color:transparent;\"><span style=\"font-family:'Arial';color:rgba(0,0,0,1.00);font-size:10px;font-style:normal;font-weight:normal;text-decoration:none;background-color:transparent;\">stock<\/span><\/p><\/th><th class=\"cc9ba6f653828bbf0c8e7835948f227e6\" style=\"height:7pt;\"><p style=\"margin:0pt;text-align:right;border-bottom: 0pt solid rgba(0,0,0,1.00);border-top: 0pt solid rgba(0,0,0,1.00);border-left: 0pt solid rgba(0,0,0,1.00);border-right: 0pt solid rgba(0,0,0,1.00);padding-top:2pt;padding-bottom:2pt;padding-left:2pt;padding-right:2pt;background-color:transparent;\"><span style=\"font-family:'Arial';color:rgba(0,0,0,1.00);font-size:10px;font-style:normal;font-weight:normal;text-decoration:none;background-color:transparent;\">croc<\/span><\/p><\/th><\/tr><\/thead><tbody><tr><td class=\"cc9ba6f653828bbf0c8e7835948f227e6\" style=\"height:7pt;\"><p style=\"margin:0pt;text-align:right;border-bottom: 0pt solid rgba(0,0,0,1.00);border-top: 0pt solid rgba(0,0,0,1.00);border-left: 0pt solid rgba(0,0,0,1.00);border-right: 0pt solid rgba(0,0,0,1.00);padding-top:2pt;padding-bottom:2pt;padding-left:2pt;padding-right:2pt;background-color:transparent;\"><span style=\"font-family:'Arial';color:rgba(0,0,0,1.00);font-size:10px;font-style:normal;font-weight:normal;text-decoration:none;background-color:transparent;\">Amazon<\/span><\/p><\/td><td class=\"cc9ba6f653828bbf0c8e7835948f227e6\" style=\"height:7pt;\"><p style=\"margin:0pt;text-align:right;border-bottom: 0pt solid rgba(0,0,0,1.00);border-top: 0pt solid rgba(0,0,0,1.00);border-left: 0pt solid rgba(0,0,0,1.00);border-right: 0pt solid rgba(0,0,0,1.00);padding-top:2pt;padding-bottom:2pt;padding-left:2pt;padding-right:2pt;background-color:transparent;\"><span style=\"font-family:'Arial';color:rgba(0,0,0,1.00);font-size:10px;font-style:normal;font-weight:normal;text-decoration:none;background-color:transparent;\"><div id=\"htmlwidget-11442af3c9185fd67bd4\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-11442af3c9185fd67bd4\">{\"x\":{\"data\":[[0,-0.00502364566199853,-0.00681324050319854,-0.045605093417559,-0.0470023116061841,-0.0302202551095033,-0.0299847333550721,-0.0866261524769016,-0.0690591542890651,-0.104883904062606,-0.0981334259271485,-0.102387747097878,-0.0972856261053647,-0.0637529406074341,-0.0635174204228861,-0.0561076163849922,-0.0842085666055759,-0.00257463072535891,-0.0784784545829362,-0.0976153361530847,-0.133267422302822,-0.166282021166455,-0.158134321702606,-0.211714449390327,-0.233739911674279,-0.243206306899736,-0.23000358137496,-0.209061343334453,-0.203943554905784,-0.181933807154489,-0.161525323184435,-0.175811224286272,-0.160269341124183,-0.121650247596513,-0.131948679444711,-0.13022184540137,-0.128479202632368,-0.128353681036652,-0.132608002207382,-0.090974760843573,-0.0891379282113994,-0.0934080612475559,-0.0970972479489043,-0.116469651273484,-0.120457120527122,-0.1216973896246,-0.122545092113614,-0.10577875014959,-0.0998759729332639,-0.0941458593407409,-0.0984630386420986,-0.121744437459684,-0.133298755605249,-0.130316035264542,-0.120111793279515,-0.105747321084276,-0.0848364634426987,-0.0896717309482368,-0.0677090781285276,-0.0601265147039437,-0.0680544053761348,-0.0604247956863498,-0.068760873306659,-0.0798285307434738,-0.0548045864896559,-0.0715238821884785,-0.0665473785545674,-0.0644594069680751,-0.053093466978971,-0.0348042878978365,-0.0254948904299109,-0.0174256662965773,-0.00257463072535891,-0.0142701865691799,-0.00627953352924748,-0.00940358576121425,-0.0258873612754889,-0.0169390071577106,-0.0315703312700409,-0.0477558258019094,-0.0549302038482583,0.0354794225259332,0.0735647133167665,0.0538941232027839,0.0532347988702302,0.0346944808347771,0.0580229243476809,0.067128229126489,0.103737920591185,0.119687893368623,0.127066365673972,0.11449158408282,0.115653282086897,0.0914928506176369,0.0949151838320097,0.0965949716101504,0.103314022250177,0.0938162466257908,0.105511896662615,0.112026856183407,0.122325286461723,0.118133724518968,0.134695975363757,0.129436903710214,0.143251858635957,0.139013154665115,0.140881319029833,0.136187383415554,0.140740084471343,0.142325680816429,0.127034936608658,0.122843374665903,0.129217098058323,0.121304920348905,0.126407041341419,0.108949945979528,0.120912449503327,0.123753933715662,0.115559093793609,0.133581419387768,0.0972857234381344,0.0853545516468792,0.111398959346284,0.123408510705168,0.123439938200599,0.139232961886889,0.143032052984067,0.157961658078803,0.156329013898633,0.170834722222244,0.183346741445654,0.174602480016994,0.165842504055676,0.163597581808154,0.154555037827204,0.155544072207477,0.161635227580264,0.170693390330985,0.168668275305237,0.169343312600564,0.161101424843427,0.154790559581635,0.156485964559663,0.181509908813481,0.191243206192298,0.205262252237276,0.194021929606774,0.184696819176075,0.194320212159064,0.202499241785573,0.203409802405215,0.206157098324261,0.206549569169839,0.210756844075368,0.212829102699086,0.20643966477401,0.199453664884122,0.200379938466537,0.200113084979561,0.18888838111883,0.192294999800546,0.196957603682281,0.188794191255659,0.191886815992195,0.207240320997823,0.210835319405883,0.205011113282958,0.207491459952142,0.209783524227751,0.212640722972743,0.238433895954943,0.231542084358343,0.230882761595673,0.19333117777879,0.211149314920946,0.194696968471985,0.194822585830587,0.208323543671385,0.222185642195099,0.216816571952724,0.224854367020744,0.239799686648137,0.263285176584957,0.264933535297784,0.254587961421497,0.281197503590284,0.300993711062869,0.30151179926705,0.314479051703779,0.313584205616795,0.309329882876181,0.325546709140594,0.321308005169752,0.317807196624864,0.321386576263153,0.304573090701158,0.309424072739353,0.3018729368102,0.291951262844805,0.27623671448903,0.283615185224496,0.283677946022354,0.272107913344133,0.285718775580759,0.315703606268601,0.311135192250038,0.291370413842767,0.284729741200486,0.218731878345529,0.23992530400674,0.233002064914709,0.201839919022903,0.204147696261286,0.185340428975972,0.232248552288867,0.23667563441617,0.211761592988298,0.165450033210098,0.160159534061124,0.128856054708175,0.166800109370635,0.171902230363149,0.187459828057895,0.193362509511335,0.224509038203253,0.232876543318993,0.224697416359714,0.225089887205292,0.203739512452935,0.19706750807811,0.178307381250999,0.167443814933418,0.162247505647616,0.192106621644086,0.20052117459491,0.209469528712688,0.204618642437379,0.206706518260986,0.193299748713477,0.215623540646219,0.206957752978191,0.194681253939328,0.189610562012128,0.202530670850887,0.210725416579937,0.209752096732321,0.203064473587725,0.194037644139431,0.211008078792573,0.212154063833876,0.201196307653123,0.17720844404478,0.183173982058964,0.188684288429713,0.225215504563894,0.249611457787586,0.251071438343953,0.249470221659213,0.254368251532493,0.277319938732475,0.282814530570566,0.271165926798944,0.267649402151516,0.270098417088156,0.268983861112166,0.283976228574644,0.291134892088336,0.313238878369188,0.317367677944201,0.312061465832454,0.303599770853542,0.292767536268505,0.306692395590078,0.31862356581145,0.271919535187672,0.267900638438604,0.275530248128389,0.286849141852292,0.289439391347421,0.299015738065209,0.313254591331961,0.31303478568007,0.322940745112808,0.325201381892987,0.32666136087947,0.344510927086939,0.343207897191603,0.337838922712114,0.326928214366446,0.33226585711339,0.326614218851383,0.339236142470622,0.332689659691513,0.334212496808623,0.329078946750796,0.32815277050115,0.33518581665624,0.339110525112019,0.338262822623005,0.341606682076746,0.338372725448951,0.339063383083932,0.339769849444573,0.338027302438457,0.345342916613179,0.323725686803964,0.331355298063632,0.330287788352844,0.327509063368484,0.329408656798516,0.343820175258955,0.372580449812092,0.37575164564203,0.391764379217325,0.399566749863683,0.423617374269885,0.427463607395149,0.410194890189719,0.404857249012657,0.423946988554718,0.416599945314682,0.406976552331693,0.388828705141819,0.416019096312644,0.418829248792434]],\"options\":{\"height\":80,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"offset\",\"extent\":[-0.243206306899736,0.427463607395149]}},\"evals\":[],\"jsHooks\":[]}<\/script><\/span><\/p><\/td><\/tr><tr><td class=\"cc9ba6f653828bbf0c8e7835948f227e6\" style=\"height:7pt;\"><p style=\"margin:0pt;text-align:right;border-bottom: 0pt solid rgba(0,0,0,1.00);border-top: 0pt solid rgba(0,0,0,1.00);border-left: 0pt solid rgba(0,0,0,1.00);border-right: 0pt solid rgba(0,0,0,1.00);padding-top:2pt;padding-bottom:2pt;padding-left:2pt;padding-right:2pt;background-color:transparent;\"><span style=\"font-family:'Arial';color:rgba(0,0,0,1.00);font-size:10px;font-style:normal;font-weight:normal;text-decoration:none;background-color:transparent;\">Apple<\/span><\/p><\/td><td class=\"cc9ba6f653828bbf0c8e7835948f227e6\" style=\"height:7pt;\"><p style=\"margin:0pt;text-align:right;border-bottom: 0pt solid rgba(0,0,0,1.00);border-top: 0pt solid rgba(0,0,0,1.00);border-left: 0pt solid rgba(0,0,0,1.00);border-right: 0pt solid rgba(0,0,0,1.00);padding-top:2pt;padding-bottom:2pt;padding-left:2pt;padding-right:2pt;background-color:transparent;\"><span style=\"font-family:'Arial';color:rgba(0,0,0,1.00);font-size:10px;font-style:normal;font-weight:normal;text-decoration:none;background-color:transparent;\"><div id=\"htmlwidget-0eb7977ec8072f88605d\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-0eb7977ec8072f88605d\">{\"x\":{\"data\":[[0,-0.0250593148378883,-0.0441385990199623,-0.0844803194568037,-0.0796392861069918,-0.0647365917553864,-0.0511627844424672,-0.0755576557610123,-0.0553393645275045,-0.0780256375600157,-0.0824869011898909,-0.0812529443993995,-0.0859040880165273,-0.0373042253666896,-0.0560986798224535,-0.0508780326796089,-0.113241572884187,-0.106881840726456,-0.0760322875111233,-0.0846701312260358,-0.10317982417351,-0.0854295147390052,-0.078080942883751,-0.102703642899791,-0.0932553496108742,-0.0934462626138652,-0.100317717633977,-0.105757617494601,-0.102989944186257,-0.0776991850957892,-0.0635745075221722,-0.0813257525181001,-0.0834253764974477,-0.0754087260769025,-0.0963093242056842,-0.0828527739245154,-0.0765539214773358,-0.0751223468269845,-0.0772219708063321,-0.0405742951594743,-0.0384746711801268,-0.0313169148735487,-0.0169059457588969,-0.0277857259892815,-0.0358024543732784,-0.0349434822958595,-0.0344663459698543,-0.024063702065475,-0.0215823982616178,-0.00192237407131279,0.0113433314248854,0.00972092173499517,0.0108661171354283,0.0107707288519532,0.0185010877314635,0.0128702748678486,0.00848019186961446,0.0038992738318413,0.0276630017704622,0.0456050915513608,0.0401651916907371,0.049708873263129,0.0604932749554699,0.0479910070717431,0.0589662535490547,0.0358705749394299,0.0370158385578836,0.0404514929772033,0.0540035679778881,0.0692734409519384,0.0698460337794391,0.0483727648597048,0.0257543005395373,0.0203144104243451,0.0224139564402406,0.0113433314248854,0.00857564837111013,0.00284946671488306,-0.00411745455215584,-0.066437647077443,-0.09497321580226,-0.105375859706639,-0.106330210322102,-0.0916329399209839,-0.10108116499188,-0.104729844798254,-0.109722741207055,-0.109050618287694,-0.103001521758873,-0.111739109965139,-0.132575027665087,-0.130846704625707,-0.0985847167874794,-0.102329408584944,-0.0920555018306159,-0.0955121479093763,-0.0857182913650713,-0.0741001387720209,-0.0599855087382752,-0.043470432745788,-0.0358850176689059,-0.0364611675789024,-0.0411660280144318,-0.0546085351288161,-0.0617138317776555,-0.0597935042469567,-0.0529762533168211,-0.0491355202919717,-0.0499996477026514,-0.0431823870270843,-0.0510558478226704,-0.0653625603111865,-0.0642103189637824,-0.0672828878418852,-0.0633461135896505,-0.0846620912450523,-0.0868705327124754,-0.0790930351808226,-0.082549681259583,-0.077268748877509,-0.103193526250192,-0.116251956163919,-0.101369239946878,-0.0935917424152257,-0.0820696407949921,-0.0792851078901616,-0.0879267328324942,-0.0827417637143535,-0.0788049894621188,-0.0716996928132794,-0.068819128426495,-0.06459439616444,-0.0698753285465139,-0.0514399250233278,-0.0515359662507131,-0.0414540639877041,-0.0410699867870465,-0.0402058593763667,-0.0452947970125537,-0.0526881296346654,-0.0653625603111865,-0.0717957340406646,-0.0114965490988531,0.00184991678814583,0.000601712176808489,0.0182690295166998,0.0031942308448889,0.015772542330573,0.0220475184705895,0.037590136835896,0.0461820113504456,0.0504296356310829,0.0426100768170967,0.0419343188517878,0.0443477652161439,0.0568977369870398,0.0559322960705357,0.0543877231419976,0.0530361974659481,0.0557392488180473,0.0475335370264953,0.0508157886086489,0.0428996818048399,0.0384589420536936,0.0323770813841862,0.0312185932151936,0.0233024864113844,0.0242678493644366,0.030349787997396,0.0400035832002521,0.0397139099944888,0.0460854536151911,0.0186686311897291,-0.0044039410018204,0.0178963837071862,0.0421273563588447,0.0790048585166538,0.115689323167406,0.109414337281958,0.0964782807515165,0.096381723016262,0.0961886855092051,0.10651823867737,0.0880794534894556,0.089720584153248,0.0917478677946069,0.100050147066845,0.0829629557730001,0.0913617830350613,0.0862452073551538,0.0908790625768092,0.0913617830350613,0.0994709370913589,0.101112067755152,0.120323178389061,0.122736624753417,0.132776504715819,0.129301205881177,0.135576123548604,0.134803876066061,0.134031550620066,0.130652731557226,0.13007345336372,0.125632723358005,0.135769239019113,0.141561504446309,0.115882360674463,0.105166713001321,0.0978298064275662,0.0960921277739506,0.0763018071645547,0.0772671798630382,0.0657202371379235,0.0561138632047229,0.0713482043355418,0.0776553306540608,0.0759087251851955,0.0459253751574509,0.0521355149417297,0.0257423623859556,0.0393270845821494,0.0672727428476987,0.0668846018021076,0.06795197018662,0.0841566444405535,0.0848358717794746,0.0793049593341173,0.0847388170272141,0.0826040705127578,0.0815366923828138,0.0724155142474652,0.0624210577412625,0.0663994742222762,0.058733805517031,0.0668846018021076,0.0773642443607305,0.0879409514170457,0.105698043671871,0.0993909173533516,0.117730269903721,0.117730269903721,0.123843354935739,0.125298874111274,0.131800109934314,0.134808125074193,0.135875503204137,0.128403953748845,0.13063567705211,0.137816218177524,0.132964542816519,0.132673456523189,0.123843354935739,0.127045479580139,0.125784001691105,0.131509023640984,0.144123422459495,0.154602996800097,0.155767429682302,0.161977569466581,0.157125894105576,0.155088192597949,0.164403412019799,0.164306357267538,0.162268665505342,0.164403412019799,0.165179703856412,0.164112325726468,0.182645709817907,0.18322796036802,0.183324937156829,0.180219867264689,0.177502938418141,0.249307823418979,0.247173076904523,0.252509957808811,0.264250941820427,0.276283158306845,0.28123182020209,0.290490019104262,0.287566360419405,0.298968495777933,0.315828199464385,0.320603373188153,0.319044211348666,0.322649972274735,0.33220045615831,0.33619612205307,0.330543752294988,0.331810707116522,0.334441866420481,0.335026709255372,0.36231380049677,0.35422522879179,0.362216404654406,0.357928385560222,0.35968264119281,0.354614977833577,0.351496371537091,0.355979328497475,0.356564034896324,0.354517572245783,0.368843376034598,0.371084776551338,0.364263003740988,0.378588807529804,0.362801101307824,0.378198902561112,0.373326186813509,0.370597475740283,0.372936437771722,0.401393078246859,0.404511538361872,0.402659886886921,0.400028727582961,0.400418476624749,0.41084615654264,0.403537082921235,0.400028727582961,0.396910111541044,0.395253407677722,0.380245511393126,0.381902215256448,0.374593141635043,0.382194568455872,0.376054897886735]],\"options\":{\"height\":80,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"offset\",\"extent\":[-0.243206306899736,0.427463607395149]}},\"evals\":[],\"jsHooks\":[]}<\/script><\/span><\/p><\/td><\/tr><tr><td class=\"cc9ba6f653828bbf0c8e7835948f227e6\" style=\"height:7pt;\"><p style=\"margin:0pt;text-align:right;border-bottom: 0pt solid rgba(0,0,0,1.00);border-top: 0pt solid rgba(0,0,0,1.00);border-left: 0pt solid rgba(0,0,0,1.00);border-right: 0pt solid rgba(0,0,0,1.00);padding-top:2pt;padding-bottom:2pt;padding-left:2pt;padding-right:2pt;background-color:transparent;\"><span style=\"font-family:'Arial';color:rgba(0,0,0,1.00);font-size:10px;font-style:normal;font-weight:normal;text-decoration:none;background-color:transparent;\">Microsoft<\/span><\/p><\/td><td class=\"cc9ba6f653828bbf0c8e7835948f227e6\" style=\"height:7pt;\"><p style=\"margin:0pt;text-align:right;border-bottom: 0pt solid rgba(0,0,0,1.00);border-top: 0pt solid rgba(0,0,0,1.00);border-left: 0pt solid rgba(0,0,0,1.00);border-right: 0pt solid rgba(0,0,0,1.00);padding-top:2pt;padding-bottom:2pt;padding-left:2pt;padding-right:2pt;background-color:transparent;\"><span style=\"font-family:'Arial';color:rgba(0,0,0,1.00);font-size:10px;font-style:normal;font-weight:normal;text-decoration:none;background-color:transparent;\"><div id=\"htmlwidget-da714352ed23d282af2f\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-da714352ed23d282af2f\">{\"x\":{\"data\":[[0,0.00456204572318297,-0.0136861183069737,-0.0479927089358353,-0.0450729332767354,-0.0456204383692534,-0.0368613188802752,-0.0576642300244202,-0.0308393853275426,-0.0695254885444566,-0.0773722252964026,-0.0731751515306074,-0.0788321131259526,-0.0458028771915105,-0.0549269686378762,-0.0479927089358353,-0.065328433641236,-0.0499999509573058,0.00529198963795774,-0.00164232665180686,-0.0328467027993117,-0.048175166620667,-0.0510948668294683,-0.0846715135435548,-0.0983576507131033,-0.100729921279685,-0.0928832033903139,-0.0932481753477014,-0.0784671411685651,-0.0610069046077346,-0.0365626111477212,-0.0407898084452726,-0.0475900872793965,-0.0323353195372965,-0.059352769984181,-0.056044500737074,-0.0424439430688262,-0.0571472823028759,-0.0648665080500187,-0.0336218603055827,-0.0268215814714589,-0.0378491519160076,-0.0437304838371125,-0.0621096673109619,-0.0507145218737206,-0.0288433099502797,-0.0433628899818451,-0.0246160937901537,-0.0227781999641158,-0.0150589176292489,-0.00109074724315927,0.00460682547546143,-0.0168967925927122,-0.0100965137585882,-0.00623691031630424,-0.00807480414234207,-0.0036638287797317,-0.0159778456796932,0.00552577238848029,0.0117746981648525,0.0150829674119597,0.021331893188332,0.0187588116517596,0.00276893164942349,0.0130612389331388,0.000930962373087096,0.000195793525127108,-0.0018258595033952,0.00442306627297717,0.0172884362306902,0.0174722708834731,0.0228022497468265,0.0376893670459353,0.036402826277649,0.0216994870435994,0.0251914966306162,-0.0483252749899311,-0.0422601084160432,-0.0545742007663035,-0.0637638019345155,-0.0828781165311755,-0.0834295450392258,-0.0698289119206794,-0.0850836608002047,-0.0834295450392258,-0.0821430042709396,-0.0738723500157464,-0.0797536819368514,-0.0622934453760209,-0.0617420734556946,-0.0532876788605917,-0.061190663810219,-0.0474062714891882,-0.0651737605289006,-0.0596213730475538,-0.0686901971501215,-0.0631378851190734,-0.0740574673236074,-0.0451853542217988,-0.0353762683761089,-0.0396330421907507,-0.031674714447027,-0.0190894348606636,-0.021865628601337,-0.0287134788487914,-0.0414837814301423,-0.0351911510682479,-0.0357464275415319,-0.0368568484500773,-0.0446301531988135,-0.0472212107690513,-0.0720215919137802,-0.0777589646649652,-0.0803500976855017,-0.0673946589337152,-0.0722066526339171,-0.0733171301301865,-0.0525884809425372,-0.056289978283895,-0.0392628830253275,-0.0777589646649652,-0.103669823305963,-0.0849770306655667,-0.0646184651930418,-0.0529586401079603,-0.0531436819655225,-0.0529586401079603,-0.0490719688710175,-0.0490719688710175,-0.0320448736124501,-0.0266776034389642,-0.0152028202114448,-0.0096505081803967,-0.0053936777780309,-0.0061339961088771,-0.00132202127125003,-0.0174237374788342,0.034768101243436,0.0327322446961835,0.0469832216643762,0.0499444572626118,0.0504996582855972,0.0399502541090611,0.0403204132744841,0.0490190782116287,0.0471683389722373,0.0471683389722373,0.0543863483851146,0.0621595588209776,0.0727089629975137,0.0745597965497786,0.0771508541200165,0.0738194593563577,0.0790016122219828,0.0723388038320905,0.0756702174583239,0.069710813340639,0.0719456323255638,0.0726904965369068,0.0730629757990149,0.0739941079352739,0.0780912100552915,0.0792086289790412,0.0833056556487601,0.0806984328520259,0.082002044250393,0.0780912100552915,0.0700832737401724,0.0725043040622892,0.0739941079352739,0.0728767644618229,0.0738079154606566,0.069524602003447,0.0468044044564568,0.062447797824587,0.0527637897115671,0.0477355365927159,0.0650550206213212,0.0661724395450711,0.0602130542899606,0.0579783107553344,0.0756701985957493,0.0767875986569244,0.069524602003447,0.0596543825532352,0.0792086289790412,0.0806984328520259,0.0689659302667214,0.0726904965369068,0.069338334078531,0.0659862470704535,0.0734354361985485,0.0752977947839397,0.076415138257391,0.080884700776942,0.0650550206213212,0.0635652167483365,0.0600267863650445,0.069338334078531,0.0656137678083453,0.0738079154606566,0.0713868851385397,0.0661724395450711,0.111054106314602,0.136009066258792,0.135822854921601,0.129118530004849,0.119248253966913,0.114964940509703,0.115896072645962,0.113661329111336,0.106770811719967,0.102673690737374,0.093362143023888,0.125207639222023,0.126138846808581,0.12055186536528,0.0931759505492706,0.0991353358043809,0.0823745235125011,0.103748272754037,0.11837246462475,0.136933860569961,0.13149664796958,0.141058634087027,0.145933326985448,0.132434155656079,0.13487146438014,0.1363714163183,0.145370882733788,0.129809239764299,0.109935442460923,0.110872874697124,0.129059339245518,0.123997133492252,0.150620544754175,0.143870930795628,0.161869939076902,0.165619668021704,0.180806304144078,0.175181654139151,0.17330678966675,0.168057033333489,0.192805598985586,0.191305722497725,0.191305722497725,0.191493178764846,0.185681053630223,0.186430954149004,0.180993835861497,0.179306427656217,0.165057223770043,0.17330678966675,0.168057033333489,0.168057033333489,0.178181463702597,0.174431678170071,0.174056690185531,0.184743564806299,0.17386923391841,0.175556623261116,0.17236928198025,0.17180683772859,0.168057033333489,0.176306599230196,0.180431316159538,0.190930734513185,0.193930562939206,0.204992350094215,0.233303226149142,0.221116418452789,0.2121170274876,0.192055698466805,0.184368576821759,0.193930562939206,0.193180586970126,0.189243326307905,0.187555918102624,0.201055089431994,0.199930200928673,0.213429428845766,0.217956446767777,0.217201924918201,0.217013261446301,0.218899632089254,0.216447403068624,0.213995324948592,0.218899632089254,0.218899632089254,0.211543227965985,0.2068275277095,0.224935637122694,0.2073934426749,0.211920422871762,0.212297617777539,0.214749846798169,0.225878690406147,0.220974515303509,0.224746973650794,0.220597188359709,0.214938510270068,0.221351710209286,0.219276808132456,0.223615275758015,0.224746973650794,0.211165901022186,0.226633212255724,0.223615275758015,0.22569015897227,0.227953573620403,0.231537519396386,0.234932782837894,0.239459763034756,0.242289186961162,0.236441826537047,0.239837089978556,0.236630357970924,0.239837089978556,0.238893904657079,0.236064499593247,0.235121446309794,0.230405802641032,0.225124168556571,0.235121446309794,0.233423739138741]],\"options\":{\"height\":80,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"offset\",\"extent\":[-0.243206306899736,0.427463607395149]}},\"evals\":[],\"jsHooks\":[]}<\/script><\/span><\/p><\/td><\/tr><\/tbody><\/table>","css":".cb491487a861225173a309c5a74dc9f45{border-bottom: 0pt solid rgba(0,0,0,1.00);border-top: 0pt solid rgba(0,0,0,1.00);border-left: 0pt solid rgba(0,0,0,1.00);border-right: 0pt solid rgba(0,0,0,1.00);background-color:transparent;margin-top:0pt;margin-bottom:0pt;margin-left:0pt;margin-right:0pt;vertical-align:middle;}.cc9ba6f653828bbf0c8e7835948f227e6{border-bottom: 1pt solid rgba(0,0,0,1.00);border-top: 1pt solid rgba(0,0,0,1.00);border-left: 1pt solid rgba(0,0,0,1.00);border-right: 1pt solid rgba(0,0,0,1.00);background-color:transparent;margin-top:0pt;margin-bottom:0pt;margin-left:0pt;margin-right:0pt;vertical-align:middle;}.cb491487a861225173a309c5a74dc9f45{border-bottom: 0pt solid rgba(0,0,0,1.00);border-top: 0pt solid rgba(0,0,0,1.00);border-left: 0pt solid rgba(0,0,0,1.00);border-right: 0pt solid rgba(0,0,0,1.00);background-color:transparent;margin-top:0pt;margin-bottom:0pt;margin-left:0pt;margin-right:0pt;vertical-align:middle;}.cc9ba6f653828bbf0c8e7835948f227e6{border-bottom: 1pt solid rgba(0,0,0,1.00);border-top: 1pt solid rgba(0,0,0,1.00);border-left: 1pt solid rgba(0,0,0,1.00);border-right: 1pt solid rgba(0,0,0,1.00);background-color:transparent;margin-top:0pt;margin-bottom:0pt;margin-left:0pt;margin-right:0pt;vertical-align:middle;}"},"evals":[],"jsHooks":[]}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment