Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active January 22, 2020 00:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save timelyportfolio/1c938792957f70cf6069e48f33bdc1b5 to your computer and use it in GitHub Desktop.
Save timelyportfolio/1c938792957f70cf6069e48f33bdc1b5 to your computer and use it in GitHub Desktop.
R d3horizon in DT datatable
license: mit

see d3horizonR

code

library(dplyr)
library(tibble)
library(htmltools)
library(DT)
library(d3horizonR)
library(treemap) # for helpful random hierarchical data function


hier <- tbl_df(treemap::random.hierarchical.data(depth=3))

# see it in DT
datatable(hier)

# with dplyr make some random data for a horizon chart
#   we can replace x with this new data
hier <- hier %>%
  mutate(x = lapply(x, function(x) {cumprod(1 + runif(365, -0.05, 0.05))})) %>%
  # tranform our new x into a d3horizon chart
  mutate(x = lapply(x, function(dat) {
    d3horizon_chr(
      list(dat),
      options = d3horizonOptions(height=20),
      width = 200
    )
  }))

datatable(
  hier,
  escape = FALSE,
  options = list(
    columnDefs = list(list(width="200px", targets = 4)),
    fnDrawCallback = htmlwidgets::JS(
'
// not the best way but works fairly well
function(){
  HTMLWidgets.staticRender();
}
'
    )
  )
) %>%
  tagList(htmlwidgets::getDependency("d3horizon", "d3horizonR")) %>%
  browsable()

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgew0KICAvLyBJZiB3aW5kb3cuSFRNTFdpZGdldHMgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGVuIHVzZSBpdDsgb3RoZXJ3aXNlIGNyZWF0ZSBhDQogIC8vIG5ldyBvYmplY3QuIFRoaXMgYWxsb3dzIHByZWNlZGluZyBjb2RlIHRvIHNldCBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZQ0KICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLg0KICB3aW5kb3cuSFRNTFdpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHMgfHwge307DQoNCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLg0KICB2YXIgdmlld2VyTW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy52aWV3ZXJNb2RlID0NCiAgICAgIC9cYnZpZXdlcl9wYW5lPTFcYi8udGVzdCh3aW5kb3cubG9jYXRpb24pOw0KDQogIC8vIFNlZSBpZiB3ZSdyZSBydW5uaW5nIGluIFNoaW55IG1vZGUuIElmIG5vdCwgaXQncyBhIHN0YXRpYyBkb2N1bWVudC4NCiAgLy8gTm90ZSB0aGF0IHN0YXRpYyB3aWRnZXRzIGNhbiBhcHBlYXIgaW4gYm90aCBTaGlueSBhbmQgc3RhdGljIG1vZGVzLCBidXQNCiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4NCiAgdmFyIHNoaW55TW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy5zaGlueU1vZGUgPQ0KICAgICAgdHlwZW9mKHdpbmRvdy5TaGlueSkgIT09ICJ1bmRlZmluZWQiICYmICEhd2luZG93LlNoaW55Lm91dHB1dEJpbmRpbmdzOw0KDQogIC8vIFdlIGNhbid0IGNvdW50IG9uIGpRdWVyeSBiZWluZyBhdmFpbGFibGUsIHNvIHdlIGltcGxlbWVudCBvdXIgb3duDQogIC8vIHZlcnNpb24gaWYgbmVjZXNzYXJ5Lg0KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3Rvcikgew0KICAgIGlmICh0eXBlb2YoalF1ZXJ5KSAhPT0gInVuZGVmaW5lZCIgJiYgc2NvcGUgaW5zdGFuY2VvZiBqUXVlcnkpIHsNCiAgICAgIHJldHVybiBzY29wZS5maW5kKHNlbGVjdG9yKTsNCiAgICB9DQogICAgaWYgKHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwpIHsNCiAgICAgIHJldHVybiBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7DQogICAgaWYgKHZhbHVlID09PSBudWxsKQ0KICAgICAgcmV0dXJuIFtdOw0KICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQ0KICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIHJldHVybiBbdmFsdWVdOw0KICB9DQoNCiAgLy8gSW1wbGVtZW50IGpRdWVyeSdzIGV4dGVuZA0KICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICByZXR1cm4gdGFyZ2V0Ow0KICAgIH0NCiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsNCiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7DQogICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsNCiAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHRhcmdldDsNCiAgfQ0KDQogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4NCiAgZnVuY3Rpb24gZm9yRWFjaCh2YWx1ZXMsIGNhbGxiYWNrLCB0aGlzQXJnKSB7DQogICAgaWYgKHZhbHVlcy5mb3JFYWNoKSB7DQogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7DQogICAgfSBlbHNlIHsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIFJlcGxhY2VzIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiBmdW5jU291cmNlLg0KICAvLw0KICAvLyBOb3RlIHRoYXQgZnVuY1NvdXJjZSBzaG91bGQgbm90IEJFIHRoZSBuZXcgbWV0aG9kLCBpdCBzaG91bGQgYmUgYSBmdW5jdGlvbg0KICAvLyB0aGF0IFJFVFVSTlMgdGhlIG5ldyBtZXRob2QuIGZ1bmNTb3VyY2UgcmVjZWl2ZXMgYSBzaW5nbGUgYXJndW1lbnQgdGhhdCBpcw0KICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4NCiAgLy8gbWV0aG9kIGNhbiBiZSBjYWxsZWQgbGlrZSBhIHJlZ3VsYXIgZnVuY3Rpb24sIGl0IGhhcyB0aGUgdGFyZ2V0IHBlcm1hbmVudGx5DQogIC8vIGJvdW5kIHRvIGl0IHNvICJ0aGlzIiB3aWxsIHdvcmsgY29ycmVjdGx5Lg0KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsNCiAgICB2YXIgc3VwZXJGdW5jID0gdGFyZ2V0W21ldGhvZE5hbWVdIHx8IGZ1bmN0aW9uKCkge307DQogICAgdmFyIHN1cGVyRnVuY0JvdW5kID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsNCiAgICB9Ow0KICAgIHRhcmdldFttZXRob2ROYW1lXSA9IGZ1bmNTb3VyY2Uoc3VwZXJGdW5jQm91bmQpOw0KICB9DQoNCiAgLy8gQWRkIGEgbWV0aG9kIHRvIGRlbGVnYXRvciB0aGF0LCB3aGVuIGludm9rZWQsIGNhbGxzDQogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbg0KICAvLyB0aGUgZGVsZWdhdGVlLCBidXQgdGhlcmUgd2FzIG9uZSBvbiBkZWxlZ2F0b3IgYmVmb3JlDQogIC8vIGRlbGVnYXRlTWV0aG9kIHdhcyBjYWxsZWQsIHRoZW4gdGhlIG9yaWdpbmFsIHZlcnNpb24NCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLg0KICAvLyBGb3IgZXhhbXBsZToNCiAgLy8NCiAgLy8gdmFyIGEgPSB7DQogIC8vICAgbWV0aG9kMTogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMScpOyB9DQogIC8vICAgbWV0aG9kMjogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMicpOyB9DQogIC8vIH07DQogIC8vIHZhciBiID0gew0KICAvLyAgIG1ldGhvZDE6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYjEnKTsgfQ0KICAvLyB9Ow0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMSIpOw0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMiIpOw0KICAvLyBhLm1ldGhvZDEoKTsNCiAgLy8gYS5tZXRob2QyKCk7DQogIC8vDQogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4NCiAgZnVuY3Rpb24gZGVsZWdhdGVNZXRob2QoZGVsZWdhdG9yLCBkZWxlZ2F0ZWUsIG1ldGhvZE5hbWUpIHsNCiAgICB2YXIgaW5oZXJpdGVkID0gZGVsZWdhdG9yW21ldGhvZE5hbWVdOw0KICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHRhcmdldCA9IGRlbGVnYXRlZTsNCiAgICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZWVbbWV0aG9kTmFtZV07DQoNCiAgICAgIC8vIFRoZSBtZXRob2QgZG9lc24ndCBleGlzdCBvbiB0aGUgZGVsZWdhdGVlLiBJbnN0ZWFkLA0KICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIG9uIHRoZSBkZWxlZ2F0b3IsIGlmIGl0IGV4aXN0cy4NCiAgICAgIGlmICghbWV0aG9kKSB7DQogICAgICAgIHRhcmdldCA9IGRlbGVnYXRvcjsNCiAgICAgICAgbWV0aG9kID0gaW5oZXJpdGVkOw0KICAgICAgfQ0KDQogICAgICBpZiAobWV0aG9kKSB7DQogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOw0KICAgICAgfQ0KICAgIH07DQogIH0NCg0KICAvLyBJbXBsZW1lbnQgYSB2YWd1ZSBmYWNzaW1pbGllIG9mIGpRdWVyeSdzIGRhdGEgbWV0aG9kDQogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsNCiAgICAgIHJldHVybiBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXTsNCiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgew0KICAgICAgZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV0gPSB2YWx1ZTsNCiAgICAgIHJldHVybiBlbDsNCiAgICB9IGVsc2Ugew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBlbGVtZW50RGF0YTogIiArDQogICAgICAgIGFyZ3VtZW50cy5sZW5ndGgpOw0KICAgIH0NCiAgfQ0KDQogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleA0KICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csICJcXCQmIik7DQogIH0NCg0KICBmdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7DQogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOw0KICAgIHJldHVybiByZS50ZXN0KGVsLmNsYXNzTmFtZSk7DQogIH0NCg0KICAvLyBlbGVtZW50cyAtIGFycmF5IChvciBhcnJheS1saWtlIG9iamVjdCkgb2YgSFRNTCBlbGVtZW50cw0KICAvLyBjbGFzc05hbWUgLSBjbGFzcyBuYW1lIHRvIHRlc3QgZm9yDQogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsNCiAgLy8gICBpZiBmYWxzZSwgb25seSByZXR1cm4gZWxlbWVudHMgKndpdGhvdXQqIGdpdmVuIGNsYXNzTmFtZQ0KICBmdW5jdGlvbiBmaWx0ZXJCeUNsYXNzKGVsZW1lbnRzLCBjbGFzc05hbWUsIGluY2x1ZGUpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgIGlmIChoYXNDbGFzcyhlbGVtZW50c1tpXSwgY2xhc3NOYW1lKSA9PSBpbmNsdWRlKQ0KICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOw0KICAgIH0NCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmMsIGZhbHNlKTsNCiAgICB9IGVsc2UgaWYgKG9iai5hdHRhY2hFdmVudCkgew0KICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gb2ZmKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5yZW1vdmVFdmVudExpc3RlbmVyKQ0KICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7DQogICAgZWxzZSBpZiAob2JqLmRldGFjaEV2ZW50KSB7DQogICAgICBvYmouZGV0YWNoRXZlbnQoZXZlbnROYW1lLCBmdW5jKTsNCiAgICB9DQogIH0NCg0KICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aA0KICAvLyB0aGUgInBhZGRpbmciIENTUyBwcm9wZXJ0eQ0KICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcGFkZGluZw0KICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7DQogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJudW1iZXIiKQ0KICAgICAgdmFsdWUgPSBbdmFsdWVdOw0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzBdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVswXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVszXX07DQogICAgfQ0KICB9DQoNCiAgLy8gQ29udmVydCBhbiB1bnBhY2tlZCBwYWRkaW5nIG9iamVjdCB0byBhIENTUyB2YWx1ZQ0KICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgew0KICAgIHJldHVybiBwYWRkaW5nT2JqLnRvcCArICJweCAiICsgcGFkZGluZ09iai5yaWdodCArICJweCAiICsgcGFkZGluZ09iai5ib3R0b20gKyAicHggIiArIHBhZGRpbmdPYmoubGVmdCArICJweCI7DQogIH0NCg0KICAvLyBNYWtlcyBhIG51bWJlciBzdWl0YWJsZSBmb3IgQ1NTDQogIGZ1bmN0aW9uIHB4KHgpIHsNCiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikNCiAgICAgIHJldHVybiB4ICsgInB4IjsNCiAgICBlbHNlDQogICAgICByZXR1cm4geDsNCiAgfQ0KDQogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuDQogIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIG51bGwsIG9yIGFuIG9iamVjdCB3aXRoIGZpbGwsIHBhZGRpbmcsDQogIC8vIGRlZmF1bHRXaWR0aCwgZGVmYXVsdEhlaWdodCBmaWVsZHMuDQogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgew0KICAgIHZhciBzaXppbmdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2h0bWx3aWRnZXQtc2l6aW5nJ10iKTsNCiAgICBpZiAoIXNpemluZ0VsKQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgdmFyIHNwID0gSlNPTi5wYXJzZShzaXppbmdFbC50ZXh0Q29udGVudCB8fCBzaXppbmdFbC50ZXh0IHx8ICJ7fSIpOw0KICAgIGlmICh2aWV3ZXJNb2RlKSB7DQogICAgICByZXR1cm4gc3Audmlld2VyOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gc3AuYnJvd3NlcjsNCiAgICB9DQogIH0NCg0KICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLg0KICAvLyAgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgeWllbGRzIGENCiAgLy8gICBmdW5jdGlvbi4gT3IsIGNhbiBiZSBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggImNvZGUiIGFuZCAiZGF0YSINCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nDQogIC8vICAgb2YgSlMgdGhhdCdzIGFuIGV4cHIgdGhhdCB5aWVsZHMgYSBmdW5jdGlvbiwgYW5kICJkYXRhIiBzaG91bGQgYmUNCiAgLy8gICBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgd2hlbiB0aGF0DQogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLg0KICAvLyBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgdGhhdCB3aWxsIGJlICJ0aGlzIiBmb3IgZWFjaCBmdW5jdGlvbg0KICAvLyAgIGV4ZWN1dGlvbi4NCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlDQogIC8vICAgc2FtZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gYWxsIGZ1bmN0aW9ucy4pDQogIGZ1bmN0aW9uIGV2YWxBbmRSdW4odGFza3MsIHRhcmdldCwgYXJncykgew0KICAgIGlmICh0YXNrcykgew0KICAgICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykgew0KICAgICAgICB2YXIgdGhlc2VBcmdzID0gYXJnczsNCiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsNCiAgICAgICAgICB0aGVzZUFyZ3MgPSB0aGVzZUFyZ3MuY29uY2F0KFt0YXNrLmRhdGFdKTsNCiAgICAgICAgICB0YXNrID0gdGFzay5jb2RlOw0KICAgICAgICB9DQogICAgICAgIHZhciB0YXNrRnVuYyA9IGV2YWwoIigiICsgdGFzayArICIpIik7DQogICAgICAgIGlmICh0eXBlb2YodGFza0Z1bmMpICE9PSAiZnVuY3Rpb24iKSB7DQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOw0KICAgICAgICB9DQogICAgICAgIHRhc2tGdW5jLmFwcGx5KHRhcmdldCwgdGhlc2VBcmdzKTsNCiAgICAgIH0pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGluaXRTaXppbmcoZWwpIHsNCiAgICB2YXIgc2l6aW5nID0gc2l6aW5nUG9saWN5KGVsKTsNCiAgICBpZiAoIXNpemluZykNCiAgICAgIHJldHVybjsNCg0KICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsNCiAgICBpZiAoIWNlbCkNCiAgICAgIHJldHVybjsNCg0KICAgIGlmICh0eXBlb2Yoc2l6aW5nLnBhZGRpbmcpICE9PSAidW5kZWZpbmVkIikgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW4gPSAiMCI7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOw0KICAgIH0NCg0KICAgIGlmIChzaXppbmcuZmlsbCkgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOw0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9ICIxMDAlIjsNCiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsNCiAgICAgIGlmIChjZWwpIHsNCiAgICAgICAgY2VsLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsNCiAgICAgICAgdmFyIHBhZCA9IHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpOw0KICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5yaWdodCA9IHBhZC5yaWdodCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5ib3R0b20gPSBwYWQuYm90dG9tICsgInB4IjsNCiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7DQogICAgICAgIGVsLnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7DQogICAgICB9DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwNCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRIZWlnaHQ7IH0NCiAgICAgIH07DQoNCiAgICB9IGVsc2Ugew0KICAgICAgZWwuc3R5bGUud2lkdGggPSBweChzaXppbmcud2lkdGgpOw0KICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LA0KICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0OyB9DQogICAgICB9Ow0KICAgIH0NCiAgfQ0KDQogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzDQogIHZhciBkZWZhdWx0cyA9IHsNCiAgICBmaW5kOiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7DQogICAgfSwNCiAgICByZW5kZXJFcnJvcjogZnVuY3Rpb24oZWwsIGVycikgew0KICAgICAgdmFyICRlbCA9ICQoZWwpOw0KDQogICAgICB0aGlzLmNsZWFyRXJyb3IoZWwpOw0KDQogICAgICAvLyBBZGQgYWxsIHRoZXNlIGVycm9yIGNsYXNzZXMsIGFzIFNoaW55IGRvZXMNCiAgICAgIHZhciBlcnJDbGFzcyA9ICJzaGlueS1vdXRwdXQtZXJyb3IiOw0KICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7DQogICAgICAgIC8vIHVzZSB0aGUgY2xhc3NlcyBvZiB0aGUgZXJyb3IgY29uZGl0aW9uIGFzIENTUyBjbGFzcyBuYW1lcw0KICAgICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiAiICsgJC5tYXAoYXNBcnJheShlcnIudHlwZSksIGZ1bmN0aW9uKHR5cGUpIHsNCiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOw0KICAgICAgICB9KS5qb2luKCIgIik7DQogICAgICB9DQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7DQoNCiAgICAgIC8vIElzIGVsIGlubGluZSBvciBibG9jaz8gSWYgaW5saW5lIG9yIGlubGluZS1ibG9jaywganVzdCBkaXNwbGF5Om5vbmUgaXQNCiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLg0KICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuY3NzKCJkaXNwbGF5Iik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBkaXNwbGF5KTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgICRlbC5oaWRlKCk7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JTcGFuID0gJCgiPHNwYW4+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpOw0KICAgICAgICAgIGVycm9yU3Bhbi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKSB7DQogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlDQogICAgICAgIC8vIGVsLCBhbmQgcG9zaXRpb24gdGhlIGVycm9yIHRvIGJlIG9uIHRvcCBvZiB0aGUgZWwuDQogICAgICAgIC8vIE1hcmsgaXQgd2l0aCBhIHVuaXF1ZSBJRCBhbmQgQ1NTIGNsYXNzIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIuDQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JEaXYgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKGVyckNsYXNzKS5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIikNCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQ0KICAgICAgICAgICAgLy8gc2V0dGluZyB3aWR0aCBjYW4gcHVzaCBvdXQgdGhlIHBhZ2Ugc2l6ZSwgZm9yY2luZyBvdGhlcndpc2UNCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3INCiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHRvIHNocmluazsgc28gdXNlIG1heC13aWR0aCBpbnN0ZWFkDQogICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQ0KICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsNCiAgICAgICAgICBlcnJvckRpdi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JEaXYpOw0KDQogICAgICAgICAgLy8gUmVhbGx5IGR1bWIgd2F5IHRvIGtlZXAgdGhlIHNpemUvcG9zaXRpb24gb2YgdGhlIGVycm9yIGluIHN5bmMgd2l0aA0KICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZWxlbWVudCBhcyB0aGUgd2luZG93IGlzIHJlc2l6ZWQgb3Igd2hhdGV2ZXIuDQogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBpZiAoIWVycm9yRGl2WzBdLnBhcmVudEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRJZCk7DQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yRGl2DQogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpDQogICAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpDQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2xlYXJFcnJvcjogZnVuY3Rpb24oZWwpIHsNCiAgICAgIHZhciAkZWwgPSAkKGVsKTsNCiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBudWxsKTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgIGlmIChkaXNwbGF5KQ0KICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsNCiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsNCiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIil7DQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOw0KICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOw0KICAgICAgfQ0KICAgIH0sDQogICAgc2l6aW5nOiB7fQ0KICB9Ow0KDQogIC8vIENhbGxlZCBieSB3aWRnZXQgYmluZGluZ3MgdG8gcmVnaXN0ZXIgYSBuZXcgdHlwZSBvZiB3aWRnZXQuIFRoZSBkZWZpbml0aW9uDQogIC8vIG9iamVjdCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6DQogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlDQogIC8vICAgdXNlZCBieSBkZWZhdWx0IGFzIHRoZSBDU1MgY2xhc3NuYW1lIHRvIGxvb2sgZm9yLg0KICAvLyAtIGluaXRpYWxpemUgKG9wdGlvbmFsKSAtIEEgZnVuY3Rpb24oZWwpIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkDQogIC8vICAgdmFsdWUgdG8gcmVuZGVyVmFsdWUuDQogIC8vIC0gcmVuZGVyVmFsdWUgKHJlcXVpcmVkKSAtIEEgZnVuY3Rpb24oZWwsIGRhdGEsIGluaXRWYWx1ZSkgdGhhdCB3aWxsIGJlDQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICBlbGVtZW50OyBTaGlueSBhcHBzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyDQogIC8vICAgZWxlbWVudCwgYXMgdGhlIGRhdGEgY2hhbmdlcy4NCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsNCiAgICBpZiAoIWRlZmluaXRpb24ubmFtZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgbmFtZSIpOw0KICAgIH0NCiAgICBpZiAoIWRlZmluaXRpb24udHlwZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgdHlwZSIpOw0KICAgIH0NCiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG91dHB1dCB3aWRnZXRzDQogICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0gIm91dHB1dCIpIHsNCiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsNCiAgICB9DQogICAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgLm5hbWUgaXMgYSB2YWxpZCBDU1MgY2xhc3NuYW1lDQoNCiAgICAvLyBTdXBwb3J0IG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucy4gT2xkLXN0eWxlIGNsYXNzLWJvdW5kDQogICAgLy8gZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0ICJvYmplY3QiIHBlciB3aWRnZXQgcGVyIHR5cGUvY2xhc3Mgb2YNCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cw0KICAgIC8vIHRha2UgZWwgYW5kIGluc3RhbmNlIGFyZ3VtZW50cywgYmVjYXVzZSB0aGUgd2lkZ2V0IG9iamVjdCBjYW4ndA0KICAgIC8vIHN0b3JlIHRoZW0uIE5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQNCiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0DQogICAgLy8gcHJvdmlkZSByZW5kZXJWYWx1ZSBvciByZXNpemUgbWV0aG9kcyBhdCBhbGwsIGp1c3QgdGhlIHNpbmdsZSBtZXRob2QNCiAgICAvLyAgIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpDQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4NCiAgICAvLyBUaGlzIGVuYWJsZXMgYSBmYXIgbW9yZSBuYXR1cmFsIHByb2dyYW1taW5nIHN0eWxlIGZvciB0aGUgd2lkZ2V0DQogICAgLy8gYXV0aG9yLCB3aG8gY2FuIHN0b3JlIHBlci1pbnN0YW5jZSBzdGF0ZSB1c2luZyBlaXRoZXIgT08tc3R5bGUNCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzDQogICAgLy8gaXMgaW4gY29udHJhc3QgdG8gd2hhdCBjYW4gb25seSBiZSBjYWxsZWQgQy1zdHlsZSBwc2V1ZG8tT08gd2hpY2ggaXMNCiAgICAvLyB3aGF0IHdlIHJlcXVpcmVkIGJlZm9yZSkuDQogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgew0KICAgICAgZGVmaW5pdGlvbiA9IGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZmluaXRpb24pOw0KICAgIH0NCg0KICAgIGlmICghZGVmaW5pdGlvbi5yZW5kZXJWYWx1ZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgcmVuZGVyVmFsdWUgZnVuY3Rpb24iKTsNCiAgICB9DQoNCiAgICAvLyBGb3Igc3RhdGljIHJlbmRlcmluZyAobm9uLVNoaW55KSwgdXNlIGEgc2ltcGxlIHdpZGdldCByZWdpc3RyYXRpb24NCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28NCiAgICAvLyBjb250YWluIHN0YXRpYyB3aWRnZXRzLg0KICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107DQogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLg0KICAgIHZhciBzdGF0aWNCaW5kaW5nID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7DQogICAgb3ZlcnJpZGVNZXRob2Qoc3RhdGljQmluZGluZywgImZpbmQiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsNCiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IHN1cGVyZnVuYyhzY29wZSk7DQogICAgICAgIC8vIEZpbHRlciBvdXQgU2hpbnkgb3V0cHV0cywgd2Ugb25seSB3YW50IHRoZSBzdGF0aWMga2luZA0KICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOw0KICAgICAgfTsNCiAgICB9KTsNCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOw0KDQogICAgaWYgKHNoaW55TW9kZSkgew0KICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4NCiAgICAgIC8vIFRoZSBkZWZpbml0aW9uIGl0c2VsZiB3aWxsIG5vdCBiZSB0aGUgb3V0cHV0IGJpbmRpbmcsIGluc3RlYWQNCiAgICAgIC8vIHdlIHdpbGwgbWFrZSBhbiBvdXRwdXQgYmluZGluZyBvYmplY3QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlDQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kDQogICAgICAvLyBuYW1lIChyZW5kZXJWYWx1ZSkgZm9yIGh0bWx3aWRnZXRzIGRlZmluaXRpb24gYW5kIFNoaW55IGJpbmRpbmdzDQogICAgICAvLyBidXQgdGhleSBhY3R1YWxseSBoYXZlIHF1aXRlIGRpZmZlcmVudCBzZW1hbnRpY3MgKHRoZSBTaGlueQ0KICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0DQogICAgICAvLyBzdHJpcHMgb2ZmIGJlZm9yZSBjYWxsaW5nIGh0bWx3aWRnZXRzIHJlbmRlclZhbHVlKS4gV2UgY2FuJ3QNCiAgICAgIC8vIGp1c3QgaWdub3JlIHRoZSBkaWZmZXJlbmNlIGJlY2F1c2UgaW4gc29tZSB3aWRnZXRzIGl0J3MgaGVscGZ1bA0KICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZg0KICAgICAgLy8gd2UncmUgbm90IGRlbGVnYXRpbmcsIHRoZW4gdGhhdCBjYWxsIHdpbGwgZ28gdG8gdGhlIFNoaW55DQogICAgICAvLyB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGh0bWx3aWRnZXRzIHZlcnNpb24uDQoNCiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHdpdGggZGVmaW5pdGlvbiwgd2l0aG91dCBtdXRhdGluZyBlaXRoZXIuDQogICAgICB2YXIgYmluZGluZ0RlZiA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOw0KDQogICAgICAvLyBUaGlzIG9iamVjdCB3aWxsIGJlIG91ciBhY3R1YWwgU2hpbnkgYmluZGluZy4NCiAgICAgIHZhciBzaGlueUJpbmRpbmcgPSBuZXcgU2hpbnkuT3V0cHV0QmluZGluZygpOw0KDQogICAgICAvLyBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHdlJ2xsIHdhbnQgdG8gc2ltcGx5IHVzZSB0aGUgYmluZGluZ0RlZidzDQogICAgICAvLyB2ZXJzaW9uIG9mIG1ldGhvZHMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvDQogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwNCiAgICAgIC8vIG1ldGhvZHMgaW4gdGhlIGZ1dHVyZSwgYW5kIHdlIHdhbnQgdGhlbSB0byBiZSBvdmVycmlkZWFibGUgYnkNCiAgICAgIC8vIEhUTUxXaWRnZXQgYmluZGluZyBkZWZpbml0aW9ucywgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoaXMNCiAgICAgIC8vIGxpc3QuDQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJnZXRJZCIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUNoYW5nZSIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7DQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJyZW5kZXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiY2xlYXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7DQoNCiAgICAgIC8vIFRoZSBmaW5kLCByZW5kZXJWYWx1ZSwgYW5kIHJlc2l6ZSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB3ZQ0KICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLmZpbmQgPSBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7DQoNCiAgICAgICAgLy8gT25seSByZXR1cm4gZWxlbWVudHMgdGhhdCBhcmUgU2hpbnkgb3V0cHV0cywgbm90IHN0YXRpYyBvbmVzDQogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7DQoNCiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdoYXRldmVyIGNhdXNlZCBTaGlueSB0byB0aGluayB0aGVyZSBtaWdodCBiZQ0KICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuDQogICAgICAgIC8vIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvdHMgb2YgZGlmZmVyZW50IGh0bWx3aWRnZXRzIGJpbmRpbmdzLCB3ZQ0KICAgICAgICAvLyBzY2hlZHVsZSBleGVjdXRpb24gZm9yIGxhdGVyLS1ubyBuZWVkIHRvIHN0YXRpY1JlbmRlciBtdWx0aXBsZQ0KICAgICAgICAvLyB0aW1lcy4NCiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSBkeW5hbWljUmVzdWx0cy5sZW5ndGgpDQogICAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXIoKTsNCg0KICAgICAgICByZXR1cm4gZHluYW1pY1Jlc3VsdHM7DQogICAgICB9Ow0KDQogICAgICAvLyBXcmFwIHJlbmRlclZhbHVlIHRvIGhhbmRsZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBpc24ndA0KICAgICAgLy8gc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFNoaW55IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLnJlbmRlclZhbHVlID0gZnVuY3Rpb24oZWwsIGRhdGEpIHsNCiAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMNCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2ldKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWJpbmRpbmdEZWYucmVuZGVyT25OdWxsVmFsdWUpIHsNCiAgICAgICAgICBpZiAoZGF0YS54ID09PSBudWxsKSB7DQogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7DQogICAgICAgICAgaW5pdFNpemluZyhlbCk7DQoNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7DQogICAgICAgICAgaWYgKGJpbmRpbmdEZWYuaW5pdGlhbGl6ZSkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGJpbmRpbmdEZWYuaW5pdGlhbGl6ZShlbCwgZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgcmVzdWx0KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgU2hpbnkucmVuZGVyRGVwZW5kZW5jaWVzKGRhdGEuZGVwcyk7DQogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsNCiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7DQogICAgICB9Ow0KDQogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQNCiAgICAgIGlmIChiaW5kaW5nRGVmLnJlc2l6ZSkgew0KICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuDQogICAgICAgICAgLy8gY2FsbGVkLCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHdpZGdldHMuDQogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgew0KICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgfQ0KDQogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7DQogICAgfQ0KICB9Ow0KDQogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOw0KICBmdW5jdGlvbiBzY2hlZHVsZVN0YXRpY1JlbmRlcigpIHsNCiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgew0KICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsNCiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOw0KICAgICAgfSwgMSk7DQogICAgfQ0KICB9DQoNCiAgLy8gUmVuZGVyIHN0YXRpYyB3aWRnZXRzIGFmdGVyIHRoZSBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nDQogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgYmluZGluZ3MgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsNCiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOw0KICAgICAgZm9yRWFjaChtYXRjaGVzLCBmdW5jdGlvbihlbCkgew0KICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOw0KDQogICAgICAgIGlmIChoYXNDbGFzcyhlbCwgImh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCIpKQ0KICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOw0KDQogICAgICAgIHZhciBpbml0UmVzdWx0Ow0KICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7DQogICAgICAgICAgaW5pdFJlc3VsdCA9IGJpbmRpbmcuaW5pdGlhbGl6ZShlbCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgKTsNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsNCiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsNCiAgICAgICAgICB2YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBzaXplID0gew0KICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApDQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQ0KICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICBsYXN0U2l6ZSA9IHNpemU7DQogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOw0KICAgICAgICAgIH07DQoNCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsNCg0KICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBjYXNlcyB3aGVyZSB3ZSdyZSBydW5uaW5nIGluIGEgU2hpbnkNCiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dA0KICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzDQogICAgICAgICAgLy8gYW4gcm1hcmtkb3duIGRvY3VtZW50IHRoYXQgaGFzIHJ1bnRpbWU6c2hpbnkgYW5kIHdpZGdldA0KICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8NCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMNCiAgICAgICAgICAvLyB3aWRnZXRzLCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuDQogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAic2hvd24uaHRtbHdpZGdldHMgc2hvd24uYnMudGFiLmh0bWx3aWRnZXRzIHNob3duLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoDQogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLg0KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUNCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LA0KICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlDQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4NCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsNCiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcg0KICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cw0KICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4NCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOw0KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsNCiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsNCiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOw0KICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzDQogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7DQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOw0KICB9DQoNCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuDQogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsNCiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICB9LCBmYWxzZSk7DQogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsNCiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7DQogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7DQogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsNCiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0NCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQ0KICAgICAga2V5ID0gMTsNCg0KICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOw0KICAgIGlmICghbGluaykgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsNCiAgICB9DQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgew0KICAgIHZhciBuYW1lcyA9IFtdOw0KICAgIHZhciBsZW5ndGg7DQogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgew0KICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpDQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOw0KICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsNCiAgICAgICAgfQ0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7DQogICAgfQ0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGl0ZW07DQogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgew0KICAgICAgICBpdGVtID0ge307DQogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsNCiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOw0KICAgICAgICB9DQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgew0KICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5Ow0KICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgew0KICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7DQogICAgICAgICAgICAgIHJldHVybiByb3dbaV0NCiAgICAgICAgICB9KQ0KICAgICAgfSk7DQogICAgICByZXR1cm4gbmV3QXJyYXk7DQogIH07DQogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkDQogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcg0KICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLg0KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgew0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOw0KICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsNCiAgICAgIGlmICghZXNjYXBlTW9kZSkgew0KICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7DQogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOw0KICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsNCiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7DQogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107DQogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7DQogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7DQogICAgfQ0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUNCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7DQogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsNCiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQ0KICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgew0KICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlDQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikNCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOw0KICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QNCiAgICAgICAgICBvID0gb1twYXJ0XTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfTsNCg0KICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuDQogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pDQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7DQogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsNCiAgfTsNCg0KICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwNCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUNCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0DQogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLg0KICAvLw0KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgew0KICAgICAgc2VsZWN0b3IgPSBzY29wZTsNCiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7DQogICAgfQ0KDQogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7DQogICAgaWYgKGVsID09PSBudWxsKSB7DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9IGVsc2Ugew0KICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7DQogICAgfQ0KICB9Ow0KDQogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZA0KICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdA0KICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQNCiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuDQogIC8vDQogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4NCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICBzZWxlY3RvciA9IHNjb3BlOw0KICAgICAgc2NvcGUgPSBkb2N1bWVudDsNCiAgICB9DQoNCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOw0KICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7DQogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsNCiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7DQogICAgICBpZiAoaGFuZGxlcikgew0KICAgICAgICBoYW5kbGVyKCk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlDQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOw0KICB9Ow0KDQogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuDQogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nDQogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoDQogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLg0KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7DQogICAgdmFyIHJlc3VsdCA9IHsNCiAgICAgIG5hbWU6IGRlZm4ubmFtZSwNCiAgICAgIHR5cGU6IGRlZm4udHlwZSwNCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgfSwNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsNCiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOw0KICAgICAgfSwNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7DQogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7DQogICAgICB9DQogICAgfTsNCg0KICAgIGlmIChkZWZuLmZpbmQpDQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsNCiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikNCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7DQogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikNCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOw0KDQogICAgcmV0dXJuIHJlc3VsdDsNCiAgfQ0KfSkoKTsNCg0K"></script>
<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMi40IHwgKGMpIGpRdWVyeSBGb3VuZGF0aW9uIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWEuZG9jdW1lbnQsZT1jLnNsaWNlLGY9Yy5jb25jYXQsZz1jLnB1c2gsaD1jLmluZGV4T2YsaT17fSxqPWkudG9TdHJpbmcsaz1pLmhhc093blByb3BlcnR5LGw9e30sbT0iMS4xMi40IixuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBuLmZuLmluaXQoYSxiKX0sbz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2cscD0vXi1tcy0vLHE9Ly0oW1xkYS16XSkvZ2kscj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O24uZm49bi5wcm90b3R5cGU9e2pxdWVyeTptLGNvbnN0cnVjdG9yOm4sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT8wPmE/dGhpc1thK3RoaXMubGVuZ3RoXTp0aGlzW2FdOmUuY2FsbCh0aGlzKX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPW4ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxiLmNvbnRleHQ9dGhpcy5jb250ZXh0LGJ9LGVhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZWFjaCh0aGlzLGEpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpnLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbi5leHRlbmQ9bi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG4uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihuLmlzUGxhaW5PYmplY3QoYyl8fChiPW4uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbi5pc0FycmF5KGEpP2E6W10pOmY9YSYmbi5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1uLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbi5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKG0rTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW4udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bi50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXt2YXIgYj1hJiZhLnRvU3RyaW5nKCk7cmV0dXJuIW4uaXNBcnJheShhKSYmYi1wYXJzZUZsb2F0KGIpKzE+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1uLnR5cGUoYSl8fGEubm9kZVR5cGV8fG4uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFrLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWsuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKCFsLm93bkZpcnN0KWZvcihiIGluIGEpcmV0dXJuIGsuY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxrLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aVtqLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZuLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTA7aWYocyhhKSl7Zm9yKGM9YS5sZW5ndGg7Yz5kO2QrKylpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoZCBpbiBhKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zy5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGgpcmV0dXJuIGguY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGc9MCxoPVtdO2lmKHMoYSkpZm9yKGQ9YS5sZW5ndGg7ZD5nO2crKyllPWIoYVtnXSxnLGMpLG51bGwhPWUmJmgucHVzaChlKTtlbHNlIGZvcihnIGluIGEpZT1iKGFbZ10sZyxjKSxudWxsIT1lJiZoLnB1c2goZSk7cmV0dXJuIGYuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9Ziksbi5pc0Z1bmN0aW9uKGEpPyhjPWUuY2FsbChhcmd1bWVudHMsMiksZD1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZS5jYWxsKGFyZ3VtZW50cykpKX0sZC5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGQpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omx9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYobi5mbltTeW1ib2wuaXRlcmF0b3JdPWNbU3ltYm9sLml0ZXJhdG9yXSksbi5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2lbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gcyhhKXt2YXIgYj0hIWEmJiJsZW5ndGgiaW4gYSYmYS5sZW5ndGgsYz1uLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9Z2EoKSx6PWdhKCksQT1nYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitNKyIpKXwpIitMKyIqXFxdIixPPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTisiKSopfC4qKVxcKXwpIixQPW5ldyBSZWdFeHAoTCsiKyIsImciKSxRPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxUPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFU9bmV3IFJlZ0V4cChPKSxWPW5ldyBSZWdFeHAoIl4iK00rIiQiKSxXPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK04pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitPKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxYPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWT0vXmhcZCQvaSxaPS9eW157XStce1xzKlxbbmF0aXZlIFx3LywkPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sXz0vWyt+XS8sYWE9Lyd8XFwvZyxiYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksY2E9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGRhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZmEoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3PWImJmIub3duZXJEb2N1bWVudCx4PWI/Yi5ub2RlVHlwZTo5O2lmKGQ9ZHx8W10sInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PXgmJjkhPT14JiYxMSE9PXgpcmV0dXJuIGQ7aWYoIWUmJigoYj9iLm93bmVyRG9jdW1lbnR8fGI6dikhPT1uJiZtKGIpLGI9Ynx8bixwKSl7aWYoMTEhPT14JiYobz0kLmV4ZWMoYSkpKWlmKGY9b1sxXSl7aWYoOT09PXgpe2lmKCEoaj1iLmdldEVsZW1lbnRCeUlkKGYpKSlyZXR1cm4gZDtpZihqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZSBpZih3JiYoaj13LmdldEVsZW1lbnRCeUlkKGYpKSYmdChiLGopJiZqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZXtpZihvWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoZj1vWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZikpLGR9aWYoYy5xc2EmJiFBW2ErIiAiXSYmKCFxfHwhcS50ZXN0KGEpKSl7aWYoMSE9PXgpdz1iLHM9YTtlbHNlIGlmKCJvYmplY3QiIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoaz1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/az1rLnJlcGxhY2UoYWEsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLGs9dSkscj1nKGEpLGg9ci5sZW5ndGgsbD1WLnRlc3Qoayk/IiMiK2s6IltpZD0nIitrKyInXSI7d2hpbGUoaC0tKXJbaF09bCsiICIrcWEocltoXSk7cz1yLmpvaW4oIiwiKSx3PV8udGVzdChhKSYmb2EoYi5wYXJlbnROb2RlKXx8Yn1pZihzKXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbChzKSksZH1jYXRjaCh5KXt9ZmluYWxseXtrPT09dSYmYi5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gaShhLnJlcGxhY2UoUSwiJDEiKSxiLGQsZSl9ZnVuY3Rpb24gZ2EoKXt2YXIgYT1bXTtmdW5jdGlvbiBiKGMsZSl7cmV0dXJuIGEucHVzaChjKyIgIik+ZC5jYWNoZUxlbmd0aCYmZGVsZXRlIGJbYS5zaGlmdCgpXSxiW2MrIiAiXT1lfXJldHVybiBifWZ1bmN0aW9uIGhhKGEpe3JldHVybiBhW3VdPSEwLGF9ZnVuY3Rpb24gaWEoYSl7dmFyIGI9bi5jcmVhdGVFbGVtZW50KCJkaXYiKTt0cnl7cmV0dXJuISFhKGIpfWNhdGNoKGMpe3JldHVybiExfWZpbmFsbHl7Yi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYiksYj1udWxsfX1mdW5jdGlvbiBqYShhLGIpe3ZhciBjPWEuc3BsaXQoInwiKSxlPWMubGVuZ3RoO3doaWxlKGUtLSlkLmF0dHJIYW5kbGVbY1tlXV09Yn1mdW5jdGlvbiBrYShhLGIpe3ZhciBjPWImJmEsZD1jJiYxPT09YS5ub2RlVHlwZSYmMT09PWIubm9kZVR5cGUmJih+Yi5zb3VyY2VJbmRleHx8QyktKH5hLnNvdXJjZUluZGV4fHxDKTtpZihkKXJldHVybiBkO2lmKGMpd2hpbGUoYz1jLm5leHRTaWJsaW5nKWlmKGM9PT1iKXJldHVybi0xO3JldHVybiBhPzE6LTF9ZnVuY3Rpb24gbGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YyYmYi50eXBlPT09YX19ZnVuY3Rpb24gbWEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PWN8fCJidXR0b24iPT09YykmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBoYShmdW5jdGlvbihiKXtyZXR1cm4gYj0rYixoYShmdW5jdGlvbihjLGQpe3ZhciBlLGY9YShbXSxjLmxlbmd0aCxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSljW2U9ZltnXV0mJihjW2VdPSEoZFtlXT1jW2VdKSl9KX0pfWZ1bmN0aW9uIG9hKGEpe3JldHVybiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1mYS5zdXBwb3J0PXt9LGY9ZmEuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiPyJIVE1MIiE9PWIubm9kZU5hbWU6ITF9LG09ZmEuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZSxnPWE/YS5vd25lckRvY3VtZW50fHxhOnY7cmV0dXJuIGchPT1uJiY5PT09Zy5ub2RlVHlwZSYmZy5kb2N1bWVudEVsZW1lbnQ/KG49ZyxvPW4uZG9jdW1lbnRFbGVtZW50LHA9IWYobiksKGU9bi5kZWZhdWx0VmlldykmJmUudG9wIT09ZSYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZGEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkYSkpLGMuYXR0cmlidXRlcz1pYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9ImkiLCFhLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lPWlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVoudGVzdChuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1pYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFuLmdldEVsZW1lbnRzQnlOYW1lfHwhbi5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoYmEsY2EpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT1aLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJihpYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGlhKGZ1bmN0aW9uKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPVoudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmaWEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLE8pfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj1aLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHxaLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1ufHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PW58fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxnPVthXSxoPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1uPy0xOmI9PT1uPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGthKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWcudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO3doaWxlKGdbZF09PT1oW2RdKWQrKztyZXR1cm4gZD9rYShnW2RdLGhbZF0pOmdbZF09PT12Py0xOmhbZF09PT12PzE6MH0sbik6bn0sZmEubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBmYShhLG51bGwsbnVsbCxiKX0sZmEubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFQsIj0nJDEnXSIpLGMubWF0Y2hlc1NlbGVjdG9yJiZwJiYhQVtiKyIgIl0mJighcnx8IXIudGVzdChiKSkmJighcXx8IXEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGZhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGZhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZmEuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGZhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZmEudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWZhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1mYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpoYSxtYXRjaDpXLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoYmEsY2EpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGJhLGNhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8ZmEuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZmEuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFcuQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVS50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9ZmEuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShQLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoLHQ9ITE7aWYocSl7aWYoZil7d2hpbGUocCl7bT1iO3doaWxlKG09bVtwXSlpZihoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXttPXEsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biYmalsyXSxtPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigxPT09bS5ub2RlVHlwZSYmKyt0JiZtPT09Yil7a1thXT1bdyxuLHRdO2JyZWFrfX1lbHNlIGlmKHMmJihtPWIsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biksdD09PSExKXdoaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKChoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpJiYrK3QmJihzJiYobD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksa1thXT1bdyx0XSksbT09PWIpKWJyZWFrO3JldHVybiB0LT1lLHQ9PT1kfHx0JWQ9PT0wJiZ0L2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2hhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1KKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmhhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShRLCIkMSIpKTtyZXR1cm4gZFt1XT9oYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZmEoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczpoYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoYmEsY2EpLGZ1bmN0aW9uKGIpe3JldHVybihiLnRleHRDb250ZW50fHxiLmlubmVyVGV4dHx8ZShiKSkuaW5kZXhPZihhKT4tMX19KSxsYW5nOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBWLnRlc3QoYXx8IiIpfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIithKSxhPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihiKXt2YXIgYztkbyBpZihjPXA/Yi5sYW5nOmIuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxiLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBjPWMudG9Mb3dlckNhc2UoKSxjPT09YXx8MD09PWMuaW5kZXhPZihhKyItIik7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmMT09PWIubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihiKXt2YXIgYz1hLmxvY2F0aW9uJiZhLmxvY2F0aW9uLmhhc2g7cmV0dXJuIGMmJmMuc2xpY2UoMSk9PT1iLmlkfSxyb290OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09b30sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1uLmFjdGl2ZUVsZW1lbnQmJighbi5oYXNGb2N1c3x8bi5oYXNGb2N1cygpKSYmISEoYS50eXBlfHxhLmhyZWZ8fH5hLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFkudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFgudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6bmEoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Om5hKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpuYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuWzA+Yz9jK2I6Y119KSxldmVuOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6bmEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpuYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bGEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bWEoYik7ZnVuY3Rpb24gcGEoKXt9cGEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyBwYSxnPWZhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpe2MmJiEoZT1SLmV4ZWMoaCkpfHwoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1TLmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFEsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1XW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/ZmEuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiBxYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHJhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGosaz1bdyxmXTtpZihnKXt3aGlsZShiPWJbZF0paWYoKDE9PT1iLm5vZGVUeXBlfHxlKSYmYShiLGMsZykpcmV0dXJuITB9ZWxzZSB3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpe2lmKGo9Ylt1XXx8KGJbdV09e30pLGk9altiLnVuaXF1ZUlEXXx8KGpbYi51bmlxdWVJRF09e30pLChoPWlbZF0pJiZoWzBdPT09dyYmaFsxXT09PWYpcmV0dXJuIGtbMl09aFsyXTtpZihpW2RdPWssa1syXT1hKGIsYyxnKSlyZXR1cm4hMH19fWZ1bmN0aW9uIHNhKGEpe3JldHVybiBhLmxlbmd0aD4xP2Z1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLmxlbmd0aDt3aGlsZShlLS0paWYoIWFbZV0oYixjLGQpKXJldHVybiExO3JldHVybiEwfTphWzBdfWZ1bmN0aW9uIHRhKGEsYixjKXtmb3IodmFyIGQ9MCxlPWIubGVuZ3RoO2U+ZDtkKyspZmEoYSxiW2RdLGMpO3JldHVybiBjfWZ1bmN0aW9uIHVhKGEsYixjLGQsZSl7Zm9yKHZhciBmLGc9W10saD0wLGk9YS5sZW5ndGgsaj1udWxsIT1iO2k+aDtoKyspKGY9YVtoXSkmJihjJiYhYyhmLGQsZSl8fChnLnB1c2goZiksaiYmYi5wdXNoKGgpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gdmEoYSxiLGMsZCxlLGYpe3JldHVybiBkJiYhZFt1XSYmKGQ9dmEoZCkpLGUmJiFlW3VdJiYoZT12YShlLGYpKSxoYShmdW5jdGlvbihmLGcsaCxpKXt2YXIgaixrLGwsbT1bXSxuPVtdLG89Zy5sZW5ndGgscD1mfHx0YShifHwiKiIsaC5ub2RlVHlwZT9baF06aCxbXSkscT0hYXx8IWYmJmI/cDp1YShwLG0sYSxoLGkpLHI9Yz9lfHwoZj9hOm98fGQpP1tdOmc6cTtpZihjJiZjKHEscixoLGkpLGQpe2o9dWEocixuKSxkKGosW10saCxpKSxrPWoubGVuZ3RoO3doaWxlKGstLSkobD1qW2tdKSYmKHJbbltrXV09IShxW25ba11dPWwpKX1pZihmKXtpZihlfHxhKXtpZihlKXtqPVtdLGs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiZqLnB1c2gocVtrXT1sKTtlKG51bGwscj1bXSxqLGkpfWs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiYoaj1lP0ooZixsKTptW2tdKT4tMSYmKGZbal09IShnW2pdPWwpKX19ZWxzZSByPXVhKHI9PT1nP3Iuc3BsaWNlKG8sci5sZW5ndGgpOnIpLGU/ZShudWxsLGcscixpKTpILmFwcGx5KGcscil9KX1mdW5jdGlvbiB3YShhKXtmb3IodmFyIGIsYyxlLGY9YS5sZW5ndGgsZz1kLnJlbGF0aXZlW2FbMF0udHlwZV0saD1nfHxkLnJlbGF0aXZlWyIgIl0saT1nPzE6MCxrPXJhKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yn0saCwhMCksbD1yYShmdW5jdGlvbihhKXtyZXR1cm4gSihiLGEpPi0xfSxoLCEwKSxtPVtmdW5jdGlvbihhLGMsZCl7dmFyIGU9IWcmJihkfHxjIT09ail8fCgoYj1jKS5ub2RlVHlwZT9rKGEsYyxkKTpsKGEsYyxkKSk7cmV0dXJuIGI9bnVsbCxlfV07Zj5pO2krKylpZihjPWQucmVsYXRpdmVbYVtpXS50eXBlXSltPVtyYShzYShtKSxjKV07ZWxzZXtpZihjPWQuZmlsdGVyW2FbaV0udHlwZV0uYXBwbHkobnVsbCxhW2ldLm1hdGNoZXMpLGNbdV0pe2ZvcihlPSsraTtmPmU7ZSsrKWlmKGQucmVsYXRpdmVbYVtlXS50eXBlXSlicmVhaztyZXR1cm4gdmEoaT4xJiZzYShtKSxpPjEmJnFhKGEuc2xpY2UoMCxpLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09YVtpLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoUSwiJDEiKSxjLGU+aSYmd2EoYS5zbGljZShpLGUpKSxmPmUmJndhKGE9YS5zbGljZShlKSksZj5lJiZxYShhKSl9bS5wdXNoKGMpfXJldHVybiBzYShtKX1mdW5jdGlvbiB4YShhLGIpe3ZhciBjPWIubGVuZ3RoPjAsZT1hLmxlbmd0aD4wLGY9ZnVuY3Rpb24oZixnLGgsaSxrKXt2YXIgbCxvLHEscj0wLHM9IjAiLHQ9ZiYmW10sdT1bXSx2PWoseD1mfHxlJiZkLmZpbmQuVEFHKCIqIixrKSx5PXcrPW51bGw9PXY/MTpNYXRoLnJhbmRvbSgpfHwuMSx6PXgubGVuZ3RoO2ZvcihrJiYoaj1nPT09bnx8Z3x8ayk7cyE9PXomJm51bGwhPShsPXhbc10pO3MrKyl7aWYoZSYmbCl7bz0wLGd8fGwub3duZXJEb2N1bWVudD09PW58fChtKGwpLGg9IXApO3doaWxlKHE9YVtvKytdKWlmKHEobCxnfHxuLGgpKXtpLnB1c2gobCk7YnJlYWt9ayYmKHc9eSl9YyYmKChsPSFxJiZsKSYmci0tLGYmJnQucHVzaChsKSl9aWYocis9cyxjJiZzIT09cil7bz0wO3doaWxlKHE9YltvKytdKXEodCx1LGcsaCk7aWYoZil7aWYocj4wKXdoaWxlKHMtLSl0W3NdfHx1W3NdfHwodVtzXT1GLmNhbGwoaSkpO3U9dWEodSl9SC5hcHBseShpLHUpLGsmJiFmJiZ1Lmxlbmd0aD4wJiZyK2IubGVuZ3RoPjEmJmZhLnVuaXF1ZVNvcnQoaSl9cmV0dXJuIGsmJih3PXksaj12KSx0fTtyZXR1cm4gYz9oYShmKTpmfXJldHVybiBoPWZhLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj1BW2ErIiAiXTtpZighZil7Ynx8KGI9ZyhhKSksYz1iLmxlbmd0aDt3aGlsZShjLS0pZj13YShiW2NdKSxmW3VdP2QucHVzaChmKTplLnB1c2goZik7Zj1BKGEseGEoZSxkKSksZi5zZWxlY3Rvcj1hfXJldHVybiBmfSxpPWZhLnNlbGVjdD1mdW5jdGlvbihhLGIsZSxmKXt2YXIgaSxqLGssbCxtLG49ImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEsbz0hZiYmZyhhPW4uc2VsZWN0b3J8fGEpO2lmKGU9ZXx8W10sMT09PW8ubGVuZ3RoKXtpZihqPW9bMF09b1swXS5zbGljZSgwKSxqLmxlbmd0aD4yJiYiSUQiPT09KGs9alswXSkudHlwZSYmYy5nZXRCeUlkJiY5PT09Yi5ub2RlVHlwZSYmcCYmZC5yZWxhdGl2ZVtqWzFdLnR5cGVdKXtpZihiPShkLmZpbmQuSUQoay5tYXRjaGVzWzBdLnJlcGxhY2UoYmEsY2EpLGIpfHxbXSlbMF0sIWIpcmV0dXJuIGU7biYmKGI9Yi5wYXJlbnROb2RlKSxhPWEuc2xpY2Uoai5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1XLm5lZWRzQ29udGV4dC50ZXN0KGEpPzA6ai5sZW5ndGg7d2hpbGUoaS0tKXtpZihrPWpbaV0sZC5yZWxhdGl2ZVtsPWsudHlwZV0pYnJlYWs7aWYoKG09ZC5maW5kW2xdKSYmKGY9bShrLm1hdGNoZXNbMF0ucmVwbGFjZShiYSxjYSksXy50ZXN0KGpbMF0udHlwZSkmJm9hKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZxYShqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSwhYnx8Xy50ZXN0KGEpJiZvYShiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9aWEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGphKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGphKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxqYShLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxmYX0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwclsiOiJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlU29ydD1uLnVuaXF1ZT10LnVuaXF1ZVNvcnQsbi50ZXh0PXQuZ2V0VGV4dCxuLmlzWE1MRG9jPXQuaXNYTUwsbi5jb250YWlucz10LmNvbnRhaW5zO3ZhciB1PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPXZvaWQgMCE9PWM7d2hpbGUoKGE9YVtiXSkmJjkhPT1hLm5vZGVUeXBlKWlmKDE9PT1hLm5vZGVUeXBlKXtpZihlJiZuKGEpLmlzKGMpKWJyZWFrO2QucHVzaChhKX1yZXR1cm4gZH0sdj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXTthO2E9YS5uZXh0U2libGluZykxPT09YS5ub2RlVHlwZSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY30sdz1uLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHg9L148KFtcdy1dKylccypcLz8+KD86PFwvXDE+fCkkLyx5PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24geihhLGIsYyl7aWYobi5pc0Z1bmN0aW9uKGIpKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih5LnRlc3QoYikpcmV0dXJuIG4uZmlsdGVyKGIsYSxjKTtiPW4uZmlsdGVyKGIsYSl9cmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBuLmluQXJyYXkoYSxiKT4tMSE9PWN9KX1uLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9uLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm4uZmluZC5tYXRjaGVzKGEsbi5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxuLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobi5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyluLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9uLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEheih0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdy50ZXN0KGEpP24oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgQSxCPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8sQz1uLmZuLmluaXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYz1jfHxBLCJzdHJpbmciPT10eXBlb2YgYSl7aWYoZT0iPCI9PT1hLmNoYXJBdCgwKSYmIj4iPT09YS5jaGFyQXQoYS5sZW5ndGgtMSkmJmEubGVuZ3RoPj0zP1tudWxsLGEsbnVsbF06Qi5leGVjKGEpLCFlfHwhZVsxXSYmYilyZXR1cm4hYnx8Yi5qcXVlcnk/KGJ8fGMpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihiKS5maW5kKGEpO2lmKGVbMV0pe2lmKGI9YiBpbnN0YW5jZW9mIG4/YlswXTpiLG4ubWVyZ2UodGhpcyxuLnBhcnNlSFRNTChlWzFdLGImJmIubm9kZVR5cGU/Yi5vd25lckRvY3VtZW50fHxiOmQsITApKSx4LnRlc3QoZVsxXSkmJm4uaXNQbGFpbk9iamVjdChiKSlmb3IoZSBpbiBiKW4uaXNGdW5jdGlvbih0aGlzW2VdKT90aGlzW2VdKGJbZV0pOnRoaXMuYXR0cihlLGJbZV0pO3JldHVybiB0aGlzfWlmKGY9ZC5nZXRFbGVtZW50QnlJZChlWzJdKSxmJiZmLnBhcmVudE5vZGUpe2lmKGYuaWQhPT1lWzJdKXJldHVybiBBLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWZ9cmV0dXJuIHRoaXMuY29udGV4dD1kLHRoaXMuc2VsZWN0b3I9YSx0aGlzfXJldHVybiBhLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6bi5pc0Z1bmN0aW9uKGEpPyJ1bmRlZmluZWQiIT10eXBlb2YgYy5yZWFkeT9jLnJlYWR5KGEpOmEobik6KHZvaWQgMCE9PWEuc2VsZWN0b3ImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCksbi5tYWtlQXJyYXkoYSx0aGlzKSl9O0MucHJvdG90eXBlPW4uZm4sQT1uKGQpO3ZhciBEPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEU9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07bi5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW4oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihuLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dy50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bihhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbi5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP24udW5pcXVlU29ydChmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP24uaW5BcnJheSh0aGlzWzBdLG4oYSkpOm4uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWVTb3J0KG4ubWVyZ2UodGhpcy5nZXQoKSxuKGEsYikpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWE/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pO2Z1bmN0aW9uIEYoYSxiKXtkbyBhPWFbYl07d2hpbGUoYSYmMSE9PWEubm9kZVR5cGUpO3JldHVybiBhfW4uZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmMTEhPT1iLm5vZGVUeXBlP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHUoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEYoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiB1KGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB1KGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdShhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gdigoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihFW2FdfHwoZT1uLnVuaXF1ZVNvcnQoZSkpLEQudGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgRz0vXFMrL2c7ZnVuY3Rpb24gSChhKXt2YXIgYj17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRyl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/SChhKTpuLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmPVtdLGc9W10saD0tMSxpPWZ1bmN0aW9uKCl7Zm9yKGU9YS5vbmNlLGQ9Yj0hMDtnLmxlbmd0aDtoPS0xKXtjPWcuc2hpZnQoKTt3aGlsZSgrK2g8Zi5sZW5ndGgpZltoXS5hcHBseShjWzBdLGNbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2UmJihoPWYubGVuZ3RoLGM9ITEpfWEubWVtb3J5fHwoYz0hMSksYj0hMSxlJiYoZj1jP1tdOiIiKX0saj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIGYmJihjJiYhYiYmKGg9Zi5sZW5ndGgtMSxnLnB1c2goYykpLGZ1bmN0aW9uIGQoYil7bi5lYWNoKGIsZnVuY3Rpb24oYixjKXtuLmlzRnVuY3Rpb24oYyk/YS51bmlxdWUmJmouaGFzKGMpfHxmLnB1c2goYyk6YyYmYy5sZW5ndGgmJiJzdHJpbmciIT09bi50eXBlKGMpJiZkKGMpfSl9KGFyZ3VtZW50cyksYyYmIWImJmkoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIG4uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxiKXt2YXIgYzt3aGlsZSgoYz1uLmluQXJyYXkoYixmLGMpKT4tMSlmLnNwbGljZShjLDEpLGg+PWMmJmgtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9uLmluQXJyYXkoYSxmKT4tMTpmLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBmJiYoZj1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBlPWc9W10sZj1jPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWZ9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZT0hMCxjfHxqLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhjLm5vdGlmeSkuZG9uZShjLnJlc29sdmUpLmZhaWwoYy5yZWplY3QpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP24uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbi5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1lLmNhbGwoYXJndW1lbnRzKSxkPWMubGVuZ3RoLGY9MSE9PWR8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2Q6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZS5jYWxsKGFyZ3VtZW50cyk6ZCxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGQ+MSlmb3IoaT1uZXcgQXJyYXkoZCksaj1uZXcgQXJyYXkoZCksaz1uZXcgQXJyYXkoZCk7ZD5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5wcm9ncmVzcyhoKGIsaixpKSkuZG9uZShoKGIsayxjKSkuZmFpbChnLnJlamVjdCk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEk7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tbi5yZWFkeVdhaXQ6bi5pc1JlYWR5KXx8KG4uaXNSZWFkeT0hMCxhIT09ITAmJi0tbi5yZWFkeVdhaXQ+MHx8KEkucmVzb2x2ZVdpdGgoZCxbbl0pLG4uZm4udHJpZ2dlckhhbmRsZXImJihuKGQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG4oZCkub2ZmKCJyZWFkeSIpKSkpfX0pO2Z1bmN0aW9uIEooKXtkLmFkZEV2ZW50TGlzdGVuZXI/KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixLKSk6KGQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5kZXRhY2hFdmVudCgib25sb2FkIixLKSl9ZnVuY3Rpb24gSygpeyhkLmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWEuZXZlbnQudHlwZXx8ImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZSkmJihKKCksbi5yZWFkeSgpKX1uLnJlYWR5LnByb21pc2U9ZnVuY3Rpb24oYil7aWYoIUkpaWYoST1uLkRlZmVycmVkKCksImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09ZC5yZWFkeVN0YXRlJiYhZC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwpYS5zZXRUaW1lb3V0KG4ucmVhZHkpO2Vsc2UgaWYoZC5hZGRFdmVudExpc3RlbmVyKWQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixLKTtlbHNle2QuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5hdHRhY2hFdmVudCgib25sb2FkIixLKTt2YXIgYz0hMTt0cnl7Yz1udWxsPT1hLmZyYW1lRWxlbWVudCYmZC5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goZSl7fWMmJmMuZG9TY3JvbGwmJiFmdW5jdGlvbiBmKCl7aWYoIW4uaXNSZWFkeSl7dHJ5e2MuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChiKXtyZXR1cm4gYS5zZXRUaW1lb3V0KGYsNTApfUooKSxuLnJlYWR5KCl9fSgpfXJldHVybiBJLnByb21pc2UoYil9LG4ucmVhZHkucHJvbWlzZSgpO3ZhciBMO2ZvcihMIGluIG4obCkpYnJlYWs7bC5vd25GaXJzdD0iMCI9PT1MLGwuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxuKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGU7Yz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZChiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGIuc3R5bGUuem9vbSYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsbC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChlKSl9KSxmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2wuZGVsZXRlRXhwYW5kbz0hMX1hPW51bGx9KCk7dmFyIE09ZnVuY3Rpb24oYSl7dmFyIGI9bi5ub0RhdGFbKGEubm9kZU5hbWUrIiAiKS50b0xvd2VyQ2FzZSgpXSxjPSthLm5vZGVUeXBlfHwxO3JldHVybiAxIT09YyYmOSE9PWM/ITE6IWJ8fGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9LE49L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUChhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE8sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpOLnRlc3QoYyk/bi5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bi5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwOwp9cmV0dXJuIGN9ZnVuY3Rpb24gUShhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbi5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIFIoYSxiLGQsZSl7aWYoTShhKSl7dmFyIGYsZyxoPW4uZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP24uY2FjaGU6YSxrPWk/YVtoXTphW2hdJiZoO2lmKGsmJmpba10mJihlfHxqW2tdLmRhdGEpfHx2b2lkIDAhPT1kfHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGt8fChrPWk/YVtoXT1jLnBvcCgpfHxuLmd1aWQrKzpoKSxqW2tdfHwoaltrXT1pP3t9Ont0b0pTT046bi5ub29wfSksIm9iamVjdCIhPXR5cGVvZiBiJiYiZnVuY3Rpb24iIT10eXBlb2YgYnx8KGU/altrXT1uLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1uLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbi5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbi5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFMoYSxiLGMpe2lmKE0oYSkpe3ZhciBkLGUsZj1hLm5vZGVUeXBlLGc9Zj9uLmNhY2hlOmEsaD1mP2Fbbi5leHBhbmRvXTpuLmV4cGFuZG87aWYoZ1toXSl7aWYoYiYmKGQ9Yz9nW2hdOmdbaF0uZGF0YSkpe24uaXNBcnJheShiKT9iPWIuY29uY2F0KG4ubWFwKGIsbi5jYW1lbENhc2UpKTpiIGluIGQ/Yj1bYl06KGI9bi5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIuc3BsaXQoIiAiKSksZT1iLmxlbmd0aDt3aGlsZShlLS0pZGVsZXRlIGRbYltlXV07aWYoYz8hUShkKTohbi5pc0VtcHR5T2JqZWN0KGQpKXJldHVybn0oY3x8KGRlbGV0ZSBnW2hdLmRhdGEsUShnW2hdKSkpJiYoZj9uLmNsZWFuRGF0YShbYV0sITApOmwuZGVsZXRlRXhwYW5kb3x8ZyE9Zy53aW5kb3c/ZGVsZXRlIGdbaF06Z1toXT12b2lkIDApfX19bi5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP24uY2FjaGVbYVtuLmV4cGFuZG9dXTphW24uZXhwYW5kb10sISFhJiYhUShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFIoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBSKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUyhhLGIsITApfX0pLG4uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bi5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbi5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW4uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLFAoZixkLGVbZF0pKSk7bi5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhLGIpfSk6Zj9QKGYsYSxuLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1uLl9kYXRhKGEsYiksYyYmKCFkfHxuLmlzQXJyYXkoYyk/ZD1uLl9kYXRhKGEsYixuLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW4ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bi5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXtuLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbi5fZGF0YShhLGMpfHxuLl9kYXRhKGEsYyx7ZW1wdHk6bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bi5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbi5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxuLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bi5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1uLnF1ZXVlKHRoaXMsYSxiKTtuLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1uLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW4uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSksZnVuY3Rpb24oKXt2YXIgYTtsLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxlO3JldHVybiBjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoYiksInVuZGVmaW5lZCIhPXR5cGVvZiBiLnN0eWxlLnpvb20mJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoZC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChlKSxhKTp2b2lkIDB9fSgpO3ZhciBUPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1QrIikoW2EteiVdKikkIiwiaSIpLFY9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxXPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1uLmNzcyhhLCJkaXNwbGF5Iil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX07ZnVuY3Rpb24gWChhLGIsYyxkKXt2YXIgZSxmPTEsZz0yMCxoPWQ/ZnVuY3Rpb24oKXtyZXR1cm4gZC5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gbi5jc3MoYSxiLCIiKX0saT1oKCksaj1jJiZjWzNdfHwobi5jc3NOdW1iZXJbYl0/IiI6InB4Iiksaz0obi5jc3NOdW1iZXJbYl18fCJweCIhPT1qJiYraSkmJlUuZXhlYyhuLmNzcyhhLGIpKTtpZihrJiZrWzNdIT09ail7aj1qfHxrWzNdLGM9Y3x8W10saz0raXx8MTtkbyBmPWZ8fCIuNSIsay89ZixuLnN0eWxlKGEsYixrK2opO3doaWxlKGYhPT0oZj1oKCkvaSkmJjEhPT1mJiYtLWcpfXJldHVybiBjJiYoaz0ra3x8K2l8fDAsZT1jWzFdP2srKGNbMV0rMSkqY1syXTorY1syXSxkJiYoZC51bml0PWosZC5zdGFydD1rLGQuZW5kPWUpKSxlfXZhciBZPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1uLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYylZKGEsYixoLGNbaF0sITAsZixnKX1lbHNlIGlmKHZvaWQgMCE9PWQmJihlPSEwLG4uaXNGdW5jdGlvbihkKXx8KGc9ITApLGomJihnPyhiLmNhbGwoYSxkKSxiPW51bGwpOihqPWIsYj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChuKGEpLGMpfSkpLGIpKWZvcig7aT5oO2grKyliKGFbaF0sYyxnP2Q6ZC5jYWxsKGFbaF0saCxiKGFbaF0sYykpKTtyZXR1cm4gZT9hOmo/Yi5jYWxsKGEpOmk/YihhWzBdLGMpOmZ9LFo9L14oPzpjaGVja2JveHxyYWRpbykkL2ksJD0vPChbXHc6LV0rKS8sXz0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksYWE9L15ccysvLGJhPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZGlhbG9nfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1haW58bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHBpY3R1cmV8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRlbXBsYXRlfHRpbWV8dmlkZW8iO2Z1bmN0aW9uIGNhKGEpe3ZhciBiPWJhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfSFmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYj1kLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTthLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixsLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUsbC50Ym9keT0hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsbC5odG1sU2VyaWFsaXplPSEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxsLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09ZC5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxjLnR5cGU9ImNoZWNrYm94IixjLmNoZWNrZWQ9ITAsYi5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoZWNrZWQ9Yy5jaGVja2VkLGEuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixsLm5vQ2xvbmVDaGVja2VkPSEhYS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYi5hcHBlbmRDaGlsZChhKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYy5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksYS5hcHBlbmRDaGlsZChjKSxsLmNoZWNrQ2xvbmU9YS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsbC5ub0Nsb25lRXZlbnQ9ISFhLmFkZEV2ZW50TGlzdGVuZXIsYVtuLmV4cGFuZG9dPTEsbC5hdHRyaWJ1dGVzPSFhLmdldEF0dHJpYnV0ZShuLmV4cGFuZG8pfSgpO3ZhciBkYT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6bC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19O2RhLm9wdGdyb3VwPWRhLm9wdGlvbixkYS50Ym9keT1kYS50Zm9vdD1kYS5jb2xncm91cD1kYS5jYXB0aW9uPWRhLnRoZWFkLGRhLnRoPWRhLnRkO2Z1bmN0aW9uIGVhKGEsYil7dmFyIGMsZCxlPTAsZj0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOnZvaWQgMDtpZighZilmb3IoZj1bXSxjPWEuY2hpbGROb2Rlc3x8YTtudWxsIT0oZD1jW2VdKTtlKyspIWJ8fG4ubm9kZU5hbWUoZCxiKT9mLnB1c2goZCk6bi5tZXJnZShmLGVhKGQsYikpO3JldHVybiB2b2lkIDA9PT1ifHxiJiZuLm5vZGVOYW1lKGEsYik/bi5tZXJnZShbYV0sZik6Zn1mdW5jdGlvbiBmYShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW4uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG4uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX12YXIgZ2E9Lzx8JiM/XHcrOy8saGE9Lzx0Ym9keS9pO2Z1bmN0aW9uIGlhKGEpe1oudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIGphKGEsYixjLGQsZSl7Zm9yKHZhciBmLGcsaCxpLGosayxtLG89YS5sZW5ndGgscD1jYShiKSxxPVtdLHI9MDtvPnI7cisrKWlmKGc9YVtyXSxnfHwwPT09ZylpZigib2JqZWN0Ij09PW4udHlwZShnKSluLm1lcmdlKHEsZy5ub2RlVHlwZT9bZ106Zyk7ZWxzZSBpZihnYS50ZXN0KGcpKXtpPWl8fHAuYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaj0oJC5leGVjKGcpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09ZGFbal18fGRhLl9kZWZhdWx0LGkuaW5uZXJIVE1MPW1bMV0rbi5odG1sUHJlZmlsdGVyKGcpK21bMl0sZj1tWzBdO3doaWxlKGYtLSlpPWkubGFzdENoaWxkO2lmKCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZhYS50ZXN0KGcpJiZxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShhYS5leGVjKGcpWzBdKSksIWwudGJvZHkpe2c9InRhYmxlIiE9PWp8fGhhLnRlc3QoZyk/Ijx0YWJsZT4iIT09bVsxXXx8aGEudGVzdChnKT8wOmk6aS5maXJzdENoaWxkLGY9ZyYmZy5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShmLS0pbi5ub2RlTmFtZShrPWcuY2hpbGROb2Rlc1tmXSwidGJvZHkiKSYmIWsuY2hpbGROb2Rlcy5sZW5ndGgmJmcucmVtb3ZlQ2hpbGQoayl9bi5tZXJnZShxLGkuY2hpbGROb2RlcyksaS50ZXh0Q29udGVudD0iIjt3aGlsZShpLmZpcnN0Q2hpbGQpaS5yZW1vdmVDaGlsZChpLmZpcnN0Q2hpbGQpO2k9cC5sYXN0Q2hpbGR9ZWxzZSBxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShnKSk7aSYmcC5yZW1vdmVDaGlsZChpKSxsLmFwcGVuZENoZWNrZWR8fG4uZ3JlcChlYShxLCJpbnB1dCIpLGlhKSxyPTA7d2hpbGUoZz1xW3IrK10paWYoZCYmbi5pbkFycmF5KGcsZCk+LTEpZSYmZS5wdXNoKGcpO2Vsc2UgaWYoaD1uLmNvbnRhaW5zKGcub3duZXJEb2N1bWVudCxnKSxpPWVhKHAuYXBwZW5kQ2hpbGQoZyksInNjcmlwdCIpLGgmJmZhKGkpLGMpe2Y9MDt3aGlsZShnPWlbZisrXSlfLnRlc3QoZy50eXBlfHwiIikmJmMucHVzaChnKX1yZXR1cm4gaT1udWxsLHB9IWZ1bmN0aW9uKCl7dmFyIGIsYyxlPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKGIgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSljPSJvbiIrYiwobFtiXT1jIGluIGEpfHwoZS5zZXRBdHRyaWJ1dGUoYywidCIpLGxbYl09ZS5hdHRyaWJ1dGVzW2NdLmV4cGFuZG89PT0hMSk7ZT1udWxsfSgpO3ZhciBrYT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksbGE9L15rZXkvLG1hPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxuYT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sb2E9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIHBhKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWEoKXtyZXR1cm4hMX1mdW5jdGlvbiByYSgpe3RyeXtyZXR1cm4gZC5hY3RpdmVFbGVtZW50fWNhdGNoKGEpe319ZnVuY3Rpb24gc2EoYSxiLGMsZCxlLGYpe3ZhciBnLGg7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXsic3RyaW5nIiE9dHlwZW9mIGMmJihkPWR8fGMsYz12b2lkIDApO2ZvcihoIGluIGIpc2EoYSxoLGMsZCxiW2hdLGYpO3JldHVybiBhfWlmKG51bGw9PWQmJm51bGw9PWU/KGU9YyxkPWM9dm9pZCAwKTpudWxsPT1lJiYoInN0cmluZyI9PXR5cGVvZiBjPyhlPWQsZD12b2lkIDApOihlPWQsZD1jLGM9dm9pZCAwKSksZT09PSExKWU9cWE7ZWxzZSBpZighZSlyZXR1cm4gYTtyZXR1cm4gMT09PWYmJihnPWUsZT1mdW5jdGlvbihhKXtyZXR1cm4gbigpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1uLmd1aWQrKykpLGEuZWFjaChmdW5jdGlvbigpe24uZXZlbnQuYWRkKHRoaXMsYixlLGQsYyl9KX1uLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2Ygbnx8YSYmbi5ldmVudC50cmlnZ2VyZWQ9PT1hLnR5cGU/dm9pZCAwOm4uZXZlbnQuZGlzcGF0Y2guYXBwbHkoay5lbGVtLGFyZ3VtZW50cyl9LGsuZWxlbT1hKSxiPShifHwiIikubWF0Y2goRyl8fFsiIl0saD1iLmxlbmd0aDt3aGlsZShoLS0pZj1vYS5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW4uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm4uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChtPWdbb10pfHwobT1nW29dPVtdLG0uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP20uc3BsaWNlKG0uZGVsZWdhdGVDb3VudCsrLDAsbCk6bS5wdXNoKGwpLG4uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9bi5oYXNEYXRhKGEpJiZuLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEcpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9b2EuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8pe2w9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShkP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLG09a1tvXXx8W10saD1oWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGk9Zj1tLmxlbmd0aDt3aGlsZShmLS0pZz1tW2ZdLCFlJiZxIT09Zy5vcmlnVHlwZXx8YyYmYy5ndWlkIT09Zy5ndWlkfHxoJiYhaC50ZXN0KGcubmFtZXNwYWNlKXx8ZCYmZCE9PWcuc2VsZWN0b3ImJigiKioiIT09ZHx8IWcuc2VsZWN0b3IpfHwobS5zcGxpY2UoZiwxKSxnLnNlbGVjdG9yJiZtLmRlbGVnYXRlQ291bnQtLSxsLnJlbW92ZSYmbC5yZW1vdmUuY2FsbChhLGcpKTtpJiYhbS5sZW5ndGgmJihsLnRlYXJkb3duJiZsLnRlYXJkb3duLmNhbGwoYSxwLHIuaGFuZGxlKSE9PSExfHxuLnJlbW92ZUV2ZW50KGEsbyxyLmhhbmRsZSksZGVsZXRlIGtbb10pfWVsc2UgZm9yKG8gaW4gayluLmV2ZW50LnJlbW92ZShhLG8rYltqXSxjLGQsITApO24uaXNFbXB0eU9iamVjdChrKSYmKGRlbGV0ZSByLmhhbmRsZSxuLl9yZW1vdmVEYXRhKGEsImV2ZW50cyIpKX19LHRyaWdnZXI6ZnVuY3Rpb24oYixjLGUsZil7dmFyIGcsaCxpLGosbCxtLG8scD1bZXx8ZF0scT1rLmNhbGwoYiwidHlwZSIpP2IudHlwZTpiLHI9ay5jYWxsKGIsIm5hbWVzcGFjZSIpP2IubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoaT1tPWU9ZXx8ZCwzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJiFuYS50ZXN0KHErbi5ldmVudC50cmlnZ2VyZWQpJiYocS5pbmRleE9mKCIuIik+LTEmJihyPXEuc3BsaXQoIi4iKSxxPXIuc2hpZnQoKSxyLnNvcnQoKSksaD1xLmluZGV4T2YoIjoiKTwwJiYib24iK3EsYj1iW24uZXhwYW5kb10/YjpuZXcgbi5FdmVudChxLCJvYmplY3QiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9Zj8yOjMsYi5uYW1lc3BhY2U9ci5qb2luKCIuIiksYi5ybmFtZXNwYWNlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Iuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1lKSxjPW51bGw9PWM/W2JdOm4ubWFrZUFycmF5KGMsW2JdKSxsPW4uZXZlbnQuc3BlY2lhbFtxXXx8e30sZnx8IWwudHJpZ2dlcnx8bC50cmlnZ2VyLmFwcGx5KGUsYykhPT0hMSkpe2lmKCFmJiYhbC5ub0J1YmJsZSYmIW4uaXNXaW5kb3coZSkpe2ZvcihqPWwuZGVsZWdhdGVUeXBlfHxxLG5hLnRlc3QoaitxKXx8KGk9aS5wYXJlbnROb2RlKTtpO2k9aS5wYXJlbnROb2RlKXAucHVzaChpKSxtPWk7bT09PShlLm93bmVyRG9jdW1lbnR8fGQpJiZwLnB1c2gobS5kZWZhdWx0Vmlld3x8bS5wYXJlbnRXaW5kb3d8fGEpfW89MDt3aGlsZSgoaT1wW28rK10pJiYhYi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWIudHlwZT1vPjE/ajpsLmJpbmRUeXBlfHxxLGc9KG4uX2RhdGEoaSwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZuLl9kYXRhKGksImhhbmRsZSIpLGcmJmcuYXBwbHkoaSxjKSxnPWgmJmlbaF0sZyYmZy5hcHBseSYmTShpKSYmKGIucmVzdWx0PWcuYXBwbHkoaSxjKSxiLnJlc3VsdD09PSExJiZiLnByZXZlbnREZWZhdWx0KCkpO2lmKGIudHlwZT1xLCFmJiYhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFsLl9kZWZhdWx0fHxsLl9kZWZhdWx0LmFwcGx5KHAucG9wKCksYyk9PT0hMSkmJk0oZSkmJmgmJmVbcV0mJiFuLmlzV2luZG93KGUpKXttPWVbaF0sbSYmKGVbaF09bnVsbCksbi5ldmVudC50cmlnZ2VyZWQ9cTt0cnl7ZVtxXSgpfWNhdGNoKHMpe31uLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbSYmKGVbaF09bSl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1uLmV2ZW50LmZpeChhKTt2YXIgYixjLGQsZixnLGg9W10saT1lLmNhbGwoYXJndW1lbnRzKSxqPShuLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1uLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1uLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGM9MDt3aGlsZSgoZz1mLmhhbmRsZXJzW2MrK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWEucm5hbWVzcGFjZSYmIWEucm5hbWVzcGFjZS50ZXN0KGcubmFtZXNwYWNlKXx8KGEuaGFuZGxlT2JqPWcsYS5kYXRhPWcuZGF0YSxkPSgobi5ldmVudC5zcGVjaWFsW2cub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxnLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1kJiYoYS5yZXN1bHQ9ZCk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8aXNOYU4oYS5idXR0b24pfHxhLmJ1dHRvbjwxKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZD1bXSxjPTA7aD5jO2MrKylmPWJbY10sZT1mLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1kW2VdJiYoZFtlXT1mLm5lZWRzQ29udGV4dD9uKGUsdGhpcykuaW5kZXgoaSk+LTE6bi5maW5kKGUsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxkW2VdJiZkLnB1c2goZik7ZC5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmR9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW24uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxlLGY9YS50eXBlLGc9YSxoPXRoaXMuZml4SG9va3NbZl07aHx8KHRoaXMuZml4SG9va3NbZl09aD1tYS50ZXN0KGYpP3RoaXMubW91c2VIb29rczpsYS50ZXN0KGYpP3RoaXMua2V5SG9va3M6e30pLGU9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzLGE9bmV3IG4uRXZlbnQoZyksYj1lLmxlbmd0aDt3aGlsZShiLS0pYz1lW2JdLGFbY109Z1tjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGQpLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT0hIWEubWV0YUtleSxoLmZpbHRlcj9oLmZpbHRlcihhLGcpOmF9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBkZXRhaWwgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGc9Yi5idXR0b24saD1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihlPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGQsZj1lLmRvY3VtZW50RWxlbWVudCxjPWUuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZiYmZi5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShmJiZmLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGYmJmYuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGYmJmYuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmgmJihhLnJlbGF0ZWRUYXJnZXQ9aD09PWEudGFyZ2V0P2IudG9FbGVtZW50OmgpLGEud2hpY2h8fHZvaWQgMD09PWd8fChhLndoaWNoPTEmZz8xOjImZz8zOjQmZz8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09cmEoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1yYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBuLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbi5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW4uZXh0ZW5kKG5ldyBuLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMH0pO24uZXZlbnQudHJpZ2dlcihkLG51bGwsYiksZC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbi5yZW1vdmVFdmVudD1kLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYyl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgYVtkXSYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/cGE6cWEpOnRoaXMudHlwZT1hLGImJm4uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG4ubm93KCksdm9pZCh0aGlzW24uZXhwYW5kb109ITApKTpuZXcgbi5FdmVudChhLGIpfSxuLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6bi5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6cWEsaXNQcm9wYWdhdGlvblN0b3BwZWQ6cWEsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6cWEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGEsYSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1wYSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9cGEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG4uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtuLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybiBlJiYoZT09PWR8fG4uY29udGFpbnMoZCxlKSl8fChhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLGwuc3VibWl0fHwobi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6dm9pZCBuLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9bi5ub2RlTmFtZShiLCJpbnB1dCIpfHxuLm5vZGVOYW1lKGIsImJ1dHRvbiIpP24ucHJvcChiLCJmb3JtIik6dm9pZCAwO2MmJiFuLl9kYXRhKGMsInN1Ym1pdCIpJiYobi5ldmVudC5hZGQoYywic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdEJ1YmJsZT0hMH0pLG4uX2RhdGEoYywic3VibWl0IiwhMCkpfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihhKXthLl9zdWJtaXRCdWJibGUmJihkZWxldGUgYS5fc3VibWl0QnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZuLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG4ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbi5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxsLmNoYW5nZXx8KG4uZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIGthLnRlc3QodGhpcy5ub2RlTmFtZSk/KCJjaGVja2JveCIhPT10aGlzLnR5cGUmJiJyYWRpbyIhPT10aGlzLnR5cGV8fChuLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXsiY2hlY2tlZCI9PT1hLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lJiYodGhpcy5fanVzdENoYW5nZWQ9ITApfSksbi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdENoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RDaGFuZ2VkPSExKSxuLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSl9KSksITEpOnZvaWQgbi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7a2EudGVzdChiLm5vZGVOYW1lKSYmIW4uX2RhdGEoYiwiY2hhbmdlIikmJihuLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7IXRoaXMucGFyZW50Tm9kZXx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fG4uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEpfSksbi5fZGF0YShiLCJjaGFuZ2UiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBuLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFrYS50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGwuZm9jdXNpbnx8bi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe24uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxuLmV2ZW50LmZpeChhKSl9O24uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1uLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbi5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW4uX2RhdGEoZCxiKS0xO2U/bi5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG4uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG4uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gc2EodGhpcyxhLGIsYyxkKX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBzYSh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixuKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIhPT0hMSYmImZ1bmN0aW9uIiE9dHlwZW9mIGJ8fChjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9cWEpLHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXNbMF07cmV0dXJuIGM/bi5ldmVudC50cmlnZ2VyKGEsYixjLCEwKTp2b2lkIDB9fSk7dmFyIHRhPS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csdWE9bmV3IFJlZ0V4cCgiPCg/OiIrYmErIilbXFxzLz5dIiwiaSIpLHZhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzotXSspW14+XSopXC8+L2dpLHdhPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLHhhPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLHlhPS9edHJ1ZVwvKC4qKS8semE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLEFhPWNhKGQpLEJhPUFhLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2Z1bmN0aW9uIENhKGEsYil7cmV0dXJuIG4ubm9kZU5hbWUoYSwidGFibGUiKSYmbi5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBEYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bi5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24gRWEoYSl7dmFyIGI9eWEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiBGYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZuLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW4uX2RhdGEoYSksZz1uLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyluLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW4uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBHYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWwubm9DbG9uZUV2ZW50JiZiW24uZXhwYW5kb10pe2U9bi5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyluLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobi5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oRGEoYikudGV4dD1hLnRleHQsRWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGwuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFuLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmWi50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOiJpbnB1dCIhPT1jJiYidGV4dGFyZWEiIT09Y3x8KGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX19ZnVuY3Rpb24gSGEoYSxiLGMsZCl7Yj1mLmFwcGx5KFtdLGIpO3ZhciBlLGcsaCxpLGosayxtPTAsbz1hLmxlbmd0aCxwPW8tMSxxPWJbMF0scj1uLmlzRnVuY3Rpb24ocSk7aWYocnx8bz4xJiYic3RyaW5nIj09dHlwZW9mIHEmJiFsLmNoZWNrQ2xvbmUmJnhhLnRlc3QocSkpcmV0dXJuIGEuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1hLmVxKGUpO3ImJihiWzBdPXEuY2FsbCh0aGlzLGUsZi5odG1sKCkpKSxIYShmLGIsYyxkKX0pO2lmKG8mJihrPWphKGIsYVswXS5vd25lckRvY3VtZW50LCExLGEsZCksZT1rLmZpcnN0Q2hpbGQsMT09PWsuY2hpbGROb2Rlcy5sZW5ndGgmJihrPWUpLGV8fGQpKXtmb3IoaT1uLm1hcChlYShrLCJzY3JpcHQiKSxEYSksaD1pLmxlbmd0aDtvPm07bSsrKWc9ayxtIT09cCYmKGc9bi5jbG9uZShnLCEwLCEwKSxoJiZuLm1lcmdlKGksZWEoZywic2NyaXB0IikpKSxjLmNhbGwoYVttXSxnLG0pO2lmKGgpZm9yKGo9aVtpLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG4ubWFwKGksRWEpLG09MDtoPm07bSsrKWc9aVttXSxfLnRlc3QoZy50eXBlfHwiIikmJiFuLl9kYXRhKGcsImdsb2JhbEV2YWwiKSYmbi5jb250YWlucyhqLGcpJiYoZy5zcmM/bi5fZXZhbFVybCYmbi5fZXZhbFVybChnLnNyYyk6bi5nbG9iYWxFdmFsKChnLnRleHR8fGcudGV4dENvbnRlbnR8fGcuaW5uZXJIVE1MfHwiIikucmVwbGFjZSh6YSwiIikpKTtrPWU9bnVsbH1yZXR1cm4gYX1mdW5jdGlvbiBJYShhLGIsYyl7Zm9yKHZhciBkLGU9Yj9uLmZpbHRlcihiLGEpOmEsZj0wO251bGwhPShkPWVbZl0pO2YrKyljfHwxIT09ZC5ub2RlVHlwZXx8bi5jbGVhbkRhdGEoZWEoZCkpLGQucGFyZW50Tm9kZSYmKGMmJm4uY29udGFpbnMoZC5vd25lckRvY3VtZW50LGQpJiZmYShlYShkLCJzY3JpcHQiKSksZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpKTtyZXR1cm4gYX1uLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHZhLCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1uLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihsLmh0bWw1Q2xvbmV8fG4uaXNYTUxEb2MoYSl8fCF1YS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KEJhLmlubmVySFRNTD1hLm91dGVySFRNTCxCYS5yZW1vdmVDaGlsZChmPUJhLmZpcnN0Q2hpbGQpKSwhKGwubm9DbG9uZUV2ZW50JiZsLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxuLmlzWE1MRG9jKGEpKSlmb3IoZD1lYShmKSxoPWVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmR2EoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8ZWEoYSksZD1kfHxlYShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUZhKGUsZFtnXSk7ZWxzZSBGYShhLGYpO3JldHVybiBkPWVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJmZhKGQsIWkmJmVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGNsZWFuRGF0YTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZCxlLGYsZyxoPTAsaT1uLmV4cGFuZG8saj1uLmNhY2hlLGs9bC5hdHRyaWJ1dGVzLG09bi5ldmVudC5zcGVjaWFsO251bGwhPShkPWFbaF0pO2grKylpZigoYnx8TShkKSkmJihmPWRbaV0sZz1mJiZqW2ZdKSl7aWYoZy5ldmVudHMpZm9yKGUgaW4gZy5ldmVudHMpbVtlXT9uLmV2ZW50LnJlbW92ZShkLGUpOm4ucmVtb3ZlRXZlbnQoZCxlLGcuaGFuZGxlKTtqW2ZdJiYoZGVsZXRlIGpbZl0sa3x8InVuZGVmaW5lZCI9PXR5cGVvZiBkLnJlbW92ZUF0dHJpYnV0ZT9kW2ldPXZvaWQgMDpkLnJlbW92ZUF0dHJpYnV0ZShpKSxjLnB1c2goZikpfX19KSxuLmZuLmV4dGVuZCh7ZG9tTWFuaXA6SGEsZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiBJYSh0aGlzLGEsITApfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIElhKHRoaXMsYSl9LHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9uLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxkKS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEhhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj1DYSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUNhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm4uY2xlYW5EYXRhKGVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbi5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UodGEsIiIpOnZvaWQgMDtpZigic3RyaW5nIj09dHlwZW9mIGEmJiF3YS50ZXN0KGEpJiYobC5odG1sU2VyaWFsaXplfHwhdWEudGVzdChhKSkmJihsLmxlYWRpbmdXaGl0ZXNwYWNlfHwhYWEudGVzdChhKSkmJiFkYVsoJC5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1uLmh0bWxQcmVmaWx0ZXIoYSk7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEoZWEoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1bXTtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5wYXJlbnROb2RlO24uaW5BcnJheSh0aGlzLGEpPDAmJihuLmNsZWFuRGF0YShlYSh0aGlzKSksYyYmYy5yZXBsYWNlQ2hpbGQoYix0aGlzKSl9LGEpfX0pLG4uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD0wLGU9W10sZj1uKGEpLGg9Zi5sZW5ndGgtMTtoPj1kO2QrKyljPWQ9PT1oP3RoaXM6dGhpcy5jbG9uZSghMCksbihmW2RdKVtiXShjKSxnLmFwcGx5KGUsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBKYSxLYT17SFRNTDoiYmxvY2siLEJPRFk6ImJsb2NrIn07ZnVuY3Rpb24gTGEoYSxiKXt2YXIgYz1uKGIuY3JlYXRlRWxlbWVudChhKSkuYXBwZW5kVG8oYi5ib2R5KSxkPW4uY3NzKGNbMF0sImRpc3BsYXkiKTtyZXR1cm4gYy5kZXRhY2goKSxkfWZ1bmN0aW9uIE1hKGEpe3ZhciBiPWQsYz1LYVthXTtyZXR1cm4gY3x8KGM9TGEoYSxiKSwibm9uZSIhPT1jJiZjfHwoSmE9KEphfHxuKCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikpLmFwcGVuZFRvKGIuZG9jdW1lbnRFbGVtZW50KSxiPShKYVswXS5jb250ZW50V2luZG93fHxKYVswXS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGIud3JpdGUoKSxiLmNsb3NlKCksYz1MYShhLGIpLEphLmRldGFjaCgpKSxLYVthXT1jKSxjfXZhciBOYT0vXm1hcmdpbi8sT2E9bmV3IFJlZ0V4cCgiXigiK1QrIikoPyFweClbYS16JV0rJCIsImkiKSxQYT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGc9e307Zm9yKGYgaW4gYilnW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5hcHBseShhLGR8fFtdKTtmb3IoZiBpbiBiKWEuc3R5bGVbZl09Z1tmXTtyZXR1cm4gZX0sUWE9ZC5kb2N1bWVudEVsZW1lbnQ7IWZ1bmN0aW9uKCl7dmFyIGIsYyxlLGYsZyxoLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxqPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYoai5zdHlsZSl7ai5zdHlsZS5jc3NUZXh0PSJmbG9hdDpsZWZ0O29wYWNpdHk6LjUiLGwub3BhY2l0eT0iMC41Ij09PWouc3R5bGUub3BhY2l0eSxsLmNzc0Zsb2F0PSEhai5zdHlsZS5jc3NGbG9hdCxqLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsai5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLGwuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1qLnN0eWxlLmJhY2tncm91bmRDbGlwLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxpLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7cGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixqLmlubmVySFRNTD0iIixpLmFwcGVuZENoaWxkKGopLGwuYm94U2l6aW5nPSIiPT09ai5zdHlsZS5ib3hTaXppbmd8fCIiPT09ai5zdHlsZS5Nb3pCb3hTaXppbmd8fCIiPT09ai5zdHlsZS5XZWJraXRCb3hTaXppbmcsbi5leHRlbmQobCx7cmVsaWFibGVIaWRkZW5PZmZzZXRzOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxmfSxib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZX0scGl4ZWxNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksY30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksYn0scmVsaWFibGVNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZ30scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxofX0pO2Z1bmN0aW9uIGsoKXt2YXIgayxsLG09ZC5kb2N1bWVudEVsZW1lbnQ7bS5hcHBlbmRDaGlsZChpKSxqLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7dG9wOjElO3dpZHRoOjUwJSIsYj1lPWg9ITEsYz1nPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGw9YS5nZXRDb21wdXRlZFN0eWxlKGopLGI9IjElIiE9PShsfHx7fSkudG9wLGg9IjJweCI9PT0obHx8e30pLm1hcmdpbkxlZnQsZT0iNHB4Ij09PShsfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxqLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGM9IjRweCI9PT0obHx8e21hcmdpblJpZ2h0OiI0cHgifSkubWFyZ2luUmlnaHQsaz1qLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGsuc3R5bGUuY3NzVGV4dD1qLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MCIsay5zdHlsZS5tYXJnaW5SaWdodD1rLnN0eWxlLndpZHRoPSIwIixqLnN0eWxlLndpZHRoPSIxcHgiLGc9IXBhcnNlRmxvYXQoKGEuZ2V0Q29tcHV0ZWRTdHlsZShrKXx8e30pLm1hcmdpblJpZ2h0KSxqLnJlbW92ZUNoaWxkKGspKSxqLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWouZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsZiYmKGouc3R5bGUuZGlzcGxheT0iIixqLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsai5jaGlsZE5vZGVzWzBdLnN0eWxlLmJvcmRlckNvbGxhcHNlPSJzZXBhcmF0ZSIsaz1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLGtbMF0uc3R5bGUuY3NzVGV4dD0ibWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowO2Rpc3BsYXk6bm9uZSIsZj0wPT09a1swXS5vZmZzZXRIZWlnaHQsZiYmKGtbMF0uc3R5bGUuZGlzcGxheT0iIixrWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWtbMF0ub2Zmc2V0SGVpZ2h0KSksbS5yZW1vdmVDaGlsZChpKX19fSgpO3ZhciBSYSxTYSxUYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhSYT1mdW5jdGlvbihiKXt2YXIgYz1iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGMmJmMub3BlbmVyfHwoYz1hKSxjLmdldENvbXB1dGVkU3R5bGUoYil9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2MuZ2V0UHJvcGVydHlWYWx1ZShiKXx8Y1tiXTp2b2lkIDAsIiIhPT1nJiZ2b2lkIDAhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSxjJiYhbC5waXhlbE1hcmdpblJpZ2h0KCkmJk9hLnRlc3QoZykmJk5hLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9Ziksdm9pZCAwPT09Zz9nOmcrIiJ9KTpRYS5jdXJyZW50U3R5bGUmJihSYT1mdW5jdGlvbihhKXtyZXR1cm4gYS5jdXJyZW50U3R5bGV9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2NbYl06dm9pZCAwLG51bGw9PWcmJmgmJmhbYl0mJihnPWhbYl0pLE9hLnRlc3QoZykmJiFUYS50ZXN0KGIpJiYoZD1oLmxlZnQsZT1hLnJ1bnRpbWVTdHlsZSxmPWUmJmUubGVmdCxmJiYoZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGgubGVmdD0iZm9udFNpemUiPT09Yj8iMWVtIjpnLGc9aC5waXhlbExlZnQrInB4IixoLmxlZnQ9ZCxmJiYoZS5sZWZ0PWYpKSx2b2lkIDA9PT1nP2c6ZysiInx8ImF1dG8ifSk7ZnVuY3Rpb24gVWEoYSxiKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEoKT92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9YikuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19dmFyIFZhPS9hbHBoYVwoW14pXSpcKS9pLFdhPS9vcGFjaXR5XHMqPVxzKihbXildKikvaSxYYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sWWE9bmV3IFJlZ0V4cCgiXigiK1QrIikoLiopJCIsImkiKSxaYT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sJGE9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9LF9hPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl0sYWI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZTtmdW5jdGlvbiBiYihhKXtpZihhIGluIGFiKXJldHVybiBhO3ZhciBiPWEuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPV9hLmxlbmd0aDt3aGlsZShjLS0paWYoYT1fYVtjXStiLGEgaW4gYWIpcmV0dXJuIGF9ZnVuY3Rpb24gY2IoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bi5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlcoZCkmJihmW2ddPW4uX2RhdGEoZCwib2xkZGlzcGxheSIsTWEoZC5ub2RlTmFtZSkpKSk6KGU9VyhkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZuLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzpuLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIGRiKGEsYixjKXt2YXIgZD1ZYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIGViKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1uLmNzcyhhLGMrVltmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gZmIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPVJhKGEpLGc9bC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1TYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLE9hLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYobC5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK2ViKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1uLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPVNhKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6bC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1iYihoKXx8aCksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLHZvaWQgMD09PWMpcmV0dXJuIGcmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTppW2JdO2lmKGY9dHlwZW9mIGMsInN0cmluZyI9PT1mJiYoZT1VLmV4ZWMoYykpJiZlWzFdJiYoYz1YKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChuLmNzc051bWJlcltoXT8iIjoicHgiKSksbC5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPWJiKGgpfHxoKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sZyYmImdldCJpbiBnJiYoZj1nLmdldChhLCEwLGMpKSx2b2lkIDA9PT1mJiYoZj1TYShhLGIsZCkpLCJub3JtYWwiPT09ZiYmYiBpbiAkYSYmKGY9JGFbYl0pLCIiPT09Y3x8Yz8oZT1wYXJzZUZsb2F0KGYpLGM9PT0hMHx8aXNGaW5pdGUoZSk/ZXx8MDpmKTpmfX0pLG4uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBjP1hhLnRlc3Qobi5jc3MoYSwiZGlzcGxheSIpKSYmMD09PWEub2Zmc2V0V2lkdGg/UGEoYSxaYSxmdW5jdGlvbigpe3JldHVybiBmYihhLGIsZCl9KTpmYihhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJlJhKGEpO3JldHVybiBkYihhLGMsZD9lYihhLGIsZCxsLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksbC5vcGFjaXR5fHwobi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gV2EudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW4uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1uLnRyaW0oZi5yZXBsYWNlKFZhLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPVZhLnRlc3QoZik/Zi5yZXBsYWNlKFZhLGUpOmYrIiAiK2UpfX0pLG4uY3NzSG9va3MubWFyZ2luUmlnaHQ9VWEobC5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/UGEoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sU2EsW2EsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLG4uY3NzSG9va3MubWFyZ2luTGVmdD1VYShsLnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihhLGIpe3JldHVybiBiPyhwYXJzZUZsb2F0KFNhKGEsIm1hcmdpbkxlZnQiKSl8fChuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKT9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtUGEoYSx7Cm1hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSk6MCkpKyJweCI6dm9pZCAwfSksbi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ND5kO2QrKyllW2ErVltkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSxOYS50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1kYil9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPVJhKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpfSxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGE/YT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtXKHRoaXMpP24odGhpcykuc2hvdygpOm4odGhpcykuaGlkZSgpfSl9fSk7ZnVuY3Rpb24gZ2IoYSxiLGMsZCxlKXtyZXR1cm4gbmV3IGdiLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bi5Ud2Vlbj1nYixnYi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmdiLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fG4uZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPWdiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpnYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1nYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOmdiLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGdiLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1nYi5wcm90b3R5cGUsZ2IucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiAxIT09YS5lbGVtLm5vZGVUeXBlfHxudWxsIT1hLmVsZW1bYS5wcm9wXSYmbnVsbD09YS5lbGVtLnN0eWxlW2EucHJvcF0/YS5lbGVtW2EucHJvcF06KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6MSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbD09YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV0mJiFuLmNzc0hvb2tzW2EucHJvcF0/YS5lbGVtW2EucHJvcF09YS5ub3c6bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCl9fX0sZ2IucHJvcEhvb2tzLnNjcm9sbFRvcD1nYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LG4uZng9Z2IucHJvdG90eXBlLmluaXQsbi5meC5zdGVwPXt9O3ZhciBoYixpYixqYj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sa2I9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBsYigpe3JldHVybiBhLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtoYj12b2lkIDB9KSxoYj1uLm5vdygpfWZ1bmN0aW9uIG1iKGEsYil7dmFyIGMsZD17aGVpZ2h0OmF9LGU9MDtmb3IoYj1iPzE6MDs0PmU7ZSs9Mi1iKWM9VltlXSxkWyJtYXJnaW4iK2NdPWRbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihkLm9wYWNpdHk9ZC53aWR0aD1hKSxkfWZ1bmN0aW9uIG5iKGEsYixjKXtmb3IodmFyIGQsZT0ocWIudHdlZW5lcnNbYl18fFtdKS5jb25jYXQocWIudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gb2IoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbT10aGlzLG89e30scD1hLnN0eWxlLHE9YS5ub2RlVHlwZSYmVyhhKSxyPW4uX2RhdGEoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz0ibm9uZSI9PT1qP24uX2RhdGEoYSwib2xkZGlzcGxheSIpfHxNYShhLm5vZGVOYW1lKTpqLCJpbmxpbmUiPT09ayYmIm5vbmUiPT09bi5jc3MoYSwiZmxvYXQiKSYmKGwuaW5saW5lQmxvY2tOZWVkc0xheW91dCYmImlubGluZSIhPT1NYShhLm5vZGVOYW1lKT9wLnpvb209MTpwLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIixsLnNocmlua1dyYXBCbG9ja3MoKXx8bS5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLGpiLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocT8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXJ8fHZvaWQgMD09PXJbZF0pY29udGludWU7cT0hMH1vW2RdPXImJnJbZF18fG4uc3R5bGUoYSxkKX1lbHNlIGo9dm9pZCAwO2lmKG4uaXNFbXB0eU9iamVjdChvKSkiaW5saW5lIj09PSgibm9uZSI9PT1qP01hKGEubm9kZU5hbWUpOmopJiYocC5kaXNwbGF5PWopO2Vsc2V7cj8iaGlkZGVuImluIHImJihxPXIuaGlkZGVuKTpyPW4uX2RhdGEoYSwiZnhzaG93Iix7fSksZiYmKHIuaGlkZGVuPSFxKSxxP24oYSkuc2hvdygpOm0uZG9uZShmdW5jdGlvbigpe24oYSkuaGlkZSgpfSksbS5kb25lKGZ1bmN0aW9uKCl7dmFyIGI7bi5fcmVtb3ZlRGF0YShhLCJmeHNob3ciKTtmb3IoYiBpbiBvKW4uc3R5bGUoYSxiLG9bYl0pfSk7Zm9yKGQgaW4gbylnPW5iKHE/cltkXTowLGQsbSksZCBpbiByfHwocltkXT1nLnN0YXJ0LHEmJihnLmVuZD1nLnN0YXJ0LGcuc3RhcnQ9IndpZHRoIj09PWR8fCJoZWlnaHQiPT09ZD8xOjApKX19ZnVuY3Rpb24gcGIoYSxiKXt2YXIgYyxkLGUsZixnO2ZvcihjIGluIGEpaWYoZD1uLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLG4uaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9bi5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBxYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1xYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWhifHxsYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpuLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmhifHxsYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bi5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtkPmM7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihwYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9cWIucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIG4uaXNGdW5jdGlvbihkLnN0b3ApJiYobi5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPW4ucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiBuLm1hcChrLG5iLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQocWIse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpO3JldHVybiBYKGMuZWxlbSxhLFUuZXhlYyhiKSxjKSxjfV19LHR3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEubWF0Y2goRyk7Zm9yKHZhciBjLGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspYz1hW2RdLHFiLnR3ZWVuZXJzW2NdPXFiLnR3ZWVuZXJzW2NdfHxbXSxxYi50d2VlbmVyc1tjXS51bnNoaWZ0KGIpfSxwcmVmaWx0ZXJzOltvYl0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9xYi5wcmVmaWx0ZXJzLnVuc2hpZnQoYSk6cWIucHJlZmlsdGVycy5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtuLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJm4uZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxuLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihXKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uLmlzRW1wdHlPYmplY3QoYSksZj1uLnNwZWVkKGIsYyxkKSxnPWZ1bmN0aW9uKCl7dmFyIGI9cWIodGhpcyxuLmV4dGVuZCh7fSxhKSxmKTsoZXx8bi5fZGF0YSh0aGlzLCJmaW5pc2giKSkmJmIuc3RvcCghMCl9O3JldHVybiBnLmZpbmlzaD1nLGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGMpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihjPWIsYj1hLGE9dm9pZCAwKSxiJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsZT1udWxsIT1hJiZhKyJxdWV1ZUhvb2tzIixmPW4udGltZXJzLGc9bi5fZGF0YSh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZrYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxuLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1uLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1uLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbi5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxuLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bi5mbltiXTtuLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUobWIoYiwhMCksYSxkLGUpfX0pLG4uZWFjaCh7c2xpZGVEb3duOm1iKCJzaG93Iiksc2xpZGVVcDptYigiaGlkZSIpLHNsaWRlVG9nZ2xlOm1iKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxuLnRpbWVycz1bXSxuLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW4udGltZXJzLGM9MDtmb3IoaGI9bi5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxuLmZ4LnN0b3AoKSxoYj12b2lkIDB9LG4uZngudGltZXI9ZnVuY3Rpb24oYSl7bi50aW1lcnMucHVzaChhKSxhKCk/bi5meC5zdGFydCgpOm4udGltZXJzLnBvcCgpfSxuLmZ4LmludGVydmFsPTEzLG4uZnguc3RhcnQ9ZnVuY3Rpb24oKXtpYnx8KGliPWEuc2V0SW50ZXJ2YWwobi5meC50aWNrLG4uZnguaW50ZXJ2YWwpKX0sbi5meC5zdG9wPWZ1bmN0aW9uKCl7YS5jbGVhckludGVydmFsKGliKSxpYj1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9bi5meD9uLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYSxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGY9ZS5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxjLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxiLnNldEF0dHJpYnV0ZSgidHlwZSIsImNoZWNrYm94IiksYy5hcHBlbmRDaGlsZChiKSxhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxhLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGwuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWMuY2xhc3NOYW1lLGwuc3R5bGU9L3RvcC8udGVzdChhLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksbC5ocmVmTm9ybWFsaXplZD0iL2EiPT09YS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxsLmNoZWNrT249ISFiLnZhbHVlLGwub3B0U2VsZWN0ZWQ9Zi5zZWxlY3RlZCxsLmVuY3R5cGU9ISFkLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGUuZGlzYWJsZWQ9ITAsbC5vcHREaXNhYmxlZD0hZi5kaXNhYmxlZCxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxsLmlucHV0PSIiPT09Yi5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYi52YWx1ZT0idCIsYi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGwucmFkaW9WYWx1ZT0idCI9PT1iLnZhbHVlfSgpO3ZhciByYj0vXHIvZyxzYj0vW1x4MjBcdFxyXG5cZl0rL2c7bi5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW4uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxuKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bi5pc0FycmF5KGUpJiYoZT1uLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1uLnZhbEhvb2tzW3RoaXMudHlwZV18fG4udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1uLnZhbEhvb2tzW2UudHlwZV18fG4udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKHJiLCIiKTpudWxsPT1jPyIiOmMpfX19KSxuLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW4uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjpuLnRyaW0obi50ZXh0KGEpKS5yZXBsYWNlKHNiLCIgIil9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPWEub3B0aW9ucyxlPWEuc2VsZWN0ZWRJbmRleCxmPSJzZWxlY3Qtb25lIj09PWEudHlwZXx8MD5lLGc9Zj9udWxsOltdLGg9Zj9lKzE6ZC5sZW5ndGgsaT0wPmU/aDpmP2U6MDtoPmk7aSsrKWlmKGM9ZFtpXSwoYy5zZWxlY3RlZHx8aT09PWUpJiYobC5vcHREaXNhYmxlZD8hYy5kaXNhYmxlZDpudWxsPT09Yy5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpJiYoIWMucGFyZW50Tm9kZS5kaXNhYmxlZHx8IW4ubm9kZU5hbWUoYy5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoYj1uKGMpLnZhbCgpLGYpcmV0dXJuIGI7Zy5wdXNoKGIpfXJldHVybiBnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5vcHRpb25zLGY9bi5tYWtlQXJyYXkoYiksZz1lLmxlbmd0aDt3aGlsZShnLS0paWYoZD1lW2ddLG4uaW5BcnJheShuLnZhbEhvb2tzLm9wdGlvbi5nZXQoZCksZik+LTEpdHJ5e2Quc2VsZWN0ZWQ9Yz0hMH1jYXRjaChoKXtkLnNjcm9sbEhlaWdodH1lbHNlIGQuc2VsZWN0ZWQ9ITE7cmV0dXJuIGN8fChhLnNlbGVjdGVkSW5kZXg9LTEpLGV9fX19KSxuLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtuLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5pc0FycmF5KGIpP2EuY2hlY2tlZD1uLmluQXJyYXkobihhKS52YWwoKSxiKT4tMTp2b2lkIDB9fSxsLmNoZWNrT258fChuLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6YS52YWx1ZX0pfSk7dmFyIHRiLHViLHZiPW4uZXhwci5hdHRySGFuZGxlLHdiPS9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2kseGI9bC5nZXRTZXRBdHRyaWJ1dGUseWI9bC5pbnB1dDtuLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBZKHRoaXMsbi5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZUF0dHIodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9YS5ub2RlVHlwZTtpZigzIT09ZiYmOCE9PWYmJjIhPT1mKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYS5nZXRBdHRyaWJ1dGU/bi5wcm9wKGEsYixjKTooMT09PWYmJm4uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxlPW4uYXR0ckhvb2tzW2JdfHwobi5leHByLm1hdGNoLmJvb2wudGVzdChiKT91Yjp0YikpLHZvaWQgMCE9PWM/bnVsbD09PWM/dm9pZCBuLnJlbW92ZUF0dHIoYSxiKTplJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDooYS5zZXRBdHRyaWJ1dGUoYixjKyIiKSxjKTplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOihkPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZD92b2lkIDA6ZCkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFsLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZuLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEcpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bi5wcm9wRml4W2NdfHxjLG4uZXhwci5tYXRjaC5ib29sLnRlc3QoYyk/eWImJnhifHwhd2IudGVzdChjKT9hW2RdPSExOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtkXT0hMTpuLmF0dHIoYSxjLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZSh4Yj9jOmQpfX0pLHViPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bi5yZW1vdmVBdHRyKGEsYyk6eWImJnhifHwhd2IudGVzdChjKT9hLnNldEF0dHJpYnV0ZSgheGImJm4ucHJvcEZpeFtjXXx8YyxjKTphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbY109ITAsY319LG4uZWFjaChuLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPXZiW2JdfHxuLmZpbmQuYXR0cjt5YiYmeGJ8fCF3Yi50ZXN0KGIpP3ZiW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj12YltiXSx2YltiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsdmJbYl09ZiksZX06dmJbYl09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYildP2IudG9Mb3dlckNhc2UoKTpudWxsfX0pLHliJiZ4Ynx8KG4uYXR0ckhvb2tzLnZhbHVlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLm5vZGVOYW1lKGEsImlucHV0Iik/dm9pZChhLmRlZmF1bHRWYWx1ZT1iKTp0YiYmdGIuc2V0KGEsYixjKX19KSx4Ynx8KHRiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZHx8YS5zZXRBdHRyaWJ1dGVOb2RlKGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShjKSksZC52YWx1ZT1iKz0iIiwidmFsdWUiPT09Y3x8Yj09PWEuZ2V0QXR0cmlidXRlKGMpP2I6dm9pZCAwfX0sdmIuaWQ9dmIubmFtZT12Yi5jb29yZHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiYiIiE9PWQudmFsdWU/ZC52YWx1ZTpudWxsfSxuLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9jLnZhbHVlOnZvaWQgMH0sc2V0OnRiLnNldH0sbi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3RiLnNldChhLCIiPT09Yj8hMTpiLGMpfX0sbi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe24uYXR0ckhvb2tzW2JdPXtzZXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4iIj09PWM/KGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjKTp2b2lkIDB9fX0pKSxsLnN0eWxlfHwobi5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fHx2b2lkIDB9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KTt2YXIgemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksQWI9L14oPzphfGFyZWEpJC9pO24uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxuLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9bi5wcm9wRml4W2FdfHxhLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9fSksbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKDMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIDE9PT1mJiZuLmlzWE1MRG9jKGEpfHwoYj1uLnByb3BGaXhbYl18fGIsZT1uLnByb3BIb29rc1tiXSksdm9pZCAwIT09Yz9lJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDphW2JdPWM6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDphW2JdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bi5maW5kLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4gYj9wYXJzZUludChiLDEwKTp6Yi50ZXN0KGEubm9kZU5hbWUpfHxBYi50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxsLmhyZWZOb3JtYWxpemVkfHxuLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXtuLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxsLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLG4uZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7bi5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLGwuZW5jdHlwZXx8KG4ucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpO3ZhciBCYj0vW1x0XHJcblxmXS9nO2Z1bmN0aW9uIENiKGEpe3JldHVybiBuLmF0dHIoYSwiY2xhc3MiKXx8IiJ9bi5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGk9MDtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsQ2IodGhpcykpKX0pO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKWQuaW5kZXhPZigiICIrZisiICIpPDAmJihkKz1mKyIgIik7aD1uLnRyaW0oZCksZSE9PWgmJm4uYXR0cihjLCJjbGFzcyIsaCl9fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLENiKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZisiICIpPi0xKWQ9ZC5yZXBsYWNlKCIgIitmKyIgIiwiICIpO2g9bi50cmltKGQpLGUhPT1oJiZuLmF0dHIoYywiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6bi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsQ2IodGhpcyksYiksYil9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixkLGUsZjtpZigic3RyaW5nIj09PWMpe2Q9MCxlPW4odGhpcyksZj1hLm1hdGNoKEcpfHxbXTt3aGlsZShiPWZbZCsrXSllLmhhc0NsYXNzKGIpP2UucmVtb3ZlQ2xhc3MoYik6ZS5hZGRDbGFzcyhiKX1lbHNlIHZvaWQgMCE9PWEmJiJib29sZWFuIiE9PWN8fChiPUNiKHRoaXMpLGImJm4uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsYiksbi5hdHRyKHRoaXMsImNsYXNzIixifHxhPT09ITE/IiI6bi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPTA7Yj0iICIrYSsiICI7d2hpbGUoYz10aGlzW2QrK10paWYoMT09PWMubm9kZVR5cGUmJigiICIrQ2IoYykrIiAiKS5yZXBsYWNlKEJiLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KSxuLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxuLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIERiPWEubG9jYXRpb24sRWI9bi5ub3coKSxGYj0vXD8vLEdiPS8oLCl8KFxbfHspfCh9fF0pfCIoPzpbXiJcXFxyXG5dfFxcWyJcXFwvYmZucnRdfFxcdVtcZGEtZkEtRl17NH0pKiJccyo6P3x0cnVlfGZhbHNlfG51bGx8LT8oPyEwXGQpXGQrKD86XC5cZCt8KSg/OltlRV1bKy1dP1xkK3wpL2c7bi5wYXJzZUpTT049ZnVuY3Rpb24oYil7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKyIiKTt2YXIgYyxkPW51bGwsZT1uLnRyaW0oYisiIik7cmV0dXJuIGUmJiFuLnRyaW0oZS5yZXBsYWNlKEdiLGZ1bmN0aW9uKGEsYixlLGYpe3JldHVybiBjJiZiJiYoZD0wKSwwPT09ZD9hOihjPWV8fGIsZCs9IWYtIWUsIiIpfSkpP0Z1bmN0aW9uKCJyZXR1cm4gIitlKSgpOm4uZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0sbi5wYXJzZVhNTD1mdW5jdGlvbihiKXt2YXIgYyxkO2lmKCFifHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIG51bGw7dHJ5e2EuRE9NUGFyc2VyPyhkPW5ldyBhLkRPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bi5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIEhiPS8jLiokLyxJYj0vKFs/Jl0pXz1bXiZdKi8sSmI9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxLYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxMYj0vXig/OkdFVHxIRUFEKSQvLE1iPS9eXC9cLy8sTmI9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sT2I9e30sUGI9e30sUWI9IiovIi5jb25jYXQoIioiKSxSYj1EYi5ocmVmLFNiPU5iLmV4ZWMoUmIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIFRiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEcpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gVWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09UGI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBWYihhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZuLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gV2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gWGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6UmIsdHlwZToiR0VUIixpc0xvY2FsOktiLnRlc3QoU2JbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6UWIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6bi5wYXJzZUpTT04sInRleHQgeG1sIjpuLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9WYihWYihhLG4uYWpheFNldHRpbmdzKSxiKTpWYihuLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpUYihPYiksYWpheFRyYW5zcG9ydDpUYihQYiksYWpheDpmdW5jdGlvbihiLGMpeyJvYmplY3QiPT10eXBlb2YgYiYmKGM9YixiPXZvaWQgMCksYz1jfHx7fTt2YXIgZCxlLGYsZyxoLGksaixrLGw9bi5hamF4U2V0dXAoe30sYyksbT1sLmNvbnRleHR8fGwsbz1sLmNvbnRleHQmJihtLm5vZGVUeXBlfHxtLmpxdWVyeSk/bihtKTpuLmV2ZW50LHA9bi5EZWZlcnJlZCgpLHE9bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iikscj1sLnN0YXR1c0NvZGV8fHt9LHM9e30sdD17fSx1PTAsdj0iY2FuY2VsZWQiLHc9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dSl7aWYoIWspe2s9e307d2hpbGUoYj1KYi5leGVjKGcpKWtbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9a1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT11P2c6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdXx8KGE9dFtjXT10W2NdfHxhLHNbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdXx8KGwubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dSlmb3IoYiBpbiBhKXJbYl09W3JbYl0sYVtiXV07ZWxzZSB3LmFsd2F5cyhhW3cuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHY7cmV0dXJuIGomJmouYWJvcnQoYikseSgwLGIpLHRoaXN9fTtpZihwLnByb21pc2UodykuY29tcGxldGU9cS5hZGQsdy5zdWNjZXNzPXcuZG9uZSx3LmVycm9yPXcuZmFpbCxsLnVybD0oKGJ8fGwudXJsfHxSYikrIiIpLnJlcGxhY2UoSGIsIiIpLnJlcGxhY2UoTWIsU2JbMV0rIi8vIiksbC50eXBlPWMubWV0aG9kfHxjLnR5cGV8fGwubWV0aG9kfHxsLnR5cGUsbC5kYXRhVHlwZXM9bi50cmltKGwuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChHKXx8WyIiXSxudWxsPT1sLmNyb3NzRG9tYWluJiYoZD1OYi5leGVjKGwudXJsLnRvTG93ZXJDYXNlKCkpLGwuY3Jvc3NEb21haW49ISghZHx8ZFsxXT09PVNiWzFdJiZkWzJdPT09U2JbMl0mJihkWzNdfHwoImh0dHA6Ij09PWRbMV0/IjgwIjoiNDQzIikpPT09KFNiWzNdfHwoImh0dHA6Ij09PVNiWzFdPyI4MCI6IjQ0MyIpKSkpLGwuZGF0YSYmbC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBsLmRhdGEmJihsLmRhdGE9bi5wYXJhbShsLmRhdGEsbC50cmFkaXRpb25hbCkpLFViKE9iLGwsYyx3KSwyPT09dSlyZXR1cm4gdztpPW4uZXZlbnQmJmwuZ2xvYmFsLGkmJjA9PT1uLmFjdGl2ZSsrJiZuLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGwudHlwZT1sLnR5cGUudG9VcHBlckNhc2UoKSxsLmhhc0NvbnRlbnQ9IUxiLnRlc3QobC50eXBlKSxmPWwudXJsLGwuaGFzQ29udGVudHx8KGwuZGF0YSYmKGY9bC51cmwrPShGYi50ZXN0KGYpPyImIjoiPyIpK2wuZGF0YSxkZWxldGUgbC5kYXRhKSxsLmNhY2hlPT09ITEmJihsLnVybD1JYi50ZXN0KGYpP2YucmVwbGFjZShJYiwiJDFfPSIrRWIrKyk6ZisoRmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK0ViKyspKSxsLmlmTW9kaWZpZWQmJihuLmxhc3RNb2RpZmllZFtmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsbi5sYXN0TW9kaWZpZWRbZl0pLG4uZXRhZ1tmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixuLmV0YWdbZl0pKSwobC5kYXRhJiZsLmhhc0NvbnRlbnQmJmwuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJncuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixsLmNvbnRlbnRUeXBlKSx3LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsbC5kYXRhVHlwZXNbMF0mJmwuYWNjZXB0c1tsLmRhdGFUeXBlc1swXV0/bC5hY2NlcHRzW2wuZGF0YVR5cGVzWzBdXSsoIioiIT09bC5kYXRhVHlwZXNbMF0/IiwgIitRYisiOyBxPTAuMDEiOiIiKTpsLmFjY2VwdHNbIioiXSk7Zm9yKGUgaW4gbC5oZWFkZXJzKXcuc2V0UmVxdWVzdEhlYWRlcihlLGwuaGVhZGVyc1tlXSk7aWYobC5iZWZvcmVTZW5kJiYobC5iZWZvcmVTZW5kLmNhbGwobSx3LGwpPT09ITF8fDI9PT11KSlyZXR1cm4gdy5hYm9ydCgpO3Y9ImFib3J0Ijtmb3IoZSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl3W2VdKGxbZV0pO2lmKGo9VWIoUGIsbCxjLHcpKXtpZih3LnJlYWR5U3RhdGU9MSxpJiZvLnRyaWdnZXIoImFqYXhTZW5kIixbdyxsXSksMj09PXUpcmV0dXJuIHc7bC5hc3luYyYmbC50aW1lb3V0PjAmJihoPWEuc2V0VGltZW91dChmdW5jdGlvbigpe3cuYWJvcnQoInRpbWVvdXQiKX0sbC50aW1lb3V0KSk7dHJ5e3U9MSxqLnNlbmQocyx5KX1jYXRjaCh4KXtpZighKDI+dSkpdGhyb3cgeDt5KC0xLHgpfX1lbHNlIHkoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHkoYixjLGQsZSl7dmFyIGsscyx0LHYseCx5PWM7MiE9PXUmJih1PTIsaCYmYS5jbGVhclRpbWVvdXQoaCksaj12b2lkIDAsZz1lfHwiIix3LnJlYWR5U3RhdGU9Yj4wPzQ6MCxrPWI+PTIwMCYmMzAwPmJ8fDMwND09PWIsZCYmKHY9V2IobCx3LGQpKSx2PVhiKGwsdix3LGspLGs/KGwuaWZNb2RpZmllZCYmKHg9dy5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHgmJihuLmxhc3RNb2RpZmllZFtmXT14KSx4PXcuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx4JiYobi5ldGFnW2ZdPXgpKSwyMDQ9PT1ifHwiSEVBRCI9PT1sLnR5cGU/eT0ibm9jb250ZW50IjozMDQ9PT1iP3k9Im5vdG1vZGlmaWVkIjooeT12LnN0YXRlLHM9di5kYXRhLHQ9di5lcnJvcixrPSF0KSk6KHQ9eSwhYiYmeXx8KHk9ImVycm9yIiwwPmImJihiPTApKSksdy5zdGF0dXM9Yix3LnN0YXR1c1RleHQ9KGN8fHkpKyIiLGs/cC5yZXNvbHZlV2l0aChtLFtzLHksd10pOnAucmVqZWN0V2l0aChtLFt3LHksdF0pLHcuc3RhdHVzQ29kZShyKSxyPXZvaWQgMCxpJiZvLnRyaWdnZXIoaz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt3LGwsaz9zOnRdKSxxLmZpcmVXaXRoKG0sW3cseV0pLGkmJihvLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3csbF0pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB3fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG4uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe25bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG4uYWpheChuLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sbi5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksbi5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbi5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxuLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9bihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmMT09PWEuZmlyc3RDaGlsZC5ub2RlVHlwZSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiBuLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPW4odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe24ubm9kZU5hbWUodGhpcywiYm9keSIpfHxuKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KTtmdW5jdGlvbiBZYihhKXtyZXR1cm4gYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxuLmNzcyhhLCJkaXNwbGF5Iil9ZnVuY3Rpb24gWmIoYSl7aWYoIW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50fHxkLGEpKXJldHVybiEwO3doaWxlKGEmJjE9PT1hLm5vZGVUeXBlKXtpZigibm9uZSI9PT1ZYihhKXx8ImhpZGRlbiI9PT1hLnR5cGUpcmV0dXJuITA7YT1hLnBhcmVudE5vZGV9cmV0dXJuITF9bi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBsLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpP2Eub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wJiYhYS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aDpaYihhKX0sbi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbi5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgJGI9LyUyMC9nLF9iPS9cW1xdJC8sYWM9L1xyP1xuL2csYmM9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLGNjPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBkYyhhLGIsYyxkKXt2YXIgZTtpZihuLmlzQXJyYXkoYikpbi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxfYi50ZXN0KGEpP2QoYSxlKTpkYyhhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bi50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpZGMoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW4ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW4uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1uLmFqYXhTZXR0aW5ncyYmbi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG4uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFuLmlzUGxhaW5PYmplY3QoYSkpbi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlkYyhjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZSgkYiwiKyIpfSxuLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG4ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1uLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9uLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFuKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmY2MudGVzdCh0aGlzLm5vZGVOYW1lKSYmIWJjLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFaLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm4uaXNBcnJheShjKT9uLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYWMsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGFjLCJcclxuIil9fSkuZ2V0KCl9fSksbi5hamF4U2V0dGluZ3MueGhyPXZvaWQgMCE9PWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTG9jYWw/aWMoKTpkLmRvY3VtZW50TW9kZT44P2hjKCk6L14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmaGMoKXx8aWMoKX06aGM7dmFyIGVjPTAsZmM9e30sZ2M9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGZjKWZjW2FdKHZvaWQgMCwhMCl9KSxsLmNvcnM9ISFnYyYmIndpdGhDcmVkZW50aWFscyJpbiBnYyxnYz1sLmFqYXg9ISFnYyxnYyYmbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGIpe2lmKCFiLmNyb3NzRG9tYWlufHxsLmNvcnMpe3ZhciBjO3JldHVybntzZW5kOmZ1bmN0aW9uKGQsZSl7dmFyIGYsZz1iLnhocigpLGg9KytlYztpZihnLm9wZW4oYi50eXBlLGIudXJsLGIuYXN5bmMsYi51c2VybmFtZSxiLnBhc3N3b3JkKSxiLnhockZpZWxkcylmb3IoZiBpbiBiLnhockZpZWxkcylnW2ZdPWIueGhyRmllbGRzW2ZdO2IubWltZVR5cGUmJmcub3ZlcnJpZGVNaW1lVHlwZSYmZy5vdmVycmlkZU1pbWVUeXBlKGIubWltZVR5cGUpLGIuY3Jvc3NEb21haW58fGRbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGRbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZiBpbiBkKXZvaWQgMCE9PWRbZl0mJmcuc2V0UmVxdWVzdEhlYWRlcihmLGRbZl0rIiIpO2cuc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCksYz1mdW5jdGlvbihhLGQpe3ZhciBmLGksajtpZihjJiYoZHx8ND09PWcucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIGZjW2hdLGM9dm9pZCAwLGcub25yZWFkeXN0YXRlY2hhbmdlPW4ubm9vcCxkKTQhPT1nLnJlYWR5U3RhdGUmJmcuYWJvcnQoKTtlbHNle2o9e30sZj1nLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGcucmVzcG9uc2VUZXh0JiYoai50ZXh0PWcucmVzcG9uc2VUZXh0KTt0cnl7aT1nLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1mfHwhYi5pc0xvY2FsfHxiLmNyb3NzRG9tYWluPzEyMjM9PT1mJiYoZj0yMDQpOmY9ai50ZXh0PzIwMDo0MDR9aiYmZShmLGksaixnLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYi5hc3luYz80PT09Zy5yZWFkeVN0YXRlP2Euc2V0VGltZW91dChjKTpnLm9ucmVhZHlzdGF0ZWNoYW5nZT1mY1toXT1jOmMoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKHZvaWQgMCwhMCl9fX19KTtmdW5jdGlvbiBoYygpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBpYygpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fW4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPWQuaGVhZHx8bigiaGVhZCIpWzBdfHxkLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihlLGYpe2I9ZC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxmKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgamM9W10sa2M9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9amMucG9wKCl8fG4uZXhwYW5kbysiXyIrRWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGtjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYma2MudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGtjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPShGYi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1mP24oYSkucmVtb3ZlUHJvcChlKTphW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssamMucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fGQ7dmFyIGU9eC5leGVjKGEpLGY9IWMmJltdO3JldHVybiBlP1tiLmNyZWF0ZUVsZW1lbnQoZVsxXSldOihlPWphKFthXSxiLGYpLGYmJmYubGVuZ3RoJiZuKGYpLnJlbW92ZSgpLG4ubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9O3ZhciBsYz1uLmZuLmxvYWQ7bi5mbi5sb2FkPWZ1bmN0aW9uKGEsYixjKXtpZigic3RyaW5nIiE9dHlwZW9mIGEmJmxjKXJldHVybiBsYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGQsZSxmLGc9dGhpcyxoPWEuaW5kZXhPZigiICIpO3JldHVybiBoPi0xJiYoZD1uLnRyaW0oYS5zbGljZShoLGEubGVuZ3RoKSksYT1hLnNsaWNlKDAsaCkpLG4uaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmbi5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP24oIjxkaXY+IikuYXBwZW5kKG4ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sbi5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ3JlcChuLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07ZnVuY3Rpb24gbWMoYSl7cmV0dXJuIG4uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1uLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW4uY3NzKGEsInBvc2l0aW9uIiksbD1uKGEpLG09e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1uLmNzcyhhLCJ0b3AiKSxpPW4uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZuLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLG4uZXh0ZW5kKHt9LGgpKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixlKT8oInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1tYyhmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bi5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbi5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1uLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bi5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3Atbi5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW4uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYhbi5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bi5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxRYX0pfX0pLG4uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO24uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9bWMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bihmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bihmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT1VYShsLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1TYShhLGIpLE9hLnRlc3QoYyk/bihhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxuLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe24uZWFjaCh7CnBhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bi5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG4uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bi5jc3MoYixjLGcpOm4uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbi5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfX0pLG4uZm4uc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sbi5mbi5hbmRTZWxmPW4uZm4uYWRkQmFjaywiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBuYz1hLmpRdWVyeSxvYz1hLiQ7cmV0dXJuIG4ubm9Db25mbGljdD1mdW5jdGlvbihiKXtyZXR1cm4gYS4kPT09biYmKGEuJD1vYyksYiYmYS5qUXVlcnk9PT1uJiYoYS5qUXVlcnk9bmMpLG59LGJ8fChhLmpRdWVyeT1hLiQ9biksbn0pOwo="></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewoKLy8gc29tZSBoZWxwZXIgZnVuY3Rpb25zOiB1c2luZyBhIGdsb2JhbCBvYmplY3QgRFRXaWRnZXQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZAovLyBpbiBKUygpIGNvZGUsIGUuZy4gZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KGZvbyA9IEpTKCdjb2RlJykpKTsgdW5saWtlIFIncwovLyBkeW5hbWljIHNjb3BpbmcsIHdoZW4gJ2NvZGUnIGlzIGV2YWwoKSdlZCwgSmF2YVNjcmlwdCBkb2VzIG5vdCBrbm93IG9iamVjdHMKLy8gZnJvbSB0aGUgInBhcmVudCBmcmFtZSIsIGUuZy4gSlMoJ0RUV2lkZ2V0Jykgd2lsbCBub3Qgd29yayB1bmxlc3MgaXQgd2FzIG1hZGUKLy8gYSBnbG9iYWwgb2JqZWN0CnZhciBEVFdpZGdldCA9IHt9OwoKRFRXaWRnZXQuZm9ybWF0Q3VycmVuY3kgPSBmdW5jdGlvbih0aGl6LCByb3csIGRhdGEsIGNvbCwgY3VycmVuY3ksIGRpZ2l0cywgaW50ZXJ2YWwsIG1hcmssIGRlY01hcmssIGJlZm9yZSkgewogIHZhciBkID0gcGFyc2VGbG9hdChkYXRhW2NvbF0pOwogIGlmIChpc05hTihkKSkgcmV0dXJuOwogIC8vIDEyMzQ1NjY2Ni43ODkwIC0+IDEyMyw0NTYsNjY2Ljc4OTAKICB2YXIgbWFya0ludGVydmFsID0gZnVuY3Rpb24oeCwgaW50ZXJ2YWwsIG1hcmspIHsKICAgIGlmICghL14tP1tcZC5dKyQvLnRlc3QoeCkpIHJldHVybiB4OwogICAgdmFyIHh2ID0geC5zcGxpdCgnLicpOwogICAgaWYgKHh2Lmxlbmd0aCA+IDIpIHJldHVybiB4OyAgLy8gc2hvdWxkIGhhdmUgYXQgbW9zdCBvbmUgZGVjaW1hbCBwb2ludAogICAgeHZbMF0gPSB4dlswXS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcQig/PShcXGR7JyArIGludGVydmFsICsgJ30pKyg/IVxcZCkpJywgJ2cnKSwgbWFyayk7CiAgICByZXR1cm4geHYuam9pbihkZWNNYXJrKTsKICB9OwogIGQgPSBkLnRvRml4ZWQoZGlnaXRzKTsKICB2YXIgcmVzID0gbWFya0ludGVydmFsKGQsIGludGVydmFsLCBtYXJrKTsKICByZXMgPSBiZWZvcmUgPyAoL14tLy50ZXN0KHJlcykgPyAnLScgKyBjdXJyZW5jeSArIHJlcy5yZXBsYWNlKC9eLS8sICcnKSA6IGN1cnJlbmN5ICsgcmVzKSA6CiAgICByZXMgKyBjdXJyZW5jeTsKICAkKHRoaXouYXBpKCkuY2VsbChyb3csIGNvbCkubm9kZSgpKS5odG1sKHJlcyk7Cn07CgpEVFdpZGdldC5mb3JtYXRTdHJpbmcgPSBmdW5jdGlvbih0aGl6LCByb3csIGRhdGEsIGNvbCwgcHJlZml4LCBzdWZmaXgpIHsKICB2YXIgZCA9IGRhdGFbY29sXTsKICBpZiAoZCA9PT0gbnVsbCkgcmV0dXJuOwogICQodGhpei5hcGkoKS5jZWxsKHJvdywgY29sKS5ub2RlKCkpLmh0bWwocHJlZml4ICsgZCArIHN1ZmZpeCk7Cn07CgpEVFdpZGdldC5mb3JtYXRQZXJjZW50YWdlID0gZnVuY3Rpb24odGhpeiwgcm93LCBkYXRhLCBjb2wsIGRpZ2l0cykgewogIHZhciBkID0gcGFyc2VGbG9hdChkYXRhW2NvbF0pOwogIGlmIChpc05hTihkKSkgcmV0dXJuOwogICQodGhpei5hcGkoKS5jZWxsKHJvdywgY29sKS5ub2RlKCkpLmh0bWwoKGQgKiAxMDApLnRvRml4ZWQoZGlnaXRzKSArICclJyk7Cn07CgpEVFdpZGdldC5mb3JtYXRSb3VuZCA9IGZ1bmN0aW9uKHRoaXosIHJvdywgZGF0YSwgY29sLCBkaWdpdHMpIHsKICB2YXIgZCA9IHBhcnNlRmxvYXQoZGF0YVtjb2xdKTsKICBpZiAoaXNOYU4oZCkpIHJldHVybjsKICAkKHRoaXouYXBpKCkuY2VsbChyb3csIGNvbCkubm9kZSgpKS5odG1sKGQudG9GaXhlZChkaWdpdHMpKTsKfTsKCkRUV2lkZ2V0LmZvcm1hdFNpZ25pZiA9IGZ1bmN0aW9uKHRoaXosIHJvdywgZGF0YSwgY29sLCBkaWdpdHMpIHsKICB2YXIgZCA9IHBhcnNlRmxvYXQoZGF0YVtjb2xdKTsKICBpZiAoaXNOYU4oZCkpIHJldHVybjsKICAkKHRoaXouYXBpKCkuY2VsbChyb3csIGNvbCkubm9kZSgpKS5odG1sKGQudG9QcmVjaXNpb24oZGlnaXRzKSk7Cn07CgpEVFdpZGdldC5mb3JtYXREYXRlID0gZnVuY3Rpb24odGhpeiwgcm93LCBkYXRhLCBjb2wsIG1ldGhvZCkgewogIHZhciBkID0gZGF0YVtjb2xdOwogIGlmIChkID09PSBudWxsKSByZXR1cm47CiAgZCA9IG5ldyBEYXRlKGQpOwogICQodGhpei5hcGkoKS5jZWxsKHJvdywgY29sKS5ub2RlKCkpLmh0bWwoZFttZXRob2RdKCkpOwp9OwoKd2luZG93LkRUV2lkZ2V0ID0gRFRXaWRnZXQ7Cgp2YXIgdHJhbnNwb3NlQXJyYXkyRCA9IGZ1bmN0aW9uKGEpIHsKICByZXR1cm4gYS5sZW5ndGggPT09IDAgPyBhIDogSFRNTFdpZGdldHMudHJhbnNwb3NlQXJyYXkyRChhKTsKfTsKCkhUTUxXaWRnZXRzLndpZGdldCh7CiAgbmFtZTogImRhdGF0YWJsZXMiLAogIHR5cGU6ICJvdXRwdXQiLAogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAkKGVsKS5odG1sKCcmbmJzcDsnKTsKICAgIHJldHVybiB7IGRhdGE6IG51bGwgfTsKICB9LAogIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgZGF0YSwgaW5zdGFuY2UpIHsKICAgIGlmIChlbC5vZmZzZXRXaWR0aCA9PT0gMCB8fCBlbC5vZmZzZXRIZWlnaHQgPT09IDApIHsKICAgICAgaW5zdGFuY2UuZGF0YSA9IGRhdGE7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGluc3RhbmNlLmRhdGEgPSBudWxsOwogICAgdmFyICRlbCA9ICQoZWwpOwogICAgJGVsLmVtcHR5KCk7CgogICAgaWYgKGRhdGEgPT09IG51bGwpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIElmIHdlIGFyZSBpbiBhIGZsZXhkYXNoYm9hcmQgc2Nyb2xsIGxheW91dCB0aGVuIHdlOgogICAgLy8gIChhKSBBbHdheXMgd2FudCB0byB1c2UgcGFnaW5hdGlvbiAob3RoZXJ3aXNlIHdlJ2xsIGhhdmUKICAgIC8vICAgICAgYSAiZG91YmxlIHNjcm9sbCBiYXIiIGVmZmVjdCBvbiB0aGUgcGhvbmUpOyBhbmQKICAgIC8vICAoYikgTmV2ZXIgd2FudCB0byBmaWxsIHRoZSBjb250YWluZXIgKHdlIHdhbnQgdGhlIHBhZ2luYXRpb24KICAgIC8vICAgICAgbGV2ZWwgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIpCiAgICBpZiAod2luZG93LkZsZXhEYXNoYm9hcmQgJiYgIXdpbmRvdy5GbGV4RGFzaGJvYXJkLmlzRmlsbFBhZ2UoKSkgewogICAgICBkYXRhLm9wdGlvbnMuYlBhZ2luYXRlID0gdHJ1ZTsKICAgICAgZGF0YS5maWxsQ29udGFpbmVyID0gZmFsc2U7CiAgICB9CgogICAgLy8gaWYgd2UgYXJlIGluIHRoZSB2aWV3ZXIgdGhlbiB3ZSBhbHdheXMgd2FudCB0byBmaWxsQ29udGFpbmVyIGFuZAogICAgLy8gYW5kIGF1dG9IaWRlTmF2aWdhdGlvbiAodW5sZXNzIHRoZSB1c2VyIGhhcyBleHBsaWNpdGx5IHNldCB0aGVzZSkKICAgIGlmICh3aW5kb3cuSFRNTFdpZGdldHMudmlld2VyTW9kZSkgewogICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoImZpbGxDb250YWluZXIiKSkKICAgICAgICBkYXRhLmZpbGxDb250YWluZXIgPSB0cnVlOwogICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoImF1dG9IaWRlTmF2aWdhdGlvbiIpKQogICAgICAgIGRhdGEuYXV0b0hpZGVOYXZpZ2F0aW9uID0gdHJ1ZTsKICAgIH0KCiAgICAvLyBwcm9wYWdhdGUgZmlsbENvbnRhaW5lciB0byBpbnN0YW5jZSAoc28gd2UgaGF2ZSBpdCBpbiByZXNpemUpCiAgICBpbnN0YW5jZS5maWxsQ29udGFpbmVyID0gZGF0YS5maWxsQ29udGFpbmVyOwoKICAgIHZhciBjZWxscyA9IGRhdGEuZGF0YTsKCiAgICBpZiAoY2VsbHMgaW5zdGFuY2VvZiBBcnJheSkgY2VsbHMgPSB0cmFuc3Bvc2VBcnJheTJEKGNlbGxzKTsKCiAgICAkZWwuYXBwZW5kKGRhdGEuY29udGFpbmVyKTsKICAgIHZhciAkdGFibGUgPSAkZWwuZmluZCgndGFibGUnKTsKICAgIGlmIChkYXRhLmNsYXNzKSAkdGFibGUuYWRkQ2xhc3MoZGF0YS5jbGFzcyk7CiAgICBpZiAoZGF0YS5jYXB0aW9uKSAkdGFibGUucHJlcGVuZChkYXRhLmNhcHRpb24pOwoKICAgIGlmIChIVE1MV2lkZ2V0cy5zaGlueU1vZGUgJiYgZGF0YS5zZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnICYmCiAgICAgICAgZGF0YS5zZWxlY3Rpb24udGFyZ2V0ID09PSAncm93K2NvbHVtbicpIHsKICAgICAgaWYgKCR0YWJsZS5jaGlsZHJlbigndGZvb3QnKS5sZW5ndGggPT09IDApIHsKICAgICAgICAkdGFibGUuYXBwZW5kKCQoJzx0Zm9vdD4nKSk7CiAgICAgICAgJHRhYmxlLmZpbmQoJ3RoZWFkIHRyJykuY2xvbmUoKS5hcHBlbmRUbygkdGFibGUuZmluZCgndGZvb3QnKSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBjb2x1bW4gZmlsdGVycwogICAgdmFyIGZpbHRlclJvdzsKICAgIHN3aXRjaCAoZGF0YS5maWx0ZXIpIHsKICAgICAgY2FzZSAndG9wJzoKICAgICAgICAkdGFibGUuY2hpbGRyZW4oJ3RoZWFkJykuYXBwZW5kKGRhdGEuZmlsdGVySFRNTCk7CiAgICAgICAgZmlsdGVyUm93ID0gJHRhYmxlLmZpbmQoJ3RoZWFkIHRyOmxhc3QgdGQnKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnYm90dG9tJzoKICAgICAgICBpZiAoJHRhYmxlLmNoaWxkcmVuKCd0Zm9vdCcpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgJHRhYmxlLmFwcGVuZCgkKCc8dGZvb3Q+JykpOwogICAgICAgIH0KICAgICAgICAkdGFibGUuY2hpbGRyZW4oJ3Rmb290JykucHJlcGVuZChkYXRhLmZpbHRlckhUTUwpOwogICAgICAgIGZpbHRlclJvdyA9ICR0YWJsZS5maW5kKCd0Zm9vdCB0cjpmaXJzdCB0ZCcpOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHZhciBvcHRpb25zID0geyBzZWFyY2hEZWxheTogMTAwMCB9OwogICAgaWYgKGNlbGxzICE9PSBudWxsKSAkLmV4dGVuZChvcHRpb25zLCB7CiAgICAgIGRhdGE6IGNlbGxzCiAgICB9KTsKCiAgICAvLyBvcHRpb25zIGZvciBmaWxsQ29udGFpbmVyCiAgICB2YXIgYm9vdHN0cmFwQWN0aXZlID0gdHlwZW9mKCQuZm4ucG9wb3ZlcikgIT0gJ3VuZGVmaW5lZCc7CiAgICBpZiAoaW5zdGFuY2UuZmlsbENvbnRhaW5lcikgewoKICAgICAgLy8gZm9yY2Ugc2Nyb2xsWC9zY3JvbGxZIGFuZCB0dXJuIG9mZiBhdXRvV2lkdGgKICAgICAgb3B0aW9ucy5zY3JvbGxYID0gdHJ1ZTsKICAgICAgb3B0aW9ucy5zY3JvbGxZID0gIjEwMHB4IjsgLy8gY2FuIGJlIGFueSB2YWx1ZSwgd2UnbGwgYWRqdXN0IGJlbG93CgogICAgICAvLyBpZiB3ZSBhcmVuJ3QgcGFnaW5hdGluZyB0aGVuIG1vdmUgYXJvdW5kIHRoZSBpbmZvL2ZpbHRlciBjb250cm9scwogICAgICAvLyB0byBzYXZlIHNwYWNlIGF0IHRoZSBib3R0b20gYW5kIHJlcGhyYXNlIHRoZSBpbmZvIGNhbGxiYWNrCiAgICAgIGlmIChkYXRhLm9wdGlvbnMuYlBhZ2luYXRlID09PSBmYWxzZSkgewoKICAgICAgICAvLyB3ZSBrbm93IGhvdyB0byBkbyB0aGlzIGNsZWFubHkgZm9yIGJvb3RzdHJhcCwgbm90IHNvIG11Y2gKICAgICAgICAvLyBmb3Igb3RoZXIgdGhlbWVzL2xheW91dHMKICAgICAgICBpZiAoYm9vdHN0cmFwQWN0aXZlKSB7CiAgICAgICAgICBvcHRpb25zLmRvbSA9ICI8J3Jvdyc8J2NvbC1zbS00J2k+PCdjb2wtc20tOCdmPj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgIjwncm93JzwnY29sLXNtLTEyJ3RyPj4iOwogICAgICAgIH0KCiAgICAgICAgb3B0aW9ucy5mbkluZm9DYWxsYmFjayA9IGZ1bmN0aW9uKG9TZXR0aW5ncywgaVN0YXJ0LCBpRW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1heCwgaVRvdGFsLCBzUHJlKSB7CiAgICAgICAgICByZXR1cm4gTnVtYmVyKGlUb3RhbCkudG9Mb2NhbGVTdHJpbmcoKSArICIgcmVjb3JkcyI7CiAgICAgICAgfTsKICAgICAgfQogICAgfQoKICAgIC8vIGF1dG8gaGlkZSBuYXZpZ2F0aW9uIGlmIHJlcXVlc3RlZAogICAgaWYgKGRhdGEuYXV0b0hpZGVOYXZpZ2F0aW9uID09PSB0cnVlKSB7CiAgICAgIGlmIChib290c3RyYXBBY3RpdmUgJiYgZGF0YS5vcHRpb25zLmJQYWdpbmF0ZSAhPT0gZmFsc2UpIHsKICAgICAgICAvLyBzdHJpcCBhbGwgbmF2IGlmIGxlbmd0aCA+PSBjZWxscwogICAgICAgIGlmICgoY2VsbHMgaW5zdGFuY2VvZiBBcnJheSkgJiYgZGF0YS5vcHRpb25zLmlEaXNwbGF5TGVuZ3RoID49IGNlbGxzLmxlbmd0aCkKICAgICAgICAgIG9wdGlvbnMuZG9tID0gIjwncm93JzwnY29sLXNtLTEyJ3RyPj4iOwogICAgICAgIC8vIGFsdGVybmF0aXZlbHkgbGVhbiB0aGluZ3Mgb3V0IGZvciBmbGV4ZGFzaGJvYXJkIG1vYmlsZSBwb3J0cmFpdAogICAgICAgIGVsc2UgaWYgKHdpbmRvdy5GbGV4RGFzaGJvYXJkICYmIHdpbmRvdy5GbGV4RGFzaGJvYXJkLmlzTW9iaWxlUGhvbmUoKSkKICAgICAgICAgIG9wdGlvbnMuZG9tID0gIjwncm93JzwnY29sLXNtLTEyJ2Y+PiIgKwogICAgICAgICAgICAgICAgICAgICAgICAiPCdyb3cnPCdjb2wtc20tMTIndHI+PiIgICsKICAgICAgICAgICAgICAgICAgICAgICAgIjwncm93JzwnY29sLXNtLTEyJ3A+PiI7CiAgICAgIH0KICAgIH0KCiAgICAkLmV4dGVuZCh0cnVlLCBvcHRpb25zLCBkYXRhLm9wdGlvbnMgfHwge30pOwoKICAgIHZhciBzZWFyY2hDb2xzID0gb3B0aW9ucy5zZWFyY2hDb2xzOwogICAgaWYgKHNlYXJjaENvbHMpIHsKICAgICAgc2VhcmNoQ29scyA9IHNlYXJjaENvbHMubWFwKGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4geCA9PT0gbnVsbCA/ICcnIDogeC5zZWFyY2g7CiAgICAgIH0pOwogICAgICAvLyBGSVhNRTogdGhpcyBtZWFucyBJIGRvbid0IHJlc3BlY3QgdGhlIGVzY2FwZVJlZ2V4IHNldHRpbmcKICAgICAgZGVsZXRlIG9wdGlvbnMuc2VhcmNoQ29sczsKICAgIH0KCiAgICAvLyBzZXJ2ZXItc2lkZSBwcm9jZXNzaW5nPwogICAgdmFyIHNlcnZlciA9IG9wdGlvbnMuc2VydmVyU2lkZSA9PT0gdHJ1ZTsKCiAgICAvLyB1c2UgdGhlIGRhdGFTcmMgZnVuY3Rpb24gdG8gcHJlLXByb2Nlc3MgSlNPTiBkYXRhIHJldHVybmVkIGZyb20gUgogICAgdmFyIERUX3Jvd3NfYWxsID0gW10sIERUX3Jvd3NfY3VycmVudCA9IFtdOwogICAgaWYgKHNlcnZlciAmJiBIVE1MV2lkZ2V0cy5zaGlueU1vZGUgJiYgdHlwZW9mIG9wdGlvbnMuYWpheCA9PT0gJ29iamVjdCcgJiYKICAgICAgICAvXnNlc3Npb25cL1tcZGEtel0rXC9kYXRhb2JqLy50ZXN0KG9wdGlvbnMuYWpheC51cmwpICYmICFvcHRpb25zLmFqYXguZGF0YVNyYykgewogICAgICBvcHRpb25zLmFqYXguZGF0YVNyYyA9IGZ1bmN0aW9uKGpzb24pIHsKICAgICAgICBEVF9yb3dzX2FsbCA9ICQubWFrZUFycmF5KGpzb24uRFRfcm93c19hbGwpOwogICAgICAgIERUX3Jvd3NfY3VycmVudCA9ICQubWFrZUFycmF5KGpzb24uRFRfcm93c19jdXJyZW50KTsKICAgICAgICByZXR1cm4ganNvbi5kYXRhOwogICAgICB9OwogICAgfQoKICAgIHZhciB0YWJsZSA9ICR0YWJsZS5EYXRhVGFibGUob3B0aW9ucyk7CiAgICAkZWwuZGF0YSgnZGF0YXRhYmxlJywgdGFibGUpOwoKICAgIHZhciBpbkFycmF5ID0gZnVuY3Rpb24odmFsLCBhcnJheSkgewogICAgICByZXR1cm4gJC5pbkFycmF5KHZhbCwgJC5tYWtlQXJyYXkoYXJyYXkpKSA+IC0xOwogICAgfTsKCiAgICAvLyBlbmNvZGUgKyB0byAlMkIgd2hlbiBzZWFyY2hpbmcgaW4gdGhlIHRhYmxlIG9uIHNlcnZlciBzaWRlLCBiZWNhdXNlCiAgICAvLyBzaGlueTo6cGFyc2VRdWVyeVN0cmluZygpIHRyZWF0cyArIGFzIHNwYWNlcywgYW5kIERhdGFUYWJsZXMgZG9lcyBub3QKICAgIC8vIGVuY29kZSArIHRvICUyQiAob3IgJSB0byAlMjUpIHdoZW4gc2VuZGluZyB0aGUgcmVxdWVzdAogICAgdmFyIGVuY29kZV9wbHVzID0gZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4gc2VydmVyID8geC5yZXBsYWNlKC8lL2csICclMjUnKS5yZXBsYWNlKC9cKy9nLCAnJTJCJykgOiB4OwogICAgfTsKCiAgICBpZiAoZGF0YS5maWx0ZXIgIT09ICdub25lJykgewoKICAgICAgZmlsdGVyUm93LmVhY2goZnVuY3Rpb24oaSwgdGQpIHsKCiAgICAgICAgdmFyICR0ZCA9ICQodGQpLCB0eXBlID0gJHRkLmRhdGEoJ3R5cGUnKSwgZmlsdGVyOwogICAgICAgIHZhciAkaW5wdXQgPSAkdGQuY2hpbGRyZW4oJ2RpdicpLmZpcnN0KCkuY2hpbGRyZW4oJ2lucHV0Jyk7CiAgICAgICAgJGlucHV0LnByb3AoJ2Rpc2FibGVkJywgIXRhYmxlLnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW2ldLmJTZWFyY2hhYmxlIHx8IHR5cGUgPT09ICdkaXNhYmxlZCcpOwogICAgICAgICRpbnB1dC5vbignaW5wdXQgYmx1cicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgJGlucHV0Lm5leHQoJ3NwYW4nKS50b2dnbGUoQm9vbGVhbigkaW5wdXQudmFsKCkpKTsKICAgICAgICB9KTsKICAgICAgICAvLyBCb290c3RyYXAgc2V0cyBwb2ludGVyLWV2ZW50cyB0byBub25lIGFuZCB3ZSB3b24ndCBiZSBhYmxlIHRvIGNsaWNrCiAgICAgICAgLy8gdGhlIGNsZWFyIGJ1dHRvbgogICAgICAgICRpbnB1dC5uZXh0KCdzcGFuJykuY3NzKCdwb2ludGVyLWV2ZW50cycsICdhdXRvJykuaGlkZSgpLmNsaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgJCh0aGlzKS5oaWRlKCkucHJldignaW5wdXQnKS52YWwoJycpLnRyaWdnZXIoJ2lucHV0JykuZm9jdXMoKTsKICAgICAgICB9KTsKICAgICAgICB2YXIgc2VhcmNoQ29sOyAgLy8gc2VhcmNoIHN0cmluZyBmb3IgdGhpcyBjb2x1bW4KICAgICAgICBpZiAoc2VhcmNoQ29scyAmJiBzZWFyY2hDb2xzW2ldKSB7CiAgICAgICAgICBzZWFyY2hDb2wgPSBzZWFyY2hDb2xzW2ldOwogICAgICAgICAgJGlucHV0LnZhbChzZWFyY2hDb2wpLnRyaWdnZXIoJ2lucHV0Jyk7CiAgICAgICAgfQogICAgICAgIHZhciAkeCA9ICR0ZC5jaGlsZHJlbignZGl2JykubGFzdCgpOwoKICAgICAgICAvLyByZW1vdmUgdGhlIG92ZXJmbG93OiBoaWRkZW4gYXR0cmlidXRlIG9mIHRoZSBzY3JvbGxIZWFkCiAgICAgICAgLy8gKG90aGVyd2lzZSB0aGUgc2Nyb2xsaW5nIHRhYmxlIGJvZHkgb2JzY3VyZXMgdGhlIGZpbHRlcnMpCiAgICAgICAgdmFyIHNjcm9sbEhlYWQgPSAkKGVsKS5maW5kKCcuZGF0YVRhYmxlc19zY3JvbGxIZWFkLC5kYXRhVGFibGVzX3Njcm9sbEZvb3QnKTsKICAgICAgICB2YXIgY3NzT3ZlcmZsb3cgPSBzY3JvbGxIZWFkLmNzcygnb3ZlcmZsb3cnKTsKICAgICAgICBpZiAoY3NzT3ZlcmZsb3cgPT09ICdoaWRkZW4nKSB7CiAgICAgICAgICAkeC5vbignc2hvdyBoaWRlJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBzY3JvbGxIZWFkLmNzcygnb3ZlcmZsb3cnLCBlLnR5cGUgPT09ICdzaG93JyA/ICcnIDogY3NzT3ZlcmZsb3cpOwogICAgICAgICAgfSk7CiAgICAgICAgICAkeC5jc3MoJ3otaW5kZXgnLCAyNSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaW5BcnJheSh0eXBlLCBbJ2ZhY3RvcicsICdsb2dpY2FsJ10pKSB7CiAgICAgICAgICAkaW5wdXQub24oewogICAgICAgICAgICBjbGljazogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgJGlucHV0LnBhcmVudCgpLmhpZGUoKTsgJHguc2hvdygpLnRyaWdnZXIoJ3Nob3cnKTsgZmlsdGVyWzBdLnNlbGVjdGl6ZS5mb2N1cygpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgaWYgKCRpbnB1dC52YWwoKSA9PT0gJycpIGZpbHRlclswXS5zZWxlY3RpemUuc2V0VmFsdWUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIHZhciAkaW5wdXQyID0gJHguY2hpbGRyZW4oJ3NlbGVjdCcpOwogICAgICAgICAgZmlsdGVyID0gJGlucHV0Mi5zZWxlY3RpemUoewogICAgICAgICAgICBvcHRpb25zOiAkaW5wdXQyLmRhdGEoJ29wdGlvbnMnKS5tYXAoZnVuY3Rpb24odiwgaSkgewogICAgICAgICAgICAgIHJldHVybiAoe3RleHQ6IHYsIHZhbHVlOiB2fSk7CiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBwbHVnaW5zOiBbJ3JlbW92ZV9idXR0b24nXSwKICAgICAgICAgICAgaGlkZVNlbGVjdGVkOiB0cnVlLAogICAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHZhbHVlID0gW107IC8vIGNvbXBhdGliaWxpdHkgd2l0aCBqUXVlcnkgMy4wCiAgICAgICAgICAgICAgJGlucHV0LnZhbCh2YWx1ZS5sZW5ndGggPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiAnJyk7CiAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCkgJGlucHV0LnRyaWdnZXIoJ2lucHV0Jyk7CiAgICAgICAgICAgICAgJGlucHV0LmF0dHIoJ3RpdGxlJywgJGlucHV0LnZhbCgpKTsKICAgICAgICAgICAgICBpZiAoc2VydmVyKSB7CiAgICAgICAgICAgICAgICB0YWJsZS5jb2x1bW4oaSkuc2VhcmNoKHZhbHVlLmxlbmd0aCA/IGVuY29kZV9wbHVzKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgOiAnJykuZHJhdygpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyB0dXJuIG9mZiBmaWx0ZXIgaWYgbm90aGluZyBzZWxlY3RlZAogICAgICAgICAgICAgICR0ZC5kYXRhKCdmaWx0ZXInLCB2YWx1ZS5sZW5ndGggPiAwKTsKICAgICAgICAgICAgICB0YWJsZS5kcmF3KCk7ICAvLyByZWRyYXcgdGFibGUsIGFuZCBmaWx0ZXJzIHdpbGwgYmUgYXBwbGllZAogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmIChzZWFyY2hDb2wpIGZpbHRlclswXS5zZWxlY3RpemUuc2V0VmFsdWUoSlNPTi5wYXJzZShzZWFyY2hDb2wpKTsKICAgICAgICAgIC8vIGFuIHVnbHkgaGFjayB0byBkZWFsIHdpdGggc2hpbnk6IGZvciBzb21lIHJlYXNvbiwgdGhlIG9uQmx1ciBldmVudAogICAgICAgICAgLy8gb2Ygc2VsZWN0aXplIGRvZXMgbm90IHdvcmsgaW4gc2hpbnkKICAgICAgICAgICR4LmZpbmQoJ2RpdiA+IGRpdi5zZWxlY3RpemUtaW5wdXQgPiBpbnB1dCcpLm9uKCdibHVyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICR4LmhpZGUoKS50cmlnZ2VyKCdoaWRlJyk7ICRpbnB1dC5wYXJlbnQoKS5zaG93KCk7ICRpbnB1dC50cmlnZ2VyKCdibHVyJyk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGZpbHRlci5uZXh0KCdkaXYnKS5jc3MoJ21hcmdpbi1ib3R0b20nLCAnYXV0bycpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NoYXJhY3RlcicpIHsKICAgICAgICAgIHZhciBmdW4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHJlZ2V4ID0gZmFsc2UsIGNpID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2VhcmNoKSB7CiAgICAgICAgICAgICAgcmVnZXggPSBvcHRpb25zLnNlYXJjaC5yZWdleCwKICAgICAgICAgICAgICBjaSA9IG9wdGlvbnMuc2VhcmNoLmNhc2VJbnNlbnNpdGl2ZSAhPT0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFibGUuY29sdW1uKGkpLnNlYXJjaChlbmNvZGVfcGx1cygkaW5wdXQudmFsKCkpLCByZWdleCwgIXJlZ2V4LCBjaSkuZHJhdygpOwogICAgICAgICAgfTsKICAgICAgICAgIGlmIChzZXJ2ZXIpIHsKICAgICAgICAgICAgZnVuID0gJC5mbi5kYXRhVGFibGUudXRpbC50aHJvdHRsZShmdW4sIG9wdGlvbnMuc2VhcmNoRGVsYXkpOwogICAgICAgICAgfQogICAgICAgICAgJGlucHV0Lm9uKCdpbnB1dCcsIGZ1bik7CiAgICAgICAgfSBlbHNlIGlmIChpbkFycmF5KHR5cGUsIFsnbnVtYmVyJywgJ2ludGVnZXInLCAnZGF0ZScsICd0aW1lJ10pKSB7CiAgICAgICAgICB2YXIgJHgwID0gJHg7CiAgICAgICAgICAkeCA9ICR4MC5jaGlsZHJlbignZGl2JykuZmlyc3QoKTsKICAgICAgICAgICR4MC5jc3MoewogICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjZmZmJywKICAgICAgICAgICAgJ2JvcmRlcic6ICcxcHggI2RkZCBzb2xpZCcsCiAgICAgICAgICAgICdib3JkZXItcmFkaXVzJzogJzRweCcsCiAgICAgICAgICAgICdwYWRkaW5nJzogJzIwcHggMjBweCAxMHB4IDIwcHgnCiAgICAgICAgICB9KTsKICAgICAgICAgIHZhciAkc3BhbnMgPSAkeDAuY2hpbGRyZW4oJ3NwYW4nKS5jc3MoewogICAgICAgICAgICAnbWFyZ2luLXRvcCc6ICcxMHB4JywKICAgICAgICAgICAgJ3doaXRlLXNwYWNlJzogJ25vd3JhcCcKICAgICAgICAgIH0pOwogICAgICAgICAgdmFyICRzcGFuMSA9ICRzcGFucy5maXJzdCgpLCAkc3BhbjIgPSAkc3BhbnMubGFzdCgpOwogICAgICAgICAgdmFyIHIxID0gKyR4LmRhdGEoJ21pbicpLCByMiA9ICskeC5kYXRhKCdtYXgnKTsKICAgICAgICAgIC8vIHdoZW4gdGhlIG51bWJlcnMgYXJlIHRvbyBzbWFsbCBvciBoYXZlIG1hbnkgZGVjaW1hbCBwbGFjZXMsIHRoZQogICAgICAgICAgLy8gc2xpZGVyIG1heSBoYXZlIG51bWVyaWMgcHJlY2lzaW9uIHByb2JsZW1zICgjMTUwKQogICAgICAgICAgdmFyIHNjYWxlID0gTWF0aC5wb3coMTAsIE1hdGgubWF4KDAsICskeC5kYXRhKCdzY2FsZScpIHx8IDApKTsKICAgICAgICAgIHIxID0gTWF0aC5yb3VuZChyMSAqIHNjYWxlKTsgcjIgPSBNYXRoLnJvdW5kKHIyICogc2NhbGUpOwogICAgICAgICAgdmFyIHNjYWxlQmFjayA9IGZ1bmN0aW9uKHgsIHNjYWxlKSB7CiAgICAgICAgICAgIGlmIChzY2FsZSA9PT0gMSkgcmV0dXJuIHg7CiAgICAgICAgICAgIHZhciBkID0gTWF0aC5yb3VuZChNYXRoLmxvZyhzY2FsZSkgLyBNYXRoLmxvZygxMCkpOwogICAgICAgICAgICAvLyB0byBhdm9pZCBwcm9ibGVtcyBsaWtlIDMuNDIzLzEwMCAtPiAwLjAzNDIzMDAwMDAwMDAwMDAwMwogICAgICAgICAgICByZXR1cm4gKHggLyBzY2FsZSkudG9GaXhlZChkKTsKICAgICAgICAgIH07CiAgICAgICAgICAkaW5wdXQub24oewogICAgICAgICAgICBmb2N1czogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgJHgwLnNob3coKS50cmlnZ2VyKCdzaG93Jyk7CiAgICAgICAgICAgICAgLy8gZmlyc3QsIG1ha2Ugc3VyZSB0aGUgc2xpZGVyIGRpdiBsZWF2ZXMgYXQgbGVhc3QgMjBweCBiZXR3ZWVuCiAgICAgICAgICAgICAgLy8gdGhlIHR3byAoc2xpZGVyIHZhbHVlKSBzcGFuJ3MKICAgICAgICAgICAgICAkeDAud2lkdGgoTWF0aC5tYXgoMTYwLCAkc3BhbjEub3V0ZXJXaWR0aCgpICsgJHNwYW4yLm91dGVyV2lkdGgoKSArIDIwKSk7CiAgICAgICAgICAgICAgLy8gdGhlbiwgaWYgdGhlIGlucHV0IGlzIHJlYWxseSB3aWRlLCBtYWtlIHRoZSBzbGlkZXIgdGhlIHNhbWUKICAgICAgICAgICAgICAvLyB3aWR0aCBhcyB0aGUgaW5wdXQKICAgICAgICAgICAgICBpZiAoJHgwLm91dGVyV2lkdGgoKSA8ICRpbnB1dC5vdXRlcldpZHRoKCkpIHsKICAgICAgICAgICAgICAgICR4MC5vdXRlcldpZHRoKCRpbnB1dC5vdXRlcldpZHRoKCkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHNsaWRlciBkaXYgZG9lcyBub3QgcmVhY2ggYmV5b25kIHRoZSByaWdodCBtYXJnaW4KICAgICAgICAgICAgICBpZiAoJCh3aW5kb3cpLndpZHRoKCkgPCAkeDAub2Zmc2V0KCkubGVmdCArICR4MC53aWR0aCgpKSB7CiAgICAgICAgICAgICAgICAkeDAub2Zmc2V0KHsKICAgICAgICAgICAgICAgICAgJ2xlZnQnOiAkaW5wdXQub2Zmc2V0KCkubGVmdCArICRpbnB1dC5vdXRlcldpZHRoKCkgLSAkeDAub3V0ZXJXaWR0aCgpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGJsdXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICR4MC5oaWRlKCkudHJpZ2dlcignaGlkZScpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgaWYgKCRpbnB1dC52YWwoKSA9PT0gJycpIGZpbHRlci52YWwoW3IxLCByMl0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjaGFuZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHZhciB2ID0gJGlucHV0LnZhbCgpLnJlcGxhY2UoL1xzL2csICcnKTsKICAgICAgICAgICAgICBpZiAodiA9PT0gJycpIHJldHVybjsKICAgICAgICAgICAgICB2ID0gdi5zcGxpdCgnLi4uJyk7CiAgICAgICAgICAgICAgaWYgKHYubGVuZ3RoICE9PSAyKSB7CiAgICAgICAgICAgICAgICAkaW5wdXQucGFyZW50KCkuYWRkQ2xhc3MoJ2hhcy1lcnJvcicpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodlswXSA9PT0gJycpIHZbMF0gPSByMTsKICAgICAgICAgICAgICBpZiAodlsxXSA9PT0gJycpIHZbMV0gPSByMjsKICAgICAgICAgICAgICAkaW5wdXQucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ2hhcy1lcnJvcicpOwogICAgICAgICAgICAgIC8vIHRyZWF0IGRhdGUgYXMgVVRDIHRpbWUgYXQgbWlkbmlnaHQKICAgICAgICAgICAgICB2YXIgc3RyVGltZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgICAgIHZhciBzID0gdHlwZSA9PT0gJ2RhdGUnID8gJ1QwMDowMDowMFonIDogJyc7CiAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBEYXRlKHggKyBzKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAvLyBhZGQgMTAgbWludXRlcyB0byBkYXRlIHNpbmNlIGl0IGRvZXMgbm90IGh1cnQgdGhlIGRhdGUsIGFuZAogICAgICAgICAgICAgICAgLy8gaXQgaGVscHMgYXZvaWQgdGhlIHRyaWNreSBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljIHByb2JsZW1zLAogICAgICAgICAgICAgICAgLy8gZS5nLiBzb21ldGltZXMgdGhlIGRhdGUgbWF5IGJlIGEgZmV3IG1pbGxpc2Vjb25kcyBlYXJsaWVyCiAgICAgICAgICAgICAgICAvLyB0aGFuIHRoZSBtaWRuaWdodCBkdWUgdG8gcHJlY2lzaW9uIHByb2JsZW1zIGluIG5vVWlTbGlkZXIKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09PSAnZGF0ZScgPyB0ICsgMzYwMDAwMCA6IHQ7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBpZiAoaW5BcnJheSh0eXBlLCBbJ2RhdGUnLCAndGltZSddKSkgewogICAgICAgICAgICAgICAgdlswXSA9IHN0clRpbWUodlswXSk7CiAgICAgICAgICAgICAgICB2WzFdID0gc3RyVGltZSh2WzFdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHZbMF0gIT0gcjEpIHZbMF0gKj0gc2NhbGU7CiAgICAgICAgICAgICAgaWYgKHZbMV0gIT0gcjIpIHZbMV0gKj0gc2NhbGU7CiAgICAgICAgICAgICAgZmlsdGVyLnZhbCh2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIgZm9ybWF0RGF0ZSA9IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgZCA9IHNjYWxlQmFjayhkLCBzY2FsZSk7CiAgICAgICAgICAgIGlmICh0eXBlID09PSAnbnVtYmVyJykgcmV0dXJuIGQ7CiAgICAgICAgICAgIGlmICh0eXBlID09PSAnaW50ZWdlcicpIHJldHVybiBwYXJzZUludChkKTsKICAgICAgICAgICAgdmFyIHggPSBuZXcgRGF0ZSgrZCk7CiAgICAgICAgICAgIGlmICh0eXBlID09PSAnZGF0ZScpIHsKICAgICAgICAgICAgICB2YXIgcGFkMCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoJzAnICsgeCkuc3Vic3RyKC0yLCAyKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHJldHVybiB4LmdldFVUQ0Z1bGxZZWFyKCkgKyAnLScgKyBwYWQwKDEgKyB4LmdldFVUQ01vbnRoKCkpCiAgICAgICAgICAgICAgICAgICAgICArICctJyArIHBhZDAoeC5nZXRVVENEYXRlKCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiB4LnRvSVNPU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICB2YXIgb3B0cyA9IHR5cGUgPT09ICdkYXRlJyA/IHsgc3RlcDogNjAgKiA2MCAqIDEwMDAgfSA6CiAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT09ICdpbnRlZ2VyJyA/IHsgc3RlcDogMSB9IDoge307CiAgICAgICAgICBmaWx0ZXIgPSAkeC5ub1VpU2xpZGVyKCQuZXh0ZW5kKHsKICAgICAgICAgICAgc3RhcnQ6IFtyMSwgcjJdLAogICAgICAgICAgICByYW5nZToge21pbjogcjEsIG1heDogcjJ9LAogICAgICAgICAgICBjb25uZWN0OiB0cnVlCiAgICAgICAgICB9LCBvcHRzKSk7CiAgICAgICAgICBpZiAoc2NhbGUgPiAxKSAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB0MSA9IHIxLCB0MiA9IHIyOwogICAgICAgICAgICB2YXIgdmFsID0gZmlsdGVyLnZhbCgpOwogICAgICAgICAgICB3aGlsZSAodmFsWzBdID4gcjEgfHwgdmFsWzFdIDwgcjIpIHsKICAgICAgICAgICAgICBpZiAodmFsWzBdID4gcjEpIHsKICAgICAgICAgICAgICAgIHQxIC09IHZhbFswXSAtIHIxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodmFsWzFdIDwgcjIpIHsKICAgICAgICAgICAgICAgIHQyICs9IHIyIC0gdmFsWzFdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmaWx0ZXIgPSAkeC5ub1VpU2xpZGVyKCQuZXh0ZW5kKHsKICAgICAgICAgICAgICAgIHN0YXJ0OiBbdDEsIHQyXSwKICAgICAgICAgICAgICAgIHJhbmdlOiB7bWluOiB0MSwgbWF4OiB0Mn0sCiAgICAgICAgICAgICAgICBjb25uZWN0OiB0cnVlCiAgICAgICAgICAgICAgfSwgb3B0cyksIHRydWUpOwogICAgICAgICAgICAgIHZhbCA9IGZpbHRlci52YWwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByMSAgPSB0MTsgcjIgPSB0MjsKICAgICAgICAgIH0pKCk7CiAgICAgICAgICAkc3BhbjEudGV4dChmb3JtYXREYXRlKHIxKSk7ICRzcGFuMi50ZXh0KGZvcm1hdERhdGUocjIpKTsKICAgICAgICAgIHZhciB1cGRhdGVTbGlkZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciB2YWwgPSBmaWx0ZXIudmFsKCk7CiAgICAgICAgICAgIC8vIHR1cm4gb2ZmIGZpbHRlciBpZiBpbiBmdWxsIHJhbmdlCiAgICAgICAgICAgICR0ZC5kYXRhKCdmaWx0ZXInLCB2YWxbMF0gPiByMSB8fCB2YWxbMV0gPCByMik7CiAgICAgICAgICAgIHZhciB2MSA9IGZvcm1hdERhdGUodmFsWzBdKSwgdjIgPSBmb3JtYXREYXRlKHZhbFsxXSksIGl2YWw7CiAgICAgICAgICAgIGlmICgkdGQuZGF0YSgnZmlsdGVyJykpIHsKICAgICAgICAgICAgICBpdmFsID0gdjEgKyAnIC4uLiAnICsgdjI7CiAgICAgICAgICAgICAgJGlucHV0LmF0dHIoJ3RpdGxlJywgaXZhbCkudmFsKGl2YWwpLnRyaWdnZXIoJ2lucHV0Jyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgJGlucHV0LmF0dHIoJ3RpdGxlJywgJycpLnZhbCgnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHNwYW4xLnRleHQodjEpOyAkc3BhbjIudGV4dCh2Mik7CiAgICAgICAgICAgIGlmIChlLnR5cGUgPT09ICdzbGlkZScpIHJldHVybjsgIC8vIG5vIHNlYXJjaGluZyB3aGVuIHNsaWRpbmcgb25seQogICAgICAgICAgICBpZiAoc2VydmVyKSB7CiAgICAgICAgICAgICAgdGFibGUuY29sdW1uKGkpLnNlYXJjaCgkdGQuZGF0YSgnZmlsdGVyJykgPyBpdmFsIDogJycpLmRyYXcoKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFibGUuZHJhdygpOwogICAgICAgICAgfTsKICAgICAgICAgIGZpbHRlci5vbih7CiAgICAgICAgICAgIHNldDogdXBkYXRlU2xpZGVyLAogICAgICAgICAgICBzbGlkZTogdXBkYXRlU2xpZGVyCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIHNlcnZlci1zaWRlIHByb2Nlc3Npbmcgd2lsbCBiZSBoYW5kbGVkIGJ5IFIgKG9yIHdoYXRldmVyIHNlcnZlcgogICAgICAgIC8vIGxhbmd1YWdlIHlvdSB1c2UpOyB0aGUgZm9sbG93aW5nIGNvZGUgaXMgb25seSBuZWVkZWQgZm9yIGNsaWVudC1zaWRlCiAgICAgICAgLy8gcHJvY2Vzc2luZwogICAgICAgIGlmIChzZXJ2ZXIpIHsKICAgICAgICAgIC8vIGlmIGEgc2VhcmNoIHN0cmluZyBoYXMgYmVlbiBwcmUtc2V0LCBzZWFyY2ggbm93CiAgICAgICAgICBpZiAoc2VhcmNoQ29sKSB0YWJsZS5jb2x1bW4oaSkuc2VhcmNoKGVuY29kZV9wbHVzKHNlYXJjaENvbCkpLmRyYXcoKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBjdXN0b21GaWx0ZXIgPSBmdW5jdGlvbihzZXR0aW5ncywgZGF0YSwgZGF0YUluZGV4KSB7CiAgICAgICAgICAvLyB0aGVyZSBpcyBubyB3YXkgdG8gYXR0YWNoIGEgc2VhcmNoIGZ1bmN0aW9uIHRvIGEgc3BlY2lmaWMgdGFibGUsCiAgICAgICAgICAvLyBhbmQgd2UgbmVlZCB0byBtYWtlIHN1cmUgYSBnbG9iYWwgc2VhcmNoIGZ1bmN0aW9uIGlzIG5vdCBhcHBsaWVkIHRvCiAgICAgICAgICAvLyBhbGwgdGFibGVzIChpLmUuIGEgcmFuZ2UgZmlsdGVyIGluIGEgcHJldmlvdXMgdGFibGUgc2hvdWxkIG5vdCBiZQogICAgICAgICAgLy8gYXBwbGllZCB0byB0aGUgY3VycmVudCB0YWJsZSk7IHdlIHVzZSB0aGUgc2V0dGluZ3Mgb2JqZWN0IHRvCiAgICAgICAgICAvLyBkZXRlcm1pbmUgaWYgd2Ugd2FudCB0byBwZXJmb3JtIHNlYXJjaGluZyBvbiB0aGUgY3VycmVudCB0YWJsZSwKICAgICAgICAgIC8vIHNpbmNlIHNldHRpbmdzLnNUYWJsZUlkIHdpbGwgYmUgZGlmZmVyZW50IHRvIGRpZmZlcmVudCB0YWJsZXMKICAgICAgICAgIGlmICh0YWJsZS5zZXR0aW5ncygpWzBdICE9PSBzZXR0aW5ncykgcmV0dXJuIHRydWU7CiAgICAgICAgICAvLyBubyBmaWx0ZXIgb24gdGhpcyBjb2x1bW4gb3Igbm8gbmVlZCB0byBmaWx0ZXIgdGhpcyBjb2x1bW4KICAgICAgICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAndW5kZWZpbmVkJyB8fCAhJHRkLmRhdGEoJ2ZpbHRlcicpKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgICB2YXIgciA9IGZpbHRlci52YWwoKSwgdiwgcjAsIHIxOwogICAgICAgICAgaWYgKHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdpbnRlZ2VyJykgewogICAgICAgICAgICB2ID0gcGFyc2VGbG9hdChkYXRhW2ldKTsKICAgICAgICAgICAgLy8gaG93IHRvIGhhbmRsZSBOYU4/IGN1cnJlbnRseSBleGNsdWRlIHRoZXNlIHJvd3MKICAgICAgICAgICAgaWYgKGlzTmFOKHYpKSByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICByMCA9IHBhcnNlRmxvYXQoc2NhbGVCYWNrKHJbMF0sIHNjYWxlKSkKICAgICAgICAgICAgcjEgPSBwYXJzZUZsb2F0KHNjYWxlQmFjayhyWzFdLCBzY2FsZSkpOwogICAgICAgICAgICBpZiAodiA+PSByMCAmJiB2IDw9IHIxKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RhdGUnIHx8IHR5cGUgPT09ICd0aW1lJykgewogICAgICAgICAgICB2ID0gbmV3IERhdGUoZGF0YVtpXSk7CiAgICAgICAgICAgIHIwID0gbmV3IERhdGUoclswXSAvIHNjYWxlKTsgcjEgPSBuZXcgRGF0ZShyWzFdIC8gc2NhbGUpOwogICAgICAgICAgICBpZiAodiA+PSByMCAmJiB2IDw9IHIxKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ZhY3RvcicpIHsKICAgICAgICAgICAgaWYgKHIubGVuZ3RoID09PSAwIHx8IGluQXJyYXkoZGF0YVtpXSwgcikpIHJldHVybiB0cnVlOwogICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbG9naWNhbCcpIHsKICAgICAgICAgICAgaWYgKHIubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgaWYgKGluQXJyYXkoZGF0YVtpXSA9PT0gJycgPyAnbmEnIDogZGF0YVtpXSwgcikpIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH07CgogICAgICAgICQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2gucHVzaChjdXN0b21GaWx0ZXIpOwoKICAgICAgICAvLyBzZWFyY2ggZm9yIHRoZSBwcmVzZXQgc2VhcmNoIHN0cmluZ3MgaWYgaXQgaXMgbm9uLWVtcHR5CiAgICAgICAgaWYgKHNlYXJjaENvbCkgewogICAgICAgICAgaWYgKGluQXJyYXkodHlwZSwgWydmYWN0b3InLCAnbG9naWNhbCddKSkgewogICAgICAgICAgICBmaWx0ZXJbMF0uc2VsZWN0aXplLnNldFZhbHVlKEpTT04ucGFyc2Uoc2VhcmNoQ29sKSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjaGFyYWN0ZXInKSB7CiAgICAgICAgICAgICRpbnB1dC50cmlnZ2VyKCdpbnB1dCcpOwogICAgICAgICAgfSBlbHNlIGlmIChpbkFycmF5KHR5cGUsIFsnbnVtYmVyJywgJ2ludGVnZXInLCAnZGF0ZScsICd0aW1lJ10pKSB7CiAgICAgICAgICAgICRpbnB1dC50cmlnZ2VyKCdjaGFuZ2UnKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9KTsKCiAgICB9CgogICAgLy8gaGlnaGxpZ2h0IHNlYXJjaCBrZXl3b3JkcwogICAgdmFyIGhpZ2hsaWdodCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgYm9keSA9ICQodGFibGUudGFibGUoKS5ib2R5KCkpOwogICAgICAvLyByZW1vdmluZyB0aGUgb2xkIGhpZ2hsaWdodGluZyBmaXJzdAogICAgICBib2R5LnVuaGlnaGxpZ2h0KCk7CgogICAgICAvLyBkb24ndCBoaWdobGlnaHQgdGhlICJub3QgZm91bmQiIHJvdywgc28gd2UgZ2V0IHRoZSByb3dzIHVzaW5nIHRoZSBhcGkKICAgICAgaWYgKHRhYmxlLnJvd3MoeyBmaWx0ZXI6ICdhcHBsaWVkJyB9KS5kYXRhKCkubGVuZ3RoID09PSAwKSByZXR1cm47CiAgICAgIC8vIGhpZ2hsaWdodCBnbG9hbCBzZWFyY2gga2V5d29yZHMKICAgICAgYm9keS5oaWdobGlnaHQoJC50cmltKHRhYmxlLnNlYXJjaCgpKS5zcGxpdCgvXHMrLykpOwogICAgICAvLyB0aGVuIGhpZ2hsaWdodCBrZXl3b3JkcyBmcm9tIGluZGl2aWR1YWwgY29sdW1uIGZpbHRlcnMKICAgICAgaWYgKGZpbHRlclJvdykgZmlsdGVyUm93LmVhY2goZnVuY3Rpb24oaSwgdGQpIHsKICAgICAgICB2YXIgJHRkID0gJCh0ZCksIHR5cGUgPSAkdGQuZGF0YSgndHlwZScpOwogICAgICAgIGlmICh0eXBlICE9PSAnY2hhcmFjdGVyJykgcmV0dXJuOwogICAgICAgIHZhciAkaW5wdXQgPSAkdGQuY2hpbGRyZW4oJ2RpdicpLmZpcnN0KCkuY2hpbGRyZW4oJ2lucHV0Jyk7CiAgICAgICAgdmFyIGNvbHVtbiA9IHRhYmxlLmNvbHVtbihpKS5ub2RlcygpLnRvJCgpLAogICAgICAgICAgICB2YWwgPSAkLnRyaW0oJGlucHV0LnZhbCgpKTsKICAgICAgICBpZiAodHlwZSAhPT0gJ2NoYXJhY3RlcicgfHwgdmFsID09PSAnJykgcmV0dXJuOwogICAgICAgIGNvbHVtbi5oaWdobGlnaHQodmFsLnNwbGl0KC9ccysvKSk7CiAgICAgIH0pOwogICAgfTsKCiAgICBpZiAob3B0aW9ucy5zZWFyY2hIaWdobGlnaHQpIHsKICAgICAgdGFibGUKICAgICAgLm9uKCdkcmF3LmR0LmR0aCBjb2x1bW4tdmlzaWJpbGl0eS5kdC5kdGggY29sdW1uLXJlb3JkZXIuZHQuZHRoJywgaGlnaGxpZ2h0KQogICAgICAub24oJ2Rlc3Ryb3knLCBmdW5jdGlvbigpIHsKICAgICAgICAvLyByZW1vdmUgZXZlbnQgaGFuZGxlcgogICAgICAgIHRhYmxlLm9mZiggJ2RyYXcuZHQuZHRoIGNvbHVtbi12aXNpYmlsaXR5LmR0LmR0aCBjb2x1bW4tcmVvcmRlci5kdC5kdGgnICk7CiAgICAgIH0pOwoKICAgICAgLy8gaW5pdGlhbCBoaWdobGlnaHQgZm9yIHN0YXRlIHNhdmVkIGNvbmRpdGlvbnMgYW5kIGluaXRpYWwgc3RhdGVzCiAgICAgIGhpZ2hsaWdodCgpOwogICAgfQoKICAgIC8vIHJ1biB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gb24gdGhlIHRhYmxlIGluc3RhbmNlCiAgICBpZiAodHlwZW9mIGRhdGEuY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGRhdGEuY2FsbGJhY2sodGFibGUpOwogICAgdGhpcy5hZGp1c3RXaWR0aChlbCk7CgogICAgIC8vIGZpbGxDb250YWluZXIgPSBUUlVFIGJlaGF2aW9yCiAgICBpZiAoaW5zdGFuY2UuZmlsbENvbnRhaW5lcikgewoKICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGp1c3QgYSBiaXQgdG8gZG8gdGhpcyBzbyBEVCBjYW4gY29tcGxldGVseQogICAgICAvLyBmaW5pc2ggbGF5aW5nIGl0c2VsZiBvdXQKICAgICAgdmFyIHRoaXogPSB0aGlzOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAvLyBjYWxjdWxhdGUgY29ycmVjdCBoZWlnaHQKICAgICAgICB0aGl6LmZpbGxBdmFpbGFibGVIZWlnaHQoZWwsICQoZWwpLmlubmVySGVpZ2h0KCkpOwoKICAgICAgICAvLyB3ZSBuZWVkIHRvIGZvcmNlIERUIHRvIHJlY2FsY3VsYXRlIGNvbHVtbiB3aWR0aHMKICAgICAgICAvLyAob3RoZXJ3aXNlIGFsbCB0aGUgY29sdW1ucyBhcmUgdGhlIHNhbWUgc2l6ZSkKICAgICAgICB0YWJsZS5jb2x1bW5zLmFkanVzdCgpOwogICAgICB9LCAyMDApOwogICAgfQoKICAgIC8vIGludGVyYWN0aW9uIHdpdGggc2hpbnkKICAgIGlmICghSFRNTFdpZGdldHMuc2hpbnlNb2RlKSByZXR1cm47CgogICAgdmFyIG1ldGhvZHMgPSB7fTsKICAgIHZhciBzaGlueURhdGEgPSB7fTsKCiAgICBtZXRob2RzLnVwZGF0ZUNhcHRpb24gPSBmdW5jdGlvbihjYXB0aW9uKSB7CiAgICAgIGlmICghY2FwdGlvbikgcmV0dXJuOwogICAgICAkdGFibGUuY2hpbGRyZW4oJ2NhcHRpb24nKS5yZXBsYWNlV2l0aChjYXB0aW9uKTsKICAgIH0KCiAgICB2YXIgY2hhbmdlSW5wdXQgPSBmdW5jdGlvbihpZCwgZGF0YSwgdHlwZSkgewogICAgICBpZCA9IGVsLmlkICsgJ18nICsgaWQ7CiAgICAgIGlmICh0eXBlKSBpZCA9IGlkICsgJzonICsgdHlwZTsKICAgICAgLy8gZG8gbm90IHVwZGF0ZSBpZiB0aGUgbmV3IGRhdGEgaXMgdGhlIHNhbWUgYXMgb2xkIGRhdGEKICAgICAgaWYgKHNoaW55RGF0YS5oYXNPd25Qcm9wZXJ0eShpZCkgJiYgc2hpbnlEYXRhW2lkXSA9PT0gSlNPTi5zdHJpbmdpZnkoZGF0YSkpCiAgICAgICAgcmV0dXJuOwogICAgICBzaGlueURhdGFbaWRdID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7CiAgICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoaWQsIGRhdGEpOwogICAgfTsKCiAgICB2YXIgYWRkT25lID0gZnVuY3Rpb24oeCkgewogICAgICByZXR1cm4geC5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gMSArIGk7IH0pOwogICAgfTsKCiAgICB2YXIgdW5pcXVlID0gZnVuY3Rpb24oeCkgewogICAgICB2YXIgdXggPSBbXTsKICAgICAgJC5lYWNoKHgsIGZ1bmN0aW9uKGksIGVsKXsKICAgICAgICBpZiAoJC5pbkFycmF5KGVsLCB1eCkgPT09IC0xKSB1eC5wdXNoKGVsKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB1eDsKICAgIH0KCiAgICAvLyBjaGFuZ2UgdGhlIHJvdyBpbmRleCBvZiBhIGNlbGwKICAgIHZhciB0d2Vha0NlbGxJbmRleCA9IGZ1bmN0aW9uKGNlbGwpIHsKICAgICAgdmFyIGluZm8gPSBjZWxsLmluZGV4KCk7CiAgICAgIGlmIChzZXJ2ZXIpIHsKICAgICAgICBpbmZvLnJvdyA9IERUX3Jvd3NfY3VycmVudFtpbmZvLnJvd107CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5mby5yb3cgKz0gMTsKICAgICAgfQogICAgICByZXR1cm4ge3JvdzogaW5mby5yb3csIGNvbDogaW5mby5jb2x1bW59OwogICAgfQoKICAgIHZhciBzZWxNb2RlID0gZGF0YS5zZWxlY3Rpb24ubW9kZSwgc2VsVGFyZ2V0ID0gZGF0YS5zZWxlY3Rpb24udGFyZ2V0OwogICAgaWYgKGluQXJyYXkoc2VsTW9kZSwgWydzaW5nbGUnLCAnbXVsdGlwbGUnXSkpIHsKICAgICAgdmFyIHNlbENsYXNzID0gZGF0YS5zdHlsZSA9PT0gJ2Jvb3RzdHJhcCcgPyAnYWN0aXZlJyA6ICdzZWxlY3RlZCc7CiAgICAgIHZhciBzZWxlY3RlZCA9IGRhdGEuc2VsZWN0aW9uLnNlbGVjdGVkLCBzZWxlY3RlZDEsIHNlbGVjdGVkMjsKICAgICAgaWYgKHNlbGVjdGVkID09PSBudWxsKSB7CiAgICAgICAgc2VsZWN0ZWQxID0gc2VsZWN0ZWQyID0gW107CiAgICAgIH0gZWxzZSBpZiAoc2VsVGFyZ2V0ID09PSAncm93JykgewogICAgICAgIHNlbGVjdGVkMSA9ICQubWFrZUFycmF5KHNlbGVjdGVkKTsKICAgICAgfSBlbHNlIGlmIChzZWxUYXJnZXQgPT09ICdjb2x1bW4nKSB7CiAgICAgICAgc2VsZWN0ZWQyID0gJC5tYWtlQXJyYXkoc2VsZWN0ZWQpOwogICAgICB9IGVsc2UgaWYgKHNlbFRhcmdldCA9PT0gJ3Jvdytjb2x1bW4nKSB7CiAgICAgICAgc2VsZWN0ZWQxID0gJC5tYWtlQXJyYXkoc2VsZWN0ZWQucm93cyk7CiAgICAgICAgc2VsZWN0ZWQyID0gJC5tYWtlQXJyYXkoc2VsZWN0ZWQuY29scyk7CiAgICAgIH0KICAgICAgLy8gcm93LCBjb2x1bW4sIG9yIGNlbGwgc2VsZWN0aW9uCiAgICAgIGlmIChpbkFycmF5KHNlbFRhcmdldCwgWydyb3cnLCAncm93K2NvbHVtbiddKSkgewogICAgICAgIHZhciBzZWxlY3RlZFJvd3MgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciByb3dzID0gdGFibGUucm93cygnLicgKyBzZWxDbGFzcywge3NlYXJjaDogJ2FwcGxpZWQnfSk7CiAgICAgICAgICB2YXIgaWR4ID0gcm93cy5pbmRleGVzKCkudG9BcnJheSgpOwogICAgICAgICAgaWYgKCFzZXJ2ZXIpIHJldHVybiBhZGRPbmUoaWR4KTsKICAgICAgICAgIGlkeCA9IGlkeC5tYXAoZnVuY3Rpb24oaSkgewogICAgICAgICAgICByZXR1cm4gRFRfcm93c19jdXJyZW50W2ldOwogICAgICAgICAgfSk7CiAgICAgICAgICBzZWxlY3RlZDEgPSBzZWxNb2RlID09PSAnbXVsdGlwbGUnID8gdW5pcXVlKHNlbGVjdGVkMS5jb25jYXQoaWR4KSkgOiBpZHg7CiAgICAgICAgICByZXR1cm4gc2VsZWN0ZWQxOwogICAgICAgIH0KICAgICAgICB0YWJsZS5vbignY2xpY2suZHQnLCAndGJvZHkgdHInLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksIHRoaXNSb3cgPSB0YWJsZS5yb3codGhpcyk7CiAgICAgICAgICBpZiAoc2VsTW9kZSA9PT0gJ211bHRpcGxlJykgewogICAgICAgICAgICAkdGhpcy50b2dnbGVDbGFzcyhzZWxDbGFzcyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoJHRoaXMuaGFzQ2xhc3Moc2VsQ2xhc3MpKSB7CiAgICAgICAgICAgICAgJHRoaXMucmVtb3ZlQ2xhc3Moc2VsQ2xhc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRhYmxlLiQoJ3RyLicgKyBzZWxDbGFzcykucmVtb3ZlQ2xhc3Moc2VsQ2xhc3MpOwogICAgICAgICAgICAgICR0aGlzLmFkZENsYXNzKHNlbENsYXNzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHNlcnZlciAmJiAhJHRoaXMuaGFzQ2xhc3Moc2VsQ2xhc3MpKSB7CiAgICAgICAgICAgIHZhciBpZCA9IERUX3Jvd3NfY3VycmVudFt0aGlzUm93LmluZGV4KCldOwogICAgICAgICAgICAvLyByZW1vdmUgaWQgZnJvbSBzZWxlY3RlZDEgc2luY2UgaXRzIGNsYXNzIC5zZWxlY3RlZCBoYXMgYmVlbiByZW1vdmVkCiAgICAgICAgICAgIHNlbGVjdGVkMS5zcGxpY2UoJC5pbkFycmF5KGlkLCBzZWxlY3RlZDEpLCAxKTsKICAgICAgICAgIH0KICAgICAgICAgIGNoYW5nZUlucHV0KCdyb3dzX3NlbGVjdGVkJywgc2VsZWN0ZWRSb3dzKCkpOwogICAgICAgICAgY2hhbmdlSW5wdXQoJ3Jvd19sYXN0X2NsaWNrZWQnLCBzZXJ2ZXIgPwogICAgICAgICAgICAgICAgICAgICAgRFRfcm93c19jdXJyZW50W3RoaXNSb3cuaW5kZXgoKV0gOiB0aGlzUm93LmluZGV4KCkgKyAxKTsKICAgICAgICB9KTsKICAgICAgICBjaGFuZ2VJbnB1dCgncm93c19zZWxlY3RlZCcsIHNlbGVjdGVkMSk7CiAgICAgICAgdmFyIHNlbGVjdFJvd3MgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHRhYmxlLiQoJ3RyLicgKyBzZWxDbGFzcykucmVtb3ZlQ2xhc3Moc2VsQ2xhc3MpOwogICAgICAgICAgaWYgKHNlbGVjdGVkMS5sZW5ndGggPT09IDApIHJldHVybjsKICAgICAgICAgIGlmIChzZXJ2ZXIpIHsKICAgICAgICAgICAgdGFibGUucm93cyh7cGFnZTogJ2N1cnJlbnQnfSkuZXZlcnkoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgaWYgKGluQXJyYXkoRFRfcm93c19jdXJyZW50W3RoaXMuaW5kZXgoKV0sIHNlbGVjdGVkMSkpIHsKICAgICAgICAgICAgICAgICQodGhpcy5ub2RlKCkpLmFkZENsYXNzKHNlbENsYXNzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkMCA9IHNlbGVjdGVkMS5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gaSAtIDE7IH0pOwogICAgICAgICAgICAkKHRhYmxlLnJvd3Moc2VsZWN0ZWQwKS5ub2RlcygpKS5hZGRDbGFzcyhzZWxDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNlbGVjdFJvd3MoKTsgIC8vIGluIGNhc2UgdXNlcnMgaGF2ZSBzcGVjaWZpZWQgcHJlLXNlbGVjdGVkIHJvd3MKICAgICAgICAvLyByZXN0b3JlIHNlbGVjdGVkIHJvd3MgYWZ0ZXIgdGhlIHRhYmxlIGlzIHJlZHJhd24gKGUuZy4gc29ydC9zZWFyY2gvcGFnZSk7CiAgICAgICAgLy8gY2xpZW50LXNpZGUgdGFibGVzIHdpbGwgcHJlc2VydmUgdGhlIHNlbGVjdGlvbnMgYXV0b21hdGljYWxseTsgZm9yCiAgICAgICAgLy8gc2VydmVyLXNpZGUgdGFibGVzLCB3ZSBoYXZlIHRvICpyZWFsKiByb3cgaW5kaWNlcyBhcmUgaW4gYHNlbGVjdGVkMWAKICAgICAgICBpZiAoc2VydmVyKSB0YWJsZS5vbignZHJhdy5kdCcsIHNlbGVjdFJvd3MpOwogICAgICAgIG1ldGhvZHMuc2VsZWN0Um93cyA9IGZ1bmN0aW9uKHNlbGVjdGVkKSB7CiAgICAgICAgICBzZWxlY3RlZDEgPSBzZWxlY3RlZCA/IHNlbGVjdGVkIDogW107CiAgICAgICAgICBzZWxlY3RSb3dzKCk7CiAgICAgICAgICBjaGFuZ2VJbnB1dCgncm93c19zZWxlY3RlZCcsIHNlbGVjdGVkMSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoaW5BcnJheShzZWxUYXJnZXQsIFsnY29sdW1uJywgJ3Jvdytjb2x1bW4nXSkpIHsKICAgICAgICBpZiAoc2VsVGFyZ2V0ID09PSAncm93K2NvbHVtbicpIHsKICAgICAgICAgICQodGFibGUuY29sdW1ucygpLmZvb3RlcigpKS5jc3MoJ2N1cnNvcicsICdwb2ludGVyJyk7CiAgICAgICAgfQogICAgICAgIHRhYmxlLm9uKCdjbGljay5kdCcsIHNlbFRhcmdldCA9PT0gJ2NvbHVtbicgPyAndGJvZHkgdGQnIDogJ3Rmb290IHRyIHRoJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgY29sSWR4ID0gc2VsVGFyZ2V0ID09PSAnY29sdW1uJyA/IHRhYmxlLmNlbGwodGhpcykuaW5kZXgoKS5jb2x1bW4gOgogICAgICAgICAgICAgICQuaW5BcnJheSh0aGlzLCB0YWJsZS5jb2x1bW5zKCkuZm9vdGVyKCkpLAogICAgICAgICAgICAgIHRoaXNDb2wgPSAkKHRhYmxlLmNvbHVtbihjb2xJZHgpLm5vZGVzKCkpOwogICAgICAgICAgaWYgKGNvbElkeCA9PT0gLTEpIHJldHVybjsKICAgICAgICAgIGlmICh0aGlzQ29sLmhhc0NsYXNzKHNlbENsYXNzKSkgewogICAgICAgICAgICB0aGlzQ29sLnJlbW92ZUNsYXNzKHNlbENsYXNzKTsKICAgICAgICAgICAgc2VsZWN0ZWQyLnNwbGljZSgkLmluQXJyYXkoY29sSWR4LCBzZWxlY3RlZDIpLCAxKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChzZWxNb2RlID09PSAnc2luZ2xlJykgJCh0YWJsZS5jZWxscygpLm5vZGVzKCkpLnJlbW92ZUNsYXNzKHNlbENsYXNzKTsKICAgICAgICAgICAgdGhpc0NvbC5hZGRDbGFzcyhzZWxDbGFzcyk7CiAgICAgICAgICAgIHNlbGVjdGVkMiA9IHNlbE1vZGUgPT09ICdzaW5nbGUnID8gW2NvbElkeF0gOiB1bmlxdWUoc2VsZWN0ZWQyLmNvbmNhdChbY29sSWR4XSkpOwogICAgICAgICAgfQogICAgICAgICAgY2hhbmdlSW5wdXQoJ2NvbHVtbnNfc2VsZWN0ZWQnLCBzZWxlY3RlZDIpOwogICAgICAgIH0pOwogICAgICAgIGNoYW5nZUlucHV0KCdjb2x1bW5zX3NlbGVjdGVkJywgc2VsZWN0ZWQyKTsKICAgICAgICB2YXIgc2VsZWN0Q29scyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdGFibGUuY29sdW1ucygpLm5vZGVzKCkuZmxhdHRlbigpLnRvJCgpLnJlbW92ZUNsYXNzKHNlbENsYXNzKTsKICAgICAgICAgIGlmIChzZWxlY3RlZDIubGVuZ3RoID4gMCkKICAgICAgICAgICAgdGFibGUuY29sdW1ucyhzZWxlY3RlZDIpLm5vZGVzKCkuZmxhdHRlbigpLnRvJCgpLmFkZENsYXNzKHNlbENsYXNzKTsKICAgICAgICB9CiAgICAgICAgc2VsZWN0Q29scygpOyAgLy8gaW4gY2FzZSB1c2VycyBoYXZlIHNwZWNpZmllZCBwcmUtc2VsZWN0ZWQgY29sdW1ucwogICAgICAgIGlmIChzZXJ2ZXIpIHRhYmxlLm9uKCdkcmF3LmR0Jywgc2VsZWN0Q29scyk7CiAgICAgICAgbWV0aG9kcy5zZWxlY3RDb2x1bW5zID0gZnVuY3Rpb24oc2VsZWN0ZWQpIHsKICAgICAgICAgIHNlbGVjdGVkMiA9IHNlbGVjdGVkID8gc2VsZWN0ZWQgOiBbXTsKICAgICAgICAgIHNlbGVjdENvbHMoKTsKICAgICAgICAgIGNoYW5nZUlucHV0KCdjb2x1bW5zX3NlbGVjdGVkJywgc2VsZWN0ZWQyKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChzZWxUYXJnZXQgPT09ICdjZWxsJykgewogICAgICAgIHZhciBzZWxlY3RlZDM7CiAgICAgICAgaWYgKHNlbGVjdGVkID09PSBudWxsKSB7CiAgICAgICAgICBzZWxlY3RlZDMgPSBbXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2VsZWN0ZWQzID0gc2VsZWN0ZWQ7CiAgICAgICAgfQogICAgICAgIHZhciBmaW5kSW5kZXggPSBmdW5jdGlvbihpaikgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZDMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGlqWzBdID09PSBzZWxlY3RlZDNbaV1bMF0gJiYgaWpbMV0gPT09IHNlbGVjdGVkM1tpXVsxXSkgcmV0dXJuIGk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHRhYmxlLm9uKCdjbGljay5kdCcsICd0Ym9keSB0ZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSwgaW5mbyA9IHR3ZWFrQ2VsbEluZGV4KHRhYmxlLmNlbGwodGhpcykpOwogICAgICAgICAgaWYgKCR0aGlzLmhhc0NsYXNzKHNlbENsYXNzKSkgewogICAgICAgICAgICAkdGhpcy5yZW1vdmVDbGFzcyhzZWxDbGFzcyk7CiAgICAgICAgICAgIHNlbGVjdGVkMy5zcGxpY2UoZmluZEluZGV4KFtpbmZvLnJvdywgaW5mby5jb2xdKSwgMSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoc2VsTW9kZSA9PT0gJ3NpbmdsZScpICQodGFibGUuY2VsbHMoKS5ub2RlcygpKS5yZW1vdmVDbGFzcyhzZWxDbGFzcyk7CiAgICAgICAgICAgICR0aGlzLmFkZENsYXNzKHNlbENsYXNzKTsKICAgICAgICAgICAgc2VsZWN0ZWQzID0gc2VsTW9kZSA9PT0gJ3NpbmdsZScgPyBbW2luZm8ucm93LCBpbmZvLmNvbF1dIDoKICAgICAgICAgICAgICB1bmlxdWUoc2VsZWN0ZWQzLmNvbmNhdChbW2luZm8ucm93LCBpbmZvLmNvbF1dKSk7CiAgICAgICAgICB9CiAgICAgICAgICBjaGFuZ2VJbnB1dCgnY2VsbHNfc2VsZWN0ZWQnLCB0cmFuc3Bvc2VBcnJheTJEKHNlbGVjdGVkMyksICdzaGlueS5tYXRyaXgnKTsKICAgICAgICB9KTsKICAgICAgICBjaGFuZ2VJbnB1dCgnY2VsbHNfc2VsZWN0ZWQnLCB0cmFuc3Bvc2VBcnJheTJEKHNlbGVjdGVkMyksICdzaGlueS5tYXRyaXgnKTsKICAgICAgICB2YXIgc2VsZWN0Q2VsbHMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHRhYmxlLiQoJ3RkLicgKyBzZWxDbGFzcykucmVtb3ZlQ2xhc3Moc2VsQ2xhc3MpOwogICAgICAgICAgaWYgKHNlbGVjdGVkMy5sZW5ndGggPT09IDApIHJldHVybjsKICAgICAgICAgIGlmIChzZXJ2ZXIpIHsKICAgICAgICAgICAgdGFibGUuY2VsbHMoe3BhZ2U6ICdjdXJyZW50J30pLmV2ZXJ5KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHZhciBpbmZvID0gdHdlYWtDZWxsSW5kZXgodGhpcyk7CiAgICAgICAgICAgICAgaWYgKGZpbmRJbmRleChbaW5mby5yb3csIGluZm8uY29sXSwgc2VsZWN0ZWQzKSA+IC0xKQogICAgICAgICAgICAgICAgJCh0aGlzLm5vZGUoKSkuYWRkQ2xhc3Moc2VsQ2xhc3MpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNlbGVjdGVkMy5tYXAoZnVuY3Rpb24oaWopIHsKICAgICAgICAgICAgICAkKHRhYmxlLmNlbGwoaWpbMF0gLSAxLCBpalsxXSkubm9kZSgpKS5hZGRDbGFzcyhzZWxDbGFzcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgc2VsZWN0Q2VsbHMoKTsgIC8vIGluIGNhc2UgdXNlcnMgaGF2ZSBzcGVjaWZpZWQgcHJlLXNlbGVjdGVkIGNvbHVtbnMKICAgICAgICBpZiAoc2VydmVyKSB0YWJsZS5vbignZHJhdy5kdCcsIHNlbGVjdENlbGxzKTsKICAgICAgICBtZXRob2RzLnNlbGVjdENlbGxzID0gZnVuY3Rpb24oc2VsZWN0ZWQpIHsKICAgICAgICAgIHNlbGVjdGVkMyA9IHNlbGVjdGVkID8gc2VsZWN0ZWQgOiBbXTsKICAgICAgICAgIHNlbGVjdENlbGxzKCk7CiAgICAgICAgICBjaGFuZ2VJbnB1dCgnY2VsbHNfc2VsZWN0ZWQnLCB0cmFuc3Bvc2VBcnJheTJEKHNlbGVjdGVkMyksICdzaGlueS5tYXRyaXgnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBleHBvc2Ugc29tZSB0YWJsZSBpbmZvIHRvIFNoaW55CiAgICB2YXIgdXBkYXRlVGFibGVJbmZvID0gZnVuY3Rpb24oZSwgc2V0dGluZ3MpIHsKICAgICAgLy8gVE9ETzogaXMgYW55b25lIGludGVyZXN0ZWQgaW4gdGhlIHBhZ2UgaW5mbz8KICAgICAgLy8gY2hhbmdlSW5wdXQoJ3BhZ2VfaW5mbycsIHRhYmxlLnBhZ2UuaW5mbygpKTsKICAgICAgdmFyIHVwZGF0ZVJvd0luZm8gPSBmdW5jdGlvbihpZCwgbW9kaWZpZXIpIHsKICAgICAgICB2YXIgaWR4OwogICAgICAgIGlmIChzZXJ2ZXIpIHsKICAgICAgICAgIGlkeCA9IG1vZGlmaWVyLnBhZ2UgPT09ICdjdXJyZW50JyA/IERUX3Jvd3NfY3VycmVudCA6IERUX3Jvd3NfYWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgcm93cyA9IHRhYmxlLnJvd3MoJC5leHRlbmQoewogICAgICAgICAgICBzZWFyY2g6ICdhcHBsaWVkJywKICAgICAgICAgICAgcGFnZTogJ2FsbCcKICAgICAgICAgIH0sIG1vZGlmaWVyKSk7CiAgICAgICAgICBpZHggPSBhZGRPbmUocm93cy5pbmRleGVzKCkudG9BcnJheSgpKTsKICAgICAgICB9CiAgICAgICAgY2hhbmdlSW5wdXQoJ3Jvd3MnICsgJ18nICsgaWQsIGlkeCk7CiAgICAgIH07CiAgICAgIHVwZGF0ZVJvd0luZm8oJ2N1cnJlbnQnLCB7cGFnZTogJ2N1cnJlbnQnfSk7CiAgICAgIHVwZGF0ZVJvd0luZm8oJ2FsbCcsIHt9KTsKICAgIH0KICAgIHRhYmxlLm9uKCdkcmF3LmR0JywgdXBkYXRlVGFibGVJbmZvKTsKICAgIHVwZGF0ZVRhYmxlSW5mbygpOwoKICAgIC8vIHN0YXRlIGluZm8KICAgIHRhYmxlLm9uKCdkcmF3LmR0IGNvbHVtbi12aXNpYmlsaXR5LmR0JywgZnVuY3Rpb24oKSB7CiAgICAgIGNoYW5nZUlucHV0KCdzdGF0ZScsIHRhYmxlLnN0YXRlKCkpOwogICAgfSk7CiAgICBjaGFuZ2VJbnB1dCgnc3RhdGUnLCB0YWJsZS5zdGF0ZSgpKTsKCiAgICAvLyBzZWFyY2ggaW5mbwogICAgdmFyIHVwZGF0ZVNlYXJjaEluZm8gPSBmdW5jdGlvbigpIHsKICAgICAgY2hhbmdlSW5wdXQoJ3NlYXJjaCcsIHRhYmxlLnNlYXJjaCgpKTsKICAgICAgaWYgKGZpbHRlclJvdykgY2hhbmdlSW5wdXQoJ3NlYXJjaF9jb2x1bW5zJywgZmlsdGVyUm93LnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24odGQpIHsKICAgICAgICByZXR1cm4gJCh0ZCkuZmluZCgnaW5wdXQnKS5maXJzdCgpLnZhbCgpOwogICAgICB9KSk7CiAgICB9CiAgICB0YWJsZS5vbignZHJhdy5kdCcsIHVwZGF0ZVNlYXJjaEluZm8pOwogICAgdXBkYXRlU2VhcmNoSW5mbygpOwoKICAgIC8vIHRoZSBjdXJyZW50IGNlbGwgY2xpY2tlZCBvbgogICAgdGFibGUub24oJ2NsaWNrLmR0JywgJ3Rib2R5IHRkJywgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBpbmZvID0gdHdlYWtDZWxsSW5kZXgodGFibGUuY2VsbCh0aGlzKSk7CiAgICAgIGluZm8udmFsdWUgPSB0YWJsZS5jZWxsKHRoaXMpLmRhdGEoKTsKICAgICAgY2hhbmdlSW5wdXQoJ2NlbGxfY2xpY2tlZCcsIGluZm8pOwogICAgfSkKICAgIGNoYW5nZUlucHV0KCdjZWxsX2NsaWNrZWQnLCB7fSk7CgogICAgLy8gZG8gbm90IHRyaWdnZXIgdGFibGUgc2VsZWN0aW9uIHdoZW4gY2xpY2tpbmcgb24gbGlua3MgdW5sZXNzIHRoZXkgaGF2ZSBjbGFzc2VzCiAgICB0YWJsZS5vbignY2xpY2suZHQnLCAndGJvZHkgdGQgYScsIGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnJykgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0pOwoKICAgIG1ldGhvZHMuYWRkUm93ID0gZnVuY3Rpb24oZGF0YSwgcm93bmFtZSkgewogICAgICB2YXIgZGF0YTAgPSB0YWJsZS5yb3coMCkuZGF0YSgpLCBuID0gZGF0YTAubGVuZ3RoLCBkID0gbiAtIGRhdGEubGVuZ3RoOwogICAgICBpZiAoZCA9PT0gMSkgewogICAgICAgIGRhdGEgPSByb3duYW1lLmNvbmNhdChkYXRhKQogICAgICB9IGVsc2UgaWYgKGQgIT09IDApIHsKICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTsKICAgICAgICBjb25zb2xlLmxvZyhkYXRhMCk7CiAgICAgICAgdGhyb3cgJ05ldyBkYXRhIG11c3QgYmUgb2YgdGhlIHNhbWUgbGVuZ3RoIGFzIGN1cnJlbnQgZGF0YSAoJyArIG4gKyAnKSc7CiAgICAgIH07CiAgICAgIHRhYmxlLnJvdy5hZGQoZGF0YSkuZHJhdygpOwogICAgfQoKICAgIG1ldGhvZHMudXBkYXRlU2VhcmNoID0gZnVuY3Rpb24oa2V5d29yZHMpIHsKICAgICAgaWYgKGtleXdvcmRzLmdsb2JhbCAhPT0gbnVsbCkKICAgICAgICAkKHRhYmxlLnRhYmxlKCkuY29udGFpbmVyKCkpLmZpbmQoJ2lucHV0W3R5cGU9c2VhcmNoXScpLmZpcnN0KCkKICAgICAgICAgICAgIC52YWwoa2V5d29yZHMuZ2xvYmFsKS50cmlnZ2VyKCdpbnB1dCcpOwogICAgICB2YXIgY29sdW1ucyA9IGtleXdvcmRzLmNvbHVtbnM7CiAgICAgIGlmICghZmlsdGVyUm93IHx8IGNvbHVtbnMgPT09IG51bGwpIHJldHVybjsKICAgICAgZmlsdGVyUm93LnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24odGQsIGkpIHsKICAgICAgICB2YXIgdiA9IHR5cGVvZiBjb2x1bW5zID09PSAnc3RyaW5nJyA/IGNvbHVtbnMgOiBjb2x1bW5zW2ldOwogICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIGNvbnNvbGUubG9nKCdUaGUgc2VhcmNoIGtleXdvcmQgZm9yIGNvbHVtbiAnICsgaSArICcgaXMgdW5kZWZpbmVkJykKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJCh0ZCkuZmluZCgnaW5wdXQnKS5maXJzdCgpLnZhbCh2KTsKICAgICAgICB0YWJsZS5jb2x1bW4oaSkuc2VhcmNoKHYpOwogICAgICB9KTsKICAgICAgdGFibGUuZHJhdygpOwogICAgfQoKICAgIG1ldGhvZHMuc2VsZWN0UGFnZSA9IGZ1bmN0aW9uKHBhZ2UpIHsKICAgICAgaWYgKHRhYmxlLnBhZ2UuaW5mbygpLnBhZ2VzIDwgcGFnZSB8fCBwYWdlIDwgMSkgewogICAgICAgIHRocm93ICdTZWxlY3RlZCBwYWdlIGlzIG91dCBvZiByYW5nZSc7CiAgICAgIH07CiAgICAgIHRhYmxlLnBhZ2UocGFnZSAtIDEpLmRyYXcoZmFsc2UpOwogICAgfQoKICAgIG1ldGhvZHMucmVsb2FkRGF0YSA9IGZ1bmN0aW9uKHJlc2V0UGFnaW5nLCBjbGVhclNlbGVjdGlvbikgewogICAgICAvLyBlbXB0eSBzZWxlY3Rpb25zIGZpcnN0IGlmIG5lY2Vzc2FyeQogICAgICBpZiAobWV0aG9kcy5zZWxlY3RSb3dzICYmIGluQXJyYXkoJ3JvdycsIGNsZWFyU2VsZWN0aW9uKSkgbWV0aG9kcy5zZWxlY3RSb3dzKFtdKTsKICAgICAgaWYgKG1ldGhvZHMuc2VsZWN0Q29sdW1ucyAmJiBpbkFycmF5KCdjb2x1bW4nLCBjbGVhclNlbGVjdGlvbikpIG1ldGhvZHMuc2VsZWN0Q29sdW1ucyhbXSk7CiAgICAgIGlmIChtZXRob2RzLnNlbGVjdENlbGxzICYmIGluQXJyYXkoJ2NlbGwnLCBjbGVhclNlbGVjdGlvbikpIG1ldGhvZHMuc2VsZWN0Q2VsbHMoW10pOwogICAgICB0YWJsZS5hamF4LnJlbG9hZChudWxsLCByZXNldFBhZ2luZyk7CiAgICB9CgogICAgdGFibGUuc2hpbnlNZXRob2RzID0gbWV0aG9kczsKICB9LAogIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7CiAgICBpZiAoaW5zdGFuY2UuZGF0YSkgdGhpcy5yZW5kZXJWYWx1ZShlbCwgaW5zdGFuY2UuZGF0YSwgaW5zdGFuY2UpOwoKICAgIC8vIGR5bmFtaWNhbGx5IGFkanVzdCBoZWlnaHQgaWYgZmlsbENvbnRhaW5lciA9IFRSVUUKICAgIGlmIChpbnN0YW5jZS5maWxsQ29udGFpbmVyKQogICAgICB0aGlzLmZpbGxBdmFpbGFibGVIZWlnaHQoZWwsIGhlaWdodCk7CgogICAgdGhpcy5hZGp1c3RXaWR0aChlbCk7CiAgfSwKCiAgLy8gZHluYW1pY2FsbHkgc2V0IHRoZSBzY3JvbGwgYm9keSB0byBmaWxsIGF2YWlsYWJsZSBoZWlnaHQKICAvLyAodXNlZCB3aXRoIGZpbGxDb250YWluZXIgPSBUUlVFKQogIGZpbGxBdmFpbGFibGVIZWlnaHQ6IGZ1bmN0aW9uKGVsLCBhdmFpbGFibGVIZWlnaHQpIHsKCiAgICAvLyBzZWUgaG93IG11Y2ggb2YgdGhlIHRhYmxlIGlzIG9jY3VwaWVkIGJ5IGhlYWRlci9mb290ZXIgZWxlbWVudHMKICAgIC8vIGFuZCB1c2UgdGhhdCB0byBjb21wdXRlIGEgdGFyZ2V0IHNjcm9sbCBib2R5IGhlaWdodAogICAgdmFyIGR0V3JhcHBlciA9ICQoZWwpLmZpbmQoJ2Rpdi5kYXRhVGFibGVzX3dyYXBwZXInKTsKICAgIHZhciBkdFNjcm9sbEJvZHkgPSAkKGVsKS5maW5kKCQoJ2Rpdi5kYXRhVGFibGVzX3Njcm9sbEJvZHknKSk7CiAgICB2YXIgZnJhbWluZ0hlaWdodCA9IGR0V3JhcHBlci5pbm5lckhlaWdodCgpIC0gZHRTY3JvbGxCb2R5LmlubmVySGVpZ2h0KCk7CiAgICB2YXIgc2Nyb2xsQm9keUhlaWdodCA9IGF2YWlsYWJsZUhlaWdodCAtIGZyYW1pbmdIZWlnaHQ7CgogICAgLy8gc2V0IHRoZSBoZWlnaHQKICAgIGR0U2Nyb2xsQm9keS5oZWlnaHQoc2Nyb2xsQm9keUhlaWdodCArICdweCcpOwogIH0sCgogIC8vIGFkanVzdCB0aGUgd2lkdGggb2YgY29sdW1uczsgcmVtb3ZlIHRoZSBoYXJkLWNvZGVkIHdpZHRocyBvbiB0YWJsZSBhbmQgdGhlCiAgLy8gc2Nyb2xsIGhlYWRlciB3aGVuIHNjcm9sbFgvWSBhcmUgZW5hYmxlZAogIGFkanVzdFdpZHRoOiBmdW5jdGlvbihlbCkgewogICAgdmFyICRlbCA9ICQoZWwpLCB0YWJsZSA9ICRlbC5kYXRhKCdkYXRhdGFibGUnKTsKICAgIGlmICh0YWJsZSkgdGFibGUuY29sdW1ucy5hZGp1c3QoKTsKICAgICRlbC5maW5kKCcuZGF0YVRhYmxlc19zY3JvbGxIZWFkSW5uZXInKS5jc3MoJ3dpZHRoJywgJycpCiAgICAgICAgLmNoaWxkcmVuKCd0YWJsZScpLmNzcygnbWFyZ2luLWxlZnQnLCAnJyk7CiAgfQp9KTsKCiAgaWYgKCFIVE1MV2lkZ2V0cy5zaGlueU1vZGUpIHJldHVybjsKCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ2RhdGF0YWJsZS1jYWxscycsIGZ1bmN0aW9uKGRhdGEpIHsKICAgIHZhciBpZCA9IGRhdGEuaWQ7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CiAgICB2YXIgdGFibGUgPSBlbCA/ICQoZWwpLmRhdGEoJ2RhdGF0YWJsZScpIDogbnVsbDsKICAgIGlmICghdGFibGUpIHsKICAgICAgY29uc29sZS5sb2coIkNvdWxkbid0IGZpbmQgdGFibGUgd2l0aCBpZCAiICsgaWQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIG1ldGhvZHMgPSB0YWJsZS5zaGlueU1ldGhvZHMsIGNhbGwgPSBkYXRhLmNhbGw7CiAgICBpZiAobWV0aG9kc1tjYWxsLm1ldGhvZF0pIHsKICAgICAgbWV0aG9kc1tjYWxsLm1ldGhvZF0uYXBwbHkodGFibGUsIGNhbGwuYXJncyk7CiAgICB9IGVsc2UgewogICAgICBjb25zb2xlLmxvZygiVW5rbm93biBtZXRob2QgIiArIGNhbGwubWV0aG9kKTsKICAgIH0KICB9KTsKCn0pKCk7Cg=="></script>
<link href="data:text/css;charset=utf-8,table%2EdataTable%7Bwidth%3A100%25%3Bmargin%3A0%20auto%3Bclear%3Aboth%3Bborder%2Dcollapse%3Aseparate%3Bborder%2Dspacing%3A0%7Dtable%2EdataTable%20thead%20th%2Ctable%2EdataTable%20tfoot%20th%7Bfont%2Dweight%3Abold%7Dtable%2EdataTable%20thead%20th%2Ctable%2EdataTable%20thead%20td%7Bpadding%3A10px%2018px%3Bborder%2Dbottom%3A1px%20solid%20%23111%7Dtable%2EdataTable%20thead%20th%3Aactive%2Ctable%2EdataTable%20thead%20td%3Aactive%7Boutline%3Anone%7Dtable%2EdataTable%20tfoot%20th%2Ctable%2EdataTable%20tfoot%20td%7Bpadding%3A10px%2018px%206px%2018px%3Bborder%2Dtop%3A1px%20solid%20%23111%7Dtable%2EdataTable%20thead%20%2Esorting%2Ctable%2EdataTable%20thead%20%2Esorting%5Fasc%2Ctable%2EdataTable%20thead%20%2Esorting%5Fdesc%7Bcursor%3Apointer%3B%2Acursor%3Ahand%7Dtable%2EdataTable%20thead%20%2Esorting%2Ctable%2EdataTable%20thead%20%2Esorting%5Fasc%2Ctable%2EdataTable%20thead%20%2Esorting%5Fdesc%2Ctable%2EdataTable%20thead%20%2Esorting%5Fasc%5Fdisabled%2Ctable%2EdataTable%20thead%20%2Esorting%5Fdesc%5Fdisabled%7Bbackground%2Drepeat%3Ano%2Drepeat%3Bbackground%2Dposition%3Acenter%20right%7Dtable%2EdataTable%20thead%20%2Esorting%7Bbackground%2Dimage%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL%2BTq%2FQCM1oNiJidwox0355mXnG%2FDrEtIQ6azioNZQxI0ykPhTQIwhCR%2BBmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P%2BGtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC%29%7Dtable%2EdataTable%20thead%20%2Esorting%5Fasc%7Bbackground%2Dimage%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS%2FgDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM%2BwTENuQahAvEO9DMwiGdwAxOymGJQLxTyD%2BjgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg%3D%3D%29%7Dtable%2EdataTable%20thead%20%2Esorting%5Fdesc%7Bbackground%2Dimage%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA%2FBOIv2PBIPFEUgxjB%2BIdQPwfC94HxLykus4GiD%2BhGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL%2BAuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII%3D%29%7Dtable%2EdataTable%20thead%20%2Esorting%5Fasc%5Fdisabled%7Bbackground%2Dimage%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAW0lEQVQoz2NgoCm4w3Vnwh02wspK7%2Fy6k01Ikdadx3f%2B37l9RxmfIsY7c4GKQHDiHUbcyhzvvIMq%2B3THBpci3jv7oIpAcMcdduzKEu%2F8vPMdDn%2FeiWQYBYMKAAC3ykIEuYQJUgAAAABJRU5ErkJggg%3D%3D%29%7Dtable%2EdataTable%20thead%20%2Esorting%5Fdesc%5Fdisabled%7Bbackground%2Dimage%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAWUlEQVQoz2NgGAWDCtyJvPPzznc4%2FHknEbsy9js77vyHw313eHGZZ3PnE1TRuzuOuK1lvDMRqmzuHUZ87lO%2Bcxuo6PEdLUIeyb7z604pYf%2By3Zlwh4u2YQoAc7ZCBHH4jigAAAAASUVORK5CYII%3D%29%7Dtable%2EdataTable%20tbody%20tr%7Bbackground%2Dcolor%3A%23ffffff%7Dtable%2EdataTable%20tbody%20tr%2Eselected%7Bbackground%2Dcolor%3A%23B0BED9%7Dtable%2EdataTable%20tbody%20th%2Ctable%2EdataTable%20tbody%20td%7Bpadding%3A8px%2010px%7Dtable%2EdataTable%2Erow%2Dborder%20tbody%20th%2Ctable%2EdataTable%2Erow%2Dborder%20tbody%20td%2Ctable%2EdataTable%2Edisplay%20tbody%20th%2Ctable%2EdataTable%2Edisplay%20tbody%20td%7Bborder%2Dtop%3A1px%20solid%20%23ddd%7Dtable%2EdataTable%2Erow%2Dborder%20tbody%20tr%3Afirst%2Dchild%20th%2Ctable%2EdataTable%2Erow%2Dborder%20tbody%20tr%3Afirst%2Dchild%20td%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%3Afirst%2Dchild%20th%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%3Afirst%2Dchild%20td%7Bborder%2Dtop%3Anone%7Dtable%2EdataTable%2Ecell%2Dborder%20tbody%20th%2Ctable%2EdataTable%2Ecell%2Dborder%20tbody%20td%7Bborder%2Dtop%3A1px%20solid%20%23ddd%3Bborder%2Dright%3A1px%20solid%20%23ddd%7Dtable%2EdataTable%2Ecell%2Dborder%20tbody%20tr%20th%3Afirst%2Dchild%2Ctable%2EdataTable%2Ecell%2Dborder%20tbody%20tr%20td%3Afirst%2Dchild%7Bborder%2Dleft%3A1px%20solid%20%23ddd%7Dtable%2EdataTable%2Ecell%2Dborder%20tbody%20tr%3Afirst%2Dchild%20th%2Ctable%2EdataTable%2Ecell%2Dborder%20tbody%20tr%3Afirst%2Dchild%20td%7Bborder%2Dtop%3Anone%7Dtable%2EdataTable%2Estripe%20tbody%20tr%2Eodd%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%2Eodd%7Bbackground%2Dcolor%3A%23f9f9f9%7Dtable%2EdataTable%2Estripe%20tbody%20tr%2Eodd%2Eselected%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%2Eodd%2Eselected%7Bbackground%2Dcolor%3A%23acbad4%7Dtable%2EdataTable%2Ehover%20tbody%20tr%3Ahover%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%3Ahover%7Bbackground%2Dcolor%3A%23f6f6f6%7Dtable%2EdataTable%2Ehover%20tbody%20tr%3Ahover%2Eselected%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%3Ahover%2Eselected%7Bbackground%2Dcolor%3A%23aab7d1%7Dtable%2EdataTable%2Eorder%2Dcolumn%20tbody%20tr%3E%2Esorting%5F1%2Ctable%2EdataTable%2Eorder%2Dcolumn%20tbody%20tr%3E%2Esorting%5F2%2Ctable%2EdataTable%2Eorder%2Dcolumn%20tbody%20tr%3E%2Esorting%5F3%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%3E%2Esorting%5F1%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%3E%2Esorting%5F2%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%3E%2Esorting%5F3%7Bbackground%2Dcolor%3A%23fafafa%7Dtable%2EdataTable%2Eorder%2Dcolumn%20tbody%20tr%2Eselected%3E%2Esorting%5F1%2Ctable%2EdataTable%2Eorder%2Dcolumn%20tbody%20tr%2Eselected%3E%2Esorting%5F2%2Ctable%2EdataTable%2Eorder%2Dcolumn%20tbody%20tr%2Eselected%3E%2Esorting%5F3%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%2Eselected%3E%2Esorting%5F1%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%2Eselected%3E%2Esorting%5F2%2Ctable%2EdataTable%2Edisplay%20tbody%20tr%2Eselected%3E%2Esorting%5F3%7Bbackground%2Dcolor%3A%23acbad5%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eodd%3E%2Esorting%5F1%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eodd%3E%2Esorting%5F1%7Bbackground%2Dcolor%3A%23f1f1f1%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eodd%3E%2Esorting%5F2%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eodd%3E%2Esorting%5F2%7Bbackground%2Dcolor%3A%23f3f3f3%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eodd%3E%2Esorting%5F3%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eodd%3E%2Esorting%5F3%7Bbackground%2Dcolor%3Awhitesmoke%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eodd%2Eselected%3E%2Esorting%5F1%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eodd%2Eselected%3E%2Esorting%5F1%7Bbackground%2Dcolor%3A%23a6b4cd%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eodd%2Eselected%3E%2Esorting%5F2%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eodd%2Eselected%3E%2Esorting%5F2%7Bbackground%2Dcolor%3A%23a8b5cf%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eodd%2Eselected%3E%2Esorting%5F3%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eodd%2Eselected%3E%2Esorting%5F3%7Bbackground%2Dcolor%3A%23a9b7d1%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eeven%3E%2Esorting%5F1%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eeven%3E%2Esorting%5F1%7Bbackground%2Dcolor%3A%23fafafa%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eeven%3E%2Esorting%5F2%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eeven%3E%2Esorting%5F2%7Bbackground%2Dcolor%3A%23fcfcfc%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eeven%3E%2Esorting%5F3%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eeven%3E%2Esorting%5F3%7Bbackground%2Dcolor%3A%23fefefe%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eeven%2Eselected%3E%2Esorting%5F1%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eeven%2Eselected%3E%2Esorting%5F1%7Bbackground%2Dcolor%3A%23acbad5%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eeven%2Eselected%3E%2Esorting%5F2%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eeven%2Eselected%3E%2Esorting%5F2%7Bbackground%2Dcolor%3A%23aebcd6%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%2Eeven%2Eselected%3E%2Esorting%5F3%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Estripe%20tbody%20tr%2Eeven%2Eselected%3E%2Esorting%5F3%7Bbackground%2Dcolor%3A%23afbdd8%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%3Ahover%3E%2Esorting%5F1%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Ehover%20tbody%20tr%3Ahover%3E%2Esorting%5F1%7Bbackground%2Dcolor%3A%23eaeaea%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%3Ahover%3E%2Esorting%5F2%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Ehover%20tbody%20tr%3Ahover%3E%2Esorting%5F2%7Bbackground%2Dcolor%3A%23ececec%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%3Ahover%3E%2Esorting%5F3%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Ehover%20tbody%20tr%3Ahover%3E%2Esorting%5F3%7Bbackground%2Dcolor%3A%23efefef%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%3Ahover%2Eselected%3E%2Esorting%5F1%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Ehover%20tbody%20tr%3Ahover%2Eselected%3E%2Esorting%5F1%7Bbackground%2Dcolor%3A%23a2aec7%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%3Ahover%2Eselected%3E%2Esorting%5F2%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Ehover%20tbody%20tr%3Ahover%2Eselected%3E%2Esorting%5F2%7Bbackground%2Dcolor%3A%23a3b0c9%7Dtable%2EdataTable%2Edisplay%20tbody%20tr%3Ahover%2Eselected%3E%2Esorting%5F3%2Ctable%2EdataTable%2Eorder%2Dcolumn%2Ehover%20tbody%20tr%3Ahover%2Eselected%3E%2Esorting%5F3%7Bbackground%2Dcolor%3A%23a5b2cb%7Dtable%2EdataTable%2Eno%2Dfooter%7Bborder%2Dbottom%3A1px%20solid%20%23111%7Dtable%2EdataTable%2Enowrap%20th%2Ctable%2EdataTable%2Enowrap%20td%7Bwhite%2Dspace%3Anowrap%7Dtable%2EdataTable%2Ecompact%20thead%20th%2Ctable%2EdataTable%2Ecompact%20thead%20td%7Bpadding%3A4px%2017px%204px%204px%7Dtable%2EdataTable%2Ecompact%20tfoot%20th%2Ctable%2EdataTable%2Ecompact%20tfoot%20td%7Bpadding%3A4px%7Dtable%2EdataTable%2Ecompact%20tbody%20th%2Ctable%2EdataTable%2Ecompact%20tbody%20td%7Bpadding%3A4px%7Dtable%2EdataTable%20th%2Edt%2Dleft%2Ctable%2EdataTable%20td%2Edt%2Dleft%7Btext%2Dalign%3Aleft%7Dtable%2EdataTable%20th%2Edt%2Dcenter%2Ctable%2EdataTable%20td%2Edt%2Dcenter%2Ctable%2EdataTable%20td%2EdataTables%5Fempty%7Btext%2Dalign%3Acenter%7Dtable%2EdataTable%20th%2Edt%2Dright%2Ctable%2EdataTable%20td%2Edt%2Dright%7Btext%2Dalign%3Aright%7Dtable%2EdataTable%20th%2Edt%2Djustify%2Ctable%2EdataTable%20td%2Edt%2Djustify%7Btext%2Dalign%3Ajustify%7Dtable%2EdataTable%20th%2Edt%2Dnowrap%2Ctable%2EdataTable%20td%2Edt%2Dnowrap%7Bwhite%2Dspace%3Anowrap%7Dtable%2EdataTable%20thead%20th%2Edt%2Dhead%2Dleft%2Ctable%2EdataTable%20thead%20td%2Edt%2Dhead%2Dleft%2Ctable%2EdataTable%20tfoot%20th%2Edt%2Dhead%2Dleft%2Ctable%2EdataTable%20tfoot%20td%2Edt%2Dhead%2Dleft%7Btext%2Dalign%3Aleft%7Dtable%2EdataTable%20thead%20th%2Edt%2Dhead%2Dcenter%2Ctable%2EdataTable%20thead%20td%2Edt%2Dhead%2Dcenter%2Ctable%2EdataTable%20tfoot%20th%2Edt%2Dhead%2Dcenter%2Ctable%2EdataTable%20tfoot%20td%2Edt%2Dhead%2Dcenter%7Btext%2Dalign%3Acenter%7Dtable%2EdataTable%20thead%20th%2Edt%2Dhead%2Dright%2Ctable%2EdataTable%20thead%20td%2Edt%2Dhead%2Dright%2Ctable%2EdataTable%20tfoot%20th%2Edt%2Dhead%2Dright%2Ctable%2EdataTable%20tfoot%20td%2Edt%2Dhead%2Dright%7Btext%2Dalign%3Aright%7Dtable%2EdataTable%20thead%20th%2Edt%2Dhead%2Djustify%2Ctable%2EdataTable%20thead%20td%2Edt%2Dhead%2Djustify%2Ctable%2EdataTable%20tfoot%20th%2Edt%2Dhead%2Djustify%2Ctable%2EdataTable%20tfoot%20td%2Edt%2Dhead%2Djustify%7Btext%2Dalign%3Ajustify%7Dtable%2EdataTable%20thead%20th%2Edt%2Dhead%2Dnowrap%2Ctable%2EdataTable%20thead%20td%2Edt%2Dhead%2Dnowrap%2Ctable%2EdataTable%20tfoot%20th%2Edt%2Dhead%2Dnowrap%2Ctable%2EdataTable%20tfoot%20td%2Edt%2Dhead%2Dnowrap%7Bwhite%2Dspace%3Anowrap%7Dtable%2EdataTable%20tbody%20th%2Edt%2Dbody%2Dleft%2Ctable%2EdataTable%20tbody%20td%2Edt%2Dbody%2Dleft%7Btext%2Dalign%3Aleft%7Dtable%2EdataTable%20tbody%20th%2Edt%2Dbody%2Dcenter%2Ctable%2EdataTable%20tbody%20td%2Edt%2Dbody%2Dcenter%7Btext%2Dalign%3Acenter%7Dtable%2EdataTable%20tbody%20th%2Edt%2Dbody%2Dright%2Ctable%2EdataTable%20tbody%20td%2Edt%2Dbody%2Dright%7Btext%2Dalign%3Aright%7Dtable%2EdataTable%20tbody%20th%2Edt%2Dbody%2Djustify%2Ctable%2EdataTable%20tbody%20td%2Edt%2Dbody%2Djustify%7Btext%2Dalign%3Ajustify%7Dtable%2EdataTable%20tbody%20th%2Edt%2Dbody%2Dnowrap%2Ctable%2EdataTable%20tbody%20td%2Edt%2Dbody%2Dnowrap%7Bwhite%2Dspace%3Anowrap%7Dtable%2EdataTable%2Ctable%2EdataTable%20th%2Ctable%2EdataTable%20td%7B%2Dwebkit%2Dbox%2Dsizing%3Acontent%2Dbox%3Bbox%2Dsizing%3Acontent%2Dbox%7D%2EdataTables%5Fwrapper%7Bposition%3Arelative%3Bclear%3Aboth%3B%2Azoom%3A1%3Bzoom%3A1%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Flength%7Bfloat%3Aleft%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Ffilter%7Bfloat%3Aright%3Btext%2Dalign%3Aright%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Ffilter%20input%7Bmargin%2Dleft%3A0%2E5em%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Finfo%7Bclear%3Aboth%3Bfloat%3Aleft%3Bpadding%2Dtop%3A0%2E755em%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%7Bfloat%3Aright%3Btext%2Dalign%3Aright%3Bpadding%2Dtop%3A0%2E25em%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%20%2Epaginate%5Fbutton%7Bbox%2Dsizing%3Aborder%2Dbox%3Bdisplay%3Ainline%2Dblock%3Bmin%2Dwidth%3A1%2E5em%3Bpadding%3A0%2E5em%201em%3Bmargin%2Dleft%3A2px%3Btext%2Dalign%3Acenter%3Btext%2Ddecoration%3Anone%20%21important%3Bcursor%3Apointer%3B%2Acursor%3Ahand%3Bcolor%3A%23333%20%21important%3Bborder%3A1px%20solid%20transparent%3Bborder%2Dradius%3A2px%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%20%2Epaginate%5Fbutton%2Ecurrent%2C%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%20%2Epaginate%5Fbutton%2Ecurrent%3Ahover%7Bcolor%3A%23333%20%21important%3Bborder%3A1px%20solid%20%23979797%3Bbackground%2Dcolor%3Awhite%3Bbackground%3A%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%20%23fff%29%2C%20color%2Dstop%28100%25%2C%20%23dcdcdc%29%29%3Bbackground%3A%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23dcdcdc%20100%25%29%3Bbackground%3A%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23dcdcdc%20100%25%29%3Bbackground%3A%2Dms%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23dcdcdc%20100%25%29%3Bbackground%3A%2Do%2Dlinear%2Dgradient%28top%2C%20%23fff%200%25%2C%20%23dcdcdc%20100%25%29%3Bbackground%3Alinear%2Dgradient%28to%20bottom%2C%20%23fff%200%25%2C%20%23dcdcdc%20100%25%29%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%20%2Epaginate%5Fbutton%2Edisabled%2C%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%20%2Epaginate%5Fbutton%2Edisabled%3Ahover%2C%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%20%2Epaginate%5Fbutton%2Edisabled%3Aactive%7Bcursor%3Adefault%3Bcolor%3A%23666%20%21important%3Bborder%3A1px%20solid%20transparent%3Bbackground%3Atransparent%3Bbox%2Dshadow%3Anone%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%20%2Epaginate%5Fbutton%3Ahover%7Bcolor%3Awhite%20%21important%3Bborder%3A1px%20solid%20%23111%3Bbackground%2Dcolor%3A%23585858%3Bbackground%3A%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%20%23585858%29%2C%20color%2Dstop%28100%25%2C%20%23111%29%29%3Bbackground%3A%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%23585858%200%25%2C%20%23111%20100%25%29%3Bbackground%3A%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%23585858%200%25%2C%20%23111%20100%25%29%3Bbackground%3A%2Dms%2Dlinear%2Dgradient%28top%2C%20%23585858%200%25%2C%20%23111%20100%25%29%3Bbackground%3A%2Do%2Dlinear%2Dgradient%28top%2C%20%23585858%200%25%2C%20%23111%20100%25%29%3Bbackground%3Alinear%2Dgradient%28to%20bottom%2C%20%23585858%200%25%2C%20%23111%20100%25%29%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%20%2Epaginate%5Fbutton%3Aactive%7Boutline%3Anone%3Bbackground%2Dcolor%3A%232b2b2b%3Bbackground%3A%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%20%232b2b2b%29%2C%20color%2Dstop%28100%25%2C%20%230c0c0c%29%29%3Bbackground%3A%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%232b2b2b%200%25%2C%20%230c0c0c%20100%25%29%3Bbackground%3A%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%232b2b2b%200%25%2C%20%230c0c0c%20100%25%29%3Bbackground%3A%2Dms%2Dlinear%2Dgradient%28top%2C%20%232b2b2b%200%25%2C%20%230c0c0c%20100%25%29%3Bbackground%3A%2Do%2Dlinear%2Dgradient%28top%2C%20%232b2b2b%200%25%2C%20%230c0c0c%20100%25%29%3Bbackground%3Alinear%2Dgradient%28to%20bottom%2C%20%232b2b2b%200%25%2C%20%230c0c0c%20100%25%29%3Bbox%2Dshadow%3Ainset%200%200%203px%20%23111%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%20%2Eellipsis%7Bpadding%3A0%201em%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fprocessing%7Bposition%3Aabsolute%3Btop%3A50%25%3Bleft%3A50%25%3Bwidth%3A100%25%3Bheight%3A40px%3Bmargin%2Dleft%3A%2D50%25%3Bmargin%2Dtop%3A%2D25px%3Bpadding%2Dtop%3A20px%3Btext%2Dalign%3Acenter%3Bfont%2Dsize%3A1%2E2em%3Bbackground%2Dcolor%3Awhite%3Bbackground%3A%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20right%20top%2C%20color%2Dstop%280%25%2C%20rgba%28255%2C255%2C255%2C0%29%29%2C%20color%2Dstop%2825%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%29%2C%20color%2Dstop%2875%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%29%2C%20color%2Dstop%28100%25%2C%20rgba%28255%2C255%2C255%2C0%29%29%29%3Bbackground%3A%2Dwebkit%2Dlinear%2Dgradient%28left%2C%20rgba%28255%2C255%2C255%2C0%29%200%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%2025%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%2075%25%2C%20rgba%28255%2C255%2C255%2C0%29%20100%25%29%3Bbackground%3A%2Dmoz%2Dlinear%2Dgradient%28left%2C%20rgba%28255%2C255%2C255%2C0%29%200%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%2025%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%2075%25%2C%20rgba%28255%2C255%2C255%2C0%29%20100%25%29%3Bbackground%3A%2Dms%2Dlinear%2Dgradient%28left%2C%20rgba%28255%2C255%2C255%2C0%29%200%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%2025%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%2075%25%2C%20rgba%28255%2C255%2C255%2C0%29%20100%25%29%3Bbackground%3A%2Do%2Dlinear%2Dgradient%28left%2C%20rgba%28255%2C255%2C255%2C0%29%200%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%2025%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%2075%25%2C%20rgba%28255%2C255%2C255%2C0%29%20100%25%29%3Bbackground%3Alinear%2Dgradient%28to%20right%2C%20rgba%28255%2C255%2C255%2C0%29%200%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%2025%25%2C%20rgba%28255%2C255%2C255%2C0%2E9%29%2075%25%2C%20rgba%28255%2C255%2C255%2C0%29%20100%25%29%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Flength%2C%2EdataTables%5Fwrapper%20%2EdataTables%5Ffilter%2C%2EdataTables%5Fwrapper%20%2EdataTables%5Finfo%2C%2EdataTables%5Fwrapper%20%2EdataTables%5Fprocessing%2C%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%7Bcolor%3A%23333%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fscroll%7Bclear%3Aboth%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fscroll%20div%2EdataTables%5FscrollBody%7B%2Amargin%2Dtop%3A%2D1px%3B%2Dwebkit%2Doverflow%2Dscrolling%3Atouch%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fscroll%20div%2EdataTables%5FscrollBody%20th%2C%2EdataTables%5Fwrapper%20%2EdataTables%5Fscroll%20div%2EdataTables%5FscrollBody%20td%7Bvertical%2Dalign%3Amiddle%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fscroll%20div%2EdataTables%5FscrollBody%20th%3Ediv%2EdataTables%5Fsizing%2C%2EdataTables%5Fwrapper%20%2EdataTables%5Fscroll%20div%2EdataTables%5FscrollBody%20td%3Ediv%2EdataTables%5Fsizing%7Bheight%3A0%3Boverflow%3Ahidden%3Bmargin%3A0%20%21important%3Bpadding%3A0%20%21important%7D%2EdataTables%5Fwrapper%2Eno%2Dfooter%20%2EdataTables%5FscrollBody%7Bborder%2Dbottom%3A1px%20solid%20%23111%7D%2EdataTables%5Fwrapper%2Eno%2Dfooter%20div%2EdataTables%5FscrollHead%20table%2C%2EdataTables%5Fwrapper%2Eno%2Dfooter%20div%2EdataTables%5FscrollBody%20table%7Bborder%2Dbottom%3Anone%7D%2EdataTables%5Fwrapper%3Aafter%7Bvisibility%3Ahidden%3Bdisplay%3Ablock%3Bcontent%3A%22%22%3Bclear%3Aboth%3Bheight%3A0%7D%40media%20screen%20and%20%28max%2Dwidth%3A%20767px%29%7B%2EdataTables%5Fwrapper%20%2EdataTables%5Finfo%2C%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%7Bfloat%3Anone%3Btext%2Dalign%3Acenter%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Fpaginate%7Bmargin%2Dtop%3A0%2E5em%7D%7D%40media%20screen%20and%20%28max%2Dwidth%3A%20640px%29%7B%2EdataTables%5Fwrapper%20%2EdataTables%5Flength%2C%2EdataTables%5Fwrapper%20%2EdataTables%5Ffilter%7Bfloat%3Anone%3Btext%2Dalign%3Acenter%7D%2EdataTables%5Fwrapper%20%2EdataTables%5Ffilter%7Bmargin%2Dtop%3A0%2E5em%7D%7D%0A" rel="stylesheet" /> <link href="data:text/css;charset=utf-8,%0Atable%2EdataTable%20tr%2Eselected%20td%2C%20table%2EdataTable%20td%2Eselected%20%7B%0Abackground%2Dcolor%3A%20%23b0bed9%20%21important%3B%0A%7D%0A%0A%2EdataTables%5FscrollBody%20%2EdataTables%5Fsizing%20%7B%0Avisibility%3A%20hidden%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyohCiBEYXRhVGFibGVzIDEuMTAuMTIKIMKpMjAwOC0yMDE1IFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiovCihmdW5jdGlvbihoKXsiZnVuY3Rpb24iPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxmdW5jdGlvbihEKXtyZXR1cm4gaChELHdpbmRvdyxkb2N1bWVudCl9KToib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKEQsSSl7RHx8KEQ9d2luZG93KTtJfHwoST0idW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3c/cmVxdWlyZSgianF1ZXJ5Iik6cmVxdWlyZSgianF1ZXJ5IikoRCkpO3JldHVybiBoKEksRCxELmRvY3VtZW50KX06aChqUXVlcnksd2luZG93LGRvY3VtZW50KX0pKGZ1bmN0aW9uKGgsRCxJLGspe2Z1bmN0aW9uIFgoYSl7dmFyIGIsYyxkPXt9O2guZWFjaChhLGZ1bmN0aW9uKGUpe2lmKChiPWUubWF0Y2goL14oW15BLVpdKz8pKFtBLVpdKS8pKSYmLTEhPT0iYSBhYSBhaSBhbyBhcyBiIGZuIGkgbSBvIHMgIi5pbmRleE9mKGJbMV0rIiAiKSljPWUucmVwbGFjZShiWzBdLGJbMl0udG9Mb3dlckNhc2UoKSksCmRbY109ZSwibyI9PT1iWzFdJiZYKGFbZV0pfSk7YS5faHVuZ2FyaWFuTWFwPWR9ZnVuY3Rpb24gSyhhLGIsYyl7YS5faHVuZ2FyaWFuTWFwfHxYKGEpO3ZhciBkO2guZWFjaChiLGZ1bmN0aW9uKGUpe2Q9YS5faHVuZ2FyaWFuTWFwW2VdO2lmKGQhPT1rJiYoY3x8YltkXT09PWspKSJvIj09PWQuY2hhckF0KDApPyhiW2RdfHwoYltkXT17fSksaC5leHRlbmQoITAsYltkXSxiW2VdKSxLKGFbZF0sYltkXSxjKSk6YltkXT1iW2VdfSl9ZnVuY3Rpb24gRGEoYSl7dmFyIGI9bS5kZWZhdWx0cy5vTGFuZ3VhZ2UsYz1hLnNaZXJvUmVjb3JkczshYS5zRW1wdHlUYWJsZSYmKGMmJiJObyBkYXRhIGF2YWlsYWJsZSBpbiB0YWJsZSI9PT1iLnNFbXB0eVRhYmxlKSYmRShhLGEsInNaZXJvUmVjb3JkcyIsInNFbXB0eVRhYmxlIik7IWEuc0xvYWRpbmdSZWNvcmRzJiYoYyYmIkxvYWRpbmcuLi4iPT09Yi5zTG9hZGluZ1JlY29yZHMpJiZFKGEsYSwic1plcm9SZWNvcmRzIiwic0xvYWRpbmdSZWNvcmRzIik7CmEuc0luZm9UaG91c2FuZHMmJihhLnNUaG91c2FuZHM9YS5zSW5mb1Rob3VzYW5kcyk7KGE9YS5zRGVjaW1hbCkmJmRiKGEpfWZ1bmN0aW9uIGViKGEpe0EoYSwib3JkZXJpbmciLCJiU29ydCIpO0EoYSwib3JkZXJNdWx0aSIsImJTb3J0TXVsdGkiKTtBKGEsIm9yZGVyQ2xhc3NlcyIsImJTb3J0Q2xhc3NlcyIpO0EoYSwib3JkZXJDZWxsc1RvcCIsImJTb3J0Q2VsbHNUb3AiKTtBKGEsIm9yZGVyIiwiYWFTb3J0aW5nIik7QShhLCJvcmRlckZpeGVkIiwiYWFTb3J0aW5nRml4ZWQiKTtBKGEsInBhZ2luZyIsImJQYWdpbmF0ZSIpO0EoYSwicGFnaW5nVHlwZSIsInNQYWdpbmF0aW9uVHlwZSIpO0EoYSwicGFnZUxlbmd0aCIsImlEaXNwbGF5TGVuZ3RoIik7QShhLCJzZWFyY2hpbmciLCJiRmlsdGVyIik7ImJvb2xlYW4iPT09dHlwZW9mIGEuc1Njcm9sbFgmJihhLnNTY3JvbGxYPWEuc1Njcm9sbFg/IjEwMCUiOiIiKTsiYm9vbGVhbiI9PT10eXBlb2YgYS5zY3JvbGxYJiYoYS5zY3JvbGxYPQphLnNjcm9sbFg/IjEwMCUiOiIiKTtpZihhPWEuYW9TZWFyY2hDb2xzKWZvcih2YXIgYj0wLGM9YS5sZW5ndGg7YjxjO2IrKylhW2JdJiZLKG0ubW9kZWxzLm9TZWFyY2gsYVtiXSl9ZnVuY3Rpb24gZmIoYSl7QShhLCJvcmRlcmFibGUiLCJiU29ydGFibGUiKTtBKGEsIm9yZGVyRGF0YSIsImFEYXRhU29ydCIpO0EoYSwib3JkZXJTZXF1ZW5jZSIsImFzU29ydGluZyIpO0EoYSwib3JkZXJEYXRhVHlwZSIsInNvcnREYXRhVHlwZSIpO3ZhciBiPWEuYURhdGFTb3J0O2ImJiFoLmlzQXJyYXkoYikmJihhLmFEYXRhU29ydD1bYl0pfWZ1bmN0aW9uIGdiKGEpe2lmKCFtLl9fYnJvd3Nlcil7dmFyIGI9e307bS5fX2Jyb3dzZXI9Yjt2YXIgYz1oKCI8ZGl2Lz4iKS5jc3Moe3Bvc2l0aW9uOiJmaXhlZCIsdG9wOjAsbGVmdDowLGhlaWdodDoxLHdpZHRoOjEsb3ZlcmZsb3c6ImhpZGRlbiJ9KS5hcHBlbmQoaCgiPGRpdi8+IikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDoxLGxlZnQ6MSwKd2lkdGg6MTAwLG92ZXJmbG93OiJzY3JvbGwifSkuYXBwZW5kKGgoIjxkaXYvPiIpLmNzcyh7d2lkdGg6IjEwMCUiLGhlaWdodDoxMH0pKSkuYXBwZW5kVG8oImJvZHkiKSxkPWMuY2hpbGRyZW4oKSxlPWQuY2hpbGRyZW4oKTtiLmJhcldpZHRoPWRbMF0ub2Zmc2V0V2lkdGgtZFswXS5jbGllbnRXaWR0aDtiLmJTY3JvbGxPdmVyc2l6ZT0xMDA9PT1lWzBdLm9mZnNldFdpZHRoJiYxMDAhPT1kWzBdLmNsaWVudFdpZHRoO2IuYlNjcm9sbGJhckxlZnQ9MSE9PU1hdGgucm91bmQoZS5vZmZzZXQoKS5sZWZ0KTtiLmJCb3VuZGluZz1jWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoPyEwOiExO2MucmVtb3ZlKCl9aC5leHRlbmQoYS5vQnJvd3NlcixtLl9fYnJvd3Nlcik7YS5vU2Nyb2xsLmlCYXJXaWR0aD1tLl9fYnJvd3Nlci5iYXJXaWR0aH1mdW5jdGlvbiBoYihhLGIsYyxkLGUsZil7dmFyIGcsaj0hMTtjIT09ayYmKGc9YyxqPSEwKTtmb3IoO2QhPT1lOylhLmhhc093blByb3BlcnR5KGQpJiYKKGc9aj9iKGcsYVtkXSxkLGEpOmFbZF0saj0hMCxkKz1mKTtyZXR1cm4gZ31mdW5jdGlvbiBFYShhLGIpe3ZhciBjPW0uZGVmYXVsdHMuY29sdW1uLGQ9YS5hb0NvbHVtbnMubGVuZ3RoLGM9aC5leHRlbmQoe30sbS5tb2RlbHMub0NvbHVtbixjLHtuVGg6Yj9iOkkuY3JlYXRlRWxlbWVudCgidGgiKSxzVGl0bGU6Yy5zVGl0bGU/Yy5zVGl0bGU6Yj9iLmlubmVySFRNTDoiIixhRGF0YVNvcnQ6Yy5hRGF0YVNvcnQ/Yy5hRGF0YVNvcnQ6W2RdLG1EYXRhOmMubURhdGE/Yy5tRGF0YTpkLGlkeDpkfSk7YS5hb0NvbHVtbnMucHVzaChjKTtjPWEuYW9QcmVTZWFyY2hDb2xzO2NbZF09aC5leHRlbmQoe30sbS5tb2RlbHMub1NlYXJjaCxjW2RdKTtqYShhLGQsaChiKS5kYXRhKCkpfWZ1bmN0aW9uIGphKGEsYixjKXt2YXIgYj1hLmFvQ29sdW1uc1tiXSxkPWEub0NsYXNzZXMsZT1oKGIublRoKTtpZighYi5zV2lkdGhPcmlnKXtiLnNXaWR0aE9yaWc9ZS5hdHRyKCJ3aWR0aCIpfHxudWxsO3ZhciBmPQooZS5hdHRyKCJzdHlsZSIpfHwiIikubWF0Y2goL3dpZHRoOlxzKihcZCtbcHhlbSVdKykvKTtmJiYoYi5zV2lkdGhPcmlnPWZbMV0pfWMhPT1rJiZudWxsIT09YyYmKGZiKGMpLEsobS5kZWZhdWx0cy5jb2x1bW4sYyksYy5tRGF0YVByb3AhPT1rJiYhYy5tRGF0YSYmKGMubURhdGE9Yy5tRGF0YVByb3ApLGMuc1R5cGUmJihiLl9zTWFudWFsVHlwZT1jLnNUeXBlKSxjLmNsYXNzTmFtZSYmIWMuc0NsYXNzJiYoYy5zQ2xhc3M9Yy5jbGFzc05hbWUpLGguZXh0ZW5kKGIsYyksRShiLGMsInNXaWR0aCIsInNXaWR0aE9yaWciKSxjLmlEYXRhU29ydCE9PWsmJihiLmFEYXRhU29ydD1bYy5pRGF0YVNvcnRdKSxFKGIsYywiYURhdGFTb3J0IikpO3ZhciBnPWIubURhdGEsaj1RKGcpLGk9Yi5tUmVuZGVyP1EoYi5tUmVuZGVyKTpudWxsLGM9ZnVuY3Rpb24oYSl7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgYSYmLTEhPT1hLmluZGV4T2YoIkAiKX07Yi5fYkF0dHJTcmM9aC5pc1BsYWluT2JqZWN0KGcpJiYKKGMoZy5zb3J0KXx8YyhnLnR5cGUpfHxjKGcuZmlsdGVyKSk7Yi5fc2V0dGVyPW51bGw7Yi5mbkdldERhdGE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWooYSxiLGssYyk7cmV0dXJuIGkmJmI/aShkLGIsYSxjKTpkfTtiLmZuU2V0RGF0YT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFIoZykoYSxiLGMpfTsibnVtYmVyIiE9PXR5cGVvZiBnJiYoYS5fcm93UmVhZE9iamVjdD0hMCk7YS5vRmVhdHVyZXMuYlNvcnR8fChiLmJTb3J0YWJsZT0hMSxlLmFkZENsYXNzKGQuc1NvcnRhYmxlTm9uZSkpO2E9LTEhPT1oLmluQXJyYXkoImFzYyIsYi5hc1NvcnRpbmcpO2M9LTEhPT1oLmluQXJyYXkoImRlc2MiLGIuYXNTb3J0aW5nKTshYi5iU29ydGFibGV8fCFhJiYhYz8oYi5zU29ydGluZ0NsYXNzPWQuc1NvcnRhYmxlTm9uZSxiLnNTb3J0aW5nQ2xhc3NKVUk9IiIpOmEmJiFjPyhiLnNTb3J0aW5nQ2xhc3M9ZC5zU29ydGFibGVBc2MsYi5zU29ydGluZ0NsYXNzSlVJPWQuc1NvcnRKVUlBc2NBbGxvd2VkKToKIWEmJmM/KGIuc1NvcnRpbmdDbGFzcz1kLnNTb3J0YWJsZURlc2MsYi5zU29ydGluZ0NsYXNzSlVJPWQuc1NvcnRKVUlEZXNjQWxsb3dlZCk6KGIuc1NvcnRpbmdDbGFzcz1kLnNTb3J0YWJsZSxiLnNTb3J0aW5nQ2xhc3NKVUk9ZC5zU29ydEpVSSl9ZnVuY3Rpb24gWShhKXtpZighMSE9PWEub0ZlYXR1cmVzLmJBdXRvV2lkdGgpe3ZhciBiPWEuYW9Db2x1bW5zO0ZhKGEpO2Zvcih2YXIgYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKyliW2NdLm5UaC5zdHlsZS53aWR0aD1iW2NdLnNXaWR0aH1iPWEub1Njcm9sbDsoIiIhPT1iLnNZfHwiIiE9PWIuc1gpJiZrYShhKTt1KGEsbnVsbCwiY29sdW1uLXNpemluZyIsW2FdKX1mdW5jdGlvbiBaKGEsYil7dmFyIGM9bGEoYSwiYlZpc2libGUiKTtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBjW2JdP2NbYl06bnVsbH1mdW5jdGlvbiAkKGEsYil7dmFyIGM9bGEoYSwiYlZpc2libGUiKSxjPWguaW5BcnJheShiLGMpO3JldHVybi0xIT09Yz9jOm51bGx9CmZ1bmN0aW9uIGFhKGEpe3ZhciBiPTA7aC5lYWNoKGEuYW9Db2x1bW5zLGZ1bmN0aW9uKGEsZCl7ZC5iVmlzaWJsZSYmIm5vbmUiIT09aChkLm5UaCkuY3NzKCJkaXNwbGF5IikmJmIrK30pO3JldHVybiBifWZ1bmN0aW9uIGxhKGEsYil7dmFyIGM9W107aC5tYXAoYS5hb0NvbHVtbnMsZnVuY3Rpb24oYSxlKXthW2JdJiZjLnB1c2goZSl9KTtyZXR1cm4gY31mdW5jdGlvbiBHYShhKXt2YXIgYj1hLmFvQ29sdW1ucyxjPWEuYW9EYXRhLGQ9bS5leHQudHlwZS5kZXRlY3QsZSxmLGcsaixpLGgsbCxxLHQ7ZT0wO2ZvcihmPWIubGVuZ3RoO2U8ZjtlKyspaWYobD1iW2VdLHQ9W10sIWwuc1R5cGUmJmwuX3NNYW51YWxUeXBlKWwuc1R5cGU9bC5fc01hbnVhbFR5cGU7ZWxzZSBpZighbC5zVHlwZSl7Zz0wO2ZvcihqPWQubGVuZ3RoO2c8ajtnKyspe2k9MDtmb3IoaD1jLmxlbmd0aDtpPGg7aSsrKXt0W2ldPT09ayYmKHRbaV09QihhLGksZSwidHlwZSIpKTtxPWRbZ10odFtpXSxhKTtpZighcSYmCmchPT1kLmxlbmd0aC0xKWJyZWFrO2lmKCJodG1sIj09PXEpYnJlYWt9aWYocSl7bC5zVHlwZT1xO2JyZWFrfX1sLnNUeXBlfHwobC5zVHlwZT0ic3RyaW5nIil9fWZ1bmN0aW9uIGliKGEsYixjLGQpe3ZhciBlLGYsZyxqLGksbixsPWEuYW9Db2x1bW5zO2lmKGIpZm9yKGU9Yi5sZW5ndGgtMTswPD1lO2UtLSl7bj1iW2VdO3ZhciBxPW4udGFyZ2V0cyE9PWs/bi50YXJnZXRzOm4uYVRhcmdldHM7aC5pc0FycmF5KHEpfHwocT1bcV0pO2Y9MDtmb3IoZz1xLmxlbmd0aDtmPGc7ZisrKWlmKCJudW1iZXIiPT09dHlwZW9mIHFbZl0mJjA8PXFbZl0pe2Zvcig7bC5sZW5ndGg8PXFbZl07KUVhKGEpO2QocVtmXSxuKX1lbHNlIGlmKCJudW1iZXIiPT09dHlwZW9mIHFbZl0mJjA+cVtmXSlkKGwubGVuZ3RoK3FbZl0sbik7ZWxzZSBpZigic3RyaW5nIj09PXR5cGVvZiBxW2ZdKXtqPTA7Zm9yKGk9bC5sZW5ndGg7ajxpO2orKykoIl9hbGwiPT1xW2ZdfHxoKGxbal0ublRoKS5oYXNDbGFzcyhxW2ZdKSkmJgpkKGosbil9fWlmKGMpe2U9MDtmb3IoYT1jLmxlbmd0aDtlPGE7ZSsrKWQoZSxjW2VdKX19ZnVuY3Rpb24gTihhLGIsYyxkKXt2YXIgZT1hLmFvRGF0YS5sZW5ndGgsZj1oLmV4dGVuZCghMCx7fSxtLm1vZGVscy5vUm93LHtzcmM6Yz8iZG9tIjoiZGF0YSIsaWR4OmV9KTtmLl9hRGF0YT1iO2EuYW9EYXRhLnB1c2goZik7Zm9yKHZhciBnPWEuYW9Db2x1bW5zLGo9MCxpPWcubGVuZ3RoO2o8aTtqKyspZ1tqXS5zVHlwZT1udWxsO2EuYWlEaXNwbGF5TWFzdGVyLnB1c2goZSk7Yj1hLnJvd0lkRm4oYik7YiE9PWsmJihhLmFJZHNbYl09Zik7KGN8fCFhLm9GZWF0dXJlcy5iRGVmZXJSZW5kZXIpJiZIYShhLGUsYyxkKTtyZXR1cm4gZX1mdW5jdGlvbiBtYShhLGIpe3ZhciBjO2IgaW5zdGFuY2VvZiBofHwoYj1oKGIpKTtyZXR1cm4gYi5tYXAoZnVuY3Rpb24oYixlKXtjPUlhKGEsZSk7cmV0dXJuIE4oYSxjLmRhdGEsZSxjLmNlbGxzKX0pfWZ1bmN0aW9uIEIoYSxiLGMsZCl7dmFyIGU9YS5pRHJhdywKZj1hLmFvQ29sdW1uc1tjXSxnPWEuYW9EYXRhW2JdLl9hRGF0YSxqPWYuc0RlZmF1bHRDb250ZW50LGk9Zi5mbkdldERhdGEoZyxkLHtzZXR0aW5nczphLHJvdzpiLGNvbDpjfSk7aWYoaT09PWspcmV0dXJuIGEuaURyYXdFcnJvciE9ZSYmbnVsbD09PWomJihMKGEsMCwiUmVxdWVzdGVkIHVua25vd24gcGFyYW1ldGVyICIrKCJmdW5jdGlvbiI9PXR5cGVvZiBmLm1EYXRhPyJ7ZnVuY3Rpb259IjoiJyIrZi5tRGF0YSsiJyIpKyIgZm9yIHJvdyAiK2IrIiwgY29sdW1uICIrYyw0KSxhLmlEcmF3RXJyb3I9ZSksajtpZigoaT09PWd8fG51bGw9PT1pKSYmbnVsbCE9PWomJmQhPT1rKWk9ajtlbHNlIGlmKCJmdW5jdGlvbiI9PT10eXBlb2YgaSlyZXR1cm4gaS5jYWxsKGcpO3JldHVybiBudWxsPT09aSYmImRpc3BsYXkiPT1kPyIiOml9ZnVuY3Rpb24gamIoYSxiLGMsZCl7YS5hb0NvbHVtbnNbY10uZm5TZXREYXRhKGEuYW9EYXRhW2JdLl9hRGF0YSxkLHtzZXR0aW5nczphLHJvdzpiLGNvbDpjfSl9CmZ1bmN0aW9uIEphKGEpe3JldHVybiBoLm1hcChhLm1hdGNoKC8oXFwufFteXC5dKSsvZyl8fFsiIl0sZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvXFwuL2csIi4iKX0pfWZ1bmN0aW9uIFEoYSl7aWYoaC5pc1BsYWluT2JqZWN0KGEpKXt2YXIgYj17fTtoLmVhY2goYSxmdW5jdGlvbihhLGMpe2MmJihiW2FdPVEoYykpfSk7cmV0dXJuIGZ1bmN0aW9uKGEsYyxmLGcpe3ZhciBqPWJbY118fGIuXztyZXR1cm4gaiE9PWs/aihhLGMsZixnKTphfX1pZihudWxsPT09YSlyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSlyZXR1cm4gZnVuY3Rpb24oYixjLGYsZyl7cmV0dXJuIGEoYixjLGYsZyl9O2lmKCJzdHJpbmciPT09dHlwZW9mIGEmJigtMSE9PWEuaW5kZXhPZigiLiIpfHwtMSE9PWEuaW5kZXhPZigiWyIpfHwtMSE9PWEuaW5kZXhPZigiKCIpKSl7dmFyIGM9ZnVuY3Rpb24oYSxiLGYpe3ZhciBnLGo7aWYoIiIhPT1mKXtqPUphKGYpOwpmb3IodmFyIGk9MCxuPWoubGVuZ3RoO2k8bjtpKyspe2Y9altpXS5tYXRjaChiYSk7Zz1qW2ldLm1hdGNoKFUpO2lmKGYpe2pbaV09altpXS5yZXBsYWNlKGJhLCIiKTsiIiE9PWpbaV0mJihhPWFbaltpXV0pO2c9W107ai5zcGxpY2UoMCxpKzEpO2o9ai5qb2luKCIuIik7aWYoaC5pc0FycmF5KGEpKXtpPTA7Zm9yKG49YS5sZW5ndGg7aTxuO2krKylnLnB1c2goYyhhW2ldLGIsaikpfWE9ZlswXS5zdWJzdHJpbmcoMSxmWzBdLmxlbmd0aC0xKTthPSIiPT09YT9nOmcuam9pbihhKTticmVha31lbHNlIGlmKGcpe2pbaV09altpXS5yZXBsYWNlKFUsIiIpO2E9YVtqW2ldXSgpO2NvbnRpbnVlfWlmKG51bGw9PT1hfHxhW2pbaV1dPT09aylyZXR1cm4gazthPWFbaltpXV19fXJldHVybiBhfTtyZXR1cm4gZnVuY3Rpb24oYixlKXtyZXR1cm4gYyhiLGUsYSl9fXJldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYlthXX19ZnVuY3Rpb24gUihhKXtpZihoLmlzUGxhaW5PYmplY3QoYSkpcmV0dXJuIFIoYS5fKTsKaWYobnVsbD09PWEpcmV0dXJuIGZ1bmN0aW9uKCl7fTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpcmV0dXJuIGZ1bmN0aW9uKGIsZCxlKXthKGIsInNldCIsZCxlKX07aWYoInN0cmluZyI9PT10eXBlb2YgYSYmKC0xIT09YS5pbmRleE9mKCIuIil8fC0xIT09YS5pbmRleE9mKCJbIil8fC0xIT09YS5pbmRleE9mKCIoIikpKXt2YXIgYj1mdW5jdGlvbihhLGQsZSl7dmFyIGU9SmEoZSksZjtmPWVbZS5sZW5ndGgtMV07Zm9yKHZhciBnLGosaT0wLG49ZS5sZW5ndGgtMTtpPG47aSsrKXtnPWVbaV0ubWF0Y2goYmEpO2o9ZVtpXS5tYXRjaChVKTtpZihnKXtlW2ldPWVbaV0ucmVwbGFjZShiYSwiIik7YVtlW2ldXT1bXTtmPWUuc2xpY2UoKTtmLnNwbGljZSgwLGkrMSk7Zz1mLmpvaW4oIi4iKTtpZihoLmlzQXJyYXkoZCkpe2o9MDtmb3Iobj1kLmxlbmd0aDtqPG47aisrKWY9e30sYihmLGRbal0sZyksYVtlW2ldXS5wdXNoKGYpfWVsc2UgYVtlW2ldXT1kO3JldHVybn1qJiYoZVtpXT1lW2ldLnJlcGxhY2UoVSwKIiIpLGE9YVtlW2ldXShkKSk7aWYobnVsbD09PWFbZVtpXV18fGFbZVtpXV09PT1rKWFbZVtpXV09e307YT1hW2VbaV1dfWlmKGYubWF0Y2goVSkpYVtmLnJlcGxhY2UoVSwiIildKGQpO2Vsc2UgYVtmLnJlcGxhY2UoYmEsIiIpXT1kfTtyZXR1cm4gZnVuY3Rpb24oYyxkKXtyZXR1cm4gYihjLGQsYSl9fXJldHVybiBmdW5jdGlvbihiLGQpe2JbYV09ZH19ZnVuY3Rpb24gS2EoYSl7cmV0dXJuIEcoYS5hb0RhdGEsIl9hRGF0YSIpfWZ1bmN0aW9uIG5hKGEpe2EuYW9EYXRhLmxlbmd0aD0wO2EuYWlEaXNwbGF5TWFzdGVyLmxlbmd0aD0wO2EuYWlEaXNwbGF5Lmxlbmd0aD0wO2EuYUlkcz17fX1mdW5jdGlvbiBvYShhLGIsYyl7Zm9yKHZhciBkPS0xLGU9MCxmPWEubGVuZ3RoO2U8ZjtlKyspYVtlXT09Yj9kPWU6YVtlXT5iJiZhW2VdLS07IC0xIT1kJiZjPT09ayYmYS5zcGxpY2UoZCwxKX1mdW5jdGlvbiBjYShhLGIsYyxkKXt2YXIgZT1hLmFvRGF0YVtiXSxmLGc9ZnVuY3Rpb24oYyxkKXtmb3IoO2MuY2hpbGROb2Rlcy5sZW5ndGg7KWMucmVtb3ZlQ2hpbGQoYy5maXJzdENoaWxkKTsKYy5pbm5lckhUTUw9QihhLGIsZCwiZGlzcGxheSIpfTtpZigiZG9tIj09PWN8fCghY3x8ImF1dG8iPT09YykmJiJkb20iPT09ZS5zcmMpZS5fYURhdGE9SWEoYSxlLGQsZD09PWs/azplLl9hRGF0YSkuZGF0YTtlbHNle3ZhciBqPWUuYW5DZWxscztpZihqKWlmKGQhPT1rKWcoaltkXSxkKTtlbHNle2M9MDtmb3IoZj1qLmxlbmd0aDtjPGY7YysrKWcoaltjXSxjKX19ZS5fYVNvcnREYXRhPW51bGw7ZS5fYUZpbHRlckRhdGE9bnVsbDtnPWEuYW9Db2x1bW5zO2lmKGQhPT1rKWdbZF0uc1R5cGU9bnVsbDtlbHNle2M9MDtmb3IoZj1nLmxlbmd0aDtjPGY7YysrKWdbY10uc1R5cGU9bnVsbDtMYShhLGUpfX1mdW5jdGlvbiBJYShhLGIsYyxkKXt2YXIgZT1bXSxmPWIuZmlyc3RDaGlsZCxnLGosaT0wLG4sbD1hLmFvQ29sdW1ucyxxPWEuX3Jvd1JlYWRPYmplY3QsZD1kIT09az9kOnE/e306W10sdD1mdW5jdGlvbihhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpe3ZhciBjPWEuaW5kZXhPZigiQCIpOwotMSE9PWMmJihjPWEuc3Vic3RyaW5nKGMrMSksUihhKShkLGIuZ2V0QXR0cmlidXRlKGMpKSl9fSxTPWZ1bmN0aW9uKGEpe2lmKGM9PT1rfHxjPT09aSlqPWxbaV0sbj1oLnRyaW0oYS5pbm5lckhUTUwpLGomJmouX2JBdHRyU3JjPyhSKGoubURhdGEuXykoZCxuKSx0KGoubURhdGEuc29ydCxhKSx0KGoubURhdGEudHlwZSxhKSx0KGoubURhdGEuZmlsdGVyLGEpKTpxPyhqLl9zZXR0ZXJ8fChqLl9zZXR0ZXI9UihqLm1EYXRhKSksai5fc2V0dGVyKGQsbikpOmRbaV09bjtpKyt9O2lmKGYpZm9yKDtmOyl7Zz1mLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7aWYoIlREIj09Z3x8IlRIIj09ZylTKGYpLGUucHVzaChmKTtmPWYubmV4dFNpYmxpbmd9ZWxzZXtlPWIuYW5DZWxscztmPTA7Zm9yKGc9ZS5sZW5ndGg7ZjxnO2YrKylTKGVbZl0pfWlmKGI9Yi5maXJzdENoaWxkP2I6Yi5uVHIpKGI9Yi5nZXRBdHRyaWJ1dGUoImlkIikpJiZSKGEucm93SWQpKGQsYik7cmV0dXJue2RhdGE6ZCxjZWxsczplfX0KZnVuY3Rpb24gSGEoYSxiLGMsZCl7dmFyIGU9YS5hb0RhdGFbYl0sZj1lLl9hRGF0YSxnPVtdLGosaSxuLGwscTtpZihudWxsPT09ZS5uVHIpe2o9Y3x8SS5jcmVhdGVFbGVtZW50KCJ0ciIpO2UublRyPWo7ZS5hbkNlbGxzPWc7ai5fRFRfUm93SW5kZXg9YjtMYShhLGUpO2w9MDtmb3IocT1hLmFvQ29sdW1ucy5sZW5ndGg7bDxxO2wrKyl7bj1hLmFvQ29sdW1uc1tsXTtpPWM/ZFtsXTpJLmNyZWF0ZUVsZW1lbnQobi5zQ2VsbFR5cGUpO2kuX0RUX0NlbGxJbmRleD17cm93OmIsY29sdW1uOmx9O2cucHVzaChpKTtpZigoIWN8fG4ubVJlbmRlcnx8bi5tRGF0YSE9PWwpJiYoIWguaXNQbGFpbk9iamVjdChuLm1EYXRhKXx8bi5tRGF0YS5fIT09bCsiLmRpc3BsYXkiKSlpLmlubmVySFRNTD1CKGEsYixsLCJkaXNwbGF5Iik7bi5zQ2xhc3MmJihpLmNsYXNzTmFtZSs9IiAiK24uc0NsYXNzKTtuLmJWaXNpYmxlJiYhYz9qLmFwcGVuZENoaWxkKGkpOiFuLmJWaXNpYmxlJiZjJiZpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSk7Cm4uZm5DcmVhdGVkQ2VsbCYmbi5mbkNyZWF0ZWRDZWxsLmNhbGwoYS5vSW5zdGFuY2UsaSxCKGEsYixsKSxmLGIsbCl9dShhLCJhb1Jvd0NyZWF0ZWRDYWxsYmFjayIsbnVsbCxbaixmLGJdKX1lLm5Uci5zZXRBdHRyaWJ1dGUoInJvbGUiLCJyb3ciKX1mdW5jdGlvbiBMYShhLGIpe3ZhciBjPWIublRyLGQ9Yi5fYURhdGE7aWYoYyl7dmFyIGU9YS5yb3dJZEZuKGQpO2UmJihjLmlkPWUpO2QuRFRfUm93Q2xhc3MmJihlPWQuRFRfUm93Q2xhc3Muc3BsaXQoIiAiKSxiLl9fcm93Yz1iLl9fcm93Yz9wYShiLl9fcm93Yy5jb25jYXQoZSkpOmUsaChjKS5yZW1vdmVDbGFzcyhiLl9fcm93Yy5qb2luKCIgIikpLmFkZENsYXNzKGQuRFRfUm93Q2xhc3MpKTtkLkRUX1Jvd0F0dHImJmgoYykuYXR0cihkLkRUX1Jvd0F0dHIpO2QuRFRfUm93RGF0YSYmaChjKS5kYXRhKGQuRFRfUm93RGF0YSl9fWZ1bmN0aW9uIGtiKGEpe3ZhciBiLGMsZCxlLGYsZz1hLm5USGVhZCxqPWEublRGb290LGk9MD09PQpoKCJ0aCwgdGQiLGcpLmxlbmd0aCxuPWEub0NsYXNzZXMsbD1hLmFvQ29sdW1ucztpJiYoZT1oKCI8dHIvPiIpLmFwcGVuZFRvKGcpKTtiPTA7Zm9yKGM9bC5sZW5ndGg7YjxjO2IrKylmPWxbYl0sZD1oKGYublRoKS5hZGRDbGFzcyhmLnNDbGFzcyksaSYmZC5hcHBlbmRUbyhlKSxhLm9GZWF0dXJlcy5iU29ydCYmKGQuYWRkQ2xhc3MoZi5zU29ydGluZ0NsYXNzKSwhMSE9PWYuYlNvcnRhYmxlJiYoZC5hdHRyKCJ0YWJpbmRleCIsYS5pVGFiSW5kZXgpLmF0dHIoImFyaWEtY29udHJvbHMiLGEuc1RhYmxlSWQpLE1hKGEsZi5uVGgsYikpKSxmLnNUaXRsZSE9ZFswXS5pbm5lckhUTUwmJmQuaHRtbChmLnNUaXRsZSksTmEoYSwiaGVhZGVyIikoYSxkLGYsbik7aSYmZGEoYS5hb0hlYWRlcixnKTtoKGcpLmZpbmQoIj50ciIpLmF0dHIoInJvbGUiLCJyb3ciKTtoKGcpLmZpbmQoIj50cj50aCwgPnRyPnRkIikuYWRkQ2xhc3Mobi5zSGVhZGVyVEgpO2goaikuZmluZCgiPnRyPnRoLCA+dHI+dGQiKS5hZGRDbGFzcyhuLnNGb290ZXJUSCk7CmlmKG51bGwhPT1qKXthPWEuYW9Gb290ZXJbMF07Yj0wO2ZvcihjPWEubGVuZ3RoO2I8YztiKyspZj1sW2JdLGYublRmPWFbYl0uY2VsbCxmLnNDbGFzcyYmaChmLm5UZikuYWRkQ2xhc3MoZi5zQ2xhc3MpfX1mdW5jdGlvbiBlYShhLGIsYyl7dmFyIGQsZSxmLGc9W10saj1bXSxpPWEuYW9Db2x1bW5zLmxlbmd0aCxuO2lmKGIpe2M9PT1rJiYoYz0hMSk7ZD0wO2ZvcihlPWIubGVuZ3RoO2Q8ZTtkKyspe2dbZF09YltkXS5zbGljZSgpO2dbZF0ublRyPWJbZF0ublRyO2ZvcihmPWktMTswPD1mO2YtLSkhYS5hb0NvbHVtbnNbZl0uYlZpc2libGUmJiFjJiZnW2RdLnNwbGljZShmLDEpO2oucHVzaChbXSl9ZD0wO2ZvcihlPWcubGVuZ3RoO2Q8ZTtkKyspe2lmKGE9Z1tkXS5uVHIpZm9yKDtmPWEuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChmKTtmPTA7Zm9yKGI9Z1tkXS5sZW5ndGg7ZjxiO2YrKylpZihuPWk9MSxqW2RdW2ZdPT09ayl7YS5hcHBlbmRDaGlsZChnW2RdW2ZdLmNlbGwpOwpmb3IoaltkXVtmXT0xO2dbZCtpXSE9PWsmJmdbZF1bZl0uY2VsbD09Z1tkK2ldW2ZdLmNlbGw7KWpbZCtpXVtmXT0xLGkrKztmb3IoO2dbZF1bZituXSE9PWsmJmdbZF1bZl0uY2VsbD09Z1tkXVtmK25dLmNlbGw7KXtmb3IoYz0wO2M8aTtjKyspaltkK2NdW2Yrbl09MTtuKyt9aChnW2RdW2ZdLmNlbGwpLmF0dHIoInJvd3NwYW4iLGkpLmF0dHIoImNvbHNwYW4iLG4pfX19fWZ1bmN0aW9uIE8oYSl7dmFyIGI9dShhLCJhb1ByZURyYXdDYWxsYmFjayIsInByZURyYXciLFthXSk7aWYoLTEhPT1oLmluQXJyYXkoITEsYikpQyhhLCExKTtlbHNle3ZhciBiPVtdLGM9MCxkPWEuYXNTdHJpcGVDbGFzc2VzLGU9ZC5sZW5ndGgsZj1hLm9MYW5ndWFnZSxnPWEuaUluaXREaXNwbGF5U3RhcnQsaj0ic3NwIj09eShhKSxpPWEuYWlEaXNwbGF5O2EuYkRyYXdpbmc9ITA7ZyE9PWsmJi0xIT09ZyYmKGEuX2lEaXNwbGF5U3RhcnQ9aj9nOmc+PWEuZm5SZWNvcmRzRGlzcGxheSgpPzA6ZyxhLmlJbml0RGlzcGxheVN0YXJ0PQotMSk7dmFyIGc9YS5faURpc3BsYXlTdGFydCxuPWEuZm5EaXNwbGF5RW5kKCk7aWYoYS5iRGVmZXJMb2FkaW5nKWEuYkRlZmVyTG9hZGluZz0hMSxhLmlEcmF3KyssQyhhLCExKTtlbHNlIGlmKGope2lmKCFhLmJEZXN0cm95aW5nJiYhbGIoYSkpcmV0dXJufWVsc2UgYS5pRHJhdysrO2lmKDAhPT1pLmxlbmd0aCl7Zj1qP2EuYW9EYXRhLmxlbmd0aDpuO2ZvcihqPWo/MDpnO2o8ZjtqKyspe3ZhciBsPWlbal0scT1hLmFvRGF0YVtsXTtudWxsPT09cS5uVHImJkhhKGEsbCk7bD1xLm5UcjtpZigwIT09ZSl7dmFyIHQ9ZFtjJWVdO3EuX3NSb3dTdHJpcGUhPXQmJihoKGwpLnJlbW92ZUNsYXNzKHEuX3NSb3dTdHJpcGUpLmFkZENsYXNzKHQpLHEuX3NSb3dTdHJpcGU9dCl9dShhLCJhb1Jvd0NhbGxiYWNrIixudWxsLFtsLHEuX2FEYXRhLGMsal0pO2IucHVzaChsKTtjKyt9fWVsc2UgYz1mLnNaZXJvUmVjb3JkcywxPT1hLmlEcmF3JiYiYWpheCI9PXkoYSk/Yz1mLnNMb2FkaW5nUmVjb3JkczoKZi5zRW1wdHlUYWJsZSYmMD09PWEuZm5SZWNvcmRzVG90YWwoKSYmKGM9Zi5zRW1wdHlUYWJsZSksYlswXT1oKCI8dHIvPiIseyJjbGFzcyI6ZT9kWzBdOiIifSkuYXBwZW5kKGgoIjx0ZCAvPiIse3ZhbGlnbjoidG9wIixjb2xTcGFuOmFhKGEpLCJjbGFzcyI6YS5vQ2xhc3Nlcy5zUm93RW1wdHl9KS5odG1sKGMpKVswXTt1KGEsImFvSGVhZGVyQ2FsbGJhY2siLCJoZWFkZXIiLFtoKGEublRIZWFkKS5jaGlsZHJlbigidHIiKVswXSxLYShhKSxnLG4saV0pO3UoYSwiYW9Gb290ZXJDYWxsYmFjayIsImZvb3RlciIsW2goYS5uVEZvb3QpLmNoaWxkcmVuKCJ0ciIpWzBdLEthKGEpLGcsbixpXSk7ZD1oKGEublRCb2R5KTtkLmNoaWxkcmVuKCkuZGV0YWNoKCk7ZC5hcHBlbmQoaChiKSk7dShhLCJhb0RyYXdDYWxsYmFjayIsImRyYXciLFthXSk7YS5iU29ydGVkPSExO2EuYkZpbHRlcmVkPSExO2EuYkRyYXdpbmc9ITF9fWZ1bmN0aW9uIFQoYSxiKXt2YXIgYz1hLm9GZWF0dXJlcyxkPWMuYkZpbHRlcjsKYy5iU29ydCYmbWIoYSk7ZD9mYShhLGEub1ByZXZpb3VzU2VhcmNoKTphLmFpRGlzcGxheT1hLmFpRGlzcGxheU1hc3Rlci5zbGljZSgpOyEwIT09YiYmKGEuX2lEaXNwbGF5U3RhcnQ9MCk7YS5fZHJhd0hvbGQ9YjtPKGEpO2EuX2RyYXdIb2xkPSExfWZ1bmN0aW9uIG5iKGEpe3ZhciBiPWEub0NsYXNzZXMsYz1oKGEublRhYmxlKSxjPWgoIjxkaXYvPiIpLmluc2VydEJlZm9yZShjKSxkPWEub0ZlYXR1cmVzLGU9aCgiPGRpdi8+Iix7aWQ6YS5zVGFibGVJZCsiX3dyYXBwZXIiLCJjbGFzcyI6Yi5zV3JhcHBlcisoYS5uVEZvb3Q/IiI6IiAiK2Iuc05vRm9vdGVyKX0pO2EubkhvbGRpbmc9Y1swXTthLm5UYWJsZVdyYXBwZXI9ZVswXTthLm5UYWJsZVJlaW5zZXJ0QmVmb3JlPWEublRhYmxlLm5leHRTaWJsaW5nO2Zvcih2YXIgZj1hLnNEb20uc3BsaXQoIiIpLGcsaixpLG4sbCxxLHQ9MDt0PGYubGVuZ3RoO3QrKyl7Zz1udWxsO2o9Zlt0XTtpZigiPCI9PWope2k9aCgiPGRpdi8+IilbMF07Cm49Zlt0KzFdO2lmKCInIj09bnx8JyInPT1uKXtsPSIiO2ZvcihxPTI7Zlt0K3FdIT1uOylsKz1mW3QrcV0scSsrOyJIIj09bD9sPWIuc0pVSUhlYWRlcjoiRiI9PWwmJihsPWIuc0pVSUZvb3Rlcik7LTEhPWwuaW5kZXhPZigiLiIpPyhuPWwuc3BsaXQoIi4iKSxpLmlkPW5bMF0uc3Vic3RyKDEsblswXS5sZW5ndGgtMSksaS5jbGFzc05hbWU9blsxXSk6IiMiPT1sLmNoYXJBdCgwKT9pLmlkPWwuc3Vic3RyKDEsbC5sZW5ndGgtMSk6aS5jbGFzc05hbWU9bDt0Kz1xfWUuYXBwZW5kKGkpO2U9aChpKX1lbHNlIGlmKCI+Ij09aillPWUucGFyZW50KCk7ZWxzZSBpZigibCI9PWomJmQuYlBhZ2luYXRlJiZkLmJMZW5ndGhDaGFuZ2UpZz1vYihhKTtlbHNlIGlmKCJmIj09aiYmZC5iRmlsdGVyKWc9cGIoYSk7ZWxzZSBpZigiciI9PWomJmQuYlByb2Nlc3NpbmcpZz1xYihhKTtlbHNlIGlmKCJ0Ij09ailnPXJiKGEpO2Vsc2UgaWYoImkiPT1qJiZkLmJJbmZvKWc9c2IoYSk7ZWxzZSBpZigicCI9PQpqJiZkLmJQYWdpbmF0ZSlnPXRiKGEpO2Vsc2UgaWYoMCE9PW0uZXh0LmZlYXR1cmUubGVuZ3RoKXtpPW0uZXh0LmZlYXR1cmU7cT0wO2ZvcihuPWkubGVuZ3RoO3E8bjtxKyspaWYoaj09aVtxXS5jRmVhdHVyZSl7Zz1pW3FdLmZuSW5pdChhKTticmVha319ZyYmKGk9YS5hYW5GZWF0dXJlcyxpW2pdfHwoaVtqXT1bXSksaVtqXS5wdXNoKGcpLGUuYXBwZW5kKGcpKX1jLnJlcGxhY2VXaXRoKGUpO2EubkhvbGRpbmc9bnVsbH1mdW5jdGlvbiBkYShhLGIpe3ZhciBjPWgoYikuY2hpbGRyZW4oInRyIiksZCxlLGYsZyxqLGksbixsLHEsdDthLnNwbGljZSgwLGEubGVuZ3RoKTtmPTA7Zm9yKGk9Yy5sZW5ndGg7ZjxpO2YrKylhLnB1c2goW10pO2Y9MDtmb3IoaT1jLmxlbmd0aDtmPGk7ZisrKXtkPWNbZl07Zm9yKGU9ZC5maXJzdENoaWxkO2U7KXtpZigiVEQiPT1lLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCl8fCJUSCI9PWUubm9kZU5hbWUudG9VcHBlckNhc2UoKSl7bD0xKmUuZ2V0QXR0cmlidXRlKCJjb2xzcGFuIik7CnE9MSplLmdldEF0dHJpYnV0ZSgicm93c3BhbiIpO2w9IWx8fDA9PT1sfHwxPT09bD8xOmw7cT0hcXx8MD09PXF8fDE9PT1xPzE6cTtnPTA7Zm9yKGo9YVtmXTtqW2ddOylnKys7bj1nO3Q9MT09PWw/ITA6ITE7Zm9yKGo9MDtqPGw7aisrKWZvcihnPTA7ZzxxO2crKylhW2YrZ11bbitqXT17Y2VsbDplLHVuaXF1ZTp0fSxhW2YrZ10ublRyPWR9ZT1lLm5leHRTaWJsaW5nfX19ZnVuY3Rpb24gcWEoYSxiLGMpe3ZhciBkPVtdO2N8fChjPWEuYW9IZWFkZXIsYiYmKGM9W10sZGEoYyxiKSkpO2Zvcih2YXIgYj0wLGU9Yy5sZW5ndGg7YjxlO2IrKylmb3IodmFyIGY9MCxnPWNbYl0ubGVuZ3RoO2Y8ZztmKyspaWYoY1tiXVtmXS51bmlxdWUmJighZFtmXXx8IWEuYlNvcnRDZWxsc1RvcCkpZFtmXT1jW2JdW2ZdLmNlbGw7cmV0dXJuIGR9ZnVuY3Rpb24gcmEoYSxiLGMpe3UoYSwiYW9TZXJ2ZXJQYXJhbXMiLCJzZXJ2ZXJQYXJhbXMiLFtiXSk7aWYoYiYmaC5pc0FycmF5KGIpKXt2YXIgZD17fSwKZT0vKC4qPylcW1xdJC87aC5lYWNoKGIsZnVuY3Rpb24oYSxiKXt2YXIgYz1iLm5hbWUubWF0Y2goZSk7Yz8oYz1jWzBdLGRbY118fChkW2NdPVtdKSxkW2NdLnB1c2goYi52YWx1ZSkpOmRbYi5uYW1lXT1iLnZhbHVlfSk7Yj1kfXZhciBmLGc9YS5hamF4LGo9YS5vSW5zdGFuY2UsaT1mdW5jdGlvbihiKXt1KGEsbnVsbCwieGhyIixbYSxiLGEuanFYSFJdKTtjKGIpfTtpZihoLmlzUGxhaW5PYmplY3QoZykmJmcuZGF0YSl7Zj1nLmRhdGE7dmFyIG49aC5pc0Z1bmN0aW9uKGYpP2YoYixhKTpmLGI9aC5pc0Z1bmN0aW9uKGYpJiZuP246aC5leHRlbmQoITAsYixuKTtkZWxldGUgZy5kYXRhfW49e2RhdGE6YixzdWNjZXNzOmZ1bmN0aW9uKGIpe3ZhciBjPWIuZXJyb3J8fGIuc0Vycm9yO2MmJkwoYSwwLGMpO2EuanNvbj1iO2koYil9LGRhdGFUeXBlOiJqc29uIixjYWNoZTohMSx0eXBlOmEuc1NlcnZlck1ldGhvZCxlcnJvcjpmdW5jdGlvbihiLGMpe3ZhciBkPXUoYSxudWxsLCJ4aHIiLApbYSxudWxsLGEuanFYSFJdKTstMT09PWguaW5BcnJheSghMCxkKSYmKCJwYXJzZXJlcnJvciI9PWM/TChhLDAsIkludmFsaWQgSlNPTiByZXNwb25zZSIsMSk6ND09PWIucmVhZHlTdGF0ZSYmTChhLDAsIkFqYXggZXJyb3IiLDcpKTtDKGEsITEpfX07YS5vQWpheERhdGE9Yjt1KGEsbnVsbCwicHJlWGhyIixbYSxiXSk7YS5mblNlcnZlckRhdGE/YS5mblNlcnZlckRhdGEuY2FsbChqLGEuc0FqYXhTb3VyY2UsaC5tYXAoYixmdW5jdGlvbihhLGIpe3JldHVybntuYW1lOmIsdmFsdWU6YX19KSxpLGEpOmEuc0FqYXhTb3VyY2V8fCJzdHJpbmciPT09dHlwZW9mIGc/YS5qcVhIUj1oLmFqYXgoaC5leHRlbmQobix7dXJsOmd8fGEuc0FqYXhTb3VyY2V9KSk6aC5pc0Z1bmN0aW9uKGcpP2EuanFYSFI9Zy5jYWxsKGosYixpLGEpOihhLmpxWEhSPWguYWpheChoLmV4dGVuZChuLGcpKSxnLmRhdGE9Zil9ZnVuY3Rpb24gbGIoYSl7cmV0dXJuIGEuYkFqYXhEYXRhR2V0PyhhLmlEcmF3KyssQyhhLAohMCkscmEoYSx1YihhKSxmdW5jdGlvbihiKXt2YihhLGIpfSksITEpOiEwfWZ1bmN0aW9uIHViKGEpe3ZhciBiPWEuYW9Db2x1bW5zLGM9Yi5sZW5ndGgsZD1hLm9GZWF0dXJlcyxlPWEub1ByZXZpb3VzU2VhcmNoLGY9YS5hb1ByZVNlYXJjaENvbHMsZyxqPVtdLGksbixsLHE9VihhKTtnPWEuX2lEaXNwbGF5U3RhcnQ7aT0hMSE9PWQuYlBhZ2luYXRlP2EuX2lEaXNwbGF5TGVuZ3RoOi0xO3ZhciBrPWZ1bmN0aW9uKGEsYil7ai5wdXNoKHtuYW1lOmEsdmFsdWU6Yn0pfTtrKCJzRWNobyIsYS5pRHJhdyk7aygiaUNvbHVtbnMiLGMpO2soInNDb2x1bW5zIixHKGIsInNOYW1lIikuam9pbigiLCIpKTtrKCJpRGlzcGxheVN0YXJ0IixnKTtrKCJpRGlzcGxheUxlbmd0aCIsaSk7dmFyIFM9e2RyYXc6YS5pRHJhdyxjb2x1bW5zOltdLG9yZGVyOltdLHN0YXJ0OmcsbGVuZ3RoOmksc2VhcmNoOnt2YWx1ZTplLnNTZWFyY2gscmVnZXg6ZS5iUmVnZXh9fTtmb3IoZz0wO2c8YztnKyspbj1iW2ddLApsPWZbZ10saT0iZnVuY3Rpb24iPT10eXBlb2Ygbi5tRGF0YT8iZnVuY3Rpb24iOm4ubURhdGEsUy5jb2x1bW5zLnB1c2goe2RhdGE6aSxuYW1lOm4uc05hbWUsc2VhcmNoYWJsZTpuLmJTZWFyY2hhYmxlLG9yZGVyYWJsZTpuLmJTb3J0YWJsZSxzZWFyY2g6e3ZhbHVlOmwuc1NlYXJjaCxyZWdleDpsLmJSZWdleH19KSxrKCJtRGF0YVByb3BfIitnLGkpLGQuYkZpbHRlciYmKGsoInNTZWFyY2hfIitnLGwuc1NlYXJjaCksaygiYlJlZ2V4XyIrZyxsLmJSZWdleCksaygiYlNlYXJjaGFibGVfIitnLG4uYlNlYXJjaGFibGUpKSxkLmJTb3J0JiZrKCJiU29ydGFibGVfIitnLG4uYlNvcnRhYmxlKTtkLmJGaWx0ZXImJihrKCJzU2VhcmNoIixlLnNTZWFyY2gpLGsoImJSZWdleCIsZS5iUmVnZXgpKTtkLmJTb3J0JiYoaC5lYWNoKHEsZnVuY3Rpb24oYSxiKXtTLm9yZGVyLnB1c2goe2NvbHVtbjpiLmNvbCxkaXI6Yi5kaXJ9KTtrKCJpU29ydENvbF8iK2EsYi5jb2wpO2soInNTb3J0RGlyXyIrCmEsYi5kaXIpfSksaygiaVNvcnRpbmdDb2xzIixxLmxlbmd0aCkpO2I9bS5leHQubGVnYWN5LmFqYXg7cmV0dXJuIG51bGw9PT1iP2Euc0FqYXhTb3VyY2U/ajpTOmI/ajpTfWZ1bmN0aW9uIHZiKGEsYil7dmFyIGM9c2EoYSxiKSxkPWIuc0VjaG8hPT1rP2Iuc0VjaG86Yi5kcmF3LGU9Yi5pVG90YWxSZWNvcmRzIT09az9iLmlUb3RhbFJlY29yZHM6Yi5yZWNvcmRzVG90YWwsZj1iLmlUb3RhbERpc3BsYXlSZWNvcmRzIT09az9iLmlUb3RhbERpc3BsYXlSZWNvcmRzOmIucmVjb3Jkc0ZpbHRlcmVkO2lmKGQpe2lmKDEqZDxhLmlEcmF3KXJldHVybjthLmlEcmF3PTEqZH1uYShhKTthLl9pUmVjb3Jkc1RvdGFsPXBhcnNlSW50KGUsMTApO2EuX2lSZWNvcmRzRGlzcGxheT1wYXJzZUludChmLDEwKTtkPTA7Zm9yKGU9Yy5sZW5ndGg7ZDxlO2QrKylOKGEsY1tkXSk7YS5haURpc3BsYXk9YS5haURpc3BsYXlNYXN0ZXIuc2xpY2UoKTthLmJBamF4RGF0YUdldD0hMTtPKGEpO2EuX2JJbml0Q29tcGxldGV8fAp0YShhLGIpO2EuYkFqYXhEYXRhR2V0PSEwO0MoYSwhMSl9ZnVuY3Rpb24gc2EoYSxiKXt2YXIgYz1oLmlzUGxhaW5PYmplY3QoYS5hamF4KSYmYS5hamF4LmRhdGFTcmMhPT1rP2EuYWpheC5kYXRhU3JjOmEuc0FqYXhEYXRhUHJvcDtyZXR1cm4iZGF0YSI9PT1jP2IuYWFEYXRhfHxiW2NdOiIiIT09Yz9RKGMpKGIpOmJ9ZnVuY3Rpb24gcGIoYSl7dmFyIGI9YS5vQ2xhc3NlcyxjPWEuc1RhYmxlSWQsZD1hLm9MYW5ndWFnZSxlPWEub1ByZXZpb3VzU2VhcmNoLGY9YS5hYW5GZWF0dXJlcyxnPSc8aW5wdXQgdHlwZT0ic2VhcmNoIiBjbGFzcz0iJytiLnNGaWx0ZXJJbnB1dCsnIi8+JyxqPWQuc1NlYXJjaCxqPWoubWF0Y2goL19JTlBVVF8vKT9qLnJlcGxhY2UoIl9JTlBVVF8iLGcpOmorZyxiPWgoIjxkaXYvPiIse2lkOiFmLmY/YysiX2ZpbHRlciI6bnVsbCwiY2xhc3MiOmIuc0ZpbHRlcn0pLmFwcGVuZChoKCI8bGFiZWwvPiIpLmFwcGVuZChqKSksZj1mdW5jdGlvbigpe3ZhciBiPSF0aGlzLnZhbHVlPwoiIjp0aGlzLnZhbHVlO2IhPWUuc1NlYXJjaCYmKGZhKGEse3NTZWFyY2g6YixiUmVnZXg6ZS5iUmVnZXgsYlNtYXJ0OmUuYlNtYXJ0LGJDYXNlSW5zZW5zaXRpdmU6ZS5iQ2FzZUluc2Vuc2l0aXZlfSksYS5faURpc3BsYXlTdGFydD0wLE8oYSkpfSxnPW51bGwhPT1hLnNlYXJjaERlbGF5P2Euc2VhcmNoRGVsYXk6InNzcCI9PT15KGEpPzQwMDowLGk9aCgiaW5wdXQiLGIpLnZhbChlLnNTZWFyY2gpLmF0dHIoInBsYWNlaG9sZGVyIixkLnNTZWFyY2hQbGFjZWhvbGRlcikuYmluZCgia2V5dXAuRFQgc2VhcmNoLkRUIGlucHV0LkRUIHBhc3RlLkRUIGN1dC5EVCIsZz9PYShmLGcpOmYpLmJpbmQoImtleXByZXNzLkRUIixmdW5jdGlvbihhKXtpZigxMz09YS5rZXlDb2RlKXJldHVybiExfSkuYXR0cigiYXJpYS1jb250cm9scyIsYyk7aChhLm5UYWJsZSkub24oInNlYXJjaC5kdC5EVCIsZnVuY3Rpb24oYixjKXtpZihhPT09Yyl0cnl7aVswXSE9PUkuYWN0aXZlRWxlbWVudCYmaS52YWwoZS5zU2VhcmNoKX1jYXRjaChkKXt9fSk7CnJldHVybiBiWzBdfWZ1bmN0aW9uIGZhKGEsYixjKXt2YXIgZD1hLm9QcmV2aW91c1NlYXJjaCxlPWEuYW9QcmVTZWFyY2hDb2xzLGY9ZnVuY3Rpb24oYSl7ZC5zU2VhcmNoPWEuc1NlYXJjaDtkLmJSZWdleD1hLmJSZWdleDtkLmJTbWFydD1hLmJTbWFydDtkLmJDYXNlSW5zZW5zaXRpdmU9YS5iQ2FzZUluc2Vuc2l0aXZlfTtHYShhKTtpZigic3NwIiE9eShhKSl7d2IoYSxiLnNTZWFyY2gsYyxiLmJFc2NhcGVSZWdleCE9PWs/IWIuYkVzY2FwZVJlZ2V4OmIuYlJlZ2V4LGIuYlNtYXJ0LGIuYkNhc2VJbnNlbnNpdGl2ZSk7ZihiKTtmb3IoYj0wO2I8ZS5sZW5ndGg7YisrKXhiKGEsZVtiXS5zU2VhcmNoLGIsZVtiXS5iRXNjYXBlUmVnZXghPT1rPyFlW2JdLmJFc2NhcGVSZWdleDplW2JdLmJSZWdleCxlW2JdLmJTbWFydCxlW2JdLmJDYXNlSW5zZW5zaXRpdmUpO3liKGEpfWVsc2UgZihiKTthLmJGaWx0ZXJlZD0hMDt1KGEsbnVsbCwic2VhcmNoIixbYV0pfWZ1bmN0aW9uIHliKGEpe2Zvcih2YXIgYj0KbS5leHQuc2VhcmNoLGM9YS5haURpc3BsYXksZCxlLGY9MCxnPWIubGVuZ3RoO2Y8ZztmKyspe2Zvcih2YXIgaj1bXSxpPTAsbj1jLmxlbmd0aDtpPG47aSsrKWU9Y1tpXSxkPWEuYW9EYXRhW2VdLGJbZl0oYSxkLl9hRmlsdGVyRGF0YSxlLGQuX2FEYXRhLGkpJiZqLnB1c2goZSk7Yy5sZW5ndGg9MDtoLm1lcmdlKGMsail9fWZ1bmN0aW9uIHhiKGEsYixjLGQsZSxmKXtpZigiIiE9PWIpZm9yKHZhciBnPWEuYWlEaXNwbGF5LGQ9UGEoYixkLGUsZiksZT1nLmxlbmd0aC0xOzA8PWU7ZS0tKWI9YS5hb0RhdGFbZ1tlXV0uX2FGaWx0ZXJEYXRhW2NdLGQudGVzdChiKXx8Zy5zcGxpY2UoZSwxKX1mdW5jdGlvbiB3YihhLGIsYyxkLGUsZil7dmFyIGQ9UGEoYixkLGUsZiksZT1hLm9QcmV2aW91c1NlYXJjaC5zU2VhcmNoLGY9YS5haURpc3BsYXlNYXN0ZXIsZzswIT09bS5leHQuc2VhcmNoLmxlbmd0aCYmKGM9ITApO2c9emIoYSk7aWYoMD49Yi5sZW5ndGgpYS5haURpc3BsYXk9Zi5zbGljZSgpOwplbHNle2lmKGd8fGN8fGUubGVuZ3RoPmIubGVuZ3RofHwwIT09Yi5pbmRleE9mKGUpfHxhLmJTb3J0ZWQpYS5haURpc3BsYXk9Zi5zbGljZSgpO2I9YS5haURpc3BsYXk7Zm9yKGM9Yi5sZW5ndGgtMTswPD1jO2MtLSlkLnRlc3QoYS5hb0RhdGFbYltjXV0uX3NGaWx0ZXJSb3cpfHxiLnNwbGljZShjLDEpfX1mdW5jdGlvbiBQYShhLGIsYyxkKXthPWI/YTpRYShhKTtjJiYoYT0iXig/PS4qPyIraC5tYXAoYS5tYXRjaCgvIlteIl0rInxbXiBdKy9nKXx8WyIiXSxmdW5jdGlvbihhKXtpZignIic9PT1hLmNoYXJBdCgwKSl2YXIgYj1hLm1hdGNoKC9eIiguKikiJC8pLGE9Yj9iWzFdOmE7cmV0dXJuIGEucmVwbGFjZSgnIicsIiIpfSkuam9pbigiKSg/PS4qPyIpKyIpLiokIik7cmV0dXJuIFJlZ0V4cChhLGQ/ImkiOiIiKX1mdW5jdGlvbiB6YihhKXt2YXIgYj1hLmFvQ29sdW1ucyxjLGQsZSxmLGcsaixpLGgsbD1tLmV4dC50eXBlLnNlYXJjaDtjPSExO2Q9MDtmb3IoZj1hLmFvRGF0YS5sZW5ndGg7ZDwKZjtkKyspaWYoaD1hLmFvRGF0YVtkXSwhaC5fYUZpbHRlckRhdGEpe2o9W107ZT0wO2ZvcihnPWIubGVuZ3RoO2U8ZztlKyspYz1iW2VdLGMuYlNlYXJjaGFibGU/KGk9QihhLGQsZSwiZmlsdGVyIiksbFtjLnNUeXBlXSYmKGk9bFtjLnNUeXBlXShpKSksbnVsbD09PWkmJihpPSIiKSwic3RyaW5nIiE9PXR5cGVvZiBpJiZpLnRvU3RyaW5nJiYoaT1pLnRvU3RyaW5nKCkpKTppPSIiLGkuaW5kZXhPZiYmLTEhPT1pLmluZGV4T2YoIiYiKSYmKHVhLmlubmVySFRNTD1pLGk9WmI/dWEudGV4dENvbnRlbnQ6dWEuaW5uZXJUZXh0KSxpLnJlcGxhY2UmJihpPWkucmVwbGFjZSgvW1xyXG5dL2csIiIpKSxqLnB1c2goaSk7aC5fYUZpbHRlckRhdGE9ajtoLl9zRmlsdGVyUm93PWouam9pbigiICAiKTtjPSEwfXJldHVybiBjfWZ1bmN0aW9uIEFiKGEpe3JldHVybntzZWFyY2g6YS5zU2VhcmNoLHNtYXJ0OmEuYlNtYXJ0LHJlZ2V4OmEuYlJlZ2V4LGNhc2VJbnNlbnNpdGl2ZTphLmJDYXNlSW5zZW5zaXRpdmV9fQpmdW5jdGlvbiBCYihhKXtyZXR1cm57c1NlYXJjaDphLnNlYXJjaCxiU21hcnQ6YS5zbWFydCxiUmVnZXg6YS5yZWdleCxiQ2FzZUluc2Vuc2l0aXZlOmEuY2FzZUluc2Vuc2l0aXZlfX1mdW5jdGlvbiBzYihhKXt2YXIgYj1hLnNUYWJsZUlkLGM9YS5hYW5GZWF0dXJlcy5pLGQ9aCgiPGRpdi8+Iix7ImNsYXNzIjphLm9DbGFzc2VzLnNJbmZvLGlkOiFjP2IrIl9pbmZvIjpudWxsfSk7Y3x8KGEuYW9EcmF3Q2FsbGJhY2sucHVzaCh7Zm46Q2Isc05hbWU6ImluZm9ybWF0aW9uIn0pLGQuYXR0cigicm9sZSIsInN0YXR1cyIpLmF0dHIoImFyaWEtbGl2ZSIsInBvbGl0ZSIpLGgoYS5uVGFibGUpLmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiLGIrIl9pbmZvIikpO3JldHVybiBkWzBdfWZ1bmN0aW9uIENiKGEpe3ZhciBiPWEuYWFuRmVhdHVyZXMuaTtpZigwIT09Yi5sZW5ndGgpe3ZhciBjPWEub0xhbmd1YWdlLGQ9YS5faURpc3BsYXlTdGFydCsxLGU9YS5mbkRpc3BsYXlFbmQoKSxmPWEuZm5SZWNvcmRzVG90YWwoKSwKZz1hLmZuUmVjb3Jkc0Rpc3BsYXkoKSxqPWc/Yy5zSW5mbzpjLnNJbmZvRW1wdHk7ZyE9PWYmJihqKz0iICIrYy5zSW5mb0ZpbHRlcmVkKTtqKz1jLnNJbmZvUG9zdEZpeDtqPURiKGEsaik7Yz1jLmZuSW5mb0NhbGxiYWNrO251bGwhPT1jJiYoaj1jLmNhbGwoYS5vSW5zdGFuY2UsYSxkLGUsZixnLGopKTtoKGIpLmh0bWwoail9fWZ1bmN0aW9uIERiKGEsYil7dmFyIGM9YS5mbkZvcm1hdE51bWJlcixkPWEuX2lEaXNwbGF5U3RhcnQrMSxlPWEuX2lEaXNwbGF5TGVuZ3RoLGY9YS5mblJlY29yZHNEaXNwbGF5KCksZz0tMT09PWU7cmV0dXJuIGIucmVwbGFjZSgvX1NUQVJUXy9nLGMuY2FsbChhLGQpKS5yZXBsYWNlKC9fRU5EXy9nLGMuY2FsbChhLGEuZm5EaXNwbGF5RW5kKCkpKS5yZXBsYWNlKC9fTUFYXy9nLGMuY2FsbChhLGEuZm5SZWNvcmRzVG90YWwoKSkpLnJlcGxhY2UoL19UT1RBTF8vZyxjLmNhbGwoYSxmKSkucmVwbGFjZSgvX1BBR0VfL2csYy5jYWxsKGEsZz8xOk1hdGguY2VpbChkLwplKSkpLnJlcGxhY2UoL19QQUdFU18vZyxjLmNhbGwoYSxnPzE6TWF0aC5jZWlsKGYvZSkpKX1mdW5jdGlvbiBnYShhKXt2YXIgYixjLGQ9YS5pSW5pdERpc3BsYXlTdGFydCxlPWEuYW9Db2x1bW5zLGY7Yz1hLm9GZWF0dXJlczt2YXIgZz1hLmJEZWZlckxvYWRpbmc7aWYoYS5iSW5pdGlhbGlzZWQpe25iKGEpO2tiKGEpO2VhKGEsYS5hb0hlYWRlcik7ZWEoYSxhLmFvRm9vdGVyKTtDKGEsITApO2MuYkF1dG9XaWR0aCYmRmEoYSk7Yj0wO2ZvcihjPWUubGVuZ3RoO2I8YztiKyspZj1lW2JdLGYuc1dpZHRoJiYoZi5uVGguc3R5bGUud2lkdGg9eChmLnNXaWR0aCkpO3UoYSxudWxsLCJwcmVJbml0IixbYV0pO1QoYSk7ZT15KGEpO2lmKCJzc3AiIT1lfHxnKSJhamF4Ij09ZT9yYShhLFtdLGZ1bmN0aW9uKGMpe3ZhciBmPXNhKGEsYyk7Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKylOKGEsZltiXSk7YS5pSW5pdERpc3BsYXlTdGFydD1kO1QoYSk7QyhhLCExKTt0YShhLGMpfSxhKTooQyhhLCExKSwKdGEoYSkpfWVsc2Ugc2V0VGltZW91dChmdW5jdGlvbigpe2dhKGEpfSwyMDApfWZ1bmN0aW9uIHRhKGEsYil7YS5fYkluaXRDb21wbGV0ZT0hMDsoYnx8YS5vSW5pdC5hYURhdGEpJiZZKGEpO3UoYSxudWxsLCJwbHVnaW4taW5pdCIsW2EsYl0pO3UoYSwiYW9Jbml0Q29tcGxldGUiLCJpbml0IixbYSxiXSl9ZnVuY3Rpb24gUmEoYSxiKXt2YXIgYz1wYXJzZUludChiLDEwKTthLl9pRGlzcGxheUxlbmd0aD1jO1NhKGEpO3UoYSxudWxsLCJsZW5ndGgiLFthLGNdKX1mdW5jdGlvbiBvYihhKXtmb3IodmFyIGI9YS5vQ2xhc3NlcyxjPWEuc1RhYmxlSWQsZD1hLmFMZW5ndGhNZW51LGU9aC5pc0FycmF5KGRbMF0pLGY9ZT9kWzBdOmQsZD1lP2RbMV06ZCxlPWgoIjxzZWxlY3QvPiIse25hbWU6YysiX2xlbmd0aCIsImFyaWEtY29udHJvbHMiOmMsImNsYXNzIjpiLnNMZW5ndGhTZWxlY3R9KSxnPTAsaj1mLmxlbmd0aDtnPGo7ZysrKWVbMF1bZ109bmV3IE9wdGlvbihkW2ddLGZbZ10pO3ZhciBpPQpoKCI8ZGl2PjxsYWJlbC8+PC9kaXY+IikuYWRkQ2xhc3MoYi5zTGVuZ3RoKTthLmFhbkZlYXR1cmVzLmx8fChpWzBdLmlkPWMrIl9sZW5ndGgiKTtpLmNoaWxkcmVuKCkuYXBwZW5kKGEub0xhbmd1YWdlLnNMZW5ndGhNZW51LnJlcGxhY2UoIl9NRU5VXyIsZVswXS5vdXRlckhUTUwpKTtoKCJzZWxlY3QiLGkpLnZhbChhLl9pRGlzcGxheUxlbmd0aCkuYmluZCgiY2hhbmdlLkRUIixmdW5jdGlvbigpe1JhKGEsaCh0aGlzKS52YWwoKSk7TyhhKX0pO2goYS5uVGFibGUpLmJpbmQoImxlbmd0aC5kdC5EVCIsZnVuY3Rpb24oYixjLGQpe2E9PT1jJiZoKCJzZWxlY3QiLGkpLnZhbChkKX0pO3JldHVybiBpWzBdfWZ1bmN0aW9uIHRiKGEpe3ZhciBiPWEuc1BhZ2luYXRpb25UeXBlLGM9bS5leHQucGFnZXJbYl0sZD0iZnVuY3Rpb24iPT09dHlwZW9mIGMsZT1mdW5jdGlvbihhKXtPKGEpfSxiPWgoIjxkaXYvPiIpLmFkZENsYXNzKGEub0NsYXNzZXMuc1BhZ2luZytiKVswXSxmPWEuYWFuRmVhdHVyZXM7CmR8fGMuZm5Jbml0KGEsYixlKTtmLnB8fChiLmlkPWEuc1RhYmxlSWQrIl9wYWdpbmF0ZSIsYS5hb0RyYXdDYWxsYmFjay5wdXNoKHtmbjpmdW5jdGlvbihhKXtpZihkKXt2YXIgYj1hLl9pRGlzcGxheVN0YXJ0LGk9YS5faURpc3BsYXlMZW5ndGgsaD1hLmZuUmVjb3Jkc0Rpc3BsYXkoKSxsPS0xPT09aSxiPWw/MDpNYXRoLmNlaWwoYi9pKSxpPWw/MTpNYXRoLmNlaWwoaC9pKSxoPWMoYixpKSxrLGw9MDtmb3Ioaz1mLnAubGVuZ3RoO2w8aztsKyspTmEoYSwicGFnZUJ1dHRvbiIpKGEsZi5wW2xdLGwsaCxiLGkpfWVsc2UgYy5mblVwZGF0ZShhLGUpfSxzTmFtZToicGFnaW5hdGlvbiJ9KSk7cmV0dXJuIGJ9ZnVuY3Rpb24gVGEoYSxiLGMpe3ZhciBkPWEuX2lEaXNwbGF5U3RhcnQsZT1hLl9pRGlzcGxheUxlbmd0aCxmPWEuZm5SZWNvcmRzRGlzcGxheSgpOzA9PT1mfHwtMT09PWU/ZD0wOiJudW1iZXIiPT09dHlwZW9mIGI/KGQ9YiplLGQ+ZiYmKGQ9MCkpOiJmaXJzdCI9PWI/ZD0wOgoicHJldmlvdXMiPT1iPyhkPTA8PWU/ZC1lOjAsMD5kJiYoZD0wKSk6Im5leHQiPT1iP2QrZTxmJiYoZCs9ZSk6Imxhc3QiPT1iP2Q9TWF0aC5mbG9vcigoZi0xKS9lKSplOkwoYSwwLCJVbmtub3duIHBhZ2luZyBhY3Rpb246ICIrYiw1KTtiPWEuX2lEaXNwbGF5U3RhcnQhPT1kO2EuX2lEaXNwbGF5U3RhcnQ9ZDtiJiYodShhLG51bGwsInBhZ2UiLFthXSksYyYmTyhhKSk7cmV0dXJuIGJ9ZnVuY3Rpb24gcWIoYSl7cmV0dXJuIGgoIjxkaXYvPiIse2lkOiFhLmFhbkZlYXR1cmVzLnI/YS5zVGFibGVJZCsiX3Byb2Nlc3NpbmciOm51bGwsImNsYXNzIjphLm9DbGFzc2VzLnNQcm9jZXNzaW5nfSkuaHRtbChhLm9MYW5ndWFnZS5zUHJvY2Vzc2luZykuaW5zZXJ0QmVmb3JlKGEublRhYmxlKVswXX1mdW5jdGlvbiBDKGEsYil7YS5vRmVhdHVyZXMuYlByb2Nlc3NpbmcmJmgoYS5hYW5GZWF0dXJlcy5yKS5jc3MoImRpc3BsYXkiLGI/ImJsb2NrIjoibm9uZSIpO3UoYSxudWxsLCJwcm9jZXNzaW5nIiwKW2EsYl0pfWZ1bmN0aW9uIHJiKGEpe3ZhciBiPWgoYS5uVGFibGUpO2IuYXR0cigicm9sZSIsImdyaWQiKTt2YXIgYz1hLm9TY3JvbGw7aWYoIiI9PT1jLnNYJiYiIj09PWMuc1kpcmV0dXJuIGEublRhYmxlO3ZhciBkPWMuc1gsZT1jLnNZLGY9YS5vQ2xhc3NlcyxnPWIuY2hpbGRyZW4oImNhcHRpb24iKSxqPWcubGVuZ3RoP2dbMF0uX2NhcHRpb25TaWRlOm51bGwsaT1oKGJbMF0uY2xvbmVOb2RlKCExKSksbj1oKGJbMF0uY2xvbmVOb2RlKCExKSksbD1iLmNoaWxkcmVuKCJ0Zm9vdCIpO2wubGVuZ3RofHwobD1udWxsKTtpPWgoIjxkaXYvPiIseyJjbGFzcyI6Zi5zU2Nyb2xsV3JhcHBlcn0pLmFwcGVuZChoKCI8ZGl2Lz4iLHsiY2xhc3MiOmYuc1Njcm9sbEhlYWR9KS5jc3Moe292ZXJmbG93OiJoaWRkZW4iLHBvc2l0aW9uOiJyZWxhdGl2ZSIsYm9yZGVyOjAsd2lkdGg6ZD8hZD9udWxsOngoZCk6IjEwMCUifSkuYXBwZW5kKGgoIjxkaXYvPiIseyJjbGFzcyI6Zi5zU2Nyb2xsSGVhZElubmVyfSkuY3NzKHsiYm94LXNpemluZyI6ImNvbnRlbnQtYm94IiwKd2lkdGg6Yy5zWElubmVyfHwiMTAwJSJ9KS5hcHBlbmQoaS5yZW1vdmVBdHRyKCJpZCIpLmNzcygibWFyZ2luLWxlZnQiLDApLmFwcGVuZCgidG9wIj09PWo/ZzpudWxsKS5hcHBlbmQoYi5jaGlsZHJlbigidGhlYWQiKSkpKSkuYXBwZW5kKGgoIjxkaXYvPiIseyJjbGFzcyI6Zi5zU2Nyb2xsQm9keX0pLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIixvdmVyZmxvdzoiYXV0byIsd2lkdGg6IWQ/bnVsbDp4KGQpfSkuYXBwZW5kKGIpKTtsJiZpLmFwcGVuZChoKCI8ZGl2Lz4iLHsiY2xhc3MiOmYuc1Njcm9sbEZvb3R9KS5jc3Moe292ZXJmbG93OiJoaWRkZW4iLGJvcmRlcjowLHdpZHRoOmQ/IWQ/bnVsbDp4KGQpOiIxMDAlIn0pLmFwcGVuZChoKCI8ZGl2Lz4iLHsiY2xhc3MiOmYuc1Njcm9sbEZvb3RJbm5lcn0pLmFwcGVuZChuLnJlbW92ZUF0dHIoImlkIikuY3NzKCJtYXJnaW4tbGVmdCIsMCkuYXBwZW5kKCJib3R0b20iPT09aj9nOm51bGwpLmFwcGVuZChiLmNoaWxkcmVuKCJ0Zm9vdCIpKSkpKTsKdmFyIGI9aS5jaGlsZHJlbigpLGs9YlswXSxmPWJbMV0sdD1sP2JbMl06bnVsbDtpZihkKWgoZikub24oInNjcm9sbC5EVCIsZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNjcm9sbExlZnQ7ay5zY3JvbGxMZWZ0PWE7bCYmKHQuc2Nyb2xsTGVmdD1hKX0pO2goZikuY3NzKGUmJmMuYkNvbGxhcHNlPyJtYXgtaGVpZ2h0IjoiaGVpZ2h0IixlKTthLm5TY3JvbGxIZWFkPWs7YS5uU2Nyb2xsQm9keT1mO2EublNjcm9sbEZvb3Q9dDthLmFvRHJhd0NhbGxiYWNrLnB1c2goe2ZuOmthLHNOYW1lOiJzY3JvbGxpbmcifSk7cmV0dXJuIGlbMF19ZnVuY3Rpb24ga2EoYSl7dmFyIGI9YS5vU2Nyb2xsLGM9Yi5zWCxkPWIuc1hJbm5lcixlPWIuc1ksYj1iLmlCYXJXaWR0aCxmPWgoYS5uU2Nyb2xsSGVhZCksZz1mWzBdLnN0eWxlLGo9Zi5jaGlsZHJlbigiZGl2IiksaT1qWzBdLnN0eWxlLG49ai5jaGlsZHJlbigidGFibGUiKSxqPWEublNjcm9sbEJvZHksbD1oKGopLHE9ai5zdHlsZSx0PWgoYS5uU2Nyb2xsRm9vdCkuY2hpbGRyZW4oImRpdiIpLAptPXQuY2hpbGRyZW4oInRhYmxlIiksbz1oKGEublRIZWFkKSxGPWgoYS5uVGFibGUpLHA9RlswXSxyPXAuc3R5bGUsdT1hLm5URm9vdD9oKGEublRGb290KTpudWxsLEViPWEub0Jyb3dzZXIsVWE9RWIuYlNjcm9sbE92ZXJzaXplLHM9RyhhLmFvQ29sdW1ucywiblRoIiksUCx2LHcseSx6PVtdLEE9W10sQj1bXSxDPVtdLEQsRT1mdW5jdGlvbihhKXthPWEuc3R5bGU7YS5wYWRkaW5nVG9wPSIwIjthLnBhZGRpbmdCb3R0b209IjAiO2EuYm9yZGVyVG9wV2lkdGg9IjAiO2EuYm9yZGVyQm90dG9tV2lkdGg9IjAiO2EuaGVpZ2h0PTB9O3Y9ai5zY3JvbGxIZWlnaHQ+ai5jbGllbnRIZWlnaHQ7aWYoYS5zY3JvbGxCYXJWaXMhPT12JiZhLnNjcm9sbEJhclZpcyE9PWspYS5zY3JvbGxCYXJWaXM9dixZKGEpO2Vsc2V7YS5zY3JvbGxCYXJWaXM9djtGLmNoaWxkcmVuKCJ0aGVhZCwgdGZvb3QiKS5yZW1vdmUoKTt1JiYodz11LmNsb25lKCkucHJlcGVuZFRvKEYpLFA9dS5maW5kKCJ0ciIpLHc9CncuZmluZCgidHIiKSk7eT1vLmNsb25lKCkucHJlcGVuZFRvKEYpO289by5maW5kKCJ0ciIpO3Y9eS5maW5kKCJ0ciIpO3kuZmluZCgidGgsIHRkIikucmVtb3ZlQXR0cigidGFiaW5kZXgiKTtjfHwocS53aWR0aD0iMTAwJSIsZlswXS5zdHlsZS53aWR0aD0iMTAwJSIpO2guZWFjaChxYShhLHkpLGZ1bmN0aW9uKGIsYyl7RD1aKGEsYik7Yy5zdHlsZS53aWR0aD1hLmFvQ29sdW1uc1tEXS5zV2lkdGh9KTt1JiZKKGZ1bmN0aW9uKGEpe2Euc3R5bGUud2lkdGg9IiJ9LHcpO2Y9Ri5vdXRlcldpZHRoKCk7aWYoIiI9PT1jKXtyLndpZHRoPSIxMDAlIjtpZihVYSYmKEYuZmluZCgidGJvZHkiKS5oZWlnaHQoKT5qLm9mZnNldEhlaWdodHx8InNjcm9sbCI9PWwuY3NzKCJvdmVyZmxvdy15IikpKXIud2lkdGg9eChGLm91dGVyV2lkdGgoKS1iKTtmPUYub3V0ZXJXaWR0aCgpfWVsc2UiIiE9PWQmJihyLndpZHRoPXgoZCksZj1GLm91dGVyV2lkdGgoKSk7SihFLHYpO0ooZnVuY3Rpb24oYSl7Qi5wdXNoKGEuaW5uZXJIVE1MKTsKei5wdXNoKHgoaChhKS5jc3MoIndpZHRoIikpKX0sdik7SihmdW5jdGlvbihhLGIpe2lmKGguaW5BcnJheShhLHMpIT09LTEpYS5zdHlsZS53aWR0aD16W2JdfSxvKTtoKHYpLmhlaWdodCgwKTt1JiYoSihFLHcpLEooZnVuY3Rpb24oYSl7Qy5wdXNoKGEuaW5uZXJIVE1MKTtBLnB1c2goeChoKGEpLmNzcygid2lkdGgiKSkpfSx3KSxKKGZ1bmN0aW9uKGEsYil7YS5zdHlsZS53aWR0aD1BW2JdfSxQKSxoKHcpLmhlaWdodCgwKSk7SihmdW5jdGlvbihhLGIpe2EuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJkYXRhVGFibGVzX3NpemluZyIgc3R5bGU9ImhlaWdodDowO292ZXJmbG93OmhpZGRlbjsiPicrQltiXSsiPC9kaXY+IjthLnN0eWxlLndpZHRoPXpbYl19LHYpO3UmJkooZnVuY3Rpb24oYSxiKXthLmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZGF0YVRhYmxlc19zaXppbmciIHN0eWxlPSJoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW47Ij4nK0NbYl0rIjwvZGl2PiI7YS5zdHlsZS53aWR0aD0KQVtiXX0sdyk7aWYoRi5vdXRlcldpZHRoKCk8Zil7UD1qLnNjcm9sbEhlaWdodD5qLm9mZnNldEhlaWdodHx8InNjcm9sbCI9PWwuY3NzKCJvdmVyZmxvdy15Iik/ZitiOmY7aWYoVWEmJihqLnNjcm9sbEhlaWdodD5qLm9mZnNldEhlaWdodHx8InNjcm9sbCI9PWwuY3NzKCJvdmVyZmxvdy15IikpKXIud2lkdGg9eChQLWIpOygiIj09PWN8fCIiIT09ZCkmJkwoYSwxLCJQb3NzaWJsZSBjb2x1bW4gbWlzYWxpZ25tZW50Iiw2KX1lbHNlIFA9IjEwMCUiO3Eud2lkdGg9eChQKTtnLndpZHRoPXgoUCk7dSYmKGEublNjcm9sbEZvb3Quc3R5bGUud2lkdGg9eChQKSk7IWUmJlVhJiYocS5oZWlnaHQ9eChwLm9mZnNldEhlaWdodCtiKSk7Yz1GLm91dGVyV2lkdGgoKTtuWzBdLnN0eWxlLndpZHRoPXgoYyk7aS53aWR0aD14KGMpO2Q9Ri5oZWlnaHQoKT5qLmNsaWVudEhlaWdodHx8InNjcm9sbCI9PWwuY3NzKCJvdmVyZmxvdy15Iik7ZT0icGFkZGluZyIrKEViLmJTY3JvbGxiYXJMZWZ0PyJMZWZ0IjoKIlJpZ2h0Iik7aVtlXT1kP2IrInB4IjoiMHB4Ijt1JiYobVswXS5zdHlsZS53aWR0aD14KGMpLHRbMF0uc3R5bGUud2lkdGg9eChjKSx0WzBdLnN0eWxlW2VdPWQ/YisicHgiOiIwcHgiKTtGLmNoaWxkcmVuKCJjb2xncm91cCIpLmluc2VydEJlZm9yZShGLmNoaWxkcmVuKCJ0aGVhZCIpKTtsLnNjcm9sbCgpO2lmKChhLmJTb3J0ZWR8fGEuYkZpbHRlcmVkKSYmIWEuX2RyYXdIb2xkKWouc2Nyb2xsVG9wPTB9fWZ1bmN0aW9uIEooYSxiLGMpe2Zvcih2YXIgZD0wLGU9MCxmPWIubGVuZ3RoLGcsajtlPGY7KXtnPWJbZV0uZmlyc3RDaGlsZDtmb3Ioaj1jP2NbZV0uZmlyc3RDaGlsZDpudWxsO2c7KTE9PT1nLm5vZGVUeXBlJiYoYz9hKGcsaixkKTphKGcsZCksZCsrKSxnPWcubmV4dFNpYmxpbmcsaj1jP2oubmV4dFNpYmxpbmc6bnVsbDtlKyt9fWZ1bmN0aW9uIEZhKGEpe3ZhciBiPWEublRhYmxlLGM9YS5hb0NvbHVtbnMsZD1hLm9TY3JvbGwsZT1kLnNZLGY9ZC5zWCxnPWQuc1hJbm5lciwKaj1jLmxlbmd0aCxpPWxhKGEsImJWaXNpYmxlIiksbj1oKCJ0aCIsYS5uVEhlYWQpLGw9Yi5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaz1iLnBhcmVudE5vZGUsdD0hMSxtLG8scD1hLm9Ccm93c2VyLGQ9cC5iU2Nyb2xsT3ZlcnNpemU7KG09Yi5zdHlsZS53aWR0aCkmJi0xIT09bS5pbmRleE9mKCIlIikmJihsPW0pO2ZvcihtPTA7bTxpLmxlbmd0aDttKyspbz1jW2lbbV1dLG51bGwhPT1vLnNXaWR0aCYmKG8uc1dpZHRoPUZiKG8uc1dpZHRoT3JpZyxrKSx0PSEwKTtpZihkfHwhdCYmIWYmJiFlJiZqPT1hYShhKSYmaj09bi5sZW5ndGgpZm9yKG09MDttPGo7bSsrKWk9WihhLG0pLG51bGwhPT1pJiYoY1tpXS5zV2lkdGg9eChuLmVxKG0pLndpZHRoKCkpKTtlbHNle2o9aChiKS5jbG9uZSgpLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLnJlbW92ZUF0dHIoImlkIik7ai5maW5kKCJ0Ym9keSB0ciIpLnJlbW92ZSgpO3ZhciByPWgoIjx0ci8+IikuYXBwZW5kVG8oai5maW5kKCJ0Ym9keSIpKTsKai5maW5kKCJ0aGVhZCwgdGZvb3QiKS5yZW1vdmUoKTtqLmFwcGVuZChoKGEublRIZWFkKS5jbG9uZSgpKS5hcHBlbmQoaChhLm5URm9vdCkuY2xvbmUoKSk7ai5maW5kKCJ0Zm9vdCB0aCwgdGZvb3QgdGQiKS5jc3MoIndpZHRoIiwiIik7bj1xYShhLGouZmluZCgidGhlYWQiKVswXSk7Zm9yKG09MDttPGkubGVuZ3RoO20rKylvPWNbaVttXV0sblttXS5zdHlsZS53aWR0aD1udWxsIT09by5zV2lkdGhPcmlnJiYiIiE9PW8uc1dpZHRoT3JpZz94KG8uc1dpZHRoT3JpZyk6IiIsby5zV2lkdGhPcmlnJiZmJiZoKG5bbV0pLmFwcGVuZChoKCI8ZGl2Lz4iKS5jc3Moe3dpZHRoOm8uc1dpZHRoT3JpZyxtYXJnaW46MCxwYWRkaW5nOjAsYm9yZGVyOjAsaGVpZ2h0OjF9KSk7aWYoYS5hb0RhdGEubGVuZ3RoKWZvcihtPTA7bTxpLmxlbmd0aDttKyspdD1pW21dLG89Y1t0XSxoKEdiKGEsdCkpLmNsb25lKCExKS5hcHBlbmQoby5zQ29udGVudFBhZGRpbmcpLmFwcGVuZFRvKHIpO2goIltuYW1lXSIsCmopLnJlbW92ZUF0dHIoIm5hbWUiKTtvPWgoIjxkaXYvPiIpLmNzcyhmfHxlP3twb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxoZWlnaHQ6MSxyaWdodDowLG92ZXJmbG93OiJoaWRkZW4ifTp7fSkuYXBwZW5kKGopLmFwcGVuZFRvKGspO2YmJmc/ai53aWR0aChnKTpmPyhqLmNzcygid2lkdGgiLCJhdXRvIiksai5yZW1vdmVBdHRyKCJ3aWR0aCIpLGoud2lkdGgoKTxrLmNsaWVudFdpZHRoJiZsJiZqLndpZHRoKGsuY2xpZW50V2lkdGgpKTplP2oud2lkdGgoay5jbGllbnRXaWR0aCk6bCYmai53aWR0aChsKTtmb3IobT1lPTA7bTxpLmxlbmd0aDttKyspaz1oKG5bbV0pLGc9ay5vdXRlcldpZHRoKCktay53aWR0aCgpLGs9cC5iQm91bmRpbmc/TWF0aC5jZWlsKG5bbV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpOmsub3V0ZXJXaWR0aCgpLGUrPWssY1tpW21dXS5zV2lkdGg9eChrLWcpO2Iuc3R5bGUud2lkdGg9eChlKTtvLnJlbW92ZSgpfWwmJihiLnN0eWxlLndpZHRoPQp4KGwpKTtpZigobHx8ZikmJiFhLl9yZXN6RXZ0KWI9ZnVuY3Rpb24oKXtoKEQpLmJpbmQoInJlc2l6ZS5EVC0iK2Euc0luc3RhbmNlLE9hKGZ1bmN0aW9uKCl7WShhKX0pKX0sZD9zZXRUaW1lb3V0KGIsMUUzKTpiKCksYS5fcmVzekV2dD0hMH1mdW5jdGlvbiBGYihhLGIpe2lmKCFhKXJldHVybiAwO3ZhciBjPWgoIjxkaXYvPiIpLmNzcygid2lkdGgiLHgoYSkpLmFwcGVuZFRvKGJ8fEkuYm9keSksZD1jWzBdLm9mZnNldFdpZHRoO2MucmVtb3ZlKCk7cmV0dXJuIGR9ZnVuY3Rpb24gR2IoYSxiKXt2YXIgYz1IYihhLGIpO2lmKDA+YylyZXR1cm4gbnVsbDt2YXIgZD1hLmFvRGF0YVtjXTtyZXR1cm4hZC5uVHI/aCgiPHRkLz4iKS5odG1sKEIoYSxjLGIsImRpc3BsYXkiKSlbMF06ZC5hbkNlbGxzW2JdfWZ1bmN0aW9uIEhiKGEsYil7Zm9yKHZhciBjLGQ9LTEsZT0tMSxmPTAsZz1hLmFvRGF0YS5sZW5ndGg7ZjxnO2YrKyljPUIoYSxmLGIsImRpc3BsYXkiKSsiIixjPWMucmVwbGFjZSgkYiwKIiIpLGM9Yy5yZXBsYWNlKC8mbmJzcDsvZywiICIpLGMubGVuZ3RoPmQmJihkPWMubGVuZ3RoLGU9Zik7cmV0dXJuIGV9ZnVuY3Rpb24geChhKXtyZXR1cm4gbnVsbD09PWE/IjBweCI6Im51bWJlciI9PXR5cGVvZiBhPzA+YT8iMHB4IjphKyJweCI6YS5tYXRjaCgvXGQkLyk/YSsicHgiOmF9ZnVuY3Rpb24gVihhKXt2YXIgYixjLGQ9W10sZT1hLmFvQ29sdW1ucyxmLGcsaixpO2I9YS5hYVNvcnRpbmdGaXhlZDtjPWguaXNQbGFpbk9iamVjdChiKTt2YXIgbj1bXTtmPWZ1bmN0aW9uKGEpe2EubGVuZ3RoJiYhaC5pc0FycmF5KGFbMF0pP24ucHVzaChhKTpoLm1lcmdlKG4sYSl9O2guaXNBcnJheShiKSYmZihiKTtjJiZiLnByZSYmZihiLnByZSk7ZihhLmFhU29ydGluZyk7YyYmYi5wb3N0JiZmKGIucG9zdCk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErKyl7aT1uW2FdWzBdO2Y9ZVtpXS5hRGF0YVNvcnQ7Yj0wO2ZvcihjPWYubGVuZ3RoO2I8YztiKyspZz1mW2JdLGo9ZVtnXS5zVHlwZXx8CiJzdHJpbmciLG5bYV0uX2lkeD09PWsmJihuW2FdLl9pZHg9aC5pbkFycmF5KG5bYV1bMV0sZVtnXS5hc1NvcnRpbmcpKSxkLnB1c2goe3NyYzppLGNvbDpnLGRpcjpuW2FdWzFdLGluZGV4Om5bYV0uX2lkeCx0eXBlOmosZm9ybWF0dGVyOm0uZXh0LnR5cGUub3JkZXJbaisiLXByZSJdfSl9cmV0dXJuIGR9ZnVuY3Rpb24gbWIoYSl7dmFyIGIsYyxkPVtdLGU9bS5leHQudHlwZS5vcmRlcixmPWEuYW9EYXRhLGc9MCxqLGk9YS5haURpc3BsYXlNYXN0ZXIsaDtHYShhKTtoPVYoYSk7Yj0wO2ZvcihjPWgubGVuZ3RoO2I8YztiKyspaj1oW2JdLGouZm9ybWF0dGVyJiZnKyssSWIoYSxqLmNvbCk7aWYoInNzcCIhPXkoYSkmJjAhPT1oLmxlbmd0aCl7Yj0wO2ZvcihjPWkubGVuZ3RoO2I8YztiKyspZFtpW2JdXT1iO2c9PT1oLmxlbmd0aD9pLnNvcnQoZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGcsaixpPWgubGVuZ3RoLGs9ZlthXS5fYVNvcnREYXRhLG09ZltiXS5fYVNvcnREYXRhO2ZvcihnPQowO2c8aTtnKyspaWYoaj1oW2ddLGM9a1tqLmNvbF0sZT1tW2ouY29sXSxjPWM8ZT8tMTpjPmU/MTowLDAhPT1jKXJldHVybiJhc2MiPT09ai5kaXI/YzotYztjPWRbYV07ZT1kW2JdO3JldHVybiBjPGU/LTE6Yz5lPzE6MH0pOmkuc29ydChmdW5jdGlvbihhLGIpe3ZhciBjLGcsaixpLGs9aC5sZW5ndGgsbT1mW2FdLl9hU29ydERhdGEscD1mW2JdLl9hU29ydERhdGE7Zm9yKGo9MDtqPGs7aisrKWlmKGk9aFtqXSxjPW1baS5jb2xdLGc9cFtpLmNvbF0saT1lW2kudHlwZSsiLSIraS5kaXJdfHxlWyJzdHJpbmctIitpLmRpcl0sYz1pKGMsZyksMCE9PWMpcmV0dXJuIGM7Yz1kW2FdO2c9ZFtiXTtyZXR1cm4gYzxnPy0xOmM+Zz8xOjB9KX1hLmJTb3J0ZWQ9ITB9ZnVuY3Rpb24gSmIoYSl7Zm9yKHZhciBiLGMsZD1hLmFvQ29sdW1ucyxlPVYoYSksYT1hLm9MYW5ndWFnZS5vQXJpYSxmPTAsZz1kLmxlbmd0aDtmPGc7ZisrKXtjPWRbZl07dmFyIGo9Yy5hc1NvcnRpbmc7Yj1jLnNUaXRsZS5yZXBsYWNlKC88Lio/Pi9nLAoiIik7dmFyIGk9Yy5uVGg7aS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtc29ydCIpO2MuYlNvcnRhYmxlJiYoMDxlLmxlbmd0aCYmZVswXS5jb2w9PWY/KGkuc2V0QXR0cmlidXRlKCJhcmlhLXNvcnQiLCJhc2MiPT1lWzBdLmRpcj8iYXNjZW5kaW5nIjoiZGVzY2VuZGluZyIpLGM9altlWzBdLmluZGV4KzFdfHxqWzBdKTpjPWpbMF0sYis9ImFzYyI9PT1jP2Euc1NvcnRBc2NlbmRpbmc6YS5zU29ydERlc2NlbmRpbmcpO2kuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixiKX19ZnVuY3Rpb24gVmEoYSxiLGMsZCl7dmFyIGU9YS5hYVNvcnRpbmcsZj1hLmFvQ29sdW1uc1tiXS5hc1NvcnRpbmcsZz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuX2lkeDtjPT09ayYmKGM9aC5pbkFycmF5KGFbMV0sZikpO3JldHVybiBjKzE8Zi5sZW5ndGg/YysxOmI/bnVsbDowfTsibnVtYmVyIj09PXR5cGVvZiBlWzBdJiYoZT1hLmFhU29ydGluZz1bZV0pO2MmJmEub0ZlYXR1cmVzLmJTb3J0TXVsdGk/KGM9aC5pbkFycmF5KGIsCkcoZSwiMCIpKSwtMSE9PWM/KGI9ZyhlW2NdLCEwKSxudWxsPT09YiYmMT09PWUubGVuZ3RoJiYoYj0wKSxudWxsPT09Yj9lLnNwbGljZShjLDEpOihlW2NdWzFdPWZbYl0sZVtjXS5faWR4PWIpKTooZS5wdXNoKFtiLGZbMF0sMF0pLGVbZS5sZW5ndGgtMV0uX2lkeD0wKSk6ZS5sZW5ndGgmJmVbMF1bMF09PWI/KGI9ZyhlWzBdKSxlLmxlbmd0aD0xLGVbMF1bMV09ZltiXSxlWzBdLl9pZHg9Yik6KGUubGVuZ3RoPTAsZS5wdXNoKFtiLGZbMF1dKSxlWzBdLl9pZHg9MCk7VChhKTsiZnVuY3Rpb24iPT10eXBlb2YgZCYmZChhKX1mdW5jdGlvbiBNYShhLGIsYyxkKXt2YXIgZT1hLmFvQ29sdW1uc1tjXTtXYShiLHt9LGZ1bmN0aW9uKGIpeyExIT09ZS5iU29ydGFibGUmJihhLm9GZWF0dXJlcy5iUHJvY2Vzc2luZz8oQyhhLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VmEoYSxjLGIuc2hpZnRLZXksZCk7InNzcCIhPT15KGEpJiZDKGEsITEpfSwwKSk6VmEoYSxjLGIuc2hpZnRLZXksZCkpfSl9CmZ1bmN0aW9uIHZhKGEpe3ZhciBiPWEuYUxhc3RTb3J0LGM9YS5vQ2xhc3Nlcy5zU29ydENvbHVtbixkPVYoYSksZT1hLm9GZWF0dXJlcyxmLGc7aWYoZS5iU29ydCYmZS5iU29ydENsYXNzZXMpe2U9MDtmb3IoZj1iLmxlbmd0aDtlPGY7ZSsrKWc9YltlXS5zcmMsaChHKGEuYW9EYXRhLCJhbkNlbGxzIixnKSkucmVtb3ZlQ2xhc3MoYysoMj5lP2UrMTozKSk7ZT0wO2ZvcihmPWQubGVuZ3RoO2U8ZjtlKyspZz1kW2VdLnNyYyxoKEcoYS5hb0RhdGEsImFuQ2VsbHMiLGcpKS5hZGRDbGFzcyhjKygyPmU/ZSsxOjMpKX1hLmFMYXN0U29ydD1kfWZ1bmN0aW9uIEliKGEsYil7dmFyIGM9YS5hb0NvbHVtbnNbYl0sZD1tLmV4dC5vcmRlcltjLnNTb3J0RGF0YVR5cGVdLGU7ZCYmKGU9ZC5jYWxsKGEub0luc3RhbmNlLGEsYiwkKGEsYikpKTtmb3IodmFyIGYsZz1tLmV4dC50eXBlLm9yZGVyW2Muc1R5cGUrIi1wcmUiXSxqPTAsaT1hLmFvRGF0YS5sZW5ndGg7ajxpO2orKylpZihjPWEuYW9EYXRhW2pdLApjLl9hU29ydERhdGF8fChjLl9hU29ydERhdGE9W10pLCFjLl9hU29ydERhdGFbYl18fGQpZj1kP2Vbal06QihhLGosYiwic29ydCIpLGMuX2FTb3J0RGF0YVtiXT1nP2coZik6Zn1mdW5jdGlvbiB3YShhKXtpZihhLm9GZWF0dXJlcy5iU3RhdGVTYXZlJiYhYS5iRGVzdHJveWluZyl7dmFyIGI9e3RpbWU6K25ldyBEYXRlLHN0YXJ0OmEuX2lEaXNwbGF5U3RhcnQsbGVuZ3RoOmEuX2lEaXNwbGF5TGVuZ3RoLG9yZGVyOmguZXh0ZW5kKCEwLFtdLGEuYWFTb3J0aW5nKSxzZWFyY2g6QWIoYS5vUHJldmlvdXNTZWFyY2gpLGNvbHVtbnM6aC5tYXAoYS5hb0NvbHVtbnMsZnVuY3Rpb24oYixkKXtyZXR1cm57dmlzaWJsZTpiLmJWaXNpYmxlLHNlYXJjaDpBYihhLmFvUHJlU2VhcmNoQ29sc1tkXSl9fSl9O3UoYSwiYW9TdGF0ZVNhdmVQYXJhbXMiLCJzdGF0ZVNhdmVQYXJhbXMiLFthLGJdKTthLm9TYXZlZFN0YXRlPWI7YS5mblN0YXRlU2F2ZUNhbGxiYWNrLmNhbGwoYS5vSW5zdGFuY2UsYSwKYil9fWZ1bmN0aW9uIEtiKGEpe3ZhciBiLGMsZD1hLmFvQ29sdW1ucztpZihhLm9GZWF0dXJlcy5iU3RhdGVTYXZlKXt2YXIgZT1hLmZuU3RhdGVMb2FkQ2FsbGJhY2suY2FsbChhLm9JbnN0YW5jZSxhKTtpZihlJiZlLnRpbWUmJihiPXUoYSwiYW9TdGF0ZUxvYWRQYXJhbXMiLCJzdGF0ZUxvYWRQYXJhbXMiLFthLGVdKSwtMT09PWguaW5BcnJheSghMSxiKSYmKGI9YS5pU3RhdGVEdXJhdGlvbiwhKDA8YiYmZS50aW1lPCtuZXcgRGF0ZS0xRTMqYikmJmQubGVuZ3RoPT09ZS5jb2x1bW5zLmxlbmd0aCkpKXthLm9Mb2FkZWRTdGF0ZT1oLmV4dGVuZCghMCx7fSxlKTtlLnN0YXJ0IT09ayYmKGEuX2lEaXNwbGF5U3RhcnQ9ZS5zdGFydCxhLmlJbml0RGlzcGxheVN0YXJ0PWUuc3RhcnQpO2UubGVuZ3RoIT09ayYmKGEuX2lEaXNwbGF5TGVuZ3RoPWUubGVuZ3RoKTtlLm9yZGVyIT09ayYmKGEuYWFTb3J0aW5nPVtdLGguZWFjaChlLm9yZGVyLGZ1bmN0aW9uKGIsYyl7YS5hYVNvcnRpbmcucHVzaChjWzBdPj0KZC5sZW5ndGg/WzAsY1sxXV06Yyl9KSk7ZS5zZWFyY2ghPT1rJiZoLmV4dGVuZChhLm9QcmV2aW91c1NlYXJjaCxCYihlLnNlYXJjaCkpO2I9MDtmb3IoYz1lLmNvbHVtbnMubGVuZ3RoO2I8YztiKyspe3ZhciBmPWUuY29sdW1uc1tiXTtmLnZpc2libGUhPT1rJiYoZFtiXS5iVmlzaWJsZT1mLnZpc2libGUpO2Yuc2VhcmNoIT09ayYmaC5leHRlbmQoYS5hb1ByZVNlYXJjaENvbHNbYl0sQmIoZi5zZWFyY2gpKX11KGEsImFvU3RhdGVMb2FkZWQiLCJzdGF0ZUxvYWRlZCIsW2EsZV0pfX19ZnVuY3Rpb24geGEoYSl7dmFyIGI9bS5zZXR0aW5ncyxhPWguaW5BcnJheShhLEcoYiwiblRhYmxlIikpO3JldHVybi0xIT09YT9iW2FdOm51bGx9ZnVuY3Rpb24gTChhLGIsYyxkKXtjPSJEYXRhVGFibGVzIHdhcm5pbmc6ICIrKGE/InRhYmxlIGlkPSIrYS5zVGFibGVJZCsiIC0gIjoiIikrYztkJiYoYys9Ii4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlcnJvciwgcGxlYXNlIHNlZSBodHRwOi8vZGF0YXRhYmxlcy5uZXQvdG4vIisKZCk7aWYoYilELmNvbnNvbGUmJmNvbnNvbGUubG9nJiZjb25zb2xlLmxvZyhjKTtlbHNlIGlmKGI9bS5leHQsYj1iLnNFcnJNb2RlfHxiLmVyck1vZGUsYSYmdShhLG51bGwsImVycm9yIixbYSxkLGNdKSwiYWxlcnQiPT1iKWFsZXJ0KGMpO2Vsc2V7aWYoInRocm93Ij09Yil0aHJvdyBFcnJvcihjKTsiZnVuY3Rpb24iPT10eXBlb2YgYiYmYihhLGQsYyl9fWZ1bmN0aW9uIEUoYSxiLGMsZCl7aC5pc0FycmF5KGMpP2guZWFjaChjLGZ1bmN0aW9uKGMsZCl7aC5pc0FycmF5KGQpP0UoYSxiLGRbMF0sZFsxXSk6RShhLGIsZCl9KTooZD09PWsmJihkPWMpLGJbY10hPT1rJiYoYVtkXT1iW2NdKSl9ZnVuY3Rpb24gTGIoYSxiLGMpe3ZhciBkLGU7Zm9yKGUgaW4gYiliLmhhc093blByb3BlcnR5KGUpJiYoZD1iW2VdLGguaXNQbGFpbk9iamVjdChkKT8oaC5pc1BsYWluT2JqZWN0KGFbZV0pfHwoYVtlXT17fSksaC5leHRlbmQoITAsYVtlXSxkKSk6YVtlXT1jJiYiZGF0YSIhPT1lJiYiYWFEYXRhIiE9PQplJiZoLmlzQXJyYXkoZCk/ZC5zbGljZSgpOmQpO3JldHVybiBhfWZ1bmN0aW9uIFdhKGEsYixjKXtoKGEpLmJpbmQoImNsaWNrLkRUIixiLGZ1bmN0aW9uKGIpe2EuYmx1cigpO2MoYil9KS5iaW5kKCJrZXlwcmVzcy5EVCIsYixmdW5jdGlvbihhKXsxMz09PWEud2hpY2gmJihhLnByZXZlbnREZWZhdWx0KCksYyhhKSl9KS5iaW5kKCJzZWxlY3RzdGFydC5EVCIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pfWZ1bmN0aW9uIHooYSxiLGMsZCl7YyYmYVtiXS5wdXNoKHtmbjpjLHNOYW1lOmR9KX1mdW5jdGlvbiB1KGEsYixjLGQpe3ZhciBlPVtdO2ImJihlPWgubWFwKGFbYl0uc2xpY2UoKS5yZXZlcnNlKCksZnVuY3Rpb24oYil7cmV0dXJuIGIuZm4uYXBwbHkoYS5vSW5zdGFuY2UsZCl9KSk7bnVsbCE9PWMmJihiPWguRXZlbnQoYysiLmR0IiksaChhLm5UYWJsZSkudHJpZ2dlcihiLGQpLGUucHVzaChiLnJlc3VsdCkpO3JldHVybiBlfWZ1bmN0aW9uIFNhKGEpe3ZhciBiPWEuX2lEaXNwbGF5U3RhcnQsCmM9YS5mbkRpc3BsYXlFbmQoKSxkPWEuX2lEaXNwbGF5TGVuZ3RoO2I+PWMmJihiPWMtZCk7Yi09YiVkO2lmKC0xPT09ZHx8MD5iKWI9MDthLl9pRGlzcGxheVN0YXJ0PWJ9ZnVuY3Rpb24gTmEoYSxiKXt2YXIgYz1hLnJlbmRlcmVyLGQ9bS5leHQucmVuZGVyZXJbYl07cmV0dXJuIGguaXNQbGFpbk9iamVjdChjKSYmY1tiXT9kW2NbYl1dfHxkLl86InN0cmluZyI9PT10eXBlb2YgYz9kW2NdfHxkLl86ZC5ffWZ1bmN0aW9uIHkoYSl7cmV0dXJuIGEub0ZlYXR1cmVzLmJTZXJ2ZXJTaWRlPyJzc3AiOmEuYWpheHx8YS5zQWpheFNvdXJjZT8iYWpheCI6ImRvbSJ9ZnVuY3Rpb24geWEoYSxiKXt2YXIgYz1bXSxjPU1iLm51bWJlcnNfbGVuZ3RoLGQ9TWF0aC5mbG9vcihjLzIpO2I8PWM/Yz1XKDAsYik6YTw9ZD8oYz1XKDAsYy0yKSxjLnB1c2goImVsbGlwc2lzIiksYy5wdXNoKGItMSkpOihhPj1iLTEtZD9jPVcoYi0oYy0yKSxiKTooYz1XKGEtZCsyLGErZC0xKSxjLnB1c2goImVsbGlwc2lzIiksCmMucHVzaChiLTEpKSxjLnNwbGljZSgwLDAsImVsbGlwc2lzIiksYy5zcGxpY2UoMCwwLDApKTtjLkRUX2VsPSJzcGFuIjtyZXR1cm4gY31mdW5jdGlvbiBkYihhKXtoLmVhY2goe251bTpmdW5jdGlvbihiKXtyZXR1cm4gemEoYixhKX0sIm51bS1mbXQiOmZ1bmN0aW9uKGIpe3JldHVybiB6YShiLGEsWGEpfSwiaHRtbC1udW0iOmZ1bmN0aW9uKGIpe3JldHVybiB6YShiLGEsQWEpfSwiaHRtbC1udW0tZm10IjpmdW5jdGlvbihiKXtyZXR1cm4gemEoYixhLEFhLFhhKX19LGZ1bmN0aW9uKGIsYyl7di50eXBlLm9yZGVyW2IrYSsiLXByZSJdPWM7Yi5tYXRjaCgvXmh0bWxcLS8pJiYodi50eXBlLnNlYXJjaFtiK2FdPXYudHlwZS5zZWFyY2guaHRtbCl9KX1mdW5jdGlvbiBOYihhKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYj1beGEodGhpc1ttLmV4dC5pQXBpSW5kZXhdKV0uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO3JldHVybiBtLmV4dC5pbnRlcm5hbFthXS5hcHBseSh0aGlzLApiKX19dmFyIG09ZnVuY3Rpb24oYSl7dGhpcy4kPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYXBpKCEwKS4kKGEsYil9O3RoaXMuXz1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmFwaSghMCkucm93cyhhLGIpLmRhdGEoKX07dGhpcy5hcGk9ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bmV3IHIoeGEodGhpc1t2LmlBcGlJbmRleF0pKTpuZXcgcih0aGlzKX07dGhpcy5mbkFkZERhdGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmFwaSghMCksZD1oLmlzQXJyYXkoYSkmJihoLmlzQXJyYXkoYVswXSl8fGguaXNQbGFpbk9iamVjdChhWzBdKSk/Yy5yb3dzLmFkZChhKTpjLnJvdy5hZGQoYSk7KGI9PT1rfHxiKSYmYy5kcmF3KCk7cmV0dXJuIGQuZmxhdHRlbigpLnRvQXJyYXkoKX07dGhpcy5mbkFkanVzdENvbHVtblNpemluZz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmFwaSghMCkuY29sdW1ucy5hZGp1c3QoKSxjPWIuc2V0dGluZ3MoKVswXSxkPWMub1Njcm9sbDthPT09a3x8YT9iLmRyYXcoITEpOgooIiIhPT1kLnNYfHwiIiE9PWQuc1kpJiZrYShjKX07dGhpcy5mbkNsZWFyVGFibGU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hcGkoITApLmNsZWFyKCk7KGE9PT1rfHxhKSYmYi5kcmF3KCl9O3RoaXMuZm5DbG9zZT1mdW5jdGlvbihhKXt0aGlzLmFwaSghMCkucm93KGEpLmNoaWxkLmhpZGUoKX07dGhpcy5mbkRlbGV0ZVJvdz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5hcGkoITApLGE9ZC5yb3dzKGEpLGU9YS5zZXR0aW5ncygpWzBdLGg9ZS5hb0RhdGFbYVswXVswXV07YS5yZW1vdmUoKTtiJiZiLmNhbGwodGhpcyxlLGgpOyhjPT09a3x8YykmJmQuZHJhdygpO3JldHVybiBofTt0aGlzLmZuRGVzdHJveT1mdW5jdGlvbihhKXt0aGlzLmFwaSghMCkuZGVzdHJveShhKX07dGhpcy5mbkRyYXc9ZnVuY3Rpb24oYSl7dGhpcy5hcGkoITApLmRyYXcoYSl9O3RoaXMuZm5GaWx0ZXI9ZnVuY3Rpb24oYSxiLGMsZCxlLGgpe2U9dGhpcy5hcGkoITApO251bGw9PT1ifHxiPT09az9lLnNlYXJjaChhLApjLGQsaCk6ZS5jb2x1bW4oYikuc2VhcmNoKGEsYyxkLGgpO2UuZHJhdygpfTt0aGlzLmZuR2V0RGF0YT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuYXBpKCEwKTtpZihhIT09ayl7dmFyIGQ9YS5ub2RlTmFtZT9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk6IiI7cmV0dXJuIGIhPT1rfHwidGQiPT1kfHwidGgiPT1kP2MuY2VsbChhLGIpLmRhdGEoKTpjLnJvdyhhKS5kYXRhKCl8fG51bGx9cmV0dXJuIGMuZGF0YSgpLnRvQXJyYXkoKX07dGhpcy5mbkdldE5vZGVzPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYXBpKCEwKTtyZXR1cm4gYSE9PWs/Yi5yb3coYSkubm9kZSgpOmIucm93cygpLm5vZGVzKCkuZmxhdHRlbigpLnRvQXJyYXkoKX07dGhpcy5mbkdldFBvc2l0aW9uPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYXBpKCEwKSxjPWEubm9kZU5hbWUudG9VcHBlckNhc2UoKTtyZXR1cm4iVFIiPT1jP2Iucm93KGEpLmluZGV4KCk6IlREIj09Y3x8IlRIIj09Yz8oYT1iLmNlbGwoYSkuaW5kZXgoKSwKW2Eucm93LGEuY29sdW1uVmlzaWJsZSxhLmNvbHVtbl0pOm51bGx9O3RoaXMuZm5Jc09wZW49ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXBpKCEwKS5yb3coYSkuY2hpbGQuaXNTaG93bigpfTt0aGlzLmZuT3Blbj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuYXBpKCEwKS5yb3coYSkuY2hpbGQoYixjKS5zaG93KCkuY2hpbGQoKVswXX07dGhpcy5mblBhZ2VDaGFuZ2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmFwaSghMCkucGFnZShhKTsoYj09PWt8fGIpJiZjLmRyYXcoITEpfTt0aGlzLmZuU2V0Q29sdW1uVmlzPWZ1bmN0aW9uKGEsYixjKXthPXRoaXMuYXBpKCEwKS5jb2x1bW4oYSkudmlzaWJsZShiKTsoYz09PWt8fGMpJiZhLmNvbHVtbnMuYWRqdXN0KCkuZHJhdygpfTt0aGlzLmZuU2V0dGluZ3M9ZnVuY3Rpb24oKXtyZXR1cm4geGEodGhpc1t2LmlBcGlJbmRleF0pfTt0aGlzLmZuU29ydD1mdW5jdGlvbihhKXt0aGlzLmFwaSghMCkub3JkZXIoYSkuZHJhdygpfTt0aGlzLmZuU29ydExpc3RlbmVyPQpmdW5jdGlvbihhLGIsYyl7dGhpcy5hcGkoITApLm9yZGVyLmxpc3RlbmVyKGEsYixjKX07dGhpcy5mblVwZGF0ZT1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBoPXRoaXMuYXBpKCEwKTtjPT09a3x8bnVsbD09PWM/aC5yb3coYikuZGF0YShhKTpoLmNlbGwoYixjKS5kYXRhKGEpOyhlPT09a3x8ZSkmJmguY29sdW1ucy5hZGp1c3QoKTsoZD09PWt8fGQpJiZoLmRyYXcoKTtyZXR1cm4gMH07dGhpcy5mblZlcnNpb25DaGVjaz12LmZuVmVyc2lvbkNoZWNrO3ZhciBiPXRoaXMsYz1hPT09ayxkPXRoaXMubGVuZ3RoO2MmJihhPXt9KTt0aGlzLm9BcGk9dGhpcy5pbnRlcm5hbD12LmludGVybmFsO2Zvcih2YXIgZSBpbiBtLmV4dC5pbnRlcm5hbCllJiYodGhpc1tlXT1OYihlKSk7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9e30sZT0xPGQ/TGIoZSxhLCEwKTphLGc9MCxqLGk9dGhpcy5nZXRBdHRyaWJ1dGUoImlkIiksbj0hMSxsPW0uZGVmYXVsdHMscT1oKHRoaXMpO2lmKCJ0YWJsZSIhPQp0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpTChudWxsLDAsIk5vbi10YWJsZSBub2RlIGluaXRpYWxpc2F0aW9uICgiK3RoaXMubm9kZU5hbWUrIikiLDIpO2Vsc2V7ZWIobCk7ZmIobC5jb2x1bW4pO0sobCxsLCEwKTtLKGwuY29sdW1uLGwuY29sdW1uLCEwKTtLKGwsaC5leHRlbmQoZSxxLmRhdGEoKSkpO3ZhciB0PW0uc2V0dGluZ3MsZz0wO2ZvcihqPXQubGVuZ3RoO2c8ajtnKyspe3ZhciBwPXRbZ107aWYocC5uVGFibGU9PXRoaXN8fHAublRIZWFkLnBhcmVudE5vZGU9PXRoaXN8fHAublRGb290JiZwLm5URm9vdC5wYXJlbnROb2RlPT10aGlzKXtnPWUuYlJldHJpZXZlIT09az9lLmJSZXRyaWV2ZTpsLmJSZXRyaWV2ZTtpZihjfHxnKXJldHVybiBwLm9JbnN0YW5jZTtpZihlLmJEZXN0cm95IT09az9lLmJEZXN0cm95OmwuYkRlc3Ryb3kpe3Aub0luc3RhbmNlLmZuRGVzdHJveSgpO2JyZWFrfWVsc2V7TChwLDAsIkNhbm5vdCByZWluaXRpYWxpc2UgRGF0YVRhYmxlIiwzKTsKcmV0dXJufX1pZihwLnNUYWJsZUlkPT10aGlzLmlkKXt0LnNwbGljZShnLDEpO2JyZWFrfX1pZihudWxsPT09aXx8IiI9PT1pKXRoaXMuaWQ9aT0iRGF0YVRhYmxlc19UYWJsZV8iK20uZXh0Ll91bmlxdWUrKzt2YXIgbz1oLmV4dGVuZCghMCx7fSxtLm1vZGVscy5vU2V0dGluZ3Mse3NEZXN0cm95V2lkdGg6cVswXS5zdHlsZS53aWR0aCxzSW5zdGFuY2U6aSxzVGFibGVJZDppfSk7by5uVGFibGU9dGhpcztvLm9BcGk9Yi5pbnRlcm5hbDtvLm9Jbml0PWU7dC5wdXNoKG8pO28ub0luc3RhbmNlPTE9PT1iLmxlbmd0aD9iOnEuZGF0YVRhYmxlKCk7ZWIoZSk7ZS5vTGFuZ3VhZ2UmJkRhKGUub0xhbmd1YWdlKTtlLmFMZW5ndGhNZW51JiYhZS5pRGlzcGxheUxlbmd0aCYmKGUuaURpc3BsYXlMZW5ndGg9aC5pc0FycmF5KGUuYUxlbmd0aE1lbnVbMF0pP2UuYUxlbmd0aE1lbnVbMF1bMF06ZS5hTGVuZ3RoTWVudVswXSk7ZT1MYihoLmV4dGVuZCghMCx7fSxsKSxlKTtFKG8ub0ZlYXR1cmVzLAplLCJiUGFnaW5hdGUgYkxlbmd0aENoYW5nZSBiRmlsdGVyIGJTb3J0IGJTb3J0TXVsdGkgYkluZm8gYlByb2Nlc3NpbmcgYkF1dG9XaWR0aCBiU29ydENsYXNzZXMgYlNlcnZlclNpZGUgYkRlZmVyUmVuZGVyIi5zcGxpdCgiICIpKTtFKG8sZSxbImFzU3RyaXBlQ2xhc3NlcyIsImFqYXgiLCJmblNlcnZlckRhdGEiLCJmbkZvcm1hdE51bWJlciIsInNTZXJ2ZXJNZXRob2QiLCJhYVNvcnRpbmciLCJhYVNvcnRpbmdGaXhlZCIsImFMZW5ndGhNZW51Iiwic1BhZ2luYXRpb25UeXBlIiwic0FqYXhTb3VyY2UiLCJzQWpheERhdGFQcm9wIiwiaVN0YXRlRHVyYXRpb24iLCJzRG9tIiwiYlNvcnRDZWxsc1RvcCIsImlUYWJJbmRleCIsImZuU3RhdGVMb2FkQ2FsbGJhY2siLCJmblN0YXRlU2F2ZUNhbGxiYWNrIiwicmVuZGVyZXIiLCJzZWFyY2hEZWxheSIsInJvd0lkIixbImlDb29raWVEdXJhdGlvbiIsImlTdGF0ZUR1cmF0aW9uIl0sWyJvU2VhcmNoIiwib1ByZXZpb3VzU2VhcmNoIl0sWyJhb1NlYXJjaENvbHMiLAoiYW9QcmVTZWFyY2hDb2xzIl0sWyJpRGlzcGxheUxlbmd0aCIsIl9pRGlzcGxheUxlbmd0aCJdLFsiYkpRdWVyeVVJIiwiYkpVSSJdXSk7RShvLm9TY3JvbGwsZSxbWyJzU2Nyb2xsWCIsInNYIl0sWyJzU2Nyb2xsWElubmVyIiwic1hJbm5lciJdLFsic1Njcm9sbFkiLCJzWSJdLFsiYlNjcm9sbENvbGxhcHNlIiwiYkNvbGxhcHNlIl1dKTtFKG8ub0xhbmd1YWdlLGUsImZuSW5mb0NhbGxiYWNrIik7eihvLCJhb0RyYXdDYWxsYmFjayIsZS5mbkRyYXdDYWxsYmFjaywidXNlciIpO3oobywiYW9TZXJ2ZXJQYXJhbXMiLGUuZm5TZXJ2ZXJQYXJhbXMsInVzZXIiKTt6KG8sImFvU3RhdGVTYXZlUGFyYW1zIixlLmZuU3RhdGVTYXZlUGFyYW1zLCJ1c2VyIik7eihvLCJhb1N0YXRlTG9hZFBhcmFtcyIsZS5mblN0YXRlTG9hZFBhcmFtcywidXNlciIpO3oobywiYW9TdGF0ZUxvYWRlZCIsZS5mblN0YXRlTG9hZGVkLCJ1c2VyIik7eihvLCJhb1Jvd0NhbGxiYWNrIixlLmZuUm93Q2FsbGJhY2ssCiJ1c2VyIik7eihvLCJhb1Jvd0NyZWF0ZWRDYWxsYmFjayIsZS5mbkNyZWF0ZWRSb3csInVzZXIiKTt6KG8sImFvSGVhZGVyQ2FsbGJhY2siLGUuZm5IZWFkZXJDYWxsYmFjaywidXNlciIpO3oobywiYW9Gb290ZXJDYWxsYmFjayIsZS5mbkZvb3RlckNhbGxiYWNrLCJ1c2VyIik7eihvLCJhb0luaXRDb21wbGV0ZSIsZS5mbkluaXRDb21wbGV0ZSwidXNlciIpO3oobywiYW9QcmVEcmF3Q2FsbGJhY2siLGUuZm5QcmVEcmF3Q2FsbGJhY2ssInVzZXIiKTtvLnJvd0lkRm49UShlLnJvd0lkKTtnYihvKTtpPW8ub0NsYXNzZXM7ZS5iSlF1ZXJ5VUk/KGguZXh0ZW5kKGksbS5leHQub0pVSUNsYXNzZXMsZS5vQ2xhc3NlcyksZS5zRG9tPT09bC5zRG9tJiYibGZydGlwIj09PWwuc0RvbSYmKG8uc0RvbT0nPCJIImxmcj50PCJGImlwPicpLG8ucmVuZGVyZXIpP2guaXNQbGFpbk9iamVjdChvLnJlbmRlcmVyKSYmIW8ucmVuZGVyZXIuaGVhZGVyJiYoby5yZW5kZXJlci5oZWFkZXI9ImpxdWVyeXVpIik6Cm8ucmVuZGVyZXI9ImpxdWVyeXVpIjpoLmV4dGVuZChpLG0uZXh0LmNsYXNzZXMsZS5vQ2xhc3Nlcyk7cS5hZGRDbGFzcyhpLnNUYWJsZSk7by5pSW5pdERpc3BsYXlTdGFydD09PWsmJihvLmlJbml0RGlzcGxheVN0YXJ0PWUuaURpc3BsYXlTdGFydCxvLl9pRGlzcGxheVN0YXJ0PWUuaURpc3BsYXlTdGFydCk7bnVsbCE9PWUuaURlZmVyTG9hZGluZyYmKG8uYkRlZmVyTG9hZGluZz0hMCxnPWguaXNBcnJheShlLmlEZWZlckxvYWRpbmcpLG8uX2lSZWNvcmRzRGlzcGxheT1nP2UuaURlZmVyTG9hZGluZ1swXTplLmlEZWZlckxvYWRpbmcsby5faVJlY29yZHNUb3RhbD1nP2UuaURlZmVyTG9hZGluZ1sxXTplLmlEZWZlckxvYWRpbmcpO3ZhciByPW8ub0xhbmd1YWdlO2guZXh0ZW5kKCEwLHIsZS5vTGFuZ3VhZ2UpOyIiIT09ci5zVXJsJiYoaC5hamF4KHtkYXRhVHlwZToianNvbiIsdXJsOnIuc1VybCxzdWNjZXNzOmZ1bmN0aW9uKGEpe0RhKGEpO0sobC5vTGFuZ3VhZ2UsYSk7aC5leHRlbmQodHJ1ZSwKcixhKTtnYShvKX0sZXJyb3I6ZnVuY3Rpb24oKXtnYShvKX19KSxuPSEwKTtudWxsPT09ZS5hc1N0cmlwZUNsYXNzZXMmJihvLmFzU3RyaXBlQ2xhc3Nlcz1baS5zU3RyaXBlT2RkLGkuc1N0cmlwZUV2ZW5dKTt2YXIgZz1vLmFzU3RyaXBlQ2xhc3Nlcyx2PXEuY2hpbGRyZW4oInRib2R5IikuZmluZCgidHIiKS5lcSgwKTstMSE9PWguaW5BcnJheSghMCxoLm1hcChnLGZ1bmN0aW9uKGEpe3JldHVybiB2Lmhhc0NsYXNzKGEpfSkpJiYoaCgidGJvZHkgdHIiLHRoaXMpLnJlbW92ZUNsYXNzKGcuam9pbigiICIpKSxvLmFzRGVzdHJveVN0cmlwZXM9Zy5zbGljZSgpKTt0PVtdO2c9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGhlYWQiKTswIT09Zy5sZW5ndGgmJihkYShvLmFvSGVhZGVyLGdbMF0pLHQ9cWEobykpO2lmKG51bGw9PT1lLmFvQ29sdW1ucyl7cD1bXTtnPTA7Zm9yKGo9dC5sZW5ndGg7ZzxqO2crKylwLnB1c2gobnVsbCl9ZWxzZSBwPWUuYW9Db2x1bW5zO2c9MDtmb3Ioaj0KcC5sZW5ndGg7ZzxqO2crKylFYShvLHQ/dFtnXTpudWxsKTtpYihvLGUuYW9Db2x1bW5EZWZzLHAsZnVuY3Rpb24oYSxiKXtqYShvLGEsYil9KTtpZih2Lmxlbmd0aCl7dmFyIHM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImRhdGEtIitiKSE9PW51bGw/YjpudWxsfTtoKHZbMF0pLmNoaWxkcmVuKCJ0aCwgdGQiKS5lYWNoKGZ1bmN0aW9uKGEsYil7dmFyIGM9by5hb0NvbHVtbnNbYV07aWYoYy5tRGF0YT09PWEpe3ZhciBkPXMoYiwic29ydCIpfHxzKGIsIm9yZGVyIiksZT1zKGIsImZpbHRlciIpfHxzKGIsInNlYXJjaCIpO2lmKGQhPT1udWxsfHxlIT09bnVsbCl7Yy5tRGF0YT17XzphKyIuZGlzcGxheSIsc29ydDpkIT09bnVsbD9hKyIuQGRhdGEtIitkOmssdHlwZTpkIT09bnVsbD9hKyIuQGRhdGEtIitkOmssZmlsdGVyOmUhPT1udWxsP2ErIi5AZGF0YS0iK2U6a307amEobyxhKX19fSl9dmFyIHc9by5vRmVhdHVyZXM7ZS5iU3RhdGVTYXZlJiYody5iU3RhdGVTYXZlPQohMCxLYihvLGUpLHoobywiYW9EcmF3Q2FsbGJhY2siLHdhLCJzdGF0ZV9zYXZlIikpO2lmKGUuYWFTb3J0aW5nPT09ayl7dD1vLmFhU29ydGluZztnPTA7Zm9yKGo9dC5sZW5ndGg7ZzxqO2crKyl0W2ddWzFdPW8uYW9Db2x1bW5zW2ddLmFzU29ydGluZ1swXX12YShvKTt3LmJTb3J0JiZ6KG8sImFvRHJhd0NhbGxiYWNrIixmdW5jdGlvbigpe2lmKG8uYlNvcnRlZCl7dmFyIGE9VihvKSxiPXt9O2guZWFjaChhLGZ1bmN0aW9uKGEsYyl7YltjLnNyY109Yy5kaXJ9KTt1KG8sbnVsbCwib3JkZXIiLFtvLGEsYl0pO0piKG8pfX0pO3oobywiYW9EcmF3Q2FsbGJhY2siLGZ1bmN0aW9uKCl7KG8uYlNvcnRlZHx8eShvKT09PSJzc3AifHx3LmJEZWZlclJlbmRlcikmJnZhKG8pfSwic2MiKTtnPXEuY2hpbGRyZW4oImNhcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5fY2FwdGlvblNpZGU9cS5jc3MoImNhcHRpb24tc2lkZSIpfSk7aj1xLmNoaWxkcmVuKCJ0aGVhZCIpOzA9PT1qLmxlbmd0aCYmCihqPWgoIjx0aGVhZC8+IikuYXBwZW5kVG8odGhpcykpO28ublRIZWFkPWpbMF07aj1xLmNoaWxkcmVuKCJ0Ym9keSIpOzA9PT1qLmxlbmd0aCYmKGo9aCgiPHRib2R5Lz4iKS5hcHBlbmRUbyh0aGlzKSk7by5uVEJvZHk9alswXTtqPXEuY2hpbGRyZW4oInRmb290Iik7aWYoMD09PWoubGVuZ3RoJiYwPGcubGVuZ3RoJiYoIiIhPT1vLm9TY3JvbGwuc1h8fCIiIT09by5vU2Nyb2xsLnNZKSlqPWgoIjx0Zm9vdC8+IikuYXBwZW5kVG8odGhpcyk7MD09PWoubGVuZ3RofHwwPT09ai5jaGlsZHJlbigpLmxlbmd0aD9xLmFkZENsYXNzKGkuc05vRm9vdGVyKTowPGoubGVuZ3RoJiYoby5uVEZvb3Q9alswXSxkYShvLmFvRm9vdGVyLG8ublRGb290KSk7aWYoZS5hYURhdGEpZm9yKGc9MDtnPGUuYWFEYXRhLmxlbmd0aDtnKyspTihvLGUuYWFEYXRhW2ddKTtlbHNlKG8uYkRlZmVyTG9hZGluZ3x8ImRvbSI9PXkobykpJiZtYShvLGgoby5uVEJvZHkpLmNoaWxkcmVuKCJ0ciIpKTtvLmFpRGlzcGxheT0Kby5haURpc3BsYXlNYXN0ZXIuc2xpY2UoKTtvLmJJbml0aWFsaXNlZD0hMDshMT09PW4mJmdhKG8pfX0pO2I9bnVsbDtyZXR1cm4gdGhpc30sdixyLHAscyxZYT17fSxPYj0vW1xyXG5dL2csQWE9LzwuKj8+L2csYWM9L15bXHdcK1wtXS8sYmM9L1tcd1wrXC1dJC8sY2M9UmVnRXhwKCIoXFwvfFxcLnxcXCp8XFwrfFxcP3xcXHx8XFwofFxcKXxcXFt8XFxdfFxce3xcXH18XFxcXHxcXCR8XFxefFxcLSkiLCJnIiksWGE9L1snLCTCo+KCrMKlJVx1MjAwOVx1MjAyRlx1MjBCRFx1MjBhOVx1MjBCQXJma10vZ2ksTT1mdW5jdGlvbihhKXtyZXR1cm4hYXx8ITA9PT1hfHwiLSI9PT1hPyEwOiExfSxQYj1mdW5jdGlvbihhKXt2YXIgYj1wYXJzZUludChhLDEwKTtyZXR1cm4haXNOYU4oYikmJmlzRmluaXRlKGEpP2I6bnVsbH0sUWI9ZnVuY3Rpb24oYSxiKXtZYVtiXXx8KFlhW2JdPVJlZ0V4cChRYShiKSwiZyIpKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhJiYiLiIhPT1iP2EucmVwbGFjZSgvXC4vZywKIiIpLnJlcGxhY2UoWWFbYl0sIi4iKTphfSxaYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9InN0cmluZyI9PT10eXBlb2YgYTtpZihNKGEpKXJldHVybiEwO2ImJmQmJihhPVFiKGEsYikpO2MmJmQmJihhPWEucmVwbGFjZShYYSwiIikpO3JldHVybiFpc05hTihwYXJzZUZsb2F0KGEpKSYmaXNGaW5pdGUoYSl9LFJiPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gTShhKT8hMDohKE0oYSl8fCJzdHJpbmciPT09dHlwZW9mIGEpP251bGw6WmEoYS5yZXBsYWNlKEFhLCIiKSxiLGMpPyEwOm51bGx9LEc9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9MCxmPWEubGVuZ3RoO2lmKGMhPT1rKWZvcig7ZTxmO2UrKylhW2VdJiZhW2VdW2JdJiZkLnB1c2goYVtlXVtiXVtjXSk7ZWxzZSBmb3IoO2U8ZjtlKyspYVtlXSYmZC5wdXNoKGFbZV1bYl0pO3JldHVybiBkfSxoYT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1bXSxmPTAsZz1iLmxlbmd0aDtpZihkIT09aylmb3IoO2Y8ZztmKyspYVtiW2ZdXVtjXSYmCmUucHVzaChhW2JbZl1dW2NdW2RdKTtlbHNlIGZvcig7ZjxnO2YrKyllLnB1c2goYVtiW2ZdXVtjXSk7cmV0dXJuIGV9LFc9ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkO2I9PT1rPyhiPTAsZD1hKTooZD1iLGI9YSk7Zm9yKHZhciBlPWI7ZTxkO2UrKyljLnB1c2goZSk7cmV0dXJuIGN9LFNiPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTAsZD1hLmxlbmd0aDtjPGQ7YysrKWFbY10mJmIucHVzaChhW2NdKTtyZXR1cm4gYn0scGE9ZnVuY3Rpb24oYSl7dmFyIGI9W10sYyxkLGU9YS5sZW5ndGgsZixnPTA7ZD0wO2E6Zm9yKDtkPGU7ZCsrKXtjPWFbZF07Zm9yKGY9MDtmPGc7ZisrKWlmKGJbZl09PT1jKWNvbnRpbnVlIGE7Yi5wdXNoKGMpO2crK31yZXR1cm4gYn07bS51dGlsPXt0aHJvdHRsZTpmdW5jdGlvbihhLGIpe3ZhciBjPWIhPT1rP2I6MjAwLGQsZTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYj10aGlzLGc9K25ldyBEYXRlLGg9YXJndW1lbnRzO2QmJmc8ZCtjPyhjbGVhclRpbWVvdXQoZSksCmU9c2V0VGltZW91dChmdW5jdGlvbigpe2Q9azthLmFwcGx5KGIsaCl9LGMpKTooZD1nLGEuYXBwbHkoYixoKSl9fSxlc2NhcGVSZWdleDpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGNjLCJcXCQxIil9fTt2YXIgQT1mdW5jdGlvbihhLGIsYyl7YVtiXSE9PWsmJihhW2NdPWFbYl0pfSxiYT0vXFsuKj9cXSQvLFU9L1woXCkkLyxRYT1tLnV0aWwuZXNjYXBlUmVnZXgsdWE9aCgiPGRpdj4iKVswXSxaYj11YS50ZXh0Q29udGVudCE9PWssJGI9LzwuKj8+L2csT2E9bS51dGlsLnRocm90dGxlLFRiPVtdLHc9QXJyYXkucHJvdG90eXBlLGRjPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1tLnNldHRpbmdzLGU9aC5tYXAoZCxmdW5jdGlvbihhKXtyZXR1cm4gYS5uVGFibGV9KTtpZihhKXtpZihhLm5UYWJsZSYmYS5vQXBpKXJldHVyblthXTtpZihhLm5vZGVOYW1lJiYidGFibGUiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiBiPWguaW5BcnJheShhLGUpLC0xIT09Yj9bZFtiXV06Cm51bGw7aWYoYSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLnNldHRpbmdzKXJldHVybiBhLnNldHRpbmdzKCkudG9BcnJheSgpOyJzdHJpbmciPT09dHlwZW9mIGE/Yz1oKGEpOmEgaW5zdGFuY2VvZiBoJiYoYz1hKX1lbHNlIHJldHVybltdO2lmKGMpcmV0dXJuIGMubWFwKGZ1bmN0aW9uKCl7Yj1oLmluQXJyYXkodGhpcyxlKTtyZXR1cm4tMSE9PWI/ZFtiXTpudWxsfSkudG9BcnJheSgpfTtyPWZ1bmN0aW9uKGEsYil7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByKGEsYik7dmFyIGM9W10sZD1mdW5jdGlvbihhKXsoYT1kYyhhKSkmJihjPWMuY29uY2F0KGEpKX07aWYoaC5pc0FycmF5KGEpKWZvcih2YXIgZT0wLGY9YS5sZW5ndGg7ZTxmO2UrKylkKGFbZV0pO2Vsc2UgZChhKTt0aGlzLmNvbnRleHQ9cGEoYyk7YiYmaC5tZXJnZSh0aGlzLGIpO3RoaXMuc2VsZWN0b3I9e3Jvd3M6bnVsbCxjb2xzOm51bGwsb3B0czpudWxsfTtyLmV4dGVuZCh0aGlzLHRoaXMsVGIpfTsKbS5BcGk9cjtoLmV4dGVuZChyLnByb3RvdHlwZSx7YW55OmZ1bmN0aW9uKCl7cmV0dXJuIDAhPT10aGlzLmNvdW50KCl9LGNvbmNhdDp3LmNvbmNhdCxjb250ZXh0OltdLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmxhdHRlbigpLmxlbmd0aH0sZWFjaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPXRoaXMubGVuZ3RoO2I8YztiKyspYS5jYWxsKHRoaXMsdGhpc1tiXSxiLHRoaXMpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbnRleHQ7cmV0dXJuIGIubGVuZ3RoPmE/bmV3IHIoYlthXSx0aGlzW2FdKTpudWxsfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7dmFyIGI9W107aWYody5maWx0ZXIpYj13LmZpbHRlci5jYWxsKHRoaXMsYSx0aGlzKTtlbHNlIGZvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKylhLmNhbGwodGhpcyx0aGlzW2NdLGMsdGhpcykmJmIucHVzaCh0aGlzW2NdKTtyZXR1cm4gbmV3IHIodGhpcy5jb250ZXh0LGIpfSxmbGF0dGVuOmZ1bmN0aW9uKCl7dmFyIGE9CltdO3JldHVybiBuZXcgcih0aGlzLmNvbnRleHQsYS5jb25jYXQuYXBwbHkoYSx0aGlzLnRvQXJyYXkoKSkpfSxqb2luOncuam9pbixpbmRleE9mOncuaW5kZXhPZnx8ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Ynx8MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspaWYodGhpc1tjXT09PWEpcmV0dXJuIGM7cmV0dXJuLTF9LGl0ZXJhdG9yOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPVtdLGYsZyxoLGksbixsPXRoaXMuY29udGV4dCxtLHQscD10aGlzLnNlbGVjdG9yOyJzdHJpbmciPT09dHlwZW9mIGEmJihkPWMsYz1iLGI9YSxhPSExKTtnPTA7Zm9yKGg9bC5sZW5ndGg7ZzxoO2crKyl7dmFyIG89bmV3IHIobFtnXSk7aWYoInRhYmxlIj09PWIpZj1jLmNhbGwobyxsW2ddLGcpLGYhPT1rJiZlLnB1c2goZik7ZWxzZSBpZigiY29sdW1ucyI9PT1ifHwicm93cyI9PT1iKWY9Yy5jYWxsKG8sbFtnXSx0aGlzW2ddLGcpLGYhPT1rJiZlLnB1c2goZik7ZWxzZSBpZigiY29sdW1uIj09PWJ8fCJjb2x1bW4tcm93cyI9PT0KYnx8InJvdyI9PT1ifHwiY2VsbCI9PT1iKXt0PXRoaXNbZ107ImNvbHVtbi1yb3dzIj09PWImJihtPUJhKGxbZ10scC5vcHRzKSk7aT0wO2ZvcihuPXQubGVuZ3RoO2k8bjtpKyspZj10W2ldLGY9ImNlbGwiPT09Yj9jLmNhbGwobyxsW2ddLGYucm93LGYuY29sdW1uLGcsaSk6Yy5jYWxsKG8sbFtnXSxmLGcsaSxtKSxmIT09ayYmZS5wdXNoKGYpfX1yZXR1cm4gZS5sZW5ndGh8fGQ/KGE9bmV3IHIobCxhP2UuY29uY2F0LmFwcGx5KFtdLGUpOmUpLGI9YS5zZWxlY3RvcixiLnJvd3M9cC5yb3dzLGIuY29scz1wLmNvbHMsYi5vcHRzPXAub3B0cyxhKTp0aGlzfSxsYXN0SW5kZXhPZjp3Lmxhc3RJbmRleE9mfHxmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmluZGV4T2YuYXBwbHkodGhpcy50b0FycmF5LnJldmVyc2UoKSxhcmd1bWVudHMpfSxsZW5ndGg6MCxtYXA6ZnVuY3Rpb24oYSl7dmFyIGI9W107aWYody5tYXApYj13Lm1hcC5jYWxsKHRoaXMsYSx0aGlzKTtlbHNlIGZvcih2YXIgYz0KMCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspYi5wdXNoKGEuY2FsbCh0aGlzLHRoaXNbY10sYykpO3JldHVybiBuZXcgcih0aGlzLmNvbnRleHQsYil9LHBsdWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gYlthXX0pfSxwb3A6dy5wb3AscHVzaDp3LnB1c2gscmVkdWNlOncucmVkdWNlfHxmdW5jdGlvbihhLGIpe3JldHVybiBoYih0aGlzLGEsYiwwLHRoaXMubGVuZ3RoLDEpfSxyZWR1Y2VSaWdodDp3LnJlZHVjZVJpZ2h0fHxmdW5jdGlvbihhLGIpe3JldHVybiBoYih0aGlzLGEsYix0aGlzLmxlbmd0aC0xLC0xLC0xKX0scmV2ZXJzZTp3LnJldmVyc2Usc2VsZWN0b3I6bnVsbCxzaGlmdDp3LnNoaWZ0LHNvcnQ6dy5zb3J0LHNwbGljZTp3LnNwbGljZSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHcuc2xpY2UuY2FsbCh0aGlzKX0sdG8kOmZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcyl9LHRvSlF1ZXJ5OmZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcyl9LAp1bmlxdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIodGhpcy5jb250ZXh0LHBhKHRoaXMpKX0sdW5zaGlmdDp3LnVuc2hpZnR9KTtyLmV4dGVuZD1mdW5jdGlvbihhLGIsYyl7aWYoYy5sZW5ndGgmJmImJihiIGluc3RhbmNlb2Ygcnx8Yi5fX2R0X3dyYXBwZXIpKXt2YXIgZCxlLGYsZz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGQ9Yi5hcHBseShhLGFyZ3VtZW50cyk7ci5leHRlbmQoZCxkLGMubWV0aG9kRXh0KTtyZXR1cm4gZH19O2Q9MDtmb3IoZT1jLmxlbmd0aDtkPGU7ZCsrKWY9Y1tkXSxiW2YubmFtZV09ImZ1bmN0aW9uIj09PXR5cGVvZiBmLnZhbD9nKGEsZi52YWwsZik6aC5pc1BsYWluT2JqZWN0KGYudmFsKT97fTpmLnZhbCxiW2YubmFtZV0uX19kdF93cmFwcGVyPSEwLHIuZXh0ZW5kKGEsYltmLm5hbWVdLGYucHJvcEV4dCl9fTtyLnJlZ2lzdGVyPXA9ZnVuY3Rpb24oYSxiKXtpZihoLmlzQXJyYXkoYSkpZm9yKHZhciBjPTAsZD1hLmxlbmd0aDtjPApkO2MrKylyLnJlZ2lzdGVyKGFbY10sYik7ZWxzZSBmb3IodmFyIGU9YS5zcGxpdCgiLiIpLGY9VGIsZyxqLGM9MCxkPWUubGVuZ3RoO2M8ZDtjKyspe2c9KGo9LTEhPT1lW2NdLmluZGV4T2YoIigpIikpP2VbY10ucmVwbGFjZSgiKCkiLCIiKTplW2NdO3ZhciBpO2E6e2k9MDtmb3IodmFyIG49Zi5sZW5ndGg7aTxuO2krKylpZihmW2ldLm5hbWU9PT1nKXtpPWZbaV07YnJlYWsgYX1pPW51bGx9aXx8KGk9e25hbWU6Zyx2YWw6e30sbWV0aG9kRXh0OltdLHByb3BFeHQ6W119LGYucHVzaChpKSk7Yz09PWQtMT9pLnZhbD1iOmY9aj9pLm1ldGhvZEV4dDppLnByb3BFeHR9fTtyLnJlZ2lzdGVyUGx1cmFsPXM9ZnVuY3Rpb24oYSxiLGMpe3IucmVnaXN0ZXIoYSxjKTtyLnJlZ2lzdGVyKGIsZnVuY3Rpb24oKXt2YXIgYT1jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gYT09PXRoaXM/dGhpczphIGluc3RhbmNlb2Ygcj9hLmxlbmd0aD9oLmlzQXJyYXkoYVswXSk/bmV3IHIoYS5jb250ZXh0LAphWzBdKTphWzBdOms6YX0pfTtwKCJ0YWJsZXMoKSIsZnVuY3Rpb24oYSl7dmFyIGI7aWYoYSl7Yj1yO3ZhciBjPXRoaXMuY29udGV4dDtpZigibnVtYmVyIj09PXR5cGVvZiBhKWE9W2NbYV1dO2Vsc2UgdmFyIGQ9aC5tYXAoYyxmdW5jdGlvbihhKXtyZXR1cm4gYS5uVGFibGV9KSxhPWgoZCkuZmlsdGVyKGEpLm1hcChmdW5jdGlvbigpe3ZhciBhPWguaW5BcnJheSh0aGlzLGQpO3JldHVybiBjW2FdfSkudG9BcnJheSgpO2I9bmV3IGIoYSl9ZWxzZSBiPXRoaXM7cmV0dXJuIGJ9KTtwKCJ0YWJsZSgpIixmdW5jdGlvbihhKXt2YXIgYT10aGlzLnRhYmxlcyhhKSxiPWEuY29udGV4dDtyZXR1cm4gYi5sZW5ndGg/bmV3IHIoYlswXSk6YX0pO3MoInRhYmxlcygpLm5vZGVzKCkiLCJ0YWJsZSgpLm5vZGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5UYWJsZX0sMSl9KTtzKCJ0YWJsZXMoKS5ib2R5KCkiLCJ0YWJsZSgpLmJvZHkoKSIsCmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uVEJvZHl9LDEpfSk7cygidGFibGVzKCkuaGVhZGVyKCkiLCJ0YWJsZSgpLmhlYWRlcigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYSl7cmV0dXJuIGEublRIZWFkfSwxKX0pO3MoInRhYmxlcygpLmZvb3RlcigpIiwidGFibGUoKS5mb290ZXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5URm9vdH0sMSl9KTtzKCJ0YWJsZXMoKS5jb250YWluZXJzKCkiLCJ0YWJsZSgpLmNvbnRhaW5lcigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYSl7cmV0dXJuIGEublRhYmxlV3JhcHBlcn0sMSl9KTtwKCJkcmF3KCkiLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYil7InBhZ2UiPT09CmE/TyhiKTooInN0cmluZyI9PT10eXBlb2YgYSYmKGE9ImZ1bGwtaG9sZCI9PT1hPyExOiEwKSxUKGIsITE9PT1hKSl9KX0pO3AoInBhZ2UoKSIsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1rP3RoaXMucGFnZS5pbmZvKCkucGFnZTp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYil7VGEoYixhKX0pfSk7cCgicGFnZS5pbmZvKCkiLGZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuY29udGV4dC5sZW5ndGgpcmV0dXJuIGs7dmFyIGE9dGhpcy5jb250ZXh0WzBdLGI9YS5faURpc3BsYXlTdGFydCxjPWEub0ZlYXR1cmVzLmJQYWdpbmF0ZT9hLl9pRGlzcGxheUxlbmd0aDotMSxkPWEuZm5SZWNvcmRzRGlzcGxheSgpLGU9LTE9PT1jO3JldHVybntwYWdlOmU/MDpNYXRoLmZsb29yKGIvYykscGFnZXM6ZT8xOk1hdGguY2VpbChkL2MpLHN0YXJ0OmIsZW5kOmEuZm5EaXNwbGF5RW5kKCksbGVuZ3RoOmMscmVjb3Jkc1RvdGFsOmEuZm5SZWNvcmRzVG90YWwoKSxyZWNvcmRzRGlzcGxheTpkLApzZXJ2ZXJTaWRlOiJzc3AiPT09eShhKX19KTtwKCJwYWdlLmxlbigpIixmdW5jdGlvbihhKXtyZXR1cm4gYT09PWs/MCE9PXRoaXMuY29udGV4dC5sZW5ndGg/dGhpcy5jb250ZXh0WzBdLl9pRGlzcGxheUxlbmd0aDprOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihiKXtSYShiLGEpfSl9KTt2YXIgVWI9ZnVuY3Rpb24oYSxiLGMpe2lmKGMpe3ZhciBkPW5ldyByKGEpO2Qub25lKCJkcmF3IixmdW5jdGlvbigpe2MoZC5hamF4Lmpzb24oKSl9KX1pZigic3NwIj09eShhKSlUKGEsYik7ZWxzZXtDKGEsITApO3ZhciBlPWEuanFYSFI7ZSYmNCE9PWUucmVhZHlTdGF0ZSYmZS5hYm9ydCgpO3JhKGEsW10sZnVuY3Rpb24oYyl7bmEoYSk7Zm9yKHZhciBjPXNhKGEsYyksZD0wLGU9Yy5sZW5ndGg7ZDxlO2QrKylOKGEsY1tkXSk7VChhLGIpO0MoYSwhMSl9KX19O3AoImFqYXguanNvbigpIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuY29udGV4dDtpZigwPGEubGVuZ3RoKXJldHVybiBhWzBdLmpzb259KTsKcCgiYWpheC5wYXJhbXMoKSIsZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbnRleHQ7aWYoMDxhLmxlbmd0aClyZXR1cm4gYVswXS5vQWpheERhdGF9KTtwKCJhamF4LnJlbG9hZCgpIixmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYyl7VWIoYywhMT09PWIsYSl9KX0pO3AoImFqYXgudXJsKCkiLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29udGV4dDtpZihhPT09ayl7aWYoMD09PWIubGVuZ3RoKXJldHVybiBrO2I9YlswXTtyZXR1cm4gYi5hamF4P2guaXNQbGFpbk9iamVjdChiLmFqYXgpP2IuYWpheC51cmw6Yi5hamF4OmIuc0FqYXhTb3VyY2V9cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihiKXtoLmlzUGxhaW5PYmplY3QoYi5hamF4KT9iLmFqYXgudXJsPWE6Yi5hamF4PWF9KX0pO3AoImFqYXgudXJsKCkubG9hZCgpIixmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYyl7VWIoYywKITE9PT1iLGEpfSl9KTt2YXIgJGE9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1bXSxnLGosaSxuLGwsbTtpPXR5cGVvZiBiO2lmKCFifHwic3RyaW5nIj09PWl8fCJmdW5jdGlvbiI9PT1pfHxiLmxlbmd0aD09PWspYj1bYl07aT0wO2ZvcihuPWIubGVuZ3RoO2k8bjtpKyspe2o9YltpXSYmYltpXS5zcGxpdD9iW2ldLnNwbGl0KCIsIik6W2JbaV1dO2w9MDtmb3IobT1qLmxlbmd0aDtsPG07bCsrKShnPWMoInN0cmluZyI9PT10eXBlb2YgaltsXT9oLnRyaW0oaltsXSk6altsXSkpJiZnLmxlbmd0aCYmKGY9Zi5jb25jYXQoZykpfWE9di5zZWxlY3RvclthXTtpZihhLmxlbmd0aCl7aT0wO2ZvcihuPWEubGVuZ3RoO2k8bjtpKyspZj1hW2ldKGQsZSxmKX1yZXR1cm4gcGEoZil9LGFiPWZ1bmN0aW9uKGEpe2F8fChhPXt9KTthLmZpbHRlciYmYS5zZWFyY2g9PT1rJiYoYS5zZWFyY2g9YS5maWx0ZXIpO3JldHVybiBoLmV4dGVuZCh7c2VhcmNoOiJub25lIixvcmRlcjoiY3VycmVudCIsCnBhZ2U6ImFsbCJ9LGEpfSxiYj1mdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoO2I8YztiKyspaWYoMDxhW2JdLmxlbmd0aClyZXR1cm4gYVswXT1hW2JdLGFbMF0ubGVuZ3RoPTEsYS5sZW5ndGg9MSxhLmNvbnRleHQ9W2EuY29udGV4dFtiXV0sYTthLmxlbmd0aD0wO3JldHVybiBhfSxCYT1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPVtdLGc9YS5haURpc3BsYXk7Yz1hLmFpRGlzcGxheU1hc3Rlcjt2YXIgaj1iLnNlYXJjaDtkPWIub3JkZXI7ZT1iLnBhZ2U7aWYoInNzcCI9PXkoYSkpcmV0dXJuInJlbW92ZWQiPT09aj9bXTpXKDAsYy5sZW5ndGgpO2lmKCJjdXJyZW50Ij09ZSl7Yz1hLl9pRGlzcGxheVN0YXJ0O2ZvcihkPWEuZm5EaXNwbGF5RW5kKCk7YzxkO2MrKylmLnB1c2goZ1tjXSl9ZWxzZSBpZigiY3VycmVudCI9PWR8fCJhcHBsaWVkIj09ZClmPSJub25lIj09aj9jLnNsaWNlKCk6ImFwcGxpZWQiPT1qP2cuc2xpY2UoKTpoLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybi0xPT09CmguaW5BcnJheShhLGcpP2E6bnVsbH0pO2Vsc2UgaWYoImluZGV4Ij09ZHx8Im9yaWdpbmFsIj09ZCl7Yz0wO2ZvcihkPWEuYW9EYXRhLmxlbmd0aDtjPGQ7YysrKSJub25lIj09aj9mLnB1c2goYyk6KGU9aC5pbkFycmF5KGMsZyksKC0xPT09ZSYmInJlbW92ZWQiPT1qfHwwPD1lJiYiYXBwbGllZCI9PWopJiZmLnB1c2goYykpfXJldHVybiBmfTtwKCJyb3dzKCkiLGZ1bmN0aW9uKGEsYil7YT09PWs/YT0iIjpoLmlzUGxhaW5PYmplY3QoYSkmJihiPWEsYT0iIik7dmFyIGI9YWIoYiksYz10aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYyl7dmFyIGU9YjtyZXR1cm4gJGEoInJvdyIsYSxmdW5jdGlvbihhKXt2YXIgYj1QYihhKTtpZihiIT09bnVsbCYmIWUpcmV0dXJuW2JdO3ZhciBqPUJhKGMsZSk7aWYoYiE9PW51bGwmJmguaW5BcnJheShiLGopIT09LTEpcmV0dXJuW2JdO2lmKCFhKXJldHVybiBqO2lmKHR5cGVvZiBhPT09ImZ1bmN0aW9uIilyZXR1cm4gaC5tYXAoaixmdW5jdGlvbihiKXt2YXIgZT0KYy5hb0RhdGFbYl07cmV0dXJuIGEoYixlLl9hRGF0YSxlLm5Ucik/YjpudWxsfSk7Yj1TYihoYShjLmFvRGF0YSxqLCJuVHIiKSk7aWYoYS5ub2RlTmFtZSl7aWYoYS5fRFRfUm93SW5kZXghPT1rKXJldHVyblthLl9EVF9Sb3dJbmRleF07aWYoYS5fRFRfQ2VsbEluZGV4KXJldHVyblthLl9EVF9DZWxsSW5kZXgucm93XTtiPWgoYSkuY2xvc2VzdCgiKltkYXRhLWR0LXJvd10iKTtyZXR1cm4gYi5sZW5ndGg/W2IuZGF0YSgiZHQtcm93IildOltdfWlmKHR5cGVvZiBhPT09InN0cmluZyImJmEuY2hhckF0KDApPT09IiMiKXtqPWMuYUlkc1thLnJlcGxhY2UoL14jLywiIildO2lmKGohPT1rKXJldHVybltqLmlkeF19cmV0dXJuIGgoYikuZmlsdGVyKGEpLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLl9EVF9Sb3dJbmRleH0pLnRvQXJyYXkoKX0sYyxlKX0sMSk7Yy5zZWxlY3Rvci5yb3dzPWE7Yy5zZWxlY3Rvci5vcHRzPWI7cmV0dXJuIGN9KTtwKCJyb3dzKCkubm9kZXMoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigicm93IiwKZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5hb0RhdGFbYl0ublRyfHxrfSwxKX0pO3AoInJvd3MoKS5kYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoITAsInJvd3MiLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGhhKGEuYW9EYXRhLGIsIl9hRGF0YSIpfSwxKX0pO3MoInJvd3MoKS5jYWNoZSgpIiwicm93KCkuY2FjaGUoKSIsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24oYixjKXt2YXIgZD1iLmFvRGF0YVtjXTtyZXR1cm4ic2VhcmNoIj09PWE/ZC5fYUZpbHRlckRhdGE6ZC5fYVNvcnREYXRhfSwxKX0pO3MoInJvd3MoKS5pbnZhbGlkYXRlKCkiLCJyb3coKS5pbnZhbGlkYXRlKCkiLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKGIsYyl7Y2EoYixjLGEpfSl9KTtzKCJyb3dzKCkuaW5kZXhlcygpIiwicm93KCkuaW5kZXgoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigicm93IiwKZnVuY3Rpb24oYSxiKXtyZXR1cm4gYn0sMSl9KTtzKCJyb3dzKCkuaWRzKCkiLCJyb3coKS5pZCgpIixmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz10aGlzLmNvbnRleHQsZD0wLGU9Yy5sZW5ndGg7ZDxlO2QrKylmb3IodmFyIGY9MCxnPXRoaXNbZF0ubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWNbZF0ucm93SWRGbihjW2RdLmFvRGF0YVt0aGlzW2RdW2ZdXS5fYURhdGEpO2IucHVzaCgoITA9PT1hPyIjIjoiIikraCl9cmV0dXJuIG5ldyByKGMsYil9KTtzKCJyb3dzKCkucmVtb3ZlKCkiLCJyb3coKS5yZW1vdmUoKSIsZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuYW9EYXRhLGY9ZVtjXSxnLGgsaSxuLGw7ZS5zcGxpY2UoYywxKTtnPTA7Zm9yKGg9ZS5sZW5ndGg7ZzxoO2crKylpZihpPWVbZ10sbD1pLmFuQ2VsbHMsbnVsbCE9PWkublRyJiYoaS5uVHIuX0RUX1Jvd0luZGV4PWcpLG51bGwhPT1sKXtpPTA7Zm9yKG49CmwubGVuZ3RoO2k8bjtpKyspbFtpXS5fRFRfQ2VsbEluZGV4LnJvdz1nfW9hKGIuYWlEaXNwbGF5TWFzdGVyLGMpO29hKGIuYWlEaXNwbGF5LGMpO29hKGFbZF0sYywhMSk7U2EoYik7Yz1iLnJvd0lkRm4oZi5fYURhdGEpO2MhPT1rJiZkZWxldGUgYi5hSWRzW2NdfSk7dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wLGQ9YS5hb0RhdGEubGVuZ3RoO2M8ZDtjKyspYS5hb0RhdGFbY10uaWR4PWN9KTtyZXR1cm4gdGhpc30pO3AoInJvd3MuYWRkKCkiLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihiKXt2YXIgYyxmLGcsaD1bXTtmPTA7Zm9yKGc9YS5sZW5ndGg7ZjxnO2YrKyljPWFbZl0sYy5ub2RlTmFtZSYmIlRSIj09PWMubm9kZU5hbWUudG9VcHBlckNhc2UoKT9oLnB1c2gobWEoYixjKVswXSk6aC5wdXNoKE4oYixjKSk7cmV0dXJuIGh9LDEpLGM9dGhpcy5yb3dzKC0xKTtjLnBvcCgpO2gubWVyZ2UoYyxiKTsKcmV0dXJuIGN9KTtwKCJyb3coKSIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYmIodGhpcy5yb3dzKGEsYikpfSk7cCgicm93KCkuZGF0YSgpIixmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbnRleHQ7aWYoYT09PWspcmV0dXJuIGIubGVuZ3RoJiZ0aGlzLmxlbmd0aD9iWzBdLmFvRGF0YVt0aGlzWzBdXS5fYURhdGE6aztiWzBdLmFvRGF0YVt0aGlzWzBdXS5fYURhdGE9YTtjYShiWzBdLHRoaXNbMF0sImRhdGEiKTtyZXR1cm4gdGhpc30pO3AoInJvdygpLm5vZGUoKSIsZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbnRleHQ7cmV0dXJuIGEubGVuZ3RoJiZ0aGlzLmxlbmd0aD9hWzBdLmFvRGF0YVt0aGlzWzBdXS5uVHJ8fG51bGw6bnVsbH0pO3AoInJvdy5hZGQoKSIsZnVuY3Rpb24oYSl7YSBpbnN0YW5jZW9mIGgmJmEubGVuZ3RoJiYoYT1hWzBdKTt2YXIgYj10aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYil7cmV0dXJuIGEubm9kZU5hbWUmJiJUUiI9PT1hLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk/Cm1hKGIsYSlbMF06TihiLGEpfSk7cmV0dXJuIHRoaXMucm93KGJbMF0pfSk7dmFyIGNiPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5jb250ZXh0O2lmKGMubGVuZ3RoJiYoYz1jWzBdLmFvRGF0YVtiIT09az9iOmFbMF1dKSYmYy5fZGV0YWlscyljLl9kZXRhaWxzLnJlbW92ZSgpLGMuX2RldGFpbHNTaG93PWssYy5fZGV0YWlscz1rfSxWYj1mdW5jdGlvbihhLGIpe3ZhciBjPWEuY29udGV4dDtpZihjLmxlbmd0aCYmYS5sZW5ndGgpe3ZhciBkPWNbMF0uYW9EYXRhW2FbMF1dO2lmKGQuX2RldGFpbHMpeyhkLl9kZXRhaWxzU2hvdz1iKT9kLl9kZXRhaWxzLmluc2VydEFmdGVyKGQublRyKTpkLl9kZXRhaWxzLmRldGFjaCgpO3ZhciBlPWNbMF0sZj1uZXcgcihlKSxnPWUuYW9EYXRhO2Yub2ZmKCJkcmF3LmR0LkRUX2RldGFpbHMgY29sdW1uLXZpc2liaWxpdHkuZHQuRFRfZGV0YWlscyBkZXN0cm95LmR0LkRUX2RldGFpbHMiKTswPEcoZywiX2RldGFpbHMiKS5sZW5ndGgmJihmLm9uKCJkcmF3LmR0LkRUX2RldGFpbHMiLApmdW5jdGlvbihhLGIpe2U9PT1iJiZmLnJvd3Moe3BhZ2U6ImN1cnJlbnQifSkuZXEoMCkuZWFjaChmdW5jdGlvbihhKXthPWdbYV07YS5fZGV0YWlsc1Nob3cmJmEuX2RldGFpbHMuaW5zZXJ0QWZ0ZXIoYS5uVHIpfSl9KSxmLm9uKCJjb2x1bW4tdmlzaWJpbGl0eS5kdC5EVF9kZXRhaWxzIixmdW5jdGlvbihhLGIpe2lmKGU9PT1iKWZvcih2YXIgYyxkPWFhKGIpLGY9MCxoPWcubGVuZ3RoO2Y8aDtmKyspYz1nW2ZdLGMuX2RldGFpbHMmJmMuX2RldGFpbHMuY2hpbGRyZW4oInRkW2NvbHNwYW5dIikuYXR0cigiY29sc3BhbiIsZCl9KSxmLm9uKCJkZXN0cm95LmR0LkRUX2RldGFpbHMiLGZ1bmN0aW9uKGEsYil7aWYoZT09PWIpZm9yKHZhciBjPTAsZD1nLmxlbmd0aDtjPGQ7YysrKWdbY10uX2RldGFpbHMmJmNiKGYsYyl9KSl9fX07cCgicm93KCkuY2hpbGQoKSIsZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNvbnRleHQ7aWYoYT09PWspcmV0dXJuIGMubGVuZ3RoJiZ0aGlzLmxlbmd0aD8KY1swXS5hb0RhdGFbdGhpc1swXV0uX2RldGFpbHM6aztpZighMD09PWEpdGhpcy5jaGlsZC5zaG93KCk7ZWxzZSBpZighMT09PWEpY2IodGhpcyk7ZWxzZSBpZihjLmxlbmd0aCYmdGhpcy5sZW5ndGgpe3ZhciBkPWNbMF0sYz1jWzBdLmFvRGF0YVt0aGlzWzBdXSxlPVtdLGY9ZnVuY3Rpb24oYSxiKXtpZihoLmlzQXJyYXkoYSl8fGEgaW5zdGFuY2VvZiBoKWZvcih2YXIgYz0wLGs9YS5sZW5ndGg7YzxrO2MrKylmKGFbY10sYik7ZWxzZSBhLm5vZGVOYW1lJiYidHIiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP2UucHVzaChhKTooYz1oKCI8dHI+PHRkLz48L3RyPiIpLmFkZENsYXNzKGIpLGgoInRkIixjKS5hZGRDbGFzcyhiKS5odG1sKGEpWzBdLmNvbFNwYW49YWEoZCksZS5wdXNoKGNbMF0pKX07ZihhLGIpO2MuX2RldGFpbHMmJmMuX2RldGFpbHMucmVtb3ZlKCk7Yy5fZGV0YWlscz1oKGUpO2MuX2RldGFpbHNTaG93JiZjLl9kZXRhaWxzLmluc2VydEFmdGVyKGMublRyKX1yZXR1cm4gdGhpc30pOwpwKFsicm93KCkuY2hpbGQuc2hvdygpIiwicm93KCkuY2hpbGQoKS5zaG93KCkiXSxmdW5jdGlvbigpe1ZiKHRoaXMsITApO3JldHVybiB0aGlzfSk7cChbInJvdygpLmNoaWxkLmhpZGUoKSIsInJvdygpLmNoaWxkKCkuaGlkZSgpIl0sZnVuY3Rpb24oKXtWYih0aGlzLCExKTtyZXR1cm4gdGhpc30pO3AoWyJyb3coKS5jaGlsZC5yZW1vdmUoKSIsInJvdygpLmNoaWxkKCkucmVtb3ZlKCkiXSxmdW5jdGlvbigpe2NiKHRoaXMpO3JldHVybiB0aGlzfSk7cCgicm93KCkuY2hpbGQuaXNTaG93bigpIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuY29udGV4dDtyZXR1cm4gYS5sZW5ndGgmJnRoaXMubGVuZ3RoP2FbMF0uYW9EYXRhW3RoaXNbMF1dLl9kZXRhaWxzU2hvd3x8ITE6ITF9KTt2YXIgZWM9L14oLispOihuYW1lfHZpc0lkeHx2aXNpYmxlKSQvLFdiPWZ1bmN0aW9uKGEsYixjLGQsZSl7Zm9yKHZhciBjPVtdLGQ9MCxmPWUubGVuZ3RoO2Q8ZjtkKyspYy5wdXNoKEIoYSxlW2RdLGIpKTsKcmV0dXJuIGN9O3AoImNvbHVtbnMoKSIsZnVuY3Rpb24oYSxiKXthPT09az9hPSIiOmguaXNQbGFpbk9iamVjdChhKSYmKGI9YSxhPSIiKTt2YXIgYj1hYihiKSxjPXRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihjKXt2YXIgZT1hLGY9YixnPWMuYW9Db2x1bW5zLGo9RyhnLCJzTmFtZSIpLGk9RyhnLCJuVGgiKTtyZXR1cm4gJGEoImNvbHVtbiIsZSxmdW5jdGlvbihhKXt2YXIgYj1QYihhKTtpZihhPT09IiIpcmV0dXJuIFcoZy5sZW5ndGgpO2lmKGIhPT1udWxsKXJldHVybltiPj0wP2I6Zy5sZW5ndGgrYl07aWYodHlwZW9mIGE9PT0iZnVuY3Rpb24iKXt2YXIgZT1CYShjLGYpO3JldHVybiBoLm1hcChnLGZ1bmN0aW9uKGIsZil7cmV0dXJuIGEoZixXYihjLGYsMCwwLGUpLGlbZl0pP2Y6bnVsbH0pfXZhciBrPXR5cGVvZiBhPT09InN0cmluZyI/YS5tYXRjaChlYyk6IiI7aWYoaylzd2l0Y2goa1syXSl7Y2FzZSAidmlzSWR4IjpjYXNlICJ2aXNpYmxlIjpiPXBhcnNlSW50KGtbMV0sCjEwKTtpZihiPDApe3ZhciBtPWgubWFwKGcsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5iVmlzaWJsZT9iOm51bGx9KTtyZXR1cm5bbVttLmxlbmd0aCtiXV19cmV0dXJuW1ooYyxiKV07Y2FzZSAibmFtZSI6cmV0dXJuIGgubWFwKGosZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWtbMV0/YjpudWxsfSk7ZGVmYXVsdDpyZXR1cm5bXX1pZihhLm5vZGVOYW1lJiZhLl9EVF9DZWxsSW5kZXgpcmV0dXJuW2EuX0RUX0NlbGxJbmRleC5jb2x1bW5dO2I9aChpKS5maWx0ZXIoYSkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGguaW5BcnJheSh0aGlzLGkpfSkudG9BcnJheSgpO2lmKGIubGVuZ3RofHwhYS5ub2RlTmFtZSlyZXR1cm4gYjtiPWgoYSkuY2xvc2VzdCgiKltkYXRhLWR0LWNvbHVtbl0iKTtyZXR1cm4gYi5sZW5ndGg/W2IuZGF0YSgiZHQtY29sdW1uIildOltdfSxjLGYpfSwxKTtjLnNlbGVjdG9yLmNvbHM9YTtjLnNlbGVjdG9yLm9wdHM9YjtyZXR1cm4gY30pO3MoImNvbHVtbnMoKS5oZWFkZXIoKSIsCiJjb2x1bW4oKS5oZWFkZXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihhLGIpe3JldHVybiBhLmFvQ29sdW1uc1tiXS5uVGh9LDEpfSk7cygiY29sdW1ucygpLmZvb3RlcigpIiwiY29sdW1uKCkuZm9vdGVyKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5hb0NvbHVtbnNbYl0ublRmfSwxKX0pO3MoImNvbHVtbnMoKS5kYXRhKCkiLCJjb2x1bW4oKS5kYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbi1yb3dzIixXYiwxKX0pO3MoImNvbHVtbnMoKS5kYXRhU3JjKCkiLCJjb2x1bW4oKS5kYXRhU3JjKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5hb0NvbHVtbnNbYl0ubURhdGF9LDEpfSk7cygiY29sdW1ucygpLmNhY2hlKCkiLCJjb2x1bW4oKS5jYWNoZSgpIiwKZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbi1yb3dzIixmdW5jdGlvbihiLGMsZCxlLGYpe3JldHVybiBoYShiLmFvRGF0YSxmLCJzZWFyY2giPT09YT8iX2FGaWx0ZXJEYXRhIjoiX2FTb3J0RGF0YSIsYyl9LDEpfSk7cygiY29sdW1ucygpLm5vZGVzKCkiLCJjb2x1bW4oKS5ub2RlcygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gaGEoYS5hb0RhdGEsZSwiYW5DZWxscyIsYil9LDEpfSk7cygiY29sdW1ucygpLnZpc2libGUoKSIsImNvbHVtbigpLnZpc2libGUoKSIsZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGIsYyl7aWYoYT09PWspcmV0dXJuIGIuYW9Db2x1bW5zW2NdLmJWaXNpYmxlO3ZhciBmPWIuYW9Db2x1bW5zLGc9ZltjXSxqPWIuYW9EYXRhLGksbixsO2lmKGEhPT1rJiZnLmJWaXNpYmxlIT09YSl7aWYoYSl7dmFyIG09CmguaW5BcnJheSghMCxHKGYsImJWaXNpYmxlIiksYysxKTtpPTA7Zm9yKG49ai5sZW5ndGg7aTxuO2krKylsPWpbaV0ublRyLGY9altpXS5hbkNlbGxzLGwmJmwuaW5zZXJ0QmVmb3JlKGZbY10sZlttXXx8bnVsbCl9ZWxzZSBoKEcoYi5hb0RhdGEsImFuQ2VsbHMiLGMpKS5kZXRhY2goKTtnLmJWaXNpYmxlPWE7ZWEoYixiLmFvSGVhZGVyKTtlYShiLGIuYW9Gb290ZXIpO3dhKGIpfX0pO2EhPT1rJiYodGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihjLGUpe3UoYyxudWxsLCJjb2x1bW4tdmlzaWJpbGl0eSIsW2MsZSxhLGJdKX0pLChiPT09a3x8YikmJnRoaXMuY29sdW1ucy5hZGp1c3QoKSk7cmV0dXJuIGN9KTtzKCJjb2x1bW5zKCkuaW5kZXhlcygpIiwiY29sdW1uKCkuaW5kZXgoKSIsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oYixjKXtyZXR1cm4idmlzaWJsZSI9PT1hPyQoYixjKTpjfSwxKX0pO3AoImNvbHVtbnMuYWRqdXN0KCkiLApmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYSl7WShhKX0sMSl9KTtwKCJjb2x1bW4uaW5kZXgoKSIsZnVuY3Rpb24oYSxiKXtpZigwIT09dGhpcy5jb250ZXh0Lmxlbmd0aCl7dmFyIGM9dGhpcy5jb250ZXh0WzBdO2lmKCJmcm9tVmlzaWJsZSI9PT1hfHwidG9EYXRhIj09PWEpcmV0dXJuIFooYyxiKTtpZigiZnJvbURhdGEiPT09YXx8InRvVmlzaWJsZSI9PT1hKXJldHVybiAkKGMsYil9fSk7cCgiY29sdW1uKCkiLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGJiKHRoaXMuY29sdW1ucyhhLGIpKX0pO3AoImNlbGxzKCkiLGZ1bmN0aW9uKGEsYixjKXtoLmlzUGxhaW5PYmplY3QoYSkmJihhLnJvdz09PWs/KGM9YSxhPW51bGwpOihjPWIsYj1udWxsKSk7aC5pc1BsYWluT2JqZWN0KGIpJiYoYz1iLGI9bnVsbCk7aWYobnVsbD09PWJ8fGI9PT1rKXJldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oYil7dmFyIGQ9YSxlPWFiKGMpLGY9CmIuYW9EYXRhLGc9QmEoYixlKSxqPVNiKGhhKGYsZywiYW5DZWxscyIpKSxpPWgoW10uY29uY2F0LmFwcGx5KFtdLGopKSxsLG49Yi5hb0NvbHVtbnMubGVuZ3RoLG0scCxyLHUsdixzO3JldHVybiAkYSgiY2VsbCIsZCxmdW5jdGlvbihhKXt2YXIgYz10eXBlb2YgYT09PSJmdW5jdGlvbiI7aWYoYT09PW51bGx8fGE9PT1rfHxjKXttPVtdO3A9MDtmb3Iocj1nLmxlbmd0aDtwPHI7cCsrKXtsPWdbcF07Zm9yKHU9MDt1PG47dSsrKXt2PXtyb3c6bCxjb2x1bW46dX07aWYoYyl7cz1mW2xdO2EodixCKGIsbCx1KSxzLmFuQ2VsbHM/cy5hbkNlbGxzW3VdOm51bGwpJiZtLnB1c2godil9ZWxzZSBtLnB1c2godil9fXJldHVybiBtfWlmKGguaXNQbGFpbk9iamVjdChhKSlyZXR1cm5bYV07Yz1pLmZpbHRlcihhKS5tYXAoZnVuY3Rpb24oYSxiKXtyZXR1cm57cm93OmIuX0RUX0NlbGxJbmRleC5yb3csY29sdW1uOmIuX0RUX0NlbGxJbmRleC5jb2x1bW59fSkudG9BcnJheSgpO2lmKGMubGVuZ3RofHwKIWEubm9kZU5hbWUpcmV0dXJuIGM7cz1oKGEpLmNsb3Nlc3QoIipbZGF0YS1kdC1yb3ddIik7cmV0dXJuIHMubGVuZ3RoP1t7cm93OnMuZGF0YSgiZHQtcm93IiksY29sdW1uOnMuZGF0YSgiZHQtY29sdW1uIil9XTpbXX0sYixlKX0pO3ZhciBkPXRoaXMuY29sdW1ucyhiLGMpLGU9dGhpcy5yb3dzKGEsYyksZixnLGosaSxuLGw9dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGEsYil7Zj1bXTtnPTA7Zm9yKGo9ZVtiXS5sZW5ndGg7ZzxqO2crKyl7aT0wO2ZvcihuPWRbYl0ubGVuZ3RoO2k8bjtpKyspZi5wdXNoKHtyb3c6ZVtiXVtnXSxjb2x1bW46ZFtiXVtpXX0pfXJldHVybiBmfSwxKTtoLmV4dGVuZChsLnNlbGVjdG9yLHtjb2xzOmIscm93czphLG9wdHM6Y30pO3JldHVybiBsfSk7cygiY2VsbHMoKS5ub2RlcygpIiwiY2VsbCgpLm5vZGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24oYSxiLGMpe3JldHVybihhPWEuYW9EYXRhW2JdKSYmCmEuYW5DZWxscz9hLmFuQ2VsbHNbY106a30sMSl9KTtwKCJjZWxscygpLmRhdGEoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBCKGEsYixjKX0sMSl9KTtzKCJjZWxscygpLmNhY2hlKCkiLCJjZWxsKCkuY2FjaGUoKSIsZnVuY3Rpb24oYSl7YT0ic2VhcmNoIj09PWE/Il9hRmlsdGVyRGF0YSI6Il9hU29ydERhdGEiO3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGIuYW9EYXRhW2NdW2FdW2RdfSwxKX0pO3MoImNlbGxzKCkucmVuZGVyKCkiLCJjZWxsKCkucmVuZGVyKCkiLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihiLGMsZCl7cmV0dXJuIEIoYixjLGQsYSl9LDEpfSk7cygiY2VsbHMoKS5pbmRleGVzKCkiLCJjZWxsKCkuaW5kZXgoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24oYSwKYixjKXtyZXR1cm57cm93OmIsY29sdW1uOmMsY29sdW1uVmlzaWJsZTokKGEsYyl9fSwxKX0pO3MoImNlbGxzKCkuaW52YWxpZGF0ZSgpIiwiY2VsbCgpLmludmFsaWRhdGUoKSIsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNlbGwiLGZ1bmN0aW9uKGIsYyxkKXtjYShiLGMsYSxkKX0pfSk7cCgiY2VsbCgpIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGJiKHRoaXMuY2VsbHMoYSxiLGMpKX0pO3AoImNlbGwoKS5kYXRhKCkiLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29udGV4dCxjPXRoaXNbMF07aWYoYT09PWspcmV0dXJuIGIubGVuZ3RoJiZjLmxlbmd0aD9CKGJbMF0sY1swXS5yb3csY1swXS5jb2x1bW4pOms7amIoYlswXSxjWzBdLnJvdyxjWzBdLmNvbHVtbixhKTtjYShiWzBdLGNbMF0ucm93LCJkYXRhIixjWzBdLmNvbHVtbik7cmV0dXJuIHRoaXN9KTtwKCJvcmRlcigpIixmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY29udGV4dDtpZihhPT09aylyZXR1cm4gMCE9PQpjLmxlbmd0aD9jWzBdLmFhU29ydGluZzprOyJudW1iZXIiPT09dHlwZW9mIGE/YT1bW2EsYl1dOmEubGVuZ3RoJiYhaC5pc0FycmF5KGFbMF0pJiYoYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGIpe2IuYWFTb3J0aW5nPWEuc2xpY2UoKX0pfSk7cCgib3JkZXIubGlzdGVuZXIoKSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZCl7TWEoZCxhLGIsYyl9KX0pO3AoIm9yZGVyLmZpeGVkKCkiLGZ1bmN0aW9uKGEpe2lmKCFhKXt2YXIgYj10aGlzLmNvbnRleHQsYj1iLmxlbmd0aD9iWzBdLmFhU29ydGluZ0ZpeGVkOms7cmV0dXJuIGguaXNBcnJheShiKT97cHJlOmJ9OmJ9cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihiKXtiLmFhU29ydGluZ0ZpeGVkPWguZXh0ZW5kKCEwLHt9LGEpfSl9KTtwKFsiY29sdW1ucygpLm9yZGVyKCkiLAoiY29sdW1uKCkub3JkZXIoKSJdLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihjLGQpe3ZhciBlPVtdO2guZWFjaChiW2RdLGZ1bmN0aW9uKGIsYyl7ZS5wdXNoKFtjLGFdKX0pO2MuYWFTb3J0aW5nPWV9KX0pO3AoInNlYXJjaCgpIixmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLmNvbnRleHQ7cmV0dXJuIGE9PT1rPzAhPT1lLmxlbmd0aD9lWzBdLm9QcmV2aW91c1NlYXJjaC5zU2VhcmNoOms6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2Uub0ZlYXR1cmVzLmJGaWx0ZXImJmZhKGUsaC5leHRlbmQoe30sZS5vUHJldmlvdXNTZWFyY2gse3NTZWFyY2g6YSsiIixiUmVnZXg6bnVsbD09PWI/ITE6YixiU21hcnQ6bnVsbD09PWM/ITA6YyxiQ2FzZUluc2Vuc2l0aXZlOm51bGw9PT1kPyEwOmR9KSwxKX0pfSk7cygiY29sdW1ucygpLnNlYXJjaCgpIiwiY29sdW1uKCkuc2VhcmNoKCkiLGZ1bmN0aW9uKGEsCmIsYyxkKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihlLGYpe3ZhciBnPWUuYW9QcmVTZWFyY2hDb2xzO2lmKGE9PT1rKXJldHVybiBnW2ZdLnNTZWFyY2g7ZS5vRmVhdHVyZXMuYkZpbHRlciYmKGguZXh0ZW5kKGdbZl0se3NTZWFyY2g6YSsiIixiUmVnZXg6bnVsbD09PWI/ITE6YixiU21hcnQ6bnVsbD09PWM/ITA6YyxiQ2FzZUluc2Vuc2l0aXZlOm51bGw9PT1kPyEwOmR9KSxmYShlLGUub1ByZXZpb3VzU2VhcmNoLDEpKX0pfSk7cCgic3RhdGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZXh0Lmxlbmd0aD90aGlzLmNvbnRleHRbMF0ub1NhdmVkU3RhdGU6bnVsbH0pO3AoInN0YXRlLmNsZWFyKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihhKXthLmZuU3RhdGVTYXZlQ2FsbGJhY2suY2FsbChhLm9JbnN0YW5jZSxhLHt9KX0pfSk7cCgic3RhdGUubG9hZGVkKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dC5sZW5ndGg/CnRoaXMuY29udGV4dFswXS5vTG9hZGVkU3RhdGU6bnVsbH0pO3AoInN0YXRlLnNhdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGEpe3dhKGEpfSl9KTttLnZlcnNpb25DaGVjaz1tLmZuVmVyc2lvbkNoZWNrPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1tLnZlcnNpb24uc3BsaXQoIi4iKSxhPWEuc3BsaXQoIi4iKSxjLGQsZT0wLGY9YS5sZW5ndGg7ZTxmO2UrKylpZihjPXBhcnNlSW50KGJbZV0sMTApfHwwLGQ9cGFyc2VJbnQoYVtlXSwxMCl8fDAsYyE9PWQpcmV0dXJuIGM+ZDtyZXR1cm4hMH07bS5pc0RhdGFUYWJsZT1tLmZuSXNEYXRhVGFibGU9ZnVuY3Rpb24oYSl7dmFyIGI9aChhKS5nZXQoMCksYz0hMTtoLmVhY2gobS5zZXR0aW5ncyxmdW5jdGlvbihhLGUpe3ZhciBmPWUublNjcm9sbEhlYWQ/aCgidGFibGUiLGUublNjcm9sbEhlYWQpWzBdOm51bGwsZz1lLm5TY3JvbGxGb290P2goInRhYmxlIixlLm5TY3JvbGxGb290KVswXToKbnVsbDtpZihlLm5UYWJsZT09PWJ8fGY9PT1ifHxnPT09YiljPSEwfSk7cmV0dXJuIGN9O20udGFibGVzPW0uZm5UYWJsZXM9ZnVuY3Rpb24oYSl7dmFyIGI9ITE7aC5pc1BsYWluT2JqZWN0KGEpJiYoYj1hLmFwaSxhPWEudmlzaWJsZSk7dmFyIGM9aC5tYXAobS5zZXR0aW5ncyxmdW5jdGlvbihiKXtpZighYXx8YSYmaChiLm5UYWJsZSkuaXMoIjp2aXNpYmxlIikpcmV0dXJuIGIublRhYmxlfSk7cmV0dXJuIGI/bmV3IHIoYyk6Y307bS5jYW1lbFRvSHVuZ2FyaWFuPUs7cCgiJCgpIixmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMucm93cyhiKS5ub2RlcygpLGM9aChjKTtyZXR1cm4gaChbXS5jb25jYXQoYy5maWx0ZXIoYSkudG9BcnJheSgpLGMuZmluZChhKS50b0FycmF5KCkpKX0pO2guZWFjaChbIm9uIiwib25lIiwib2ZmIl0sZnVuY3Rpb24oYSxiKXtwKGIrIigpIixmdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7YVswXS5tYXRjaCgvXC5kdFxiLyl8fAooYVswXSs9Ii5kdCIpO3ZhciBkPWgodGhpcy50YWJsZXMoKS5ub2RlcygpKTtkW2JdLmFwcGx5KGQsYSk7cmV0dXJuIHRoaXN9KX0pO3AoImNsZWFyKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihhKXtuYShhKX0pfSk7cCgic2V0dGluZ3MoKSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIodGhpcy5jb250ZXh0LHRoaXMuY29udGV4dCl9KTtwKCJpbml0KCkiLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jb250ZXh0O3JldHVybiBhLmxlbmd0aD9hWzBdLm9Jbml0Om51bGx9KTtwKCJkYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihhKXtyZXR1cm4gRyhhLmFvRGF0YSwiX2FEYXRhIil9KS5mbGF0dGVuKCl9KTtwKCJkZXN0cm95KCkiLGZ1bmN0aW9uKGEpe2E9YXx8ITE7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihiKXt2YXIgYz1iLm5UYWJsZVdyYXBwZXIucGFyZW50Tm9kZSwKZD1iLm9DbGFzc2VzLGU9Yi5uVGFibGUsZj1iLm5UQm9keSxnPWIublRIZWFkLGo9Yi5uVEZvb3QsaT1oKGUpLGY9aChmKSxrPWgoYi5uVGFibGVXcmFwcGVyKSxsPWgubWFwKGIuYW9EYXRhLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5Ucn0pLHA7Yi5iRGVzdHJveWluZz0hMDt1KGIsImFvRGVzdHJveUNhbGxiYWNrIiwiZGVzdHJveSIsW2JdKTthfHwobmV3IHIoYikpLmNvbHVtbnMoKS52aXNpYmxlKCEwKTtrLnVuYmluZCgiLkRUIikuZmluZCgiOm5vdCh0Ym9keSAqKSIpLnVuYmluZCgiLkRUIik7aChEKS51bmJpbmQoIi5EVC0iK2Iuc0luc3RhbmNlKTtlIT1nLnBhcmVudE5vZGUmJihpLmNoaWxkcmVuKCJ0aGVhZCIpLmRldGFjaCgpLGkuYXBwZW5kKGcpKTtqJiZlIT1qLnBhcmVudE5vZGUmJihpLmNoaWxkcmVuKCJ0Zm9vdCIpLmRldGFjaCgpLGkuYXBwZW5kKGopKTtiLmFhU29ydGluZz1bXTtiLmFhU29ydGluZ0ZpeGVkPVtdO3ZhKGIpO2gobCkucmVtb3ZlQ2xhc3MoYi5hc1N0cmlwZUNsYXNzZXMuam9pbigiICIpKTsKaCgidGgsIHRkIixnKS5yZW1vdmVDbGFzcyhkLnNTb3J0YWJsZSsiICIrZC5zU29ydGFibGVBc2MrIiAiK2Quc1NvcnRhYmxlRGVzYysiICIrZC5zU29ydGFibGVOb25lKTtiLmJKVUkmJihoKCJ0aCBzcGFuLiIrZC5zU29ydEljb24rIiwgdGQgc3Bhbi4iK2Quc1NvcnRJY29uLGcpLmRldGFjaCgpLGgoInRoLCB0ZCIsZykuZWFjaChmdW5jdGlvbigpe3ZhciBhPWgoImRpdi4iK2Quc1NvcnRKVUlXcmFwcGVyLHRoaXMpO2godGhpcykuYXBwZW5kKGEuY29udGVudHMoKSk7YS5kZXRhY2goKX0pKTtmLmNoaWxkcmVuKCkuZGV0YWNoKCk7Zi5hcHBlbmQobCk7Zz1hPyJyZW1vdmUiOiJkZXRhY2giO2lbZ10oKTtrW2ddKCk7IWEmJmMmJihjLmluc2VydEJlZm9yZShlLGIublRhYmxlUmVpbnNlcnRCZWZvcmUpLGkuY3NzKCJ3aWR0aCIsYi5zRGVzdHJveVdpZHRoKS5yZW1vdmVDbGFzcyhkLnNUYWJsZSksKHA9Yi5hc0Rlc3Ryb3lTdHJpcGVzLmxlbmd0aCkmJmYuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKGEpe2godGhpcykuYWRkQ2xhc3MoYi5hc0Rlc3Ryb3lTdHJpcGVzW2ElCnBdKX0pKTtjPWguaW5BcnJheShiLG0uc2V0dGluZ3MpOy0xIT09YyYmbS5zZXR0aW5ncy5zcGxpY2UoYywxKX0pfSk7aC5lYWNoKFsiY29sdW1uIiwicm93IiwiY2VsbCJdLGZ1bmN0aW9uKGEsYil7cChiKyJzKCkuZXZlcnkoKSIsZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcy5zZWxlY3Rvci5vcHRzLGU9dGhpcztyZXR1cm4gdGhpcy5pdGVyYXRvcihiLGZ1bmN0aW9uKGYsZyxoLGksbil7YS5jYWxsKGVbYl0oZywiY2VsbCI9PT1iP2g6ZCwiY2VsbCI9PT1iP2Q6ayksZyxoLGksbil9KX0pfSk7cCgiaTE4bigpIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5jb250ZXh0WzBdLGE9UShhKShkLm9MYW5ndWFnZSk7YT09PWsmJihhPWIpO2MhPT1rJiZoLmlzUGxhaW5PYmplY3QoYSkmJihhPWFbY10hPT1rP2FbY106YS5fKTtyZXR1cm4gYS5yZXBsYWNlKCIlZCIsYyl9KTttLnZlcnNpb249IjEuMTAuMTIiO20uc2V0dGluZ3M9W107bS5tb2RlbHM9e307bS5tb2RlbHMub1NlYXJjaD17YkNhc2VJbnNlbnNpdGl2ZTohMCwKc1NlYXJjaDoiIixiUmVnZXg6ITEsYlNtYXJ0OiEwfTttLm1vZGVscy5vUm93PXtuVHI6bnVsbCxhbkNlbGxzOm51bGwsX2FEYXRhOltdLF9hU29ydERhdGE6bnVsbCxfYUZpbHRlckRhdGE6bnVsbCxfc0ZpbHRlclJvdzpudWxsLF9zUm93U3RyaXBlOiIiLHNyYzpudWxsLGlkeDotMX07bS5tb2RlbHMub0NvbHVtbj17aWR4Om51bGwsYURhdGFTb3J0Om51bGwsYXNTb3J0aW5nOm51bGwsYlNlYXJjaGFibGU6bnVsbCxiU29ydGFibGU6bnVsbCxiVmlzaWJsZTpudWxsLF9zTWFudWFsVHlwZTpudWxsLF9iQXR0clNyYzohMSxmbkNyZWF0ZWRDZWxsOm51bGwsZm5HZXREYXRhOm51bGwsZm5TZXREYXRhOm51bGwsbURhdGE6bnVsbCxtUmVuZGVyOm51bGwsblRoOm51bGwsblRmOm51bGwsc0NsYXNzOm51bGwsc0NvbnRlbnRQYWRkaW5nOm51bGwsc0RlZmF1bHRDb250ZW50Om51bGwsc05hbWU6bnVsbCxzU29ydERhdGFUeXBlOiJzdGQiLHNTb3J0aW5nQ2xhc3M6bnVsbCxzU29ydGluZ0NsYXNzSlVJOm51bGwsCnNUaXRsZTpudWxsLHNUeXBlOm51bGwsc1dpZHRoOm51bGwsc1dpZHRoT3JpZzpudWxsfTttLmRlZmF1bHRzPXthYURhdGE6bnVsbCxhYVNvcnRpbmc6W1swLCJhc2MiXV0sYWFTb3J0aW5nRml4ZWQ6W10sYWpheDpudWxsLGFMZW5ndGhNZW51OlsxMCwyNSw1MCwxMDBdLGFvQ29sdW1uczpudWxsLGFvQ29sdW1uRGVmczpudWxsLGFvU2VhcmNoQ29sczpbXSxhc1N0cmlwZUNsYXNzZXM6bnVsbCxiQXV0b1dpZHRoOiEwLGJEZWZlclJlbmRlcjohMSxiRGVzdHJveTohMSxiRmlsdGVyOiEwLGJJbmZvOiEwLGJKUXVlcnlVSTohMSxiTGVuZ3RoQ2hhbmdlOiEwLGJQYWdpbmF0ZTohMCxiUHJvY2Vzc2luZzohMSxiUmV0cmlldmU6ITEsYlNjcm9sbENvbGxhcHNlOiExLGJTZXJ2ZXJTaWRlOiExLGJTb3J0OiEwLGJTb3J0TXVsdGk6ITAsYlNvcnRDZWxsc1RvcDohMSxiU29ydENsYXNzZXM6ITAsYlN0YXRlU2F2ZTohMSxmbkNyZWF0ZWRSb3c6bnVsbCxmbkRyYXdDYWxsYmFjazpudWxsLGZuRm9vdGVyQ2FsbGJhY2s6bnVsbCwKZm5Gb3JtYXROdW1iZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudG9TdHJpbmcoKS5yZXBsYWNlKC9cQig/PShcZHszfSkrKD8hXGQpKS9nLHRoaXMub0xhbmd1YWdlLnNUaG91c2FuZHMpfSxmbkhlYWRlckNhbGxiYWNrOm51bGwsZm5JbmZvQ2FsbGJhY2s6bnVsbCxmbkluaXRDb21wbGV0ZTpudWxsLGZuUHJlRHJhd0NhbGxiYWNrOm51bGwsZm5Sb3dDYWxsYmFjazpudWxsLGZuU2VydmVyRGF0YTpudWxsLGZuU2VydmVyUGFyYW1zOm51bGwsZm5TdGF0ZUxvYWRDYWxsYmFjazpmdW5jdGlvbihhKXt0cnl7cmV0dXJuIEpTT04ucGFyc2UoKC0xPT09YS5pU3RhdGVEdXJhdGlvbj9zZXNzaW9uU3RvcmFnZTpsb2NhbFN0b3JhZ2UpLmdldEl0ZW0oIkRhdGFUYWJsZXNfIithLnNJbnN0YW5jZSsiXyIrbG9jYXRpb24ucGF0aG5hbWUpKX1jYXRjaChiKXt9fSxmblN0YXRlTG9hZFBhcmFtczpudWxsLGZuU3RhdGVMb2FkZWQ6bnVsbCxmblN0YXRlU2F2ZUNhbGxiYWNrOmZ1bmN0aW9uKGEsYil7dHJ5eygtMT09PQphLmlTdGF0ZUR1cmF0aW9uP3Nlc3Npb25TdG9yYWdlOmxvY2FsU3RvcmFnZSkuc2V0SXRlbSgiRGF0YVRhYmxlc18iK2Euc0luc3RhbmNlKyJfIitsb2NhdGlvbi5wYXRobmFtZSxKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYyl7fX0sZm5TdGF0ZVNhdmVQYXJhbXM6bnVsbCxpU3RhdGVEdXJhdGlvbjo3MjAwLGlEZWZlckxvYWRpbmc6bnVsbCxpRGlzcGxheUxlbmd0aDoxMCxpRGlzcGxheVN0YXJ0OjAsaVRhYkluZGV4OjAsb0NsYXNzZXM6e30sb0xhbmd1YWdlOntvQXJpYTp7c1NvcnRBc2NlbmRpbmc6IjogYWN0aXZhdGUgdG8gc29ydCBjb2x1bW4gYXNjZW5kaW5nIixzU29ydERlc2NlbmRpbmc6IjogYWN0aXZhdGUgdG8gc29ydCBjb2x1bW4gZGVzY2VuZGluZyJ9LG9QYWdpbmF0ZTp7c0ZpcnN0OiJGaXJzdCIsc0xhc3Q6Ikxhc3QiLHNOZXh0OiJOZXh0IixzUHJldmlvdXM6IlByZXZpb3VzIn0sc0VtcHR5VGFibGU6Ik5vIGRhdGEgYXZhaWxhYmxlIGluIHRhYmxlIixzSW5mbzoiU2hvd2luZyBfU1RBUlRfIHRvIF9FTkRfIG9mIF9UT1RBTF8gZW50cmllcyIsCnNJbmZvRW1wdHk6IlNob3dpbmcgMCB0byAwIG9mIDAgZW50cmllcyIsc0luZm9GaWx0ZXJlZDoiKGZpbHRlcmVkIGZyb20gX01BWF8gdG90YWwgZW50cmllcykiLHNJbmZvUG9zdEZpeDoiIixzRGVjaW1hbDoiIixzVGhvdXNhbmRzOiIsIixzTGVuZ3RoTWVudToiU2hvdyBfTUVOVV8gZW50cmllcyIsc0xvYWRpbmdSZWNvcmRzOiJMb2FkaW5nLi4uIixzUHJvY2Vzc2luZzoiUHJvY2Vzc2luZy4uLiIsc1NlYXJjaDoiU2VhcmNoOiIsc1NlYXJjaFBsYWNlaG9sZGVyOiIiLHNVcmw6IiIsc1plcm9SZWNvcmRzOiJObyBtYXRjaGluZyByZWNvcmRzIGZvdW5kIn0sb1NlYXJjaDpoLmV4dGVuZCh7fSxtLm1vZGVscy5vU2VhcmNoKSxzQWpheERhdGFQcm9wOiJkYXRhIixzQWpheFNvdXJjZTpudWxsLHNEb206ImxmcnRpcCIsc2VhcmNoRGVsYXk6bnVsbCxzUGFnaW5hdGlvblR5cGU6InNpbXBsZV9udW1iZXJzIixzU2Nyb2xsWDoiIixzU2Nyb2xsWElubmVyOiIiLHNTY3JvbGxZOiIiLHNTZXJ2ZXJNZXRob2Q6IkdFVCIsCnJlbmRlcmVyOm51bGwscm93SWQ6IkRUX1Jvd0lkIn07WChtLmRlZmF1bHRzKTttLmRlZmF1bHRzLmNvbHVtbj17YURhdGFTb3J0Om51bGwsaURhdGFTb3J0Oi0xLGFzU29ydGluZzpbImFzYyIsImRlc2MiXSxiU2VhcmNoYWJsZTohMCxiU29ydGFibGU6ITAsYlZpc2libGU6ITAsZm5DcmVhdGVkQ2VsbDpudWxsLG1EYXRhOm51bGwsbVJlbmRlcjpudWxsLHNDZWxsVHlwZToidGQiLHNDbGFzczoiIixzQ29udGVudFBhZGRpbmc6IiIsc0RlZmF1bHRDb250ZW50Om51bGwsc05hbWU6IiIsc1NvcnREYXRhVHlwZToic3RkIixzVGl0bGU6bnVsbCxzVHlwZTpudWxsLHNXaWR0aDpudWxsfTtYKG0uZGVmYXVsdHMuY29sdW1uKTttLm1vZGVscy5vU2V0dGluZ3M9e29GZWF0dXJlczp7YkF1dG9XaWR0aDpudWxsLGJEZWZlclJlbmRlcjpudWxsLGJGaWx0ZXI6bnVsbCxiSW5mbzpudWxsLGJMZW5ndGhDaGFuZ2U6bnVsbCxiUGFnaW5hdGU6bnVsbCxiUHJvY2Vzc2luZzpudWxsLGJTZXJ2ZXJTaWRlOm51bGwsCmJTb3J0Om51bGwsYlNvcnRNdWx0aTpudWxsLGJTb3J0Q2xhc3NlczpudWxsLGJTdGF0ZVNhdmU6bnVsbH0sb1Njcm9sbDp7YkNvbGxhcHNlOm51bGwsaUJhcldpZHRoOjAsc1g6bnVsbCxzWElubmVyOm51bGwsc1k6bnVsbH0sb0xhbmd1YWdlOntmbkluZm9DYWxsYmFjazpudWxsfSxvQnJvd3Nlcjp7YlNjcm9sbE92ZXJzaXplOiExLGJTY3JvbGxiYXJMZWZ0OiExLGJCb3VuZGluZzohMSxiYXJXaWR0aDowfSxhamF4Om51bGwsYWFuRmVhdHVyZXM6W10sYW9EYXRhOltdLGFpRGlzcGxheTpbXSxhaURpc3BsYXlNYXN0ZXI6W10sYUlkczp7fSxhb0NvbHVtbnM6W10sYW9IZWFkZXI6W10sYW9Gb290ZXI6W10sb1ByZXZpb3VzU2VhcmNoOnt9LGFvUHJlU2VhcmNoQ29sczpbXSxhYVNvcnRpbmc6bnVsbCxhYVNvcnRpbmdGaXhlZDpbXSxhc1N0cmlwZUNsYXNzZXM6bnVsbCxhc0Rlc3Ryb3lTdHJpcGVzOltdLHNEZXN0cm95V2lkdGg6MCxhb1Jvd0NhbGxiYWNrOltdLGFvSGVhZGVyQ2FsbGJhY2s6W10sCmFvRm9vdGVyQ2FsbGJhY2s6W10sYW9EcmF3Q2FsbGJhY2s6W10sYW9Sb3dDcmVhdGVkQ2FsbGJhY2s6W10sYW9QcmVEcmF3Q2FsbGJhY2s6W10sYW9Jbml0Q29tcGxldGU6W10sYW9TdGF0ZVNhdmVQYXJhbXM6W10sYW9TdGF0ZUxvYWRQYXJhbXM6W10sYW9TdGF0ZUxvYWRlZDpbXSxzVGFibGVJZDoiIixuVGFibGU6bnVsbCxuVEhlYWQ6bnVsbCxuVEZvb3Q6bnVsbCxuVEJvZHk6bnVsbCxuVGFibGVXcmFwcGVyOm51bGwsYkRlZmVyTG9hZGluZzohMSxiSW5pdGlhbGlzZWQ6ITEsYW9PcGVuUm93czpbXSxzRG9tOm51bGwsc2VhcmNoRGVsYXk6bnVsbCxzUGFnaW5hdGlvblR5cGU6InR3b19idXR0b24iLGlTdGF0ZUR1cmF0aW9uOjAsYW9TdGF0ZVNhdmU6W10sYW9TdGF0ZUxvYWQ6W10sb1NhdmVkU3RhdGU6bnVsbCxvTG9hZGVkU3RhdGU6bnVsbCxzQWpheFNvdXJjZTpudWxsLHNBamF4RGF0YVByb3A6bnVsbCxiQWpheERhdGFHZXQ6ITAsanFYSFI6bnVsbCxqc29uOmssb0FqYXhEYXRhOmssCmZuU2VydmVyRGF0YTpudWxsLGFvU2VydmVyUGFyYW1zOltdLHNTZXJ2ZXJNZXRob2Q6bnVsbCxmbkZvcm1hdE51bWJlcjpudWxsLGFMZW5ndGhNZW51Om51bGwsaURyYXc6MCxiRHJhd2luZzohMSxpRHJhd0Vycm9yOi0xLF9pRGlzcGxheUxlbmd0aDoxMCxfaURpc3BsYXlTdGFydDowLF9pUmVjb3Jkc1RvdGFsOjAsX2lSZWNvcmRzRGlzcGxheTowLGJKVUk6bnVsbCxvQ2xhc3Nlczp7fSxiRmlsdGVyZWQ6ITEsYlNvcnRlZDohMSxiU29ydENlbGxzVG9wOm51bGwsb0luaXQ6bnVsbCxhb0Rlc3Ryb3lDYWxsYmFjazpbXSxmblJlY29yZHNUb3RhbDpmdW5jdGlvbigpe3JldHVybiJzc3AiPT15KHRoaXMpPzEqdGhpcy5faVJlY29yZHNUb3RhbDp0aGlzLmFpRGlzcGxheU1hc3Rlci5sZW5ndGh9LGZuUmVjb3Jkc0Rpc3BsYXk6ZnVuY3Rpb24oKXtyZXR1cm4ic3NwIj09eSh0aGlzKT8xKnRoaXMuX2lSZWNvcmRzRGlzcGxheTp0aGlzLmFpRGlzcGxheS5sZW5ndGh9LGZuRGlzcGxheUVuZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLl9pRGlzcGxheUxlbmd0aCxiPXRoaXMuX2lEaXNwbGF5U3RhcnQsYz1iK2EsZD10aGlzLmFpRGlzcGxheS5sZW5ndGgsZT10aGlzLm9GZWF0dXJlcyxmPWUuYlBhZ2luYXRlO3JldHVybiBlLmJTZXJ2ZXJTaWRlPyExPT09Znx8LTE9PT1hP2IrZDpNYXRoLm1pbihiK2EsdGhpcy5faVJlY29yZHNEaXNwbGF5KTohZnx8Yz5kfHwtMT09PWE/ZDpjfSxvSW5zdGFuY2U6bnVsbCxzSW5zdGFuY2U6bnVsbCxpVGFiSW5kZXg6MCxuU2Nyb2xsSGVhZDpudWxsLG5TY3JvbGxGb290Om51bGwsYUxhc3RTb3J0OltdLG9QbHVnaW5zOnt9LHJvd0lkRm46bnVsbCxyb3dJZDpudWxsfTttLmV4dD12PXtidXR0b25zOnt9LGNsYXNzZXM6e30sYnVpbGRlcjoiLXNvdXJjZS0iLGVyck1vZGU6ImFsZXJ0IixmZWF0dXJlOltdLHNlYXJjaDpbXSxzZWxlY3Rvcjp7Y2VsbDpbXSxjb2x1bW46W10scm93OltdfSxpbnRlcm5hbDp7fSxsZWdhY3k6e2FqYXg6bnVsbH0scGFnZXI6e30scmVuZGVyZXI6e3BhZ2VCdXR0b246e30sCmhlYWRlcjp7fX0sb3JkZXI6e30sdHlwZTp7ZGV0ZWN0OltdLHNlYXJjaDp7fSxvcmRlcjp7fX0sX3VuaXF1ZTowLGZuVmVyc2lvbkNoZWNrOm0uZm5WZXJzaW9uQ2hlY2ssaUFwaUluZGV4OjAsb0pVSUNsYXNzZXM6e30sc1ZlcnNpb246bS52ZXJzaW9ufTtoLmV4dGVuZCh2LHthZm5GaWx0ZXJpbmc6di5zZWFyY2gsYVR5cGVzOnYudHlwZS5kZXRlY3Qsb2ZuU2VhcmNoOnYudHlwZS5zZWFyY2gsb1NvcnQ6di50eXBlLm9yZGVyLGFmblNvcnREYXRhOnYub3JkZXIsYW9GZWF0dXJlczp2LmZlYXR1cmUsb0FwaTp2LmludGVybmFsLG9TdGRDbGFzc2VzOnYuY2xhc3NlcyxvUGFnaW5hdGlvbjp2LnBhZ2VyfSk7aC5leHRlbmQobS5leHQuY2xhc3Nlcyx7c1RhYmxlOiJkYXRhVGFibGUiLHNOb0Zvb3Rlcjoibm8tZm9vdGVyIixzUGFnZUJ1dHRvbjoicGFnaW5hdGVfYnV0dG9uIixzUGFnZUJ1dHRvbkFjdGl2ZToiY3VycmVudCIsc1BhZ2VCdXR0b25EaXNhYmxlZDoiZGlzYWJsZWQiLHNTdHJpcGVPZGQ6Im9kZCIsCnNTdHJpcGVFdmVuOiJldmVuIixzUm93RW1wdHk6ImRhdGFUYWJsZXNfZW1wdHkiLHNXcmFwcGVyOiJkYXRhVGFibGVzX3dyYXBwZXIiLHNGaWx0ZXI6ImRhdGFUYWJsZXNfZmlsdGVyIixzSW5mbzoiZGF0YVRhYmxlc19pbmZvIixzUGFnaW5nOiJkYXRhVGFibGVzX3BhZ2luYXRlIHBhZ2luZ18iLHNMZW5ndGg6ImRhdGFUYWJsZXNfbGVuZ3RoIixzUHJvY2Vzc2luZzoiZGF0YVRhYmxlc19wcm9jZXNzaW5nIixzU29ydEFzYzoic29ydGluZ19hc2MiLHNTb3J0RGVzYzoic29ydGluZ19kZXNjIixzU29ydGFibGU6InNvcnRpbmciLHNTb3J0YWJsZUFzYzoic29ydGluZ19hc2NfZGlzYWJsZWQiLHNTb3J0YWJsZURlc2M6InNvcnRpbmdfZGVzY19kaXNhYmxlZCIsc1NvcnRhYmxlTm9uZToic29ydGluZ19kaXNhYmxlZCIsc1NvcnRDb2x1bW46InNvcnRpbmdfIixzRmlsdGVySW5wdXQ6IiIsc0xlbmd0aFNlbGVjdDoiIixzU2Nyb2xsV3JhcHBlcjoiZGF0YVRhYmxlc19zY3JvbGwiLHNTY3JvbGxIZWFkOiJkYXRhVGFibGVzX3Njcm9sbEhlYWQiLApzU2Nyb2xsSGVhZElubmVyOiJkYXRhVGFibGVzX3Njcm9sbEhlYWRJbm5lciIsc1Njcm9sbEJvZHk6ImRhdGFUYWJsZXNfc2Nyb2xsQm9keSIsc1Njcm9sbEZvb3Q6ImRhdGFUYWJsZXNfc2Nyb2xsRm9vdCIsc1Njcm9sbEZvb3RJbm5lcjoiZGF0YVRhYmxlc19zY3JvbGxGb290SW5uZXIiLHNIZWFkZXJUSDoiIixzRm9vdGVyVEg6IiIsc1NvcnRKVUlBc2M6IiIsc1NvcnRKVUlEZXNjOiIiLHNTb3J0SlVJOiIiLHNTb3J0SlVJQXNjQWxsb3dlZDoiIixzU29ydEpVSURlc2NBbGxvd2VkOiIiLHNTb3J0SlVJV3JhcHBlcjoiIixzU29ydEljb246IiIsc0pVSUhlYWRlcjoiIixzSlVJRm9vdGVyOiIifSk7dmFyIENhPSIiLENhPSIiLEg9Q2ErInVpLXN0YXRlLWRlZmF1bHQiLGlhPUNhKyJjc3NfcmlnaHQgdWktaWNvbiB1aS1pY29uLSIsWGI9Q2ErImZnLXRvb2xiYXIgdWktdG9vbGJhciB1aS13aWRnZXQtaGVhZGVyIHVpLWhlbHBlci1jbGVhcmZpeCI7aC5leHRlbmQobS5leHQub0pVSUNsYXNzZXMsCm0uZXh0LmNsYXNzZXMse3NQYWdlQnV0dG9uOiJmZy1idXR0b24gdWktYnV0dG9uICIrSCxzUGFnZUJ1dHRvbkFjdGl2ZToidWktc3RhdGUtZGlzYWJsZWQiLHNQYWdlQnV0dG9uRGlzYWJsZWQ6InVpLXN0YXRlLWRpc2FibGVkIixzUGFnaW5nOiJkYXRhVGFibGVzX3BhZ2luYXRlIGZnLWJ1dHRvbnNldCB1aS1idXR0b25zZXQgZmctYnV0dG9uc2V0LW11bHRpIHVpLWJ1dHRvbnNldC1tdWx0aSBwYWdpbmdfIixzU29ydEFzYzpIKyIgc29ydGluZ19hc2MiLHNTb3J0RGVzYzpIKyIgc29ydGluZ19kZXNjIixzU29ydGFibGU6SCsiIHNvcnRpbmciLHNTb3J0YWJsZUFzYzpIKyIgc29ydGluZ19hc2NfZGlzYWJsZWQiLHNTb3J0YWJsZURlc2M6SCsiIHNvcnRpbmdfZGVzY19kaXNhYmxlZCIsc1NvcnRhYmxlTm9uZTpIKyIgc29ydGluZ19kaXNhYmxlZCIsc1NvcnRKVUlBc2M6aWErInRyaWFuZ2xlLTEtbiIsc1NvcnRKVUlEZXNjOmlhKyJ0cmlhbmdsZS0xLXMiLHNTb3J0SlVJOmlhKyJjYXJhdC0yLW4tcyIsCnNTb3J0SlVJQXNjQWxsb3dlZDppYSsiY2FyYXQtMS1uIixzU29ydEpVSURlc2NBbGxvd2VkOmlhKyJjYXJhdC0xLXMiLHNTb3J0SlVJV3JhcHBlcjoiRGF0YVRhYmxlc19zb3J0X3dyYXBwZXIiLHNTb3J0SWNvbjoiRGF0YVRhYmxlc19zb3J0X2ljb24iLHNTY3JvbGxIZWFkOiJkYXRhVGFibGVzX3Njcm9sbEhlYWQgIitILHNTY3JvbGxGb290OiJkYXRhVGFibGVzX3Njcm9sbEZvb3QgIitILHNIZWFkZXJUSDpILHNGb290ZXJUSDpILHNKVUlIZWFkZXI6WGIrIiB1aS1jb3JuZXItdGwgdWktY29ybmVyLXRyIixzSlVJRm9vdGVyOlhiKyIgdWktY29ybmVyLWJsIHVpLWNvcm5lci1iciJ9KTt2YXIgTWI9bS5leHQucGFnZXI7aC5leHRlbmQoTWIse3NpbXBsZTpmdW5jdGlvbigpe3JldHVyblsicHJldmlvdXMiLCJuZXh0Il19LGZ1bGw6ZnVuY3Rpb24oKXtyZXR1cm5bImZpcnN0IiwicHJldmlvdXMiLCJuZXh0IiwibGFzdCJdfSxudW1iZXJzOmZ1bmN0aW9uKGEsYil7cmV0dXJuW3lhKGEsCmIpXX0sc2ltcGxlX251bWJlcnM6ZnVuY3Rpb24oYSxiKXtyZXR1cm5bInByZXZpb3VzIix5YShhLGIpLCJuZXh0Il19LGZ1bGxfbnVtYmVyczpmdW5jdGlvbihhLGIpe3JldHVyblsiZmlyc3QiLCJwcmV2aW91cyIseWEoYSxiKSwibmV4dCIsImxhc3QiXX0sX251bWJlcnM6eWEsbnVtYmVyc19sZW5ndGg6N30pO2guZXh0ZW5kKCEwLG0uZXh0LnJlbmRlcmVyLHtwYWdlQnV0dG9uOntfOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1hLm9DbGFzc2VzLGo9YS5vTGFuZ3VhZ2Uub1BhZ2luYXRlLGk9YS5vTGFuZ3VhZ2Uub0FyaWEucGFnaW5hdGV8fHt9LGssbCxtPTAscD1mdW5jdGlvbihiLGQpe3ZhciBvLHIsdSxzLHY9ZnVuY3Rpb24oYil7VGEoYSxiLmRhdGEuYWN0aW9uLHRydWUpfTtvPTA7Zm9yKHI9ZC5sZW5ndGg7bzxyO28rKyl7cz1kW29dO2lmKGguaXNBcnJheShzKSl7dT1oKCI8Iisocy5EVF9lbHx8ImRpdiIpKyIvPiIpLmFwcGVuZFRvKGIpO3AodSxzKX1lbHNle2s9bnVsbDsKbD0iIjtzd2l0Y2gocyl7Y2FzZSAiZWxsaXBzaXMiOmIuYXBwZW5kKCc8c3BhbiBjbGFzcz0iZWxsaXBzaXMiPiYjeDIwMjY7PC9zcGFuPicpO2JyZWFrO2Nhc2UgImZpcnN0IjprPWouc0ZpcnN0O2w9cysoZT4wPyIiOiIgIitnLnNQYWdlQnV0dG9uRGlzYWJsZWQpO2JyZWFrO2Nhc2UgInByZXZpb3VzIjprPWouc1ByZXZpb3VzO2w9cysoZT4wPyIiOiIgIitnLnNQYWdlQnV0dG9uRGlzYWJsZWQpO2JyZWFrO2Nhc2UgIm5leHQiOms9ai5zTmV4dDtsPXMrKGU8Zi0xPyIiOiIgIitnLnNQYWdlQnV0dG9uRGlzYWJsZWQpO2JyZWFrO2Nhc2UgImxhc3QiOms9ai5zTGFzdDtsPXMrKGU8Zi0xPyIiOiIgIitnLnNQYWdlQnV0dG9uRGlzYWJsZWQpO2JyZWFrO2RlZmF1bHQ6az1zKzE7bD1lPT09cz9nLnNQYWdlQnV0dG9uQWN0aXZlOiIifWlmKGshPT1udWxsKXt1PWgoIjxhPiIseyJjbGFzcyI6Zy5zUGFnZUJ1dHRvbisiICIrbCwiYXJpYS1jb250cm9scyI6YS5zVGFibGVJZCwiYXJpYS1sYWJlbCI6aVtzXSwKImRhdGEtZHQtaWR4IjptLHRhYmluZGV4OmEuaVRhYkluZGV4LGlkOmM9PT0wJiZ0eXBlb2Ygcz09PSJzdHJpbmciP2Euc1RhYmxlSWQrIl8iK3M6bnVsbH0pLmh0bWwoaykuYXBwZW5kVG8oYik7V2EodSx7YWN0aW9uOnN9LHYpO20rK319fX0scjt0cnl7cj1oKGIpLmZpbmQoSS5hY3RpdmVFbGVtZW50KS5kYXRhKCJkdC1pZHgiKX1jYXRjaChvKXt9cChoKGIpLmVtcHR5KCksZCk7ciYmaChiKS5maW5kKCJbZGF0YS1kdC1pZHg9IityKyJdIikuZm9jdXMoKX19fSk7aC5leHRlbmQobS5leHQudHlwZS5kZXRlY3QsW2Z1bmN0aW9uKGEsYil7dmFyIGM9Yi5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIFphKGEsYyk/Im51bSIrYzpudWxsfSxmdW5jdGlvbihhKXtpZihhJiYhKGEgaW5zdGFuY2VvZiBEYXRlKSYmKCFhYy50ZXN0KGEpfHwhYmMudGVzdChhKSkpcmV0dXJuIG51bGw7dmFyIGI9RGF0ZS5wYXJzZShhKTtyZXR1cm4gbnVsbCE9PWImJiFpc05hTihiKXx8TShhKT8iZGF0ZSI6Cm51bGx9LGZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIFphKGEsYywhMCk/Im51bS1mbXQiK2M6bnVsbH0sZnVuY3Rpb24oYSxiKXt2YXIgYz1iLm9MYW5ndWFnZS5zRGVjaW1hbDtyZXR1cm4gUmIoYSxjKT8iaHRtbC1udW0iK2M6bnVsbH0sZnVuY3Rpb24oYSxiKXt2YXIgYz1iLm9MYW5ndWFnZS5zRGVjaW1hbDtyZXR1cm4gUmIoYSxjLCEwKT8iaHRtbC1udW0tZm10IitjOm51bGx9LGZ1bmN0aW9uKGEpe3JldHVybiBNKGEpfHwic3RyaW5nIj09PXR5cGVvZiBhJiYtMSE9PWEuaW5kZXhPZigiPCIpPyJodG1sIjpudWxsfV0pO2guZXh0ZW5kKG0uZXh0LnR5cGUuc2VhcmNoLHtodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBNKGEpP2E6InN0cmluZyI9PT10eXBlb2YgYT9hLnJlcGxhY2UoT2IsIiAiKS5yZXBsYWNlKEFhLCIiKToiIn0sc3RyaW5nOmZ1bmN0aW9uKGEpe3JldHVybiBNKGEpP2E6InN0cmluZyI9PT10eXBlb2YgYT9hLnJlcGxhY2UoT2IsCiIgIik6YX19KTt2YXIgemE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoMCE9PWEmJighYXx8Ii0iPT09YSkpcmV0dXJuLUluZmluaXR5O2ImJihhPVFiKGEsYikpO2EucmVwbGFjZSYmKGMmJihhPWEucmVwbGFjZShjLCIiKSksZCYmKGE9YS5yZXBsYWNlKGQsIiIpKSk7cmV0dXJuIDEqYX07aC5leHRlbmQodi50eXBlLm9yZGVyLHsiZGF0ZS1wcmUiOmZ1bmN0aW9uKGEpe3JldHVybiBEYXRlLnBhcnNlKGEpfHwwfSwiaHRtbC1wcmUiOmZ1bmN0aW9uKGEpe3JldHVybiBNKGEpPyIiOmEucmVwbGFjZT9hLnJlcGxhY2UoLzwuKj8+L2csIiIpLnRvTG93ZXJDYXNlKCk6YSsiIn0sInN0cmluZy1wcmUiOmZ1bmN0aW9uKGEpe3JldHVybiBNKGEpPyIiOiJzdHJpbmciPT09dHlwZW9mIGE/YS50b0xvd2VyQ2FzZSgpOiFhLnRvU3RyaW5nPyIiOmEudG9TdHJpbmcoKX0sInN0cmluZy1hc2MiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfSwic3RyaW5nLWRlc2MiOmZ1bmN0aW9uKGEsCmIpe3JldHVybiBhPGI/MTphPmI/LTE6MH19KTtkYigiIik7aC5leHRlbmQoITAsbS5leHQucmVuZGVyZXIse2hlYWRlcjp7XzpmdW5jdGlvbihhLGIsYyxkKXtoKGEublRhYmxlKS5vbigib3JkZXIuZHQuRFQiLGZ1bmN0aW9uKGUsZixnLGgpe2lmKGE9PT1mKXtlPWMuaWR4O2IucmVtb3ZlQ2xhc3MoYy5zU29ydGluZ0NsYXNzKyIgIitkLnNTb3J0QXNjKyIgIitkLnNTb3J0RGVzYykuYWRkQ2xhc3MoaFtlXT09ImFzYyI/ZC5zU29ydEFzYzpoW2VdPT0iZGVzYyI/ZC5zU29ydERlc2M6Yy5zU29ydGluZ0NsYXNzKX19KX0sanF1ZXJ5dWk6ZnVuY3Rpb24oYSxiLGMsZCl7aCgiPGRpdi8+IikuYWRkQ2xhc3MoZC5zU29ydEpVSVdyYXBwZXIpLmFwcGVuZChiLmNvbnRlbnRzKCkpLmFwcGVuZChoKCI8c3Bhbi8+IikuYWRkQ2xhc3MoZC5zU29ydEljb24rIiAiK2Muc1NvcnRpbmdDbGFzc0pVSSkpLmFwcGVuZFRvKGIpO2goYS5uVGFibGUpLm9uKCJvcmRlci5kdC5EVCIsZnVuY3Rpb24oZSwKZixnLGgpe2lmKGE9PT1mKXtlPWMuaWR4O2IucmVtb3ZlQ2xhc3MoZC5zU29ydEFzYysiICIrZC5zU29ydERlc2MpLmFkZENsYXNzKGhbZV09PSJhc2MiP2Quc1NvcnRBc2M6aFtlXT09ImRlc2MiP2Quc1NvcnREZXNjOmMuc1NvcnRpbmdDbGFzcyk7Yi5maW5kKCJzcGFuLiIrZC5zU29ydEljb24pLnJlbW92ZUNsYXNzKGQuc1NvcnRKVUlBc2MrIiAiK2Quc1NvcnRKVUlEZXNjKyIgIitkLnNTb3J0SlVJKyIgIitkLnNTb3J0SlVJQXNjQWxsb3dlZCsiICIrZC5zU29ydEpVSURlc2NBbGxvd2VkKS5hZGRDbGFzcyhoW2VdPT0iYXNjIj9kLnNTb3J0SlVJQXNjOmhbZV09PSJkZXNjIj9kLnNTb3J0SlVJRGVzYzpjLnNTb3J0aW5nQ2xhc3NKVUkpfX0pfX19KTt2YXIgWWI9ZnVuY3Rpb24oYSl7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgYT9hLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iik6YX07bS5yZW5kZXI9e251bWJlcjpmdW5jdGlvbihhLApiLGMsZCxlKXtyZXR1cm57ZGlzcGxheTpmdW5jdGlvbihmKXtpZigibnVtYmVyIiE9PXR5cGVvZiBmJiYic3RyaW5nIiE9PXR5cGVvZiBmKXJldHVybiBmO3ZhciBnPTA+Zj8iLSI6IiIsaD1wYXJzZUZsb2F0KGYpO2lmKGlzTmFOKGgpKXJldHVybiBZYihmKTtmPU1hdGguYWJzKGgpO2g9cGFyc2VJbnQoZiwxMCk7Zj1jP2IrKGYtaCkudG9GaXhlZChjKS5zdWJzdHJpbmcoMik6IiI7cmV0dXJuIGcrKGR8fCIiKStoLnRvU3RyaW5nKCkucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZyxhKStmKyhlfHwiIil9fX0sdGV4dDpmdW5jdGlvbigpe3JldHVybntkaXNwbGF5OllifX19O2guZXh0ZW5kKG0uZXh0LmludGVybmFsLHtfZm5FeHRlcm5BcGlGdW5jOk5iLF9mbkJ1aWxkQWpheDpyYSxfZm5BamF4VXBkYXRlOmxiLF9mbkFqYXhQYXJhbWV0ZXJzOnViLF9mbkFqYXhVcGRhdGVEcmF3OnZiLF9mbkFqYXhEYXRhU3JjOnNhLF9mbkFkZENvbHVtbjpFYSxfZm5Db2x1bW5PcHRpb25zOmphLApfZm5BZGp1c3RDb2x1bW5TaXppbmc6WSxfZm5WaXNpYmxlVG9Db2x1bW5JbmRleDpaLF9mbkNvbHVtbkluZGV4VG9WaXNpYmxlOiQsX2ZuVmlzYmxlQ29sdW1uczphYSxfZm5HZXRDb2x1bW5zOmxhLF9mbkNvbHVtblR5cGVzOkdhLF9mbkFwcGx5Q29sdW1uRGVmczppYixfZm5IdW5nYXJpYW5NYXA6WCxfZm5DYW1lbFRvSHVuZ2FyaWFuOkssX2ZuTGFuZ3VhZ2VDb21wYXQ6RGEsX2ZuQnJvd3NlckRldGVjdDpnYixfZm5BZGREYXRhOk4sX2ZuQWRkVHI6bWEsX2ZuTm9kZVRvRGF0YUluZGV4OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuX0RUX1Jvd0luZGV4IT09az9iLl9EVF9Sb3dJbmRleDpudWxsfSxfZm5Ob2RlVG9Db2x1bW5JbmRleDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGguaW5BcnJheShjLGEuYW9EYXRhW2JdLmFuQ2VsbHMpfSxfZm5HZXRDZWxsRGF0YTpCLF9mblNldENlbGxEYXRhOmpiLF9mblNwbGl0T2JqTm90YXRpb246SmEsX2ZuR2V0T2JqZWN0RGF0YUZuOlEsX2ZuU2V0T2JqZWN0RGF0YUZuOlIsCl9mbkdldERhdGFNYXN0ZXI6S2EsX2ZuQ2xlYXJUYWJsZTpuYSxfZm5EZWxldGVJbmRleDpvYSxfZm5JbnZhbGlkYXRlOmNhLF9mbkdldFJvd0VsZW1lbnRzOklhLF9mbkNyZWF0ZVRyOkhhLF9mbkJ1aWxkSGVhZDprYixfZm5EcmF3SGVhZDplYSxfZm5EcmF3Ok8sX2ZuUmVEcmF3OlQsX2ZuQWRkT3B0aW9uc0h0bWw6bmIsX2ZuRGV0ZWN0SGVhZGVyOmRhLF9mbkdldFVuaXF1ZVRoczpxYSxfZm5GZWF0dXJlSHRtbEZpbHRlcjpwYixfZm5GaWx0ZXJDb21wbGV0ZTpmYSxfZm5GaWx0ZXJDdXN0b206eWIsX2ZuRmlsdGVyQ29sdW1uOnhiLF9mbkZpbHRlcjp3YixfZm5GaWx0ZXJDcmVhdGVTZWFyY2g6UGEsX2ZuRXNjYXBlUmVnZXg6UWEsX2ZuRmlsdGVyRGF0YTp6YixfZm5GZWF0dXJlSHRtbEluZm86c2IsX2ZuVXBkYXRlSW5mbzpDYixfZm5JbmZvTWFjcm9zOkRiLF9mbkluaXRpYWxpc2U6Z2EsX2ZuSW5pdENvbXBsZXRlOnRhLF9mbkxlbmd0aENoYW5nZTpSYSxfZm5GZWF0dXJlSHRtbExlbmd0aDpvYiwKX2ZuRmVhdHVyZUh0bWxQYWdpbmF0ZTp0YixfZm5QYWdlQ2hhbmdlOlRhLF9mbkZlYXR1cmVIdG1sUHJvY2Vzc2luZzpxYixfZm5Qcm9jZXNzaW5nRGlzcGxheTpDLF9mbkZlYXR1cmVIdG1sVGFibGU6cmIsX2ZuU2Nyb2xsRHJhdzprYSxfZm5BcHBseVRvQ2hpbGRyZW46SixfZm5DYWxjdWxhdGVDb2x1bW5XaWR0aHM6RmEsX2ZuVGhyb3R0bGU6T2EsX2ZuQ29udmVydFRvV2lkdGg6RmIsX2ZuR2V0V2lkZXN0Tm9kZTpHYixfZm5HZXRNYXhMZW5TdHJpbmc6SGIsX2ZuU3RyaW5nVG9Dc3M6eCxfZm5Tb3J0RmxhdHRlbjpWLF9mblNvcnQ6bWIsX2ZuU29ydEFyaWE6SmIsX2ZuU29ydExpc3RlbmVyOlZhLF9mblNvcnRBdHRhY2hMaXN0ZW5lcjpNYSxfZm5Tb3J0aW5nQ2xhc3Nlczp2YSxfZm5Tb3J0RGF0YTpJYixfZm5TYXZlU3RhdGU6d2EsX2ZuTG9hZFN0YXRlOktiLF9mblNldHRpbmdzRnJvbU5vZGU6eGEsX2ZuTG9nOkwsX2ZuTWFwOkUsX2ZuQmluZEFjdGlvbjpXYSxfZm5DYWxsYmFja1JlZzp6LApfZm5DYWxsYmFja0ZpcmU6dSxfZm5MZW5ndGhPdmVyZmxvdzpTYSxfZm5SZW5kZXJlcjpOYSxfZm5EYXRhU291cmNlOnksX2ZuUm93QXR0cmlidXRlczpMYSxfZm5DYWxjdWxhdGVFbmQ6ZnVuY3Rpb24oKXt9fSk7aC5mbi5kYXRhVGFibGU9bTttLiQ9aDtoLmZuLmRhdGFUYWJsZVNldHRpbmdzPW0uc2V0dGluZ3M7aC5mbi5kYXRhVGFibGVFeHQ9bS5leHQ7aC5mbi5EYXRhVGFibGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGgodGhpcykuZGF0YVRhYmxlKGEpLmFwaSgpfTtoLmVhY2gobSxmdW5jdGlvbihhLGIpe2guZm4uRGF0YVRhYmxlW2FdPWJ9KTtyZXR1cm4gaC5mbi5kYXRhVGFibGV9KTsK"></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,KGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Ci8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rbWFuZG92L2QzLWhvcml6b24tY2hhcnQgVmVyc2lvbiAwLjAuNi4gQ29weXJpZ2h0IDIwMTYgS2lyaWwgTWFuZG92LgooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgewogICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShyZXF1aXJlKCdkMy1zZWxlY3Rpb24nKSwgcmVxdWlyZSgnZDMtc2NhbGUnKSwgcmVxdWlyZSgnZDMtYXhpcycpLCByZXF1aXJlKCdkMy1hcnJheScpKSA6CiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydkMy1zZWxlY3Rpb24nLCAnZDMtc2NhbGUnLCAnZDMtYXhpcycsICdkMy1hcnJheSddLCBmYWN0b3J5KSA6CiAgICAoZmFjdG9yeShnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMpKTsKfSh0aGlzLCAoZnVuY3Rpb24gKGQzU2VsZWN0aW9uLGQzU2NhbGUsZDNBeGlzLGQzQXJyYXkpIHsgJ3VzZSBzdHJpY3QnOwoKZnVuY3Rpb24gaG9yaXpvbiAoKSB7DQoNCiAgICAvLyBkZWZhdWx0IHNldHRpbmdzOg0KICAgIC8vdmFyIGNvbG9ycyA9IFsnIzA4NTE5YycsJyMzMTgyYmQnLCcjNmJhZWQ2JywnI2JkZDdlNycsJyNiYWU0YjMnLCcjNzRjNDc2JywnIzMxYTM1NCcsJyMwMDZkMmMnXSwNCiAgICAvL3ZhciBjb2xvcnMgPSBbJyM0NTc1YjQnLCAnIzc0YWRkMScsICcjYWJkOWU5JywgJyNlMGYzZjgnLCAnI2ZlZTA5MCcsICcjZmRhZTYxJywgJyNmNDZkNDMnLCAnI2Q3MzAyNyddLA0KICAgIC8vdmFyIGNvbG9ycyA9IFsiIzVlNGZhMiIsICIjMzI4OGJkIiwgIiM2NmMyYTUiLCAiI2FiZGRhNCIsICIjZTZmNTk4IiwgIiNmZWUwOGIiLCAiI2ZkYWU2MSIsICIjZjQ2ZDQzIiwgIiNkNTNlNGYiLCAiIzllMDE0MiJdLA0KICAgIHZhciBjb2xvcnMgPSBbIiMzMTM2OTUiLCAiIzQ1NzViNCIsICIjNzRhZGQxIiwgIiNhYmQ5ZTkiLCAiI2ZlZTA5MCIsICIjZmRhZTYxIiwgIiNmNDZkNDMiLCAiI2Q3MzAyNyJdLA0KICAgICAgICBiYW5kcyA9IGNvbG9ycy5sZW5ndGggPj4gMSwgLy8gbnVtYmVyIG9mIGJhbmRzIGluIGVhY2ggZGlyZWN0aW9uIChwb3NpdGl2ZSAvIG5lZ2F0aXZlKQ0KICAgICAgICB3aWR0aCA9IDEwMDAsIC8vIHdpZHRoIGluIHBpeGVscw0KICAgICAgICBoZWlnaHQgPSAzMCwNCiAgICAgICAgb2Zmc2V0WCA9IDAsDQogICAgICAgIHN0ZXAgPSAxLA0KICAgICAgICBzcGFjaW5nID0gMCwNCiAgICAgICAgbW9kZSA9ICdvZmZzZXQnLA0KICAgICAgICBheGlzID0gbnVsbCwNCiAgICAgICAgdGl0bGUgPSBudWxsLA0KICAgICAgICBleHRlbnQgPSBudWxsLCAvLyB0aGUgZXh0ZW50IGlzIGRlcml2ZWQgZnJvbSB0aGUgZGF0YSwgdW5sZXNzIGV4cGxpY2l0bHkgc2V0IHZpYSAuZXh0ZW50KFttaW4sIG1heF0pDQogICAgICAgIC8veCA9IGQzLnNjYWxlTGluZWFyKCksIC8vIFRPRE86IHVzZSBvcmRpbmFsIHNjYWxlIGluc3RlYWQ/DQogICAgICAgIHggPSBudWxsLA0KICAgICAgICB5ID0gZDNTY2FsZS5zY2FsZUxpbmVhcigpLnJhbmdlKFswLCBoZWlnaHRdKSwNCiAgICAgICAgY2FudmFzID0gbnVsbDsNCg0KICAgIC8vIEFwcGVuZHMgYSBjYW52YXMgZWxlbWVudCB0byB0aGUgY3VycmVudCBlbGVtZW50DQogICAgLy8gYW5kIGRyYXdzIGEgaG9yaXpvbiBncmFwaCBiYXNlZCBvbiBkYXRhICYgc2V0dGluZ3MNCiAgICBmdW5jdGlvbiBob3Jpem9uQ2hhcnQoZGF0YSkgew0KDQogICAgICAgIHZhciBzZWxlY3Rpb24gPSBkM1NlbGVjdGlvbi5zZWxlY3QodGhpcyk7DQogICAgICAgIHZhciBkSW5jcmVtZW50ID0gc3RlcCArIHNwYWNpbmc7DQoNCiAgICAgICAgLy8gdXBkYXRlIHRoZSB3aWR0aA0KICAgICAgICAvL3dpZHRoID0gaG9yaXpvbi5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7DQogICAgICAgIHdpZHRoID0gZEluY3JlbWVudCAqIGRhdGEubGVuZ3RoOw0KICAgICAgICBjYW52YXMgPSBzZWxlY3Rpb24uYXBwZW5kKCdjYW52YXMnKTsNCg0KICAgICAgICBjYW52YXMNCiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHdpZHRoKQ0KICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCk7DQoNCiAgICAgICAgc2VsZWN0aW9uLmFwcGVuZCgnc3BhbicpDQogICAgICAgICAgICAuYXR0cignY2xhc3MnLCAndGl0bGUnKQ0KICAgICAgICAgICAgLnRleHQodGl0bGUpOw0KDQogICAgICAgIHNlbGVjdGlvbi5hcHBlbmQoJ3NwYW4nKQ0KICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3ZhbHVlJyk7DQoNCiAgICAgICAgdmFyIGNvbnRleHQgPSBjYW52YXMubm9kZSgpLmdldENvbnRleHQoJzJkJyk7DQogICAgICAgIC8vY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTsNCiAgICAgICAgLy9jb250ZXh0LnRyYW5zbGF0ZShtYXJnaW4ubGVmdCwgbWFyZ2luLnRvcCk7DQoNCiAgICAgICAgLy8gdXBkYXRlIHRoZSB5IHNjYWxlLCBiYXNlZCBvbiB0aGUgZGF0YSBleHRlbnRzDQogICAgICAgIHZhciBfZXh0ZW50ID0gZXh0ZW50IHx8IGQzQXJyYXkuZXh0ZW50KGRhdGEpOw0KDQogICAgICAgIHZhciBtYXggPSBNYXRoLm1heCgtX2V4dGVudFswXSwgX2V4dGVudFsxXSk7DQogICAgICAgIHkuZG9tYWluKFswLCBtYXhdKTsNCiAgICAgICAgLy94ID0gZDMuc2NhbGVUaW1lKCkuZG9tYWluW107DQogICAgICAgIGF4aXMgPSBkM0F4aXMuYXhpc1RvcCh4KS50aWNrcyg1KTsNCg0KICAgICAgICAvLyBEcmF3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgLy9jb250ZXh0LnRyYW5zbGF0ZSgwLjUsIDAuNSk7DQoNCiAgICAgICAgLy8gdGhlIGRhdGEgZnJhbWUgY3VycmVudGx5IGJlaW5nIHNob3duOg0KICAgICAgICB2YXIgaW5jcmVtZW50ID0gc3RlcCArIHNwYWNpbmcsDQogICAgICAgICAgICBzdGFydEluZGV4ID0gfn5NYXRoLm1heCgwLCAtKG9mZnNldFggLyBpbmNyZW1lbnQpKSwNCiAgICAgICAgICAgIGVuZEluZGV4ID0gfn5NYXRoLm1pbihkYXRhLmxlbmd0aCwgc3RhcnRJbmRleCArIHdpZHRoIC8gaW5jcmVtZW50KTsNCg0KICAgICAgICAvLyBza2lwIGRyYXdpbmcgaWYgdGhlcmUncyBubyBkYXRhIHRvIGJlIGRyYXduDQogICAgICAgIGlmIChzdGFydEluZGV4ID4gZGF0YS5sZW5ndGgpIHJldHVybjsNCg0KDQogICAgICAgIC8vIHdlIGFyZSBkcmF3aW5nIHBvc2l0aXZlICYgbmVnYXRpdmUgYmFuZHMgc2VwYXJhdGVseSB0byBhdm9pZCBtdXRhdGluZyBjYW52YXMgc3RhdGUNCiAgICAgICAgLy8gaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvY2FudmFzL3BlcmZvcm1hbmNlLw0KDQogICAgICAgIHZhciBuZWdhdGl2ZSA9IGZhbHNlOw0KICAgICAgICAvLyBkcmF3IHBvc2l0aXZlIGJhbmRzDQogICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgYmFuZHM7IGIrKykgew0KICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBjb2xvcnNbYmFuZHMgKyBiXTsNCg0KICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSByYW5nZSBiYXNlZCBvbiB0aGUgY3VycmVudCBiYW5kIGluZGV4Lg0KICAgICAgICAgICAgdmFyIGJFeHRlbnRzID0gKGIgKyAxIC0gYmFuZHMpICogaGVpZ2h0Ow0KICAgICAgICAgICAgeS5yYW5nZShbYmFuZHMgKiBoZWlnaHQgKyBiRXh0ZW50cywgYkV4dGVudHNdKTsNCg0KICAgICAgICAgICAgLy8gb25seSB0aGUgY3VycmVudCBkYXRhIGZyYW1lIGlzIGJlaW5nIGRyYXduIGkuZS4gd2hhdCdzIHZpc2libGU6DQogICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleCwgdmFsdWU7IGkgPCBlbmRJbmRleDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhW2ldOw0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8PSAwKSB7IG5lZ2F0aXZlID0gdHJ1ZTsgY29udGludWU7IH0NCiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7DQogICAgICAgICAgICAgICAgY29udGV4dC5maWxsUmVjdChvZmZzZXRYICsgaSAqIGluY3JlbWVudCwgeSh2YWx1ZSksIHN0ZXAsIHkoMCkgLSB5KHZhbHVlKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyBkcmF3IG5lZ2F0aXZlIGJhbmRzDQogICAgICAgIGlmIChuZWdhdGl2ZSkgew0KDQogICAgICAgICAgICAvLyBtaXJyb3IgdGhlIG5lZ2F0aXZlIGJhbmRzLCBieSBmbGlwcGluZyB0aGUgY2FudmFzDQogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ29mZnNldCcpIHsNCiAgICAgICAgICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZSgwLCBoZWlnaHQpOw0KICAgICAgICAgICAgICAgIGNvbnRleHQuc2NhbGUoMSwgLTEpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgYmFuZHM7IGIrKykgew0KICAgICAgICAgICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY29sb3JzW2JhbmRzIC0gYiAtIDFdOw0KDQogICAgICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSByYW5nZSBiYXNlZCBvbiB0aGUgY3VycmVudCBiYW5kIGluZGV4Lg0KICAgICAgICAgICAgICAgIGJFeHRlbnRzID0gKGIgKyAxIC0gYmFuZHMpICogaGVpZ2h0Ow0KICAgICAgICAgICAgICAgIHkucmFuZ2UoW2JhbmRzICogaGVpZ2h0ICsgYkV4dGVudHMsIGJFeHRlbnRzXSk7DQoNCiAgICAgICAgICAgICAgICAvLyBvbmx5IHRoZSBjdXJyZW50IGRhdGEgZnJhbWUgaXMgYmVpbmcgZHJhd24gaS5lLiB3aGF0J3MgdmlzaWJsZToNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gc3RhcnRJbmRleCwgbnZhbHVlOyBqIDwgZW5kSW5kZXg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICBudmFsdWUgPSBkYXRhW2pdOw0KICAgICAgICAgICAgICAgICAgICBpZiAobnZhbHVlID49IDApIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmZpbGxSZWN0KG9mZnNldFggKyBqICogaW5jcmVtZW50LCB5KC1udmFsdWUpLCBzdGVwLCB5KDApIC0geSgtbnZhbHVlKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLyoNCiAgICAgICAgLy8gT2Zmc2NyZWVuIERyYXcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgICAgICBmdW5jdGlvbiBjcmVhdGVPZmZzY3JlZW5DYW52YXMod2lkdGgsaGVpZ2h0KXsNCiAgICAgICAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsNCiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoOw0KICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsNCiAgICAgICAgICAgIHJldHVybiBjYW52YXM7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgb2Zmc2NyZWVuQ2FudmFzID0gY3JlYXRlT2Zmc2NyZWVuQ2FudmFzKGluY3JlbWVudCAqIGRhdGEubGVuZ3RoLCBoZWlnaHQpOw0KICAgICAgICB2YXIgb2Zmc2NyZWVuQ29udGV4dCA9IG9mZnNjcmVlbkNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAvLyBkcmF3IGVhY2ggYmFuZDoNCiAgICAgICAgZm9yICh2YXIgYiA9IDA7IGIgPCBiYW5kczsgYisrKSB7DQogICAgICAgICAgICBvZmZzY3JlZW5Db250ZXh0LmZpbGxTdHlsZSA9IGNvbG9yc1tiXTsNCg0KICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSByYW5nZSBiYXNlZCBvbiB0aGUgY3VycmVudCBiYW5kIGluZGV4Lg0KICAgICAgICAgICAgdmFyIHkwID0gKGIgKyAxIC0gYmFuZHMpICogaGVpZ2h0Ow0KICAgICAgICAgICAgeS5yYW5nZShbYmFuZHMgKiBoZWlnaHQgKyB5MCwgeTBdKTsNCg0KICAgICAgICAgICAgLy8gZHJhdyB0aGUgd2hvbGUgcGVyaW9kIG9uIGFuIG9mZnNjcmVlbiBjYW52YXMNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgb2Zmc2NyZWVuQ29udGV4dC5maWxsUmVjdChpICogaW5jcmVtZW50LCB5KGRhdGFbaV0pLCBzdGVwLCB5KDApIC0geShkYXRhW2ldKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgb25zY3JlZW5JbWFnZTsNCiAgICAgICAgX2RyYXcgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIG9uc2NyZWVuSW1hZ2UgPSBvZmZzY3JlZW5Db250ZXh0LmdldEltYWdlRGF0YSgtb2Zmc2V0WCwgMCwgd2lkdGgsIGhlaWdodCk7DQogICAgICAgICAgICBjb250ZXh0LnB1dEltYWdlRGF0YShvbnNjcmVlbkltYWdlLCAwLCAwKTsNCg0KICAgICAgICAgICAgLy9jb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIC8vY29udGV4dC50cmFuc2xhdGUob2Zmc2V0WCwgMCk7DQogICAgICAgICAgICAvL2NvbnRleHQuZHJhd0ltYWdlKG9mZnNjcmVlbkNhbnZhcywgb2Zmc2V0WCwgMCk7DQogICAgICAgIH07DQogICAgICAgICovDQogICAgfQ0KDQogICAgaG9yaXpvbkNoYXJ0LmF4aXMgPSBmdW5jdGlvbiAoXykgew0KICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChheGlzID0gXywgaG9yaXpvbkNoYXJ0KSA6IGF4aXM7DQogICAgfTsNCg0KICAgIGhvcml6b25DaGFydC5jYW52YXMgPSBmdW5jdGlvbiAoXykgew0KICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjYW52YXMgPSBfLCBob3Jpem9uQ2hhcnQpIDogY2FudmFzOw0KICAgIH07DQoNCiAgICAvLyBBcnJheSBvZiBjb2xvcnMgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgYmFuZHMNCiAgICBob3Jpem9uQ2hhcnQuY29sb3JzID0gZnVuY3Rpb24gKF8pIHsNCiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY29sb3JzOw0KICAgICAgICBjb2xvcnMgPSBfOw0KDQogICAgICAgIC8vIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGJhbmRzDQogICAgICAgIGJhbmRzID0gY29sb3JzLmxlbmd0aCA+PiAxOw0KDQogICAgICAgIHJldHVybiBob3Jpem9uQ2hhcnQ7DQogICAgfTsNCg0KICAgIC8vIGdldC9zZXQgdGhlIGhlaWdodCBvZiB0aGUgZ3JhcGgNCiAgICBob3Jpem9uQ2hhcnQuaGVpZ2h0ID0gZnVuY3Rpb24gKF8pIHsNCiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaGVpZ2h0ID0gXywgaG9yaXpvbkNoYXJ0KSA6IGhlaWdodDsNCiAgICB9Ow0KDQogICAgLy8gZ2V0L3NldCB0aGUgc3RlcCBvZiB0aGUgZ3JhcGgsIGkuZS4gdGhlIHdpZHRoIG9mIGVhY2ggYmFyDQogICAgaG9yaXpvbkNoYXJ0LnN0ZXAgPSBmdW5jdGlvbiAoXykgew0KICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGVwID0gXywgaG9yaXpvbkNoYXJ0KSA6IHN0ZXA7DQogICAgfTsNCg0KICAgIC8vIGdldC9zZXQgdGhlIHNwYWNpbmcgYmV0d2VlbiB0aGUgYmFycyBvZiB0aGUgZ3JhcGgNCiAgICBob3Jpem9uQ2hhcnQuc3BhY2luZyA9IGZ1bmN0aW9uIChfKSB7DQogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNpbmcgPSBfLCBob3Jpem9uQ2hhcnQpIDogc3BhY2luZzsNCiAgICB9Ow0KDQogICAgLy8gZ2V0L3NldCB0aGUgdGl0bGUgb2YgdGhlIGhvcml6b24NCiAgICBob3Jpem9uQ2hhcnQudGl0bGUgPSBmdW5jdGlvbiAoXykgew0KICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aXRsZSA9IF8sIGhvcml6b25DaGFydCkgOiB0aXRsZTsNCiAgICB9Ow0KDQogICAgLy8gbWlycm9yIG9yIG9mZnNldA0KICAgIGhvcml6b25DaGFydC5tb2RlID0gZnVuY3Rpb24gKF8pIHsNCiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobW9kZSA9IF8sIGhvcml6b25DaGFydCkgOiBtb2RlOw0KICAgIH07DQoNCiAgICAvLyBnZXQvc2V0IHRoZSBleHRlbnRzIG9mIHRoZSBZIGF4aXMuIElmIG5vdCBzZXQgdGhlIGV4dGVudHMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgZGF0YQ0KICAgIGhvcml6b25DaGFydC5leHRlbnQgPSBmdW5jdGlvbiAoXykgew0KICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSBfLCBob3Jpem9uQ2hhcnQpIDogZXh0ZW50Ow0KICAgIH07DQoNCiAgICBob3Jpem9uQ2hhcnQub2Zmc2V0WCA9IGZ1bmN0aW9uIChfKSB7DQogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9mZnNldFggPSBfLCBob3Jpem9uQ2hhcnQpIDogb2Zmc2V0WDsNCiAgICB9Ow0KDQogICAgLy8gdGhlIGRhdGEgZnJhbWUgY3VycmVudGx5IGJlaW5nIHNob3duOg0KICAgIGhvcml6b25DaGFydC5pbmRleEV4dGVudCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdmFyIGluY3JlbWVudCA9IHN0ZXAgKyBzcGFjaW5nLA0KICAgICAgICAgICAgc3RhcnRJbmRleCA9IC1vZmZzZXRYIC8gaW5jcmVtZW50LA0KICAgICAgICAgICAgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgd2lkdGggLyBpbmNyZW1lbnQ7DQoNCiAgICAgICAgcmV0dXJuIFtzdGFydEluZGV4LCBlbmRJbmRleF07DQogICAgfTsNCg0KICAgIHJldHVybiBob3Jpem9uQ2hhcnQ7DQoNCn0KCnZhciBIVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0czsKCkhUTUxXaWRnZXRzLndpZGdldCh7DQoNCiAgbmFtZTogJ2QzaG9yaXpvbicsDQoNCiAgdHlwZTogJ291dHB1dCcsDQoNCiAgZmFjdG9yeTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCg0KICAgIHJldHVybiB7DQoNCiAgICAgIGNoYXJ0OiBudWxsLA0KDQogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oeCkgew0KICAgICAgICB2YXIgaG9yaXpvbkNoYXJ0Ow0KDQogICAgICAgIGlmKHRoaXMuY2hhcnQpIHsNCiAgICAgICAgICBob3Jpem9uQ2hhcnQgPSB0aGlzLmNoYXJ0Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXMuY2hhcnQgPSBob3Jpem9uQ2hhcnQgPSBob3Jpem9uKCk7DQogICAgICAgIH0NCg0KDQogICAgICAgIE9iamVjdC5rZXlzKHgub3B0aW9ucykubWFwKGZ1bmN0aW9uKGt5KSB7DQogICAgICAgICAgaWYoaG9yaXpvbkNoYXJ0W2t5XSkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgaG9yaXpvbkNoYXJ0W2t5XSh4Lm9wdGlvbnNba3ldKTsNCiAgICAgICAgICAgIH0gY2F0Y2goZSkgew0KICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdvcHRpb24gJyArIGt5ICsgImRvZXMgbm90IHNlZW0gc3VwcG9ydGVkLiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgLy8gYmFkIGhhY2sgdG8gZml0IGNoYXJ0IGJ5IGZvcmNpbmcgc3RlcA0KICAgICAgICAvLyAgbmVlZCB0byBmaXggdGhpcw0KICAgICAgICBob3Jpem9uQ2hhcnQuc3RlcChlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aC94LmRhdGFbMF0ubGVuZ3RoKTsNCg0KICAgICAgICAvLyBicnV0ZSBmb3JjZSByZW1vdmUgYW55IHByZXZpb3VzIGhvcml6b25zDQogICAgICAgIC8vICB3aWxsIG5lZWQgdG8gaW1wcm92ZSB0aGlzIGluIGZ1dHVyZQ0KICAgICAgICBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdEFsbCgnLmhvcml6b24nKS5yZW1vdmUoKTsNCg0KICAgICAgICB2YXIgaG9yaXpvbnMgPSBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdEFsbCgnLmhvcml6b24nKQ0KICAgICAgICAgIC5kYXRhKHguZGF0YSkNCiAgICAgICAgICAuZW50ZXIoKQ0KICAgICAgICAgIC5hcHBlbmQoJ2RpdicpOw0KDQogICAgICAgIGhvcml6b25zDQogICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2hvcml6b24nKQ0KICAgICAgICAgIC5lYWNoKGhvcml6b25DaGFydCk7DQoNCiAgICAgIH0sDQoNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24od2lkdGgsIGhlaWdodCkgew0KDQogICAgICAgIC8vIFRPRE86IGNvZGUgdG8gcmUtcmVuZGVyIHRoZSB3aWRnZXQgd2l0aCBhIG5ldyBzaXplDQoNCiAgICAgIH0NCg0KICAgIH07DQogIH0NCn0pOwoKfSkpKTsKfSx7ImQzLWFycmF5IjoyLCJkMy1heGlzIjozLCJkMy1zY2FsZSI6OCwiZDMtc2VsZWN0aW9uIjo5fV0sMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Ci8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtYXJyYXkvIFZlcnNpb24gMS4xLjEuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOgoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6CgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOwp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7Cgp2YXIgYXNjZW5kaW5nID0gZnVuY3Rpb24oYSwgYikgewogIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsKfTsKCnZhciBiaXNlY3RvciA9IGZ1bmN0aW9uKGNvbXBhcmUpIHsKICBpZiAoY29tcGFyZS5sZW5ndGggPT09IDEpIGNvbXBhcmUgPSBhc2NlbmRpbmdDb21wYXJhdG9yKGNvbXBhcmUpOwogIHJldHVybiB7CiAgICBsZWZ0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsKICAgICAgaWYgKGxvID09IG51bGwpIGxvID0gMDsKICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7CiAgICAgIHdoaWxlIChsbyA8IGhpKSB7CiAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7CiAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTsKICAgICAgICBlbHNlIGhpID0gbWlkOwogICAgICB9CiAgICAgIHJldHVybiBsbzsKICAgIH0sCiAgICByaWdodDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7CiAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7CiAgICAgIGlmIChoaSA9PSBudWxsKSBoaSA9IGEubGVuZ3RoOwogICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxOwogICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPiAwKSBoaSA9IG1pZDsKICAgICAgICBlbHNlIGxvID0gbWlkICsgMTsKICAgICAgfQogICAgICByZXR1cm4gbG87CiAgICB9CiAgfTsKfTsKCmZ1bmN0aW9uIGFzY2VuZGluZ0NvbXBhcmF0b3IoZikgewogIHJldHVybiBmdW5jdGlvbihkLCB4KSB7CiAgICByZXR1cm4gYXNjZW5kaW5nKGYoZCksIHgpOwogIH07Cn0KCnZhciBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpOwp2YXIgYmlzZWN0UmlnaHQgPSBhc2NlbmRpbmdCaXNlY3QucmlnaHQ7CnZhciBiaXNlY3RMZWZ0ID0gYXNjZW5kaW5nQmlzZWN0LmxlZnQ7Cgp2YXIgcGFpcnMgPSBmdW5jdGlvbihhcnJheSwgZikgewogIGlmIChmID09IG51bGwpIGYgPSBwYWlyOwogIHZhciBpID0gMCwgbiA9IGFycmF5Lmxlbmd0aCAtIDEsIHAgPSBhcnJheVswXSwgcGFpcnMgPSBuZXcgQXJyYXkobiA8IDAgPyAwIDogbik7CiAgd2hpbGUgKGkgPCBuKSBwYWlyc1tpXSA9IGYocCwgcCA9IGFycmF5WysraV0pOwogIHJldHVybiBwYWlyczsKfTsKCmZ1bmN0aW9uIHBhaXIoYSwgYikgewogIHJldHVybiBbYSwgYl07Cn0KCnZhciBjcm9zcyA9IGZ1bmN0aW9uKGEsIGIsIGYpIHsKICB2YXIgbmEgPSBhLmxlbmd0aCwgbmIgPSBiLmxlbmd0aCwgYyA9IG5ldyBBcnJheShuYSAqIG5iKSwgaWEsIGliLCBpYywgdmE7CiAgaWYgKGYgPT0gbnVsbCkgZiA9IHBhaXI7CiAgZm9yIChpYSA9IGljID0gMDsgaWEgPCBuYTsgKytpYSkgZm9yICh2YSA9IGFbaWFdLCBpYiA9IDA7IGliIDwgbmI7ICsraWIsICsraWMpIGNbaWNdID0gZih2YSwgYltpYl0pOwogIHJldHVybiBjOwp9OwoKdmFyIGRlc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOOwp9OwoKdmFyIG51bWJlciA9IGZ1bmN0aW9uKHgpIHsKICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4Owp9OwoKdmFyIHZhcmlhbmNlID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKICB2YXIgbiA9IGFycmF5Lmxlbmd0aCwKICAgICAgbSA9IDAsCiAgICAgIGEsCiAgICAgIGQsCiAgICAgIHMgPSAwLAogICAgICBpID0gLTEsCiAgICAgIGogPSAwOwoKICBpZiAoZiA9PSBudWxsKSB7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBpZiAoIWlzTmFOKGEgPSBudW1iZXIoYXJyYXlbaV0pKSkgewogICAgICAgIGQgPSBhIC0gbTsKICAgICAgICBtICs9IGQgLyArK2o7CiAgICAgICAgcyArPSBkICogKGEgLSBtKTsKICAgICAgfQogICAgfQogIH0KCiAgZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBpZiAoIWlzTmFOKGEgPSBudW1iZXIoZihhcnJheVtpXSwgaSwgYXJyYXkpKSkpIHsKICAgICAgICBkID0gYSAtIG07CiAgICAgICAgbSArPSBkIC8gKytqOwogICAgICAgIHMgKz0gZCAqIChhIC0gbSk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmIChqID4gMSkgcmV0dXJuIHMgLyAoaiAtIDEpOwp9OwoKdmFyIGRldmlhdGlvbiA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgdmFyIHYgPSB2YXJpYW5jZShhcnJheSwgZik7CiAgcmV0dXJuIHYgPyBNYXRoLnNxcnQodikgOiB2Owp9OwoKdmFyIGV4dGVudCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgdmFyIGkgPSAtMSwKICAgICAgbiA9IGFycmF5Lmxlbmd0aCwKICAgICAgYSwKICAgICAgYiwKICAgICAgYzsKCiAgaWYgKGYgPT0gbnVsbCkgewogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGIgPj0gYikgeyBhID0gYyA9IGI7IGJyZWFrOyB9CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwpIHsKICAgICAgaWYgKGEgPiBiKSBhID0gYjsKICAgICAgaWYgKGMgPCBiKSBjID0gYjsKICAgIH0KICB9CgogIGVsc2UgewogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYoYXJyYXlbaV0sIGksIGFycmF5KSkgIT0gbnVsbCAmJiBiID49IGIpIHsgYSA9IGMgPSBiOyBicmVhazsgfQogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYoYXJyYXlbaV0sIGksIGFycmF5KSkgIT0gbnVsbCkgewogICAgICBpZiAoYSA+IGIpIGEgPSBiOwogICAgICBpZiAoYyA8IGIpIGMgPSBiOwogICAgfQogIH0KCiAgcmV0dXJuIFthLCBjXTsKfTsKCnZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZTsKCnZhciBzbGljZSA9IGFycmF5LnNsaWNlOwp2YXIgbWFwID0gYXJyYXkubWFwOwoKdmFyIGNvbnN0YW50ID0gZnVuY3Rpb24oeCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn07Cgp2YXIgaWRlbnRpdHkgPSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuIHg7Cn07Cgp2YXIgcmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgewogIHN0YXJ0ID0gK3N0YXJ0LCBzdG9wID0gK3N0b3AsIHN0ZXAgPSAobiA9IGFyZ3VtZW50cy5sZW5ndGgpIDwgMiA/IChzdG9wID0gc3RhcnQsIHN0YXJ0ID0gMCwgMSkgOiBuIDwgMyA/IDEgOiArc3RlcDsKCiAgdmFyIGkgPSAtMSwKICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKSB8IDAsCiAgICAgIHJhbmdlID0gbmV3IEFycmF5KG4pOwoKICB3aGlsZSAoKytpIDwgbikgewogICAgcmFuZ2VbaV0gPSBzdGFydCArIGkgKiBzdGVwOwogIH0KCiAgcmV0dXJuIHJhbmdlOwp9OwoKdmFyIGUxMCA9IE1hdGguc3FydCg1MCk7CnZhciBlNSA9IE1hdGguc3FydCgxMCk7CnZhciBlMiA9IE1hdGguc3FydCgyKTsKCnZhciB0aWNrcyA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBjb3VudCkgewogIHZhciBzdGVwID0gdGlja1N0ZXAoc3RhcnQsIHN0b3AsIGNvdW50KTsKICByZXR1cm4gcmFuZ2UoCiAgICBNYXRoLmNlaWwoc3RhcnQgLyBzdGVwKSAqIHN0ZXAsCiAgICBNYXRoLmZsb29yKHN0b3AgLyBzdGVwKSAqIHN0ZXAgKyBzdGVwIC8gMiwgLy8gaW5jbHVzaXZlCiAgICBzdGVwCiAgKTsKfTsKCmZ1bmN0aW9uIHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCkgewogIHZhciBzdGVwMCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgwLCBjb3VudCksCiAgICAgIHN0ZXAxID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2coc3RlcDApIC8gTWF0aC5MTjEwKSksCiAgICAgIGVycm9yID0gc3RlcDAgLyBzdGVwMTsKICBpZiAoZXJyb3IgPj0gZTEwKSBzdGVwMSAqPSAxMDsKICBlbHNlIGlmIChlcnJvciA+PSBlNSkgc3RlcDEgKj0gNTsKICBlbHNlIGlmIChlcnJvciA+PSBlMikgc3RlcDEgKj0gMjsKICByZXR1cm4gc3RvcCA8IHN0YXJ0ID8gLXN0ZXAxIDogc3RlcDE7Cn0KCnZhciBzdHVyZ2VzID0gZnVuY3Rpb24odmFsdWVzKSB7CiAgcmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZXMubGVuZ3RoKSAvIE1hdGguTE4yKSArIDE7Cn07Cgp2YXIgaGlzdG9ncmFtID0gZnVuY3Rpb24oKSB7CiAgdmFyIHZhbHVlID0gaWRlbnRpdHksCiAgICAgIGRvbWFpbiA9IGV4dGVudCwKICAgICAgdGhyZXNob2xkID0gc3R1cmdlczsKCiAgZnVuY3Rpb24gaGlzdG9ncmFtKGRhdGEpIHsKICAgIHZhciBpLAogICAgICAgIG4gPSBkYXRhLmxlbmd0aCwKICAgICAgICB4LAogICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheShuKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIHZhbHVlc1tpXSA9IHZhbHVlKGRhdGFbaV0sIGksIGRhdGEpOwogICAgfQoKICAgIHZhciB4eiA9IGRvbWFpbih2YWx1ZXMpLAogICAgICAgIHgwID0geHpbMF0sCiAgICAgICAgeDEgPSB4elsxXSwKICAgICAgICB0eiA9IHRocmVzaG9sZCh2YWx1ZXMsIHgwLCB4MSk7CgogICAgLy8gQ29udmVydCBudW1iZXIgb2YgdGhyZXNob2xkcyBpbnRvIHVuaWZvcm0gdGhyZXNob2xkcy4KICAgIGlmICghQXJyYXkuaXNBcnJheSh0eikpIHR6ID0gdGlja3MoeDAsIHgxLCB0eik7CgogICAgLy8gUmVtb3ZlIGFueSB0aHJlc2hvbGRzIG91dHNpZGUgdGhlIGRvbWFpbi4KICAgIHZhciBtID0gdHoubGVuZ3RoOwogICAgd2hpbGUgKHR6WzBdIDw9IHgwKSB0ei5zaGlmdCgpLCAtLW07CiAgICB3aGlsZSAodHpbbSAtIDFdID49IHgxKSB0ei5wb3AoKSwgLS1tOwoKICAgIHZhciBiaW5zID0gbmV3IEFycmF5KG0gKyAxKSwKICAgICAgICBiaW47CgogICAgLy8gSW5pdGlhbGl6ZSBiaW5zLgogICAgZm9yIChpID0gMDsgaSA8PSBtOyArK2kpIHsKICAgICAgYmluID0gYmluc1tpXSA9IFtdOwogICAgICBiaW4ueDAgPSBpID4gMCA/IHR6W2kgLSAxXSA6IHgwOwogICAgICBiaW4ueDEgPSBpIDwgbSA/IHR6W2ldIDogeDE7CiAgICB9CgogICAgLy8gQXNzaWduIGRhdGEgdG8gYmlucyBieSB2YWx1ZSwgaWdub3JpbmcgYW55IG91dHNpZGUgdGhlIGRvbWFpbi4KICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgeCA9IHZhbHVlc1tpXTsKICAgICAgaWYgKHgwIDw9IHggJiYgeCA8PSB4MSkgewogICAgICAgIGJpbnNbYmlzZWN0UmlnaHQodHosIHgsIDAsIG0pXS5wdXNoKGRhdGFbaV0pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGJpbnM7CiAgfQoKICBoaXN0b2dyYW0udmFsdWUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KF8pLCBoaXN0b2dyYW0pIDogdmFsdWU7CiAgfTsKCiAgaGlzdG9ncmFtLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KFtfWzBdLCBfWzFdXSksIGhpc3RvZ3JhbSkgOiBkb21haW47CiAgfTsKCiAgaGlzdG9ncmFtLnRocmVzaG9sZHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aHJlc2hvbGQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBBcnJheS5pc0FycmF5KF8pID8gY29uc3RhbnQoc2xpY2UuY2FsbChfKSkgOiBjb25zdGFudChfKSwgaGlzdG9ncmFtKSA6IHRocmVzaG9sZDsKICB9OwoKICByZXR1cm4gaGlzdG9ncmFtOwp9OwoKdmFyIHF1YW50aWxlID0gZnVuY3Rpb24oYXJyYXksIHAsIGYpIHsKICBpZiAoZiA9PSBudWxsKSBmID0gbnVtYmVyOwogIGlmICghKG4gPSBhcnJheS5sZW5ndGgpKSByZXR1cm47CiAgaWYgKChwID0gK3ApIDw9IDAgfHwgbiA8IDIpIHJldHVybiArZihhcnJheVswXSwgMCwgYXJyYXkpOwogIGlmIChwID49IDEpIHJldHVybiArZihhcnJheVtuIC0gMV0sIG4gLSAxLCBhcnJheSk7CiAgdmFyIG4sCiAgICAgIGggPSAobiAtIDEpICogcCwKICAgICAgaSA9IE1hdGguZmxvb3IoaCksCiAgICAgIGEgPSArZihhcnJheVtpXSwgaSwgYXJyYXkpLAogICAgICBiID0gK2YoYXJyYXlbaSArIDFdLCBpICsgMSwgYXJyYXkpOwogIHJldHVybiBhICsgKGIgLSBhKSAqIChoIC0gaSk7Cn07Cgp2YXIgZnJlZWRtYW5EaWFjb25pcyA9IGZ1bmN0aW9uKHZhbHVlcywgbWluLCBtYXgpIHsKICB2YWx1ZXMgPSBtYXAuY2FsbCh2YWx1ZXMsIG51bWJlcikuc29ydChhc2NlbmRpbmcpOwogIHJldHVybiBNYXRoLmNlaWwoKG1heCAtIG1pbikgLyAoMiAqIChxdWFudGlsZSh2YWx1ZXMsIDAuNzUpIC0gcXVhbnRpbGUodmFsdWVzLCAwLjI1KSkgKiBNYXRoLnBvdyh2YWx1ZXMubGVuZ3RoLCAtMSAvIDMpKSk7Cn07Cgp2YXIgc2NvdHQgPSBmdW5jdGlvbih2YWx1ZXMsIG1pbiwgbWF4KSB7CiAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvICgzLjUgKiBkZXZpYXRpb24odmFsdWVzKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTsKfTsKCnZhciBtYXggPSBmdW5jdGlvbihhcnJheSwgZikgewogIHZhciBpID0gLTEsCiAgICAgIG4gPSBhcnJheS5sZW5ndGgsCiAgICAgIGEsCiAgICAgIGI7CgogIGlmIChmID09IG51bGwpIHsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID49IGIpIHsgYSA9IGI7IGJyZWFrOyB9CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+IGEpIGEgPSBiOwogIH0KCiAgZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZihhcnJheVtpXSwgaSwgYXJyYXkpKSAhPSBudWxsICYmIGIgPj0gYikgeyBhID0gYjsgYnJlYWs7IH0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmKGFycmF5W2ldLCBpLCBhcnJheSkpICE9IG51bGwgJiYgYiA+IGEpIGEgPSBiOwogIH0KCiAgcmV0dXJuIGE7Cn07Cgp2YXIgbWVhbiA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgdmFyIHMgPSAwLAogICAgICBuID0gYXJyYXkubGVuZ3RoLAogICAgICBhLAogICAgICBpID0gLTEsCiAgICAgIGogPSBuOwoKICBpZiAoZiA9PSBudWxsKSB7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpc05hTihhID0gbnVtYmVyKGFycmF5W2ldKSkpIHMgKz0gYTsgZWxzZSAtLWo7CiAgfQoKICBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWlzTmFOKGEgPSBudW1iZXIoZihhcnJheVtpXSwgaSwgYXJyYXkpKSkpIHMgKz0gYTsgZWxzZSAtLWo7CiAgfQoKICBpZiAoaikgcmV0dXJuIHMgLyBqOwp9OwoKdmFyIG1lZGlhbiA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgdmFyIG51bWJlcnMgPSBbXSwKICAgICAgbiA9IGFycmF5Lmxlbmd0aCwKICAgICAgYSwKICAgICAgaSA9IC0xOwoKICBpZiAoZiA9PSBudWxsKSB7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpc05hTihhID0gbnVtYmVyKGFycmF5W2ldKSkpIG51bWJlcnMucHVzaChhKTsKICB9CgogIGVsc2UgewogICAgd2hpbGUgKCsraSA8IG4pIGlmICghaXNOYU4oYSA9IG51bWJlcihmKGFycmF5W2ldLCBpLCBhcnJheSkpKSkgbnVtYmVycy5wdXNoKGEpOwogIH0KCiAgcmV0dXJuIHF1YW50aWxlKG51bWJlcnMuc29ydChhc2NlbmRpbmcpLCAwLjUpOwp9OwoKdmFyIG1lcmdlID0gZnVuY3Rpb24oYXJyYXlzKSB7CiAgdmFyIG4gPSBhcnJheXMubGVuZ3RoLAogICAgICBtLAogICAgICBpID0gLTEsCiAgICAgIGogPSAwLAogICAgICBtZXJnZWQsCiAgICAgIGFycmF5OwoKICB3aGlsZSAoKytpIDwgbikgaiArPSBhcnJheXNbaV0ubGVuZ3RoOwogIG1lcmdlZCA9IG5ldyBBcnJheShqKTsKCiAgd2hpbGUgKC0tbiA+PSAwKSB7CiAgICBhcnJheSA9IGFycmF5c1tuXTsKICAgIG0gPSBhcnJheS5sZW5ndGg7CiAgICB3aGlsZSAoLS1tID49IDApIHsKICAgICAgbWVyZ2VkWy0tal0gPSBhcnJheVttXTsKICAgIH0KICB9CgogIHJldHVybiBtZXJnZWQ7Cn07Cgp2YXIgbWluID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKICB2YXIgaSA9IC0xLAogICAgICBuID0gYXJyYXkubGVuZ3RoLAogICAgICBhLAogICAgICBiOwoKICBpZiAoZiA9PSBudWxsKSB7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+PSBiKSB7IGEgPSBiOyBicmVhazsgfQogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjsKICB9CgogIGVsc2UgewogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYoYXJyYXlbaV0sIGksIGFycmF5KSkgIT0gbnVsbCAmJiBiID49IGIpIHsgYSA9IGI7IGJyZWFrOyB9CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZihhcnJheVtpXSwgaSwgYXJyYXkpKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjsKICB9CgogIHJldHVybiBhOwp9OwoKdmFyIHBlcm11dGUgPSBmdW5jdGlvbihhcnJheSwgaW5kZXhlcykgewogIHZhciBpID0gaW5kZXhlcy5sZW5ndGgsIHBlcm11dGVzID0gbmV3IEFycmF5KGkpOwogIHdoaWxlIChpLS0pIHBlcm11dGVzW2ldID0gYXJyYXlbaW5kZXhlc1tpXV07CiAgcmV0dXJuIHBlcm11dGVzOwp9OwoKdmFyIHNjYW4gPSBmdW5jdGlvbihhcnJheSwgY29tcGFyZSkgewogIGlmICghKG4gPSBhcnJheS5sZW5ndGgpKSByZXR1cm47CiAgdmFyIGkgPSAwLAogICAgICBuLAogICAgICBqID0gMCwKICAgICAgeGksCiAgICAgIHhqID0gYXJyYXlbal07CgogIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZzsKCiAgd2hpbGUgKCsraSA8IG4pIGlmIChjb21wYXJlKHhpID0gYXJyYXlbaV0sIHhqKSA8IDAgfHwgY29tcGFyZSh4aiwgeGopICE9PSAwKSB4aiA9IHhpLCBqID0gaTsKCiAgaWYgKGNvbXBhcmUoeGosIHhqKSA9PT0gMCkgcmV0dXJuIGo7Cn07Cgp2YXIgc2h1ZmZsZSA9IGZ1bmN0aW9uKGFycmF5LCBpMCwgaTEpIHsKICB2YXIgbSA9IChpMSA9PSBudWxsID8gYXJyYXkubGVuZ3RoIDogaTEpIC0gKGkwID0gaTAgPT0gbnVsbCA/IDAgOiAraTApLAogICAgICB0LAogICAgICBpOwoKICB3aGlsZSAobSkgewogICAgaSA9IE1hdGgucmFuZG9tKCkgKiBtLS0gfCAwOwogICAgdCA9IGFycmF5W20gKyBpMF07CiAgICBhcnJheVttICsgaTBdID0gYXJyYXlbaSArIGkwXTsKICAgIGFycmF5W2kgKyBpMF0gPSB0OwogIH0KCiAgcmV0dXJuIGFycmF5Owp9OwoKdmFyIHN1bSA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgdmFyIHMgPSAwLAogICAgICBuID0gYXJyYXkubGVuZ3RoLAogICAgICBhLAogICAgICBpID0gLTE7CgogIGlmIChmID09IG51bGwpIHsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoYSA9ICthcnJheVtpXSkgcyArPSBhOyAvLyBOb3RlOiB6ZXJvIGFuZCBudWxsIGFyZSBlcXVpdmFsZW50LgogIH0KCiAgZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKGEgPSArZihhcnJheVtpXSwgaSwgYXJyYXkpKSBzICs9IGE7CiAgfQoKICByZXR1cm4gczsKfTsKCnZhciB0cmFuc3Bvc2UgPSBmdW5jdGlvbihtYXRyaXgpIHsKICBpZiAoIShuID0gbWF0cml4Lmxlbmd0aCkpIHJldHVybiBbXTsKICBmb3IgKHZhciBpID0gLTEsIG0gPSBtaW4obWF0cml4LCBsZW5ndGgpLCB0cmFuc3Bvc2UgPSBuZXcgQXJyYXkobSk7ICsraSA8IG07KSB7CiAgICBmb3IgKHZhciBqID0gLTEsIG4sIHJvdyA9IHRyYW5zcG9zZVtpXSA9IG5ldyBBcnJheShuKTsgKytqIDwgbjspIHsKICAgICAgcm93W2pdID0gbWF0cml4W2pdW2ldOwogICAgfQogIH0KICByZXR1cm4gdHJhbnNwb3NlOwp9OwoKZnVuY3Rpb24gbGVuZ3RoKGQpIHsKICByZXR1cm4gZC5sZW5ndGg7Cn0KCnZhciB6aXAgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdHJhbnNwb3NlKGFyZ3VtZW50cyk7Cn07CgpleHBvcnRzLmJpc2VjdCA9IGJpc2VjdFJpZ2h0OwpleHBvcnRzLmJpc2VjdFJpZ2h0ID0gYmlzZWN0UmlnaHQ7CmV4cG9ydHMuYmlzZWN0TGVmdCA9IGJpc2VjdExlZnQ7CmV4cG9ydHMuYXNjZW5kaW5nID0gYXNjZW5kaW5nOwpleHBvcnRzLmJpc2VjdG9yID0gYmlzZWN0b3I7CmV4cG9ydHMuY3Jvc3MgPSBjcm9zczsKZXhwb3J0cy5kZXNjZW5kaW5nID0gZGVzY2VuZGluZzsKZXhwb3J0cy5kZXZpYXRpb24gPSBkZXZpYXRpb247CmV4cG9ydHMuZXh0ZW50ID0gZXh0ZW50OwpleHBvcnRzLmhpc3RvZ3JhbSA9IGhpc3RvZ3JhbTsKZXhwb3J0cy50aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzID0gZnJlZWRtYW5EaWFjb25pczsKZXhwb3J0cy50aHJlc2hvbGRTY290dCA9IHNjb3R0OwpleHBvcnRzLnRocmVzaG9sZFN0dXJnZXMgPSBzdHVyZ2VzOwpleHBvcnRzLm1heCA9IG1heDsKZXhwb3J0cy5tZWFuID0gbWVhbjsKZXhwb3J0cy5tZWRpYW4gPSBtZWRpYW47CmV4cG9ydHMubWVyZ2UgPSBtZXJnZTsKZXhwb3J0cy5taW4gPSBtaW47CmV4cG9ydHMucGFpcnMgPSBwYWlyczsKZXhwb3J0cy5wZXJtdXRlID0gcGVybXV0ZTsKZXhwb3J0cy5xdWFudGlsZSA9IHF1YW50aWxlOwpleHBvcnRzLnJhbmdlID0gcmFuZ2U7CmV4cG9ydHMuc2NhbiA9IHNjYW47CmV4cG9ydHMuc2h1ZmZsZSA9IHNodWZmbGU7CmV4cG9ydHMuc3VtID0gc3VtOwpleHBvcnRzLnRpY2tzID0gdGlja3M7CmV4cG9ydHMudGlja1N0ZXAgPSB0aWNrU3RlcDsKZXhwb3J0cy50cmFuc3Bvc2UgPSB0cmFuc3Bvc2U7CmV4cG9ydHMudmFyaWFuY2UgPSB2YXJpYW5jZTsKZXhwb3J0cy56aXAgPSB6aXA7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOwoKfSkpKTsKCn0se31dLDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewovLyBodHRwczovL2QzanMub3JnL2QzLWF4aXMvIFZlcnNpb24gMS4wLjYuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOgoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6CgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOwp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7Cgp2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7Cgp2YXIgaWRlbnRpdHkgPSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuIHg7Cn07Cgp2YXIgdG9wID0gMTsKdmFyIHJpZ2h0ID0gMjsKdmFyIGJvdHRvbSA9IDM7CnZhciBsZWZ0ID0gNDsKdmFyIGVwc2lsb24gPSAxZS02OwoKZnVuY3Rpb24gdHJhbnNsYXRlWCh4KSB7CiAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHggKyAiLDApIjsKfQoKZnVuY3Rpb24gdHJhbnNsYXRlWSh5KSB7CiAgcmV0dXJuICJ0cmFuc2xhdGUoMCwiICsgeSArICIpIjsKfQoKZnVuY3Rpb24gY2VudGVyKHNjYWxlKSB7CiAgdmFyIG9mZnNldCA9IHNjYWxlLmJhbmR3aWR0aCgpIC8gMjsKICBpZiAoc2NhbGUucm91bmQoKSkgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpOwogIHJldHVybiBmdW5jdGlvbihkKSB7CiAgICByZXR1cm4gc2NhbGUoZCkgKyBvZmZzZXQ7CiAgfTsKfQoKZnVuY3Rpb24gZW50ZXJpbmcoKSB7CiAgcmV0dXJuICF0aGlzLl9fYXhpczsKfQoKZnVuY3Rpb24gYXhpcyhvcmllbnQsIHNjYWxlKSB7CiAgdmFyIHRpY2tBcmd1bWVudHMgPSBbXSwKICAgICAgdGlja1ZhbHVlcyA9IG51bGwsCiAgICAgIHRpY2tGb3JtYXQgPSBudWxsLAogICAgICB0aWNrU2l6ZUlubmVyID0gNiwKICAgICAgdGlja1NpemVPdXRlciA9IDYsCiAgICAgIHRpY2tQYWRkaW5nID0gMywKICAgICAgayA9IG9yaWVudCA9PT0gdG9wIHx8IG9yaWVudCA9PT0gbGVmdCA/IC0xIDogMSwKICAgICAgeCwgeSA9IG9yaWVudCA9PT0gbGVmdCB8fCBvcmllbnQgPT09IHJpZ2h0ID8gKHggPSAieCIsICJ5IikgOiAoeCA9ICJ5IiwgIngiKSwKICAgICAgdHJhbnNmb3JtID0gb3JpZW50ID09PSB0b3AgfHwgb3JpZW50ID09PSBib3R0b20gPyB0cmFuc2xhdGVYIDogdHJhbnNsYXRlWTsKCiAgZnVuY3Rpb24gYXhpcyhjb250ZXh0KSB7CiAgICB2YXIgdmFsdWVzID0gdGlja1ZhbHVlcyA9PSBudWxsID8gKHNjYWxlLnRpY2tzID8gc2NhbGUudGlja3MuYXBwbHkoc2NhbGUsIHRpY2tBcmd1bWVudHMpIDogc2NhbGUuZG9tYWluKCkpIDogdGlja1ZhbHVlcywKICAgICAgICBmb3JtYXQgPSB0aWNrRm9ybWF0ID09IG51bGwgPyAoc2NhbGUudGlja0Zvcm1hdCA/IHNjYWxlLnRpY2tGb3JtYXQuYXBwbHkoc2NhbGUsIHRpY2tBcmd1bWVudHMpIDogaWRlbnRpdHkpIDogdGlja0Zvcm1hdCwKICAgICAgICBzcGFjaW5nID0gTWF0aC5tYXgodGlja1NpemVJbm5lciwgMCkgKyB0aWNrUGFkZGluZywKICAgICAgICByYW5nZSA9IHNjYWxlLnJhbmdlKCksCiAgICAgICAgcmFuZ2UwID0gcmFuZ2VbMF0gKyAwLjUsCiAgICAgICAgcmFuZ2UxID0gcmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gKyAwLjUsCiAgICAgICAgcG9zaXRpb24gPSAoc2NhbGUuYmFuZHdpZHRoID8gY2VudGVyIDogaWRlbnRpdHkpKHNjYWxlLmNvcHkoKSksCiAgICAgICAgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dCwKICAgICAgICBwYXRoID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSwKICAgICAgICB0aWNrID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKHZhbHVlcywgc2NhbGUpLm9yZGVyKCksCiAgICAgICAgdGlja0V4aXQgPSB0aWNrLmV4aXQoKSwKICAgICAgICB0aWNrRW50ZXIgPSB0aWNrLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCAidGljayIpLAogICAgICAgIGxpbmUgPSB0aWNrLnNlbGVjdCgibGluZSIpLAogICAgICAgIHRleHQgPSB0aWNrLnNlbGVjdCgidGV4dCIpOwoKICAgIHBhdGggPSBwYXRoLm1lcmdlKHBhdGguZW50ZXIoKS5pbnNlcnQoInBhdGgiLCAiLnRpY2siKQogICAgICAgIC5hdHRyKCJjbGFzcyIsICJkb21haW4iKQogICAgICAgIC5hdHRyKCJzdHJva2UiLCAiIzAwMCIpKTsKCiAgICB0aWNrID0gdGljay5tZXJnZSh0aWNrRW50ZXIpOwoKICAgIGxpbmUgPSBsaW5lLm1lcmdlKHRpY2tFbnRlci5hcHBlbmQoImxpbmUiKQogICAgICAgIC5hdHRyKCJzdHJva2UiLCAiIzAwMCIpCiAgICAgICAgLmF0dHIoeCArICIyIiwgayAqIHRpY2tTaXplSW5uZXIpCiAgICAgICAgLmF0dHIoeSArICIxIiwgMC41KQogICAgICAgIC5hdHRyKHkgKyAiMiIsIDAuNSkpOwoKICAgIHRleHQgPSB0ZXh0Lm1lcmdlKHRpY2tFbnRlci5hcHBlbmQoInRleHQiKQogICAgICAgIC5hdHRyKCJmaWxsIiwgIiMwMDAiKQogICAgICAgIC5hdHRyKHgsIGsgKiBzcGFjaW5nKQogICAgICAgIC5hdHRyKHksIDAuNSkKICAgICAgICAuYXR0cigiZHkiLCBvcmllbnQgPT09IHRvcCA/ICIwZW0iIDogb3JpZW50ID09PSBib3R0b20gPyAiMC43MWVtIiA6ICIwLjMyZW0iKSk7CgogICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgewogICAgICBwYXRoID0gcGF0aC50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICB0aWNrID0gdGljay50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICBsaW5lID0gbGluZS50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICB0ZXh0ID0gdGV4dC50cmFuc2l0aW9uKGNvbnRleHQpOwoKICAgICAgdGlja0V4aXQgPSB0aWNrRXhpdC50cmFuc2l0aW9uKGNvbnRleHQpCiAgICAgICAgICAuYXR0cigib3BhY2l0eSIsIGVwc2lsb24pCiAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gaXNGaW5pdGUoZCA9IHBvc2l0aW9uKGQpKSA/IHRyYW5zZm9ybShkKSA6IHRoaXMuZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iKTsgfSk7CgogICAgICB0aWNrRW50ZXIKICAgICAgICAgIC5hdHRyKCJvcGFjaXR5IiwgZXBzaWxvbikKICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHZhciBwID0gdGhpcy5wYXJlbnROb2RlLl9fYXhpczsgcmV0dXJuIHRyYW5zZm9ybShwICYmIGlzRmluaXRlKHAgPSBwKGQpKSA/IHAgOiBwb3NpdGlvbihkKSk7IH0pOwogICAgfQoKICAgIHRpY2tFeGl0LnJlbW92ZSgpOwoKICAgIHBhdGgKICAgICAgICAuYXR0cigiZCIsIG9yaWVudCA9PT0gbGVmdCB8fCBvcmllbnQgPT0gcmlnaHQKICAgICAgICAgICAgPyAiTSIgKyBrICogdGlja1NpemVPdXRlciArICIsIiArIHJhbmdlMCArICJIMC41ViIgKyByYW5nZTEgKyAiSCIgKyBrICogdGlja1NpemVPdXRlcgogICAgICAgICAgICA6ICJNIiArIHJhbmdlMCArICIsIiArIGsgKiB0aWNrU2l6ZU91dGVyICsgIlYwLjVIIiArIHJhbmdlMSArICJWIiArIGsgKiB0aWNrU2l6ZU91dGVyKTsKCiAgICB0aWNrCiAgICAgICAgLmF0dHIoIm9wYWNpdHkiLCAxKQogICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHJldHVybiB0cmFuc2Zvcm0ocG9zaXRpb24oZCkpOyB9KTsKCiAgICBsaW5lCiAgICAgICAgLmF0dHIoeCArICIyIiwgayAqIHRpY2tTaXplSW5uZXIpOwoKICAgIHRleHQKICAgICAgICAuYXR0cih4LCBrICogc3BhY2luZykKICAgICAgICAudGV4dChmb3JtYXQpOwoKICAgIHNlbGVjdGlvbi5maWx0ZXIoZW50ZXJpbmcpCiAgICAgICAgLmF0dHIoImZpbGwiLCAibm9uZSIpCiAgICAgICAgLmF0dHIoImZvbnQtc2l6ZSIsIDEwKQogICAgICAgIC5hdHRyKCJmb250LWZhbWlseSIsICJzYW5zLXNlcmlmIikKICAgICAgICAuYXR0cigidGV4dC1hbmNob3IiLCBvcmllbnQgPT09IHJpZ2h0ID8gInN0YXJ0IiA6IG9yaWVudCA9PT0gbGVmdCA/ICJlbmQiIDogIm1pZGRsZSIpOwoKICAgIHNlbGVjdGlvbgogICAgICAgIC5lYWNoKGZ1bmN0aW9uKCkgeyB0aGlzLl9fYXhpcyA9IHBvc2l0aW9uOyB9KTsKICB9CgogIGF4aXMuc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGF4aXMpIDogc2NhbGU7CiAgfTsKCiAgYXhpcy50aWNrcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRpY2tBcmd1bWVudHMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyksIGF4aXM7CiAgfTsKCiAgYXhpcy50aWNrQXJndW1lbnRzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0FyZ3VtZW50cyA9IF8gPT0gbnVsbCA/IFtdIDogc2xpY2UuY2FsbChfKSwgYXhpcykgOiB0aWNrQXJndW1lbnRzLnNsaWNlKCk7CiAgfTsKCiAgYXhpcy50aWNrVmFsdWVzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1ZhbHVlcyA9IF8gPT0gbnVsbCA/IG51bGwgOiBzbGljZS5jYWxsKF8pLCBheGlzKSA6IHRpY2tWYWx1ZXMgJiYgdGlja1ZhbHVlcy5zbGljZSgpOwogIH07CgogIGF4aXMudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tGb3JtYXQgPSBfLCBheGlzKSA6IHRpY2tGb3JtYXQ7CiAgfTsKCiAgYXhpcy50aWNrU2l6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTaXplSW5uZXIgPSB0aWNrU2l6ZU91dGVyID0gK18sIGF4aXMpIDogdGlja1NpemVJbm5lcjsKICB9OwoKICBheGlzLnRpY2tTaXplSW5uZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZUlubmVyID0gK18sIGF4aXMpIDogdGlja1NpemVJbm5lcjsKICB9OwoKICBheGlzLnRpY2tTaXplT3V0ZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZU91dGVyID0gK18sIGF4aXMpIDogdGlja1NpemVPdXRlcjsKICB9OwoKICBheGlzLnRpY2tQYWRkaW5nID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1BhZGRpbmcgPSArXywgYXhpcykgOiB0aWNrUGFkZGluZzsKICB9OwoKICByZXR1cm4gYXhpczsKfQoKZnVuY3Rpb24gYXhpc1RvcChzY2FsZSkgewogIHJldHVybiBheGlzKHRvcCwgc2NhbGUpOwp9CgpmdW5jdGlvbiBheGlzUmlnaHQoc2NhbGUpIHsKICByZXR1cm4gYXhpcyhyaWdodCwgc2NhbGUpOwp9CgpmdW5jdGlvbiBheGlzQm90dG9tKHNjYWxlKSB7CiAgcmV0dXJuIGF4aXMoYm90dG9tLCBzY2FsZSk7Cn0KCmZ1bmN0aW9uIGF4aXNMZWZ0KHNjYWxlKSB7CiAgcmV0dXJuIGF4aXMobGVmdCwgc2NhbGUpOwp9CgpleHBvcnRzLmF4aXNUb3AgPSBheGlzVG9wOwpleHBvcnRzLmF4aXNSaWdodCA9IGF4aXNSaWdodDsKZXhwb3J0cy5heGlzQm90dG9tID0gYXhpc0JvdHRvbTsKZXhwb3J0cy5heGlzTGVmdCA9IGF4aXNMZWZ0OwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsKCn0pKSk7Cgp9LHt9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1jb2xsZWN0aW9uLyBWZXJzaW9uIDEuMC4zLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7Cgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoKCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOgoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsKfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnOwoKdmFyIHByZWZpeCA9ICIkIjsKCmZ1bmN0aW9uIE1hcCgpIHt9CgpNYXAucHJvdG90eXBlID0gbWFwLnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogTWFwLAogIGhhczogZnVuY3Rpb24oa2V5KSB7CiAgICByZXR1cm4gKHByZWZpeCArIGtleSkgaW4gdGhpczsKICB9LAogIGdldDogZnVuY3Rpb24oa2V5KSB7CiAgICByZXR1cm4gdGhpc1twcmVmaXggKyBrZXldOwogIH0sCiAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICB0aGlzW3ByZWZpeCArIGtleV0gPSB2YWx1ZTsKICAgIHJldHVybiB0aGlzOwogIH0sCiAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHsKICAgIHZhciBwcm9wZXJ0eSA9IHByZWZpeCArIGtleTsKICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzICYmIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTsKICB9LAogIGNsZWFyOiBmdW5jdGlvbigpIHsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBkZWxldGUgdGhpc1twcm9wZXJ0eV07CiAgfSwKICBrZXlzOiBmdW5jdGlvbigpIHsKICAgIHZhciBrZXlzID0gW107CiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkga2V5cy5wdXNoKHByb3BlcnR5LnNsaWNlKDEpKTsKICAgIHJldHVybiBrZXlzOwogIH0sCiAgdmFsdWVzOiBmdW5jdGlvbigpIHsKICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSB2YWx1ZXMucHVzaCh0aGlzW3Byb3BlcnR5XSk7CiAgICByZXR1cm4gdmFsdWVzOwogIH0sCiAgZW50cmllczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZW50cmllcyA9IFtdOwogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGVudHJpZXMucHVzaCh7a2V5OiBwcm9wZXJ0eS5zbGljZSgxKSwgdmFsdWU6IHRoaXNbcHJvcGVydHldfSk7CiAgICByZXR1cm4gZW50cmllczsKICB9LAogIHNpemU6IGZ1bmN0aW9uKCkgewogICAgdmFyIHNpemUgPSAwOwogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpICsrc2l6ZTsKICAgIHJldHVybiBzaXplOwogIH0sCiAgZW1wdHk6IGZ1bmN0aW9uKCkgewogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0sCiAgZWFjaDogZnVuY3Rpb24oZikgewogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGYodGhpc1twcm9wZXJ0eV0sIHByb3BlcnR5LnNsaWNlKDEpLCB0aGlzKTsKICB9Cn07CgpmdW5jdGlvbiBtYXAob2JqZWN0LCBmKSB7CiAgdmFyIG1hcCA9IG5ldyBNYXA7CgogIC8vIENvcHkgY29uc3RydWN0b3IuCiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hcCkgb2JqZWN0LmVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkgeyBtYXAuc2V0KGtleSwgdmFsdWUpOyB9KTsKCiAgLy8gSW5kZXggYXJyYXkgYnkgbnVtZXJpYyBpbmRleCBvciBzcGVjaWZpZWQga2V5IGZ1bmN0aW9uLgogIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkgewogICAgdmFyIGkgPSAtMSwKICAgICAgICBuID0gb2JqZWN0Lmxlbmd0aCwKICAgICAgICBvOwoKICAgIGlmIChmID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGksIG9iamVjdFtpXSk7CiAgICBlbHNlIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGYobyA9IG9iamVjdFtpXSwgaSwgb2JqZWN0KSwgbyk7CiAgfQoKICAvLyBDb252ZXJ0IG9iamVjdCB0byBtYXAuCiAgZWxzZSBpZiAob2JqZWN0KSBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBtYXAuc2V0KGtleSwgb2JqZWN0W2tleV0pOwoKICByZXR1cm4gbWFwOwp9Cgp2YXIgbmVzdCA9IGZ1bmN0aW9uKCkgewogIHZhciBrZXlzID0gW10sCiAgICAgIHNvcnRLZXlzID0gW10sCiAgICAgIHNvcnRWYWx1ZXMsCiAgICAgIHJvbGx1cCwKICAgICAgbmVzdDsKCiAgZnVuY3Rpb24gYXBwbHkoYXJyYXksIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkgewogICAgaWYgKGRlcHRoID49IGtleXMubGVuZ3RoKSByZXR1cm4gcm9sbHVwICE9IG51bGwKICAgICAgICA/IHJvbGx1cChhcnJheSkgOiAoc29ydFZhbHVlcyAhPSBudWxsCiAgICAgICAgPyBhcnJheS5zb3J0KHNvcnRWYWx1ZXMpCiAgICAgICAgOiBhcnJheSk7CgogICAgdmFyIGkgPSAtMSwKICAgICAgICBuID0gYXJyYXkubGVuZ3RoLAogICAgICAgIGtleSA9IGtleXNbZGVwdGgrK10sCiAgICAgICAga2V5VmFsdWUsCiAgICAgICAgdmFsdWUsCiAgICAgICAgdmFsdWVzQnlLZXkgPSBtYXAoKSwKICAgICAgICB2YWx1ZXMsCiAgICAgICAgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KCk7CgogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgaWYgKHZhbHVlcyA9IHZhbHVlc0J5S2V5LmdldChrZXlWYWx1ZSA9IGtleSh2YWx1ZSA9IGFycmF5W2ldKSArICIiKSkgewogICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZXNCeUtleS5zZXQoa2V5VmFsdWUsIFt2YWx1ZV0pOwogICAgICB9CiAgICB9CgogICAgdmFsdWVzQnlLZXkuZWFjaChmdW5jdGlvbih2YWx1ZXMsIGtleSkgewogICAgICBzZXRSZXN1bHQocmVzdWx0LCBrZXksIGFwcGx5KHZhbHVlcywgZGVwdGgsIGNyZWF0ZVJlc3VsdCwgc2V0UmVzdWx0KSk7CiAgICB9KTsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gZW50cmllcyhtYXAkJDEsIGRlcHRoKSB7CiAgICBpZiAoKytkZXB0aCA+IGtleXMubGVuZ3RoKSByZXR1cm4gbWFwJCQxOwogICAgdmFyIGFycmF5LCBzb3J0S2V5ID0gc29ydEtleXNbZGVwdGggLSAxXTsKICAgIGlmIChyb2xsdXAgIT0gbnVsbCAmJiBkZXB0aCA+PSBrZXlzLmxlbmd0aCkgYXJyYXkgPSBtYXAkJDEuZW50cmllcygpOwogICAgZWxzZSBhcnJheSA9IFtdLCBtYXAkJDEuZWFjaChmdW5jdGlvbih2LCBrKSB7IGFycmF5LnB1c2goe2tleTogaywgdmFsdWVzOiBlbnRyaWVzKHYsIGRlcHRoKX0pOyB9KTsKICAgIHJldHVybiBzb3J0S2V5ICE9IG51bGwgPyBhcnJheS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHNvcnRLZXkoYS5rZXksIGIua2V5KTsgfSkgOiBhcnJheTsKICB9CgogIHJldHVybiBuZXN0ID0gewogICAgb2JqZWN0OiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU9iamVjdCwgc2V0T2JqZWN0KTsgfSwKICAgIG1hcDogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGFwcGx5KGFycmF5LCAwLCBjcmVhdGVNYXAsIHNldE1hcCk7IH0sCiAgICBlbnRyaWVzOiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gZW50cmllcyhhcHBseShhcnJheSwgMCwgY3JlYXRlTWFwLCBzZXRNYXApLCAwKTsgfSwKICAgIGtleTogZnVuY3Rpb24oZCkgeyBrZXlzLnB1c2goZCk7IHJldHVybiBuZXN0OyB9LAogICAgc29ydEtleXM6IGZ1bmN0aW9uKG9yZGVyKSB7IHNvcnRLZXlzW2tleXMubGVuZ3RoIC0gMV0gPSBvcmRlcjsgcmV0dXJuIG5lc3Q7IH0sCiAgICBzb3J0VmFsdWVzOiBmdW5jdGlvbihvcmRlcikgeyBzb3J0VmFsdWVzID0gb3JkZXI7IHJldHVybiBuZXN0OyB9LAogICAgcm9sbHVwOiBmdW5jdGlvbihmKSB7IHJvbGx1cCA9IGY7IHJldHVybiBuZXN0OyB9CiAgfTsKfTsKCmZ1bmN0aW9uIGNyZWF0ZU9iamVjdCgpIHsKICByZXR1cm4ge307Cn0KCmZ1bmN0aW9uIHNldE9iamVjdChvYmplY3QsIGtleSwgdmFsdWUpIHsKICBvYmplY3Rba2V5XSA9IHZhbHVlOwp9CgpmdW5jdGlvbiBjcmVhdGVNYXAoKSB7CiAgcmV0dXJuIG1hcCgpOwp9CgpmdW5jdGlvbiBzZXRNYXAobWFwJCQxLCBrZXksIHZhbHVlKSB7CiAgbWFwJCQxLnNldChrZXksIHZhbHVlKTsKfQoKZnVuY3Rpb24gU2V0KCkge30KCnZhciBwcm90byA9IG1hcC5wcm90b3R5cGU7CgpTZXQucHJvdG90eXBlID0gc2V0LnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogU2V0LAogIGhhczogcHJvdG8uaGFzLAogIGFkZDogZnVuY3Rpb24odmFsdWUpIHsKICAgIHZhbHVlICs9ICIiOwogICAgdGhpc1twcmVmaXggKyB2YWx1ZV0gPSB2YWx1ZTsKICAgIHJldHVybiB0aGlzOwogIH0sCiAgcmVtb3ZlOiBwcm90by5yZW1vdmUsCiAgY2xlYXI6IHByb3RvLmNsZWFyLAogIHZhbHVlczogcHJvdG8ua2V5cywKICBzaXplOiBwcm90by5zaXplLAogIGVtcHR5OiBwcm90by5lbXB0eSwKICBlYWNoOiBwcm90by5lYWNoCn07CgpmdW5jdGlvbiBzZXQob2JqZWN0LCBmKSB7CiAgdmFyIHNldCA9IG5ldyBTZXQ7CgogIC8vIENvcHkgY29uc3RydWN0b3IuCiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNldCkgb2JqZWN0LmVhY2goZnVuY3Rpb24odmFsdWUpIHsgc2V0LmFkZCh2YWx1ZSk7IH0pOwoKICAvLyBPdGhlcndpc2UsIGFzc3VtZSBpdOKAmXMgYW4gYXJyYXkuCiAgZWxzZSBpZiAob2JqZWN0KSB7CiAgICB2YXIgaSA9IC0xLCBuID0gb2JqZWN0Lmxlbmd0aDsKICAgIGlmIChmID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBzZXQuYWRkKG9iamVjdFtpXSk7CiAgICBlbHNlIHdoaWxlICgrK2kgPCBuKSBzZXQuYWRkKGYob2JqZWN0W2ldLCBpLCBvYmplY3QpKTsKICB9CgogIHJldHVybiBzZXQ7Cn0KCnZhciBrZXlzID0gZnVuY3Rpb24obWFwKSB7CiAgdmFyIGtleXMgPSBbXTsKICBmb3IgKHZhciBrZXkgaW4gbWFwKSBrZXlzLnB1c2goa2V5KTsKICByZXR1cm4ga2V5czsKfTsKCnZhciB2YWx1ZXMgPSBmdW5jdGlvbihtYXApIHsKICB2YXIgdmFsdWVzID0gW107CiAgZm9yICh2YXIga2V5IGluIG1hcCkgdmFsdWVzLnB1c2gobWFwW2tleV0pOwogIHJldHVybiB2YWx1ZXM7Cn07Cgp2YXIgZW50cmllcyA9IGZ1bmN0aW9uKG1hcCkgewogIHZhciBlbnRyaWVzID0gW107CiAgZm9yICh2YXIga2V5IGluIG1hcCkgZW50cmllcy5wdXNoKHtrZXk6IGtleSwgdmFsdWU6IG1hcFtrZXldfSk7CiAgcmV0dXJuIGVudHJpZXM7Cn07CgpleHBvcnRzLm5lc3QgPSBuZXN0OwpleHBvcnRzLnNldCA9IHNldDsKZXhwb3J0cy5tYXAgPSBtYXA7CmV4cG9ydHMua2V5cyA9IGtleXM7CmV4cG9ydHMudmFsdWVzID0gdmFsdWVzOwpleHBvcnRzLmVudHJpZXMgPSBlbnRyaWVzOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsKCn0pKSk7Cgp9LHt9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1jb2xvci8gVmVyc2lvbiAxLjAuMy4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLgooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgewoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6Cgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDoKCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7Cn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsKCnZhciBkZWZpbmUgPSBmdW5jdGlvbihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7CiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7CiAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7Cn07CgpmdW5jdGlvbiBleHRlbmQocGFyZW50LCBkZWZpbml0aW9uKSB7CiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7CiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldOwogIHJldHVybiBwcm90b3R5cGU7Cn0KCmZ1bmN0aW9uIENvbG9yKCkge30KCnZhciBkYXJrZXIgPSAwLjc7CnZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7Cgp2YXIgcmVJID0gIlxccyooWystXT9cXGQrKVxccyoiOwp2YXIgcmVOID0gIlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiI7CnZhciByZVAgPSAiXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiI7CnZhciByZUhleDMgPSAvXiMoWzAtOWEtZl17M30pJC87CnZhciByZUhleDYgPSAvXiMoWzAtOWEtZl17Nn0pJC87CnZhciByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKCJecmdiXFwoIiArIFtyZUksIHJlSSwgcmVJXSArICJcXCkkIik7CnZhciByZVJnYlBlcmNlbnQgPSBuZXcgUmVnRXhwKCJecmdiXFwoIiArIFtyZVAsIHJlUCwgcmVQXSArICJcXCkkIik7CnZhciByZVJnYmFJbnRlZ2VyID0gbmV3IFJlZ0V4cCgiXnJnYmFcXCgiICsgW3JlSSwgcmVJLCByZUksIHJlTl0gKyAiXFwpJCIpOwp2YXIgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5yZ2JhXFwoIiArIFtyZVAsIHJlUCwgcmVQLCByZU5dICsgIlxcKSQiKTsKdmFyIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5oc2xcXCgiICsgW3JlTiwgcmVQLCByZVBdICsgIlxcKSQiKTsKdmFyIHJlSHNsYVBlcmNlbnQgPSBuZXcgUmVnRXhwKCJeaHNsYVxcKCIgKyBbcmVOLCByZVAsIHJlUCwgcmVOXSArICJcXCkkIik7Cgp2YXIgbmFtZWQgPSB7CiAgYWxpY2VibHVlOiAweGYwZjhmZiwKICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LAogIGFxdWE6IDB4MDBmZmZmLAogIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LAogIGF6dXJlOiAweGYwZmZmZiwKICBiZWlnZTogMHhmNWY1ZGMsCiAgYmlzcXVlOiAweGZmZTRjNCwKICBibGFjazogMHgwMDAwMDAsCiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLAogIGJsdWU6IDB4MDAwMGZmLAogIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLAogIGJyb3duOiAweGE1MmEyYSwKICBidXJseXdvb2Q6IDB4ZGViODg3LAogIGNhZGV0Ymx1ZTogMHg1ZjllYTAsCiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsCiAgY2hvY29sYXRlOiAweGQyNjkxZSwKICBjb3JhbDogMHhmZjdmNTAsCiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLAogIGNvcm5zaWxrOiAweGZmZjhkYywKICBjcmltc29uOiAweGRjMTQzYywKICBjeWFuOiAweDAwZmZmZiwKICBkYXJrYmx1ZTogMHgwMDAwOGIsCiAgZGFya2N5YW46IDB4MDA4YjhiLAogIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLAogIGRhcmtncmF5OiAweGE5YTlhOSwKICBkYXJrZ3JlZW46IDB4MDA2NDAwLAogIGRhcmtncmV5OiAweGE5YTlhOSwKICBkYXJra2hha2k6IDB4YmRiNzZiLAogIGRhcmttYWdlbnRhOiAweDhiMDA4YiwKICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsCiAgZGFya29yYW5nZTogMHhmZjhjMDAsCiAgZGFya29yY2hpZDogMHg5OTMyY2MsCiAgZGFya3JlZDogMHg4YjAwMDAsCiAgZGFya3NhbG1vbjogMHhlOTk2N2EsCiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwKICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YiwKICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZiwKICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwKICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSwKICBkYXJrdmlvbGV0OiAweDk0MDBkMywKICBkZWVwcGluazogMHhmZjE0OTMsCiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLAogIGRpbWdyYXk6IDB4Njk2OTY5LAogIGRpbWdyZXk6IDB4Njk2OTY5LAogIGRvZGdlcmJsdWU6IDB4MWU5MGZmLAogIGZpcmVicmljazogMHhiMjIyMjIsCiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLAogIGZvcmVzdGdyZWVuOiAweDIyOGIyMiwKICBmdWNoc2lhOiAweGZmMDBmZiwKICBnYWluc2Jvcm86IDB4ZGNkY2RjLAogIGdob3N0d2hpdGU6IDB4ZjhmOGZmLAogIGdvbGQ6IDB4ZmZkNzAwLAogIGdvbGRlbnJvZDogMHhkYWE1MjAsCiAgZ3JheTogMHg4MDgwODAsCiAgZ3JlZW46IDB4MDA4MDAwLAogIGdyZWVueWVsbG93OiAweGFkZmYyZiwKICBncmV5OiAweDgwODA4MCwKICBob25leWRldzogMHhmMGZmZjAsCiAgaG90cGluazogMHhmZjY5YjQsCiAgaW5kaWFucmVkOiAweGNkNWM1YywKICBpbmRpZ286IDB4NGIwMDgyLAogIGl2b3J5OiAweGZmZmZmMCwKICBraGFraTogMHhmMGU2OGMsCiAgbGF2ZW5kZXI6IDB4ZTZlNmZhLAogIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LAogIGxhd25ncmVlbjogMHg3Y2ZjMDAsCiAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCwKICBsaWdodGJsdWU6IDB4YWRkOGU2LAogIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLAogIGxpZ2h0Y3lhbjogMHhlMGZmZmYsCiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLAogIGxpZ2h0Z3JheTogMHhkM2QzZDMsCiAgbGlnaHRncmVlbjogMHg5MGVlOTAsCiAgbGlnaHRncmV5OiAweGQzZDNkMywKICBsaWdodHBpbms6IDB4ZmZiNmMxLAogIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSwKICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwKICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLAogIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSwKICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksCiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLAogIGxpZ2h0eWVsbG93OiAweGZmZmZlMCwKICBsaW1lOiAweDAwZmYwMCwKICBsaW1lZ3JlZW46IDB4MzJjZDMyLAogIGxpbmVuOiAweGZhZjBlNiwKICBtYWdlbnRhOiAweGZmMDBmZiwKICBtYXJvb246IDB4ODAwMDAwLAogIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLAogIG1lZGl1bWJsdWU6IDB4MDAwMGNkLAogIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsCiAgbWVkaXVtcHVycGxlOiAweDkzNzBkYiwKICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsCiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSwKICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsCiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywKICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LAogIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsCiAgbWludGNyZWFtOiAweGY1ZmZmYSwKICBtaXN0eXJvc2U6IDB4ZmZlNGUxLAogIG1vY2Nhc2luOiAweGZmZTRiNSwKICBuYXZham93aGl0ZTogMHhmZmRlYWQsCiAgbmF2eTogMHgwMDAwODAsCiAgb2xkbGFjZTogMHhmZGY1ZTYsCiAgb2xpdmU6IDB4ODA4MDAwLAogIG9saXZlZHJhYjogMHg2YjhlMjMsCiAgb3JhbmdlOiAweGZmYTUwMCwKICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLAogIG9yY2hpZDogMHhkYTcwZDYsCiAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsCiAgcGFsZWdyZWVuOiAweDk4ZmI5OCwKICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSwKICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MywKICBwYXBheWF3aGlwOiAweGZmZWZkNSwKICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LAogIHBlcnU6IDB4Y2Q4NTNmLAogIHBpbms6IDB4ZmZjMGNiLAogIHBsdW06IDB4ZGRhMGRkLAogIHBvd2RlcmJsdWU6IDB4YjBlMGU2LAogIHB1cnBsZTogMHg4MDAwODAsCiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksCiAgcmVkOiAweGZmMDAwMCwKICByb3N5YnJvd246IDB4YmM4ZjhmLAogIHJveWFsYmx1ZTogMHg0MTY5ZTEsCiAgc2FkZGxlYnJvd246IDB4OGI0NTEzLAogIHNhbG1vbjogMHhmYTgwNzIsCiAgc2FuZHlicm93bjogMHhmNGE0NjAsCiAgc2VhZ3JlZW46IDB4MmU4YjU3LAogIHNlYXNoZWxsOiAweGZmZjVlZSwKICBzaWVubmE6IDB4YTA1MjJkLAogIHNpbHZlcjogMHhjMGMwYzAsCiAgc2t5Ymx1ZTogMHg4N2NlZWIsCiAgc2xhdGVibHVlOiAweDZhNWFjZCwKICBzbGF0ZWdyYXk6IDB4NzA4MDkwLAogIHNsYXRlZ3JleTogMHg3MDgwOTAsCiAgc25vdzogMHhmZmZhZmEsCiAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLAogIHN0ZWVsYmx1ZTogMHg0NjgyYjQsCiAgdGFuOiAweGQyYjQ4YywKICB0ZWFsOiAweDAwODA4MCwKICB0aGlzdGxlOiAweGQ4YmZkOCwKICB0b21hdG86IDB4ZmY2MzQ3LAogIHR1cnF1b2lzZTogMHg0MGUwZDAsCiAgdmlvbGV0OiAweGVlODJlZSwKICB3aGVhdDogMHhmNWRlYjMsCiAgd2hpdGU6IDB4ZmZmZmZmLAogIHdoaXRlc21va2U6IDB4ZjVmNWY1LAogIHllbGxvdzogMHhmZmZmMDAsCiAgeWVsbG93Z3JlZW46IDB4OWFjZDMyCn07CgpkZWZpbmUoQ29sb3IsIGNvbG9yLCB7CiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTsKICB9LAogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnJnYigpICsgIiI7CiAgfQp9KTsKCmZ1bmN0aW9uIGNvbG9yKGZvcm1hdCkgewogIHZhciBtOwogIGZvcm1hdCA9IChmb3JtYXQgKyAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgcmV0dXJuIChtID0gcmVIZXgzLmV4ZWMoZm9ybWF0KSkgPyAobSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweDBmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkpIC8vICNmMDAKICAgICAgOiAobSA9IHJlSGV4Ni5leGVjKGZvcm1hdCkpID8gcmdibihwYXJzZUludChtWzFdLCAxNikpIC8vICNmZjAwMDAKICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKQogICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpCiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQogICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKQogICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKQogICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpCiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkKICAgICAgOiBmb3JtYXQgPT09ICJ0cmFuc3BhcmVudCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApCiAgICAgIDogbnVsbDsKfQoKZnVuY3Rpb24gcmdibihuKSB7CiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTsKfQoKZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7CiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOOwogIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpOwp9CgpmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHsKICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7CiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjsKICBvID0gby5yZ2IoKTsKICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpOwp9CgpmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwp9CgpmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkgewogIHRoaXMuciA9ICtyOwogIHRoaXMuZyA9ICtnOwogIHRoaXMuYiA9ICtiOwogIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5Owp9CgpkZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwgewogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7CiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsKICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7CiAgfSwKICByZ2I6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSwKICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gKDAgPD0gdGhpcy5yICYmIHRoaXMuciA8PSAyNTUpCiAgICAgICAgJiYgKDAgPD0gdGhpcy5nICYmIHRoaXMuZyA8PSAyNTUpCiAgICAgICAgJiYgKDAgPD0gdGhpcy5iICYmIHRoaXMuYiA8PSAyNTUpCiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTsKICB9LAogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpOwogICAgcmV0dXJuIChhID09PSAxID8gInJnYigiIDogInJnYmEoIikKICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArICIsICIKICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmcpIHx8IDApKSArICIsICIKICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmIpIHx8IDApKQogICAgICAgICsgKGEgPT09IDEgPyAiKSIgOiAiLCAiICsgYSArICIpIik7CiAgfQp9KSk7CgpmdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHsKICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47CiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47CiAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOOwogIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpOwp9CgpmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHsKICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7CiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDsKICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG87CiAgbyA9IG8ucmdiKCk7CiAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgIGcgPSBvLmcgLyAyNTUsCiAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLAogICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwKICAgICAgaCA9IE5hTiwKICAgICAgcyA9IG1heCAtIG1pbiwKICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsKICBpZiAocykgewogICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7CiAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7CiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7CiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluOwogICAgaCAqPSA2MDsKICB9IGVsc2UgewogICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7CiAgfQogIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7Cn0KCmZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7CiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xDb252ZXJ0KGgpIDogbmV3IEhzbChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7Cn0KCmZ1bmN0aW9uIEhzbChoLCBzLCBsLCBvcGFjaXR5KSB7CiAgdGhpcy5oID0gK2g7CiAgdGhpcy5zID0gK3M7CiAgdGhpcy5sID0gK2w7CiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7Cn0KCmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7CiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTsKICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsKICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgcmdiOiBmdW5jdGlvbigpIHsKICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLAogICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucywKICAgICAgICBsID0gdGhpcy5sLAogICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsCiAgICAgICAgbTEgPSAyICogbCAtIG0yOwogICAgcmV0dXJuIG5ldyBSZ2IoCiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSwKICAgICAgaHNsMnJnYihoLCBtMSwgbTIpLAogICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSwKICAgICAgdGhpcy5vcGFjaXR5CiAgICApOwogIH0sCiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKQogICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSkKICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOwogIH0KfSkpOwoKLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqLwpmdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikgewogIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjAKICAgICAgOiBoIDwgMTgwID8gbTIKICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MAogICAgICA6IG0xKSAqIDI1NTsKfQoKdmFyIGRlZzJyYWQgPSBNYXRoLlBJIC8gMTgwOwp2YXIgcmFkMmRlZyA9IDE4MCAvIE1hdGguUEk7Cgp2YXIgS24gPSAxODsKdmFyIFhuID0gMC45NTA0NzA7CnZhciBZbiA9IDE7CnZhciBabiA9IDEuMDg4ODMwOwp2YXIgdDAgPSA0IC8gMjk7CnZhciB0MSA9IDYgLyAyOTsKdmFyIHQyID0gMyAqIHQxICogdDE7CnZhciB0MyA9IHQxICogdDEgKiB0MTsKCmZ1bmN0aW9uIGxhYkNvbnZlcnQobykgewogIGlmIChvIGluc3RhbmNlb2YgTGFiKSByZXR1cm4gbmV3IExhYihvLmwsIG8uYSwgby5iLCBvLm9wYWNpdHkpOwogIGlmIChvIGluc3RhbmNlb2YgSGNsKSB7CiAgICB2YXIgaCA9IG8uaCAqIGRlZzJyYWQ7CiAgICByZXR1cm4gbmV3IExhYihvLmwsIE1hdGguY29zKGgpICogby5jLCBNYXRoLnNpbihoKSAqIG8uYywgby5vcGFjaXR5KTsKICB9CiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pOwogIHZhciBiID0gcmdiMnh5eihvLnIpLAogICAgICBhID0gcmdiMnh5eihvLmcpLAogICAgICBsID0gcmdiMnh5eihvLmIpLAogICAgICB4ID0geHl6MmxhYigoMC40MTI0NTY0ICogYiArIDAuMzU3NTc2MSAqIGEgKyAwLjE4MDQzNzUgKiBsKSAvIFhuKSwKICAgICAgeSA9IHh5ejJsYWIoKDAuMjEyNjcyOSAqIGIgKyAwLjcxNTE1MjIgKiBhICsgMC4wNzIxNzUwICogbCkgLyBZbiksCiAgICAgIHogPSB4eXoybGFiKCgwLjAxOTMzMzkgKiBiICsgMC4xMTkxOTIwICogYSArIDAuOTUwMzA0MSAqIGwpIC8gWm4pOwogIHJldHVybiBuZXcgTGFiKDExNiAqIHkgLSAxNiwgNTAwICogKHggLSB5KSwgMjAwICogKHkgLSB6KSwgby5vcGFjaXR5KTsKfQoKZnVuY3Rpb24gbGFiKGwsIGEsIGIsIG9wYWNpdHkpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGxhYkNvbnZlcnQobCkgOiBuZXcgTGFiKGwsIGEsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKfQoKZnVuY3Rpb24gTGFiKGwsIGEsIGIsIG9wYWNpdHkpIHsKICB0aGlzLmwgPSArbDsKICB0aGlzLmEgPSArYTsKICB0aGlzLmIgPSArYjsKICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKfQoKZGVmaW5lKExhYiwgbGFiLCBleHRlbmQoQ29sb3IsIHsKICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sICsgS24gKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsKICB9LAogIGRhcmtlcjogZnVuY3Rpb24oaykgewogICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sIC0gS24gKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsKICB9LAogIHJnYjogZnVuY3Rpb24oKSB7CiAgICB2YXIgeSA9ICh0aGlzLmwgKyAxNikgLyAxMTYsCiAgICAgICAgeCA9IGlzTmFOKHRoaXMuYSkgPyB5IDogeSArIHRoaXMuYSAvIDUwMCwKICAgICAgICB6ID0gaXNOYU4odGhpcy5iKSA/IHkgOiB5IC0gdGhpcy5iIC8gMjAwOwogICAgeSA9IFluICogbGFiMnh5eih5KTsKICAgIHggPSBYbiAqIGxhYjJ4eXooeCk7CiAgICB6ID0gWm4gKiBsYWIyeHl6KHopOwogICAgcmV0dXJuIG5ldyBSZ2IoCiAgICAgIHh5ejJyZ2IoIDMuMjQwNDU0MiAqIHggLSAxLjUzNzEzODUgKiB5IC0gMC40OTg1MzE0ICogeiksIC8vIEQ2NSAtPiBzUkdCCiAgICAgIHh5ejJyZ2IoLTAuOTY5MjY2MCAqIHggKyAxLjg3NjAxMDggKiB5ICsgMC4wNDE1NTYwICogeiksCiAgICAgIHh5ejJyZ2IoIDAuMDU1NjQzNCAqIHggLSAwLjIwNDAyNTkgKiB5ICsgMS4wNTcyMjUyICogeiksCiAgICAgIHRoaXMub3BhY2l0eQogICAgKTsKICB9Cn0pKTsKCmZ1bmN0aW9uIHh5ejJsYWIodCkgewogIHJldHVybiB0ID4gdDMgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDsKfQoKZnVuY3Rpb24gbGFiMnh5eih0KSB7CiAgcmV0dXJuIHQgPiB0MSA/IHQgKiB0ICogdCA6IHQyICogKHQgLSB0MCk7Cn0KCmZ1bmN0aW9uIHh5ejJyZ2IoeCkgewogIHJldHVybiAyNTUgKiAoeCA8PSAwLjAwMzEzMDggPyAxMi45MiAqIHggOiAxLjA1NSAqIE1hdGgucG93KHgsIDEgLyAyLjQpIC0gMC4wNTUpOwp9CgpmdW5jdGlvbiByZ2IyeHl6KHgpIHsKICByZXR1cm4gKHggLz0gMjU1KSA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTsKfQoKZnVuY3Rpb24gaGNsQ29udmVydChvKSB7CiAgaWYgKG8gaW5zdGFuY2VvZiBIY2wpIHJldHVybiBuZXcgSGNsKG8uaCwgby5jLCBvLmwsIG8ub3BhY2l0eSk7CiAgaWYgKCEobyBpbnN0YW5jZW9mIExhYikpIG8gPSBsYWJDb252ZXJ0KG8pOwogIHZhciBoID0gTWF0aC5hdGFuMihvLmIsIG8uYSkgKiByYWQyZGVnOwogIHJldHVybiBuZXcgSGNsKGggPCAwID8gaCArIDM2MCA6IGgsIE1hdGguc3FydChvLmEgKiBvLmEgKyBvLmIgKiBvLmIpLCBvLmwsIG8ub3BhY2l0eSk7Cn0KCmZ1bmN0aW9uIGhjbChoLCBjLCBsLCBvcGFjaXR5KSB7CiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoY2xDb252ZXJ0KGgpIDogbmV3IEhjbChoLCBjLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7Cn0KCmZ1bmN0aW9uIEhjbChoLCBjLCBsLCBvcGFjaXR5KSB7CiAgdGhpcy5oID0gK2g7CiAgdGhpcy5jID0gK2M7CiAgdGhpcy5sID0gK2w7CiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7Cn0KCmRlZmluZShIY2wsIGhjbCwgZXh0ZW5kKENvbG9yLCB7CiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7CiAgfSwKICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsKICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgLSBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7CiAgfSwKICByZ2I6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGxhYkNvbnZlcnQodGhpcykucmdiKCk7CiAgfQp9KSk7Cgp2YXIgQSA9IC0wLjE0ODYxOwp2YXIgQiA9ICsxLjc4Mjc3Owp2YXIgQyA9IC0wLjI5MjI3Owp2YXIgRCA9IC0wLjkwNjQ5Owp2YXIgRSA9ICsxLjk3Mjk0Owp2YXIgRUQgPSBFICogRDsKdmFyIEVCID0gRSAqIEI7CnZhciBCQ19EQSA9IEIgKiBDIC0gRCAqIEE7CgpmdW5jdGlvbiBjdWJlaGVsaXhDb252ZXJ0KG8pIHsKICBpZiAobyBpbnN0YW5jZW9mIEN1YmVoZWxpeCkgcmV0dXJuIG5ldyBDdWJlaGVsaXgoby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICBpZiAoIShvIGluc3RhbmNlb2YgUmdiKSkgbyA9IHJnYkNvbnZlcnQobyk7CiAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgIGcgPSBvLmcgLyAyNTUsCiAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgIGwgPSAoQkNfREEgKiBiICsgRUQgKiByIC0gRUIgKiBnKSAvIChCQ19EQSArIEVEIC0gRUIpLAogICAgICBibCA9IGIgLSBsLAogICAgICBrID0gKEUgKiAoZyAtIGwpIC0gQyAqIGJsKSAvIEQsCiAgICAgIHMgPSBNYXRoLnNxcnQoayAqIGsgKyBibCAqIGJsKSAvIChFICogbCAqICgxIC0gbCkpLCAvLyBOYU4gaWYgbD0wIG9yIGw9MQogICAgICBoID0gcyA/IE1hdGguYXRhbjIoaywgYmwpICogcmFkMmRlZyAtIDEyMCA6IE5hTjsKICByZXR1cm4gbmV3IEN1YmVoZWxpeChoIDwgMCA/IGggKyAzNjAgOiBoLCBzLCBsLCBvLm9wYWNpdHkpOwp9CgpmdW5jdGlvbiBjdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY3ViZWhlbGl4Q29udmVydChoKSA6IG5ldyBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwp9CgpmdW5jdGlvbiBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkgewogIHRoaXMuaCA9ICtoOwogIHRoaXMucyA9ICtzOwogIHRoaXMubCA9ICtsOwogIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5Owp9CgpkZWZpbmUoQ3ViZWhlbGl4LCBjdWJlaGVsaXgsIGV4dGVuZChDb2xvciwgewogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7CiAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICB9LAogIGRhcmtlcjogZnVuY3Rpb24oaykgewogICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7CiAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICB9LAogIHJnYjogZnVuY3Rpb24oKSB7CiAgICB2YXIgaCA9IGlzTmFOKHRoaXMuaCkgPyAwIDogKHRoaXMuaCArIDEyMCkgKiBkZWcycmFkLAogICAgICAgIGwgPSArdGhpcy5sLAogICAgICAgIGEgPSBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucyAqIGwgKiAoMSAtIGwpLAogICAgICAgIGNvc2ggPSBNYXRoLmNvcyhoKSwKICAgICAgICBzaW5oID0gTWF0aC5zaW4oaCk7CiAgICByZXR1cm4gbmV3IFJnYigKICAgICAgMjU1ICogKGwgKyBhICogKEEgKiBjb3NoICsgQiAqIHNpbmgpKSwKICAgICAgMjU1ICogKGwgKyBhICogKEMgKiBjb3NoICsgRCAqIHNpbmgpKSwKICAgICAgMjU1ICogKGwgKyBhICogKEUgKiBjb3NoKSksCiAgICAgIHRoaXMub3BhY2l0eQogICAgKTsKICB9Cn0pKTsKCmV4cG9ydHMuY29sb3IgPSBjb2xvcjsKZXhwb3J0cy5yZ2IgPSByZ2I7CmV4cG9ydHMuaHNsID0gaHNsOwpleHBvcnRzLmxhYiA9IGxhYjsKZXhwb3J0cy5oY2wgPSBoY2w7CmV4cG9ydHMuY3ViZWhlbGl4ID0gY3ViZWhlbGl4OwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsKCn0pKSk7Cgp9LHt9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1mb3JtYXQvIFZlcnNpb24gMS4yLjAuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOgoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6CgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOwp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7CgovLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoCi8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLgovLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbCgxLjIzKSByZXR1cm5zIFsiMTIzIiwgMF0uCnZhciBmb3JtYXREZWNpbWFsID0gZnVuY3Rpb24oeCwgcCkgewogIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHkKICB2YXIgaSwgY29lZmZpY2llbnQgPSB4LnNsaWNlKDAsIGkpOwoKICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRvRXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcZFwuXGQrZVstK11cZCsKICAvLyAoZS5nLiwgMS4yZSszKSBvciB0aGUgZm9ybSBcZGVbLStdXGQrIChlLmcuLCAxZSszKS4KICByZXR1cm4gWwogICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2llbnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCwKICAgICt4LnNsaWNlKGkgKyAxKQogIF07Cn07Cgp2YXIgZXhwb25lbnQgPSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuIHggPSBmb3JtYXREZWNpbWFsKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47Cn07Cgp2YXIgZm9ybWF0R3JvdXAgPSBmdW5jdGlvbihncm91cGluZywgdGhvdXNhbmRzKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkgewogICAgdmFyIGkgPSB2YWx1ZS5sZW5ndGgsCiAgICAgICAgdCA9IFtdLAogICAgICAgIGogPSAwLAogICAgICAgIGcgPSBncm91cGluZ1swXSwKICAgICAgICBsZW5ndGggPSAwOwoKICAgIHdoaWxlIChpID4gMCAmJiBnID4gMCkgewogICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTsKICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7CiAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhazsKICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTsKICAgIH0KCiAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpOwogIH07Cn07Cgp2YXIgZm9ybWF0TnVtZXJhbHMgPSBmdW5jdGlvbihudW1lcmFscykgewogIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1swLTldL2csIGZ1bmN0aW9uKGkpIHsKICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTsKICAgIH0pOwogIH07Cn07Cgp2YXIgZm9ybWF0RGVmYXVsdCA9IGZ1bmN0aW9uKHgsIHApIHsKICB4ID0geC50b1ByZWNpc2lvbihwKTsKCiAgb3V0OiBmb3IgKHZhciBuID0geC5sZW5ndGgsIGkgPSAxLCBpMCA9IC0xLCBpMTsgaSA8IG47ICsraSkgewogICAgc3dpdGNoICh4W2ldKSB7CiAgICAgIGNhc2UgIi4iOiBpMCA9IGkxID0gaTsgYnJlYWs7CiAgICAgIGNhc2UgIjAiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhazsKICAgICAgY2FzZSAiZSI6IGJyZWFrIG91dDsKICAgICAgZGVmYXVsdDogaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhazsKICAgIH0KICB9CgogIHJldHVybiBpMCA+IDAgPyB4LnNsaWNlKDAsIGkwKSArIHguc2xpY2UoaTEgKyAxKSA6IHg7Cn07Cgp2YXIgcHJlZml4RXhwb25lbnQ7Cgp2YXIgZm9ybWF0UHJlZml4QXV0byA9IGZ1bmN0aW9uKHgsIHApIHsKICB2YXIgZCA9IGZvcm1hdERlY2ltYWwoeCwgcCk7CiAgaWYgKCFkKSByZXR1cm4geCArICIiOwogIHZhciBjb2VmZmljaWVudCA9IGRbMF0sCiAgICAgIGV4cG9uZW50ID0gZFsxXSwKICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLAogICAgICBuID0gY29lZmZpY2llbnQubGVuZ3RoOwogIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnQKICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbigiMCIpCiAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArICIuIiArIGNvZWZmaWNpZW50LnNsaWNlKGkpCiAgICAgIDogIjAuIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbigiMCIpICsgZm9ybWF0RGVjaW1hbCh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IQp9OwoKdmFyIGZvcm1hdFJvdW5kZWQgPSBmdW5jdGlvbih4LCBwKSB7CiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsKHgsIHApOwogIGlmICghZCkgcmV0dXJuIHggKyAiIjsKICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLAogICAgICBleHBvbmVudCA9IGRbMV07CiAgcmV0dXJuIGV4cG9uZW50IDwgMCA/ICIwLiIgKyBuZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKCIwIikgKyBjb2VmZmljaWVudAogICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyAiLiIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpCiAgICAgIDogY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAyKS5qb2luKCIwIik7Cn07Cgp2YXIgZm9ybWF0VHlwZXMgPSB7CiAgIiI6IGZvcm1hdERlZmF1bHQsCiAgIiUiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiAoeCAqIDEwMCkudG9GaXhlZChwKTsgfSwKICAiYiI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMik7IH0sCiAgImMiOiBmdW5jdGlvbih4KSB7IHJldHVybiB4ICsgIiI7IH0sCiAgImQiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDEwKTsgfSwKICAiZSI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9FeHBvbmVudGlhbChwKTsgfSwKICAiZiI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9GaXhlZChwKTsgfSwKICAiZyI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9QcmVjaXNpb24ocCk7IH0sCiAgIm8iOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDgpOyB9LAogICJwIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4gZm9ybWF0Um91bmRlZCh4ICogMTAwLCBwKTsgfSwKICAiciI6IGZvcm1hdFJvdW5kZWQsCiAgInMiOiBmb3JtYXRQcmVmaXhBdXRvLAogICJYIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsgfSwKICAieCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpOyB9Cn07CgovLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdCnZhciByZSA9IC9eKD86KC4pPyhbPD49Xl0pKT8oWytcLVwoIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KFthLXolXSk/JC9pOwoKZnVuY3Rpb24gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikgewogIHJldHVybiBuZXcgRm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcik7Cn0KCmZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUgPSBGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlOyAvLyBpbnN0YW5jZW9mCgpmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7CiAgaWYgKCEobWF0Y2ggPSByZS5leGVjKHNwZWNpZmllcikpKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiICsgc3BlY2lmaWVyKTsKCiAgdmFyIG1hdGNoLAogICAgICBmaWxsID0gbWF0Y2hbMV0gfHwgIiAiLAogICAgICBhbGlnbiA9IG1hdGNoWzJdIHx8ICI+IiwKICAgICAgc2lnbiA9IG1hdGNoWzNdIHx8ICItIiwKICAgICAgc3ltYm9sID0gbWF0Y2hbNF0gfHwgIiIsCiAgICAgIHplcm8gPSAhIW1hdGNoWzVdLAogICAgICB3aWR0aCA9IG1hdGNoWzZdICYmICttYXRjaFs2XSwKICAgICAgY29tbWEgPSAhIW1hdGNoWzddLAogICAgICBwcmVjaXNpb24gPSBtYXRjaFs4XSAmJiArbWF0Y2hbOF0uc2xpY2UoMSksCiAgICAgIHR5cGUgPSBtYXRjaFs5XSB8fCAiIjsKCiAgLy8gVGhlICJuIiB0eXBlIGlzIGFuIGFsaWFzIGZvciAiLGciLgogIGlmICh0eXBlID09PSAibiIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9ICJnIjsKCiAgLy8gTWFwIGludmFsaWQgdHlwZXMgdG8gdGhlIGRlZmF1bHQgZm9ybWF0LgogIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgdHlwZSA9ICIiOwoKICAvLyBJZiB6ZXJvIGZpbGwgaXMgc3BlY2lmaWVkLCBwYWRkaW5nIGdvZXMgYWZ0ZXIgc2lnbiBhbmQgYmVmb3JlIGRpZ2l0cy4KICBpZiAoemVybyB8fCAoZmlsbCA9PT0gIjAiICYmIGFsaWduID09PSAiPSIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9ICIwIiwgYWxpZ24gPSAiPSI7CgogIHRoaXMuZmlsbCA9IGZpbGw7CiAgdGhpcy5hbGlnbiA9IGFsaWduOwogIHRoaXMuc2lnbiA9IHNpZ247CiAgdGhpcy5zeW1ib2wgPSBzeW1ib2w7CiAgdGhpcy56ZXJvID0gemVybzsKICB0aGlzLndpZHRoID0gd2lkdGg7CiAgdGhpcy5jb21tYSA9IGNvbW1hOwogIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uOwogIHRoaXMudHlwZSA9IHR5cGU7Cn0KCkZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdGhpcy5maWxsCiAgICAgICsgdGhpcy5hbGlnbgogICAgICArIHRoaXMuc2lnbgogICAgICArIHRoaXMuc3ltYm9sCiAgICAgICsgKHRoaXMuemVybyA/ICIwIiA6ICIiKQogICAgICArICh0aGlzLndpZHRoID09IG51bGwgPyAiIiA6IE1hdGgubWF4KDEsIHRoaXMud2lkdGggfCAwKSkKICAgICAgKyAodGhpcy5jb21tYSA/ICIsIiA6ICIiKQogICAgICArICh0aGlzLnByZWNpc2lvbiA9PSBudWxsID8gIiIgOiAiLiIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKQogICAgICArIHRoaXMudHlwZTsKfTsKCnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uKHgpIHsKICByZXR1cm4geDsKfTsKCnZhciBwcmVmaXhlcyA9IFsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTsKCnZhciBmb3JtYXRMb2NhbGUgPSBmdW5jdGlvbihsb2NhbGUpIHsKICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgJiYgbG9jYWxlLnRob3VzYW5kcyA/IGZvcm1hdEdyb3VwKGxvY2FsZS5ncm91cGluZywgbG9jYWxlLnRob3VzYW5kcykgOiBpZGVudGl0eSwKICAgICAgY3VycmVuY3kgPSBsb2NhbGUuY3VycmVuY3ksCiAgICAgIGRlY2ltYWwgPSBsb2NhbGUuZGVjaW1hbCwKICAgICAgbnVtZXJhbHMgPSBsb2NhbGUubnVtZXJhbHMgPyBmb3JtYXROdW1lcmFscyhsb2NhbGUubnVtZXJhbHMpIDogaWRlbnRpdHksCiAgICAgIHBlcmNlbnQgPSBsb2NhbGUucGVyY2VudCB8fCAiJSI7CgogIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpIHsKICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpOwoKICAgIHZhciBmaWxsID0gc3BlY2lmaWVyLmZpbGwsCiAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sCiAgICAgICAgc2lnbiA9IHNwZWNpZmllci5zaWduLAogICAgICAgIHN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wsCiAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLAogICAgICAgIHdpZHRoID0gc3BlY2lmaWVyLndpZHRoLAogICAgICAgIGNvbW1hID0gc3BlY2lmaWVyLmNvbW1hLAogICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sCiAgICAgICAgdHlwZSA9IHNwZWNpZmllci50eXBlOwoKICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LgogICAgLy8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuCiAgICB2YXIgcHJlZml4ID0gc3ltYm9sID09PSAiJCIgPyBjdXJyZW5jeVswXSA6IHN5bWJvbCA9PT0gIiMiICYmIC9bYm94WF0vLnRlc3QodHlwZSkgPyAiMCIgKyB0eXBlLnRvTG93ZXJDYXNlKCkgOiAiIiwKICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5WzFdIDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogIiI7CgogICAgLy8gV2hhdCBmb3JtYXQgZnVuY3Rpb24gc2hvdWxkIHdlIHVzZT8KICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlPwogICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj8KICAgIHZhciBmb3JtYXRUeXBlID0gZm9ybWF0VHlwZXNbdHlwZV0sCiAgICAgICAgbWF5YmVTdWZmaXggPSAhdHlwZSB8fCAvW2RlZmdwcnMlXS8udGVzdCh0eXBlKTsKCiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBzcGVjaWZpZWQsCiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLgogICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMSwgMjFdLgogICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMCwgMjBdLgogICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09IG51bGwgPyAodHlwZSA/IDYgOiAxMikKICAgICAgICA6IC9bZ3Byc10vLnRlc3QodHlwZSkgPyBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgcHJlY2lzaW9uKSkKICAgICAgICA6IE1hdGgubWF4KDAsIE1hdGgubWluKDIwLCBwcmVjaXNpb24pKTsKCiAgICBmdW5jdGlvbiBmb3JtYXQodmFsdWUpIHsKICAgICAgdmFyIHZhbHVlUHJlZml4ID0gcHJlZml4LAogICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsCiAgICAgICAgICBpLCBuLCBjOwoKICAgICAgaWYgKHR5cGUgPT09ICJjIikgewogICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDsKICAgICAgICB2YWx1ZSA9ICIiOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlID0gK3ZhbHVlOwoKICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuCiAgICAgICAgdmFyIHZhbHVlTmVnYXRpdmUgPSB2YWx1ZSA8IDA7CiAgICAgICAgdmFsdWUgPSBmb3JtYXRUeXBlKE1hdGguYWJzKHZhbHVlKSwgcHJlY2lzaW9uKTsKCiAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBkdXJpbmcgZm9ybWF0dGluZywgdHJlYXQgYXMgcG9zaXRpdmUuCiAgICAgICAgaWYgKHZhbHVlTmVnYXRpdmUgJiYgK3ZhbHVlID09PSAwKSB2YWx1ZU5lZ2F0aXZlID0gZmFsc2U7CgogICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LgogICAgICAgIHZhbHVlUHJlZml4ID0gKHZhbHVlTmVnYXRpdmUgPyAoc2lnbiA9PT0gIigiID8gc2lnbiA6ICItIikgOiBzaWduID09PSAiLSIgfHwgc2lnbiA9PT0gIigiID8gIiIgOiBzaWduKSArIHZhbHVlUHJlZml4OwogICAgICAgIHZhbHVlU3VmZml4ID0gdmFsdWVTdWZmaXggKyAodHlwZSA9PT0gInMiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiAiIikgKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSAiKCIgPyAiKSIgOiAiIik7CgogICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciDigJx2YWx1ZeKAnSBwYXJ0IHRoYXQgY2FuIGJlCiAgICAgICAgLy8gZ3JvdXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhhdCBpcyBub3QuCiAgICAgICAgaWYgKG1heWJlU3VmZml4KSB7CiAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgICBpZiAoYyA9IHZhbHVlLmNoYXJDb2RlQXQoaSksIDQ4ID4gYyB8fCBjID4gNTcpIHsKICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDsKICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgbm90ICIwIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBiZWZvcmUgcGFkZGluZy4KICAgICAgaWYgKGNvbW1hICYmICF6ZXJvKSB2YWx1ZSA9IGdyb3VwKHZhbHVlLCBJbmZpbml0eSk7CgogICAgICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLgogICAgICB2YXIgbGVuZ3RoID0gdmFsdWVQcmVmaXgubGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgdmFsdWVTdWZmaXgubGVuZ3RoLAogICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6ICIiOwoKICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzICIwIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLgogICAgICBpZiAoY29tbWEgJiYgemVybykgdmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSAiIjsKCiAgICAgIC8vIFJlY29uc3RydWN0IHRoZSBmaW5hbCBvdXRwdXQgYmFzZWQgb24gdGhlIGRlc2lyZWQgYWxpZ25tZW50LgogICAgICBzd2l0Y2ggKGFsaWduKSB7CiAgICAgICAgY2FzZSAiPCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7CiAgICAgICAgY2FzZSAiPSI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7CiAgICAgICAgY2FzZSAiXiI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogdmFsdWUgPSBwYWRkaW5nICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhazsKICAgICAgfQoKICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTsKICAgIH0KCiAgICBmb3JtYXQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHNwZWNpZmllciArICIiOwogICAgfTsKCiAgICByZXR1cm4gZm9ybWF0OwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpIHsKICAgIHZhciBmID0gbmV3Rm9ybWF0KChzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSwgc3BlY2lmaWVyLnR5cGUgPSAiZiIsIHNwZWNpZmllcikpLAogICAgICAgIGUgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMywKICAgICAgICBrID0gTWF0aC5wb3coMTAsIC1lKSwKICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1s4ICsgZSAvIDNdOwogICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiBmKGsgKiB2YWx1ZSkgKyBwcmVmaXg7CiAgICB9OwogIH0KCiAgcmV0dXJuIHsKICAgIGZvcm1hdDogbmV3Rm9ybWF0LAogICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXgKICB9Owp9OwoKdmFyIGxvY2FsZTsKCgoKZGVmYXVsdExvY2FsZSh7CiAgZGVjaW1hbDogIi4iLAogIHRob3VzYW5kczogIiwiLAogIGdyb3VwaW5nOiBbM10sCiAgY3VycmVuY3k6IFsiJCIsICIiXQp9KTsKCmZ1bmN0aW9uIGRlZmF1bHRMb2NhbGUoZGVmaW5pdGlvbikgewogIGxvY2FsZSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTsKICBleHBvcnRzLmZvcm1hdCA9IGxvY2FsZS5mb3JtYXQ7CiAgZXhwb3J0cy5mb3JtYXRQcmVmaXggPSBsb2NhbGUuZm9ybWF0UHJlZml4OwogIHJldHVybiBsb2NhbGU7Cn0KCnZhciBwcmVjaXNpb25GaXhlZCA9IGZ1bmN0aW9uKHN0ZXApIHsKICByZXR1cm4gTWF0aC5tYXgoMCwgLWV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7Cn07Cgp2YXIgcHJlY2lzaW9uUHJlZml4ID0gZnVuY3Rpb24oc3RlcCwgdmFsdWUpIHsKICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMgLSBleHBvbmVudChNYXRoLmFicyhzdGVwKSkpOwp9OwoKdmFyIHByZWNpc2lvblJvdW5kID0gZnVuY3Rpb24oc3RlcCwgbWF4KSB7CiAgc3RlcCA9IE1hdGguYWJzKHN0ZXApLCBtYXggPSBNYXRoLmFicyhtYXgpIC0gc3RlcDsKICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwb25lbnQobWF4KSAtIGV4cG9uZW50KHN0ZXApKSArIDE7Cn07CgpleHBvcnRzLmZvcm1hdERlZmF1bHRMb2NhbGUgPSBkZWZhdWx0TG9jYWxlOwpleHBvcnRzLmZvcm1hdExvY2FsZSA9IGZvcm1hdExvY2FsZTsKZXhwb3J0cy5mb3JtYXRTcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXI7CmV4cG9ydHMucHJlY2lzaW9uRml4ZWQgPSBwcmVjaXNpb25GaXhlZDsKZXhwb3J0cy5wcmVjaXNpb25QcmVmaXggPSBwcmVjaXNpb25QcmVmaXg7CmV4cG9ydHMucHJlY2lzaW9uUm91bmQgPSBwcmVjaXNpb25Sb3VuZDsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7Cgp9KSkpOwoKfSx7fV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Ci8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtaW50ZXJwb2xhdGUvIFZlcnNpb24gMS4xLjQuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnZDMtY29sb3InKSkgOgoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdkMy1jb2xvciddLCBmYWN0b3J5KSA6CgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSxnbG9iYWwuZDMpKTsKfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsZDNDb2xvcikgeyAndXNlIHN0cmljdCc7CgpmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHsKICB2YXIgdDIgPSB0MSAqIHQxLCB0MyA9IHQyICogdDE7CiAgcmV0dXJuICgoMSAtIDMgKiB0MSArIDMgKiB0MiAtIHQzKSAqIHYwCiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjEKICAgICAgKyAoMSArIDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MgogICAgICArIHQzICogdjMpIC8gNjsKfQoKdmFyIGJhc2lzJDEgPSBmdW5jdGlvbih2YWx1ZXMpIHsKICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxOwogIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLAogICAgICAgIHYxID0gdmFsdWVzW2ldLAogICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSwKICAgICAgICB2MCA9IGkgPiAwID8gdmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLAogICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxOwogICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpOwogIH07Cn07Cgp2YXIgYmFzaXNDbG9zZWQgPSBmdW5jdGlvbih2YWx1ZXMpIHsKICB2YXIgbiA9IHZhbHVlcy5sZW5ndGg7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHZhciBpID0gTWF0aC5mbG9vcigoKHQgJT0gMSkgPCAwID8gKyt0IDogdCkgKiBuKSwKICAgICAgICB2MCA9IHZhbHVlc1soaSArIG4gLSAxKSAlIG5dLAogICAgICAgIHYxID0gdmFsdWVzW2kgJSBuXSwKICAgICAgICB2MiA9IHZhbHVlc1soaSArIDEpICUgbl0sCiAgICAgICAgdjMgPSB2YWx1ZXNbKGkgKyAyKSAlIG5dOwogICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpOwogIH07Cn07Cgp2YXIgY29uc3RhbnQgPSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHg7CiAgfTsKfTsKCmZ1bmN0aW9uIGxpbmVhcihhLCBkKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHJldHVybiBhICsgdCAqIGQ7CiAgfTsKfQoKZnVuY3Rpb24gZXhwb25lbnRpYWwoYSwgYiwgeSkgewogIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkgewogICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7CiAgfTsKfQoKZnVuY3Rpb24gaHVlKGEsIGIpIHsKICB2YXIgZCA9IGIgLSBhOwogIHJldHVybiBkID8gbGluZWFyKGEsIGQgPiAxODAgfHwgZCA8IC0xODAgPyBkIC0gMzYwICogTWF0aC5yb3VuZChkIC8gMzYwKSA6IGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7Cn0KCmZ1bmN0aW9uIGdhbW1hKHkpIHsKICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikgewogICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwoYSwgYiwgeSkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTsKICB9Owp9CgpmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHsKICB2YXIgZCA9IGIgLSBhOwogIHJldHVybiBkID8gbGluZWFyKGEsIGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7Cn0KCnZhciByZ2IkMSA9ICgoZnVuY3Rpb24gcmdiR2FtbWEoeSkgewogIHZhciBjb2xvciQkMSA9IGdhbW1hKHkpOwoKICBmdW5jdGlvbiByZ2IkJDEoc3RhcnQsIGVuZCkgewogICAgdmFyIHIgPSBjb2xvciQkMSgoc3RhcnQgPSBkM0NvbG9yLnJnYihzdGFydCkpLnIsIChlbmQgPSBkM0NvbG9yLnJnYihlbmQpKS5yKSwKICAgICAgICBnID0gY29sb3IkJDEoc3RhcnQuZywgZW5kLmcpLAogICAgICAgIGIgPSBjb2xvciQkMShzdGFydC5iLCBlbmQuYiksCiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOwogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgc3RhcnQuciA9IHIodCk7CiAgICAgIHN0YXJ0LmcgPSBnKHQpOwogICAgICBzdGFydC5iID0gYih0KTsKICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgIHJldHVybiBzdGFydCArICIiOwogICAgfTsKICB9CgogIHJnYiQkMS5nYW1tYSA9IHJnYkdhbW1hOwoKICByZXR1cm4gcmdiJCQxOwp9KSkoMSk7CgpmdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykgewogICAgdmFyIG4gPSBjb2xvcnMubGVuZ3RoLAogICAgICAgIHIgPSBuZXcgQXJyYXkobiksCiAgICAgICAgZyA9IG5ldyBBcnJheShuKSwKICAgICAgICBiID0gbmV3IEFycmF5KG4pLAogICAgICAgIGksIGNvbG9yJCQxOwogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBjb2xvciQkMSA9IGQzQ29sb3IucmdiKGNvbG9yc1tpXSk7CiAgICAgIHJbaV0gPSBjb2xvciQkMS5yIHx8IDA7CiAgICAgIGdbaV0gPSBjb2xvciQkMS5nIHx8IDA7CiAgICAgIGJbaV0gPSBjb2xvciQkMS5iIHx8IDA7CiAgICB9CiAgICByID0gc3BsaW5lKHIpOwogICAgZyA9IHNwbGluZShnKTsKICAgIGIgPSBzcGxpbmUoYik7CiAgICBjb2xvciQkMS5vcGFjaXR5ID0gMTsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIGNvbG9yJCQxLnIgPSByKHQpOwogICAgICBjb2xvciQkMS5nID0gZyh0KTsKICAgICAgY29sb3IkJDEuYiA9IGIodCk7CiAgICAgIHJldHVybiBjb2xvciQkMSArICIiOwogICAgfTsKICB9Owp9Cgp2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMkMSk7CnZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGluZShiYXNpc0Nsb3NlZCk7Cgp2YXIgYXJyYXkgPSBmdW5jdGlvbihhLCBiKSB7CiAgdmFyIG5iID0gYiA/IGIubGVuZ3RoIDogMCwKICAgICAgbmEgPSBhID8gTWF0aC5taW4obmIsIGEubGVuZ3RoKSA6IDAsCiAgICAgIHggPSBuZXcgQXJyYXkobmIpLAogICAgICBjID0gbmV3IEFycmF5KG5iKSwKICAgICAgaTsKCiAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIHhbaV0gPSB2YWx1ZShhW2ldLCBiW2ldKTsKICBmb3IgKDsgaSA8IG5iOyArK2kpIGNbaV0gPSBiW2ldOwoKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIGNbaV0gPSB4W2ldKHQpOwogICAgcmV0dXJuIGM7CiAgfTsKfTsKCnZhciBkYXRlID0gZnVuY3Rpb24oYSwgYikgewogIHZhciBkID0gbmV3IERhdGU7CiAgcmV0dXJuIGEgPSArYSwgYiAtPSBhLCBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gZC5zZXRUaW1lKGEgKyBiICogdCksIGQ7CiAgfTsKfTsKCnZhciBudW1iZXIgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuIGEgPSArYSwgYiAtPSBhLCBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gYSArIGIgKiB0OwogIH07Cn07Cgp2YXIgb2JqZWN0ID0gZnVuY3Rpb24oYSwgYikgewogIHZhciBpID0ge30sCiAgICAgIGMgPSB7fSwKICAgICAgazsKCiAgaWYgKGEgPT09IG51bGwgfHwgdHlwZW9mIGEgIT09ICJvYmplY3QiKSBhID0ge307CiAgaWYgKGIgPT09IG51bGwgfHwgdHlwZW9mIGIgIT09ICJvYmplY3QiKSBiID0ge307CgogIGZvciAoayBpbiBiKSB7CiAgICBpZiAoayBpbiBhKSB7CiAgICAgIGlba10gPSB2YWx1ZShhW2tdLCBiW2tdKTsKICAgIH0gZWxzZSB7CiAgICAgIGNba10gPSBiW2tdOwogICAgfQogIH0KCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIGZvciAoayBpbiBpKSBjW2tdID0gaVtrXSh0KTsKICAgIHJldHVybiBjOwogIH07Cn07Cgp2YXIgcmVBID0gL1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nOwp2YXIgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCAiZyIpOwoKZnVuY3Rpb24gemVybyhiKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGI7CiAgfTsKfQoKZnVuY3Rpb24gb25lKGIpIHsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgcmV0dXJuIGIodCkgKyAiIjsKICB9Owp9Cgp2YXIgc3RyaW5nID0gZnVuY3Rpb24oYSwgYikgewogIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYgogICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhCiAgICAgIGJtLCAvLyBjdXJyZW50IG1hdGNoIGluIGIKICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55CiAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gcwogICAgICBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycwogICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzCgogIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy4KICBhID0gYSArICIiLCBiID0gYiArICIiOwoKICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLgogIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSkKICAgICAgJiYgKGJtID0gcmVCLmV4ZWMoYikpKSB7CiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGIKICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7CiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICBlbHNlIHNbKytpXSA9IGJzOwogICAgfQogICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7IC8vIG51bWJlcnMgaW4gYSAmIGIgbWF0Y2gKICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgIGVsc2Ugc1srK2ldID0gYm07CiAgICB9IGVsc2UgeyAvLyBpbnRlcnBvbGF0ZSBub24tbWF0Y2hpbmcgbnVtYmVycwogICAgICBzWysraV0gPSBudWxsOwogICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7CiAgICB9CiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7CiAgfQoKICAvLyBBZGQgcmVtYWlucyBvZiBiLgogIGlmIChiaSA8IGIubGVuZ3RoKSB7CiAgICBicyA9IGIuc2xpY2UoYmkpOwogICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICBlbHNlIHNbKytpXSA9IGJzOwogIH0KCiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guCiAgLy8gT3RoZXJ3aXNlLCBpbnRlcnBvbGF0ZSBlYWNoIG9mIHRoZSBudW1iZXJzIGFuZCByZWpvaW4gdGhlIHN0cmluZy4KICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF0KICAgICAgPyBvbmUocVswXS54KQogICAgICA6IHplcm8oYikpCiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkgewogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKICAgICAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgICAgIH0pOwp9OwoKdmFyIHZhbHVlID0gZnVuY3Rpb24oYSwgYikgewogIHZhciB0ID0gdHlwZW9mIGIsIGM7CiAgcmV0dXJuIGIgPT0gbnVsbCB8fCB0ID09PSAiYm9vbGVhbiIgPyBjb25zdGFudChiKQogICAgICA6ICh0ID09PSAibnVtYmVyIiA/IG51bWJlcgogICAgICA6IHQgPT09ICJzdHJpbmciID8gKChjID0gZDNDb2xvci5jb2xvcihiKSkgPyAoYiA9IGMsIHJnYiQxKSA6IHN0cmluZykKICAgICAgOiBiIGluc3RhbmNlb2YgZDNDb2xvci5jb2xvciA/IHJnYiQxCiAgICAgIDogYiBpbnN0YW5jZW9mIERhdGUgPyBkYXRlCiAgICAgIDogQXJyYXkuaXNBcnJheShiKSA/IGFycmF5CiAgICAgIDogaXNOYU4oYikgPyBvYmplY3QKICAgICAgOiBudW1iZXIpKGEsIGIpOwp9OwoKdmFyIHJvdW5kID0gZnVuY3Rpb24oYSwgYikgewogIHJldHVybiBhID0gK2EsIGIgLT0gYSwgZnVuY3Rpb24odCkgewogICAgcmV0dXJuIE1hdGgucm91bmQoYSArIGIgKiB0KTsKICB9Owp9OwoKdmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJOwoKdmFyIGlkZW50aXR5ID0gewogIHRyYW5zbGF0ZVg6IDAsCiAgdHJhbnNsYXRlWTogMCwKICByb3RhdGU6IDAsCiAgc2tld1g6IDAsCiAgc2NhbGVYOiAxLAogIHNjYWxlWTogMQp9OwoKdmFyIGRlY29tcG9zZSA9IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIGUsIGYpIHsKICB2YXIgc2NhbGVYLCBzY2FsZVksIHNrZXdYOwogIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDsKICBpZiAoc2tld1ggPSBhICogYyArIGIgKiBkKSBjIC09IGEgKiBza2V3WCwgZCAtPSBiICogc2tld1g7CiAgaWYgKHNjYWxlWSA9IE1hdGguc3FydChjICogYyArIGQgKiBkKSkgYyAvPSBzY2FsZVksIGQgLz0gc2NhbGVZLCBza2V3WCAvPSBzY2FsZVk7CiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDsKICByZXR1cm4gewogICAgdHJhbnNsYXRlWDogZSwKICAgIHRyYW5zbGF0ZVk6IGYsCiAgICByb3RhdGU6IE1hdGguYXRhbjIoYiwgYSkgKiBkZWdyZWVzLAogICAgc2tld1g6IE1hdGguYXRhbihza2V3WCkgKiBkZWdyZWVzLAogICAgc2NhbGVYOiBzY2FsZVgsCiAgICBzY2FsZVk6IHNjYWxlWQogIH07Cn07Cgp2YXIgY3NzTm9kZTsKdmFyIGNzc1Jvb3Q7CnZhciBjc3NWaWV3Owp2YXIgc3ZnTm9kZTsKCmZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7CiAgaWYgKHZhbHVlID09PSAibm9uZSIpIHJldHVybiBpZGVudGl0eTsKICBpZiAoIWNzc05vZGUpIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSwgY3NzUm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgY3NzVmlldyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3OwogIGNzc05vZGUuc3R5bGUudHJhbnNmb3JtID0gdmFsdWU7CiAgdmFsdWUgPSBjc3NWaWV3LmdldENvbXB1dGVkU3R5bGUoY3NzUm9vdC5hcHBlbmRDaGlsZChjc3NOb2RlKSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIik7CiAgY3NzUm9vdC5yZW1vdmVDaGlsZChjc3NOb2RlKTsKICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDcsIC0xKS5zcGxpdCgiLCIpOwogIHJldHVybiBkZWNvbXBvc2UoK3ZhbHVlWzBdLCArdmFsdWVbMV0sICt2YWx1ZVsyXSwgK3ZhbHVlWzNdLCArdmFsdWVbNF0sICt2YWx1ZVs1XSk7Cn0KCmZ1bmN0aW9uIHBhcnNlU3ZnKHZhbHVlKSB7CiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTsKICBpZiAoIXN2Z05vZGUpIHN2Z05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwgImciKTsKICBzdmdOb2RlLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwgdmFsdWUpOwogIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5OwogIHZhbHVlID0gdmFsdWUubWF0cml4OwogIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7Cn0KCmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikgewoKICBmdW5jdGlvbiBwb3AocykgewogICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArICIgIiA6ICIiOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7CiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICB2YXIgaSA9IHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pOwogICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTsKICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHsKICAgICAgcy5wdXNoKCJ0cmFuc2xhdGUoIiArIHhiICsgcHhDb21tYSArIHliICsgcHhQYXJlbik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkgewogICAgaWYgKGEgIT09IGIpIHsKICAgICAgaWYgKGEgLSBiID4gMTgwKSBiICs9IDM2MDsgZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoCiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArICJyb3RhdGUoIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7CiAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgcy5wdXNoKHBvcChzKSArICJyb3RhdGUoIiArIGIgKyBkZWdQYXJlbik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7CiAgICBpZiAoYSAhPT0gYikgewogICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyAic2tld1goIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7CiAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgcy5wdXNoKHBvcChzKSArICJza2V3WCgiICsgYiArIGRlZ1BhcmVuKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7CiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICB2YXIgaSA9IHMucHVzaChwb3AocykgKyAic2NhbGUoIiwgbnVsbCwgIiwiLCBudWxsLCAiKSIpOwogICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTsKICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHsKICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7CiAgICB9CiAgfQoKICByZXR1cm4gZnVuY3Rpb24oYSwgYikgewogICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycwogICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7CiAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTsKICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpOwogICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7CiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7CiAgICBhID0gYiA9IG51bGw7IC8vIGdjCiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87CiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7CiAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgfTsKICB9Owp9Cgp2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgInB4LCAiLCAicHgpIiwgImRlZykiKTsKdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsICIsICIsICIpIiwgIikiKTsKCnZhciByaG8gPSBNYXRoLlNRUlQyOwp2YXIgcmhvMiA9IDI7CnZhciByaG80ID0gNDsKdmFyIGVwc2lsb24yID0gMWUtMTI7CgpmdW5jdGlvbiBjb3NoKHgpIHsKICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjsKfQoKZnVuY3Rpb24gc2luaCh4KSB7CiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7Cn0KCmZ1bmN0aW9uIHRhbmgoeCkgewogIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpOwp9CgovLyBwMCA9IFt1eDAsIHV5MCwgdzBdCi8vIHAxID0gW3V4MSwgdXkxLCB3MV0KdmFyIHpvb20gPSBmdW5jdGlvbihwMCwgcDEpIHsKICB2YXIgdXgwID0gcDBbMF0sIHV5MCA9IHAwWzFdLCB3MCA9IHAwWzJdLAogICAgICB1eDEgPSBwMVswXSwgdXkxID0gcDFbMV0sIHcxID0gcDFbMl0sCiAgICAgIGR4ID0gdXgxIC0gdXgwLAogICAgICBkeSA9IHV5MSAtIHV5MCwKICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSwKICAgICAgaSwKICAgICAgUzsKCiAgLy8gU3BlY2lhbCBjYXNlIGZvciB1MCDiiYUgdTEuCiAgaWYgKGQyIDwgZXBzaWxvbjIpIHsKICAgIFMgPSBNYXRoLmxvZyh3MSAvIHcwKSAvIHJobzsKICAgIGkgPSBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiBbCiAgICAgICAgdXgwICsgdCAqIGR4LAogICAgICAgIHV5MCArIHQgKiBkeSwKICAgICAgICB3MCAqIE1hdGguZXhwKHJobyAqIHQgKiBTKQogICAgICBdOwogICAgfTsKICB9CgogIC8vIEdlbmVyYWwgY2FzZS4KICBlbHNlIHsKICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksCiAgICAgICAgYjAgPSAodzEgKiB3MSAtIHcwICogdzAgKyByaG80ICogZDIpIC8gKDIgKiB3MCAqIHJobzIgKiBkMSksCiAgICAgICAgYjEgPSAodzEgKiB3MSAtIHcwICogdzAgLSByaG80ICogZDIpIC8gKDIgKiB3MSAqIHJobzIgKiBkMSksCiAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLAogICAgICAgIHIxID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIxICogYjEgKyAxKSAtIGIxKTsKICAgIFMgPSAocjEgLSByMCkgLyByaG87CiAgICBpID0gZnVuY3Rpb24odCkgewogICAgICB2YXIgcyA9IHQgKiBTLAogICAgICAgICAgY29zaHIwID0gY29zaChyMCksCiAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7CiAgICAgIHJldHVybiBbCiAgICAgICAgdXgwICsgdSAqIGR4LAogICAgICAgIHV5MCArIHUgKiBkeSwKICAgICAgICB3MCAqIGNvc2hyMCAvIGNvc2gocmhvICogcyArIHIwKQogICAgICBdOwogICAgfTsKICB9CgogIGkuZHVyYXRpb24gPSBTICogMTAwMDsKCiAgcmV0dXJuIGk7Cn07CgpmdW5jdGlvbiBoc2wkMShodWUkJDEpIHsKICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgdmFyIGggPSBodWUkJDEoKHN0YXJ0ID0gZDNDb2xvci5oc2woc3RhcnQpKS5oLCAoZW5kID0gZDNDb2xvci5oc2woZW5kKSkuaCksCiAgICAgICAgcyA9IG5vZ2FtbWEoc3RhcnQucywgZW5kLnMpLAogICAgICAgIGwgPSBub2dhbW1hKHN0YXJ0LmwsIGVuZC5sKSwKICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICBzdGFydC5oID0gaCh0KTsKICAgICAgc3RhcnQucyA9IHModCk7CiAgICAgIHN0YXJ0LmwgPSBsKHQpOwogICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICB9OwogIH0KfQoKdmFyIGhzbCQyID0gaHNsJDEoaHVlKTsKdmFyIGhzbExvbmcgPSBoc2wkMShub2dhbW1hKTsKCmZ1bmN0aW9uIGxhYiQxKHN0YXJ0LCBlbmQpIHsKICB2YXIgbCA9IG5vZ2FtbWEoKHN0YXJ0ID0gZDNDb2xvci5sYWIoc3RhcnQpKS5sLCAoZW5kID0gZDNDb2xvci5sYWIoZW5kKSkubCksCiAgICAgIGEgPSBub2dhbW1hKHN0YXJ0LmEsIGVuZC5hKSwKICAgICAgYiA9IG5vZ2FtbWEoc3RhcnQuYiwgZW5kLmIpLAogICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHN0YXJ0LmwgPSBsKHQpOwogICAgc3RhcnQuYSA9IGEodCk7CiAgICBzdGFydC5iID0gYih0KTsKICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOwogICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgfTsKfQoKZnVuY3Rpb24gaGNsJDEoaHVlJCQxKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgIHZhciBoID0gaHVlJCQxKChzdGFydCA9IGQzQ29sb3IuaGNsKHN0YXJ0KSkuaCwgKGVuZCA9IGQzQ29sb3IuaGNsKGVuZCkpLmgpLAogICAgICAgIGMgPSBub2dhbW1hKHN0YXJ0LmMsIGVuZC5jKSwKICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksCiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOwogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgc3RhcnQuaCA9IGgodCk7CiAgICAgIHN0YXJ0LmMgPSBjKHQpOwogICAgICBzdGFydC5sID0gbCh0KTsKICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgIHJldHVybiBzdGFydCArICIiOwogICAgfTsKICB9Cn0KCnZhciBoY2wkMiA9IGhjbCQxKGh1ZSk7CnZhciBoY2xMb25nID0gaGNsJDEobm9nYW1tYSk7CgpmdW5jdGlvbiBjdWJlaGVsaXgkMShodWUkJDEpIHsKICByZXR1cm4gKGZ1bmN0aW9uIGN1YmVoZWxpeEdhbW1hKHkpIHsKICAgIHkgPSAreTsKCiAgICBmdW5jdGlvbiBjdWJlaGVsaXgkJDEoc3RhcnQsIGVuZCkgewogICAgICB2YXIgaCA9IGh1ZSQkMSgoc3RhcnQgPSBkM0NvbG9yLmN1YmVoZWxpeChzdGFydCkpLmgsIChlbmQgPSBkM0NvbG9yLmN1YmVoZWxpeChlbmQpKS5oKSwKICAgICAgICAgIHMgPSBub2dhbW1hKHN0YXJ0LnMsIGVuZC5zKSwKICAgICAgICAgIGwgPSBub2dhbW1hKHN0YXJ0LmwsIGVuZC5sKSwKICAgICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICBzdGFydC5oID0gaCh0KTsKICAgICAgICBzdGFydC5zID0gcyh0KTsKICAgICAgICBzdGFydC5sID0gbChNYXRoLnBvdyh0LCB5KSk7CiAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICAgIH07CiAgICB9CgogICAgY3ViZWhlbGl4JCQxLmdhbW1hID0gY3ViZWhlbGl4R2FtbWE7CgogICAgcmV0dXJuIGN1YmVoZWxpeCQkMTsKICB9KSgxKTsKfQoKdmFyIGN1YmVoZWxpeCQyID0gY3ViZWhlbGl4JDEoaHVlKTsKdmFyIGN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXgkMShub2dhbW1hKTsKCnZhciBxdWFudGl6ZSA9IGZ1bmN0aW9uKGludGVycG9sYXRvciwgbikgewogIHZhciBzYW1wbGVzID0gbmV3IEFycmF5KG4pOwogIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBzYW1wbGVzW2ldID0gaW50ZXJwb2xhdG9yKGkgLyAobiAtIDEpKTsKICByZXR1cm4gc2FtcGxlczsKfTsKCmV4cG9ydHMuaW50ZXJwb2xhdGUgPSB2YWx1ZTsKZXhwb3J0cy5pbnRlcnBvbGF0ZUFycmF5ID0gYXJyYXk7CmV4cG9ydHMuaW50ZXJwb2xhdGVCYXNpcyA9IGJhc2lzJDE7CmV4cG9ydHMuaW50ZXJwb2xhdGVCYXNpc0Nsb3NlZCA9IGJhc2lzQ2xvc2VkOwpleHBvcnRzLmludGVycG9sYXRlRGF0ZSA9IGRhdGU7CmV4cG9ydHMuaW50ZXJwb2xhdGVOdW1iZXIgPSBudW1iZXI7CmV4cG9ydHMuaW50ZXJwb2xhdGVPYmplY3QgPSBvYmplY3Q7CmV4cG9ydHMuaW50ZXJwb2xhdGVSb3VuZCA9IHJvdW5kOwpleHBvcnRzLmludGVycG9sYXRlU3RyaW5nID0gc3RyaW5nOwpleHBvcnRzLmludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3M7CmV4cG9ydHMuaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZzsKZXhwb3J0cy5pbnRlcnBvbGF0ZVpvb20gPSB6b29tOwpleHBvcnRzLmludGVycG9sYXRlUmdiID0gcmdiJDE7CmV4cG9ydHMuaW50ZXJwb2xhdGVSZ2JCYXNpcyA9IHJnYkJhc2lzOwpleHBvcnRzLmludGVycG9sYXRlUmdiQmFzaXNDbG9zZWQgPSByZ2JCYXNpc0Nsb3NlZDsKZXhwb3J0cy5pbnRlcnBvbGF0ZUhzbCA9IGhzbCQyOwpleHBvcnRzLmludGVycG9sYXRlSHNsTG9uZyA9IGhzbExvbmc7CmV4cG9ydHMuaW50ZXJwb2xhdGVMYWIgPSBsYWIkMTsKZXhwb3J0cy5pbnRlcnBvbGF0ZUhjbCA9IGhjbCQyOwpleHBvcnRzLmludGVycG9sYXRlSGNsTG9uZyA9IGhjbExvbmc7CmV4cG9ydHMuaW50ZXJwb2xhdGVDdWJlaGVsaXggPSBjdWJlaGVsaXgkMjsKZXhwb3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXhMb25nOwpleHBvcnRzLnF1YW50aXplID0gcXVhbnRpemU7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOwoKfSkpKTsKCn0seyJkMy1jb2xvciI6NX1dLDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewovLyBodHRwczovL2QzanMub3JnL2QzLXNjYWxlLyBWZXJzaW9uIDEuMC41LiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7Cgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ2QzLWFycmF5JyksIHJlcXVpcmUoJ2QzLWNvbGxlY3Rpb24nKSwgcmVxdWlyZSgnZDMtaW50ZXJwb2xhdGUnKSwgcmVxdWlyZSgnZDMtZm9ybWF0JyksIHJlcXVpcmUoJ2QzLXRpbWUnKSwgcmVxdWlyZSgnZDMtdGltZS1mb3JtYXQnKSwgcmVxdWlyZSgnZDMtY29sb3InKSkgOgoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdkMy1hcnJheScsICdkMy1jb2xsZWN0aW9uJywgJ2QzLWludGVycG9sYXRlJywgJ2QzLWZvcm1hdCcsICdkMy10aW1lJywgJ2QzLXRpbWUtZm9ybWF0JywgJ2QzLWNvbG9yJ10sIGZhY3RvcnkpIDoKCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMykpOwp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cyxkM0FycmF5LGQzQ29sbGVjdGlvbixkM0ludGVycG9sYXRlLGQzRm9ybWF0LGQzVGltZSxkM1RpbWVGb3JtYXQsZDNDb2xvcikgeyAndXNlIHN0cmljdCc7Cgp2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGU7Cgp2YXIgbWFwJDEgPSBhcnJheS5tYXA7CnZhciBzbGljZSA9IGFycmF5LnNsaWNlOwoKdmFyIGltcGxpY2l0ID0ge25hbWU6ICJpbXBsaWNpdCJ9OwoKZnVuY3Rpb24gb3JkaW5hbChyYW5nZSQkMSkgewogIHZhciBpbmRleCA9IGQzQ29sbGVjdGlvbi5tYXAoKSwKICAgICAgZG9tYWluID0gW10sCiAgICAgIHVua25vd24gPSBpbXBsaWNpdDsKCiAgcmFuZ2UkJDEgPSByYW5nZSQkMSA9PSBudWxsID8gW10gOiBzbGljZS5jYWxsKHJhbmdlJCQxKTsKCiAgZnVuY3Rpb24gc2NhbGUoZCkgewogICAgdmFyIGtleSA9IGQgKyAiIiwgaSA9IGluZGV4LmdldChrZXkpOwogICAgaWYgKCFpKSB7CiAgICAgIGlmICh1bmtub3duICE9PSBpbXBsaWNpdCkgcmV0dXJuIHVua25vd247CiAgICAgIGluZGV4LnNldChrZXksIGkgPSBkb21haW4ucHVzaChkKSk7CiAgICB9CiAgICByZXR1cm4gcmFuZ2UkJDFbKGkgLSAxKSAlIHJhbmdlJCQxLmxlbmd0aF07CiAgfQoKICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTsKICAgIGRvbWFpbiA9IFtdLCBpbmRleCA9IGQzQ29sbGVjdGlvbi5tYXAoKTsKICAgIHZhciBpID0gLTEsIG4gPSBfLmxlbmd0aCwgZCwga2V5OwogICAgd2hpbGUgKCsraSA8IG4pIGlmICghaW5kZXguaGFzKGtleSA9IChkID0gX1tpXSkgKyAiIikpIGluZGV4LnNldChrZXksIGRvbWFpbi5wdXNoKGQpKTsKICAgIHJldHVybiBzY2FsZTsKICB9OwoKICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlJCQxID0gc2xpY2UuY2FsbChfKSwgc2NhbGUpIDogcmFuZ2UkJDEuc2xpY2UoKTsKICB9OwoKICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247CiAgfTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIG9yZGluYWwoKQogICAgICAgIC5kb21haW4oZG9tYWluKQogICAgICAgIC5yYW5nZShyYW5nZSQkMSkKICAgICAgICAudW5rbm93bih1bmtub3duKTsKICB9OwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIGJhbmQoKSB7CiAgdmFyIHNjYWxlID0gb3JkaW5hbCgpLnVua25vd24odW5kZWZpbmVkKSwKICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluLAogICAgICBvcmRpbmFsUmFuZ2UgPSBzY2FsZS5yYW5nZSwKICAgICAgcmFuZ2UkJDEgPSBbMCwgMV0sCiAgICAgIHN0ZXAsCiAgICAgIGJhbmR3aWR0aCwKICAgICAgcm91bmQgPSBmYWxzZSwKICAgICAgcGFkZGluZ0lubmVyID0gMCwKICAgICAgcGFkZGluZ091dGVyID0gMCwKICAgICAgYWxpZ24gPSAwLjU7CgogIGRlbGV0ZSBzY2FsZS51bmtub3duOwoKICBmdW5jdGlvbiByZXNjYWxlKCkgewogICAgdmFyIG4gPSBkb21haW4oKS5sZW5ndGgsCiAgICAgICAgcmV2ZXJzZSA9IHJhbmdlJCQxWzFdIDwgcmFuZ2UkJDFbMF0sCiAgICAgICAgc3RhcnQgPSByYW5nZSQkMVtyZXZlcnNlIC0gMF0sCiAgICAgICAgc3RvcCA9IHJhbmdlJCQxWzEgLSByZXZlcnNlXTsKICAgIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDEsIG4gLSBwYWRkaW5nSW5uZXIgKyBwYWRkaW5nT3V0ZXIgKiAyKTsKICAgIGlmIChyb3VuZCkgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7CiAgICBzdGFydCArPSAoc3RvcCAtIHN0YXJ0IC0gc3RlcCAqIChuIC0gcGFkZGluZ0lubmVyKSkgKiBhbGlnbjsKICAgIGJhbmR3aWR0aCA9IHN0ZXAgKiAoMSAtIHBhZGRpbmdJbm5lcik7CiAgICBpZiAocm91bmQpIHN0YXJ0ID0gTWF0aC5yb3VuZChzdGFydCksIGJhbmR3aWR0aCA9IE1hdGgucm91bmQoYmFuZHdpZHRoKTsKICAgIHZhciB2YWx1ZXMgPSBkM0FycmF5LnJhbmdlKG4pLm1hcChmdW5jdGlvbihpKSB7IHJldHVybiBzdGFydCArIHN0ZXAgKiBpOyB9KTsKICAgIHJldHVybiBvcmRpbmFsUmFuZ2UocmV2ZXJzZSA/IHZhbHVlcy5yZXZlcnNlKCkgOiB2YWx1ZXMpOwogIH0KCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSQkMSA9IFsrX1swXSwgK19bMV1dLCByZXNjYWxlKCkpIDogcmFuZ2UkJDEuc2xpY2UoKTsKICB9OwoKICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIHJhbmdlJCQxID0gWytfWzBdLCArX1sxXV0sIHJvdW5kID0gdHJ1ZSwgcmVzY2FsZSgpOwogIH07CgogIHNjYWxlLmJhbmR3aWR0aCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGJhbmR3aWR0aDsKICB9OwoKICBzY2FsZS5zdGVwID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gc3RlcDsKICB9OwoKICBzY2FsZS5yb3VuZCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISFfLCByZXNjYWxlKCkpIDogcm91bmQ7CiAgfTsKCiAgc2NhbGUucGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IHBhZGRpbmdPdXRlciA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjsKICB9OwoKICBzY2FsZS5wYWRkaW5nSW5uZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBwYWRkaW5nSW5uZXI7CiAgfTsKCiAgc2NhbGUucGFkZGluZ091dGVyID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ091dGVyID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogcGFkZGluZ091dGVyOwogIH07CgogIHNjYWxlLmFsaWduID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxpZ24gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBhbGlnbjsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gYmFuZCgpCiAgICAgICAgLmRvbWFpbihkb21haW4oKSkKICAgICAgICAucmFuZ2UocmFuZ2UkJDEpCiAgICAgICAgLnJvdW5kKHJvdW5kKQogICAgICAgIC5wYWRkaW5nSW5uZXIocGFkZGluZ0lubmVyKQogICAgICAgIC5wYWRkaW5nT3V0ZXIocGFkZGluZ091dGVyKQogICAgICAgIC5hbGlnbihhbGlnbik7CiAgfTsKCiAgcmV0dXJuIHJlc2NhbGUoKTsKfQoKZnVuY3Rpb24gcG9pbnRpc2goc2NhbGUpIHsKICB2YXIgY29weSA9IHNjYWxlLmNvcHk7CgogIHNjYWxlLnBhZGRpbmcgPSBzY2FsZS5wYWRkaW5nT3V0ZXI7CiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdJbm5lcjsKICBkZWxldGUgc2NhbGUucGFkZGluZ091dGVyOwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gcG9pbnRpc2goY29weSgpKTsKICB9OwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIHBvaW50KCkgewogIHJldHVybiBwb2ludGlzaChiYW5kKCkucGFkZGluZ0lubmVyKDEpKTsKfQoKdmFyIGNvbnN0YW50ID0gZnVuY3Rpb24oeCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn07Cgp2YXIgbnVtYmVyID0gZnVuY3Rpb24oeCkgewogIHJldHVybiAreDsKfTsKCnZhciB1bml0ID0gWzAsIDFdOwoKZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZUxpbmVhcihhLCBiKSB7CiAgcmV0dXJuIChiIC09IChhID0gK2EpKQogICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuICh4IC0gYSkgLyBiOyB9CiAgICAgIDogY29uc3RhbnQoYik7Cn0KCmZ1bmN0aW9uIGRlaW50ZXJwb2xhdGVDbGFtcChkZWludGVycG9sYXRlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsKICAgIHZhciBkID0gZGVpbnRlcnBvbGF0ZShhID0gK2EsIGIgPSArYik7CiAgICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4geCA8PSBhID8gMCA6IHggPj0gYiA/IDEgOiBkKHgpOyB9OwogIH07Cn0KCmZ1bmN0aW9uIHJlaW50ZXJwb2xhdGVDbGFtcChyZWludGVycG9sYXRlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsKICAgIHZhciByID0gcmVpbnRlcnBvbGF0ZShhID0gK2EsIGIgPSArYik7CiAgICByZXR1cm4gZnVuY3Rpb24odCkgeyByZXR1cm4gdCA8PSAwID8gYSA6IHQgPj0gMSA/IGIgOiByKHQpOyB9OwogIH07Cn0KCmZ1bmN0aW9uIGJpbWFwKGRvbWFpbiwgcmFuZ2UkJDEsIGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpIHsKICB2YXIgZDAgPSBkb21haW5bMF0sIGQxID0gZG9tYWluWzFdLCByMCA9IHJhbmdlJCQxWzBdLCByMSA9IHJhbmdlJCQxWzFdOwogIGlmIChkMSA8IGQwKSBkMCA9IGRlaW50ZXJwb2xhdGUoZDEsIGQwKSwgcjAgPSByZWludGVycG9sYXRlKHIxLCByMCk7CiAgZWxzZSBkMCA9IGRlaW50ZXJwb2xhdGUoZDAsIGQxKSwgcjAgPSByZWludGVycG9sYXRlKHIwLCByMSk7CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHIwKGQwKHgpKTsgfTsKfQoKZnVuY3Rpb24gcG9seW1hcChkb21haW4sIHJhbmdlJCQxLCBkZWludGVycG9sYXRlLCByZWludGVycG9sYXRlKSB7CiAgdmFyIGogPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZSQkMS5sZW5ndGgpIC0gMSwKICAgICAgZCA9IG5ldyBBcnJheShqKSwKICAgICAgciA9IG5ldyBBcnJheShqKSwKICAgICAgaSA9IC0xOwoKICAvLyBSZXZlcnNlIGRlc2NlbmRpbmcgZG9tYWlucy4KICBpZiAoZG9tYWluW2pdIDwgZG9tYWluWzBdKSB7CiAgICBkb21haW4gPSBkb21haW4uc2xpY2UoKS5yZXZlcnNlKCk7CiAgICByYW5nZSQkMSA9IHJhbmdlJCQxLnNsaWNlKCkucmV2ZXJzZSgpOwogIH0KCiAgd2hpbGUgKCsraSA8IGopIHsKICAgIGRbaV0gPSBkZWludGVycG9sYXRlKGRvbWFpbltpXSwgZG9tYWluW2kgKyAxXSk7CiAgICByW2ldID0gcmVpbnRlcnBvbGF0ZShyYW5nZSQkMVtpXSwgcmFuZ2UkJDFbaSArIDFdKTsKICB9CgogIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICB2YXIgaSA9IGQzQXJyYXkuYmlzZWN0KGRvbWFpbiwgeCwgMSwgaikgLSAxOwogICAgcmV0dXJuIHJbaV0oZFtpXSh4KSk7CiAgfTsKfQoKZnVuY3Rpb24gY29weShzb3VyY2UsIHRhcmdldCkgewogIHJldHVybiB0YXJnZXQKICAgICAgLmRvbWFpbihzb3VyY2UuZG9tYWluKCkpCiAgICAgIC5yYW5nZShzb3VyY2UucmFuZ2UoKSkKICAgICAgLmludGVycG9sYXRlKHNvdXJjZS5pbnRlcnBvbGF0ZSgpKQogICAgICAuY2xhbXAoc291cmNlLmNsYW1wKCkpOwp9CgovLyBkZWludGVycG9sYXRlKGEsIGIpKHgpIHRha2VzIGEgZG9tYWluIHZhbHVlIHggaW4gW2EsYl0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHQgaW4gWzAsMV0uCi8vIHJlaW50ZXJwb2xhdGUoYSwgYikodCkgdGFrZXMgYSBwYXJhbWV0ZXIgdCBpbiBbMCwxXSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBkb21haW4gdmFsdWUgeCBpbiBbYSxiXS4KZnVuY3Rpb24gY29udGludW91cyhkZWludGVycG9sYXRlLCByZWludGVycG9sYXRlKSB7CiAgdmFyIGRvbWFpbiA9IHVuaXQsCiAgICAgIHJhbmdlJCQxID0gdW5pdCwKICAgICAgaW50ZXJwb2xhdGUkJDEgPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlLAogICAgICBjbGFtcCA9IGZhbHNlLAogICAgICBwaWVjZXdpc2UsCiAgICAgIG91dHB1dCwKICAgICAgaW5wdXQ7CgogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICBwaWVjZXdpc2UgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZSQkMS5sZW5ndGgpID4gMiA/IHBvbHltYXAgOiBiaW1hcDsKICAgIG91dHB1dCA9IGlucHV0ID0gbnVsbDsKICAgIHJldHVybiBzY2FsZTsKICB9CgogIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgIHJldHVybiAob3V0cHV0IHx8IChvdXRwdXQgPSBwaWVjZXdpc2UoZG9tYWluLCByYW5nZSQkMSwgY2xhbXAgPyBkZWludGVycG9sYXRlQ2xhbXAoZGVpbnRlcnBvbGF0ZSkgOiBkZWludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSQkMSkpKSgreCk7CiAgfQoKICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7CiAgICByZXR1cm4gKGlucHV0IHx8IChpbnB1dCA9IHBpZWNld2lzZShyYW5nZSQkMSwgZG9tYWluLCBkZWludGVycG9sYXRlTGluZWFyLCBjbGFtcCA/IHJlaW50ZXJwb2xhdGVDbGFtcChyZWludGVycG9sYXRlKSA6IHJlaW50ZXJwb2xhdGUpKSkoK3kpOwogIH07CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IG1hcCQxLmNhbGwoXywgbnVtYmVyKSwgcmVzY2FsZSgpKSA6IGRvbWFpbi5zbGljZSgpOwogIH07CgogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UkJDEgPSBzbGljZS5jYWxsKF8pLCByZXNjYWxlKCkpIDogcmFuZ2UkJDEuc2xpY2UoKTsKICB9OwoKICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIHJhbmdlJCQxID0gc2xpY2UuY2FsbChfKSwgaW50ZXJwb2xhdGUkJDEgPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlUm91bmQsIHJlc2NhbGUoKTsKICB9OwoKICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsYW1wID0gISFfLCByZXNjYWxlKCkpIDogY2xhbXA7CiAgfTsKCiAgc2NhbGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSQkMSA9IF8sIHJlc2NhbGUoKSkgOiBpbnRlcnBvbGF0ZSQkMTsKICB9OwoKICByZXR1cm4gcmVzY2FsZSgpOwp9Cgp2YXIgdGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGRvbWFpbiwgY291bnQsIHNwZWNpZmllcikgewogIHZhciBzdGFydCA9IGRvbWFpblswXSwKICAgICAgc3RvcCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV0sCiAgICAgIHN0ZXAgPSBkM0FycmF5LnRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCksCiAgICAgIHByZWNpc2lvbjsKICBzcGVjaWZpZXIgPSBkM0Zvcm1hdC5mb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyID09IG51bGwgPyAiLGYiIDogc3BlY2lmaWVyKTsKICBzd2l0Y2ggKHNwZWNpZmllci50eXBlKSB7CiAgICBjYXNlICJzIjogewogICAgICB2YXIgdmFsdWUgPSBNYXRoLm1heChNYXRoLmFicyhzdGFydCksIE1hdGguYWJzKHN0b3ApKTsKICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gZDNGb3JtYXQucHJlY2lzaW9uUHJlZml4KHN0ZXAsIHZhbHVlKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb247CiAgICAgIHJldHVybiBkM0Zvcm1hdC5mb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSk7CiAgICB9CiAgICBjYXNlICIiOgogICAgY2FzZSAiZSI6CiAgICBjYXNlICJnIjoKICAgIGNhc2UgInAiOgogICAgY2FzZSAiciI6IHsKICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gZDNGb3JtYXQucHJlY2lzaW9uUm91bmQoc3RlcCwgTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSkpKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gImUiKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlICJmIjoKICAgIGNhc2UgIiUiOiB7CiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IGQzRm9ybWF0LnByZWNpc2lvbkZpeGVkKHN0ZXApKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gIiUiKSAqIDI7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gZDNGb3JtYXQuZm9ybWF0KHNwZWNpZmllcik7Cn07CgpmdW5jdGlvbiBsaW5lYXJpc2goc2NhbGUpIHsKICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluOwoKICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGNvdW50KSB7CiAgICB2YXIgZCA9IGRvbWFpbigpOwogICAgcmV0dXJuIGQzQXJyYXkudGlja3MoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCk7CiAgfTsKCiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHsKICAgIHJldHVybiB0aWNrRm9ybWF0KGRvbWFpbigpLCBjb3VudCwgc3BlY2lmaWVyKTsKICB9OwoKICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oY291bnQpIHsKICAgIHZhciBkID0gZG9tYWluKCksCiAgICAgICAgaSA9IGQubGVuZ3RoIC0gMSwKICAgICAgICBuID0gY291bnQgPT0gbnVsbCA/IDEwIDogY291bnQsCiAgICAgICAgc3RhcnQgPSBkWzBdLAogICAgICAgIHN0b3AgPSBkW2ldLAogICAgICAgIHN0ZXAgPSBkM0FycmF5LnRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBuKTsKCiAgICBpZiAoc3RlcCkgewogICAgICBzdGVwID0gZDNBcnJheS50aWNrU3RlcChNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwLCBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcCwgbik7CiAgICAgIGRbMF0gPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwOwogICAgICBkW2ldID0gTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXA7CiAgICAgIGRvbWFpbihkKTsKICAgIH0KCiAgICByZXR1cm4gc2NhbGU7CiAgfTsKCiAgcmV0dXJuIHNjYWxlOwp9CgpmdW5jdGlvbiBsaW5lYXIoKSB7CiAgdmFyIHNjYWxlID0gY29udGludW91cyhkZWludGVycG9sYXRlTGluZWFyLCBkM0ludGVycG9sYXRlLmludGVycG9sYXRlTnVtYmVyKTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvcHkoc2NhbGUsIGxpbmVhcigpKTsKICB9OwoKICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsKfQoKZnVuY3Rpb24gaWRlbnRpdHkoKSB7CiAgdmFyIGRvbWFpbiA9IFswLCAxXTsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgcmV0dXJuICt4OwogIH0KCiAgc2NhbGUuaW52ZXJ0ID0gc2NhbGU7CgogIHNjYWxlLmRvbWFpbiA9IHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gbWFwJDEuY2FsbChfLCBudW1iZXIpLCBzY2FsZSkgOiBkb21haW4uc2xpY2UoKTsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gaWRlbnRpdHkoKS5kb21haW4oZG9tYWluKTsKICB9OwoKICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsKfQoKdmFyIG5pY2UgPSBmdW5jdGlvbihkb21haW4sIGludGVydmFsKSB7CiAgZG9tYWluID0gZG9tYWluLnNsaWNlKCk7CgogIHZhciBpMCA9IDAsCiAgICAgIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsCiAgICAgIHgwID0gZG9tYWluW2kwXSwKICAgICAgeDEgPSBkb21haW5baTFdLAogICAgICB0OwoKICBpZiAoeDEgPCB4MCkgewogICAgdCA9IGkwLCBpMCA9IGkxLCBpMSA9IHQ7CiAgICB0ID0geDAsIHgwID0geDEsIHgxID0gdDsKICB9CgogIGRvbWFpbltpMF0gPSBpbnRlcnZhbC5mbG9vcih4MCk7CiAgZG9tYWluW2kxXSA9IGludGVydmFsLmNlaWwoeDEpOwogIHJldHVybiBkb21haW47Cn07CgpmdW5jdGlvbiBkZWludGVycG9sYXRlKGEsIGIpIHsKICByZXR1cm4gKGIgPSBNYXRoLmxvZyhiIC8gYSkpCiAgICAgID8gZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5sb2coeCAvIGEpIC8gYjsgfQogICAgICA6IGNvbnN0YW50KGIpOwp9CgpmdW5jdGlvbiByZWludGVycG9sYXRlKGEsIGIpIHsKICByZXR1cm4gYSA8IDAKICAgICAgPyBmdW5jdGlvbih0KSB7IHJldHVybiAtTWF0aC5wb3coLWIsIHQpICogTWF0aC5wb3coLWEsIDEgLSB0KTsgfQogICAgICA6IGZ1bmN0aW9uKHQpIHsgcmV0dXJuIE1hdGgucG93KGIsIHQpICogTWF0aC5wb3coYSwgMSAtIHQpOyB9Owp9CgpmdW5jdGlvbiBwb3cxMCh4KSB7CiAgcmV0dXJuIGlzRmluaXRlKHgpID8gKygiMWUiICsgeCkgOiB4IDwgMCA/IDAgOiB4Owp9CgpmdW5jdGlvbiBwb3dwKGJhc2UpIHsKICByZXR1cm4gYmFzZSA9PT0gMTAgPyBwb3cxMAogICAgICA6IGJhc2UgPT09IE1hdGguRSA/IE1hdGguZXhwCiAgICAgIDogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5wb3coYmFzZSwgeCk7IH07Cn0KCmZ1bmN0aW9uIGxvZ3AoYmFzZSkgewogIHJldHVybiBiYXNlID09PSBNYXRoLkUgPyBNYXRoLmxvZwogICAgICA6IGJhc2UgPT09IDEwICYmIE1hdGgubG9nMTAKICAgICAgfHwgYmFzZSA9PT0gMiAmJiBNYXRoLmxvZzIKICAgICAgfHwgKGJhc2UgPSBNYXRoLmxvZyhiYXNlKSwgZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5sb2coeCkgLyBiYXNlOyB9KTsKfQoKZnVuY3Rpb24gcmVmbGVjdChmKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiAtZigteCk7CiAgfTsKfQoKZnVuY3Rpb24gbG9nKCkgewogIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSkuZG9tYWluKFsxLCAxMF0pLAogICAgICBkb21haW4gPSBzY2FsZS5kb21haW4sCiAgICAgIGJhc2UgPSAxMCwKICAgICAgbG9ncyA9IGxvZ3AoMTApLAogICAgICBwb3dzID0gcG93cCgxMCk7CgogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICBsb2dzID0gbG9ncChiYXNlKSwgcG93cyA9IHBvd3AoYmFzZSk7CiAgICBpZiAoZG9tYWluKClbMF0gPCAwKSBsb2dzID0gcmVmbGVjdChsb2dzKSwgcG93cyA9IHJlZmxlY3QocG93cyk7CiAgICByZXR1cm4gc2NhbGU7CiAgfQoKICBzY2FsZS5iYXNlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFzZSA9ICtfLCByZXNjYWxlKCkpIDogYmFzZTsKICB9OwoKICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4oXyksIHJlc2NhbGUoKSkgOiBkb21haW4oKTsKICB9OwoKICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGNvdW50KSB7CiAgICB2YXIgZCA9IGRvbWFpbigpLAogICAgICAgIHUgPSBkWzBdLAogICAgICAgIHYgPSBkW2QubGVuZ3RoIC0gMV0sCiAgICAgICAgcjsKCiAgICBpZiAociA9IHYgPCB1KSBpID0gdSwgdSA9IHYsIHYgPSBpOwoKICAgIHZhciBpID0gbG9ncyh1KSwKICAgICAgICBqID0gbG9ncyh2KSwKICAgICAgICBwLAogICAgICAgIGssCiAgICAgICAgdCwKICAgICAgICBuID0gY291bnQgPT0gbnVsbCA/IDEwIDogK2NvdW50LAogICAgICAgIHogPSBbXTsKCiAgICBpZiAoIShiYXNlICUgMSkgJiYgaiAtIGkgPCBuKSB7CiAgICAgIGkgPSBNYXRoLnJvdW5kKGkpIC0gMSwgaiA9IE1hdGgucm91bmQoaikgKyAxOwogICAgICBpZiAodSA+IDApIGZvciAoOyBpIDwgajsgKytpKSB7CiAgICAgICAgZm9yIChrID0gMSwgcCA9IHBvd3MoaSk7IGsgPCBiYXNlOyArK2spIHsKICAgICAgICAgIHQgPSBwICogazsKICAgICAgICAgIGlmICh0IDwgdSkgY29udGludWU7CiAgICAgICAgICBpZiAodCA+IHYpIGJyZWFrOwogICAgICAgICAgei5wdXNoKHQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGZvciAoOyBpIDwgajsgKytpKSB7CiAgICAgICAgZm9yIChrID0gYmFzZSAtIDEsIHAgPSBwb3dzKGkpOyBrID49IDE7IC0taykgewogICAgICAgICAgdCA9IHAgKiBrOwogICAgICAgICAgaWYgKHQgPCB1KSBjb250aW51ZTsKICAgICAgICAgIGlmICh0ID4gdikgYnJlYWs7CiAgICAgICAgICB6LnB1c2godCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICB6ID0gZDNBcnJheS50aWNrcyhpLCBqLCBNYXRoLm1pbihqIC0gaSwgbikpLm1hcChwb3dzKTsKICAgIH0KCiAgICByZXR1cm4gciA/IHoucmV2ZXJzZSgpIDogejsKICB9OwoKICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikgewogICAgaWYgKHNwZWNpZmllciA9PSBudWxsKSBzcGVjaWZpZXIgPSBiYXNlID09PSAxMCA/ICIuMGUiIDogIiwiOwogICAgaWYgKHR5cGVvZiBzcGVjaWZpZXIgIT09ICJmdW5jdGlvbiIpIHNwZWNpZmllciA9IGQzRm9ybWF0LmZvcm1hdChzcGVjaWZpZXIpOwogICAgaWYgKGNvdW50ID09PSBJbmZpbml0eSkgcmV0dXJuIHNwZWNpZmllcjsKICAgIGlmIChjb3VudCA9PSBudWxsKSBjb3VudCA9IDEwOwogICAgdmFyIGsgPSBNYXRoLm1heCgxLCBiYXNlICogY291bnQgLyBzY2FsZS50aWNrcygpLmxlbmd0aCk7IC8vIFRPRE8gZmFzdCBlc3RpbWF0ZT8KICAgIHJldHVybiBmdW5jdGlvbihkKSB7CiAgICAgIHZhciBpID0gZCAvIHBvd3MoTWF0aC5yb3VuZChsb2dzKGQpKSk7CiAgICAgIGlmIChpICogYmFzZSA8IGJhc2UgLSAwLjUpIGkgKj0gYmFzZTsKICAgICAgcmV0dXJuIGkgPD0gayA/IHNwZWNpZmllcihkKSA6ICIiOwogICAgfTsKICB9OwoKICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZG9tYWluKG5pY2UoZG9tYWluKCksIHsKICAgICAgZmxvb3I6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHBvd3MoTWF0aC5mbG9vcihsb2dzKHgpKSk7IH0sCiAgICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHBvd3MoTWF0aC5jZWlsKGxvZ3MoeCkpKTsgfQogICAgfSkpOwogIH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBjb3B5KHNjYWxlLCBsb2coKS5iYXNlKGJhc2UpKTsKICB9OwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIHJhaXNlKHgsIGV4cG9uZW50KSB7CiAgcmV0dXJuIHggPCAwID8gLU1hdGgucG93KC14LCBleHBvbmVudCkgOiBNYXRoLnBvdyh4LCBleHBvbmVudCk7Cn0KCmZ1bmN0aW9uIHBvdygpIHsKICB2YXIgZXhwb25lbnQgPSAxLAogICAgICBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSksCiAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbjsKCiAgZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZShhLCBiKSB7CiAgICByZXR1cm4gKGIgPSByYWlzZShiLCBleHBvbmVudCkgLSAoYSA9IHJhaXNlKGEsIGV4cG9uZW50KSkpCiAgICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiAocmFpc2UoeCwgZXhwb25lbnQpIC0gYSkgLyBiOyB9CiAgICAgICAgOiBjb25zdGFudChiKTsKICB9CgogIGZ1bmN0aW9uIHJlaW50ZXJwb2xhdGUoYSwgYikgewogICAgYiA9IHJhaXNlKGIsIGV4cG9uZW50KSAtIChhID0gcmFpc2UoYSwgZXhwb25lbnQpKTsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7IHJldHVybiByYWlzZShhICsgYiAqIHQsIDEgLyBleHBvbmVudCk7IH07CiAgfQoKICBzY2FsZS5leHBvbmVudCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4cG9uZW50ID0gK18sIGRvbWFpbihkb21haW4oKSkpIDogZXhwb25lbnQ7CiAgfTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvcHkoc2NhbGUsIHBvdygpLmV4cG9uZW50KGV4cG9uZW50KSk7CiAgfTsKCiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7Cn0KCmZ1bmN0aW9uIHNxcnQoKSB7CiAgcmV0dXJuIHBvdygpLmV4cG9uZW50KDAuNSk7Cn0KCmZ1bmN0aW9uIHF1YW50aWxlJDEoKSB7CiAgdmFyIGRvbWFpbiA9IFtdLAogICAgICByYW5nZSQkMSA9IFtdLAogICAgICB0aHJlc2hvbGRzID0gW107CgogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICB2YXIgaSA9IDAsIG4gPSBNYXRoLm1heCgxLCByYW5nZSQkMS5sZW5ndGgpOwogICAgdGhyZXNob2xkcyA9IG5ldyBBcnJheShuIC0gMSk7CiAgICB3aGlsZSAoKytpIDwgbikgdGhyZXNob2xkc1tpIC0gMV0gPSBkM0FycmF5LnF1YW50aWxlKGRvbWFpbiwgaSAvIG4pOwogICAgcmV0dXJuIHNjYWxlOwogIH0KCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgaWYgKCFpc05hTih4ID0gK3gpKSByZXR1cm4gcmFuZ2UkJDFbZDNBcnJheS5iaXNlY3QodGhyZXNob2xkcywgeCldOwogIH0KCiAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgewogICAgdmFyIGkgPSByYW5nZSQkMS5pbmRleE9mKHkpOwogICAgcmV0dXJuIGkgPCAwID8gW05hTiwgTmFOXSA6IFsKICAgICAgaSA+IDAgPyB0aHJlc2hvbGRzW2kgLSAxXSA6IGRvbWFpblswXSwKICAgICAgaSA8IHRocmVzaG9sZHMubGVuZ3RoID8gdGhyZXNob2xkc1tpXSA6IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV0KICAgIF07CiAgfTsKCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7CiAgICBkb21haW4gPSBbXTsKICAgIGZvciAodmFyIGkgPSAwLCBuID0gXy5sZW5ndGgsIGQ7IGkgPCBuOyArK2kpIGlmIChkID0gX1tpXSwgZCAhPSBudWxsICYmICFpc05hTihkID0gK2QpKSBkb21haW4ucHVzaChkKTsKICAgIGRvbWFpbi5zb3J0KGQzQXJyYXkuYXNjZW5kaW5nKTsKICAgIHJldHVybiByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSQkMSA9IHNsaWNlLmNhbGwoXyksIHJlc2NhbGUoKSkgOiByYW5nZSQkMS5zbGljZSgpOwogIH07CgogIHNjYWxlLnF1YW50aWxlcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRocmVzaG9sZHMuc2xpY2UoKTsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gcXVhbnRpbGUkMSgpCiAgICAgICAgLmRvbWFpbihkb21haW4pCiAgICAgICAgLnJhbmdlKHJhbmdlJCQxKTsKICB9OwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIHF1YW50aXplKCkgewogIHZhciB4MCA9IDAsCiAgICAgIHgxID0gMSwKICAgICAgbiA9IDEsCiAgICAgIGRvbWFpbiA9IFswLjVdLAogICAgICByYW5nZSQkMSA9IFswLCAxXTsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgaWYgKHggPD0geCkgcmV0dXJuIHJhbmdlJCQxW2QzQXJyYXkuYmlzZWN0KGRvbWFpbiwgeCwgMCwgbildOwogIH0KCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgIHZhciBpID0gLTE7CiAgICBkb21haW4gPSBuZXcgQXJyYXkobik7CiAgICB3aGlsZSAoKytpIDwgbikgZG9tYWluW2ldID0gKChpICsgMSkgKiB4MSAtIChpIC0gbikgKiB4MCkgLyAobiArIDEpOwogICAgcmV0dXJuIHNjYWxlOwogIH0KCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSArX1swXSwgeDEgPSArX1sxXSwgcmVzY2FsZSgpKSA6IFt4MCwgeDFdOwogIH07CgogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobiA9IChyYW5nZSQkMSA9IHNsaWNlLmNhbGwoXykpLmxlbmd0aCAtIDEsIHJlc2NhbGUoKSkgOiByYW5nZSQkMS5zbGljZSgpOwogIH07CgogIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHsKICAgIHZhciBpID0gcmFuZ2UkJDEuaW5kZXhPZih5KTsKICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl0KICAgICAgICA6IGkgPCAxID8gW3gwLCBkb21haW5bMF1dCiAgICAgICAgOiBpID49IG4gPyBbZG9tYWluW24gLSAxXSwgeDFdCiAgICAgICAgOiBbZG9tYWluW2kgLSAxXSwgZG9tYWluW2ldXTsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gcXVhbnRpemUoKQogICAgICAgIC5kb21haW4oW3gwLCB4MV0pCiAgICAgICAgLnJhbmdlKHJhbmdlJCQxKTsKICB9OwoKICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsKfQoKZnVuY3Rpb24gdGhyZXNob2xkKCkgewogIHZhciBkb21haW4gPSBbMC41XSwKICAgICAgcmFuZ2UkJDEgPSBbMCwgMV0sCiAgICAgIG4gPSAxOwoKICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICBpZiAoeCA8PSB4KSByZXR1cm4gcmFuZ2UkJDFbZDNBcnJheS5iaXNlY3QoZG9tYWluLCB4LCAwLCBuKV07CiAgfQoKICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSBzbGljZS5jYWxsKF8pLCBuID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UkJDEubGVuZ3RoIC0gMSksIHNjYWxlKSA6IGRvbWFpbi5zbGljZSgpOwogIH07CgogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UkJDEgPSBzbGljZS5jYWxsKF8pLCBuID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UkJDEubGVuZ3RoIC0gMSksIHNjYWxlKSA6IHJhbmdlJCQxLnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgewogICAgdmFyIGkgPSByYW5nZSQkMS5pbmRleE9mKHkpOwogICAgcmV0dXJuIFtkb21haW5baSAtIDFdLCBkb21haW5baV1dOwogIH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aHJlc2hvbGQoKQogICAgICAgIC5kb21haW4oZG9tYWluKQogICAgICAgIC5yYW5nZShyYW5nZSQkMSk7CiAgfTsKCiAgcmV0dXJuIHNjYWxlOwp9Cgp2YXIgZHVyYXRpb25TZWNvbmQgPSAxMDAwOwp2YXIgZHVyYXRpb25NaW51dGUgPSBkdXJhdGlvblNlY29uZCAqIDYwOwp2YXIgZHVyYXRpb25Ib3VyID0gZHVyYXRpb25NaW51dGUgKiA2MDsKdmFyIGR1cmF0aW9uRGF5ID0gZHVyYXRpb25Ib3VyICogMjQ7CnZhciBkdXJhdGlvbldlZWsgPSBkdXJhdGlvbkRheSAqIDc7CnZhciBkdXJhdGlvbk1vbnRoID0gZHVyYXRpb25EYXkgKiAzMDsKdmFyIGR1cmF0aW9uWWVhciA9IGR1cmF0aW9uRGF5ICogMzY1OwoKZnVuY3Rpb24gZGF0ZSh0KSB7CiAgcmV0dXJuIG5ldyBEYXRlKHQpOwp9CgpmdW5jdGlvbiBudW1iZXIkMSh0KSB7CiAgcmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlID8gK3QgOiArbmV3IERhdGUoK3QpOwp9CgpmdW5jdGlvbiBjYWxlbmRhcih5ZWFyLCBtb250aCwgd2VlaywgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIGZvcm1hdCQkMSkgewogIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZUxpbmVhciwgZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZU51bWJlciksCiAgICAgIGludmVydCA9IHNjYWxlLmludmVydCwKICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluOwoKICB2YXIgZm9ybWF0TWlsbGlzZWNvbmQgPSBmb3JtYXQkJDEoIi4lTCIpLAogICAgICBmb3JtYXRTZWNvbmQgPSBmb3JtYXQkJDEoIjolUyIpLAogICAgICBmb3JtYXRNaW51dGUgPSBmb3JtYXQkJDEoIiVJOiVNIiksCiAgICAgIGZvcm1hdEhvdXIgPSBmb3JtYXQkJDEoIiVJICVwIiksCiAgICAgIGZvcm1hdERheSA9IGZvcm1hdCQkMSgiJWEgJWQiKSwKICAgICAgZm9ybWF0V2VlayA9IGZvcm1hdCQkMSgiJWIgJWQiKSwKICAgICAgZm9ybWF0TW9udGggPSBmb3JtYXQkJDEoIiVCIiksCiAgICAgIGZvcm1hdFllYXIgPSBmb3JtYXQkJDEoIiVZIik7CgogIHZhciB0aWNrSW50ZXJ2YWxzID0gWwogICAgW3NlY29uZCwgIDEsICAgICAgZHVyYXRpb25TZWNvbmRdLAogICAgW3NlY29uZCwgIDUsICA1ICogZHVyYXRpb25TZWNvbmRdLAogICAgW3NlY29uZCwgMTUsIDE1ICogZHVyYXRpb25TZWNvbmRdLAogICAgW3NlY29uZCwgMzAsIDMwICogZHVyYXRpb25TZWNvbmRdLAogICAgW21pbnV0ZSwgIDEsICAgICAgZHVyYXRpb25NaW51dGVdLAogICAgW21pbnV0ZSwgIDUsICA1ICogZHVyYXRpb25NaW51dGVdLAogICAgW21pbnV0ZSwgMTUsIDE1ICogZHVyYXRpb25NaW51dGVdLAogICAgW21pbnV0ZSwgMzAsIDMwICogZHVyYXRpb25NaW51dGVdLAogICAgWyAgaG91ciwgIDEsICAgICAgZHVyYXRpb25Ib3VyICBdLAogICAgWyAgaG91ciwgIDMsICAzICogZHVyYXRpb25Ib3VyICBdLAogICAgWyAgaG91ciwgIDYsICA2ICogZHVyYXRpb25Ib3VyICBdLAogICAgWyAgaG91ciwgMTIsIDEyICogZHVyYXRpb25Ib3VyICBdLAogICAgWyAgIGRheSwgIDEsICAgICAgZHVyYXRpb25EYXkgICBdLAogICAgWyAgIGRheSwgIDIsICAyICogZHVyYXRpb25EYXkgICBdLAogICAgWyAgd2VlaywgIDEsICAgICAgZHVyYXRpb25XZWVrICBdLAogICAgWyBtb250aCwgIDEsICAgICAgZHVyYXRpb25Nb250aCBdLAogICAgWyBtb250aCwgIDMsICAzICogZHVyYXRpb25Nb250aCBdLAogICAgWyAgeWVhciwgIDEsICAgICAgZHVyYXRpb25ZZWFyICBdCiAgXTsKCiAgZnVuY3Rpb24gdGlja0Zvcm1hdChkYXRlKSB7CiAgICByZXR1cm4gKHNlY29uZChkYXRlKSA8IGRhdGUgPyBmb3JtYXRNaWxsaXNlY29uZAogICAgICAgIDogbWludXRlKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdFNlY29uZAogICAgICAgIDogaG91cihkYXRlKSA8IGRhdGUgPyBmb3JtYXRNaW51dGUKICAgICAgICA6IGRheShkYXRlKSA8IGRhdGUgPyBmb3JtYXRIb3VyCiAgICAgICAgOiBtb250aChkYXRlKSA8IGRhdGUgPyAod2VlayhkYXRlKSA8IGRhdGUgPyBmb3JtYXREYXkgOiBmb3JtYXRXZWVrKQogICAgICAgIDogeWVhcihkYXRlKSA8IGRhdGUgPyBmb3JtYXRNb250aAogICAgICAgIDogZm9ybWF0WWVhcikoZGF0ZSk7CiAgfQoKICBmdW5jdGlvbiB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIHN0YXJ0LCBzdG9wLCBzdGVwKSB7CiAgICBpZiAoaW50ZXJ2YWwgPT0gbnVsbCkgaW50ZXJ2YWwgPSAxMDsKCiAgICAvLyBJZiBhIGRlc2lyZWQgdGljayBjb3VudCBpcyBzcGVjaWZpZWQsIHBpY2sgYSByZWFzb25hYmxlIHRpY2sgaW50ZXJ2YWwKICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgdGhlIGRvbWFpbiBhbmQgYSByb3VnaCBlc3RpbWF0ZSBvZiB0aWNrIHNpemUuCiAgICAvLyBPdGhlcndpc2UsIGFzc3VtZSBpbnRlcnZhbCBpcyBhbHJlYWR5IGEgdGltZSBpbnRlcnZhbCBhbmQgdXNlIGl0LgogICAgaWYgKHR5cGVvZiBpbnRlcnZhbCA9PT0gIm51bWJlciIpIHsKICAgICAgdmFyIHRhcmdldCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBpbnRlcnZhbCwKICAgICAgICAgIGkgPSBkM0FycmF5LmJpc2VjdG9yKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIGlbMl07IH0pLnJpZ2h0KHRpY2tJbnRlcnZhbHMsIHRhcmdldCk7CiAgICAgIGlmIChpID09PSB0aWNrSW50ZXJ2YWxzLmxlbmd0aCkgewogICAgICAgIHN0ZXAgPSBkM0FycmF5LnRpY2tTdGVwKHN0YXJ0IC8gZHVyYXRpb25ZZWFyLCBzdG9wIC8gZHVyYXRpb25ZZWFyLCBpbnRlcnZhbCk7CiAgICAgICAgaW50ZXJ2YWwgPSB5ZWFyOwogICAgICB9IGVsc2UgaWYgKGkpIHsKICAgICAgICBpID0gdGlja0ludGVydmFsc1t0YXJnZXQgLyB0aWNrSW50ZXJ2YWxzW2kgLSAxXVsyXSA8IHRpY2tJbnRlcnZhbHNbaV1bMl0gLyB0YXJnZXQgPyBpIC0gMSA6IGldOwogICAgICAgIHN0ZXAgPSBpWzFdOwogICAgICAgIGludGVydmFsID0gaVswXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGVwID0gZDNBcnJheS50aWNrU3RlcChzdGFydCwgc3RvcCwgaW50ZXJ2YWwpOwogICAgICAgIGludGVydmFsID0gbWlsbGlzZWNvbmQ7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc3RlcCA9PSBudWxsID8gaW50ZXJ2YWwgOiBpbnRlcnZhbC5ldmVyeShzdGVwKTsKICB9CgogIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkpIHsKICAgIHJldHVybiBuZXcgRGF0ZShpbnZlcnQoeSkpOwogIH07CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZG9tYWluKG1hcCQxLmNhbGwoXywgbnVtYmVyJDEpKSA6IGRvbWFpbigpLm1hcChkYXRlKTsKICB9OwoKICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGludGVydmFsLCBzdGVwKSB7CiAgICB2YXIgZCA9IGRvbWFpbigpLAogICAgICAgIHQwID0gZFswXSwKICAgICAgICB0MSA9IGRbZC5sZW5ndGggLSAxXSwKICAgICAgICByID0gdDEgPCB0MCwKICAgICAgICB0OwogICAgaWYgKHIpIHQgPSB0MCwgdDAgPSB0MSwgdDEgPSB0OwogICAgdCA9IHRpY2tJbnRlcnZhbChpbnRlcnZhbCwgdDAsIHQxLCBzdGVwKTsKICAgIHQgPSB0ID8gdC5yYW5nZSh0MCwgdDEgKyAxKSA6IFtdOyAvLyBpbmNsdXNpdmUgc3RvcAogICAgcmV0dXJuIHIgPyB0LnJldmVyc2UoKSA6IHQ7CiAgfTsKCiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHsKICAgIHJldHVybiBzcGVjaWZpZXIgPT0gbnVsbCA/IHRpY2tGb3JtYXQgOiBmb3JtYXQkJDEoc3BlY2lmaWVyKTsKICB9OwoKICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oaW50ZXJ2YWwsIHN0ZXApIHsKICAgIHZhciBkID0gZG9tYWluKCk7CiAgICByZXR1cm4gKGludGVydmFsID0gdGlja0ludGVydmFsKGludGVydmFsLCBkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIHN0ZXApKQogICAgICAgID8gZG9tYWluKG5pY2UoZCwgaW50ZXJ2YWwpKQogICAgICAgIDogc2NhbGU7CiAgfTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvcHkoc2NhbGUsIGNhbGVuZGFyKHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwgZm9ybWF0JCQxKSk7CiAgfTsKCiAgcmV0dXJuIHNjYWxlOwp9Cgp2YXIgdGltZSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBjYWxlbmRhcihkM1RpbWUudGltZVllYXIsIGQzVGltZS50aW1lTW9udGgsIGQzVGltZS50aW1lV2VlaywgZDNUaW1lLnRpbWVEYXksIGQzVGltZS50aW1lSG91ciwgZDNUaW1lLnRpbWVNaW51dGUsIGQzVGltZS50aW1lU2Vjb25kLCBkM1RpbWUudGltZU1pbGxpc2Vjb25kLCBkM1RpbWVGb3JtYXQudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyMDAwLCAwLCAxKSwgbmV3IERhdGUoMjAwMCwgMCwgMildKTsKfTsKCnZhciB1dGNUaW1lID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIGNhbGVuZGFyKGQzVGltZS51dGNZZWFyLCBkM1RpbWUudXRjTW9udGgsIGQzVGltZS51dGNXZWVrLCBkM1RpbWUudXRjRGF5LCBkM1RpbWUudXRjSG91ciwgZDNUaW1lLnV0Y01pbnV0ZSwgZDNUaW1lLnV0Y1NlY29uZCwgZDNUaW1lLnV0Y01pbGxpc2Vjb25kLCBkM1RpbWVGb3JtYXQudXRjRm9ybWF0KS5kb21haW4oW0RhdGUuVVRDKDIwMDAsIDAsIDEpLCBEYXRlLlVUQygyMDAwLCAwLCAyKV0pOwp9OwoKdmFyIGNvbG9ycyA9IGZ1bmN0aW9uKHMpIHsKICByZXR1cm4gcy5tYXRjaCgvLns2fS9nKS5tYXAoZnVuY3Rpb24oeCkgewogICAgcmV0dXJuICIjIiArIHg7CiAgfSk7Cn07Cgp2YXIgY2F0ZWdvcnkxMCA9IGNvbG9ycygiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmIik7Cgp2YXIgY2F0ZWdvcnkyMGIgPSBjb2xvcnMoIjM5M2I3OTUyNTRhMzZiNmVjZjljOWVkZTYzNzkzOThjYTI1MmI1Y2Y2YmNlZGI5YzhjNmQzMWJkOWUzOWU3YmE1MmU3Y2I5NDg0M2MzOWFkNDk0YWQ2NjE2YmU3OTY5YzdiNDE3M2E1NTE5NGNlNmRiZGRlOWVkNiIpOwoKdmFyIGNhdGVnb3J5MjBjID0gY29sb3JzKCIzMTgyYmQ2YmFlZDY5ZWNhZTFjNmRiZWZlNjU1MGRmZDhkM2NmZGFlNmJmZGQwYTIzMWEzNTQ3NGM0NzZhMWQ5OWJjN2U5YzA3NTZiYjE5ZTlhYzhiY2JkZGNkYWRhZWI2MzYzNjM5Njk2OTZiZGJkYmRkOWQ5ZDkiKTsKCnZhciBjYXRlZ29yeTIwID0gY29sb3JzKCIxZjc3YjRhZWM3ZThmZjdmMGVmZmJiNzgyY2EwMmM5OGRmOGFkNjI3MjhmZjk4OTY5NDY3YmRjNWIwZDU4YzU2NGJjNDljOTRlMzc3YzJmN2I2ZDI3ZjdmN2ZjN2M3YzdiY2JkMjJkYmRiOGQxN2JlY2Y5ZWRhZTUiKTsKCnZhciBjdWJlaGVsaXgkMSA9IGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nKGQzQ29sb3IuY3ViZWhlbGl4KDMwMCwgMC41LCAwLjApLCBkM0NvbG9yLmN1YmVoZWxpeCgtMjQwLCAwLjUsIDEuMCkpOwoKdmFyIHdhcm0gPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhkM0NvbG9yLmN1YmVoZWxpeCgtMTAwLCAwLjc1LCAwLjM1KSwgZDNDb2xvci5jdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpOwoKdmFyIGNvb2wgPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhkM0NvbG9yLmN1YmVoZWxpeCgyNjAsIDAuNzUsIDAuMzUpLCBkM0NvbG9yLmN1YmVoZWxpeCg4MCwgMS41MCwgMC44KSk7Cgp2YXIgcmFpbmJvdyA9IGQzQ29sb3IuY3ViZWhlbGl4KCk7Cgp2YXIgcmFpbmJvdyQxID0gZnVuY3Rpb24odCkgewogIGlmICh0IDwgMCB8fCB0ID4gMSkgdCAtPSBNYXRoLmZsb29yKHQpOwogIHZhciB0cyA9IE1hdGguYWJzKHQgLSAwLjUpOwogIHJhaW5ib3cuaCA9IDM2MCAqIHQgLSAxMDA7CiAgcmFpbmJvdy5zID0gMS41IC0gMS41ICogdHM7CiAgcmFpbmJvdy5sID0gMC44IC0gMC45ICogdHM7CiAgcmV0dXJuIHJhaW5ib3cgKyAiIjsKfTsKCmZ1bmN0aW9uIHJhbXAocmFuZ2UkJDEpIHsKICB2YXIgbiA9IHJhbmdlJCQxLmxlbmd0aDsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgcmV0dXJuIHJhbmdlJCQxW01hdGgubWF4KDAsIE1hdGgubWluKG4gLSAxLCBNYXRoLmZsb29yKHQgKiBuKSkpXTsKICB9Owp9Cgp2YXIgdmlyaWRpcyA9IHJhbXAoY29sb3JzKCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSk7Cgp2YXIgbWFnbWEgPSByYW1wKGNvbG9ycygiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTA5MDIwMjBiMDIwMjBkMDMwMzBmMDMwMzEyMDQwNDE0MDUwNDE2MDYwNTE4MDYwNTFhMDcwNjFjMDgwNzFlMDkwNzIwMGEwODIyMGIwOTI0MGMwOTI2MGQwYTI5MGUwYjJiMTAwYjJkMTEwYzJmMTIwZDMxMTMwZDM0MTQwZTM2MTUwZTM4MTYwZjNiMTgwZjNkMTkxMDNmMWExMDQyMWMxMDQ0MWQxMTQ3MWUxMTQ5MjAxMTRiMjExMTRlMjIxMTUwMjQxMjUzMjUxMjU1MjcxMjU4MjkxMTVhMmExMTVjMmMxMTVmMmQxMTYxMmYxMTYzMzExMTY1MzMxMDY3MzQxMDY5MzYxMDZiMzgxMDZjMzkwZjZlM2IwZjcwM2QwZjcxM2YwZjcyNDAwZjc0NDIwZjc1NDQwZjc2NDUxMDc3NDcxMDc4NDkxMDc4NGExMDc5NGMxMTdhNGUxMTdiNGYxMjdiNTExMjdjNTIxMzdjNTQxMzdkNTYxNDdkNTcxNTdlNTkxNTdlNWExNjdlNWMxNjdmNWQxNzdmNWYxODdmNjAxODgwNjIxOTgwNjQxYTgwNjUxYTgwNjcxYjgwNjgxYzgxNmExYzgxNmIxZDgxNmQxZDgxNmUxZTgxNzAxZjgxNzIxZjgxNzMyMDgxNzUyMTgxNzYyMTgxNzgyMjgxNzkyMjgyN2IyMzgyN2MyMzgyN2UyNDgyODAyNTgyODEyNTgxODMyNjgxODQyNjgxODYyNzgxODgyNzgxODkyODgxOGIyOTgxOGMyOTgxOGUyYTgxOTAyYTgxOTEyYjgxOTMyYjgwOTQyYzgwOTYyYzgwOTgyZDgwOTkyZDgwOWIyZTdmOWMyZTdmOWUyZjdmYTAyZjdmYTEzMDdlYTMzMDdlYTUzMTdlYTYzMTdkYTgzMjdkYWEzMzdkYWIzMzdjYWQzNDdjYWUzNDdiYjAzNTdiYjIzNTdiYjMzNjdhYjUzNjdhYjczNzc5YjgzNzc5YmEzODc4YmMzOTc4YmQzOTc3YmYzYTc3YzAzYTc2YzIzYjc1YzQzYzc1YzUzYzc0YzczZDczYzgzZTczY2EzZTcyY2MzZjcxY2Q0MDcxY2Y0MDcwZDA0MTZmZDI0MjZmZDM0MzZlZDU0NDZkZDY0NTZjZDg0NTZjZDk0NjZiZGI0NzZhZGM0ODY5ZGU0OTY4ZGY0YTY4ZTA0YzY3ZTI0ZDY2ZTM0ZTY1ZTQ0ZjY0ZTU1MDY0ZTc1MjYzZTg1MzYyZTk1NDYyZWE1NjYxZWI1NzYwZWM1ODYwZWQ1YTVmZWU1YjVlZWY1ZDVlZjA1ZjVlZjE2MDVkZjI2MjVkZjI2NDVjZjM2NTVjZjQ2NzVjZjQ2OTVjZjU2YjVjZjY2YzVjZjY2ZTVjZjc3MDVjZjc3MjVjZjg3NDVjZjg3NjVjZjk3ODVkZjk3OTVkZjk3YjVkZmE3ZDVlZmE3ZjVlZmE4MTVmZmI4MzVmZmI4NTYwZmI4NzYxZmM4OTYxZmM4YTYyZmM4YzYzZmM4ZTY0ZmM5MDY1ZmQ5MjY2ZmQ5NDY3ZmQ5NjY4ZmQ5ODY5ZmQ5YTZhZmQ5YjZiZmU5ZDZjZmU5ZjZkZmVhMTZlZmVhMzZmZmVhNTcxZmVhNzcyZmVhOTczZmVhYTc0ZmVhYzc2ZmVhZTc3ZmViMDc4ZmViMjdhZmViNDdiZmViNjdjZmViNzdlZmViOTdmZmViYjgxZmViZDgyZmViZjg0ZmVjMTg1ZmVjMjg3ZmVjNDg4ZmVjNjhhZmVjODhjZmVjYThkZmVjYzhmZmVjZDkwZmVjZjkyZmVkMTk0ZmVkMzk1ZmVkNTk3ZmVkNzk5ZmVkODlhZmRkYTljZmRkYzllZmRkZWEwZmRlMGExZmRlMmEzZmRlM2E1ZmRlNWE3ZmRlN2E5ZmRlOWFhZmRlYmFjZmNlY2FlZmNlZWIwZmNmMGIyZmNmMmI0ZmNmNGI2ZmNmNmI4ZmNmN2I5ZmNmOWJiZmNmYmJkZmNmZGJmIikpOwoKdmFyIGluZmVybm8gPSByYW1wKGNvbG9ycygiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpOwoKdmFyIHBsYXNtYSA9IHJhbXAoY29sb3JzKCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7CgpmdW5jdGlvbiBzZXF1ZW50aWFsKGludGVycG9sYXRvcikgewogIHZhciB4MCA9IDAsCiAgICAgIHgxID0gMSwKICAgICAgY2xhbXAgPSBmYWxzZTsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgdmFyIHQgPSAoeCAtIHgwKSAvICh4MSAtIHgwKTsKICAgIHJldHVybiBpbnRlcnBvbGF0b3IoY2xhbXAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0KSkgOiB0KTsKICB9CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gK19bMF0sIHgxID0gK19bMV0sIHNjYWxlKSA6IFt4MCwgeDFdOwogIH07CgogIHNjYWxlLmNsYW1wID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xhbXAgPSAhIV8sIHNjYWxlKSA6IGNsYW1wOwogIH07CgogIHNjYWxlLmludGVycG9sYXRvciA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRvciA9IF8sIHNjYWxlKSA6IGludGVycG9sYXRvcjsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gc2VxdWVudGlhbChpbnRlcnBvbGF0b3IpLmRvbWFpbihbeDAsIHgxXSkuY2xhbXAoY2xhbXApOwogIH07CgogIHJldHVybiBsaW5lYXJpc2goc2NhbGUpOwp9CgpleHBvcnRzLnNjYWxlQmFuZCA9IGJhbmQ7CmV4cG9ydHMuc2NhbGVQb2ludCA9IHBvaW50OwpleHBvcnRzLnNjYWxlSWRlbnRpdHkgPSBpZGVudGl0eTsKZXhwb3J0cy5zY2FsZUxpbmVhciA9IGxpbmVhcjsKZXhwb3J0cy5zY2FsZUxvZyA9IGxvZzsKZXhwb3J0cy5zY2FsZU9yZGluYWwgPSBvcmRpbmFsOwpleHBvcnRzLnNjYWxlSW1wbGljaXQgPSBpbXBsaWNpdDsKZXhwb3J0cy5zY2FsZVBvdyA9IHBvdzsKZXhwb3J0cy5zY2FsZVNxcnQgPSBzcXJ0OwpleHBvcnRzLnNjYWxlUXVhbnRpbGUgPSBxdWFudGlsZSQxOwpleHBvcnRzLnNjYWxlUXVhbnRpemUgPSBxdWFudGl6ZTsKZXhwb3J0cy5zY2FsZVRocmVzaG9sZCA9IHRocmVzaG9sZDsKZXhwb3J0cy5zY2FsZVRpbWUgPSB0aW1lOwpleHBvcnRzLnNjYWxlVXRjID0gdXRjVGltZTsKZXhwb3J0cy5zY2hlbWVDYXRlZ29yeTEwID0gY2F0ZWdvcnkxMDsKZXhwb3J0cy5zY2hlbWVDYXRlZ29yeTIwYiA9IGNhdGVnb3J5MjBiOwpleHBvcnRzLnNjaGVtZUNhdGVnb3J5MjBjID0gY2F0ZWdvcnkyMGM7CmV4cG9ydHMuc2NoZW1lQ2F0ZWdvcnkyMCA9IGNhdGVnb3J5MjA7CmV4cG9ydHMuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0ID0gY3ViZWhlbGl4JDE7CmV4cG9ydHMuaW50ZXJwb2xhdGVSYWluYm93ID0gcmFpbmJvdyQxOwpleHBvcnRzLmludGVycG9sYXRlV2FybSA9IHdhcm07CmV4cG9ydHMuaW50ZXJwb2xhdGVDb29sID0gY29vbDsKZXhwb3J0cy5pbnRlcnBvbGF0ZVZpcmlkaXMgPSB2aXJpZGlzOwpleHBvcnRzLmludGVycG9sYXRlTWFnbWEgPSBtYWdtYTsKZXhwb3J0cy5pbnRlcnBvbGF0ZUluZmVybm8gPSBpbmZlcm5vOwpleHBvcnRzLmludGVycG9sYXRlUGxhc21hID0gcGxhc21hOwpleHBvcnRzLnNjYWxlU2VxdWVudGlhbCA9IHNlcXVlbnRpYWw7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOwoKfSkpKTsKCn0seyJkMy1hcnJheSI6MiwiZDMtY29sbGVjdGlvbiI6NCwiZDMtY29sb3IiOjUsImQzLWZvcm1hdCI6NiwiZDMtaW50ZXJwb2xhdGUiOjcsImQzLXRpbWUiOjExLCJkMy10aW1lLWZvcm1hdCI6MTB9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1zZWxlY3Rpb24vIFZlcnNpb24gMS4wLjUuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOgoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6CgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOwp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7Cgp2YXIgeGh0bWwgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI7Cgp2YXIgbmFtZXNwYWNlcyA9IHsKICBzdmc6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgeGh0bWw6IHhodG1sLAogIHhsaW5rOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsCiAgeG1sOiAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwKICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIgp9OwoKdmFyIG5hbWVzcGFjZSA9IGZ1bmN0aW9uKG5hbWUpIHsKICB2YXIgcHJlZml4ID0gbmFtZSArPSAiIiwgaSA9IHByZWZpeC5pbmRleE9mKCI6Iik7CiAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09ICJ4bWxucyIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTsKICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7Cn07CgpmdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LAogICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJOwogICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwKICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSkKICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpOwogIH07Cn0KCmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgfTsKfQoKdmFyIGNyZWF0b3IgPSBmdW5jdGlvbihuYW1lKSB7CiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpOwogIHJldHVybiAoZnVsbG5hbWUubG9jYWwKICAgICAgPyBjcmVhdG9yRml4ZWQKICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpOwp9OwoKdmFyIG5leHRJZCA9IDA7CgpmdW5jdGlvbiBsb2NhbCgpIHsKICByZXR1cm4gbmV3IExvY2FsOwp9CgpmdW5jdGlvbiBMb2NhbCgpIHsKICB0aGlzLl8gPSAiQCIgKyAoKytuZXh0SWQpLnRvU3RyaW5nKDM2KTsKfQoKTG9jYWwucHJvdG90eXBlID0gbG9jYWwucHJvdG90eXBlID0gewogIGNvbnN0cnVjdG9yOiBMb2NhbCwKICBnZXQ6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIHZhciBpZCA9IHRoaXMuXzsKICAgIHdoaWxlICghKGlkIGluIG5vZGUpKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuOwogICAgcmV0dXJuIG5vZGVbaWRdOwogIH0sCiAgc2V0OiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgewogICAgcmV0dXJuIG5vZGVbdGhpcy5fXSA9IHZhbHVlOwogIH0sCiAgcmVtb3ZlOiBmdW5jdGlvbihub2RlKSB7CiAgICByZXR1cm4gdGhpcy5fIGluIG5vZGUgJiYgZGVsZXRlIG5vZGVbdGhpcy5fXTsKICB9LAogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLl87CiAgfQp9OwoKdmFyIG1hdGNoZXIgPSBmdW5jdGlvbihzZWxlY3RvcikgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm1hdGNoZXMoc2VsZWN0b3IpOwogIH07Cn07CgppZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgewogIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogIGlmICghZWxlbWVudC5tYXRjaGVzKSB7CiAgICB2YXIgdmVuZG9yTWF0Y2hlcyA9IGVsZW1lbnQud2Via2l0TWF0Y2hlc1NlbGVjdG9yCiAgICAgICAgfHwgZWxlbWVudC5tc01hdGNoZXNTZWxlY3RvcgogICAgICAgIHx8IGVsZW1lbnQubW96TWF0Y2hlc1NlbGVjdG9yCiAgICAgICAgfHwgZWxlbWVudC5vTWF0Y2hlc1NlbGVjdG9yOwogICAgbWF0Y2hlciA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdmVuZG9yTWF0Y2hlcy5jYWxsKHRoaXMsIHNlbGVjdG9yKTsKICAgICAgfTsKICAgIH07CiAgfQp9Cgp2YXIgbWF0Y2hlciQxID0gbWF0Y2hlcjsKCnZhciBmaWx0ZXJFdmVudHMgPSB7fTsKCmV4cG9ydHMuZXZlbnQgPSBudWxsOwoKaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIpIHsKICB2YXIgZWxlbWVudCQxID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogIGlmICghKCJvbm1vdXNlZW50ZXIiIGluIGVsZW1lbnQkMSkpIHsKICAgIGZpbHRlckV2ZW50cyA9IHttb3VzZWVudGVyOiAibW91c2VvdmVyIiwgbW91c2VsZWF2ZTogIm1vdXNlb3V0In07CiAgfQp9CgpmdW5jdGlvbiBmaWx0ZXJDb250ZXh0TGlzdGVuZXIobGlzdGVuZXIsIGluZGV4LCBncm91cCkgewogIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApOwogIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0OwogICAgaWYgKCFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0aGlzICYmICEocmVsYXRlZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSAmIDgpKSkgewogICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIsIGluZGV4LCBncm91cCkgewogIHJldHVybiBmdW5jdGlvbihldmVudDEpIHsKICAgIHZhciBldmVudDAgPSBleHBvcnRzLmV2ZW50OyAvLyBFdmVudHMgY2FuIGJlIHJlZW50cmFudCAoZS5nLiwgZm9jdXMpLgogICAgZXhwb3J0cy5ldmVudCA9IGV2ZW50MTsKICAgIHRyeSB7CiAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgdGhpcy5fX2RhdGFfXywgaW5kZXgsIGdyb3VwKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGV4cG9ydHMuZXZlbnQgPSBldmVudDA7CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzKSB7CiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpIHsKICAgIHZhciBuYW1lID0gIiIsIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9OwogIH0pOwp9CgpmdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBvbiA9IHRoaXMuX19vbjsKICAgIGlmICghb24pIHJldHVybjsKICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgaWYgKG8gPSBvbltqXSwgKCF0eXBlbmFtZS50eXBlIHx8IG8udHlwZSA9PT0gdHlwZW5hbWUudHlwZSkgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5jYXB0dXJlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvblsrK2ldID0gbzsKICAgICAgfQogICAgfQogICAgaWYgKCsraSkgb24ubGVuZ3RoID0gaTsKICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjsKICB9Owp9CgpmdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIGNhcHR1cmUpIHsKICB2YXIgd3JhcCA9IGZpbHRlckV2ZW50cy5oYXNPd25Qcm9wZXJ0eSh0eXBlbmFtZS50eXBlKSA/IGZpbHRlckNvbnRleHRMaXN0ZW5lciA6IGNvbnRleHRMaXN0ZW5lcjsKICByZXR1cm4gZnVuY3Rpb24oZCwgaSwgZ3JvdXApIHsKICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSB3cmFwKHZhbHVlLCBpLCBncm91cCk7CiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkgewogICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVyZSk7CiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLmNhcHR1cmUgPSBjYXB0dXJlKTsKICAgICAgICBvLnZhbHVlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlwZW5hbWUudHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpOwogICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgY2FwdHVyZTogY2FwdHVyZX07CiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107CiAgICBlbHNlIG9uLnB1c2gobyk7CiAgfTsKfQoKdmFyIHNlbGVjdGlvbl9vbiA9IGZ1bmN0aW9uKHR5cGVuYW1lLCB2YWx1ZSwgY2FwdHVyZSkgewogIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArICIiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7CgogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgdmFyIG9uID0gdGhpcy5ub2RlKCkuX19vbjsKICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCh0ID0gdHlwZW5hbWVzW2ldKS50eXBlID09PSBvLnR5cGUgJiYgdC5uYW1lID09PSBvLm5hbWUpIHsKICAgICAgICAgIHJldHVybiBvLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuOwogIH0KCiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7CiAgaWYgKGNhcHR1cmUgPT0gbnVsbCkgY2FwdHVyZSA9IGZhbHNlOwogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBjYXB0dXJlKSk7CiAgcmV0dXJuIHRoaXM7Cn07CgpmdW5jdGlvbiBjdXN0b21FdmVudChldmVudDEsIGxpc3RlbmVyLCB0aGF0LCBhcmdzKSB7CiAgdmFyIGV2ZW50MCA9IGV4cG9ydHMuZXZlbnQ7CiAgZXZlbnQxLnNvdXJjZUV2ZW50ID0gZXhwb3J0cy5ldmVudDsKICBleHBvcnRzLmV2ZW50ID0gZXZlbnQxOwogIHRyeSB7CiAgICByZXR1cm4gbGlzdGVuZXIuYXBwbHkodGhhdCwgYXJncyk7CiAgfSBmaW5hbGx5IHsKICAgIGV4cG9ydHMuZXZlbnQgPSBldmVudDA7CiAgfQp9Cgp2YXIgc291cmNlRXZlbnQgPSBmdW5jdGlvbigpIHsKICB2YXIgY3VycmVudCA9IGV4cG9ydHMuZXZlbnQsIHNvdXJjZTsKICB3aGlsZSAoc291cmNlID0gY3VycmVudC5zb3VyY2VFdmVudCkgY3VycmVudCA9IHNvdXJjZTsKICByZXR1cm4gY3VycmVudDsKfTsKCnZhciBwb2ludCA9IGZ1bmN0aW9uKG5vZGUsIGV2ZW50KSB7CiAgdmFyIHN2ZyA9IG5vZGUub3duZXJTVkdFbGVtZW50IHx8IG5vZGU7CgogIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHsKICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpOwogICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZOwogICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obm9kZS5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpOwogICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTsKICB9CgogIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTsKfTsKCnZhciBtb3VzZSA9IGZ1bmN0aW9uKG5vZGUpIHsKICB2YXIgZXZlbnQgPSBzb3VyY2VFdmVudCgpOwogIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlcykgZXZlbnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTsKICByZXR1cm4gcG9pbnQobm9kZSwgZXZlbnQpOwp9OwoKZnVuY3Rpb24gbm9uZSgpIHt9Cgp2YXIgc2VsZWN0b3IgPSBmdW5jdGlvbihzZWxlY3RvcikgewogIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgfTsKfTsKCnZhciBzZWxlY3Rpb25fc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0KSB7CiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgIGlmICgiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOwogICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKfTsKCmZ1bmN0aW9uIGVtcHR5KCkgewogIHJldHVybiBbXTsKfQoKdmFyIHNlbGVjdG9yQWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICB9Owp9OwoKdmFyIHNlbGVjdGlvbl9zZWxlY3RBbGwgPSBmdW5jdGlvbihzZWxlY3QpIHsKICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTsKCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTsKICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgcGFyZW50cyk7Cn07Cgp2YXIgc2VsZWN0aW9uX2ZpbHRlciA9IGZ1bmN0aW9uKG1hdGNoKSB7CiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gImZ1bmN0aW9uIikgbWF0Y2ggPSBtYXRjaGVyJDEobWF0Y2gpOwoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKfTsKCnZhciBzcGFyc2UgPSBmdW5jdGlvbih1cGRhdGUpIHsKICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpOwp9OwoKdmFyIHNlbGVjdGlvbl9lbnRlciA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7Cn07CgpmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkgewogIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50OwogIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTsKICB0aGlzLl9uZXh0ID0gbnVsbDsKICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtOwp9CgpFbnRlck5vZGUucHJvdG90eXBlID0gewogIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsCiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSwKICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSwKICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LAogIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH0KfTsKCnZhciBjb25zdGFudCA9IGZ1bmN0aW9uKHgpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDsKICB9Owp9OwoKdmFyIGtleVByZWZpeCA9ICIkIjsgLy8gUHJvdGVjdCBhZ2FpbnN0IGtleXMgbGlrZSDigJxfX3Byb3RvX1/igJ0uCgpmdW5jdGlvbiBiaW5kSW5kZXgocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSkgewogIHZhciBpID0gMCwKICAgICAgbm9kZSwKICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKCiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS4KICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci4KICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuCiAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHsKICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07CiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7CiAgICB9IGVsc2UgewogICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTsKICAgIH0KICB9CgogIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuCiAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgfQogIH0KfQoKZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHsKICB2YXIgaSwKICAgICAgbm9kZSwKICAgICAgbm9kZUJ5S2V5VmFsdWUgPSB7fSwKICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSwKICAgICAga2V5VmFsdWU7CgogIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLgogIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC4KICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkgewogICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleVByZWZpeCArIGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTsKICAgICAgaWYgKGtleVZhbHVlIGluIG5vZGVCeUtleVZhbHVlKSB7CiAgICAgICAgZXhpdFtpXSA9IG5vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbm9kZTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIGRhdHVtLgogIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuCiAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLgogIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHsKICAgIGtleVZhbHVlID0ga2V5UHJlZml4ICsga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKTsKICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdKSB7CiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7CiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICBub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV0gPSBudWxsOwogICAgfSBlbHNlIHsKICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7CiAgICB9CiAgfQoKICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC4KICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkgewogICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZXNbaV1dID09PSBub2RlKSkgewogICAgICBleGl0W2ldID0gbm9kZTsKICAgIH0KICB9Cn0KCnZhciBzZWxlY3Rpb25fZGF0YSA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKICBpZiAoIXZhbHVlKSB7CiAgICBkYXRhID0gbmV3IEFycmF5KHRoaXMuc2l6ZSgpKSwgaiA9IC0xOwogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKGQpIHsgZGF0YVsrK2pdID0gZDsgfSk7CiAgICByZXR1cm4gZGF0YTsKICB9CgogIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSA6IGJpbmRJbmRleCwKICAgICAgcGFyZW50cyA9IHRoaXMuX3BhcmVudHMsCiAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwczsKCiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdmFsdWUgPSBjb25zdGFudCh2YWx1ZSk7CgogIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sCiAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sCiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgICAgZGF0YSA9IHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSwKICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwoKICAgIGJpbmQocGFyZW50LCBncm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTsKCiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXQKICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsCiAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS4KICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7CiAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7CiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsgMTsKICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7CiAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7CiAgICAgIH0KICAgIH0KICB9CgogIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTsKICB1cGRhdGUuX2VudGVyID0gZW50ZXI7CiAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICByZXR1cm4gdXBkYXRlOwp9OwoKdmFyIHNlbGVjdGlvbl9leGl0ID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOwp9OwoKdmFyIHNlbGVjdGlvbl9tZXJnZSA9IGZ1bmN0aW9uKHNlbGVjdGlvbikgewoKICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHsKICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIGZvciAoOyBqIDwgbTA7ICsraikgewogICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICB9CgogIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7Cn07Cgp2YXIgc2VsZWN0aW9uX29yZGVyID0gZnVuY3Rpb24oKSB7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHsKICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09IG5vZGUubmV4dFNpYmxpbmcpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7CiAgICAgICAgbmV4dCA9IG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiB0aGlzOwp9OwoKdmFyIHNlbGVjdGlvbl9zb3J0ID0gZnVuY3Rpb24oY29tcGFyZSkgewogIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZzsKCiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikgewogICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiOwogIH0KCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTsKICAgICAgfQogICAgfQogICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpOwogIH0KCiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc29ydGdyb3VwcywgdGhpcy5fcGFyZW50cykub3JkZXIoKTsKfTsKCmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7CiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOOwp9Cgp2YXIgc2VsZWN0aW9uX2NhbGwgPSBmdW5jdGlvbigpIHsKICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07CiAgYXJndW1lbnRzWzBdID0gdGhpczsKICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpOwogIHJldHVybiB0aGlzOwp9OwoKdmFyIHNlbGVjdGlvbl9ub2RlcyA9IGZ1bmN0aW9uKCkgewogIHZhciBub2RlcyA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGkgPSAtMTsKICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7IG5vZGVzWysraV0gPSB0aGlzOyB9KTsKICByZXR1cm4gbm9kZXM7Cn07Cgp2YXIgc2VsZWN0aW9uX25vZGUgPSBmdW5jdGlvbigpIHsKCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldOwogICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7CiAgICB9CiAgfQoKICByZXR1cm4gbnVsbDsKfTsKCnZhciBzZWxlY3Rpb25fc2l6ZSA9IGZ1bmN0aW9uKCkgewogIHZhciBzaXplID0gMDsKICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7ICsrc2l6ZTsgfSk7CiAgcmV0dXJuIHNpemU7Cn07Cgp2YXIgc2VsZWN0aW9uX2VtcHR5ID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuICF0aGlzLm5vZGUoKTsKfTsKCnZhciBzZWxlY3Rpb25fZWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICB9CiAgfQoKICByZXR1cm4gdGhpczsKfTsKCmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogIH07Cn0KCmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICB9Owp9CgpmdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgdmFsdWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgfTsKfQoKZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTsKICB9Owp9CgpmdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7CiAgfTsKfQoKZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7CiAgfTsKfQoKdmFyIHNlbGVjdGlvbl9hdHRyID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7CgogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTsKICAgIHJldHVybiBmdWxsbmFtZS5sb2NhbAogICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpCiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7CiAgfQoKICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsCiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pCiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSkoZnVsbG5hbWUsIHZhbHVlKSk7Cn07Cgp2YXIgZGVmYXVsdFZpZXcgPSBmdW5jdGlvbihub2RlKSB7CiAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZQogICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93CiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudAp9OwoKZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgfTsKfQoKZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7CiAgfTsKfQoKZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOwogICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTsKICB9Owp9Cgp2YXIgc2VsZWN0aW9uX3N0eWxlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgdmFyIG5vZGU7CiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxCiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICAgID8gc3R5bGVSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uCiAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyAiIiA6IHByaW9yaXR5KSkKICAgICAgOiBkZWZhdWx0Vmlldyhub2RlID0gdGhpcy5ub2RlKCkpCiAgICAgICAgICAuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKQogICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUobmFtZSk7Cn07CgpmdW5jdGlvbiBwcm9wZXJ0eVJlbW92ZShuYW1lKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgZGVsZXRlIHRoaXNbbmFtZV07CiAgfTsKfQoKZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudChuYW1lLCB2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTsKICB9Owp9CgpmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHYgPT0gbnVsbCkgZGVsZXRlIHRoaXNbbmFtZV07CiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2OwogIH07Cn0KCnZhciBzZWxlY3Rpb25fcHJvcGVydHkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMQogICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uCiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSkKICAgICAgOiB0aGlzLm5vZGUoKVtuYW1lXTsKfTsKCmZ1bmN0aW9uIGNsYXNzQXJyYXkoc3RyaW5nKSB7CiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XHMrLyk7Cn0KCmZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7CiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7Cn0KCmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7CiAgdGhpcy5fbm9kZSA9IG5vZGU7CiAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKTsKfQoKQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHsKICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgIGlmIChpIDwgMCkgewogICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpOwogICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgfQogIH0sCiAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7CiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7CiAgICBpZiAoaSA+PSAwKSB7CiAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTsKICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgdGhpcy5fbmFtZXMuam9pbigiICIpKTsKICAgIH0KICB9LAogIGNvbnRhaW5zOiBmdW5jdGlvbihuYW1lKSB7CiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwOwogIH0KfTsKCmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHsKICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7Cn0KCmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHsKICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7Cn0KCmZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7CiAgfTsKfQoKZnVuY3Rpb24gY2xhc3NlZEZhbHNlKG5hbWVzKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7CiAgfTsKfQoKZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLCB2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTsKICB9Owp9Cgp2YXIgc2VsZWN0aW9uX2NsYXNzZWQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArICIiKTsKCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlCiAgICAgID8gY2xhc3NlZFRydWUKICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpOwp9OwoKZnVuY3Rpb24gdGV4dFJlbW92ZSgpIHsKICB0aGlzLnRleHRDb250ZW50ID0gIiI7Cn0KCmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKICB9Owp9CgpmdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gIiIgOiB2OwogIH07Cn0KCnZhciBzZWxlY3Rpb25fdGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbAogICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyB0ZXh0RnVuY3Rpb24KICAgICAgICAgIDogdGV4dENvbnN0YW50KSh2YWx1ZSkpCiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7Cn07CgpmdW5jdGlvbiBodG1sUmVtb3ZlKCkgewogIHRoaXMuaW5uZXJIVE1MID0gIiI7Cn0KCmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7CiAgfTsKfQoKZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyAiIiA6IHY7CiAgfTsKfQoKdmFyIHNlbGVjdGlvbl9odG1sID0gZnVuY3Rpb24odmFsdWUpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IGh0bWxGdW5jdGlvbgogICAgICAgICAgOiBodG1sQ29uc3RhbnQpKHZhbHVlKSkKICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7Cn07CgpmdW5jdGlvbiByYWlzZSgpIHsKICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOwp9Cgp2YXIgc2VsZWN0aW9uX3JhaXNlID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7Cn07CgpmdW5jdGlvbiBsb3dlcigpIHsKICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpOwp9Cgp2YXIgc2VsZWN0aW9uX2xvd2VyID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHRoaXMuZWFjaChsb3dlcik7Cn07Cgp2YXIgc2VsZWN0aW9uX2FwcGVuZCA9IGZ1bmN0aW9uKG5hbWUpIHsKICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTsKICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgfSk7Cn07CgpmdW5jdGlvbiBjb25zdGFudE51bGwoKSB7CiAgcmV0dXJuIG51bGw7Cn0KCnZhciBzZWxlY3Rpb25faW5zZXJ0ID0gZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7CiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rpb24iID8gbmFtZSA6IGNyZWF0b3IobmFtZSksCiAgICAgIHNlbGVjdCA9IGJlZm9yZSA9PSBudWxsID8gY29uc3RhbnROdWxsIDogdHlwZW9mIGJlZm9yZSA9PT0gImZ1bmN0aW9uIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7CiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTsKICB9KTsKfTsKCmZ1bmN0aW9uIHJlbW92ZSgpIHsKICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKfQoKdmFyIHNlbGVjdGlvbl9yZW1vdmUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSk7Cn07Cgp2YXIgc2VsZWN0aW9uX2RhdHVtID0gZnVuY3Rpb24odmFsdWUpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICA/IHRoaXMucHJvcGVydHkoIl9fZGF0YV9fIiwgdmFsdWUpCiAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187Cn07CgpmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykgewogIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSwKICAgICAgZXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7CgogIGlmIChldmVudCkgewogICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTsKICB9IGVsc2UgewogICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7CiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDsKICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7CiAgfQoKICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwp9CgpmdW5jdGlvbiBkaXNwYXRjaENvbnN0YW50KHR5cGUsIHBhcmFtcykgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7CiAgfTsKfQoKZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbih0eXBlLCBwYXJhbXMpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgfTsKfQoKdmFyIHNlbGVjdGlvbl9kaXNwYXRjaCA9IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykgewogIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09ICJmdW5jdGlvbiIKICAgICAgPyBkaXNwYXRjaEZ1bmN0aW9uCiAgICAgIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7Cn07Cgp2YXIgcm9vdCA9IFtudWxsXTsKCmZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHsKICB0aGlzLl9ncm91cHMgPSBncm91cHM7CiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbigpIHsKICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTsKfQoKU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFNlbGVjdGlvbiwKICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsCiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLAogIGZpbHRlcjogc2VsZWN0aW9uX2ZpbHRlciwKICBkYXRhOiBzZWxlY3Rpb25fZGF0YSwKICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLAogIGV4aXQ6IHNlbGVjdGlvbl9leGl0LAogIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsCiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlciwKICBzb3J0OiBzZWxlY3Rpb25fc29ydCwKICBjYWxsOiBzZWxlY3Rpb25fY2FsbCwKICBub2Rlczogc2VsZWN0aW9uX25vZGVzLAogIG5vZGU6IHNlbGVjdGlvbl9ub2RlLAogIHNpemU6IHNlbGVjdGlvbl9zaXplLAogIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksCiAgZWFjaDogc2VsZWN0aW9uX2VhY2gsCiAgYXR0cjogc2VsZWN0aW9uX2F0dHIsCiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSwKICBwcm9wZXJ0eTogc2VsZWN0aW9uX3Byb3BlcnR5LAogIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLAogIHRleHQ6IHNlbGVjdGlvbl90ZXh0LAogIGh0bWw6IHNlbGVjdGlvbl9odG1sLAogIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsCiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlciwKICBhcHBlbmQ6IHNlbGVjdGlvbl9hcHBlbmQsCiAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LAogIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSwKICBkYXR1bTogc2VsZWN0aW9uX2RhdHVtLAogIG9uOiBzZWxlY3Rpb25fb24sCiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaAp9OwoKdmFyIHNlbGVjdCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIKICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pCiAgICAgIDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QpOwp9OwoKdmFyIHNlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIKICAgICAgPyBuZXcgU2VsZWN0aW9uKFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKQogICAgICA6IG5ldyBTZWxlY3Rpb24oW3NlbGVjdG9yID09IG51bGwgPyBbXSA6IHNlbGVjdG9yXSwgcm9vdCk7Cn07Cgp2YXIgdG91Y2ggPSBmdW5jdGlvbihub2RlLCB0b3VjaGVzLCBpZGVudGlmaWVyKSB7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBpZGVudGlmaWVyID0gdG91Y2hlcywgdG91Y2hlcyA9IHNvdXJjZUV2ZW50KCkuY2hhbmdlZFRvdWNoZXM7CgogIGZvciAodmFyIGkgPSAwLCBuID0gdG91Y2hlcyA/IHRvdWNoZXMubGVuZ3RoIDogMCwgdG91Y2g7IGkgPCBuOyArK2kpIHsKICAgIGlmICgodG91Y2ggPSB0b3VjaGVzW2ldKS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7CiAgICAgIHJldHVybiBwb2ludChub2RlLCB0b3VjaCk7CiAgICB9CiAgfQoKICByZXR1cm4gbnVsbDsKfTsKCnZhciB0b3VjaGVzID0gZnVuY3Rpb24obm9kZSwgdG91Y2hlcykgewogIGlmICh0b3VjaGVzID09IG51bGwpIHRvdWNoZXMgPSBzb3VyY2VFdmVudCgpLnRvdWNoZXM7CgogIGZvciAodmFyIGkgPSAwLCBuID0gdG91Y2hlcyA/IHRvdWNoZXMubGVuZ3RoIDogMCwgcG9pbnRzID0gbmV3IEFycmF5KG4pOyBpIDwgbjsgKytpKSB7CiAgICBwb2ludHNbaV0gPSBwb2ludChub2RlLCB0b3VjaGVzW2ldKTsKICB9CgogIHJldHVybiBwb2ludHM7Cn07CgpleHBvcnRzLmNyZWF0b3IgPSBjcmVhdG9yOwpleHBvcnRzLmxvY2FsID0gbG9jYWw7CmV4cG9ydHMubWF0Y2hlciA9IG1hdGNoZXIkMTsKZXhwb3J0cy5tb3VzZSA9IG1vdXNlOwpleHBvcnRzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKZXhwb3J0cy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlczsKZXhwb3J0cy5zZWxlY3QgPSBzZWxlY3Q7CmV4cG9ydHMuc2VsZWN0QWxsID0gc2VsZWN0QWxsOwpleHBvcnRzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKZXhwb3J0cy5zZWxlY3RvciA9IHNlbGVjdG9yOwpleHBvcnRzLnNlbGVjdG9yQWxsID0gc2VsZWN0b3JBbGw7CmV4cG9ydHMudG91Y2ggPSB0b3VjaDsKZXhwb3J0cy50b3VjaGVzID0gdG91Y2hlczsKZXhwb3J0cy53aW5kb3cgPSBkZWZhdWx0VmlldzsKZXhwb3J0cy5jdXN0b21FdmVudCA9IGN1c3RvbUV2ZW50OwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsKCn0pKSk7Cgp9LHt9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Ci8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtdGltZS1mb3JtYXQvIFZlcnNpb24gMi4wLjUuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnZDMtdGltZScpKSA6Cgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ2QzLXRpbWUnXSwgZmFjdG9yeSkgOgoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSksZ2xvYmFsLmQzKSk7Cn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLGQzVGltZSkgeyAndXNlIHN0cmljdCc7CgpmdW5jdGlvbiBsb2NhbERhdGUoZCkgewogIGlmICgwIDw9IGQueSAmJiBkLnkgPCAxMDApIHsKICAgIHZhciBkYXRlID0gbmV3IERhdGUoLTEsIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpOwogICAgZGF0ZS5zZXRGdWxsWWVhcihkLnkpOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIHJldHVybiBuZXcgRGF0ZShkLnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpOwp9CgpmdW5jdGlvbiB1dGNEYXRlKGQpIHsKICBpZiAoMCA8PSBkLnkgJiYgZC55IDwgMTAwKSB7CiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKC0xLCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7CiAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGQueSk7CiAgICByZXR1cm4gZGF0ZTsKICB9CiAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGQueSwgZC5tLCBkLmQsIGQuSCwgZC5NLCBkLlMsIGQuTCkpOwp9CgpmdW5jdGlvbiBuZXdZZWFyKHkpIHsKICByZXR1cm4ge3k6IHksIG06IDAsIGQ6IDEsIEg6IDAsIE06IDAsIFM6IDAsIEw6IDB9Owp9CgpmdW5jdGlvbiBmb3JtYXRMb2NhbGUobG9jYWxlKSB7CiAgdmFyIGxvY2FsZV9kYXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSwKICAgICAgbG9jYWxlX2RhdGUgPSBsb2NhbGUuZGF0ZSwKICAgICAgbG9jYWxlX3RpbWUgPSBsb2NhbGUudGltZSwKICAgICAgbG9jYWxlX3BlcmlvZHMgPSBsb2NhbGUucGVyaW9kcywKICAgICAgbG9jYWxlX3dlZWtkYXlzID0gbG9jYWxlLmRheXMsCiAgICAgIGxvY2FsZV9zaG9ydFdlZWtkYXlzID0gbG9jYWxlLnNob3J0RGF5cywKICAgICAgbG9jYWxlX21vbnRocyA9IGxvY2FsZS5tb250aHMsCiAgICAgIGxvY2FsZV9zaG9ydE1vbnRocyA9IGxvY2FsZS5zaG9ydE1vbnRoczsKCiAgdmFyIHBlcmlvZFJlID0gZm9ybWF0UmUobG9jYWxlX3BlcmlvZHMpLAogICAgICBwZXJpb2RMb29rdXAgPSBmb3JtYXRMb29rdXAobG9jYWxlX3BlcmlvZHMpLAogICAgICB3ZWVrZGF5UmUgPSBmb3JtYXRSZShsb2NhbGVfd2Vla2RheXMpLAogICAgICB3ZWVrZGF5TG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV93ZWVrZGF5cyksCiAgICAgIHNob3J0V2Vla2RheVJlID0gZm9ybWF0UmUobG9jYWxlX3Nob3J0V2Vla2RheXMpLAogICAgICBzaG9ydFdlZWtkYXlMb29rdXAgPSBmb3JtYXRMb29rdXAobG9jYWxlX3Nob3J0V2Vla2RheXMpLAogICAgICBtb250aFJlID0gZm9ybWF0UmUobG9jYWxlX21vbnRocyksCiAgICAgIG1vbnRoTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9tb250aHMpLAogICAgICBzaG9ydE1vbnRoUmUgPSBmb3JtYXRSZShsb2NhbGVfc2hvcnRNb250aHMpLAogICAgICBzaG9ydE1vbnRoTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydE1vbnRocyk7CgogIHZhciBmb3JtYXRzID0gewogICAgImEiOiBmb3JtYXRTaG9ydFdlZWtkYXksCiAgICAiQSI6IGZvcm1hdFdlZWtkYXksCiAgICAiYiI6IGZvcm1hdFNob3J0TW9udGgsCiAgICAiQiI6IGZvcm1hdE1vbnRoLAogICAgImMiOiBudWxsLAogICAgImQiOiBmb3JtYXREYXlPZk1vbnRoLAogICAgImUiOiBmb3JtYXREYXlPZk1vbnRoLAogICAgIkgiOiBmb3JtYXRIb3VyMjQsCiAgICAiSSI6IGZvcm1hdEhvdXIxMiwKICAgICJqIjogZm9ybWF0RGF5T2ZZZWFyLAogICAgIkwiOiBmb3JtYXRNaWxsaXNlY29uZHMsCiAgICAibSI6IGZvcm1hdE1vbnRoTnVtYmVyLAogICAgIk0iOiBmb3JtYXRNaW51dGVzLAogICAgInAiOiBmb3JtYXRQZXJpb2QsCiAgICAiUyI6IGZvcm1hdFNlY29uZHMsCiAgICAiVSI6IGZvcm1hdFdlZWtOdW1iZXJTdW5kYXksCiAgICAidyI6IGZvcm1hdFdlZWtkYXlOdW1iZXIsCiAgICAiVyI6IGZvcm1hdFdlZWtOdW1iZXJNb25kYXksCiAgICAieCI6IG51bGwsCiAgICAiWCI6IG51bGwsCiAgICAieSI6IGZvcm1hdFllYXIsCiAgICAiWSI6IGZvcm1hdEZ1bGxZZWFyLAogICAgIloiOiBmb3JtYXRab25lLAogICAgIiUiOiBmb3JtYXRMaXRlcmFsUGVyY2VudAogIH07CgogIHZhciB1dGNGb3JtYXRzID0gewogICAgImEiOiBmb3JtYXRVVENTaG9ydFdlZWtkYXksCiAgICAiQSI6IGZvcm1hdFVUQ1dlZWtkYXksCiAgICAiYiI6IGZvcm1hdFVUQ1Nob3J0TW9udGgsCiAgICAiQiI6IGZvcm1hdFVUQ01vbnRoLAogICAgImMiOiBudWxsLAogICAgImQiOiBmb3JtYXRVVENEYXlPZk1vbnRoLAogICAgImUiOiBmb3JtYXRVVENEYXlPZk1vbnRoLAogICAgIkgiOiBmb3JtYXRVVENIb3VyMjQsCiAgICAiSSI6IGZvcm1hdFVUQ0hvdXIxMiwKICAgICJqIjogZm9ybWF0VVRDRGF5T2ZZZWFyLAogICAgIkwiOiBmb3JtYXRVVENNaWxsaXNlY29uZHMsCiAgICAibSI6IGZvcm1hdFVUQ01vbnRoTnVtYmVyLAogICAgIk0iOiBmb3JtYXRVVENNaW51dGVzLAogICAgInAiOiBmb3JtYXRVVENQZXJpb2QsCiAgICAiUyI6IGZvcm1hdFVUQ1NlY29uZHMsCiAgICAiVSI6IGZvcm1hdFVUQ1dlZWtOdW1iZXJTdW5kYXksCiAgICAidyI6IGZvcm1hdFVUQ1dlZWtkYXlOdW1iZXIsCiAgICAiVyI6IGZvcm1hdFVUQ1dlZWtOdW1iZXJNb25kYXksCiAgICAieCI6IG51bGwsCiAgICAiWCI6IG51bGwsCiAgICAieSI6IGZvcm1hdFVUQ1llYXIsCiAgICAiWSI6IGZvcm1hdFVUQ0Z1bGxZZWFyLAogICAgIloiOiBmb3JtYXRVVENab25lLAogICAgIiUiOiBmb3JtYXRMaXRlcmFsUGVyY2VudAogIH07CgogIHZhciBwYXJzZXMgPSB7CiAgICAiYSI6IHBhcnNlU2hvcnRXZWVrZGF5LAogICAgIkEiOiBwYXJzZVdlZWtkYXksCiAgICAiYiI6IHBhcnNlU2hvcnRNb250aCwKICAgICJCIjogcGFyc2VNb250aCwKICAgICJjIjogcGFyc2VMb2NhbGVEYXRlVGltZSwKICAgICJkIjogcGFyc2VEYXlPZk1vbnRoLAogICAgImUiOiBwYXJzZURheU9mTW9udGgsCiAgICAiSCI6IHBhcnNlSG91cjI0LAogICAgIkkiOiBwYXJzZUhvdXIyNCwKICAgICJqIjogcGFyc2VEYXlPZlllYXIsCiAgICAiTCI6IHBhcnNlTWlsbGlzZWNvbmRzLAogICAgIm0iOiBwYXJzZU1vbnRoTnVtYmVyLAogICAgIk0iOiBwYXJzZU1pbnV0ZXMsCiAgICAicCI6IHBhcnNlUGVyaW9kLAogICAgIlMiOiBwYXJzZVNlY29uZHMsCiAgICAiVSI6IHBhcnNlV2Vla051bWJlclN1bmRheSwKICAgICJ3IjogcGFyc2VXZWVrZGF5TnVtYmVyLAogICAgIlciOiBwYXJzZVdlZWtOdW1iZXJNb25kYXksCiAgICAieCI6IHBhcnNlTG9jYWxlRGF0ZSwKICAgICJYIjogcGFyc2VMb2NhbGVUaW1lLAogICAgInkiOiBwYXJzZVllYXIsCiAgICAiWSI6IHBhcnNlRnVsbFllYXIsCiAgICAiWiI6IHBhcnNlWm9uZSwKICAgICIlIjogcGFyc2VMaXRlcmFsUGVyY2VudAogIH07CgogIC8vIFRoZXNlIHJlY3Vyc2l2ZSBkaXJlY3RpdmUgZGVmaW5pdGlvbnMgbXVzdCBiZSBkZWZlcnJlZC4KICBmb3JtYXRzLnggPSBuZXdGb3JtYXQobG9jYWxlX2RhdGUsIGZvcm1hdHMpOwogIGZvcm1hdHMuWCA9IG5ld0Zvcm1hdChsb2NhbGVfdGltZSwgZm9ybWF0cyk7CiAgZm9ybWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgZm9ybWF0cyk7CiAgdXRjRm9ybWF0cy54ID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlLCB1dGNGb3JtYXRzKTsKICB1dGNGb3JtYXRzLlggPSBuZXdGb3JtYXQobG9jYWxlX3RpbWUsIHV0Y0Zvcm1hdHMpOwogIHV0Y0Zvcm1hdHMuYyA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZVRpbWUsIHV0Y0Zvcm1hdHMpOwoKICBmdW5jdGlvbiBuZXdGb3JtYXQoc3BlY2lmaWVyLCBmb3JtYXRzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkgewogICAgICB2YXIgc3RyaW5nID0gW10sCiAgICAgICAgICBpID0gLTEsCiAgICAgICAgICBqID0gMCwKICAgICAgICAgIG4gPSBzcGVjaWZpZXIubGVuZ3RoLAogICAgICAgICAgYywKICAgICAgICAgIHBhZCwKICAgICAgICAgIGZvcm1hdDsKCiAgICAgIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSkgZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKTsKCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgaWYgKHNwZWNpZmllci5jaGFyQ29kZUF0KGkpID09PSAzNykgewogICAgICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTsKICAgICAgICAgIGlmICgocGFkID0gcGFkc1tjID0gc3BlY2lmaWVyLmNoYXJBdCgrK2kpXSkgIT0gbnVsbCkgYyA9IHNwZWNpZmllci5jaGFyQXQoKytpKTsKICAgICAgICAgIGVsc2UgcGFkID0gYyA9PT0gImUiID8gIiAiIDogIjAiOwogICAgICAgICAgaWYgKGZvcm1hdCA9IGZvcm1hdHNbY10pIGMgPSBmb3JtYXQoZGF0ZSwgcGFkKTsKICAgICAgICAgIHN0cmluZy5wdXNoKGMpOwogICAgICAgICAgaiA9IGkgKyAxOwogICAgICAgIH0KICAgICAgfQoKICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTsKICAgICAgcmV0dXJuIHN0cmluZy5qb2luKCIiKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBuZXdQYXJzZShzcGVjaWZpZXIsIG5ld0RhdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHsKICAgICAgdmFyIGQgPSBuZXdZZWFyKDE5MDApLAogICAgICAgICAgaSA9IHBhcnNlU3BlY2lmaWVyKGQsIHNwZWNpZmllciwgc3RyaW5nICs9ICIiLCAwKTsKICAgICAgaWYgKGkgIT0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIG51bGw7CgogICAgICAvLyBUaGUgYW0tcG0gZmxhZyBpcyAwIGZvciBBTSwgYW5kIDEgZm9yIFBNLgogICAgICBpZiAoInAiIGluIGQpIGQuSCA9IGQuSCAlIDEyICsgZC5wICogMTI7CgogICAgICAvLyBDb252ZXJ0IGRheS1vZi13ZWVrIGFuZCB3ZWVrLW9mLXllYXIgdG8gZGF5LW9mLXllYXIuCiAgICAgIGlmICgiVyIgaW4gZCB8fCAiVSIgaW4gZCkgewogICAgICAgIGlmICghKCJ3IiBpbiBkKSkgZC53ID0gIlciIGluIGQgPyAxIDogMDsKICAgICAgICB2YXIgZGF5ID0gIloiIGluIGQgPyB1dGNEYXRlKG5ld1llYXIoZC55KSkuZ2V0VVRDRGF5KCkgOiBuZXdEYXRlKG5ld1llYXIoZC55KSkuZ2V0RGF5KCk7CiAgICAgICAgZC5tID0gMDsKICAgICAgICBkLmQgPSAiVyIgaW4gZCA/IChkLncgKyA2KSAlIDcgKyBkLlcgKiA3IC0gKGRheSArIDUpICUgNyA6IGQudyArIGQuVSAqIDcgLSAoZGF5ICsgNikgJSA3OwogICAgICB9CgogICAgICAvLyBJZiBhIHRpbWUgem9uZSBpcyBzcGVjaWZpZWQsIGFsbCBmaWVsZHMgYXJlIGludGVycHJldGVkIGFzIFVUQyBhbmQgdGhlbgogICAgICAvLyBvZmZzZXQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgdGltZSB6b25lLgogICAgICBpZiAoIloiIGluIGQpIHsKICAgICAgICBkLkggKz0gZC5aIC8gMTAwIHwgMDsKICAgICAgICBkLk0gKz0gZC5aICUgMTAwOwogICAgICAgIHJldHVybiB1dGNEYXRlKGQpOwogICAgICB9CgogICAgICAvLyBPdGhlcndpc2UsIGFsbCBmaWVsZHMgYXJlIGluIGxvY2FsIHRpbWUuCiAgICAgIHJldHVybiBuZXdEYXRlKGQpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3BlY2lmaWVyKGQsIHNwZWNpZmllciwgc3RyaW5nLCBqKSB7CiAgICB2YXIgaSA9IDAsCiAgICAgICAgbiA9IHNwZWNpZmllci5sZW5ndGgsCiAgICAgICAgbSA9IHN0cmluZy5sZW5ndGgsCiAgICAgICAgYywKICAgICAgICBwYXJzZTsKCiAgICB3aGlsZSAoaSA8IG4pIHsKICAgICAgaWYgKGogPj0gbSkgcmV0dXJuIC0xOwogICAgICBjID0gc3BlY2lmaWVyLmNoYXJDb2RlQXQoaSsrKTsKICAgICAgaWYgKGMgPT09IDM3KSB7CiAgICAgICAgYyA9IHNwZWNpZmllci5jaGFyQXQoaSsrKTsKICAgICAgICBwYXJzZSA9IHBhcnNlc1tjIGluIHBhZHMgPyBzcGVjaWZpZXIuY2hhckF0KGkrKykgOiBjXTsKICAgICAgICBpZiAoIXBhcnNlIHx8ICgoaiA9IHBhcnNlKGQsIHN0cmluZywgaikpIDwgMCkpIHJldHVybiAtMTsKICAgICAgfSBlbHNlIGlmIChjICE9IHN0cmluZy5jaGFyQ29kZUF0KGorKykpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gajsKICB9CgogIGZ1bmN0aW9uIHBhcnNlUGVyaW9kKGQsIHN0cmluZywgaSkgewogICAgdmFyIG4gPSBwZXJpb2RSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICByZXR1cm4gbiA/IChkLnAgPSBwZXJpb2RMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KCiAgZnVuY3Rpb24gcGFyc2VTaG9ydFdlZWtkYXkoZCwgc3RyaW5nLCBpKSB7CiAgICB2YXIgbiA9IHNob3J0V2Vla2RheVJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgIHJldHVybiBuID8gKGQudyA9IHNob3J0V2Vla2RheUxvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgfQoKICBmdW5jdGlvbiBwYXJzZVdlZWtkYXkoZCwgc3RyaW5nLCBpKSB7CiAgICB2YXIgbiA9IHdlZWtkYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICByZXR1cm4gbiA/IChkLncgPSB3ZWVrZGF5TG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU2hvcnRNb250aChkLCBzdHJpbmcsIGkpIHsKICAgIHZhciBuID0gc2hvcnRNb250aFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgIHJldHVybiBuID8gKGQubSA9IHNob3J0TW9udGhMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KCiAgZnVuY3Rpb24gcGFyc2VNb250aChkLCBzdHJpbmcsIGkpIHsKICAgIHZhciBuID0gbW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICByZXR1cm4gbiA/IChkLm0gPSBtb250aExvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgfQoKICBmdW5jdGlvbiBwYXJzZUxvY2FsZURhdGVUaW1lKGQsIHN0cmluZywgaSkgewogICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV9kYXRlVGltZSwgc3RyaW5nLCBpKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlTG9jYWxlRGF0ZShkLCBzdHJpbmcsIGkpIHsKICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfZGF0ZSwgc3RyaW5nLCBpKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlTG9jYWxlVGltZShkLCBzdHJpbmcsIGkpIHsKICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfdGltZSwgc3RyaW5nLCBpKTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFNob3J0V2Vla2RheShkKSB7CiAgICByZXR1cm4gbG9jYWxlX3Nob3J0V2Vla2RheXNbZC5nZXREYXkoKV07CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRXZWVrZGF5KGQpIHsKICAgIHJldHVybiBsb2NhbGVfd2Vla2RheXNbZC5nZXREYXkoKV07CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRTaG9ydE1vbnRoKGQpIHsKICAgIHJldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRNb250aCgpXTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdE1vbnRoKGQpIHsKICAgIHJldHVybiBsb2NhbGVfbW9udGhzW2QuZ2V0TW9udGgoKV07CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRQZXJpb2QoZCkgewogICAgcmV0dXJuIGxvY2FsZV9wZXJpb2RzWysoZC5nZXRIb3VycygpID49IDEyKV07CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRVVENTaG9ydFdlZWtkYXkoZCkgewogICAgcmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0VVRDRGF5KCldOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheShkKSB7CiAgICByZXR1cm4gbG9jYWxlX3dlZWtkYXlzW2QuZ2V0VVRDRGF5KCldOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0VVRDU2hvcnRNb250aChkKSB7CiAgICByZXR1cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0VVRDTW9udGgoKV07CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRVVENNb250aChkKSB7CiAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldFVUQ01vbnRoKCldOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0VVRDUGVyaW9kKGQpIHsKICAgIHJldHVybiBsb2NhbGVfcGVyaW9kc1srKGQuZ2V0VVRDSG91cnMoKSA+PSAxMildOwogIH0KCiAgcmV0dXJuIHsKICAgIGZvcm1hdDogZnVuY3Rpb24oc3BlY2lmaWVyKSB7CiAgICAgIHZhciBmID0gbmV3Rm9ybWF0KHNwZWNpZmllciArPSAiIiwgZm9ybWF0cyk7CiAgICAgIGYudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTsKICAgICAgcmV0dXJuIGY7CiAgICB9LAogICAgcGFyc2U6IGZ1bmN0aW9uKHNwZWNpZmllcikgewogICAgICB2YXIgcCA9IG5ld1BhcnNlKHNwZWNpZmllciArPSAiIiwgbG9jYWxEYXRlKTsKICAgICAgcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9OwogICAgICByZXR1cm4gcDsKICAgIH0sCiAgICB1dGNGb3JtYXQ6IGZ1bmN0aW9uKHNwZWNpZmllcikgewogICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gIiIsIHV0Y0Zvcm1hdHMpOwogICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAgICAgIHJldHVybiBmOwogICAgfSwKICAgIHV0Y1BhcnNlOiBmdW5jdGlvbihzcGVjaWZpZXIpIHsKICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIsIHV0Y0RhdGUpOwogICAgICBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAgICAgIHJldHVybiBwOwogICAgfQogIH07Cn0KCnZhciBwYWRzID0geyItIjogIiIsICJfIjogIiAiLCAiMCI6ICIwIn07CnZhciBudW1iZXJSZSA9IC9eXHMqXGQrLzsKdmFyIHBlcmNlbnRSZSA9IC9eJS87CnZhciByZXF1b3RlUmUgPSAvW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2c7CgpmdW5jdGlvbiBwYWQodmFsdWUsIGZpbGwsIHdpZHRoKSB7CiAgdmFyIHNpZ24gPSB2YWx1ZSA8IDAgPyAiLSIgOiAiIiwKICAgICAgc3RyaW5nID0gKHNpZ24gPyAtdmFsdWUgOiB2YWx1ZSkgKyAiIiwKICAgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICByZXR1cm4gc2lnbiArIChsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgKyBzdHJpbmcgOiBzdHJpbmcpOwp9CgpmdW5jdGlvbiByZXF1b3RlKHMpIHsKICByZXR1cm4gcy5yZXBsYWNlKHJlcXVvdGVSZSwgIlxcJCYiKTsKfQoKZnVuY3Rpb24gZm9ybWF0UmUobmFtZXMpIHsKICByZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIgKyBuYW1lcy5tYXAocmVxdW90ZSkuam9pbigifCIpICsgIikiLCAiaSIpOwp9CgpmdW5jdGlvbiBmb3JtYXRMb29rdXAobmFtZXMpIHsKICB2YXIgbWFwID0ge30sIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsKICB3aGlsZSAoKytpIDwgbikgbWFwW25hbWVzW2ldLnRvTG93ZXJDYXNlKCldID0gaTsKICByZXR1cm4gbWFwOwp9CgpmdW5jdGlvbiBwYXJzZVdlZWtkYXlOdW1iZXIoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOwogIHJldHVybiBuID8gKGQudyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlV2Vla051bWJlclN1bmRheShkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICByZXR1cm4gbiA/IChkLlUgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJNb25kYXkoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgcmV0dXJuIG4gPyAoZC5XID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VGdWxsWWVhcihkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA0KSk7CiAgcmV0dXJuIG4gPyAoZC55ID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VZZWFyKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/IChkLnkgPSArblswXSArICgrblswXSA+IDY4ID8gMTkwMCA6IDIwMDApLCBpICsgblswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlWm9uZShkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IC9eKFopfChbKy1dXGRcZCkoPzpcOj8oXGRcZCkpPy8uZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDYpKTsKICByZXR1cm4gbiA/IChkLlogPSBuWzFdID8gMCA6IC0oblsyXSArIChuWzNdIHx8ICIwMCIpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZU1vbnRoTnVtYmVyKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/IChkLm0gPSBuWzBdIC0gMSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZURheU9mTW9udGgoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogIHJldHVybiBuID8gKGQuZCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlRGF5T2ZZZWFyKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsKICByZXR1cm4gbiA/IChkLm0gPSAwLCBkLmQgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZUhvdXIyNChkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgcmV0dXJuIG4gPyAoZC5IID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VNaW51dGVzKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/IChkLk0gPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVNlY29uZHMoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogIHJldHVybiBuID8gKGQuUyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlTWlsbGlzZWNvbmRzKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsKICByZXR1cm4gbiA/IChkLkwgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZUxpdGVyYWxQZXJjZW50KGQsIHN0cmluZywgaSkgewogIHZhciBuID0gcGVyY2VudFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7CiAgcmV0dXJuIG4gPyBpICsgblswXS5sZW5ndGggOiAtMTsKfQoKZnVuY3Rpb24gZm9ybWF0RGF5T2ZNb250aChkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldERhdGUoKSwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdEhvdXIyNChkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldEhvdXJzKCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRIb3VyMTIoZCwgcCkgewogIHJldHVybiBwYWQoZC5nZXRIb3VycygpICUgMTIgfHwgMTIsIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXREYXlPZlllYXIoZCwgcCkgewogIHJldHVybiBwYWQoMSArIGQzVGltZS50aW1lRGF5LmNvdW50KGQzVGltZS50aW1lWWVhcihkKSwgZCksIHAsIDMpOwp9CgpmdW5jdGlvbiBmb3JtYXRNaWxsaXNlY29uZHMoZCwgcCkgewogIHJldHVybiBwYWQoZC5nZXRNaWxsaXNlY29uZHMoKSwgcCwgMyk7Cn0KCmZ1bmN0aW9uIGZvcm1hdE1vbnRoTnVtYmVyKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0TW9udGgoKSArIDEsIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRNaW51dGVzKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0TWludXRlcygpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0U2Vjb25kcyhkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldFNlY29uZHMoKSwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJTdW5kYXkoZCwgcCkgewogIHJldHVybiBwYWQoZDNUaW1lLnRpbWVTdW5kYXkuY291bnQoZDNUaW1lLnRpbWVZZWFyKGQpLCBkKSwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXIoZCkgewogIHJldHVybiBkLmdldERheSgpOwp9CgpmdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyTW9uZGF5KGQsIHApIHsKICByZXR1cm4gcGFkKGQzVGltZS50aW1lTW9uZGF5LmNvdW50KGQzVGltZS50aW1lWWVhcihkKSwgZCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRZZWFyKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0RnVsbFllYXIoKSAlIDEwMCwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdEZ1bGxZZWFyKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0RnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTsKfQoKZnVuY3Rpb24gZm9ybWF0Wm9uZShkKSB7CiAgdmFyIHogPSBkLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgcmV0dXJuICh6ID4gMCA/ICItIiA6ICh6ICo9IC0xLCAiKyIpKQogICAgICArIHBhZCh6IC8gNjAgfCAwLCAiMCIsIDIpCiAgICAgICsgcGFkKHogJSA2MCwgIjAiLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDRGF5T2ZNb250aChkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldFVUQ0RhdGUoKSwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFVUQ0hvdXIyNChkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldFVUQ0hvdXJzKCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENIb3VyMTIoZCwgcCkgewogIHJldHVybiBwYWQoZC5nZXRVVENIb3VycygpICUgMTIgfHwgMTIsIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENEYXlPZlllYXIoZCwgcCkgewogIHJldHVybiBwYWQoMSArIGQzVGltZS51dGNEYXkuY291bnQoZDNUaW1lLnV0Y1llYXIoZCksIGQpLCBwLCAzKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDTWlsbGlzZWNvbmRzKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksIHAsIDMpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENNb250aE51bWJlcihkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldFVUQ01vbnRoKCkgKyAxLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDTWludXRlcyhkLCBwKSB7CiAgcmV0dXJuIHBhZChkLmdldFVUQ01pbnV0ZXMoKSwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFVUQ1NlY29uZHMoZCwgcCkgewogIHJldHVybiBwYWQoZC5nZXRVVENTZWNvbmRzKCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENXZWVrTnVtYmVyU3VuZGF5KGQsIHApIHsKICByZXR1cm4gcGFkKGQzVGltZS51dGNTdW5kYXkuY291bnQoZDNUaW1lLnV0Y1llYXIoZCksIGQpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheU51bWJlcihkKSB7CiAgcmV0dXJuIGQuZ2V0VVRDRGF5KCk7Cn0KCmZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtOdW1iZXJNb25kYXkoZCwgcCkgewogIHJldHVybiBwYWQoZDNUaW1lLnV0Y01vbmRheS5jb3VudChkM1RpbWUudXRjWWVhcihkKSwgZCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENZZWFyKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMCwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFVUQ0Z1bGxZZWFyKGQsIHApIHsKICByZXR1cm4gcGFkKGQuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDWm9uZSgpIHsKICByZXR1cm4gIiswMDAwIjsKfQoKZnVuY3Rpb24gZm9ybWF0TGl0ZXJhbFBlcmNlbnQoKSB7CiAgcmV0dXJuICIlIjsKfQoKdmFyIGxvY2FsZSQxOwoKCgoKCmRlZmF1bHRMb2NhbGUoewogIGRhdGVUaW1lOiAiJXgsICVYIiwKICBkYXRlOiAiJS1tLyUtZC8lWSIsCiAgdGltZTogIiUtSTolTTolUyAlcCIsCiAgcGVyaW9kczogWyJBTSIsICJQTSJdLAogIGRheXM6IFsiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiXSwKICBzaG9ydERheXM6IFsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Il0sCiAgbW9udGhzOiBbIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiXSwKICBzaG9ydE1vbnRoczogWyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJdCn0pOwoKZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7CiAgbG9jYWxlJDEgPSBmb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7CiAgZXhwb3J0cy50aW1lRm9ybWF0ID0gbG9jYWxlJDEuZm9ybWF0OwogIGV4cG9ydHMudGltZVBhcnNlID0gbG9jYWxlJDEucGFyc2U7CiAgZXhwb3J0cy51dGNGb3JtYXQgPSBsb2NhbGUkMS51dGNGb3JtYXQ7CiAgZXhwb3J0cy51dGNQYXJzZSA9IGxvY2FsZSQxLnV0Y1BhcnNlOwogIHJldHVybiBsb2NhbGUkMTsKfQoKdmFyIGlzb1NwZWNpZmllciA9ICIlWS0lbS0lZFQlSDolTTolUy4lTFoiOwoKZnVuY3Rpb24gZm9ybWF0SXNvTmF0aXZlKGRhdGUpIHsKICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpOwp9Cgp2YXIgZm9ybWF0SXNvID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcKICAgID8gZm9ybWF0SXNvTmF0aXZlCiAgICA6IGV4cG9ydHMudXRjRm9ybWF0KGlzb1NwZWNpZmllcik7CgpmdW5jdGlvbiBwYXJzZUlzb05hdGl2ZShzdHJpbmcpIHsKICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHN0cmluZyk7CiAgcmV0dXJuIGlzTmFOKGRhdGUpID8gbnVsbCA6IGRhdGU7Cn0KCnZhciBwYXJzZUlzbyA9ICtuZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIikKICAgID8gcGFyc2VJc29OYXRpdmUKICAgIDogZXhwb3J0cy51dGNQYXJzZShpc29TcGVjaWZpZXIpOwoKZXhwb3J0cy50aW1lRm9ybWF0RGVmYXVsdExvY2FsZSA9IGRlZmF1bHRMb2NhbGU7CmV4cG9ydHMudGltZUZvcm1hdExvY2FsZSA9IGZvcm1hdExvY2FsZTsKZXhwb3J0cy5pc29Gb3JtYXQgPSBmb3JtYXRJc287CmV4cG9ydHMuaXNvUGFyc2UgPSBwYXJzZUlzbzsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7Cgp9KSkpOwoKfSx7ImQzLXRpbWUiOjExfV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewovLyBodHRwczovL2QzanMub3JnL2QzLXRpbWUvIFZlcnNpb24gMS4wLjYuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOgoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6CgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOwp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7Cgp2YXIgdDAgPSBuZXcgRGF0ZTsKdmFyIHQxID0gbmV3IERhdGU7CgpmdW5jdGlvbiBuZXdJbnRlcnZhbChmbG9vcmksIG9mZnNldGksIGNvdW50LCBmaWVsZCkgewoKICBmdW5jdGlvbiBpbnRlcnZhbChkYXRlKSB7CiAgICByZXR1cm4gZmxvb3JpKGRhdGUgPSBuZXcgRGF0ZSgrZGF0ZSkpLCBkYXRlOwogIH0KCiAgaW50ZXJ2YWwuZmxvb3IgPSBpbnRlcnZhbDsKCiAgaW50ZXJ2YWwuY2VpbCA9IGZ1bmN0aW9uKGRhdGUpIHsKICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKGRhdGUgLSAxKSksIG9mZnNldGkoZGF0ZSwgMSksIGZsb29yaShkYXRlKSwgZGF0ZTsKICB9OwoKICBpbnRlcnZhbC5yb3VuZCA9IGZ1bmN0aW9uKGRhdGUpIHsKICAgIHZhciBkMCA9IGludGVydmFsKGRhdGUpLAogICAgICAgIGQxID0gaW50ZXJ2YWwuY2VpbChkYXRlKTsKICAgIHJldHVybiBkYXRlIC0gZDAgPCBkMSAtIGRhdGUgPyBkMCA6IGQxOwogIH07CgogIGludGVydmFsLm9mZnNldCA9IGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgIHJldHVybiBvZmZzZXRpKGRhdGUgPSBuZXcgRGF0ZSgrZGF0ZSksIHN0ZXAgPT0gbnVsbCA/IDEgOiBNYXRoLmZsb29yKHN0ZXApKSwgZGF0ZTsKICB9OwoKICBpbnRlcnZhbC5yYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7CiAgICB2YXIgcmFuZ2UgPSBbXTsKICAgIHN0YXJ0ID0gaW50ZXJ2YWwuY2VpbChzdGFydCk7CiAgICBzdGVwID0gc3RlcCA9PSBudWxsID8gMSA6IE1hdGguZmxvb3Ioc3RlcCk7CiAgICBpZiAoIShzdGFydCA8IHN0b3ApIHx8ICEoc3RlcCA+IDApKSByZXR1cm4gcmFuZ2U7IC8vIGFsc28gaGFuZGxlcyBJbnZhbGlkIERhdGUKICAgIGRvIHJhbmdlLnB1c2gobmV3IERhdGUoK3N0YXJ0KSk7IHdoaWxlIChvZmZzZXRpKHN0YXJ0LCBzdGVwKSwgZmxvb3JpKHN0YXJ0KSwgc3RhcnQgPCBzdG9wKQogICAgcmV0dXJuIHJhbmdlOwogIH07CgogIGludGVydmFsLmZpbHRlciA9IGZ1bmN0aW9uKHRlc3QpIHsKICAgIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRpbWUoZGF0ZSAtIDEpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBpZiAoZGF0ZSA+PSBkYXRlKSB3aGlsZSAoLS1zdGVwID49IDApIHdoaWxlIChvZmZzZXRpKGRhdGUsIDEpLCAhdGVzdChkYXRlKSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eQogICAgfSk7CiAgfTsKCiAgaWYgKGNvdW50KSB7CiAgICBpbnRlcnZhbC5jb3VudCA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgdDAuc2V0VGltZSgrc3RhcnQpLCB0MS5zZXRUaW1lKCtlbmQpOwogICAgICBmbG9vcmkodDApLCBmbG9vcmkodDEpOwogICAgICByZXR1cm4gTWF0aC5mbG9vcihjb3VudCh0MCwgdDEpKTsKICAgIH07CgogICAgaW50ZXJ2YWwuZXZlcnkgPSBmdW5jdGlvbihzdGVwKSB7CiAgICAgIHN0ZXAgPSBNYXRoLmZsb29yKHN0ZXApOwogICAgICByZXR1cm4gIWlzRmluaXRlKHN0ZXApIHx8ICEoc3RlcCA+IDApID8gbnVsbAogICAgICAgICAgOiAhKHN0ZXAgPiAxKSA/IGludGVydmFsCiAgICAgICAgICA6IGludGVydmFsLmZpbHRlcihmaWVsZAogICAgICAgICAgICAgID8gZnVuY3Rpb24oZCkgeyByZXR1cm4gZmllbGQoZCkgJSBzdGVwID09PSAwOyB9CiAgICAgICAgICAgICAgOiBmdW5jdGlvbihkKSB7IHJldHVybiBpbnRlcnZhbC5jb3VudCgwLCBkKSAlIHN0ZXAgPT09IDA7IH0pOwogICAgfTsKICB9CgogIHJldHVybiBpbnRlcnZhbDsKfQoKdmFyIG1pbGxpc2Vjb25kID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgLy8gbm9vcAp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCk7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICByZXR1cm4gZW5kIC0gc3RhcnQ7Cn0pOwoKLy8gQW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNpbXBsZSBjYXNlLgptaWxsaXNlY29uZC5ldmVyeSA9IGZ1bmN0aW9uKGspIHsKICBrID0gTWF0aC5mbG9vcihrKTsKICBpZiAoIWlzRmluaXRlKGspIHx8ICEoayA+IDApKSByZXR1cm4gbnVsbDsKICBpZiAoIShrID4gMSkpIHJldHVybiBtaWxsaXNlY29uZDsKICByZXR1cm4gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgZGF0ZS5zZXRUaW1lKE1hdGguZmxvb3IoZGF0ZSAvIGspICogayk7CiAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGspOwogIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gazsKICB9KTsKfTsKCnZhciBtaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZC5yYW5nZTsKCnZhciBkdXJhdGlvblNlY29uZCA9IDFlMzsKdmFyIGR1cmF0aW9uTWludXRlID0gNmU0Owp2YXIgZHVyYXRpb25Ib3VyID0gMzZlNTsKdmFyIGR1cmF0aW9uRGF5ID0gODY0ZTU7CnZhciBkdXJhdGlvbldlZWsgPSA2MDQ4ZTU7Cgp2YXIgc2Vjb25kID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBkdXJhdGlvblNlY29uZCkgKiBkdXJhdGlvblNlY29uZCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25TZWNvbmQpOwp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvblNlY29uZDsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJldHVybiBkYXRlLmdldFVUQ1NlY29uZHMoKTsKfSk7Cgp2YXIgc2Vjb25kcyA9IHNlY29uZC5yYW5nZTsKCnZhciBtaW51dGUgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgZGF0ZS5zZXRUaW1lKE1hdGguZmxvb3IoZGF0ZSAvIGR1cmF0aW9uTWludXRlKSAqIGR1cmF0aW9uTWludXRlKTsKfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbk1pbnV0ZSk7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uTWludXRlOwp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0TWludXRlcygpOwp9KTsKCnZhciBtaW51dGVzID0gbWludXRlLnJhbmdlOwoKdmFyIGhvdXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgdmFyIG9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIGR1cmF0aW9uTWludXRlICUgZHVyYXRpb25Ib3VyOwogIGlmIChvZmZzZXQgPCAwKSBvZmZzZXQgKz0gZHVyYXRpb25Ib3VyOwogIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKCgrZGF0ZSAtIG9mZnNldCkgLyBkdXJhdGlvbkhvdXIpICogZHVyYXRpb25Ib3VyICsgb2Zmc2V0KTsKfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbkhvdXIpOwp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRIb3VycygpOwp9KTsKCnZhciBob3VycyA9IGhvdXIucmFuZ2U7Cgp2YXIgZGF5ID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJldHVybiAoZW5kIC0gc3RhcnQgLSAoZW5kLmdldFRpbWV6b25lT2Zmc2V0KCkgLSBzdGFydC5nZXRUaW1lem9uZU9mZnNldCgpKSAqIGR1cmF0aW9uTWludXRlKSAvIGR1cmF0aW9uRGF5Owp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpIC0gMTsKfSk7Cgp2YXIgZGF5cyA9IGRheS5yYW5nZTsKCmZ1bmN0aW9uIHdlZWtkYXkoaSkgewogIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIDcgLSBpKSAlIDcpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7CiAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgcmV0dXJuIChlbmQgLSBzdGFydCAtIChlbmQuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIHN0YXJ0LmdldFRpbWV6b25lT2Zmc2V0KCkpICogZHVyYXRpb25NaW51dGUpIC8gZHVyYXRpb25XZWVrOwogIH0pOwp9Cgp2YXIgc3VuZGF5ID0gd2Vla2RheSgwKTsKdmFyIG1vbmRheSA9IHdlZWtkYXkoMSk7CnZhciB0dWVzZGF5ID0gd2Vla2RheSgyKTsKdmFyIHdlZG5lc2RheSA9IHdlZWtkYXkoMyk7CnZhciB0aHVyc2RheSA9IHdlZWtkYXkoNCk7CnZhciBmcmlkYXkgPSB3ZWVrZGF5KDUpOwp2YXIgc2F0dXJkYXkgPSB3ZWVrZGF5KDYpOwoKdmFyIHN1bmRheXMgPSBzdW5kYXkucmFuZ2U7CnZhciBtb25kYXlzID0gbW9uZGF5LnJhbmdlOwp2YXIgdHVlc2RheXMgPSB0dWVzZGF5LnJhbmdlOwp2YXIgd2VkbmVzZGF5cyA9IHdlZG5lc2RheS5yYW5nZTsKdmFyIHRodXJzZGF5cyA9IHRodXJzZGF5LnJhbmdlOwp2YXIgZnJpZGF5cyA9IGZyaWRheS5yYW5nZTsKdmFyIHNhdHVyZGF5cyA9IHNhdHVyZGF5LnJhbmdlOwoKdmFyIG1vbnRoID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIGRhdGUuc2V0RGF0ZSgxKTsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBzdGVwKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJldHVybiBlbmQuZ2V0TW9udGgoKSAtIHN0YXJ0LmdldE1vbnRoKCkgKyAoZW5kLmdldEZ1bGxZZWFyKCkgLSBzdGFydC5nZXRGdWxsWWVhcigpKSAqIDEyOwp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTsKfSk7Cgp2YXIgbW9udGhzID0gbW9udGgucmFuZ2U7Cgp2YXIgeWVhciA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldE1vbnRoKDAsIDEpOwogIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXApOwp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgcmV0dXJuIGVuZC5nZXRGdWxsWWVhcigpIC0gc3RhcnQuZ2V0RnVsbFllYXIoKTsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7Cn0pOwoKLy8gQW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNpbXBsZSBjYXNlLgp5ZWFyLmV2ZXJ5ID0gZnVuY3Rpb24oaykgewogIHJldHVybiAhaXNGaW5pdGUoayA9IE1hdGguZmxvb3IoaykpIHx8ICEoayA+IDApID8gbnVsbCA6IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgIGRhdGUuc2V0RnVsbFllYXIoTWF0aC5mbG9vcihkYXRlLmdldEZ1bGxZZWFyKCkgLyBrKSAqIGspOwogICAgZGF0ZS5zZXRNb250aCgwLCAxKTsKICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBzdGVwICogayk7CiAgfSk7Cn07Cgp2YXIgeWVhcnMgPSB5ZWFyLnJhbmdlOwoKdmFyIHV0Y01pbnV0ZSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldFVUQ1NlY29uZHMoMCwgMCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25NaW51dGUpOwp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJldHVybiBkYXRlLmdldFVUQ01pbnV0ZXMoKTsKfSk7Cgp2YXIgdXRjTWludXRlcyA9IHV0Y01pbnV0ZS5yYW5nZTsKCnZhciB1dGNIb3VyID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIGRhdGUuc2V0VVRDTWludXRlcygwLCAwLCAwKTsKfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbkhvdXIpOwp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENIb3VycygpOwp9KTsKCnZhciB1dGNIb3VycyA9IHV0Y0hvdXIucmFuZ2U7Cgp2YXIgdXRjRGF5ID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25EYXk7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENEYXRlKCkgLSAxOwp9KTsKCnZhciB1dGNEYXlzID0gdXRjRGF5LnJhbmdlOwoKZnVuY3Rpb24gdXRjV2Vla2RheShpKSB7CiAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIChkYXRlLmdldFVUQ0RheSgpICsgNyAtIGkpICUgNyk7CiAgICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApOwogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIHN0ZXAgKiA3KTsKICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uV2VlazsKICB9KTsKfQoKdmFyIHV0Y1N1bmRheSA9IHV0Y1dlZWtkYXkoMCk7CnZhciB1dGNNb25kYXkgPSB1dGNXZWVrZGF5KDEpOwp2YXIgdXRjVHVlc2RheSA9IHV0Y1dlZWtkYXkoMik7CnZhciB1dGNXZWRuZXNkYXkgPSB1dGNXZWVrZGF5KDMpOwp2YXIgdXRjVGh1cnNkYXkgPSB1dGNXZWVrZGF5KDQpOwp2YXIgdXRjRnJpZGF5ID0gdXRjV2Vla2RheSg1KTsKdmFyIHV0Y1NhdHVyZGF5ID0gdXRjV2Vla2RheSg2KTsKCnZhciB1dGNTdW5kYXlzID0gdXRjU3VuZGF5LnJhbmdlOwp2YXIgdXRjTW9uZGF5cyA9IHV0Y01vbmRheS5yYW5nZTsKdmFyIHV0Y1R1ZXNkYXlzID0gdXRjVHVlc2RheS5yYW5nZTsKdmFyIHV0Y1dlZG5lc2RheXMgPSB1dGNXZWRuZXNkYXkucmFuZ2U7CnZhciB1dGNUaHVyc2RheXMgPSB1dGNUaHVyc2RheS5yYW5nZTsKdmFyIHV0Y0ZyaWRheXMgPSB1dGNGcmlkYXkucmFuZ2U7CnZhciB1dGNTYXR1cmRheXMgPSB1dGNTYXR1cmRheS5yYW5nZTsKCnZhciB1dGNNb250aCA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldFVUQ0RhdGUoMSk7CiAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogIGRhdGUuc2V0VVRDTW9udGgoZGF0ZS5nZXRVVENNb250aCgpICsgc3RlcCk7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICByZXR1cm4gZW5kLmdldFVUQ01vbnRoKCkgLSBzdGFydC5nZXRVVENNb250aCgpICsgKGVuZC5nZXRVVENGdWxsWWVhcigpIC0gc3RhcnQuZ2V0VVRDRnVsbFllYXIoKSkgKiAxMjsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJldHVybiBkYXRlLmdldFVUQ01vbnRoKCk7Cn0pOwoKdmFyIHV0Y01vbnRocyA9IHV0Y01vbnRoLnJhbmdlOwoKdmFyIHV0Y1llYXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTsKICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRVVENGdWxsWWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgKyBzdGVwKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJldHVybiBlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZZWFyKCk7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENGdWxsWWVhcigpOwp9KTsKCi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4KdXRjWWVhci5ldmVyeSA9IGZ1bmN0aW9uKGspIHsKICByZXR1cm4gIWlzRmluaXRlKGsgPSBNYXRoLmZsb29yKGspKSB8fCAhKGsgPiAwKSA/IG51bGwgOiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRVVENGdWxsWWVhcigpIC8gaykgKiBrKTsKICAgIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7CiAgICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApOwogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCAqIGspOwogIH0pOwp9OwoKdmFyIHV0Y1llYXJzID0gdXRjWWVhci5yYW5nZTsKCmV4cG9ydHMudGltZUludGVydmFsID0gbmV3SW50ZXJ2YWw7CmV4cG9ydHMudGltZU1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQ7CmV4cG9ydHMudGltZU1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kczsKZXhwb3J0cy51dGNNaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kOwpleHBvcnRzLnV0Y01pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kczsKZXhwb3J0cy50aW1lU2Vjb25kID0gc2Vjb25kOwpleHBvcnRzLnRpbWVTZWNvbmRzID0gc2Vjb25kczsKZXhwb3J0cy51dGNTZWNvbmQgPSBzZWNvbmQ7CmV4cG9ydHMudXRjU2Vjb25kcyA9IHNlY29uZHM7CmV4cG9ydHMudGltZU1pbnV0ZSA9IG1pbnV0ZTsKZXhwb3J0cy50aW1lTWludXRlcyA9IG1pbnV0ZXM7CmV4cG9ydHMudGltZUhvdXIgPSBob3VyOwpleHBvcnRzLnRpbWVIb3VycyA9IGhvdXJzOwpleHBvcnRzLnRpbWVEYXkgPSBkYXk7CmV4cG9ydHMudGltZURheXMgPSBkYXlzOwpleHBvcnRzLnRpbWVXZWVrID0gc3VuZGF5OwpleHBvcnRzLnRpbWVXZWVrcyA9IHN1bmRheXM7CmV4cG9ydHMudGltZVN1bmRheSA9IHN1bmRheTsKZXhwb3J0cy50aW1lU3VuZGF5cyA9IHN1bmRheXM7CmV4cG9ydHMudGltZU1vbmRheSA9IG1vbmRheTsKZXhwb3J0cy50aW1lTW9uZGF5cyA9IG1vbmRheXM7CmV4cG9ydHMudGltZVR1ZXNkYXkgPSB0dWVzZGF5OwpleHBvcnRzLnRpbWVUdWVzZGF5cyA9IHR1ZXNkYXlzOwpleHBvcnRzLnRpbWVXZWRuZXNkYXkgPSB3ZWRuZXNkYXk7CmV4cG9ydHMudGltZVdlZG5lc2RheXMgPSB3ZWRuZXNkYXlzOwpleHBvcnRzLnRpbWVUaHVyc2RheSA9IHRodXJzZGF5OwpleHBvcnRzLnRpbWVUaHVyc2RheXMgPSB0aHVyc2RheXM7CmV4cG9ydHMudGltZUZyaWRheSA9IGZyaWRheTsKZXhwb3J0cy50aW1lRnJpZGF5cyA9IGZyaWRheXM7CmV4cG9ydHMudGltZVNhdHVyZGF5ID0gc2F0dXJkYXk7CmV4cG9ydHMudGltZVNhdHVyZGF5cyA9IHNhdHVyZGF5czsKZXhwb3J0cy50aW1lTW9udGggPSBtb250aDsKZXhwb3J0cy50aW1lTW9udGhzID0gbW9udGhzOwpleHBvcnRzLnRpbWVZZWFyID0geWVhcjsKZXhwb3J0cy50aW1lWWVhcnMgPSB5ZWFyczsKZXhwb3J0cy51dGNNaW51dGUgPSB1dGNNaW51dGU7CmV4cG9ydHMudXRjTWludXRlcyA9IHV0Y01pbnV0ZXM7CmV4cG9ydHMudXRjSG91ciA9IHV0Y0hvdXI7CmV4cG9ydHMudXRjSG91cnMgPSB1dGNIb3VyczsKZXhwb3J0cy51dGNEYXkgPSB1dGNEYXk7CmV4cG9ydHMudXRjRGF5cyA9IHV0Y0RheXM7CmV4cG9ydHMudXRjV2VlayA9IHV0Y1N1bmRheTsKZXhwb3J0cy51dGNXZWVrcyA9IHV0Y1N1bmRheXM7CmV4cG9ydHMudXRjU3VuZGF5ID0gdXRjU3VuZGF5OwpleHBvcnRzLnV0Y1N1bmRheXMgPSB1dGNTdW5kYXlzOwpleHBvcnRzLnV0Y01vbmRheSA9IHV0Y01vbmRheTsKZXhwb3J0cy51dGNNb25kYXlzID0gdXRjTW9uZGF5czsKZXhwb3J0cy51dGNUdWVzZGF5ID0gdXRjVHVlc2RheTsKZXhwb3J0cy51dGNUdWVzZGF5cyA9IHV0Y1R1ZXNkYXlzOwpleHBvcnRzLnV0Y1dlZG5lc2RheSA9IHV0Y1dlZG5lc2RheTsKZXhwb3J0cy51dGNXZWRuZXNkYXlzID0gdXRjV2VkbmVzZGF5czsKZXhwb3J0cy51dGNUaHVyc2RheSA9IHV0Y1RodXJzZGF5OwpleHBvcnRzLnV0Y1RodXJzZGF5cyA9IHV0Y1RodXJzZGF5czsKZXhwb3J0cy51dGNGcmlkYXkgPSB1dGNGcmlkYXk7CmV4cG9ydHMudXRjRnJpZGF5cyA9IHV0Y0ZyaWRheXM7CmV4cG9ydHMudXRjU2F0dXJkYXkgPSB1dGNTYXR1cmRheTsKZXhwb3J0cy51dGNTYXR1cmRheXMgPSB1dGNTYXR1cmRheXM7CmV4cG9ydHMudXRjTW9udGggPSB1dGNNb250aDsKZXhwb3J0cy51dGNNb250aHMgPSB1dGNNb250aHM7CmV4cG9ydHMudXRjWWVhciA9IHV0Y1llYXI7CmV4cG9ydHMudXRjWWVhcnMgPSB1dGNZZWFyczsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7Cgp9KSkpOwoKfSx7fV19LHt9LFsxXSk7Cg=="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget-e324935051367d6f0bea" class="datatables html-widget" style="width:960px;height:500px;">
</div>
<script type="application/json" data-for="htmlwidget-e324935051367d6f0bea">{"x":{"filter":"none","data":[["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38"],["A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B","C","C","C","C","C","C","C","C","C","D","D","D","D","D","D","D","D","D"],["A.1","A.1","A.1","A.1","A.1","A.2","A.2","A.2","A.3","A.3","B.1","B.1","B.2","B.2","B.2","B.2","B.3","B.3","B.3","B.3","C.1","C.2","C.2","C.2","C.2","C.2","C.3","C.4","C.4","D.1","D.1","D.1","D.2","D.2","D.2","D.2","D.2","D.2"],["A.1.a","A.1.b","A.1.c","A.1.d","A.1.e","A.2.a","A.2.b","A.2.c","A.3.a","A.3.b","B.1.a","B.1.b","B.2.a","B.2.b","B.2.c","B.2.d","B.3.a","B.3.b","B.3.c","B.3.d",null,"C.2.a","C.2.b","C.2.c","C.2.d","C.2.e","C.3.a","C.4.a","C.4.b","D.1.a","D.1.b","D.1.c","D.2.a","D.2.b","D.2.c","D.2.d","D.2.e","D.2.f"],["<div id=\"htmlwidget-dd30068b81745144024d\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-dd30068b81745144024d\">{\"x\":{\"data\":[[1.03013474037871,1.06869588929192,1.04410548073431,1.09140496583893,1.05832464211196,1.05928568582349,1.01092313308822,1.02603572305752,1.01688379866631,0.98781106083931,1.02385026272678,0.991964207361941,0.944736127270083,0.949054753600245,0.949484372458382,0.9453331819753,0.928223808847416,0.906550949166815,0.862260266413215,0.84519921697219,0.867817044294736,0.886199573309823,0.883609083762746,0.876670919980766,0.875219120838463,0.899201385541137,0.854744400805663,0.831617761842394,0.822724161855358,0.84562179875413,0.820460646895278,0.856510305555741,0.832145222696686,0.851631964683814,0.822337414099867,0.79008721940543,0.78340438871031,0.803625943516735,0.78125594816383,0.806004723738672,0.787980228372414,0.791300845581994,0.768898354742217,0.757789007008114,0.731274587584176,0.695273635697637,0.715106136367886,0.680036152912516,0.713053793470528,0.737931678932534,0.701274426727704,0.685801086603422,0.714110953928899,0.738128588872627,0.714264479438739,0.728175296164796,0.750441051141379,0.727902081481135,0.744078587949846,0.752935991201899,0.731848727481906,0.756573728634425,0.74725036604494,0.735228353596905,0.739372681290473,0.728950401981377,0.743198570379915,0.771182668976205,0.744275234393464,0.744625217870457,0.714637751271109,0.698694293867975,0.728931357260514,0.745219504345806,0.752504988862644,0.772233757785102,0.783988229064485,0.769408701975863,0.752678896151886,0.720649722298462,0.711861091423269,0.684083106493586,0.710436637727195,0.725098682161143,0.740148708736477,0.776031060317804,0.737807192871749,0.744449363232241,0.766611869192782,0.798699741522904,0.762286423746083,0.756235891618001,0.760299430089716,0.773731689843048,0.76110514340947,0.780536174082937,0.784572816483797,0.768795541285605,0.764824170553112,0.746094656702309,0.738568585922181,0.730994477841053,0.76232288627219,0.771754615361875,0.757000074846738,0.753201461142206,0.773872015537948,0.765978849885536,0.728446266077522,0.717551219109736,0.751552728802762,0.75428557841869,0.745136178474918,0.782054925180099,0.760593971876086,0.764694711393078,0.73689414664493,0.719710003565689,0.716883073803028,0.707996825748908,0.683636050300606,0.687533108982894,0.664147538944069,0.695484231262393,0.703177498858945,0.703997003693212,0.708003161945918,0.688636306915512,0.65562437958473,0.666100400335401,0.679652819556941,0.703059095779874,0.690152530896221,0.689135881234892,0.675903930049074,0.697944812246869,0.705475077822027,0.711699763102107,0.70648741395489,0.698037555681191,0.727205453510197,0.726118022373157,0.715431781695935,0.709262088948327,0.73388578131217,0.756545170923139,0.775785098604955,0.785817155011869,0.790417703206762,0.796409603222257,0.761974111201852,0.799971672985289,0.805623500431115,0.812156450254097,0.848432378711402,0.809957126361644,0.806734855745261,0.821114134744976,0.822683031707962,0.853430655921734,0.820528325357022,0.85133760343686,0.836381950818016,0.851270290302443,0.882182856687107,0.85403420848638,0.840551423848613,0.879133468651887,0.912123690339699,0.942639359933705,0.985419232107232,1.00505776237877,0.984312867768497,0.948987803824223,0.964997113911736,0.973892982154597,1.00241573160705,1.04730374942765,1.0417333371639,1.03289826889373,1.02874478695811,1.02890338516272,1.05503074138146,1.04948946373105,1.03548902368312,1.02074872140677,0.993478870604333,1.03507314494476,1.06558024794021,1.05896037915993,1.08504488167713,1.12430839780182,1.0730368844678,1.05906896916825,1.07653324633245,1.11337133545155,1.13248539468098,1.18685216513089,1.1829827026781,1.20144541726471,1.2008240940295,1.17927005930049,1.19890806563009,1.22195436473723,1.27287624009405,1.28468636342635,1.22967618574526,1.23884790698683,1.27500519812514,1.30623865502211,1.32538710484914,1.35411590013229,1.34435492268661,1.37099572285727,1.41419880066877,1.3769925634187,1.3361055451049,1.35486874933011,1.36608202652192,1.31556682275371,1.35912722435001,1.30533633091967,1.34562339919953,1.31395926816656,1.26730832711982,1.21210418855411,1.20731425876541,1.17387516355271,1.19524524543957,1.23077729353573,1.234723133945,1.20412360822675,1.14944155979803,1.12130280842436,1.16848619092515,1.17580684617142,1.1478854982236,1.1898984920944,1.18415063257992,1.19001655455227,1.16760542448739,1.20950022786994,1.2365767653031,1.24544741846214,1.27943656102972,1.24513623227797,1.27683508827232,1.23926068884976,1.24102278182256,1.23662200409127,1.25823701345514,1.27987099404363,1.25405416247027,1.22236110220875,1.18742543127636,1.141403086973,1.0892662399248,1.06308017147615,1.06365493540707,1.09925663572896,1.13814109380617,1.18497395925612,1.19388556406962,1.16349870185905,1.15461325657183,1.16066304815583,1.17928106732296,1.14515124231134,1.09313294430504,1.049884545575,1.06606015078826,1.11321518419983,1.12743312931572,1.10870640521028,1.11774629251327,1.14074264638956,1.1155286069636,1.11789256176366,1.1556566103204,1.13348627356647,1.11214641802812,1.10247845746451,1.06505375029695,1.05022344875777,1.00089327507917,0.954441411671878,0.911927296640026,0.950673703349804,0.926066143417238,0.914510469831547,0.949447055602726,0.981792870540709,1.02871089548379,1.05063415350112,1.01764067557461,0.975071506432832,0.975801215411989,1.01795588940005,0.97564370823368,0.973075196828518,1.00791975668812,1.03411288324876,1.05258696544755,1.06544578839276,1.09529552132291,1.05022927074625,1.06403514518689,1.02764478494568,1.01329875159186,1.0271897460391,1.01920465197304,1.02083310087167,0.999813200765087,1.00068942012172,0.999368680527348,0.989878938712234,0.985687552037717,1.02035227549256,1.01915605982673,1.02986777046831,1.07449507570848,1.12763037687079,1.13462404512727,1.18243852242244,1.15639967118044,1.18044542243279,1.18979568449089,1.14862893260831,1.12090113025651,1.11427784074024,1.16745642024293,1.12283972446318,1.14281960804396,1.1599454275189,1.17926840310758,1.225410412178,1.24636825393503,1.28719625031933,1.22869352114109,1.19227010686268,1.17780023318969,1.1917015731235,1.14811832417086,1.2019901120786,1.23836617227769,1.19151490584206,1.22437306482376,1.1702479955511,1.15177725727619,1.18717505252803,1.14767071154436,1.17294730540942,1.11999840508623,1.11469941524487,1.16242816417931,1.12920858797274,1.10124130496183,1.10257491918298,1.0533760648068,1.03226223282703,1.0539843210905,1.0957163632182,1.14943419759034,1.15882843443351,1.1398413364589]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-c4b6786b7bc6013a64c7\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-c4b6786b7bc6013a64c7\">{\"x\":{\"data\":[[0.968803625577129,0.926676005344065,0.904997679816978,0.934963077139068,0.956341184742614,0.991018775090502,0.996412514364278,1.03814293811222,0.990127181638212,0.992962071237262,0.987186202749178,1.00419700885065,0.987154330580597,1.00021533749037,0.999251912238513,1.04059932639704,1.06035708580506,1.09855956903815,1.1189506117071,1.09414387591526,1.10406856764474,1.12633514305937,1.08784112569237,1.1138684087522,1.16785623716554,1.16862451581363,1.14940272485072,1.14453904419087,1.15399176756101,1.11570905160798,1.0646506387899,1.06912141353415,1.09770121334697,1.05024343242596,1.04106818038076,1.08050188142563,1.03429088788234,1.00646554564062,0.973872282980177,0.956782780550406,0.929993883773334,0.905897046603906,0.873672438823281,0.91159217217408,0.913801831946353,0.917125597595411,0.949362967649949,0.915090266821451,0.914727609675233,0.942322961909355,0.933305965910985,0.924289330840145,0.948456303232944,0.992142965546199,1.0364126734788,1.08705140651313,1.11951535486179,1.09590281876966,1.0745421625665,1.07308117889927,1.11601969711857,1.12318188741649,1.17445633197944,1.14917795647385,1.14382227184179,1.18838008649747,1.14582203739948,1.1546357627673,1.13301102994081,1.11259081485098,1.08050216676639,1.07951435890607,1.07270549325746,1.02396264037167,1.06651849258256,1.06389475360374,1.0541455936428,1.08570755318192,1.04599153906584,1.08022446451852,1.04334729166544,1.05917778640235,1.0129845432315,1.00132007978177,0.97012851849565,0.968376050878667,0.964364914698209,0.940146802250338,0.96951799270258,0.970199777009541,0.970670236856401,0.946864612563169,0.956226831693667,0.959972236851568,0.915123828757868,0.879594024415724,0.906923707208303,0.888513998586339,0.891166237122103,0.879213671265488,0.920006071588818,0.939185239440468,0.977208286903403,0.97488876093982,1.00911200762525,0.973167427736339,0.978155878224925,0.978392630803967,0.992568371908237,1.02724602577835,1.0755939366821,1.06037402259014,1.06107283387136,1.08213104718577,1.02976798410573,1.0496914661982,1.08479602400766,1.07972626665459,1.09304533450106,1.06420500090542,1.03292045920539,1.07650154242816,1.06773111266196,1.06505294234369,1.07282506775783,1.11907116549387,1.13262606528059,1.17669242688671,1.15825656034637,1.16777244002794,1.174431645889,1.17280985576681,1.13363634723988,1.13043772942115,1.1755883515911,1.1775216998022,1.23565157609717,1.2200508576973,1.23490145168893,1.20493016113044,1.24671501185338,1.2370461038734,1.2238457407523,1.21597871363303,1.22293265972969,1.23215464546462,1.24563901125875,1.1870569157315,1.18624970383462,1.13280216922446,1.11780965565026,1.12691353692021,1.09007570567527,1.0968025770975,1.10495673055951,1.14343359684074,1.14217738397102,1.15936990292949,1.20710345079593,1.17610128534609,1.1837271999747,1.17224488423489,1.21904689907187,1.23644184636913,1.20987670699865,1.18004435632558,1.12663959207353,1.12239913438479,1.13563391632931,1.11417549038609,1.13043585903543,1.11250209892648,1.08077964911351,1.05274057118706,1.05897780829197,1.01171460242126,1.02884285422017,1.06639151657776,1.08212671277937,1.11883508353096,1.11854142537857,1.17419462030609,1.13373627410229,1.1410827598056,1.18304624899347,1.21580670267336,1.18530993008856,1.18023637445179,1.22553607742241,1.24599201206974,1.19497518501207,1.24470224139448,1.28329983605172,1.25505511096712,1.19452841721585,1.23870562815373,1.23625814699086,1.294030460588,1.35249388102785,1.34131590151862,1.28419079548407,1.22013660050487,1.26228981260938,1.30057380106477,1.29143541857601,1.35216447431162,1.3028971947679,1.24264140206468,1.18617775597805,1.19963665305592,1.23411407578403,1.21129347628551,1.15365548140661,1.11308710191653,1.08431786721305,1.06688729301408,1.03283854525145,1.03037684695024,0.995886849653866,0.963018675829413,0.943318469101025,0.918848229431591,0.961015435081421,0.983563092721089,0.957289549218183,0.945307995241242,0.905957231572192,0.942041951743442,0.923250916470396,0.924348854046583,0.929713401870921,0.889763052170368,0.892968739618717,0.910841000324642,0.935895984187859,0.955706378469234,0.967233065125996,0.975923871185509,1.00126972957284,1.01051984411411,1.01176420078452,0.991925670275699,0.964859889723334,1.01256169657896,1.05503386840706,1.05680165055968,1.02492467845358,1.04109733074159,1.03839861400279,0.988555396106148,0.948309331295252,0.97039930511867,0.968938668664388,0.953762265601021,0.990190141013493,0.990527354735702,0.988829154817225,1.02674450085466,1.00119770354323,1.02853037108636,1.06228010867813,1.05216904054605,1.01457013730939,1.04325380318311,1.01616295591799,1.00095173521361,1.0034455488938,1.03779858286879,1.01104907562489,1.04584973585804,1.01249281654447,0.971101277398401,1.00454718915556,1.01815388046385,1.01653515660617,1.06065964094411,1.05309004239785,1.06481734689377,1.05071815501244,1.0500865170143,1.00664929947054,1.02230085858198,1.0105134304693,0.97224670149278,0.972564972507159,1.01965261662288,1.06759546118694,1.0597175970428,1.08829883786898,1.05755705867193,1.0724462928939,1.08965966615744,1.10402108664863,1.12855055887923,1.07808129923442,1.10683362429858,1.09010068532176,1.13958757015673,1.09904508253249,1.08829329738481,1.07313277262468,1.05116701253682,1.08216849821823,1.08133070855821,1.06940687029633,1.04505368308796,1.05943333895752,1.09807616115994,1.11827019669045,1.14254011487402,1.17604113500025,1.20641655496518,1.25201672244409,1.19136337281827,1.17155840586348,1.15930402289034,1.21367502389566,1.16943956331343,1.20693861834648,1.20333011602533,1.2034784172671,1.24854914397113,1.27444725652758,1.22087027798025,1.27698410076938,1.24225696077515,1.21792759979451,1.2769346682957,1.27510326248945,1.30694602741114,1.27205272993286,1.28945199817763,1.31731991874372,1.30713292450562,1.28060813855094,1.26719637152464,1.26639013392547,1.25116005455572,1.29878424555115,1.27098914946329,1.31447242178802,1.24977545683363,1.19880428779574,1.19278397789416,1.24288299355275,1.28827190253648,1.22681527222816,1.22288699978101,1.2133712830906,1.26875480884686,1.30197396767825,1.33595039809135,1.33789601548128,1.32096679679029,1.34644055143647,1.31159110825666,1.31227286739024,1.27336125335093,1.33073366989477,1.32141752407089,1.35569124596568,1.30653270849298,1.35272026078998,1.38986983947286,1.41449832847031]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-33f037bb271b6ac238d1\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-33f037bb271b6ac238d1\">{\"x\":{\"data\":[[0.977603453304619,1.02305837144302,0.993030557648114,0.984329649877648,1.02704488465696,1.05404848459021,1.1002106526973,1.09488381331005,1.05227236369317,1.0194480295381,0.995638596907279,0.96011974710368,0.957019505082449,0.950158925251122,0.986388992077735,0.948700803825087,0.965073067252788,0.987818792629653,1.03602487779001,1.0691552052179,1.05524515954661,1.00548993313729,1.00202072080331,1.04077546740653,1.0775473889081,1.08992994665652,1.07132725384259,1.02517875864712,1.0669092269893,1.05277242982512,1.09705399713796,1.05911461190884,1.02251807567534,1.05943981969061,1.02762841928683,1.07076562144808,1.10043750047189,1.12353680956071,1.10911952979976,1.10440346969467,1.14260536430787,1.19022734199644,1.18677623832153,1.1703053014969,1.13196202653156,1.10862464565368,1.06600909345936,1.0201253142642,0.995158380575441,1.01259942340072,1.01605001956546,1.01320038615864,1.00761240726969,1.03764477007917,1.06681565374372,1.06662257108429,1.01962514103103,0.97311108805383,0.987817692240943,1.00381716077309,1.0267148674178,1.01734401978895,0.973650458921314,0.952675837624633,0.987636586588962,0.953835751311166,0.992961066837077,1.03414569158156,1.04830642797007,1.09111747692003,1.05661553293586,1.06766681166416,1.1059684775842,1.12993042640346,1.10320617865297,1.09121821609958,1.05752034950094,1.0807525439143,1.11640538618279,1.10532942240896,1.11655880975161,1.0671373548939,1.04828867755608,1.00030743096682,1.04153768249928,1.05971032261987,1.03858636215353,1.06347450533313,1.02151001657486,0.980802292375323,1.02242031188726,1.02721561775965,1.05091362498325,1.0750669721309,1.08025601524478,1.0499635925463,1.08347117175819,1.09435458890044,1.09838132020335,1.08259923272865,1.07647254596924,1.02536668666886,1.02880251863877,1.07494929216151,1.08957925271664,1.10177680969618,1.11552150640679,1.10927770284682,1.09302285708126,1.10563880675173,1.14727166489528,1.12277967681381,1.11891019198665,1.12772202825384,1.11624369572976,1.1269540653464,1.16068897970424,1.12638034332655,1.09903381679078,1.15018308792116,1.13072669580385,1.07471501353399,1.10559064905504,1.05408464797737,1.034096265442,1.03493319572938,1.00680138315451,1.05531609848066,1.07606539556807,1.11012369725457,1.13831539462745,1.13399837228648,1.14633891009888,1.18789726219108,1.17724309367365,1.19148808406665,1.16666927710732,1.2039227142693,1.23964326586358,1.2106541521315,1.17466702519297,1.14955465470587,1.15772442567815,1.10809403059655,1.14113590860502,1.13551591498747,1.16882642977689,1.1728679440268,1.17088437107876,1.21194648879161,1.17425974861166,1.17790567072527,1.23508637809159,1.25898402901896,1.30209792658355,1.24320377218228,1.22783582626605,1.26619206215278,1.28977619133483,1.30130909956982,1.30388920428597,1.29865185835317,1.30347219830943,1.34484662521002,1.35612327817716,1.31192695584323,1.36089664059055,1.40238940331578,1.37764678533635,1.438634279673,1.50717698793122,1.52368693221684,1.49507307396974,1.47145126094751,1.54244941531026,1.52090906842426,1.56827050437157,1.62808934955327,1.60132713138126,1.64462690091807,1.60424249941348,1.64601547637503,1.65041722626465,1.58611448040301,1.51800832569395,1.58777105294947,1.56938871693588,1.62178822267362,1.61201596522742,1.63488987852124,1.60418824329462,1.66421757463306,1.60610308940057,1.59987022889406,1.63660113384818,1.59005459817784,1.56862379569946,1.54948856450666,1.59118577094411,1.53358452920979,1.46634026405267,1.48172579326726,1.50781929812419,1.44333202743506,1.50719906126263,1.45771754034929,1.52381339090929,1.47543050502092,1.49675843374757,1.48159663129599,1.49535260061103,1.51189868151313,1.43986326590898,1.49182017646808,1.46365551873961,1.52655924705895,1.57754804001117,1.5673032098103,1.51856967279523,1.52957367321318,1.53729395553868,1.50047551999292,1.55593172494407,1.52084983923854,1.45420308235313,1.47798057376,1.46991746260623,1.41127577827406,1.42005677141884,1.44138199427928,1.44715926117418,1.37768694932038,1.37672912783766,1.36000515639194,1.4116202382284,1.41648348932388,1.36989028398347,1.32524858150396,1.36685858753725,1.41426473186836,1.35892903403733,1.29418248328859,1.23123294775749,1.17454379425703,1.2081974404177,1.21879132688559,1.2497819700734,1.28051233683366,1.22793874934289,1.25111586719937,1.27952535185934,1.23657475409777,1.25091973810895,1.25496822813045,1.27652729480662,1.24471301513613,1.30601996908013,1.28667507990525,1.26422253993985,1.26266088683941,1.2445505388956,1.19525956318527,1.14105007009639,1.14088640194149,1.09494802608882,1.14174289515538,1.16539043934005,1.17985387839616,1.15035384883566,1.16234048919634,1.16351360443497,1.11334393160037,1.11974802605898,1.11672894973128,1.09618347766679,1.13695430430697,1.17757566215084,1.16744582907089,1.15004068489522,1.09456344839604,1.04570473591443,1.06307671291166,1.11590710420007,1.11963030305534,1.10550361101808,1.07352130598631,1.11931087809429,1.07689186583765,1.05920397659997,1.07582406826106,1.10083515205633,1.09020560283615,1.0463561405153,1.09819762252451,1.04334311532199,1.0389383089839,1.0861175806119,1.04589637316491,1.04384379768949,1.08347730988041,1.09936142862084,1.10267547816533,1.12204886255174,1.0674034074395,1.09104311206988,1.0547743552173,1.08297955409916,1.10279448577705,1.08137748718733,1.0439479690958,1.0491708281017,1.03623966796323,1.01566486136991,1.02128935055412,1.04569732469888,1.01648418718451,0.981589854973369,1.00719287317411,0.993129918240021,0.991052865426384,0.993683642396508,1.04133176083095,1.02744608673051,1.05831947450233,1.0216611696177,0.972160091240144,0.940443318292893,0.937075364883948,0.927085974472226,0.915164973045929,0.914984566660676,0.909910582983991,0.868596403177655,0.89017406002612,0.905727202530819,0.920991994470029,0.938047133000414,0.983440658789029,0.982767205725103,0.950956599635801,0.929266705893699,0.957905525783614,0.986784986868054,1.03336177371901,1.07520122297714,1.11655094782423,1.08504474257452,1.13709049877619,1.15064118804423,1.19465466569771,1.15848463393371,1.10510220302784,1.15038553864299,1.16834995193057,1.18964192366929,1.24853739625039,1.27859403596825,1.27122482438488,1.20819139221385,1.17720498725443,1.23393637899708,1.25494224005275,1.2732478723524,1.2296824778472,1.20121872292193]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-468a375b2601c902fcd9\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-468a375b2601c902fcd9\">{\"x\":{\"data\":[[1.0207545670215,1.03267510919233,1.01812303159901,1.03420177794874,1.01043895903576,0.98853318032315,0.967092177692569,0.992336245010798,0.989816128156107,0.956051237964562,0.933671004090777,0.957504506369254,0.933744656321382,0.915690316687334,0.886526562162754,0.863713747405409,0.879023867130699,0.857105025986671,0.891994772338724,0.859500126351099,0.867224931210105,0.881416589252913,0.866706701757048,0.871277653186859,0.879910228809473,0.919441434263367,0.910505975595871,0.867919738372165,0.908469442293091,0.949586751035857,0.925471850297601,0.893651432696891,0.877873460464476,0.840929919091789,0.82229410662227,0.78325016636281,0.777110153625651,0.760168534103448,0.76300254473814,0.732167392524726,0.712937419896129,0.7352755265087,0.74006827403018,0.773659988398931,0.753647978392217,0.757969477148353,0.75887629392302,0.774988149203656,0.786719746758547,0.805217226392949,0.789789003868725,0.771275817102795,0.77965985251523,0.751214978938458,0.763269550205127,0.784853040023651,0.770659336762577,0.779458674238893,0.787766626996995,0.821723792664031,0.8133384711969,0.851015802104994,0.846308755796707,0.842343129431951,0.873790918861595,0.844711126709711,0.831431042061151,0.806790512466172,0.799548323023827,0.782944345832556,0.753432016842481,0.778761293828281,0.74458706911182,0.710763423969373,0.730299763514646,0.752499432548694,0.725559858129586,0.719908510736994,0.73053821007854,0.746677564287945,0.746903751090483,0.736425216484001,0.752877096780719,0.733858545499794,0.76636734824611,0.768611395934867,0.742323496996189,0.771944184253296,0.748696062848801,0.726196932009311,0.728620129235903,0.740648543424833,0.713025929647601,0.736280148541522,0.745047797791367,0.776724005273047,0.774405296613178,0.759463940330982,0.73237175247242,0.721231502414366,0.7345445829776,0.703112323610952,0.732389821411992,0.702678021950523,0.69926217086652,0.705067354383573,0.712588213747911,0.697662871806626,0.700296071510185,0.697942796510198,0.700831134921962,0.683474179480932,0.716422636892286,0.744320206715222,0.741319677287157,0.757779525443444,0.724691060336538,0.756204721689683,0.720002055344292,0.713082272899344,0.742727244688357,0.715170478816658,0.741482497771101,0.753342430995023,0.789076508418065,0.814583419368482,0.784264251411304,0.812133573061815,0.820117564186799,0.830607772925615,0.813790318075177,0.796415844643342,0.770086036868911,0.741020109057442,0.749965938699769,0.780761560164134,0.74750248738178,0.728812123111919,0.717915926436744,0.738296111621328,0.754468942063175,0.783015915596962,0.763479361644875,0.749983535118171,0.786770206566868,0.771592326670789,0.787549892356574,0.764489009401904,0.798889937569005,0.803155787584306,0.795964951045172,0.800956138462159,0.811769793847169,0.827312230417912,0.868416117054011,0.885467989727212,0.853945980902872,0.841685981360533,0.858215788907767,0.862312927075301,0.896462449153324,0.907227314911322,0.934152611364209,0.888213090834572,0.922175461970331,0.939553144897193,0.893336072914816,0.934495773296574,0.931013669688755,0.970895943411752,0.953800489934777,0.947939310537544,0.931912871355946,0.931626267560887,0.962617390534266,0.988173268067161,1.0094090106652,0.962474194946876,0.965732258547151,1.00670601067364,1.04369143486112,1.01616272011028,0.98731603299336,1.02320170568045,1.02464664775491,1.04920812059064,1.04277743738462,1.03609326818797,1.03329523508559,1.0302841188231,1.01373103138434,0.999522464148906,1.00509801972754,1.04169374794776,1.01201686090856,1.04430637505676,1.01952695777312,0.971876791041661,0.965013817654501,0.946188517803393,0.98898663242577,0.984269323622675,1.00760968526502,1.02725262415601,1.02380099597887,1.03841863071652,1.04337614174852,1.00096999032636,1.04241739345294,0.99749002219186,1.02425548647304,0.991028258830544,0.969304450236318,1.00903114667657,1.05607104275202,1.10075276098322,1.14499884187616,1.15439665842114,1.14214776589809,1.18054829252553,1.13086692882927,1.09987574685848,1.0895634786868,1.05539356284573,1.10673240288925,1.14571117974102,1.13254204476957,1.13724350036425,1.14514724755257,1.18572363895508,1.15867739009362,1.18039414372839,1.1289897291573,1.1631745170047,1.1145542764374,1.16374949358113,1.20772165196133,1.20899221799454,1.22763948255906,1.27410268071162,1.28778129108644,1.26182222863848,1.28701279167773,1.27837467016326,1.29855967362816,1.35277559394235,1.37094590509597,1.32705470543501,1.26651583735847,1.32122406520473,1.33017719027668,1.34240260428322,1.29546436350436,1.30968552977738,1.30362174800578,1.24121565193728,1.19535145500259,1.22766866129955,1.27580925150106,1.24295699822701,1.2550472835227,1.22614670610697,1.23507538327724,1.19489144041151,1.16410988714371,1.1448164008243,1.10341373995125,1.09626586996898,1.06577518849638,1.09552964932674,1.12030337720643,1.16364556039428,1.17002192235151,1.19558149125829,1.22704114694952,1.26051152581987,1.28987369247566,1.32961620282481,1.30285362075794,1.33488291398568,1.35242486825016,1.30563749033793,1.31834033176956,1.33853599347936,1.3946756227833,1.38335878141585,1.37450196657603,1.32186413113318,1.2848273326552,1.29069027529713,1.23372246979162,1.20687755528629,1.18659408199398,1.21766240712882,1.17995442225035,1.17568268248748,1.16497707611498,1.11768212720162,1.13215213221698,1.17573999062638,1.20403156389161,1.22120368591053,1.19739678273151,1.16780800538569,1.13289030942968,1.1389269140358,1.14441217120109,1.19736076376414,1.16085040721214,1.1805842790206,1.14976168355449,1.20198954043019,1.20954533021321,1.25901240184508,1.30639889300492,1.35897648796868,1.41446947017514,1.39405863257188,1.45002459886187,1.49598481800955,1.47326759063354,1.46046522546453,1.41764752081691,1.39286670067201,1.44787081319677,1.46817535125673,1.40581854588178,1.39592686411877,1.36369677917833,1.41985472492712,1.35998981003732,1.36903398231856,1.3944545783861,1.33023671034047,1.29636880352612,1.23765220337875,1.29001997289324,1.29024099287216,1.34384686670281,1.3072593401264,1.30213010478192,1.27203484187934,1.32694866642246,1.35655701417374,1.29716278032633,1.29203086324356,1.35153144969134,1.33370303403629,1.2748646298636,1.22342339478695,1.18535270400412,1.20640750922101,1.24340404150325,1.27468337120016,1.22680428215331,1.22653295082621,1.26819568225105,1.21495596604177,1.26080975564007,1.22251242271175,1.2706949930531,1.28536861577696,1.26925071208002,1.24478317202462,1.28446915822824]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-0047e9d62db1ce33b89e\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-0047e9d62db1ce33b89e\">{\"x\":{\"data\":[[0.982874803617597,0.951447190090335,0.913645222604978,0.874511813018892,0.879490835662451,0.91385653496649,0.9376590321148,0.900348737315783,0.897183559805557,0.88766199218778,0.851453805152438,0.834347066914386,0.851192080224325,0.864652098022278,0.852307687101937,0.865334069145423,0.860797626418987,0.887516967973501,0.89923119701347,0.879146612286845,0.896398115481258,0.875900414542403,0.860897712776958,0.873212926403294,0.837311799277142,0.839188086563536,0.841664834789974,0.870250925706817,0.867836587949543,0.876616627113031,0.848671365501446,0.856034219003364,0.875313557887577,0.89950377485477,0.930737371550322,0.89171794341367,0.902199438724247,0.912283638081554,0.867288413244381,0.895528482851797,0.869633310772959,0.877812903658613,0.852080306447834,0.863352676470275,0.867885271608563,0.852882960363472,0.879322332834526,0.896258309770435,0.903590117659548,0.910567737059488,0.879410891887522,0.906925580711423,0.940432513582732,0.903029365898174,0.91830820334651,0.963082660506677,0.938619848175403,0.928798643648631,0.960665061232217,0.994315237054255,0.989264189816472,0.987088848532182,1.01307381846928,0.984747228305641,0.975856564111694,1.01887531859675,0.96916440448729,1.01631296769336,0.986863837562086,1.00000539004927,0.965441262705054,0.980129667400059,0.980362571829628,1.00146927608753,1.00856205824024,1.00981691990977,1.05358065753486,1.01927693285388,1.00172065626021,1.02181192568226,1.01536238609813,0.983764191869645,0.953585988847909,0.907344479652469,0.890325850270396,0.907173424386525,0.924066015219207,0.911625005974273,0.923004514905037,0.932547772328332,0.978605444890722,0.962869255140203,0.964333508313887,0.99768210763126,1.02557905285635,1.06047343204185,1.01814268332577,1.01117595082555,0.968506578436884,0.921163245634864,0.92829184151773,0.938204486841907,0.962866705417464,0.927043297651078,0.909692876491272,0.886523990241238,0.879472534286711,0.897490710514275,0.920782546267676,0.910930370636957,0.871162953949353,0.906253454044466,0.918587293744044,0.937500355893365,0.945533124938937,0.948854962996486,0.912381196238103,0.886988120576368,0.844165748381468,0.816937329053869,0.801284443296653,0.799493382925237,0.791514664575893,0.753299198190346,0.761513204411523,0.778349240231532,0.786225856937997,0.78629069540044,0.761998498710579,0.73368454430293,0.719292254368032,0.69988816448505,0.706591796644559,0.717849393549596,0.693398736248086,0.664347485161474,0.681421275730642,0.665880360957106,0.654411340302197,0.686437313869468,0.714124993280739,0.707933307544532,0.716590267263125,0.719517772069359,0.698574658746809,0.70002570239676,0.734630162432704,0.704587918161637,0.719057631071163,0.738476573865144,0.726021108044086,0.758008680843236,0.752739770140108,0.739702821453385,0.729894600270946,0.697613544426315,0.713413570650453,0.737404833381993,0.706757888763518,0.717513580123773,0.717315184420913,0.737247649545717,0.765566162717109,0.750514631125948,0.778486223144117,0.750136295196001,0.75958729593693,0.780385111916294,0.779104275974995,0.80995369248684,0.815667293019046,0.80430683165115,0.799168952492233,0.789840999612043,0.825987375429402,0.866326967524878,0.83016471131623,0.838012504610108,0.851076639194674,0.861220266877238,0.849024081141723,0.868050802601491,0.836337871112499,0.845266294203147,0.821982626144695,0.860725033253353,0.864050869304476,0.872083440985501,0.890581995242946,0.912797067308534,0.92399038325774,0.932468055682936,0.915540953846343,0.904490441566175,0.925744186808842,0.953146815396478,0.999843538663765,1.00967026928384,1.03602399239024,1.04862704615285,1.07785388482954,1.12361824501265,1.17076314755185,1.16130756522875,1.20191004269027,1.20940607493848,1.25757433386321,1.19566673306899,1.24043227502675,1.20028398792413,1.2431270245632,1.25898137765978,1.29725322908624,1.26999374258447,1.27543787245387,1.25741954059883,1.31346438763677,1.27319860071365,1.2511706875721,1.2465268819836,1.23840618271518,1.18213244798971,1.12645688655697,1.15228193497521,1.14372682297766,1.13748557724054,1.11014039337338,1.14699205170018,1.18789492688565,1.22231830526207,1.22734878393639,1.26573854456414,1.26311376718488,1.28574709920393,1.33349066094992,1.3810591905853,1.37369542919541,1.40288832442946,1.46114957042169,1.40666615547602,1.3623410499902,1.33666397687112,1.30885916129551,1.37364024036334,1.3851966262409,1.42198185862732,1.40975989260613,1.41280140666058,1.45957417716045,1.45224539918399,1.46460074765014,1.46934913994023,1.40059002444402,1.40497239328957,1.46884121813638,1.52083979631426,1.51455918177912,1.50038516946397,1.53085959665597,1.60163127512583,1.64970049067819,1.68915351633165,1.61684047943303,1.5639245237943,1.55987019548774,1.58584135970587,1.51712363127435,1.50640672503992,1.49250901863576,1.51751026222295,1.55219580144836,1.50454638304616,1.51440546055068,1.50389649506727,1.46026618145444,1.44782431125976,1.44466491058942,1.48740466358981,1.42950392706842,1.39778845806377,1.4259210252099,1.42434541028589,1.45188459922237,1.48855574311039,1.5419196906571,1.46600701499988,1.51688364506105,1.49463378271813,1.48696837786098,1.52568891349291,1.54088130120992,1.6165386219151,1.58051713935291,1.63863481316516,1.6646719173392,1.65875372272609,1.6437121883979,1.58908766782294,1.59121232636463,1.53403178653343,1.60074719452749,1.61288932614733,1.64111582274238,1.59984245491833,1.61293678527678,1.66629316516041,1.69394414162911,1.70012898320133,1.64309645261454,1.65792479546807,1.67544171775835,1.61269177637769,1.55901320359248,1.56796373914613,1.64087270384035,1.69056733510841,1.72338293868043,1.7888619113386,1.81003465025603,1.74549095367755,1.71412909559285,1.78994667697326,1.73958262188287,1.80482823363107,1.85296248479233,1.79443363602927,1.75781561353356,1.83981011695469,1.77292320551279,1.72198085549398,1.76660534644259,1.76781742294196,1.77116534123467,1.78109980554566,1.80804261332346,1.76516014043115,1.80429858387435,1.87983450210438,1.88884254181168,1.90434294111785,1.90644672832457,1.91800028691079,1.87460444109058,1.87450111127771,1.8517990422074,1.77701707765693,1.73991373458667,1.65509460653938,1.62701930368132,1.7056518110168,1.75530047687228,1.78743129360232,1.77776467457652,1.85331260961786,1.83023461142132,1.89378177563977,1.86135129848181,1.77293412415416,1.73883608523549,1.70077806793926,1.7651711876438,1.81673706170068,1.87330233513797,1.9005571759911,1.82994556373407]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-38d660568e5bb2e02681\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-38d660568e5bb2e02681\">{\"x\":{\"data\":[[0.953402594011277,0.986430046205652,0.966060984590579,0.965815281989024,0.965309801903241,1.01170828544461,1.02734402512241,1.00720775429107,0.994890244868247,0.954966554601248,0.940373023799659,0.929226011206046,0.916983561735449,0.921984074223811,0.959342451743358,0.961021816342544,0.932436334834479,0.935652004659512,0.899528482242007,0.931280066209111,0.893470119094317,0.854552839252406,0.891433597409641,0.931886730318518,0.946132896388206,0.950501927249317,0.954112167624376,0.918062593703301,0.951804266857638,0.910774834149663,0.90371865498532,0.921972077592776,0.904086369908077,0.905946455873675,0.92329251911242,0.911937602418256,0.936640718201489,0.933774006921548,0.95365728444795,0.974839125193745,0.944585070688529,0.945448561095762,0.988881814433111,1.03133173936899,1.07126486450426,1.02980855910853,1.07740440498166,1.07161294057062,1.1180645622351,1.10974590424905,1.08968390034528,1.06822822517515,1.08735589651962,1.03562261739287,1.05747422931489,1.00954342408213,1.0499327003026,1.00000536071485,0.991496178572948,0.979505670166109,0.933693869557371,0.909105494839981,0.952349872466762,0.965926959982885,0.985485767096418,0.944059571838941,0.910545444599398,0.894570730535019,0.869665821915461,0.848042912938712,0.872873395565746,0.892607393539537,0.893322086652979,0.902843475060253,0.935036276309198,0.973587050431493,0.933244370075163,0.962476832436521,0.915477486898286,0.958687138664051,0.989941079699818,1.03025106275226,0.999039012310163,0.980055529949452,0.955775884889011,0.966583473187738,0.993373571809054,0.959960269933294,0.915959261355787,0.889469288981325,0.913677868069776,0.890920304171647,0.848650657394926,0.860724805042749,0.903595150698311,0.938312665197676,0.963588964931912,1.00305655944912,0.970525677705738,0.980908952192111,1.02792924742235,1.03081998920715,1.08101554168457,1.09956805413497,1.08940349058888,1.10147012614441,1.0753553858291,1.05212645683899,1.06853387520647,1.11834538667663,1.10564323718097,1.09832582245206,1.13948175461048,1.18586682914577,1.14039155263587,1.19704076565591,1.19346015799649,1.1536989863496,1.20911566737686,1.14898327544894,1.19962550651446,1.17971712769461,1.12114830468226,1.13328124960634,1.08272656074518,1.08417241921666,1.06786216927642,1.01612224305746,1.06310027714286,1.04485094206991,1.05569015058884,1.09664776404462,1.06927779352636,1.09590835706209,1.12939810368218,1.14987241668329,1.18666495104479,1.22887276467698,1.18816307000723,1.148148713006,1.19900825905595,1.20377302529647,1.24082949726368,1.1945219216509,1.13506643445815,1.13106027788413,1.14550490637129,1.18027310223134,1.23781002015995,1.17633565073412,1.20318649616647,1.1474915240186,1.12300263095285,1.11460578148357,1.16781034930496,1.15493509964096,1.11301953530364,1.11289169547191,1.08488833179183,1.0438630710073,1.06534046519751,1.11329590613883,1.12654848091576,1.16791725137467,1.13911034935024,1.14069838340458,1.10312554310737,1.05418267785055,1.07887792840252,1.09392533963243,1.07060884193288,1.02106760866805,1.03084880058319,1.02544378289839,1.04245061836143,1.06304470630658,1.05041624602445,1.0844369566712,1.11062497900403,1.12495685307688,1.08557005613814,1.13922647823338,1.10698842376044,1.15242293660126,1.19685228732645,1.15104604483137,1.16960859097151,1.20292324362033,1.22884622161534,1.18712743411773,1.23697880204058,1.22820645506411,1.23356473623175,1.19940747551564,1.15211176394373,1.15883433137266,1.1809997821558,1.16526785870677,1.14432212389428,1.19860174474309,1.14380801999422,1.17271096194838,1.12462889695038,1.13024542302092,1.14325367019515,1.09790521385308,1.05542788561883,1.06368147461552,1.02847291396214,1.04185998310617,1.04178627610585,1.00414509338653,1.00189504576905,1.01641532574789,1.0483500357795,1.06120062205708,1.05717281900423,1.04414770674283,1.07232308122848,1.08916687705459,1.06791716442259,1.08914711377038,1.09325547017071,1.14358169801282,1.12991149494683,1.15627778688412,1.14201443102789,1.0883052182593,1.05734334330918,1.01842570966958,1.03108248883366,1.0230993767137,0.992250604032591,1.00238900346396,0.991897277849315,0.950740306437217,0.948438520928664,0.967041193317692,1.01024497676162,0.986212908912281,1.03046900022479,1.00382072321421,1.01913024222577,1.0521249856102,1.07760069355821,1.02943124007338,1.0207641031725,1.05529096759833,1.03215404497301,1.01374536209439,0.987700022840315,0.950319841309096,0.954090735391187,0.912424993620136,0.916267741911781,0.949515502805504,0.921213048242086,0.926033776615596,0.908109617154032,0.868932076921348,0.887179481601257,0.931135392101335,0.971690938826037,0.99802176810308,1.03568400157705,1.03613752502624,1.07044859234003,1.09432571081166,1.06610777169551,1.04375105080461,1.0284310015514,1.05992449938688,1.04594884574527,1.08306835769293,1.05201011836434,1.01345956498428,1.00003368970594,1.01122874042759,0.999413661402503,0.968279636272344,1.01458528814549,1.04612113541673,0.995823528023657,1.0239903412,1.02916239159957,0.995976739389049,1.03737909989667,1.02694418778511,1.05679811640023,1.05459198321593,1.10379244534447,1.04915664308782,1.0862872886406,1.11677090445732,1.06203984662185,1.07062285576387,1.11762260451555,1.1235589989296,1.17639128298694,1.21886987367081,1.23349884116536,1.18628099390029,1.13027399267142,1.14069485957173,1.11415980259737,1.08391516115469,1.08205911083895,1.09515454313211,1.06625109093873,1.0318975966934,1.08270414720291,1.08782899693077,1.12040780941096,1.1368897035653,1.18616328477102,1.17223933657094,1.14506088443284,1.10715771281896,1.08756200015531,1.04098892757973,1.07884057500279,1.08523312526176,1.09736674261361,1.12055965374341,1.07541183785301,1.07286741562862,1.12074855102198,1.13756654293498,1.13998907117876,1.13511816254709,1.11264435701773,1.06567325380717,1.09393702594376,1.09415595367471,1.07469409816805,1.0617017338574,1.01804820760753,0.976321924821977,0.974501894230224,1.01737384015889,0.974554345989002,0.987688820879383,0.972005786002033,1.01730779747229,1.0554573308418,1.09381455641341,1.04687012146526,1.04788105424928,1.07716046176291,1.06680203939735,1.05180870241506,1.08841476605664,1.0489845936083,1.00492519591837,1.00379318431642,0.987542035689064,0.954943244451102,0.990098262683296,0.96187377063442,0.953635327855895,0.960525097858394,1.00633356736687,1.015345202424,1.02719700460119,0.998934415725015]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-1846eeb999c3a6504813\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-1846eeb999c3a6504813\">{\"x\":{\"data\":[[1.01498807657044,1.04453202814259,0.997194882712616,1.00262419240917,1.05248548852284,1.03271909418118,0.999558963707874,0.952845994127258,0.97030507723087,0.943406340059516,0.899853942444245,0.869721520249261,0.852603200285199,0.813878879058714,0.816396299863275,0.809986973247494,0.808225094045747,0.808198884131944,0.834409007334147,0.862310473894818,0.887973493510595,0.879791596798997,0.883406181257885,0.885557817190867,0.860572930356459,0.883897259669163,0.873150213440294,0.83294204155909,0.861953412222793,0.893967931909299,0.863028590206266,0.902363136177001,0.873927232082951,0.86047014725065,0.839662738644806,0.861979411255442,0.823717705267912,0.783567144249425,0.821934957053199,0.833553898404926,0.85803950628288,0.832872212008779,0.817992957357263,0.819258503152743,0.853657414290644,0.875344650295946,0.833658148259421,0.820104442138982,0.856031434502368,0.835565300653586,0.823048335199258,0.837074129289445,0.864853716256706,0.877249824464535,0.888689782905539,0.868529839063729,0.897264641744212,0.90684982743214,0.890766499383442,0.905045737972112,0.872459867697497,0.908842205604413,0.922762163491178,0.934182998538483,0.90847799113951,0.888961901133277,0.884687422077428,0.859801745586724,0.882486916867068,0.871238981398745,0.912349053429941,0.923080857557164,0.936967866361658,0.972752045858419,0.947397526885728,0.959062892408861,0.972449970943742,0.939540829602559,0.903263196233222,0.906956127286732,0.89213581635171,0.887638805147493,0.916134709916921,0.938928773472217,0.979795167860714,0.937607775288139,0.938197484095541,0.896287613129531,0.865417008354468,0.827774020974279,0.78890357397356,0.800344399918667,0.80893158756171,0.839559489720777,0.828618593895808,0.823771444850325,0.819517582998017,0.782454362714874,0.798868454170346,0.78362328773515,0.770190992622481,0.740365177588379,0.70547570682741,0.678125522037199,0.66383572673361,0.685294468219392,0.692784605146736,0.71418122703958,0.747931957211271,0.761217460816349,0.731800528948393,0.767849696606611,0.795449099261819,0.828740244081357,0.825688973371931,0.802650255015927,0.776584148559299,0.738156754796153,0.731558746052925,0.695701886164694,0.698724474708209,0.669141179180915,0.637781290049089,0.627680793519813,0.656699184991015,0.683748900217862,0.682886771683059,0.679389668413963,0.648097010524041,0.617587600697918,0.590605685934864,0.618273323293973,0.61148799912694,0.588493217679425,0.601459246010456,0.601671785121542,0.626364835390395,0.652450777578235,0.653493733495688,0.67447061135551,0.70528285779875,0.699301581583509,0.690479994714057,0.710715676165591,0.6933357825905,0.694554400536069,0.710878755043458,0.677274546971275,0.668157269960102,0.683094324807012,0.651494997659909,0.644885111588696,0.619228268606697,0.649841812849318,0.672216151081764,0.670586098722208,0.63802658344174,0.654850604880934,0.66115490575654,0.645067275385743,0.630461185761692,0.633136141483839,0.606195531034585,0.583784459053348,0.6103511626144,0.625257455330331,0.614064973119915,0.600254301516908,0.60250638682634,0.620421225630082,0.593726502403142,0.621378059729854,0.644411513290157,0.647374720561673,0.641776751178288,0.662861177405659,0.649902053645267,0.676938201616931,0.681658767556344,0.684428585477427,0.70494270637095,0.692847901938796,0.679121307140374,0.671985988977401,0.672929549775722,0.684135802876301,0.704811482932661,0.714301591017428,0.745652359440632,0.718534719886962,0.686551531361013,0.705881814061898,0.712881930942721,0.717297507443007,0.683108140061527,0.657782709027203,0.687952076522972,0.661716276066611,0.659462969026196,0.639129746570973,0.646111924453865,0.628516977404472,0.600029167111328,0.583885357586343,0.582504214639305,0.569380537602064,0.561484643528412,0.547953845124703,0.523703387863106,0.544687320021701,0.535179683976302,0.527220445004585,0.553197638838207,0.580199574196365,0.586833788802213,0.565893776503042,0.550827865290379,0.552737627152859,0.544756696504199,0.565559658119756,0.555059545574609,0.546357672939155,0.57330549283025,0.562977920625632,0.557576409608708,0.58460750405084,0.572455351544899,0.558006289809735,0.564844682886917,0.572147732591038,0.576148661135355,0.588867237769853,0.565072936977964,0.585700265337251,0.563445841596489,0.566737879043,0.566560185044128,0.544418376445753,0.530056294348557,0.5093915176827,0.523143095744992,0.547521437697006,0.526220994276033,0.522624262590145,0.525731403562844,0.525744747853606,0.515936134908808,0.517341218532914,0.494145886071598,0.485335940600699,0.488977745524799,0.49392564825165,0.496868469678343,0.507093502745714,0.522553427533249,0.519832596689481,0.521873598917762,0.509451053259694,0.522282723467493,0.522605975352366,0.512940554240623,0.537119264450787,0.532253483305237,0.557062628412158,0.545516693457853,0.567905633547347,0.558077213589065,0.561121247333741,0.577070488840716,0.558762296584195,0.541742287805515,0.555157990286685,0.534950020887866,0.553481340644521,0.569290464624194,0.591283676032743,0.576220642220238,0.548137684977582,0.558107562473862,0.548558719820217,0.536863597328481,0.545812895333379,0.565363376533518,0.549055165962192,0.525710021193518,0.548618178577718,0.5228246386141,0.507725544671652,0.50537192980764,0.528473419894413,0.540031224891239,0.533303283729607,0.524878809664627,0.548202288489378,0.555192429719772,0.562696149744982,0.537388481550049,0.510860849571825,0.532561114014404,0.545542587056505,0.548246586557264,0.548277359368277,0.532267302686645,0.5073168089854,0.525070037079094,0.53864693620146,0.512401800448023,0.52410296179626,0.509793077831103,0.510665047239427,0.515619895852607,0.499052609259294,0.474732387888646,0.46935773234365,0.453808796470796,0.439937462345909,0.426143030497041,0.430697348045398,0.416549291288271,0.418504525276762,0.434384041958712,0.425698936143473,0.413023299594701,0.415527645504169,0.415087532172508,0.39814126141421,0.404319259077065,0.41536199508939,0.406284659163913,0.412117771744987,0.393523823807692,0.385606599471512,0.375122654571253,0.366913023244261,0.353357281766767,0.359220999922674,0.364135484701755,0.368420243493461,0.383051370799428,0.365736166403792,0.352428582290848,0.341126934921877,0.344327846775898,0.346662805381784,0.330015990729524,0.343696190770046,0.347964404252315,0.336147689330605,0.340812932934924,0.324550402505941,0.333690524125877,0.335169875242228,0.349619624223106,0.338515151473625,0.324973946103523,0.331218935187059,0.322557997444008,0.311829235048806,0.316971944266004,0.316753613951936,0.308371535711165,0.295992943329209,0.304255212239611,0.301662018136869,0.286670275632228]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-601ce2b4b5fc0197cceb\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-601ce2b4b5fc0197cceb\">{\"x\":{\"data\":[[0.975377324991859,0.965046315834548,0.968605124369116,0.923225484780608,0.945492973094027,0.974568941852744,0.951357843139949,0.920970462355384,0.891643236509797,0.889521337623318,0.870405199330867,0.873524324409341,0.847466050464307,0.858755311004342,0.817389036171662,0.785298152172924,0.821816174682571,0.812756315557297,0.80355760898076,0.771267472720041,0.796622910862321,0.78127672103285,0.802646229759824,0.815043192464587,0.776510165504807,0.773032483955578,0.770875186942156,0.797176482028932,0.810288622369079,0.787186221893981,0.779059131753735,0.816883986511323,0.849114032808458,0.822631586254432,0.833472257336593,0.800157163127009,0.760852088563263,0.75313037283278,0.741313348866571,0.729175684621836,0.724893763201401,0.759094743370156,0.738670706264451,0.742544610438913,0.740137096717085,0.735705429396676,0.704919396589624,0.670042104791656,0.703497095431781,0.675159275088365,0.656284019098139,0.676341035443982,0.655033719629302,0.647383725482933,0.679669420355964,0.652114317851734,0.64987321242779,0.648546050479186,0.619893665380749,0.610888569029008,0.635887457884315,0.660747079882953,0.685606842183637,0.695704716738445,0.671292220446827,0.653527044707785,0.665385166231584,0.647445539838784,0.677169943392819,0.700765842545402,0.733168733259896,0.717060632548499,0.74808364987182,0.720806440555076,0.704941371924901,0.7377800487278,0.73397292537914,0.742983872654279,0.734650494594235,0.714416859727315,0.709467036389014,0.716162880569596,0.734870618496169,0.767885662160672,0.802810450020859,0.802869684275516,0.8340977427266,0.811067137458253,0.841926238260145,0.827775116781877,0.824318422839105,0.789589888736744,0.795425608237552,0.792094548922077,0.754204375060516,0.779300854336768,0.78568374062169,0.812347880152882,0.811804439644047,0.817344500810184,0.857969251269861,0.838940202355283,0.811705360271678,0.828362926044877,0.802057486689196,0.835873200031421,0.822983522627951,0.784735408286708,0.787293082387611,0.796392739435738,0.832444975004853,0.799195438516006,0.768026908083692,0.76505010859269,0.764412055862479,0.757870543067982,0.779003869926008,0.752181160183287,0.759797989475848,0.731977627106999,0.753225202710461,0.759306381578193,0.741799210804868,0.760029642999211,0.779837445648201,0.765110264472004,0.766981861791843,0.784169860454875,0.751289536012923,0.749214047356869,0.720458125339646,0.699280276805678,0.713458127542727,0.742581295811284,0.749221608651261,0.775022211723483,0.750360911286003,0.752930058046737,0.778114745000825,0.772833692299232,0.795073283414906,0.812765401513391,0.848945394754409,0.839453477353425,0.842578032750883,0.882429850779388,0.911812505493959,0.915294861432144,0.950637716137898,0.969744770872206,0.962513392679045,0.916256999466707,0.88285024718881,0.863219176819448,0.874766040210281,0.901304603042921,0.861154376876904,0.864003311063546,0.890496402667835,0.916714140944258,0.878959608905577,0.844445023681059,0.868971909376282,0.890910019287166,0.868226166540816,0.84295162577712,0.879911193264251,0.848768025569652,0.826749299934395,0.849417569328674,0.824396970210325,0.847140065623914,0.823066250802313,0.846668075004868,0.812371733156011,0.78343804514346,0.820662220533184,0.806708052503034,0.810715235547677,0.806827833924298,0.813501971705932,0.836178175750396,0.79881748014482,0.789670774480125,0.804487448988664,0.765145827540211,0.802242443609808,0.767728261594643,0.799970766559649,0.814273018373367,0.831538492992154,0.872816718357506,0.856197660687433,0.838042737890446,0.857617745001124,0.889875077953227,0.882484197428238,0.857167522782006,0.858369401682151,0.865174405402401,0.868548800105168,0.825183343308268,0.859284188123649,0.875113892982253,0.844701605600082,0.805867243177111,0.841687465002054,0.879442423155479,0.910804790109157,0.946445147396135,0.964116107867074,0.923638638463061,0.955956806812187,0.981472418121814,0.969379464023134,0.97443862503989,0.967596882539789,0.972022069028506,0.965168213257665,0.936220772663594,0.921878429956011,0.881569029948118,0.84501523068125,0.809389518073125,0.836165262486776,0.817955086369517,0.77727369426452,0.779248466738266,0.769436206620384,0.753334075263947,0.717696265562002,0.696757813817834,0.662875236935295,0.677779421831286,0.709207826139182,0.703923051457794,0.698857304200624,0.680517872157347,0.650237655298531,0.649218967972084,0.673020486819101,0.688065471092109,0.674628108519903,0.64249546567171,0.644610240117062,0.645163904255478,0.619639762321354,0.59123355243176,0.597380421883584,0.591693203522604,0.577338505927278,0.590768095558323,0.610492228281942,0.626434271843868,0.60195771235659,0.616006699730226,0.599354702330809,0.604582691425254,0.61799919723843,0.64806634967421,0.679197129322011,0.682058229259374,0.670315441844992,0.668398627547166,0.636323297160152,0.639206427495845,0.634989832864393,0.64919474176782,0.665839828771938,0.670651638493338,0.688996286314937,0.68138261404201,0.663315441774761,0.683349300110382,0.649233053948884,0.668947621601155,0.656747472384252,0.62906040653948,0.646631969494041,0.631733208501494,0.660197969739642,0.656352677717576,0.641576356549856,0.625448209600936,0.605711199902122,0.604096668889701,0.61769436502305,0.628697932314726,0.650402475970921,0.6815179991039,0.657961514243541,0.656365750559882,0.658351587086064,0.684396612196255,0.71028316295206,0.7428402919076,0.71345939024976,0.726357021996974,0.747512602089655,0.782765849658355,0.78825502321613,0.776640489913492,0.798839168524079,0.809460761455555,0.824239007134147,0.793629565296062,0.78267295959307,0.807371148635328,0.772448097725845,0.7908660458255,0.757403345345704,0.794817556083396,0.826617084216362,0.847231836575713,0.844309405334418,0.85489818523307,0.887799464291965,0.862885824834408,0.861200673516166,0.880512015220508,0.838430808718837,0.862309807238195,0.841570273206723,0.833556855367646,0.829305638397151,0.856557501122737,0.848315314501457,0.815133098237288,0.836161462337291,0.803114845738075,0.776900525054192,0.790343205224022,0.80827750446091,0.818185311410874,0.78422537345234,0.754492556632983,0.762216195186149,0.780071256215789,0.762303796211694,0.775585419779345,0.799731838115898,0.772036765650079,0.782074177793464,0.777677121693582,0.770111759177638,0.751920672107408,0.726648147925076,0.726505354183046,0.743051270591635,0.713319428810447,0.737347989849449,0.750034387063681,0.756423490164943,0.751875355847592,0.724741410528323,0.694759472297938,0.690343391238179,0.713343649941004,0.746593161589088,0.748200075325596,0.764362710733418,0.763035908002554,0.764729366638349,0.798188322999025,0.781810793063838]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-0b6b8dad56c18d4c7241\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-0b6b8dad56c18d4c7241\">{\"x\":{\"data\":[[0.989583371626213,1.03105212159652,1.01900390785135,1.02672010690646,1.06287175183682,1.02949378106774,1.04564631490885,1.06164899805493,1.06187501881638,1.06200112951257,1.02566982632452,0.99412071544278,1.00195854343463,0.992080862762416,1.03239623514485,0.989837193617786,1.02170190487909,1.03925731744616,1.02914973142845,1.01861015877589,0.99450867752433,0.988143534098158,1.02385841105527,1.00865343233205,1.02752014704922,1.0596034467069,1.02133332160762,1.02350482537912,0.989809070322402,1.01074329529271,0.962690272960932,0.957158475064637,0.984409957692066,0.935351887701723,0.917752685330505,0.877429888105281,0.855297375047177,0.819150685041118,0.814154003317776,0.783733530958827,0.8013052497461,0.831798118790457,0.835198850025506,0.849957203068535,0.808198968481481,0.814037649220855,0.836775146434448,0.864281550205156,0.884116607845943,0.859544536761604,0.877722211226932,0.863779468178313,0.838804372173287,0.808729841335295,0.837131794671405,0.805344561090301,0.843986443163541,0.839839545606401,0.80314779315539,0.782222921660116,0.817736910152738,0.820242892753611,0.825335406359682,0.836518984410634,0.865857545925455,0.833924690617006,0.809221974733083,0.800657865545109,0.839711934880995,0.86504880536464,0.866013618964891,0.826167089841923,0.856039785362148,0.895281234114969,0.861012271761964,0.892536936436621,0.857435452756897,0.832887335848739,0.836168973454978,0.861407259947031,0.876326088227066,0.908346641929332,0.942433540598046,0.91254195669304,0.879747304286089,0.877779069286258,0.852111479160621,0.878258440801929,0.902256927832331,0.881565881407363,0.88701998151399,0.886398375255165,0.85371344673027,0.846738475689654,0.823106492895621,0.834286794789267,0.86252291513692,0.873763500691588,0.894411036638817,0.930826373904583,0.904241059944921,0.944874884752234,0.909687962148593,0.872587995775131,0.883599731933505,0.915977191723452,0.935402703089653,0.93307969023378,0.929683750692872,0.899648220895199,0.868817967273806,0.864945041287891,0.84566367677356,0.866590788952026,0.878226891782867,0.860136419979424,0.866344209773534,0.873084673547834,0.868873596012009,0.86659856946655,0.873301761572304,0.873346605847393,0.897922489904272,0.864015366050706,0.84752019277955,0.852370342496308,0.870310235893249,0.861154411938378,0.882801608947111,0.896079582528801,0.921029527357373,0.9026626264684,0.937732362551941,0.896828373615413,0.930862189986564,0.906378104898142,0.947566475800795,0.93490081137331,0.924545595280287,0.954027562754762,0.964341881253944,0.938430103176513,0.982364244464975,0.996505793716494,1.0197431280115,1.04820613571774,1.04309638891035,1.08519914381166,1.04419192768812,1.0591024650059,1.08079199950254,1.09058715516217,1.10659881281694,1.11443546776193,1.10439862575701,1.11115642441811,1.13118366603499,1.0981517409847,1.12998706499222,1.15239954006318,1.12290049695454,1.12133407669092,1.16403625758961,1.18587642282943,1.23799364629607,1.25875053292754,1.20447431824379,1.22689801481781,1.27176379417655,1.26422031426677,1.25710482896429,1.20125917133619,1.23952192150874,1.2358334977091,1.19311784254447,1.23180712588121,1.19464682707534,1.15624221756078,1.18188401042518,1.16194221153525,1.15966432914472,1.13612145373372,1.08355591442144,1.09889962280845,1.06708136022688,1.07925683063527,1.06413326862411,1.0711884884056,1.05716490810053,1.08277773643891,1.03135733102631,0.981966945734634,0.957395247495652,0.925799603553036,0.904288754377951,0.903576906409252,0.938190614944936,0.926243146223614,0.942534769169476,0.955687520198553,0.969114489634992,0.922922167103701,0.939164914103152,0.913947985090098,0.8736912517747,0.854629495753386,0.893267376909025,0.881439246912558,0.883644931739759,0.906825587613689,0.912696571373692,0.93183932606258,0.916238774003328,0.911631850327069,0.924370876427274,0.929033549168702,0.896660523054165,0.88565550263245,0.864195994575387,0.84585368895333,0.810495667660509,0.834541359390165,0.854568966004903,0.868160850302399,0.903284897544744,0.896939211725389,0.859763180194468,0.818466764032963,0.836625181824171,0.864480260818684,0.896697639687659,0.907703504713562,0.925686939426314,0.946922783715261,0.986263445550082,0.946405907929172,0.906510312150507,0.912094525163884,0.935984783889688,0.973501353010735,0.969841528834568,0.927608840910632,0.947697105235636,0.90466747081419,0.934984057357759,0.977282140946431,0.991864336988532,0.94676967465893,0.924285277131534,0.939609685899561,0.900204422369572,0.862614021273626,0.82741619226678,0.842407976659586,0.852396476034395,0.879091985761386,0.848460026117061,0.851149044561047,0.891723726207029,0.916729265273375,0.910685685628994,0.955829892145369,0.937805325455309,0.960477976196505,0.951021376495675,0.971622453064765,1.01963001517392,1.04392798335587,1.03996538295467,1.00672203322769,1.02989205584621,1.02615524386136,1.00252682940228,1.01541518658083,1.02860869888388,1.0003690625757,1.02451386076284,0.996851683910749,1.00013677325784,1.02156527310948,1.03308411690839,1.05881651146629,1.04353668913302,1.00626767100211,1.03537800469142,1.07492171742861,1.0900236161565,1.09167123591825,1.09498000400485,1.05151754124728,1.08408053922972,1.11357412548512,1.13024019925228,1.12024521501544,1.16342765926378,1.12383241698107,1.09940130031439,1.04526232583602,1.05045452775746,1.0910498609123,1.07263760412603,1.11784123513919,1.06686201417606,1.01828396287562,0.988843063830605,0.961737452423255,0.953477960882641,0.990712021546814,0.985169230615459,0.96657818717342,1.0090957424523,1.00453287862072,0.999537752456061,0.954754910528362,0.971841357051484,0.976803091916556,0.966072767727912,0.990434692118314,1.01839549296559,1.0266923655376,1.04456702611765,1.09398453425805,1.12043585878975,1.15170361336944,1.14219682900514,1.15250059168507,1.14096103432717,1.12740369354314,1.09950487034405,1.07803353442604,1.02669878003785,1.01073874332275,0.984672332949928,0.967465015056767,0.985310022618526,0.954847932197233,0.966511185236627,1.00007232645438,0.955634118262766,0.970316519896711,0.978660833404842,0.967480938568212,0.978292281411505,0.985194538927758,0.997822980074995,0.969555766206578,0.926388309011152,0.957842864035818,1.00419251404598,1.0256257630692,1.03802765614911,1.02150731003354,0.97488468068707,0.957658646043558,0.911608086194772,0.907077238057839,0.878575632796885,0.845729044802291,0.806491563127615,0.783478863561583,0.803456025845777,0.791336803519763,0.788872039737226,0.812820988292297,0.782563304293923]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-6665ed9f4f73c6650259\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-6665ed9f4f73c6650259\">{\"x\":{\"data\":[[1.00995464636944,1.04336817306314,1.01738212164227,1.0269137349495,1.00413652356227,0.994962888273999,0.966188955942678,0.99957306619622,1.02869605527036,1.02809240258357,1.04781378364661,0.997150263085893,0.97567341445439,0.949689384447158,0.950798790249363,0.988001250943832,0.940183787038945,0.970277583258994,0.933310263107469,0.890488812634424,0.91137724578486,0.94521184375719,0.953166561427848,0.993167168331877,0.953004806238354,0.919219521078883,0.925337822086106,0.954182998069287,0.998664003897789,0.966373548577558,0.948882179486216,0.978998127120336,0.937063217971841,0.926218964829189,0.948814048077844,0.941169336872193,0.913759655845409,0.933905018471754,0.901411916968954,0.909958951933579,0.908478226998677,0.928021719445383,0.94127265160463,0.977521008585945,0.953080116106236,0.954704148475434,0.973069741660383,0.958237705417602,0.910804099369766,0.897468179703384,0.854012516844819,0.866951222740313,0.848055834634764,0.885484090374643,0.857744554207808,0.865270691398294,0.872162245621691,0.842128146642467,0.823208587604615,0.821828256373654,0.85473186755418,0.872038832341866,0.870395239429709,0.907619893501947,0.902075989075702,0.932001780423519,0.926142803203413,0.91909364435167,0.960092011962497,0.96476833561044,0.982373509757042,0.993074197640852,0.97298181006777,0.950839719550259,0.904483012547738,0.92059385628425,0.965285220820192,0.997948149586015,0.964687321457792,0.937853180110034,0.927749144732593,0.969939542914074,0.94727402125587,0.918191621577477,0.889760907608305,0.861840570491527,0.859638798062743,0.863073499345028,0.842860863925652,0.822602895803921,0.789628107969822,0.817526656431495,0.798082147846305,0.811645542614889,0.771688244378466,0.770433491640805,0.77711458443754,0.769050275892759,0.739307834110363,0.759648414971517,0.772159200412294,0.751838005884281,0.733308171902236,0.714981802376962,0.680132226076833,0.660220916559342,0.686893626617788,0.690498347697555,0.669707013272266,0.667721664952327,0.639853846340518,0.668641888248284,0.64697852541815,0.63885110495565,0.666214606330663,0.66046867754876,0.668608232195869,0.685757514815612,0.692385189282078,0.680485531882562,0.691878469900787,0.662634753208263,0.692967248987257,0.706469933702632,0.71582524032257,0.741154938489071,0.707668466046408,0.689714753234998,0.722994215459766,0.691438953166565,0.686683825579252,0.657383484996063,0.684115375913237,0.702043739848653,0.709415045580318,0.730340189026201,0.755907502162995,0.744397380117682,0.74822928171085,0.746141225767989,0.719920976809545,0.689927616164637,0.714885293266184,0.719483885088333,0.71217839290432,0.696819628069349,0.725355126356971,0.75789730493093,0.760527772141806,0.781020118628073,0.77564287954814,0.783203015878829,0.804453600133634,0.784610130665609,0.756362324763775,0.747632549169721,0.73192159575428,0.752512628943874,0.730510320134839,0.714553002171856,0.734968225044662,0.745487959391835,0.733296987726025,0.746552659913525,0.753270301578272,0.778663703863561,0.77460394299331,0.765814982085726,0.790463362953205,0.769797533291556,0.762632276992121,0.763447603761559,0.747409989120871,0.752985177577234,0.75285483465766,0.720795048727931,0.704179746975206,0.717072255427849,0.736866786322979,0.735735268162525,0.713143757805398,0.733750500426418,0.733158097434981,0.751123499419391,0.763025849737267,0.744598243244583,0.762231938202431,0.731043281571205,0.70157815504649,0.695834003885497,0.687841260709387,0.722083681994457,0.705587031639296,0.689991542010446,0.708750868890281,0.711215773510117,0.710153217763847,0.706801518178765,0.721467829156937,0.710605937029616,0.717231621067192,0.708253656303305,0.740574537797949,0.748752397194684,0.745389759022132,0.759097176541164,0.746871471744398,0.74466808432787,0.742851929849552,0.732175618497336,0.745405186371297,0.721292994359948,0.694476916262173,0.727832187049654,0.715527867956001,0.691667507417615,0.677592095732294,0.644289745623716,0.622129198785944,0.648216461744637,0.671690792764321,0.690268787281433,0.677857352372486,0.657851014663223,0.64477029161098,0.654785701711597,0.656592353068408,0.655804057956441,0.686128203311879,0.694927868549547,0.673352758370166,0.666243098521136,0.645251862718408,0.645769956195075,0.676543205135478,0.673961653212803,0.652350332560451,0.640676873666015,0.652114813191595,0.681905572179334,0.662995386961505,0.683426094397086,0.675880205762072,0.704318042160116,0.739462203050376,0.757159964310625,0.746944357269588,0.715535804207099,0.730856201940452,0.711560863214881,0.743307222613358,0.775862501017908,0.747955475002468,0.779168576703236,0.741261968292114,0.722599604646577,0.691962901479714,0.714242666142437,0.736013995517465,0.764563957066416,0.773858670355668,0.75243297677576,0.742239899903155,0.75236038326431,0.722383812069644,0.734560486417328,0.709933169846428,0.704968533551281,0.72827541152919,0.737474530536749,0.74644198934699,0.751127339703991,0.762464098538898,0.763135498061456,0.736018393030264,0.741670118407304,0.776414899344001,0.800490144256707,0.815698774884581,0.833069876558977,0.839716347912112,0.816700692257341,0.853006623094428,0.81093707812565,0.774813430832802,0.762190699962296,0.778399684597312,0.772155697259099,0.743692274409269,0.748557636424277,0.711636193760091,0.736920723704563,0.71837290705991,0.732302088353786,0.735842147593267,0.747921690222143,0.749283544772494,0.711957190629693,0.743032011413558,0.733284554599816,0.733550938914407,0.715164924333049,0.746314600530335,0.779453428758952,0.76917409261701,0.779435844657664,0.804567824279769,0.824068945551252,0.827868277623127,0.81835796794469,0.801280232044034,0.827523572902872,0.836596410563426,0.804793308704043,0.834657357671911,0.815578347734935,0.845011216564847,0.817097946171966,0.806302445199193,0.773795722825895,0.790067413075944,0.756376604472122,0.793870936500205,0.754375589538406,0.722646494661742,0.753414743673821,0.781342342981349,0.798618827365221,0.775469554455969,0.752872503678569,0.765590740278467,0.76097422631332,0.76528651710133,0.77455179193658,0.812771567301261,0.778229470796661,0.760962257385681,0.779691102970742,0.752416939166848,0.725848194877256,0.716013287547954,0.685362479510571,0.708913450816356,0.695019957971099,0.66769288775269,0.688606084269152,0.707826060902306,0.718373758576296,0.750543495752662,0.743238343018904,0.770521805068383,0.780202637222713,0.748870118772936,0.781214693493162,0.8143850526289,0.81821226456818,0.811784493162445,0.831070560723773,0.824069679499391,0.847335659929958,0.805353006764854,0.803250941782255,0.817357611340854,0.8523590981234,0.873595926669536]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-f98960fe398d22447560\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-f98960fe398d22447560\">{\"x\":{\"data\":[[0.970160973165184,0.95990177037443,0.964573010905092,0.998586640030619,0.958045130458951,0.956403442047573,0.998200073315144,0.997048704769211,0.951271441718072,0.986790678179523,0.983475342908242,1.01459898006385,0.987196072816849,1.02406619848214,1.0099708388002,1.00066325635162,1.03867013673798,1.04610682813892,1.0499850998652,1.0856417636477,1.06480212099624,1.10278334692108,1.0573789373552,1.1024954109624,1.06101390202167,1.03117928313758,1.01014849378055,1.03053973733746,0.993934126925656,1.00380922309913,0.957463665655279,0.949896719519926,0.90867856185616,0.89034196519119,0.901087091068298,0.929909026982932,0.909830169846859,0.89284093151019,0.925091249711254,0.958037637841031,0.925691752620639,0.884472788022568,0.901211650719404,0.86970098074638,0.872878863331026,0.88473196717584,0.903294789193438,0.937071207606189,0.967212176028589,0.980919944540066,1.00778332823205,1.05306711693827,1.0367111970587,1.06688365531095,1.07488610652521,1.08163196095312,1.11888116176793,1.17452192588213,1.22607364377221,1.26713411104301,1.33002292687446,1.36183898312549,1.35977850235948,1.42191043714524,1.40639346791912,1.38489172780081,1.39806646550775,1.45725697767325,1.50604452555743,1.44121116663119,1.44953307480462,1.44986152071073,1.42906150275281,1.3787348358234,1.37841248050959,1.44641198244754,1.47646129663183,1.4096413016262,1.42517451891939,1.46490145106715,1.49359026385789,1.47796056658772,1.45673331324577,1.38578684552375,1.36012442558717,1.3489564271344,1.31334312386031,1.29141181221036,1.24888410332742,1.20316823494744,1.23221086066151,1.2749383813967,1.27805042468897,1.28135962113394,1.33599932076528,1.38678862763602,1.44125115371962,1.37426682532379,1.34850431406325,1.34027855222383,1.30207468267992,1.30812674954515,1.26431206779028,1.32078763360063,1.30663359529289,1.31051924227739,1.25004620520539,1.23614116094297,1.23731629808866,1.25121964693333,1.29955680797983,1.26269601531224,1.29092168579519,1.2907671538688,1.27912254516164,1.29541215912522,1.30513246438202,1.28512224648424,1.23407185308181,1.18899971681861,1.15351983081321,1.16568210651676,1.18277754165107,1.20636513631052,1.24079304334552,1.19838474461739,1.22731321207759,1.28398699951371,1.25107667933442,1.25988694581319,1.31368262502184,1.35168100844606,1.35104247334652,1.38239134763078,1.41813121483489,1.39632352044973,1.38283514141539,1.42809640648697,1.46409911768486,1.4662388435592,1.52430660976777,1.59615684007682,1.66473574785701,1.61320606460976,1.538294003309,1.60394319250819,1.60923357135362,1.56768975907963,1.53818771110256,1.59231387489215,1.51807808780631,1.52036127159043,1.52907260751105,1.47109221575371,1.44710879896369,1.50506352965217,1.49237044913235,1.490799898862,1.47902251185022,1.45901891450294,1.40609589513351,1.46837538029665,1.45292486565043,1.43288667302812,1.39242944716561,1.4503739109767,1.49908415248978,1.51641377532588,1.48678865007776,1.43919388533053,1.46397605402854,1.49061931233494,1.54988617300873,1.58698056279315,1.57640885199484,1.5987625287591,1.56969776877113,1.58004322809741,1.51840665081319,1.57198628824295,1.52778482756903,1.53786410349095,1.53447029139582,1.52433760676621,1.48358438046399,1.47825037714672,1.52160201200069,1.54827397016196,1.62029500544744,1.60264862384004,1.62919746815255,1.67397876855989,1.69238003041202,1.63915697205547,1.56582629360247,1.49049042596978,1.51905304842861,1.59358846735906,1.51631052281107,1.54781826017167,1.58424630181099,1.51492457045298,1.5806541039107,1.50924917944888,1.54846597829041,1.49123644303811,1.42239181394904,1.45686858503559,1.51983454852318,1.44609374586431,1.42289646669917,1.40470412323385,1.43445961436895,1.48878517777061,1.43042600502292,1.37282309507379,1.40665071723395,1.41909441405337,1.37935478187979,1.36028457919182,1.29627846217809,1.34792474734776,1.40599069898795,1.41331518061619,1.34659792128922,1.30545591719405,1.36165487631965,1.301919190735,1.34855407796716,1.39011115412638,1.45038147460014,1.49338354345755,1.55053425321621,1.5212329242149,1.52670762973976,1.47376110480082,1.52744787651136,1.51318240451499,1.46703612609758,1.47320641202112,1.52513431345913,1.51993747420014,1.50793442973999,1.56585751409544,1.52787409304659,1.52027888448369,1.47303066083125,1.47506480497179,1.48777653335612,1.48815322305679,1.43037924132013,1.4461111419161,1.50920028481947,1.53447924910243,1.59167230106189,1.64551526977917,1.61917820563906,1.65633517333671,1.61166489215933,1.53714788527215,1.49589735753377,1.48606433629495,1.43812437786195,1.40370590038096,1.34132725267674,1.38666305976494,1.40326702836221,1.39863382898191,1.45886935557846,1.42223829380397,1.49067543390769,1.47443625716387,1.42261678361153,1.35722552017916,1.39043595935292,1.33437651108109,1.37221343422589,1.33791962556204,1.32271485309654,1.37801276765231,1.37166256910886,1.43469989975238,1.41369211714577,1.47464005809012,1.53777576979952,1.57018984294147,1.58008277105547,1.50814558082842,1.44268834540707,1.44976417172979,1.41056978301721,1.38844348805763,1.40914750466769,1.3460805941825,1.36995472258123,1.42474253539711,1.46607544581618,1.46661622392863,1.40207092631168,1.44931121962897,1.3952121703294,1.43139153170756,1.43863613496013,1.49511787312518,1.54892392880423,1.51362227693878,1.50960772588042,1.56149850347006,1.52069275561072,1.57637828062567,1.53784932721213,1.4788586873053,1.46658888248094,1.51615089203961,1.45259046122521,1.38838736186281,1.34274561910355,1.38212670913949,1.4058021176629,1.38973221096916,1.43187517372376,1.36223537077849,1.31243650200338,1.25374783799038,1.20288297320166,1.15941243080013,1.13443810745312,1.13352035017857,1.11001153455253,1.10156304866438,1.12911945594672,1.18232877891977,1.14947685548836,1.14387219770835,1.19948581062454,1.22731394863425,1.25645922538726,1.30520579581048,1.30820100548531,1.28475923905436,1.26225000765854,1.21884934036417,1.27700736246363,1.23994965135928,1.2003155912618,1.17481918827227,1.14578289205249,1.17145755500989,1.16024460788499,1.21357908823763,1.21072097653604,1.23555299846988,1.22291027811643,1.16862918851615,1.14850657992481,1.13584398095497,1.19235681848972,1.22735796401978,1.19348585883384,1.18596841625017,1.20050309779323,1.20348491907965,1.24576694566003,1.21965690634263,1.25366593782766]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-278e28f89c828e3905a8\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-278e28f89c828e3905a8\">{\"x\":{\"data\":[[1.03285969297867,1.05189138649245,1.03644401479383,1.05903849152846,1.10732919985584,1.08631269060474,1.12336112667186,1.12339506441534,1.16701597190559,1.13002606552535,1.07978081609335,1.0786578416532,1.06999875348158,1.03422706722383,1.02706259197891,1.0743755582266,1.10838740204966,1.11080437376438,1.0720670819811,1.1032442956354,1.09871424610176,1.09547693058067,1.04142604008145,1.09120524278664,1.12891071763653,1.10982637017712,1.06385446896365,1.06381802705107,1.07704762533554,1.11760387738262,1.13497318194312,1.09584439170929,1.07396875634431,1.11803850346956,1.13348804353866,1.09410649791892,1.12742000464095,1.11362144692779,1.05996907312967,1.05112120575104,1.00867921977049,1.05649977779091,1.04849636459083,1.07334394567758,1.09526563189342,1.11174200898114,1.16214076842494,1.16430030284948,1.16191906348526,1.12352843466347,1.09788895686593,1.13657519005249,1.13278433142368,1.16440100387281,1.13769156832172,1.15533929172505,1.10870709107882,1.13857661310337,1.11568381782916,1.14104163083604,1.13046485158731,1.10418580629981,1.11676751305409,1.1462975783636,1.11182194127565,1.14656155177776,1.16609406890973,1.15672372633107,1.19484902414789,1.19112031038735,1.15664304967877,1.12403212270699,1.1758949841792,1.16101494363284,1.11261458121809,1.12775570475843,1.08354356596154,1.09478586734103,1.10755421949044,1.09823277913399,1.14880697231157,1.11512861934345,1.08677411859628,1.06589784547905,1.06296932359626,1.038144764032,1.03701955103421,1.07827364224621,1.09666885886189,1.11344732791915,1.14487460029248,1.09441138068564,1.13225751656433,1.09416143805304,1.07769197083695,1.105267616812,1.0549852587874,1.03397205562383,1.02189962437842,0.973735808246745,0.940020151661287,0.906371088918079,0.866514063746198,0.859473461753458,0.850832191158304,0.836253599933148,0.841640016019547,0.824174023875364,0.83869413198427,0.856457225052666,0.833471427712042,0.871847281875169,0.857529703348555,0.884732074383294,0.847003282222027,0.842020854894538,0.86926278960232,0.904768313798874,0.937445554262034,0.963921714059568,0.928570484690911,0.909070008705172,0.872304160842858,0.907575230119333,0.925987771400861,0.952866407876782,0.937693442590046,0.958946965315371,0.975090627817535,0.972574035916856,0.990827032191794,0.954917322720259,0.972811441378695,0.932474702668445,0.948105895131982,0.913874569695565,0.941880292271921,0.988918670525024,1.00537056800277,0.996032550597989,1.01605233445355,1.01440103052683,1.03935017927051,1.00905179563805,0.960380242871305,0.961922813137086,0.996711412245872,1.02702452218872,0.982638535570153,0.996606065823203,0.970899050586927,0.99816415657474,1.00384444980397,0.964711065457308,0.973569690043154,0.975044379726057,0.974943974793786,0.967351630123935,0.957240187986238,1.00135830528544,1.01716429861651,1.02382750781996,0.993406434302263,1.01984047211543,0.979247824961437,0.942667072876972,0.978291352938875,0.94756324326548,0.919953626321905,0.908701358824864,0.88647981647207,0.874179815587996,0.862953009916115,0.867805427821808,0.855454613740074,0.861428261189622,0.88661276796741,0.902773568070057,0.889000535267146,0.922749281492509,0.941420857896592,0.919355526348973,0.903999953288023,0.944555733991266,0.913622699736625,0.876624843697419,0.912256628821717,0.922237593873116,0.905806889480309,0.905602117292946,0.937110624113744,0.891364114087779,0.900629668531082,0.870613449060313,0.832096930108149,0.791797036010961,0.76530049371154,0.784311637523623,0.794573201254746,0.781597590560105,0.781962675863976,0.748116701192744,0.736519417623992,0.746166775138562,0.754326808371064,0.730717649017944,0.760006782242801,0.745160162210077,0.772890154928298,0.764950107153293,0.748558601470506,0.729384032618997,0.756849184235816,0.792168477712096,0.770955168290188,0.757892131932374,0.750433430330061,0.720336160976359,0.739740952447146,0.725249214053616,0.709422206212596,0.715852658443032,0.741898152715137,0.730091737615812,0.766153443872566,0.741604927907714,0.750032660808169,0.713593804828557,0.715481652116445,0.724318511332708,0.746850564490553,0.740838270080589,0.74577002434019,0.738855112981894,0.743669923329495,0.725007850599034,0.722009825930919,0.745803822699771,0.7553885038043,0.723761248648322,0.739992857927637,0.749805791689236,0.776119332136055,0.748099707841013,0.778784841316521,0.753300097992084,0.73342417340846,0.725280571540347,0.733814381969497,0.727590913000402,0.75135254351983,0.723410619134285,0.690632389394043,0.667802075561558,0.659132254608717,0.664676579636271,0.68710505824539,0.690944834808372,0.695977659388159,0.726164482762549,0.737330040373274,0.741410436590712,0.749183661853657,0.778459010169239,0.77752282970323,0.790267568114396,0.757197250674007,0.731438881011322,0.733752725744431,0.740834887314279,0.739256397046492,0.732576241225729,0.729334280038288,0.722536690657492,0.738931662716933,0.711665667722682,0.708791895103118,0.706670725371037,0.720661845532362,0.737779149130517,0.707833626004003,0.740663482807705,0.751451313885486,0.746286497330089,0.767474519460894,0.752800670808488,0.785802690601593,0.779887896252206,0.765793295285005,0.729243090798329,0.7307401327391,0.726321827413543,0.747106625774796,0.760071162113882,0.784479823370222,0.755663163489845,0.775358791987417,0.7524622026519,0.771529975169011,0.74258021492152,0.76763793430765,0.757961000827203,0.744991507923978,0.773198336526004,0.786279419540187,0.819114690048908,0.847160026945575,0.867501579847241,0.867784590142982,0.883710623502478,0.852695078741305,0.858168873389281,0.877534032314795,0.849735397253631,0.828597119515327,0.795069114932011,0.757208218279849,0.782653774197075,0.762045824702827,0.76282861868345,0.751616107884282,0.774649595681965,0.788068645507737,0.82098880377885,0.793755736720275,0.796965977022979,0.795120081566637,0.766424649908595,0.749025779059514,0.786017011690037,0.816155078479012,0.795429646414258,0.809256796991399,0.816058522378854,0.786013217395791,0.813248462333365,0.793040722694358,0.774346447405516,0.76397987970291,0.75786137295886,0.749726267701123,0.730406891763969,0.713378524597853,0.686299471714085,0.713317620470998,0.738668628492378,0.740074016315917,0.746926949769088,0.773554824034572,0.783307188897869,0.766424611974674,0.748918432087891,0.730587652915519,0.723595047793347,0.747830942616548,0.726796405577181,0.698258519052872,0.667081837514044,0.686321939425596,0.661647439085785,0.689407735718395,0.709563591941941,0.730984607698355,0.707539698904662,0.71646548230726]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-b4d8517c4ed39b966d61\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-b4d8517c4ed39b966d61\">{\"x\":{\"data\":[[1.00479765650816,0.983646631350285,0.971133779554452,0.934363167127856,0.91662968036573,0.925651498060035,0.934052700349716,0.924264016702314,0.912127637849992,0.924659487997805,0.948810759822134,0.963921799755996,0.941672791646477,0.931593916731113,0.965062587233907,0.937250323130265,0.90335946872272,0.941472122970148,0.953624633678577,0.935341251708267,0.940208507054776,0.930832869049108,0.910125485377858,0.91899666713572,0.928160599714937,0.900732258633732,0.875619120870771,0.913142688326069,0.913547680163346,0.896473733296671,0.903222023123466,0.902719734251141,0.910341478437684,0.90555957144012,0.894333044232517,0.936100687507233,0.966296979572627,0.944709280155515,0.90537903317625,0.873062226467924,0.868075004711003,0.889215304432064,0.854967114043871,0.882668303281141,0.910148152649979,0.954601061871878,0.998679762349246,0.963783824651758,0.991469913762505,1.00645121037195,0.96728778213861,0.967783288030206,0.932410392887219,0.941678178591121,0.964045497729125,0.948813894404729,0.952661327393391,0.91120163641002,0.874799338836651,0.910922052643718,0.89073920048412,0.909095664397626,0.947840866310379,0.908710890595753,0.873237392543986,0.89978295823576,0.907987025518989,0.918668364205527,0.91928130763512,0.949067223436247,0.979505009814078,0.935569975488681,0.96904480858959,0.982166594805941,0.979997315889849,0.988873405696615,1.01429277035166,1.02744068997614,0.97640426154682,0.988883245060173,1.02629418894597,1.02099523607118,0.973673104008077,0.946432762443112,0.94522679640465,0.909040891419372,0.914278247150435,0.896433361189785,0.932565833430621,0.913775845993688,0.894037222348108,0.926501706013639,0.972013860145335,0.983780803638265,1.018550339563,1.0584078962415,1.01870516397907,1.06905126826232,1.09650424527978,1.10521866776363,1.15457090093942,1.15107228683499,1.14535161790633,1.18939506643683,1.20104125119014,1.2270486605995,1.17337711716554,1.16628086153907,1.16689881957514,1.16831089138292,1.21664026071955,1.19618833271988,1.25079134469428,1.1919697054605,1.1882453046474,1.20304122803884,1.21176763842806,1.2570255326962,1.24537012420959,1.27677775724697,1.25887575019789,1.26428352303694,1.32031120639151,1.37268749027243,1.39547367890796,1.45199946445447,1.51800921814918,1.4825442132369,1.53862089889389,1.59318644345179,1.60795231875451,1.61778021594356,1.58805621278611,1.62579898668865,1.63671475460982,1.61466137040506,1.63542049809699,1.66677386952764,1.64383488507163,1.63889771830479,1.63325484277256,1.60825627926056,1.64257764298999,1.63064277685559,1.66422484067914,1.69071581944431,1.62526580090457,1.57899698792566,1.58279403240218,1.50947433451481,1.55901384784409,1.56665060243909,1.58541265286352,1.56985647432122,1.6286143911997,1.57674944200996,1.52436641400479,1.45781457418949,1.42463872825584,1.47763957261077,1.54148934145551,1.56908052294464,1.60034263354217,1.57806773754555,1.56394097084829,1.50879405272543,1.45699705715794,1.48010731623527,1.42867276076116,1.46276828117886,1.49388616231401,1.46307930384912,1.52754010242027,1.48611148576344,1.53611768902132,1.46076654163087,1.52519239868372,1.56658212793134,1.56494831542712,1.6109170903186,1.5619401284496,1.58441504459986,1.63307229594869,1.67709424868062,1.71470221983143,1.67088274496072,1.59844055259185,1.5189150639409,1.54896452894948,1.53001689404659,1.53037297358208,1.59808348762793,1.51893485659472,1.48101607512404,1.55343344533066,1.55684995795695,1.58472370692922,1.60076566154936,1.66185630148324,1.70196802378047,1.70345136729607,1.62412913727219,1.56762139739285,1.50971841202782,1.51180202718194,1.57915911499835,1.55441060260473,1.52893106885857,1.51816281736709,1.46798963929852,1.41132071084944,1.40579478500862,1.42754587157135,1.36529214773786,1.35239011139904,1.3062138761423,1.30585819775174,1.36647262681428,1.32773381940273,1.26675110162272,1.20600868876477,1.17961910303712,1.23084651554585,1.17193733776012,1.2126960746978,1.15898795289141,1.11697641845812,1.09474394564819,1.0934491003306,1.07884874981142,1.03499442447552,1.08244431004798,1.12037310502782,1.15963760822173,1.16764807340747,1.16153999884725,1.18020013946685,1.1940273114209,1.2508090187337,1.2553711123436,1.21287292256089,1.15330984438667,1.17926981289473,1.12108046356117,1.13009299823864,1.11674747742657,1.09533983212727,1.14668277110978,1.11743698158176,1.14634453267625,1.158356005282,1.16431219927497,1.12867012715631,1.1843723799146,1.20646730527345,1.15624737306276,1.20169236418289,1.25666362549544,1.20321826522242,1.15337648749435,1.11309095551105,1.07245008228392,1.03921070905247,1.01290008466279,0.975234092833016,0.937865464333762,0.900112209270766,0.892581007440268,0.882744180909358,0.910466956972894,0.954366508980734,0.916695688500376,0.886933321236368,0.893873615034492,0.887171579807334,0.910755684261969,0.937887696235084,0.921357657233024,0.942179090729447,0.92013096471611,0.874365134599713,0.896475726164486,0.918155950815012,0.908558841182925,0.927556720146428,0.942811762840229,0.967223251166464,1.00266577874598,1.02821936274513,0.982341686867419,0.949710689822049,0.960152421707992,0.977997878137407,0.965431645607892,0.997655059916058,0.96417481287364,0.963402583896268,0.924384466647858,0.905901538032309,0.929768295408212,0.922206307157736,0.894855494928564,0.912228462487842,0.935080145744597,0.901418713912093,0.880374801135491,0.882250116967632,0.905547742335847,0.913027803446338,0.892790151569003,0.900486057305239,0.923823805339508,0.949159678300232,0.970610185929447,0.984911752940039,0.995375972961096,1.02100252597423,0.991768260820259,0.993592323025873,1.01611346767355,1.03241283651955,1.05442280066647,1.04441290808746,1.00945932936752,1.00902834773129,0.992850171534081,0.989677632173421,0.984674469484831,1.01946364949802,0.985932093654956,1.00927015356641,0.979337422985142,0.992190602854477,1.01932311333993,1.05971365661704,1.03944506223567,1.08080078083127,1.0807141401361,1.09531724514378,1.13624895676919,1.14214471196821,1.16119556314595,1.21226236368496,1.15434827686906,1.1717133211541,1.18225290770536,1.23804447745503,1.26847722429271,1.32242061708745,1.35807745129078,1.35919908670215,1.42014313725141,1.43384466614704,1.4821761789169,1.47388062507655,1.53958679187842,1.55097332654423,1.54312274017951,1.54559892096914,1.50109666060844,1.5153535139318,1.52501815324206,1.54879855703857,1.51848539155941,1.5631573733975]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-ea7c5a69d8cfc1a18e93\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-ea7c5a69d8cfc1a18e93\">{\"x\":{\"data\":[[1.00070281703956,1.00078304286527,0.953967276646317,0.968490021663619,0.955447984728516,0.955204590275928,0.937449103480303,0.955781651876908,0.997470720973395,0.9843084684938,1.01358411612344,1.03858403084467,1.08171285187306,1.13303937490579,1.09856134463795,1.06721946885762,1.10140385146449,1.04769467114739,1.08894623327143,1.0840466961456,1.09583790704752,1.09887065590929,1.04739595539642,1.00631784792352,1.02739639443337,0.978166357010662,0.945289543121761,0.931382029162439,0.901211138748899,0.94320861271636,0.913514213677101,0.896684650301754,0.904027174544139,0.888981146781092,0.900860552154012,0.886464124951363,0.898801989561146,0.870263509351431,0.909407821487557,0.87230623574536,0.899985730309233,0.915161766041205,0.897451706257233,0.92290470921687,0.951896619490235,0.937494639015511,0.980578438421922,1.01061201472972,0.981815358616252,1.0119295359052,0.981995329827965,0.991059404708457,1.01546509879802,1.05879206351895,1.0894759511137,1.09713413516327,1.04690513184574,1.05047796600239,1.02746577210612,1.0263375409569,1.05303746291705,1.08245473333867,1.12504818180244,1.15648918251154,1.10995885106597,1.05879370748693,1.00610902570573,1.0339137753536,1.03531007898051,1.04867665393219,1.07940482447045,1.05414348218185,1.07474109831844,1.12427326533267,1.07373405384458,1.06412187457882,1.02397683484087,1.04199362486071,1.01959446957494,1.05414911897538,1.09195820126352,1.12368442182893,1.08979166211549,1.10520412610894,1.0793277716441,1.05967195970159,1.06345425154728,1.10522343440107,1.15222945681571,1.18545826810605,1.15167391488513,1.18059373038997,1.16218156565569,1.176121104791,1.21849245474003,1.18268268525088,1.16008515207305,1.1469879690478,1.17713383463282,1.13538193636106,1.12245218846213,1.09490935220596,1.06165574671143,1.11261414244769,1.14258327680076,1.1367818271443,1.12005513445581,1.14370372865941,1.19093900047684,1.24152095506575,1.23189063615146,1.20474303965715,1.19740537910951,1.16223702430845,1.15370700647333,1.13734786601056,1.14986403846825,1.19549503926679,1.15689839790513,1.12535213194067,1.13707627827723,1.13541676010344,1.15658364658075,1.12678875501923,1.11003261705198,1.16324304725655,1.16000170413549,1.13625645387032,1.11012379434599,1.11994671121741,1.10739432504992,1.07379603974638,1.05268859653581,1.01107949884379,1.01688239341401,1.00877042559673,1.0236701290147,1.07228420692762,1.05578450306602,1.0914146018364,1.12693374585207,1.15067586245478,1.11828778305497,1.07316497187502,1.07303282992951,1.11446155802509,1.11850320432058,1.07384654627377,1.0827430253147,1.05883632888065,1.11066102652622,1.14563558940815,1.18851402852271,1.20691663488568,1.17554635243454,1.1551548388475,1.21185154064114,1.2669646642104,1.286474070623,1.24211111034751,1.21506746878205,1.25921180094504,1.24044722436459,1.23925455638192,1.22600985439443,1.27592201688268,1.26177020847713,1.28394653165032,1.27127811566882,1.28389417738024,1.32141864099768,1.27759348510888,1.281849271633,1.33350340050966,1.35398213447841,1.34013139711277,1.35178250073628,1.36243883534807,1.38569551278408,1.44416582039291,1.44755192935494,1.39307620714265,1.33236746210294,1.36736892537234,1.40190381161645,1.35792967868987,1.34559916319709,1.37630588567076,1.42456286089021,1.38590918991302,1.4037938594504,1.39746134099429,1.46518408865445,1.51844652544669,1.48053064177614,1.52010430916265,1.54485768668966,1.46764024802758,1.39833592307623,1.39685487913584,1.44412882285892,1.44608101056212,1.41533611592148,1.4773805753822,1.47160156153484,1.43528970732108,1.40505197477242,1.44948433715805,1.49421921349759,1.52005921450836,1.50081021395911,1.52700860909454,1.590793575778,1.55442864013694,1.59090570230539,1.52853619192243,1.4660538964438,1.43324342966603,1.4214104166373,1.47893965606703,1.5022906520866,1.49376807399439,1.42188115783241,1.35607030441051,1.36147398432148,1.39641732691611,1.43650437780743,1.42310255124919,1.39204811049638,1.45892960785434,1.49373264667166,1.46870252261189,1.49542155155801,1.43540444985535,1.37331572551016,1.38119226337495,1.39458298641672,1.37504108298772,1.43385993417287,1.44767168914832,1.50641572835607,1.50135931290258,1.51104810946532,1.49528664044321,1.45512239568746,1.42938517452835,1.42052264170563,1.47891161090827,1.416955877291,1.35461264570332,1.31917621678286,1.37341697080073,1.43627203245202,1.48089142791458,1.42703806876281,1.45669521174258,1.39724932514867,1.38028785530219,1.41393059521067,1.43212287276706,1.42148445869559,1.43096460617003,1.49133682081954,1.42883559664313,1.36917434642079,1.33558662618998,1.29024165280584,1.32192107572395,1.32911811271311,1.26376596978196,1.28441144867073,1.24639917489624,1.24365572663445,1.29568933468713,1.2352111320899,1.21913904965401,1.23404551784521,1.259228569336,1.29117443787699,1.25110785351124,1.2495643051981,1.27908051918137,1.27859036062638,1.25879243674239,1.30563453859455,1.27338003226376,1.25786799412879,1.29731188236591,1.35507830892383,1.32535714612056,1.30105777970636,1.35109363827765,1.3518294498848,1.38328113432164,1.31693851761768,1.28381094703131,1.32038086436928,1.36594282350614,1.33488478601355,1.28885594809582,1.35313478800176,1.31623386119988,1.36482773786218,1.42431751751319,1.42048783637131,1.42766444712018,1.47810489211738,1.42809461634281,1.46464079960962,1.42479259196612,1.35905560341549,1.31057361634093,1.27859415725974,1.24690560004374,1.19548319608155,1.22167740085625,1.25504532474912,1.30403262053435,1.35055285751697,1.29622217741088,1.24723184544925,1.30904844599056,1.35235692534397,1.39111894815571,1.3472187718192,1.37632197361549,1.32025781831079,1.37399950211993,1.36507281972313,1.41477806866866,1.48431239578189,1.45073477768295,1.39005771178912,1.3288313352989,1.33403430529019,1.34848382581816,1.31050634658885,1.35519556985422,1.3135189144417,1.32454119389075,1.27361853391126,1.28120739992904,1.24640111034899,1.30045175635577,1.26001058146661,1.22655604623177,1.1942386284146,1.24743606919817,1.21170929819107,1.22761713384333,1.19370959923008,1.21629618069506,1.26066817317265,1.29030455743725,1.30087422733496,1.26392399696169,1.21726422012343,1.1565866632485,1.15356192147231,1.1298466866644,1.1573620620879,1.15831058623718,1.16508920524943,1.17149213617121,1.21256804926467]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-11ff9294f20b75ad84df\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-11ff9294f20b75ad84df\">{\"x\":{\"data\":[[0.998883644049056,0.986642322598659,0.960497107677729,0.926721389481825,0.899467851245232,0.93703421071883,0.915922075426637,0.955127885881062,1.00115940979796,1.00735607965287,0.95718870029287,0.972515012530153,0.96046918472769,0.976789852540441,0.935455708183438,0.964147834906847,0.994453371515546,0.956074509501754,0.980871507543348,0.948280855309114,0.993496416319959,1.01669413535867,1.05310972094958,1.00371530294072,1.00698243000949,1.00669481673329,0.987250754337289,0.980937888107599,0.967407541540501,0.971934853700463,0.993340718602571,1.02672085448716,1.06338356271344,1.11094797702081,1.12020418095022,1.10332361280244,1.14326181971691,1.16212528776824,1.18383735106863,1.21141776942924,1.26720589722355,1.29066634902645,1.32186592762502,1.29954483375749,1.27292418430395,1.32077821292362,1.29984929087958,1.29700293945956,1.2703794683471,1.28066478543236,1.30376662183334,1.32596750564655,1.26657907929327,1.30292723543632,1.24761976021548,1.27618172408812,1.3177029625447,1.30601362959111,1.3099675438647,1.33197734183793,1.32192913131163,1.32256402343579,1.31155068490137,1.30595991663252,1.28424235693569,1.3473519143032,1.31272457160864,1.30187767162625,1.3325719439963,1.3480720046653,1.36300710000105,1.40873746633244,1.38876344433731,1.33464207238489,1.28667533363041,1.31917204404019,1.38474716347968,1.32505383621491,1.33446879484823,1.27695287829511,1.24255081360091,1.20823265882319,1.15841336355886,1.20675508360232,1.26423809952998,1.26333661024847,1.24551679038258,1.29226532932337,1.29789149837048,1.33995847174557,1.28868744476782,1.27541876810669,1.32389412250989,1.27513033561808,1.27055548453461,1.21147679495905,1.16851638322659,1.16648208600227,1.14326044969998,1.09589835316657,1.08890060621358,1.11866055050367,1.14544717204143,1.19911820275107,1.1730576524503,1.17623900935573,1.21246051667172,1.23135563713731,1.18032709905416,1.15095165802439,1.19464888009952,1.21084428471535,1.20559205105951,1.17798829080696,1.13089956569278,1.15907530957702,1.12440534373667,1.08187473788661,1.10576163178216,1.07397411705799,1.03839848229808,1.06740921182651,1.06921879949669,1.06763343940937,1.04279759067879,1.0498404684101,1.00478901456031,1.01223447496485,1.0531043401885,1.07858604360796,1.03868345423708,1.061215873139,1.07065829677656,1.04066805684511,1.08814198361666,1.09867005046551,1.13775539665798,1.08527349221226,1.12726122649752,1.1403045776021,1.16155936877617,1.19449323230731,1.21597033524022,1.17618771684727,1.19985127528455,1.15825681634153,1.2058061857067,1.17779448145679,1.19338863151784,1.23056871579294,1.25713240725042,1.30975487269137,1.33923970863698,1.39445486239107,1.44485357940327,1.40924957554855,1.37293927778207,1.36429266080896,1.36428831895818,1.32923788523698,1.36952475963559,1.33226415776435,1.32852381788521,1.36544557176506,1.3526606507945,1.36469641825471,1.35971629651565,1.29790063057245,1.29829141148343,1.2892553859881,1.26637780961858,1.32074245133203,1.37867589857233,1.35290540128569,1.35625724115137,1.39786775056197,1.45193765428655,1.48557395708177,1.51522268765429,1.44955341387604,1.50397173239225,1.55635357364618,1.59875361099634,1.54296036108062,1.54717535400018,1.49335924096772,1.54280149313317,1.50771310038974,1.54245775639241,1.52360731616309,1.50294067140058,1.44757940405013,1.40183449756258,1.333412489547,1.3310245349936,1.33696646255389,1.30404069615462,1.35239482051935,1.30020598505259,1.23770207957049,1.20973702461552,1.16193877594898,1.21127726099622,1.15118076092091,1.18796859981465,1.23686798729676,1.24538612621803,1.22340315190154,1.18727427513025,1.14912848923356,1.13085342803292,1.10509628240012,1.1549936716034,1.16265166955762,1.18363765880191,1.18822387864375,1.15727322615247,1.1543336252563,1.18843866389599,1.17476233096926,1.12335904196234,1.12313698930295,1.15812242920597,1.20541909795282,1.2117497136647,1.23884619705262,1.22839951256842,1.25493112862996,1.19903703181558,1.17092351312276,1.14808153752963,1.14277383904857,1.12463355327903,1.09149140304493,1.11773394934738,1.06446992742124,1.0663366062363,1.09311066701152,1.07002673892075,1.04411321222883,1.07834548880804,1.05472541905105,1.00734036544321,0.957528317625987,0.982034539033858,0.989651013062803,0.984403326833243,1.0111397173488,1.04720436082704,1.07777336051526,1.04347323676597,1.01741582499484,0.993037044785031,0.961119013944573,0.916114757686432,0.881957189677055,0.90965862816227,0.915311723742072,0.903246669060178,0.872476333524386,0.899549488994734,0.899402612388908,0.879237978653908,0.907392392084387,0.944864932850152,0.921848099298398,0.909528908724011,0.904561036597012,0.900161539518768,0.89538740894047,0.864628640646765,0.881987136526565,0.8758510455785,0.892222503386677,0.923082504416679,0.886017752587601,0.886533460145789,0.86419809207268,0.893652822079482,0.918875865428602,0.898851265569782,0.928103409482016,0.900477765530746,0.917003593834691,0.910677186740082,0.8791172019024,0.912671261203861,0.880523416340614,0.868393209693128,0.910849340744056,0.925161736859831,0.966931862728571,0.94793431224341,0.912099432385638,0.954054951371579,0.976918314385194,0.976602581921634,0.954185645440442,0.979287286634414,1.02603821220937,1.0262191861117,1.04006343438945,1.06929697340225,1.10355372269486,1.0592780569119,1.02088989227112,1.05348079719892,1.04828218286375,1.01823930043633,0.96953506449004,0.984327612185982,1.00672693129366,0.991102125532426,0.962158697229226,0.937327066939436,0.937051700868863,0.921021994934254,0.909876450324801,0.944480472892887,0.975921432952069,0.959783316288696,0.969091500583226,1.01461908875674,1.05936589861968,1.10689280281863,1.05704190012816,1.02725294033195,1.00320604086081,1.02291041494707,1.00678801639103,1.01622751822467,1.03896164135713,0.994231758962738,1.02123305784344,0.99509060491194,1.0042598578267,0.954930741903849,0.968685138416419,0.962519075793458,0.95320338847348,0.997209430675783,0.962347215348356,0.920064882256785,0.915401513744255,0.945012349095113,0.930916421501571,0.94121370944556,0.940050740042627,0.943762584983464,0.952413079737332,0.971141494209769,0.931737685879887,0.948490782614078,0.908699533926503,0.946533678148064,0.965911695524015,1.00573408049168,0.974442313880074,0.955063884219288,0.923818991414631,0.890451995849975,0.881851441439752,0.914881786889303,0.888136150481983,0.890202625414928]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-1de053addc2e57f5e0d5\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-1de053addc2e57f5e0d5\">{\"x\":{\"data\":[[0.953049766574986,1.00037935796371,0.958042280453647,0.94836931852754,0.935339265923559,0.896119561324681,0.929764989233142,0.975560111758256,0.976744423926735,0.934107309916738,0.904398858634497,0.888808540972718,0.912624797208473,0.888608801347966,0.881628940345569,0.859434294459583,0.86840751799388,0.906269892744692,0.888171866457753,0.897540437733786,0.861712278280904,0.863224828943337,0.898201576322117,0.939934930964441,0.969307049355091,0.951775690225601,0.945248949643664,0.900785895716103,0.892643022835998,0.848804605646986,0.879159006916741,0.892006021527019,0.900996011692224,0.877767884951457,0.881853896302834,0.894119707780873,0.899809933217489,0.914760632183887,0.910299136027045,0.952298010505962,0.989828902633239,1.009271094876,1.05644306307388,1.08662982824142,1.13161909131131,1.11463272925938,1.06925882070351,1.09671858438459,1.08327787846892,1.05830120164614,1.0901802352601,1.07602108948552,1.06326039005091,1.08109213937679,1.07440934947418,1.11773908763665,1.12352783437027,1.11830396581797,1.1396244320724,1.10998612444069,1.14786762638867,1.18930911284858,1.13122823801961,1.1224335647782,1.1649580853807,1.18429675248357,1.14680286876798,1.17117285298422,1.16076517494563,1.20857441763448,1.19181716424718,1.24693237328324,1.25401745572241,1.24661451469067,1.2960808702399,1.30072823265704,1.24533053828991,1.21941566536791,1.19382868777573,1.21672617915331,1.2377058401033,1.28939484084777,1.30507879889633,1.27757011927579,1.26095416561602,1.22294714917632,1.17248926430877,1.11610667925102,1.1010181325495,1.10760770106154,1.12885824378423,1.11301235504522,1.11594354987315,1.13482823204915,1.12826702060658,1.1453476928451,1.20084986420883,1.24402594326943,1.25420977761963,1.25979391976039,1.31318104453264,1.29400195048856,1.29029268870155,1.31290663549197,1.30071404520006,1.35395945814524,1.4041355238378,1.45548343497494,1.42034504007794,1.39438416396358,1.38051838267355,1.4413334038039,1.48539052529571,1.44768706356821,1.51555233457613,1.58146134799532,1.61482068452286,1.67700425755601,1.68786525783181,1.63879947438257,1.60655748908743,1.53307764818546,1.4725814220472,1.40095757714731,1.45718087398324,1.44219332411993,1.40346823604485,1.4467269841265,1.43643002733641,1.43090378944805,1.47989867833653,1.44235501382978,1.38479478601997,1.40029297284126,1.4280394416437,1.39962381724084,1.39168216202201,1.384779811668,1.35560138002554,1.32076488243194,1.32655683618172,1.29479044335308,1.33162072147849,1.36467096993322,1.33322216592063,1.37832852847441,1.33247291796693,1.34638934903001,1.30282089396068,1.30571752839763,1.26229706198596,1.2617051071655,1.23168838222128,1.18081310749761,1.15579813411168,1.21339584452112,1.22923894138974,1.23290607089845,1.20529880264749,1.18435690631328,1.1984850506061,1.21742568166557,1.17341597886627,1.13282476739495,1.16729003917242,1.1565412686482,1.12605917172248,1.11545249959526,1.07853754872027,1.08883918554514,1.09306323570241,1.06997839687045,1.02030865683102,1.01247952513518,0.966799374965629,0.953037328546697,0.962805301558926,0.947297926805605,0.941815109286053,0.896328445750927,0.895090495258244,0.886910265393267,0.894595079510146,0.849904549568063,0.842476346576369,0.827728541268713,0.812202866365904,0.837853515229058,0.837375669743815,0.869342130819074,0.863308838812139,0.823592344999628,0.794844513207815,0.78080507434939,0.806269131349994,0.837768481459111,0.854372462709341,0.888400380874068,0.89731246381764,0.915872330757093,0.951970176280475,0.918293041488121,0.888284090709879,0.919981167021292,0.957952705869549,0.932892451677811,0.969650707520783,0.962087350706348,0.982194343596705,0.999985611928824,1.00347523571828,1.0049703918875,0.970106922996382,1.00352628770195,0.957543969159701,0.914566132623884,0.943413799400569,0.947075169207392,0.90790946042221,0.910615014751187,0.87238136232356,0.848464679400808,0.848538805079398,0.807939749512862,0.832388812966565,0.871822233845425,0.914577356484626,0.871229437286637,0.840203314985355,0.814852794711147,0.84434071779164,0.872391516326652,0.841490436124744,0.835802068872338,0.873948708099091,0.866313072803222,0.849295127703906,0.879475830430765,0.863312848532502,0.850601125178109,0.843635751023344,0.876878326026521,0.895616166120171,0.891425097586648,0.931575896164596,0.937143605449979,0.915786339593446,0.942117305130237,0.970281786101386,0.999983490642777,0.97719972285194,0.972216940953067,0.970810616130735,1.00987784581668,1.03285739460644,0.996198071533453,0.96985683681783,0.933737249869375,0.954826541553418,0.962609448000708,0.935880379245727,0.964872672714949,0.956148732526669,0.968675543632507,0.956975591187661,0.964337150426874,0.962267991047106,0.964939173925955,0.982504148477398,0.968580236760741,0.958408735573559,0.92051081503562,0.951409564652157,0.960016392273117,0.99308988702588,0.948385953444779,0.973751872323596,1.00985700468367,1.02771708439041,0.979670066678538,0.970496355988808,0.96305184538846,0.920105277076479,0.927367470345195,0.930187108000086,0.952306513425983,0.914328791476904,0.922573288056889,0.91869194368352,0.919377781168248,0.930532963008329,0.933502908339032,0.898707436448469,0.942032487253792,0.901065746637216,0.874692932280688,0.865892581919504,0.892265564562447,0.869291076145306,0.883026353843663,0.914891871304144,0.905584212947907,0.898350405698335,0.910778439663844,0.924660780185813,0.893411490870728,0.862686656253871,0.895546162190148,0.874558510281075,0.856140753045075,0.846797472747931,0.809089856086834,0.799457341213905,0.782638231816452,0.815003817032604,0.82066340483257,0.804772448606613,0.7998175737197,0.807893555882062,0.790252996075074,0.802468464720837,0.791376318032046,0.793696249808819,0.829517994671632,0.868019867312761,0.8391720734207,0.856027847653041,0.826098761423302,0.791221393429166,0.763079724486971,0.778063756283859,0.791665081542809,0.806538280428193,0.801593564232758,0.777399900634058,0.741229008852291,0.755341699999553,0.725482336513293,0.735475322469004,0.706133286757127,0.73344785043637,0.738182811174748,0.707901610675994,0.695100396602586,0.676120914831836,0.707880253826424,0.740014728963654,0.737913070286198,0.740623824211973,0.775313013021145,0.803821493069857,0.792522404706204,0.759357572153419,0.786881628320595,0.756271210125892,0.737756216928953,0.719182258196797,0.691217929460687,0.716051214631401,0.698434089675271,0.712709196868166,0.701026677016568,0.70635733113419,0.723770394256173,0.756219260155775]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-f4b34b24ab97caf2726a\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-f4b34b24ab97caf2726a\">{\"x\":{\"data\":[[1.02903446827549,1.01271259534001,1.05450252237229,1.02813055113925,1.03857726511873,0.989444380514278,0.946794333333499,0.992173060679236,0.993748801206129,0.950123201228826,0.939907350025244,0.94557147271852,0.918972554574273,0.955761321166324,0.98780546192112,0.975371444670619,0.978989941680268,0.988751999605523,0.975888828196148,1.01359431982918,1.02553207217964,0.977794682033889,1.02042084657775,0.970554541632423,0.96968154557995,0.937007217224926,0.927537806272969,0.943282028832293,0.929085389000301,0.950969156676552,0.963163319228108,0.983821736639908,0.950797165464052,0.9188681181423,0.878174755073491,0.915148685258186,0.92729266722695,0.886015642881264,0.857968191539679,0.88353345374033,0.88232144335368,0.871146463356049,0.903162572640396,0.905513250799996,0.941821683701536,0.899083710052327,0.855976694395474,0.836742064677809,0.846945275632258,0.856337271302069,0.845900456625409,0.837987837536422,0.86525321714625,0.846383996829904,0.883790646203209,0.899253850416175,0.904392903137385,0.917881773736416,0.952277935673007,0.934739070613664,0.971384926292785,0.92322190708777,0.91014300068893,0.939962053218477,0.899615084866133,0.944586012891981,0.928434834263628,0.888281326841511,0.845202473876803,0.879360935649818,0.903871999748864,0.884415864775771,0.860618487873162,0.834771910820753,0.85669148340071,0.814967868882717,0.785884207013091,0.753495607513991,0.752987938219616,0.779273448030957,0.812775198582811,0.781015313719362,0.792284860681895,0.812133077746515,0.829797391287666,0.792024084716746,0.823620298238646,0.79768189276129,0.798285109286274,0.830016305268574,0.804499866191566,0.819499231526349,0.813485561336501,0.79599707443562,0.764229703681673,0.729424940049238,0.727784189172802,0.714587506123561,0.69549027532785,0.699774283837218,0.672882429411375,0.647323980836103,0.643185757199087,0.613443308810974,0.594321454801047,0.583927241486977,0.581473944447845,0.584899929452835,0.600237003821592,0.626428155200345,0.608782562834221,0.635790555978466,0.616768246011181,0.59941570569333,0.606358373877105,0.634479834515273,0.665945605680845,0.676337651698698,0.654913105291813,0.682259908040218,0.695345901036939,0.721323381103992,0.693846356693462,0.675542173925353,0.691925386903314,0.689599711727965,0.715230515436908,0.74192453725637,0.718257827722862,0.74993945255322,0.733722880462006,0.716960259722964,0.740101703242343,0.70956390176043,0.698516682380169,0.665408710589906,0.646963733293679,0.615706184207102,0.599125656965088,0.602571865548916,0.584432573663469,0.609473360140903,0.583667661736648,0.607367937152783,0.634497829972708,0.657544186828174,0.685332099140128,0.718019491735877,0.7108754253034,0.682730062264966,0.715078943239856,0.695599442052833,0.686494813388962,0.719292679316481,0.694680208097499,0.6703047233134,0.657993068832222,0.672182349081102,0.679148009544479,0.699137539839851,0.703187034377863,0.68763188609618,0.688765718843058,0.679305967064246,0.671447280337735,0.655853223219943,0.643145973865284,0.666523945485998,0.675758894831094,0.669847882313493,0.649800196969789,0.625739601252714,0.649324317706358,0.656674392864298,0.679074010917773,0.668459381764223,0.660955028760784,0.646652302788416,0.678822154710386,0.703046874440603,0.671924450347229,0.695966745621894,0.705425564760435,0.687596653726578,0.677207773075513,0.646806441334393,0.667742603714652,0.677895603397508,0.651665079392354,0.65284219532771,0.651433986783218,0.633209721616371,0.642694356611938,0.639915370214224,0.633440511572422,0.606980085278355,0.628161832721614,0.638667169915645,0.632052148750158,0.606481820550008,0.59289850357511,0.570194174815756,0.54337375372426,0.548907131248542,0.569748284493351,0.586237904152366,0.57439788028514,0.589093007671181,0.563912942076905,0.575885168469047,0.582238593111723,0.571722373028046,0.573875981561206,0.567854606511299,0.559223484013935,0.552046380547147,0.547419740886105,0.573999915846123,0.563980129963286,0.54849786794171,0.539286551184753,0.564333362605455,0.565598670444923,0.570108794418864,0.57034495703548,0.586373066106762,0.598699524689092,0.619966445123276,0.596126387058326,0.617188691129481,0.602406902466906,0.574808312248027,0.591885694872972,0.610815306866905,0.586763531682934,0.599233542847414,0.578208018159532,0.568013223924524,0.563320021735048,0.588338379008074,0.599239012584227,0.600708884398298,0.617586553924466,0.636770124975979,0.609440073577227,0.633398956878152,0.638777422887448,0.646989744602698,0.630753431377955,0.622720558859211,0.608598262379638,0.62512268928559,0.653985380848201,0.68529604222282,0.66117619485784,0.692821056626587,0.691167578046841,0.69717346225066,0.701928656835463,0.719765317467579,0.741165119621984,0.772062529581284,0.748545874990294,0.73761600586795,0.729694398295498,0.744044176835502,0.737318720739279,0.763944991495337,0.769882797500598,0.787251873871687,0.81742540665309,0.818597619579837,0.826545455974689,0.824920723926643,0.817999506855885,0.858688574856185,0.896348041097219,0.912143774949591,0.898882170913405,0.875471316952839,0.847501063435647,0.87452244412326,0.883790576319238,0.849526612164633,0.809734121481061,0.770505754113388,0.759652356247384,0.77202816118845,0.759601495406077,0.749165330227195,0.760811705701015,0.772445262963288,0.749878918096762,0.718185211100311,0.747476583810431,0.734851330695683,0.728994934139029,0.747294756278487,0.765231026439776,0.733164164404836,0.711488852999328,0.718733267833774,0.729243568046793,0.723429529712867,0.703378531123035,0.731377513241024,0.71464781358471,0.722095442199596,0.731539842096815,0.705202216254544,0.731319035248554,0.718744996987925,0.720727203163695,0.714104920652257,0.720537986391212,0.707391904539477,0.703862385597718,0.694745000296804,0.724229120995847,0.746386946106993,0.728144938494351,0.702325784468426,0.715895288786626,0.7042173340325,0.672024626192363,0.658747978137475,0.688327422921009,0.705735513377233,0.699042433420359,0.702850040951071,0.720771295615853,0.721081119326403,0.688047924053485,0.688264364512504,0.703926150060442,0.69923508470583,0.73382155482276,0.706773559766745,0.684342318783609,0.69374131184063,0.702262316701529,0.686355731542925,0.694954868884312,0.728852103854747,0.756514894723268,0.768531061046727,0.743265243368685,0.730556695142549,0.733605276980289,0.712109900004001,0.735906422476261,0.755853324230062,0.752988471017984,0.757945383549295,0.735127547216528,0.756614249052882,0.776657979036911,0.79683751480191,0.760287829342466,0.791736176619143,0.791150814195349,0.827018059683062,0.821586471736711,0.790503682911318,0.766649156675196]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-7580c1725d5b3bebcb70\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-7580c1725d5b3bebcb70\">{\"x\":{\"data\":[[0.961177658475936,1.00008055963983,1.03175304819573,1.08181228555475,1.06260401783294,1.03831039537941,1.00953828198217,1.02587936987785,1.02167585827524,1.01632915684331,1.06369943395055,1.01833533390163,1.01985534795667,1.05259792653855,1.04740639325749,1.02962718818367,1.06311921655525,1.03851351260295,1.07410800591072,1.06403291663933,1.08291148093796,1.05254984665961,1.10460106042669,1.12582174669878,1.09484578067993,1.04454151972222,1.05438473729817,1.08538109620717,1.08131166394536,1.06658181712515,1.0932593965555,1.12060421251379,1.15263604859556,1.19724577748917,1.22308812146099,1.20453227987046,1.24374491082101,1.24746552818034,1.26831658568122,1.26344115401288,1.30162469294479,1.31281569489648,1.34084018738292,1.38429513307876,1.33954735154963,1.31981574747375,1.29303466999992,1.3112387813499,1.33986348002281,1.3004081741507,1.26674434845404,1.26717371408622,1.32525399481598,1.38954337346319,1.32521154556221,1.37655978167804,1.41661128810491,1.41511891962699,1.48399855054921,1.46332640089297,1.51406321777858,1.47289749100121,1.46145902392862,1.51632651524421,1.46768073013871,1.50132255054546,1.44841068724166,1.51524435047506,1.48790796956707,1.46771538301485,1.46717332972598,1.44934236777431,1.47029272398279,1.47565051543653,1.49719664837938,1.56501007661253,1.59062965090756,1.60667136100531,1.53278492118125,1.47807498316968,1.48157576823799,1.48207241919113,1.44517771479461,1.42596978107993,1.45667331843729,1.38688429787068,1.36864282910059,1.35444271820934,1.31423921769095,1.37453711965223,1.33092557609282,1.35728368456735,1.2930027471018,1.26690459836233,1.29413511449623,1.31461253500391,1.25305029906451,1.28688660826245,1.26004420536579,1.20082647600289,1.19016574943018,1.15442832956192,1.12593692884858,1.09857170215106,1.09957431668371,1.05590847258353,1.09356198539318,1.059810246678,1.1101544786946,1.15640400816347,1.12859813265698,1.10273559362172,1.09433124388979,1.14736232238413,1.12977448542797,1.13498842661964,1.14534819013851,1.13237579693184,1.09304516649803,1.09023050940424,1.0942719447933,1.051716953879,1.07387244349072,1.12678868930979,1.15450674537522,1.20556089640965,1.1494625484472,1.18323076854338,1.18509333873132,1.16575864381219,1.16212477770636,1.12327397579779,1.10444242934877,1.08544929171911,1.05137101526738,1.00487870351454,1.03246837241989,1.07093577448561,1.10547817274772,1.15848653906969,1.15925734728889,1.16988629991522,1.15001328486873,1.15370243599743,1.14326032897163,1.16956020626689,1.16837472959909,1.11359317657047,1.13112189352004,1.12565175113137,1.13398096725782,1.15901725207887,1.20863114690019,1.20778192427879,1.23634689225958,1.20223363930166,1.15731686031058,1.13074632707024,1.08304781582183,1.12894140522311,1.16924791066819,1.17743088345369,1.13129692318094,1.14321715458332,1.19570774100637,1.22787949709233,1.24688483662311,1.21624513804822,1.2342998880677,1.21730767892006,1.16798786382074,1.14696340492305,1.16957620837359,1.14812153172928,1.15133346442424,1.17490280751548,1.20659111402559,1.21691124065539,1.26142358543989,1.24281639508647,1.30331249793253,1.26499466317679,1.26256408633862,1.20135978168419,1.20825544054683,1.16823118837008,1.18667411044435,1.23159645451445,1.22822550765696,1.17736869829982,1.14926617875295,1.18658667511679,1.22867182701775,1.23634491685939,1.19615354029095,1.25070457596993,1.28207389660517,1.32118299781937,1.35389217489669,1.35957152371304,1.37793565549535,1.36144562411932,1.36193364408952,1.33301906457203,1.35783384496632,1.35196369591418,1.34139873240425,1.30366203290321,1.24231335423905,1.27003796763609,1.29850215182049,1.25445049930938,1.20689745271967,1.20548471442955,1.15531930869107,1.09928129487615,1.14078290781189,1.1849447442455,1.17202207975097,1.12792838693873,1.14841554571387,1.20290131215352,1.22229623258966,1.19177987452699,1.14661180615202,1.1968575144983,1.21500554797453,1.18649385467238,1.18768029239372,1.22793640774177,1.28731193523556,1.31601749905698,1.28389911854851,1.22530302837434,1.22882496377047,1.1927914864502,1.16251904330383,1.15965870702492,1.13683544237183,1.14537746989911,1.15870800105856,1.18761484999863,1.16099814677189,1.20013590234537,1.23165093114751,1.19547615031942,1.14301975138697,1.13402182148993,1.15330956600724,1.14093556052645,1.09754006017213,1.08906222916278,1.13230109788204,1.13806504371389,1.08886929090113,1.06243781086197,1.0740702482385,1.02157154352711,1.04875320618725,1.04785810189112,0.997961330688718,1.04010358091352,1.0735598056312,1.07737109761477,1.1218762589588,1.14533315948582,1.15270438609469,1.18823894767433,1.17059707904083,1.14278291495139,1.13077276550702,1.1510393823002,1.17519016492132,1.21923294054876,1.20062320848749,1.15095953779061,1.13950646735301,1.13450812386012,1.12186258529846,1.13435741469193,1.19000149578921,1.24352957843186,1.26931150263784,1.24656135703324,1.29752858113343,1.34773851137694,1.30932156541199,1.29218980417822,1.2875081080971,1.34065571175331,1.40682259156371,1.47120366611817,1.399330132384,1.38968742456221,1.41150063844748,1.3845276107861,1.33595163034185,1.32154888450291,1.38039116195814,1.44708217427589,1.41588682890268,1.46821965587178,1.45128916111274,1.38077331572515,1.38641937095986,1.33904426972153,1.32795900989838,1.26950255483651,1.32799337503655,1.33146921004455,1.35688352044155,1.4148584860107,1.40341084112634,1.34596585092313,1.36673361115398,1.38595493673481,1.36069458270376,1.33956013499797,1.33070437736069,1.27990259083524,1.24460608661452,1.22938661216085,1.22969457897217,1.27122734507718,1.26036342813891,1.22538420081603,1.2422397714098,1.1973887342892,1.19952149629783,1.25276931502398,1.31442898424801,1.32959574862002,1.30725806441046,1.26267529345876,1.25332182061947,1.23508694490914,1.20022467784594,1.23699667030604,1.2755530036574,1.28604323191182,1.24884516929587,1.26736914058502,1.22142351206417,1.2045098803052,1.14555254517361,1.11938780464226,1.11715567086931,1.10308656711851,1.11679892031138,1.12115253473156,1.12754970109984,1.17543964793259,1.15633160642264,1.12613841201232,1.17098144315793,1.21241963840721,1.18423789542083,1.14012972050485,1.19167224019551,1.24117629077002,1.26374869568574,1.25012977424236,1.30303584683415,1.26315056660459,1.29684385262553]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-bfdc0b5eaad7abfa77a7\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-bfdc0b5eaad7abfa77a7\">{\"x\":{\"data\":[[1.02389195554424,1.01939294740047,1.0681198088722,1.0360824922588,1.01001995607661,1.0002112602211,0.968039289834964,0.990957093369984,1.01566271156204,1.0163133532654,0.989447393151438,1.02593582293549,1.01335710861823,1.03721682945061,1.02533621566225,1.04082744225179,1.07813617534152,1.1053960705944,1.08007366696196,1.09310670829391,1.08622426356906,1.10751625502051,1.14553584799692,1.15885993235885,1.11212677793884,1.14497937478679,1.13354070988599,1.10582245827707,1.06751726982977,1.05027071889712,1.08441647642189,1.12875451038897,1.13615152468635,1.09749540610879,1.10286069285046,1.10944674039045,1.06081382896425,1.03397880438886,1.05258914931212,1.00159219787367,1.03504047063601,1.01183835036739,1.00543372724265,0.981536068855233,0.93795234477481,0.983508373401729,0.942910738450969,0.919772015634311,0.902952214264011,0.931997912630609,0.913328263219913,0.944963025772676,0.952049379595005,0.987928023989825,1.01645802213066,0.970592666011952,0.976396480211681,0.964856111067179,0.987892700200738,1.00659957122367,0.994098756280321,1.02907658499579,1.02823790556014,1.00610550303876,1.02279687168201,1.02784041716714,1.04972195676597,1.04930057917985,1.0354713406853,1.02705869852322,0.994721066778916,0.986887488544801,0.997481872511108,1.02181086825417,0.99762246489237,0.969975571880463,0.943087839191501,0.934548835014077,0.96957714645118,0.929344933380419,0.886498542563805,0.864461880685047,0.877333126699948,0.909520989297478,0.899280908539115,0.894087512388301,0.933941973267892,0.897729790900507,0.941569861452138,0.979781110447699,0.952289859032805,0.998504087573195,0.959347207516871,0.926171076465306,0.921338994033304,0.957910003479094,0.913860793636172,0.946269010955888,0.940702336039165,0.963330771500743,0.920835290666216,0.942587579562673,0.934449607910275,0.928551166036936,0.89039914954859,0.929664371250347,0.94664602479131,0.97104045976775,0.975820698668982,0.971934289063667,0.955505141344876,0.936774986633428,0.975839469662713,0.94324341613093,0.949514181577416,0.986111941610492,0.948090979247821,0.937746963229586,0.898495696801021,0.915536650067161,0.961112290143735,0.950644517164026,0.974868003991666,0.942850525107245,0.928086646961271,0.959105527246689,0.967138668559674,1.00919873495642,0.962711321741491,0.919657410740687,0.884582964725734,0.872779836427174,0.869481127196747,0.846186880207477,0.812357531630455,0.810177997453914,0.832644498124681,0.839450015492946,0.871592221983374,0.911391702541354,0.952564550083213,0.982674324083515,1.01123187560752,1.00955580929875,1.02408022126912,1.01191311119967,0.991396528087924,1.02670418823705,1.03882289055437,1.08992873934054,1.05714292121563,1.01813819001823,1.01037503130902,1.01316064801243,0.966107225485953,1.00610095806121,1.00833398730479,1.01973878234622,1.01819151483213,1.04418958825281,0.999034313270128,0.994036653189212,0.992946078269853,0.945836891728009,0.907277914184365,0.893273711893836,0.905303177423445,0.884388228536395,0.898512393858193,0.859360074285802,0.839418669782368,0.85424261573951,0.833323250193545,0.874331119148356,0.89488958376785,0.925949258858915,0.900587058688724,0.864410312144608,0.846522835016883,0.864766963425111,0.885263222353654,0.85889972358387,0.871434889544446,0.89391789633662,0.938351761863173,0.931186933178331,0.907056054524577,0.920477861847197,0.89833303618125,0.880950237126679,0.858602389465647,0.889625490217925,0.87989448243804,0.922629096737321,0.962358092614316,0.959170645376502,0.965521813356803,0.9921730869792,1.03139668421997,1.0537155541771,1.10518267549489,1.14814925692806,1.16378725207262,1.16625492500542,1.1603677057728,1.19413230249705,1.23978188584299,1.19216961720768,1.19815202444228,1.19453036645309,1.24713785458123,1.24057193148583,1.21039225790466,1.17316095083901,1.1377130593487,1.16530692800209,1.17835719031837,1.23382746622728,1.29521445569081,1.28181914404486,1.23179743291979,1.21366224858433,1.2102006707957,1.19778346191083,1.16729026683866,1.15150717791796,1.13560955311715,1.09947333869415,1.11407468991512,1.12582498399682,1.07628299108254,1.10532789973541,1.11531104251162,1.1673976665905,1.20321099720817,1.16322432798678,1.13383438905387,1.17950343595385,1.12380152758237,1.10001388622371,1.12815739342237,1.10952278186907,1.09402369963223,1.13697214371835,1.18500619407445,1.1426029913851,1.11656341358471,1.14512979329625,1.17156360423727,1.12167495065748,1.11741036264605,1.13904952583714,1.09835135886207,1.11197766729454,1.08245376831112,1.0728145425738,1.07747147430514,1.08585210351935,1.12681806484689,1.10274204139292,1.15122890270354,1.17027599189135,1.1735289156986,1.13176673422128,1.16625216522417,1.13713368211109,1.09086212132122,1.07677810619676,1.07160328283514,1.03440156912379,0.983653829790353,1.00235273955778,0.970481088221284,0.99886351268608,0.950599268326442,0.920374822823769,0.911611484836158,0.877506054052274,0.9116117592096,0.880174483082829,0.870112295547404,0.908558181866069,0.923125488796744,0.88903922513851,0.893355208317048,0.856765977709816,0.836322836730435,0.872090783113688,0.867771455542028,0.871393870506787,0.879524333075353,0.869921979700788,0.912274733223338,0.930759599678675,0.932106834073097,0.953847569248963,0.945423470977311,0.937687712040576,0.983063612957181,1.01984000441989,0.979207641852594,0.96805802698297,0.990886547723038,0.962142826543154,0.98959694877505,1.03216539635437,1.07369506556949,1.09261292416418,1.06529979192467,1.08049511844854,1.0999457395047,1.11674481400374,1.09582165942002,1.1041538065005,1.08570145985947,1.08448722095861,1.03577930665367,1.06658480210934,1.10435880517446,1.1463163877261,1.16166809723108,1.11565571935065,1.09165199108506,1.07705912524142,1.05759452884803,1.06224571031497,1.03735872501418,1.06453264575102,1.01259805703324,1.04431015866847,1.09415711913513,1.08595137487182,1.12772859025675,1.09673316531348,1.15028104336377,1.14712429146304,1.19871238871203,1.14005007959938,1.14559410314538,1.09394664425755,1.11132595273939,1.12979096947778,1.18131432575984,1.16400988225531,1.13947587823389,1.08853784985407,1.10771752359314,1.11086548542515,1.08508595222944,1.03808472744213,1.00383520726175,0.992673269021997,0.976908328957166,1.01573967560551,1.03472596669004,1.08036915103233,1.08668404803846,1.04698077726875,1.00465240814955,0.979788782534985,0.964744335980262,0.940852520193205,0.895925871206014,0.935017337560531,0.890535630922379]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-7e52aab1ea971293cabe\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-7e52aab1ea971293cabe\">{\"x\":{\"data\":[[0.951631895476021,0.917358612032474,0.960904246554535,0.972119048811099,0.951029271460243,0.970873305461638,0.966019679647357,0.933184747948816,0.96786360697056,0.977278199441328,1.01450193228261,0.984952888441019,0.997993031809883,0.957092204219155,0.999829872056753,1.00369762965004,1.02652258289137,1.00402535470547,1.02345987879145,1.06916655489056,1.10319859369981,1.04817498456752,1.08952324068577,1.14315043332858,1.19080450133584,1.13267823429912,1.15821370594374,1.11071357526334,1.13282634068276,1.1745142967693,1.16189755313838,1.1467666977545,1.09064692558407,1.03827711071391,1.02007203838914,1.03386612548924,1.06773756587748,1.08707929849137,1.06625885070444,1.06522299332113,1.01520343578019,1.0039818184442,0.963854558907443,0.948754609160891,0.935909862045213,0.908298138074545,0.90408451285209,0.923633224705301,0.947336524080993,0.916633404940062,0.894080326311176,0.872335377317228,0.870566180101464,0.838650143368844,0.858849900520898,0.885761663139669,0.913588986742313,0.937818795285918,0.89257079266799,0.912460525134188,0.955599590030962,0.984578453648448,1.02245064662081,1.04263070344099,1.02923533536345,1.04548940932506,1.08468928786929,1.09643638097566,1.14518923566476,1.08839205350059,1.08797731103699,1.08716818896738,1.04584382645445,1.03608879466097,1.07063300336985,1.10236194439504,1.12450005763222,1.14710128509234,1.16802370458819,1.12604619007338,1.138594927247,1.14221768805655,1.12426472032303,1.13545922625954,1.14131712605608,1.17589452367767,1.15409319635323,1.15195645778688,1.17443886070209,1.20809152300872,1.16482968199277,1.15275320070786,1.20051430973388,1.16874649567166,1.20613457364167,1.25597775961569,1.24094212110552,1.19231768680965,1.18096057898573,1.18820658538151,1.22984267314988,1.24354947570615,1.2497125628986,1.18983473511124,1.24058857379706,1.25458548011872,1.20641758487619,1.21067846126058,1.24104615020301,1.21401409871768,1.25659888751122,1.19432008733282,1.23953404905277,1.20269018183787,1.20953716572823,1.24761587999869,1.26103423306456,1.25787124815399,1.2489341698873,1.20068194008106,1.21154326866633,1.17957057174815,1.19449451836057,1.1462224219299,1.1572296065378,1.17348486095307,1.22800943906274,1.21977314900566,1.17729603227973,1.13263028089465,1.12344889779913,1.11143546619085,1.15381538286695,1.16713229950003,1.20302749370112,1.2356318650187,1.20230332814088,1.19443349792138,1.20034140076193,1.15433198689295,1.1535606862726,1.11986405648581,1.16812925051108,1.14334162052024,1.12161668876926,1.17738481492946,1.18102207218149,1.13893709159343,1.15381665057104,1.208408367939,1.15359694219197,1.1264876952015,1.11694054413373,1.14143046377959,1.14595356071314,1.12291451896591,1.10418735451195,1.12515911003266,1.12457016992041,1.12637039094783,1.14771880528167,1.15610429841058,1.17640897992082,1.16491557185372,1.12603988099104,1.09435664766555,1.04156344791398,1.01946751465693,0.977776246107397,0.961988636529046,0.929945297060275,0.893396225248585,0.931974032194769,0.914146551516533,0.871402945938248,0.839159872263005,0.806503687340856,0.81316278451664,0.819978974097141,0.841020532792231,0.833182134954297,0.852892857658321,0.894814833002611,0.884017545961135,0.844001747877105,0.830674373442649,0.853642183315123,0.834317266413924,0.86777592030989,0.846453055905738,0.853728412251529,0.845075924873501,0.82245300684617,0.824014203914415,0.807063741928064,0.784056887287178,0.791654740865959,0.755268024775117,0.739187040447185,0.756601371193496,0.739215437726097,0.735507831129378,0.736944278689212,0.714898723030414,0.699284113730725,0.729766104581264,0.73950726645937,0.775483927979589,0.749660712921988,0.719022433662618,0.739136731517377,0.725230301355729,0.735060348343541,0.709413221519754,0.681142551550957,0.693694216688985,0.682611128049385,0.68149941547754,0.707649532248768,0.696787052514339,0.687512023233718,0.705704765037732,0.710317742791788,0.709888864689755,0.68924392227946,0.702523682084137,0.669727440076298,0.70123178419248,0.712959774446301,0.734349487117624,0.752819073100219,0.741383646392096,0.774758032562332,0.777158900654279,0.749742681025934,0.732923138637682,0.764858295014418,0.736534941702813,0.755118827092227,0.778242270084101,0.778572877944864,0.752996012551589,0.718879150881803,0.723886255822169,0.737386122384127,0.70642643637096,0.737444078330556,0.716325602268352,0.719412153392152,0.735933247560016,0.712376036427614,0.722813873724468,0.734868659713804,0.756402036768568,0.71911160255949,0.701125161039873,0.721807442191136,0.689259868816544,0.660171178651449,0.646989193285453,0.652756628237871,0.65527947337887,0.641407594949873,0.643922856277866,0.64230222154662,0.62505484566524,0.6119805283771,0.585908365985521,0.603936167903024,0.581881426198003,0.585073769294009,0.563200441261537,0.591247005449876,0.614920691829582,0.630770131328244,0.631235370755564,0.636800582613437,0.616495414898641,0.598897330631857,0.597748428284005,0.590421790580102,0.5758838792232,0.567153225929343,0.548892777358883,0.569584542812039,0.597072833712986,0.598334527058325,0.576021244253857,0.587783920356334,0.606793567081407,0.592882885173834,0.571152557173035,0.560774271577645,0.554774605969603,0.580739549741587,0.57144553688234,0.549349231821778,0.565551602967905,0.580198521811873,0.602357542963214,0.62668924323489,0.619874020279197,0.627761640234723,0.653802457660987,0.661376080874501,0.631911303177791,0.616456972965471,0.591149615635645,0.610603640374986,0.609545359193817,0.587837121225602,0.613791586069911,0.618309581394231,0.622249300066414,0.652552239180281,0.675706966779571,0.647221638083773,0.643029715205887,0.654658334750904,0.659547287090556,0.672338997140233,0.655863694519509,0.653125598488648,0.674499490045161,0.657183313974691,0.625768948960326,0.612300552736384,0.613121452959913,0.642550094934938,0.662245875971241,0.632704367581289,0.654211413597264,0.626508482649659,0.603504566078025,0.619445893315605,0.592564252889207,0.617426404866419,0.638542584754315,0.646336614103057,0.669202371699677,0.661650458901693,0.636271024657801,0.653460154898617,0.681778872022807,0.704775212294304,0.706803347600431,0.688669386065305,0.685605621307071,0.661716523928302,0.676204462593595,0.655576579837671,0.653763689768512,0.633297330152387,0.656149443105853,0.633389021322591,0.657244087457013,0.6386673067165,0.62541984407684,0.621286320619844,0.603209497087143,0.581935490119449,0.568411192596808,0.572552178820218,0.556008722571166,0.539492702005225]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-a5b76db2d03c33a39521\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-a5b76db2d03c33a39521\">{\"x\":{\"data\":[[1.02188367801718,1.03514322205618,1.00101131617175,0.995162247823051,1.02843692602614,1.00287699214273,0.987085397757827,0.978491322645998,1.0139598698394,0.992708933573217,0.969312992431366,0.967744307756985,0.951304896534706,0.992054733317649,1.01299825582182,0.973477461546548,0.932298605020337,0.889711858937532,0.922297307288759,0.967218949446614,1.01478698030261,1.0497608467397,1.05202094662518,1.03076416391955,1.06999076003817,1.01745380630696,1.00744701220522,0.962147162922662,0.95758862195308,0.985873637846891,0.936678557726748,0.936988135204259,0.965156014535216,0.993534442807449,0.975438600257939,1.00191017288897,0.995237467744718,0.97947723163664,0.998858056332897,0.965235321561321,0.989350454918846,0.951709650970793,0.988946182852343,1.03223035870374,1.08363845964181,1.07147314053901,1.11694270389224,1.15766948746554,1.13560599995682,1.14579139424997,1.13040889021147,1.0842412492839,1.04459249875334,1.05148259464015,1.03063072518427,1.06212117819468,1.07212522636096,1.10577075744724,1.09069076026313,1.10600690331,1.13049392457003,1.07526153216067,1.03623182491085,1.05502806969466,1.08952661343409,1.10309117227442,1.12029205425802,1.13215442314786,1.14427362430866,1.13789356368176,1.1502014833176,1.10185608318317,1.07042876293844,1.10910626465902,1.15537426009828,1.15452604914406,1.13402909098396,1.16519924772373,1.16062403115482,1.12117815181541,1.17698416798239,1.1423056636203,1.12640304705573,1.17516239080817,1.22071040423683,1.2162140829449,1.18175483235362,1.12698756974713,1.08527676197935,1.13060447589886,1.07505188907923,1.06924276241548,1.05601098161362,1.0797678068885,1.04221821272679,1.03406831875609,1.00317364004895,1.01663874397118,0.977822831602334,0.976109373688203,0.951550468384113,0.938846560538264,0.941065943424542,0.914226816685307,0.876911922710698,0.83367269312394,0.815031069151756,0.780044158262894,0.813675536382821,0.782848516926498,0.784870853835455,0.811300762847912,0.792969152926166,0.822423874335883,0.813655132567399,0.779130570507553,0.800866309264603,0.784766226895373,0.801719342966783,0.804047803013649,0.779717943502439,0.813956021980718,0.839926897858016,0.838638784235799,0.857089847492699,0.830214956201488,0.795241136531692,0.811166409998347,0.803597163873406,0.819239100789233,0.849867170200889,0.812743822925907,0.773357038986661,0.805107570357306,0.784718000780768,0.780016011343574,0.781297211926645,0.750025652717234,0.739512509070897,0.756039923741811,0.761919688306611,0.748819013031745,0.749271596953387,0.720923301750644,0.755990442232999,0.741606022278315,0.711146729395174,0.739076394466223,0.709156330449518,0.723697781138507,0.72056204502268,0.728353219878677,0.721703278060475,0.699441859978036,0.680747255492389,0.71407377983524,0.711470167355197,0.72901076609419,0.725148933020623,0.710945705627196,0.746156406288582,0.738162556313948,0.753270724449171,0.764597839867347,0.775798726109992,0.782455697475594,0.76430470171892,0.730404907588313,0.71518673612773,0.702191214628956,0.692267812223897,0.699447407013337,0.703042245555734,0.722155594937364,0.734845151145387,0.716194246175093,0.734788095228345,0.769419444743183,0.75196823017824,0.715987930689635,0.703782779633642,0.670049176461222,0.660598351349188,0.635166247848925,0.616931573114572,0.63423721953693,0.637944099673781,0.624064642203916,0.610089410447269,0.636246057185617,0.610950823236283,0.594612931503936,0.599683661373873,0.595653274136388,0.606161101697804,0.618793116693124,0.60312303348017,0.611037065543728,0.626748062948219,0.596274327498916,0.576057324791394,0.568645289750263,0.576043376075335,0.587646070675849,0.612948078389619,0.628247350207884,0.605055173340761,0.623557376964377,0.626492029390718,0.622059494559881,0.622049704166855,0.614241702736919,0.594164104403692,0.588633092823035,0.613292603972054,0.610299814872939,0.590257321619437,0.586215399427922,0.564226111458346,0.583076391813245,0.58218431289489,0.554307816706387,0.570731386628184,0.575273192037721,0.602872692566407,0.62162716604301,0.604940346224233,0.595050129773372,0.603743506371594,0.613106130256429,0.60079493843412,0.618529480194196,0.61256746826518,0.612224056619376,0.595079100030837,0.614164173632877,0.635685745065459,0.640830666324377,0.610589318762308,0.627712337593472,0.626328719416675,0.616808372896793,0.630630824297322,0.629839657281657,0.657847669660254,0.668587058429943,0.693888985989747,0.703908935726577,0.686472152479031,0.67690931604638,0.70583222478454,0.70293432761618,0.691790799006666,0.710377409064525,0.715460998620397,0.687152883266353,0.672745777424016,0.680686061692857,0.691766607952821,0.701318582411773,0.676642468794811,0.680421712029557,0.668250267593038,0.678172197252738,0.703798718717271,0.726532212628677,0.698116445270569,0.676741987952555,0.689438691689768,0.682639513427213,0.684741498622588,0.708151213390385,0.705022404301123,0.685883969072185,0.652574075665402,0.672936316266861,0.640524086183928,0.649513847415606,0.628973462303827,0.612019183656078,0.636269282216548,0.66198298407153,0.692632542150122,0.671225829600336,0.645366362817361,0.630913857795859,0.616568421136584,0.596937486864271,0.572933619645419,0.553561128321888,0.546029882303234,0.524516136828416,0.5383269798878,0.531225011344133,0.522695131951928,0.515197987248147,0.531760528343224,0.508389678498567,0.494624278755034,0.516262769182356,0.522086924416816,0.510933240060724,0.515497777369835,0.538449560387644,0.543548800033966,0.559225586875596,0.554974787270841,0.535145069805435,0.534096842524631,0.532928611017002,0.514935637417155,0.521866518808462,0.523517903814582,0.507443115957806,0.510393480137882,0.520782488908029,0.508996303523482,0.495909553420129,0.472048558396894,0.467995956549794,0.472787423505005,0.490065192864256,0.492408079109338,0.472517793095922,0.480270363469055,0.472202151434903,0.458905912490961,0.476027759398365,0.491009754180841,0.511468579580884,0.506518380791478,0.520368514277224,0.512116901666413,0.489341753409534,0.466688555406658,0.453085287279555,0.462694496950516,0.440877867914155,0.419356411779587,0.400270130514444,0.415481572468373,0.413942251224327,0.412755307268982,0.40132644825755,0.419379325048336,0.415147350330672,0.402346991770069,0.390023799808104,0.409360580320486,0.411017918710228,0.412305106178905,0.422108021780406,0.40941731092186,0.393925599028159,0.3812158251444,0.370569695975157,0.374038083146975,0.360584701646541,0.350973990472903,0.36804396717675,0.365186773598993,0.357881439780337,0.363186034593739,0.375559143759775,0.389190513302632]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-d41acf4325107539aecc\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-d41acf4325107539aecc\">{\"x\":{\"data\":[[1.04555409643799,1.02254985227062,1.05875502263143,1.090101460038,1.06964807440941,1.09914056966391,1.09196750961234,1.09182008524874,1.1152142663992,1.06327925111276,1.05321401560638,1.02742794684742,0.994320426331231,1.00601692096654,1.04137633286841,1.0731343694171,1.11105247657969,1.07414957554545,1.06878462486336,1.10407285401898,1.1347314994768,1.10137674553338,1.15266110558816,1.11887778018596,1.10009517550283,1.07197877824823,1.10469402575757,1.14734013306442,1.09980921486155,1.12515058640858,1.0898530916162,1.03869938277641,1.00595535589702,0.982030661464922,0.990629931179046,0.945954804696391,0.925963186088915,0.89663137117144,0.934130084153222,0.912145744667735,0.900908010845711,0.921629940364494,0.940963821746558,0.919806072481831,0.952034364599235,0.961481339604905,0.971304993473481,0.938201824923704,0.946473519853942,0.946993232244717,0.950959404290129,0.982010122666607,0.973907461677123,0.976717300066158,0.987563198576073,0.957089570816057,0.990919129147729,0.992685371871983,0.956101558179755,0.943628522411914,0.958744440171705,0.978229914018768,0.991544264321418,0.960276035066012,0.948905351165223,0.929363944255524,0.970742205170111,1.00464969824753,1.0548242212378,1.00522307510485,1.01988760368036,1.02103967095968,1.03587848618628,1.05831094645416,1.01947695005253,1.00700621211089,0.958465685139225,0.988569561370933,0.962943331201055,1.00787008037846,0.986959546992565,1.0286641743035,1.07381852419072,1.08260974157555,1.06065004613738,1.08730007640818,1.12414957952395,1.11391773450753,1.0668158111835,1.02562280445181,0.999442541780288,0.958889787543201,1.00289944124213,0.97015861164177,0.976452626739064,0.929755543616137,0.960345399994238,1.00298493329319,0.954101971053999,0.920007768012856,0.899458708424498,0.882330824844859,0.90067263453338,0.8609880646238,0.850598003259227,0.881972049979287,0.852367130848745,0.85739359236199,0.818407948247754,0.805042396319486,0.798022255383689,0.821209219588843,0.852138970476314,0.815711456252557,0.797406015749134,0.823732256299165,0.856274967560055,0.843195035374065,0.81082976213937,0.771742539773479,0.765410854953727,0.765141226474999,0.76020263094635,0.764784366752751,0.728221866219297,0.738252043750865,0.737521503946495,0.765122470127731,0.768675574067318,0.762689670335231,0.784390393529263,0.803377479022591,0.798394570266546,0.80165059405857,0.798878216355908,0.787653286787382,0.783077255066309,0.815824775986836,0.799779149408438,0.797692369537831,0.808149284323665,0.806591896709864,0.80257956536174,0.830968128068339,0.842041771458162,0.874062171094381,0.866933560994417,0.845635210104161,0.82488597999025,0.794009565446445,0.768059099627129,0.758006565694449,0.784030176357817,0.803861444330547,0.766697185823972,0.798788413339272,0.827188562040322,0.868332581089423,0.830780519825942,0.805616861233223,0.839431426260645,0.865250575593511,0.875127484307896,0.901829218370765,0.864647000245963,0.826711856724008,0.82187562121196,0.826189257884284,0.840303419559075,0.873973554497689,0.845468752724943,0.815439329396026,0.804533525620463,0.822220696122649,0.814755070601639,0.777404863453505,0.741369753330215,0.735795776666418,0.755761015200474,0.790909334696248,0.775142043841981,0.751695719451167,0.769978470340102,0.74252473228712,0.722986947607031,0.697898301780633,0.729681283170366,0.765818529586623,0.802639855824648,0.822925036613277,0.822713646925236,0.854813007190736,0.841922789534273,0.85317392653604,0.887556212858622,0.922409999777953,0.925729985872447,0.916156375152995,0.91704111139224,0.916202696553038,0.941870880788553,0.928477151855312,0.887245914022075,0.891581686225484,0.879305127838221,0.858100026730579,0.882100107481633,0.919082122657033,0.883920338205406,0.873380918221133,0.890207048236574,0.893035140022651,0.918109286644446,0.93799859572028,0.928838769921952,0.967173916449362,0.984642710584645,0.948996148015612,0.921631998575202,0.929109171690448,0.898051940238208,0.930572398137249,0.927846991477609,0.956409881688798,0.919068266001008,0.948818367049617,0.974549659843054,1.00584814512824,1.03313422412256,1.06519289249416,1.11524238137969,1.11099655649292,1.08348374490864,1.04844738053038,1.09702042849058,1.11485208450923,1.09248708089772,1.11133324983609,1.06891366768228,1.01795249256884,1.03138783877095,1.05346891170196,1.04728090004316,1.09550341529518,1.13601299196368,1.09305040951778,1.10237936979616,1.15631487592094,1.10128241240486,1.11912264009809,1.16614945552993,1.15984248252485,1.13802590738751,1.08829076291556,1.04519069743524,1.06924174832934,1.09178123059727,1.04450632185465,1.05983935831263,1.02561264195416,1.04944957637081,1.05097268512119,1.02678468289673,1.03703371631471,1.07929173946637,1.03099143775857,0.993046706978614,0.953562796754022,0.994134939582296,1.01254037826909,1.04111771818873,0.997319071188166,0.95011716110563,0.909619580643581,0.931076547067045,0.967371056115848,0.935507162794745,0.932618548041035,0.925012506810628,0.900018997024419,0.878648236075726,0.918450322609244,0.922628495647097,0.922816796276873,0.924359027657623,0.914632622510271,0.907658240220666,0.87180922949672,0.878759928118686,0.919677049590773,0.877941237749221,0.907037653434686,0.88774006422799,0.878603362465421,0.911688084149754,0.877563126753264,0.8581215866181,0.83534771770756,0.868049248994873,0.878423219905029,0.89565840210141,0.898770014777863,0.870502298998063,0.855573078047194,0.875705115906239,0.876504750682622,0.851952318029382,0.816100505104162,0.839870848332494,0.829558848501323,0.811443985284725,0.834036046970448,0.842423582866665,0.839834764709678,0.846792691034313,0.806550285049893,0.827833198465565,0.796511113239553,0.758543750128969,0.743731115394067,0.77363345800231,0.770041436005587,0.781315800568725,0.745494907312359,0.710384245719586,0.734580151587795,0.725415868857501,0.699671408852907,0.707391970803327,0.739490244934843,0.729209932429256,0.719892337154672,0.69803698738333,0.720332009147809,0.695004233871698,0.707030194953444,0.678182584416834,0.67685151714982,0.655373359936355,0.642893889597105,0.659173303204467,0.666588331228034,0.653303315417364,0.680412133593308,0.691949152291984,0.659657084506586,0.678886894340084,0.651948330878175,0.650994118556149,0.632550231086337,0.621619226617983,0.62214747300551,0.602048444920709,0.630964036595958,0.65908200749512,0.628415872334299,0.60244932214061,0.595740196138899,0.603807301644585,0.628412790792024,0.616088764634289,0.625090039837356,0.61293737630555,0.599094361364153,0.595505986039579]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-88400b41eb9043dd738c\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-88400b41eb9043dd738c\">{\"x\":{\"data\":[[1.02085051028989,1.01243528978466,1.03823065219343,1.04075928495668,1.05140362371387,1.03502126312624,1.0058213441885,0.990197761583233,0.992364876790512,1.03049503143929,1.06114993202599,1.01696898269008,1.00775418259452,0.991562659387709,0.976096501152577,0.987693296997871,0.940633034820464,0.971791880096541,0.994934590748082,0.950712504516694,0.974364919763217,0.953680196829198,0.964567099280323,0.92680363443458,0.897588967667017,0.884407460979573,0.868208056351346,0.891428595673829,0.896631687862491,0.861100844915528,0.872378086988395,0.829507129131203,0.865307704555555,0.90253649607606,0.871230060285742,0.883396072529893,0.868720137883721,0.892512056085468,0.910183229244314,0.907275970510625,0.909358921190715,0.924853762954486,0.955240011243381,0.970275064032271,0.974592001230904,0.928807149851905,0.924951910776779,0.894302501119243,0.855047722650814,0.897118387759763,0.941578380034176,0.978980585582296,0.947583344222108,0.979730181117418,1.00523148571989,1.00210586158424,0.994844695192543,1.02100099319469,1.02850945242399,0.979864819747736,0.957521893096224,0.960032725610113,0.931897550713539,0.976691156527321,1.02291793961499,1.00710426638752,1.04041158736271,0.999539923360135,1.00349963247671,1.01607431090676,1.06344503974124,1.04206554242491,1.0337343627137,1.0471909856339,1.00922448185443,1.03837345766674,1.00883245305592,1.00718655118699,0.993982081615419,0.977357180481002,0.997331000132865,1.01462647264285,0.981467727183522,0.995803836813748,0.951070078286468,0.909436702961787,0.874060397468189,0.876428894915941,0.834875897987981,0.85884037923321,0.823592292382782,0.78954721010219,0.822308499847115,0.829616008474256,0.806229066511549,0.82772513573919,0.828181750231529,0.788966868379512,0.811234861223179,0.842385325450388,0.821771139573285,0.807543464353374,0.778099054404327,0.759307216690598,0.7824275530832,0.798269046306159,0.813689009327433,0.846579343847013,0.827814743120366,0.797319320917131,0.794525125620816,0.764282398538086,0.775474746351388,0.780473594276924,0.746869124620482,0.750486301865595,0.759240309978885,0.791487623654764,0.822084002449184,0.839166311480973,0.870578459219586,0.910755245398322,0.870272390525734,0.847150556107566,0.847767208182046,0.883007706078472,0.903654178648759,0.922839743715299,0.956596590354536,0.926975967665272,0.900114174212289,0.90638891427372,0.86825901154707,0.900210322853768,0.883766051731974,0.852565934213056,0.874602879198805,0.832124310184156,0.819678994867691,0.813642513845036,0.839594707579674,0.80357115556076,0.770071582647923,0.780863240804281,0.744085859631954,0.751989740681798,0.780734081723715,0.798486799958134,0.820065822740558,0.849963785240707,0.83355972020079,0.863272681704368,0.890635434188834,0.924418350259546,0.941930499103903,0.97729374670766,0.971729296602428,0.951009372352368,0.919569962222256,0.94741169587272,0.929670303291997,0.950051851025358,0.986331321146971,0.988168337744234,0.976466201099577,1.01774649721618,1.04960444856173,1.09144363239646,1.07913182129541,1.08088301934777,1.10854676024687,1.08325781348738,1.0838919966848,1.06351621485863,1.08968168532726,1.05642099745731,1.04077203965949,1.00965424622881,1.02353286523707,1.05255258802906,1.08261924036143,1.07590950360059,1.04167151625427,0.998568020553247,0.981096232270178,0.969821222289383,0.979834501261843,0.998082643595965,1.01423202587331,1.06302421209306,1.07846474800383,1.10626827500053,1.11167793807553,1.12443663671525,1.17892752337353,1.19893635852874,1.24711389374898,1.21854913875943,1.23523408150439,1.19685724320454,1.18182080609614,1.12905788374616,1.17665727091967,1.12323434055227,1.15370132724629,1.19025046204195,1.211715713946,1.16455768029594,1.12121147449538,1.07681064868863,1.06622064025704,1.06002301738201,1.02181547740803,1.00904338813655,0.989646168681919,0.992834397377492,0.994299048073402,1.01086883215558,1.05687620622987,1.01012723172695,1.03598869020595,1.01226873551368,1.05959886575943,1.0501651594692,1.08118349433702,1.04962375495179,1.07463685985022,1.11631073078533,1.0666089936577,1.04952353662261,1.03039642826425,1.04080756822778,1.05482677847679,1.05764734744849,1.01879075576603,1.02947737061375,1.03862558910599,1.0152694661289,1.05396548860931,1.00602536057746,0.979546170786148,1.00569084003958,1.02134557552207,1.00003183207947,1.01637258197637,1.00578872205391,1.0403722525907,1.08381992021954,1.08630674284099,1.10050787540152,1.04593259980058,1.03689254673203,1.06444996889029,1.10225239780237,1.0715336020213,1.05911840587162,1.02530311789003,1.02161193546562,1.01032257994878,0.982105631773139,1.03083994079431,1.03731069921876,1.04540437120214,1.08605400734396,1.04897534447268,1.03796572415978,1.04430154215392,1.03722483561809,1.03933128700019,1.02114082000048,1.00120602982453,0.993687460744207,1.02130390052001,1.00074738286974,1.03505710827557,1.02467237078438,1.00208115379574,1.00538227295547,1.02819598757493,0.980459400080361,1.02471533258119,0.996170707362857,1.03481333206439,1.03957736305193,1.06432394731889,1.08683364539379,1.12993266373666,1.13910888772649,1.17991001160464,1.18643197226266,1.23692649232922,1.25468223948327,1.24505854666049,1.26772976341373,1.22741682824246,1.17888384229287,1.23171812511144,1.26328124122695,1.27136665892612,1.26591993713703,1.27351114565039,1.21552649881658,1.20252512284011,1.24084761477886,1.29231947250686,1.27609048377118,1.22636788939122,1.19491819309504,1.19258674636273,1.20637412805652,1.22340610412758,1.24286850622447,1.22939427070547,1.24271056384448,1.25682131789958,1.27132235796706,1.26524956348601,1.23245927347383,1.19475697382888,1.22376918174692,1.2167321440841,1.27428439278952,1.25120170190075,1.19243241534125,1.17870830907702,1.16790288459048,1.15393575090557,1.10653851115488,1.10186549617164,1.0776630218455,1.11575348246114,1.1022583635702,1.06001305543817,1.03367526365881,1.01317842785846,1.00464392258383,0.973718776850756,0.982341121389887,0.995165858220679,0.980008427598371,0.942436694987802,0.898179164265088,0.858976233672184,0.855367930291497,0.843399906845543,0.834081892849265,0.84944398243756,0.85091785202789,0.808928036773194,0.830709872194171,0.815347367361219,0.853822813504327,0.893875990025243,0.915173760724486,0.927749533339211,0.921942092280558,0.951786497081015,0.93418590654932,0.967663243895578,1.0141333654943,1.00289551859051,0.999248922065268,1.00505032657559,1.05440025455226,1.01097834801573]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-4fdbb992c53bc1348376\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-4fdbb992c53bc1348376\">{\"x\":{\"data\":[[0.950338041572832,0.98699367433607,1.00894871032272,1.02873663170224,0.996368476693967,0.968980193509765,0.956904823781027,0.919617009182202,0.875445432206508,0.846318161144557,0.816761082022709,0.842118829404431,0.84733280382054,0.85883893784296,0.843225664605907,0.858920464976913,0.833415776399239,0.80747019399464,0.830095458081766,0.837910545266645,0.819490196583323,0.821000474118179,0.835697009762584,0.842427212932394,0.88316022609246,0.925557805620829,0.94323863180991,0.968172063686848,0.950971521661881,0.987967594739142,1.02574902623457,1.04052743365433,1.02177545498859,1.0043859522793,1.04644678634611,1.06176345279874,1.03423831798259,0.987018197931811,1.01697827920988,0.996383211247563,0.999881149390503,0.993833173865571,0.980314041840092,1.0084819428368,0.96554538912624,0.978783158326471,0.954643539254776,0.918484114627304,0.941216430328428,0.94489797405351,0.91416914564171,0.927853945501523,0.93974445201275,0.901838517432021,0.8578418548951,0.898426412315875,0.864282498933923,0.828866339827437,0.818749731586003,0.813465310082263,0.853803588002003,0.872805666069851,0.861300494353381,0.882223755543407,0.885486049660545,0.909891559293673,0.879698429703645,0.919100326066799,0.929028745149319,0.911179603244321,0.90060341398191,0.88512510194843,0.898303251770557,0.908775159568595,0.875966917725754,0.886484693986006,0.868698987205278,0.910242911088276,0.92330369931744,0.891450715021133,0.90477510489027,0.905912300373632,0.913398380121998,0.908140113127909,0.925432782377757,0.959650676577878,0.990846751560765,1.01327098355553,1.02073630035748,1.04853674522554,1.03664885551482,1.01419277239737,0.974133720817151,0.950431688266974,0.981256113201514,0.963516128560374,0.980786776826326,1.01274988942891,1.05604137085804,1.01312700368183,1.01827665439344,0.979250484907363,0.963505602672659,0.945750116700051,0.906415033272301,0.918562177421205,0.956838308582547,0.962108943810635,0.958349287484209,0.976694393003888,0.975288242769827,0.94888983173882,0.9266441083848,0.895797791892493,0.8857394994117,0.866755470077521,0.878094684685456,0.859181579196619,0.880385052051043,0.85639874761142,0.891101900415319,0.877691193383694,0.846941435201241,0.836075341246046,0.811320228350156,0.812013975501189,0.808345112618964,0.798839845382606,0.788914527196905,0.815363569105593,0.829010217746678,0.837559512365035,0.804621976271431,0.769660023164189,0.758292095030468,0.772431472287246,0.787002138929891,0.784052000706952,0.807881993638942,0.785378756380678,0.755272879371658,0.746029084865187,0.782954238165278,0.817861509254526,0.809400035673464,0.840582286669049,0.804860254299376,0.7887549359766,0.804430843844421,0.814679134220517,0.828664737808756,0.801707818367435,0.804432746889949,0.796242347773656,0.788252282455403,0.797630541955016,0.76501568560725,0.732660372203652,0.704967654181849,0.739472408088809,0.722528393008577,0.703830803302395,0.710126895820969,0.679203241637681,0.696970515662355,0.693669103774455,0.692639901204119,0.699397425362243,0.699122967379423,0.689607249184441,0.688883502840397,0.676490850383925,0.701151021197717,0.674333992936123,0.648237885486476,0.626007494759401,0.651325828743841,0.666698319133913,0.670789020503646,0.644989012819359,0.646914005940885,0.628007440578702,0.604487538837198,0.62698065493527,0.65251242525383,0.622931618179561,0.611631251701726,0.608890151118829,0.588641564635517,0.566689207305238,0.577920743563193,0.573181748957961,0.590135336427201,0.591864106623537,0.615306390068161,0.611004362773453,0.624807610661059,0.654223585514224,0.627689944388072,0.606321542780843,0.590849778986284,0.585691510218248,0.613343310827511,0.607779728940856,0.634203436861362,0.62431929735898,0.647301335579528,0.622721606693714,0.633010626650342,0.655003964011249,0.635036644047781,0.612019777100636,0.608981235023938,0.60070808175522,0.628729558006065,0.60202228504408,0.606279213545546,0.60493884898965,0.632662275956366,0.607066649124359,0.626345672615878,0.610677686789381,0.619749595477988,0.620447206605075,0.613533497910014,0.602497341105132,0.616888990423881,0.600314336970725,0.612005795044975,0.5856400491068,0.557298922951854,0.569710625055827,0.580882513525779,0.552633684631144,0.572143616283849,0.552826290712761,0.563015629251051,0.554162534656357,0.549938455407489,0.558333612108455,0.563464783470343,0.570504016476417,0.547993905850433,0.553926304892742,0.574334868346381,0.571753330288892,0.57270803624003,0.583309946857598,0.59802086211344,0.608672829108492,0.58787944733062,0.579909060402162,0.577362794471504,0.561546333242484,0.578258100054181,0.603232391654488,0.614066462973942,0.596723209223903,0.57626678281805,0.560233020787673,0.534389983874038,0.549448127815733,0.568276093621282,0.574756559884814,0.602154769346737,0.578254690949407,0.555844494872702,0.565924554623256,0.592941105588652,0.605961693838272,0.581957806511841,0.578225531275634,0.584003261739232,0.563687707361312,0.542861055266915,0.565099035561056,0.552659010382934,0.562113251935546,0.538676439795489,0.521893131925163,0.54017981030081,0.533246901636388,0.545126066223763,0.540045758165396,0.544289798955133,0.53037712151497,0.512890137933036,0.52617452036645,0.538183408599747,0.528495227665875,0.52068027556174,0.527099407854033,0.548621543736134,0.554741957623772,0.53192390002187,0.518051566594671,0.519740077937347,0.539788302438388,0.519877786510858,0.510932756509144,0.49354060586489,0.508861027174407,0.532173332983379,0.539061106989513,0.522421388292522,0.517488069971347,0.535453204176977,0.513146925264842,0.507165862186301,0.507069013043998,0.491040779981654,0.507093054610649,0.529664708816244,0.526757167570191,0.536130190937813,0.545469471487761,0.549260198190863,0.549656573226119,0.562083530520791,0.538228548642998,0.536206669659321,0.512286466863955,0.502481915839055,0.500273103229112,0.489863076627524,0.474457113676313,0.465738459534767,0.481556113321235,0.477907561351673,0.488382227020235,0.499815036551385,0.480491258350692,0.483321442393053,0.485391677398283,0.485094728274292,0.50008277377402,0.48311859709393,0.472423658836515,0.458350745977733,0.466197899852541,0.479476106556741,0.467064976111599,0.449359340090812,0.453148974275089,0.447777946302228,0.453751777218582,0.435518829985889,0.454624409152201,0.446634508575321,0.432329752085078,0.422874022128626,0.404522489835281,0.395784555235692,0.391841738576821,0.376133650391432,0.3635118834277,0.358716642458924,0.355062145506979,0.339462093649517,0.353452790157595,0.339576477993314,0.339434984023334,0.34446455365551,0.339258297232268,0.329909107602779]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-acac4c3f361c0b4281d5\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-acac4c3f361c0b4281d5\">{\"x\":{\"data\":[[0.952964767604135,0.967892063609861,0.972259694051751,0.981468380743775,0.932548037890959,0.939341804429995,0.914809465513908,0.885036260936478,0.878576960181536,0.867030415244968,0.888675185401577,0.932308736956472,0.952754643414429,0.952306010019634,0.909500060221959,0.939795465610912,0.909233396666024,0.908779548502913,0.948757171868846,0.968509918050374,0.986277103546627,0.955265935951096,0.913986683775974,0.917902688604447,0.914048653588533,0.945542086625528,0.92609793757583,0.92301281801883,0.909513078861195,0.91781549593048,0.926587045173406,0.953296387639999,0.911206805025608,0.898447573514382,0.934734769291099,0.950001880105458,0.969319726032588,0.94940472147049,0.924545974611118,0.880241432900662,0.848660344909269,0.869473987822251,0.859341014533825,0.823957518730568,0.826168724252224,0.827856285284512,0.798180065390413,0.780941670757306,0.809687984620392,0.796726010600352,0.763059738582003,0.730778596020798,0.739201630044764,0.759448686387461,0.742018350673078,0.778114266701913,0.755687669293659,0.78834140138736,0.823083544367921,0.862261653066352,0.864869161716079,0.858995855175738,0.853239928680876,0.836436451102843,0.867522901893882,0.83769981746807,0.846539829362071,0.876831845820774,0.894691196996072,0.933128483315744,0.937276655754481,0.93187459438474,0.951133332215772,0.917266386121073,0.924346121842286,0.883122061976953,0.921053305081266,0.927897676128905,0.945888421462601,0.96929718164483,0.932541457514381,0.913441800086103,0.888490369230815,0.912800570258293,0.942421023752555,0.904019865711749,0.921339998121168,0.933001465070618,0.954238283082681,0.912331622772247,0.891864324871376,0.858738897908482,0.884890110382558,0.845148457362641,0.853721037704935,0.852172216813155,0.88750938917803,0.877488633601331,0.837594815995835,0.824614343808003,0.8220691668473,0.83115688719709,0.840483387177029,0.860162509886641,0.825564068511337,0.82790842446312,0.862776534545979,0.885268890358579,0.91736931189713,0.953144189863997,0.989083537569237,1.02894470488483,1.07851602548994,1.04315343985144,1.03025063579814,1.00268576474128,1.03088393063898,1.05199499638121,1.05071126694531,1.04421578871154,1.01651924740905,1.06500099239634,1.02216868719386,1.0089744537087,0.991821666074079,0.973649782485837,1.01232639658494,0.989881201640624,0.960936438165483,0.914849646500273,0.900285531785623,0.873973264872196,0.91531927270065,0.928185564721916,0.955447727026729,0.91628704171781,0.947362890828876,0.916149749253599,0.890298293357385,0.870696307816467,0.884892896705397,0.869810275461882,0.833883893780396,0.86481973744647,0.832887676466719,0.823354783324033,0.782478791114412,0.785795667612918,0.800317369925514,0.839858661831523,0.840286716607936,0.804152922167652,0.824858996575807,0.83224391749656,0.838516063047566,0.874302690613102,0.85790283307934,0.850567349679203,0.82818946584019,0.822453041523673,0.83981627624569,0.838826862463817,0.811201192789068,0.829958898468826,0.837543700758001,0.811090724915881,0.830822203328036,0.85463959223586,0.870141615292387,0.894785462357455,0.909476059710587,0.93756690320375,0.969383151477161,0.921262979753984,0.948146482743441,0.905662468296062,0.930748963738422,0.976659505987303,0.963862529739769,0.994906717964521,0.969719545746965,0.966235785857184,0.936644372499681,0.942152160024042,0.946256935856248,0.991181592088544,0.96819488653918,1.00380401550175,1.0121400084164,0.994020105346488,0.954223131171075,0.951380818897395,0.981256233537372,0.963181773653886,0.991069135655628,0.989432247355579,0.975260262956796,0.984802255504821,0.964752867996825,1.00581972301366,1.02952392067183,0.988413091099523,1.00144011309055,0.966168090720423,0.992531717942184,0.995617726488438,0.983348435932687,0.958389954835457,0.912619070176522,0.884372783829605,0.914519263211526,0.940287136551117,0.941870465606002,0.949249564751004,0.91032456958772,0.926602028062558,0.929378856659862,0.887842772960489,0.912956371168834,0.92285320497406,0.947489309404679,0.968376592558425,0.969719529698517,0.956905678128749,0.910124717826394,0.909212203455894,0.903790504654638,0.885748566282469,0.915865042957363,0.897549592952948,0.91525171778034,0.90809030190524,0.888047812517992,0.868128284492731,0.897243313090636,0.922836324063781,0.884125716385137,0.922314469790289,0.913827532170758,0.930370927506836,0.924546061105729,0.887528425872234,0.847036735953231,0.859479346340091,0.818176243748534,0.797570676737852,0.781219459653178,0.764272047773276,0.796502727634171,0.76517149440301,0.767157411516983,0.77738512269234,0.792202999355113,0.81664344343468,0.848382970050274,0.817584050821698,0.787684202560707,0.789788457382002,0.759284728322135,0.791977103225263,0.79122211094074,0.809012065847971,0.838467479359099,0.848684905286056,0.819484816497828,0.78585031717353,0.821953290267336,0.853842713464067,0.856129978121906,0.880398765167797,0.883739938318778,0.886970002326886,0.873748839122507,0.890641275546386,0.916600767197374,0.874973444309544,0.865820136009934,0.850048753939522,0.840054685396395,0.878037482529193,0.879757992700162,0.898664623777508,0.907776242688363,0.950507586193355,0.990650997496938,0.952209580492676,0.991645774039831,0.947416039627602,0.945068791215063,0.987195022682164,0.950872065330076,0.925912910028357,0.949210486761841,0.927568523963524,0.900534016811013,0.915717138671061,0.95902342542345,0.915750901300291,0.870142878722443,0.871356835357796,0.833843346882778,0.808273895940837,0.825774436136263,0.80001822687876,0.819101314539453,0.805656943242086,0.799416117070974,0.813318961893585,0.777950088182207,0.756636483185469,0.722213210253534,0.710456883821766,0.702556451344163,0.681178818503832,0.697525518619146,0.66815355324685,0.69794175990527,0.715472648738751,0.692013279589836,0.720696179446522,0.71222731436571,0.705780347512963,0.735192535860735,0.705285714017427,0.729209799290815,0.702761920649183,0.700681014158222,0.681439984822799,0.699355651324333,0.714981856391521,0.687687587617663,0.688643627404212,0.717296782426254,0.712902277206225,0.684068761570208,0.686201500437124,0.713074269621516,0.710963316494233,0.693064861893446,0.702778594256128,0.727496824891718,0.746668211703849,0.752199377642661,0.744228193188087,0.770809576384217,0.772574957124501,0.745842739730706,0.745135550432645,0.751590698778638,0.78013836624223,0.758492517876424,0.788033254680781,0.806998769077425,0.792636392198275,0.801151542475785,0.793646601968348,0.754766502098554,0.768871953410779,0.761672714997851,0.78837037097135,0.756621671758828,0.780238462845182,0.809837673892039,0.832547976145748,0.803182840239057]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-dae9933e6c8da9350b1a\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-dae9933e6c8da9350b1a\">{\"x\":{\"data\":[[1.01872188132256,1.00237105416737,0.953465984854603,0.929287002530307,0.914478647101782,0.884384611468455,0.859297812454484,0.824088051148037,0.833377130492219,0.806715501871947,0.834341193326967,0.823572924940474,0.824240767880026,0.863260671037904,0.902956602786359,0.918355361208692,0.957182264366064,0.952341483636261,0.964941382798466,0.932903758489351,0.919565708734112,0.950861814147183,0.946217681594123,0.929192002247211,0.920876338747424,0.899084967763817,0.917861044520738,0.889483172693834,0.92337918203649,0.929575643798705,0.906937336799689,0.923190539376998,0.923748364967895,0.969424090345515,0.952964517428506,0.974711810146842,0.940131281303068,0.928617164764221,0.974472627491373,0.940362033021735,0.984051044799549,1.00323666601581,0.996761718744519,0.985845704444223,0.984555080508594,0.963545093144898,0.977258136980893,0.986765171729485,1.01681981848715,0.986652108463352,0.992800532269,0.998685037980904,1.02287457835114,0.987423000545573,0.942477447571934,0.95396566752218,0.949829515111269,0.907810594787976,0.892915639994848,0.921229438051496,0.909208704188337,0.913373602977178,0.949697360339044,0.934918471548181,0.974806327756608,0.975947222829372,1.0054845400196,0.988604061928677,0.99946074777119,1.00495721195938,0.966745598986964,1.01021296720804,1.01435870461142,0.974592564567065,1.01844528507322,1.05891652509779,1.09110400163925,1.06048452432139,1.08055968347441,1.04214084493957,1.06965692656633,1.07354373127878,1.11984688384118,1.16041430946246,1.20566953345328,1.17295432010787,1.17080077077509,1.20858050523133,1.26093512390027,1.31500246356397,1.3801344765937,1.35244621464083,1.36992083010424,1.39776990183936,1.35466508895612,1.32555700822934,1.31086111466751,1.34556057578491,1.28397953376406,1.28461334359289,1.25811874613712,1.29306383060863,1.2855936580849,1.25012982136218,1.22454461038091,1.27488228239976,1.2539361232488,1.27443168227876,1.26762722791306,1.29613518124165,1.25708455489341,1.25758266522636,1.2338827270148,1.26037503153,1.23725465598344,1.28406434865073,1.30280122052374,1.24839874385628,1.29876076696338,1.26323489915201,1.20971482630162,1.21247722395934,1.23803858214674,1.25578334407521,1.24610191398166,1.21003224135006,1.24935858971245,1.27051171125493,1.24072510589545,1.2843685545585,1.25060105763823,1.22694533901075,1.19526034198913,1.18345800599578,1.17214637613758,1.21086396084607,1.20403493565207,1.22311821039615,1.20124212721568,1.19575339456252,1.1377252697805,1.17487031331333,1.11823803196031,1.06814301840184,1.03407319987869,0.994221701283003,1.02225878764697,0.978599303776658,0.94373070129565,0.97628513163067,0.963435807894265,0.965267288075247,0.999599488664552,1.02516528820524,1.04631846281325,1.01154516708436,0.976105672809086,0.977192556184164,0.929386725721627,0.895032067967732,0.917592472718186,0.892766554823264,0.898596382131993,0.937983580061847,0.918461284990393,0.935866286541674,0.933195321493414,0.966769803981016,0.968990336040524,0.924608779959265,0.954643259801052,0.953524537386562,0.994028854449977,0.994981575479528,1.04104737190546,1.02047544322723,1.05257484701749,1.09143211681459,1.06448444635704,1.01584038134472,1.00748844740799,0.991953895995612,1.02370754967305,1.04635753862441,1.07757966219646,1.04378290953786,1.01947705336544,1.04009814435313,1.06713456483339,1.11032029251036,1.05764142903868,1.09974782133411,1.09164966475653,1.12010234534174,1.14311725320179,1.13029564681312,1.17278445072425,1.14129292630052,1.15386521154606,1.12467858474823,1.12410037525552,1.13746264198782,1.16977484724368,1.13632553169594,1.13324194088576,1.08223526782899,1.07542336699447,1.03663354375445,0.985979406859901,0.99225977987297,0.944364705280891,0.909032281403465,0.908973013169163,0.923649201502373,0.902097357698131,0.873149652392003,0.896043913105651,0.875189311746835,0.843802052890509,0.850708518839427,0.82121104187674,0.782702755545493,0.789986605966483,0.807672268926542,0.790472613794453,0.766859055356102,0.730198465310044,0.712536405799177,0.736077306983022,0.708705980392163,0.674126070956102,0.66661255312594,0.689191468384126,0.697431531425868,0.723235686682647,0.754084803308709,0.729037031588012,0.712196453511322,0.736951621912681,0.703736974158478,0.671560315559092,0.686162060425792,0.681098013484233,0.683499096381554,0.705520649657224,0.674791375926104,0.660523948400995,0.648325674422711,0.653949675865915,0.635120809872992,0.63453295046981,0.604871182939793,0.619569989422055,0.593400008300934,0.619275616878676,0.64531752518563,0.664150927628135,0.657288573738824,0.649824524280543,0.632378016307731,0.639678379261462,0.615364346675773,0.616842350906655,0.62730309096004,0.635692573660199,0.604967465320735,0.628268255955776,0.657169611715853,0.680491823174995,0.671090223002508,0.638773454959535,0.65879413576812,0.675190479954119,0.70222201713734,0.713462828622638,0.70345424394214,0.693280739201107,0.675309773234233,0.680279019925781,0.658238607329934,0.641804632525768,0.658444344093778,0.65639147816486,0.646355237831326,0.647863329057555,0.645302829738078,0.673091546847724,0.674460508176594,0.654906091514794,0.649691719411186,0.678662370543393,0.680408415272871,0.690862939461447,0.707878860636966,0.701139747850705,0.690234713907253,0.692309149107302,0.67339643454755,0.68309120281308,0.664264684683327,0.649496259327567,0.670184934790965,0.693776589308269,0.714913890442422,0.741647100741468,0.77049363916811,0.743330590459049,0.768788606366154,0.777172980194157,0.770568668414027,0.782699760395035,0.792917933129932,0.807342391526227,0.820427089204291,0.844388544385854,0.820662676921351,0.82064461817329,0.797630752868671,0.798411223714882,0.766051320911974,0.780794445955996,0.780759145615809,0.757153564086962,0.745590294097282,0.775075279234968,0.771458005121116,0.768393053562468,0.782271525387643,0.807273324826756,0.823158511054011,0.84771884153033,0.824000837502977,0.84253212464176,0.833743600049275,0.837541377595895,0.82914193186622,0.851285093555706,0.860497070351742,0.902251897436769,0.919909615355089,0.885324412589359,0.924518218863993,0.882254472505331,0.84636418891857,0.825615449312733,0.802898110087206,0.841430916375454,0.832972099557857,0.840392492265274,0.835085716371715,0.822640400539333,0.792116222810431,0.773948586280881,0.806147631181056,0.826260339167591,0.83019284278962,0.831797439034917,0.8308472485917,0.856590453154995,0.874563155204389,0.832544314722899,0.832786280247324,0.834255098446175,0.852416394834146,0.885444474903481]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-a7f1a05594b44785d64e\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-a7f1a05594b44785d64e\">{\"x\":{\"data\":[[1.00837913490832,0.976739685980307,0.980777392188765,0.957044067570476,0.950367060348711,0.916584626826921,0.905582076089494,0.898033435205451,0.857352658800778,0.828788132174547,0.815334268872824,0.804512642626983,0.811203725180243,0.805972233428283,0.792018788828993,0.810824778853593,0.833168888218335,0.837305874615851,0.828842812125127,0.830730983208134,0.842802399460722,0.863289074994093,0.890834465004441,0.857981113830193,0.842511246529197,0.863984700342864,0.890740103916658,0.870618370998664,0.903757196302256,0.868424571090648,0.886252462038448,0.908637080090507,0.863358115963835,0.860482919535441,0.872401669899241,0.895805805873212,0.864751846500069,0.89731953529883,0.92419257701193,0.941596503859237,0.97124073671923,0.927669134020617,0.942479248548855,0.927188458683405,0.942039591997203,0.94249214516565,0.963598662511598,0.990798358524022,1.03187991988746,1.06997462481493,1.03632210390853,0.990595170778821,1.00179488877964,0.964411237512064,0.992729287609242,0.953591815166066,0.972352457783431,0.984497514995772,0.992533407893868,0.953245419212575,0.922429337653645,0.900606555474762,0.868748873880341,0.845661955021224,0.833961601737717,0.797959036808727,0.80856419817718,0.801487939819353,0.78966844640144,0.789403209201871,0.814012904268648,0.840430097013289,0.821290595604195,0.783934730608648,0.802139845622093,0.825462737353985,0.851527921903244,0.812260937945654,0.823699440123253,0.829090637716678,0.866663688196632,0.884988207774078,0.926362559085153,0.899827826928862,0.881069495307862,0.916936371645557,0.919438289480627,0.913538966571413,0.928210540082024,0.924473885408596,0.901900693337113,0.870054278167145,0.876050382351766,0.887443374498662,0.865166183183258,0.9066446791221,0.92306370331211,0.895953755121694,0.894816346018839,0.868268595973592,0.833621446566446,0.870531824728978,0.849989727364775,0.815014604704973,0.852590339699553,0.877202363487503,0.912517495466018,0.897863884579506,0.858417078505811,0.851841904579893,0.876849122847521,0.851553794429658,0.892763184108976,0.922499423308188,0.911638423033666,0.929558521518374,0.919378761870094,0.897107335455546,0.920388951196061,0.958623415454631,0.926332244331227,0.906220860343252,0.888000548566518,0.878332218873056,0.884050261354487,0.901842821293677,0.937661439936839,0.976766012740251,0.9377316910418,0.980121307413734,0.97439095981964,0.98870510089895,0.953812940337724,0.994532879190045,0.945544128162685,0.98725769395742,0.937976477217021,0.972570860545361,0.963569646495358,0.962022818696826,0.977980754477931,0.930394378802454,0.901274037795573,0.869822059088902,0.873931455762463,0.907074770281326,0.939867556832225,0.924269220586216,0.890570615167842,0.912420854764844,0.952672724045176,0.979694825748002,0.943695298746747,0.987646231997278,1.00780588523333,1.05247560336816,1.03783592855192,0.992664361681617,1.00173111406169,1.03123008756282,1.01043208071975,0.974240807198205,0.955657468930272,0.958635013553121,0.993250211162451,0.970091767417993,0.979212726285579,0.930799095816694,0.895209285834204,0.879240005698537,0.871356439077627,0.884060404749921,0.905511400773599,0.871068250775597,0.910106159495021,0.900347635607345,0.9072533252705,0.900326628134369,0.856057356202278,0.847813284574852,0.808008997978663,0.769560162273716,0.784815309235162,0.762780166135835,0.765979081460826,0.739205249295254,0.730285395787253,0.755904956817885,0.757617866561355,0.773130262833827,0.792673239150408,0.817823758247458,0.845117644249062,0.81992249099304,0.843968230670529,0.830116025282618,0.796520084957057,0.770425961721186,0.750327773278052,0.738842791109308,0.725510923795459,0.702987363990305,0.669124952036297,0.637873868556996,0.664660318274124,0.690590407208772,0.714271328082452,0.718743410180322,0.715530459124138,0.681940639190819,0.648421539398155,0.656950087223086,0.635553626130398,0.658624795805554,0.632833441481864,0.619684924453074,0.603030569722616,0.612258712984258,0.602573350443979,0.604533117452017,0.626867815578694,0.647660489966461,0.657081577173503,0.639319025975634,0.641775750217175,0.664592128306233,0.661589222286853,0.670140675175726,0.700461117313231,0.716483016020325,0.686375846877996,0.719679779355275,0.715373575884053,0.724954181369443,0.694360365969187,0.72171525934316,0.690541064755893,0.681197582105102,0.681908297623328,0.679439744036892,0.668543986625631,0.693569181590627,0.702639955776522,0.709573990480425,0.684937752245854,0.659654825569738,0.637059204624004,0.645225613560875,0.652794930617674,0.666046067466346,0.685356678106548,0.695416815558258,0.727877329565639,0.755686352711083,0.775366318051836,0.74632958689022,0.782935119211974,0.745688843332177,0.725622562268291,0.722097630963093,0.728520963201606,0.722808090671295,0.710147283071716,0.684918334436109,0.662671552701446,0.672045302518338,0.698986102520128,0.727206972353044,0.760005580556752,0.755147800025725,0.779271492020564,0.79123049749373,0.819836640935723,0.821977094867784,0.828000383225968,0.809354888190911,0.81517967096865,0.783862840155829,0.820465293998221,0.796497721261059,0.818604547801255,0.817867650329048,0.813138199626788,0.810766275688261,0.784077526989916,0.80169920573588,0.800902962026705,0.762327307026179,0.769489297112179,0.800834770203688,0.828778634965635,0.851887226351257,0.818001899796602,0.828239006466874,0.825170134698083,0.814034344009534,0.849868023787133,0.819086482452551,0.802832823494069,0.774125320758994,0.745440487386572,0.760579801060334,0.789169444290054,0.757297107399989,0.784456834697853,0.745439189986313,0.775005725175776,0.745037942918149,0.754747730765089,0.732967467197093,0.716126302138357,0.728090000672609,0.704839076222873,0.718553606505604,0.75030850724272,0.757648358974072,0.775995838262219,0.812920461846693,0.842006061255073,0.882042670400406,0.897248455997515,0.881315209509562,0.869462512138022,0.831380525171351,0.819279498896579,0.803389201200134,0.776977194471345,0.756997314742437,0.771700924476712,0.761662935025966,0.734865658019394,0.722314092955019,0.712919372614248,0.747725086978813,0.783957294598603,0.780088582114791,0.741449427029039,0.778209697854899,0.768738827831353,0.770468501180848,0.733055719013207,0.750774831974116,0.760074312679003,0.767505609660736,0.780378235799454,0.809037184361938,0.814683724623268,0.818674369463643,0.844016372040409,0.869245994669514,0.851633220456363,0.831206011953131,0.827811531959678,0.864774080387961,0.822068923790272,0.819468752314623,0.848502766378716,0.88989097825739,0.906110225575561,0.917370619693039,0.920689870345417,0.888167414262122,0.872689077580305,0.913599976930555,0.932291543355122]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-4f69295c07090dec3d60\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-4f69295c07090dec3d60\">{\"x\":{\"data\":[[1.03077938579954,0.98626814726168,0.982779461271711,0.984232350473315,0.942780454266846,0.965072361461087,1.00067224000407,1.00058644150322,1.01559613695044,1.04759086984887,1.09813666246513,1.08194644387794,1.11236748113905,1.13926619194783,1.15489441522947,1.11393071419836,1.06533722979844,1.11147693303527,1.06651200583279,1.10329670659753,1.12180121612321,1.14268962066415,1.19786656909408,1.1758950198387,1.1215773022278,1.11979285860404,1.10538587945891,1.06808989862353,1.09242563909377,1.06330214618631,1.03642198335815,0.98711665294525,0.960326977496381,0.958610239692952,0.938214821001296,0.900426294506362,0.892300164758689,0.847731513165751,0.887625438966012,0.878119021776253,0.904096824064278,0.918988957641651,0.923172977597223,0.89467402570799,0.919340878917346,0.87465096849369,0.898002379692373,0.908585589643089,0.923450486106592,0.917130505530085,0.901656864566899,0.943499608823262,0.921286128279912,0.898794489115655,0.905793118824592,0.887902407988299,0.857045267484949,0.831666549236578,0.813573508110094,0.848922666045523,0.842069179901906,0.813140380758554,0.841673487147974,0.830108424729,0.81502605207723,0.802875570681299,0.790100570450857,0.802431127430263,0.806723852757068,0.818625273719125,0.8353390629483,0.863997148197377,0.831664196760712,0.832936442400468,0.816343051178628,0.84835960921286,0.886804199517386,0.90876712702868,0.951033769555833,0.942820467450377,0.978541900024906,1.02191955706095,1.04600233267097,1.07771539013421,1.09524315648839,1.11694301354907,1.10388190055434,1.12443730132911,1.17196150470411,1.1655755142146,1.13205755825884,1.17849457409009,1.19091599478805,1.17741645203833,1.14245832056637,1.11572827676566,1.07381893884083,1.05076124815926,1.01329107182967,0.995799708908123,1.00345102926468,0.956806902702149,0.933310625419225,0.972715349092401,0.944470952917396,0.925311038577383,0.96355623201662,0.925281302514506,0.923248224723705,0.877196261471092,0.909688139943464,0.921236852887427,0.939003050162363,0.965470654437913,0.946792781040812,0.939253243175122,0.97670979155625,0.967397143875697,0.977801981479894,0.961924914149059,0.992869168707304,0.95740369970316,0.998300731229169,1.01015272027569,1.04926264987053,1.05256040346724,1.0895616826478,1.12748919070504,1.12384502937339,1.16461790590578,1.17062737702203,1.15118754163253,1.14096051777107,1.09648784637431,1.06661685969136,1.06599454600062,1.04976430517702,1.00127777132605,0.980260541985868,0.963636832587448,0.984179332980791,0.939065490083891,0.948976086469576,0.995125802061036,1.03507092694927,1.00645898663036,1.01378700657225,1.00522954102471,1.0250812419203,1.05153258895796,1.02092611469781,0.991145450230977,0.98461882442057,1.01509292787995,1.0113690633088,1.0105658911554,1.04458431602711,1.02550145449043,0.995223361448917,1.03592655313909,1.02884678893904,1.06336199224889,1.05174663260588,0.999307681124549,1.01121345197115,0.995013067835546,0.989875261803371,1.00220125741268,0.980972716660038,1.01933869517652,1.05960225050862,1.0739223597629,1.04630410631738,1.01363379135863,1.05308715691738,1.09551593101321,1.10079223182249,1.12029558188838,1.09334739167635,1.08664976429107,1.10058726410168,1.07176169405889,1.023490796279,1.03874207155927,1.04931888305806,1.03690325780569,1.07629939339187,1.06861437439796,1.03022167105837,1.06568938955064,1.09335093574038,1.06126763331508,1.03148478422733,1.03902071177806,1.03760120340402,1.00531001002789,1.04504281050813,1.08876321335416,1.08450926554231,1.10101918782591,1.15254276424242,1.15984576200882,1.17707251934695,1.22692632629271,1.19874682898227,1.21246146134914,1.26419566782775,1.25139991669306,1.29723910866419,1.34206468290176,1.31725439960142,1.26840476858615,1.30308415061409,1.24695796107184,1.20687733449784,1.17064588966504,1.16528682552087,1.15536341055798,1.1959883420392,1.15463612806836,1.17475085910696,1.19094215325574,1.19684961129787,1.14141468412161,1.08876784536127,1.04255908638093,1.07837875893136,1.05338010052307,1.05864684573249,1.02606255220263,0.980673024233302,1.01499043450046,1.05186048049164,1.08203135345188,1.05262790113262,1.10228498329017,1.14670226241823,1.10745807454064,1.11204417271354,1.06647624748254,1.05131770757902,1.08409802683146,1.04993817794387,1.0964937669209,1.14399010678429,1.09988597183925,1.09384220495408,1.12158972092417,1.10998848735362,1.13347354242558,1.18078709611805,1.16172135087177,1.20810196809279,1.22429436791409,1.26102198540003,1.20088487395863,1.2026687076286,1.14917727964869,1.10820768035816,1.09811402782222,1.07750295161352,1.06083777443586,1.01046932650768,0.974157989974571,0.947478615355987,0.966023210551863,1.01072869483097,1.02562095918007,1.01346190904905,0.986565971405109,0.978861855755172,1.00819794035875,0.989055365089969,0.941057330969317,0.918040097878226,0.9389320786017,0.912046458619104,0.883341699805787,0.922087629991128,0.961165696664412,0.930062490127928,0.917562966521383,0.937440606733493,0.917813784886806,0.949660904671854,0.987771665034258,0.953800696419511,0.999528607695698,1.01111280405338,1.04581528698102,1.03368351430616,1.0827999712583,1.0989641924382,1.06483441275846,1.10238078409539,1.08625828040505,1.13683762886014,1.13064635160285,1.12741290604619,1.08327304404044,1.13276726496967,1.15644146017954,1.20048542561786,1.20665433613616,1.16761235566785,1.13439742769046,1.11571294859143,1.08082472170229,1.0636562340793,1.11409159001278,1.14847191601765,1.12676430936721,1.0726293972281,1.06161480681382,1.08519850994934,1.0501101388347,1.07466750794586,1.08761252666766,1.13665697050065,1.0819055380997,1.09677113847854,1.05944745733804,1.0398609103305,1.01310925736967,1.0288766124677,1.0756227933143,1.07685432487529,1.05247271968863,1.04179506561005,1.05960932792887,1.11200897273453,1.10389752781532,1.15670520474639,1.13700101188466,1.10909814314905,1.0987098819321,1.05463820758692,1.03805531168958,1.00243212763083,0.996470484684524,1.01924947687199,1.0474581589739,1.07876373254513,1.06630574198256,1.05005502898631,1.08367569961213,1.07878107459547,1.12204443246036,1.1754163597809,1.20109230665603,1.16249278862484,1.11434398552817,1.12527261310802,1.16799857130334,1.1666857739073,1.14232287929194,1.16342242887416,1.11051574280207,1.16003348465481,1.11060652444586,1.07718806944614,1.03002198038004,1.04446771150915,1.06033527535156,1.0690330122775]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-e1d7fab62f1481ee1579\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-e1d7fab62f1481ee1579\">{\"x\":{\"data\":[[0.961211011605337,0.983870405324187,0.958770115519545,0.920866103103368,0.880424023014134,0.900743194850027,0.858075898704471,0.857908043895518,0.876484961954302,0.853936177216815,0.895362668999931,0.914984841940566,0.910175329911009,0.924811087911293,0.91425114881897,0.939031432176667,0.898466292903802,0.865773375498161,0.862319532715834,0.83406239707485,0.833297088857303,0.796594666681985,0.829341555343388,0.804440227448054,0.77711510418134,0.781987039883918,0.797797644472165,0.772953281460985,0.771008427760652,0.7432912483475,0.709239504179911,0.705722920627638,0.672319005540057,0.67819011115022,0.690152014693065,0.664044956666018,0.634658382941806,0.661629472716531,0.693487685335971,0.721868977597733,0.699478619685748,0.675436852935778,0.666301694488578,0.696629178529906,0.710190747855514,0.707520183824859,0.674990379887556,0.705856735969382,0.704813127581854,0.727989388217366,0.734476713159968,0.763809820427462,0.77560437575271,0.778984859458646,0.785875852405711,0.753309415727027,0.774029831660149,0.797725243763488,0.780951683184936,0.750093826186917,0.731249201802627,0.735724013093485,0.753170287459247,0.728036210097259,0.712807888476698,0.696116181558363,0.694441587101751,0.68216971041415,0.679203065440436,0.685472327311642,0.677086038006149,0.70875432844425,0.699000714323179,0.73023037533047,0.70495718797087,0.719105096604957,0.698799735006061,0.712912012601106,0.739779602449884,0.77499297285516,0.758458875202874,0.733952081216379,0.722313681241685,0.751710869944251,0.76237834989409,0.785130083740581,0.80196129217748,0.775369719498697,0.774200194088347,0.773509890849058,0.746583225007096,0.735029587764793,0.759600909868451,0.749517979804034,0.720350043319742,0.684585511683587,0.709732283728767,0.741278592991688,0.765123955063446,0.73741824172338,0.769841995604644,0.765886227709889,0.778178611701151,0.799405081546746,0.823951738016766,0.856273067473132,0.826247507444842,0.866371110500573,0.847006768382958,0.810973046359526,0.802378781539608,0.774756745550294,0.785713910947971,0.76366827453435,0.748121092235542,0.760405170634509,0.765545184599338,0.760408991552957,0.745465209414516,0.729294612438201,0.73782048889301,0.774649993328143,0.756542709723355,0.774297299920815,0.75901719474166,0.780107941813965,0.743642852933202,0.710887022792632,0.745889548501019,0.774077645976044,0.754167712428971,0.756604707390045,0.749647147604815,0.732857544243515,0.766188510838508,0.739142346426755,0.707817329452456,0.687227083928026,0.70810824739206,0.723191146254564,0.746394734890662,0.730429890442246,0.723957870127356,0.760016797758349,0.739330855908873,0.702954085959276,0.679352071872547,0.678823203725088,0.672706408031992,0.664934958840321,0.64339913481318,0.66909441943295,0.66120446323514,0.631151472242829,0.660326211771053,0.672184285170872,0.703202976326015,0.706019976375756,0.724809792479804,0.719386503904135,0.694519574356962,0.677856955949053,0.685690637928827,0.658141935707658,0.667074133408153,0.638072394785633,0.654748287606255,0.629583189300756,0.633826429749386,0.641272748690192,0.629813029858296,0.644109393591831,0.636884167215742,0.606419766987572,0.61428569806101,0.619213586570523,0.63558762810728,0.606050360057154,0.603800064008364,0.607772320652586,0.592833491428947,0.586356006551302,0.580803547516618,0.561071492625685,0.540525043315415,0.558958911308178,0.547435827228182,0.559535856068609,0.543464228914822,0.545880466283603,0.554479554781926,0.532991849613304,0.532763422148481,0.548242621470904,0.526774526799449,0.517654833725596,0.523345620510647,0.532745136784078,0.544329740072607,0.568606392014711,0.552742772262177,0.570409092400523,0.569547196145203,0.59633547907422,0.626071111839159,0.651912665911532,0.631589257155387,0.618848520524119,0.589178247141219,0.612646653384233,0.582527984783086,0.5929339850096,0.584228038917622,0.580927359314589,0.569269990441484,0.5411318227267,0.548934704766203,0.553803989025525,0.571448542414887,0.593664759297531,0.622421649153589,0.593085902492864,0.579850615814085,0.6000420352003,0.60717013434579,0.61616175666227,0.590113709897076,0.611993767623064,0.59841138023413,0.570161040831636,0.564459623291882,0.545251303799686,0.528879151544958,0.522142292744235,0.503152598437732,0.502662882259332,0.497126500022839,0.496934109225012,0.512973289899813,0.502001315416478,0.50544452073602,0.480627413191434,0.479965620606643,0.49385779666488,0.510344922229407,0.489380419151101,0.474657729613811,0.457016770807256,0.436302318311751,0.441079376860241,0.435025593687869,0.431647869317473,0.453218255554695,0.44406077856282,0.436286220683428,0.453717214647959,0.459592460351376,0.442755629874378,0.453083474798403,0.450738422896046,0.435587089305313,0.432582695268788,0.443060449134613,0.450911140213671,0.445616413468865,0.440726396729145,0.433658114697909,0.438046639348972,0.44555923469479,0.458109589948721,0.470069971743109,0.453486564811261,0.447609302070943,0.456086916441916,0.469328473497586,0.474280211429245,0.492564176990938,0.51454899495259,0.495311672283217,0.479767764085977,0.463974852153838,0.442384376648972,0.427655279965503,0.419702836803494,0.403119247023072,0.393195482246649,0.384135542851767,0.39271932889411,0.383136075920843,0.381513745762491,0.398375260004781,0.395262912928742,0.393383514271844,0.388063150297381,0.385322876375908,0.38322670580641,0.364569838458563,0.373908592624473,0.368989588508234,0.381752302593646,0.363590574443589,0.370181174670618,0.380499315489222,0.369883440954414,0.375290102904848,0.38761720496186,0.402139410432051,0.404625171085151,0.401489259577102,0.407958280805192,0.391003957464567,0.392582398556775,0.408342211124391,0.425098911860798,0.423376975390159,0.411055827536936,0.426502140838387,0.439246911411097,0.447751960355909,0.450358864145239,0.471486787485653,0.458360181510551,0.440602049392665,0.427244968584062,0.428162645957615,0.441804585491375,0.438079734721153,0.450480789690171,0.46494921586677,0.441774608136501,0.458652575468538,0.455614613512668,0.441452522247598,0.458803570903771,0.463438328281091,0.449054063997746,0.456013801613134,0.461803773437106,0.468747008396357,0.449567680111305,0.443663106147891,0.42858839020111,0.440859407786667,0.421900782379704,0.434664502691662,0.426157833060131,0.412336151570278,0.403264527314173,0.402351005177548,0.395711699242536,0.401766939370427,0.397297572685467,0.393589312154843,0.409015438584136,0.428946715020641,0.4371212548916,0.447992639365465,0.443908895422208,0.456715484251175,0.477648676094078,0.480114958878872,0.491518918783526,0.473493413700093,0.495432774695839,0.499772779043081]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-dbc2ad9fc716a1285ca3\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-dbc2ad9fc716a1285ca3\">{\"x\":{\"data\":[[1.04490146797616,1.07447409889885,1.09478896617417,1.07700776771241,1.04280053175972,1.02207459765905,0.998643503920782,0.998221110007073,1.00211199416284,0.999361384593137,0.959208478307808,0.967340399968538,0.982443672753114,0.935175599296595,0.933888165318456,0.904516636829187,0.936456487449746,0.915161006087149,0.903847510862694,0.894490500411569,0.865450101247604,0.854926956031621,0.895287614683918,0.897935896718104,0.893286035661637,0.889972717665376,0.876154487080573,0.911066167657974,0.932721335085091,0.89728364840486,0.857468609771219,0.861352965941751,0.856052448137563,0.818717404848771,0.804123764143391,0.819615243703261,0.818297704227654,0.849363536565352,0.886680879431851,0.914436513101335,0.911476162369837,0.913782658307398,0.874051002624144,0.901374290972895,0.921289090202429,0.962769428085673,0.978740055178202,1.02576884387262,1.032708950896,1.07083514491019,1.10403889716569,1.10039155950078,1.12475205664273,1.11357314447345,1.08946239569992,1.04113504162311,1.06804974992149,1.06998803543002,1.08734244472423,1.03955731052548,1.01688519666213,0.984274741187147,1.02362394099387,1.00898189127282,1.00582170557465,0.993704214568024,0.970253311021237,0.932235701963684,0.912042284784312,0.918454037521469,0.904320736486279,0.918683559676148,0.929133559330335,0.914542845762308,0.944894374727458,0.913918823244547,0.899094221511779,0.873224629866865,0.864647872504139,0.845482269527504,0.879901310815811,0.917964229922557,0.907757571886901,0.938962174295413,0.977229888837023,1.01334731014335,0.968792912333392,0.924406699855968,0.908601827896034,0.929970572866832,0.888225968477167,0.867956119183954,0.898333843867315,0.85709534264052,0.828577279158107,0.824995773843108,0.845394298401012,0.87300203473737,0.843027515628625,0.870141209608921,0.883026069082846,0.896305585308917,0.875831220966962,0.886941335737922,0.893976781180144,0.911143643698348,0.869539699435561,0.888998702196949,0.899351387295547,0.890031636271251,0.854137502953103,0.883894224422394,0.916577231149002,0.888297686946804,0.893281602707676,0.866311313865404,0.885340199201522,0.900969071999719,0.870521006427675,0.892920722934203,0.927641363479838,0.925232014509903,0.94227668764091,0.979728273573426,1.02384086887025,0.973443186792515,1.01897195853491,0.9963004861789,0.948037976588393,0.94651859925116,0.922123500238866,0.926702826581598,0.969183180321966,1.01411285520238,0.972642978849308,0.927233259651702,0.897547696642339,0.873663764720729,0.857379027004497,0.898775312383254,0.929545655502203,0.955208985828215,0.924349984463679,0.968583981083633,0.931304346981369,0.961079493387171,0.95746658947282,0.956506970806647,0.987009327549161,0.944651496417239,0.950255932145095,0.972041980965785,0.988750483033112,0.988598179353192,0.991216345462924,0.972254115495558,0.928203332254425,0.959724735312322,0.923285601189443,0.933383554395206,0.966693420104562,0.960002772204188,0.974239298960243,0.951276967500806,0.938696246479447,0.926376525075692,0.937226307358132,0.971095559790648,0.934842810253314,0.900480542071057,0.912036369638163,0.943334694788492,0.97098226546258,0.983589240642522,0.945685079076456,0.977686029069649,0.984327724715462,0.967682959965742,1.00229524109835,1.02421648420518,1.06824302504059,1.09585162538045,1.06464058712456,1.03224298489919,0.99133738023216,1.00946641271148,0.986498338930343,0.972951844184287,0.950843099619044,0.942603573942624,0.976642396843678,1.01389063873444,1.05878519837005,1.08063894116134,1.07298686790992,1.11180835122273,1.09745023657805,1.07058281154322,1.09253591180805,1.0885533429698,1.03470095342331,1.02578663945496,1.05751266409499,1.10261640544532,1.06392162838702,1.01088426883514,1.02022621028751,1.02893437171082,1.07194054111027,1.08206734755636,1.03379572220151,1.05411932908481,1.10644633567479,1.09340503721062,1.0943535802275,1.06796144110089,1.09308968579767,1.14283633520224,1.14884710180121,1.17461252396038,1.14662897456904,1.10804296592654,1.11125355722461,1.11918171058621,1.09826707391025,1.05968653685595,1.09238619394566,1.0877868271135,1.05423531355463,1.02919233934924,0.986149541646714,0.945445912502707,0.935299332800586,0.916988868716677,0.924373997349233,0.96674096453541,0.997773019091545,0.975457137962772,1.00452698082902,1.0312367996675,1.0415006353076,0.993829762285853,0.961894878397927,0.929961142633771,0.957041511969943,0.955649185477593,0.931041654564458,0.974869988659412,0.944238459949444,0.903000160329408,0.906744740446122,0.877828201175592,0.837915600891709,0.843049203712963,0.826095351658019,0.788275500391278,0.797890714831038,0.827008889701056,0.856470067890026,0.824647923112396,0.853536385954694,0.839786448710976,0.802062781266787,0.787622751006545,0.825424174035037,0.791465500203197,0.785427713425707,0.820788121295356,0.827473819575269,0.847324673323855,0.839521848127826,0.837939617028429,0.836143867696151,0.796099886095534,0.83243773604983,0.843833814377396,0.833779334006979,0.855731525786467,0.871231338904796,0.876506104438076,0.850795092496852,0.863888575872176,0.901332270810952,0.910699867067088,0.916470656747721,0.872329535769081,0.881029915097067,0.884853813205354,0.879185890698939,0.912838697323168,0.881752535194167,0.916497813385893,0.906504560009831,0.950969053772529,0.91431035409789,0.917576594497665,0.910418030616489,0.877880924852767,0.847348717362793,0.845159762312138,0.861287663794529,0.870823182975536,0.861772623274496,0.81996583826633,0.855310662022856,0.851507117327954,0.872403518952508,0.879073373344023,0.854424738538875,0.854624980936624,0.858931168483188,0.865836861034096,0.874060414822823,0.90441286821799,0.923849392391569,0.878489378286177,0.855595365573895,0.897027359749658,0.920295302122817,0.893293372850096,0.924310596615934,0.944018977260353,0.91656114037289,0.912429348281987,0.894119879045925,0.90689959352452,0.930281042009046,0.972305762566059,0.945217454387124,0.946986358452047,0.965844980611511,0.993553751940191,0.953460624474279,0.953224845341506,0.946322626551773,0.902253248132607,0.916594199126748,0.903220966164092,0.902222645399423,0.907547048566047,0.883409710950631,0.89993632139122,0.916329787096014,0.954972583081173,0.950634026910405,0.9656142257527,1.00832532854053,0.975069682489223,1.01790961813924,0.996290637428052,1.01166326072414,1.05101359848126,1.05527943902537,1.0912404359675,1.11167888660384,1.1418265115839,1.11546115852886,1.16901200074689,1.164908133436,1.14226583702805,1.12125309850954,1.12757716255198,1.09172710711689,1.06392108282361,1.04547197142012]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-6c844b827c6775da7c9a\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-6c844b827c6775da7c9a\">{\"x\":{\"data\":[[0.981820187438279,1.00293638514926,0.999744214916034,1.00433129212578,1.00872054320555,1.00908013137831,1.03577162726238,0.98686651814758,1.03617454369719,1.06497253583036,1.06895828726415,1.04980854204961,1.06053669373489,1.09233563469058,1.06418442609828,1.05789368038472,1.0387210970517,1.00232304973281,0.963991530858036,0.94553933565181,0.950125001932479,0.986683406070691,1.02241461428076,1.02028332739346,1.02488139585872,1.0463028327188,1.08483856729726,1.05847856964205,1.02411384101406,1.0411736896803,1.08037787088421,1.10613931520245,1.15519152981842,1.13402903712482,1.11882654835879,1.06413434199464,1.01998877147549,0.971795161180011,0.965261954075183,0.924280720010333,0.911377854718034,0.956417985719816,0.982620375954994,1.01566561011485,1.04499591678524,0.993958589841497,0.981326581150632,0.935967858498098,0.934888119999515,0.965666539985625,0.951123530817541,0.950294084393755,0.930652524296839,0.918795043782404,0.88985986212957,0.927516579039739,0.943451528430038,0.904619836695445,0.890835575832551,0.896312441884878,0.890947832127642,0.910939395516978,0.953490592975016,0.975079975732093,1.00627122758049,0.987713703415603,1.00193410863982,1.0214540672577,1.0617419462445,1.04391840597639,0.998326571684544,1.01569277426187,1.05127210639591,1.04391274730525,1.06101670893823,1.05424783981535,1.02275065339963,0.981258650311674,1.01180722484872,1.01925496720848,0.982836291731294,0.966067630802328,0.920546748403938,0.888410450444104,0.922871708732175,0.931781800429658,0.937001026727877,0.953366663602684,0.941362955021617,0.970554325298079,0.922331134465633,0.936476623096595,0.933887199009056,0.952538469570857,0.907822181839785,0.896808518414575,0.917392338896197,0.954996820731013,0.912104758521632,0.869175711528222,0.892352983242953,0.8788037603077,0.869934800868344,0.868764770424552,0.864922750053463,0.89177008122596,0.874792201863757,0.888415234319806,0.875854768547926,0.844361736955466,0.883996578383035,0.904144089184248,0.931555586675333,0.919844429113838,0.95633850856414,0.958058223882146,0.978812428359661,1.00665519776895,1.03593336223308,0.987419693680663,0.986504928765399,0.95753111920943,0.927575225444967,0.917855793706212,0.913170570483304,0.935916404167873,0.895472154388165,0.858264593997919,0.895960043919993,0.887825751533667,0.87939157828236,0.918935672931345,0.950600537583564,0.908011070479944,0.868660758226643,0.880805456077811,0.921006932974126,0.950943128509071,0.970643123369614,0.975038225621544,0.985795108781977,0.979286939461265,1.00483897632033,0.997693347362075,0.990499123975987,0.94551587369692,0.978740122317665,0.996363743545533,0.982771953106545,1.00564467308871,1.01806702202085,0.977770053939985,1.00503040158086,1.05380803442957,1.00801887616974,1.02976132265784,1.04278018412996,1.07642223958322,1.08525640615233,1.0602377211855,1.02485223337798,0.993858302577912,1.00688212735179,1.00092639552877,1.02873140243753,0.987086270684776,0.953017977816763,0.941940551509704,0.959641401323972,0.985182775657735,1.01175134689208,1.04013302276824,1.05793929999475,1.09825807610868,1.11621091307501,1.1034760585004,1.12871823224652,1.1191347024615,1.10914740678322,1.06643156418685,1.04045463741334,1.03071672307099,1.02625871189276,1.05876439978814,1.05409985206036,1.09184127684094,1.04248084908019,1.0779489656583,1.12386694541513,1.14826989123506,1.09293813255881,1.12102968192187,1.15208882316989,1.14068896802402,1.1793801535048,1.16563803482995,1.19750249783272,1.20685527933044,1.23065255379443,1.2124299537081,1.27297293609016,1.29720896768643,1.31325269195354,1.37142316625845,1.35216509213807,1.37172835768932,1.38051646489547,1.39060779763026,1.34387429469613,1.35724982739759,1.42024714542238,1.40333105595101,1.33469809000598,1.28175549815074,1.32795638266644,1.33888638132339,1.32529452871263,1.30828831650147,1.28525877503025,1.32254219474769,1.33467274503256,1.35916252222455,1.35990796348152,1.37463846087914,1.33986539789327,1.34115430147491,1.36184872759953,1.30259128318064,1.27165706735143,1.22741610300483,1.26946523615451,1.28770714442842,1.28301864820531,1.31739457850843,1.3466146485185,1.34393556019133,1.30709886148356,1.3305438196761,1.34065420794526,1.38251474285259,1.37661171370877,1.32989392740917,1.39092434341887,1.32888955545069,1.32215417986515,1.36119926843789,1.35411978596322,1.34853899707823,1.30686669773942,1.24311452920156,1.25099327565162,1.30154133768798,1.31447620772201,1.25957884951194,1.28685118474888,1.33224301854672,1.30358117543762,1.34401764113832,1.31828739778981,1.3334060894464,1.3790841792636,1.31728841894776,1.33317361939939,1.37782248870538,1.44481102103355,1.46137706800657,1.52825716118122,1.50467760458669,1.53097581582963,1.58125227652231,1.52757108856729,1.53474460692067,1.5582243291376,1.567264722996,1.63213991635504,1.6976111266028,1.65249708924983,1.57610364611227,1.50138501964968,1.49514299239059,1.54560607636739,1.59941833631302,1.52370893508625,1.52502039986274,1.48366631081414,1.52787553130067,1.55011064945916,1.57791599593086,1.5468392330497,1.47046298679853,1.41015173880521,1.44094367812609,1.39041479710848,1.43644598738112,1.4270702760405,1.36510897822516,1.35797935036521,1.39280290844136,1.37895996666204,1.39281298077864,1.41107486708171,1.41834341338783,1.46671574308162,1.41315510912557,1.44035648270725,1.49760004672114,1.4959204893575,1.4246598410344,1.43499117041649,1.47839716122778,1.49843237064417,1.43137560739767,1.4796229202268,1.53303097681574,1.47106603777725,1.51161133498041,1.51946439508471,1.46806043463693,1.43276528284907,1.45765982754121,1.41701240712198,1.48161192406894,1.51567457217375,1.49801463959058,1.53613761787996,1.47153221709228,1.53745170245761,1.51153495729213,1.54518041150146,1.53849324737534,1.56526706601029,1.55937133706254,1.60664889558986,1.52950518647794,1.4553763316133,1.45697168331252,1.46077203838148,1.4749310469712,1.40871422460863,1.44243717807346,1.42946722249532,1.46793016652728,1.39946489564883,1.33046073486766,1.30570454027414,1.31043108539804,1.30031713040653,1.29956053102084,1.35331660257881,1.37078669341908,1.38957084721556,1.34026289300562,1.32780842105962,1.3553380929093,1.35559312545943,1.32583238370943,1.26391346871239,1.22608655683014,1.20522132229952,1.15312352856668,1.17886782119704,1.20023961720685,1.17343565102386,1.20010116508181,1.15118522164733]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-eefe8feb47b594274270\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-eefe8feb47b594274270\">{\"x\":{\"data\":[[1.02555498874281,1.05287456169621,1.00971858074973,1.04796376041611,1.05327489998293,1.00902212077766,0.963021253764614,0.980202175175904,1.00698086686975,0.980494221764339,0.935080810801588,0.956436763085631,0.990425908908349,0.957639744830278,0.930020652488875,0.914925154932836,0.886714515605065,0.852761229695728,0.868736591599316,0.834861475160624,0.803419428258118,0.8219396656131,0.837809896554245,0.869808010982003,0.890891554240845,0.894843983480607,0.882336273695456,0.91629317698543,0.882050179331484,0.882748497368316,0.895633158427453,0.86828205186829,0.872993560278584,0.85020476682081,0.83564929092718,0.861216361353098,0.853942574882612,0.869883811997534,0.828933106093533,0.793259428771903,0.777977163840697,0.791756881059749,0.804397607656531,0.835983078323182,0.813198470499375,0.846350120323344,0.840390816315166,0.804067429340448,0.767006469085372,0.7361014567391,0.742915286925922,0.779128872627657,0.815982245025821,0.790785752711122,0.768014950580266,0.761767488022467,0.760622040992719,0.758935420107926,0.733879269979787,0.723039352721103,0.697484803377737,0.679872316057728,0.691415883384577,0.714639589941958,0.748658666430245,0.777537607691657,0.74361308475668,0.740285964930631,0.750342092461772,0.743027091184277,0.733535815333193,0.714588924608692,0.742937550378023,0.773295393649128,0.801945437811601,0.79961408694207,0.770772000471318,0.73960962596455,0.734343751946846,0.725509242237507,0.744288226386554,0.741076565447905,0.718271642437258,0.706229051846841,0.676012898653268,0.658913293983976,0.669954533840305,0.690167520222622,0.660149058413871,0.67589064626661,0.643968779997199,0.652377510960278,0.678570068783297,0.649728271924256,0.619153832780451,0.615931382189145,0.606445572922827,0.592489592076142,0.61570114516147,0.585485011791165,0.58922791402962,0.582106443113074,0.571884497055213,0.574737472032288,0.577449486292939,0.589223885979746,0.617770381469341,0.587123134649685,0.589432489906794,0.599843163417839,0.607780230676851,0.614843501769436,0.626749108829976,0.597272145084159,0.59070827550815,0.589779230143857,0.618844015724735,0.633859428521249,0.608998734635396,0.621736425779472,0.636048764665526,0.620629298904608,0.61007987124186,0.625047355186672,0.649232390842115,0.647553403825006,0.670328266378782,0.651940760211134,0.63708374948692,0.630779630604022,0.622784904320557,0.640443983002543,0.609521704427662,0.623435841510587,0.623125440616857,0.619710433509253,0.592760646488437,0.590870743651977,0.571180295362887,0.563575166793996,0.57838097925891,0.587886537077685,0.591527076160031,0.566791646797007,0.548387829583148,0.55869728627121,0.568799069467896,0.560797139056805,0.53801934308209,0.516216533380417,0.491847067840151,0.508097950476674,0.488649464250249,0.468622068253092,0.467952374057247,0.478791066123034,0.497757664829819,0.518569431343752,0.525955567885709,0.535471501424194,0.550675855000956,0.555438129966911,0.55369700724061,0.57596635550857,0.57645357933694,0.599669211103962,0.625262008162823,0.636643282492475,0.64638088602365,0.644615877006516,0.628941870183635,0.642087501471182,0.616646362726781,0.620738578257971,0.590085048867518,0.595717315263624,0.571203881154797,0.580236432760125,0.590771313385653,0.59133572640113,0.613785187846622,0.614294607565327,0.621556810648557,0.639566908613472,0.64420913937709,0.675587324522245,0.696604390123332,0.663562161314868,0.633827714007281,0.643731395971722,0.646577938947004,0.65417056613926,0.65352444522166,0.67304786003064,0.68534854004341,0.675843877219335,0.643644504981852,0.6204751373241,0.619405029915693,0.627116125938068,0.642077122066799,0.662498607958699,0.662875868743232,0.638994165927964,0.659956514354438,0.689663611908419,0.687413575318661,0.681226179880731,0.660985131952299,0.686210088005423,0.673099165868963,0.704502035353913,0.728144467122849,0.720135395582347,0.701602105732643,0.679134963655256,0.704601792759905,0.687155488132573,0.662888310862564,0.672433715483845,0.644875301363328,0.635593406304318,0.620267618581329,0.591242075173646,0.600833322245878,0.606862906305979,0.627803506096686,0.643417618217748,0.614777212779745,0.625226658327471,0.601703900339964,0.60430445926615,0.594227403857401,0.581292293814514,0.598362665070632,0.588836265211174,0.609673281319791,0.615346897191201,0.611175238375135,0.624360919375018,0.607614137050828,0.583040538272845,0.601413099452379,0.600082527922529,0.570688524231567,0.566350278264877,0.556467102837649,0.56237758793902,0.555733342994295,0.528103948982996,0.53171597245134,0.531157462085177,0.507295523817843,0.487921912043008,0.468013677463555,0.446300031453783,0.466460519408641,0.475985396343681,0.463791530855544,0.473878350158266,0.450663709526011,0.472056753681527,0.467476951260838,0.474587695935212,0.466790279768316,0.456296962157168,0.475159072822306,0.460066263488074,0.444117461134115,0.431794148466103,0.43690234664182,0.429102965030873,0.428888985288503,0.420707390642541,0.42389730419405,0.408575806711187,0.415024611908219,0.414544434351964,0.408796061730419,0.416045052088682,0.423766823523706,0.433289507109111,0.417957360791572,0.401707755824388,0.408527004632508,0.398320385431068,0.397458235852168,0.389546921590454,0.404363118899774,0.418988671094204,0.409604621085977,0.425280658488243,0.410723186077135,0.424183646032421,0.422503482674913,0.418613896020408,0.41534796766935,0.40854475167163,0.413402154611324,0.431852742009835,0.449528308711987,0.449897345240348,0.432707300518368,0.413074145034711,0.394014968289897,0.410738077413906,0.428895363905047,0.424303515159351,0.431495744756175,0.439922553648437,0.434764244985335,0.438866124313062,0.459645557574087,0.467585684964622,0.444409865551889,0.461283052520139,0.446110830735292,0.452832867401294,0.448316588175523,0.434293324055462,0.430709482057261,0.438004542733438,0.422011620990655,0.414843527402533,0.397460550612203,0.396015867483253,0.377652973253057,0.378002057647619,0.39516592153021,0.414742271213532,0.403379794847461,0.384530580441262,0.368167464101217,0.359297588008186,0.35319121672238,0.369431981980413,0.353071959842614,0.337970712678638,0.323696791364415,0.323986894323201,0.325543196312663,0.311950201170127,0.309548157041401,0.297915247763195,0.299962441816197,0.309775616253257,0.322467849334872,0.330687784862628,0.346221751992709,0.348606492134176,0.36437256833863,0.365171480434048,0.366424486143371,0.371201539327199,0.389439648863727,0.401364546502033,0.413762416958685,0.406906438909762,0.390416951418225,0.380425167758125,0.397724960819129,0.406178603557822,0.398009035482713,0.391135803700136,0.376510029070037]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-fa1eada6aae4abd30b34\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-fa1eada6aae4abd30b34\">{\"x\":{\"data\":[[0.964856742531992,0.997957816854116,0.982663431583387,0.947776408009187,0.952444764580403,0.99027700731901,0.96868869668722,0.93973397321911,0.934372552306913,0.903173039344999,0.935801212687226,0.947113929775704,0.942650321977882,0.898118961090937,0.910941173933583,0.91591929892423,0.908130573120063,0.949235152369236,0.940641813619966,0.97724355625882,1.00593793228922,0.983031900632353,0.961522547013577,0.967303066657964,0.93125876597719,0.975775659935769,0.93924815775947,0.944004599875692,0.90352340653213,0.925053465050857,0.971277004863419,0.978263253194521,0.955058484547869,0.909099811760158,0.878482038976693,0.88926817015439,0.865629472935733,0.827669273702239,0.835902266043738,0.805910317329997,0.815440656067481,0.824592520582834,0.788694110794009,0.760112221076403,0.747636209131065,0.750364035965612,0.774760937687046,0.743518516914757,0.71130000487537,0.74003197671579,0.720639700904966,0.743971890027973,0.713648470684646,0.69616204453727,0.681236125508637,0.70806324698569,0.740186209356657,0.776396134173605,0.780109290335668,0.804510267626433,0.768829906043252,0.79250691112951,0.82952376859768,0.841676454645376,0.868376695604174,0.854575468916025,0.819870686086964,0.810552382505293,0.831187868795748,0.854427187972108,0.881253822709333,0.86709260373436,0.884655964382759,0.88778736780674,0.884732975216609,0.912723936507028,0.907892615103858,0.933039678574722,0.897138493084909,0.93846184181069,0.971293584844073,0.924609998950683,0.904343004082057,0.887124502916892,0.871730493650778,0.892980921423955,0.906177668550025,0.864005060693014,0.885876239892643,0.859613498382298,0.872972336871971,0.888192187119571,0.897490193211006,0.897546976709064,0.87156229862519,0.864107383151132,0.904525379355376,0.919604194400303,0.930456287611991,0.910858747499566,0.947129709125417,0.94974445586589,0.902818700022272,0.924140704667796,0.913402517828286,0.901862159045833,0.867168918031175,0.827709517324717,0.797381204823406,0.763070274074534,0.742615959863477,0.739326576779873,0.745413396344081,0.779394226320974,0.765174786088582,0.773532090787178,0.794060846739331,0.778416986515621,0.795753767897848,0.833425805806119,0.858716636936418,0.858364013670669,0.828832316531829,0.793849894029303,0.756806247515207,0.742832468726104,0.74370055740137,0.737628148944814,0.770069003493132,0.740523861573021,0.728675362154181,0.719998264005366,0.714206641660947,0.72374074773124,0.701285897887594,0.69006058307608,0.718449074816155,0.745723263161526,0.758471469048492,0.73492256514451,0.763205250670078,0.788134674590589,0.774101394994503,0.78734026056718,0.754305176466266,0.761170197435524,0.753643911434027,0.766867504625416,0.774724002066093,0.794538978067461,0.7917252007056,0.804886208305353,0.773602729628425,0.744367137285697,0.751068348144426,0.746431197390623,0.763486592289239,0.74541493598542,0.731937503061386,0.702151538382487,0.698875067584961,0.691927940721561,0.720881851457606,0.702444508050173,0.680254043361311,0.702470541110326,0.709580649408702,0.707826461721115,0.734272739453315,0.737503504510743,0.750174710865607,0.777678920013483,0.784300531503648,0.802247830901922,0.783567547949179,0.814188155906492,0.807798437028501,0.80195107360881,0.807135872735972,0.780879668666384,0.756129973895162,0.71965667219114,0.720132884801846,0.696412401848585,0.68836208626907,0.697846028358056,0.682874781160863,0.685487972468167,0.651293079914782,0.621331186785496,0.60403667730665,0.629938434776988,0.653769399305658,0.642443409890486,0.633831833343052,0.650890115363625,0.637155595022698,0.640648555558581,0.645337668622731,0.648029802623806,0.62530873207238,0.604404790342894,0.593377994483268,0.585255996914969,0.610701448058351,0.626794799615866,0.653069869970837,0.668046455020852,0.634779131207692,0.641037587198333,0.62836863419446,0.598910071424527,0.617478304152707,0.616936775668262,0.591054324252327,0.565700153268611,0.564758408417469,0.55100695877575,0.558060856155027,0.533512835469907,0.516657681358425,0.503740731913437,0.518113789694616,0.510211208015116,0.518717965434758,0.532349546881616,0.537223038080983,0.539335389496961,0.525192431722078,0.538906903972473,0.55657493980473,0.550314684851644,0.560514551606469,0.540187052137475,0.557158698180586,0.534546776718823,0.509422038360672,0.514324296708794,0.536508133302966,0.533945613302789,0.536777869214367,0.512775052897637,0.497468105921317,0.489136815976256,0.477238355879989,0.499119031898918,0.507808728558437,0.497937096355112,0.498666551618448,0.48694555712401,0.500569919576572,0.482514978145225,0.484085463171452,0.461229960665712,0.458579887938538,0.468423863529453,0.454354559717213,0.440646492425316,0.435579199037536,0.41598811445579,0.40536822000913,0.413452036081478,0.429480973009956,0.449806936840833,0.453084762862994,0.470829060826751,0.485152968576788,0.500565153808441,0.489635853672768,0.477145599726746,0.489631533071036,0.486859234819754,0.478207090629691,0.461633877608151,0.478702645037853,0.467633792805486,0.474200442996816,0.488500241876617,0.500993051428432,0.513163272587141,0.534601242773054,0.550481835134448,0.523283524212597,0.498802685016342,0.502471840737011,0.485491970701038,0.493533820647415,0.487695635390428,0.501542927573607,0.478447316814124,0.486650719917219,0.502821188845042,0.526904167288552,0.547052071530146,0.528587302166955,0.546087348268046,0.533561308413795,0.507135483568815,0.529139158630723,0.535780741436915,0.521381195076412,0.519225713418389,0.542866343703296,0.528235330125923,0.51094207140248,0.491963793473728,0.511225218439561,0.535314549599751,0.524393738900397,0.544123847717194,0.537449385432168,0.51666082190689,0.539140675558467,0.544976486055902,0.54841511219309,0.538492206466763,0.515079738816487,0.513186128047313,0.509863877023848,0.525314961896675,0.543360866845938,0.538800191396434,0.520918652501386,0.531948944835301,0.515747789523879,0.533552117686524,0.54418061393253,0.555091812929564,0.54658308706656,0.52514275912539,0.503756269203957,0.493207620501201,0.494414225328404,0.480797152925497,0.477573365948663,0.492042415171582,0.47647526068899,0.486048583919795,0.488165043029539,0.482382560937814,0.463156848508812,0.471872107116383,0.472923172730192,0.48539085937834,0.475248054523012,0.471489526576227,0.458137605691545,0.465529612831078,0.482207223450187,0.466355871632419,0.474708988309429,0.455053676363844,0.447568242671877,0.452988493392407,0.459448495206591,0.446232328634528,0.434559498677351,0.420696723997946,0.418912501616855,0.424649236551289,0.41698241131426,0.428449037392912,0.440996345002464,0.435949181498494,0.424645469160265]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-609e22f8cd1fc60e57ce\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-609e22f8cd1fc60e57ce\">{\"x\":{\"data\":[[0.987881849356927,0.953192686957842,0.90966590000208,0.933832401048653,0.91326072533898,0.951817645461599,0.910173723124892,0.884108831345008,0.840080096627694,0.876160757450797,0.839719408496065,0.838282301522994,0.845850164527929,0.830191748190784,0.815664889810857,0.785908064883873,0.772754496887854,0.758913319978155,0.776460804825002,0.800317574809697,0.777141880642762,0.764885389640802,0.765244588734508,0.768902571725292,0.782623210340205,0.782997466214844,0.821542462613645,0.850937294323062,0.830674168428226,0.868898021893701,0.831452232674844,0.790819980833993,0.812343757161188,0.821223252350057,0.820577538920764,0.782570397863004,0.791955229052427,0.792595909872048,0.830926629670407,0.819458641900679,0.850857378125794,0.862356123214509,0.874137021507504,0.832936840276492,0.858706665981858,0.859859872950617,0.880248070827948,0.856306603606111,0.847302637346197,0.868167540671075,0.90506956707539,0.927532513543509,0.931061818972505,0.933642330604089,0.952931404580306,0.962182732915684,0.914365066937572,0.899410761672804,0.891267032310546,0.866559900936316,0.856077948332516,0.867597686375505,0.839656707868736,0.820026712613056,0.788634305225459,0.823469264153616,0.78865516045421,0.752827009211294,0.764801500227505,0.754996244857737,0.745116903263276,0.754268922787987,0.779198834884623,0.762794004664554,0.788710716562427,0.81513571576279,0.805123482091206,0.801160712344739,0.7772627917628,0.790118201183256,0.767750599249874,0.752848969096726,0.764433369563966,0.745916828185383,0.724050938698076,0.714759583724131,0.704670386976244,0.728275563969701,0.715748840101764,0.729904466448076,0.696537916266171,0.669555261805484,0.664258923263355,0.660243590371401,0.646510608156889,0.631867599289647,0.627408221394047,0.655083014895538,0.636759681241429,0.612630272136359,0.585656073180667,0.573525180303466,0.576619765416641,0.601014797735278,0.588744369218384,0.599982561028306,0.596336579131676,0.568167566594502,0.576254130882808,0.592844191822215,0.567390089641146,0.553602831095902,0.570202785264601,0.555609552510646,0.552386839480019,0.536904068886964,0.54751179901227,0.559082758623337,0.566525163264894,0.539841019466949,0.532598330328725,0.51137504343898,0.510327512654137,0.503827479817035,0.482164845158968,0.502245010316547,0.514288921678559,0.529736287749623,0.509567710374836,0.530937099503203,0.512546746770335,0.526710832146693,0.502549403682208,0.527321512802213,0.543313071430676,0.570378310228937,0.58210777794368,0.603418873763877,0.632311968436262,0.609862469539544,0.589379171145448,0.577256523691507,0.590642824611908,0.566406852591963,0.576494696772142,0.581429598494772,0.601343209241963,0.595356913722444,0.593777727201183,0.621707040914429,0.605069238432379,0.598774117396896,0.621623315715255,0.607843865714001,0.610758099973965,0.630914264501985,0.645688045830074,0.633940233550315,0.646717067364494,0.660759489400694,0.668317889769537,0.670975086117264,0.68555042775673,0.665519343363085,0.661574095115329,0.632738961117868,0.634036486754991,0.640713715402172,0.66866542302192,0.66410106068379,0.66724698330017,0.667013621825757,0.635693847515556,0.664028195065513,0.666192967134959,0.657162344469834,0.651036545934017,0.656381666933592,0.673204850340165,0.706536659446816,0.730554235573474,0.763989294003965,0.744531916260017,0.710914733767496,0.702143629067303,0.698973238619954,0.72284738337397,0.732307425524142,0.745565311087177,0.731073356261938,0.702423879410707,0.70611635319854,0.706278624131535,0.693707266105196,0.693350725410034,0.669525380150755,0.654057338261122,0.649185390141765,0.649248560427143,0.676950477410579,0.701436473876842,0.703077858943651,0.679589413259269,0.66177001163943,0.647237002042902,0.621034325017894,0.593696038306076,0.603916101466457,0.630188078251207,0.627569227662307,0.621079800988205,0.621765792105451,0.652031431502339,0.646988737317243,0.657972445752833,0.690046425752919,0.708284124765939,0.70026222198887,0.692128773754295,0.706216636165084,0.72344133615869,0.721539522350218,0.687292020144535,0.715031429933915,0.721524234654069,0.685864423305162,0.715384275089935,0.693904106559348,0.693152133319339,0.714921470339211,0.721804944101936,0.717050442509934,0.716632620396401,0.716395758997836,0.6955422699786,0.697569198404413,0.690099976248541,0.719645190806288,0.691974939807037,0.685390063421969,0.712727982261771,0.696022426482766,0.703015067171814,0.693794713728861,0.681872659221526,0.714365904718764,0.747558859596499,0.78364863345523,0.757465105293057,0.755036449994779,0.730179751971098,0.726487067975099,0.73483324278772,0.738590679436615,0.724474624237168,0.725007640216964,0.702372283559732,0.706422766317628,0.715144591873222,0.746685805027865,0.762527501245995,0.784324348083744,0.759849083112154,0.77498929598706,0.747522759538399,0.774602222352385,0.802538643435154,0.819459815288527,0.83857050254754,0.873618564894709,0.916359514287016,0.883120501513661,0.892123397326367,0.921985689094345,0.893532492509359,0.853395049506329,0.84411575897458,0.828508508757481,0.819461888606071,0.812677772712697,0.804504566296015,0.79650207180484,0.797268648259981,0.797306741117915,0.82980310079418,0.808366526546975,0.791025862646197,0.795924693758117,0.829317065697782,0.828706228614198,0.864847441851636,0.882554191908725,0.866642052299739,0.856554479901258,0.864901955265816,0.876162400192413,0.892725206996365,0.873129578012768,0.854799066787086,0.866968562887462,0.833934591725814,0.874485231615933,0.885710811118306,0.842411484003116,0.816687051059403,0.806571306266365,0.780827273765,0.802747362610421,0.774289932055497,0.754628372928346,0.747270661997468,0.766550371646513,0.757416243639775,0.781655363936471,0.787294310054265,0.784003201520007,0.773818572638144,0.776693251791441,0.799470275728972,0.823299370731061,0.814484584338235,0.828345507563238,0.828018492723783,0.86206440352108,0.824625899584487,0.801446666297463,0.807481157412252,0.805073399715973,0.841783383281774,0.874825931753926,0.832105804398566,0.79438067261858,0.757820973184463,0.720346056718127,0.749690602674231,0.74892394475892,0.758704897007561,0.777069736962535,0.795019438847654,0.757515318769857,0.794060447136223,0.787455075006183,0.774501438530824,0.758491088342077,0.778876645763463,0.762340107794798,0.733023772557451,0.702922835744485,0.675629218557576,0.653251827012187,0.659185488321838,0.634467335650361,0.630345055275427,0.606537863537722,0.590462220114487,0.579640343956907,0.57039843591502,0.560824105209142,0.538884465179502,0.518842784667206,0.507792724926379,0.52915072888563,0.514265864832258,0.535052872845267,0.522833265236669]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-2ab80c73ed3640830d4c\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-2ab80c73ed3640830d4c\">{\"x\":{\"data\":[[0.951743509690277,0.956249188227761,0.980309047337071,1.00313425930398,0.954499721398298,0.960770504675162,0.998645336776683,0.954149930466115,0.980875992174606,0.963364013067532,0.943835824350207,0.916275604270348,0.912712693768788,0.885938037012468,0.899211216659709,0.937351837450656,0.979919977235433,0.959633951454661,0.950574833250989,0.969189575479712,1.0063307157044,1.03351970745693,1.05825250415444,1.03515615306641,1.05329973256615,1.10322585555054,1.14973715828065,1.1947263356484,1.14303667252296,1.10878638329341,1.07136443030297,1.08761560041003,1.09408581947758,1.05334857939478,1.03311185149119,0.994152808540187,0.948836953363328,0.918879705172332,0.87647625967268,0.891141157180985,0.84873566535727,0.867389079808642,0.838978050640729,0.829038035662352,0.834114524677239,0.802391882346375,0.788667879504525,0.785969850071061,0.802251134898018,0.809950013646392,0.798271046486808,0.808223732126125,0.784987402396482,0.760809682736451,0.756063517170815,0.748371700557916,0.780836695725673,0.814295788038267,0.816321711227762,0.791846459854743,0.815031615805491,0.809704739714649,0.803011536783233,0.780655984259381,0.819413751476437,0.779584661213353,0.817438908921308,0.798301999391944,0.828132187219136,0.807661189133629,0.770329356731554,0.773988875457507,0.787985203992555,0.822393410117018,0.78447484508913,0.807915590395898,0.847355208999191,0.838554428397766,0.849836144455711,0.8302003382787,0.79445060977939,0.795230929937757,0.773503650163234,0.749673584693458,0.739211983152069,0.753473353231644,0.730843551323894,0.729573388973812,0.719446267977283,0.746273706982935,0.718778153522014,0.710558936437013,0.73964037125514,0.756436164886396,0.786143884028722,0.76110516423473,0.729489926118998,0.702668710146333,0.737273873249846,0.726755807590304,0.706047356301326,0.735942661262309,0.72021152979333,0.686544011821794,0.672880573853951,0.694255082569363,0.685800233993285,0.686600039540997,0.660239891048467,0.655789016152645,0.646976729928493,0.661552233140844,0.665911360346847,0.670678310714054,0.694575638658237,0.699679090135514,0.72503464937858,0.745056547398339,0.77247005584756,0.750928074477174,0.71722093302778,0.68583031749578,0.715883075121068,0.696723468905787,0.711474741616127,0.697478420635217,0.723923010800703,0.758364443887764,0.792243304509862,0.76141330403364,0.773837000900234,0.778076675202023,0.796266983048765,0.780446165862372,0.742962894045265,0.762438609625485,0.783924253091267,0.763894247298212,0.750372238391719,0.761132894886472,0.73005173920058,0.747864571094936,0.733987149507987,0.70387395670811,0.719921686262667,0.718089041021268,0.712600312359912,0.726482390347834,0.705399751882389,0.681229752598876,0.713473648055589,0.721663981743323,0.750632770217649,0.75480587472724,0.789341791938028,0.76382251777974,0.765847180027045,0.778922195010883,0.785730663486668,0.807503942258586,0.832356515875245,0.864784320938253,0.847644946436148,0.836613974026947,0.840220422077064,0.81580223328354,0.834922306885357,0.802686292901006,0.802009230286168,0.798518842172653,0.774294150653368,0.755557530068418,0.790277484096633,0.82188678951879,0.785315553902391,0.755559833934844,0.766559102672081,0.74164216278446,0.722053308447113,0.748438164250964,0.75273424640229,0.743046615135137,0.766138248677386,0.786775652988707,0.822756790749953,0.859710510777829,0.820027870869217,0.808613019377523,0.819941718106089,0.854544352283064,0.86835251789327,0.830496642802181,0.829195587857157,0.830916643762406,0.792354688696242,0.78903856314244,0.761394260598014,0.749112334928555,0.781839608018365,0.791058004055178,0.757031513764451,0.762941097407429,0.748710099949727,0.747842016606479,0.718311660659618,0.728218790933752,0.739970916264917,0.723609385856718,0.744824636175197,0.745447847988934,0.758690510524891,0.72136350664359,0.723920599785833,0.691402174264594,0.715196510774331,0.726956870920716,0.716443445680591,0.710920375348608,0.698699792808537,0.717202351384176,0.747418666145528,0.724255212148735,0.755391903275092,0.771631790903804,0.757474650916271,0.776761012499288,0.793989237425677,0.821338550538481,0.810841615404993,0.822095423811993,0.800500057200376,0.815195978827094,0.815289610084174,0.784294330741275,0.821733437026601,0.846039855762246,0.815507497213421,0.826160370505381,0.826088188795454,0.856401477913895,0.855687965268413,0.860841023756179,0.831815039940745,0.804602327846056,0.819753686160525,0.789975332174361,0.755117596708742,0.773778273556917,0.746106663564925,0.774670561865899,0.754981024047128,0.730183017159058,0.742582304861998,0.752428001772753,0.775943507468207,0.797599543020603,0.828468296935278,0.82346850853475,0.846587640447151,0.848528084002701,0.809105285757118,0.844845825808165,0.816425421353489,0.844860165894091,0.879521343020386,0.887400528885537,0.921065380469897,0.881908116402767,0.856381709247993,0.866876071548598,0.89787691767288,0.897214099446259,0.855564940749868,0.813497987234981,0.797563453830059,0.758637448237106,0.787109222821915,0.776604678712514,0.790034431248286,0.814035133189727,0.801443113244339,0.808525219164576,0.783940188738466,0.788504798968042,0.782146626778184,0.78341274110595,0.765634069837997,0.751561524518619,0.756465786227681,0.730231017476276,0.732046499471225,0.70178844096858,0.683802820294898,0.675086256342028,0.65552229326234,0.646001409438573,0.660099749918527,0.645560988575101,0.64005288813114,0.661400464718837,0.662193293417752,0.629193687312851,0.602896397385506,0.610677666865363,0.63594661083831,0.611759738078487,0.636343083190076,0.660450072736074,0.682356546897328,0.65178211530159,0.659937199909251,0.657183424968099,0.631547796371159,0.644943094269454,0.64298509860266,0.632116296808812,0.604220365043653,0.577492207608139,0.549938501877607,0.552559407914259,0.571794376586062,0.580988717796169,0.585397494999743,0.583052528154682,0.556354690161209,0.551935401295782,0.573956051247328,0.583171871746922,0.59764170376695,0.599283294871275,0.574754613192862,0.596380362602657,0.570841423288166,0.582554840153563,0.585655096553693,0.566470043677314,0.558932624355153,0.547793673892535,0.570573015328278,0.596485154815576,0.569288521975034,0.5492145719234,0.551435081452431,0.551310385405961,0.540482557092158,0.533997089975722,0.549590428144043,0.566763075267172,0.574945109367895,0.567303184281286,0.563620488057148,0.569204713195535,0.555504547953576,0.578628953595248,0.596434840079452,0.5959368228888,0.591801025644025,0.604190872913967,0.577506526074304,0.563483771510748,0.557096830779554,0.530070033624883,0.549806522721889,0.524023703906548,0.534161807861854]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-b5e5fd9456301044d4ba\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-b5e5fd9456301044d4ba\">{\"x\":{\"data\":[[0.960895525990054,0.973134577177403,1.01006907927978,1.01579863270845,0.967031066517054,0.949836959319759,0.951722417688437,0.905879567843155,0.929014289497183,0.912417599944553,0.917692381742903,0.945112463591984,0.953970416724649,0.956373628055361,0.970184343075606,0.972921520179811,0.958248312388548,0.998873025386346,0.985396838707209,0.940861320953537,0.971753890070808,0.989010709346691,0.941426654030012,0.916395558257528,0.935182541556936,0.957699680962392,0.910910292263242,0.912401080650651,0.924056388095895,0.930682605643984,0.965746785666446,0.97811276280009,0.938480725418943,0.897085715254503,0.889116218463574,0.852582096110208,0.817392477363114,0.821783324953913,0.862169095495409,0.868115417725226,0.828762984768111,0.863971209201055,0.866941864059842,0.906702349900499,0.903224774095323,0.892933005116772,0.904365962855852,0.86889691465722,0.896703181819485,0.926962890735932,0.884725951246232,0.859368392845766,0.850822864519105,0.827844639052517,0.853291394856428,0.821595597027473,0.813990592680876,0.835539308892926,0.853412516709644,0.867553747599569,0.856607381959215,0.84295780972091,0.880102116415752,0.837088793500786,0.79940491412813,0.790027410461511,0.761210567104555,0.728316330127894,0.719913121016474,0.727233667167795,0.735596741384652,0.705358980135379,0.718459156197359,0.733412014661372,0.736785558094876,0.764575854381548,0.788858955014252,0.751329708143804,0.772146904142551,0.765895408128544,0.739140941838895,0.724031987875849,0.712768530942386,0.708319574809984,0.735301427156788,0.730484437163203,0.765825477923282,0.795690282731344,0.805675445719606,0.778662928671878,0.752730821800552,0.784760694895331,0.751536092757708,0.726072583770344,0.737038465226366,0.76682978251046,0.770758214000156,0.800283044153231,0.838671967241803,0.846491333317939,0.832872277702645,0.808132614523245,0.796465593252215,0.780197267077593,0.752598886633426,0.734281171009626,0.705703113114328,0.723804399536113,0.757909729537899,0.724731761728409,0.744056839676672,0.717717772957452,0.721153261532776,0.715795589216944,0.727975216544079,0.70193187088587,0.672349971702557,0.698151571249405,0.688188528346714,0.714885979828519,0.718316469330635,0.684325420908325,0.702204728221566,0.694942751069591,0.681323287542092,0.694073244923526,0.709218706442854,0.743972424688127,0.780892299989459,0.802591790253302,0.79252940561249,0.778518426133902,0.809214867262407,0.799769449362458,0.831135332497332,0.859747970626665,0.85489837828356,0.873669450006002,0.892863430375924,0.883051021926842,0.903961125000999,0.940265175876589,0.95002976843655,0.981355381274932,1.0126778809802,1.04400328718005,1.05938310643354,1.08275694113157,1.13190291638157,1.16393623947496,1.10780254808087,1.09798330166919,1.08636760375,1.04792632316502,1.08847100993201,1.1081603649914,1.08826894505102,1.05103996296433,1.08451815122824,1.09042881624495,1.08259795690493,1.04794329644045,1.04271510666102,0.995825746082397,1.02861619902576,1.01897894678331,1.00187468529049,0.987526388124173,1.03238790539172,0.987809212267383,0.944514317383585,0.929062139474368,0.96846494190145,0.936175686901768,0.944977027700919,0.954244094516991,0.968370700063753,0.965588116038118,1.00444287207603,1.02165123897236,0.996630352566765,0.977157525743024,0.993107806960919,0.995438568057173,0.95259039040467,0.992887591974711,0.989214323465976,0.967022628459888,0.930764302437028,0.897731865111143,0.865044705224301,0.82194417037275,0.823848300066905,0.819213909683038,0.796967682367252,0.805926112556119,0.832211736489172,0.844293345858644,0.876037620018108,0.835041900834661,0.830289778512444,0.828462965574525,0.839082449244595,0.862760388188446,0.869049773217368,0.847856919561301,0.872777074341168,0.895358339579508,0.888373544037628,0.896157911129691,0.891620748843636,0.907024242211695,0.890299635444594,0.885126541426703,0.855675460667508,0.874968891353447,0.845297446796284,0.874223035745911,0.898575004895576,0.878374362937759,0.842033292487224,0.847078868599817,0.871732602366786,0.864504778509641,0.877406041795515,0.910670489244939,0.894369688154196,0.873752612322441,0.888482140397861,0.894807190064109,0.864225261346581,0.904546623199547,0.925984498401239,0.967142792032763,0.997562382355364,0.999011038868485,0.993658965760002,0.995797092960341,0.991752387110611,0.958242622257552,0.923079865131272,0.879088163206256,0.840003879927999,0.823473675534685,0.832469275537887,0.819212271440541,0.804169022245964,0.835806438574073,0.869918614645438,0.862625400203249,0.837091161913047,0.82255216248167,0.862760660559206,0.880945837848116,0.842756673735789,0.855712213998511,0.865581518537453,0.857503224395739,0.84964004263547,0.816099507007388,0.845451542327194,0.883454531782712,0.846090843992729,0.869450672171976,0.889479987888181,0.889925188272188,0.884652629827625,0.859945430363631,0.847156478882242,0.884873042351779,0.878260032690659,0.913156842627674,0.916708600525465,0.914599572601918,0.876493263582325,0.899047705291981,0.929481567638873,0.950243934269955,0.917548550450289,0.891199114884425,0.873041415384952,0.849457667517264,0.881209642829286,0.861194974048303,0.887119056408441,0.907576783735224,0.930064251735308,0.940340534694464,0.940395109672243,0.97187294539133,0.96780829102007,0.938768362615381,0.919985409580454,0.879153015516925,0.882374569609067,0.9190308530106,0.873813033354573,0.907009536342213,0.925512199830322,0.885798387827985,0.864778041007787,0.882929821336923,0.87148431425403,0.860978215077176,0.889358248622984,0.84610949062116,0.845194084490912,0.866494190608027,0.826801166405001,0.819804028259165,0.808657755447228,0.80326813921338,0.820167971699885,0.849288080001235,0.862645282829339,0.903458734957905,0.892379323378371,0.906517765574287,0.921627756187593,0.893084520273933,0.89496069133736,0.933635857858392,0.970419430326225,0.930202392406227,0.969227585229349,0.973691777199806,0.963342895892724,0.985816052037174,1.01514891710847,1.04518633655461,1.04800433434268,1.07336125074151,1.10838836507801,1.13677891046497,1.10725608963644,1.10937188035599,1.07115562545713,1.09152760988032,1.14211457474619,1.18305792635304,1.16427371168277,1.15486081543204,1.20761040248574,1.22047071278563,1.21262640098104,1.18067172397045,1.1895712272101,1.13164609861127,1.16437944259487,1.10973023210758,1.14048220667112,1.11254126844945,1.12321683138369,1.17263075337811,1.19985747300028,1.20015056909627,1.22949422536539,1.25899601208062,1.25549773592893,1.2889414965612,1.24340136703849,1.30009753790844,1.24985824483453,1.18757045157772,1.13203389003885]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-dc8deb098771ac54a17d\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-dc8deb098771ac54a17d\">{\"x\":{\"data\":[[1.03767386751715,1.03498013622184,0.989332640819509,1.00610157070878,1.04991544989014,1.08200884910767,1.04625839138365,1.05409221649078,1.0038752353387,0.968341237034375,0.964778437128895,0.99595635261399,1.01810405563815,1.06041751470736,1.05038078582563,1.00617044734841,1.00124941289979,0.992711655867528,1.03710722157381,1.02478675203385,0.998989466079284,1.03867889122628,1.03491790554803,1.05932328182051,1.10445758636434,1.1518256517394,1.0950288900552,1.07498530724039,1.03367123969889,1.07856059461557,1.03346328549486,1.00168054646004,1.04952123126747,1.09370281521925,1.06484942946954,1.01278814895126,1.04013113904221,1.07973833655221,1.07939728018703,1.03186340147418,1.07062917523984,1.04296818770004,1.07657957104698,1.09160514139664,1.13745260251665,1.08178078635379,1.11929789070321,1.11959076200846,1.08913834473221,1.11299263941566,1.07392116041568,1.07204665783844,1.08019464901028,1.12706816271832,1.16185448237006,1.21937386191319,1.18640846500922,1.23257129513925,1.26812781316323,1.31110279128522,1.29209057355264,1.33711083056576,1.35577092518735,1.37373384829193,1.39643474055814,1.37074498356055,1.38841102927665,1.36418431218274,1.36745828531842,1.43168252497258,1.40463601107837,1.41323434403524,1.4676407572743,1.41105068229846,1.46961529582088,1.41942811788479,1.42493302565249,1.42187057101075,1.37910452307503,1.44639546523096,1.42664819471253,1.44380376799061,1.43401716817284,1.40866957156587,1.38748350811907,1.34928302895465,1.37820391663604,1.38831260762017,1.40357433969267,1.38605211917949,1.4288169927999,1.41248604681119,1.44257276373621,1.46009417571756,1.46887229097369,1.50243405471913,1.53799937998388,1.55562148335862,1.49095132314022,1.56052190137317,1.62656542848028,1.67895865343136,1.6693427776527,1.73167104848027,1.68505134739138,1.76728186728967,1.72712101086161,1.78948179057572,1.87031873085876,1.80059820649841,1.87904781201228,1.82748685030162,1.73826132514064,1.71962084734849,1.64940967845247,1.69267568976431,1.69995420505427,1.62102133362149,1.62909695031662,1.65122431383204,1.6301992076257,1.68478271496571,1.68200366134853,1.62184196690048,1.61000997629921,1.56292299309582,1.63941822815907,1.57925863353315,1.55934727669002,1.4994154071637,1.55330710936963,1.49774381791861,1.50965557996695,1.46556502241928,1.50802057522527,1.58217610061234,1.51354778439771,1.56397959541954,1.53104707883256,1.56481218729593,1.59629178524554,1.658019596325,1.703425638455,1.7704633396582,1.73175685964193,1.72416344418009,1.73502622061108,1.70429862339109,1.67942915462871,1.69115064660071,1.65595976509949,1.6039718356025,1.58508612460189,1.53792757678135,1.58443312917116,1.51741696515796,1.53128210230571,1.57352588182599,1.60130195442253,1.59193656274639,1.64462032729784,1.60815553344761,1.61850413855933,1.68201853008341,1.69714701244066,1.66739816657872,1.67567132551519,1.66184323875527,1.61877169839673,1.68250993742205,1.59859563613405,1.52817920077314,1.52650420196165,1.49750297645036,1.44694959403152,1.37921700293582,1.44616050222534,1.43677924950138,1.45556098073159,1.46449108747169,1.42627846194363,1.44232476199778,1.40347019240305,1.39651008352135,1.37419017096625,1.31091882098476,1.34464015384896,1.36088049709788,1.32027254499019,1.36635754137393,1.34514196397226,1.30308897887811,1.29722620248531,1.29423590856089,1.34696820678648,1.28612117403681,1.31093160707346,1.29488551289702,1.28991949218348,1.23147299374432,1.27169018013325,1.27256226488074,1.24760163216593,1.2638608408518,1.26279290788699,1.20717092490516,1.20576065999184,1.26515881643217,1.28645065947654,1.22644154232529,1.24031010685413,1.25371822532267,1.26177666817142,1.29825987015379,1.3136149390496,1.35875281281388,1.3971672002395,1.35821787551308,1.39837984576055,1.3559838867733,1.32056755293361,1.2933194816024,1.26839642528055,1.31471623303106,1.26356188770035,1.20759110620622,1.2340625651473,1.28223910145643,1.32459239244072,1.38186378782917,1.33459270466003,1.27506214409593,1.28867012695023,1.31144468086135,1.31834126635773,1.28076640015908,1.23911151749506,1.21859602309718,1.17836093964299,1.16468670238048,1.16904729293134,1.15673905308123,1.16125037135532,1.19175200405056,1.2373429035276,1.19977173986373,1.17180158151386,1.21250505133605,1.18600450491754,1.16466579320562,1.19094234137079,1.14496207550482,1.17902789486368,1.18907056353487,1.16243460920164,1.15735331071628,1.16621687918279,1.22204367286426,1.27474720767492,1.30792996754442,1.24920585834735,1.21716408587185,1.25142596338677,1.22598342483001,1.28240978442933,1.32218486723674,1.33078083568208,1.29389777082056,1.31468765638002,1.37332955113992,1.43043733016703,1.48463712920832,1.49532346371733,1.48431087159199,1.5265070334692,1.50724782470837,1.46514624551913,1.46273017660671,1.47942089576702,1.43194503499311,1.37051756665875,1.38021476399339,1.38757266262776,1.40776910554546,1.36621158169414,1.35906413002047,1.37253899071845,1.34656635606156,1.32311802521932,1.362614673831,1.41926094358075,1.39613323196417,1.38184486884347,1.34388939621279,1.32012105545182,1.27567188119962,1.25773310888752,1.31463964663598,1.25286805049733,1.20485699651267,1.20026019098528,1.20624784992772,1.19369684012659,1.1463361591002,1.13257118657061,1.1010750051738,1.1397456231649,1.19081320257518,1.23937979019594,1.17916911424757,1.19630962474201,1.14688239639527,1.13189018932997,1.1464362976817,1.2000935604806,1.17060953724596,1.20083184516771,1.23869566016131,1.28214344067438,1.30361665764758,1.23895993097266,1.29795912334475,1.36091547306014,1.3911408698244,1.45702883846202,1.43609053559664,1.45345929470864,1.46983806017092,1.45910248126208,1.42563476013039,1.39370935243498,1.36403970254912,1.3140047534898,1.31311374379214,1.33711624053312,1.39467582933108,1.45137423595444,1.46885662483061,1.52268871248118,1.45396841990907,1.50774735620737,1.47119804009112,1.48074461543973,1.44828926402991,1.43629758127714,1.47306468820917,1.5068934221628,1.45353994045427,1.38275294568653,1.41514523535892,1.46297798569603,1.40472116783323,1.41585323979709,1.35430574226884,1.34753391557013,1.30321311365949,1.23988616433784,1.21569598216681,1.26861831203074,1.2544819569262,1.24180348314808,1.21334094268406,1.25209035224084,1.27575908202728,1.33781044033581]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>","<div id=\"htmlwidget-e9b0dcaf4797b328bdfc\" class=\"d3horizon html-widget\" style=\"width:200px;height:auto;\" width=\"200\" height=\"auto\"><\/div>\n<script type=\"application/json\" data-for=\"htmlwidget-e9b0dcaf4797b328bdfc\">{\"x\":{\"data\":[[0.97458492028527,0.977270699839774,0.968521081722612,0.973864902100293,0.992788075087945,0.985438368160044,0.957134067241831,0.954467118408966,0.989472912492122,0.973869240249461,1.00442862707276,1.00311508405802,1.03538489795629,0.987153693661142,1.01628026610832,0.976130205261012,0.946428115666328,0.921414847886676,0.884194745974835,0.923419581173628,0.893683022844271,0.878899313947727,0.848476007811319,0.824027207627077,0.824850923985868,0.829180879924558,0.824150013972627,0.794265276716159,0.788019149562041,0.793563506822007,0.799891917525796,0.818762955920813,0.815477976722576,0.844397656804814,0.848689288160274,0.833595960993896,0.836089881607105,0.855137655547561,0.830417572932128,0.80095394460338,0.777986176728829,0.751115107526544,0.779437730547157,0.779101917070825,0.780217349181017,0.788254725523286,0.808086019020084,0.8226800996609,0.846611717794856,0.81271243867513,0.848529289041435,0.849358414304174,0.867355616058112,0.834376963598338,0.83300727792472,0.85906961986247,0.87254798732471,0.853210930678174,0.872019774492423,0.844506268817448,0.818557194459556,0.812247028296776,0.847683663790164,0.844238681089228,0.813945754792441,0.79010995016606,0.762598861600988,0.748295896060028,0.735641101517321,0.744522062484755,0.780672641545559,0.779757748715263,0.757356870357685,0.746155424104943,0.726397140620138,0.751067584375037,0.773146634739091,0.761210963506117,0.78960097401729,0.811827642257019,0.803033491467376,0.788566060970624,0.767528623279252,0.742840331508614,0.775639688080519,0.765402967974421,0.761899985033133,0.744443603613341,0.716259523352185,0.695890893987358,0.715415078978914,0.731560203434772,0.741106001009077,0.717830241230729,0.707651583925885,0.708314768175197,0.690171891919405,0.723389962962687,0.739891426811411,0.73898979230156,0.720864285493716,0.713302725837513,0.688294946029842,0.666433523549163,0.671134208850746,0.680922995867436,0.690207316520264,0.720574851195436,0.705931328983763,0.680915571663692,0.651717833165681,0.641154190141632,0.67092909427206,0.646981017503376,0.617973019230376,0.621667540339309,0.625594670741543,0.599601623691219,0.573679903538816,0.553227745531938,0.58063123718137,0.574402036836257,0.6008885182927,0.605610939606828,0.624116780911862,0.611476795786477,0.623493007090959,0.633822160810462,0.61537084577745,0.639385227737458,0.649985575732761,0.651391931402183,0.683655414354236,0.701768059364912,0.676022346642472,0.676854607899643,0.682440776301603,0.704931801313913,0.705920130561467,0.693142589748484,0.695565615275065,0.684907025373568,0.669393746762774,0.685544996518905,0.718064941396657,0.746086837681575,0.757971548065098,0.793372352200574,0.805442386974831,0.7953287393652,0.831340513314943,0.792673645893896,0.777250106530103,0.782285290226572,0.747263381801017,0.71837247324493,0.718098820104928,0.696486761560342,0.673939333353268,0.643603411885691,0.627203370294747,0.599571455815583,0.603328749501392,0.606585483174592,0.603324899906068,0.576365722987673,0.60057414560099,0.573608488787253,0.578892529795236,0.556326219472184,0.5536126290895,0.541840688318867,0.531760111832196,0.518972451193257,0.539469442314665,0.550913981239745,0.55035715026851,0.557509403865976,0.572964215171236,0.551222143188268,0.567521559515537,0.554465030994029,0.561799448621696,0.534006089408448,0.560374837454532,0.585944081982128,0.604696690073436,0.582491132831336,0.567245019211447,0.55613679720425,0.531069217669644,0.522506170577255,0.530725046025415,0.523631326383712,0.522244197297028,0.538736809877429,0.564417589519324,0.537907627602175,0.558791282011249,0.556156068455896,0.542891377449396,0.521093028689158,0.531373739165025,0.553235408421619,0.547284148478814,0.551242594229719,0.52525204278463,0.503898713836761,0.511773471480458,0.509663737484534,0.50094061698378,0.480318819721883,0.485415619782879,0.498640183526097,0.504170644748829,0.50276077597661,0.522852480404917,0.545024489652899,0.548417847557429,0.550433278536014,0.563440719980577,0.578734914014949,0.560264640593314,0.584833846652818,0.613159096443631,0.585087177518561,0.558621009731714,0.56215489224106,0.55854011970474,0.572497773625889,0.58060231670767,0.601757179408026,0.611425229467755,0.626709599719319,0.601905291941705,0.590738251886553,0.618661132448989,0.626023666521269,0.604958258525544,0.593281039631384,0.572815422258002,0.591203138763542,0.614792285613309,0.615941208895188,0.627034908072562,0.634210716403165,0.649409784331789,0.636711431393033,0.649971474301237,0.634752310137594,0.643791766641784,0.666918630706304,0.662507821347489,0.662775429791538,0.631235639271502,0.652666556019481,0.622378178555122,0.643476127658456,0.657282284576972,0.673277235681305,0.682709214106152,0.692578588685005,0.671907479174711,0.654179224179017,0.628599044652818,0.634998161167991,0.641266288193754,0.670970611275407,0.685935606899416,0.672060756840384,0.642255629568382,0.628774867361914,0.659714433322032,0.691395660939947,0.707323070325921,0.685546264746791,0.705276148181581,0.686223823197245,0.665602002553843,0.691310958937242,0.693249639973841,0.70055759142882,0.716174150677785,0.708239396831906,0.698550083545725,0.725508052866393,0.71132207602561,0.735262930604329,0.765726580126166,0.749727224954058,0.772646254020256,0.788399300069938,0.808061342389465,0.791875070664601,0.78214496158947,0.796891278799173,0.776355658635614,0.786155639663591,0.758812577011985,0.76466643405701,0.746709557795087,0.759350728544989,0.782015804524045,0.767105762460103,0.759567763220482,0.770548587684693,0.756303931768476,0.757787304962177,0.772022492199218,0.761134957966322,0.763972032699983,0.779811636976122,0.763794809404282,0.789739623278181,0.82456733205099,0.824121889150345,0.791560776736823,0.764112996661068,0.760041855765697,0.755823705079353,0.771375239348598,0.760683881012591,0.763036956047518,0.764847179536681,0.770776968906905,0.77564160103113,0.755130597032308,0.72555972494524,0.702286801486388,0.692896922691643,0.65836837256839,0.676381245366893,0.646137297724484,0.627941570672434,0.620711468233302,0.64514605365613,0.654353421337664,0.667314667350752,0.663461808391396,0.685814941222018,0.678725313542357,0.708237494881474,0.7299457921288,0.762263181236619,0.798982795617084,0.79703702062191,0.795828675851504,0.77592875227842,0.791017651180597,0.816124653484008,0.833780098778963,0.800901137269202,0.809230147508461,0.788060012529389,0.818889068141177,0.819971200972195,0.846436332088807,0.844076003839144,0.860802312226528,0.848177615370506,0.869456168045077,0.904829137002812,0.877468314617017,0.917426286140782,0.927216084427599]],\"options\":{\"height\":20,\"title\":\"\",\"colors\":[\"#313695\",\"#4575b4\",\"#74add1\",\"#abd9e9\",\"#fee090\",\"#fdae61\",\"#f46d43\",\"#d73027\"],\"mode\":\"mirror\"}},\"evals\":[],\"jsHooks\":[]}<\/script>"]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>index1<\/th>\n <th>index2<\/th>\n <th>index3<\/th>\n <th>x<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"columnDefs":[{"width":"200px","targets":4},{"orderable":false,"targets":0}],"fnDrawCallback":"\n// not the best way but works fairly well\nfunction(){\n HTMLWidgets.staticRender();\n}\n","order":[],"autoWidth":false,"orderClasses":false},"selection":{"mode":"multiple","selected":null,"target":"row"}},"evals":["options.fnDrawCallback"],"jsHooks":[]}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment