Skip to content

Instantly share code, notes, and snippets.

@uredkar
Created April 26, 2017 20:26
Show Gist options
  • Save uredkar/eacbbe16ce878e08931ac5491f71839f to your computer and use it in GitHub Desktop.
Save uredkar/eacbbe16ce878e08931ac5491f71839f to your computer and use it in GitHub Desktop.
R d3.js d3horizon with hover zoom
license: mit

Little Bit of JavaScript

An R user with a little bit of JavaScript and the power of htmlwidgets can achieve some neat results. In this little example we add a mouseover zoomed horizon chart with just a couple lines of code.

Code

library(d3horizonR)
library(d3r)
library(htmltools)

d3h <- d3horizon(
  lapply(1:10, function(x){cumprod(1+runif(1000,-0.02,0.02))-1}),
  options = d3horizonOptions(height=7),
  width = 400
)

browsable(
  tagList(
    htmlwidgets::onRender(
      d3h,
"
function(el,x) {
  var hzs = d3.select(el).selectAll('.horizon');
  var hz_zoom = d3.select('#horizonzoom');
  hz_zoom.style('width', el.style.width);

  hzs.on('mouseover', function(d) {
debugger;
    var hzw = HTMLWidgets.widgets.filter(function(d){return d.name==='d3horizon'})[0];
    var instance = hzw.initialize(hz_zoom.node());
    instance.renderValue({data:[d], options:{height: 200}});;
  })
}
"
    ),
    tags$div(
      style = "margin-top: 20px",
      tags$div(id="horizonzoom")
    ),
    d3_dep_v4()
  )
)

Screenshot

Imgur

forked from timelyportfolio's block: R d3.js d3horizon with hover zoom

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgew0KICAvLyBJZiB3aW5kb3cuSFRNTFdpZGdldHMgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGVuIHVzZSBpdDsgb3RoZXJ3aXNlIGNyZWF0ZSBhDQogIC8vIG5ldyBvYmplY3QuIFRoaXMgYWxsb3dzIHByZWNlZGluZyBjb2RlIHRvIHNldCBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZQ0KICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLg0KICB3aW5kb3cuSFRNTFdpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHMgfHwge307DQoNCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLg0KICB2YXIgdmlld2VyTW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy52aWV3ZXJNb2RlID0NCiAgICAgIC9cYnZpZXdlcl9wYW5lPTFcYi8udGVzdCh3aW5kb3cubG9jYXRpb24pOw0KDQogIC8vIFNlZSBpZiB3ZSdyZSBydW5uaW5nIGluIFNoaW55IG1vZGUuIElmIG5vdCwgaXQncyBhIHN0YXRpYyBkb2N1bWVudC4NCiAgLy8gTm90ZSB0aGF0IHN0YXRpYyB3aWRnZXRzIGNhbiBhcHBlYXIgaW4gYm90aCBTaGlueSBhbmQgc3RhdGljIG1vZGVzLCBidXQNCiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4NCiAgdmFyIHNoaW55TW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy5zaGlueU1vZGUgPQ0KICAgICAgdHlwZW9mKHdpbmRvdy5TaGlueSkgIT09ICJ1bmRlZmluZWQiICYmICEhd2luZG93LlNoaW55Lm91dHB1dEJpbmRpbmdzOw0KDQogIC8vIFdlIGNhbid0IGNvdW50IG9uIGpRdWVyeSBiZWluZyBhdmFpbGFibGUsIHNvIHdlIGltcGxlbWVudCBvdXIgb3duDQogIC8vIHZlcnNpb24gaWYgbmVjZXNzYXJ5Lg0KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3Rvcikgew0KICAgIGlmICh0eXBlb2YoalF1ZXJ5KSAhPT0gInVuZGVmaW5lZCIgJiYgc2NvcGUgaW5zdGFuY2VvZiBqUXVlcnkpIHsNCiAgICAgIHJldHVybiBzY29wZS5maW5kKHNlbGVjdG9yKTsNCiAgICB9DQogICAgaWYgKHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwpIHsNCiAgICAgIHJldHVybiBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7DQogICAgaWYgKHZhbHVlID09PSBudWxsKQ0KICAgICAgcmV0dXJuIFtdOw0KICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQ0KICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIHJldHVybiBbdmFsdWVdOw0KICB9DQoNCiAgLy8gSW1wbGVtZW50IGpRdWVyeSdzIGV4dGVuZA0KICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICByZXR1cm4gdGFyZ2V0Ow0KICAgIH0NCiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsNCiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7DQogICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsNCiAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHRhcmdldDsNCiAgfQ0KDQogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4NCiAgZnVuY3Rpb24gZm9yRWFjaCh2YWx1ZXMsIGNhbGxiYWNrLCB0aGlzQXJnKSB7DQogICAgaWYgKHZhbHVlcy5mb3JFYWNoKSB7DQogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7DQogICAgfSBlbHNlIHsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIFJlcGxhY2VzIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiBmdW5jU291cmNlLg0KICAvLw0KICAvLyBOb3RlIHRoYXQgZnVuY1NvdXJjZSBzaG91bGQgbm90IEJFIHRoZSBuZXcgbWV0aG9kLCBpdCBzaG91bGQgYmUgYSBmdW5jdGlvbg0KICAvLyB0aGF0IFJFVFVSTlMgdGhlIG5ldyBtZXRob2QuIGZ1bmNTb3VyY2UgcmVjZWl2ZXMgYSBzaW5nbGUgYXJndW1lbnQgdGhhdCBpcw0KICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4NCiAgLy8gbWV0aG9kIGNhbiBiZSBjYWxsZWQgbGlrZSBhIHJlZ3VsYXIgZnVuY3Rpb24sIGl0IGhhcyB0aGUgdGFyZ2V0IHBlcm1hbmVudGx5DQogIC8vIGJvdW5kIHRvIGl0IHNvICJ0aGlzIiB3aWxsIHdvcmsgY29ycmVjdGx5Lg0KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsNCiAgICB2YXIgc3VwZXJGdW5jID0gdGFyZ2V0W21ldGhvZE5hbWVdIHx8IGZ1bmN0aW9uKCkge307DQogICAgdmFyIHN1cGVyRnVuY0JvdW5kID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsNCiAgICB9Ow0KICAgIHRhcmdldFttZXRob2ROYW1lXSA9IGZ1bmNTb3VyY2Uoc3VwZXJGdW5jQm91bmQpOw0KICB9DQoNCiAgLy8gQWRkIGEgbWV0aG9kIHRvIGRlbGVnYXRvciB0aGF0LCB3aGVuIGludm9rZWQsIGNhbGxzDQogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbg0KICAvLyB0aGUgZGVsZWdhdGVlLCBidXQgdGhlcmUgd2FzIG9uZSBvbiBkZWxlZ2F0b3IgYmVmb3JlDQogIC8vIGRlbGVnYXRlTWV0aG9kIHdhcyBjYWxsZWQsIHRoZW4gdGhlIG9yaWdpbmFsIHZlcnNpb24NCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLg0KICAvLyBGb3IgZXhhbXBsZToNCiAgLy8NCiAgLy8gdmFyIGEgPSB7DQogIC8vICAgbWV0aG9kMTogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMScpOyB9DQogIC8vICAgbWV0aG9kMjogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMicpOyB9DQogIC8vIH07DQogIC8vIHZhciBiID0gew0KICAvLyAgIG1ldGhvZDE6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYjEnKTsgfQ0KICAvLyB9Ow0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMSIpOw0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMiIpOw0KICAvLyBhLm1ldGhvZDEoKTsNCiAgLy8gYS5tZXRob2QyKCk7DQogIC8vDQogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4NCiAgZnVuY3Rpb24gZGVsZWdhdGVNZXRob2QoZGVsZWdhdG9yLCBkZWxlZ2F0ZWUsIG1ldGhvZE5hbWUpIHsNCiAgICB2YXIgaW5oZXJpdGVkID0gZGVsZWdhdG9yW21ldGhvZE5hbWVdOw0KICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHRhcmdldCA9IGRlbGVnYXRlZTsNCiAgICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZWVbbWV0aG9kTmFtZV07DQoNCiAgICAgIC8vIFRoZSBtZXRob2QgZG9lc24ndCBleGlzdCBvbiB0aGUgZGVsZWdhdGVlLiBJbnN0ZWFkLA0KICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIG9uIHRoZSBkZWxlZ2F0b3IsIGlmIGl0IGV4aXN0cy4NCiAgICAgIGlmICghbWV0aG9kKSB7DQogICAgICAgIHRhcmdldCA9IGRlbGVnYXRvcjsNCiAgICAgICAgbWV0aG9kID0gaW5oZXJpdGVkOw0KICAgICAgfQ0KDQogICAgICBpZiAobWV0aG9kKSB7DQogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOw0KICAgICAgfQ0KICAgIH07DQogIH0NCg0KICAvLyBJbXBsZW1lbnQgYSB2YWd1ZSBmYWNzaW1pbGllIG9mIGpRdWVyeSdzIGRhdGEgbWV0aG9kDQogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsNCiAgICAgIHJldHVybiBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXTsNCiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgew0KICAgICAgZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV0gPSB2YWx1ZTsNCiAgICAgIHJldHVybiBlbDsNCiAgICB9IGVsc2Ugew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBlbGVtZW50RGF0YTogIiArDQogICAgICAgIGFyZ3VtZW50cy5sZW5ndGgpOw0KICAgIH0NCiAgfQ0KDQogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleA0KICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csICJcXCQmIik7DQogIH0NCg0KICBmdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7DQogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOw0KICAgIHJldHVybiByZS50ZXN0KGVsLmNsYXNzTmFtZSk7DQogIH0NCg0KICAvLyBlbGVtZW50cyAtIGFycmF5IChvciBhcnJheS1saWtlIG9iamVjdCkgb2YgSFRNTCBlbGVtZW50cw0KICAvLyBjbGFzc05hbWUgLSBjbGFzcyBuYW1lIHRvIHRlc3QgZm9yDQogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsNCiAgLy8gICBpZiBmYWxzZSwgb25seSByZXR1cm4gZWxlbWVudHMgKndpdGhvdXQqIGdpdmVuIGNsYXNzTmFtZQ0KICBmdW5jdGlvbiBmaWx0ZXJCeUNsYXNzKGVsZW1lbnRzLCBjbGFzc05hbWUsIGluY2x1ZGUpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgIGlmIChoYXNDbGFzcyhlbGVtZW50c1tpXSwgY2xhc3NOYW1lKSA9PSBpbmNsdWRlKQ0KICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOw0KICAgIH0NCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmMsIGZhbHNlKTsNCiAgICB9IGVsc2UgaWYgKG9iai5hdHRhY2hFdmVudCkgew0KICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gb2ZmKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5yZW1vdmVFdmVudExpc3RlbmVyKQ0KICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7DQogICAgZWxzZSBpZiAob2JqLmRldGFjaEV2ZW50KSB7DQogICAgICBvYmouZGV0YWNoRXZlbnQoZXZlbnROYW1lLCBmdW5jKTsNCiAgICB9DQogIH0NCg0KICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aA0KICAvLyB0aGUgInBhZGRpbmciIENTUyBwcm9wZXJ0eQ0KICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcGFkZGluZw0KICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7DQogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJudW1iZXIiKQ0KICAgICAgdmFsdWUgPSBbdmFsdWVdOw0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzBdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVswXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVszXX07DQogICAgfQ0KICB9DQoNCiAgLy8gQ29udmVydCBhbiB1bnBhY2tlZCBwYWRkaW5nIG9iamVjdCB0byBhIENTUyB2YWx1ZQ0KICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgew0KICAgIHJldHVybiBwYWRkaW5nT2JqLnRvcCArICJweCAiICsgcGFkZGluZ09iai5yaWdodCArICJweCAiICsgcGFkZGluZ09iai5ib3R0b20gKyAicHggIiArIHBhZGRpbmdPYmoubGVmdCArICJweCI7DQogIH0NCg0KICAvLyBNYWtlcyBhIG51bWJlciBzdWl0YWJsZSBmb3IgQ1NTDQogIGZ1bmN0aW9uIHB4KHgpIHsNCiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikNCiAgICAgIHJldHVybiB4ICsgInB4IjsNCiAgICBlbHNlDQogICAgICByZXR1cm4geDsNCiAgfQ0KDQogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuDQogIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIG51bGwsIG9yIGFuIG9iamVjdCB3aXRoIGZpbGwsIHBhZGRpbmcsDQogIC8vIGRlZmF1bHRXaWR0aCwgZGVmYXVsdEhlaWdodCBmaWVsZHMuDQogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgew0KICAgIHZhciBzaXppbmdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2h0bWx3aWRnZXQtc2l6aW5nJ10iKTsNCiAgICBpZiAoIXNpemluZ0VsKQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgdmFyIHNwID0gSlNPTi5wYXJzZShzaXppbmdFbC50ZXh0Q29udGVudCB8fCBzaXppbmdFbC50ZXh0IHx8ICJ7fSIpOw0KICAgIGlmICh2aWV3ZXJNb2RlKSB7DQogICAgICByZXR1cm4gc3Audmlld2VyOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gc3AuYnJvd3NlcjsNCiAgICB9DQogIH0NCg0KICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLg0KICAvLyAgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgeWllbGRzIGENCiAgLy8gICBmdW5jdGlvbi4gT3IsIGNhbiBiZSBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggImNvZGUiIGFuZCAiZGF0YSINCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nDQogIC8vICAgb2YgSlMgdGhhdCdzIGFuIGV4cHIgdGhhdCB5aWVsZHMgYSBmdW5jdGlvbiwgYW5kICJkYXRhIiBzaG91bGQgYmUNCiAgLy8gICBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgd2hlbiB0aGF0DQogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLg0KICAvLyBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgdGhhdCB3aWxsIGJlICJ0aGlzIiBmb3IgZWFjaCBmdW5jdGlvbg0KICAvLyAgIGV4ZWN1dGlvbi4NCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlDQogIC8vICAgc2FtZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gYWxsIGZ1bmN0aW9ucy4pDQogIGZ1bmN0aW9uIGV2YWxBbmRSdW4odGFza3MsIHRhcmdldCwgYXJncykgew0KICAgIGlmICh0YXNrcykgew0KICAgICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykgew0KICAgICAgICB2YXIgdGhlc2VBcmdzID0gYXJnczsNCiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsNCiAgICAgICAgICB0aGVzZUFyZ3MgPSB0aGVzZUFyZ3MuY29uY2F0KFt0YXNrLmRhdGFdKTsNCiAgICAgICAgICB0YXNrID0gdGFzay5jb2RlOw0KICAgICAgICB9DQogICAgICAgIHZhciB0YXNrRnVuYyA9IGV2YWwoIigiICsgdGFzayArICIpIik7DQogICAgICAgIGlmICh0eXBlb2YodGFza0Z1bmMpICE9PSAiZnVuY3Rpb24iKSB7DQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOw0KICAgICAgICB9DQogICAgICAgIHRhc2tGdW5jLmFwcGx5KHRhcmdldCwgdGhlc2VBcmdzKTsNCiAgICAgIH0pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGluaXRTaXppbmcoZWwpIHsNCiAgICB2YXIgc2l6aW5nID0gc2l6aW5nUG9saWN5KGVsKTsNCiAgICBpZiAoIXNpemluZykNCiAgICAgIHJldHVybjsNCg0KICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsNCiAgICBpZiAoIWNlbCkNCiAgICAgIHJldHVybjsNCg0KICAgIGlmICh0eXBlb2Yoc2l6aW5nLnBhZGRpbmcpICE9PSAidW5kZWZpbmVkIikgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW4gPSAiMCI7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOw0KICAgIH0NCg0KICAgIGlmIChzaXppbmcuZmlsbCkgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOw0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9ICIxMDAlIjsNCiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsNCiAgICAgIGlmIChjZWwpIHsNCiAgICAgICAgY2VsLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsNCiAgICAgICAgdmFyIHBhZCA9IHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpOw0KICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5yaWdodCA9IHBhZC5yaWdodCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5ib3R0b20gPSBwYWQuYm90dG9tICsgInB4IjsNCiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7DQogICAgICAgIGVsLnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7DQogICAgICB9DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwNCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRIZWlnaHQ7IH0NCiAgICAgIH07DQoNCiAgICB9IGVsc2Ugew0KICAgICAgZWwuc3R5bGUud2lkdGggPSBweChzaXppbmcud2lkdGgpOw0KICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LA0KICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0OyB9DQogICAgICB9Ow0KICAgIH0NCiAgfQ0KDQogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzDQogIHZhciBkZWZhdWx0cyA9IHsNCiAgICBmaW5kOiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7DQogICAgfSwNCiAgICByZW5kZXJFcnJvcjogZnVuY3Rpb24oZWwsIGVycikgew0KICAgICAgdmFyICRlbCA9ICQoZWwpOw0KDQogICAgICB0aGlzLmNsZWFyRXJyb3IoZWwpOw0KDQogICAgICAvLyBBZGQgYWxsIHRoZXNlIGVycm9yIGNsYXNzZXMsIGFzIFNoaW55IGRvZXMNCiAgICAgIHZhciBlcnJDbGFzcyA9ICJzaGlueS1vdXRwdXQtZXJyb3IiOw0KICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7DQogICAgICAgIC8vIHVzZSB0aGUgY2xhc3NlcyBvZiB0aGUgZXJyb3IgY29uZGl0aW9uIGFzIENTUyBjbGFzcyBuYW1lcw0KICAgICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiAiICsgJC5tYXAoYXNBcnJheShlcnIudHlwZSksIGZ1bmN0aW9uKHR5cGUpIHsNCiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOw0KICAgICAgICB9KS5qb2luKCIgIik7DQogICAgICB9DQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7DQoNCiAgICAgIC8vIElzIGVsIGlubGluZSBvciBibG9jaz8gSWYgaW5saW5lIG9yIGlubGluZS1ibG9jaywganVzdCBkaXNwbGF5Om5vbmUgaXQNCiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLg0KICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuY3NzKCJkaXNwbGF5Iik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBkaXNwbGF5KTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgICRlbC5oaWRlKCk7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JTcGFuID0gJCgiPHNwYW4+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpOw0KICAgICAgICAgIGVycm9yU3Bhbi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKSB7DQogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlDQogICAgICAgIC8vIGVsLCBhbmQgcG9zaXRpb24gdGhlIGVycm9yIHRvIGJlIG9uIHRvcCBvZiB0aGUgZWwuDQogICAgICAgIC8vIE1hcmsgaXQgd2l0aCBhIHVuaXF1ZSBJRCBhbmQgQ1NTIGNsYXNzIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIuDQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JEaXYgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKGVyckNsYXNzKS5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIikNCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQ0KICAgICAgICAgICAgLy8gc2V0dGluZyB3aWR0aCBjYW4gcHVzaCBvdXQgdGhlIHBhZ2Ugc2l6ZSwgZm9yY2luZyBvdGhlcndpc2UNCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3INCiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHRvIHNocmluazsgc28gdXNlIG1heC13aWR0aCBpbnN0ZWFkDQogICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQ0KICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsNCiAgICAgICAgICBlcnJvckRpdi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JEaXYpOw0KDQogICAgICAgICAgLy8gUmVhbGx5IGR1bWIgd2F5IHRvIGtlZXAgdGhlIHNpemUvcG9zaXRpb24gb2YgdGhlIGVycm9yIGluIHN5bmMgd2l0aA0KICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZWxlbWVudCBhcyB0aGUgd2luZG93IGlzIHJlc2l6ZWQgb3Igd2hhdGV2ZXIuDQogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBpZiAoIWVycm9yRGl2WzBdLnBhcmVudEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRJZCk7DQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yRGl2DQogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpDQogICAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpDQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2xlYXJFcnJvcjogZnVuY3Rpb24oZWwpIHsNCiAgICAgIHZhciAkZWwgPSAkKGVsKTsNCiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBudWxsKTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgIGlmIChkaXNwbGF5KQ0KICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsNCiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsNCiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIil7DQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOw0KICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOw0KICAgICAgfQ0KICAgIH0sDQogICAgc2l6aW5nOiB7fQ0KICB9Ow0KDQogIC8vIENhbGxlZCBieSB3aWRnZXQgYmluZGluZ3MgdG8gcmVnaXN0ZXIgYSBuZXcgdHlwZSBvZiB3aWRnZXQuIFRoZSBkZWZpbml0aW9uDQogIC8vIG9iamVjdCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6DQogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlDQogIC8vICAgdXNlZCBieSBkZWZhdWx0IGFzIHRoZSBDU1MgY2xhc3NuYW1lIHRvIGxvb2sgZm9yLg0KICAvLyAtIGluaXRpYWxpemUgKG9wdGlvbmFsKSAtIEEgZnVuY3Rpb24oZWwpIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkDQogIC8vICAgdmFsdWUgdG8gcmVuZGVyVmFsdWUuDQogIC8vIC0gcmVuZGVyVmFsdWUgKHJlcXVpcmVkKSAtIEEgZnVuY3Rpb24oZWwsIGRhdGEsIGluaXRWYWx1ZSkgdGhhdCB3aWxsIGJlDQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICBlbGVtZW50OyBTaGlueSBhcHBzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyDQogIC8vICAgZWxlbWVudCwgYXMgdGhlIGRhdGEgY2hhbmdlcy4NCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsNCiAgICBpZiAoIWRlZmluaXRpb24ubmFtZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgbmFtZSIpOw0KICAgIH0NCiAgICBpZiAoIWRlZmluaXRpb24udHlwZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgdHlwZSIpOw0KICAgIH0NCiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG91dHB1dCB3aWRnZXRzDQogICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0gIm91dHB1dCIpIHsNCiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsNCiAgICB9DQogICAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgLm5hbWUgaXMgYSB2YWxpZCBDU1MgY2xhc3NuYW1lDQoNCiAgICAvLyBTdXBwb3J0IG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucy4gT2xkLXN0eWxlIGNsYXNzLWJvdW5kDQogICAgLy8gZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0ICJvYmplY3QiIHBlciB3aWRnZXQgcGVyIHR5cGUvY2xhc3Mgb2YNCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cw0KICAgIC8vIHRha2UgZWwgYW5kIGluc3RhbmNlIGFyZ3VtZW50cywgYmVjYXVzZSB0aGUgd2lkZ2V0IG9iamVjdCBjYW4ndA0KICAgIC8vIHN0b3JlIHRoZW0uIE5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQNCiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0DQogICAgLy8gcHJvdmlkZSByZW5kZXJWYWx1ZSBvciByZXNpemUgbWV0aG9kcyBhdCBhbGwsIGp1c3QgdGhlIHNpbmdsZSBtZXRob2QNCiAgICAvLyAgIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpDQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4NCiAgICAvLyBUaGlzIGVuYWJsZXMgYSBmYXIgbW9yZSBuYXR1cmFsIHByb2dyYW1taW5nIHN0eWxlIGZvciB0aGUgd2lkZ2V0DQogICAgLy8gYXV0aG9yLCB3aG8gY2FuIHN0b3JlIHBlci1pbnN0YW5jZSBzdGF0ZSB1c2luZyBlaXRoZXIgT08tc3R5bGUNCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzDQogICAgLy8gaXMgaW4gY29udHJhc3QgdG8gd2hhdCBjYW4gb25seSBiZSBjYWxsZWQgQy1zdHlsZSBwc2V1ZG8tT08gd2hpY2ggaXMNCiAgICAvLyB3aGF0IHdlIHJlcXVpcmVkIGJlZm9yZSkuDQogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgew0KICAgICAgZGVmaW5pdGlvbiA9IGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZmluaXRpb24pOw0KICAgIH0NCg0KICAgIGlmICghZGVmaW5pdGlvbi5yZW5kZXJWYWx1ZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgcmVuZGVyVmFsdWUgZnVuY3Rpb24iKTsNCiAgICB9DQoNCiAgICAvLyBGb3Igc3RhdGljIHJlbmRlcmluZyAobm9uLVNoaW55KSwgdXNlIGEgc2ltcGxlIHdpZGdldCByZWdpc3RyYXRpb24NCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28NCiAgICAvLyBjb250YWluIHN0YXRpYyB3aWRnZXRzLg0KICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107DQogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLg0KICAgIHZhciBzdGF0aWNCaW5kaW5nID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7DQogICAgb3ZlcnJpZGVNZXRob2Qoc3RhdGljQmluZGluZywgImZpbmQiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsNCiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IHN1cGVyZnVuYyhzY29wZSk7DQogICAgICAgIC8vIEZpbHRlciBvdXQgU2hpbnkgb3V0cHV0cywgd2Ugb25seSB3YW50IHRoZSBzdGF0aWMga2luZA0KICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOw0KICAgICAgfTsNCiAgICB9KTsNCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOw0KDQogICAgaWYgKHNoaW55TW9kZSkgew0KICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4NCiAgICAgIC8vIFRoZSBkZWZpbml0aW9uIGl0c2VsZiB3aWxsIG5vdCBiZSB0aGUgb3V0cHV0IGJpbmRpbmcsIGluc3RlYWQNCiAgICAgIC8vIHdlIHdpbGwgbWFrZSBhbiBvdXRwdXQgYmluZGluZyBvYmplY3QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlDQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kDQogICAgICAvLyBuYW1lIChyZW5kZXJWYWx1ZSkgZm9yIGh0bWx3aWRnZXRzIGRlZmluaXRpb24gYW5kIFNoaW55IGJpbmRpbmdzDQogICAgICAvLyBidXQgdGhleSBhY3R1YWxseSBoYXZlIHF1aXRlIGRpZmZlcmVudCBzZW1hbnRpY3MgKHRoZSBTaGlueQ0KICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0DQogICAgICAvLyBzdHJpcHMgb2ZmIGJlZm9yZSBjYWxsaW5nIGh0bWx3aWRnZXRzIHJlbmRlclZhbHVlKS4gV2UgY2FuJ3QNCiAgICAgIC8vIGp1c3QgaWdub3JlIHRoZSBkaWZmZXJlbmNlIGJlY2F1c2UgaW4gc29tZSB3aWRnZXRzIGl0J3MgaGVscGZ1bA0KICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZg0KICAgICAgLy8gd2UncmUgbm90IGRlbGVnYXRpbmcsIHRoZW4gdGhhdCBjYWxsIHdpbGwgZ28gdG8gdGhlIFNoaW55DQogICAgICAvLyB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGh0bWx3aWRnZXRzIHZlcnNpb24uDQoNCiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHdpdGggZGVmaW5pdGlvbiwgd2l0aG91dCBtdXRhdGluZyBlaXRoZXIuDQogICAgICB2YXIgYmluZGluZ0RlZiA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOw0KDQogICAgICAvLyBUaGlzIG9iamVjdCB3aWxsIGJlIG91ciBhY3R1YWwgU2hpbnkgYmluZGluZy4NCiAgICAgIHZhciBzaGlueUJpbmRpbmcgPSBuZXcgU2hpbnkuT3V0cHV0QmluZGluZygpOw0KDQogICAgICAvLyBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHdlJ2xsIHdhbnQgdG8gc2ltcGx5IHVzZSB0aGUgYmluZGluZ0RlZidzDQogICAgICAvLyB2ZXJzaW9uIG9mIG1ldGhvZHMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvDQogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwNCiAgICAgIC8vIG1ldGhvZHMgaW4gdGhlIGZ1dHVyZSwgYW5kIHdlIHdhbnQgdGhlbSB0byBiZSBvdmVycmlkZWFibGUgYnkNCiAgICAgIC8vIEhUTUxXaWRnZXQgYmluZGluZyBkZWZpbml0aW9ucywgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoaXMNCiAgICAgIC8vIGxpc3QuDQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJnZXRJZCIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUNoYW5nZSIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7DQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJyZW5kZXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiY2xlYXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7DQoNCiAgICAgIC8vIFRoZSBmaW5kLCByZW5kZXJWYWx1ZSwgYW5kIHJlc2l6ZSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB3ZQ0KICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLmZpbmQgPSBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7DQoNCiAgICAgICAgLy8gT25seSByZXR1cm4gZWxlbWVudHMgdGhhdCBhcmUgU2hpbnkgb3V0cHV0cywgbm90IHN0YXRpYyBvbmVzDQogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7DQoNCiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdoYXRldmVyIGNhdXNlZCBTaGlueSB0byB0aGluayB0aGVyZSBtaWdodCBiZQ0KICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuDQogICAgICAgIC8vIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvdHMgb2YgZGlmZmVyZW50IGh0bWx3aWRnZXRzIGJpbmRpbmdzLCB3ZQ0KICAgICAgICAvLyBzY2hlZHVsZSBleGVjdXRpb24gZm9yIGxhdGVyLS1ubyBuZWVkIHRvIHN0YXRpY1JlbmRlciBtdWx0aXBsZQ0KICAgICAgICAvLyB0aW1lcy4NCiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSBkeW5hbWljUmVzdWx0cy5sZW5ndGgpDQogICAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXIoKTsNCg0KICAgICAgICByZXR1cm4gZHluYW1pY1Jlc3VsdHM7DQogICAgICB9Ow0KDQogICAgICAvLyBXcmFwIHJlbmRlclZhbHVlIHRvIGhhbmRsZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBpc24ndA0KICAgICAgLy8gc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFNoaW55IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLnJlbmRlclZhbHVlID0gZnVuY3Rpb24oZWwsIGRhdGEpIHsNCiAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMNCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2ldKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWJpbmRpbmdEZWYucmVuZGVyT25OdWxsVmFsdWUpIHsNCiAgICAgICAgICBpZiAoZGF0YS54ID09PSBudWxsKSB7DQogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7DQogICAgICAgICAgaW5pdFNpemluZyhlbCk7DQoNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7DQogICAgICAgICAgaWYgKGJpbmRpbmdEZWYuaW5pdGlhbGl6ZSkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGJpbmRpbmdEZWYuaW5pdGlhbGl6ZShlbCwgZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgcmVzdWx0KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgU2hpbnkucmVuZGVyRGVwZW5kZW5jaWVzKGRhdGEuZGVwcyk7DQogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsNCiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7DQogICAgICB9Ow0KDQogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQNCiAgICAgIGlmIChiaW5kaW5nRGVmLnJlc2l6ZSkgew0KICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuDQogICAgICAgICAgLy8gY2FsbGVkLCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHdpZGdldHMuDQogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgew0KICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgfQ0KDQogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7DQogICAgfQ0KICB9Ow0KDQogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOw0KICBmdW5jdGlvbiBzY2hlZHVsZVN0YXRpY1JlbmRlcigpIHsNCiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgew0KICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsNCiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOw0KICAgICAgfSwgMSk7DQogICAgfQ0KICB9DQoNCiAgLy8gUmVuZGVyIHN0YXRpYyB3aWRnZXRzIGFmdGVyIHRoZSBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nDQogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgYmluZGluZ3MgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsNCiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOw0KICAgICAgZm9yRWFjaChtYXRjaGVzLCBmdW5jdGlvbihlbCkgew0KICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOw0KDQogICAgICAgIGlmIChoYXNDbGFzcyhlbCwgImh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCIpKQ0KICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOw0KDQogICAgICAgIHZhciBpbml0UmVzdWx0Ow0KICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7DQogICAgICAgICAgaW5pdFJlc3VsdCA9IGJpbmRpbmcuaW5pdGlhbGl6ZShlbCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgKTsNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsNCiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsNCiAgICAgICAgICB2YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBzaXplID0gew0KICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApDQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQ0KICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICBsYXN0U2l6ZSA9IHNpemU7DQogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOw0KICAgICAgICAgIH07DQoNCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsNCg0KICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBjYXNlcyB3aGVyZSB3ZSdyZSBydW5uaW5nIGluIGEgU2hpbnkNCiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dA0KICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzDQogICAgICAgICAgLy8gYW4gcm1hcmtkb3duIGRvY3VtZW50IHRoYXQgaGFzIHJ1bnRpbWU6c2hpbnkgYW5kIHdpZGdldA0KICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8NCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMNCiAgICAgICAgICAvLyB3aWRnZXRzLCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuDQogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAic2hvd24uaHRtbHdpZGdldHMgc2hvd24uYnMudGFiLmh0bWx3aWRnZXRzIHNob3duLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoDQogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLg0KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUNCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LA0KICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlDQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4NCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsNCiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcg0KICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cw0KICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4NCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOw0KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsNCiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsNCiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOw0KICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzDQogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7DQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOw0KICB9DQoNCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuDQogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsNCiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICB9LCBmYWxzZSk7DQogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsNCiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7DQogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7DQogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsNCiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0NCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQ0KICAgICAga2V5ID0gMTsNCg0KICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOw0KICAgIGlmICghbGluaykgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsNCiAgICB9DQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgew0KICAgIHZhciBuYW1lcyA9IFtdOw0KICAgIHZhciBsZW5ndGg7DQogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgew0KICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpDQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOw0KICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsNCiAgICAgICAgfQ0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7DQogICAgfQ0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGl0ZW07DQogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgew0KICAgICAgICBpdGVtID0ge307DQogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsNCiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOw0KICAgICAgICB9DQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgew0KICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5Ow0KICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgew0KICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7DQogICAgICAgICAgICAgIHJldHVybiByb3dbaV0NCiAgICAgICAgICB9KQ0KICAgICAgfSk7DQogICAgICByZXR1cm4gbmV3QXJyYXk7DQogIH07DQogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkDQogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcg0KICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLg0KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgew0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOw0KICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsNCiAgICAgIGlmICghZXNjYXBlTW9kZSkgew0KICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7DQogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOw0KICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsNCiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7DQogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107DQogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7DQogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7DQogICAgfQ0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUNCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7DQogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsNCiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQ0KICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgew0KICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlDQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikNCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOw0KICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QNCiAgICAgICAgICBvID0gb1twYXJ0XTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfTsNCg0KICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuDQogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pDQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7DQogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsNCiAgfTsNCg0KICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwNCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUNCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0DQogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLg0KICAvLw0KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgew0KICAgICAgc2VsZWN0b3IgPSBzY29wZTsNCiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7DQogICAgfQ0KDQogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7DQogICAgaWYgKGVsID09PSBudWxsKSB7DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9IGVsc2Ugew0KICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7DQogICAgfQ0KICB9Ow0KDQogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZA0KICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdA0KICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQNCiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuDQogIC8vDQogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4NCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICBzZWxlY3RvciA9IHNjb3BlOw0KICAgICAgc2NvcGUgPSBkb2N1bWVudDsNCiAgICB9DQoNCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOw0KICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7DQogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsNCiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7DQogICAgICBpZiAoaGFuZGxlcikgew0KICAgICAgICBoYW5kbGVyKCk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlDQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOw0KICB9Ow0KDQogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuDQogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nDQogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoDQogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLg0KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7DQogICAgdmFyIHJlc3VsdCA9IHsNCiAgICAgIG5hbWU6IGRlZm4ubmFtZSwNCiAgICAgIHR5cGU6IGRlZm4udHlwZSwNCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgfSwNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsNCiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOw0KICAgICAgfSwNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7DQogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7DQogICAgICB9DQogICAgfTsNCg0KICAgIGlmIChkZWZuLmZpbmQpDQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsNCiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikNCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7DQogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikNCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOw0KDQogICAgcmV0dXJuIHJlc3VsdDsNCiAgfQ0KfSkoKTsNCg0K"></script>
<link href="data:text/css;charset=utf-8,%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>
<script src="data:application/x-javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZyBWZXJzaW9uIDQuNy4wLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suCihmdW5jdGlvbih0LG4peyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bihleHBvcnRzKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiXSxuKTpuKHQuZDM9dC5kM3x8e30pfSkodGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gcXModChuKSxlKX19ZnVuY3Rpb24gZSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIHIodCxuLGUpe3ZhciByPU1hdGguYWJzKG4tdCkvTWF0aC5tYXgoMCxlKSxpPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjEwKSksbz1yL2k7cmV0dXJuIG8+PUtzP2kqPTEwOm8+PXRmP2kqPTU6bz49bmYmJihpKj0yKSxuPHQ/LWk6aX1mdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aH1mdW5jdGlvbiBvKHQpe3JldHVybiJ0cmFuc2xhdGUoIit0KyIsMCkifWZ1bmN0aW9uIHUodCl7cmV0dXJuInRyYW5zbGF0ZSgwLCIrdCsiKSJ9ZnVuY3Rpb24gYSh0KXt2YXIgbj10LmJhbmR3aWR0aCgpLzI7cmV0dXJuIHQucm91bmQoKSYmKG49TWF0aC5yb3VuZChuKSksZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrbn19ZnVuY3Rpb24gYygpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiBzKHQsbil7ZnVuY3Rpb24gZShlKXt2YXIgbz1udWxsPT1zP24udGlja3M/bi50aWNrcy5hcHBseShuLGkpOm4uZG9tYWluKCk6cyx1PW51bGw9PWY/bi50aWNrRm9ybWF0P24udGlja0Zvcm1hdC5hcHBseShuLGkpOmJmOmYsZz1NYXRoLm1heChsLDApK3AseT1uLnJhbmdlKCksbT15WzBdKy41LHg9eVt5Lmxlbmd0aC0xXSsuNSxiPShuLmJhbmR3aWR0aD9hOmJmKShuLmNvcHkoKSksdz1lLnNlbGVjdGlvbj9lLnNlbGVjdGlvbigpOmUsTT13LnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSxUPXcuc2VsZWN0QWxsKCIudGljayIpLmRhdGEobyxuKS5vcmRlcigpLGs9VC5leGl0KCksUz1ULmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJ0aWNrIiksTj1ULnNlbGVjdCgibGluZSIpLEU9VC5zZWxlY3QoInRleHQiKTtNPU0ubWVyZ2UoTS5lbnRlcigpLmluc2VydCgicGF0aCIsIi50aWNrIikuYXR0cigiY2xhc3MiLCJkb21haW4iKS5hdHRyKCJzdHJva2UiLCIjMDAwIikpLFQ9VC5tZXJnZShTKSxOPU4ubWVyZ2UoUy5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cihyKyIyIixkKmwpLmF0dHIodisiMSIsLjUpLmF0dHIodisiMiIsLjUpKSxFPUUubWVyZ2UoUy5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiIzAwMCIpLmF0dHIocixkKmcpLmF0dHIodiwuNSkuYXR0cigiZHkiLHQ9PT13Zj8iMGVtIjp0PT09VGY/IjAuNzFlbSI6IjAuMzJlbSIpKSxlIT09dyYmKE09TS50cmFuc2l0aW9uKGUpLFQ9VC50cmFuc2l0aW9uKGUpLE49Ti50cmFuc2l0aW9uKGUpLEU9RS50cmFuc2l0aW9uKGUpLGs9ay50cmFuc2l0aW9uKGUpLmF0dHIoIm9wYWNpdHkiLFNmKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PWIodCkpP18odCk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSksUy5hdHRyKCJvcGFjaXR5IixTZikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXt2YXIgbj10aGlzLnBhcmVudE5vZGUuX19heGlzO3JldHVybiBfKG4mJmlzRmluaXRlKG49bih0KSk/bjpiKHQpKX0pKSxrLnJlbW92ZSgpLE0uYXR0cigiZCIsdD09PWtmfHx0PT1NZj8iTSIrZCpoKyIsIittKyJIMC41ViIreCsiSCIrZCpoOiJNIittKyIsIitkKmgrIlYwLjVIIit4KyJWIitkKmgpLFQuYXR0cigib3BhY2l0eSIsMSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXtyZXR1cm4gXyhiKHQpKX0pLE4uYXR0cihyKyIyIixkKmwpLEUuYXR0cihyLGQqZykudGV4dCh1KSx3LmZpbHRlcihjKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIix0PT09TWY/InN0YXJ0Ijp0PT09a2Y/ImVuZCI6Im1pZGRsZSIpLHcuZWFjaChmdW5jdGlvbigpe3RoaXMuX19heGlzPWJ9KX12YXIgcixpPVtdLHM9bnVsbCxmPW51bGwsbD02LGg9NixwPTMsZD10PT09d2Z8fHQ9PT1rZj8tMToxLHY9dD09PWtmfHx0PT09TWY/KHI9IngiLCJ5Iik6KHI9InkiLCJ4IiksXz10PT09d2Z8fHQ9PT1UZj9vOnU7cmV0dXJuIGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlKTpufSxlLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGk9eGYuY2FsbChhcmd1bWVudHMpLGV9LGUudGlja0FyZ3VtZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT10P1tdOnhmLmNhbGwodCksZSk6aS5zbGljZSgpfSxlLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bnVsbD09dD9udWxsOnhmLmNhbGwodCksZSk6cyYmcy5zbGljZSgpfSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9dCxlKTpmfSxlLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWg9K3QsZSk6bH0sZS50aWNrU2l6ZUlubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSt0LGUpOmx9LGUudGlja1NpemVPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdCxlKTpofSxlLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0LGUpOnB9LGV9ZnVuY3Rpb24gZih0KXtyZXR1cm4gcyh3Zix0KX1mdW5jdGlvbiBsKHQpe3JldHVybiBzKE1mLHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHMoVGYsdCl9ZnVuY3Rpb24gcCh0KXtyZXR1cm4gcyhrZix0KX1mdW5jdGlvbiBkKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyB2KHIpfWZ1bmN0aW9uIHYodCl7dGhpcy5fPXR9ZnVuY3Rpb24gXyh0LG4pe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9IiIscj10LmluZGV4T2YoIi4iKTtpZihyPj0wJiYoZT10LnNsaWNlKHIrMSksdD10LnNsaWNlKDAscikpLHQmJiFuLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTplfX0pfWZ1bmN0aW9uIGcodCxuKXtmb3IodmFyIGUscj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZigoZT10W3JdKS5uYW1lPT09bilyZXR1cm4gZS52YWx1ZX1mdW5jdGlvbiB5KHQsbixlKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYodFtyXS5uYW1lPT09bil7dFtyXT1OZix0PXQuc2xpY2UoMCxyKS5jb25jYXQodC5zbGljZShyKzEpKTticmVha31yZXR1cm4gbnVsbCE9ZSYmdC5wdXNoKHtuYW1lOm4sdmFsdWU6ZX0pLHR9ZnVuY3Rpb24gbSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLm93bmVyRG9jdW1lbnQsZT10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gZT09PUVmJiZuLmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkk9PT1FZj9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19ZnVuY3Rpb24geCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBiKCl7cmV0dXJuIG5ldyB3fWZ1bmN0aW9uIHcoKXt0aGlzLl89IkAiKygrK1BmKS50b1N0cmluZygzNil9ZnVuY3Rpb24gTSh0LG4sZSl7cmV0dXJuIHQ9VCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIFQobixlLHIpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgbz10LmV2ZW50O3QuZXZlbnQ9aTt0cnl7bi5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLHIpfWZpbmFsbHl7dC5ldmVudD1vfX19ZnVuY3Rpb24gayh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJihuPXQuc2xpY2UoZSsxKSx0PXQuc2xpY2UoMCxlKSkse3R5cGU6dCxuYW1lOm59fSl9ZnVuY3Rpb24gUyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9fb247aWYobil7Zm9yKHZhciBlLHI9MCxpPS0xLG89bi5sZW5ndGg7cjxvOysrcillPW5bcl0sdC50eXBlJiZlLnR5cGUhPT10LnR5cGV8fGUubmFtZSE9PXQubmFtZT9uWysraV09ZTp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS50eXBlLGUubGlzdGVuZXIsZS5jYXB0dXJlKTsrK2k/bi5sZW5ndGg9aTpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gTih0LG4sZSl7dmFyIHI9RGYuaGFzT3duUHJvcGVydHkodC50eXBlKT9NOlQ7cmV0dXJuIGZ1bmN0aW9uKGksbyx1KXt2YXIgYSxjPXRoaXMuX19vbixzPXIobixvLHUpO2lmKGMpZm9yKHZhciBmPTAsbD1jLmxlbmd0aDtmPGw7KytmKWlmKChhPWNbZl0pLnR5cGU9PT10LnR5cGUmJmEubmFtZT09PXQubmFtZSlyZXR1cm4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGEudHlwZSxhLmxpc3RlbmVyLGEuY2FwdHVyZSksdGhpcy5hZGRFdmVudExpc3RlbmVyKGEudHlwZSxhLmxpc3RlbmVyPXMsYS5jYXB0dXJlPWUpLHZvaWQoYS52YWx1ZT1uKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodC50eXBlLHMsZSksYT17dHlwZTp0LnR5cGUsbmFtZTp0Lm5hbWUsdmFsdWU6bixsaXN0ZW5lcjpzLGNhcHR1cmU6ZX0sYz9jLnB1c2goYSk6dGhpcy5fX29uPVthXX19ZnVuY3Rpb24gRShuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIEEoKXt9ZnVuY3Rpb24gQygpe3JldHVybltdfWZ1bmN0aW9uIHoodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59ZnVuY3Rpb24gUCh0LG4sZSxyLGksbyl7Zm9yKHZhciB1LGE9MCxjPW4ubGVuZ3RoLHM9by5sZW5ndGg7YTxzOysrYSkodT1uW2FdKT8odS5fX2RhdGFfXz1vW2FdLHJbYV09dSk6ZVthXT1uZXcgeih0LG9bYV0pO2Zvcig7YTxjOysrYSkodT1uW2FdKSYmKGlbYV09dSl9ZnVuY3Rpb24gUih0LG4sZSxyLGksbyx1KXt2YXIgYSxjLHMsZj17fSxsPW4ubGVuZ3RoLGg9by5sZW5ndGgscD1uZXcgQXJyYXkobCk7Zm9yKGE9MDthPGw7KythKShjPW5bYV0pJiYocFthXT1zPUdmK3UuY2FsbChjLGMuX19kYXRhX18sYSxuKSxzIGluIGY/aVthXT1jOmZbc109Yyk7Zm9yKGE9MDthPGg7KythKXM9R2YrdS5jYWxsKHQsb1thXSxhLG8pLChjPWZbc10pPyhyW2FdPWMsYy5fX2RhdGFfXz1vW2FdLGZbc109bnVsbCk6ZVthXT1uZXcgeih0LG9bYV0pO2ZvcihhPTA7YTxsOysrYSkoYz1uW2FdKSYmZltwW2FdXT09PWMmJihpW2FdPWMpfWZ1bmN0aW9uIEwodCxuKXtyZXR1cm4gdDxuPy0xOnQ+bj8xOnQ+PW4/MDpOYU59ZnVuY3Rpb24gcSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gVSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIEQodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBPKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fWZ1bmN0aW9uIEYodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsZSl9fWZ1bmN0aW9uIEkodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gWSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBCKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixlKX19ZnVuY3Rpb24gaih0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxyLGUpfX1mdW5jdGlvbiBIKHQpe3JldHVybiBmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3RdfX1mdW5jdGlvbiBYKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1t0XT1ufX1mdW5jdGlvbiBWKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fWZ1bmN0aW9uIFcodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uICQodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgWih0KX1mdW5jdGlvbiBaKHQpe3RoaXMuX25vZGU9dCx0aGlzLl9uYW1lcz1XKHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gRyh0LG4pe2Zvcih2YXIgZT0kKHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5hZGQobltyXSl9ZnVuY3Rpb24gSih0LG4pe2Zvcih2YXIgZT0kKHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24gUSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtHKHRoaXMsdCl9fWZ1bmN0aW9uIEsodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Sih0aGlzLHQpfX1mdW5jdGlvbiB0dCh0LG4pe3JldHVybiBmdW5jdGlvbigpeyhuLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9HOkopKHRoaXMsdCl9fWZ1bmN0aW9uIG50KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBldCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIHJ0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX1mdW5jdGlvbiBpdCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIG90KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIHV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PW4/IiI6bn19ZnVuY3Rpb24gYXQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gY3QoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBzdCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIGZ0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gbHQodCxuLGUpe3ZhciByPXNsKHQpLGk9ci5DdXN0b21FdmVudDtpP2k9bmV3IGkobixlKTooaT1yLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGU/KGkuaW5pdEV2ZW50KG4sZS5idWJibGVzLGUuY2FuY2VsYWJsZSksaS5kZXRhaWw9ZS5kZXRhaWwpOmkuaW5pdEV2ZW50KG4sITEsITEpKSx0LmRpc3BhdGNoRXZlbnQoaSl9ZnVuY3Rpb24gaHQodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbHQodGhpcyx0LG4pfX1mdW5jdGlvbiBwdCh0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBsdCh0aGlzLHQsbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX1mdW5jdGlvbiBkdCh0LG4pe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bn1mdW5jdGlvbiB2dCgpe3JldHVybiBuZXcgZHQoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSx3bCl9ZnVuY3Rpb24gX3QoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGd0KHQsbil7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscj1NbCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLG51bGwpO24mJihyLm9uKCJjbGljay5kcmFnIixObCwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe3Iub24oImNsaWNrLmRyYWciLG51bGwpfSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gZT9yLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKTooZS5zdHlsZS5Nb3pVc2VyU2VsZWN0PWUuX19ub3NlbGVjdCxkZWxldGUgZS5fX25vc2VsZWN0KX1mdW5jdGlvbiB5dCh0LG4sZSxyLGksbyx1LGEsYyxzKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc3ViamVjdD1lLHRoaXMuaWRlbnRpZmllcj1yLHRoaXMuYWN0aXZlPWksdGhpcy54PW8sdGhpcy55PXUsdGhpcy5keD1hLHRoaXMuZHk9Yyx0aGlzLl89c31mdW5jdGlvbiBtdCgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiB4dCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gYnQobil7cmV0dXJuIG51bGw9PW4/e3g6dC5ldmVudC54LHk6dC5ldmVudC55fTpufWZ1bmN0aW9uIHd0KHQsbil7dmFyIGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfWZ1bmN0aW9uIE10KCl7fWZ1bmN0aW9uIFR0KHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1EbC5leGVjKHQpKT8obj1wYXJzZUludChuWzFdLDE2KSxuZXcgQXQobj4+OCYxNXxuPj40JjI0MCxuPj40JjE1fDI0MCZuLCgxNSZuKTw8NHwxNSZuLDEpKToobj1PbC5leGVjKHQpKT9rdChwYXJzZUludChuWzFdLDE2KSk6KG49RmwuZXhlYyh0KSk/bmV3IEF0KG5bMV0sblsyXSxuWzNdLDEpOihuPUlsLmV4ZWModCkpP25ldyBBdCgyNTUqblsxXS8xMDAsMjU1Km5bMl0vMTAwLDI1NSpuWzNdLzEwMCwxKToobj1ZbC5leGVjKHQpKT9TdChuWzFdLG5bMl0sblszXSxuWzRdKToobj1CbC5leGVjKHQpKT9TdCgyNTUqblsxXS8xMDAsMjU1Km5bMl0vMTAwLDI1NSpuWzNdLzEwMCxuWzRdKToobj1qbC5leGVjKHQpKT9DdChuWzFdLG5bMl0vMTAwLG5bM10vMTAwLDEpOihuPUhsLmV4ZWModCkpP0N0KG5bMV0sblsyXS8xMDAsblszXS8xMDAsbls0XSk6WGwuaGFzT3duUHJvcGVydHkodCk/a3QoWGxbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBBdChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIGt0KHQpe3JldHVybiBuZXcgQXQodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIFN0KHQsbixlLHIpe3JldHVybiByPD0wJiYodD1uPWU9TmFOKSxuZXcgQXQodCxuLGUscil9ZnVuY3Rpb24gTnQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBNdHx8KHQ9VHQodCkpLHQ/KHQ9dC5yZ2IoKSxuZXcgQXQodC5yLHQuZyx0LmIsdC5vcGFjaXR5KSk6bmV3IEF0fWZ1bmN0aW9uIEV0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9OdCh0KTpuZXcgQXQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIEF0KHQsbixlLHIpe3RoaXMucj0rdCx0aGlzLmc9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBDdCh0LG4sZSxyKXtyZXR1cm4gcjw9MD90PW49ZT1OYU46ZTw9MHx8ZT49MT90PW49TmFOOm48PTAmJih0PU5hTiksbmV3IFJ0KHQsbixlLHIpfWZ1bmN0aW9uIHp0KHQpe2lmKHQgaW5zdGFuY2VvZiBSdClyZXR1cm4gbmV3IFJ0KHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIE10fHwodD1UdCh0KSksIXQpcmV0dXJuIG5ldyBSdDtpZih0IGluc3RhbmNlb2YgUnQpcmV0dXJuIHQ7dD10LnJnYigpO3ZhciBuPXQuci8yNTUsZT10LmcvMjU1LHI9dC5iLzI1NSxpPU1hdGgubWluKG4sZSxyKSxvPU1hdGgubWF4KG4sZSxyKSx1PU5hTixhPW8taSxjPShvK2kpLzI7cmV0dXJuIGE/KHU9bj09PW8/KGUtcikvYSs2KihlPHIpOmU9PT1vPyhyLW4pL2ErMjoobi1lKS9hKzQsYS89YzwuNT9vK2k6Mi1vLWksdSo9NjApOmE9Yz4wJiZjPDE/MDp1LG5ldyBSdCh1LGEsYyx0Lm9wYWNpdHkpfWZ1bmN0aW9uIFB0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD96dCh0KTpuZXcgUnQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFJ0KHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBMdCh0LG4sZSl7cmV0dXJuIDI1NSoodDw2MD9uKyhlLW4pKnQvNjA6dDwxODA/ZTp0PDI0MD9uKyhlLW4pKigyNDAtdCkvNjA6bil9ZnVuY3Rpb24gcXQodCl7aWYodCBpbnN0YW5jZW9mIER0KXJldHVybiBuZXcgRHQodC5sLHQuYSx0LmIsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgSHQpe3ZhciBuPXQuaCpWbDtyZXR1cm4gbmV3IER0KHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIEF0fHwodD1OdCh0KSk7dmFyIGU9WXQodC5yKSxyPVl0KHQuZyksaT1ZdCh0LmIpLG89T3QoKC40MTI0NTY0KmUrLjM1NzU3NjEqcisuMTgwNDM3NSppKS9abCksdT1PdCgoLjIxMjY3MjkqZSsuNzE1MTUyMipyKy4wNzIxNzUqaSkvR2wpO3JldHVybiBuZXcgRHQoMTE2KnUtMTYsNTAwKihvLXUpLDIwMCoodS1PdCgoLjAxOTMzMzkqZSsuMTE5MTkyKnIrLjk1MDMwNDEqaSkvSmwpKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIFV0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9xdCh0KTpuZXcgRHQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIER0KHQsbixlLHIpe3RoaXMubD0rdCx0aGlzLmE9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBPdCh0KXtyZXR1cm4gdD5uaD9NYXRoLnBvdyh0LDEvMyk6dC90aCtRbH1mdW5jdGlvbiBGdCh0KXtyZXR1cm4gdD5LbD90KnQqdDp0aCoodC1RbCl9ZnVuY3Rpb24gSXQodCl7cmV0dXJuIDI1NSoodDw9LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LDEvMi40KS0uMDU1KX1mdW5jdGlvbiBZdCh0KXtyZXR1cm4odC89MjU1KTw9LjA0MDQ1P3QvMTIuOTI6TWF0aC5wb3coKHQrLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBCdCh0KXtpZih0IGluc3RhbmNlb2YgSHQpcmV0dXJuIG5ldyBIdCh0LmgsdC5jLHQubCx0Lm9wYWNpdHkpO3QgaW5zdGFuY2VvZiBEdHx8KHQ9cXQodCkpO3ZhciBuPU1hdGguYXRhbjIodC5iLHQuYSkqV2w7cmV0dXJuIG5ldyBIdChuPDA/biszNjA6bixNYXRoLnNxcnQodC5hKnQuYSt0LmIqdC5iKSx0LmwsdC5vcGFjaXR5KX1mdW5jdGlvbiBqdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/QnQodCk6bmV3IEh0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBIdCh0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5jPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gWHQodCl7aWYodCBpbnN0YW5jZW9mIFd0KXJldHVybiBuZXcgV3QodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgQXR8fCh0PU50KHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oc2gqcithaCpuLWNoKmUpLyhzaCthaC1jaCksbz1yLWksdT0odWgqKGUtaSktaWgqbykvb2gsYT1NYXRoLnNxcnQodSp1K28qbykvKHVoKmkqKDEtaSkpLGM9YT9NYXRoLmF0YW4yKHUsbykqV2wtMTIwOk5hTjtyZXR1cm4gbmV3IFd0KGM8MD9jKzM2MDpjLGEsaSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIFZ0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9YdCh0KTpuZXcgV3QodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFd0KHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiAkdCh0LG4sZSxyLGkpe3ZhciBvPXQqdCx1PW8qdDtyZXR1cm4oKDEtMyp0KzMqby11KSpuKyg0LTYqbyszKnUpKmUrKDErMyp0KzMqby0zKnUpKnIrdSppKS82fWZ1bmN0aW9uIFp0KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0K2Uqbn19ZnVuY3Rpb24gR3QodCxuLGUpe3JldHVybiB0PU1hdGgucG93KHQsZSksbj1NYXRoLnBvdyhuLGUpLXQsZT0xL2UsZnVuY3Rpb24ocil7cmV0dXJuIE1hdGgucG93KHQrcipuLGUpfX1mdW5jdGlvbiBKdCh0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9adCh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6eWgoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gMT09PSh0PSt0KT9LdDpmdW5jdGlvbihuLGUpe3JldHVybiBlLW4/R3QobixlLHQpOnloKGlzTmFOKG4pP2U6bil9fWZ1bmN0aW9uIEt0KHQsbil7dmFyIGU9bi10O3JldHVybiBlP1p0KHQsZSk6eWgoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiB0bih0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGUscixpPW4ubGVuZ3RoLG89bmV3IEFycmF5KGkpLHU9bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KGkpO2ZvcihlPTA7ZTxpOysrZSlyPUV0KG5bZV0pLG9bZV09ci5yfHwwLHVbZV09ci5nfHwwLGFbZV09ci5ifHwwO3JldHVybiBvPXQobyksdT10KHUpLGE9dChhKSxyLm9wYWNpdHk9MSxmdW5jdGlvbih0KXtyZXR1cm4gci5yPW8odCksci5nPXUodCksci5iPWEodCkscisiIn19fWZ1bmN0aW9uIG5uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBlbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9fWZ1bmN0aW9uIHJuKHQpe3JldHVybiJub25lIj09PXQ/UGg6KGZofHwoZmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksbGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGhoPWRvY3VtZW50LmRlZmF1bHRWaWV3KSxmaC5zdHlsZS50cmFuc2Zvcm09dCx0PWhoLmdldENvbXB1dGVkU3R5bGUobGguYXBwZW5kQ2hpbGQoZmgpLG51bGwpLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpLGxoLnJlbW92ZUNoaWxkKGZoKSx0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSxSaCgrdFswXSwrdFsxXSwrdFsyXSwrdFszXSwrdFs0XSwrdFs1XSkpfWZ1bmN0aW9uIG9uKHQpe3JldHVybiBudWxsPT10P1BoOihwaHx8KHBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLHBoLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KSwodD1waC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKT8odD10Lm1hdHJpeCxSaCh0LmEsdC5iLHQuYyx0LmQsdC5lLHQuZikpOlBoKX1mdW5jdGlvbiB1bih0LG4sZSxyKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1mdW5jdGlvbiBvKHQscixpLG8sdSxhKXtpZih0IT09aXx8ciE9PW8pe3ZhciBjPXUucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxuLG51bGwsZSk7YS5wdXNoKHtpOmMtNCx4OlRoKHQsaSl9LHtpOmMtMix4OlRoKHIsbyl9KX1lbHNlKGl8fG8pJiZ1LnB1c2goInRyYW5zbGF0ZSgiK2krbitvK2UpfWZ1bmN0aW9uIHUodCxuLGUsbyl7dCE9PW4/KHQtbj4xODA/bis9MzYwOm4tdD4xODAmJih0Kz0zNjApLG8ucHVzaCh7aTplLnB1c2goaShlKSsicm90YXRlKCIsbnVsbCxyKS0yLHg6VGgodCxuKX0pKTpuJiZlLnB1c2goaShlKSsicm90YXRlKCIrbityKX1mdW5jdGlvbiBhKHQsbixlLG8pe3QhPT1uP28ucHVzaCh7aTplLnB1c2goaShlKSsic2tld1goIixudWxsLHIpLTIseDpUaCh0LG4pfSk6biYmZS5wdXNoKGkoZSkrInNrZXdYKCIrbityKX1mdW5jdGlvbiBjKHQsbixlLHIsbyx1KXtpZih0IT09ZXx8biE9PXIpe3ZhciBhPW8ucHVzaChpKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTt1LnB1c2goe2k6YS00LHg6VGgodCxlKX0se2k6YS0yLHg6VGgobixyKX0pfWVsc2UgMT09PWUmJjE9PT1yfHxvLnB1c2goaShvKSsic2NhbGUoIitlKyIsIityKyIpIil9cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9W10saT1bXTtyZXR1cm4gbj10KG4pLGU9dChlKSxvKG4udHJhbnNsYXRlWCxuLnRyYW5zbGF0ZVksZS50cmFuc2xhdGVYLGUudHJhbnNsYXRlWSxyLGkpLHUobi5yb3RhdGUsZS5yb3RhdGUscixpKSxhKG4uc2tld1gsZS5za2V3WCxyLGkpLGMobi5zY2FsZVgsbi5zY2FsZVksZS5zY2FsZVgsZS5zY2FsZVkscixpKSxuPWU9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxvPWkubGVuZ3RoOysrZTxvOylyWyhuPWlbZV0pLmldPW4ueCh0KTtyZXR1cm4gci5qb2luKCIiKX19fWZ1bmN0aW9uIGFuKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSkrMS90KS8yfWZ1bmN0aW9uIGNuKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfWZ1bmN0aW9uIHNuKHQpe3JldHVybigodD1NYXRoLmV4cCgyKnQpKS0xKS8odCsxKX1mdW5jdGlvbiBmbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPVB0KG4pKS5oLChlPVB0KGUpKS5oKSxpPUt0KG4ucyxlLnMpLG89S3Qobi5sLGUubCksdT1LdChuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT11KHQpLG4rIiJ9fX1mdW5jdGlvbiBsbih0LG4pe3ZhciBlPUt0KCh0PVV0KHQpKS5sLChuPVV0KG4pKS5sKSxyPUt0KHQuYSxuLmEpLGk9S3QodC5iLG4uYiksbz1LdCh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fWZ1bmN0aW9uIGhuKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQoKG49anQobikpLmgsKGU9anQoZSkpLmgpLGk9S3Qobi5jLGUuYyksbz1LdChuLmwsZS5sKSx1PUt0KG4ub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5oPXIodCksbi5jPWkodCksbi5sPW8odCksbi5vcGFjaXR5PXUodCksbisiIn19fWZ1bmN0aW9uIHBuKHQpe3JldHVybiBmdW5jdGlvbiBuKGUpe2Z1bmN0aW9uIHIobixyKXt2YXIgaT10KChuPVZ0KG4pKS5oLChyPVZ0KHIpKS5oKSxvPUt0KG4ucyxyLnMpLHU9S3Qobi5sLHIubCksYT1LdChuLm9wYWNpdHksci5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1pKHQpLG4ucz1vKHQpLG4ubD11KE1hdGgucG93KHQsZSkpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fXJldHVybiBlPStlLHIuZ2FtbWE9bixyfSgxKX1mdW5jdGlvbiBkbigpe3JldHVybiBLaHx8KGVwKHZuKSxLaD1ucC5ub3coKSt0cCl9ZnVuY3Rpb24gdm4oKXtLaD0wfWZ1bmN0aW9uIF9uKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiBnbih0LG4sZSl7dmFyIHI9bmV3IF9uO3JldHVybiByLnJlc3RhcnQodCxuLGUpLHJ9ZnVuY3Rpb24geW4oKXtkbigpLCsrJGg7Zm9yKHZhciB0LG49ZGg7bjspKHQ9S2gtbi5fdGltZSk+PTAmJm4uX2NhbGwuY2FsbChudWxsLHQpLG49bi5fbmV4dDstLSRofWZ1bmN0aW9uIG1uKCl7S2g9KFFoPW5wLm5vdygpKSt0cCwkaD1aaD0wO3RyeXt5bigpfWZpbmFsbHl7JGg9MCxibigpLEtoPTB9fWZ1bmN0aW9uIHhuKCl7dmFyIHQ9bnAubm93KCksbj10LVFoO24+SmgmJih0cC09bixRaD10KX1mdW5jdGlvbiBibigpe2Zvcih2YXIgdCxuLGU9ZGgscj0xLzA7ZTspZS5fY2FsbD8ocj5lLl90aW1lJiYocj1lLl90aW1lKSx0PWUsZT1lLl9uZXh0KToobj1lLl9uZXh0LGUuX25leHQ9bnVsbCxlPXQ/dC5fbmV4dD1uOmRoPW4pO3ZoPXQsd24ocil9ZnVuY3Rpb24gd24odCl7aWYoISRoKXtaaCYmKFpoPWNsZWFyVGltZW91dChaaCkpO3ZhciBuPXQtS2g7bj4yND8odDwxLzAmJihaaD1zZXRUaW1lb3V0KG1uLG4pKSxHaCYmKEdoPWNsZWFySW50ZXJ2YWwoR2gpKSk6KEdofHwoUWg9S2gsR2g9c2V0SW50ZXJ2YWwoeG4sSmgpKSwkaD0xLGVwKG1uKSl9fWZ1bmN0aW9uIE1uKHQsbil7dmFyIGU9dC5fX3RyYW5zaXRpb247aWYoIWV8fCEoZT1lW25dKXx8ZS5zdGF0ZT5hcCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlIik7cmV0dXJuIGV9ZnVuY3Rpb24gVG4odCxuKXt2YXIgZT10Ll9fdHJhbnNpdGlvbjtpZighZXx8IShlPWVbbl0pfHxlLnN0YXRlPnNwKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGUiKTtyZXR1cm4gZX1mdW5jdGlvbiBrbih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZSIpO3JldHVybiBlfWZ1bmN0aW9uIFNuKHQsbixlKXtmdW5jdGlvbiByKHQpe2Uuc3RhdGU9Y3AsZS50aW1lci5yZXN0YXJ0KGksZS5kZWxheSxlLnRpbWUpLGUuZGVsYXk8PXQmJmkodC1lLmRlbGF5KX1mdW5jdGlvbiBpKHIpe3ZhciBzLGYsbCxoO2lmKGUuc3RhdGUhPT1jcClyZXR1cm4gdSgpO2ZvcihzIGluIGMpaWYoaD1jW3NdLGgubmFtZT09PWUubmFtZSl7aWYoaC5zdGF0ZT09PWZwKXJldHVybiBycChpKTtoLnN0YXRlPT09bHA/KGguc3RhdGU9cHAsaC50aW1lci5zdG9wKCksaC5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxoLmluZGV4LGguZ3JvdXApLGRlbGV0ZSBjW3NdKTorczxuJiYoaC5zdGF0ZT1wcCxoLnRpbWVyLnN0b3AoKSxkZWxldGUgY1tzXSl9aWYocnAoZnVuY3Rpb24oKXtlLnN0YXRlPT09ZnAmJihlLnN0YXRlPWxwLGUudGltZXIucmVzdGFydChvLGUuZGVsYXksZS50aW1lKSxvKHIpKX0pLGUuc3RhdGU9c3AsZS5vbi5jYWxsKCJzdGFydCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksZS5zdGF0ZT09PXNwKXtmb3IoZS5zdGF0ZT1mcCxhPW5ldyBBcnJheShsPWUudHdlZW4ubGVuZ3RoKSxzPTAsZj0tMTtzPGw7KytzKShoPWUudHdlZW5bc10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSkmJihhWysrZl09aCk7YS5sZW5ndGg9ZisxfX1mdW5jdGlvbiBvKG4pe2Zvcih2YXIgcj1uPGUuZHVyYXRpb24/ZS5lYXNlLmNhbGwobnVsbCxuL2UuZHVyYXRpb24pOihlLnRpbWVyLnJlc3RhcnQodSksZS5zdGF0ZT1ocCwxKSxpPS0xLG89YS5sZW5ndGg7KytpPG87KWFbaV0uY2FsbChudWxsLHIpO2Uuc3RhdGU9PT1ocCYmKGUub24uY2FsbCgiZW5kIix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSx1KCkpfWZ1bmN0aW9uIHUoKXtlLnN0YXRlPXBwLGUudGltZXIuc3RvcCgpLGRlbGV0ZSBjW25dO2Zvcih2YXIgciBpbiBjKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259dmFyIGEsYz10Ll9fdHJhbnNpdGlvbjtjW25dPWUsZS50aW1lcj1nbihyLDAsZS50aW1lKX1mdW5jdGlvbiBObih0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9VG4odGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpe3I9ZT1vO2Zvcih2YXIgdT0wLGE9ci5sZW5ndGg7dTxhOysrdSlpZihyW3VdLm5hbWU9PT1uKXtyPXIuc2xpY2UoKSxyLnNwbGljZSh1LDEpO2JyZWFrfX1pLnR3ZWVuPXJ9fWZ1bmN0aW9uIEVuKHQsbixlKXt2YXIgcixpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1Ubih0aGlzLHQpLHU9by50d2VlbjtpZih1IT09cil7aT0ocj11KS5zbGljZSgpO2Zvcih2YXIgYT17bmFtZTpuLHZhbHVlOmV9LGM9MCxzPWkubGVuZ3RoO2M8czsrK2MpaWYoaVtjXS5uYW1lPT09bil7aVtjXT1hO2JyZWFrfWM9PT1zJiZpLnB1c2goYSl9by50d2Vlbj1pfX1mdW5jdGlvbiBBbih0LG4sZSl7dmFyIHI9dC5faWQ7cmV0dXJuIHQuZWFjaChmdW5jdGlvbigpe3ZhciB0PVRuKHRoaXMscik7KHQudmFsdWV8fCh0LnZhbHVlPXt9KSlbbl09ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxmdW5jdGlvbih0KXtyZXR1cm4ga24odCxyKS52YWx1ZVtuXX19ZnVuY3Rpb24gQ24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIHpuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gUG4odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX1mdW5jdGlvbiBSbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX1mdW5jdGlvbiBMbih0LG4sZSl7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciB1LGE9ZSh0aGlzKTtyZXR1cm4gbnVsbD09YT92b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKHQpOih1PXRoaXMuZ2V0QXR0cmlidXRlKHQpLHU9PT1hP251bGw6dT09PXImJmE9PT1pP286bz1uKHI9dSxpPWEpKX19ZnVuY3Rpb24gcW4odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdSxhPWUodGhpcyk7cmV0dXJuIG51bGw9PWE/dm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6KHU9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpLHU9PT1hP251bGw6dT09PXImJmE9PT1pP286bz1uKHI9dSxpPWEpKX19ZnVuY3Rpb24gVW4odCxuKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcyxyPW4uYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiByJiZmdW5jdGlvbihuKXtlLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX1mdW5jdGlvbiBEbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzLHI9bi5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe2Uuc2V0QXR0cmlidXRlKHQscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9ZnVuY3Rpb24gT24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtNbih0aGlzLHQpLmRlbGF5PStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gRm4odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe01uKHRoaXMsdCkuZGVsYXk9bn19ZnVuY3Rpb24gSW4odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtUbih0aGlzLHQpLmR1cmF0aW9uPStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gWW4odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe1RuKHRoaXMsdCkuZHVyYXRpb249bn19ZnVuY3Rpb24gQm4odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7VG4odGhpcyx0KS5lYXNlPW59fWZ1bmN0aW9uIGpuKHQpe3JldHVybih0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCl7dmFyIG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJih0PXQuc2xpY2UoMCxuKSksIXR8fCJzdGFydCI9PT10fSl9ZnVuY3Rpb24gSG4odCxuLGUpe3ZhciByLGksbz1qbihuKT9NbjpUbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdT1vKHRoaXMsdCksYT11Lm9uO2EhPT1yJiYoaT0ocj1hKS5jb3B5KCkpLm9uKG4sZSksdS5vbj1pfX1mdW5jdGlvbiBYbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBlIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtlIT09dClyZXR1cm47biYmbi5yZW1vdmVDaGlsZCh0aGlzKX19ZnVuY3Rpb24gVm4odCxuKXt2YXIgZSxyLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89c2wodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLHU9by5nZXRQcm9wZXJ0eVZhbHVlKHQpLGE9KHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksby5nZXRQcm9wZXJ0eVZhbHVlKHQpKTtyZXR1cm4gdT09PWE/bnVsbDp1PT09ZSYmYT09PXI/aTppPW4oZT11LHI9YSl9fWZ1bmN0aW9uIFduKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uICRuKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXNsKHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKHQpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19ZnVuY3Rpb24gWm4odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdT1zbCh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCksYT11LmdldFByb3BlcnR5VmFsdWUodCksYz1lKHRoaXMpO3JldHVybiBudWxsPT1jJiYodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxjPXUuZ2V0UHJvcGVydHlWYWx1ZSh0KSksYT09PWM/bnVsbDphPT09ciYmYz09PWk/bzpvPW4ocj1hLGk9Yyl9fWZ1bmN0aW9uIEduKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn1mdW5jdGlvbiBKbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIFFuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQodGhpcyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1uPyIiOm59fWZ1bmN0aW9uIEtuKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gdnQoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIG5lKCl7cmV0dXJuKytVcH1mdW5jdGlvbiBlZSh0KXtyZXR1cm4rdH1mdW5jdGlvbiByZSh0KXtyZXR1cm4gdCp0fWZ1bmN0aW9uIGllKHQpe3JldHVybiB0KigyLXQpfWZ1bmN0aW9uIG9lKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIHVlKHQpe3JldHVybiB0KnQqdH1mdW5jdGlvbiBhZSh0KXtyZXR1cm4tLXQqdCp0KzF9ZnVuY3Rpb24gY2UodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQqdDoodC09MikqdCp0KzIpLzJ9ZnVuY3Rpb24gc2UodCl7cmV0dXJuIDEtTWF0aC5jb3ModCpqcCl9ZnVuY3Rpb24gZmUodCl7cmV0dXJuIE1hdGguc2luKHQqanApfWZ1bmN0aW9uIGxlKHQpe3JldHVybigxLU1hdGguY29zKEJwKnQpKS8yfWZ1bmN0aW9uIGhlKHQpe3JldHVybiBNYXRoLnBvdygyLDEwKnQtMTApfWZ1bmN0aW9uIHBlKHQpe3JldHVybiAxLU1hdGgucG93KDIsLTEwKnQpfWZ1bmN0aW9uIGRlKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24gdmUodCl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtdCp0KX1mdW5jdGlvbiBfZSh0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4oKHQqPTIpPD0xPzEtTWF0aC5zcXJ0KDEtdCp0KTpNYXRoLnNxcnQoMS0odC09MikqdCkrMSkvMn1mdW5jdGlvbiB5ZSh0KXtyZXR1cm4gMS1tZSgxLXQpfWZ1bmN0aW9uIG1lKHQpe3JldHVybih0PSt0KTxIcD9LcCp0KnQ6dDxWcD9LcCoodC09WHApKnQrV3A6dDxacD9LcCoodC09JHApKnQrR3A6S3AqKHQtPUpwKSp0K1FwfWZ1bmN0aW9uIHhlKHQpe3JldHVybigodCo9Mik8PTE/MS1tZSgxLXQpOm1lKHQtMSkrMSkvMn1mdW5jdGlvbiBiZSh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBmZC50aW1lPWRuKCksZmQ7cmV0dXJuIGV9ZnVuY3Rpb24gd2UoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIE1lKHQpe3JldHVybnt0eXBlOnR9fWZ1bmN0aW9uIFRlKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIGtlKCl7dmFyIHQ9dGhpcy5vd25lclNWR0VsZW1lbnR8fHRoaXM7cmV0dXJuW1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dfWZ1bmN0aW9uIFNlKHQpe2Zvcig7IXQuX19icnVzaDspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0Ll9fYnJ1c2h9ZnVuY3Rpb24gTmUodCl7cmV0dXJuIHRbMF1bMF09PT10WzFdWzBdfHx0WzBdWzFdPT09dFsxXVsxXX1mdW5jdGlvbiBFZSh0KXt2YXIgbj10Ll9fYnJ1c2g7cmV0dXJuIG4/bi5kaW0ub3V0cHV0KG4uc2VsZWN0aW9uKTpudWxsfWZ1bmN0aW9uIEFlKCl7cmV0dXJuIHplKGJkKX1mdW5jdGlvbiBDZSgpe3JldHVybiB6ZSh3ZCl9ZnVuY3Rpb24gemUobil7ZnVuY3Rpb24gZSh0KXt2YXIgZT10LnByb3BlcnR5KCJfX2JydXNoIixhKS5zZWxlY3RBbGwoIi5vdmVybGF5IikuZGF0YShbTWUoIm92ZXJsYXkiKV0pO2UuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsIm92ZXJsYXkiKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLmF0dHIoImN1cnNvciIsVGQub3ZlcmxheSkubWVyZ2UoZSkuZWFjaChmdW5jdGlvbigpe3ZhciB0PVNlKHRoaXMpLmV4dGVudDtNbCh0aGlzKS5hdHRyKCJ4Iix0WzBdWzBdKS5hdHRyKCJ5Iix0WzBdWzFdKS5hdHRyKCJ3aWR0aCIsdFsxXVswXS10WzBdWzBdKS5hdHRyKCJoZWlnaHQiLHRbMV1bMV0tdFswXVsxXSl9KSx0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLmRhdGEoW01lKCJzZWxlY3Rpb24iKV0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJzZWxlY3Rpb24iKS5hdHRyKCJjdXJzb3IiLFRkLnNlbGVjdGlvbikuYXR0cigiZmlsbCIsIiM3NzciKS5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKS5hdHRyKCJzdHJva2UiLCIjZmZmIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO3ZhciBpPXQuc2VsZWN0QWxsKCIuaGFuZGxlIikuZGF0YShuLmhhbmRsZXMsZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZX0pO2kuZXhpdCgpLnJlbW92ZSgpLGkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24odCl7cmV0dXJuImhhbmRsZSBoYW5kbGUtLSIrdC50eXBlfSkuYXR0cigiY3Vyc29yIixmdW5jdGlvbih0KXtyZXR1cm4gVGRbdC50eXBlXX0pLHQuZWFjaChyKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5vbigibW91c2Vkb3duLmJydXNoIHRvdWNoc3RhcnQuYnJ1c2giLHUpfWZ1bmN0aW9uIHIoKXt2YXIgdD1NbCh0aGlzKSxuPVNlKHRoaXMpLnNlbGVjdGlvbjtuPyh0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixuWzBdWzBdKS5hdHRyKCJ5IixuWzBdWzFdKS5hdHRyKCJ3aWR0aCIsblsxXVswXS1uWzBdWzBdKS5hdHRyKCJoZWlnaHQiLG5bMV1bMV0tblswXVsxXSksdC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlW3QudHlwZS5sZW5ndGgtMV0/blsxXVswXS1oLzI6blswXVswXS1oLzJ9KS5hdHRyKCJ5IixmdW5jdGlvbih0KXtyZXR1cm4icyI9PT10LnR5cGVbMF0/blsxXVsxXS1oLzI6blswXVsxXS1oLzJ9KS5hdHRyKCJ3aWR0aCIsZnVuY3Rpb24odCl7cmV0dXJuIm4iPT09dC50eXBlfHwicyI9PT10LnR5cGU/blsxXVswXS1uWzBdWzBdK2g6aH0pLmF0dHIoImhlaWdodCIsZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlfHwidyI9PT10LnR5cGU/blsxXVsxXS1uWzBdWzFdK2g6aH0pKTp0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiwuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigieCIsbnVsbCkuYXR0cigieSIsbnVsbCkuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCl9ZnVuY3Rpb24gaSh0LG4pe3JldHVybiB0Ll9fYnJ1c2guZW1pdHRlcnx8bmV3IG8odCxuKX1mdW5jdGlvbiBvKHQsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPW4sdGhpcy5zdGF0ZT10Ll9fYnJ1c2gsdGhpcy5hY3RpdmU9MH1mdW5jdGlvbiB1KCl7ZnVuY3Rpb24gZSgpe3ZhciB0PVlmKFQpOyFVfHx3fHxNfHwoTWF0aC5hYnModFswXS1PWzBdKT5NYXRoLmFicyh0WzFdLU9bMV0pP009ITA6dz0hMCksTz10LGI9ITAsX2QoKSxvKCl9ZnVuY3Rpb24gbygpe3ZhciB0O3N3aXRjaChtPU9bMF0tRFswXSx4PU9bMV0tRFsxXSxTKXtjYXNlIHlkOmNhc2UgZ2Q6TiYmKG09TWF0aC5tYXgoUC1sLE1hdGgubWluKEwtdixtKSksaD1sK20sXz12K20pLEUmJih4PU1hdGgubWF4KFItcCxNYXRoLm1pbihxLWcseCkpLGQ9cCt4LHk9Zyt4KTticmVhaztjYXNlIG1kOk48MD8obT1NYXRoLm1heChQLWwsTWF0aC5taW4oTC1sLG0pKSxoPWwrbSxfPXYpOk4+MCYmKG09TWF0aC5tYXgoUC12LE1hdGgubWluKEwtdixtKSksaD1sLF89dittKSxFPDA/KHg9TWF0aC5tYXgoUi1wLE1hdGgubWluKHEtcCx4KSksZD1wK3gseT1nKTpFPjAmJih4PU1hdGgubWF4KFItZyxNYXRoLm1pbihxLWcseCkpLGQ9cCx5PWcreCk7YnJlYWs7Y2FzZSB4ZDpOJiYoaD1NYXRoLm1heChQLE1hdGgubWluKEwsbC1tKk4pKSxfPU1hdGgubWF4KFAsTWF0aC5taW4oTCx2K20qTikpKSxFJiYoZD1NYXRoLm1heChSLE1hdGgubWluKHEscC14KkUpKSx5PU1hdGgubWF4KFIsTWF0aC5taW4ocSxnK3gqRSkpKX1fPGgmJihOKj0tMSx0PWwsbD12LHY9dCx0PWgsaD1fLF89dCxrIGluIGtkJiZZLmF0dHIoImN1cnNvciIsVGRbaz1rZFtrXV0pKSx5PGQmJihFKj0tMSx0PXAscD1nLGc9dCx0PWQsZD15LHk9dCxrIGluIFNkJiZZLmF0dHIoImN1cnNvciIsVGRbaz1TZFtrXV0pKSxBLnNlbGVjdGlvbiYmKHo9QS5zZWxlY3Rpb24pLHcmJihoPXpbMF1bMF0sXz16WzFdWzBdKSxNJiYoZD16WzBdWzFdLHk9elsxXVsxXSkselswXVswXT09PWgmJnpbMF1bMV09PT1kJiZ6WzFdWzBdPT09XyYmelsxXVsxXT09PXl8fChBLnNlbGVjdGlvbj1bW2gsZF0sW18seV1dLHIuY2FsbChUKSxGLmJydXNoKCkpfWZ1bmN0aW9uIHUoKXtpZih3ZSgpLHQuZXZlbnQudG91Y2hlcyl7aWYodC5ldmVudC50b3VjaGVzLmxlbmd0aClyZXR1cm47YyYmY2xlYXJUaW1lb3V0KGMpLGM9c2V0VGltZW91dChmdW5jdGlvbigpe2M9bnVsbH0sNTAwKSxJLm9uKCJ0b3VjaG1vdmUuYnJ1c2ggdG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLG51bGwpfWVsc2UgZ3QodC5ldmVudC52aWV3LGIpLEIub24oImtleWRvd24uYnJ1c2gga2V5dXAuYnJ1c2ggbW91c2Vtb3ZlLmJydXNoIG1vdXNldXAuYnJ1c2giLG51bGwpO0kuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKSxZLmF0dHIoImN1cnNvciIsVGQub3ZlcmxheSksQS5zZWxlY3Rpb24mJih6PUEuc2VsZWN0aW9uKSxOZSh6KSYmKEEuc2VsZWN0aW9uPW51bGwsci5jYWxsKFQpKSxGLmVuZCgpfWZ1bmN0aW9uIGEoKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlU9TiYmRTticmVhaztjYXNlIDE4OlM9PT1tZCYmKE4mJih2PV8tbSpOLGw9aCttKk4pLEUmJihnPXkteCpFLHA9ZCt4KkUpLFM9eGQsbygpKTticmVhaztjYXNlIDMyOlMhPT1tZCYmUyE9PXhkfHwoTjwwP3Y9Xy1tOk4+MCYmKGw9aC1tKSxFPDA/Zz15LXg6RT4wJiYocD1kLXgpLFM9eWQsWS5hdHRyKCJjdXJzb3IiLFRkLnNlbGVjdGlvbiksbygpKTticmVhaztkZWZhdWx0OnJldHVybn1fZCgpfWZ1bmN0aW9uIHMoKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlUmJih3PU09VT0hMSxvKCkpO2JyZWFrO2Nhc2UgMTg6Uz09PXhkJiYoTjwwP3Y9XzpOPjAmJihsPWgpLEU8MD9nPXk6RT4wJiYocD1kKSxTPW1kLG8oKSk7YnJlYWs7Y2FzZSAzMjpTPT09eWQmJih0LmV2ZW50LmFsdEtleT8oTiYmKHY9Xy1tKk4sbD1oK20qTiksRSYmKGc9eS14KkUscD1kK3gqRSksUz14ZCk6KE48MD92PV86Tj4wJiYobD1oKSxFPDA/Zz15OkU+MCYmKHA9ZCksUz1tZCksWS5hdHRyKCJjdXJzb3IiLFRkW2tdKSxvKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufV9kKCl9aWYodC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDx0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybiBfZCgpfWVsc2UgaWYoYylyZXR1cm47aWYoZi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBsLGgscCxkLHYsXyxnLHksbSx4LGIsdyxNLFQ9dGhpcyxrPXQuZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsUz0ic2VsZWN0aW9uIj09PSh0LmV2ZW50Lm1ldGFLZXk/az0ib3ZlcmxheSI6ayk/Z2Q6dC5ldmVudC5hbHRLZXk/eGQ6bWQsTj1uPT09d2Q/bnVsbDpOZFtrXSxFPW49PT1iZD9udWxsOkVkW2tdLEE9U2UoVCksQz1BLmV4dGVudCx6PUEuc2VsZWN0aW9uLFA9Q1swXVswXSxSPUNbMF1bMV0sTD1DWzFdWzBdLHE9Q1sxXVsxXSxVPU4mJkUmJnQuZXZlbnQuc2hpZnRLZXksRD1ZZihUKSxPPUQsRj1pKFQsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpOyJvdmVybGF5Ij09PWs/QS5zZWxlY3Rpb249ej1bW2w9bj09PXdkP1A6RFswXSxwPW49PT1iZD9SOkRbMV1dLFt2PW49PT13ZD9MOmwsZz1uPT09YmQ/cTpwXV06KGw9elswXVswXSxwPXpbMF1bMV0sdj16WzFdWzBdLGc9elsxXVsxXSksaD1sLGQ9cCxfPXYseT1nO3ZhciBJPU1sKFQpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLFk9SS5zZWxlY3RBbGwoIi5vdmVybGF5IikuYXR0cigiY3Vyc29yIixUZFtrXSk7aWYodC5ldmVudC50b3VjaGVzKUkub24oInRvdWNobW92ZS5icnVzaCIsZSwhMCkub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIix1LCEwKTtlbHNle3ZhciBCPU1sKHQuZXZlbnQudmlldykub24oImtleWRvd24uYnJ1c2giLGEsITApLm9uKCJrZXl1cC5icnVzaCIscywhMCkub24oIm1vdXNlbW92ZS5icnVzaCIsZSwhMCkub24oIm1vdXNldXAuYnJ1c2giLHUsITApO0VsKHQuZXZlbnQudmlldyl9d2UoKSx2cChUKSxyLmNhbGwoVCksRi5zdGFydCgpfX1mdW5jdGlvbiBhKCl7dmFyIHQ9dGhpcy5fX2JydXNofHx7c2VsZWN0aW9uOm51bGx9O3JldHVybiB0LmV4dGVudD1zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmRpbT1uLHR9dmFyIGMscz1rZSxmPVRlLGw9ZChlLCJzdGFydCIsImJydXNoIiwiZW5kIiksaD02O3JldHVybiBlLm1vdmU9ZnVuY3Rpb24odCxlKXt0LnNlbGVjdGlvbj90Lm9uKCJzdGFydC5icnVzaCIsZnVuY3Rpb24oKXtpKHRoaXMsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KCl9KS5vbigiaW50ZXJydXB0LmJydXNoIGVuZC5icnVzaCIsZnVuY3Rpb24oKXtpKHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pLnR3ZWVuKCJicnVzaCIsZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3Uuc2VsZWN0aW9uPTE9PT10JiZOZShzKT9udWxsOmYodCksci5jYWxsKG8pLGEuYnJ1c2goKX12YXIgbz10aGlzLHU9by5fX2JydXNoLGE9aShvLGFyZ3VtZW50cyksYz11LnNlbGVjdGlvbixzPW4uaW5wdXQoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSx1LmV4dGVudCksZj1BaChjLHMpO3JldHVybiBjJiZzP3Q6dCgxKX0pOnQuZWFjaChmdW5jdGlvbigpe3ZhciB0PXRoaXMsbz1hcmd1bWVudHMsdT10Ll9fYnJ1c2gsYT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodCxvKTplLHUuZXh0ZW50KSxjPWkodCxvKS5iZWZvcmVzdGFydCgpO3ZwKHQpLHUuc2VsZWN0aW9uPW51bGw9PWF8fE5lKGEpP251bGw6YSxyLmNhbGwodCksYy5zdGFydCgpLmJydXNoKCkuZW5kKCl9KX0sby5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT0rK3RoaXMuYWN0aXZlJiYodGhpcy5zdGF0ZS5lbWl0dGVyPXRoaXMsdGhpcy5zdGFydGluZz0hMCksdGhpc30sc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydGluZyYmKHRoaXMuc3RhcnRpbmc9ITEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSxicnVzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVtaXQoImJydXNoIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT0tLXRoaXMuYWN0aXZlJiYoZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlcix0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0UobmV3IHZkKGUsdCxuLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLGwuYXBwbHksbCxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxlLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRkKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxlKTpzfSxlLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRkKCEhdCksZSk6Zn0sZS5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0LGUpOmh9LGUub249ZnVuY3Rpb24oKXt2YXIgdD1sLm9uLmFwcGx5KGwsYXJndW1lbnRzKTtyZXR1cm4gdD09PWw/ZTp0fSxlfWZ1bmN0aW9uIFBlKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiB0KG4uc291cmNlLnZhbHVlK24udGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX19ZnVuY3Rpb24gUmUoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1mdW5jdGlvbiBMZSgpe3JldHVybiBuZXcgUmV9ZnVuY3Rpb24gcWUodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIFVlKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBEZSh0KXtyZXR1cm4gdC5yYWRpdXN9ZnVuY3Rpb24gT2UodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiBGZSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1mdW5jdGlvbiBJZSgpe31mdW5jdGlvbiBZZSh0LG4pe3ZhciBlPW5ldyBJZTtpZih0IGluc3RhbmNlb2YgSWUpdC5lYWNoKGZ1bmN0aW9uKHQsbil7ZS5zZXQobix0KX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoO2lmKG51bGw9PW4pZm9yKDsrK2k8bzspZS5zZXQoaSx0W2ldKTtlbHNlIGZvcig7KytpPG87KWUuc2V0KG4ocj10W2ldLGksdCkscil9ZWxzZSBpZih0KWZvcih2YXIgdSBpbiB0KWUuc2V0KHUsdFt1XSk7cmV0dXJuIGV9ZnVuY3Rpb24gQmUoKXtyZXR1cm57fX1mdW5jdGlvbiBqZSh0LG4sZSl7dFtuXT1lfWZ1bmN0aW9uIEhlKCl7cmV0dXJuIFllKCl9ZnVuY3Rpb24gWGUodCxuLGUpe3Quc2V0KG4sZSl9ZnVuY3Rpb24gVmUoKXt9ZnVuY3Rpb24gV2UodCxuKXt2YXIgZT1uZXcgVmU7aWYodCBpbnN0YW5jZW9mIFZlKXQuZWFjaChmdW5jdGlvbih0KXtlLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytyPGk7KWUuYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspZS5hZGQobih0W3JdLHIsdCkpfXJldHVybiBlfWZ1bmN0aW9uICRlKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrdC5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIjogZFsiK24rIl0ifSkuam9pbigiLCIpKyJ9Iil9ZnVuY3Rpb24gWmUodCxuKXt2YXIgZT0kZSh0KTtyZXR1cm4gZnVuY3Rpb24ocixpKXtyZXR1cm4gbihlKHIpLGksdCl9fWZ1bmN0aW9uIEdlKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfWZ1bmN0aW9uIEplKHQsbixlLHIpe2lmKGlzTmFOKG4pfHxpc05hTihlKSlyZXR1cm4gdDt2YXIgaSxvLHUsYSxjLHMsZixsLGgscD10Ll9yb290LGQ9e2RhdGE6cn0sdj10Ll94MCxfPXQuX3kwLGc9dC5feDEseT10Ll95MTtpZighcClyZXR1cm4gdC5fcm9vdD1kLHQ7Zm9yKDtwLmxlbmd0aDspaWYoKHM9bj49KG89KHYrZykvMikpP3Y9bzpnPW8sKGY9ZT49KHU9KF8reSkvMikpP189dTp5PXUsaT1wLCEocD1wW2w9Zjw8MXxzXSkpcmV0dXJuIGlbbF09ZCx0O2lmKGE9K3QuX3guY2FsbChudWxsLHAuZGF0YSksYz0rdC5feS5jYWxsKG51bGwscC5kYXRhKSxuPT09YSYmZT09PWMpcmV0dXJuIGQubmV4dD1wLGk/aVtsXT1kOnQuX3Jvb3Q9ZCx0O2RvIGk9aT9pW2xdPW5ldyBBcnJheSg0KTp0Ll9yb290PW5ldyBBcnJheSg0KSwocz1uPj0obz0oditnKS8yKSk/dj1vOmc9bywoZj1lPj0odT0oXyt5KS8yKSk/Xz11Onk9dTt3aGlsZSgobD1mPDwxfHMpPT09KGg9KGM+PXUpPDwxfGE+PW8pKTtyZXR1cm4gaVtoXT1wLGlbbF09ZCx0fWZ1bmN0aW9uIFFlKHQpe3ZhciBuLGUscixpLG89dC5sZW5ndGgsdT1uZXcgQXJyYXkobyksYT1uZXcgQXJyYXkobyksYz0xLzAscz0xLzAsZj0tKDEvMCksbD0tKDEvMCk7Zm9yKGU9MDtlPG87KytlKWlzTmFOKHI9K3RoaXMuX3guY2FsbChudWxsLG49dFtlXSkpfHxpc05hTihpPSt0aGlzLl95LmNhbGwobnVsbCxuKSl8fCh1W2VdPXIsYVtlXT1pLHI8YyYmKGM9cikscj5mJiYoZj1yKSxpPHMmJihzPWkpLGk+bCYmKGw9aSkpO2ZvcihmPGMmJihjPXRoaXMuX3gwLGY9dGhpcy5feDEpLGw8cyYmKHM9dGhpcy5feTAsbD10aGlzLl95MSksdGhpcy5jb3ZlcihjLHMpLmNvdmVyKGYsbCksZT0wO2U8bzsrK2UpSmUodGhpcyx1W2VdLGFbZV0sdFtlXSk7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gS2UodCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXRoaXMucmVtb3ZlKHRbbl0pO3JldHVybiB0aGlzfWZ1bmN0aW9uIHRyKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG5yKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGVyKHQsbixlKXt2YXIgcj1uZXcgcnIobnVsbD09bj90cjpuLG51bGw9PWU/bnI6ZSxOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P3I6ci5hZGRBbGwodCl9ZnVuY3Rpb24gcnIodCxuLGUscixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PW4sdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBpcih0KXtmb3IodmFyIG49e2RhdGE6dC5kYXRhfSxlPW47dD10Lm5leHQ7KWU9ZS5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIG59ZnVuY3Rpb24gb3IodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIHVyKHQpe3JldHVybiB0LnkrdC52eX1mdW5jdGlvbiBhcih0KXtyZXR1cm4gdC5pbmRleH1mdW5jdGlvbiBjcih0LG4pe3ZhciBlPXQuZ2V0KG4pO2lmKCFlKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIituKTtyZXR1cm4gZX1mdW5jdGlvbiBzcih0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIGZyKHQpe3JldHVybiB0Lnl9ZnVuY3Rpb24gbHIodCl7cmV0dXJuIG5ldyBocih0KX1mdW5jdGlvbiBocih0KXtpZighKG49WXYuZXhlYyh0KSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIit0KTt2YXIgbixlPW5bMV18fCIgIixyPW5bMl18fCI+IixpPW5bM118fCItIixvPW5bNF18fCIiLHU9ISFuWzVdLGE9bls2XSYmK25bNl0sYz0hIW5bN10scz1uWzhdJiYrbls4XS5zbGljZSgxKSxmPW5bOV18fCIiOyJuIj09PWY/KGM9ITAsZj0iZyIpOkl2W2ZdfHwoZj0iIiksKHV8fCIwIj09PWUmJiI9Ij09PXIpJiYodT0hMCxlPSIwIixyPSI9IiksdGhpcy5maWxsPWUsdGhpcy5hbGlnbj1yLHRoaXMuc2lnbj1pLHRoaXMuc3ltYm9sPW8sdGhpcy56ZXJvPXUsdGhpcy53aWR0aD1hLHRoaXMuY29tbWE9Yyx0aGlzLnByZWNpc2lvbj1zLHRoaXMudHlwZT1mfWZ1bmN0aW9uIHByKG4pewpyZXR1cm4gQnY9WHYobiksdC5mb3JtYXQ9QnYuZm9ybWF0LHQuZm9ybWF0UHJlZml4PUJ2LmZvcm1hdFByZWZpeCxCdn1mdW5jdGlvbiBkcigpe3RoaXMucmVzZXQoKX1mdW5jdGlvbiB2cih0LG4sZSl7dmFyIHI9dC5zPW4rZSxpPXItbixvPXItaTt0LnQ9bi1vKyhlLWkpfWZ1bmN0aW9uIF9yKHQpe3JldHVybiB0PjE/MDp0PC0xP0NfOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBncih0KXtyZXR1cm4gdD4xP3pfOnQ8LTE/LXpfOk1hdGguYXNpbih0KX1mdW5jdGlvbiB5cih0KXtyZXR1cm4odD1IXyh0LzIpKSp0fWZ1bmN0aW9uIG1yKCl7fWZ1bmN0aW9uIHhyKHQsbil7dCYmWl8uaGFzT3duUHJvcGVydHkodC50eXBlKSYmWl9bdC50eXBlXSh0LG4pfWZ1bmN0aW9uIGJyKHQsbixlKXt2YXIgcixpPS0xLG89dC5sZW5ndGgtZTtmb3Iobi5saW5lU3RhcnQoKTsrK2k8bzspcj10W2ldLG4ucG9pbnQoclswXSxyWzFdLHJbMl0pO24ubGluZUVuZCgpfWZ1bmN0aW9uIHdyKHQsbil7dmFyIGU9LTEscj10Lmxlbmd0aDtmb3Iobi5wb2x5Z29uU3RhcnQoKTsrK2U8cjspYnIodFtlXSxuLDEpO24ucG9seWdvbkVuZCgpfWZ1bmN0aW9uIE1yKCl7S18ucG9pbnQ9a3J9ZnVuY3Rpb24gVHIoKXtTcihHdixKdil9ZnVuY3Rpb24ga3IodCxuKXtLXy5wb2ludD1TcixHdj10LEp2PW4sdCo9cV8sbio9cV8sUXY9dCxLdj1GXyhuPW4vMitQXyksdF89SF8obil9ZnVuY3Rpb24gU3IodCxuKXt0Kj1xXyxuKj1xXyxuPW4vMitQXzt2YXIgZT10LVF2LHI9ZT49MD8xOi0xLGk9ciplLG89Rl8obiksdT1IXyhuKSxhPXRfKnUsYz1LdipvK2EqRl8oaSkscz1hKnIqSF8oaSk7Sl8uYWRkKE9fKHMsYykpLFF2PXQsS3Y9byx0Xz11fWZ1bmN0aW9uIE5yKHQpe3JldHVybltPXyh0WzFdLHRbMF0pLGdyKHRbMl0pXX1mdW5jdGlvbiBFcih0KXt2YXIgbj10WzBdLGU9dFsxXSxyPUZfKGUpO3JldHVybltyKkZfKG4pLHIqSF8obiksSF8oZSldfWZ1bmN0aW9uIEFyKHQsbil7cmV0dXJuIHRbMF0qblswXSt0WzFdKm5bMV0rdFsyXSpuWzJdfWZ1bmN0aW9uIENyKHQsbil7cmV0dXJuW3RbMV0qblsyXS10WzJdKm5bMV0sdFsyXSpuWzBdLXRbMF0qblsyXSx0WzBdKm5bMV0tdFsxXSpuWzBdXX1mdW5jdGlvbiB6cih0LG4pe3RbMF0rPW5bMF0sdFsxXSs9blsxXSx0WzJdKz1uWzJdfWZ1bmN0aW9uIFByKHQsbil7cmV0dXJuW3RbMF0qbix0WzFdKm4sdFsyXSpuXX1mdW5jdGlvbiBScih0KXt2YXIgbj1WXyh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89bix0WzFdLz1uLHRbMl0vPW59ZnVuY3Rpb24gTHIodCxuKXtzXy5wdXNoKGZfPVtuXz10LHJfPXRdKSxuPGVfJiYoZV89biksbj5pXyYmKGlfPW4pfWZ1bmN0aW9uIHFyKHQsbil7dmFyIGU9RXIoW3QqcV8sbipxX10pO2lmKGNfKXt2YXIgcj1DcihjXyxlKSxpPVtyWzFdLC1yWzBdLDBdLG89Q3IoaSxyKTtScihvKSxvPU5yKG8pO3ZhciB1LGE9dC1vXyxjPWE+MD8xOi0xLHM9b1swXSpMXypjLGY9VV8oYSk+MTgwO2ZeKGMqb188cyYmczxjKnQpPyh1PW9bMV0qTF8sdT5pXyYmKGlfPXUpKToocz0ocyszNjApJTM2MC0xODAsZl4oYypvXzxzJiZzPGMqdCk/KHU9LW9bMV0qTF8sdTxlXyYmKGVfPXUpKToobjxlXyYmKGVfPW4pLG4+aV8mJihpXz1uKSkpLGY/dDxvXz9ZcihuXyx0KT5ZcihuXyxyXykmJihyXz10KTpZcih0LHJfKT5ZcihuXyxyXykmJihuXz10KTpyXz49bl8/KHQ8bl8mJihuXz10KSx0PnJfJiYocl89dCkpOnQ+b18/WXIobl8sdCk+WXIobl8scl8pJiYocl89dCk6WXIodCxyXyk+WXIobl8scl8pJiYobl89dCl9ZWxzZSBzXy5wdXNoKGZfPVtuXz10LHJfPXRdKTtuPGVfJiYoZV89biksbj5pXyYmKGlfPW4pLGNfPWUsb189dH1mdW5jdGlvbiBVcigpe2VnLnBvaW50PXFyfWZ1bmN0aW9uIERyKCl7Zl9bMF09bl8sZl9bMV09cl8sZWcucG9pbnQ9THIsY189bnVsbH1mdW5jdGlvbiBPcih0LG4pe2lmKGNfKXt2YXIgZT10LW9fO25nLmFkZChVXyhlKT4xODA/ZSsoZT4wPzM2MDotMzYwKTplKX1lbHNlIHVfPXQsYV89bjtLXy5wb2ludCh0LG4pLHFyKHQsbil9ZnVuY3Rpb24gRnIoKXtLXy5saW5lU3RhcnQoKX1mdW5jdGlvbiBJcigpe09yKHVfLGFfKSxLXy5saW5lRW5kKCksVV8obmcpPkVfJiYobl89LShyXz0xODApKSxmX1swXT1uXyxmX1sxXT1yXyxjXz1udWxsfWZ1bmN0aW9uIFlyKHQsbil7cmV0dXJuKG4tPXQpPDA/biszNjA6bn1mdW5jdGlvbiBCcih0LG4pe3JldHVybiB0WzBdLW5bMF19ZnVuY3Rpb24ganIodCxuKXtyZXR1cm4gdFswXTw9dFsxXT90WzBdPD1uJiZuPD10WzFdOm48dFswXXx8dFsxXTxufWZ1bmN0aW9uIEhyKHQsbil7dCo9cV8sbio9cV87dmFyIGU9Rl8obik7WHIoZSpGXyh0KSxlKkhfKHQpLEhfKG4pKX1mdW5jdGlvbiBYcih0LG4sZSl7KytsXyxwXys9KHQtcF8pL2xfLGRfKz0obi1kXykvbF8sdl8rPShlLXZfKS9sX31mdW5jdGlvbiBWcigpe2lnLnBvaW50PVdyfWZ1bmN0aW9uIFdyKHQsbil7dCo9cV8sbio9cV87dmFyIGU9Rl8obik7VF89ZSpGXyh0KSxrXz1lKkhfKHQpLFNfPUhfKG4pLGlnLnBvaW50PSRyLFhyKFRfLGtfLFNfKX1mdW5jdGlvbiAkcih0LG4pe3QqPXFfLG4qPXFfO3ZhciBlPUZfKG4pLHI9ZSpGXyh0KSxpPWUqSF8odCksbz1IXyhuKSx1PU9fKFZfKCh1PWtfKm8tU18qaSkqdSsodT1TXypyLVRfKm8pKnUrKHU9VF8qaS1rXypyKSp1KSxUXypyK2tfKmkrU18qbyk7aF8rPXUsX18rPXUqKFRfKyhUXz1yKSksZ18rPXUqKGtfKyhrXz1pKSkseV8rPXUqKFNfKyhTXz1vKSksWHIoVF8sa18sU18pfWZ1bmN0aW9uIFpyKCl7aWcucG9pbnQ9SHJ9ZnVuY3Rpb24gR3IoKXtpZy5wb2ludD1Rcn1mdW5jdGlvbiBKcigpe0tyKHdfLE1fKSxpZy5wb2ludD1Icn1mdW5jdGlvbiBRcih0LG4pe3dfPXQsTV89bix0Kj1xXyxuKj1xXyxpZy5wb2ludD1Lcjt2YXIgZT1GXyhuKTtUXz1lKkZfKHQpLGtfPWUqSF8odCksU189SF8obiksWHIoVF8sa18sU18pfWZ1bmN0aW9uIEtyKHQsbil7dCo9cV8sbio9cV87dmFyIGU9Rl8obikscj1lKkZfKHQpLGk9ZSpIXyh0KSxvPUhfKG4pLHU9a18qby1TXyppLGE9U18qci1UXypvLGM9VF8qaS1rXypyLHM9Vl8odSp1K2EqYStjKmMpLGY9Z3IocyksbD1zJiYtZi9zO21fKz1sKnUseF8rPWwqYSxiXys9bCpjLGhfKz1mLF9fKz1mKihUXysoVF89cikpLGdfKz1mKihrXysoa189aSkpLHlfKz1mKihTXysoU189bykpLFhyKFRfLGtfLFNfKX1mdW5jdGlvbiB0aSh0LG4pe3JldHVyblt0PkNfP3QtUl86dDwtQ18/dCtSXzp0LG5dfWZ1bmN0aW9uIG5pKHQsbixlKXtyZXR1cm4odCU9Ul8pP258fGU/YWcocmkodCksaWkobixlKSk6cmkodCk6bnx8ZT9paShuLGUpOnRpfWZ1bmN0aW9uIGVpKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiBuKz10LFtuPkNfP24tUl86bjwtQ18/bitSXzpuLGVdfX1mdW5jdGlvbiByaSh0KXt2YXIgbj1laSh0KTtyZXR1cm4gbi5pbnZlcnQ9ZWkoLXQpLG59ZnVuY3Rpb24gaWkodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9Rl8obiksYT1GXyh0KSplLGM9SF8odCkqZSxzPUhfKG4pLGY9cypyK2EqaTtyZXR1cm5bT18oYypvLWYqdSxhKnItcyppKSxncihmKm8rYyp1KV19dmFyIHI9Rl8odCksaT1IXyh0KSxvPUZfKG4pLHU9SF8obik7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9Rl8obiksYT1GXyh0KSplLGM9SF8odCkqZSxzPUhfKG4pLGY9cypvLWMqdTtyZXR1cm5bT18oYypvK3MqdSxhKnIrZippKSxncihmKnItYSppKV19LGV9ZnVuY3Rpb24gb2kodCxuLGUscixpLG8pe2lmKGUpe3ZhciB1PUZfKG4pLGE9SF8obiksYz1yKmU7bnVsbD09aT8oaT1uK3IqUl8sbz1uLWMvMik6KGk9dWkodSxpKSxvPXVpKHUsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqUl8pKTtmb3IodmFyIHMsZj1pO3I+MD9mPm86ZjxvO2YtPWMpcz1OcihbdSwtYSpGXyhmKSwtYSpIXyhmKV0pLHQucG9pbnQoc1swXSxzWzFdKX19ZnVuY3Rpb24gdWkodCxuKXtuPUVyKG4pLG5bMF0tPXQsUnIobik7dmFyIGU9X3IoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStSXy1FXyklUl99ZnVuY3Rpb24gYWkodCxuLGUscil7dGhpcy54PXQsdGhpcy56PW4sdGhpcy5vPWUsdGhpcy5lPXIsdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBjaSh0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1mdW5jdGlvbiBzaSh0LG4sZSxyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PWUmJm48PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sYSxzKXt2YXIgZj0wLGw9MDtpZihudWxsPT1pfHwoZj11KGksYSkpIT09KGw9dShvLGEpKXx8YyhpLG8pPDBeYT4wKXtkbyBzLnBvaW50KDA9PT1mfHwzPT09Zj90OmUsZj4xP3I6bik7d2hpbGUoKGY9KGYrYSs0KSU0KSE9PWwpfWVsc2Ugcy5wb2ludChvWzBdLG9bMV0pfWZ1bmN0aW9uIHUocixpKXtyZXR1cm4gVV8oclswXS10KTxFXz9pPjA/MDozOlVfKHJbMF0tZSk8RV8/aT4wPzI6MTpVXyhyWzFdLW4pPEVfP2k+MD8xOjA6aT4wPzM6Mn1mdW5jdGlvbiBhKHQsbil7cmV0dXJuIGModC54LG4ueCl9ZnVuY3Rpb24gYyh0LG4pe3ZhciBlPXUodCwxKSxyPXUobiwxKTtyZXR1cm4gZSE9PXI/ZS1yOjA9PT1lP25bMV0tdFsxXToxPT09ZT90WzBdLW5bMF06Mj09PWU/dFsxXS1uWzFdOm5bMF0tdFswXX1yZXR1cm4gZnVuY3Rpb24odSl7ZnVuY3Rpb24gYyh0LG4pe2kodCxuKSYmUy5wb2ludCh0LG4pfWZ1bmN0aW9uIHMoKXtmb3IodmFyIG49MCxlPTAsaT1fLmxlbmd0aDtlPGk7KytlKWZvcih2YXIgbyx1LGE9X1tlXSxjPTEscz1hLmxlbmd0aCxmPWFbMF0sbD1mWzBdLGg9ZlsxXTtjPHM7KytjKW89bCx1PWgsZj1hW2NdLGw9ZlswXSxoPWZbMV0sdTw9cj9oPnImJihsLW8pKihyLXUpPihoLXUpKih0LW8pJiYrK246aDw9ciYmKGwtbykqKHItdSk8KGgtdSkqKHQtbykmJi0tbjtyZXR1cm4gbn1mdW5jdGlvbiBmKCl7Uz1OLHY9W10sXz1bXSxrPSEwfWZ1bmN0aW9uIGwoKXt2YXIgdD1zKCksbj1rJiZ0LGU9KHY9aGYodikpLmxlbmd0aDsobnx8ZSkmJih1LnBvbHlnb25TdGFydCgpLG4mJih1LmxpbmVTdGFydCgpLG8obnVsbCxudWxsLDEsdSksdS5saW5lRW5kKCkpLGUmJlRnKHYsYSx0LG8sdSksdS5wb2x5Z29uRW5kKCkpLFM9dSx2PV89Zz1udWxsfWZ1bmN0aW9uIGgoKXtFLnBvaW50PWQsXyYmXy5wdXNoKGc9W10pLFQ9ITAsTT0hMSxiPXc9TmFOfWZ1bmN0aW9uIHAoKXt2JiYoZCh5LG0pLHgmJk0mJk4ucmVqb2luKCksdi5wdXNoKE4ucmVzdWx0KCkpKSxFLnBvaW50PWMsTSYmUy5saW5lRW5kKCl9ZnVuY3Rpb24gZChvLHUpe3ZhciBhPWkobyx1KTtpZihfJiZnLnB1c2goW28sdV0pLFQpeT1vLG09dSx4PWEsVD0hMSxhJiYoUy5saW5lU3RhcnQoKSxTLnBvaW50KG8sdSkpO2Vsc2UgaWYoYSYmTSlTLnBvaW50KG8sdSk7ZWxzZXt2YXIgYz1bYj1NYXRoLm1heChTZyxNYXRoLm1pbihrZyxiKSksdz1NYXRoLm1heChTZyxNYXRoLm1pbihrZyx3KSldLHM9W289TWF0aC5tYXgoU2csTWF0aC5taW4oa2csbykpLHU9TWF0aC5tYXgoU2csTWF0aC5taW4oa2csdSkpXTt3ZyhjLHMsdCxuLGUscik/KE18fChTLmxpbmVTdGFydCgpLFMucG9pbnQoY1swXSxjWzFdKSksUy5wb2ludChzWzBdLHNbMV0pLGF8fFMubGluZUVuZCgpLGs9ITEpOmEmJihTLmxpbmVTdGFydCgpLFMucG9pbnQobyx1KSxrPSExKX1iPW8sdz11LE09YX12YXIgdixfLGcseSxtLHgsYix3LE0sVCxrLFM9dSxOPWJnKCksRT17cG9pbnQ6YyxsaW5lU3RhcnQ6aCxsaW5lRW5kOnAscG9seWdvblN0YXJ0OmYscG9seWdvbkVuZDpsfTtyZXR1cm4gRX19ZnVuY3Rpb24gZmkoKXt6Zy5wb2ludD1oaSx6Zy5saW5lRW5kPWxpfWZ1bmN0aW9uIGxpKCl7emcucG9pbnQ9emcubGluZUVuZD1tcn1mdW5jdGlvbiBoaSh0LG4pe3QqPXFfLG4qPXFfLGNnPXQsc2c9SF8obiksZmc9Rl8obiksemcucG9pbnQ9cGl9ZnVuY3Rpb24gcGkodCxuKXt0Kj1xXyxuKj1xXzt2YXIgZT1IXyhuKSxyPUZfKG4pLGk9VV8odC1jZyksbz1GXyhpKSx1PUhfKGkpLGE9cip1LGM9ZmcqZS1zZypyKm8scz1zZyplK2ZnKnIqbztDZy5hZGQoT18oVl8oYSphK2MqYykscykpLGNnPXQsc2c9ZSxmZz1yfWZ1bmN0aW9uIGRpKHQsbil7cmV0dXJuISghdHx8IURnLmhhc093blByb3BlcnR5KHQudHlwZSkpJiZEZ1t0LnR5cGVdKHQsbil9ZnVuY3Rpb24gdmkodCxuKXtyZXR1cm4gMD09PXFnKHQsbil9ZnVuY3Rpb24gX2kodCxuKXt2YXIgZT1xZyh0WzBdLHRbMV0pO3JldHVybiBxZyh0WzBdLG4pK3FnKG4sdFsxXSk8PWUrRV99ZnVuY3Rpb24gZ2kodCxuKXtyZXR1cm4hIUFnKHQubWFwKHlpKSxtaShuKSl9ZnVuY3Rpb24geWkodCl7cmV0dXJuIHQ9dC5tYXAobWkpLHQucG9wKCksdH1mdW5jdGlvbiBtaSh0KXtyZXR1cm5bdFswXSpxXyx0WzFdKnFfXX1mdW5jdGlvbiB4aSh0LG4sZSl7dmFyIHI9UXModCxuLUVfLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVyblt0LG5dfSl9fWZ1bmN0aW9uIGJpKHQsbixlKXt2YXIgcj1Rcyh0LG4tRV8sZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW24sdF19KX19ZnVuY3Rpb24gd2koKXtmdW5jdGlvbiB0KCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bigpfX1mdW5jdGlvbiBuKCl7cmV0dXJuIFFzKElfKG8vXykqXyxpLF8pLm1hcChoKS5jb25jYXQoUXMoSV8ocy9nKSpnLGMsZykubWFwKHApKS5jb25jYXQoUXMoSV8oci9kKSpkLGUsZCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBVXyh0JV8pPkVffSkubWFwKGYpKS5jb25jYXQoUXMoSV8oYS92KSp2LHUsdikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBVXyh0JWcpPkVffSkubWFwKGwpKX12YXIgZSxyLGksbyx1LGEsYyxzLGYsbCxoLHAsZD0xMCx2PWQsXz05MCxnPTM2MCx5PTIuNTtyZXR1cm4gdC5saW5lcz1mdW5jdGlvbigpe3JldHVybiBuKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pfSx0Lm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W2gobykuY29uY2F0KHAoYykuc2xpY2UoMSksaChpKS5yZXZlcnNlKCkuc2xpY2UoMSkscChzKS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LHQuZXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QuZXh0ZW50TWFqb3IobikuZXh0ZW50TWlub3Iobik6dC5leHRlbnRNaW5vcigpfSx0LmV4dGVudE1ham9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPStuWzBdWzBdLGk9K25bMV1bMF0scz0rblswXVsxXSxjPStuWzFdWzFdLG8+aSYmKG49byxvPWksaT1uKSxzPmMmJihuPXMscz1jLGM9biksdC5wcmVjaXNpb24oeSkpOltbbyxzXSxbaSxjXV19LHQuZXh0ZW50TWlub3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K25bMF1bMF0sZT0rblsxXVswXSxhPStuWzBdWzFdLHU9K25bMV1bMV0scj5lJiYobj1yLHI9ZSxlPW4pLGE+dSYmKG49YSxhPXUsdT1uKSx0LnByZWNpc2lvbih5KSk6W1tyLGFdLFtlLHVdXX0sdC5zdGVwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Quc3RlcE1ham9yKG4pLnN0ZXBNaW5vcihuKTp0LnN0ZXBNaW5vcigpfSx0LnN0ZXBNYWpvcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz0rblswXSxnPStuWzFdLHQpOltfLGddfSx0LnN0ZXBNaW5vcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rblswXSx2PStuWzFdLHQpOltkLHZdfSx0LnByZWNpc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0rbixmPXhpKGEsdSw5MCksbD1iaShyLGUseSksaD14aShzLGMsOTApLHA9YmkobyxpLHkpLHQpOnl9LHQuZXh0ZW50TWFqb3IoW1stMTgwLC05MCtFX10sWzE4MCw5MC1FX11dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLUVfXSxbMTgwLDgwK0VfXV0pfWZ1bmN0aW9uIE1pKCl7cmV0dXJuIHdpKCkoKX1mdW5jdGlvbiBUaSgpe2pnLnBvaW50PWtpfWZ1bmN0aW9uIGtpKHQsbil7amcucG9pbnQ9U2ksbGc9cGc9dCxoZz1kZz1ufWZ1bmN0aW9uIFNpKHQsbil7QmcuYWRkKGRnKnQtcGcqbikscGc9dCxkZz1ufWZ1bmN0aW9uIE5pKCl7U2kobGcsaGcpfWZ1bmN0aW9uIEVpKHQsbil7dDxIZyYmKEhnPXQpLHQ+VmcmJihWZz10KSxuPFhnJiYoWGc9biksbj5XZyYmKFdnPW4pfWZ1bmN0aW9uIEFpKHQsbil7WmcrPXQsR2crPW4sKytKZ31mdW5jdGlvbiBDaSgpe2l5LnBvaW50PXppfWZ1bmN0aW9uIHppKHQsbil7aXkucG9pbnQ9UGksQWkoZ2c9dCx5Zz1uKX1mdW5jdGlvbiBQaSh0LG4pe3ZhciBlPXQtZ2cscj1uLXlnLGk9Vl8oZSplK3Iqcik7UWcrPWkqKGdnK3QpLzIsS2crPWkqKHlnK24pLzIsdHkrPWksQWkoZ2c9dCx5Zz1uKX1mdW5jdGlvbiBSaSgpe2l5LnBvaW50PUFpfWZ1bmN0aW9uIExpKCl7aXkucG9pbnQ9VWl9ZnVuY3Rpb24gcWkoKXtEaSh2ZyxfZyl9ZnVuY3Rpb24gVWkodCxuKXtpeS5wb2ludD1EaSxBaSh2Zz1nZz10LF9nPXlnPW4pfWZ1bmN0aW9uIERpKHQsbil7dmFyIGU9dC1nZyxyPW4teWcsaT1WXyhlKmUrcipyKTtRZys9aSooZ2crdCkvMixLZys9aSooeWcrbikvMix0eSs9aSxpPXlnKnQtZ2cqbixueSs9aSooZ2crdCksZXkrPWkqKHlnK24pLHJ5Kz0zKmksQWkoZ2c9dCx5Zz1uKX1mdW5jdGlvbiBPaSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRmkodCxuKXtseS5wb2ludD1JaSx1eT1jeT10LGF5PXN5PW59ZnVuY3Rpb24gSWkodCxuKXtjeS09dCxzeS09bixmeS5hZGQoVl8oY3kqY3krc3kqc3kpKSxjeT10LHN5PW59ZnVuY3Rpb24gWWkoKXt0aGlzLl9zdHJpbmc9W119ZnVuY3Rpb24gQmkodCl7cmV0dXJuIm0wLCIrdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIistMip0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKzIqdCsieiJ9ZnVuY3Rpb24gamkodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gSGkodCxuKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tel8tRV86el8tdFsxXSktKChuPW4ueClbMF08MD9uWzFdLXpfLUVfOnpfLW5bMV0pfWZ1bmN0aW9uIFhpKHQpe3ZhciBuLGU9TmFOLHI9TmFOLGk9TmFOO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLG49MX0scG9pbnQ6ZnVuY3Rpb24obyx1KXt2YXIgYT1vPjA/Q186LUNfLGM9VV8oby1lKTtVXyhjLUNfKTxFXz8odC5wb2ludChlLHI9KHIrdSkvMj4wP3pfOi16XyksdC5wb2ludChpLHIpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChhLHIpLHQucG9pbnQobyxyKSxuPTApOmkhPT1hJiZjPj1DXyYmKFVfKGUtaSk8RV8mJihlLT1pKkVfKSxVXyhvLWEpPEVfJiYoby09YSpFXykscj1WaShlLHIsbyx1KSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KGEsciksbj0wKSx0LnBvaW50KGU9byxyPXUpLGk9YX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fWZ1bmN0aW9uIFZpKHQsbixlLHIpe3ZhciBpLG8sdT1IXyh0LWUpO3JldHVybiBVXyh1KT5FXz9EXygoSF8obikqKG89Rl8ocikpKkhfKGUpLUhfKHIpKihpPUZfKG4pKSpIXyh0KSkvKGkqbyp1KSk6KG4rcikvMn1mdW5jdGlvbiBXaSh0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSp6XyxyLnBvaW50KC1DXyxpKSxyLnBvaW50KDAsaSksci5wb2ludChDXyxpKSxyLnBvaW50KENfLDApLHIucG9pbnQoQ18sLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtQ18sLWkpLHIucG9pbnQoLUNfLDApLHIucG9pbnQoLUNfLGkpO2Vsc2UgaWYoVV8odFswXS1uWzBdKT5FXyl7dmFyIG89dFswXTxuWzBdP0NfOi1DXztpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX1mdW5jdGlvbiAkaSh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bmV3IFppO2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXTtyZXR1cm4gZS5zdHJlYW09bixlfX1mdW5jdGlvbiBaaSgpe31mdW5jdGlvbiBHaSh0LG4sZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTt0LnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxudWxsIT1vJiZ0LmNsaXBFeHRlbnQobnVsbCksR18oZSx0LnN0cmVhbSgkZykpO3ZhciB1PSRnLnJlc3VsdCgpLGE9TWF0aC5taW4oci8odVsxXVswXS11WzBdWzBdKSxpLyh1WzFdWzFdLXVbMF1bMV0pKSxjPStuWzBdWzBdKyhyLWEqKHVbMV1bMF0rdVswXVswXSkpLzIscz0rblswXVsxXSsoaS1hKih1WzFdWzFdK3VbMF1bMV0pKS8yO3JldHVybiBudWxsIT1vJiZ0LmNsaXBFeHRlbnQobyksdC5zY2FsZSgxNTAqYSkudHJhbnNsYXRlKFtjLHNdKX1mdW5jdGlvbiBKaSh0LG4sZSl7cmV0dXJuIEdpKHQsW1swLDBdLG5dLGUpfWZ1bmN0aW9uIFFpKHQpe3JldHVybiAkaSh7cG9pbnQ6ZnVuY3Rpb24obixlKXtuPXQobixlKSx0aGlzLnN0cmVhbS5wb2ludChuWzBdLG5bMV0pfX0pfWZ1bmN0aW9uIEtpKHQsbil7ZnVuY3Rpb24gZShyLGksbyx1LGEsYyxzLGYsbCxoLHAsZCx2LF8pe3ZhciBnPXMtcix5PWYtaSxtPWcqZyt5Knk7aWYobT40Km4mJnYtLSl7dmFyIHg9dStoLGI9YStwLHc9YytkLE09Vl8oeCp4K2IqYit3KncpLFQ9Z3Iody89TSksaz1VXyhVXyh3KS0xKTxFX3x8VV8oby1sKTxFXz8obytsKS8yOk9fKGIseCksUz10KGssVCksTj1TWzBdLEU9U1sxXSxBPU4tcixDPUUtaSx6PXkqQS1nKkM7KHoqei9tPm58fFVfKChnKkEreSpDKS9tLS41KT4uM3x8dSpoK2EqcCtjKmQ8eXkpJiYoZShyLGksbyx1LGEsYyxOLEUsayx4Lz1NLGIvPU0sdyx2LF8pLF8ucG9pbnQoTixFKSxlKE4sRSxrLHgsYix3LHMsZixsLGgscCxkLHYsXykpfX1yZXR1cm4gZnVuY3Rpb24obil7ZnVuY3Rpb24gcihlLHIpe2U9dChlLHIpLG4ucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBpKCl7Zz1OYU4sdy5wb2ludD1vLG4ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbyhyLGkpe3ZhciBvPUVyKFtyLGldKSx1PXQocixpKTtlKGcseSxfLG0seCxiLGc9dVswXSx5PXVbMV0sXz1yLG09b1swXSx4PW9bMV0sYj1vWzJdLGd5LG4pLG4ucG9pbnQoZyx5KX1mdW5jdGlvbiB1KCl7dy5wb2ludD1yLG4ubGluZUVuZCgpfWZ1bmN0aW9uIGEoKXtpKCksdy5wb2ludD1jLHcubGluZUVuZD1zfWZ1bmN0aW9uIGModCxuKXtvKGY9dCxuKSxsPWcsaD15LHA9bSxkPXgsdj1iLHcucG9pbnQ9b31mdW5jdGlvbiBzKCl7ZShnLHksXyxtLHgsYixsLGgsZixwLGQsdixneSxuKSx3LmxpbmVFbmQ9dSx1KCl9dmFyIGYsbCxoLHAsZCx2LF8sZyx5LG0seCxiLHc9e3BvaW50OnIsbGluZVN0YXJ0OmksbGluZUVuZDp1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksdy5saW5lU3RhcnQ9YX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLHcubGluZVN0YXJ0PWl9fTtyZXR1cm4gd319ZnVuY3Rpb24gdG8odCl7cmV0dXJuIG5vKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSgpfWZ1bmN0aW9uIG5vKHQpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQ9Zih0WzBdKnFfLHRbMV0qcV8pLFt0WzBdKl8rYSxjLXRbMV0qX119ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdD1mLmludmVydCgodFswXS1hKS9fLChjLXRbMV0pL18pLHQmJlt0WzBdKkxfLHRbMV0qTF9dfWZ1bmN0aW9uIHIodCxuKXtyZXR1cm4gdD11KHQsbiksW3RbMF0qXythLGMtdFsxXSpfXX1mdW5jdGlvbiBpKCl7Zj1hZyhzPW5pKGIsdyxNKSx1KTt2YXIgdD11KG0seCk7cmV0dXJuIGE9Zy10WzBdKl8sYz15K3RbMV0qXyxvKCl9ZnVuY3Rpb24gbygpe3JldHVybiBkPXY9bnVsbCxufXZhciB1LGEsYyxzLGYsbCxoLHAsZCx2LF89MTUwLGc9NDgwLHk9MjUwLG09MCx4PTAsYj0wLHc9MCxNPTAsVD1udWxsLGs9ZHksUz1udWxsLE49SWcsRT0uNSxBPW15KHIsRSk7cmV0dXJuIG4uc3RyZWFtPWZ1bmN0aW9uKHQpe3JldHVybiBkJiZ2PT09dD9kOmQ9eHkoayhzLEEoTih2PXQpKSkpfSxuLmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz0rdD92eShUPXQqcV8sNipxXyk6KFQ9bnVsbCxkeSksbygpKTpUKkxffSxuLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE49bnVsbD09dD8oUz1sPWg9cD1udWxsLElnKTpzaShTPSt0WzBdWzBdLGw9K3RbMF1bMV0saD0rdFsxXVswXSxwPSt0WzFdWzFdKSxvKCkpOm51bGw9PVM/bnVsbDpbW1MsbF0sW2gscF1dfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPSt0LGkoKSk6X30sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9K3RbMF0seT0rdFsxXSxpKCkpOltnLHldfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT10WzBdJTM2MCpxXyx4PXRbMV0lMzYwKnFfLGkoKSk6W20qTF8seCpMX119LG4ucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXRbMF0lMzYwKnFfLHc9dFsxXSUzNjAqcV8sTT10Lmxlbmd0aD4yP3RbMl0lMzYwKnFfOjAsaSgpKTpbYipMXyx3KkxfLE0qTF9dfSxuLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT1teShyLEU9dCp0KSxvKCkpOlZfKEUpfSxuLmZpdEV4dGVudD1mdW5jdGlvbih0LGUpe3JldHVybiBHaShuLHQsZSl9LG4uZml0U2l6ZT1mdW5jdGlvbih0LGUpe3JldHVybiBKaShuLHQsZSl9LGZ1bmN0aW9uKCl7cmV0dXJuIHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbi5pbnZlcnQ9dS5pbnZlcnQmJmUsaSgpfX1mdW5jdGlvbiBlbyh0KXt2YXIgbj0wLGU9Q18vMyxyPW5vKHQpLGk9cihuLGUpO3JldHVybiBpLnBhcmFsbGVscz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKG49dFswXSpxXyxlPXRbMV0qcV8pOltuKkxfLGUqTF9dfSxpfWZ1bmN0aW9uIHJvKHQpe2Z1bmN0aW9uIG4odCxuKXtyZXR1cm5bdCplLEhfKG4pL2VdfXZhciBlPUZfKHQpO3JldHVybiBuLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0L2UsZ3IobiplKV19LG59ZnVuY3Rpb24gaW8odCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9Vl8oby0yKmkqSF8obikpL2k7cmV0dXJuW2UqSF8odCo9aSksdS1lKkZfKHQpXX12YXIgcj1IXyh0KSxpPShyK0hfKG4pKS8yO2lmKFVfKGkpPEVfKXJldHVybiBybyh0KTt2YXIgbz0xK3IqKDIqaS1yKSx1PVZfKG8pL2k7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9dS1uO3JldHVybltPXyh0LFVfKGUpKS9pKlhfKGUpLGdyKChvLSh0KnQrZSplKSppKmkpLygyKmkpKV19LGV9ZnVuY3Rpb24gb28odCl7dmFyIG49dC5sZW5ndGg7cmV0dXJue3BvaW50OmZ1bmN0aW9uKGUscil7Zm9yKHZhciBpPS0xOysraTxuOyl0W2ldLnBvaW50KGUscil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgZT0tMTsrK2U8bjspdFtlXS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLnBvbHlnb25FbmQoKX19fWZ1bmN0aW9uIHVvKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUZfKG4pLGk9Rl8oZSksbz10KHIqaSk7cmV0dXJuW28qaSpIXyhuKSxvKkhfKGUpXX19ZnVuY3Rpb24gYW8odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9Vl8obipuK2UqZSksaT10KHIpLG89SF8oaSk7cmV0dXJuW09fKG4qbyxyKkZfKGkpKSxncihyJiZlKm8vcildfX1mdW5jdGlvbiBjbyh0LG4pe3JldHVyblt0LEJfKFdfKCh6XytuKS8yKSldfWZ1bmN0aW9uIHNvKHQpe3ZhciBuLGU9dG8odCkscj1lLnNjYWxlLGk9ZS50cmFuc2xhdGUsbz1lLmNsaXBFeHRlbnQ7cmV0dXJuIGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHIodCksbiYmZS5jbGlwRXh0ZW50KG51bGwpLGUpOnIoKX0sZS50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkodCksbiYmZS5jbGlwRXh0ZW50KG51bGwpLGUpOmkoKX0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuP251bGw6bygpO2lmKG49bnVsbD09dCl7dmFyIHU9Q18qcigpLGE9aSgpO3Q9W1thWzBdLXUsYVsxXS11XSxbYVswXSt1LGFbMV0rdV1dfXJldHVybiBvKHQpLGV9LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBmbyh0KXtyZXR1cm4gV18oKHpfK3QpLzIpfWZ1bmN0aW9uIGxvKHQsbil7ZnVuY3Rpb24gZSh0LG4pe28+MD9uPC16XytFXyYmKG49LXpfK0VfKTpuPnpfLUVfJiYobj16Xy1FXyk7dmFyIGU9by9qXyhmbyhuKSxpKTtyZXR1cm5bZSpIXyhpKnQpLG8tZSpGXyhpKnQpXX12YXIgcj1GXyh0KSxpPXQ9PT1uP0hfKHQpOkJfKHIvRl8obikpL0JfKGZvKG4pL2ZvKHQpKSxvPXIqal8oZm8odCksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1vLW4scj1YXyhpKSpWXyh0KnQrZSplKTtyZXR1cm5bT18odCxVXyhlKSkvaSpYXyhlKSwyKkRfKGpfKG8vciwxL2kpKS16X119LGUpOmNvfWZ1bmN0aW9uIGhvKHQsbil7cmV0dXJuW3Qsbl19ZnVuY3Rpb24gcG8odCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9by1uLHI9aSp0O3JldHVybltlKkhfKHIpLG8tZSpGXyhyKV19dmFyIHI9Rl8odCksaT10PT09bj9IXyh0KTooci1GXyhuKSkvKG4tdCksbz1yL2krdDtyZXR1cm4gVV8oaSk8RV8/aG86KGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltPXyh0LFVfKGUpKS9pKlhfKGUpLG8tWF8oaSkqVl8odCp0K2UqZSldfSxlKX1mdW5jdGlvbiB2byh0LG4pe3ZhciBlPUZfKG4pLHI9Rl8odCkqZTtyZXR1cm5bZSpIXyh0KS9yLEhfKG4pL3JdfWZ1bmN0aW9uIF9vKHQsbixlLHIpe3JldHVybiAxPT09dCYmMT09PW4mJjA9PT1lJiYwPT09cj9JZzokaSh7cG9pbnQ6ZnVuY3Rpb24oaSxvKXt0aGlzLnN0cmVhbS5wb2ludChpKnQrZSxvKm4rcil9fSl9ZnVuY3Rpb24gZ28odCxuKXtyZXR1cm5bRl8obikqSF8odCksSF8obildfWZ1bmN0aW9uIHlvKHQsbil7dmFyIGU9Rl8obikscj0xK0ZfKHQpKmU7cmV0dXJuW2UqSF8odCkvcixIXyhuKS9yXX1mdW5jdGlvbiBtbyh0LG4pe3JldHVybltCXyhXXygoel8rbikvMikpLC10XX1mdW5jdGlvbiB4byh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBibyh0KXtyZXR1cm4gdC5yZWR1Y2Uod28sMCkvdC5sZW5ndGh9ZnVuY3Rpb24gd28odCxuKXtyZXR1cm4gdCtuLnh9ZnVuY3Rpb24gTW8odCl7cmV0dXJuIDErdC5yZWR1Y2UoVG8sMCl9ZnVuY3Rpb24gVG8odCxuKXtyZXR1cm4gTWF0aC5tYXgodCxuLnkpfWZ1bmN0aW9uIGtvKHQpe2Zvcih2YXIgbjtuPXQuY2hpbGRyZW47KXQ9blswXTtyZXR1cm4gdH1mdW5jdGlvbiBTbyh0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bbi5sZW5ndGgtMV07cmV0dXJuIHR9ZnVuY3Rpb24gTm8odCl7dmFyIG49MCxlPXQuY2hpbGRyZW4scj1lJiZlLmxlbmd0aDtpZihyKWZvcig7LS1yPj0wOyluKz1lW3JdLnZhbHVlO2Vsc2Ugbj0xO3QudmFsdWU9bn1mdW5jdGlvbiBFbyh0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9ZnVuY3Rpb24gQW8odCxuKXt2YXIgZSxyLGksbyx1LGE9bmV3IExvKHQpLGM9K3QudmFsdWUmJihhLnZhbHVlPXQudmFsdWUpLHM9W2FdO2ZvcihudWxsPT1uJiYobj16byk7ZT1zLnBvcCgpOylpZihjJiYoZS52YWx1ZT0rZS5kYXRhLnZhbHVlKSwoaT1uKGUuZGF0YSkpJiYodT1pLmxlbmd0aCkpZm9yKGUuY2hpbGRyZW49bmV3IEFycmF5KHUpLG89dS0xO28+PTA7LS1vKXMucHVzaChyPWUuY2hpbGRyZW5bb109bmV3IExvKGlbb10pKSxyLnBhcmVudD1lLHIuZGVwdGg9ZS5kZXB0aCsxO3JldHVybiBhLmVhY2hCZWZvcmUoUm8pfWZ1bmN0aW9uIENvKCl7cmV0dXJuIEFvKHRoaXMpLmVhY2hCZWZvcmUoUG8pfWZ1bmN0aW9uIHpvKHQpe3JldHVybiB0LmNoaWxkcmVufWZ1bmN0aW9uIFBvKHQpe3QuZGF0YT10LmRhdGEuZGF0YX1mdW5jdGlvbiBSbyh0KXt2YXIgbj0wO2RvIHQuaGVpZ2h0PW47d2hpbGUoKHQ9dC5wYXJlbnQpJiZ0LmhlaWdodDwrK24pfWZ1bmN0aW9uIExvKHQpe3RoaXMuZGF0YT10LHRoaXMuZGVwdGg9dGhpcy5oZWlnaHQ9MCx0aGlzLnBhcmVudD1udWxsfWZ1bmN0aW9uIHFvKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsfWZ1bmN0aW9uIFVvKHQsbil7dmFyIGU9bi54LXQueCxyPW4ueS10LnksaT10LnItbi5yO3JldHVybiBpKmkrMWUtNj5lKmUrcipyfWZ1bmN0aW9uIERvKHQsbil7dmFyIGUscixpLG89bnVsbCx1PXQuaGVhZDtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMTplPU9vKG5bMF0pO2JyZWFrO2Nhc2UgMjplPUZvKG5bMF0sblsxXSk7YnJlYWs7Y2FzZSAzOmU9SW8oblswXSxuWzFdLG5bMl0pfWZvcig7dTspaT11Ll8scj11Lm5leHQsZSYmVW8oZSxpKT9vPXU6KG8/KHQudGFpbD1vLG8ubmV4dD1udWxsKTp0LmhlYWQ9dC50YWlsPW51bGwsbi5wdXNoKGkpLGU9RG8odCxuKSxuLnBvcCgpLHQuaGVhZD8odS5uZXh0PXQuaGVhZCx0LmhlYWQ9dSk6KHUubmV4dD1udWxsLHQuaGVhZD10LnRhaWw9dSksbz10LnRhaWwsby5uZXh0PXIpLHU9cjtyZXR1cm4gdC50YWlsPW8sZX1mdW5jdGlvbiBPbyh0KXtyZXR1cm57eDp0LngseTp0Lnkscjp0LnJ9fWZ1bmN0aW9uIEZvKHQsbil7dmFyIGU9dC54LHI9dC55LGk9dC5yLG89bi54LHU9bi55LGE9bi5yLGM9by1lLHM9dS1yLGY9YS1pLGw9TWF0aC5zcXJ0KGMqYytzKnMpO3JldHVybnt4OihlK28rYy9sKmYpLzIseToocit1K3MvbCpmKS8yLHI6KGwraSthKS8yfX1mdW5jdGlvbiBJbyh0LG4sZSl7dmFyIHI9dC54LGk9dC55LG89dC5yLHU9bi54LGE9bi55LGM9bi5yLHM9ZS54LGY9ZS55LGw9ZS5yLGg9Miooci11KSxwPTIqKGktYSksZD0yKihjLW8pLHY9cipyK2kqaS1vKm8tdSp1LWEqYStjKmMsXz0yKihyLXMpLGc9MiooaS1mKSx5PTIqKGwtbyksbT1yKnIraSppLW8qby1zKnMtZipmK2wqbCx4PV8qcC1oKmcsYj0ocCptLWcqdikveC1yLHc9KGcqZC1wKnkpL3gsTT0oXyp2LWgqbSkveC1pLFQ9KGgqeS1fKmQpL3gsaz13KncrVCpULTEsUz0yKihiKncrTSpUK28pLE49YipiK00qTS1vKm8sRT0oLVMtTWF0aC5zcXJ0KFMqUy00KmsqTikpLygyKmspO3JldHVybnt4OmIrdypFK3IseTpNK1QqRStpLHI6RX19ZnVuY3Rpb24gWW8odCxuLGUpe3ZhciByPXQueCxpPXQueSxvPW4ucitlLnIsdT10LnIrZS5yLGE9bi54LXIsYz1uLnktaSxzPWEqYStjKmM7aWYocyl7dmFyIGY9LjUrKCh1Kj11KS0obyo9bykpLygyKnMpLGw9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMipvKih1K3MpLSh1LT1zKSp1LW8qbykpLygyKnMpO2UueD1yK2YqYStsKmMsZS55PWkrZipjLWwqYX1lbHNlIGUueD1yK3UsZS55PWl9ZnVuY3Rpb24gQm8odCxuKXt2YXIgZT1uLngtdC54LHI9bi55LXQueSxpPXQucituLnI7cmV0dXJuIGkqaS0xZS02PmUqZStyKnJ9ZnVuY3Rpb24gam8odCxuKXtmb3IodmFyIGU9dC5fLnI7dCE9PW47KWUrPTIqKHQ9dC5uZXh0KS5fLnI7cmV0dXJuIGUtbi5fLnJ9ZnVuY3Rpb24gSG8odCxuLGUpe3ZhciByPXQuXyxpPXQubmV4dC5fLG89ci5yK2kucix1PShyLngqaS5yK2kueCpyLnIpL28tbixhPShyLnkqaS5yK2kueSpyLnIpL28tZTtyZXR1cm4gdSp1K2EqYX1mdW5jdGlvbiBYbyh0KXt0aGlzLl89dCx0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXZpb3VzPW51bGx9ZnVuY3Rpb24gVm8odCl7aWYoIShpPXQubGVuZ3RoKSlyZXR1cm4gMDt2YXIgbixlLHIsaTtpZihuPXRbMF0sbi54PTAsbi55PTAsIShpPjEpKXJldHVybiBuLnI7aWYoZT10WzFdLG4ueD0tZS5yLGUueD1uLnIsZS55PTAsIShpPjIpKXJldHVybiBuLnIrZS5yO1lvKGUsbixyPXRbMl0pO3ZhciBvLHUsYSxjLHMsZixsLGg9bi5yKm4ucixwPWUuciplLnIsZD1yLnIqci5yLHY9aCtwK2QsXz1oKm4ueCtwKmUueCtkKnIueCxnPWgqbi55K3AqZS55K2Qqci55O249bmV3IFhvKG4pLGU9bmV3IFhvKGUpLHI9bmV3IFhvKHIpLG4ubmV4dD1yLnByZXZpb3VzPWUsZS5uZXh0PW4ucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1uO3Q6Zm9yKGE9MzthPGk7KythKXtZbyhuLl8sZS5fLHI9dFthXSkscj1uZXcgWG8ociksYz1lLm5leHQscz1uLnByZXZpb3VzLGY9ZS5fLnIsbD1uLl8ucjtkbyBpZihmPD1sKXtpZihCbyhjLl8sci5fKSl7ZituLl8ucitlLl8ucj5qbyhjLGUpP249YzplPWMsbi5uZXh0PWUsZS5wcmV2aW91cz1uLC0tYTtjb250aW51ZSB0fWYrPWMuXy5yLGM9Yy5uZXh0fWVsc2V7aWYoQm8ocy5fLHIuXykpe2pvKG4scyk+bCtuLl8ucitlLl8ucj9uPXM6ZT1zLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLWE7Y29udGludWUgdH1sKz1zLl8ucixzPXMucHJldmlvdXN9d2hpbGUoYyE9PXMubmV4dCk7Zm9yKHIucHJldmlvdXM9bixyLm5leHQ9ZSxuLm5leHQ9ZS5wcmV2aW91cz1lPXIsdis9ZD1yLl8ucipyLl8ucixfKz1kKnIuXy54LGcrPWQqci5fLnksaD1IbyhuLG89Xy92LHU9Zy92KTsocj1yLm5leHQpIT09ZTspKGQ9SG8ocixvLHUpKTxoJiYobj1yLGg9ZCk7ZT1uLm5leHR9Zm9yKG49W2UuX10scj1lOyhyPXIubmV4dCkhPT1lOyluLnB1c2goci5fKTtmb3Iocj1HeShuKSxhPTA7YTxpOysrYSluPXRbYV0sbi54LT1yLngsbi55LT1yLnk7cmV0dXJuIHIucn1mdW5jdGlvbiBXbyh0KXtyZXR1cm4gbnVsbD09dD9udWxsOiRvKHQpfWZ1bmN0aW9uICRvKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBabygpe3JldHVybiAwfWZ1bmN0aW9uIEdvKHQpe3JldHVybiBNYXRoLnNxcnQodC52YWx1ZSl9ZnVuY3Rpb24gSm8odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe24uY2hpbGRyZW58fChuLnI9TWF0aC5tYXgoMCwrdChuKXx8MCkpfX1mdW5jdGlvbiBRbyh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtpZihyPWUuY2hpbGRyZW4pe3ZhciByLGksbyx1PXIubGVuZ3RoLGE9dChlKSpufHwwO2lmKGEpZm9yKGk9MDtpPHU7KytpKXJbaV0ucis9YTtpZihvPVZvKHIpLGEpZm9yKGk9MDtpPHU7KytpKXJbaV0uci09YTtlLnI9bythfX19ZnVuY3Rpb24gS28odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPW4ucGFyZW50O24ucio9dCxlJiYobi54PWUueCt0Km4ueCxuLnk9ZS55K3Qqbi55KX19ZnVuY3Rpb24gdHUodCl7cmV0dXJuIHQuaWR9ZnVuY3Rpb24gbnUodCl7cmV0dXJuIHQucGFyZW50SWR9ZnVuY3Rpb24gZXUodCxuKXtyZXR1cm4gdC5wYXJlbnQ9PT1uLnBhcmVudD8xOjJ9ZnVuY3Rpb24gcnUodCl7dmFyIG49dC5jaGlsZHJlbjtyZXR1cm4gbj9uWzBdOnQudH1mdW5jdGlvbiBpdSh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bbi5sZW5ndGgtMV06dC50fWZ1bmN0aW9uIG91KHQsbixlKXt2YXIgcj1lLyhuLmktdC5pKTtuLmMtPXIsbi5zKz1lLHQuYys9cixuLnorPWUsbi5tKz1lfWZ1bmN0aW9uIHV1KHQpe2Zvcih2YXIgbixlPTAscj0wLGk9dC5jaGlsZHJlbixvPWkubGVuZ3RoOy0tbz49MDspbj1pW29dLG4ueis9ZSxuLm0rPWUsZSs9bi5zKyhyKz1uLmMpfWZ1bmN0aW9uIGF1KHQsbixlKXtyZXR1cm4gdC5hLnBhcmVudD09PW4ucGFyZW50P3QuYTplfWZ1bmN0aW9uIGN1KHQsbil7dGhpcy5fPXQsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPW51bGwsdGhpcy5BPW51bGwsdGhpcy5hPXRoaXMsdGhpcy56PTAsdGhpcy5tPTAsdGhpcy5jPTAsdGhpcy5zPTAsdGhpcy50PW51bGwsdGhpcy5pPW59ZnVuY3Rpb24gc3UodCl7Zm9yKHZhciBuLGUscixpLG8sdT1uZXcgY3UodCwwKSxhPVt1XTtuPWEucG9wKCk7KWlmKHI9bi5fLmNoaWxkcmVuKWZvcihuLmNoaWxkcmVuPW5ldyBBcnJheShvPXIubGVuZ3RoKSxpPW8tMTtpPj0wOy0taSlhLnB1c2goZT1uLmNoaWxkcmVuW2ldPW5ldyBjdShyW2ldLGkpKSxlLnBhcmVudD1uO3JldHVybih1LnBhcmVudD1uZXcgY3UobnVsbCwwKSkuY2hpbGRyZW49W3VdLHV9ZnVuY3Rpb24gZnUodCxuLGUscixpLG8pe2Zvcih2YXIgdSxhLGMscyxmLGwsaCxwLGQsdixfLGc9W10seT1uLmNoaWxkcmVuLG09MCx4PTAsYj15Lmxlbmd0aCx3PW4udmFsdWU7bTxiOyl7Yz1pLWUscz1vLXI7ZG8gZj15W3grK10udmFsdWU7d2hpbGUoIWYmJng8Yik7Zm9yKGw9aD1mLHY9TWF0aC5tYXgocy9jLGMvcykvKHcqdCksXz1mKmYqdixkPU1hdGgubWF4KGgvXyxfL2wpO3g8YjsrK3gpe2lmKGYrPWE9eVt4XS52YWx1ZSxhPGwmJihsPWEpLGE+aCYmKGg9YSksXz1mKmYqdixwPU1hdGgubWF4KGgvXyxfL2wpLHA+ZCl7Zi09YTticmVha31kPXB9Zy5wdXNoKHU9e3ZhbHVlOmYsZGljZTpjPHMsY2hpbGRyZW46eS5zbGljZShtLHgpfSksdS5kaWNlP25tKHUsZSxyLGksdz9yKz1zKmYvdzpvKTpjbSh1LGUscix3P2UrPWMqZi93Omksbyksdy09ZixtPXh9cmV0dXJuIGd9ZnVuY3Rpb24gbHUodCxuKXtyZXR1cm4gdFswXS1uWzBdfHx0WzFdLW5bMV19ZnVuY3Rpb24gaHUodCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9WzAsMV0scj0yLGk9MjtpPG47KytpKXtmb3IoO3I+MSYmZ20odFtlW3ItMl1dLHRbZVtyLTFdXSx0W2ldKTw9MDspLS1yO2VbcisrXT1pfXJldHVybiBlLnNsaWNlKDAscil9ZnVuY3Rpb24gcHUodCl7aWYoISh0Pj0xKSl0aHJvdyBuZXcgRXJyb3I7dGhpcy5fc2l6ZT10LHRoaXMuX2NhbGw9dGhpcy5fZXJyb3I9bnVsbCx0aGlzLl90YXNrcz1bXSx0aGlzLl9kYXRhPVtdLHRoaXMuX3dhaXRpbmc9dGhpcy5fYWN0aXZlPXRoaXMuX2VuZGVkPXRoaXMuX3N0YXJ0PTB9ZnVuY3Rpb24gZHUodCl7aWYoIXQuX3N0YXJ0KXRyeXt2dSh0KX1jYXRjaChuKXtpZih0Ll90YXNrc1t0Ll9lbmRlZCt0Ll9hY3RpdmUtMV0pZ3UodCxuKTtlbHNlIGlmKCF0Ll9kYXRhKXRocm93IG59fWZ1bmN0aW9uIHZ1KHQpe2Zvcig7dC5fc3RhcnQ9dC5fd2FpdGluZyYmdC5fYWN0aXZlPHQuX3NpemU7KXt2YXIgbj10Ll9lbmRlZCt0Ll9hY3RpdmUsZT10Ll90YXNrc1tuXSxyPWUubGVuZ3RoLTEsaT1lW3JdO2Vbcl09X3UodCxuKSwtLXQuX3dhaXRpbmcsKyt0Ll9hY3RpdmUsZT1pLmFwcGx5KG51bGwsZSksdC5fdGFza3Nbbl0mJih0Ll90YXNrc1tuXT1lfHx3bSl9fWZ1bmN0aW9uIF91KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7dC5fdGFza3Nbbl0mJigtLXQuX2FjdGl2ZSwrK3QuX2VuZGVkLHQuX3Rhc2tzW25dPW51bGwsbnVsbD09dC5fZXJyb3ImJihudWxsIT1lP2d1KHQsZSk6KHQuX2RhdGFbbl09cix0Ll93YWl0aW5nP2R1KHQpOnl1KHQpKSkpfX1mdW5jdGlvbiBndSh0LG4pe3ZhciBlLHI9dC5fdGFza3MubGVuZ3RoO2Zvcih0Ll9lcnJvcj1uLHQuX2RhdGE9dm9pZCAwLHQuX3dhaXRpbmc9TmFOOy0tcj49MDspaWYoKGU9dC5fdGFza3Nbcl0pJiYodC5fdGFza3Nbcl09bnVsbCxlLmFib3J0KSl0cnl7ZS5hYm9ydCgpfWNhdGNoKHQpe310Ll9hY3RpdmU9TmFOLHl1KHQpfWZ1bmN0aW9uIHl1KHQpe2lmKCF0Ll9hY3RpdmUmJnQuX2NhbGwpe3ZhciBuPXQuX2RhdGE7dC5fZGF0YT12b2lkIDAsdC5fY2FsbCh0Ll9lcnJvcixuKX19ZnVuY3Rpb24gbXUodCl7cmV0dXJuIG5ldyBwdShhcmd1bWVudHMubGVuZ3RoPyt0OjEvMCl9ZnVuY3Rpb24geHUodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dChudWxsPT1uP2U6bnVsbCl9fWZ1bmN0aW9uIGJ1KHQpe3ZhciBuPXQucmVzcG9uc2VUeXBlO3JldHVybiBuJiYidGV4dCIhPT1uP3QucmVzcG9uc2U6dC5yZXNwb25zZVRleHR9ZnVuY3Rpb24gd3UodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZS5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIE11KHQpe2Z1bmN0aW9uIG4obil7dmFyIG89bisiIix1PWUuZ2V0KG8pO2lmKCF1KXtpZihpIT09WW0pcmV0dXJuIGk7ZS5zZXQobyx1PXIucHVzaChuKSl9cmV0dXJuIHRbKHUtMSkldC5sZW5ndGhdfXZhciBlPVllKCkscj1bXSxpPVltO3JldHVybiB0PW51bGw9PXQ/W106SW0uY2FsbCh0KSxuLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gci5zbGljZSgpO3I9W10sZT1ZZSgpO2Zvcih2YXIgaSxvLHU9LTEsYT10Lmxlbmd0aDsrK3U8YTspZS5oYXMobz0oaT10W3VdKSsiIil8fGUuc2V0KG8sci5wdXNoKGkpKTtyZXR1cm4gbn0sbi5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1JbS5jYWxsKGUpLG4pOnQuc2xpY2UoKX0sbi51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIE11KCkuZG9tYWluKHIpLnJhbmdlKHQpLnVua25vd24oaSl9LG59ZnVuY3Rpb24gVHUoKXtmdW5jdGlvbiB0KCl7dmFyIHQ9aSgpLmxlbmd0aCxyPXVbMV08dVswXSxsPXVbci0wXSxoPXVbMS1yXTtuPShoLWwpL01hdGgubWF4KDEsdC1jKzIqcyksYSYmKG49TWF0aC5mbG9vcihuKSksbCs9KGgtbC1uKih0LWMpKSpmLGU9biooMS1jKSxhJiYobD1NYXRoLnJvdW5kKGwpLGU9TWF0aC5yb3VuZChlKSk7dmFyIHA9UXModCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBsK24qdH0pO3JldHVybiBvKHI/cC5yZXZlcnNlKCk6cCl9dmFyIG4sZSxyPU11KCkudW5rbm93bih2b2lkIDApLGk9ci5kb21haW4sbz1yLnJhbmdlLHU9WzAsMV0sYT0hMSxjPTAscz0wLGY9LjU7cmV0dXJuIGRlbGV0ZSByLnVua25vd24sci5kb21haW49ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkobiksdCgpKTppKCl9LHIucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9WytuWzBdLCtuWzFdXSx0KCkpOnUuc2xpY2UoKX0sci5yYW5nZVJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiB1PVsrblswXSwrblsxXV0sYT0hMCx0KCl9LHIuYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHIuc3RlcD1mdW5jdGlvbigpe3JldHVybiBufSxyLnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSEhbix0KCkpOmF9LHIucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1zPU1hdGgubWF4KDAsTWF0aC5taW4oMSxuKSksdCgpKTpjfSxyLnBhZGRpbmdJbm5lcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6Y30sci5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOnN9LHIuYWxpZ249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOmZ9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBUdSgpLmRvbWFpbihpKCkpLnJhbmdlKHUpLnJvdW5kKGEpLnBhZGRpbmdJbm5lcihjKS5wYWRkaW5nT3V0ZXIocykuYWxpZ24oZil9LHQoKX1mdW5jdGlvbiBrdSh0KXt2YXIgbj10LmNvcHk7cmV0dXJuIHQucGFkZGluZz10LnBhZGRpbmdPdXRlcixkZWxldGUgdC5wYWRkaW5nSW5uZXIsZGVsZXRlIHQucGFkZGluZ091dGVyLHQuY29weT1mdW5jdGlvbigpe3JldHVybiBrdShuKCkpfSx0fWZ1bmN0aW9uIFN1KCl7cmV0dXJuIGt1KFR1KCkucGFkZGluZ0lubmVyKDEpKX1mdW5jdGlvbiBOdSh0LG4pe3JldHVybihuLT10PSt0KT9mdW5jdGlvbihlKXtyZXR1cm4oZS10KS9ufTpCbShuKX1mdW5jdGlvbiBFdSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KG49K24sZT0rZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD1uPzA6dD49ZT8xOnIodCl9fX1mdW5jdGlvbiBBdSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KG49K24sZT0rZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD0wP246dD49MT9lOnIodCl9fX1mdW5jdGlvbiBDdSh0LG4sZSxyKXt2YXIgaT10WzBdLG89dFsxXSx1PW5bMF0sYT1uWzFdO3JldHVybiBvPGk/KGk9ZShvLGkpLHU9cihhLHUpKTooaT1lKGksbyksdT1yKHUsYSkpLGZ1bmN0aW9uKHQpe3JldHVybiB1KGkodCkpfX1mdW5jdGlvbiB6dSh0LG4sZSxyKXt2YXIgaT1NYXRoLm1pbih0Lmxlbmd0aCxuLmxlbmd0aCktMSxvPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKSxhPS0xO2Zvcih0W2ldPHRbMF0mJih0PXQuc2xpY2UoKS5yZXZlcnNlKCksbj1uLnNsaWNlKCkucmV2ZXJzZSgpKTsrK2E8aTspb1thXT1lKHRbYV0sdFthKzFdKSx1W2FdPXIoblthXSxuW2ErMV0pO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1Pcyh0LG4sMSxpKS0xO3JldHVybiB1W2VdKG9bZV0obikpfX1mdW5jdGlvbiBQdSh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKX1mdW5jdGlvbiBSdSh0LG4pe2Z1bmN0aW9uIGUoKXtyZXR1cm4gaT1NYXRoLm1pbihhLmxlbmd0aCxjLmxlbmd0aCk+Mj96dTpDdSxvPXU9bnVsbCxyfWZ1bmN0aW9uIHIobil7cmV0dXJuKG98fChvPWkoYSxjLGY/RXUodCk6dCxzKSkpKCtuKX12YXIgaSxvLHUsYT1IbSxjPUhtLHM9QWgsZj0hMTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuKHV8fCh1PWkoYyxhLE51LGY/QXUobik6bikpKSgrdCl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUZtLmNhbGwodCxqbSksZSgpKTphLnNsaWNlKCl9LHIucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9SW0uY2FsbCh0KSxlKCkpOmMuc2xpY2UoKX0sci5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBjPUltLmNhbGwodCkscz1DaCxlKCl9LHIuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ISF0LGUoKSk6Zn0sci5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LGUoKSk6c30sZSgpfWZ1bmN0aW9uIEx1KHQpe3ZhciBuPXQuZG9tYWluO3JldHVybiB0LnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBlPW4oKTtyZXR1cm4gZWYoZVswXSxlW2UubGVuZ3RoLTFdLG51bGw9PXQ/MTA6dCl9LHQudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiBYbShuKCksdCxlKX0sdC5uaWNlPWZ1bmN0aW9uKGUpe3ZhciBpPW4oKSxvPWkubGVuZ3RoLTEsdT1udWxsPT1lPzEwOmUsYT1pWzBdLGM9aVtvXSxzPXIoYSxjLHUpO3JldHVybiBzJiYocz1yKE1hdGguZmxvb3IoYS9zKSpzLE1hdGguY2VpbChjL3MpKnMsdSksaVswXT1NYXRoLmZsb29yKGEvcykqcyxpW29dPU1hdGguY2VpbChjL3MpKnMsbihpKSksdH0sdH1mdW5jdGlvbiBxdSgpe3ZhciB0PVJ1KE51LFRoKTtyZXR1cm4gdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFB1KHQscXUoKSl9LEx1KHQpfWZ1bmN0aW9uIFV1KCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4rdH12YXIgbj1bMCwxXTtyZXR1cm4gdC5pbnZlcnQ9dCx0LmRvbWFpbj10LnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPUZtLmNhbGwoZSxqbSksdCk6bi5zbGljZSgpfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gVXUoKS5kb21haW4obil9LEx1KHQpfWZ1bmN0aW9uIER1KHQsbil7cmV0dXJuKG49TWF0aC5sb2cobi90KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUvdCkvbn06Qm0obil9ZnVuY3Rpb24gT3UodCxuKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKGUpe3JldHVybi1NYXRoLnBvdygtbixlKSpNYXRoLnBvdygtdCwxLWUpfTpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3cobixlKSpNYXRoLnBvdyh0LDEtZSl9fWZ1bmN0aW9uIEZ1KHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBJdSh0KXtyZXR1cm4gMTA9PT10P0Z1OnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KHQsbil9fWZ1bmN0aW9uIFl1KHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4pL3R9KX1mdW5jdGlvbiBCdSh0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuLXQoLW4pfX1mdW5jdGlvbiBqdSgpe2Z1bmN0aW9uIG4oKXtyZXR1cm4gbz1ZdShpKSx1PUl1KGkpLHIoKVswXTwwJiYobz1CdShvKSx1PUJ1KHUpKSxlfXZhciBlPVJ1KER1LE91KS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz1ZdSgxMCksdT1JdSgxMCk7cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLG4oKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLGE9ZVswXSxjPWVbZS5sZW5ndGgtMV07KG49YzxhKSYmKGg9YSxhPWMsYz1oKTt2YXIgcyxmLGwsaD1vKGEpLHA9byhjKSxkPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJnAtaDxkKXtpZihoPU1hdGgucm91bmQoaCktMSxwPU1hdGgucm91bmQocCkrMSxhPjApe2Zvcig7aDxwOysraClmb3IoZj0xLHM9dShoKTtmPGk7KytmKWlmKGw9cypmLCEobDxhKSl7aWYobD5jKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8cDsrK2gpZm9yKGY9aS0xLHM9dShoKTtmPj0xOy0tZilpZihsPXMqZiwhKGw8YSkpe2lmKGw+YylicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1lZihoLHAsTWF0aC5taW4ocC1oLGQpKS5tYXAodSk7cmV0dXJuIG4/di5yZXZlcnNlKCk6dn0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKG4scil7aWYobnVsbD09ciYmKHI9MTA9PT1pPyIuMGUiOiIsIiksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPXQuZm9ybWF0KHIpKSxuPT09MS8wKXJldHVybiByO251bGw9PW4mJihuPTEwKTt2YXIgYT1NYXRoLm1heCgxLGkqbi9lLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC91KE1hdGgucm91bmQobyh0KSkpO3JldHVybiBuKmk8aS0uNSYmKG4qPWkpLG48PWE/cih0KToiIn19LGUubmljZT1mdW5jdGlvbigpe3JldHVybiByKFZtKHIoKSx7Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHUoTWF0aC5mbG9vcihvKHQpKSl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIHUoTWF0aC5jZWlsKG8odCkpKX19KSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBQdShlLGp1KCkuYmFzZShpKSl9LGV9ZnVuY3Rpb24gSHUodCxuKXtyZXR1cm4gdDwwPy1NYXRoLnBvdygtdCxuKTpNYXRoLnBvdyh0LG4pfWZ1bmN0aW9uIFh1KCl7ZnVuY3Rpb24gdCh0LG4pe3JldHVybihuPUh1KG4sZSktKHQ9SHUodCxlKSkpP2Z1bmN0aW9uKHIpe3JldHVybihIdShyLGUpLXQpL259OkJtKG4pfWZ1bmN0aW9uIG4odCxuKXtyZXR1cm4gbj1IdShuLGUpLSh0PUh1KHQsZSkpLGZ1bmN0aW9uKHIpe3JldHVybiBIdSh0K24qciwxL2UpfX12YXIgZT0xLHI9UnUodCxuKSxpPXIuZG9tYWluO3JldHVybiByLmV4cG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LGkoaSgpKSk6ZX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFB1KHIsWHUoKS5leHBvbmVudChlKSl9LEx1KHIpfWZ1bmN0aW9uIFZ1KCl7cmV0dXJuIFh1KCkuZXhwb25lbnQoLjUpfWZ1bmN0aW9uIFd1KCl7ZnVuY3Rpb24gdCgpe3ZhciB0PTAsbz1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3IoaT1uZXcgQXJyYXkoby0xKTsrK3Q8bzspaVt0LTFdPXVmKGUsdC9vKTtyZXR1cm4gbn1mdW5jdGlvbiBuKHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gcltPcyhpLHQpXX12YXIgZT1bXSxyPVtdLGk9W107cmV0dXJuIG4uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP2lbbi0xXTplWzBdLG48aS5sZW5ndGg/aVtuXTplW2UubGVuZ3RoLTFdXX0sbi5kb21haW49ZnVuY3Rpb24obil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz1uLmxlbmd0aDtpPG87KytpKXI9bltpXSxudWxsPT1yfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQocXMpLHQoKX0sbi5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1JbS5jYWxsKG4pLHQoKSk6ci5zbGljZSgpfSxuLnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBpLnNsaWNlKCl9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBXdSgpLmRvbWFpbihlKS5yYW5nZShyKX0sbn1mdW5jdGlvbiAkdSgpe2Z1bmN0aW9uIHQodCl7aWYodDw9dClyZXR1cm4gdVtPcyhvLHQsMCxpKV19ZnVuY3Rpb24gbigpe3ZhciBuPS0xO2ZvcihvPW5ldyBBcnJheShpKTsrK248aTspb1tuXT0oKG4rMSkqci0obi1pKSplKS8oaSsxKTtyZXR1cm4gdH12YXIgZT0wLHI9MSxpPTEsbz1bLjVdLHU9WzAsMV07cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0sbigpKTpbZSxyXX0sdC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1JbS5jYWxsKHQpKS5sZW5ndGgtMSxuKCkpOnUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG49dS5pbmRleE9mKHQpO3JldHVybiBuPDA/W05hTixOYU5dOm48MT9bZSxvWzBdXTpuPj1pP1tvW2ktMV0scl06W29bbi0xXSxvW25dXX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuICR1KCkuZG9tYWluKFtlLHJdKS5yYW5nZSh1KX0sTHUodCl9ZnVuY3Rpb24gWnUoKXtmdW5jdGlvbiB0KHQpe2lmKHQ8PXQpcmV0dXJuIGVbT3Mobix0LDAscildfXZhciBuPVsuNV0sZT1bMCwxXSxyPTE7cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPUltLmNhbGwoaSkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSx0KTpuLnNsaWNlKCl9LHQucmFuZ2U9ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9SW0uY2FsbChpKSxyPU1hdGgubWluKG4ubGVuZ3RoLGUubGVuZ3RoLTEpLHQpOmUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIHI9ZS5pbmRleE9mKHQpO3JldHVybltuW3ItMV0sbltyXV19LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBadSgpLmRvbWFpbihuKS5yYW5nZShlKX0sdH1mdW5jdGlvbiBHdSh0LG4sZSxyKXtmdW5jdGlvbiBpKG4pe3JldHVybiB0KG49bmV3IERhdGUoK24pKSxufXJldHVybiBpLmZsb29yPWksaS5jZWlsPWZ1bmN0aW9uKGUpe3JldHVybiB0KGU9bmV3IERhdGUoZS0xKSksbihlLDEpLHQoZSksZX0saS5yb3VuZD1mdW5jdGlvbih0KXt2YXIgbj1pKHQpLGU9aS5jZWlsKHQpO3JldHVybiB0LW48ZS10P246ZX0saS5vZmZzZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0PW5ldyBEYXRlKCt0KSxudWxsPT1lPzE6TWF0aC5mbG9vcihlKSksdH0saS5yYW5nZT1mdW5jdGlvbihlLHIsbyl7dmFyIHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkbyB1LnB1c2gobmV3IERhdGUoK2UpKTt3aGlsZShuKGUsbyksdChlKSxlPHIpO3JldHVybiB1fSxpLmZpbHRlcj1mdW5jdGlvbihlKXtyZXR1cm4gR3UoZnVuY3Rpb24obil7aWYobj49bilmb3IoO3QobiksIWUobik7KW4uc2V0VGltZShuLTEpfSxmdW5jdGlvbih0LHIpe2lmKHQ+PXQpZm9yKDstLXI+PTA7KWZvcig7bih0LDEpLCFlKHQpOyk7fSl9LGUmJihpLmNvdW50PWZ1bmN0aW9uKG4scil7cmV0dXJuIFdtLnNldFRpbWUoK24pLCRtLnNldFRpbWUoK3IpLHQoV20pLHQoJG0pLE1hdGguZmxvb3IoZShXbSwkbSkpfSxpLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/aS5maWx0ZXIocj9mdW5jdGlvbihuKXtyZXR1cm4gcihuKSV0PT09MH06ZnVuY3Rpb24obil7cmV0dXJuIGkuY291bnQoMCxuKSV0PT09MH0pOmk6bnVsbH0pLGl9ZnVuY3Rpb24gSnUodCl7cmV0dXJuIEd1KGZ1bmN0aW9uKG4pe24uc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSs3LXQpJTcpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdC0obi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqUW0pL254fSl9ZnVuY3Rpb24gUXUodCl7cmV0dXJuIEd1KGZ1bmN0aW9uKG4pe24uc2V0VVRDRGF0ZShuLmdldFVUQ0RhdGUoKS0obi5nZXRVVENEYXkoKSs3LXQpJTcpLG4uc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpKzcqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvbnh9KX1mdW5jdGlvbiBLdSh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBuPW5ldyBEYXRlKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKTtyZXR1cm4gbi5zZXRGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCl9ZnVuY3Rpb24gdGEodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZShEYXRlLlVUQygtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpO3JldHVybiBuLnNldFVUQ0Z1bGxZZWFyKHQueSksbn1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSl9ZnVuY3Rpb24gbmEodCl7cmV0dXJue3k6dCxtOjAsZDoxLEg6MCxNOjAsUzowLEw6MH19ZnVuY3Rpb24gZWEodCl7ZnVuY3Rpb24gbih0LG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcixpLG8sdT1bXSxhPS0xLGM9MCxzPXQubGVuZ3RoO2ZvcihlIGluc3RhbmNlb2YgRGF0ZXx8KGU9bmV3IERhdGUoK2UpKTsrK2E8czspMzc9PT10LmNoYXJDb2RlQXQoYSkmJih1LnB1c2godC5zbGljZShjLGEpKSxudWxsIT0oaT1LeFtyPXQuY2hhckF0KCsrYSldKT9yPXQuY2hhckF0KCsrYSk6aT0iZSI9PT1yPyIgIjoiMCIsKG89bltyXSkmJihyPW8oZSxpKSksdS5wdXNoKHIpLGM9YSsxKTtyZXR1cm4gdS5wdXNoKHQuc2xpY2UoYyxhKSksdS5qb2luKCIiKX19ZnVuY3Rpb24gZSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgaT1uYSgxOTAwKTtpZihyKGksdCxlKz0iIiwwKSE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7aWYoInAiaW4gaSYmKGkuSD1pLkglMTIrMTIqaS5wKSwiVyJpbiBpfHwiVSJpbiBpKXsidyJpbiBpfHwoaS53PSJXImluIGk/MTowKTt2YXIgbz0iWiJpbiBpP3RhKG5hKGkueSkpLmdldFVUQ0RheSgpOm4obmEoaS55KSkuZ2V0RGF5KCk7aS5tPTAsaS5kPSJXImluIGk/KGkudys2KSU3KzcqaS5XLShvKzUpJTc6aS53KzcqaS5VLShvKzYpJTd9cmV0dXJuIloiaW4gaT8oaS5IKz1pLlovMTAwfDAsaS5NKz1pLlolMTAwLHRhKGkpKTpuKGkpfX1mdW5jdGlvbiByKHQsbixlLHIpewpmb3IodmFyIGksbyx1PTAsYT1uLmxlbmd0aCxjPWUubGVuZ3RoO3U8YTspe2lmKHI+PWMpcmV0dXJuLTE7aWYoaT1uLmNoYXJDb2RlQXQodSsrKSwzNz09PWkpe2lmKGk9bi5jaGFyQXQodSsrKSxvPUJbaSBpbiBLeD9uLmNoYXJBdCh1KyspOmldLCFvfHwocj1vKHQsZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKGkhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfWZ1bmN0aW9uIGkodCxuLGUpe3ZhciByPUMuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5wPXpbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvKHQsbixlKXt2YXIgcj1MLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1xW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdSh0LG4sZSl7dmFyIHI9UC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9UltyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEodCxuLGUpe3ZhciByPU8uZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPUZbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBjKHQsbixlKXt2YXIgcj1VLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQubT1EW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcyh0LG4sZSl7cmV0dXJuIHIodCx3LG4sZSl9ZnVuY3Rpb24gZih0LG4sZSl7cmV0dXJuIHIodCxNLG4sZSl9ZnVuY3Rpb24gbCh0LG4sZSl7cmV0dXJuIHIodCxULG4sZSl9ZnVuY3Rpb24gaCh0KXtyZXR1cm4gTlt0LmdldERheSgpXX1mdW5jdGlvbiBwKHQpe3JldHVybiBTW3QuZ2V0RGF5KCldfWZ1bmN0aW9uIGQodCl7cmV0dXJuIEFbdC5nZXRNb250aCgpXX1mdW5jdGlvbiB2KHQpe3JldHVybiBFW3QuZ2V0TW9udGgoKV19ZnVuY3Rpb24gXyh0KXtyZXR1cm4ga1srKHQuZ2V0SG91cnMoKT49MTIpXX1mdW5jdGlvbiBnKHQpe3JldHVybiBOW3QuZ2V0VVRDRGF5KCldfWZ1bmN0aW9uIHkodCl7cmV0dXJuIFNbdC5nZXRVVENEYXkoKV19ZnVuY3Rpb24gbSh0KXtyZXR1cm4gQVt0LmdldFVUQ01vbnRoKCldfWZ1bmN0aW9uIHgodCl7cmV0dXJuIEVbdC5nZXRVVENNb250aCgpXX1mdW5jdGlvbiBiKHQpe3JldHVybiBrWysodC5nZXRVVENIb3VycygpPj0xMildfXZhciB3PXQuZGF0ZVRpbWUsTT10LmRhdGUsVD10LnRpbWUsaz10LnBlcmlvZHMsUz10LmRheXMsTj10LnNob3J0RGF5cyxFPXQubW9udGhzLEE9dC5zaG9ydE1vbnRocyxDPW9hKGspLHo9dWEoayksUD1vYShTKSxSPXVhKFMpLEw9b2EoTikscT11YShOKSxVPW9hKEUpLEQ9dWEoRSksTz1vYShBKSxGPXVhKEEpLEk9e2E6aCxBOnAsYjpkLEI6dixjOm51bGwsZDpiYSxlOmJhLEg6d2EsSTpNYSxqOlRhLEw6a2EsbTpTYSxNOk5hLHA6XyxTOkVhLFU6QWEsdzpDYSxXOnphLHg6bnVsbCxYOm51bGwseTpQYSxZOlJhLFo6TGEsIiUiOlphfSxZPXthOmcsQTp5LGI6bSxCOngsYzpudWxsLGQ6cWEsZTpxYSxIOlVhLEk6RGEsajpPYSxMOkZhLG06SWEsTTpZYSxwOmIsUzpCYSxVOmphLHc6SGEsVzpYYSx4Om51bGwsWDpudWxsLHk6VmEsWTpXYSxaOiRhLCIlIjpaYX0sQj17YTpvLEE6dSxiOmEsQjpjLGM6cyxkOmRhLGU6ZGEsSDpfYSxJOl9hLGo6dmEsTDptYSxtOnBhLE06Z2EscDppLFM6eWEsVTpjYSx3OmFhLFc6c2EseDpmLFg6bCx5OmxhLFk6ZmEsWjpoYSwiJSI6eGF9O3JldHVybiBJLng9bihNLEkpLEkuWD1uKFQsSSksSS5jPW4odyxJKSxZLng9bihNLFkpLFkuWD1uKFQsWSksWS5jPW4odyxZKSx7Zm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPW4odCs9IiIsSSk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0scGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49ZSh0Kz0iIixLdSk7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0sdXRjRm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPW4odCs9IiIsWSk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0sdXRjUGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49ZSh0LHRhKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufX19ZnVuY3Rpb24gcmEodCxuLGUpe3ZhciByPXQ8MD8iLSI6IiIsaT0ocj8tdDp0KSsiIixvPWkubGVuZ3RoO3JldHVybiByKyhvPGU/bmV3IEFycmF5KGUtbysxKS5qb2luKG4pK2k6aSl9ZnVuY3Rpb24gaWEodCl7cmV0dXJuIHQucmVwbGFjZShlYiwiXFwkJiIpfWZ1bmN0aW9uIG9hKHQpe3JldHVybiBuZXcgUmVnRXhwKCJeKD86Iit0Lm1hcChpYSkuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIHVhKHQpe2Zvcih2YXIgbj17fSxlPS0xLHI9dC5sZW5ndGg7KytlPHI7KW5bdFtlXS50b0xvd2VyQ2FzZSgpXT1lO3JldHVybiBufWZ1bmN0aW9uIGFhKHQsbixlKXt2YXIgcj10Yi5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8odC53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNhKHQsbixlKXt2YXIgcj10Yi5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gc2EodCxuLGUpe3ZhciByPXRiLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBmYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KHQueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBsYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQueT0rclswXSsoK3JbMF0+Njg/MTkwMDoyZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGhhKHQsbixlKXt2YXIgcj0vXihaKXwoWystXVxkXGQpKD86XDo/KFxkXGQpKT8vLmV4ZWMobi5zbGljZShlLGUrNikpO3JldHVybiByPyh0Llo9clsxXT8wOi0oclsyXSsoclszXXx8IjAwIikpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBhKHQsbixlKXt2YXIgcj10Yi5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBkYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB2YSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KHQubT0wLHQuZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBfYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBnYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB5YSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuUz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBtYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KHQuTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB4YSh0LG4sZSl7dmFyIHI9bmIuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBiYSh0LG4pe3JldHVybiByYSh0LmdldERhdGUoKSxuLDIpfWZ1bmN0aW9uIHdhKHQsbil7cmV0dXJuIHJhKHQuZ2V0SG91cnMoKSxuLDIpfWZ1bmN0aW9uIE1hKHQsbil7cmV0dXJuIHJhKHQuZ2V0SG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBUYSh0LG4pe3JldHVybiByYSgxK2N4LmNvdW50KFN4KHQpLHQpLG4sMyl9ZnVuY3Rpb24ga2EodCxuKXtyZXR1cm4gcmEodC5nZXRNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIFNhKHQsbil7cmV0dXJuIHJhKHQuZ2V0TW9udGgoKSsxLG4sMil9ZnVuY3Rpb24gTmEodCxuKXtyZXR1cm4gcmEodC5nZXRNaW51dGVzKCksbiwyKX1mdW5jdGlvbiBFYSh0LG4pe3JldHVybiByYSh0LmdldFNlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIEFhKHQsbil7cmV0dXJuIHJhKGZ4LmNvdW50KFN4KHQpLHQpLG4sMil9ZnVuY3Rpb24gQ2EodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gemEodCxuKXtyZXR1cm4gcmEobHguY291bnQoU3godCksdCksbiwyKX1mdW5jdGlvbiBQYSh0LG4pe3JldHVybiByYSh0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24gUmEodCxuKXtyZXR1cm4gcmEodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIExhKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4obj4wPyItIjoobio9LTEsIisiKSkrcmEobi82MHwwLCIwIiwyKStyYShuJTYwLCIwIiwyKX1mdW5jdGlvbiBxYSh0LG4pe3JldHVybiByYSh0LmdldFVUQ0RhdGUoKSxuLDIpfWZ1bmN0aW9uIFVhKHQsbil7cmV0dXJuIHJhKHQuZ2V0VVRDSG91cnMoKSxuLDIpfWZ1bmN0aW9uIERhKHQsbil7cmV0dXJuIHJhKHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBPYSh0LG4pe3JldHVybiByYSgxK1B4LmNvdW50KEd4KHQpLHQpLG4sMyl9ZnVuY3Rpb24gRmEodCxuKXtyZXR1cm4gcmEodC5nZXRVVENNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIElhKHQsbil7cmV0dXJuIHJhKHQuZ2V0VVRDTW9udGgoKSsxLG4sMil9ZnVuY3Rpb24gWWEodCxuKXtyZXR1cm4gcmEodC5nZXRVVENNaW51dGVzKCksbiwyKX1mdW5jdGlvbiBCYSh0LG4pe3JldHVybiByYSh0LmdldFVUQ1NlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIGphKHQsbil7cmV0dXJuIHJhKEx4LmNvdW50KEd4KHQpLHQpLG4sMil9ZnVuY3Rpb24gSGEodCl7cmV0dXJuIHQuZ2V0VVRDRGF5KCl9ZnVuY3Rpb24gWGEodCxuKXtyZXR1cm4gcmEocXguY291bnQoR3godCksdCksbiwyKX1mdW5jdGlvbiBWYSh0LG4pe3JldHVybiByYSh0LmdldFVUQ0Z1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24gV2EodCxuKXtyZXR1cm4gcmEodC5nZXRVVENGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uICRhKCl7cmV0dXJuIiswMDAwIn1mdW5jdGlvbiBaYSgpe3JldHVybiIlIn1mdW5jdGlvbiBHYShuKXtyZXR1cm4gSng9ZWEobiksdC50aW1lRm9ybWF0PUp4LmZvcm1hdCx0LnRpbWVQYXJzZT1KeC5wYXJzZSx0LnV0Y0Zvcm1hdD1KeC51dGNGb3JtYXQsdC51dGNQYXJzZT1KeC51dGNQYXJzZSxKeH1mdW5jdGlvbiBKYSh0KXtyZXR1cm4gdC50b0lTT1N0cmluZygpfWZ1bmN0aW9uIFFhKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59ZnVuY3Rpb24gS2EodCl7cmV0dXJuIG5ldyBEYXRlKHQpfWZ1bmN0aW9uIHRjKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT8rdDorbmV3IERhdGUoK3QpfWZ1bmN0aW9uIG5jKHQsbixlLGksbyx1LGEsYyxzKXtmdW5jdGlvbiBmKHIpe3JldHVybihhKHIpPHI/djp1KHIpPHI/XzpvKHIpPHI/ZzppKHIpPHI/eTpuKHIpPHI/ZShyKTxyP206eDp0KHIpPHI/Yjp3KShyKX1mdW5jdGlvbiBsKG4sZSxpLG8pe2lmKG51bGw9PW4mJihuPTEwKSwibnVtYmVyIj09dHlwZW9mIG4pe3ZhciB1PU1hdGguYWJzKGktZSkvbixhPVVzKGZ1bmN0aW9uKHQpe3JldHVybiB0WzJdfSkucmlnaHQoTSx1KTthPT09TS5sZW5ndGg/KG89cihlL2hiLGkvaGIsbiksbj10KTphPyhhPU1bdS9NW2EtMV1bMl08TVthXVsyXS91P2EtMTphXSxvPWFbMV0sbj1hWzBdKToobz1yKGUsaSxuKSxuPWMpfXJldHVybiBudWxsPT1vP246bi5ldmVyeShvKX12YXIgaD1SdShOdSxUaCkscD1oLmludmVydCxkPWguZG9tYWluLHY9cygiLiVMIiksXz1zKCI6JVMiKSxnPXMoIiVJOiVNIikseT1zKCIlSSAlcCIpLG09cygiJWEgJWQiKSx4PXMoIiViICVkIiksYj1zKCIlQiIpLHc9cygiJVkiKSxNPVtbYSwxLHViXSxbYSw1LDUqdWJdLFthLDE1LDE1KnViXSxbYSwzMCwzMCp1Yl0sW3UsMSxhYl0sW3UsNSw1KmFiXSxbdSwxNSwxNSphYl0sW3UsMzAsMzAqYWJdLFtvLDEsY2JdLFtvLDMsMypjYl0sW28sNiw2KmNiXSxbbywxMiwxMipjYl0sW2ksMSxzYl0sW2ksMiwyKnNiXSxbZSwxLGZiXSxbbiwxLGxiXSxbbiwzLDMqbGJdLFt0LDEsaGJdXTtyZXR1cm4gaC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBEYXRlKHAodCkpfSxoLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9kKEZtLmNhbGwodCx0YykpOmQoKS5tYXAoS2EpfSxoLnRpY2tzPWZ1bmN0aW9uKHQsbil7dmFyIGUscj1kKCksaT1yWzBdLG89cltyLmxlbmd0aC0xXSx1PW88aTtyZXR1cm4gdSYmKGU9aSxpPW8sbz1lKSxlPWwodCxpLG8sbiksZT1lP2UucmFuZ2UoaSxvKzEpOltdLHU/ZS5yZXZlcnNlKCk6ZX0saC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIG51bGw9PW4/ZjpzKG4pfSxoLm5pY2U9ZnVuY3Rpb24odCxuKXt2YXIgZT1kKCk7cmV0dXJuKHQ9bCh0LGVbMF0sZVtlLmxlbmd0aC0xXSxuKSk/ZChWbShlLHQpKTpofSxoLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gUHUoaCxuYyh0LG4sZSxpLG8sdSxhLGMscykpfSxofWZ1bmN0aW9uIGVjKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fWZ1bmN0aW9uIHJjKHQpe2Z1bmN0aW9uIG4obil7dmFyIG89KG4tZSkvKHItZSk7cmV0dXJuIHQoaT9NYXRoLm1heCgwLE1hdGgubWluKDEsbykpOm8pfXZhciBlPTAscj0xLGk9ITE7cmV0dXJuIG4uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0sbik6W2Uscl19LG4uY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ISF0LG4pOml9LG4uaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHJjKHQpLmRvbWFpbihbZSxyXSkuY2xhbXAoaSl9LEx1KG4pfWZ1bmN0aW9uIGljKHQpe3JldHVybiB0PjE/MDp0PC0xP09iOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBvYyh0KXtyZXR1cm4gdD49MT9GYjp0PD0tMT8tRmI6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIHVjKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIGFjKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uIGNjKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gc2ModCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gZmModCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gbGModCxuLGUscixpLG8sdSxhKXt2YXIgYz1lLXQscz1yLW4sZj11LWksbD1hLW8saD0oZioobi1vKS1sKih0LWkpKS8obCpjLWYqcyk7cmV0dXJuW3QraCpjLG4raCpzXX1mdW5jdGlvbiBoYyh0LG4sZSxyLGksbyx1KXt2YXIgYT10LWUsYz1uLXIscz0odT9vOi1vKS9VYihhKmErYypjKSxmPXMqYyxsPS1zKmEsaD10K2YscD1uK2wsZD1lK2Ysdj1yK2wsXz0oaCtkKS8yLGc9KHArdikvMix5PWQtaCxtPXYtcCx4PXkqeSttKm0sYj1pLW8sdz1oKnYtZCpwLE09KG08MD8tMToxKSpVYihSYigwLGIqYip4LXcqdykpLFQ9KHcqbS15Kk0pL3gsaz0oLXcqeS1tKk0pL3gsUz0odyptK3kqTSkveCxOPSgtdyp5K20qTSkveCxFPVQtXyxBPWstZyxDPVMtXyx6PU4tZztyZXR1cm4gRSpFK0EqQT5DKkMreip6JiYoVD1TLGs9Tikse2N4OlQsY3k6ayx4MDE6LWYseTAxOi1sLHgxMTpUKihpL2ItMSkseTExOmsqKGkvYi0xKX19ZnVuY3Rpb24gcGModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGRjKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIHZjKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIF9jKHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZ2ModCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IF9jKHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24geWModCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oZ2ModCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gbWModCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIHhjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBiYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gd2ModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIE1jKHQsbil7dGhpcy5fYmFzaXM9bmV3IHhjKHQpLHRoaXMuX2JldGE9bn1mdW5jdGlvbiBUYyh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIGtjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1mdW5jdGlvbiBTYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9ZnVuY3Rpb24gTmModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fWZ1bmN0aW9uIEVjKHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsdT10Ll95MjtpZih0Ll9sMDFfYT5EYil7dmFyIGE9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsYz0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ociphLXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2MsaT0oaSphLXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2N9aWYodC5fbDIzX2E+RGIpe3ZhciBzPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGY9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qcyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL2YsdT0odSpzK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvZn10Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sdSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gQWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1mdW5jdGlvbiBDYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufWZ1bmN0aW9uIHpjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZnVuY3Rpb24gUGModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIFJjKHQpe3JldHVybiB0PDA/LTE6MX1mdW5jdGlvbiBMYyh0LG4sZSl7dmFyIHI9dC5feDEtdC5feDAsaT1uLXQuX3gxLG89KHQuX3kxLXQuX3kwKS8ocnx8aTwwJiYtMCksdT0oZS10Ll95MSkvKGl8fHI8MCYmLTApLGE9KG8qaSt1KnIpLyhyK2kpO3JldHVybihSYyhvKStSYyh1KSkqTWF0aC5taW4oTWF0aC5hYnMobyksTWF0aC5hYnModSksLjUqTWF0aC5hYnMoYSkpfHwwfWZ1bmN0aW9uIHFjKHQsbil7dmFyIGU9dC5feDEtdC5feDA7cmV0dXJuIGU/KDMqKHQuX3kxLXQuX3kwKS9lLW4pLzI6bn1mdW5jdGlvbiBVYyh0LG4sZSl7dmFyIHI9dC5feDAsaT10Ll95MCxvPXQuX3gxLHU9dC5feTEsYT0oby1yKS8zO3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyK2EsaSthKm4sby1hLHUtYSplLG8sdSl9ZnVuY3Rpb24gRGModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIE9jKHQpe3RoaXMuX2NvbnRleHQ9bmV3IEZjKHQpfWZ1bmN0aW9uIEZjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBJYyh0KXtyZXR1cm4gbmV3IERjKHQpfWZ1bmN0aW9uIFljKHQpe3JldHVybiBuZXcgT2ModCl9ZnVuY3Rpb24gQmModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGpjKHQpe3ZhciBuLGUscj10Lmxlbmd0aC0xLGk9bmV3IEFycmF5KHIpLG89bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihpWzBdPTAsb1swXT0yLHVbMF09dFswXSsyKnRbMV0sbj0xO248ci0xOysrbilpW25dPTEsb1tuXT00LHVbbl09NCp0W25dKzIqdFtuKzFdO2ZvcihpW3ItMV09MixvW3ItMV09Nyx1W3ItMV09OCp0W3ItMV0rdFtyXSxuPTE7bjxyOysrbillPWlbbl0vb1tuLTFdLG9bbl0tPWUsdVtuXS09ZSp1W24tMV07Zm9yKGlbci0xXT11W3ItMV0vb1tyLTFdLG49ci0yO24+PTA7LS1uKWlbbl09KHVbbl0taVtuKzFdKS9vW25dO2ZvcihvW3ItMV09KHRbcl0raVtyLTFdKS8yLG49MDtuPHItMTsrK24pb1tuXT0yKnRbbisxXS1pW24rMV07cmV0dXJuW2ksb119ZnVuY3Rpb24gSGModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fdD1ufWZ1bmN0aW9uIFhjKHQpe3JldHVybiBuZXcgSGModCwwKX1mdW5jdGlvbiBWYyh0KXtyZXR1cm4gbmV3IEhjKHQsMSl9ZnVuY3Rpb24gV2ModCxuKXtyZXR1cm4gdFtuXX1mdW5jdGlvbiAkYyh0KXtmb3IodmFyIG4sZT0wLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspKG49K3Rbcl1bMV0pJiYoZSs9bik7cmV0dXJuIGV9ZnVuY3Rpb24gWmModCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gR2ModCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gSmMoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBRYyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIEtjKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiB0cyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gbnModCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIGVzKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89V3cucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmaXMoaSx0LG4sZSksciYmaXMoaSxuLHQsciksWHdbdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWHdbbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBycyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gaXModCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIG9zKHQsbixlLHIsaSl7dmFyIG8sdT10WzBdLGE9dFsxXSxjPXVbMF0scz11WzFdLGY9YVswXSxsPWFbMV0saD0wLHA9MSxkPWYtYyx2PWwtcztpZihvPW4tYyxkfHwhKG8+MCkpe2lmKG8vPWQsZDwwKXtpZihvPGgpcmV0dXJuO288cCYmKHA9byl9ZWxzZSBpZihkPjApe2lmKG8+cClyZXR1cm47bz5oJiYoaD1vKX1pZihvPXItYyxkfHwhKG88MCkpe2lmKG8vPWQsZDwwKXtpZihvPnApcmV0dXJuO28+aCYmKGg9byl9ZWxzZSBpZihkPjApe2lmKG88aClyZXR1cm47bzxwJiYocD1vKX1pZihvPWUtcyx2fHwhKG8+MCkpe2lmKG8vPXYsdjwwKXtpZihvPGgpcmV0dXJuO288cCYmKHA9byl9ZWxzZSBpZih2PjApe2lmKG8+cClyZXR1cm47bz5oJiYoaD1vKX1pZihvPWktcyx2fHwhKG88MCkpe2lmKG8vPXYsdjwwKXtpZihvPnApcmV0dXJuO28+aCYmKGg9byl9ZWxzZSBpZih2PjApe2lmKG88aClyZXR1cm47bzxwJiYocD1vKX1yZXR1cm4hKGg+MHx8cDwxKXx8KGg+MCYmKHRbMF09W2MraCpkLHMraCp2XSkscDwxJiYodFsxXT1bYytwKmQscytwKnZdKSwhMCl9fX19fWZ1bmN0aW9uIHVzKHQsbixlLHIsaSl7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciB1LGEsYz10WzBdLHM9dC5sZWZ0LGY9dC5yaWdodCxsPXNbMF0saD1zWzFdLHA9ZlswXSxkPWZbMV0sdj0obCtwKS8yLF89KGgrZCkvMjtpZihkPT09aCl7aWYodjxufHx2Pj1yKXJldHVybjtpZihsPnApe2lmKGMpe2lmKGNbMV0+PWkpcmV0dXJufWVsc2UgYz1bdixlXTtvPVt2LGldfWVsc2V7aWYoYyl7aWYoY1sxXTxlKXJldHVybn1lbHNlIGM9W3YsaV07bz1bdixlXX19ZWxzZSBpZih1PShsLXApLyhkLWgpLGE9Xy11KnYsdTwtMXx8dT4xKWlmKGw+cCl7aWYoYyl7aWYoY1sxXT49aSlyZXR1cm59ZWxzZSBjPVsoZS1hKS91LGVdO289WyhpLWEpL3UsaV19ZWxzZXtpZihjKXtpZihjWzFdPGUpcmV0dXJufWVsc2UgYz1bKGktYSkvdSxpXTtvPVsoZS1hKS91LGVdfWVsc2UgaWYoaDxkKXtpZihjKXtpZihjWzBdPj1yKXJldHVybn1lbHNlIGM9W24sdSpuK2FdO289W3IsdSpyK2FdfWVsc2V7aWYoYyl7aWYoY1swXTxuKXJldHVybn1lbHNlIGM9W3IsdSpyK2FdO289W24sdSpuK2FdfXJldHVybiB0WzBdPWMsdFsxXT1vLCEwfWZ1bmN0aW9uIGFzKHQsbixlLHIpe2Zvcih2YXIgaSxvPVd3Lmxlbmd0aDtvLS07KXVzKGk9V3dbb10sdCxuLGUscikmJm9zKGksdCxuLGUscikmJihNYXRoLmFicyhpWzBdWzBdLWlbMV1bMF0pPkd3fHxNYXRoLmFicyhpWzBdWzFdLWlbMV1bMV0pPkd3KXx8ZGVsZXRlIFd3W29dfWZ1bmN0aW9uIGNzKHQpe3JldHVybiBYd1t0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19ZnVuY3Rpb24gc3ModCxuKXt2YXIgZT10LnNpdGUscj1uLmxlZnQsaT1uLnJpZ2h0O3JldHVybiBlPT09aSYmKGk9cixyPWUpLGk/TWF0aC5hdGFuMihpWzFdLXJbMV0saVswXS1yWzBdKTooZT09PXI/KHI9blsxXSxpPW5bMF0pOihyPW5bMF0saT1uWzFdKSxNYXRoLmF0YW4yKHJbMF0taVswXSxpWzFdLXJbMV0pKX1mdW5jdGlvbiBmcyh0LG4pe3JldHVybiBuWysobi5sZWZ0IT09dC5zaXRlKV19ZnVuY3Rpb24gbHModCxuKXtyZXR1cm4gblsrKG4ubGVmdD09PXQuc2l0ZSldfWZ1bmN0aW9uIGhzKCl7Zm9yKHZhciB0LG4sZSxyLGk9MCxvPVh3Lmxlbmd0aDtpPG87KytpKWlmKCh0PVh3W2ldKSYmKHI9KG49dC5oYWxmZWRnZXMpLmxlbmd0aCkpe3ZhciB1PW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoZT0wO2U8cjsrK2UpdVtlXT1lLGFbZV09c3ModCxXd1tuW2VdXSk7Zm9yKHUuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBhW25dLWFbdF19KSxlPTA7ZTxyOysrZSlhW2VdPW5bdVtlXV07Zm9yKGU9MDtlPHI7KytlKW5bZV09YVtlXX19ZnVuY3Rpb24gcHModCxuLGUscil7dmFyIGksbyx1LGEsYyxzLGYsbCxoLHAsZCx2LF89WHcubGVuZ3RoLGc9ITA7Zm9yKGk9MDtpPF87KytpKWlmKG89WHdbaV0pe2Zvcih1PW8uc2l0ZSxjPW8uaGFsZmVkZ2VzLGE9Yy5sZW5ndGg7YS0tOylXd1tjW2FdXXx8Yy5zcGxpY2UoYSwxKTtmb3IoYT0wLHM9Yy5sZW5ndGg7YTxzOylwPWxzKG8sV3dbY1thXV0pLGQ9cFswXSx2PXBbMV0sZj1mcyhvLFd3W2NbKythJXNdXSksbD1mWzBdLGg9ZlsxXSwoTWF0aC5hYnMoZC1sKT5Hd3x8TWF0aC5hYnModi1oKT5HdykmJihjLnNwbGljZShhLDAsV3cucHVzaChycyh1LHAsTWF0aC5hYnMoZC10KTxHdyYmci12Pkd3P1t0LE1hdGguYWJzKGwtdCk8R3c/aDpyXTpNYXRoLmFicyh2LXIpPEd3JiZlLWQ+R3c/W01hdGguYWJzKGgtcik8R3c/bDplLHJdOk1hdGguYWJzKGQtZSk8R3cmJnYtbj5Hdz9bZSxNYXRoLmFicyhsLWUpPEd3P2g6bl06TWF0aC5hYnModi1uKTxHdyYmZC10Pkd3P1tNYXRoLmFicyhoLW4pPEd3P2w6dCxuXTpudWxsKSktMSksKytzKTtzJiYoZz0hMSl9aWYoZyl7dmFyIHksbSx4LGI9MS8wO2ZvcihpPTAsZz1udWxsO2k8XzsrK2kpKG89WHdbaV0pJiYodT1vLnNpdGUseT11WzBdLXQsbT11WzFdLW4seD15KnkrbSptLHg8YiYmKGI9eCxnPW8pKTtpZihnKXt2YXIgdz1bdCxuXSxNPVt0LHJdLFQ9W2Uscl0saz1bZSxuXTtnLmhhbGZlZGdlcy5wdXNoKFd3LnB1c2gocnModT1nLnNpdGUsdyxNKSktMSxXdy5wdXNoKHJzKHUsTSxUKSktMSxXdy5wdXNoKHJzKHUsVCxrKSktMSxXdy5wdXNoKHJzKHUsayx3KSktMSl9fWZvcihpPTA7aTxfOysraSkobz1Yd1tpXSkmJihvLmhhbGZlZGdlcy5sZW5ndGh8fGRlbGV0ZSBYd1tpXSl9ZnVuY3Rpb24gZHMoKXtRYyh0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gdnModCl7dmFyIG49dC5QLGU9dC5OO2lmKG4mJmUpe3ZhciByPW4uc2l0ZSxpPXQuc2l0ZSxvPWUuc2l0ZTtpZihyIT09byl7dmFyIHU9aVswXSxhPWlbMV0sYz1yWzBdLXUscz1yWzFdLWEsZj1vWzBdLXUsbD1vWzFdLWEsaD0yKihjKmwtcypmKTtpZighKGg+PS1Kdykpe3ZhciBwPWMqYytzKnMsZD1mKmYrbCpsLHY9KGwqcC1zKmQpL2gsXz0oYypkLWYqcCkvaCxnPSR3LnBvcCgpfHxuZXcgZHM7Zy5hcmM9dCxnLnNpdGU9aSxnLng9dit1LGcueT0oZy5jeT1fK2EpK01hdGguc3FydCh2KnYrXypfKSx0LmNpcmNsZT1nO2Zvcih2YXIgeT1udWxsLG09VncuXzttOylpZihnLnk8bS55fHxnLnk9PT1tLnkmJmcueDw9bS54KXtpZighbS5MKXt5PW0uUDticmVha31tPW0uTH1lbHNle2lmKCFtLlIpe3k9bTticmVha31tPW0uUn1Wdy5pbnNlcnQoeSxnKSx5fHwoanc9Zyl9fX19ZnVuY3Rpb24gX3ModCl7dmFyIG49dC5jaXJjbGU7biYmKG4uUHx8KGp3PW4uTiksVncucmVtb3ZlKG4pLCR3LnB1c2gobiksUWMobiksdC5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24gZ3MoKXtRYyh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24geXModCl7dmFyIG49WncucG9wKCl8fG5ldyBncztyZXR1cm4gbi5zaXRlPXQsbn1mdW5jdGlvbiBtcyh0KXtfcyh0KSxIdy5yZW1vdmUodCksWncucHVzaCh0KSxRYyh0KX1mdW5jdGlvbiB4cyh0KXt2YXIgbj10LmNpcmNsZSxlPW4ueCxyPW4uY3ksaT1bZSxyXSxvPXQuUCx1PXQuTixhPVt0XTttcyh0KTtmb3IodmFyIGM9bztjLmNpcmNsZSYmTWF0aC5hYnMoZS1jLmNpcmNsZS54KTxHdyYmTWF0aC5hYnMoci1jLmNpcmNsZS5jeSk8R3c7KW89Yy5QLGEudW5zaGlmdChjKSxtcyhjKSxjPW87YS51bnNoaWZ0KGMpLF9zKGMpO2Zvcih2YXIgcz11O3MuY2lyY2xlJiZNYXRoLmFicyhlLXMuY2lyY2xlLngpPEd3JiZNYXRoLmFicyhyLXMuY2lyY2xlLmN5KTxHdzspdT1zLk4sYS5wdXNoKHMpLG1zKHMpLHM9dTthLnB1c2gocyksX3Mocyk7dmFyIGYsbD1hLmxlbmd0aDtmb3IoZj0xO2Y8bDsrK2Ypcz1hW2ZdLGM9YVtmLTFdLGlzKHMuZWRnZSxjLnNpdGUscy5zaXRlLGkpO2M9YVswXSxzPWFbbC0xXSxzLmVkZ2U9ZXMoYy5zaXRlLHMuc2l0ZSxudWxsLGkpLHZzKGMpLHZzKHMpfWZ1bmN0aW9uIGJzKHQpe2Zvcih2YXIgbixlLHIsaSxvPXRbMF0sdT10WzFdLGE9SHcuXzthOylpZihyPXdzKGEsdSktbyxyPkd3KWE9YS5MO2Vsc2V7aWYoaT1vLU1zKGEsdSksIShpPkd3KSl7cj4tR3c/KG49YS5QLGU9YSk6aT4tR3c/KG49YSxlPWEuTik6bj1lPWE7YnJlYWt9aWYoIWEuUil7bj1hO2JyZWFrfWE9YS5SfWNzKHQpO3ZhciBjPXlzKHQpO2lmKEh3Lmluc2VydChuLGMpLG58fGUpe2lmKG49PT1lKXJldHVybiBfcyhuKSxlPXlzKG4uc2l0ZSksSHcuaW5zZXJ0KGMsZSksYy5lZGdlPWUuZWRnZT1lcyhuLnNpdGUsYy5zaXRlKSx2cyhuKSx2b2lkIHZzKGUpO2lmKCFlKXJldHVybiB2b2lkKGMuZWRnZT1lcyhuLnNpdGUsYy5zaXRlKSk7X3MobiksX3MoZSk7dmFyIHM9bi5zaXRlLGY9c1swXSxsPXNbMV0saD10WzBdLWYscD10WzFdLWwsZD1lLnNpdGUsdj1kWzBdLWYsXz1kWzFdLWwsZz0yKihoKl8tcCp2KSx5PWgqaCtwKnAsbT12KnYrXypfLHg9WyhfKnktcCptKS9nK2YsKGgqbS12KnkpL2crbF07aXMoZS5lZGdlLHMsZCx4KSxjLmVkZ2U9ZXMocyx0LG51bGwseCksZS5lZGdlPWVzKHQsZCxudWxsLHgpLHZzKG4pLHZzKGUpfX1mdW5jdGlvbiB3cyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciB1PXQuUDtpZighdSlyZXR1cm4tKDEvMCk7ZT11LnNpdGU7dmFyIGE9ZVswXSxjPWVbMV0scz1jLW47aWYoIXMpcmV0dXJuIGE7dmFyIGY9YS1yLGw9MS9vLTEvcyxoPWYvcztyZXR1cm4gbD8oLWgrTWF0aC5zcXJ0KGgqaC0yKmwqKGYqZi8oLTIqcyktYytzLzIraS1vLzIpKSkvbCtyOihyK2EpLzJ9ZnVuY3Rpb24gTXModCxuKXt2YXIgZT10Lk47aWYoZSlyZXR1cm4gd3MoZSxuKTt2YXIgcj10LnNpdGU7cmV0dXJuIHJbMV09PT1uP3JbMF06MS8wfWZ1bmN0aW9uIFRzKHQsbixlKXtyZXR1cm4odFswXS1lWzBdKSooblsxXS10WzFdKS0odFswXS1uWzBdKSooZVsxXS10WzFdKX1mdW5jdGlvbiBrcyh0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBTcyh0LG4pe3ZhciBlLHIsaSxvPXQuc29ydChrcykucG9wKCk7Zm9yKFd3PVtdLFh3PW5ldyBBcnJheSh0Lmxlbmd0aCksSHc9bmV3IEpjLFZ3PW5ldyBKYzs7KWlmKGk9ancsbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KGJzKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO3hzKGkuYXJjKX1pZihocygpLG4pe3ZhciB1PStuWzBdWzBdLGE9K25bMF1bMV0sYz0rblsxXVswXSxzPStuWzFdWzFdO2FzKHUsYSxjLHMpLHBzKHUsYSxjLHMpfXRoaXMuZWRnZXM9V3csdGhpcy5jZWxscz1YdyxIdz1Wdz1Xdz1Ydz1udWxsfWZ1bmN0aW9uIE5zKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMudHJhbnNmb3JtPWV9ZnVuY3Rpb24gRXModCxuLGUpe3RoaXMuaz10LHRoaXMueD1uLHRoaXMueT1lfWZ1bmN0aW9uIEFzKHQpe3JldHVybiB0Ll9fem9vbXx8dE19ZnVuY3Rpb24gQ3MoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHpzKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIFBzKCl7dmFyIHQsbixlPXRoaXM7cmV0dXJuIGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50PyhlPWUub3duZXJTVkdFbGVtZW50fHxlLHQ9ZS53aWR0aC5iYXNlVmFsLnZhbHVlLG49ZS5oZWlnaHQuYmFzZVZhbC52YWx1ZSk6KHQ9ZS5jbGllbnRXaWR0aCxuPWUuY2xpZW50SGVpZ2h0KSxbWzAsMF0sW3Qsbl1dfWZ1bmN0aW9uIFJzKCl7cmV0dXJuIHRoaXMuX196b29tfHx0TX12YXIgTHM9IjQuNy4wIixxcz1mdW5jdGlvbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn0sVXM9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9bih0KSkse2xlZnQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKTwwP3I9bysxOmk9b31yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKT4wP2k9bzpyPW8rMX1yZXR1cm4gcn19fSxEcz1VcyhxcyksT3M9RHMucmlnaHQsRnM9RHMubGVmdCxJcz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPWUpO2Zvcih2YXIgcj0wLGk9dC5sZW5ndGgtMSxvPXRbMF0sdT1uZXcgQXJyYXkoaTwwPzA6aSk7cjxpOyl1W3JdPW4obyxvPXRbKytyXSk7cmV0dXJuIHV9LFlzPWZ1bmN0aW9uKHQsbixyKXt2YXIgaSxvLHUsYSxjPXQubGVuZ3RoLHM9bi5sZW5ndGgsZj1uZXcgQXJyYXkoYypzKTtmb3IobnVsbD09ciYmKHI9ZSksaT11PTA7aTxjOysraSlmb3IoYT10W2ldLG89MDtvPHM7KytvLCsrdSlmW3VdPXIoYSxuW29dKTtyZXR1cm4gZn0sQnM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LGpzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9LEhzPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89MCx1PTAsYT0tMSxjPTA7aWYobnVsbD09bilmb3IoOysrYTxpOylpc05hTihlPWpzKHRbYV0pKXx8KHI9ZS1vLG8rPXIvKytjLHUrPXIqKGUtbykpO2Vsc2UgZm9yKDsrK2E8aTspaXNOYU4oZT1qcyhuKHRbYV0sYSx0KSkpfHwocj1lLW8sbys9ci8rK2MsdSs9ciooZS1vKSk7aWYoYz4xKXJldHVybiB1LyhjLTEpfSxYcz1mdW5jdGlvbih0LG4pe3ZhciBlPUhzKHQsbik7cmV0dXJuIGU/TWF0aC5zcXJ0KGUpOmV9LFZzPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89LTEsdT10Lmxlbmd0aDtpZihudWxsPT1uKXtmb3IoOysrbzx1OylpZihudWxsIT0ocj10W29dKSYmcj49cil7ZT1pPXI7YnJlYWt9Zm9yKDsrK288dTspbnVsbCE9KHI9dFtvXSkmJihlPnImJihlPXIpLGk8ciYmKGk9cikpfWVsc2V7Zm9yKDsrK288dTspaWYobnVsbCE9KHI9bih0W29dLG8sdCkpJiZyPj1yKXtlPWk9cjticmVha31mb3IoOysrbzx1OyludWxsIT0ocj1uKHRbb10sbyx0KSkmJihlPnImJihlPXIpLGk8ciYmKGk9cikpfXJldHVybltlLGldfSxXcz1BcnJheS5wcm90b3R5cGUsJHM9V3Muc2xpY2UsWnM9V3MubWFwLEdzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sSnM9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LFFzPWZ1bmN0aW9uKHQsbixlKXt0PSt0LG49K24sZT0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhuPXQsdD0wLDEpOmk8Mz8xOitlO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG4tdCkvZSkpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrciplO3JldHVybiBvfSxLcz1NYXRoLnNxcnQoNTApLHRmPU1hdGguc3FydCgxMCksbmY9TWF0aC5zcXJ0KDIpLGVmPWZ1bmN0aW9uKHQsbixlKXt2YXIgaT1yKHQsbixlKTtyZXR1cm4gUXMoTWF0aC5jZWlsKHQvaSkqaSxNYXRoLmZsb29yKG4vaSkqaStpLzIsaSl9LHJmPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKSsxfSxvZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGksbyx1PXQubGVuZ3RoLGE9bmV3IEFycmF5KHUpO2ZvcihpPTA7aTx1OysraSlhW2ldPW4odFtpXSxpLHQpO3ZhciBjPWUoYSkscz1jWzBdLGY9Y1sxXSxsPXIoYSxzLGYpO0FycmF5LmlzQXJyYXkobCl8fChsPWVmKHMsZixsKSk7Zm9yKHZhciBoPWwubGVuZ3RoO2xbMF08PXM7KWwuc2hpZnQoKSwtLWg7Zm9yKDtsW2gtMV0+PWY7KWwucG9wKCksLS1oO3ZhciBwLGQ9bmV3IEFycmF5KGgrMSk7Zm9yKGk9MDtpPD1oOysraSlwPWRbaV09W10scC54MD1pPjA/bFtpLTFdOnMscC54MT1pPGg/bFtpXTpmO2ZvcihpPTA7aTx1OysraSlvPWFbaV0sczw9byYmbzw9ZiYmZFtPcyhsLG8sMCxoKV0ucHVzaCh0W2ldKTtyZXR1cm4gZH12YXIgbj1KcyxlPVZzLHI9cmY7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpHcyhlKSx0KTpufSx0LmRvbWFpbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdzKFtuWzBdLG5bMV1dKSx0KTplfSx0LnRocmVzaG9sZHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHcyhBcnJheS5pc0FycmF5KG4pPyRzLmNhbGwobik6biksdCk6cn0sdH0sdWY9ZnVuY3Rpb24odCxuLGUpe2lmKG51bGw9PWUmJihlPWpzKSxyPXQubGVuZ3RoKXtpZigobj0rbik8PTB8fHI8MilyZXR1cm4rZSh0WzBdLDAsdCk7aWYobj49MSlyZXR1cm4rZSh0W3ItMV0sci0xLHQpO3ZhciByLGk9KHItMSkqbixvPU1hdGguZmxvb3IoaSksdT0rZSh0W29dLG8sdCk7cmV0dXJuIHUrKCtlKHRbbysxXSxvKzEsdCktdSkqKGktbyl9fSxhZj1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9WnMuY2FsbCh0LGpzKS5zb3J0KHFzKSxNYXRoLmNlaWwoKGUtbikvKDIqKHVmKHQsLjc1KS11Zih0LC4yNSkpKk1hdGgucG93KHQubGVuZ3RoLC0xLzMpKSl9LGNmPWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqWHModCkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sc2Y9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKXtmb3IoOysraTxvOylpZihudWxsIT0ocj10W2ldKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7KytpPG87KW51bGwhPShyPXRbaV0pJiZyPmUmJihlPXIpfWVsc2V7Zm9yKDsrK2k8bzspaWYobnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPmUmJihlPXIpfXJldHVybiBlfSxmZj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9MCxpPXQubGVuZ3RoLG89LTEsdT1pO2lmKG51bGw9PW4pZm9yKDsrK288aTspaXNOYU4oZT1qcyh0W29dKSk/LS11OnIrPWU7ZWxzZSBmb3IoOysrbzxpOylpc05hTihlPWpzKG4odFtvXSxvLHQpKSk/LS11OnIrPWU7aWYodSlyZXR1cm4gci91fSxsZj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9W10saT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pZm9yKDsrK288aTspaXNOYU4oZT1qcyh0W29dKSl8fHIucHVzaChlKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKGU9anMobih0W29dLG8sdCkpKXx8ci5wdXNoKGUpO3JldHVybiB1ZihyLnNvcnQocXMpLC41KX0saGY9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89LTEsdT0wOysrbzxpOyl1Kz10W29dLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkodSk7LS1pPj0wOylmb3Iocj10W2ldLG49ci5sZW5ndGg7LS1uPj0wOyllWy0tdV09cltuXTtyZXR1cm4gZX0scGY9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKXtmb3IoOysraTxvOylpZihudWxsIT0ocj10W2ldKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7KytpPG87KW51bGwhPShyPXRbaV0pJiZlPnImJihlPXIpfWVsc2V7Zm9yKDsrK2k8bzspaWYobnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9bih0W2ldLGksdCkpJiZlPnImJihlPXIpfXJldHVybiBlfSxkZj1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtuW2VdXTtyZXR1cm4gcn0sdmY9ZnVuY3Rpb24odCxuKXtpZihlPXQubGVuZ3RoKXt2YXIgZSxyLGk9MCxvPTAsdT10W29dO2ZvcihufHwobj1xcyk7KytpPGU7KShuKHI9dFtpXSx1KTwwfHwwIT09bih1LHUpKSYmKHU9cixvPWkpO3JldHVybiAwPT09bih1LHUpP286dm9pZCAwfX0sX2Y9ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89KG51bGw9PWU/dC5sZW5ndGg6ZSktKG49bnVsbD09bj8wOituKTtvOylpPU1hdGgucmFuZG9tKCkqby0tfDAscj10W28rbl0sdFtvK25dPXRbaStuXSx0W2krbl09cjtyZXR1cm4gdH0sZ2Y9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPTAsaT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pZm9yKDsrK288aTspKGU9K3Rbb10pJiYocis9ZSk7ZWxzZSBmb3IoOysrbzxpOykoZT0rbih0W29dLG8sdCkpJiYocis9ZSk7cmV0dXJuIHJ9LHlmPWZ1bmN0aW9uKHQpe2lmKCEobz10Lmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLGU9cGYodCxpKSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBvLHU9LTEsYT1yW25dPW5ldyBBcnJheShvKTsrK3U8bzspYVt1XT10W3VdW25dO3JldHVybiByfSxtZj1mdW5jdGlvbigpe3JldHVybiB5Zihhcmd1bWVudHMpfSx4Zj1BcnJheS5wcm90b3R5cGUuc2xpY2UsYmY9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHdmPTEsTWY9MixUZj0zLGtmPTQsU2Y9MWUtNixOZj17dmFsdWU6ZnVuY3Rpb24oKXt9fTt2LnByb3RvdHlwZT1kLnByb3RvdHlwZT17Y29uc3RydWN0b3I6dixvbjpmdW5jdGlvbih0LG4pe3ZhciBlLHI9dGhpcy5fLGk9Xyh0KyIiLHIpLG89LTEsdT1pLmxlbmd0aDt7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK288dTspaWYoZT0odD1pW29dKS50eXBlKXJbZV09eShyW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gcilyW2VdPXkocltlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288dTspaWYoKGU9KHQ9aVtvXSkudHlwZSkmJihlPWcocltlXSx0Lm5hbWUpKSlyZXR1cm4gZX19LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxuPXRoaXMuXztmb3IodmFyIGUgaW4gbil0W2VdPW5bZV0uc2xpY2UoKTtyZXR1cm4gbmV3IHYodCl9LGNhbGw6ZnVuY3Rpb24odCxuKXtpZigoZT1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBlLHIsaT1uZXcgQXJyYXkoZSksbz0wO288ZTsrK28paVtvXT1hcmd1bWVudHNbbysyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihyPXRoaXMuX1t0XSxvPTAsZT1yLmxlbmd0aDtvPGU7KytvKXJbb10udmFsdWUuYXBwbHkobixpKX0sYXBwbHk6ZnVuY3Rpb24odCxuLGUpe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciByPXRoaXMuX1t0XSxpPTAsbz1yLmxlbmd0aDtpPG87KytpKXJbaV0udmFsdWUuYXBwbHkobixlKX19O3ZhciBFZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsQWY9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkVmLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn0sQ2Y9ZnVuY3Rpb24odCl7dmFyIG49dCs9IiIsZT1uLmluZGV4T2YoIjoiKTtyZXR1cm4gZT49MCYmInhtbG5zIiE9PShuPXQuc2xpY2UoMCxlKSkmJih0PXQuc2xpY2UoZSsxKSksQWYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOkFmW25dLGxvY2FsOnR9OnR9LHpmPWZ1bmN0aW9uKHQpe3ZhciBuPUNmKHQpO3JldHVybihuLmxvY2FsP3g6bSkobil9LFBmPTA7dy5wcm90b3R5cGU9Yi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOncsZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl87IShuIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbbl19LHNldDpmdW5jdGlvbih0LG4pe3JldHVybiB0W3RoaXMuX109bn0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIFJmPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgTGY9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2lmKCFMZi5tYXRjaGVzKXt2YXIgcWY9TGYud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxMZi5tc01hdGNoZXNTZWxlY3Rvcnx8TGYubW96TWF0Y2hlc1NlbGVjdG9yfHxMZi5vTWF0Y2hlc1NlbGVjdG9yO1JmPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBxZi5jYWxsKHRoaXMsdCl9fX19dmFyIFVmPVJmLERmPXt9O2lmKHQuZXZlbnQ9bnVsbCwidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXsib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KERmPXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pfXZhciBPZj1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWsodCsiIiksdT1vLmxlbmd0aDt7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3IoYT1uP046UyxudWxsPT1lJiYoZT0hMSkscj0wO3I8dTsrK3IpdGhpcy5lYWNoKGEob1tyXSxuLGUpKTtyZXR1cm4gdGhpc312YXIgYT10aGlzLm5vZGUoKS5fX29uO2lmKGEpZm9yKHZhciBjLHM9MCxmPWEubGVuZ3RoO3M8ZjsrK3MpZm9yKHI9MCxjPWFbc107cjx1OysrcilpZigoaT1vW3JdKS50eXBlPT09Yy50eXBlJiZpLm5hbWU9PT1jLm5hbWUpcmV0dXJuIGMudmFsdWV9fSxGZj1mdW5jdGlvbigpe2Zvcih2YXIgbixlPXQuZXZlbnQ7bj1lLnNvdXJjZUV2ZW50OyllPW47cmV0dXJuIGV9LElmPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFkscj1yLm1hdHJpeFRyYW5zZm9ybSh0LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSksW3IueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19LFlmPWZ1bmN0aW9uKHQpe3ZhciBuPUZmKCk7cmV0dXJuIG4uY2hhbmdlZFRvdWNoZXMmJihuPW4uY2hhbmdlZFRvdWNoZXNbMF0pLElmKHQsbil9LEJmPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P0E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX0samY9ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUJmKHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLHUsYT1uW2ldLGM9YS5sZW5ndGgscz1yW2ldPW5ldyBBcnJheShjKSxmPTA7ZjxjOysrZikobz1hW2ZdKSYmKHU9dC5jYWxsKG8sby5fX2RhdGFfXyxmLGEpKSYmKCJfX2RhdGFfXyJpbiBvJiYodS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxzW2ZdPXUpO3JldHVybiBuZXcgZHQocix0aGlzLl9wYXJlbnRzKX0sSGY9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/QzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxYZj1mdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SGYodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPVtdLGk9W10sbz0wO288ZTsrK28pZm9yKHZhciB1LGE9bltvXSxjPWEubGVuZ3RoLHM9MDtzPGM7KytzKSh1PWFbc10pJiYoci5wdXNoKHQuY2FsbCh1LHUuX19kYXRhX18scyxhKSksaS5wdXNoKHUpKTtyZXR1cm4gbmV3IGR0KHIsaSl9LFZmPWZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1VZih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1PW5baV0sYT11Lmxlbmd0aCxjPXJbaV09W10scz0wO3M8YTsrK3MpKG89dVtzXSkmJnQuY2FsbChvLG8uX19kYXRhX18scyx1KSYmYy5wdXNoKG8pO3JldHVybiBuZXcgZHQocix0aGlzLl9wYXJlbnRzKX0sV2Y9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9LCRmPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBkdCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChXZiksdGhpcy5fcGFyZW50cyl9O3oucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp6LGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsbil9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O3ZhciBaZj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LEdmPSIkIixKZj1mdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlPW4/UjpQLHI9dGhpcy5fcGFyZW50cyxpPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9WmYodCkpO2Zvcih2YXIgbz1pLmxlbmd0aCx1PW5ldyBBcnJheShvKSxhPW5ldyBBcnJheShvKSxjPW5ldyBBcnJheShvKSxzPTA7czxvOysrcyl7dmFyIGY9cltzXSxsPWlbc10saD1sLmxlbmd0aCxwPXQuY2FsbChmLGYmJmYuX19kYXRhX18scyxyKSxkPXAubGVuZ3RoLHY9YVtzXT1uZXcgQXJyYXkoZCksXz11W3NdPW5ldyBBcnJheShkKTtlKGYsbCx2LF8sY1tzXT1uZXcgQXJyYXkoaCkscCxuKTtmb3IodmFyIGcseSxtPTAseD0wO208ZDsrK20paWYoZz12W21dKXtmb3IobT49eCYmKHg9bSsxKTshKHk9X1t4XSkmJisreDxkOyk7Zy5fbmV4dD15fHxudWxsfX1yZXR1cm4gdT1uZXcgZHQodSxyKSx1Ll9lbnRlcj1hLHUuX2V4aXQ9Yyx1fSxRZj1mdW5jdGlvbigpe3JldHVybiBuZXcgZHQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChXZiksdGhpcy5fcGFyZW50cyl9LEtmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSx1PW5ldyBBcnJheShyKSxhPTA7YTxvOysrYSlmb3IodmFyIGMscz1uW2FdLGY9ZVthXSxsPXMubGVuZ3RoLGg9dVthXT1uZXcgQXJyYXkobCkscD0wO3A8bDsrK3ApKGM9c1twXXx8ZltwXSkmJihoW3BdPWMpO2Zvcig7YTxyOysrYSl1W2FdPW5bYV07cmV0dXJuIG5ldyBkdCh1LHRoaXMuX3BhcmVudHMpfSx0bD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSx1PWlbb107LS1vPj0wOykocj1pW29dKSYmKHUmJnUhPT1yLm5leHRTaWJsaW5nJiZ1LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsdSksdT1yKTtyZXR1cm4gdGhpc30sbmw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuLGUpe3JldHVybiBuJiZlP3Qobi5fX2RhdGFfXyxlLl9fZGF0YV9fKTohbi0hZX10fHwodD1MKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjsrK28pe2Zvcih2YXIgdSxhPWVbb10sYz1hLmxlbmd0aCxzPWlbb109bmV3IEFycmF5KGMpLGY9MDtmPGM7KytmKSh1PWFbZl0pJiYoc1tmXT11KTtzLnNvcnQobil9cmV0dXJuIG5ldyBkdChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGVsPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxybD1mdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksbj0tMTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dFsrK25dPXRoaXN9KSx0fSxpbD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0wLGU9dC5sZW5ndGg7bjxlOysrbilmb3IodmFyIHI9dFtuXSxpPTAsbz1yLmxlbmd0aDtpPG87KytpKXt2YXIgdT1yW2ldO2lmKHUpcmV0dXJuIHV9cmV0dXJuIG51bGx9LG9sPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sdWw9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGFsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlmb3IodmFyIGksbz1uW2VdLHU9MCxhPW8ubGVuZ3RoO3U8YTsrK3UpKGk9b1t1XSkmJnQuY2FsbChpLGkuX19kYXRhX18sdSxvKTtyZXR1cm4gdGhpc30sY2w9ZnVuY3Rpb24odCxuKXt2YXIgZT1DZih0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXMubm9kZSgpO3JldHVybiBlLmxvY2FsP3IuZ2V0QXR0cmlidXRlTlMoZS5zcGFjZSxlLmxvY2FsKTpyLmdldEF0dHJpYnV0ZShlKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2UubG9jYWw/VTpxOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UubG9jYWw/STpGOmUubG9jYWw/TzpEKShlLG4pKX0sc2w9ZnVuY3Rpb24odCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fSxmbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PW4/WToiZnVuY3Rpb24iPT10eXBlb2Ygbj9qOkIpKHQsbixudWxsPT1lPyIiOmUpKTpzbChyPXRoaXMubm9kZSgpKS5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSh0KX0sbGw9ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9IOiJmdW5jdGlvbiI9PXR5cGVvZiBuP1Y6WCkodCxuKSk6dGhpcy5ub2RlKClbdF19O1oucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgaGw9ZnVuY3Rpb24odCxuKXt2YXIgZT1XKHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPSQodGhpcy5ub2RlKCkpLGk9LTEsbz1lLmxlbmd0aDsrK2k8bzspaWYoIXIuY29udGFpbnMoZVtpXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIG4/dHQ6bj9ROkspKGUsbikpfSxwbD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9udDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/cnQ6ZXQpKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0sZGw9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/aXQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3V0Om90KSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSx2bD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goYXQpfSxfbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goY3QpfSxnbD1mdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnpmKHQpO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfSx5bD1mdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6emYodCkscj1udWxsPT1uP3N0OiJmdW5jdGlvbiI9PXR5cGVvZiBuP246QmYobik7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pfSxtbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnQpfSx4bD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LGJsPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIG4/cHQ6aHQpKHQsbikpfSx3bD1bbnVsbF07ZHQucHJvdG90eXBlPXZ0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZHQsc2VsZWN0OmpmLHNlbGVjdEFsbDpYZixmaWx0ZXI6VmYsZGF0YTpKZixlbnRlcjokZixleGl0OlFmLG1lcmdlOktmLG9yZGVyOnRsLHNvcnQ6bmwsY2FsbDplbCxub2RlczpybCxub2RlOmlsLHNpemU6b2wsZW1wdHk6dWwsZWFjaDphbCxhdHRyOmNsLHN0eWxlOmZsLHByb3BlcnR5OmxsLGNsYXNzZWQ6aGwsdGV4dDpwbCxodG1sOmRsLHJhaXNlOnZsLGxvd2VyOl9sLGFwcGVuZDpnbCxpbnNlcnQ6eWwscmVtb3ZlOm1sLGRhdHVtOnhsLG9uOk9mLGRpc3BhdGNoOmJsfTt2YXIgTWw9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBkdChbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCldXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IGR0KFtbdF1dLHdsKX0sVGw9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBkdChbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyBkdChbbnVsbD09dD9bXTp0XSx3bCl9LGtsPWZ1bmN0aW9uKHQsbixlKXthcmd1bWVudHMubGVuZ3RoPDMmJihlPW4sbj1GZigpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIHIsaT0wLG89bj9uLmxlbmd0aDowO2k8bzsrK2kpaWYoKHI9bltpXSkuaWRlbnRpZmllcj09PWUpcmV0dXJuIElmKHQscik7cmV0dXJuIG51bGx9LFNsPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49RmYoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09SWYodCxuW2VdKTtyZXR1cm4gaX0sTmw9ZnVuY3Rpb24oKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0sRWw9ZnVuY3Rpb24odCl7dmFyIG49dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZT1NbCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLE5sLCEwKTsib25zZWxlY3RzdGFydCJpbiBuP2Uub24oInNlbGVjdHN0YXJ0LmRyYWciLE5sLCEwKToobi5fX25vc2VsZWN0PW4uc3R5bGUuTW96VXNlclNlbGVjdCxuLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX0sQWw9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fTt5dC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT10aGlzLl8/dGhpczp0fTt2YXIgQ2w9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQpe3Qub24oIm1vdXNlZG93bi5kcmFnIixlKS5vbigidG91Y2hzdGFydC5kcmFnIixvKS5vbigidG91Y2htb3ZlLmRyYWciLHUpLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGEpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gZSgpe2lmKCFmJiZsLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG49YygibW91c2UiLGguYXBwbHkodGhpcyxhcmd1bWVudHMpLFlmLHRoaXMsYXJndW1lbnRzKTtuJiYoTWwodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWciLHIsITApLm9uKCJtb3VzZXVwLmRyYWciLGksITApLEVsKHQuZXZlbnQudmlldyksX3QoKSxzPSExLG4oInN0YXJ0IikpfX1mdW5jdGlvbiByKCl7TmwoKSxzPSEwLHYubW91c2UoImRyYWciKX1mdW5jdGlvbiBpKCl7TWwodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSxndCh0LmV2ZW50LnZpZXcscyksTmwoKSx2Lm1vdXNlKCJlbmQiKX1mdW5jdGlvbiBvKCl7aWYobC5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9aC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbz1yLmxlbmd0aDtmb3Iobj0wO248bzsrK24pKGU9YyhyW25dLmlkZW50aWZpZXIsaSxrbCx0aGlzLGFyZ3VtZW50cykpJiYoX3QoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gdSgpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPXZbcltuXS5pZGVudGlmaWVyXSkmJihObCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYSgpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKGYmJmNsZWFyVGltZW91dChmKSxmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPW51bGx9LDUwMCksCm49MDtuPGk7KytuKShlPXZbcltuXS5pZGVudGlmaWVyXSkmJihfdCgpLGUoImVuZCIpKX1mdW5jdGlvbiBjKGUscixpLG8sdSl7dmFyIGEsYyxzLGY9aShyLGUpLGw9Xy5jb3B5KCk7aWYoRShuZXcgeXQobiwiYmVmb3Jlc3RhcnQiLGEsZSxnLGZbMF0sZlsxXSwwLDAsbCksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXAuYXBwbHkobyx1KSkmJihjPWEueC1mWzBdfHwwLHM9YS55LWZbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQoaCl7dmFyIHAsZD1mO3N3aXRjaChoKXtjYXNlInN0YXJ0Ijp2W2VdPXQscD1nKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSB2W2VdLC0tZztjYXNlImRyYWciOmY9aShyLGUpLHA9Z31FKG5ldyB5dChuLGgsYSxlLHAsZlswXStjLGZbMV0rcyxmWzBdLWRbMF0sZlsxXS1kWzFdLGwpLGwuYXBwbHksbCxbaCxvLHVdKX19dmFyIHMsZixsPW10LGg9eHQscD1idCx2PXt9LF89ZCgic3RhcnQiLCJkcmFnIiwiZW5kIiksZz0wO3JldHVybiBuLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFsKCEhdCksbik6bH0sbi5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBbCh0KSxuKTpofSxuLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBbCh0KSxuKTpwfSxuLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Xy5vbi5hcHBseShfLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1fP246dH0sbn0semw9ZnVuY3Rpb24odCxuLGUpe3QucHJvdG90eXBlPW4ucHJvdG90eXBlPWUsZS5jb25zdHJ1Y3Rvcj10fSxQbD0uNyxSbD0xL1BsLExsPSJcXHMqKFsrLV0/XFxkKylcXHMqIixxbD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixVbD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsRGw9L14jKFswLTlhLWZdezN9KSQvLE9sPS9eIyhbMC05YS1mXXs2fSkkLyxGbD1uZXcgUmVnRXhwKCJecmdiXFwoIitbTGwsTGwsTGxdKyJcXCkkIiksSWw9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW1VsLFVsLFVsXSsiXFwpJCIpLFlsPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbTGwsTGwsTGwscWxdKyJcXCkkIiksQmw9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tVbCxVbCxVbCxxbF0rIlxcKSQiKSxqbD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbcWwsVWwsVWxdKyJcXCkkIiksSGw9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1txbCxVbCxVbCxxbF0rIlxcKSQiKSxYbD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTt6bChNdCxUdCx7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKyIifX0pLHpsKEF0LEV0LHd0KE10LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P1JsOk1hdGgucG93KFJsLHQpLG5ldyBBdCh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9QbDpNYXRoLnBvdyhQbCx0KSxuZXcgQXQodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PXRoaXMuciYmdGhpcy5yPD0yNTUmJjA8PXRoaXMuZyYmdGhpcy5nPD0yNTUmJjA8PXRoaXMuYiYmdGhpcy5iPD0yNTUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4gdD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksKDE9PT10PyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksemwoUnQsUHQsd3QoTXQse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Umw6TWF0aC5wb3coUmwsdCksbmV3IFJ0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/UGw6TWF0aC5wb3coUGwsdCksbmV3IFJ0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5oJTM2MCszNjAqKHRoaXMuaDwwKSxuPWlzTmFOKHQpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLGU9dGhpcy5sLHI9ZSsoZTwuNT9lOjEtZSkqbixpPTIqZS1yO3JldHVybiBuZXcgQXQoTHQodD49MjQwP3QtMjQwOnQrMTIwLGksciksTHQodCxpLHIpLEx0KHQ8MTIwP3QrMjQwOnQtMTIwLGksciksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9fSkpO3ZhciBWbD1NYXRoLlBJLzE4MCxXbD0xODAvTWF0aC5QSSwkbD0xOCxabD0uOTUwNDcsR2w9MSxKbD0xLjA4ODgzLFFsPTQvMjksS2w9Ni8yOSx0aD0zKktsKktsLG5oPUtsKktsKktsO3psKER0LFV0LHd0KE10LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IER0KHRoaXMubCskbCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRHQodGhpcy5sLSRsKihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD0odGhpcy5sKzE2KS8xMTYsbj1pc05hTih0aGlzLmEpP3Q6dCt0aGlzLmEvNTAwLGU9aXNOYU4odGhpcy5iKT90OnQtdGhpcy5iLzIwMDtyZXR1cm4gdD1HbCpGdCh0KSxuPVpsKkZ0KG4pLGU9SmwqRnQoZSksbmV3IEF0KEl0KDMuMjQwNDU0MipuLTEuNTM3MTM4NSp0LS40OTg1MzE0KmUpLEl0KC0uOTY5MjY2Km4rMS44NzYwMTA4KnQrLjA0MTU1NiplKSxJdCguMDU1NjQzNCpuLS4yMDQwMjU5KnQrMS4wNTcyMjUyKmUpLHRoaXMub3BhY2l0eSl9fSkpLHpsKEh0LGp0LHd0KE10LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEh0KHRoaXMuaCx0aGlzLmMsdGhpcy5sKyRsKihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgSHQodGhpcy5oLHRoaXMuYyx0aGlzLmwtJGwqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gcXQodGhpcykucmdiKCl9fSkpO3ZhciBlaD0tLjE0ODYxLHJoPTEuNzgyNzcsaWg9LS4yOTIyNyxvaD0tLjkwNjQ5LHVoPTEuOTcyOTQsYWg9dWgqb2gsY2g9dWgqcmgsc2g9cmgqaWgtb2gqZWg7emwoV3QsVnQsd3QoTXQse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Umw6TWF0aC5wb3coUmwsdCksbmV3IFd0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/UGw6TWF0aC5wb3coUGwsdCksbmV3IFd0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpWbCxuPSt0aGlzLmwsZT1pc05hTih0aGlzLnMpPzA6dGhpcy5zKm4qKDEtbikscj1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpO3JldHVybiBuZXcgQXQoMjU1KihuK2UqKGVoKnIrcmgqaSkpLDI1NSoobitlKihpaCpyK29oKmkpKSwyNTUqKG4rZSoodWgqcikpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBmaCxsaCxoaCxwaCxkaCx2aCxfaD1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aC0xO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1lPD0wP2U9MDplPj0xPyhlPTEsbi0xKTpNYXRoLmZsb29yKGUqbiksaT10W3JdLG89dFtyKzFdO3JldHVybiAkdCgoZS1yL24pKm4scj4wP3Rbci0xXToyKmktbyxpLG8scjxuLTE/dFtyKzJdOjIqby1pKX19LGdoPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbik7cmV0dXJuICR0KChlLXIvbikqbix0WyhyK24tMSklbl0sdFtyJW5dLHRbKHIrMSklbl0sdFsocisyKSVuXSl9fSx5aD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LG1oPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LG4pe3ZhciBlPXIoKHQ9RXQodCkpLnIsKG49RXQobikpLnIpLGk9cih0Lmcsbi5nKSxvPXIodC5iLG4uYiksdT1LdCh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1lKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT11KG4pLHQrIiJ9fXZhciByPVF0KG4pO3JldHVybiBlLmdhbW1hPXQsZX0oMSkseGg9dG4oX2gpLGJoPXRuKGdoKSx3aD1mdW5jdGlvbih0LG4pe3ZhciBlLHI9bj9uLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxpOysrZSlvW2VdPUFoKHRbZV0sbltlXSk7Zm9yKDtlPHI7KytlKXVbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGU9MDtlPGk7KytlKXVbZV09b1tlXSh0KTtyZXR1cm4gdX19LE1oPWZ1bmN0aW9uKHQsbil7dmFyIGU9bmV3IERhdGU7cmV0dXJuIHQ9K3Qsbi09dCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX0sVGg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdD0rdCxuLT10LGZ1bmN0aW9uKGUpe3JldHVybiB0K24qZX19LGtoPWZ1bmN0aW9uKHQsbil7dmFyIGUscj17fSxpPXt9O251bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR8fCh0PXt9KSxudWxsIT09biYmIm9iamVjdCI9PXR5cGVvZiBufHwobj17fSk7Zm9yKGUgaW4gbillIGluIHQ/cltlXT1BaCh0W2VdLG5bZV0pOmlbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGUgaW4gcilpW2VdPXJbZV0odCk7cmV0dXJuIGl9fSxTaD0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csTmg9bmV3IFJlZ0V4cChTaC5zb3VyY2UsImciKSxFaD1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaSxvPVNoLmxhc3RJbmRleD1OaC5sYXN0SW5kZXg9MCx1PS0xLGE9W10sYz1bXTtmb3IodCs9IiIsbis9IiI7KGU9U2guZXhlYyh0KSkmJihyPU5oLmV4ZWMobikpOykoaT1yLmluZGV4KT5vJiYoaT1uLnNsaWNlKG8saSksYVt1XT9hW3VdKz1pOmFbKyt1XT1pKSwoZT1lWzBdKT09PShyPXJbMF0pP2FbdV0/YVt1XSs9cjphWysrdV09cjooYVsrK3VdPW51bGwsYy5wdXNoKHtpOnUseDpUaChlLHIpfSkpLG89TmgubGFzdEluZGV4O3JldHVybiBvPG4ubGVuZ3RoJiYoaT1uLnNsaWNlKG8pLGFbdV0/YVt1XSs9aTphWysrdV09aSksYS5sZW5ndGg8Mj9jWzBdP2VuKGNbMF0ueCk6bm4obik6KG49Yy5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBlLHI9MDtyPG47KytyKWFbKGU9Y1tyXSkuaV09ZS54KHQpO3JldHVybiBhLmpvaW4oIiIpfSl9LEFoPWZ1bmN0aW9uKHQsbil7dmFyIGUscj10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8ImJvb2xlYW4iPT09cj95aChuKTooIm51bWJlciI9PT1yP1RoOiJzdHJpbmciPT09cj8oZT1UdChuKSk/KG49ZSxtaCk6RWg6biBpbnN0YW5jZW9mIFR0P21oOm4gaW5zdGFuY2VvZiBEYXRlP01oOkFycmF5LmlzQXJyYXkobik/d2g6aXNOYU4obik/a2g6VGgpKHQsbil9LENoPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9K3Qsbi09dCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZCh0K24qZSl9fSx6aD0xODAvTWF0aC5QSSxQaD17dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxyb3RhdGU6MCxza2V3WDowLHNjYWxlWDoxLHNjYWxlWToxfSxSaD1mdW5jdGlvbih0LG4sZSxyLGksbyl7dmFyIHUsYSxjO3JldHVybih1PU1hdGguc3FydCh0KnQrbipuKSkmJih0Lz11LG4vPXUpLChjPXQqZStuKnIpJiYoZS09dCpjLHItPW4qYyksKGE9TWF0aC5zcXJ0KGUqZStyKnIpKSYmKGUvPWEsci89YSxjLz1hKSx0KnI8biplJiYodD0tdCxuPS1uLGM9LWMsdT0tdSkse3RyYW5zbGF0ZVg6aSx0cmFuc2xhdGVZOm8scm90YXRlOk1hdGguYXRhbjIobix0KSp6aCxza2V3WDpNYXRoLmF0YW4oYykqemgsc2NhbGVYOnUsc2NhbGVZOmF9fSxMaD11bihybiwicHgsICIsInB4KSIsImRlZykiKSxxaD11bihvbiwiLCAiLCIpIiwiKSIpLFVoPU1hdGguU1FSVDIsRGg9MixPaD00LEZoPTFlLTEyLEloPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXRbMF0sbz10WzFdLHU9dFsyXSxhPW5bMF0sYz1uWzFdLHM9blsyXSxmPWEtaSxsPWMtbyxoPWYqZitsKmw7aWYoaDxGaClyPU1hdGgubG9nKHMvdSkvVWgsZT1mdW5jdGlvbih0KXtyZXR1cm5baSt0KmYsbyt0KmwsdSpNYXRoLmV4cChVaCp0KnIpXX07ZWxzZXt2YXIgcD1NYXRoLnNxcnQoaCksZD0ocypzLXUqdStPaCpoKS8oMip1KkRoKnApLHY9KHMqcy11KnUtT2gqaCkvKDIqcypEaCpwKSxfPU1hdGgubG9nKE1hdGguc3FydChkKmQrMSktZCk7cj0oTWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KS1fKS9VaCxlPWZ1bmN0aW9uKHQpe3ZhciBuPXQqcixlPWFuKF8pLGE9dS8oRGgqcCkqKGUqc24oVWgqbitfKS1jbihfKSk7cmV0dXJuW2krYSpmLG8rYSpsLHUqZS9hbihVaCpuK18pXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX0sWWg9Zm4oSnQpLEJoPWZuKEt0KSxqaD1obihKdCksSGg9aG4oS3QpLFhoPXBuKEp0KSxWaD1wbihLdCksV2g9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sJGg9MCxaaD0wLEdoPTAsSmg9MWUzLFFoPTAsS2g9MCx0cD0wLG5wPSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLGVwPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU/cmVxdWVzdEFuaW1hdGlvbkZyYW1lOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O19uLnByb3RvdHlwZT1nbi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOl9uLHJlc3RhcnQ6ZnVuY3Rpb24odCxuLGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7ZT0obnVsbD09ZT9kbigpOitlKSsobnVsbD09bj8wOituKSx0aGlzLl9uZXh0fHx2aD09PXRoaXN8fCh2aD92aC5fbmV4dD10aGlzOmRoPXRoaXMsdmg9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9ZSx3bigpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5fY2FsbCYmKHRoaXMuX2NhbGw9bnVsbCx0aGlzLl90aW1lPTEvMCx3bigpKX19O3ZhciBycD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IF9uO3JldHVybiBuPW51bGw9PW4/MDorbixyLnJlc3RhcnQoZnVuY3Rpb24oZSl7ci5zdG9wKCksdChlK24pfSxuLGUpLHJ9LGlwPWZ1bmN0aW9uKHQsbixlKXt2YXIgcj1uZXcgX24saT1uO3JldHVybiBudWxsPT1uPyhyLnJlc3RhcnQodCxuLGUpLHIpOihuPStuLGU9bnVsbD09ZT9kbigpOitlLHIucmVzdGFydChmdW5jdGlvbiBvKHUpe3UrPWksci5yZXN0YXJ0KG8saSs9bixlKSx0KHUpfSxuLGUpLHIpfSxvcD1kKCJzdGFydCIsImVuZCIsImludGVycnVwdCIpLHVwPVtdLGFwPTAsY3A9MSxzcD0yLGZwPTMsbHA9NCxocD01LHBwPTYsZHA9ZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciB1PXQuX190cmFuc2l0aW9uO2lmKHUpe2lmKGUgaW4gdSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTtTbih0LGUse25hbWU6bixpbmRleDpyLGdyb3VwOmksb246b3AsdHdlZW46dXAsdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6YXB9KX0sdnA9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbz10Ll9fdHJhbnNpdGlvbix1PSEwO2lmKG8pe249bnVsbD09bj9udWxsOm4rIiI7Zm9yKGkgaW4gbykoZT1vW2ldKS5uYW1lPT09bj8ocj1lLnN0YXRlPnNwJiZlLnN0YXRlPGhwLGUuc3RhdGU9cHAsZS50aW1lci5zdG9wKCksciYmZS5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLGRlbGV0ZSBvW2ldKTp1PSExO3UmJmRlbGV0ZSB0Ll9fdHJhbnNpdGlvbn19LF9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2cCh0aGlzLHQpfSl9LGdwPWZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcy5faWQ7aWYodCs9IiIsYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIHIsaT1rbih0aGlzLm5vZGUoKSxlKS50d2VlbixvPTAsdT1pLmxlbmd0aDtvPHU7KytvKWlmKChyPWlbb10pLm5hbWU9PT10KXJldHVybiByLnZhbHVlO3JldHVybiBudWxsfXJldHVybiB0aGlzLmVhY2goKG51bGw9PW4/Tm46RW4pKGUsdCxuKSl9LHlwPWZ1bmN0aW9uKHQsbil7dmFyIGU7cmV0dXJuKCJudW1iZXIiPT10eXBlb2Ygbj9UaDpuIGluc3RhbmNlb2YgVHQ/bWg6KGU9VHQobikpPyhuPWUsbWgpOkVoKSh0LG4pfSxtcD1mdW5jdGlvbih0LG4pe3ZhciBlPUNmKHQpLHI9InRyYW5zZm9ybSI9PT1lP3FoOnlwO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLmxvY2FsP3FuOkxuKShlLHIsQW4odGhpcywiYXR0ci4iK3QsbikpOm51bGw9PW4/KGUubG9jYWw/em46Q24pKGUpOihlLmxvY2FsP1JuOlBuKShlLHIsbikpfSx4cD1mdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9Q2YodCk7cmV0dXJuIHRoaXMudHdlZW4oZSwoci5sb2NhbD9VbjpEbikocixuKSl9LGJwPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/T246Rm4pKG4sdCkpOmtuKHRoaXMubm9kZSgpLG4pLmRlbGF5fSx3cD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P0luOlluKShuLHQpKTprbih0aGlzLm5vZGUoKSxuKS5kdXJhdGlvbn0sTXA9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKEJuKG4sdCkpOmtuKHRoaXMubm9kZSgpLG4pLmVhc2V9LFRwPWZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1VZih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1PW5baV0sYT11Lmxlbmd0aCxjPXJbaV09W10scz0wO3M8YTsrK3MpKG89dVtzXSkmJnQuY2FsbChvLG8uX19kYXRhX18scyx1KSYmYy5wdXNoKG8pO3JldHVybiBuZXcgS24ocix0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxrcD1mdW5jdGlvbih0KXtpZih0Ll9pZCE9PXRoaXMuX2lkKXRocm93IG5ldyBFcnJvcjtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksdT1uZXcgQXJyYXkociksYT0wO2E8bzsrK2EpZm9yKHZhciBjLHM9blthXSxmPWVbYV0sbD1zLmxlbmd0aCxoPXVbYV09bmV3IEFycmF5KGwpLHA9MDtwPGw7KytwKShjPXNbcF18fGZbcF0pJiYoaFtwXT1jKTtmb3IoO2E8cjsrK2EpdVthXT1uW2FdO3JldHVybiBuZXcgS24odSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxTcD1mdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/a24odGhpcy5ub2RlKCksZSkub24ub24odCk6dGhpcy5lYWNoKEhuKGUsdCxuKSl9LE5wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLFhuKHRoaXMuX2lkKSl9LEVwPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWUsZT10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9QmYodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSx1PTA7dTxpOysrdSlmb3IodmFyIGEsYyxzPXJbdV0sZj1zLmxlbmd0aCxsPW9bdV09bmV3IEFycmF5KGYpLGg9MDtoPGY7KytoKShhPXNbaF0pJiYoYz10LmNhbGwoYSxhLl9fZGF0YV9fLGgscykpJiYoIl9fZGF0YV9fImluIGEmJihjLl9fZGF0YV9fPWEuX19kYXRhX18pLGxbaF09YyxkcChsW2hdLG4sZSxoLGwsa24oYSxlKSkpO3JldHVybiBuZXcgS24obyx0aGlzLl9wYXJlbnRzLG4sZSl9LEFwPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWUsZT10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SGYodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPVtdLHU9W10sYT0wO2E8aTsrK2EpZm9yKHZhciBjLHM9clthXSxmPXMubGVuZ3RoLGw9MDtsPGY7KytsKWlmKGM9c1tsXSl7Zm9yKHZhciBoLHA9dC5jYWxsKGMsYy5fX2RhdGFfXyxsLHMpLGQ9a24oYyxlKSx2PTAsXz1wLmxlbmd0aDt2PF87Kyt2KShoPXBbdl0pJiZkcChoLG4sZSx2LHAsZCk7by5wdXNoKHApLHUucHVzaChjKX1yZXR1cm4gbmV3IEtuKG8sdSxuLGUpfSxDcD12dC5wcm90b3R5cGUuY29uc3RydWN0b3IsenA9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IENwKHRoaXMuX2dyb3Vwcyx0aGlzLl9wYXJlbnRzKX0sUHA9ZnVuY3Rpb24odCxuLGUpe3ZhciByPSJ0cmFuc2Zvcm0iPT0odCs9IiIpP0xoOnlwO3JldHVybiBudWxsPT1uP3RoaXMuc3R5bGVUd2Vlbih0LFZuKHQscikpLm9uKCJlbmQuc3R5bGUuIit0LFduKHQpKTp0aGlzLnN0eWxlVHdlZW4odCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9abih0LHIsQW4odGhpcywic3R5bGUuIit0LG4pKTokbih0LHIsbiksZSl9LFJwPWZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLEduKHQsbixudWxsPT1lPyIiOmUpKX0sTHA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P1FuKEFuKHRoaXMsInRleHQiLHQpKTpKbihudWxsPT10PyIiOnQrIiIpKX0scXA9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxuPXRoaXMuX2lkLGU9bmUoKSxyPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89MDtvPGk7KytvKWZvcih2YXIgdSxhPXJbb10sYz1hLmxlbmd0aCxzPTA7czxjOysrcylpZih1PWFbc10pe3ZhciBmPWtuKHUsbik7ZHAodSx0LGUscyxhLHt0aW1lOmYudGltZStmLmRlbGF5K2YuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjpmLmR1cmF0aW9uLGVhc2U6Zi5lYXNlfSl9cmV0dXJuIG5ldyBLbihyLHRoaXMuX3BhcmVudHMsdCxlKX0sVXA9MCxEcD12dC5wcm90b3R5cGU7S24ucHJvdG90eXBlPXRlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6S24sc2VsZWN0OkVwLHNlbGVjdEFsbDpBcCxmaWx0ZXI6VHAsbWVyZ2U6a3Asc2VsZWN0aW9uOnpwLHRyYW5zaXRpb246cXAsY2FsbDpEcC5jYWxsLG5vZGVzOkRwLm5vZGVzLG5vZGU6RHAubm9kZSxzaXplOkRwLnNpemUsZW1wdHk6RHAuZW1wdHksZWFjaDpEcC5lYWNoLG9uOlNwLGF0dHI6bXAsYXR0clR3ZWVuOnhwLHN0eWxlOlBwLHN0eWxlVHdlZW46UnAsdGV4dDpMcCxyZW1vdmU6TnAsdHdlZW46Z3AsZGVsYXk6YnAsZHVyYXRpb246d3AsZWFzZTpNcH07dmFyIE9wPTMsRnA9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfShPcCksSXA9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oT3ApLFlwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KHQsbik6Mi1NYXRoLnBvdygyLXQsbikpLzJ9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KE9wKSxCcD1NYXRoLlBJLGpwPUJwLzIsSHA9NC8xMSxYcD02LzExLFZwPTgvMTEsV3A9Ljc1LCRwPTkvMTEsWnA9MTAvMTEsR3A9LjkzNzUsSnA9MjEvMjIsUXA9NjMvNjQsS3A9MS9IcC9IcCx0ZD0xLjcwMTU4LG5kPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0odGQpLGVkPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4tLXQqdCooKG4rMSkqdCtuKSsxfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0odGQpLHJkPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPDE/dCp0KigobisxKSp0LW4pOih0LT0yKSp0KigobisxKSp0K24pKzIpLzJ9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSh0ZCksaWQ9MipNYXRoLlBJLG9kPTEsdWQ9LjMsYWQ9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4qTWF0aC5wb3coMiwxMCotLXQpKk1hdGguc2luKChpLXQpL2UpfXZhciBpPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89aWQpO3JldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqaWQpfSxyLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxyfShvZCx1ZCksY2Q9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K2kpL2UpfXZhciBpPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89aWQpO3JldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqaWQpfSxyLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxyfShvZCx1ZCksc2Q9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuKCh0PTIqdC0xKTwwP24qTWF0aC5wb3coMiwxMCp0KSpNYXRoLnNpbigoaS10KS9lKToyLW4qTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKGkrdCkvZSkpLzJ9dmFyIGk9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1pZCk7cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSppZCl9LHIucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LHJ9KG9kLHVkKSxmZD17dGltZTpudWxsLGRlbGF5OjAsZHVyYXRpb246MjUwLGVhc2U6Y2V9LGxkPWZ1bmN0aW9uKHQpe3ZhciBuLGU7dCBpbnN0YW5jZW9mIEtuPyhuPXQuX2lkLHQ9dC5fbmFtZSk6KG49bmUoKSwoZT1mZCkudGltZT1kbigpLHQ9bnVsbD09dD9udWxsOnQrIiIpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIHUsYT1yW29dLGM9YS5sZW5ndGgscz0wO3M8YzsrK3MpKHU9YVtzXSkmJmRwKHUsdCxuLHMsYSxlfHxiZSh1LG4pKTtyZXR1cm4gbmV3IEtuKHIsdGhpcy5fcGFyZW50cyx0LG4pfTt2dC5wcm90b3R5cGUuaW50ZXJydXB0PV9wLHZ0LnByb3RvdHlwZS50cmFuc2l0aW9uPWxkO3ZhciBoZD1bbnVsbF0scGQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9dC5fX3RyYW5zaXRpb247aWYoaSl7bj1udWxsPT1uP251bGw6bisiIjtmb3IociBpbiBpKWlmKChlPWlbcl0pLnN0YXRlPmNwJiZlLm5hbWU9PT1uKXJldHVybiBuZXcgS24oW1t0XV0saGQsbiwrcil9cmV0dXJuIG51bGx9LGRkPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sdmQ9ZnVuY3Rpb24odCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zZWxlY3Rpb249ZX0sX2Q9ZnVuY3Rpb24oKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0sZ2Q9e25hbWU6ImRyYWcifSx5ZD17bmFtZToic3BhY2UifSxtZD17bmFtZToiaGFuZGxlIn0seGQ9e25hbWU6ImNlbnRlciJ9LGJkPXtuYW1lOiJ4IixoYW5kbGVzOlsiZSIsInciXS5tYXAoTWUpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbdFswXSxuWzBdWzFdXSxbdFsxXSxuWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSx3ZD17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKE1lKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW25bMF1bMF0sdFswXV0sW25bMV1bMF0sdFsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzFdLHRbMV1bMV1dfX0sTWQ9e25hbWU6Inh5IixoYW5kbGVzOlsibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0ubWFwKE1lKSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sVGQ9e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LGtkPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxTZD17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sTmQ9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sRWQ9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX0sQWQ9ZnVuY3Rpb24oKXtyZXR1cm4gemUoTWQpfSxDZD1NYXRoLmNvcyx6ZD1NYXRoLnNpbixQZD1NYXRoLlBJLFJkPVBkLzIsTGQ9MipQZCxxZD1NYXRoLm1heCxVZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG8sdSxhLGMscyxmLGw9dC5sZW5ndGgsaD1bXSxwPVFzKGwpLGQ9W10sdj1bXSxfPXYuZ3JvdXBzPW5ldyBBcnJheShsKSxnPW5ldyBBcnJheShsKmwpO2ZvcihvPTAscz0tMTsrK3M8bDspe2Zvcih1PTAsZj0tMTsrK2Y8bDspdSs9dFtzXVtmXTtoLnB1c2godSksZC5wdXNoKFFzKGwpKSxvKz11fWZvcihlJiZwLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShoW3RdLGhbbl0pfSksciYmZC5mb3JFYWNoKGZ1bmN0aW9uKG4sZSl7bi5zb3J0KGZ1bmN0aW9uKG4saSl7cmV0dXJuIHIodFtlXVtuXSx0W2VdW2ldKX0pfSksbz1xZCgwLExkLW4qbCkvbyxjPW8/bjpMZC9sLHU9MCxzPS0xOysrczxsOyl7Zm9yKGE9dSxmPS0xOysrZjxsOyl7dmFyIHk9cFtzXSxtPWRbeV1bZl0seD10W3ldW21dLGI9dSx3PXUrPXgqbztnW20qbCt5XT17aW5kZXg6eSxzdWJpbmRleDptLHN0YXJ0QW5nbGU6YixlbmRBbmdsZTp3LHZhbHVlOnh9fV9beV09e2luZGV4Onksc3RhcnRBbmdsZTphLGVuZEFuZ2xlOnUsdmFsdWU6aFt5XX0sdSs9Y31mb3Iocz0tMTsrK3M8bDspZm9yKGY9cy0xOysrZjxsOyl7dmFyIE09Z1tmKmwrc10sVD1nW3MqbCtmXTsoTS52YWx1ZXx8VC52YWx1ZSkmJnYucHVzaChNLnZhbHVlPFQudmFsdWU/e3NvdXJjZTpULHRhcmdldDpNfTp7c291cmNlOk0sdGFyZ2V0OlR9KX1yZXR1cm4gaT92LnNvcnQoaSk6dn12YXIgbj0wLGU9bnVsbCxyPW51bGwsaT1udWxsO3JldHVybiB0LnBhZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXFkKDAsZSksdCk6bn0sdC5zb3J0R3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC5zb3J0Q2hvcmRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP2k9bnVsbDooaT1QZShuKSkuXz1uLHQpOmkmJmkuX30sdH0sRGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLE9kPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sRmQ9TWF0aC5QSSxJZD0yKkZkLFlkPTFlLTYsQmQ9SWQtWWQ7UmUucHJvdG90eXBlPUxlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UmUsbW92ZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K24pfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIpe3RoaXMuXys9IlEiKyArdCsiLCIrICtuKyIsIisodGhpcy5feDE9K2UpKyIsIisodGhpcy5feTE9K3IpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArbisiLCIrICtlKyIsIisgK3IrIiwiKyh0aGlzLl94MT0raSkrIiwiKyh0aGlzLl95MT0rbyl9LGFyY1RvOmZ1bmN0aW9uKHQsbixlLHIsaSl7dD0rdCxuPStuLGU9K2Uscj0rcixpPStpO3ZhciBvPXRoaXMuX3gxLHU9dGhpcy5feTEsYT1lLXQsYz1yLW4scz1vLXQsZj11LW4sbD1zKnMrZipmO2lmKGk8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitpKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9bik7ZWxzZSBpZihsPllkKWlmKE1hdGguYWJzKGYqYS1jKnMpPllkJiZpKXt2YXIgaD1lLW8scD1yLXUsZD1hKmErYypjLHY9aCpoK3AqcCxfPU1hdGguc3FydChkKSxnPU1hdGguc3FydChsKSx5PWkqTWF0aC50YW4oKEZkLU1hdGguYWNvcygoZCtsLXYpLygyKl8qZykpKS8yKSxtPXkvZyx4PXkvXztNYXRoLmFicyhtLTEpPllkJiYodGhpcy5fKz0iTCIrKHQrbSpzKSsiLCIrKG4rbSpmKSksdGhpcy5fKz0iQSIraSsiLCIraSsiLDAsMCwiKyArKGYqaD5zKnApKyIsIisodGhpcy5feDE9dCt4KmEpKyIsIisodGhpcy5feTE9bit4KmMpfWVsc2UgdGhpcy5fKz0iTCIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9bik7ZWxzZTt9LGFyYzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dD0rdCxuPStuLGU9K2U7dmFyIHU9ZSpNYXRoLmNvcyhyKSxhPWUqTWF0aC5zaW4ociksYz10K3Uscz1uK2EsZj0xXm8sbD1vP3ItaTppLXI7aWYoZTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK2UpO251bGw9PT10aGlzLl94MT90aGlzLl8rPSJNIitjKyIsIitzOihNYXRoLmFicyh0aGlzLl94MS1jKT5ZZHx8TWF0aC5hYnModGhpcy5feTEtcyk+WWQpJiYodGhpcy5fKz0iTCIrYysiLCIrcyksZSYmKGw+QmQ/dGhpcy5fKz0iQSIrZSsiLCIrZSsiLDAsMSwiK2YrIiwiKyh0LXUpKyIsIisobi1hKSsiQSIrZSsiLCIrZSsiLDAsMSwiK2YrIiwiKyh0aGlzLl94MT1jKSsiLCIrKHRoaXMuX3kxPXMpOihsPDAmJihsPWwlSWQrSWQpLHRoaXMuXys9IkEiK2UrIiwiK2UrIiwwLCIrICsobD49RmQpKyIsIitmKyIsIisodGhpcy5feDE9dCtlKk1hdGguY29zKGkpKSsiLCIrKHRoaXMuX3kxPW4rZSpNYXRoLnNpbihpKSkpKX0scmVjdDpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K24pKyJoIisgK2UrInYiKyArcisiaCIrLWUrIloifSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgamQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQsYT1EZC5jYWxsKGFyZ3VtZW50cyksYz1uLmFwcGx5KHRoaXMsYSkscz1lLmFwcGx5KHRoaXMsYSksZj0rci5hcHBseSh0aGlzLChhWzBdPWMsYSkpLGw9aS5hcHBseSh0aGlzLGEpLVJkLGg9by5hcHBseSh0aGlzLGEpLVJkLHA9ZipDZChsKSxkPWYqemQobCksdj0rci5hcHBseSh0aGlzLChhWzBdPXMsYSkpLF89aS5hcHBseSh0aGlzLGEpLVJkLGc9by5hcHBseSh0aGlzLGEpLVJkO2lmKHV8fCh1PXQ9TGUoKSksdS5tb3ZlVG8ocCxkKSx1LmFyYygwLDAsZixsLGgpLGw9PT1fJiZoPT09Z3x8KHUucXVhZHJhdGljQ3VydmVUbygwLDAsdipDZChfKSx2KnpkKF8pKSx1LmFyYygwLDAsdixfLGcpKSx1LnF1YWRyYXRpY0N1cnZlVG8oMCwwLHAsZCksdS5jbG9zZVBhdGgoKSx0KXJldHVybiB1PW51bGwsdCsiInx8bnVsbH12YXIgbj1xZSxlPVVlLHI9RGUsaT1PZSxvPUZlLHU9bnVsbDtyZXR1cm4gdC5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpPZCgrbiksdCk6cn0sdC5zdGFydEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246T2QoK24pLHQpOml9LHQuZW5kQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpPZCgrbiksdCk6b30sdC5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSx0KTpufSx0LnRhcmdldD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsPT1uP251bGw6bix0KTp1fSx0fSxIZD0iJCI7SWUucHJvdG90eXBlPVllLnByb3RvdHlwZT17Y29uc3RydWN0b3I6SWUsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiBIZCt0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tIZCt0XX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXNbSGQrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49SGQrdDtyZXR1cm4gbiBpbiB0aGlzJiZkZWxldGUgdGhpc1tuXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcyl0WzBdPT09SGQmJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpblswXT09PUhkJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKW5bMF09PT1IZCYmdC5wdXNoKHRoaXNbbl0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpblswXT09PUhkJiZ0LnB1c2goe2tleTpuLnNsaWNlKDEpLHZhbHVlOnRoaXNbbl19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBuIGluIHRoaXMpblswXT09PUhkJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PUhkKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbiBpbiB0aGlzKW5bMF09PT1IZCYmdCh0aGlzW25dLG4uc2xpY2UoMSksdGhpcyl9fTt2YXIgWGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG4saSx1LGEpe2lmKGk+PW8ubGVuZ3RoKXJldHVybiBudWxsIT1yP3Iobik6bnVsbCE9ZT9uLnNvcnQoZSk6bjtmb3IodmFyIGMscyxmLGw9LTEsaD1uLmxlbmd0aCxwPW9baSsrXSxkPVllKCksdj11KCk7KytsPGg7KShmPWQuZ2V0KGM9cChzPW5bbF0pKyIiKSk/Zi5wdXNoKHMpOmQuc2V0KGMsW3NdKTtyZXR1cm4gZC5lYWNoKGZ1bmN0aW9uKG4sZSl7YSh2LGUsdChuLGksdSxhKSl9KSx2fWZ1bmN0aW9uIG4odCxlKXtpZigrK2U+by5sZW5ndGgpcmV0dXJuIHQ7dmFyIGksYT11W2UtMV07cmV0dXJuIG51bGwhPXImJmU+PW8ubGVuZ3RoP2k9dC5lbnRyaWVzKCk6KGk9W10sdC5lYWNoKGZ1bmN0aW9uKHQscil7aS5wdXNoKHtrZXk6cix2YWx1ZXM6bih0LGUpfSl9KSksbnVsbCE9YT9pLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gYSh0LmtleSxuLmtleSl9KTppfXZhciBlLHIsaSxvPVtdLHU9W107cmV0dXJuIGk9e29iamVjdDpmdW5jdGlvbihuKXtyZXR1cm4gdChuLDAsQmUsamUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHQobiwwLEhlLFhlKX0sZW50cmllczpmdW5jdGlvbihlKXtyZXR1cm4gbih0KGUsMCxIZSxYZSksMCl9LGtleTpmdW5jdGlvbih0KXtyZXR1cm4gby5wdXNoKHQpLGl9LHNvcnRLZXlzOmZ1bmN0aW9uKHQpe3JldHVybiB1W28ubGVuZ3RoLTFdPXQsaX0sc29ydFZhbHVlczpmdW5jdGlvbih0KXtyZXR1cm4gZT10LGl9LHJvbGx1cDpmdW5jdGlvbih0KXtyZXR1cm4gcj10LGl9fX0sVmQ9WWUucHJvdG90eXBlO1ZlLnByb3RvdHlwZT1XZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlZlLGhhczpWZC5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0Kz0iIix0aGlzW0hkK3RdPXQsdGhpc30scmVtb3ZlOlZkLnJlbW92ZSxjbGVhcjpWZC5jbGVhcix2YWx1ZXM6VmQua2V5cyxzaXplOlZkLnNpemUsZW1wdHk6VmQuZW1wdHksZWFjaDpWZC5lYWNofTt2YXIgV2Q9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKGUpO3JldHVybiBufSwkZD1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2godFtlXSk7cmV0dXJuIG59LFpkPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh7a2V5OmUsdmFsdWU6dFtlXX0pO3JldHVybiBufSxHZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQsbil7dmFyIHIsaSxvPWUodCxmdW5jdGlvbih0LGUpe2lmKHIpcmV0dXJuIHIodCxlLTEpO2k9dCxyPW4/WmUodCxuKTokZSh0KX0pO3JldHVybiBvLmNvbHVtbnM9aSxvfWZ1bmN0aW9uIGUodCxuKXtmdW5jdGlvbiBlKCl7aWYoZj49cylyZXR1cm4gdTtpZihpKXJldHVybiBpPSExLG87dmFyIG4sZT1mO2lmKDM0PT09dC5jaGFyQ29kZUF0KGUpKXtmb3IodmFyIHI9ZTtyKys8czspaWYoMzQ9PT10LmNoYXJDb2RlQXQocikpe2lmKDM0IT09dC5jaGFyQ29kZUF0KHIrMSkpYnJlYWs7KytyfXJldHVybiBmPXIrMixuPXQuY2hhckNvZGVBdChyKzEpLDEzPT09bj8oaT0hMCwxMD09PXQuY2hhckNvZGVBdChyKzIpJiYrK2YpOjEwPT09biYmKGk9ITApLHQuc2xpY2UoZSsxLHIpLnJlcGxhY2UoLyIiL2csJyInKX1mb3IoO2Y8czspe3ZhciBhPTE7aWYobj10LmNoYXJDb2RlQXQoZisrKSwxMD09PW4paT0hMDtlbHNlIGlmKDEzPT09bilpPSEwLDEwPT09dC5jaGFyQ29kZUF0KGYpJiYoKytmLCsrYSk7ZWxzZSBpZihuIT09Yyljb250aW51ZTtyZXR1cm4gdC5zbGljZShlLGYtYSl9cmV0dXJuIHQuc2xpY2UoZSl9Zm9yKHZhciByLGksbz17fSx1PXt9LGE9W10scz10Lmxlbmd0aCxmPTAsbD0wOyhyPWUoKSkhPT11Oyl7Zm9yKHZhciBoPVtdO3IhPT1vJiZyIT09dTspaC5wdXNoKHIpLHI9ZSgpO24mJm51bGw9PShoPW4oaCxsKyspKXx8YS5wdXNoKGgpfXJldHVybiBhfWZ1bmN0aW9uIHIobixlKXtyZXR1cm4gbnVsbD09ZSYmKGU9R2UobikpLFtlLm1hcCh1KS5qb2luKHQpXS5jb25jYXQobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB1KG5bdF0pfSkuam9pbih0KX0pKS5qb2luKCJcbiIpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4oIlxuIil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gbi5tYXAodSkuam9pbih0KX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT10PyIiOmEudGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvXCIvZywnIiInKSsnIic6dH12YXIgYT1uZXcgUmVnRXhwKCdbIicrdCsiXG5dIiksYz10LmNoYXJDb2RlQXQoMCk7cmV0dXJue3BhcnNlOm4scGFyc2VSb3dzOmUsZm9ybWF0OnIsZm9ybWF0Um93czppfX0sSmQ9R2QoIiwiKSxRZD1KZC5wYXJzZSxLZD1KZC5wYXJzZVJvd3MsdHY9SmQuZm9ybWF0LG52PUpkLmZvcm1hdFJvd3MsZXY9R2QoIlx0IikscnY9ZXYucGFyc2UsaXY9ZXYucGFyc2VSb3dzLG92PWV2LmZvcm1hdCx1dj1ldi5mb3JtYXRSb3dzLGF2PWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlLGksbz1yLmxlbmd0aCx1PTAsYT0wO2ZvcihlPTA7ZTxvOysrZSlpPXJbZV0sdSs9aS54LGErPWkueTtmb3IodT11L28tdCxhPWEvby1uLGU9MDtlPG87KytlKWk9cltlXSxpLngtPXUsaS55LT1hfXZhciByO3JldHVybiBudWxsPT10JiYodD0wKSxudWxsPT1uJiYobj0wKSxlLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10fSxlLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K24sZSk6dH0sZS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LGUpOm59LGV9LGN2PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sc3Y9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtNiooTWF0aC5yYW5kb20oKS0uNSl9LGZ2PWZ1bmN0aW9uKHQpe3ZhciBuPSt0aGlzLl94LmNhbGwobnVsbCx0KSxlPSt0aGlzLl95LmNhbGwobnVsbCx0KTtyZXR1cm4gSmUodGhpcy5jb3ZlcihuLGUpLG4sZSx0KX0sbHY9ZnVuY3Rpb24odCxuKXtpZihpc05hTih0PSt0KXx8aXNOYU4obj0rbikpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5feDAscj10aGlzLl95MCxpPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4oZSkpaT0oZT1NYXRoLmZsb29yKHQpKSsxLG89KHI9TWF0aC5mbG9vcihuKSkrMTtlbHNle2lmKCEoZT50fHx0Pml8fHI+bnx8bj5vKSlyZXR1cm4gdGhpczt2YXIgdSxhLGM9aS1lLHM9dGhpcy5fcm9vdDtzd2l0Y2goYT0objwocitvKS8yKTw8MXx0PChlK2kpLzIpe2Nhc2UgMDpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsaT1lK2Msbz1yK2MsdD5pfHxuPm8pO2JyZWFrO2Nhc2UgMTpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsZT1pLWMsbz1yK2MsZT50fHxuPm8pO2JyZWFrO2Nhc2UgMjpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsaT1lK2Mscj1vLWMsdD5pfHxyPm4pO2JyZWFrO2Nhc2UgMzpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsZT1pLWMscj1vLWMsZT50fHxyPm4pfXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1zKX1yZXR1cm4gdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzfSxodj1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkbyB0LnB1c2gobi5kYXRhKTt3aGlsZShuPW4ubmV4dCl9KSx0fSxwdj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0sZHY9ZnVuY3Rpb24odCxuLGUscixpKXt0aGlzLm5vZGU9dCx0aGlzLngwPW4sdGhpcy55MD1lLHRoaXMueDE9cix0aGlzLnkxPWl9LHZ2PWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sdSxhLGMscyxmPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxwPXRoaXMuX3kxLGQ9W10sdj10aGlzLl9yb290O2Zvcih2JiZkLnB1c2gobmV3IGR2KHYsZixsLGgscCkpLG51bGw9PWU/ZT0xLzA6KGY9dC1lLGw9bi1lLGg9dCtlLHA9bitlLGUqPWUpO2M9ZC5wb3AoKTspaWYoISghKHY9Yy5ub2RlKXx8KGk9Yy54MCk+aHx8KG89Yy55MCk+cHx8KHU9Yy54MSk8Znx8KGE9Yy55MSk8bCkpaWYodi5sZW5ndGgpe3ZhciBfPShpK3UpLzIsZz0obythKS8yO2QucHVzaChuZXcgZHYodlszXSxfLGcsdSxhKSxuZXcgZHYodlsyXSxpLGcsXyxhKSxuZXcgZHYodlsxXSxfLG8sdSxnKSxuZXcgZHYodlswXSxpLG8sXyxnKSksKHM9KG4+PWcpPDwxfHQ+PV8pJiYoYz1kW2QubGVuZ3RoLTFdLGRbZC5sZW5ndGgtMV09ZFtkLmxlbmd0aC0xLXNdLGRbZC5sZW5ndGgtMS1zXT1jKX1lbHNle3ZhciB5PXQtK3RoaXMuX3guY2FsbChudWxsLHYuZGF0YSksbT1uLSt0aGlzLl95LmNhbGwobnVsbCx2LmRhdGEpLHg9eSp5K20qbTtpZih4PGUpe3ZhciBiPU1hdGguc3FydChlPXgpO2Y9dC1iLGw9bi1iLGg9dCtiLHA9bitiLHI9di5kYXRhfX1yZXR1cm4gcn0sX3Y9ZnVuY3Rpb24odCl7aWYoaXNOYU4obz0rdGhpcy5feC5jYWxsKG51bGwsdCkpfHxpc05hTih1PSt0aGlzLl95LmNhbGwobnVsbCx0KSkpcmV0dXJuIHRoaXM7dmFyIG4sZSxyLGksbyx1LGEsYyxzLGYsbCxoLHA9dGhpcy5fcm9vdCxkPXRoaXMuX3gwLHY9dGhpcy5feTAsXz10aGlzLl94MSxnPXRoaXMuX3kxO2lmKCFwKXJldHVybiB0aGlzO2lmKHAubGVuZ3RoKWZvcig7Oyl7aWYoKHM9bz49KGE9KGQrXykvMikpP2Q9YTpfPWEsKGY9dT49KGM9KHYrZykvMikpP3Y9YzpnPWMsbj1wLCEocD1wW2w9Zjw8MXxzXSkpcmV0dXJuIHRoaXM7aWYoIXAubGVuZ3RoKWJyZWFrOyhuW2wrMSYzXXx8bltsKzImM118fG5bbCszJjNdKSYmKGU9bixoPWwpfWZvcig7cC5kYXRhIT09dDspaWYocj1wLCEocD1wLm5leHQpKXJldHVybiB0aGlzO3JldHVybihpPXAubmV4dCkmJmRlbGV0ZSBwLm5leHQscj8oaT9yLm5leHQ9aTpkZWxldGUgci5uZXh0LHRoaXMpOm4/KGk/bltsXT1pOmRlbGV0ZSBuW2xdLChwPW5bMF18fG5bMV18fG5bMl18fG5bM10pJiZwPT09KG5bM118fG5bMl18fG5bMV18fG5bMF0pJiYhcC5sZW5ndGgmJihlP2VbaF09cDp0aGlzLl9yb290PXApLHRoaXMpOih0aGlzLl9yb290PWksdGhpcyl9LGd2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LHl2PWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG8rK3Q7d2hpbGUobj1uLm5leHQpfSksdH0sbXY9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyx1LGE9W10sYz10aGlzLl9yb290O2ZvcihjJiZhLnB1c2gobmV3IGR2KGMsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWEucG9wKCk7KWlmKCF0KGM9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLHU9bi55MSkmJmMubGVuZ3RoKXt2YXIgcz0ocitvKS8yLGY9KGkrdSkvMjsoZT1jWzNdKSYmYS5wdXNoKG5ldyBkdihlLHMsZixvLHUpKSwoZT1jWzJdKSYmYS5wdXNoKG5ldyBkdihlLHIsZixzLHUpKSwoZT1jWzFdKSYmYS5wdXNoKG5ldyBkdihlLHMsaSxvLGYpKSwoZT1jWzBdKSYmYS5wdXNoKG5ldyBkdihlLHIsaSxzLGYpKX1yZXR1cm4gdGhpc30seHY9ZnVuY3Rpb24odCl7dmFyIG4sZT1bXSxyPVtdO2Zvcih0aGlzLl9yb290JiZlLnB1c2gobmV3IGR2KHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWUucG9wKCk7KXt2YXIgaT1uLm5vZGU7aWYoaS5sZW5ndGgpe3ZhciBvLHU9bi54MCxhPW4ueTAsYz1uLngxLHM9bi55MSxmPSh1K2MpLzIsbD0oYStzKS8yOyhvPWlbMF0pJiZlLnB1c2gobmV3IGR2KG8sdSxhLGYsbCkpLChvPWlbMV0pJiZlLnB1c2gobmV3IGR2KG8sZixhLGMsbCkpLChvPWlbMl0pJiZlLnB1c2gobmV3IGR2KG8sdSxsLGYscykpLChvPWlbM10pJiZlLnB1c2gobmV3IGR2KG8sZixsLGMscykpfXIucHVzaChuKX1mb3IoO249ci5wb3AoKTspdChuLm5vZGUsbi54MCxuLnkwLG4ueDEsbi55MSk7cmV0dXJuIHRoaXN9LGJ2PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl94PXQsdGhpcyk6dGhpcy5feH0sd3Y9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fSxNdj1lci5wcm90b3R5cGU9cnIucHJvdG90eXBlO012LmNvcHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9bmV3IHJyKHRoaXMuX3gsdGhpcy5feSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkscj10aGlzLl9yb290O2lmKCFyKXJldHVybiBlO2lmKCFyLmxlbmd0aClyZXR1cm4gZS5fcm9vdD1pcihyKSxlO2Zvcih0PVt7c291cmNlOnIsdGFyZ2V0OmUuX3Jvb3Q9bmV3IEFycmF5KDQpfV07cj10LnBvcCgpOylmb3IodmFyIGk9MDtpPDQ7KytpKShuPXIuc291cmNlW2ldKSYmKG4ubGVuZ3RoP3QucHVzaCh7c291cmNlOm4sdGFyZ2V0OnIudGFyZ2V0W2ldPW5ldyBBcnJheSg0KX0pOnIudGFyZ2V0W2ldPWlyKG4pKTtyZXR1cm4gZX0sTXYuYWRkPWZ2LE12LmFkZEFsbD1RZSxNdi5jb3Zlcj1sdixNdi5kYXRhPWh2LE12LmV4dGVudD1wdixNdi5maW5kPXZ2LE12LnJlbW92ZT1fdixNdi5yZW1vdmVBbGw9S2UsTXYucm9vdD1ndixNdi5zaXplPXl2LE12LnZpc2l0PW12LE12LnZpc2l0QWZ0ZXI9eHYsTXYueD1idixNdi55PXd2O3ZhciBUdixrdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7ZnVuY3Rpb24gdCh0LG4sZSxyLGkpe3ZhciBvPXQuZGF0YSxhPXQucixwPWwrYTt7aWYoIW8pcmV0dXJuIG4+cytwfHxyPHMtcHx8ZT5mK3B8fGk8Zi1wO2lmKG8uaW5kZXg+Yy5pbmRleCl7dmFyIGQ9cy1vLngtby52eCx2PWYtby55LW8udnksXz1kKmQrdip2O188cCpwJiYoMD09PWQmJihkPXN2KCksXys9ZCpkKSwwPT09diYmKHY9c3YoKSxfKz12KnYpLF89KHAtKF89TWF0aC5zcXJ0KF8pKSkvXyp1LGMudngrPShkKj1fKSoocD0oYSo9YSkvKGgrYSkpLGMudnkrPSh2Kj1fKSpwLG8udngtPWQqKHA9MS1wKSxvLnZ5LT12KnApfX19Zm9yKHZhciBuLHIsYyxzLGYsbCxoLHA9aS5sZW5ndGgsZD0wO2Q8YTsrK2QpZm9yKHI9ZXIoaSxvcix1cikudmlzaXRBZnRlcihlKSxuPTA7bjxwOysrbiljPWlbbl0sbD1vW2MuaW5kZXhdLGg9bCpsLHM9Yy54K2MudngsZj1jLnkrYy52eSxyLnZpc2l0KHQpfWZ1bmN0aW9uIGUodCl7aWYodC5kYXRhKXJldHVybiB0LnI9b1t0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiByKCl7aWYoaSl7dmFyIG4sZSxyPWkubGVuZ3RoO2ZvcihvPW5ldyBBcnJheShyKSxuPTA7bjxyOysrbillPWlbbl0sb1tlLmluZGV4XT0rdChlLG4saSl9fXZhciBpLG8sdT0xLGE9MTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Y3YobnVsbD09dD8xOit0KSksbi5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxyKCl9LG4uaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxuKTphfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6Y3YoK2UpLHIoKSxuKTp0fSxufSxTdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe3JldHVybiAxL01hdGgubWluKHNbdC5zb3VyY2UuaW5kZXhdLHNbdC50YXJnZXQuaW5kZXhdKX1mdW5jdGlvbiBlKG4pe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxkOysrZSlmb3IodmFyIGksbyxjLHMsbCxoLHAsdj0wO3Y8cjsrK3YpaT10W3ZdLG89aS5zb3VyY2UsYz1pLnRhcmdldCxzPWMueCtjLnZ4LW8ueC1vLnZ4fHxzdigpLGw9Yy55K2Mudnktby55LW8udnl8fHN2KCksaD1NYXRoLnNxcnQocypzK2wqbCksaD0oaC1hW3ZdKS9oKm4qdVt2XSxzKj1oLGwqPWgsYy52eC09cyoocD1mW3ZdKSxjLnZ5LT1sKnAsby52eCs9cyoocD0xLXApLG8udnkrPWwqcH1mdW5jdGlvbiByKCl7aWYoYyl7dmFyIG4sZSxyPWMubGVuZ3RoLGg9dC5sZW5ndGgscD1ZZShjLGwpO2ZvcihuPTAscz1uZXcgQXJyYXkocik7bjxoOysrbillPXRbbl0sZS5pbmRleD1uLCJvYmplY3QiIT10eXBlb2YgZS5zb3VyY2UmJihlLnNvdXJjZT1jcihwLGUuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBlLnRhcmdldCYmKGUudGFyZ2V0PWNyKHAsZS50YXJnZXQpKSxzW2Uuc291cmNlLmluZGV4XT0oc1tlLnNvdXJjZS5pbmRleF18fDApKzEsc1tlLnRhcmdldC5pbmRleF09KHNbZS50YXJnZXQuaW5kZXhdfHwwKSsxO2ZvcihuPTAsZj1uZXcgQXJyYXkoaCk7bjxoOysrbillPXRbbl0sZltuXT1zW2Uuc291cmNlLmluZGV4XS8oc1tlLnNvdXJjZS5pbmRleF0rc1tlLnRhcmdldC5pbmRleF0pO3U9bmV3IEFycmF5KGgpLGkoKSxhPW5ldyBBcnJheShoKSxvKCl9fWZ1bmN0aW9uIGkoKXtpZihjKWZvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil1W25dPStoKHRbbl0sbix0KX1mdW5jdGlvbiBvKCl7aWYoYylmb3IodmFyIG49MCxlPXQubGVuZ3RoO248ZTsrK24pYVtuXT0rcCh0W25dLG4sdCl9dmFyIHUsYSxjLHMsZixsPWFyLGg9bixwPWN2KDMwKSxkPTE7cmV0dXJuIG51bGw9PXQmJih0PVtdKSxlLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7Yz10LHIoKX0sZS5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHIoKSxlKTp0fSxlLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsZSk6bH0sZS5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0LGUpOmR9LGUuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjdigrdCksaSgpLGUpOmh9LGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjdigrdCksbygpLGUpOnB9LGV9LE52PTEwLEV2PU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKSxBdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7ZSgpLHAuY2FsbCgidGljayIsbyksdTxhJiYoaC5zdG9wKCkscC5jYWxsKCJlbmQiLG8pKX1mdW5jdGlvbiBlKCl7dmFyIG4sZSxyPXQubGVuZ3RoO2Zvcih1Kz0ocy11KSpjLGwuZWFjaChmdW5jdGlvbih0KXt0KHUpfSksbj0wO248cjsrK24pZT10W25dLG51bGw9PWUuZng/ZS54Kz1lLnZ4Kj1mOihlLng9ZS5meCxlLnZ4PTApLApudWxsPT1lLmZ5P2UueSs9ZS52eSo9ZjooZS55PWUuZnksZS52eT0wKX1mdW5jdGlvbiByKCl7Zm9yKHZhciBuLGU9MCxyPXQubGVuZ3RoO2U8cjsrK2Upe2lmKG49dFtlXSxuLmluZGV4PWUsaXNOYU4obi54KXx8aXNOYU4obi55KSl7dmFyIGk9TnYqTWF0aC5zcXJ0KGUpLG89ZSpFdjtuLng9aSpNYXRoLmNvcyhvKSxuLnk9aSpNYXRoLnNpbihvKX0oaXNOYU4obi52eCl8fGlzTmFOKG4udnkpKSYmKG4udng9bi52eT0wKX19ZnVuY3Rpb24gaShuKXtyZXR1cm4gbi5pbml0aWFsaXplJiZuLmluaXRpYWxpemUodCksbn12YXIgbyx1PTEsYT0uMDAxLGM9MS1NYXRoLnBvdyhhLDEvMzAwKSxzPTAsZj0uNixsPVllKCksaD1nbihuKSxwPWQoInRpY2siLCJlbmQiKTtyZXR1cm4gbnVsbD09dCYmKHQ9W10pLHIoKSxvPXt0aWNrOmUscmVzdGFydDpmdW5jdGlvbigpe3JldHVybiBoLnJlc3RhcnQobiksb30sc3RvcDpmdW5jdGlvbigpe3JldHVybiBoLnN0b3AoKSxvfSxub2RlczpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHIoKSxsLmVhY2goaSksbyk6dH0sYWxwaGE6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3Qsbyk6dX0sYWxwaGFNaW46ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3Qsbyk6YX0sYWxwaGFEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0rdCxvKTorY30sYWxwaGFUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3Qsbyk6c30sdmVsb2NpdHlEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0xLXQsbyk6MS1mfSxmb3JjZTpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KG51bGw9PW4/bC5yZW1vdmUodCk6bC5zZXQodCxpKG4pKSxvKTpsLmdldCh0KX0sZmluZDpmdW5jdGlvbihuLGUscil7dmFyIGksbyx1LGEsYyxzPTAsZj10Lmxlbmd0aDtmb3IobnVsbD09cj9yPTEvMDpyKj1yLHM9MDtzPGY7KytzKWE9dFtzXSxpPW4tYS54LG89ZS1hLnksdT1pKmkrbypvLHU8ciYmKGM9YSxyPXUpO3JldHVybiBjfSxvbjpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KHAub24odCxuKSxvKTpwLm9uKHQpfX19LEN2PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbixhPWkubGVuZ3RoLGM9ZXIoaSxzcixmcikudmlzaXRBZnRlcihlKTtmb3IodT10LG49MDtuPGE7KytuKW89aVtuXSxjLnZpc2l0KHIpfWZ1bmN0aW9uIG4oKXtpZihpKXt2YXIgdCxuLGU9aS5sZW5ndGg7Zm9yKGE9bmV3IEFycmF5KGUpLHQ9MDt0PGU7Kyt0KW49aVt0XSxhW24uaW5kZXhdPStjKG4sdCxpKX19ZnVuY3Rpb24gZSh0KXt2YXIgbixlLHIsaSxvLHU9MDtpZih0Lmxlbmd0aCl7Zm9yKHI9aT1vPTA7bzw0Oysrbykobj10W29dKSYmKGU9bi52YWx1ZSkmJih1Kz1lLHIrPWUqbi54LGkrPWUqbi55KTt0Lng9ci91LHQueT1pL3V9ZWxzZXtuPXQsbi54PW4uZGF0YS54LG4ueT1uLmRhdGEueTtkbyB1Kz1hW24uZGF0YS5pbmRleF07d2hpbGUobj1uLm5leHQpfXQudmFsdWU9dX1mdW5jdGlvbiByKHQsbixlLHIpe2lmKCF0LnZhbHVlKXJldHVybiEwO3ZhciBpPXQueC1vLngsYz10Lnktby55LGg9ci1uLHA9aSppK2MqYztpZihoKmgvbDxwKXJldHVybiBwPGYmJigwPT09aSYmKGk9c3YoKSxwKz1pKmkpLDA9PT1jJiYoYz1zdigpLHArPWMqYykscDxzJiYocD1NYXRoLnNxcnQocypwKSksby52eCs9aSp0LnZhbHVlKnUvcCxvLnZ5Kz1jKnQudmFsdWUqdS9wKSwhMDtpZighKHQubGVuZ3RofHxwPj1mKSl7KHQuZGF0YSE9PW98fHQubmV4dCkmJigwPT09aSYmKGk9c3YoKSxwKz1pKmkpLDA9PT1jJiYoYz1zdigpLHArPWMqYykscDxzJiYocD1NYXRoLnNxcnQocypwKSkpO2RvIHQuZGF0YSE9PW8mJihoPWFbdC5kYXRhLmluZGV4XSp1L3Asby52eCs9aSpoLG8udnkrPWMqaCk7d2hpbGUodD10Lm5leHQpfX12YXIgaSxvLHUsYSxjPWN2KC0zMCkscz0xLGY9MS8wLGw9LjgxO3JldHVybiB0LmluaXRpYWxpemU9ZnVuY3Rpb24odCl7aT10LG4oKX0sdC5zdHJlbmd0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmN2KCtlKSxuKCksdCk6Y30sdC5kaXN0YW5jZU1pbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1uKm4sdCk6TWF0aC5zcXJ0KHMpfSx0LmRpc3RhbmNlTWF4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPW4qbix0KTpNYXRoLnNxcnQoZil9LHQudGhldGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bipuLHQpOk1hdGguc3FydChsKX0sdH0senY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtmb3IodmFyIG4sZT0wLHU9ci5sZW5ndGg7ZTx1OysrZSluPXJbZV0sbi52eCs9KG9bZV0tbi54KSppW2VdKnR9ZnVuY3Rpb24gZSgpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKWlbbl09aXNOYU4ob1tuXT0rdChyW25dLG4scikpPzA6K3UocltuXSxuLHIpfX12YXIgcixpLG8sdT1jdiguMSk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWN2KG51bGw9PXQ/MDordCkpLG4uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZSgpfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Y3YoK3QpLGUoKSxuKTp1fSxuLng9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpjdigrciksZSgpLG4pOnR9LG59LFB2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7Zm9yKHZhciBuLGU9MCx1PXIubGVuZ3RoO2U8dTsrK2Upbj1yW2VdLG4udnkrPShvW2VdLW4ueSkqaVtlXSp0fWZ1bmN0aW9uIGUoKXtpZihyKXt2YXIgbixlPXIubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShlKSxvPW5ldyBBcnJheShlKSxuPTA7bjxlOysrbilpW25dPWlzTmFOKG9bbl09K3QocltuXSxuLHIpKT8wOit1KHJbbl0sbixyKX19dmFyIHIsaSxvLHU9Y3YoLjEpO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1jdihudWxsPT10PzA6K3QpKSxuLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGUoKX0sbi5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmN2KCt0KSxlKCksbik6dX0sbi55PWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6Y3YoK3IpLGUoKSxuKTp0fSxufSxSdj1mdW5jdGlvbih0LG4pe2lmKChlPSh0PW4/dC50b0V4cG9uZW50aWFsKG4tMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxyPXQuc2xpY2UoMCxlKTtyZXR1cm5bci5sZW5ndGg+MT9yWzBdK3Iuc2xpY2UoMik6ciwrdC5zbGljZShlKzEpXX0sTHY9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9UnYoTWF0aC5hYnModCkpLHQ/dFsxXTpOYU59LHF2PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7Zm9yKHZhciBpPWUubGVuZ3RoLG89W10sdT0wLGE9dFswXSxjPTA7aT4wJiZhPjAmJihjK2ErMT5yJiYoYT1NYXRoLm1heCgxLHItYykpLG8ucHVzaChlLnN1YnN0cmluZyhpLT1hLGkrYSkpLCEoKGMrPWErMSk+cikpOylhPXRbdT0odSsxKSV0Lmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4obil9fSxVdj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvWzAtOV0vZyxmdW5jdGlvbihuKXtyZXR1cm4gdFsrbl19KX19LER2PWZ1bmN0aW9uKHQsbil7dD10LnRvUHJlY2lzaW9uKG4pO3Q6Zm9yKHZhciBlLHI9dC5sZW5ndGgsaT0xLG89LTE7aTxyOysraSlzd2l0Y2godFtpXSl7Y2FzZSIuIjpvPWU9aTticmVhaztjYXNlIjAiOjA9PT1vJiYobz1pKSxlPWk7YnJlYWs7Y2FzZSJlIjpicmVhayB0O2RlZmF1bHQ6bz4wJiYobz0wKX1yZXR1cm4gbz4wP3Quc2xpY2UoMCxvKSt0LnNsaWNlKGUrMSk6dH0sT3Y9ZnVuY3Rpb24odCxuKXt2YXIgZT1Sdih0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdLG89aS0oVHY9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoaS8zKSkpKSsxLHU9ci5sZW5ndGg7cmV0dXJuIG89PT11P3I6bz51P3IrbmV3IEFycmF5KG8tdSsxKS5qb2luKCIwIik6bz4wP3Iuc2xpY2UoMCxvKSsiLiIrci5zbGljZShvKToiMC4iK25ldyBBcnJheSgxLW8pLmpvaW4oIjAiKStSdih0LE1hdGgubWF4KDAsbitvLTEpKVswXX0sRnY9ZnVuY3Rpb24odCxuKXt2YXIgZT1Sdih0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfSxJdj17IiI6RHYsIiUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKG4pfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRXhwb25lbnRpYWwobil9LGY6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b0ZpeGVkKG4pfSxnOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9QcmVjaXNpb24obil9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxuKXtyZXR1cm4gRnYoMTAwKnQsbil9LHI6RnYsczpPdixYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19LFl2PS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLVwoIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KFthLXolXSk/JC9pO2xyLnByb3RvdHlwZT1oci5wcm90b3R5cGUsaHIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKG51bGw9PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyhudWxsPT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrdGhpcy50eXBlfTt2YXIgQnYsanY9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LEh2PVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXSxYdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe2Z1bmN0aW9uIG4odCl7dmFyIG4saSxzLG09dix4PV87aWYoImMiPT09ZCl4PWcodCkreCx0PSIiO2Vsc2V7dD0rdDt2YXIgYj10PDA7aWYodD1nKE1hdGguYWJzKHQpLHApLGImJjA9PT0rdCYmKGI9ITEpLG09KGI/IigiPT09Yz9jOiItIjoiLSI9PT1jfHwiKCI9PT1jPyIiOmMpK20seD14KygicyI9PT1kP0h2WzgrVHYvM106IiIpKyhiJiYiKCI9PT1jPyIpIjoiIikseSlmb3Iobj0tMSxpPXQubGVuZ3RoOysrbjxpOylpZihzPXQuY2hhckNvZGVBdChuKSw0OD5zfHxzPjU3KXt4PSg0Nj09PXM/byt0LnNsaWNlKG4rMSk6dC5zbGljZShuKSkreCx0PXQuc2xpY2UoMCxuKTticmVha319aCYmIWYmJih0PXIodCwxLzApKTt2YXIgdz1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxNPXc8bD9uZXcgQXJyYXkobC13KzEpLmpvaW4oZSk6IiI7c3dpdGNoKGgmJmYmJih0PXIoTSt0LE0ubGVuZ3RoP2wteC5sZW5ndGg6MS8wKSxNPSIiKSxhKXtjYXNlIjwiOnQ9bSt0K3grTTticmVhaztjYXNlIj0iOnQ9bStNK3QreDticmVhaztjYXNlIl4iOnQ9TS5zbGljZSgwLHc9TS5sZW5ndGg+PjEpK20rdCt4K00uc2xpY2Uodyk7YnJlYWs7ZGVmYXVsdDp0PU0rbSt0K3h9cmV0dXJuIHUodCl9dD1scih0KTt2YXIgZT10LmZpbGwsYT10LmFsaWduLGM9dC5zaWduLHM9dC5zeW1ib2wsZj10Lnplcm8sbD10LndpZHRoLGg9dC5jb21tYSxwPXQucHJlY2lzaW9uLGQ9dC50eXBlLHY9IiQiPT09cz9pWzBdOiIjIj09PXMmJi9bYm94WF0vLnRlc3QoZCk/IjAiK2QudG9Mb3dlckNhc2UoKToiIixfPSIkIj09PXM/aVsxXTovWyVwXS8udGVzdChkKT8iJSI6IiIsZz1JdltkXSx5PSFkfHwvW2RlZmdwcnMlXS8udGVzdChkKTtyZXR1cm4gcD1udWxsPT1wP2Q/NjoxMjovW2dwcnNdLy50ZXN0KGQpP01hdGgubWF4KDEsTWF0aC5taW4oMjEscCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAscCkpLG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sbn1mdW5jdGlvbiBlKHQsZSl7dmFyIHI9bigodD1scih0KSx0LnR5cGU9ImYiLHQpKSxpPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKEx2KGUpLzMpKSksbz1NYXRoLnBvdygxMCwtaSksdT1Idls4K2kvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByKG8qdCkrdX19dmFyIHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/cXYodC5ncm91cGluZyx0LnRob3VzYW5kcyk6anYsaT10LmN1cnJlbmN5LG89dC5kZWNpbWFsLHU9dC5udW1lcmFscz9Vdih0Lm51bWVyYWxzKTpqdjtyZXR1cm57Zm9ybWF0Om4sZm9ybWF0UHJlZml4OmV9fTtwcih7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KTt2YXIgVnY9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubWF4KDAsLUx2KE1hdGguYWJzKHQpKSl9LFd2PWZ1bmN0aW9uKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoTHYobikvMykpKS1MdihNYXRoLmFicyh0KSkpfSwkdj1mdW5jdGlvbih0LG4pe3JldHVybiB0PU1hdGguYWJzKHQpLG49TWF0aC5hYnMobiktdCxNYXRoLm1heCgwLEx2KG4pLUx2KHQpKSsxfSxadj1mdW5jdGlvbigpe3JldHVybiBuZXcgZHJ9O2RyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZHIscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXt2cihOXyx0LHRoaXMudCksdnIodGhpcyxOXy5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9Tl8udDp0aGlzLnM9Tl8udH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgR3YsSnYsUXYsS3YsdF8sbl8sZV8scl8saV8sb18sdV8sYV8sY18sc18sZl8sbF8saF8scF8sZF8sdl8sX18sZ18seV8sbV8seF8sYl8sd18sTV8sVF8sa18sU18sTl89bmV3IGRyLEVfPTFlLTYsQV89MWUtMTIsQ189TWF0aC5QSSx6Xz1DXy8yLFBfPUNfLzQsUl89MipDXyxMXz0xODAvQ18scV89Q18vMTgwLFVfPU1hdGguYWJzLERfPU1hdGguYXRhbixPXz1NYXRoLmF0YW4yLEZfPU1hdGguY29zLElfPU1hdGguY2VpbCxZXz1NYXRoLmV4cCxCXz1NYXRoLmxvZyxqXz1NYXRoLnBvdyxIXz1NYXRoLnNpbixYXz1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sVl89TWF0aC5zcXJ0LFdfPU1hdGgudGFuLCRfPXtGZWF0dXJlOmZ1bmN0aW9uKHQsbil7eHIodC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KXhyKGVbcl0uZ2VvbWV0cnksbil9fSxaXz17U3BoZXJlOmZ1bmN0aW9uKHQsbil7bi5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24odCxuKXt0PXQuY29vcmRpbmF0ZXMsbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KXQ9ZVtyXSxuLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2JyKHQuY29vcmRpbmF0ZXMsbiwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylicihlW3JdLG4sMCl9LFBvbHlnb246ZnVuY3Rpb24odCxuKXt3cih0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KXdyKGVbcl0sbil9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10Lmdlb21ldHJpZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl4cihlW3JdLG4pfX0sR189ZnVuY3Rpb24odCxuKXt0JiYkXy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpPyRfW3QudHlwZV0odCxuKTp4cih0LG4pfSxKXz1adigpLFFfPVp2KCksS189e3BvaW50Om1yLGxpbmVTdGFydDptcixsaW5lRW5kOm1yLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0pfLnJlc2V0KCksS18ubGluZVN0YXJ0PU1yLEtfLmxpbmVFbmQ9VHJ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgdD0rSl87UV8uYWRkKHQ8MD9SXyt0OnQpLHRoaXMubGluZVN0YXJ0PXRoaXMubGluZUVuZD10aGlzLnBvaW50PW1yfSxzcGhlcmU6ZnVuY3Rpb24oKXtRXy5hZGQoUl8pfX0sdGc9ZnVuY3Rpb24odCl7cmV0dXJuIFFfLnJlc2V0KCksR18odCxLXyksMipRX30sbmc9WnYoKSxlZz17cG9pbnQ6THIsbGluZVN0YXJ0OlVyLGxpbmVFbmQ6RHIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7ZWcucG9pbnQ9T3IsZWcubGluZVN0YXJ0PUZyLGVnLmxpbmVFbmQ9SXIsbmcucmVzZXQoKSxLXy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0tfLnBvbHlnb25FbmQoKSxlZy5wb2ludD1McixlZy5saW5lU3RhcnQ9VXIsZWcubGluZUVuZD1EcixKXzwwPyhuXz0tKHJfPTE4MCksZV89LShpXz05MCkpOm5nPkVfP2lfPTkwOm5nPC1FXyYmKGVfPS05MCksZl9bMF09bl8sZl9bMV09cl99fSxyZz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLHUsYTtpZihpXz1yXz0tKG5fPWVfPTEvMCksc189W10sR18odCxlZyksZT1zXy5sZW5ndGgpe2ZvcihzXy5zb3J0KEJyKSxuPTEscj1zX1swXSxvPVtyXTtuPGU7KytuKWk9c19bbl0sanIocixpWzBdKXx8anIocixpWzFdKT8oWXIoclswXSxpWzFdKT5ZcihyWzBdLHJbMV0pJiYoclsxXT1pWzFdKSxZcihpWzBdLHJbMV0pPllyKHJbMF0sclsxXSkmJihyWzBdPWlbMF0pKTpvLnB1c2gocj1pKTtmb3IodT0tKDEvMCksZT1vLmxlbmd0aC0xLG49MCxyPW9bZV07bjw9ZTtyPWksKytuKWk9b1tuXSwoYT1ZcihyWzFdLGlbMF0pKT51JiYodT1hLG5fPWlbMF0scl89clsxXSl9cmV0dXJuIHNfPWZfPW51bGwsbl89PT0xLzB8fGVfPT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW25fLGVfXSxbcl8saV9dXX0saWc9e3NwaGVyZTptcixwb2ludDpIcixsaW5lU3RhcnQ6VnIsbGluZUVuZDpacixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtpZy5saW5lU3RhcnQ9R3IsaWcubGluZUVuZD1Kcn0scG9seWdvbkVuZDpmdW5jdGlvbigpe2lnLmxpbmVTdGFydD1WcixpZy5saW5lRW5kPVpyfX0sb2c9ZnVuY3Rpb24odCl7bF89aF89cF89ZF89dl89X189Z189eV89bV89eF89Yl89MCxHXyh0LGlnKTt2YXIgbj1tXyxlPXhfLHI9Yl8saT1uKm4rZSplK3IqcjtyZXR1cm4gaTxBXyYmKG49X18sZT1nXyxyPXlfLGhfPEVfJiYobj1wXyxlPWRfLHI9dl8pLGk9bipuK2UqZStyKnIsaTxBXyk/W05hTixOYU5dOltPXyhlLG4pKkxfLGdyKHIvVl8oaSkpKkxfXX0sdWc9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxhZz1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZT10KGUsciksbihlWzBdLGVbMV0pfXJldHVybiB0LmludmVydCYmbi5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihlLHIpe3JldHVybiBlPW4uaW52ZXJ0KGUsciksZSYmdC5pbnZlcnQoZVswXSxlWzFdKX0pLGV9O3RpLmludmVydD10aTt2YXIgY2csc2csZmcsbGcsaGcscGcsZGcsdmcsX2csZ2cseWcsbWc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbj10KG5bMF0qcV8sblsxXSpxXyksblswXSo9TF8sblsxXSo9TF8sbn1yZXR1cm4gdD1uaSh0WzBdKnFfLHRbMV0qcV8sdC5sZW5ndGg+Mj90WzJdKnFfOjApLG4uaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBuPXQuaW52ZXJ0KG5bMF0qcV8sblsxXSpxXyksblswXSo9TF8sblsxXSo9TF8sbn0sbn0seGc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsbil7ZS5wdXNoKHQ9cih0LG4pKSx0WzBdKj1MXyx0WzFdKj1MX31mdW5jdGlvbiBuKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpxXyxjPXUuYXBwbHkodGhpcyxhcmd1bWVudHMpKnFfO3JldHVybiBlPVtdLHI9bmkoLXRbMF0qcV8sLXRbMV0qcV8sMCkuaW52ZXJ0LG9pKGEsbixjLDEpLHQ9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltlXX0sZT1yPW51bGwsdH12YXIgZSxyLGk9dWcoWzAsMF0pLG89dWcoOTApLHU9dWcoNiksYT17cG9pbnQ6dH07cmV0dXJuIG4uY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dWcoWyt0WzBdLCt0WzFdXSksbik6aX0sbi5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp1ZygrdCksbik6b30sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp1ZygrdCksbik6dX0sbn0sYmc9ZnVuY3Rpb24oKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUpe3QucHVzaChbbixlXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ucHVzaCh0PVtdKX0sbGluZUVuZDptcixyZWpvaW46ZnVuY3Rpb24oKXtuLmxlbmd0aD4xJiZuLnB1c2gobi5wb3AoKS5jb25jYXQobi5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPW47cmV0dXJuIG49W10sdD1udWxsLGV9fX0sd2c9ZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciB1LGE9dFswXSxjPXRbMV0scz1uWzBdLGY9blsxXSxsPTAsaD0xLHA9cy1hLGQ9Zi1jO2lmKHU9ZS1hLHB8fCEodT4wKSl7aWYodS89cCxwPDApe2lmKHU8bClyZXR1cm47dTxoJiYoaD11KX1lbHNlIGlmKHA+MCl7aWYodT5oKXJldHVybjt1PmwmJihsPXUpfWlmKHU9aS1hLHB8fCEodTwwKSl7aWYodS89cCxwPDApe2lmKHU+aClyZXR1cm47dT5sJiYobD11KX1lbHNlIGlmKHA+MCl7aWYodTxsKXJldHVybjt1PGgmJihoPXUpfWlmKHU9ci1jLGR8fCEodT4wKSl7aWYodS89ZCxkPDApe2lmKHU8bClyZXR1cm47dTxoJiYoaD11KX1lbHNlIGlmKGQ+MCl7aWYodT5oKXJldHVybjt1PmwmJihsPXUpfWlmKHU9by1jLGR8fCEodTwwKSl7aWYodS89ZCxkPDApe2lmKHU+aClyZXR1cm47dT5sJiYobD11KX1lbHNlIGlmKGQ+MCl7aWYodTxsKXJldHVybjt1PGgmJihoPXUpfXJldHVybiBsPjAmJih0WzBdPWErbCpwLHRbMV09YytsKmQpLGg8MSYmKG5bMF09YStoKnAsblsxXT1jK2gqZCksITB9fX19fSxNZz1mdW5jdGlvbih0LG4pe3JldHVybiBVXyh0WzBdLW5bMF0pPEVfJiZVXyh0WzFdLW5bMV0pPEVffSxUZz1mdW5jdGlvbih0LG4sZSxyLGkpe3ZhciBvLHUsYT1bXSxjPVtdO2lmKHQuZm9yRWFjaChmdW5jdGlvbih0KXtpZighKChuPXQubGVuZ3RoLTEpPD0wKSl7dmFyIG4sZSxyPXRbMF0sdT10W25dO2lmKE1nKHIsdSkpe2ZvcihpLmxpbmVTdGFydCgpLG89MDtvPG47KytvKWkucG9pbnQoKHI9dFtvXSlbMF0sclsxXSk7cmV0dXJuIHZvaWQgaS5saW5lRW5kKCl9YS5wdXNoKGU9bmV3IGFpKHIsdCxudWxsLCEwKSksYy5wdXNoKGUubz1uZXcgYWkocixudWxsLGUsITEpKSxhLnB1c2goZT1uZXcgYWkodSx0LG51bGwsITEpKSxjLnB1c2goZS5vPW5ldyBhaSh1LG51bGwsZSwhMCkpfX0pLGEubGVuZ3RoKXtmb3IoYy5zb3J0KG4pLGNpKGEpLGNpKGMpLG89MCx1PWMubGVuZ3RoO288dTsrK28pY1tvXS5lPWU9IWU7Zm9yKHZhciBzLGYsbD1hWzBdOzspe2Zvcih2YXIgaD1sLHA9ITA7aC52OylpZigoaD1oLm4pPT09bClyZXR1cm47cz1oLnosaS5saW5lU3RhcnQoKTtkb3tpZihoLnY9aC5vLnY9ITAsaC5lKXtpZihwKWZvcihvPTAsdT1zLmxlbmd0aDtvPHU7KytvKWkucG9pbnQoKGY9c1tvXSlbMF0sZlsxXSk7ZWxzZSByKGgueCxoLm4ueCwxLGkpO2g9aC5ufWVsc2V7aWYocClmb3Iocz1oLnAueixvPXMubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgoZj1zW29dKVswXSxmWzFdKTtlbHNlIHIoaC54LGgucC54LC0xLGkpO2g9aC5wfWg9aC5vLHM9aC56LHA9IXB9d2hpbGUoIWgudik7aS5saW5lRW5kKCl9fX0sa2c9MWU5LFNnPS1rZyxOZz1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPTAsaT0wLG89OTYwLHU9NTAwO3JldHVybiBlPXtzdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHQmJm49PT1lP3Q6dD1zaShyLGksbyx1KShuPWUpfSxleHRlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K2FbMF1bMF0saT0rYVswXVsxXSxvPSthWzFdWzBdLHU9K2FbMV1bMV0sdD1uPW51bGwsZSk6W1tyLGldLFtvLHVdXX19fSxFZz1adigpLEFnPWZ1bmN0aW9uKHQsbil7dmFyIGU9blswXSxyPW5bMV0saT1bSF8oZSksLUZfKGUpLDBdLG89MCx1PTA7RWcucmVzZXQoKTtmb3IodmFyIGE9MCxjPXQubGVuZ3RoO2E8YzsrK2EpaWYoZj0ocz10W2FdKS5sZW5ndGgpZm9yKHZhciBzLGYsbD1zW2YtMV0saD1sWzBdLHA9bFsxXS8yK1BfLGQ9SF8ocCksdj1GXyhwKSxfPTA7XzxmOysrXyxoPXksZD14LHY9YixsPWcpe3ZhciBnPXNbX10seT1nWzBdLG09Z1sxXS8yK1BfLHg9SF8obSksYj1GXyhtKSx3PXktaCxNPXc+PTA/MTotMSxUPU0qdyxrPVQ+Q18sUz1kKng7aWYoRWcuYWRkKE9fKFMqTSpIXyhUKSx2KmIrUypGXyhUKSkpLG8rPWs/dytNKlJfOncsa15oPj1lXnk+PWUpe3ZhciBOPUNyKEVyKGwpLEVyKGcpKTtScihOKTt2YXIgRT1DcihpLE4pO1JyKEUpO3ZhciBBPShrXnc+PTA/LTE6MSkqZ3IoRVsyXSk7KHI+QXx8cj09PUEmJihOWzBdfHxOWzFdKSkmJih1Kz1rXnc+PTA/MTotMSl9fXJldHVybihvPC1FX3x8bzxFXyYmRWc8LUVfKV4xJnV9LENnPVp2KCksemc9e3NwaGVyZTptcixwb2ludDptcixsaW5lU3RhcnQ6ZmksbGluZUVuZDptcixwb2x5Z29uU3RhcnQ6bXIscG9seWdvbkVuZDptcn0sUGc9ZnVuY3Rpb24odCl7cmV0dXJuIENnLnJlc2V0KCksR18odCx6ZyksK0NnfSxSZz1bbnVsbCxudWxsXSxMZz17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6Umd9LHFnPWZ1bmN0aW9uKHQsbil7cmV0dXJuIFJnWzBdPXQsUmdbMV09bixQZyhMZyl9LFVnPXtGZWF0dXJlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGRpKHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkaShlW3JdLmdlb21ldHJ5LG4pKXJldHVybiEwO3JldHVybiExfX0sRGc9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbih0LG4pe3JldHVybiB2aSh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZih2aShlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7cmV0dXJuIF9pKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoX2koZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe3JldHVybiBnaSh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGdpKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10Lmdlb21ldHJpZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkaShlW3JdLG4pKXJldHVybiEwO3JldHVybiExfX0sT2c9ZnVuY3Rpb24odCxuKXtyZXR1cm4odCYmVWcuaGFzT3duUHJvcGVydHkodC50eXBlKT9VZ1t0LnR5cGVdOmRpKSh0LG4pfSxGZz1mdW5jdGlvbih0LG4pe3ZhciBlPXRbMF0qcV8scj10WzFdKnFfLGk9blswXSpxXyxvPW5bMV0qcV8sdT1GXyhyKSxhPUhfKHIpLGM9Rl8obykscz1IXyhvKSxmPXUqRl8oZSksbD11KkhfKGUpLGg9YypGXyhpKSxwPWMqSF8oaSksZD0yKmdyKFZfKHlyKG8tcikrdSpjKnlyKGktZSkpKSx2PUhfKGQpLF89ZD9mdW5jdGlvbih0KXt2YXIgbj1IXyh0Kj1kKS92LGU9SF8oZC10KS92LHI9ZSpmK24qaCxpPWUqbCtuKnAsbz1lKmErbipzO3JldHVybltPXyhpLHIpKkxfLE9fKG8sVl8ocipyK2kqaSkpKkxfXX06ZnVuY3Rpb24oKXtyZXR1cm5bZSpMXyxyKkxfXX07cmV0dXJuIF8uZGlzdGFuY2U9ZCxffSxJZz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sWWc9WnYoKSxCZz1adigpLGpnPXtwb2ludDptcixsaW5lU3RhcnQ6bXIsbGluZUVuZDptcixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtqZy5saW5lU3RhcnQ9VGksamcubGluZUVuZD1OaX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2pnLmxpbmVTdGFydD1qZy5saW5lRW5kPWpnLnBvaW50PW1yLFlnLmFkZChVXyhCZykpLEJnLnJlc2V0KCl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVlnLzI7cmV0dXJuIFlnLnJlc2V0KCksdH19LEhnPTEvMCxYZz1IZyxWZz0tSGcsV2c9VmcsJGc9e3BvaW50OkVpLGxpbmVTdGFydDptcixsaW5lRW5kOm1yLHBvbHlnb25TdGFydDptcixwb2x5Z29uRW5kOm1yLHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbSGcsWGddLFtWZyxXZ11dO3JldHVybiBWZz1XZz0tKFhnPUhnPTEvMCksdH19LFpnPTAsR2c9MCxKZz0wLFFnPTAsS2c9MCx0eT0wLG55PTAsZXk9MCxyeT0wLGl5PXtwb2ludDpBaSxsaW5lU3RhcnQ6Q2ksbGluZUVuZDpSaSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtpeS5saW5lU3RhcnQ9TGksaXkubGluZUVuZD1xaX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2l5LnBvaW50PUFpLGl5LmxpbmVTdGFydD1DaSxpeS5saW5lRW5kPVJpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1yeT9bbnkvcnksZXkvcnldOnR5P1tRZy90eSxLZy90eV06Smc/W1pnL0pnLEdnL0pnXTpbTmFOLE5hTl07cmV0dXJuIFpnPUdnPUpnPVFnPUtnPXR5PW55PWV5PXJ5PTAsdH19O09pLnByb3RvdHlwZT17X3JhZGl1czo0LjUscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1cz10LHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTticmVhaztkZWZhdWx0OnRoaXMuX2NvbnRleHQubW92ZVRvKHQrdGhpcy5fcmFkaXVzLG4pLHRoaXMuX2NvbnRleHQuYXJjKHQsbix0aGlzLl9yYWRpdXMsMCxSXyl9fSxyZXN1bHQ6bXJ9O3ZhciBveSx1eSxheSxjeSxzeSxmeT1adigpLGx5PXtwb2ludDptcixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtseS5wb2ludD1GaX0sbGluZUVuZDpmdW5jdGlvbigpe295JiZJaSh1eSxheSksbHkucG9pbnQ9bXJ9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe295PSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7b3k9bnVsbH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9K2Z5O3JldHVybiBmeS5yZXNldCgpLHR9fTtZaS5wcm90b3R5cGU9e19jaXJjbGU6QmkoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2lyY2xlPUJpKHQpLHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX3N0cmluZy5wdXNoKCJaIiksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3N0cmluZy5wdXNoKCJNIix0LCIsIixuKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9zdHJpbmcucHVzaCgiTCIsdCwiLCIsbik7YnJlYWs7ZGVmYXVsdDp0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH19fTt2YXIgaHk9ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMoK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxHXyh0LHIoaSkpKSxpLnJlc3VsdCgpfXZhciByLGksbz00LjU7cmV0dXJuIGUuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gR18odCxyKGpnKSksamcucmVzdWx0KCl9LGUubWVhc3VyZT1mdW5jdGlvbih0KXtyZXR1cm4gR18odCxyKGx5KSksbHkucmVzdWx0KCl9LGUuYm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiBHXyh0LHIoJGcpKSwkZy5yZXN1bHQoKX0sZS5jZW50cm9pZD1mdW5jdGlvbih0KXtyZXR1cm4gR18odCxyKGl5KSksaXkucmVzdWx0KCl9LGUucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uPyh0PW51bGwsSWcpOih0PW4pLnN0cmVhbSxlKTp0fSxlLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD8obj1udWxsLG5ldyBZaSk6bmV3IE9pKG49dCksImZ1bmN0aW9uIiE9dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMobyksZSk6bn0sZS5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksZSk6b30sZS5wcm9qZWN0aW9uKHQpLmNvbnRleHQobil9LHB5PWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHUobixlKXt2YXIgcj1pKG4sZSk7dChuPXJbMF0sZT1yWzFdKSYmby5wb2ludChuLGUpfWZ1bmN0aW9uIGEodCxuKXt2YXIgZT1pKHQsbik7Xy5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGMoKXtiLnBvaW50PWEsXy5saW5lU3RhcnQoKX1mdW5jdGlvbiBzKCl7Yi5wb2ludD11LF8ubGluZUVuZCgpfWZ1bmN0aW9uIGYodCxuKXt2LnB1c2goW3Qsbl0pO3ZhciBlPWkodCxuKTttLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gbCgpe20ubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlvbiBoKCl7Zih2WzBdWzBdLHZbMF1bMV0pLG0ubGluZUVuZCgpO3ZhciB0LG4sZSxyLGk9bS5jbGVhbigpLHU9eS5yZXN1bHQoKSxhPXUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxhKWlmKDEmaSl7aWYoZT11WzBdLChuPWUubGVuZ3RoLTEpPjApe2Zvcih4fHwoby5wb2x5Z29uU3RhcnQoKSx4PSEwKSxvLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KW8ucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7by5saW5lRW5kKCl9fWVsc2UgYT4xJiYyJmkmJnUucHVzaCh1LnBvcCgpLmNvbmNhdCh1LnNoaWZ0KCkpKSxkLnB1c2godS5maWx0ZXIoamkpKX12YXIgcCxkLHYsXz1uKG8pLGc9aS5pbnZlcnQoclswXSxyWzFdKSx5PWJnKCksbT1uKHkpLHg9ITEsYj17cG9pbnQ6dSxsaW5lU3RhcnQ6YyxsaW5lRW5kOnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Yi5wb2ludD1mLGIubGluZVN0YXJ0PWwsYi5saW5lRW5kPWgsZD1bXSxwPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Yi5wb2ludD11LGIubGluZVN0YXJ0PWMsYi5saW5lRW5kPXMsZD1oZihkKTt2YXIgdD1BZyhwLGcpO2QubGVuZ3RoPyh4fHwoby5wb2x5Z29uU3RhcnQoKSx4PSEwKSxUZyhkLEhpLHQsZSxvKSk6dCYmKHh8fChvLnBvbHlnb25TdGFydCgpLHg9ITApLG8ubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSkseCYmKG8ucG9seWdvbkVuZCgpLHg9ITEpLGQ9cD1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtvLnBvbHlnb25TdGFydCgpLG8ubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSxvLnBvbHlnb25FbmQoKX19O3JldHVybiBifX0sZHk9cHkoZnVuY3Rpb24oKXtyZXR1cm4hMH0sWGksV2ksWy1DXywtel9dKSx2eT1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoZSxyLGksbyl7b2kobyx0LG4saSxlLHIpfWZ1bmN0aW9uIHIodCxuKXtyZXR1cm4gRl8odCkqRl8obik+YX1mdW5jdGlvbiBpKHQpe3ZhciBuLGUsaSxhLGY7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2E9aT0hMSxmPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIHAsZD1bbCxoXSx2PXIobCxoKSxfPWM/dj8wOnUobCxoKTp2P3UobCsobDwwP0NfOi1DXyksaCk6MDtpZighbiYmKGE9aT12KSYmdC5saW5lU3RhcnQoKSx2IT09aSYmKHA9byhuLGQpLChNZyhuLHApfHxNZyhkLHApKSYmKGRbMF0rPUVfLGRbMV0rPUVfLHY9cihkWzBdLGRbMV0pKSksdiE9PWkpZj0wLHY/KHQubGluZVN0YXJ0KCkscD1vKGQsbiksdC5wb2ludChwWzBdLHBbMV0pKToocD1vKG4sZCksdC5wb2ludChwWzBdLHBbMV0pLHQubGluZUVuZCgpKSxuPXA7ZWxzZSBpZihzJiZuJiZjXnYpe3ZhciBnO18mZXx8IShnPW8oZCxuLCEwKSl8fChmPTAsYz8odC5saW5lU3RhcnQoKSx0LnBvaW50KGdbMF1bMF0sZ1swXVsxXSksdC5wb2ludChnWzFdWzBdLGdbMV1bMV0pLHQubGluZUVuZCgpKToodC5wb2ludChnWzFdWzBdLGdbMV1bMV0pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChnWzBdWzBdLGdbMF1bMV0pKSl9IXZ8fG4mJk1nKG4sZCl8fHQucG9pbnQoZFswXSxkWzFdKSxuPWQsaT12LGU9X30sbGluZUVuZDpmdW5jdGlvbigpe2kmJnQubGluZUVuZCgpLG49bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gZnwoYSYmaSk8PDF9fX1mdW5jdGlvbiBvKHQsbixlKXt2YXIgcj1Fcih0KSxpPUVyKG4pLG89WzEsMCwwXSx1PUNyKHIsaSksYz1Bcih1LHUpLHM9dVswXSxmPWMtcypzO2lmKCFmKXJldHVybiFlJiZ0O3ZhciBsPWEqYy9mLGg9LWEqcy9mLHA9Q3Iobyx1KSxkPVByKG8sbCk7enIoZCxQcih1LGgpKTt2YXIgdj1wLF89QXIoZCx2KSxnPUFyKHYsdikseT1fKl8tZyooQXIoZCxkKS0xKTtpZighKHk8MCkpe3ZhciBtPVZfKHkpLHg9UHIodiwoLV8tbSkvZyk7aWYoenIoeCxkKSx4PU5yKHgpLCFlKXJldHVybiB4O3ZhciBiLHc9dFswXSxNPW5bMF0sVD10WzFdLGs9blsxXTtNPHcmJihiPXcsdz1NLE09Yik7dmFyIFM9TS13LE49VV8oUy1DXyk8RV8sRT1OfHxTPEVfO2lmKCFOJiZrPFQmJihiPVQsVD1rLGs9YiksRT9OP1Qraz4wXnhbMV08KFVfKHhbMF0tdyk8RV8/VDprKTpUPD14WzFdJiZ4WzFdPD1rOlM+Q19eKHc8PXhbMF0mJnhbMF08PU0pKXt2YXIgQT1Qcih2LCgtXyttKS9nKTtyZXR1cm4genIoQSxkKSxbeCxOcihBKV19fX1mdW5jdGlvbiB1KG4sZSl7dmFyIHI9Yz90OkNfLXQsaT0wO3JldHVybiBuPC1yP2l8PTE6bj5yJiYoaXw9MiksZTwtcj9pfD00OmU+ciYmKGl8PTgpLGl9dmFyIGE9Rl8odCksYz1hPjAscz1VXyhhKT5FXztyZXR1cm4gcHkocixpLGUsYz9bMCwtdF06Wy1DXyx0LUNfXSl9LF95PWZ1bmN0aW9uKHQpe3JldHVybntzdHJlYW06JGkodCl9fTtaaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlppLHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5zdHJlYW0ucG9pbnQodCxuKX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19O3ZhciBneT0xNix5eT1GXygzMCpxXyksbXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4rbj9LaSh0LG4pOlFpKHQpfSx4eT0kaSh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KnFfLG4qcV8pfX0pLGJ5PWZ1bmN0aW9uKCl7cmV0dXJuIGVvKGlvKS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfSx3eT1mdW5jdGlvbigpe3JldHVybiBieSgpLnBhcmFsbGVscyhbMjkuNSw0NS41XSkuc2NhbGUoMTA3MCkudHJhbnNsYXRlKFs0ODAsMjUwXSkucm90YXRlKFs5NiwwXSkuY2VudGVyKFstLjYsMzguN10pfSxNeT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG49dFswXSxlPXRbMV07cmV0dXJuIGE9bnVsbCxpLnBvaW50KG4sZSksYXx8KG8ucG9pbnQobixlKSxhKXx8KHUucG9pbnQobixlKSxhKX1mdW5jdGlvbiBuKCl7cmV0dXJuIGU9cj1udWxsLHR9dmFyIGUscixpLG8sdSxhLGM9d3koKSxzPWJ5KCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxmPWJ5KCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGw9e3BvaW50OmZ1bmN0aW9uKHQsbil7YT1bdCxuXX19O3JldHVybiB0LmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1jLnNjYWxlKCksZT1jLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND9zOmk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjpjKS5pbnZlcnQodCl9LHQuc3RyZWFtPWZ1bmN0aW9uKHQpe3JldHVybiBlJiZyPT09dD9lOmU9b28oW2Muc3RyZWFtKHI9dCkscy5zdHJlYW0odCksZi5zdHJlYW0odCldKX0sdC5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGMucHJlY2lzaW9uKHQpLHMucHJlY2lzaW9uKHQpLGYucHJlY2lzaW9uKHQpLG4oKSk6Yy5wcmVjaXNpb24oKX0sdC5zY2FsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYy5zY2FsZShuKSxzLnNjYWxlKC4zNSpuKSxmLnNjYWxlKG4pLHQudHJhbnNsYXRlKGMudHJhbnNsYXRlKCkpKTpjLnNjYWxlKCl9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBjLnRyYW5zbGF0ZSgpO3ZhciBlPWMuc2NhbGUoKSxyPSt0WzBdLGE9K3RbMV07cmV0dXJuIGk9Yy50cmFuc2xhdGUodCkuY2xpcEV4dGVudChbW3ItLjQ1NSplLGEtLjIzOCplXSxbcisuNDU1KmUsYSsuMjM4KmVdXSkuc3RyZWFtKGwpLG89cy50cmFuc2xhdGUoW3ItLjMwNyplLGErLjIwMSplXSkuY2xpcEV4dGVudChbW3ItLjQyNSplK0VfLGErLjEyKmUrRV9dLFtyLS4yMTQqZS1FXyxhKy4yMzQqZS1FX11dKS5zdHJlYW0obCksdT1mLnRyYW5zbGF0ZShbci0uMjA1KmUsYSsuMjEyKmVdKS5jbGlwRXh0ZW50KFtbci0uMjE0KmUrRV8sYSsuMTY2KmUrRV9dLFtyLS4xMTUqZS1FXyxhKy4yMzQqZS1FX11dKS5zdHJlYW0obCksbigpfSx0LmZpdEV4dGVudD1mdW5jdGlvbihuLGUpe3JldHVybiBHaSh0LG4sZSl9LHQuZml0U2l6ZT1mdW5jdGlvbihuLGUpe3JldHVybiBKaSh0LG4sZSl9LHQuc2NhbGUoMTA3MCl9LFR5PXVvKGZ1bmN0aW9uKHQpe3JldHVybiBWXygyLygxK3QpKX0pO1R5LmludmVydD1hbyhmdW5jdGlvbih0KXtyZXR1cm4gMipncih0LzIpfSk7dmFyIGt5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKFR5KS5zY2FsZSgxMjQuNzUpLmNsaXBBbmdsZSgxNzkuOTk5KX0sU3k9dW8oZnVuY3Rpb24odCl7cmV0dXJuKHQ9X3IodCkpJiZ0L0hfKHQpfSk7U3kuaW52ZXJ0PWFvKGZ1bmN0aW9uKHQpe3JldHVybiB0fSk7dmFyIE55PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKFN5KS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9O2NvLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0LDIqRF8oWV8obikpLXpfXX07dmFyIEV5PWZ1bmN0aW9uKCl7cmV0dXJuIHNvKGNvKS5zY2FsZSg5NjEvUl8pfSxBeT1mdW5jdGlvbigpe3JldHVybiBlbyhsbykuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX07aG8uaW52ZXJ0PWhvO3ZhciBDeT1mdW5jdGlvbigpe3JldHVybiB0byhobykuc2NhbGUoMTUyLjYzKX0senk9ZnVuY3Rpb24oKXtyZXR1cm4gZW8ocG8pLnNjYWxlKDEzMS4xNTQpLmNlbnRlcihbMCwxMy45Mzg5XSl9O3ZvLmludmVydD1hbyhEXyk7dmFyIFB5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKHZvKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSxSeT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gaT1vPW51bGwsdX12YXIgbixlLHIsaSxvLHUsYT0xLGM9MCxzPTAsZj0xLGw9MSxoPUlnLHA9bnVsbCxkPUlnO3JldHVybiB1PXtzdHJlYW06ZnVuY3Rpb24odCl7cmV0dXJuIGkmJm89PT10P2k6aT1oKGQobz10KSl9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9bnVsbD09aT8ocD1uPWU9cj1udWxsLElnKTpzaShwPStpWzBdWzBdLG49K2lbMF1bMV0sZT0raVsxXVswXSxyPStpWzFdWzFdKSx0KCkpOm51bGw9PXA/bnVsbDpbW3Asbl0sW2Uscl1dfSxzY2FsZTpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1fbygoYT0rbikqZixhKmwsYyxzKSx0KCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1fbyhhKmYsYSpsLGM9K25bMF0scz0rblsxXSksdCgpKTpbYyxzXX0scmVmbGVjdFg6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9X28oYSooZj1uPy0xOjEpLGEqbCxjLHMpLHQoKSk6ZjwwfSxyZWZsZWN0WTpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1fbyhhKmYsYSoobD1uPy0xOjEpLGMscyksdCgpKTpsPDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LG4pe3JldHVybiBHaSh1LHQsbil9LGZpdFNpemU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gSmkodSx0LG4pfX19O2dvLmludmVydD1hbyhncik7dmFyIEx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKGdvKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwK0VfKX07eW8uaW52ZXJ0PWFvKGZ1bmN0aW9uKHQpe3JldHVybiAyKkRfKHQpfSk7dmFyIHF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKHlvKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfTttby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bLW4sMipEXyhZXyh0KSktel9dfTt2YXIgVXk9ZnVuY3Rpb24oKXt2YXIgdD1zbyhtbyksbj10LmNlbnRlcixlPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKFstdFsxXSx0WzBdXSk6KHQ9bigpLFt0WzFdLC10WzBdXSl9LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKToodD1lKCksW3RbMF0sdFsxXSx0WzJdLTkwXSl9LGUoWzAsMCw5MF0pLnNjYWxlKDE1OS4xNTUpfSxEeT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG8sdT0wO3QuZWFjaEFmdGVyKGZ1bmN0aW9uKHQpe3ZhciBlPXQuY2hpbGRyZW47ZT8odC54PWJvKGUpLHQueT1NbyhlKSk6KHQueD1vP3UrPW4odCxvKTowLHQueT0wLG89dCl9KTt2YXIgYT1rbyh0KSxjPVNvKHQpLHM9YS54LW4oYSxjKS8yLGY9Yy54K24oYyxhKS8yO3JldHVybiB0LmVhY2hBZnRlcihpP2Z1bmN0aW9uKG4pe24ueD0obi54LXQueCkqZSxuLnk9KHQueS1uLnkpKnJ9OmZ1bmN0aW9uKG4pe24ueD0obi54LXMpLyhmLXMpKmUsbi55PSgxLSh0Lnk/bi55L3QueToxKSkqcn0pfXZhciBuPXhvLGU9MSxyPTEsaT0hMTtyZXR1cm4gdC5zZXBhcmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSExLGU9K25bMF0scj0rblsxXSx0KTppP251bGw6W2Uscl19LHQubm9kZVNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITAsZT0rblswXSxyPStuWzFdLHQpOmk/W2Uscl06bnVsbH0sdH0sT3k9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoTm8pfSxGeT1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsdT1bb107ZG8gZm9yKG49dS5yZXZlcnNlKCksdT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKXUucHVzaChlW3JdKTt3aGlsZSh1Lmxlbmd0aCk7cmV0dXJuIHRoaXN9LEl5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dGhpcyxpPVtyXTtyPWkucG9wKCk7KWlmKHQociksbj1yLmNoaWxkcmVuKWZvcihlPW4ubGVuZ3RoLTE7ZT49MDstLWUpaS5wdXNoKG5bZV0pO3JldHVybiB0aGlzfSxZeT1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSx1PVtdO2k9by5wb3AoKTspaWYodS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPXUucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LEJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hBZnRlcihmdW5jdGlvbihuKXtmb3IodmFyIGU9K3Qobi5kYXRhKXx8MCxyPW4uY2hpbGRyZW4saT1yJiZyLmxlbmd0aDstLWk+PTA7KWUrPXJbaV0udmFsdWU7bi52YWx1ZT1lfSl9LGp5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LEh5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLGU9RW8obix0KSxyPVtuXTtuIT09ZTspbj1uLnBhcmVudCxyLnB1c2gobik7Zm9yKHZhciBpPXIubGVuZ3RoO3QhPT1lOylyLnNwbGljZShpLDAsdCksdD10LnBhcmVudDtyZXR1cm4gcn0sWHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxuPVt0XTt0PXQucGFyZW50OyluLnB1c2godCk7cmV0dXJuIG59LFZ5PWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt0LnB1c2gobil9KSx0fSxXeT1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sJHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59O0xvLnByb3RvdHlwZT1Bby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkxvLGNvdW50Ok95LGVhY2g6RnksZWFjaEFmdGVyOll5LGVhY2hCZWZvcmU6SXksc3VtOkJ5LHNvcnQ6ankscGF0aDpIeSxhbmNlc3RvcnM6WHksZGVzY2VuZGFudHM6VnksbGVhdmVzOld5LGxpbmtzOiR5LGNvcHk6Q299O3ZhciBaeT1mdW5jdGlvbih0KXtmb3IodmFyIG4sZT0odD10LnNsaWNlKCkpLmxlbmd0aCxyPW51bGwsaT1yO2U7KXt2YXIgbz1uZXcgcW8odFtlLTFdKTtpPWk/aS5uZXh0PW86cj1vLHRbbl09dFstLWVdfXJldHVybntoZWFkOnIsdGFpbDppfX0sR3k9ZnVuY3Rpb24odCl7cmV0dXJuIERvKFp5KHQpLFtdKX0sSnk9ZnVuY3Rpb24odCl7cmV0dXJuIFZvKHQpLHR9LFF5PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sS3k9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0Lng9ZS8yLHQueT1yLzIsbj90LmVhY2hCZWZvcmUoSm8obikpLmVhY2hBZnRlcihRbyhpLC41KSkuZWFjaEJlZm9yZShLbygxKSk6dC5lYWNoQmVmb3JlKEpvKEdvKSkuZWFjaEFmdGVyKFFvKFpvLDEpKS5lYWNoQWZ0ZXIoUW8oaSx0LnIvTWF0aC5taW4oZSxyKSkpLmVhY2hCZWZvcmUoS28oTWF0aC5taW4oZSxyKS8oMip0LnIpKSksdH12YXIgbj1udWxsLGU9MSxyPTEsaT1abztyZXR1cm4gdC5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49V28oZSksdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPStuWzBdLHI9K25bMV0sdCk6W2Uscl19LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlF5KCtuKSx0KTppfSx0fSx0bT1mdW5jdGlvbih0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9LG5tPWZ1bmN0aW9uKHQsbixlLHIsaSl7Zm9yKHZhciBvLHU9dC5jaGlsZHJlbixhPS0xLGM9dS5sZW5ndGgscz10LnZhbHVlJiYoci1uKS90LnZhbHVlOysrYTxjOylvPXVbYV0sby55MD1lLG8ueTE9aSxvLngwPW4sby54MT1uKz1vLnZhbHVlKnN9LGVtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgdT10LmhlaWdodCsxO3JldHVybiB0LngwPXQueTA9aSx0LngxPWUsdC55MT1yL3UsdC5lYWNoQmVmb3JlKG4ocix1KSksbyYmdC5lYWNoQmVmb3JlKHRtKSx0fWZ1bmN0aW9uIG4odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZS5jaGlsZHJlbiYmbm0oZSxlLngwLHQqKGUuZGVwdGgrMSkvbixlLngxLHQqKGUuZGVwdGgrMikvbik7dmFyIHI9ZS54MCxvPWUueTAsdT1lLngxLWksYT1lLnkxLWk7dTxyJiYocj11PShyK3UpLzIpLGE8byYmKG89YT0obythKS8yKSxlLngwPXIsZS55MD1vLGUueDE9dSxlLnkxPWF9fXZhciBlPTEscj0xLGk9MCxvPSExO3JldHVybiB0LnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhbix0KTpvfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K25bMF0scj0rblsxXSx0KTpbZSxyXX0sdC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStuLHQpOml9LHR9LHJtPSIkIixpbT17ZGVwdGg6LTF9LG9tPXt9LHVtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgcixpLG8sdSxhLGMscyxmPXQubGVuZ3RoLGw9bmV3IEFycmF5KGYpLGg9e307Zm9yKGk9MDtpPGY7KytpKXI9dFtpXSxhPWxbaV09bmV3IExvKHIpLG51bGwhPShjPW4ocixpLHQpKSYmKGMrPSIiKSYmKHM9cm0rKGEuaWQ9YyksaFtzXT1zIGluIGg/b206YSk7Zm9yKGk9MDtpPGY7KytpKWlmKGE9bFtpXSxjPWUodFtpXSxpLHQpLG51bGwhPWMmJihjKz0iIikpe2lmKHU9aFtybStjXSwhdSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrYyk7aWYodT09PW9tKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2MpO3UuY2hpbGRyZW4/dS5jaGlsZHJlbi5wdXNoKGEpOnUuY2hpbGRyZW49W2FdLGEucGFyZW50PXV9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPWF9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9aW0sby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLWZ9KS5lYWNoQmVmb3JlKFJvKSxvLnBhcmVudD1udWxsLGY+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99dmFyIG49dHUsZT1udTtyZXR1cm4gdC5pZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0kbyhlKSx0KTpufSx0LnBhcmVudElkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSRvKG4pLHQpOmV9LHR9O2N1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKExvLnByb3RvdHlwZSk7dmFyIGFtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgcj1zdSh0KTtpZihyLmVhY2hBZnRlcihuKSxyLnBhcmVudC5tPS1yLnosci5lYWNoQmVmb3JlKGUpLGMpdC5lYWNoQmVmb3JlKGkpO2Vsc2V7dmFyIHM9dCxmPXQsbD10O3QuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8cy54JiYocz10KSx0Lng+Zi54JiYoZj10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9cz09PWY/MTpvKHMsZikvMixwPWgtcy54LGQ9dS8oZi54K2grcCksdj1hLyhsLmRlcHRofHwxKTt0LmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrcCkqZCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIHR9ZnVuY3Rpb24gbih0KXt2YXIgbj10LmNoaWxkcmVuLGU9dC5wYXJlbnQuY2hpbGRyZW4saT10Lmk/ZVt0LmktMV06bnVsbDtpZihuKXt1dSh0KTt2YXIgdT0oblswXS56K25bbi5sZW5ndGgtMV0ueikvMjtpPyh0Lno9aS56K28odC5fLGkuXyksdC5tPXQuei11KTp0Lno9dX1lbHNlIGkmJih0Lno9aS56K28odC5fLGkuXykpO3QucGFyZW50LkE9cih0LGksdC5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gZSh0KXt0Ll8ueD10LnordC5wYXJlbnQubSx0Lm0rPXQucGFyZW50Lm19ZnVuY3Rpb24gcih0LG4sZSl7aWYobil7Zm9yKHZhciByLGk9dCx1PXQsYT1uLGM9aS5wYXJlbnQuY2hpbGRyZW5bMF0scz1pLm0sZj11Lm0sbD1hLm0saD1jLm07YT1pdShhKSxpPXJ1KGkpLGEmJmk7KWM9cnUoYyksdT1pdSh1KSx1LmE9dCxyPWEueitsLWkuei1zK28oYS5fLGkuXykscj4wJiYob3UoYXUoYSx0LGUpLHQscikscys9cixmKz1yKSxsKz1hLm0scys9aS5tLGgrPWMubSxmKz11Lm07YSYmIWl1KHUpJiYodS50PWEsdS5tKz1sLWYpLGkmJiFydShjKSYmKGMudD1pLGMubSs9cy1oLGU9dCl9cmV0dXJuIGV9ZnVuY3Rpb24gaSh0KXt0LngqPXUsdC55PXQuZGVwdGgqYX12YXIgbz1ldSx1PTEsYT0xLGM9bnVsbDtyZXR1cm4gdC5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sdCk6b30sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSExLHU9K25bMF0sYT0rblsxXSx0KTpjP251bGw6W3UsYV19LHQubm9kZVNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ITAsdT0rblswXSxhPStuWzFdLHQpOmM/W3UsYV06bnVsbH0sdH0sY209ZnVuY3Rpb24odCxuLGUscixpKXtmb3IodmFyIG8sdT10LmNoaWxkcmVuLGE9LTEsYz11Lmxlbmd0aCxzPXQudmFsdWUmJihpLWUpL3QudmFsdWU7KythPGM7KW89dVthXSxvLngwPW4sby54MT1yLG8ueTA9ZSxvLnkxPWUrPW8udmFsdWUqc30sc209KDErTWF0aC5zcXJ0KDUpKS8yLGZtPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe2Z1KG4sdCxlLHIsaSxvKX1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfShzbSksbG09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0LngwPXQueTA9MCx0LngxPWksdC55MT1vLHQuZWFjaEJlZm9yZShuKSx1PVswXSxyJiZ0LmVhY2hCZWZvcmUodG0pLHR9ZnVuY3Rpb24gbih0KXt2YXIgbj11W3QuZGVwdGhdLHI9dC54MCtuLGk9dC55MCtuLG89dC54MS1uLGg9dC55MS1uO288ciYmKHI9bz0ocitvKS8yKSxoPGkmJihpPWg9KGkraCkvMiksdC54MD1yLHQueTA9aSx0LngxPW8sdC55MT1oLHQuY2hpbGRyZW4mJihuPXVbdC5kZXB0aCsxXT1hKHQpLzIscis9bCh0KS1uLGkrPWModCktbixvLT1zKHQpLW4saC09Zih0KS1uLG88ciYmKHI9bz0ocitvKS8yKSxoPGkmJihpPWg9KGkraCkvMiksZSh0LHIsaSxvLGgpKX12YXIgZT1mbSxyPSExLGk9MSxvPTEsdT1bMF0sYT1abyxjPVpvLHM9Wm8sZj1abyxsPVpvO3JldHVybiB0LnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSEhbix0KTpyfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K25bMF0sbz0rblsxXSx0KTpbaSxvXX0sdC50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSRvKG4pLHQpOmV9LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LnBhZGRpbmdJbm5lcihuKS5wYWRkaW5nT3V0ZXIobik6dC5wYWRkaW5nSW5uZXIoKX0sdC5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpReSgrbiksdCk6YX0sdC5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5wYWRkaW5nVG9wKG4pLnBhZGRpbmdSaWdodChuKS5wYWRkaW5nQm90dG9tKG4pLnBhZGRpbmdMZWZ0KG4pOnQucGFkZGluZ1RvcCgpfSx0LnBhZGRpbmdUb3A9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpReSgrbiksdCk6Y30sdC5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpReSgrbiksdCk6c30sdC5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UXkoK24pLHQpOmZ9LHQucGFkZGluZ0xlZnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpReSgrbiksdCk6bH0sdH0saG09ZnVuY3Rpb24odCxuLGUscixpKXtmdW5jdGlvbiBvKHQsbixlLHIsaSx1LGEpe2lmKHQ+PW4tMSl7dmFyIHM9Y1t0XTtyZXR1cm4gcy54MD1yLHMueTA9aSxzLngxPXUscy55MT1hLHZvaWQgMH1mb3IodmFyIGw9Zlt0XSxoPWUvMitsLHA9dCsxLGQ9bi0xO3A8ZDspe3ZhciB2PXArZD4+PjE7Zlt2XTxoP3A9disxOmQ9dn12YXIgXz1mW3BdLWwsZz1lLV87aWYoYS1pPnUtcil7dmFyIHk9KGkqZythKl8pL2U7byh0LHAsXyxyLGksdSx5KSxvKHAsbixnLHIseSx1LGEpfWVsc2V7dmFyIG09KHIqZyt1Kl8pL2U7byh0LHAsXyxyLGksbSxhKSxvKHAsbixnLG0saSx1LGEpfX12YXIgdSxhLGM9dC5jaGlsZHJlbixzPWMubGVuZ3RoLGY9bmV3IEFycmF5KHMrMSk7Zm9yKGZbMF09YT11PTA7dTxzOysrdSlmW3UrMV09YSs9Y1t1XS52YWx1ZTtvKDAscyx0LnZhbHVlLG4sZSxyLGkpfSxwbT1mdW5jdGlvbih0LG4sZSxyLGkpeygxJnQuZGVwdGg/Y206bm0pKHQsbixlLHIsaSl9LGRtPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe2lmKCh1PXQuX3NxdWFyaWZ5KSYmdS5yYXRpbz09PW4pZm9yKHZhciB1LGEsYyxzLGYsbD0tMSxoPXUubGVuZ3RoLHA9dC52YWx1ZTsrK2w8aDspe2ZvcihhPXVbbF0sYz1hLmNoaWxkcmVuLHM9YS52YWx1ZT0wLGY9Yy5sZW5ndGg7czxmOysrcylhLnZhbHVlKz1jW3NdLnZhbHVlO2EuZGljZT9ubShhLGUscixpLHIrPShvLXIpKmEudmFsdWUvcCk6Y20oYSxlLHIsZSs9KGktZSkqYS52YWx1ZS9wLG8pLHAtPWEudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT11PWZ1KG4sdCxlLHIsaSxvKSx1LnJhdGlvPW59cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oc20pLHZtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLHI9dC5sZW5ndGgsaT10W3ItMV0sbz0wOysrZTxyOyluPWksaT10W2VdLG8rPW5bMV0qaVswXS1uWzBdKmlbMV07cmV0dXJuIG8vMgp9LF9tPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9LTEsaT10Lmxlbmd0aCxvPTAsdT0wLGE9dFtpLTFdLGM9MDsrK3I8aTspbj1hLGE9dFtyXSxjKz1lPW5bMF0qYVsxXS1hWzBdKm5bMV0sbys9KG5bMF0rYVswXSkqZSx1Kz0oblsxXSthWzFdKSplO3JldHVybiBjKj0zLFtvL2MsdS9jXX0sZ209ZnVuY3Rpb24odCxuLGUpe3JldHVybihuWzBdLXRbMF0pKihlWzFdLXRbMV0pLShuWzFdLXRbMV0pKihlWzBdLXRbMF0pfSx5bT1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KGx1KSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1odShyKSx1PWh1KGkpLGE9dVswXT09PW9bMF0sYz11W3UubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxzPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pcy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSthO248dS5sZW5ndGgtYzsrK24pcy5wdXNoKHRbclt1W25dXVsyXV0pO3JldHVybiBzfSxtbT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sdT1uWzBdLGE9blsxXSxjPW9bMF0scz1vWzFdLGY9ITEsbD0wO2w8aTsrK2wpbz10W2xdLGU9b1swXSxyPW9bMV0scj5hIT1zPmEmJnU8KGMtZSkqKGEtcikvKHMtcikrZSYmKGY9IWYpLGM9ZSxzPXI7cmV0dXJuIGZ9LHhtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9LTEsaT10Lmxlbmd0aCxvPXRbaS0xXSx1PW9bMF0sYT1vWzFdLGM9MDsrK3I8aTspbj11LGU9YSxvPXRbcl0sdT1vWzBdLGE9b1sxXSxuLT11LGUtPWEsYys9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBjfSxibT1bXS5zbGljZSx3bT17fTtwdS5wcm90b3R5cGU9bXUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpwdSxkZWZlcjpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8dGhpcy5fY2FsbCl0aHJvdyBuZXcgRXJyb3I7aWYobnVsbCE9dGhpcy5fZXJyb3IpcmV0dXJuIHRoaXM7dmFyIG49Ym0uY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIG4ucHVzaCh0KSwrK3RoaXMuX3dhaXRpbmcsdGhpcy5fdGFza3MucHVzaChuKSxkdSh0aGlzKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLl9lcnJvciYmZ3UodGhpcyxuZXcgRXJyb3IoImFib3J0IikpLHRoaXN9LGF3YWl0OmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0aGlzLl9jYWxsKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy5fY2FsbD1mdW5jdGlvbihuLGUpe3QuYXBwbHkobnVsbCxbbl0uY29uY2F0KGUpKX0seXUodGhpcyksdGhpc30sYXdhaXRBbGw6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHRoaXMuX2NhbGwpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLl9jYWxsPXQseXUodGhpcyksdGhpc319O3ZhciBNbT1mdW5jdGlvbih0LG4pe3JldHVybiB0PW51bGw9PXQ/MDordCxuPW51bGw9PW4/MTorbiwxPT09YXJndW1lbnRzLmxlbmd0aD8obj10LHQ9MCk6bi09dCxmdW5jdGlvbigpe3JldHVybiBNYXRoLnJhbmRvbSgpKm4rdH19LFRtPWZ1bmN0aW9uKHQsbil7dmFyIGUscjtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sZnVuY3Rpb24oKXt2YXIgaTtpZihudWxsIT1lKWk9ZSxlPW51bGw7ZWxzZSBkbyBlPTIqTWF0aC5yYW5kb20oKS0xLGk9MipNYXRoLnJhbmRvbSgpLTEscj1lKmUraSppO3doaWxlKCFyfHxyPjEpO3JldHVybiB0K24qaSpNYXRoLnNxcnQoLTIqTWF0aC5sb2cocikvcil9fSxrbT1mdW5jdGlvbigpe3ZhciB0PVRtLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19LFNtPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgbj0wLGU9MDtlPHQ7KytlKW4rPU1hdGgucmFuZG9tKCk7cmV0dXJuIG59fSxObT1mdW5jdGlvbih0KXt2YXIgbj1TbSh0KTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbigpL3R9fSxFbT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1NYXRoLnJhbmRvbSgpKS90fX0sQW09ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKHQpe3ZhciBuLGU9cy5zdGF0dXM7aWYoIWUmJmJ1KHMpfHxlPj0yMDAmJmU8MzAwfHwzMDQ9PT1lKXtpZihvKXRyeXtuPW8uY2FsbChyLHMpfWNhdGNoKHQpe3JldHVybiB2b2lkIGEuY2FsbCgiZXJyb3IiLHIsdCl9ZWxzZSBuPXM7YS5jYWxsKCJsb2FkIixyLG4pfWVsc2UgYS5jYWxsKCJlcnJvciIscix0KX12YXIgcixpLG8sdSxhPWQoImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGM9WWUoKSxzPW5ldyBYTUxIdHRwUmVxdWVzdCxmPW51bGwsbD1udWxsLGg9MDtpZigidW5kZWZpbmVkIj09dHlwZW9mIFhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIHN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3QodCl8fChzPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBzP3Mub25sb2FkPXMub25lcnJvcj1zLm9udGltZW91dD1lOnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKHQpe3MucmVhZHlTdGF0ZT4zJiZlKHQpfSxzLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24odCl7YS5jYWxsKCJwcm9ncmVzcyIscix0KX0scj17aGVhZGVyOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9KHQrIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2MuZ2V0KHQpOihudWxsPT1uP2MucmVtb3ZlKHQpOmMuc2V0KHQsbisiIikscil9LG1pbWVUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDp0KyIiLHIpOml9LHJlc3BvbnNlVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LHIpOnV9LHRpbWVvdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3Qscik6aH0sdXNlcjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP2Y6KGY9bnVsbD09dD9udWxsOnQrIiIscil9LHBhc3N3b3JkOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/bDoobD1udWxsPT10P251bGw6dCsiIixyKX0scmVzcG9uc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG89dCxyfSxnZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gci5zZW5kKCJHRVQiLHQsbil9LHBvc3Q6ZnVuY3Rpb24odCxuKXtyZXR1cm4gci5zZW5kKCJQT1NUIix0LG4pfSxzZW5kOmZ1bmN0aW9uKG4sZSxvKXtyZXR1cm4gcy5vcGVuKG4sdCwhMCxmLGwpLG51bGw9PWl8fGMuaGFzKCJhY2NlcHQiKXx8Yy5zZXQoImFjY2VwdCIsaSsiLCovKiIpLHMuc2V0UmVxdWVzdEhlYWRlciYmYy5lYWNoKGZ1bmN0aW9uKHQsbil7cy5zZXRSZXF1ZXN0SGVhZGVyKG4sdCl9KSxudWxsIT1pJiZzLm92ZXJyaWRlTWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZShpKSxudWxsIT11JiYocy5yZXNwb25zZVR5cGU9dSksaD4wJiYocy50aW1lb3V0PWgpLG51bGw9PW8mJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYobz1lLGU9bnVsbCksbnVsbCE9byYmMT09PW8ubGVuZ3RoJiYobz14dShvKSksbnVsbCE9byYmci5vbigiZXJyb3IiLG8pLm9uKCJsb2FkIixmdW5jdGlvbih0KXtvKG51bGwsdCl9KSxhLmNhbGwoImJlZm9yZXNlbmQiLHIscykscy5zZW5kKG51bGw9PWU/bnVsbDplKSxyfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiBzLmFib3J0KCkscn0sb246ZnVuY3Rpb24oKXt2YXIgdD1hLm9uLmFwcGx5KGEsYXJndW1lbnRzKTtyZXR1cm4gdD09PWE/cjp0fX0sbnVsbCE9bil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK24pO3JldHVybiByLmdldChuKX1yZXR1cm4gcn0sQ209ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyKXt2YXIgaT1BbShlKS5taW1lVHlwZSh0KS5yZXNwb25zZShuKTtpZihudWxsIT1yKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrcik7cmV0dXJuIGkuZ2V0KHIpfXJldHVybiBpfX0sem09Q20oInRleHQvaHRtbCIsZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHQucmVzcG9uc2VUZXh0KX0pLFBtPUNtKCJhcHBsaWNhdGlvbi9qc29uIixmdW5jdGlvbih0KXtyZXR1cm4gSlNPTi5wYXJzZSh0LnJlc3BvbnNlVGV4dCl9KSxSbT1DbSgidGV4dC9wbGFpbiIsZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzcG9uc2VUZXh0fSksTG09Q20oImFwcGxpY2F0aW9uL3htbCIsZnVuY3Rpb24odCl7dmFyIG49dC5yZXNwb25zZVhNTDtpZighbil0aHJvdyBuZXcgRXJyb3IoInBhcnNlIGVycm9yIik7cmV0dXJuIG59KSxxbT1mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlLHIsaSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoaT1yLHI9bnVsbCk7dmFyIG89QW0oZSkubWltZVR5cGUodCk7cmV0dXJuIG8ucm93PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP28ucmVzcG9uc2Uod3UobixyPXQpKTpyfSxvLnJvdyhyKSxpP28uZ2V0KGkpOm99fSxVbT1xbSgidGV4dC9jc3YiLFFkKSxEbT1xbSgidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIscnYpLE9tPUFycmF5LnByb3RvdHlwZSxGbT1PbS5tYXAsSW09T20uc2xpY2UsWW09e25hbWU6ImltcGxpY2l0In0sQm09ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxqbT1mdW5jdGlvbih0KXtyZXR1cm4rdH0sSG09WzAsMV0sWG09ZnVuY3Rpb24obixlLGkpe3ZhciBvLHU9blswXSxhPW5bbi5sZW5ndGgtMV0sYz1yKHUsYSxudWxsPT1lPzEwOmUpO3N3aXRjaChpPWxyKG51bGw9PWk/IixmIjppKSxpLnR5cGUpe2Nhc2UicyI6dmFyIHM9TWF0aC5tYXgoTWF0aC5hYnModSksTWF0aC5hYnMoYSkpO3JldHVybiBudWxsIT1pLnByZWNpc2lvbnx8aXNOYU4obz1XdihjLHMpKXx8KGkucHJlY2lzaW9uPW8pLHQuZm9ybWF0UHJlZml4KGkscyk7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKG89JHYoYyxNYXRoLm1heChNYXRoLmFicyh1KSxNYXRoLmFicyhhKSkpKXx8KGkucHJlY2lzaW9uPW8tKCJlIj09PWkudHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1pLnByZWNpc2lvbnx8aXNOYU4obz1WdihjKSl8fChpLnByZWNpc2lvbj1vLTIqKCIlIj09PWkudHlwZSkpfXJldHVybiB0LmZvcm1hdChpKX0sVm09ZnVuY3Rpb24odCxuKXt0PXQuc2xpY2UoKTt2YXIgZSxyPTAsaT10Lmxlbmd0aC0xLG89dFtyXSx1PXRbaV07cmV0dXJuIHU8byYmKGU9cixyPWksaT1lLGU9byxvPXUsdT1lKSx0W3JdPW4uZmxvb3IobyksdFtpXT1uLmNlaWwodSksdH0sV209bmV3IERhdGUsJG09bmV3IERhdGUsWm09R3UoZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLXR9KTtabS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP0d1KGZ1bmN0aW9uKG4pe24uc2V0VGltZShNYXRoLmZsb29yKG4vdCkqdCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRUaW1lKCtuK2UqdCl9LGZ1bmN0aW9uKG4sZSl7cmV0dXJuKGUtbikvdH0pOlptOm51bGx9O3ZhciBHbT1abS5yYW5nZSxKbT0xZTMsUW09NmU0LEttPTM2ZTUsdHg9ODY0ZTUsbng9NjA0OGU1LGV4PUd1KGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvSm0pKkptKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipKbSl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvSm19LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX0pLHJ4PWV4LnJhbmdlLGl4PUd1KGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvUW0pKlFtKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipRbSl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvUW19LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbnV0ZXMoKX0pLG94PWl4LnJhbmdlLHV4PUd1KGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSpRbSVLbTtuPDAmJihuKz1LbSksdC5zZXRUaW1lKE1hdGguZmxvb3IoKCt0LW4pL0ttKSpLbStuKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipLbSl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvS219LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9KSxheD11eC5yYW5nZSxjeD1HdShmdW5jdGlvbih0KXt0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RGF0ZSh0LmdldERhdGUoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpRbSkvdHh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERhdGUoKS0xfSksc3g9Y3gucmFuZ2UsZng9SnUoMCksbHg9SnUoMSksaHg9SnUoMikscHg9SnUoMyksZHg9SnUoNCksdng9SnUoNSksX3g9SnUoNiksZ3g9ZngucmFuZ2UseXg9bHgucmFuZ2UsbXg9aHgucmFuZ2UseHg9cHgucmFuZ2UsYng9ZHgucmFuZ2Usd3g9dngucmFuZ2UsTXg9X3gucmFuZ2UsVHg9R3UoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksa3g9VHgucmFuZ2UsU3g9R3UoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtTeC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP0d1KGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBOeD1TeC5yYW5nZSxFeD1HdShmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipRbSl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvUW19LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLEF4PUV4LnJhbmdlLEN4PUd1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qS20pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL0ttfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENIb3VycygpfSkseng9Q3gucmFuZ2UsUHg9R3UoZnVuY3Rpb24odCl7dC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvdHh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSksUng9UHgucmFuZ2UsTHg9UXUoMCkscXg9UXUoMSksVXg9UXUoMiksRHg9UXUoMyksT3g9UXUoNCksRng9UXUoNSksSXg9UXUoNiksWXg9THgucmFuZ2UsQng9cXgucmFuZ2Usang9VXgucmFuZ2UsSHg9RHgucmFuZ2UsWHg9T3gucmFuZ2UsVng9RngucmFuZ2UsV3g9SXgucmFuZ2UsJHg9R3UoZnVuY3Rpb24odCl7dC5zZXRVVENEYXRlKDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENNb250aCh0LmdldFVUQ01vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0VVRDTW9udGgoKS10LmdldFVUQ01vbnRoKCkrMTIqKG4uZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNb250aCgpfSksWng9JHgucmFuZ2UsR3g9R3UoZnVuY3Rpb24odCl7dC5zZXRVVENNb250aCgwLDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENGdWxsWWVhcih0LmdldFVUQ0Z1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0Z1bGxZZWFyKCl9KTtHeC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP0d1KGZ1bmN0aW9uKG4pe24uc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihuLmdldFVUQ0Z1bGxZZWFyKCkvdCkqdCksbi5zZXRVVENNb250aCgwLDEpLG4uc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRVVENGdWxsWWVhcihuLmdldFVUQ0Z1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBKeCxReD1HeC5yYW5nZSxLeD17Ii0iOiIiLF86IiAiLDA6IjAifSx0Yj0vXlxzKlxkKy8sbmI9L14lLyxlYj0vW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2c7R2Eoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgcmI9IiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIsaWI9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/SmE6dC51dGNGb3JtYXQocmIpLG9iPStuZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIik/UWE6dC51dGNQYXJzZShyYiksdWI9MWUzLGFiPTYwKnViLGNiPTYwKmFiLHNiPTI0KmNiLGZiPTcqc2IsbGI9MzAqc2IsaGI9MzY1KnNiLHBiPWZ1bmN0aW9uKCl7cmV0dXJuIG5jKFN4LFR4LGZ4LGN4LHV4LGl4LGV4LFptLHQudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyZTMsMCwxKSxuZXcgRGF0ZSgyZTMsMCwyKV0pfSxkYj1mdW5jdGlvbigpe3JldHVybiBuYyhHeCwkeCxMeCxQeCxDeCxFeCxleCxabSx0LnV0Y0Zvcm1hdCkuZG9tYWluKFtEYXRlLlVUQygyZTMsMCwxKSxEYXRlLlVUQygyZTMsMCwyKV0pfSx2Yj1mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaCgvLns2fS9nKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIiMiK3R9KX0sX2I9dmIoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLGdiPXZiKCIzOTNiNzk1MjU0YTM2YjZlY2Y5YzllZGU2Mzc5Mzk4Y2EyNTJiNWNmNmJjZWRiOWM4YzZkMzFiZDllMzllN2JhNTJlN2NiOTQ4NDNjMzlhZDQ5NGFkNjYxNmJlNzk2OWM3YjQxNzNhNTUxOTRjZTZkYmRkZTllZDYiKSx5Yj12YigiMzE4MmJkNmJhZWQ2OWVjYWUxYzZkYmVmZTY1NTBkZmQ4ZDNjZmRhZTZiZmRkMGEyMzFhMzU0NzRjNDc2YTFkOTliYzdlOWMwNzU2YmIxOWU5YWM4YmNiZGRjZGFkYWViNjM2MzYzOTY5Njk2YmRiZGJkZDlkOWQ5IiksbWI9dmIoIjFmNzdiNGFlYzdlOGZmN2YwZWZmYmI3ODJjYTAyYzk4ZGY4YWQ2MjcyOGZmOTg5Njk0NjdiZGM1YjBkNThjNTY0YmM0OWM5NGUzNzdjMmY3YjZkMjdmN2Y3ZmM3YzdjN2JjYmQyMmRiZGI4ZDE3YmVjZjllZGFlNSIpLHhiPVZoKFZ0KDMwMCwuNSwwKSxWdCgtMjQwLC41LDEpKSxiYj1WaChWdCgtMTAwLC43NSwuMzUpLFZ0KDgwLDEuNSwuOCkpLHdiPVZoKFZ0KDI2MCwuNzUsLjM1KSxWdCg4MCwxLjUsLjgpKSxNYj1WdCgpLFRiPWZ1bmN0aW9uKHQpeyh0PDB8fHQ+MSkmJih0LT1NYXRoLmZsb29yKHQpKTt2YXIgbj1NYXRoLmFicyh0LS41KTtyZXR1cm4gTWIuaD0zNjAqdC0xMDAsTWIucz0xLjUtMS41Km4sTWIubD0uOC0uOSpuLE1iKyIifSxrYj1lYyh2YigiNDQwMTU0NDQwMjU2NDUwNDU3NDUwNTU5NDYwNzVhNDYwODVjNDYwYTVkNDYwYjVlNDcwZDYwNDcwZTYxNDcxMDYzNDcxMTY0NDcxMzY1NDgxNDY3NDgxNjY4NDgxNzY5NDgxODZhNDgxYTZjNDgxYjZkNDgxYzZlNDgxZDZmNDgxZjcwNDgyMDcxNDgyMTczNDgyMzc0NDgyNDc1NDgyNTc2NDgyNjc3NDgyODc4NDgyOTc5NDcyYTdhNDcyYzdhNDcyZDdiNDcyZTdjNDcyZjdkNDYzMDdlNDYzMjdlNDYzMzdmNDYzNDgwNDUzNTgxNDUzNzgxNDUzODgyNDQzOTgzNDQzYTgzNDQzYjg0NDMzZDg0NDMzZTg1NDIzZjg1NDI0MDg2NDI0MTg2NDE0Mjg3NDE0NDg3NDA0NTg4NDA0Njg4M2Y0Nzg4M2Y0ODg5M2U0OTg5M2U0YTg5M2U0YzhhM2Q0ZDhhM2Q0ZThhM2M0ZjhhM2M1MDhiM2I1MThiM2I1MjhiM2E1MzhiM2E1NDhjMzk1NThjMzk1NjhjMzg1ODhjMzg1OThjMzc1YThjMzc1YjhkMzY1YzhkMzY1ZDhkMzU1ZThkMzU1ZjhkMzQ2MDhkMzQ2MThkMzM2MjhkMzM2MzhkMzI2NDhlMzI2NThlMzE2NjhlMzE2NzhlMzE2ODhlMzA2OThlMzA2YThlMmY2YjhlMmY2YzhlMmU2ZDhlMmU2ZThlMmU2ZjhlMmQ3MDhlMmQ3MThlMmM3MThlMmM3MjhlMmM3MzhlMmI3NDhlMmI3NThlMmE3NjhlMmE3NzhlMmE3ODhlMjk3OThlMjk3YThlMjk3YjhlMjg3YzhlMjg3ZDhlMjc3ZThlMjc3ZjhlMjc4MDhlMjY4MThlMjY4MjhlMjY4MjhlMjU4MzhlMjU4NDhlMjU4NThlMjQ4NjhlMjQ4NzhlMjM4ODhlMjM4OThlMjM4YThkMjI4YjhkMjI4YzhkMjI4ZDhkMjE4ZThkMjE4ZjhkMjE5MDhkMjE5MThjMjA5MjhjMjA5MjhjMjA5MzhjMWY5NDhjMWY5NThiMWY5NjhiMWY5NzhiMWY5ODhiMWY5OThhMWY5YThhMWU5YjhhMWU5Yzg5MWU5ZDg5MWY5ZTg5MWY5Zjg4MWZhMDg4MWZhMTg4MWZhMTg3MWZhMjg3MjBhMzg2MjBhNDg2MjFhNTg1MjFhNjg1MjJhNzg1MjJhODg0MjNhOTgzMjRhYTgzMjVhYjgyMjVhYzgyMjZhZDgxMjdhZDgxMjhhZTgwMjlhZjdmMmFiMDdmMmNiMTdlMmRiMjdkMmViMzdjMmZiNDdjMzFiNTdiMzJiNjdhMzRiNjc5MzViNzc5MzdiODc4MzhiOTc3M2FiYTc2M2JiYjc1M2RiYzc0M2ZiYzczNDBiZDcyNDJiZTcxNDRiZjcwNDZjMDZmNDhjMTZlNGFjMTZkNGNjMjZjNGVjMzZiNTBjNDZhNTJjNTY5NTRjNTY4NTZjNjY3NThjNzY1NWFjODY0NWNjODYzNWVjOTYyNjBjYTYwNjNjYjVmNjVjYjVlNjdjYzVjNjljZDViNmNjZDVhNmVjZTU4NzBjZjU3NzNkMDU2NzVkMDU0NzdkMTUzN2FkMTUxN2NkMjUwN2ZkMzRlODFkMzRkODRkNDRiODZkNTQ5ODlkNTQ4OGJkNjQ2OGVkNjQ1OTBkNzQzOTNkNzQxOTVkODQwOThkODNlOWJkOTNjOWRkOTNiYTBkYTM5YTJkYTM3YTVkYjM2YThkYjM0YWFkYzMyYWRkYzMwYjBkZDJmYjJkZDJkYjVkZTJiYjhkZTI5YmFkZTI4YmRkZjI2YzBkZjI1YzJkZjIzYzVlMDIxYzhlMDIwY2FlMTFmY2RlMTFkZDBlMTFjZDJlMjFiZDVlMjFhZDhlMjE5ZGFlMzE5ZGRlMzE4ZGZlMzE4ZTJlNDE4ZTVlNDE5ZTdlNDE5ZWFlNTFhZWNlNTFiZWZlNTFjZjFlNTFkZjRlNjFlZjZlNjIwZjhlNjIxZmJlNzIzZmRlNzI1IikpLFNiPWVjKHZiKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSksTmI9ZWModmIoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNCIpKSxFYj1lYyh2YigiMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxIikpLEFiPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sQ2I9TWF0aC5hYnMsemI9TWF0aC5hdGFuMixQYj1NYXRoLmNvcyxSYj1NYXRoLm1heCxMYj1NYXRoLm1pbixxYj1NYXRoLnNpbixVYj1NYXRoLnNxcnQsRGI9MWUtMTIsT2I9TWF0aC5QSSxGYj1PYi8yLEliPTIqT2IsWWI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQscyxmPStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxsPStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxoPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLUZiLHA9dS5hcHBseSh0aGlzLGFyZ3VtZW50cyktRmIsZD1DYihwLWgpLHY9cD5oO2lmKGN8fChjPXQ9TGUoKSksbDxmJiYocz1sLGw9ZixmPXMpLGw+RGIpaWYoZD5JYi1EYiljLm1vdmVUbyhsKlBiKGgpLGwqcWIoaCkpLGMuYXJjKDAsMCxsLGgscCwhdiksZj5EYiYmKGMubW92ZVRvKGYqUGIocCksZipxYihwKSksYy5hcmMoMCwwLGYscCxoLHYpKTtlbHNle3ZhciBfLGcseT1oLG09cCx4PWgsYj1wLHc9ZCxNPWQsVD1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKS8yLGs9VD5EYiYmKGk/K2kuYXBwbHkodGhpcyxhcmd1bWVudHMpOlViKGYqZitsKmwpKSxTPUxiKENiKGwtZikvMiwrci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLE49UyxFPVM7aWYoaz5EYil7dmFyIEE9b2Moay9mKnFiKFQpKSxDPW9jKGsvbCpxYihUKSk7KHctPTIqQSk+RGI/KEEqPXY/MTotMSx4Kz1BLGItPUEpOih3PTAseD1iPShoK3ApLzIpLChNLT0yKkMpPkRiPyhDKj12PzE6LTEseSs9QyxtLT1DKTooTT0wLHk9bT0oaCtwKS8yKX12YXIgej1sKlBiKHkpLFA9bCpxYih5KSxSPWYqUGIoYiksTD1mKnFiKGIpO2lmKFM+RGIpe3ZhciBxPWwqUGIobSksVT1sKnFiKG0pLEQ9ZipQYih4KSxPPWYqcWIoeCk7aWYoZDxPYil7dmFyIEY9dz5EYj9sYyh6LFAsRCxPLHEsVSxSLEwpOltSLExdLEk9ei1GWzBdLFk9UC1GWzFdLEI9cS1GWzBdLGo9VS1GWzFdLEg9MS9xYihpYygoSSpCK1kqaikvKFViKEkqSStZKlkpKlViKEIqQitqKmopKSkvMiksWD1VYihGWzBdKkZbMF0rRlsxXSpGWzFdKTtOPUxiKFMsKGYtWCkvKEgtMSkpLEU9TGIoUywobC1YKS8oSCsxKSl9fU0+RGI/RT5EYj8oXz1oYyhELE8seixQLGwsRSx2KSxnPWhjKHEsVSxSLEwsbCxFLHYpLGMubW92ZVRvKF8uY3grXy54MDEsXy5jeStfLnkwMSksRTxTP2MuYXJjKF8uY3gsXy5jeSxFLHpiKF8ueTAxLF8ueDAxKSx6YihnLnkwMSxnLngwMSksIXYpOihjLmFyYyhfLmN4LF8uY3ksRSx6YihfLnkwMSxfLngwMSksemIoXy55MTEsXy54MTEpLCF2KSxjLmFyYygwLDAsbCx6YihfLmN5K18ueTExLF8uY3grXy54MTEpLHpiKGcuY3krZy55MTEsZy5jeCtnLngxMSksIXYpLGMuYXJjKGcuY3gsZy5jeSxFLHpiKGcueTExLGcueDExKSx6YihnLnkwMSxnLngwMSksIXYpKSk6KGMubW92ZVRvKHosUCksYy5hcmMoMCwwLGwseSxtLCF2KSk6Yy5tb3ZlVG8oeixQKSxmPkRiJiZ3PkRiP04+RGI/KF89aGMoUixMLHEsVSxmLC1OLHYpLGc9aGMoeixQLEQsTyxmLC1OLHYpLGMubGluZVRvKF8uY3grXy54MDEsXy5jeStfLnkwMSksTjxTP2MuYXJjKF8uY3gsXy5jeSxOLHpiKF8ueTAxLF8ueDAxKSx6YihnLnkwMSxnLngwMSksIXYpOihjLmFyYyhfLmN4LF8uY3ksTix6YihfLnkwMSxfLngwMSksemIoXy55MTEsXy54MTEpLCF2KSxjLmFyYygwLDAsZix6YihfLmN5K18ueTExLF8uY3grXy54MTEpLHpiKGcuY3krZy55MTEsZy5jeCtnLngxMSksdiksYy5hcmMoZy5jeCxnLmN5LE4semIoZy55MTEsZy54MTEpLHpiKGcueTAxLGcueDAxKSwhdikpKTpjLmFyYygwLDAsZixiLHgsdik6Yy5saW5lVG8oUixMKX1lbHNlIGMubW92ZVRvKDAsMCk7aWYoYy5jbG9zZVBhdGgoKSx0KXJldHVybiBjPW51bGwsdCsiInx8bnVsbH12YXIgbj11YyxlPWFjLHI9QWIoMCksaT1udWxsLG89Y2MsdT1zYyxhPWZjLGM9bnVsbDtyZXR1cm4gdC5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciB0PSgrbi5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgrby5hcHBseSh0aGlzLGFyZ3VtZW50cykrICt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1PYi8yO3JldHVybltQYihyKSp0LHFiKHIpKnRdfSx0LmlubmVyUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6QWIoK2UpLHQpOm59LHQub3V0ZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6ZX0sdC5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6cn0sdC5wYWRSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09bj9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOml9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKCtuKSx0KTpvfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOnV9LHQucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6YX0sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PW4/bnVsbDpuLHQpOmN9LHR9O3BjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pfX19O3ZhciBCYj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBjKHQpfSxqYj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGEsYyxzLGY9dC5sZW5ndGgsbD0hMTtmb3IobnVsbD09aSYmKHU9byhzPUxlKCkpKSxhPTA7YTw9ZjsrK2EpIShhPGYmJnIoYz10W2FdLGEsdCkpPT09bCYmKChsPSFsKT91LmxpbmVTdGFydCgpOnUubGluZUVuZCgpKSxsJiZ1LnBvaW50KCtuKGMsYSx0KSwrZShjLGEsdCkpO2lmKHMpcmV0dXJuIHU9bnVsbCxzKyIifHxudWxsfXZhciBuPWRjLGU9dmMscj1BYighMCksaT1udWxsLG89QmIsdT1udWxsO3JldHVybiB0Lng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpBYigrZSksdCk6bn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOmV9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKCEhbiksdCk6cn0sdC5jdXJ2ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLG51bGwhPWkmJih1PW8oaSkpLHQpOm99LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj9pPXU9bnVsbDp1PW8oaT1uKSx0KTppfSx0fSxIYj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG4sZixsLGgscCxkPXQubGVuZ3RoLHY9ITEsXz1uZXcgQXJyYXkoZCksZz1uZXcgQXJyYXkoZCk7Zm9yKG51bGw9PWEmJihzPWMocD1MZSgpKSksbj0wO248PWQ7KytuKXtpZighKG48ZCYmdShoPXRbbl0sbix0KSk9PT12KWlmKHY9IXYpZj1uLHMuYXJlYVN0YXJ0KCkscy5saW5lU3RhcnQoKTtlbHNle2ZvcihzLmxpbmVFbmQoKSxzLmxpbmVTdGFydCgpLGw9bi0xO2w+PWY7LS1sKXMucG9pbnQoX1tsXSxnW2xdKTtzLmxpbmVFbmQoKSxzLmFyZWFFbmQoKX12JiYoX1tuXT0rZShoLG4sdCksZ1tuXT0raShoLG4sdCkscy5wb2ludChyPytyKGgsbix0KTpfW25dLG8/K28oaCxuLHQpOmdbbl0pKX1pZihwKXJldHVybiBzPW51bGwscCsiInx8bnVsbH1mdW5jdGlvbiBuKCl7cmV0dXJuIGpiKCkuZGVmaW5lZCh1KS5jdXJ2ZShjKS5jb250ZXh0KGEpfXZhciBlPWRjLHI9bnVsbCxpPUFiKDApLG89dmMsdT1BYighMCksYT1udWxsLGM9QmIscz1udWxsO3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbikscj1udWxsLHQpOmV9LHQueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6ZX0sdC54MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLG89bnVsbCx0KTppfSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOml9LHQueTE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09bj9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOm99LHQubGluZVgwPXQubGluZVkwPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS54KGUpLnkoaSl9LHQubGluZVkxPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS54KGUpLnkobyl9LHQubGluZVgxPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS54KHIpLnkoaSl9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKCEhbiksdCk6dX0sdC5jdXJ2ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLG51bGwhPWEmJihzPWMoYSkpLHQpOmN9LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj9hPXM9bnVsbDpzPWMoYT1uKSx0KTphfSx0fSxYYj1mdW5jdGlvbih0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn0sVmI9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LFdiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgYSxjLHMsZixsLGg9dC5sZW5ndGgscD0wLGQ9bmV3IEFycmF5KGgpLHY9bmV3IEFycmF5KGgpLF89K2kuYXBwbHkodGhpcyxhcmd1bWVudHMpLGc9TWF0aC5taW4oSWIsTWF0aC5tYXgoLUliLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpLV8pKSx5PU1hdGgubWluKE1hdGguYWJzKGcpL2gsdS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLG09eSooZzwwPy0xOjEpO2ZvcihhPTA7YTxoOysrYSkobD12W2RbYV09YV09K24odFthXSxhLHQpKT4wJiYocCs9bCk7Zm9yKG51bGwhPWU/ZC5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodlt0XSx2W25dKX0pOm51bGwhPXImJmQuc29ydChmdW5jdGlvbihuLGUpe3JldHVybiByKHRbbl0sdFtlXSl9KSxhPTAscz1wPyhnLWgqbSkvcDowO2E8aDsrK2EsXz1mKWM9ZFthXSxsPXZbY10sZj1fKyhsPjA/bCpzOjApK20sdltjXT17ZGF0YTp0W2NdLGluZGV4OmEsdmFsdWU6bCxzdGFydEFuZ2xlOl8sZW5kQW5nbGU6ZixwYWRBbmdsZTp5fTtyZXR1cm4gdn12YXIgbj1WYixlPVhiLHI9bnVsbCxpPUFiKDApLG89QWIoSWIpLHU9QWIoMCk7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpBYigrZSksdCk6bn0sdC5zb3J0VmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4scj1udWxsLHQpOmV9LHQuc29ydD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLGU9bnVsbCx0KTpyfSx0LnN0YXJ0QW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6aX0sdC5lbmRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKCtuKSx0KTpvfSx0LnBhZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOnV9LHR9LCRiPWdjKEJiKTtfYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFTdGFydCgpfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYUVuZCgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl9jdXJ2ZS5wb2ludChuKk1hdGguc2luKHQpLG4qLU1hdGguY29zKHQpKX19O3ZhciBaYj1mdW5jdGlvbigpe3JldHVybiB5YyhqYigpLmN1cnZlKCRiKSl9LEdiPWZ1bmN0aW9uKCl7dmFyIHQ9SGIoKS5jdXJ2ZSgkYiksbj10LmN1cnZlLGU9dC5saW5lWDAscj10LmxpbmVYMSxpPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiB5YyhlKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4geWMocigpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIHljKGkoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB5YyhvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGdjKHQpKTpuKCkuX2N1cnZlfSx0fSxKYj17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL09iKTt0Lm1vdmVUbyhlLDApLHQuYXJjKDAsMCxlLDAsSWIpfX0sUWI9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobi81KS8yO3QubW92ZVRvKC0zKmUsLWUpLHQubGluZVRvKC1lLC1lKSx0LmxpbmVUbygtZSwtMyplKSx0LmxpbmVUbyhlLC0zKmUpLHQubGluZVRvKGUsLWUpLHQubGluZVRvKDMqZSwtZSksdC5saW5lVG8oMyplLGUpLHQubGluZVRvKGUsZSksdC5saW5lVG8oZSwzKmUpLHQubGluZVRvKC1lLDMqZSksdC5saW5lVG8oLWUsZSksdC5saW5lVG8oLTMqZSxlKSx0LmNsb3NlUGF0aCgpfX0sS2I9TWF0aC5zcXJ0KDEvMyksdHc9MipLYixudz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL3R3KSxyPWUqS2I7dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ociwwKSx0LmxpbmVUbygwLGUpLHQubGluZVRvKC1yLDApLHQuY2xvc2VQYXRoKCl9fSxldz0uODkwODEzMDkxNTI5Mjg1Mixydz1NYXRoLnNpbihPYi8xMCkvTWF0aC5zaW4oNypPYi8xMCksaXc9TWF0aC5zaW4oSWIvMTApKnJ3LG93PS1NYXRoLmNvcyhJYi8xMCkqcncsdXc9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobipldykscj1pdyplLGk9b3cqZTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLGkpO2Zvcih2YXIgbz0xO288NTsrK28pe3ZhciB1PUliKm8vNSxhPU1hdGguY29zKHUpLGM9TWF0aC5zaW4odSk7dC5saW5lVG8oYyplLC1hKmUpLHQubGluZVRvKGEqci1jKmksYypyK2EqaSl9dC5jbG9zZVBhdGgoKX19LGF3PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4pLHI9LWUvMjt0LnJlY3QocixyLGUsZSl9fSxjdz1NYXRoLnNxcnQoMyksc3c9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT0tTWF0aC5zcXJ0KG4vKDMqY3cpKTt0Lm1vdmVUbygwLDIqZSksdC5saW5lVG8oLWN3KmUsLWUpLHQubGluZVRvKGN3KmUsLWUpLHQuY2xvc2VQYXRoKCl9fSxmdz0tLjUsbHc9TWF0aC5zcXJ0KDMpLzIsaHc9MS9NYXRoLnNxcnQoMTIpLHB3PTMqKGh3LzIrMSksZHc9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobi9wdykscj1lLzIsaT1lKmh3LG89cix1PWUqaHcrZSxhPS1vLGM9dTt0Lm1vdmVUbyhyLGkpLHQubGluZVRvKG8sdSksdC5saW5lVG8oYSxjKSx0LmxpbmVUbyhmdypyLWx3KmksbHcqcitmdyppKSx0LmxpbmVUbyhmdypvLWx3KnUsbHcqbytmdyp1KSx0LmxpbmVUbyhmdyphLWx3KmMsbHcqYStmdypjKSx0LmxpbmVUbyhmdypyK2x3KmksZncqaS1sdypyKSx0LmxpbmVUbyhmdypvK2x3KnUsZncqdS1sdypvKSx0LmxpbmVUbyhmdyphK2x3KmMsZncqYy1sdyphKSx0LmNsb3NlUGF0aCgpfX0sdnc9W0piLFFiLG53LGF3LHV3LHN3LGR3XSxfdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgdDtpZihyfHwocj10PUxlKCkpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLmRyYXcociwrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLHQpcmV0dXJuIHI9bnVsbCx0KyIifHxudWxsfXZhciBuPUFiKEpiKSxlPUFiKDY0KSxyPW51bGw7cmV0dXJuIHQudHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkFiKGUpLHQpOm59LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKCtuKSx0KTplfSx0LmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9udWxsOm4sdCk6cn0sdH0sZ3c9ZnVuY3Rpb24oKXt9O3hjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDM6bWModGhpcyx0aGlzLl94MSx0aGlzLl95MSk7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fY29udGV4dC5saW5lVG8oKDUqdGhpcy5feDArdGhpcy5feDEpLzYsKDUqdGhpcy5feTArdGhpcy5feTEpLzYpO2RlZmF1bHQ6bWModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19O3ZhciB5dz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHhjKHQpfTtiYy5wcm90b3R5cGU9e2FyZWFTdGFydDpndyxhcmVhRW5kOmd3LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDptYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX07dmFyIG13PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYmModCl9O3djLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3ZhciBlPSh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYscj0odGhpcy5feTArNCp0aGlzLl95MStuKS82O3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8oZSxyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyhlLHIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6bWModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19O3ZhciB4dz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHdjKHQpfTtNYy5wcm90b3R5cGU9e2xpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9W10sdGhpcy5feT1bXSx0aGlzLl9iYXNpcy5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3gsbj10aGlzLl95LGU9dC5sZW5ndGgtMTtpZihlPjApZm9yKHZhciByLGk9dFswXSxvPW5bMF0sdT10W2VdLWksYT1uW2VdLW8sYz0tMTsrK2M8PWU7KXI9Yy9lLHRoaXMuX2Jhc2lzLnBvaW50KHRoaXMuX2JldGEqdFtjXSsoMS10aGlzLl9iZXRhKSooaStyKnUpLHRoaXMuX2JldGEqbltjXSsoMS10aGlzLl9iZXRhKSoobytyKmEpKTt0aGlzLl94PXRoaXMuX3k9bnVsbCx0aGlzLl9iYXNpcy5saW5lRW5kKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX07dmFyIGJ3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gMT09PW4/bmV3IHhjKHQpOm5ldyBNYyh0LG4pfXJldHVybiBlLmJldGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguODUpO2tjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzpUYyh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDE9dCx0aGlzLl95MT1uO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6VGModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciB3dz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBrYyh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtTYy5wcm90b3R5cGU9e2FyZWFTdGFydDpndyxhcmVhRW5kOmd3LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6VGModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBNdz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBTYyh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtOYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpUYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFR3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IE5jKHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO0FjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zCjtkZWZhdWx0OkVjKHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIGt3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgQWModCxuKTpuZXcga2ModCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtDYy5wcm90b3R5cGU9e2FyZWFTdGFydDpndyxhcmVhRW5kOmd3LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PW4pO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9bjticmVhaztkZWZhdWx0OkVjKHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFN3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgQ2ModCxuKTpuZXcgU2ModCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTt6Yy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6RWModGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgTnc9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyB6Yyh0LG4pOm5ldyBOYyh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO1BjLnByb3RvdHlwZT17YXJlYVN0YXJ0Omd3LGFyZWFFbmQ6Z3csbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3Q9K3Qsbj0rbix0aGlzLl9wb2ludD90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOih0aGlzLl9wb2ludD0xLHRoaXMuX2NvbnRleHQubW92ZVRvKHQsbikpfX07dmFyIEV3PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUGModCl9O0RjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3QwPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpO2JyZWFrO2Nhc2UgMzpVYyh0aGlzLHRoaXMuX3QwLHFjKHRoaXMsdGhpcy5fdDApKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7dmFyIGU9TmFOO2lmKHQ9K3Qsbj0rbix0IT09dGhpcy5feDF8fG4hPT10aGlzLl95MSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MyxVYyh0aGlzLHFjKHRoaXMsZT1MYyh0aGlzLHQsbikpLGUpO2JyZWFrO2RlZmF1bHQ6VWModGhpcyx0aGlzLl90MCxlPUxjKHRoaXMsdCxuKSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1uLHRoaXMuX3QwPWV9fX0sKE9jLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKERjLnByb3RvdHlwZSkpLnBvaW50PWZ1bmN0aW9uKHQsbil7RGMucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcyxuLHQpfSxGYy5wcm90b3R5cGU9e21vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuX2NvbnRleHQubW92ZVRvKG4sdCl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe3RoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LGxpbmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuX2NvbnRleHQubGluZVRvKG4sdCl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxuLGUscixpLG8pe3RoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhuLHQscixlLG8saSl9fSxCYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W119LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoO2lmKGUpaWYodGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0WzBdLG5bMF0pOnRoaXMuX2NvbnRleHQubW92ZVRvKHRbMF0sblswXSksMj09PWUpdGhpcy5fY29udGV4dC5saW5lVG8odFsxXSxuWzFdKTtlbHNlIGZvcih2YXIgcj1qYyh0KSxpPWpjKG4pLG89MCx1PTE7dTxlOysrbywrK3UpdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHJbMF1bb10saVswXVtvXSxyWzFdW29dLGlbMV1bb10sdFt1XSxuW3VdKTsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT1lKSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSx0aGlzLl94PXRoaXMuX3k9bnVsbH0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrbil9fTt2YXIgQXc9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBCYyh0KX07SGMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX07dmFyIEN3PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgSGModCwuNSl9LHp3PUFycmF5LnByb3RvdHlwZS5zbGljZSxQdz1mdW5jdGlvbih0LG4pe2lmKChyPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGk9MSxvPXRbblswXV0sdT1vLmxlbmd0aDtpPHI7KytpKXtlPW8sbz10W25baV1dO2Zvcih2YXIgYT0wO2E8dTsrK2Epb1thXVsxXSs9b1thXVswXT1pc05hTihlW2FdWzFdKT9lW2FdWzBdOmVbYV1bMV19fSxSdz1mdW5jdGlvbih0KXtmb3IodmFyIG49dC5sZW5ndGgsZT1uZXcgQXJyYXkobik7LS1uPj0wOyllW25dPW47cmV0dXJuIGV9LEx3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbyx1LGE9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYz10Lmxlbmd0aCxzPWEubGVuZ3RoLGY9bmV3IEFycmF5KHMpO2ZvcihvPTA7bzxzOysrbyl7Zm9yKHZhciBsLGg9YVtvXSxwPWZbb109bmV3IEFycmF5KGMpLGQ9MDtkPGM7KytkKXBbZF09bD1bMCwraSh0W2RdLGgsZCx0KV0sbC5kYXRhPXRbZF07cC5rZXk9aH1mb3Iobz0wLHU9ZShmKTtvPHM7KytvKWZbdVtvXV0uaW5kZXg9bztyZXR1cm4gcihmLHUpLGZ9dmFyIG49QWIoW10pLGU9Uncscj1QdyxpPVdjO3JldHVybiB0LmtleXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpBYih6dy5jYWxsKGUpKSx0KTpufSx0LnZhbHVlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOml9LHQub3JkZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09bj9SdzoiZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKHp3LmNhbGwobikpLHQpOmV9LHQub2Zmc2V0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/UHc6bix0KTpyfSx0fSxxdz1mdW5jdGlvbih0LG4pe2lmKChyPXQubGVuZ3RoKT4wKXtmb3IodmFyIGUscixpLG89MCx1PXRbMF0ubGVuZ3RoO288dTsrK28pe2ZvcihpPWU9MDtlPHI7KytlKWkrPXRbZV1bb11bMV18fDA7aWYoaSlmb3IoZT0wO2U8cjsrK2UpdFtlXVtvXVsxXS89aX1Qdyh0LG4pfX0sVXc9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIHU9MCxhPTA7dTxlOysrdSlhKz10W3VdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LWEvMn1Qdyh0LG4pfX0sRHc9ZnVuY3Rpb24odCxuKXtpZigoaT10Lmxlbmd0aCk+MCYmKHI9KGU9dFtuWzBdXSkubGVuZ3RoKT4wKXtmb3IodmFyIGUscixpLG89MCx1PTE7dTxyOysrdSl7Zm9yKHZhciBhPTAsYz0wLHM9MDthPGk7KythKXtmb3IodmFyIGY9dFtuW2FdXSxsPWZbdV1bMV18fDAsaD1mW3UtMV1bMV18fDAscD0obC1oKS8yLGQ9MDtkPGE7KytkKXt2YXIgdj10W25bZF1dO3ArPSh2W3VdWzFdfHwwKS0odlt1LTFdWzFdfHwwKX1jKz1sLHMrPXAqbH1lW3UtMV1bMV0rPWVbdS0xXVswXT1vLGMmJihvLT1zL2MpfWVbdS0xXVsxXSs9ZVt1LTFdWzBdPW8sUHcodCxuKX19LE93PWZ1bmN0aW9uKHQpe3ZhciBuPXQubWFwKCRjKTtyZXR1cm4gUncodCkuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBuW3RdLW5bZV19KX0sRnc9ZnVuY3Rpb24odCl7cmV0dXJuIE93KHQpLnJldmVyc2UoKX0sSXc9ZnVuY3Rpb24odCl7dmFyIG4sZSxyPXQubGVuZ3RoLGk9dC5tYXAoJGMpLG89UncodCkuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBpW25dLWlbdF19KSx1PTAsYT0wLGM9W10scz1bXTtmb3Iobj0wO248cjsrK24pZT1vW25dLHU8YT8odSs9aVtlXSxjLnB1c2goZSkpOihhKz1pW2VdLHMucHVzaChlKSk7cmV0dXJuIHMucmV2ZXJzZSgpLmNvbmNhdChjKX0sWXc9ZnVuY3Rpb24odCl7cmV0dXJuIFJ3KHQpLnJldmVyc2UoKX0sQnc9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fTtKYy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkpjLGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlLHIsaTtpZih0KXtpZihuLlA9dCxuLk49dC5OLHQuTiYmKHQuTi5QPW4pLHQuTj1uLHQuUil7Zm9yKHQ9dC5SO3QuTDspdD10Lkw7dC5MPW59ZWxzZSB0LlI9bjtlPXR9ZWxzZSB0aGlzLl8/KHQ9bnModGhpcy5fKSxuLlA9bnVsbCxuLk49dCx0LlA9dC5MPW4sZT10KToobi5QPW4uTj1udWxsLHRoaXMuXz1uLGU9bnVsbCk7Zm9yKG4uTD1uLlI9bnVsbCxuLlU9ZSxuLkM9ITAsdD1uO2UmJmUuQzspcj1lLlUsZT09PXIuTD8oaT1yLlIsaSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYoS2ModGhpcyxlKSx0PWUsZT10LlUpLGUuQz0hMSxyLkM9ITAsdHModGhpcyxyKSkpOihpPXIuTCxpJiZpLkM/KGUuQz1pLkM9ITEsci5DPSEwLHQ9cik6KHQ9PT1lLkwmJih0cyh0aGlzLGUpLHQ9ZSxlPXQuVSksZS5DPSExLHIuQz0hMCxLYyh0aGlzLHIpKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCx1PXQuUjtpZihlPW8/dT9ucyh1KTpvOnUsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJnU/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PXU/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPXUsdS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKXtpZih0JiZ0LkMpcmV0dXJuIHZvaWQodC5DPSExKTtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKG49aS5SLG4uQyYmKG4uQz0hMSxpLkM9ITAsS2ModGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCx0cyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxLYyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKG49aS5MLG4uQyYmKG4uQz0hMSxpLkM9ITAsdHModGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxLYyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSx0cyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIGp3LEh3LFh3LFZ3LFd3LCR3PVtdLFp3PVtdLEd3PTFlLTYsSnc9MWUtMTI7U3MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpTcyxwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnMobix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyx1LGE9ZS5zaXRlLGM9LTEscz1uW2lbby0xXV0sZj1zLmxlZnQ9PT1hP3MucmlnaHQ6cy5sZWZ0OysrYzxvOyl1PWYscz1uW2lbY11dLGY9cy5sZWZ0PT09YT9zLnJpZ2h0OnMubGVmdCx1JiZmJiZyPHUuaW5kZXgmJnI8Zi5pbmRleCYmVHMoYSx1LGYpPDAmJnQucHVzaChbYS5kYXRhLHUuZGF0YSxmLmRhdGFdKX0pLHR9LGxpbmtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJpZ2h0fSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6dC5sZWZ0LmRhdGEsdGFyZ2V0OnQucmlnaHQuZGF0YX19KX0sZmluZDpmdW5jdGlvbih0LG4sZSl7Zm9yKHZhciByLGksbz10aGlzLHU9by5fZm91bmR8fDAsYT1vLmNlbGxzLmxlbmd0aDshKGk9by5jZWxsc1t1XSk7KWlmKCsrdT49YSlyZXR1cm4gbnVsbDt2YXIgYz10LWkuc2l0ZVswXSxzPW4taS5zaXRlWzFdLGY9YypjK3MqcztkbyBpPW8uY2VsbHNbcj11XSx1PW51bGwsaS5oYWxmZWRnZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcj1vLmVkZ2VzW2VdLGE9ci5sZWZ0O2lmKGEhPT1pLnNpdGUmJmF8fChhPXIucmlnaHQpKXt2YXIgYz10LWFbMF0scz1uLWFbMV0sbD1jKmMrcypzO2w8ZiYmKGY9bCx1PWEuaW5kZXgpfX0pO3doaWxlKG51bGwhPT11KTtyZXR1cm4gby5fZm91bmQ9cixudWxsPT1lfHxmPD1lKmU/aS5zaXRlOm51bGx9fTt2YXIgUXc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiBuZXcgU3ModC5tYXAoZnVuY3Rpb24ocixpKXt2YXIgbz1bTWF0aC5yb3VuZChuKHIsaSx0KS9HdykqR3csTWF0aC5yb3VuZChlKHIsaSx0KS9HdykqR3ddO3JldHVybiBvLmluZGV4PWksby5kYXRhPXIsb30pLHIpfXZhciBuPVpjLGU9R2Mscj1udWxsO3JldHVybiB0LnBvbHlnb25zPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4pLnBvbHlnb25zKCl9LHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIHQobikubGlua3MoKX0sdC50cmlhbmdsZXM9ZnVuY3Rpb24obil7cmV0dXJuIHQobikudHJpYW5nbGVzKCl9LHQueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkJ3KCtlKSx0KTpufSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpCdygrbiksdCk6ZX0sdC5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9udWxsOltbK25bMF1bMF0sK25bMF1bMV1dLFsrblsxXVswXSwrblsxXVsxXV1dLHQpOnImJltbclswXVswXSxyWzBdWzFdXSxbclsxXVswXSxyWzFdWzFdXV19LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6W1swLDBdLFsrblswXSwrblsxXV1dLHQpOnImJltyWzFdWzBdLXJbMF1bMF0sclsxXVsxXS1yWzBdWzFdXX0sdH0sS3c9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fTtFcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkVzLHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiAxPT09dD90aGlzOm5ldyBFcyh0aGlzLmsqdCx0aGlzLngsdGhpcy55KX0sdHJhbnNsYXRlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIDA9PT10JjA9PT1uP3RoaXM6bmV3IEVzKHRoaXMuayx0aGlzLngrdGhpcy5rKnQsdGhpcy55K3RoaXMuaypuKX0sYXBwbHk6ZnVuY3Rpb24odCl7cmV0dXJuW3RbMF0qdGhpcy5rK3RoaXMueCx0WzFdKnRoaXMuayt0aGlzLnldfSxhcHBseVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueH0sYXBwbHlZOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnl9LGludmVydDpmdW5jdGlvbih0KXtyZXR1cm5bKHRbMF0tdGhpcy54KS90aGlzLmssKHRbMV0tdGhpcy55KS90aGlzLmtdfSxpbnZlcnRYOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueCkvdGhpcy5rfSxpbnZlcnRZOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueSkvdGhpcy5rfSxyZXNjYWxlWDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHJlc2NhbGVZOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy54KyIsIit0aGlzLnkrIikgc2NhbGUoIit0aGlzLmsrIikifX07dmFyIHRNPW5ldyBFcygxLDAsMCk7QXMucHJvdG90eXBlPUVzLnByb3RvdHlwZTt2YXIgbk09ZnVuY3Rpb24oKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0sZU09ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQpe3Qub24oIndoZWVsLnpvb20iLHMpLm9uKCJtb3VzZWRvd24uem9vbSIsZikub24oImRibGNsaWNrLnpvb20iLGwpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLGgpLm9uKCJ0b3VjaG1vdmUuem9vbSIscCkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsdikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5wcm9wZXJ0eSgiX196b29tIixScyl9ZnVuY3Rpb24gZSh0LG4pe3JldHVybiBuPU1hdGgubWF4KHgsTWF0aC5taW4oYixuKSksbj09PXQuaz90Om5ldyBFcyhuLHQueCx0LnkpfWZ1bmN0aW9uIHIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IEVzKHQuayxyLGkpfWZ1bmN0aW9uIGkodCxuKXt2YXIgZT10LmludmVydFgoblswXVswXSktdyxyPXQuaW52ZXJ0WChuWzFdWzBdKS1NLGk9dC5pbnZlcnRZKG5bMF1bMV0pLVQsbz10LmludmVydFkoblsxXVsxXSktaztyZXR1cm4gdC50cmFuc2xhdGUocj5lPyhlK3IpLzI6TWF0aC5taW4oMCxlKXx8TWF0aC5tYXgoMCxyKSxvPmk/KGkrbykvMjpNYXRoLm1pbigwLGkpfHxNYXRoLm1heCgwLG8pKX1mdW5jdGlvbiBvKHQpe3JldHVyblsoK3RbMF1bMF0rICt0WzFdWzBdKS8yLCgrdFswXVsxXSsgK3RbMV1bMV0pLzJdfWZ1bmN0aW9uIHUodCxuLGUpe3Qub24oInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7YSh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsZnVuY3Rpb24oKXthKHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pLnR3ZWVuKCJ6b29tIixmdW5jdGlvbigpe3ZhciB0PXRoaXMscj1hcmd1bWVudHMsaT1hKHQsciksdT1tLmFwcGx5KHQsciksYz1lfHxvKHUpLHM9TWF0aC5tYXgodVsxXVswXS11WzBdWzBdLHVbMV1bMV0tdVswXVsxXSksZj10Ll9fem9vbSxsPSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodCxyKTpuLGg9TihmLmludmVydChjKS5jb25jYXQocy9mLmspLGwuaW52ZXJ0KGMpLmNvbmNhdChzL2wuaykpO3JldHVybiBmdW5jdGlvbih0KXtpZigxPT09dCl0PWw7ZWxzZXt2YXIgbj1oKHQpLGU9cy9uWzJdO3Q9bmV3IEVzKGUsY1swXS1uWzBdKmUsY1sxXS1uWzFdKmUpfWkuem9vbShudWxsLHQpfX0pfWZ1bmN0aW9uIGEodCxuKXtmb3IodmFyIGUscj0wLGk9QS5sZW5ndGg7cjxpOysrcilpZigoZT1BW3JdKS50aGF0PT09dClyZXR1cm4gZTtyZXR1cm4gbmV3IGModCxuKX1mdW5jdGlvbiBjKHQsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPW4sdGhpcy5pbmRleD0tMSx0aGlzLmFjdGl2ZT0wLHRoaXMuZXh0ZW50PW0uYXBwbHkodCxuKX1mdW5jdGlvbiBzKCl7ZnVuY3Rpb24gbigpe28ud2hlZWw9bnVsbCxvLmVuZCgpfWlmKHkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbz1hKHRoaXMsYXJndW1lbnRzKSx1PXRoaXMuX196b29tLGM9TWF0aC5tYXgoeCxNYXRoLm1pbihiLHUuaypNYXRoLnBvdygyLC10LmV2ZW50LmRlbHRhWSoodC5ldmVudC5kZWx0YU1vZGU/MTIwOjEpLzUwMCkpKSxzPVlmKHRoaXMpO2lmKG8ud2hlZWwpby5tb3VzZVswXVswXT09PXNbMF0mJm8ubW91c2VbMF1bMV09PT1zWzFdfHwoby5tb3VzZVsxXT11LmludmVydChvLm1vdXNlWzBdPXMpKSxjbGVhclRpbWVvdXQoby53aGVlbCk7ZWxzZXtpZih1Lms9PT1jKXJldHVybjtvLm1vdXNlPVtzLHUuaW52ZXJ0KHMpXSx2cCh0aGlzKSxvLnN0YXJ0KCl9bk0oKSxvLndoZWVsPXNldFRpbWVvdXQobixQKSxvLnpvb20oIm1vdXNlIixpKHIoZSh1LGMpLG8ubW91c2VbMF0sby5tb3VzZVsxXSksby5leHRlbnQpKX19ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIG4oKXtuTSgpLG8ubW92ZWQ9ITAsby56b29tKCJtb3VzZSIsaShyKG8udGhhdC5fX3pvb20sby5tb3VzZVswXT1ZZihvLnRoYXQpLG8ubW91c2VbMV0pLG8uZXh0ZW50KSl9ZnVuY3Rpb24gZSgpe3Uub24oIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbSIsbnVsbCksZ3QodC5ldmVudC52aWV3LG8ubW92ZWQpLG5NKCksby5lbmQoKX1pZighZyYmeS5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBvPWEodGhpcyxhcmd1bWVudHMpLHU9TWwodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLnpvb20iLG4sITApLm9uKCJtb3VzZXVwLnpvb20iLGUsITApLGM9WWYodGhpcyk7RWwodC5ldmVudC52aWV3KSxDcygpLG8ubW91c2U9W2MsdGhpcy5fX3pvb20uaW52ZXJ0KGMpXSx2cCh0aGlzKSxvLnN0YXJ0KCl9fWZ1bmN0aW9uIGwoKXtpZih5LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG89dGhpcy5fX3pvb20sYT1ZZih0aGlzKSxjPW8uaW52ZXJ0KGEpLHM9by5rKih0LmV2ZW50LnNoaWZ0S2V5Py41OjIpLGY9aShyKGUobyxzKSxhLGMpLG0uYXBwbHkodGhpcyxhcmd1bWVudHMpKTtuTSgpLFM+MD9NbCh0aGlzKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oUykuY2FsbCh1LGYsYSk6TWwodGhpcykuY2FsbChuLnRyYW5zZm9ybSxmKX19ZnVuY3Rpb24gaCgpe2lmKHkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixlLHIsaSxvPWEodGhpcyxhcmd1bWVudHMpLHU9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxjPXUubGVuZ3RoO2ZvcihDcygpLGU9MDtlPGM7KytlKXI9dVtlXSxpPWtsKHRoaXMsdSxyLmlkZW50aWZpZXIpLGk9W2ksdGhpcy5fX3pvb20uaW52ZXJ0KGkpLHIuaWRlbnRpZmllcl0sby50b3VjaDA/by50b3VjaDF8fChvLnRvdWNoMT1pKTooby50b3VjaDA9aSxuPSEwKTtpZihfJiYoXz1jbGVhclRpbWVvdXQoXyksIW8udG91Y2gxKSlyZXR1cm4gby5lbmQoKSxpPU1sKHRoaXMpLm9uKCJkYmxjbGljay56b29tIiksdm9pZChpJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7biYmKF89c2V0VGltZW91dChmdW5jdGlvbigpe189bnVsbH0seiksdnAodGhpcyksby5zdGFydCgpKX19ZnVuY3Rpb24gcCgpe3ZhciBuLG8sdSxjLHM9YSh0aGlzLGFyZ3VtZW50cyksZj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGw9Zi5sZW5ndGg7Zm9yKG5NKCksXyYmKF89Y2xlYXJUaW1lb3V0KF8pKSxuPTA7bjxsOysrbilvPWZbbl0sdT1rbCh0aGlzLGYsby5pZGVudGlmaWVyKSxzLnRvdWNoMCYmcy50b3VjaDBbMl09PT1vLmlkZW50aWZpZXI/cy50b3VjaDBbMF09dTpzLnRvdWNoMSYmcy50b3VjaDFbMl09PT1vLmlkZW50aWZpZXImJihzLnRvdWNoMVswXT11KTtpZihvPXMudGhhdC5fX3pvb20scy50b3VjaDEpe3ZhciBoPXMudG91Y2gwWzBdLHA9cy50b3VjaDBbMV0sZD1zLnRvdWNoMVswXSx2PXMudG91Y2gxWzFdLGc9KGc9ZFswXS1oWzBdKSpnKyhnPWRbMV0taFsxXSkqZyx5PSh5PXZbMF0tcFswXSkqeSsoeT12WzFdLXBbMV0pKnk7bz1lKG8sTWF0aC5zcXJ0KGcveSkpLHU9WyhoWzBdK2RbMF0pLzIsKGhbMV0rZFsxXSkvMl0sYz1bKHBbMF0rdlswXSkvMiwocFsxXSt2WzFdKS8yXX1lbHNle2lmKCFzLnRvdWNoMClyZXR1cm47dT1zLnRvdWNoMFswXSxjPXMudG91Y2gwWzFdfXMuem9vbSgidG91Y2giLGkocihvLHUsYykscy5leHRlbnQpKX1mdW5jdGlvbiB2KCl7dmFyIG4sZSxyPWEodGhpcyxhcmd1bWVudHMpLGk9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxvPWkubGVuZ3RoO2ZvcihDcygpLGcmJmNsZWFyVGltZW91dChnKSxnPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtnPW51bGx9LHopLG49MDtuPG87KytuKWU9aVtuXSxyLnRvdWNoMCYmci50b3VjaDBbMl09PT1lLmlkZW50aWZpZXI/ZGVsZXRlIHIudG91Y2gwOnIudG91Y2gxJiZyLnRvdWNoMVsyXT09PWUuaWRlbnRpZmllciYmZGVsZXRlIHIudG91Y2gxO3IudG91Y2gxJiYhci50b3VjaDAmJihyLnRvdWNoMD1yLnRvdWNoMSxkZWxldGUgci50b3VjaDEpLHIudG91Y2gwfHxyLmVuZCgpfXZhciBfLGcseT16cyxtPVBzLHg9MCxiPTEvMCx3PS1iLE09YixUPXcsaz1NLFM9MjUwLE49SWgsQT1bXSxDPWQoInN0YXJ0Iiwiem9vbSIsImVuZCIpLHo9NTAwLFA9MTUwO3JldHVybiBuLnRyYW5zZm9ybT1mdW5jdGlvbih0LG4pe3ZhciBlPXQuc2VsZWN0aW9uP3Quc2VsZWN0aW9uKCk6dDtlLnByb3BlcnR5KCJfX3pvb20iLFJzKSx0IT09ZT91KHQsbik6ZS5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKS56b29tKG51bGwsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bikuZW5kKCl9KX0sbi5zY2FsZUJ5PWZ1bmN0aW9uKHQsZSl7bi5zY2FsZVRvKHQsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3pvb20uayooImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSl9KX0sbi5zY2FsZVRvPWZ1bmN0aW9uKHQsdSl7bi50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PW0uYXBwbHkodGhpcyxhcmd1bWVudHMpLG49dGhpcy5fX3pvb20sYT1vKHQpLGM9bi5pbnZlcnQoYSk7cmV0dXJuIGkocihlKG4sImZ1bmN0aW9uIj09dHlwZW9mIHU/dS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dSksYSxjKSx0KX0pfSxuLnRyYW5zbGF0ZUJ5PWZ1bmN0aW9uKHQsZSxyKXtuLnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcy5fX3pvb20udHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ciksbS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGMucHJvdG90eXBlPXtzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuaW5kZXg9QS5wdXNoKHRoaXMpLTEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09PS0tdGhpcy5hY3RpdmUmJihBLnNwbGljZSh0aGlzLmluZGV4LDEpLHRoaXMuaW5kZXg9LTEsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtFKG5ldyBOcyhuLHQsdGhpcy50aGF0Ll9fem9vbSksQy5hcHBseSxDLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LG4uZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6S3coISF0KSxuKTp5fSxuLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Okt3KFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxuKTptfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PSt0WzBdLGI9K3RbMV0sbik6W3gsYl19LG4udHJhbnNsYXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PSt0WzBdWzBdLE09K3RbMV1bMF0sVD0rdFswXVsxXSxrPSt0WzFdWzFdLG4pOltbdyxUXSxbTSxrXV19LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9K3Qsbik6U30sbi5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTj10LG4pOk59LG4ub249ZnVuY3Rpb24oKXt2YXIgdD1DLm9uLmFwcGx5KEMsYXJndW1lbnRzKTtyZXR1cm4gdD09PUM/bjp0fSxufTt0LnZlcnNpb249THMsdC5iaXNlY3Q9T3MsdC5iaXNlY3RSaWdodD1Pcyx0LmJpc2VjdExlZnQ9RnMsdC5hc2NlbmRpbmc9cXMsdC5iaXNlY3Rvcj1Vcyx0LmNyb3NzPVlzLHQuZGVzY2VuZGluZz1Ccyx0LmRldmlhdGlvbj1Ycyx0LmV4dGVudD1Wcyx0Lmhpc3RvZ3JhbT1vZix0LnRocmVzaG9sZEZyZWVkbWFuRGlhY29uaXM9YWYsdC50aHJlc2hvbGRTY290dD1jZix0LnRocmVzaG9sZFN0dXJnZXM9cmYsdC5tYXg9c2YsdC5tZWFuPWZmLHQubWVkaWFuPWxmLHQubWVyZ2U9aGYsdC5taW49cGYsdC5wYWlycz1Jcyx0LnBlcm11dGU9ZGYsdC5xdWFudGlsZT11Zix0LnJhbmdlPVFzLHQuc2Nhbj12Zix0LnNodWZmbGU9X2YsdC5zdW09Z2YsdC50aWNrcz1lZix0LnRpY2tTdGVwPXIsdC50cmFuc3Bvc2U9eWYsdC52YXJpYW5jZT1Icyx0LnppcD1tZix0LmF4aXNUb3A9Zix0LmF4aXNSaWdodD1sLHQuYXhpc0JvdHRvbT1oLHQuYXhpc0xlZnQ9cCx0LmJydXNoPUFkLHQuYnJ1c2hYPUFlLHQuYnJ1c2hZPUNlLHQuYnJ1c2hTZWxlY3Rpb249RWUsdC5jaG9yZD1VZCx0LnJpYmJvbj1qZCx0Lm5lc3Q9WGQsdC5zZXQ9V2UsdC5tYXA9WWUsdC5rZXlzPVdkLHQudmFsdWVzPSRkLHQuZW50cmllcz1aZCx0LmNvbG9yPVR0LHQucmdiPUV0LHQuaHNsPVB0LHQubGFiPVV0LHQuaGNsPWp0LHQuY3ViZWhlbGl4PVZ0LHQuZGlzcGF0Y2g9ZCx0LmRyYWc9Q2wsdC5kcmFnRGlzYWJsZT1FbCx0LmRyYWdFbmFibGU9Z3QsdC5kc3ZGb3JtYXQ9R2QsdC5jc3ZQYXJzZT1RZCx0LmNzdlBhcnNlUm93cz1LZCx0LmNzdkZvcm1hdD10dix0LmNzdkZvcm1hdFJvd3M9bnYsdC50c3ZQYXJzZT1ydix0LnRzdlBhcnNlUm93cz1pdix0LnRzdkZvcm1hdD1vdix0LnRzdkZvcm1hdFJvd3M9dXYsdC5lYXNlTGluZWFyPWVlLHQuZWFzZVF1YWQ9b2UsdC5lYXNlUXVhZEluPXJlLHQuZWFzZVF1YWRPdXQ9aWUsdC5lYXNlUXVhZEluT3V0PW9lLHQuZWFzZUN1YmljPWNlLHQuZWFzZUN1YmljSW49dWUsdC5lYXNlQ3ViaWNPdXQ9YWUsdC5lYXNlQ3ViaWNJbk91dD1jZSx0LmVhc2VQb2x5PVlwLHQuZWFzZVBvbHlJbj1GcCx0LmVhc2VQb2x5T3V0PUlwLHQuZWFzZVBvbHlJbk91dD1ZcCx0LmVhc2VTaW49bGUsdC5lYXNlU2luSW49c2UsdC5lYXNlU2luT3V0PWZlLHQuZWFzZVNpbkluT3V0PWxlLHQuZWFzZUV4cD1kZSx0LmVhc2VFeHBJbj1oZSx0LmVhc2VFeHBPdXQ9cGUsdC5lYXNlRXhwSW5PdXQ9ZGUsdC5lYXNlQ2lyY2xlPWdlLHQuZWFzZUNpcmNsZUluPXZlLHQuZWFzZUNpcmNsZU91dD1fZSx0LmVhc2VDaXJjbGVJbk91dD1nZSx0LmVhc2VCb3VuY2U9bWUsdC5lYXNlQm91bmNlSW49eWUsdC5lYXNlQm91bmNlT3V0PW1lLHQuZWFzZUJvdW5jZUluT3V0PXhlLHQuZWFzZUJhY2s9cmQsdC5lYXNlQmFja0luPW5kLHQuZWFzZUJhY2tPdXQ9ZWQsdC5lYXNlQmFja0luT3V0PXJkLHQuZWFzZUVsYXN0aWM9Y2QsdC5lYXNlRWxhc3RpY0luPWFkLHQuZWFzZUVsYXN0aWNPdXQ9Y2QsdC5lYXNlRWxhc3RpY0luT3V0PXNkLHQuZm9yY2VDZW50ZXI9YXYsdC5mb3JjZUNvbGxpZGU9a3YsdC5mb3JjZUxpbms9U3YsdC5mb3JjZU1hbnlCb2R5PUN2LHQuZm9yY2VTaW11bGF0aW9uPUF2LHQuZm9yY2VYPXp2LHQuZm9yY2VZPVB2LHQuZm9ybWF0RGVmYXVsdExvY2FsZT1wcix0LmZvcm1hdExvY2FsZT1Ydix0LmZvcm1hdFNwZWNpZmllcj1scix0LnByZWNpc2lvbkZpeGVkPVZ2LHQucHJlY2lzaW9uUHJlZml4PVd2LHQucHJlY2lzaW9uUm91bmQ9JHYsdC5nZW9BcmVhPXRnLHQuZ2VvQm91bmRzPXJnLHQuZ2VvQ2VudHJvaWQ9b2csdC5nZW9DaXJjbGU9eGcsdC5nZW9DbGlwRXh0ZW50PU5nLHQuZ2VvQ29udGFpbnM9T2csdC5nZW9EaXN0YW5jZT1xZyx0Lmdlb0dyYXRpY3VsZT13aSx0Lmdlb0dyYXRpY3VsZTEwPU1pLHQuZ2VvSW50ZXJwb2xhdGU9RmcsdC5nZW9MZW5ndGg9UGcsdC5nZW9QYXRoPWh5LHQuZ2VvQWxiZXJzPXd5LHQuZ2VvQWxiZXJzVXNhPU15LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhPWt5LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhUmF3PVR5LHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnQ9TnksdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudFJhdz1TeSx0Lmdlb0NvbmljQ29uZm9ybWFsPUF5LHQuZ2VvQ29uaWNDb25mb3JtYWxSYXc9bG8sdC5nZW9Db25pY0VxdWFsQXJlYT1ieSx0Lmdlb0NvbmljRXF1YWxBcmVhUmF3PWlvLHQuZ2VvQ29uaWNFcXVpZGlzdGFudD16eSx0Lmdlb0NvbmljRXF1aWRpc3RhbnRSYXc9cG8sdC5nZW9FcXVpcmVjdGFuZ3VsYXI9Q3ksdC5nZW9FcXVpcmVjdGFuZ3VsYXJSYXc9aG8sdC5nZW9Hbm9tb25pYz1QeSx0Lmdlb0dub21vbmljUmF3PXZvLHQuZ2VvSWRlbnRpdHk9UnksdC5nZW9Qcm9qZWN0aW9uPXRvLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9bm8sdC5nZW9NZXJjYXRvcj1FeSx0Lmdlb01lcmNhdG9yUmF3PWNvLHQuZ2VvT3J0aG9ncmFwaGljPUx5LHQuZ2VvT3J0aG9ncmFwaGljUmF3PWdvLHQuZ2VvU3RlcmVvZ3JhcGhpYz1xeSx0Lmdlb1N0ZXJlb2dyYXBoaWNSYXc9eW8sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3I9VXksdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc9bW8sdC5nZW9Sb3RhdGlvbj1tZyx0Lmdlb1N0cmVhbT1HXyx0Lmdlb1RyYW5zZm9ybT1feSx0LmNsdXN0ZXI9RHksdC5oaWVyYXJjaHk9QW8sdC5wYWNrPUt5LHQucGFja1NpYmxpbmdzPUp5LHQucGFja0VuY2xvc2U9R3ksdC5wYXJ0aXRpb249ZW0sdC5zdHJhdGlmeT11bSx0LnRyZWU9YW0sdC50cmVlbWFwPWxtLHQudHJlZW1hcEJpbmFyeT1obSx0LnRyZWVtYXBEaWNlPW5tLHQudHJlZW1hcFNsaWNlPWNtLHQudHJlZW1hcFNsaWNlRGljZT1wbSx0LnRyZWVtYXBTcXVhcmlmeT1mbSx0LnRyZWVtYXBSZXNxdWFyaWZ5PWRtLHQuaW50ZXJwb2xhdGU9QWgsdC5pbnRlcnBvbGF0ZUFycmF5PXdoLHQuaW50ZXJwb2xhdGVCYXNpcz1faCx0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9Z2gsdC5pbnRlcnBvbGF0ZURhdGU9TWgsdC5pbnRlcnBvbGF0ZU51bWJlcj1UaCx0LmludGVycG9sYXRlT2JqZWN0PWtoLHQuaW50ZXJwb2xhdGVSb3VuZD1DaCx0LmludGVycG9sYXRlU3RyaW5nPUVoLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3M9TGgsdC5pbnRlcnBvbGF0ZVRyYW5zZm9ybVN2Zz1xaCx0LmludGVycG9sYXRlWm9vbT1JaCx0LmludGVycG9sYXRlUmdiPW1oLHQuaW50ZXJwb2xhdGVSZ2JCYXNpcz14aCx0LmludGVycG9sYXRlUmdiQmFzaXNDbG9zZWQ9YmgsdC5pbnRlcnBvbGF0ZUhzbD1ZaCx0LmludGVycG9sYXRlSHNsTG9uZz1CaCx0LmludGVycG9sYXRlTGFiPWxuLHQuaW50ZXJwb2xhdGVIY2w9amgsdC5pbnRlcnBvbGF0ZUhjbExvbmc9SGgsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeD1YaCx0LmludGVycG9sYXRlQ3ViZWhlbGl4TG9uZz1WaCx0LnF1YW50aXplPVdoLHQucGF0aD1MZSx0LnBvbHlnb25BcmVhPXZtLHQucG9seWdvbkNlbnRyb2lkPV9tLHQucG9seWdvbkh1bGw9eW07dC5wb2x5Z29uQ29udGFpbnM9bW0sdC5wb2x5Z29uTGVuZ3RoPXhtLHQucXVhZHRyZWU9ZXIsdC5xdWV1ZT1tdSx0LnJhbmRvbVVuaWZvcm09TW0sdC5yYW5kb21Ob3JtYWw9VG0sdC5yYW5kb21Mb2dOb3JtYWw9a20sdC5yYW5kb21CYXRlcz1ObSx0LnJhbmRvbUlyd2luSGFsbD1TbSx0LnJhbmRvbUV4cG9uZW50aWFsPUVtLHQucmVxdWVzdD1BbSx0Lmh0bWw9em0sdC5qc29uPVBtLHQudGV4dD1SbSx0LnhtbD1MbSx0LmNzdj1VbSx0LnRzdj1EbSx0LnNjYWxlQmFuZD1UdSx0LnNjYWxlUG9pbnQ9U3UsdC5zY2FsZUlkZW50aXR5PVV1LHQuc2NhbGVMaW5lYXI9cXUsdC5zY2FsZUxvZz1qdSx0LnNjYWxlT3JkaW5hbD1NdSx0LnNjYWxlSW1wbGljaXQ9WW0sdC5zY2FsZVBvdz1YdSx0LnNjYWxlU3FydD1WdSx0LnNjYWxlUXVhbnRpbGU9V3UsdC5zY2FsZVF1YW50aXplPSR1LHQuc2NhbGVUaHJlc2hvbGQ9WnUsdC5zY2FsZVRpbWU9cGIsdC5zY2FsZVV0Yz1kYix0LnNjaGVtZUNhdGVnb3J5MTA9X2IsdC5zY2hlbWVDYXRlZ29yeTIwYj1nYix0LnNjaGVtZUNhdGVnb3J5MjBjPXliLHQuc2NoZW1lQ2F0ZWdvcnkyMD1tYix0LmludGVycG9sYXRlQ3ViZWhlbGl4RGVmYXVsdD14Yix0LmludGVycG9sYXRlUmFpbmJvdz1UYix0LmludGVycG9sYXRlV2FybT1iYix0LmludGVycG9sYXRlQ29vbD13Yix0LmludGVycG9sYXRlVmlyaWRpcz1rYix0LmludGVycG9sYXRlTWFnbWE9U2IsdC5pbnRlcnBvbGF0ZUluZmVybm89TmIsdC5pbnRlcnBvbGF0ZVBsYXNtYT1FYix0LnNjYWxlU2VxdWVudGlhbD1yYyx0LmNyZWF0b3I9emYsdC5sb2NhbD1iLHQubWF0Y2hlcj1VZix0Lm1vdXNlPVlmLHQubmFtZXNwYWNlPUNmLHQubmFtZXNwYWNlcz1BZix0LnNlbGVjdD1NbCx0LnNlbGVjdEFsbD1UbCx0LnNlbGVjdGlvbj12dCx0LnNlbGVjdG9yPUJmLHQuc2VsZWN0b3JBbGw9SGYsdC50b3VjaD1rbCx0LnRvdWNoZXM9U2wsdC53aW5kb3c9c2wsdC5jdXN0b21FdmVudD1FLHQuYXJjPVliLHQuYXJlYT1IYix0LmxpbmU9amIsdC5waWU9V2IsdC5yYWRpYWxBcmVhPUdiLHQucmFkaWFsTGluZT1aYix0LnN5bWJvbD1fdyx0LnN5bWJvbHM9dncsdC5zeW1ib2xDaXJjbGU9SmIsdC5zeW1ib2xDcm9zcz1RYix0LnN5bWJvbERpYW1vbmQ9bncsdC5zeW1ib2xTcXVhcmU9YXcsdC5zeW1ib2xTdGFyPXV3LHQuc3ltYm9sVHJpYW5nbGU9c3csdC5zeW1ib2xXeWU9ZHcsdC5jdXJ2ZUJhc2lzQ2xvc2VkPW13LHQuY3VydmVCYXNpc09wZW49eHcsdC5jdXJ2ZUJhc2lzPXl3LHQuY3VydmVCdW5kbGU9YncsdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPU13LHQuY3VydmVDYXJkaW5hbE9wZW49VHcsdC5jdXJ2ZUNhcmRpbmFsPXd3LHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPVN3LHQuY3VydmVDYXRtdWxsUm9tT3Blbj1Odyx0LmN1cnZlQ2F0bXVsbFJvbT1rdyx0LmN1cnZlTGluZWFyQ2xvc2VkPUV3LHQuY3VydmVMaW5lYXI9QmIsdC5jdXJ2ZU1vbm90b25lWD1JYyx0LmN1cnZlTW9ub3RvbmVZPVljLHQuY3VydmVOYXR1cmFsPUF3LHQuY3VydmVTdGVwPUN3LHQuY3VydmVTdGVwQWZ0ZXI9VmMsdC5jdXJ2ZVN0ZXBCZWZvcmU9WGMsdC5zdGFjaz1Mdyx0LnN0YWNrT2Zmc2V0RXhwYW5kPXF3LHQuc3RhY2tPZmZzZXROb25lPVB3LHQuc3RhY2tPZmZzZXRTaWxob3VldHRlPVV3LHQuc3RhY2tPZmZzZXRXaWdnbGU9RHcsdC5zdGFja09yZGVyQXNjZW5kaW5nPU93LHQuc3RhY2tPcmRlckRlc2NlbmRpbmc9RncsdC5zdGFja09yZGVySW5zaWRlT3V0PUl3LHQuc3RhY2tPcmRlck5vbmU9UncsdC5zdGFja09yZGVyUmV2ZXJzZT1Zdyx0LnRpbWVJbnRlcnZhbD1HdSx0LnRpbWVNaWxsaXNlY29uZD1abSx0LnRpbWVNaWxsaXNlY29uZHM9R20sdC51dGNNaWxsaXNlY29uZD1abSx0LnV0Y01pbGxpc2Vjb25kcz1HbSx0LnRpbWVTZWNvbmQ9ZXgsdC50aW1lU2Vjb25kcz1yeCx0LnV0Y1NlY29uZD1leCx0LnV0Y1NlY29uZHM9cngsdC50aW1lTWludXRlPWl4LHQudGltZU1pbnV0ZXM9b3gsdC50aW1lSG91cj11eCx0LnRpbWVIb3Vycz1heCx0LnRpbWVEYXk9Y3gsdC50aW1lRGF5cz1zeCx0LnRpbWVXZWVrPWZ4LHQudGltZVdlZWtzPWd4LHQudGltZVN1bmRheT1meCx0LnRpbWVTdW5kYXlzPWd4LHQudGltZU1vbmRheT1seCx0LnRpbWVNb25kYXlzPXl4LHQudGltZVR1ZXNkYXk9aHgsdC50aW1lVHVlc2RheXM9bXgsdC50aW1lV2VkbmVzZGF5PXB4LHQudGltZVdlZG5lc2RheXM9eHgsdC50aW1lVGh1cnNkYXk9ZHgsdC50aW1lVGh1cnNkYXlzPWJ4LHQudGltZUZyaWRheT12eCx0LnRpbWVGcmlkYXlzPXd4LHQudGltZVNhdHVyZGF5PV94LHQudGltZVNhdHVyZGF5cz1NeCx0LnRpbWVNb250aD1UeCx0LnRpbWVNb250aHM9a3gsdC50aW1lWWVhcj1TeCx0LnRpbWVZZWFycz1OeCx0LnV0Y01pbnV0ZT1FeCx0LnV0Y01pbnV0ZXM9QXgsdC51dGNIb3VyPUN4LHQudXRjSG91cnM9engsdC51dGNEYXk9UHgsdC51dGNEYXlzPVJ4LHQudXRjV2Vlaz1MeCx0LnV0Y1dlZWtzPVl4LHQudXRjU3VuZGF5PUx4LHQudXRjU3VuZGF5cz1ZeCx0LnV0Y01vbmRheT1xeCx0LnV0Y01vbmRheXM9QngsdC51dGNUdWVzZGF5PVV4LHQudXRjVHVlc2RheXM9angsdC51dGNXZWRuZXNkYXk9RHgsdC51dGNXZWRuZXNkYXlzPUh4LHQudXRjVGh1cnNkYXk9T3gsdC51dGNUaHVyc2RheXM9WHgsdC51dGNGcmlkYXk9RngsdC51dGNGcmlkYXlzPVZ4LHQudXRjU2F0dXJkYXk9SXgsdC51dGNTYXR1cmRheXM9V3gsdC51dGNNb250aD0keCx0LnV0Y01vbnRocz1aeCx0LnV0Y1llYXI9R3gsdC51dGNZZWFycz1ReCx0LnRpbWVGb3JtYXREZWZhdWx0TG9jYWxlPUdhLHQudGltZUZvcm1hdExvY2FsZT1lYSx0Lmlzb0Zvcm1hdD1pYix0Lmlzb1BhcnNlPW9iLHQubm93PWRuLHQudGltZXI9Z24sdC50aW1lckZsdXNoPXluLHQudGltZW91dD1ycCx0LmludGVydmFsPWlwLHQudHJhbnNpdGlvbj10ZSx0LmFjdGl2ZT1wZCx0LmludGVycnVwdD12cCx0LnZvcm9ub2k9UXcsdC56b29tPWVNLHQuem9vbVRyYW5zZm9ybT1Bcyx0Lnpvb21JZGVudGl0eT10TSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KTs="></script>
</head>
<body style="background-color:white;">
<pre>hover over horizon to see bigger below</pre>
<div id="htmlwidget-8433bb0ac496aa581a95" class="d3horizon html-widget" style="width:400px;height:auto;" width="400" height="auto">
</div>
<script type="application/json" data-for="htmlwidget-8433bb0ac496aa581a95">{"x":{"data":[[-0.00261543296277522,-0.0183624014339475,-0.00675515616899658,-0.0137376005665971,-0.0110008327616454,-0.012404816869816,-0.00386509416323155,-0.0148199285656053,-0.0235790084396836,-0.00567121587807251,-0.0212896123995352,-0.0401531362807434,-0.0536067111092239,-0.0498581420464389,-0.0594003068594903,-0.062417641865691,-0.0794952996514504,-0.0949718472839166,-0.0867286062781412,-0.10318407920298,-0.113631368911033,-0.108196477586731,-0.12098783687564,-0.138169537237417,-0.152881691539847,-0.149832591826132,-0.161385281334566,-0.146602391093142,-0.162080070525336,-0.153768919173534,-0.166659232095235,-0.170765469828191,-0.175646530280625,-0.18233506765216,-0.173250067663403,-0.162032623128582,-0.155016616033184,-0.149735644696931,-0.143150616474814,-0.142391111687212,-0.156708224801537,-0.150256852639382,-0.142336942550586,-0.146322480687918,-0.13219665879765,-0.141324029855673,-0.139111879677754,-0.155228631628668,-0.14281741340761,-0.137135383748399,-0.142669113264435,-0.151739574704409,-0.16800013848368,-0.153678589605911,-0.168835777532273,-0.15623364118866,-0.149822814604498,-0.166528710838443,-0.177245120371602,-0.163508639897621,-0.156318904128451,-0.161467808735364,-0.174729207322581,-0.162596702122108,-0.159074831484091,-0.148973334802093,-0.138262200676721,-0.135325660183729,-0.129628835755546,-0.131561060859375,-0.117366745989738,-0.120166188330257,-0.113084986352326,-0.114963223390964,-0.131444737919633,-0.137756024976338,-0.151492018209435,-0.151276125363463,-0.148956676911908,-0.146943994908597,-0.155026809675429,-0.165524497183178,-0.175852635958908,-0.182500548319432,-0.194704833454451,-0.197446854856119,-0.207079871216803,-0.1980750016516,-0.195791369193491,-0.205609662663039,-0.191395534916132,-0.191016691693578,-0.188359986485826,-0.203319325360229,-0.198693099654994,-0.200754757574967,-0.198017666263191,-0.198808884575845,-0.211718947589044,-0.220722893013611,-0.207210358686212,-0.201504982848941,-0.203904844971445,-0.209577430884038,-0.196078720261044,-0.185288361325388,-0.201217948920236,-0.19334112933264,-0.177546667181325,-0.18160793071119,-0.169261038049678,-0.183773020727873,-0.168872586971083,-0.179661409534814,-0.174220908223783,-0.182246224333707,-0.178866088787911,-0.1668905930518,-0.176490590044173,-0.188069983976154,-0.182269498821188,-0.196024670084909,-0.198882529104449,-0.201811748525485,-0.201799249653448,-0.204162570506349,-0.21892315771345,-0.205813051896097,-0.19520760995881,-0.206210697166594,-0.197364332705507,-0.189279633390155,-0.196891850324976,-0.205221104262426,-0.211077899345067,-0.224426002962556,-0.23540143050301,-0.24005077353255,-0.229657936308402,-0.236932069410864,-0.245578539774085,-0.240778032276309,-0.234425575582814,-0.224405134771775,-0.215356971453372,-0.215384648294539,-0.206668323727406,-0.218585063606554,-0.225309628221444,-0.217638723769828,-0.227138165055149,-0.220556054584204,-0.207616680156183,-0.196382177143336,-0.200106143958809,-0.187009203637174,-0.176526994822026,-0.164946021490458,-0.166112921522218,-0.177441787535631,-0.187962002822664,-0.180716789034846,-0.186424432737915,-0.182411990851268,-0.195399036178022,-0.206625118792212,-0.191291676253661,-0.179822539044328,-0.183998209038064,-0.195561911042541,-0.205638024072326,-0.212881954769272,-0.20097964425418,-0.191546898833609,-0.176277882676465,-0.180381777933644,-0.185291391388482,-0.197364255826844,-0.210155456014699,-0.214677595474354,-0.225408637417532,-0.235295503930333,-0.224308249463522,-0.23347213077459,-0.222256923709467,-0.230623449595327,-0.243083341450728,-0.255861826951418,-0.264087139804513,-0.254515896631124,-0.246032273230491,-0.248207967058505,-0.245672587770458,-0.247684881243847,-0.257464461688919,-0.24626722841728,-0.239621336213853,-0.249672757989472,-0.237349900516342,-0.234229447163049,-0.221737915873449,-0.223065903959547,-0.231072918601034,-0.234203641136053,-0.228377127094547,-0.236660737090468,-0.225041090625823,-0.237604233488258,-0.236236266377296,-0.235588741621586,-0.246264008265522,-0.248109331322731,-0.243095653788227,-0.24466616172841,-0.255362530773097,-0.242294544987686,-0.230958298586779,-0.238384212410116,-0.230180896864766,-0.22505759062323,-0.22180347446114,-0.206395558745998,-0.214978506538816,-0.2105311025474,-0.200820242113969,-0.212387033248443,-0.220674266808651,-0.210908500617045,-0.202199875105285,-0.198069156311191,-0.204193869998722,-0.199773710435203,-0.192303224058927,-0.188779977445121,-0.184400034481114,-0.175264988304895,-0.183927248087976,-0.194375021818674,-0.179440562878916,-0.171852563421034,-0.160636977027275,-0.146512546981642,-0.159829345153682,-0.170188619750638,-0.184669110957948,-0.190313970584256,-0.186540097532635,-0.19257952341516,-0.188501593910082,-0.198405704642983,-0.199924956778347,-0.185150976895644,-0.183039178257638,-0.171870629091686,-0.167990710977359,-0.16350954688742,-0.161239563794793,-0.161003935176973,-0.157402237979854,-0.169904888381005,-0.176201740865876,-0.164582384831326,-0.170962726558516,-0.161594736140322,-0.160859288095427,-0.146790430916767,-0.160178566930151,-0.158358588202781,-0.162548595218468,-0.145825441390042,-0.133679314055288,-0.143673064082347,-0.140326079069699,-0.124046414302298,-0.134409595313796,-0.149870756821077,-0.146569280850142,-0.148712683418737,-0.1620298805761,-0.147685538947758,-0.139733953424511,-0.141885205689516,-0.146139271675345,-0.134809798241377,-0.132044246624514,-0.145896519419202,-0.129450065372703,-0.130233944484419,-0.116085128691961,-0.127808699176384,-0.133671174992202,-0.132334554387228,-0.118908539025625,-0.131032391190283,-0.12339357448273,-0.12582011521715,-0.109104935331427,-0.10904505819779,-0.111710657337568,-0.127357212926913,-0.129631531657494,-0.121667247231035,-0.129435306824924,-0.125026383289019,-0.138072490322868,-0.133818387770782,-0.124362557598047,-0.13971779086232,-0.132007046520345,-0.135427231563674,-0.146836307529373,-0.147356327794427,-0.145042644313169,-0.130726437666279,-0.128346174276846,-0.145617504404245,-0.148011490442305,-0.157158917560938,-0.156358693119777,-0.1446926768751,-0.130036666991126,-0.128546281809265,-0.132311743706975,-0.148281461294022,-0.157618356267796,-0.161538764703294,-0.169529442244954,-0.159633178774904,-0.155028291787472,-0.168661237566846,-0.16416297129016,-0.180397518804482,-0.165444423211986,-0.156888243505785,-0.154068047637265,-0.16614589589514,-0.154880848325483,-0.147152126869369,-0.150722872450202,-0.142960177781409,-0.148667652486879,-0.131976024115487,-0.146176705640276,-0.144705917359446,-0.149321369672912,-0.155591783221492,-0.142036066139528,-0.146864744366271,-0.16378055835672,-0.149195928211978,-0.164000367078631,-0.179591185288146,-0.193557259119923,-0.185706161162465,-0.185670991378824,-0.192846638845601,-0.184634069620037,-0.184130484449629,-0.194490548155417,-0.202136968597063,-0.208655673683476,-0.209063760004105,-0.204826603537061,-0.196007550189752,-0.188702668733475,-0.17815371734147,-0.165390459563537,-0.16242542267404,-0.165354920189848,-0.150877388762815,-0.15555999987674,-0.148179368307508,-0.161743198459173,-0.146144678591301,-0.145349845422905,-0.133063203884394,-0.147015019469693,-0.142300827988455,-0.143822079793537,-0.129838967169153,-0.14336202594601,-0.156117567081569,-0.142838529452786,-0.154807780184197,-0.142250109859726,-0.155847405928065,-0.169511243059378,-0.157027060467037,-0.164454968886841,-0.159422675032565,-0.155052890824119,-0.156092610616697,-0.164715276049228,-0.164528583540446,-0.169644568677719,-0.15775709990028,-0.163571486084839,-0.153907840762045,-0.15439600222601,-0.143086725264608,-0.133094533007865,-0.118542416643744,-0.103072706219907,-0.11556958955655,-0.132399061593427,-0.14030443885506,-0.153248766787735,-0.160840438492753,-0.151425586682604,-0.155610458777874,-0.145281412529797,-0.14222672173009,-0.151298020767688,-0.138158732448048,-0.136126267929631,-0.138832411019583,-0.128265556482542,-0.14537660484959,-0.14132225301577,-0.134774738021144,-0.13467822837241,-0.118984237393497,-0.101691105981591,-0.115371590699126,-0.113649713223599,-0.107236396880997,-0.119214398661619,-0.118719250644859,-0.103914059980787,-0.0934697675940597,-0.0841733547738897,-0.0752793835833139,-0.0583274556478766,-0.0490397721340934,-0.0674939481773259,-0.0656975269194581,-0.05457243465234,-0.0609534452725069,-0.0589787573322367,-0.0645074430371799,-0.049743307224895,-0.0545929812770009,-0.0457993072791563,-0.030211653251657,-0.0425982673986679,-0.033948709824858,-0.022934740302597,-0.0241625770020365,-0.0131012990831322,-0.0192815826172188,-0.0215650120340158,-0.00551445693098862,0.0131182895978705,0.0132213208279519,-0.00138161824255678,-0.00020014801004975,-0.00329725996051267,0.0055984030937104,-0.000370668160742715,-0.0066708234822348,-4.21170465354503e-005,-0.0192760825653523,-0.0197511054540951,-0.0275391675916687,-0.0116583435628157,-0.0308550329570034,-0.025413162281922,-0.0352155191861402,-0.0314509632322284,-0.0213425376411652,-0.0329766587491043,-0.029622632670861,-0.0272629081727452,-0.031512915675972,-0.0201750304144399,-0.0349305505279182,-0.025157509308565,-0.0194853048619575,-0.0159775208412677,9.8326521585701e-005,0.0153627969154515,0.0114124155434536,0.0140020899543993,0.0321681482750693,0.0142774689971994,0.00817793642642939,0.0190253084906578,0.0135233189951331,0.0191988644752001,0.0190826173507754,0.0122027745364974,0.0262227799853552,0.0339287566321498,0.0396417389142623,0.0487416026972223,0.0678873149356607,0.0800336303544376,0.0875560150772572,0.0792963466848655,0.0653488890256766,0.0738169329204439,0.0828493151271052,0.0998207428603022,0.119744884092969,0.120517644781302,0.126329588609738,0.124698421724489,0.124305459222108,0.142163142621831,0.134470193845876,0.122159952235255,0.144339590473061,0.153397365146916,0.137942433255402,0.148505333116129,0.141214163651518,0.15632138832605,0.142316097290554,0.15189856984516,0.14998699953988,0.131428697223796,0.135860747805889,0.123027405329239,0.116898486333829,0.0972215702152983,0.107742804512302,0.114481193731829,0.134679216591544,0.154763299981031,0.147387798273563,0.156742352703003,0.146332376412704,0.165603829571788,0.167277166138835,0.147186395280976,0.125283757090086,0.106829874440375,0.0991115959383773,0.0928452614403328,0.088512584099115,0.0830290614079143,0.0815278963729142,0.0724885655713186,0.0574772684294027,0.0557444333132386,0.0437317828873398,0.0563643049166265,0.0489033784808681,0.0475797940421823,0.030317245046686,0.0272971249561078,0.0255620484706829,0.0426389856593297,0.0393551754473169,0.0533345771562015,0.0352795233865517,0.0485909679266388,0.0451468748387587,0.038395194483374,0.0456265466631447,0.0256990345503725,0.021060913241606,0.00476151778403322,-0.0142427178046316,-0.0321169121638892,-0.0432935241441543,-0.0375193671590823,-0.0560860003662097,-0.0671165316268016,-0.0804369607564009,-0.0757603514893077,-0.0703349444148825,-0.0698355417999758,-0.0677546324400997,-0.0576605856049437,-0.0470441529541875,-0.0514961620752015,-0.0578137785902233,-0.0594726232098869,-0.0643373961516088,-0.0649856549961378,-0.0722082468958712,-0.0824965403032339,-0.0728083069386567,-0.0885303543710746,-0.0978983409900621,-0.0898144204984058,-0.107707208080644,-0.113288256664691,-0.105042488922988,-0.120687890845008,-0.13215623268998,-0.146036694064799,-0.157279355889411,-0.172695562512751,-0.164006098345708,-0.172495627533012,-0.188754187569148,-0.178962661274702,-0.169075575086468,-0.174379110354016,-0.164187107176211,-0.152183772649999,-0.156395656203583,-0.15567294293973,-0.165753858292797,-0.154327235369703,-0.138453137964982,-0.122156335242219,-0.131750925109558,-0.14818489489615,-0.159300357401627,-0.153221563593904,-0.138969097221639,-0.126391178198129,-0.115707162037564,-0.116671868887443,-0.106811500083688,-0.104426132662675,-0.0992597152464745,-0.0909946495568624,-0.0924130324493275,-0.0744408309906515,-0.0797398325090513,-0.0939229514338075,-0.0869070124091901,-0.0778460247981736,-0.0601171107247168,-0.0596409312480072,-0.0640478618626147,-0.0533049679670051,-0.064967899993214,-0.0611700038870355,-0.0755219855136392,-0.0852649270665801,-0.0762912115251093,-0.0680195170643569,-0.0686421716777424,-0.0741460241989658,-0.0809067647257369,-0.0902928996990603,-0.0844679525750867,-0.0892828527141631,-0.0809345531872621,-0.0914515776917091,-0.0786098786403308,-0.0691925215087789,-0.0550028623028856,-0.0681050976839139,-0.0625614151589711,-0.0751696420603774,-0.065006329912595,-0.0814010630347505,-0.0836092203781275,-0.0715719652121637,-0.0838701087597822,-0.0978060972887689,-0.106371546965754,-0.0939832315874733,-0.101896482715146,-0.0976874624065706,-0.0815757456504909,-0.0904801047413499,-0.10407352343231,-0.121855180280339,-0.105516896351967,-0.122871284197181,-0.118077602338117,-0.114988910995092,-0.0997854746576711,-0.117029700217398,-0.132016851730049,-0.135403579024265,-0.126905824413328,-0.123554105644958,-0.123146724802041,-0.133885567819401,-0.126600027887665,-0.11740095061325,-0.120960884774864,-0.113365003589173,-0.105768416050553,-0.117500589154454,-0.10358487247347,-0.105851770122521,-0.102303958232909,-0.0864109837802444,-0.0727250544564554,-0.061522369762549,-0.077657702624721,-0.0841409690222662,-0.0875802327196754,-0.0992639732376221,-0.0930345774134601,-0.0776161337382272,-0.0725036735335647,-0.0792405117979931,-0.0900455805085566,-0.0728318491652162,-0.0728842768973498,-0.0663375458899804,-0.064106810577953,-0.0808341599986043,-0.0845088121733405,-0.0754214991529364,-0.0811201911894255,-0.0876581457600187,-0.0994387850845226,-0.105272474240855,-0.0958702139853634,-0.0872382237344986,-0.093436534124174,-0.0893451504808502,-0.0952394111529972,-0.104357001595861,-0.112354484422698,-0.123441492795144,-0.114896501043145,-0.128535932609917,-0.127342711222207,-0.116437341179424,-0.13192051571244,-0.127224297347952,-0.120359368063533,-0.109799352523678,-0.103316792539529,-0.0971237385542123,-0.0815301923610314,-0.0937179942204961,-0.105967497127427,-0.120747859653507,-0.119890597912975,-0.103808599003452,-0.0951178030808402,-0.0925372791817597,-0.0750735194477063,-0.0883521988781811,-0.0813866959291601,-0.0690435988841778,-0.0593757738860681,-0.0438495624575173,-0.0505471572156014,-0.0428921363502335,-0.0425029562597632,-0.0253240671328601,-0.0277092233614691,-0.0418355787443092,-0.0277311902662349,-0.038057476346725,-0.0518831096936556,-0.0543924953422157,-0.0399402985684467,-0.0315351181190752,-0.0200524290271379,-0.00241360955604542,-0.0209317201550852,-0.0196242029947714,-0.00787600213069728,0.000658956143978484,0.0110388474771439,-0.00475284717597257,-0.0208192813022475,-0.0183455087943821,-0.0237369023814692,-0.00793131765640553,-0.00400622251603799,0.0122208068870959,0.0247836415723743,0.0244476826111071,0.0296236017854581,0.0419385187861669,0.0478736034574778,0.0354088133656854,0.0293594137258073,0.0254559652070174,0.0326556598734613,0.0488713232681068,0.0290396093636172,0.0246980427635293,0.0319504543596802,0.0315106891620689,0.0137826174726179,0.0219481527616994,0.0270050504897881,0.0312326681257868,0.0418681854228808,0.0549110005396443,0.0515087956129343,0.0458563781423609,0.0491891643826723,0.0385749013889174,0.0353535610897566,0.0160054768454203,0.0271626096715181,0.0173513072555629,0.0251784317373411,0.0210015896195028,0.0234566716138211,0.0285264971415071,0.0325725827654129,0.0307008586628859,0.0359207599008167,0.0358035380355333,0.0536911342954132,0.0741437615105884,0.0592471076009526,0.0507517415908396,0.0492855469395255,0.0404463475262236,0.0471974023680775,0.0407190776946893,0.0499049684867865,0.0524023907756996,0.0639372186170089,0.0547666073636321,0.0653053134864887,0.0861449716752083,0.0963695237591851,0.104257340469706,0.124706649266505,0.129115755489037,0.145503621523657,0.149972879748126,0.161856305854522,0.180815640613737,0.196071283644704,0.207632173212067,0.192650073439103,0.171893193154768,0.179892991448887,0.203062477775282,0.198903257139452,0.196828820121678,0.185262816107281,0.183232497059751,0.178730157193984,0.168891866829058,0.189523466984954,0.185810305221545,0.196084913461695,0.200463151379181,0.191418911795485,0.169950086804818,0.176519851012106,0.173734970744631,0.159119038047389,0.16367370827585,0.163470065495248,0.184235729984122,0.171937668511607,0.149398586173216,0.131145625581551,0.14821698052166,0.148692938183022,0.153672437162895,0.158246984783219,0.139278153137353,0.142788041514113,0.149290528545978,0.126358808446513,0.127595982248034,0.1182195557505,0.132163751741063,0.117376482693097,0.12322664334252,0.113652063803738,0.123410961000801,0.140434617963217,0.141024601247511,0.156826797278129,0.13737314104901,0.121386999756977,0.117037403231978,0.114501564861321,0.116635867552492,0.123222873687254,0.122530420127885,0.103827049457412,0.11077735641316,0.0957746845000318,0.106090151759707,0.107749903965268,0.118925803535228,0.09875752503549,0.0896864949316472,0.0949041123706067,0.0761018296445635,0.0562755449457437,0.0669639208895942,0.0472376859308496,0.0515374086236786,0.055371925179784,0.0691512653531872,0.0643344522307596,0.0617261817363757,0.0737049409362147,0.0807489511959398,0.0713610175544819,0.0503390566552497,0.0325788281693327,0.0405418512871727,0.0506958373220712,0.0439063654542811,0.0442642102979605,0.0237980390226002,0.00878888080891138,0.00323956756516175,-0.0104949289831328,0.00493558448990838,0.0034643021339813,-0.00789868252392389,-0.0154153966432803,-0.0120331860035382,-0.0123586560616414,-0.0107037999607317,-0.0145857890017104,-0.0201358410765408,-0.0274960576430067,-0.0250819207978058,-0.0133583010205413,-0.021432880783498,-0.0209401496266174,-0.00401607682034222,-0.00322931205024424,0.0113463680587191,-0.00782734682622754,-0.0118819499733926,-0.0140934102815425,-0.0102328249084943,-0.0253118256968744,-0.0119681986886602,-0.011605838875728,0.00131064629016864,-0.0165232850110633,0.00302011328812424,0.000117125421069009,0.00341780958400362,-0.0142821144046975,-0.0127045025159978,-0.0204653931073174,-0.0309587289959438,-0.027741899907643,-0.0165225063714891,0.000454777950273266,-0.0100255821975791,-0.0251584224968984,-0.042713199334372,-0.0403947514276407,-0.0255250842391123,-0.0399815607121705,-0.0541354199664283,-0.0564554823485295,-0.0607310256597309,-0.0475030511745888,-0.0595043218897285,-0.0493875442009787,-0.0326451092459445,-0.0245404531314667,-0.0212245106844643,-0.0073904733068535,-0.00150605440427509,0.0129771502531675,0.0208351802494524,0.0301941237930619,0.0196787439537478,0.0357710930247168,0.0518082258333681,0.0316764198605699,0.0488874822904994,0.0338289191631056,0.0145791483278321,0.0221348532197219,0.0359143432774633,0.0542006820847549,0.0613007463143687,0.0687069191253444,0.0574658256599063,0.0487923668583705,0.0691065764002061,0.0880225257050467,0.0918570526320268,0.0938371009781003,0.0863319453395575,0.0766685126187845,0.0964197402750513,0.0783327454208889,0.0739418900006772,0.0933639009818064,0.106683206890037,0.11755686471034,0.131812654229877,0.149200894239264,0.151802815038725,0.129722994679219,0.121036591329242,0.129686147525746,0.143659789941246,0.155866687775886,0.156401267783115,0.178999068075761],[0.0159030310343951,0.0338789028306636,0.0386136346867496,0.0275848634889171,0.020587004550324,0.0109698848776929,0.0230315502347165,0.0030896199454804,0.0129607746045128,0.0154874811817156,0.031337844044329,0.013627215321208,0.0288282317279356,0.0104923082931283,-0.00615697520375191,-0.0027312991654348,0.0153730903101899,0.0291668003320871,0.0332271092152672,0.0201188621226471,0.00256952917906661,-0.0100689891665856,0.0063185452276564,0.0182684468275784,0.0123987483581138,0.0171502195350841,0.00324042928726542,0.00724666518638384,0.0272694439657228,0.0471801702060826,0.0473785711203851,0.0612818772289874,0.0665293343424507,0.0849718543008158,0.0883507080876316,0.0859925123896268,0.0809311507209174,0.0961961847698514,0.116996714110182,0.111339456499692,0.129931846588734,0.127610330322285,0.12461061149126,0.14356438677145,0.1333167729547,0.134249695500444,0.155821139598349,0.178217459605049,0.191698922067794,0.178813061715888,0.185625436978078,0.173557655393623,0.164552563071846,0.175863188676155,0.180895171416636,0.180882160519757,0.178402630516236,0.155431501060753,0.140742848702321,0.15190647322155,0.142803985384798,0.164359762567539,0.187154423588669,0.175294221415767,0.178334704273326,0.20143641510982,0.216923310631405,0.232250015089944,0.230759186585307,0.239419171998147,0.226209508985467,0.223624363409228,0.212799797457124,0.197952449484363,0.208703564380687,0.216892716276094,0.238008463641481,0.241653995573571,0.24473603618047,0.239562619773587,0.244393510592107,0.253416674847381,0.241167493983006,0.227115610964008,0.234388217276632,0.255161896190526,0.23827249269598,0.251297287424784,0.24331826352767,0.218623493474981,0.198320173978322,0.196458703955087,0.207480716179904,0.188138598891162,0.167331684360827,0.155117800119472,0.139207895263226,0.123435446438369,0.112369956368308,0.102544582646608,0.0912648439704993,0.0855188517068117,0.0990761158136415,0.100943726108997,0.12015965801357,0.141678677996248,0.140799902295016,0.143524441310628,0.165096077741786,0.14575222613299,0.13890347561158,0.154869417789567,0.171290371085243,0.153127222532302,0.144046325318857,0.147260535440968,0.126880100433248,0.146645883412202,0.146691596577794,0.13683646428864,0.123786181138251,0.101822627666031,0.0979548008004905,0.104596221559173,0.0945747029799267,0.0945036754330975,0.0994267930308568,0.121082652865656,0.115179165943203,0.0951796015982942,0.0862402236079529,0.101896692695047,0.10367622983313,0.110522093966125,0.126676372029355,0.123550221755071,0.10687420217411,0.107649317427966,0.0945556782488481,0.0848898016108364,0.0959882727296344,0.102795888983628,0.101567159247843,0.109649481145945,0.118720025010328,0.12923677363545,0.133884104083208,0.153611026695379,0.144272818226048,0.162196377403753,0.144301999369276,0.149940331996785,0.148626204053414,0.153092839557835,0.160581485768315,0.17309372964513,0.187169629132151,0.197638165724838,0.180967617507197,0.184320772177428,0.162365663957115,0.182226885433595,0.197326296357203,0.190926597884642,0.212662268665886,0.21372245666829,0.209679777653477,0.202071091399133,0.203530404792429,0.222350029109981,0.241400037465552,0.253205962556542,0.272491957006605,0.296967410426476,0.285377297403522,0.278949033532216,0.279645198657974,0.262769125960855,0.275535309407968,0.288636546322778,0.284165391241164,0.268259763377281,0.285987449312926,0.272864551178327,0.286171575750399,0.30345709559975,0.328121596855764,0.310914276373076,0.314778269081845,0.330135901567779,0.330461592521289,0.332535253407918,0.343240149760072,0.318545202425726,0.313741978463274,0.32235098154649,0.321800107878778,0.337568508392825,0.311225195172553,0.307082995730332,0.301360774152664,0.298695422100145,0.323675549663208,0.310178031389199,0.298477140455085,0.315231097035338,0.330658542715836,0.334008349932528,0.313780413707766,0.326185462768426,0.34327662239342,0.317273227371905,0.321198031623785,0.328767143106113,0.31132389803378,0.319541013303624,0.299289077573045,0.284657498653006,0.306153858956728,0.320570745671284,0.296284394735227,0.286325417808281,0.269517986512631,0.26744586251931,0.260425932054903,0.237848579806889,0.254854811275139,0.241227689761973,0.262598895593218,0.268443302217111,0.255766508004729,0.267446695500519,0.274968298370159,0.251722587920641,0.229204065472477,0.225106908763151,0.237713386917952,0.231170436121675,0.21156465319687,0.2164556716805,0.227345100454011,0.205526652609188,0.186766902714626,0.174246240254083,0.185164764841503,0.17656346378821,0.161043985941159,0.16860705970328,0.154223481754883,0.171433802495059,0.184509142410737,0.199918213459161,0.195897616702362,0.213940358138444,0.205315381751251,0.199251924043792,0.188446930312028,0.208859745038114,0.206494498384114,0.200996931062338,0.191777093667037,0.207216181935676,0.214875971540813,0.210871561708798,0.232536719000389,0.228939067376243,0.231940313061826,0.251303102885578,0.235870140644028,0.250976615810246,0.264866481984503,0.255779471663335,0.256663173827304,0.265207811619643,0.25509719061541,0.251239409022785,0.251293424137146,0.24281140573771,0.22826772873157,0.242100638882918,0.223267239425651,0.219572558093051,0.227525428687082,0.234730614204352,0.2257411684316,0.229742266941159,0.210877937258308,0.192576328550508,0.196837650911489,0.178328554286197,0.198589940900937,0.201481436859902,0.189478386222684,0.202890433253311,0.194819497457027,0.2164388348125,0.239174196438363,0.237409551490826,0.24161436083628,0.227471403886684,0.233956511204099,0.228945117932948,0.227998766297357,0.244183579522747,0.224896843691724,0.214547497013356,0.233245821346262,0.221494677970301,0.197640015076078,0.190459607894635,0.175604244829799,0.159363786006875,0.153909277037373,0.154595547546692,0.173909573088391,0.175311239783437,0.163903992193448,0.15696381073714,0.15064072160145,0.141520104211793,0.149609808337928,0.166384982887983,0.17623527314406,0.154228587557696,0.142068432625864,0.147392987218839,0.167796643795542,0.184649609688266,0.203402683516629,0.221350398934683,0.223654712418188,0.210122050849098,0.190370351843857,0.198278259116329,0.213866734735137,0.235975888847168,0.235467759848363,0.254983550970437,0.238763260081558,0.236779105267256,0.236935380462855,0.23259239300469,0.240652239705281,0.252669884516145,0.233620723333425,0.236051736406285,0.219056058345352,0.241306302785699,0.219686927608624,0.219065293742775,0.235517499776628,0.243705552607806,0.230821477906641,0.241204352664353,0.245747459785903,0.269668221220449,0.250210619764343,0.247181492598771,0.268413715266759,0.251400432353706,0.270202502406375,0.274061904169967,0.259920590098683,0.258759394650325,0.273101096903338,0.276956371289403,0.253226352323597,0.252722088388855,0.230017153532283,0.213443357272242,0.198053498081483,0.216167447484693,0.239433313678205,0.242297210234875,0.229305984142044,0.246280842970835,0.270537052378323,0.276158763194801,0.287921739417268,0.291687803687338,0.310337133136876,0.315882592145007,0.328416216021703,0.346772790263652,0.335727744117012,0.343971671172788,0.353926933785804,0.33105518347664,0.338859776089419,0.320553128780118,0.295630887709197,0.28895061468872,0.268325845129352,0.286275298866503,0.265310435843775,0.271933621199332,0.268607465512908,0.292065981451358,0.285109740077098,0.296388153144299,0.292746455259834,0.276453379102612,0.28396742004601,0.306352256947054,0.322283401366781,0.337889056930228,0.34228260579573,0.336679557737574,0.329912389568905,0.348780096853033,0.32677451367878,0.310058759146848,0.296886368002681,0.279096654914859,0.277982880386685,0.29626623038834,0.298097293400751,0.294917869151801,0.286051772338158,0.309092376855813,0.284099301975282,0.282486525191531,0.267456864470911,0.285300400906054,0.294759682919841,0.313732831601093,0.301048557219456,0.298435998974578,0.318736737156355,0.326184741936409,0.313662117830598,0.33643492861915,0.329487297829638,0.339527487250922,0.325098287466955,0.335045053656033,0.315822952032721,0.339210883335149,0.359831372665198,0.383322484020162,0.390102819412333,0.364092579120409,0.354098210969339,0.345754219493026,0.324656846968616,0.324227577172462,0.326892841348087,0.332100760620436,0.31801389483328,0.318422591449893,0.311588587306337,0.298191475521185,0.322800986225592,0.301510080827649,0.292062962644356,0.296830709114238,0.298047976997082,0.277965758199007,0.2550833791051,0.254462817569763,0.241955356930641,0.229813363672559,0.207856295458155,0.207956135173113,0.213731780636112,0.230867376404323,0.23191178313798,0.217373116898756,0.198646695869598,0.176579059827058,0.163819274926578,0.148172433568127,0.152311706052222,0.163273062752233,0.146284838816093,0.146956134526988,0.125532350831992,0.127630439676333,0.132084450850449,0.11727380584522,0.12109078356702,0.11269358479649,0.125720380925044,0.141219361968274,0.160719794216337,0.176416671067818,0.158857838306055,0.146220101254497,0.15578151676952,0.13638229623395,0.129874549928937,0.137253045936417,0.115443745417968,0.130113653679546,0.113795449344764,0.126002613994741,0.130541772006707,0.133913583655271,0.125203718838583,0.137673729860965,0.141524317449495,0.125012371312494,0.131480123137535,0.132758946431319,0.150071707300629,0.158523576475162,0.160182984546053,0.148828361695814,0.142079359934027,0.137707215490644,0.130247837537919,0.152343931943065,0.174514603717921,0.157531933819921,0.138429498381795,0.154075135780809,0.153835620701857,0.152507946774326,0.173022490286119,0.152556046608547,0.159608101921126,0.169608120419701,0.162665670010201,0.179143988776373,0.193308692836483,0.195831241983376,0.212422343651524,0.195063629003185,0.176550274368206,0.160053909216564,0.176712533707537,0.187567467523482,0.202928999313003,0.196497530233852,0.220408942724582,0.201933850746187,0.195133996670202,0.198830532162373,0.200782193412257,0.196922641042731,0.177169963430931,0.17206765697577,0.16066798572746,0.164347109316408,0.149963205955196,0.169703447423178,0.149314318333794,0.166046049705672,0.180394252738942,0.192365231564761,0.18611963303592,0.183757869644959,0.190199605617446,0.181594533008462,0.168313314588557,0.146973278195099,0.129410205830764,0.148943797161797,0.129353534671468,0.125125051004542,0.113008813769513,0.113717139475112,0.115660440553121,0.105665112008523,0.0945219145000256,0.107390574805722,0.125836511815016,0.140128615649133,0.127998316997858,0.116147009155637,0.127317379354272,0.110240056953874,0.108995815887436,0.113801094165458,0.099537578716822,0.100033343193379,0.0783598404262422,0.0597405604888155,0.0455684621571735,0.0632842904396327,0.0582900668116635,0.0559036524400587,0.048986167801143,0.0325441070920571,0.0328532247162459,0.0400757858840122,0.0337569412623961,0.0207509769858212,0.016433746220746,0.0241446694615708,0.0289649743097247,0.021113767809178,0.00768438305102515,0.0152249497075552,0.023591645578882,0.0369969477225389,0.051408566041437,0.0714054525559205,0.0724875232871254,0.0898170200316109,0.0720907738254859,0.0634827983416792,0.0843523991329931,0.0855751553735709,0.0850760361151786,0.0663128781070335,0.0575676089187731,0.055776094589588,0.0598179824329383,0.0390688493021574,0.0288623526411482,0.023541850315151,0.0431942613919316,0.0249421697897987,0.0184924837965468,-7.73733141118393e-005,-0.0130047569486185,-0.000792066407692027,-0.00395807006255966,0.00845159024328224,-0.00775828852269578,-0.00202534828638046,0.0139582904388851,0.0251882106039878,0.0200137084574998,0.0299600748005826,0.0241141017636068,0.0127177763464184,0.0242318500455878,0.0207512836777854,0.00422984580667163,0.0136799794449114,0.033802602620763,0.0289795952719125,0.0291805080312837,0.0229066869048178,0.0376137193039012,0.0425596688222074,0.0414493678378585,0.0323234550114782,0.0153563505985157,0.0135344000225512,0.00943544158040033,0.0173993411596904,0.0228080221550193,0.0219260795783158,0.0249614258192032,0.0277239506859965,0.0147733076318357,0.0109200775043832,-0.00419878242732108,0.0102254704911289,0.00759090740319701,0.0222990322034842,0.00197029131416215,0.015644818549432,0.0139259051754819,0.0261809616251567,0.0384587393661175,0.0366342932389423,0.0194902856494883,0.0121055081865555,0.00803370117405877,-0.00617006115451491,-0.0118672566282587,-0.02153000891644,-0.029761957931256,-0.034007573434622,-0.0347752716748889,-0.0374179597844319,-0.0531196563731776,-0.0618120417955699,-0.0797168250948309,-0.0842803411440971,-0.0711725882995563,-0.0672421627539871,-0.0606045656063919,-0.0508334006560268,-0.0481732314769363,-0.0516780981027435,-0.0394454478569668,-0.0504119774572716,-0.0473457566267463,-0.0536078775350854,-0.0564990485906646,-0.0581986669588535,-0.0654504180885074,-0.0809270304901348,-0.0936916061964514,-0.107587505344332,-0.114839397056529,-0.121674171771404,-0.128658525738528,-0.137620663287115,-0.150976197515851,-0.142265557409085,-0.150333586763841,-0.138790019847614,-0.139468594394487,-0.13184056981149,-0.12409119554026,-0.114849343755618,-0.127426453282254,-0.115818368597614,-0.105251988824469,-0.0978882160852882,-0.0798489984360211,-0.0623096268508047,-0.0778231826342589,-0.0673025768170251,-0.0510549712740119,-0.059108864867167,-0.0638591797287895,-0.0576821329801481,-0.068515428625713,-0.083886962130257,-0.0726858613512872,-0.06970065691822,-0.0707377692461933,-0.0667176735908092,-0.0601467510292243,-0.0461956303363665,-0.0370596419381773,-0.0356610311536608,-0.0535038788609574,-0.0433443436952136,-0.0501917182049925,-0.0319015811753848,-0.0214044751503542,-0.002668079041238,0.00470992927731317,0.0238647118356441,0.0418022993414819,0.0582902904258522,0.0566938790787221,0.0707091004689631,0.0857428224937267,0.0797476859261834,0.0953844731178217,0.113814569245516,0.114632732404311,0.13431304454583,0.152692371929019,0.156755010323256,0.176592351644949,0.198321164638359,0.183174845572309,0.199101370949669,0.182351955363441,0.159687812177592,0.154814019495274,0.171057395757143,0.161971301539616,0.166087806144996,0.172898962624677,0.194046513368226,0.192999541493354,0.172146979625421,0.149422737729467,0.158434782004065,0.155627478673853,0.162084533034851,0.143349712354439,0.154012792789308,0.134197059682596,0.120694647790989,0.124812945437168,0.146750431643258,0.128935945217284,0.145918599549491,0.168199781487474,0.158947418627743,0.170219502800352,0.148824764727831,0.128567522910572,0.137887270099456,0.159624919015559,0.138345658578462,0.150529453315603,0.165720609006646,0.148974728409699,0.142623414279415,0.150383894689618,0.167299102664466,0.170927259742332,0.158350212315601,0.139076935766261,0.142305999579543,0.146371855926921,0.164558659471014,0.181849882617732,0.189082756104506,0.184060367557728,0.163276605633934,0.144516684332634,0.130249606949506,0.124990105274626,0.107327132211753,0.117829253266923,0.109271539366396,0.0971613294545002,0.097669984084291,0.106890857021112,0.102282215370398,0.0872771408358728,0.10743844793819,0.0997870010167279,0.105128073744304,0.116046818249295,0.138026134764432,0.133880741177541,0.139975783912732,0.126257366990745,0.122724741216053,0.107319981205865,0.0864561638692747,0.10024337225451,0.0965771998253699,0.0998729250045278,0.11410431169061,0.111822698863378,0.127270364173816,0.116162049686678,0.103099562283683,0.0917128113176364,0.104203732738868,0.100570912969084,0.121684633639489,0.101354544142996,0.0909740507285079,0.088564919191972,0.10481119812445,0.0902306470655714,0.09181488617176,0.103813040857536,0.0846021084102906,0.0834707994632644,0.103100133754158,0.11669540414461,0.105044732273893,0.112280044734442,0.124714749586904,0.107588851138633,0.103754458081527,0.125214166095366,0.134808935077325,0.133304993351161,0.128309732233351,0.120553366655032,0.121316791884044,0.129313121725589,0.142275881436991,0.145747726378806,0.137671442942843,0.123134597042503,0.104619599571564,0.123926399151056,0.141023548791331,0.154095618675927,0.133375871235019,0.150844312444957,0.143938812192516,0.129355845113051,0.123651671486492,0.103048931110655,0.0897102858556451,0.1006018790463,0.118703196661941,0.12199025550786,0.134412574107714,0.138132921230032,0.14403281478984,0.123059098616562,0.121558347023499,0.13147681595744,0.130872784902179,0.135674375553039,0.149907707639109,0.170350491424169,0.155000202809074,0.150353862786489,0.13601620167705,0.138727642983054,0.130941687048749,0.119191280073884,0.1090516105758,0.117597068825283,0.124856035090973,0.114020601391612,0.122501707433727,0.1108065921807,0.105866657246573,0.0930207559643974,0.105090463923824,0.0899681814240101,0.0743332561150543,0.0871276593228518,0.070097596217443,0.0897968188828611,0.0781742491420623,0.0821536475564542,0.0911050707007175,0.104527163979785,0.106585815158778,0.12030810560929,0.135250622562157,0.122279976530768,0.144534303208281,0.123182474285672,0.107460367857962,0.0887597047471862,0.102593838995151,0.097891230431679,0.087440013496469,0.0679216962819327,0.0754102866437079,0.0662290685146791,0.0689812066968136,0.059346156656457,0.0485105293684405,0.0330974022763988,0.0480704045971405,0.0687232928099724,0.0657988112461902,0.0668215598212638,0.0848886339020731,0.0679982221730835,0.0832649414805084,0.0974157984021962,0.0897441743984762,0.0942404189196866,0.0877051673014282,0.104685459988169,0.0885007262496535,0.080432833923874,0.0813093046473297,0.0845793092454381,0.0642867531448414,0.0633571413401184,0.0673015191705928,0.0596946192036274,0.0625426144168537,0.0431585453747814,0.0512922730080507,0.0441214078964165,0.0636015742546299,0.0481240896055197,0.0617878474742675,0.0481731803079075,0.0483932274123124,0.0651229143915564,0.0682190304990011,0.0765089694598811,0.075319729481546,0.0855219278601282,0.0729351967129888,0.0879404288449064,0.100127164913412,0.120228188153011,0.126676494228225,0.140989680878683,0.138032817498149,0.133803926560212,0.145453031459376,0.16450946753324,0.186563499235825,0.198388108765984,0.202246625857149,0.199279429860256,0.180343408486462,0.178083798834877,0.178570751146084,0.189123032128981,0.176159987394035,0.165868976497227,0.157809929519502,0.135034684027827,0.129566417489229,0.110025281650886,0.119047891186804,0.109939021117932,0.0969412116991542,0.107161483914801,0.108016093291522,0.118652257965152,0.10665848925603,0.0874585747460841,0.0905301087703927,0.11034464975395,0.102127619753475,0.123194210627783,0.12131915018221,0.122247454271597,0.104385216819117,0.109759478414476,0.0931506645151368,0.0816732281525905,0.0661383812319041,0.0813408216794052,0.100461189726568],[0.00681232975795876,-0.00293023559573724,-0.0164049149796872,-0.0160500181721033,0.00105772049862751,-0.0152255570664687,-0.0246503692153981,-0.0205277069955392,-0.039745086596379,-0.0272482053611549,-0.0252285443794056,-0.0350229985910115,-0.029164123457818,-0.0471120050505076,-0.0284449396766047,-0.0124333122652333,-0.0321672059974729,-0.0352859806664043,-0.0187942486572273,-0.0322667303087042,-0.0440844173686419,-0.0610950207445239,-0.0695062212700527,-0.0568094898993733,-0.055037725997425,-0.0459063920235915,-0.0541203621657397,-0.0721266799558357,-0.0608598522501974,-0.0769788007888633,-0.0746444014106069,-0.0625579515224755,-0.0681911922063729,-0.0731029770616963,-0.0799713315870557,-0.0880415214830689,-0.0891649960926191,-0.0834190939126503,-0.0809229824727802,-0.0967769393559482,-0.109665122255341,-0.100577482108107,-0.0873110112557314,-0.0879968396546166,-0.0963792678247838,-0.113943332130463,-0.117912829675759,-0.115584488054213,-0.122892382581339,-0.125673768149742,-0.118894715297058,-0.10709576068714,-0.117547403955591,-0.131125287193642,-0.134902320787577,-0.125885103467855,-0.114233274281361,-0.114445130556622,-0.123542595681643,-0.116713677915233,-0.109901665539208,-0.0933540203509681,-0.100601872891196,-0.112730410125354,-0.108931705232919,-0.114847839541278,-0.100504847086807,-0.0999020521972356,-0.0962374173389788,-0.0953586613937204,-0.110514179784171,-0.108331768879149,-0.0998439163084022,-0.100186864739646,-0.0943163160490191,-0.108862238837703,-0.115135065597001,-0.099548138387528,-0.111065184888321,-0.120817208496152,-0.134727176213194,-0.139716167220495,-0.145905814291747,-0.157333760921775,-0.150600734995478,-0.139138909704979,-0.127773177770499,-0.115134893935107,-0.121206342462836,-0.106032818985691,-0.10411950132956,-0.0925146950320233,-0.0997729023091737,-0.113975143083028,-0.10006306435146,-0.0987209871103906,-0.111139935362566,-0.105984201282999,-0.112488104505419,-0.098599425061761,-0.109000672161287,-0.109152582318071,-0.11005874076788,-0.115408957454721,-0.109463563297641,-0.115446206002771,-0.10046246759171,-0.0880958152702577,-0.079364438389571,-0.0928806020253338,-0.0920354690063707,-0.0835240748874342,-0.0947886974952327,-0.087381211240826,-0.0720424848808937,-0.073151302823357,-0.0697814450814915,-0.088215692096872,-0.0790749329333094,-0.0751845845857977,-0.0642333900092479,-0.0498995897612503,-0.0357601950709623,-0.0548284530052452,-0.0389575876131355,-0.0357847879597269,-0.0339412553025099,-0.0523112819737287,-0.0443990399688275,-0.0589585184896166,-0.0498047299849725,-0.0518305345143566,-0.0432093014283063,-0.0448998726115233,-0.0573678376906607,-0.0602065817401468,-0.0534712917875413,-0.0665711094986494,-0.0777277158022992,-0.0758592352260741,-0.0805496334616769,-0.0868307736775512,-0.0840970469604239,-0.0857364753859452,-0.0986068728423858,-0.113810124803113,-0.101046479946935,-0.0929927580660042,-0.102925809985841,-0.11566259207627,-0.102083329895619,-0.106948451248939,-0.116175867538057,-0.0985466664116356,-0.0827500745877594,-0.079382172709039,-0.0765452661196162,-0.0640267594450745,-0.0617434336169232,-0.0724099682414594,-0.0821780048241064,-0.0730652959792183,-0.0740398896009107,-0.0820454578499776,-0.0731594190079168,-0.0871887054340955,-0.104289210483227,-0.0949052790782311,-0.0890812914624173,-0.0896874222517416,-0.107403275399447,-0.115087695597701,-0.115514353864454,-0.125075672227455,-0.137897425269953,-0.121359628695828,-0.12564110428779,-0.122103270887762,-0.106880639241846,-0.102970598584719,-0.0950377081547689,-0.0931434109768666,-0.0941006422988245,-0.0820747363920763,-0.087402175548094,-0.0903755926082414,-0.0998685287747686,-0.114670656130045,-0.100769345575964,-0.10114940250442,-0.0876345623885927,-0.0774630707650229,-0.0874911480131983,-0.0786293606478693,-0.0925079852820679,-0.093755662141745,-0.0847326882475423,-0.0907936463851376,-0.0753150404121955,-0.0731618686204429,-0.0685963154181825,-0.0539084084479394,-0.0443137448079569,-0.0338021389523895,-0.0223774833809911,-0.00897486481639453,-0.0244362488064088,-0.0289863016037144,-0.038248451814424,-0.0202218210403512,-0.0197931212197687,-0.0231024244546731,-0.00884166933142327,-0.0186873107484149,-0.0143643551862876,-0.00356778994173101,-0.00330653014557547,0.0125722065925904,0.00622277643607583,0.0132597961482761,0.0262158150118277,0.00820669867086932,0.0201210722104057,0.0334176779083883,0.043067490204304,0.0359047837276132,0.0534214263161976,0.0356929921018252,0.0494430638561998,0.0672401767107855,0.0475356165330998,0.064208377206904,0.0433468260883383,0.0296125533827682,0.0355253342356405,0.0262530398462473,0.0320932693644418,0.0373913417584533,0.0392863484547532,0.0447030297697153,0.0618184918957663,0.0500202701121986,0.0347478285211984,0.0423631834375862,0.022325220968503,0.0159813898171381,0.00886389366884943,0.0105184146964701,0.0185422646650553,0.0304916406567435,0.0463714571755365,0.0457244255273968,0.0371768981197793,0.0257790151398956,0.0128478108985306,-0.000544038881685749,-0.0156093200638282,-0.00682039829452308,-0.0179937543549893,-0.0134939952539733,-0.00265924814231366,-0.0129516946019557,0.00321061299749315,0.0224971161642133,0.0342474571198914,0.0259133045329649,0.0097461774600256,0.0103657136255755,0.0153526887171374,0.0258832716419328,0.0336569422117152,0.0416660781993989,0.0399426615196927,0.0482718001373044,0.0479132740321497,0.0383427765217466,0.0439229973169988,0.044159309041325,0.0561365652562109,0.0766878353192451,0.090035375025455,0.093931895367126,0.115444205758348,0.133051865580802,0.145048396033751,0.157650760060541,0.154725355770052,0.14531420295593,0.129579248002086,0.121575696511132,0.129809466865962,0.10819836505666,0.0954573228422699,0.0948860541127423,0.110498810060125,0.0977396629889524,0.116284956491772,0.0962775092220416,0.106901793673937,0.128605462203732,0.130720296977154,0.130866401389361,0.133105496377743,0.117521632036981,0.117140755825295,0.127200403717491,0.105183386331057,0.0882445558445464,0.0843649728129285,0.089200921894468,0.0736528532279281,0.0843036023485204,0.103704447320133,0.097571709996966,0.0786589919663452,0.0614357671139376,0.0447993130073732,0.0440193260482296,0.0486302006036412,0.0605812100348362,0.0677277473253077,0.0861329377938451,0.0685487628617816,0.0798588507433515,0.0609988701088715,0.0617346852511098,0.0406221179507404,0.0383715381669902,0.0539566252031864,0.0748963305272705,0.0580580542553963,0.0520631301777137,0.0415576593411067,0.0615225191992206,0.0659731233555061,0.0778096996255089,0.0689351230169517,0.0493287116115773,0.0311958311486595,0.0171735889719882,0.0162046742490953,0.0198490185801854,0.0284961611910282,0.0199524182368789,0.000254546490458862,0.0189360406599022,0.000990126252652379,0.0183481975683291,0.010380929465029,0.000806624201607598,0.0017580594413571,0.00259399877508892,0.017591524078483,0.000983351743355954,0.0127480031229614,0.000325898525960877,0.00995642110425687,0.0300416393731067,0.0484909835502974,0.0406650318545281,0.0426360700773485,0.0419461658347087,0.0399121871053258,0.0577529632276184,0.0771943765585996,0.0875742821592473,0.0704907736946676,0.0880387837926333,0.0970360111971624,0.0950528226699523,0.103960207546109,0.108425789684747,0.0949726554091401,0.0901926329487011,0.0738854387583112,0.0911204711843348,0.101625614660648,0.0943138835387427,0.0747739222224137,0.0698626798691688,0.0757646880890233,0.0745047993787786,0.0873407738101188,0.0747701350207861,0.0850913715509789,0.103452977065119,0.0942716119680971,0.0791408651997341,0.087681323288622,0.0738889297808512,0.0722351556399776,0.0629709828803442,0.0821315544738999,0.0627242179801586,0.0563047781610273,0.0443225151815498,0.0426532067000347,0.0296619968830705,0.0112558143732318,0.0015815620411137,0.0147143235801677,-0.00384505284036896,-0.00856218671185072,-0.00119291655233067,-0.00845438168265478,-0.0145734416304787,-0.0164958923938231,-0.0220912087852962,-0.0301573592806562,-0.0342233034666088,-0.0227944778419563,-0.0251443179975672,-0.0175586541545244,-0.0308661899322515,-0.0284699663679193,-0.0153743992623832,-0.00317481622139004,0.0158275180159411,0.034791097284268,0.049208374174962,0.0566702382945856,0.0704499762794712,0.0580209406393317,0.0668199185440634,0.0723150681969562,0.0568220067219165,0.054473599250964,0.0452767622000994,0.0589320063800198,0.0385550982555734,0.0386759612031629,0.031233571502707,0.0383285261460573,0.0589954895264313,0.0648901315554027,0.0794717308228592,0.0767315217833615,0.0617542035249798,0.0537670726483386,0.0547306282563635,0.0724046109447927,0.0625897384598386,0.0639102990699318,0.0506376575947385,0.0716465750851809,0.0900345758575085,0.0975385182390656,0.11905006088279,0.134266339091605,0.155212468124595,0.144668549081824,0.130254132174283,0.135376992125969,0.15185203764247,0.134674535349675,0.13607273790571,0.139485075424105,0.130822586965089,0.119324954689557,0.140214296402274,0.161083786864148,0.16204699318059,0.179447530123813,0.19525004333935,0.192317465449394,0.19313932953489,0.185321558934793,0.182649555655827,0.165080744840282,0.146814688313344,0.152564389420205,0.131905859367136,0.12202461217989,0.133874486932778,0.113212083757252,0.1003645188478,0.111440771820394,0.130601645306125,0.15065468841512,0.157579189921577,0.146875073357394,0.151145323099883,0.165700410158608,0.143863770456363,0.124435997711007,0.13498548882789,0.125200843645519,0.103368328977971,0.123639448396922,0.136366084146819,0.141519396165244,0.16320503578012,0.145421349576013,0.134864385927409,0.140033057318834,0.119979977824998,0.113339274802552,0.113474734182716,0.123815454846345,0.142383465547171,0.153450962632157,0.139559032517197,0.138301674801402,0.121707499353215,0.137634419852086,0.143011448523106,0.137336472257479,0.133586429019082,0.111041975329574,0.127508701063128,0.124060860508194,0.117810791285727,0.128256397419845,0.141342517687065,0.131395001377687,0.125453624408496,0.136548607176398,0.131385879093372,0.129977724727438,0.126187646995039,0.118461928952942,0.140482959448433,0.149071496015525,0.14505496448619,0.155349018547639,0.154436661279597,0.169376319754322,0.181459056416552,0.180808454182826,0.175885729372924,0.197034387510157,0.198194410322607,0.186904179684558,0.173239504805383,0.162267081299471,0.183289111818069,0.201691542814277,0.185799111985878,0.170393249953199,0.148287600461697,0.136862715203051,0.125867213745685,0.115712169994969,0.135985007686138,0.144102646983294,0.133594197163045,0.113851305693929,0.13402599715024,0.129646643833677,0.14111375307392,0.120129332536557,0.103159767430479,0.105011126512771,0.113058176933809,0.109770590346622,0.125949851815159,0.106814254271726,0.128920990825123,0.1445286874231,0.122377862483319,0.127090778672494,0.106865779839918,0.102766057381148,0.102244968141343,0.102206448392464,0.0927699747064115,0.111251870185747,0.117000514464792,0.118328671863519,0.138362639259088,0.125918146288146,0.147593993616774,0.132868802956349,0.137434759838342,0.142206231895822,0.121764126034394,0.13038080124233,0.134123447007826,0.129210945066409,0.139733442627505,0.155935629464619,0.157191194215144,0.144098130315549,0.146583196897156,0.149903658756293,0.129038168434072,0.141199234475921,0.12104597050809,0.115406669473016,0.0973735422106385,0.116121325518195,0.100567509698628,0.118688577497471,0.121763222129917,0.112475718355738,0.0908084901903123,0.0986057925099821,0.0996528183253207,0.0808541710367057,0.0808655470644053,0.097580030275455,0.0815561988529581,0.0881608837734107,0.0817511202094718,0.0855253210606579,0.0867301221189991,0.0851352170341517,0.0937183819190157,0.0946573579575065,0.112197811851162,0.093383433428782,0.0729594733937764,0.0537180814143019,0.0347186880464792,0.0385455993099195,0.049119212356014,0.0500095017182112,0.0630028727138623,0.0559196063178382,0.0399811765719535,0.0319420235839298,0.02513757324458,0.0140567533644678,-0.000654910218006455,0.00709996498296683,0.0234733281621735,0.00792698031125516,0.0114360303879728,-0.000704528283778316,0.000798818589792694,0.00518092166504536,-0.00779713185182374,0.000785744967388036,0.00832246930361635,0.0197545968703807,0.0261840530262694,0.0394981463968564,0.0534999738523447,0.0490804062516341,0.0399076248209584,0.0419986152010836,0.0306234672120143,0.049567726090989,0.0360494511768015,0.0563736336644345,0.0360584989918356,0.0336382202455283,0.0497300987435896,0.0451366418473305,0.0598317142076674,0.0465791178360324,0.0636768020521803,0.0548048950867628,0.0623801392095824,0.0634768829710801,0.0493232585628358,0.0462840890819682,0.0629531905831169,0.0837528214218641,0.0956590083540818,0.0975841539618598,0.109921205201335,0.116006725104183,0.108969222639052,0.0898717675163045,0.109287878035762,0.0879454720068267,0.0709069998409448,0.0520663910979884,0.057231251487744,0.0591144680550146,0.0796611011208124,0.0914594364582366,0.0998442268881323,0.115395129899359,0.110852258219385,0.129967786945746,0.113543860798613,0.13556398649938,0.153793944657169,0.135453209232174,0.1152946729641,0.102052844756639,0.0999105040678188,0.1204668494565,0.117958688006843,0.113461200976545,0.12034434600821,0.117029412214265,0.0991653310433012,0.0892355480833584,0.104676021917046,0.0988070080699013,0.107427525445019,0.125885792323156,0.1217599179078,0.115027525933723,0.099856373113681,0.121484000033089,0.129998162845471,0.129131767098331,0.135491242424707,0.140067166898234,0.14022598982142,0.141128115576128,0.120622319855436,0.103081942692272,0.0834834737731347,0.102559535764352,0.0981646923201183,0.104766868999059,0.0870114519074139,0.0733606227086092,0.0586443357804305,0.0745300598385097,0.0926316121633366,0.0891701435527978,0.0824817645660281,0.102622902816209,0.0872940806140978,0.0672589095998746,0.0611510004464588,0.0658757586419534,0.0473062623914606,0.0627382919240722,0.0690722215356583,0.0496437748924239,0.0516665373706651,0.0646915447335943,0.067327071750978,0.0612841536287547,0.0508351539972538,0.0536902123102172,0.0487970178851356,0.0455039244435458,0.0536525587823149,0.0342018383671607,0.0239982636829745,0.0388690293116967,0.0556831226049939,0.0677288855233233,0.0621189397153397,0.0719260767469934,0.0553811837913192,0.0723759782344291,0.0828506466552612,0.0704395407734011,0.0907770170215341,0.108101540079725,0.106495823788582,0.114496090844111,0.119040411072904,0.116349051253302,0.11583932223925,0.123892206531319,0.126605229874623,0.11833001669654,0.106903520877389,0.0984720881810335,0.115388729727957,0.136936159938518,0.159107686309335,0.167066505504889,0.178619070703858,0.187097859066302,0.204809388958423,0.196467631954957,0.178059696670332,0.177696189333847,0.177130680423603,0.169635888179165,0.155886286601669,0.151621039356727,0.169792873045116,0.163584309967512,0.180047751962321,0.162567759484632,0.176816778639086,0.166306771213979,0.148853166518052,0.132361616396613,0.12534179001773,0.137433825429963,0.141120381485633,0.14557618328598,0.129439138126462,0.122932650907396,0.138089673520013,0.151020264776642,0.151199953555828,0.154669255922727,0.157490869140584,0.148302375653418,0.126969371889014,0.125204841888863,0.119856101125081,0.119414734529311,0.0971109678303903,0.0972787135073119,0.0806833036264116,0.0872141122758086,0.0864414009605226,0.0793303186800831,0.0974789424041129,0.104560316232043,0.091754921179487,0.0989843699051502,0.0798845755520359,0.0905545193995665,0.0973461738775427,0.108702492100602,0.109710936793834,0.0945414624483178,0.0996171766766716,0.106034551987685,0.102313828172196,0.109564948086035,0.131020584054517,0.113048046367622,0.129189204032521,0.112890403359029,0.0951836933827364,0.107610199498636,0.0970198571762646,0.0984827308853271,0.0821816081885454,0.0841023886992023,0.0968947941363767,0.0839809064934511,0.0771406104765977,0.0899440376372032,0.105129308218376,0.0863529041796691,0.0872201107893271,0.0956433226141087,0.11383038336952,0.112090250167392,0.134066034549493,0.116238846113461,0.100571532739129,0.121345915579361,0.0996653191187127,0.111548925635405,0.112740029943403,0.104989839402948,0.11454784184079,0.135286325927483,0.150679898596884,0.129102755963659,0.150019477402503,0.148808287266239,0.154033549099653,0.135482950617375,0.131385915321115,0.127783047376411,0.105514260111331,0.126353581215651,0.117443050022668,0.116059662487058,0.137734309702483,0.158896613046119,0.155649174650254,0.153655841843625,0.150678437358279,0.131302738923152,0.109179023483049,0.105055502382947,0.0935500409615426,0.0731541633948318,0.0725042387144257,0.0794832643993351,0.0770207502317457,0.0967898764921371,0.0822864470509073,0.0655066740440848,0.0717387554805988,0.056663699193056,0.0632509461055437,0.0564834697496222,0.0369520565161494,0.0421807554501032,0.0473113065811814,0.0673447029508634,0.0648537615064078,0.0778031508594152,0.0902199016525156,0.0873312013064014,0.0829221701925655,0.102043788941755,0.0892968794421136,0.0998388250793629,0.0796855000058989,0.0615564694194697,0.0412286427536726,0.0274893493200419,0.0410746126891841,0.0485544785351235,0.0288559404919257,0.0287637172538251,0.0316374621509243,0.0118018256939674,0.0170194238834529,0.0101263032708327,0.0293931719493126,0.023269217682462,0.00590980577658562,-0.00999474698525404,-0.0166586714731609,-0.0229425596115067,-0.00773960584284783,-0.0106782859764949,-0.00434475272522661,-0.0119617439927624,-0.0300645611912361,-0.0421707854153017,-0.0453066257479727,-0.0275703068265402,-0.0255349927840558,-0.00775129665947061,-0.0167713059209452,-0.0016218819615953,-0.0153456315032577,-0.0127314072071847,-0.0303346242753598,-0.0388211155199799,-0.0284749747404424,-0.0385312148226629,-0.0329895464598824,-0.0178529844265465,-0.0225660768167424,-0.032529173371477,-0.0332431362100998,-0.0211807476911594,-0.0374870748880529,-0.0564928638233734,-0.0461367042045679,-0.0550172684066115,-0.0559800825467579,-0.0504799123890556,-0.0435107366088614,-0.0360680491815174,-0.045521250034635,-0.059080867345597,-0.0482029944537681,-0.0311922050563674,-0.0325743395359487,-0.0471439579195775,-0.0586752241273714,-0.0458415904032179,-0.0410046825249939,-0.0534405707487311,-0.0716030017421035,-0.0530721224481832,-0.0582667868613675,-0.0548331076377017,-0.0392213639563107,-0.0501646862500545,-0.0597111098948924,-0.053471817310259,-0.0367818872334892,-0.0231246209439665,-0.00953302939028722,0.000385587193185932,-0.00478103632155813,-0.00168368599409419,0.0154592520579309,0.0256132389298847,0.0199348762703184,0.00453942455246192,0.0153036343730801,0.0352850869640098,0.0521236943394654,0.0556903415310834,0.0592197167049551,0.053489905890054,0.0342287771308922,0.0309545927984198,0.0446080876425623,0.0289868808203084,0.0200714963303315,0.0244467062776392,0.044531424496346,0.0620544672923773,0.067159035367188,0.084569816021044,0.066591756981361,0.05104689488008,0.0397971049397969,0.0263628833341334,0.0372921545486331,0.0193197637705094,0.0324178959269139,0.0400011725343374,0.0396167563589229,0.0249585887133847,0.04207852186217,0.0437116986142414,0.0301517250122418,0.0293853161015032,0.0462371138531135],[0.00337678712792688,8.86393009713604e-005,-0.0144706864905211,-0.0124067963603883,-0.0290043506398671,-0.026441829777476,-0.0231608037066573,-0.00957237093376984,0.00884355967616512,0.0157113912881774,-0.0041271922841537,-0.00072619997194312,0.0108816445042743,0.00362919235161163,0.0202481682500895,0.0132607225775634,0.000820470925752881,-0.0181908106571965,-0.00937160984039398,-0.0229590402135732,-0.0117256389165981,-0.014109948733936,-0.0287957419076841,-0.0107300635446723,-0.0237669034031659,-0.0229809483950106,-0.0292001936315089,-0.0118780538001528,-0.000144043654284665,0.00465399343078787,-0.00622581059687799,0.012299866609947,0.0250015055428598,0.0358081140374318,0.0482071002423472,0.055246665572662,0.0544061187769644,0.0443840888372873,0.0642526816897366,0.0494823200376178,0.0642346453649136,0.0548094861934691,0.0526063881953291,0.0513177612911864,0.0670361302125355,0.0470147428630581,0.044004631549964,0.0315195138466104,0.0360110904644786,0.044029477293444,0.0357929279705704,0.0253526320029869,0.0199103895716823,5.00010516599758e-005,0.014555285921698,0.00692352544013297,0.0218875914962953,0.0363737215298896,0.0465946376180286,0.0513565307570985,0.0692386422803508,0.087455766335256,0.0811525751833164,0.100407716838955,0.101346038912733,0.103903786078358,0.107065646219946,0.0863506782969434,0.0861973381872958,0.0822548843246933,0.0911897255743011,0.0974376143539815,0.0999776191053618,0.113863124258426,0.101258554080508,0.098159306475305,0.088579481448368,0.0769907549489548,0.0667640962245457,0.0687459633375025,0.0775113010734576,0.0592024976486845,0.0714149206710273,0.085062332805254,0.0881922742284091,0.0749477616364354,0.0941185484271754,0.0988084609911517,0.112713636264946,0.116931138194774,0.125155780567539,0.114749049386842,0.120473815299025,0.117382436382881,0.109182637404402,0.101597955679475,0.0815749170523103,0.102479992841272,0.086279237124941,0.0839956564637219,0.0869772448113384,0.0720153664185388,0.0628647380577696,0.0821436621088789,0.0632766367311788,0.0536958489365922,0.0600871029483725,0.077415176784287,0.074257486886842,0.0695606655782612,0.0587385721583058,0.0685339899582196,0.049006735121903,0.0590060831359045,0.0756625285689225,0.0859699649222037,0.0979010297306335,0.119651578109245,0.110024093027473,0.117685054378742,0.109214423274836,0.0916617756993827,0.100181512850616,0.0784263519579906,0.0737099038300846,0.0910834874832727,0.0736077966326554,0.0829768873713375,0.0945111376156038,0.0842297577295319,0.0912383616844974,0.0790552390892922,0.0817828723673724,0.0608477743494686,0.0491670852045658,0.048565323348813,0.0333870655914486,0.0327294961021907,0.0218894314848366,0.0358684448881073,0.0356068246754693,0.0154815962354298,0.0310765234883972,0.020470553078684,0.00601118539309131,0.011059221310481,0.00453046859129058,0.0213946870474027,0.0079383951616756,0.00356223045567883,0.00306282421623538,0.0012960708806149,-0.0104268189414838,-0.0178076659311093,-0.00544676541337741,0.0142120941671697,0.0163761578818213,0.00332861171536791,-0.0128072961104834,-0.00786666996279639,0.0105117147327443,0.00205795091953598,0.00126831996597287,0.0011002841352119,0.0103366501617923,-0.00609242289972178,-0.00605270022819016,0.00531290367619253,-0.00575912733882777,0.010577505060146,0.0198093501331615,0.00953211299207313,0.000439447884156507,0.00266088879396431,0.00474881606989097,0.0132938086934671,0.0312141969848156,0.0444738774563485,0.0597073878014862,0.0517912424667704,0.0412107462773221,0.05332887785951,0.070418466744447,0.0572524293080874,0.0385022052481991,0.0311758283463162,0.0493656107259528,0.0467488440350088,0.064562206500874,0.0439524949807228,0.0424678321404774,0.0628067988404675,0.0652150877554056,0.081160763301166,0.0756225600177864,0.0842243990931535,0.0725563532866458,0.0679325025775062,0.0496598573483742,0.0518642103444658,0.0666169269258503,0.0848316587532236,0.0815609037284732,0.0970958025282378,0.0915376221040096,0.084686138304676,0.0832618077207807,0.0792920936311057,0.0825519266527426,0.0975826559144342,0.0757402809711853,0.0954231993913743,0.0737127113711493,0.0540198190839078,0.0534616217218928,0.0460033566127032,0.0651839567655739,0.0701737338365469,0.0872310772466662,0.0994676723361336,0.114610959824938,0.0965495314195601,0.108084643388583,0.100517271168937,0.0973532847358818,0.0972475051852348,0.108639114787459,0.0890367113718342,0.0703644697556349,0.0678922890441906,0.0838432244610925,0.0675657371656992,0.0852544291233313,0.0702010031538995,0.0529814259338437,0.0637242349359965,0.0522641437691376,0.0663903425429913,0.0846489639138885,0.0738799367913847,0.0624370918954591,0.0659802209337044,0.0751124360428692,0.0838535654119217,0.0735911214982619,0.0674419852969212,0.0615486714396138,0.042242765702428,0.0237102560364499,0.0102621181451472,-0.00140830498810274,-0.00194617834985478,-0.00449610520722965,-0.0107703896568553,-0.0283781676360827,-0.0427369037116622,-0.033060461052557,-0.0472502781759405,-0.0382522575616614,-0.0427513097633366,-0.0610677060875601,-0.0676537996402051,-0.053723518540797,-0.0499741904806025,-0.0421599026444502,-0.0483317850324819,-0.0492502955059102,-0.0524191602362749,-0.0616765669504638,-0.0797220688422081,-0.0932172465811593,-0.0853874154286174,-0.0960398927118919,-0.0912210630099487,-0.104274530520856,-0.0954391842024025,-0.084980251554401,-0.0833428833790274,-0.0905565556288963,-0.103185430412782,-0.0937532324502656,-0.0883397218126518,-0.091360171917459,-0.101425093043612,-0.0933739329964529,-0.0827478870151173,-0.0812556346791786,-0.0856344160815945,-0.0774504065051753,-0.0706746016861768,-0.0644384231126488,-0.0785851589783749,-0.0894138642059645,-0.0809923137220435,-0.0908915631005334,-0.102222959117519,-0.109322548849647,-0.108371307968022,-0.110586494349056,-0.111471380782941,-0.107241206709241,-0.0939560747157206,-0.10633955907646,-0.0957384406835231,-0.0864939394774572,-0.0870469656754133,-0.0819325235828312,-0.0822953166866099,-0.0802371734522247,-0.062793665899848,-0.0814341165657404,-0.0786511499081912,-0.0637716046072458,-0.0706892537843621,-0.0774587832377214,-0.0645937309641904,-0.0584495868886363,-0.0599687835459476,-0.0515467244102058,-0.0353266308545032,-0.0312370490434799,-0.040373997965873,-0.0406924061925217,-0.0450073273334318,-0.0382045858124695,-0.0399574123398568,-0.0495107479366119,-0.0659316747228613,-0.078298610532146,-0.0735468681410862,-0.0868968423545421,-0.0966731758235405,-0.110436966221394,-0.122090793853914,-0.104605393124111,-0.11322071441825,-0.119321574747535,-0.129561247315524,-0.145818922934494,-0.150214046684325,-0.155149710514649,-0.143029448862928,-0.129290817815666,-0.116287507898448,-0.119942025954382,-0.118129921988145,-0.101276422380568,-0.0864626254830616,-0.0969493757360169,-0.085209094451617,-0.0882239909289254,-0.0972521984111705,-0.099154703566849,-0.0925237547870589,-0.0869510060371469,-0.0768105145450938,-0.089155568537706,-0.0943601537046068,-0.0909465137563578,-0.107735276321545,-0.12536831323279,-0.11558169416825,-0.10749276832554,-0.0914279950130547,-0.108771402542407,-0.109784185591325,-0.117190870271809,-0.125527486658823,-0.129049394755211,-0.145688312505463,-0.145947450760251,-0.150247240286561,-0.142802607886421,-0.130926246049548,-0.142231276132351,-0.125760685174592,-0.1258674027255,-0.126553229076013,-0.135288436822986,-0.124142892589792,-0.120472930603732,-0.109193711338835,-0.104749985957733,-0.0922962296333935,-0.0970529733427364,-0.11387168581508,-0.0996786690959472,-0.116924790675781,-0.121951719272703,-0.115761519772054,-0.104542298387986,-0.103699198106152,-0.100944127005105,-0.0887828908372811,-0.0915550924352112,-0.0930195969407052,-0.0924125465039453,-0.0752580407534441,-0.0643065325957958,-0.0584699359084935,-0.042818043025428,-0.0518405420056992,-0.0530966306224191,-0.0383803974018749,-0.0534773596082408,-0.0656283628373712,-0.0701767347021012,-0.0607654473135528,-0.0652574005454312,-0.0572355130080587,-0.0703203393816364,-0.0647002802402115,-0.0614466315315274,-0.0591689067205883,-0.0435854214852782,-0.0416128527963061,-0.0601890424316345,-0.0565554530192696,-0.0679699293571892,-0.0768836132487597,-0.0936266108850904,-0.0843766298440344,-0.0708426522201534,-0.0807296314910045,-0.0923436886827025,-0.0876245951344833,-0.103356499655767,-0.104415391309349,-0.0906302103522274,-0.102089922110293,-0.102429252986414,-0.108605017267134,-0.107634752130017,-0.114849678853112,-0.117424387382926,-0.113728923505896,-0.120312328113093,-0.130080945808623,-0.113452180571334,-0.107441236231035,-0.117814110092372,-0.115848262592245,-0.123188149001928,-0.12671225311166,-0.121831602004298,-0.116828691780555,-0.104614507828414,-0.106374182871438,-0.110351799270634,-0.0958182161691862,-0.10194941483534,-0.109922679838303,-0.107133035747069,-0.122036987195062,-0.129890732605612,-0.125714541902385,-0.114882396595321,-0.11552987904532,-0.12319169026553,-0.13570688759657,-0.121523104979098,-0.10525835679951,-0.0920192327954023,-0.10118749407778,-0.0904533370309547,-0.0944129199676412,-0.106376044034395,-0.11931032339977,-0.120211586156991,-0.1086920881073,-0.11181793259916,-0.127266558585126,-0.112534984562149,-0.10681995692211,-0.0895364521300747,-0.0985902932767997,-0.106373665980151,-0.105415553875415,-0.0996273764167982,-0.117220406892307,-0.123534526206369,-0.140397899433779,-0.13721637093616,-0.131874569939483,-0.114823083315582,-0.12427325289134,-0.124354941720269,-0.126989743593636,-0.140640966757982,-0.148452334946636,-0.147298338408488,-0.135230431212426,-0.148958096048665,-0.140749669540856,-0.148538130742583,-0.158752359819484,-0.167226461247337,-0.178724855041397,-0.177196645477558,-0.176038617486828,-0.187153337726408,-0.197700730503626,-0.194177930418311,-0.199770407538339,-0.209111029160704,-0.201589378066484,-0.217090881288726,-0.205503152886439,-0.208016826190677,-0.220711458560001,-0.22066554493181,-0.234178068735382,-0.23198919841099,-0.242374664297872,-0.235818574506041,-0.245818349357276,-0.260665767486006,-0.267171154222493,-0.274279058357637,-0.273514215878857,-0.275699569646514,-0.277601467423057,-0.28581591068721,-0.297981998581709,-0.302270573605386,-0.301564258506076,-0.304700175044824,-0.31376375228886,-0.3129304202239,-0.305957560596111,-0.308954489908563,-0.318186504234982,-0.308885132856536,-0.321824131204482,-0.321042360900644,-0.33143082323776,-0.343063046887498,-0.342510060577381,-0.34684504338324,-0.337163890950306,-0.338954380748036,-0.351387009779497,-0.345386326091847,-0.338751398030183,-0.327931107305674,-0.321668797320596,-0.312270158432643,-0.298976080154384,-0.306522193834527,-0.315425327047305,-0.316083329944699,-0.329442229637531,-0.320581837109368,-0.321745320051509,-0.316453343187094,-0.305043449154636,-0.303638722999036,-0.305494530724016,-0.299141670073394,-0.301763184905232,-0.291327086321733,-0.288646160334538,-0.279420762765757,-0.291472887566102,-0.288880166264122,-0.274856793058782,-0.263931561836669,-0.25353937400011,-0.267985874457553,-0.256227297611885,-0.249233592577884,-0.246385113614202,-0.25601355366286,-0.256717255817753,-0.260532652641052,-0.263537487647628,-0.267705439133031,-0.261222301711743,-0.272534999947402,-0.26915248292796,-0.264320199067762,-0.268885689723569,-0.275362462255935,-0.268264157393409,-0.268708166273585,-0.267096069026277,-0.270431850237151,-0.264541480540725,-0.25451494993923,-0.247876721345966,-0.262527658867994,-0.263615478051076,-0.2629217463043,-0.266688498355514,-0.280739392580233,-0.266495643501528,-0.255738283822669,-0.257641202948911,-0.252115972998238,-0.239756875008617,-0.247016364519242,-0.248607920557031,-0.246195940383054,-0.248805498522959,-0.252241666427133,-0.264317493833146,-0.269089724729755,-0.26714888599221,-0.252876257657999,-0.267378410426358,-0.269457819052332,-0.265137115851589,-0.274645775854021,-0.27599416618923,-0.282130903369686,-0.279722005398724,-0.267912730963462,-0.253695483210737,-0.241619668065993,-0.233342267012448,-0.238528811835279,-0.24548287902033,-0.250176077330174,-0.249133146532917,-0.26254154182223,-0.268838296070599,-0.261422650914824,-0.262769192792373,-0.276887598604159,-0.270131443457302,-0.278804708034974,-0.273564131339315,-0.275935406382968,-0.27144729685201,-0.279168424705668,-0.281375959592342,-0.284307447591212,-0.284811524175404,-0.288831806690168,-0.288504148632245,-0.289259572512989,-0.30010033644967,-0.297843116317889,-0.283858721206192,-0.297534255889425,-0.292860971456032,-0.294820541133649,-0.299976039727228,-0.29931245529473,-0.286031455766375,-0.278267516085768,-0.27350506211855,-0.260332953556954,-0.251465946566162,-0.257747736121389,-0.25830100485795,-0.272524149952783,-0.26108562006994,-0.257893041478299,-0.249085147007182,-0.241952973730496,-0.245765484657209,-0.24387176627858,-0.230860213268308,-0.224746586326468,-0.224399874374655,-0.223603810322889,-0.228277133916166,-0.234768052551323,-0.237886637480726,-0.231026391734693,-0.236539631403976,-0.24586640569636,-0.250266034682007,-0.246020244872519,-0.249311134299458,-0.257678233883654,-0.256025508548875,-0.244284678434597,-0.237157059032706,-0.232457871169867,-0.247791692574021,-0.259690069938457,-0.272952774440653,-0.283330549205795,-0.273477001095351,-0.284183895814319,-0.288205609358556,-0.29616993851322,-0.283947346548532,-0.29698577896628,-0.284902211887393,-0.284650837813191,-0.274935532988306,-0.267138043544931,-0.254345672684629,-0.25705366026054,-0.250099445947116,-0.252607059260334,-0.251561293115589,-0.252425432026347,-0.242393596674479,-0.227377259231811,-0.237966576001802,-0.235862686027582,-0.222730931379281,-0.23480448782986,-0.238706689392558,-0.247550842720357,-0.247163673864611,-0.248971528170815,-0.258140004872785,-0.271267574766513,-0.263457594114614,-0.25265054819439,-0.267483683836091,-0.280643872753636,-0.273638172883177,-0.261931827564417,-0.260880574176625,-0.271831316365842,-0.282438873164212,-0.292886951002776,-0.298988314972806,-0.288010039103655,-0.295310072596128,-0.301491713800332,-0.297990043956098,-0.298820078539143,-0.298014296420228,-0.293382934478825,-0.28623936462251,-0.286202234195781,-0.291451714694195,-0.28368110618202,-0.286442263797463,-0.279145433420104,-0.281113592040723,-0.29380915729719,-0.286446386451975,-0.2747356178232,-0.266302128563644,-0.256333726807301,-0.265828079648862,-0.280458234621343,-0.287679782371121,-0.276577707224097,-0.263116544735315,-0.248858175139567,-0.261395705737878,-0.274967257737668,-0.272465164973301,-0.270412476000865,-0.26013855160906,-0.246199070073697,-0.241531921650407,-0.245083607467764,-0.248652993521294,-0.258144032614004,-0.253712752041658,-0.250519964809403,-0.244569642517236,-0.250893333746433,-0.251630239565268,-0.237277116237201,-0.239760895647597,-0.229724780245922,-0.230344599319003,-0.22243838073219,-0.211470814970143,-0.224213130440142,-0.219673736343708,-0.232208831098867,-0.238269365557798,-0.246113259784968,-0.245168714878425,-0.257581303003523,-0.263769706178009,-0.257741995131993,-0.24443331952531,-0.258975995515048,-0.261444055565421,-0.265425848602033,-0.263583769167722,-0.264723639958704,-0.250093796242366,-0.243807279883958,-0.236878130759021,-0.245225454678544,-0.246345907011856,-0.246167021402546,-0.242500035295222,-0.240726009850586,-0.255808932987031,-0.267795521326966,-0.274425783144615,-0.282829984503877,-0.286616106148727,-0.28068898759512,-0.270042746520286,-0.27500225292155,-0.277916097393162,-0.26908012105463,-0.258932376490527,-0.257347737941114,-0.249927156632276,-0.262548777910843,-0.260835679935619,-0.258125758187185,-0.266858647684932,-0.252356539385633,-0.259164658563586,-0.270809161207725,-0.269063798667673,-0.265542537144189,-0.267358744953403,-0.26146047419939,-0.263227576593179,-0.274172400091594,-0.260015640387096,-0.251122409148664,-0.241078183317177,-0.23143654371016,-0.240630167488073,-0.236219801025804,-0.226765800626053,-0.231652281105807,-0.224219387583484,-0.223019754414055,-0.222508782893247,-0.222003471758262,-0.235571564560274,-0.235665176406842,-0.22365395887707,-0.212694861581818,-0.197102460035593,-0.19868051413215,-0.201207664007112,-0.187237553285233,-0.195628859116542,-0.195156676394465,-0.204724305250746,-0.191536716254357,-0.197593156878324,-0.192414002347339,-0.182592208182391,-0.176725235438704,-0.191814988383307,-0.182633081877906,-0.174512997190642,-0.166536562754465,-0.180597955241488,-0.189594252765378,-0.200270505104927,-0.207740369285612,-0.202614936072677,-0.211481071766746,-0.20518465824922,-0.202304318053933,-0.206702849258476,-0.208211723365188,-0.220537678619192,-0.213851061187554,-0.211008637896093,-0.220360597503344,-0.215613987434124,-0.208143135718032,-0.201760109700209,-0.214404223241892,-0.223240278974997,-0.224800772757506,-0.223959929104987,-0.227644442182144,-0.238861912653762,-0.241805312928762,-0.242367006266675,-0.239350714517831,-0.225943048541098,-0.239540027446914,-0.25159974957244,-0.245541863651766,-0.245533155933543,-0.233344453286866,-0.243318133328956,-0.232248565960496,-0.229197588951433,-0.243266859832603,-0.249684998854557,-0.262310484103586,-0.274958571395479,-0.269539749314486,-0.275826346935876,-0.285438287181123,-0.283582079733679,-0.290750003633786,-0.278093736230455,-0.290536176228321,-0.283349358793217,-0.292840692575225,-0.295831336335287,-0.285679295202909,-0.299658908119334,-0.308462464852756,-0.313666127235641,-0.325976941564124,-0.319129290747624,-0.325707212966444,-0.323558015467841,-0.320392588780903,-0.332686498946923,-0.331721576736164,-0.322537503202905,-0.311141238882322,-0.304194450426322,-0.299475867921259,-0.295374959755455,-0.306401474590045,-0.29754956584378,-0.294734720481829,-0.308363343797891,-0.312247034291378,-0.319068653411606,-0.331410445310544,-0.338213475183526,-0.327240833110321,-0.339814626194808,-0.347784210967223,-0.34489512628627,-0.337086888137171,-0.327012587395083,-0.331044187023232,-0.342222039051487,-0.351015560909541,-0.348214797067421,-0.346176301261198,-0.335872574709771,-0.328773336128695,-0.323960373436279,-0.333329917196068,-0.326256127863714,-0.334678474482196,-0.344747858937035,-0.353485620611811,-0.344861002554074,-0.335587642824361,-0.333139429624869,-0.341291106483897,-0.330355109317137,-0.338960132913876,-0.342945772850605,-0.354927778800342,-0.348617131301443,-0.350494448173536,-0.356044943086635,-0.344917632001777,-0.333976892650423,-0.344434247631406,-0.333923274946522,-0.329629493122091,-0.335971558172048,-0.340263332006192,-0.350338575426985,-0.359991828843347,-0.349856845863716,-0.362304628267786,-0.351341575934965,-0.351344920029451,-0.349452074896302,-0.345030913376413,-0.336856131483834,-0.335954161527749,-0.344384365029496,-0.350937435538532,-0.351225409832402,-0.344559332331787,-0.350736303743767,-0.360609385366309,-0.359321271188886,-0.351179505317381,-0.34526201041983,-0.354712601870502,-0.366938719232331,-0.368848244039449,-0.371820175782868,-0.366052532527882,-0.354699452291759,-0.364234127007771,-0.374561261113929,-0.385832021969637,-0.39538359410541,-0.390769799156643,-0.386339643882978,-0.376661104230807,-0.367820425868548,-0.366980748031623,-0.373903852333086,-0.368094382112693,-0.369443141020134,-0.373014164076935,-0.365176969083615],[-0.00106350644491615,0.0138197279198859,0.0169531443812589,-0.00127989501326131,-0.000628960511341314,0.00163306402370389,0.0129718852294125,0.0104244047480122,0.00721041588266558,-0.00140403739472805,-0.00221126398869564,0.0119930816288736,0.00665845909391805,0.015249322082316,-0.00343154267975743,-0.00393570642215213,-0.0153519333820629,-0.00410935832667636,-0.0134319596527254,-0.0281400287601834,-0.0267950623782545,-0.0421428772651911,-0.0426992696560038,-0.0391950088747437,-0.0385384618664666,-0.0413225749432401,-0.0512762722078228,-0.0651522710374671,-0.0826045095235617,-0.0709222357790269,-0.0528239266225968,-0.0378861977215561,-0.023756462754975,-0.0341084658216794,-0.045031047011075,-0.0271509048143246,-0.0235347547088582,-0.0355659684567814,-0.0377681319021463,-0.0246824855537672,-0.0376373860012129,-0.0345016945451477,-0.0481957653699144,-0.0338050100764252,-0.0170281168203082,-0.0354213879100269,-0.023195707746966,-0.0405037674737408,-0.0309376790874624,-0.032139715498683,-0.0230567570578677,-0.0148634518058631,-0.0285953264250135,-0.0438980040285213,-0.0329280238272335,-0.0465800199856464,-0.0323591734372126,-0.0319913766351819,-0.028332613321411,-0.0282961188906014,-0.0469048290509495,-0.0384742916627456,-0.0203401737292855,-0.0307837546048482,-0.042381041530467,-0.0294467059142197,-0.0452592806887524,-0.0428429037523833,-0.042083789100991,-0.0335335138984149,-0.0466083989906764,-0.0337340138648393,-0.0494542261278273,-0.0322653461555287,-0.0206601617206499,-0.0356415276694437,-0.0282506802502401,-0.0471055063174778,-0.0453807099291578,-0.0524625812878359,-0.0692237713112165,-0.08191398397592,-0.0748312028643003,-0.0750510431176783,-0.0618211684668906,-0.06519833351201,-0.0763578152916703,-0.0614723302094949,-0.0597674096267733,-0.0421379660263356,-0.0466263300766353,-0.0641046838668679,-0.0802800911954146,-0.0739148702028036,-0.0847041798387778,-0.0852096976440492,-0.0980761483891681,-0.107363049048226,-0.101652186028577,-0.114953752969299,-0.126229042942059,-0.127790342400959,-0.13954891465536,-0.140930687726281,-0.13457909013252,-0.150645471324705,-0.166590319661848,-0.149949272784332,-0.149660096078745,-0.154786073484194,-0.157381471566429,-0.144291597896747,-0.158908971837603,-0.145207381437731,-0.137526840087576,-0.147217749213138,-0.136976774602115,-0.122149218427209,-0.126245936404864,-0.124271607504851,-0.139020373295662,-0.13877558670899,-0.149880573794306,-0.14254934137708,-0.151478571992663,-0.138074065840357,-0.131422925270194,-0.130968029674408,-0.144224237552147,-0.15685196826149,-0.173584296093225,-0.181459480446543,-0.165796926226235,-0.176744581806457,-0.166087444725361,-0.168836812012576,-0.163867616702972,-0.153684486755828,-0.146983080352885,-0.155504230833682,-0.168478395375565,-0.162533358218332,-0.154767688499338,-0.15825754552954,-0.165855485869548,-0.164729308104149,-0.165618437262773,-0.173870641300949,-0.186185152155216,-0.171739568849648,-0.174959004749577,-0.165672637251266,-0.15178984831909,-0.150809022317761,-0.140347305632526,-0.14136859546911,-0.140669368116696,-0.141559455997498,-0.153741236219065,-0.148510852272891,-0.136986278151177,-0.132236967677871,-0.115722275877359,-0.115919847046822,-0.107538388500129,-0.113923263279268,-0.107998668513097,-0.103290334910385,-0.105328846255593,-0.103802398819687,-0.101183861902501,-0.107109799630494,-0.116455774109442,-0.130566702102223,-0.140914580428084,-0.135788080456441,-0.140724723958205,-0.140878749041871,-0.136084769055455,-0.152357768202761,-0.154447667238595,-0.165006474717783,-0.167338159910093,-0.177319512004422,-0.176554829475953,-0.166146328402138,-0.180655684405348,-0.178551534210705,-0.189645014999638,-0.205178570287818,-0.189289083315223,-0.192733872229092,-0.182495024277887,-0.187683448325004,-0.18401701338216,-0.197799002528222,-0.183412844276856,-0.183257908325724,-0.188403920224851,-0.186560861553596,-0.184262669467334,-0.193883416618459,-0.19018006189858,-0.178647971605065,-0.18209341848584,-0.196223608236185,-0.188739337497631,-0.185542466762675,-0.183378893097948,-0.176390131872848,-0.166199323656965,-0.172459764668344,-0.169072605780702,-0.176337580732718,-0.189187170393066,-0.174725899641237,-0.163969043320827,-0.16748616317799,-0.180384434961443,-0.195107594786012,-0.210643131104369,-0.196332243334057,-0.20124996930464,-0.201343111520356,-0.187502376404017,-0.18229352381861,-0.194392089736667,-0.187406428360671,-0.193576338854058,-0.179724807577403,-0.167075322817441,-0.167724258920922,-0.167271606870292,-0.158021308987669,-0.141826651380487,-0.135970590825785,-0.145592176274598,-0.152158517301856,-0.135752135086613,-0.121968264796844,-0.114681464034554,-0.125187862125722,-0.133278571169949,-0.138395418820726,-0.149581149846934,-0.166233197498043,-0.152544294876027,-0.161435548766527,-0.176618254032804,-0.166343437113944,-0.161286414077234,-0.170862915612146,-0.176379015998745,-0.162262864563135,-0.154894095743676,-0.15574638707914,-0.151387431512299,-0.160806429930419,-0.175221454749969,-0.171427437170797,-0.182622909101752,-0.184440074085379,-0.174437691023696,-0.166993498742881,-0.159209698790058,-0.173787068895603,-0.16953452668405,-0.154748820741721,-0.143198002529684,-0.15301042987967,-0.142431864689032,-0.14945738481262,-0.137633212800425,-0.146011485791033,-0.143866853835511,-0.128996048218099,-0.121631227541252,-0.10901084149172,-0.0919937235447242,-0.0895431099537584,-0.0820375716514323,-0.085129008579291,-0.098653668590347,-0.0888891341057916,-0.0884342285444296,-0.0757158859676391,-0.0859905686062343,-0.0915571828715457,-0.0888639756900275,-0.10080617798816,-0.0857801533233611,-0.0858058041989227,-0.0868472552093905,-0.0686223874572802,-0.0613027586622031,-0.0698366296466304,-0.072287096512085,-0.0701282891581524,-0.0595922277340338,-0.0446225790330448,-0.0533189874310581,-0.0686312249063613,-0.0563814749329847,-0.0431390697071481,-0.0525069302416042,-0.0667402837765301,-0.0608078033537339,-0.0557057629853783,-0.0479798287961332,-0.0646367637499869,-0.0785509668785904,-0.0645938477807831,-0.076868544408325,-0.0901380177944553,-0.0744490185165517,-0.057770119132549,-0.0757019113365028,-0.0879687828766873,-0.0850745480783008,-0.081915820399476,-0.0845815247682157,-0.0804889285835646,-0.0672749096307887,-0.0583172404570391,-0.0521447303226437,-0.041363591866131,-0.040384070572513,-0.0462947557299845,-0.0652120217477143,-0.063141241041436,-0.062165088223978,-0.0604213162080358,-0.0533614324580358,-0.0514687248867645,-0.0538207071647953,-0.0684721973010473,-0.0852807113532728,-0.0726501782693716,-0.0779391955335257,-0.0621311429559266,-0.0787770536009915,-0.0691855779349417,-0.0524550223038366,-0.0376540052840527,-0.0344288198887803,-0.0294407880300389,-0.0418678130266121,-0.0410482648351788,-0.0358884850531971,-0.0507122412583537,-0.0365958911966725,-0.0390946098970271,-0.0501752134284498,-0.0479625679529698,-0.0579928196865013,-0.0701777929092112,-0.0566484176820987,-0.067871448218788,-0.0774884143525816,-0.0785077921071653,-0.0940950646456171,-0.102111774509755,-0.098694563407232,-0.0920210478073972,-0.100911700588198,-0.110330614717604,-0.102125195205707,-0.101387719728404,-0.107966680944424,-0.102212280704589,-0.0936994393018341,-0.110102109371533,-0.11579407254841,-0.132992440466862,-0.147031599367272,-0.136976144991926,-0.130177436388601,-0.117287582284825,-0.105595286366434,-0.105747765093292,-0.0968297365806464,-0.0991706403425763,-0.0996812039410645,-0.11608014995643,-0.129416175888796,-0.120092979859144,-0.107563819741595,-0.0977631578126177,-0.114274193085017,-0.123843505134052,-0.125419006627759,-0.137574074576099,-0.148898152326516,-0.139961139027473,-0.140172710382491,-0.1282538348741,-0.11150062122435,-0.111934338645066,-0.111282452322646,-0.123205390375894,-0.138098907488346,-0.14004517483577,-0.146132433100806,-0.146286400786197,-0.151677720943789,-0.148681315118663,-0.13378579260031,-0.118858959664441,-0.131273150257176,-0.121488892155341,-0.105918535643909,-0.109692134065345,-0.10767301179849,-0.0958747550414869,-0.10675847345797,-0.115197462398268,-0.109368745664239,-0.107909407591969,-0.11153935635552,-0.102719919133835,-0.101459832702327,-0.11056638015259,-0.120220737521196,-0.132886732642793,-0.135344827575959,-0.148611231873873,-0.140209069062708,-0.133807552931985,-0.134177076952759,-0.13894334484665,-0.149474732734569,-0.156880993098881,-0.165529641960196,-0.150705947814727,-0.149064885769399,-0.164535234296872,-0.158670129255165,-0.150606785710064,-0.152356241601941,-0.151728845104648,-0.157189113130798,-0.141140848703509,-0.134193964365314,-0.145821527882322,-0.146910157204454,-0.153356168933934,-0.149137920708116,-0.15839689882458,-0.15617590552355,-0.162164566148576,-0.149836986535735,-0.136243589512988,-0.125635457009247,-0.136711519917201,-0.121997133007356,-0.10598903555648,-0.110674232976657,-0.121440969240952,-0.112259104309549,-0.120182306469414,-0.11286627727346,-0.123054831246872,-0.128959771839384,-0.133134224011304,-0.120258541287668,-0.123846729479713,-0.124565151444487,-0.133032087813154,-0.138404265565039,-0.149510468928614,-0.162693938140817,-0.165554841637446,-0.167153043223111,-0.166977320640051,-0.174222461370193,-0.178395888993557,-0.188512781771675,-0.172634604067959,-0.165486201767329,-0.180046501569496,-0.189109761352033,-0.195242651874739,-0.20373400259821,-0.201788864774013,-0.187660016542576,-0.177165914052454,-0.162861619136274,-0.170896087175329,-0.170286793849179,-0.167381798598208,-0.164371204583044,-0.162480460130052,-0.170625030086599,-0.162801268944899,-0.14825434503689,-0.15162452964322,-0.136015305653757,-0.127441235349603,-0.122527673990278,-0.116297740499537,-0.119982362538488,-0.121278998963227,-0.114783861274577,-0.102626595355572,-0.0869662987903904,-0.0761712262894818,-0.0760947811929336,-0.0690828776379987,-0.0572837066965804,-0.0404106500329088,-0.0595709208484431,-0.0517568139798644,-0.0385482445864179,-0.0421428802216244,-0.0386976769525195,-0.0436754843218302,-0.0259694053625792,-0.0180857172112185,-0.0181721780032653,-0.000735797441704267,-0.00471027780417754,0.0139353866287506,-0.00108134584475428,-0.000675718261084146,0.00531573625360293,0.00471382198267212,0.00688579336070183,0.0148319146566187,0.0118392064626529,0.00972356818715236,0.0130956107395845,0.0311739270821929,0.0447304354893125,0.0340009420945395,0.0236588300557892,0.0297671981582106,0.0202405485796711,0.0178769224424056,-0.00215884847489112,0.0120755701675204,0.0298164568350834,0.0270838193877114,0.0180163018440931,0.0105921122869113,0.00775796196078393,-0.00958145091286744,0.00484865482164931,0.024083682027723,0.0121192951265541,0.0183516359668501,0.030089529210136,0.0477785681407132,0.0362436218264865,0.0326813916608597,0.0338716133794832,0.027687799935729,0.0228108709825463,0.0351606624706604,0.0488832119872946,0.0290844514597772,0.02194808840731,0.0248409380272419,0.0127244874189427,0.026533423738843,0.0194058410494897,0.0252790504146605,0.00826092535509138,-0.0115357795368373,-0.0256866840479043,-0.0225505935222322,-0.00782033164851204,-0.00970898466756642,-0.00685815023285352,-0.0107955840837645,-0.0163810270087389,-0.0229671340650224,-0.0271681507960261,-0.0295788050602538,-0.0364724865165525,-0.0427321031310223,-0.0267966380087358,-0.032134547587395,-0.0208541434511607,-0.00189764181973862,0.0122766322089134,0.0136384665761629,0.0229352529828415,0.0422627280266967,0.0396122203124707,0.0501418478757678,0.0352495838476221,0.026995247137148,0.00973536770879546,0.00758634109285006,0.00888303734932605,-0.00187137143782523,0.0104889324052553,0.0285200789991131,0.0100313347947116,0.0119409698595274,0.0248312791656371,0.0388944173674874,0.0310379065882149,0.0346419388969026,0.0537713910241777,0.0672451017820794,0.0736061457258459,0.0808095533764985,0.0892434908773894,0.0810445271869313,0.0683267609756102,0.0663224766873662,0.0696375649402985,0.0498921025320433,0.0465496697411065,0.0667294040914439,0.0462300670919491,0.0421457481386442,0.0316415342499232,0.0333981424924277,0.0441248237355998,0.0254686529894697,0.01108877524526,0.0240067087669362,0.0285609995639398,0.0388503066789987,0.0348523113201176,0.020030458511616,0.0148756097887024,0.0316923864267837,0.0494158367220168,0.0647823641520431,0.0590420857487071,0.0705328096213322,0.0704327890914922,0.0723512032470106,0.0865717256803744,0.0856321194314273,0.0896800013108079,0.0832055840992423,0.0698073086582185,0.0900974992321653,0.103287962141092,0.106892500860654,0.109377258108682,0.101143583500637,0.0986416749269627,0.104972253970315,0.124963588004145,0.130647273665151,0.135985114388363,0.12335498372867,0.10781110189158,0.114788261992113,0.109913505443798,0.087943843316723,0.0927199556082718,0.103170365806525,0.0929360712813063,0.105828644692333,0.0855366305755751,0.0859479850832352,0.0776028339115586,0.078663606338764,0.0983325187842554,0.0858285849420077,0.103846686739837,0.122764663897656,0.135559344359225,0.122645518564159,0.111139643454052,0.0988950696422326,0.0900420565588003,0.0859727178243888,0.0977929441052978,0.103550919874623,0.118304551688772,0.131311179128991,0.131949345809134,0.151500500187912,0.143798606344411,0.143495390391168,0.148464219358502,0.145887155135485,0.128196181112253,0.114367387343066,0.12562008525503,0.105614184695071,0.0990458024448553,0.0879241814173812,0.0968603254412195,0.0951231238200887,0.100814269939497,0.0799641614983873,0.0717934998432537,0.0704832376897191,0.0593379858442218,0.0421075802769058,0.0264392368705104,0.00891977636231012,0.0128313807720772,0.0162430819469026,0.0244093377179793,0.0421214520669,0.025640716743579,0.0226361029835358,0.0125201508548178,0.0260001025488115,0.0164163844616501,0.0106114999492919,0.0136005077988079,0.0291955454284372,0.0100768646332623,-0.00122568620228503,-0.00634508001333922,-0.0229287433955454,-0.0160685177349711,-0.0350124875558442,-0.0376546467547632,-0.0430648326408969,-0.0416653474323817,-0.0260138458876058,-0.0368737396132144,-0.0343350463371476,-0.035510497545499,-0.0184537329799606,-0.0181834443065824,-0.00338313590983974,-0.0232266602762852,-0.0315921691081116,-0.0315699452891708,-0.0126162612293219,-0.0085965738206476,-0.018491752512123,-0.034663479883287,-0.0236418820139882,-0.0414618633174891,-0.0550783844589721,-0.0401373134086952,-0.0517740569489878,-0.0641869887593588,-0.0542043963237117,-0.0649506588613556,-0.0595495386972816,-0.0474063287691222,-0.0594652476554316,-0.072423702506962,-0.0774700363926268,-0.084241246787255,-0.0856040056321864,-0.103781811714579,-0.0960952646649736,-0.0941879905512543,-0.076733101421234,-0.0802088369140754,-0.0672926013308898,-0.0789113191096357,-0.0769918354176303,-0.0943753490452356,-0.104325154617703,-0.0982578897395228,-0.0892932546159428,-0.0994231790518298,-0.093238208413106,-0.107570774950097,-0.114606213817271,-0.107134262046304,-0.0914629568782792,-0.075215725544416,-0.0758799186861714,-0.0709208687352042,-0.0740202563443833,-0.0826730253131587,-0.0687875075715545,-0.0779389664557978,-0.0607156361567135,-0.04815449744004,-0.0543158200816231,-0.0370618711833696,-0.03279198525341,-0.0420998082425971,-0.0346497746559937,-0.0508965684686079,-0.038274233943635,-0.024754274066015,-0.0308237621070441,-0.0139056689394709,-0.0271156702682539,-0.0446896181207058,-0.0488890437501344,-0.0449221784301355,-0.0561753176178799,-0.0617673411497053,-0.0513282720695711,-0.0372332276005938,-0.0345145426443454,-0.0409078968329802,-0.045592414883824,-0.0541702425249927,-0.0553981421245288,-0.0634475082548344,-0.0798447263377522,-0.0821697411667256,-0.0639558903051372,-0.0771102359161215,-0.0689345177014481,-0.0519718231716564,-0.0555903671165897,-0.0650567424208106,-0.0679643366692742,-0.0568604154493322,-0.0656760215703684,-0.0751015878059373,-0.073094982676984,-0.0704580507630654,-0.0717038246992242,-0.0871694433855476,-0.102645421764613,-0.116511825229856,-0.128747138088923,-0.128155391483938,-0.137907442324628,-0.14437013808028,-0.146353999116909,-0.158381140606285,-0.172897105738352,-0.162995053041092,-0.167916190096232,-0.172521723073818,-0.15975932978802,-0.144390032686315,-0.142029512347083,-0.13639858991941,-0.119803884221234,-0.123025251019284,-0.123628626524718,-0.108134894012158,-0.11094407045831,-0.0987316203735596,-0.106715644468409,-0.113676761946454,-0.129666384271466,-0.125030953645541,-0.111247255425773,-0.126743685810674,-0.130282165833219,-0.122425248818241,-0.107365151776703,-0.0932306664160465,-0.096760352371343,-0.0978509379546625,-0.0835988940587552,-0.0981795405226566,-0.0971252297458668,-0.0953084299834244,-0.0967162294478484,-0.104109024655019,-0.112549495670501,-0.096983548194429,-0.0828716468741379,-0.100453760215808,-0.114186192551675,-0.109178338958171,-0.12409137429901,-0.122310467179118,-0.130044492658851,-0.119776407059234,-0.103161772567378,-0.100519816197747,-0.115286005484993,-0.116502319900498,-0.101508920047126,-0.112564679877441,-0.112316881477901,-0.120234304528203,-0.121601753110129,-0.110151443668767,-0.107979831078166,-0.123139082382064,-0.123052890360313,-0.121553136064665,-0.118090316501241,-0.100471282416776,-0.0858199263401467,-0.0873448509334231,-0.0957836662503998,-0.0955975067699104,-0.107428134155545,-0.0958276768703169,-0.0849917120731094,-0.069656504805831,-0.0853420404891047,-0.0990587951484919,-0.0828599172303157,-0.0648623457631441,-0.068704823793592,-0.0558095522497586,-0.0514640211343337,-0.0569750929477217,-0.0626273807713259,-0.0713134819882434,-0.0852980441011074,-0.102887351905004,-0.0852120741388135,-0.0675711598323192,-0.055044771862606,-0.0372450726569326,-0.0370785520324924,-0.0410046692318572,-0.028292270112791,-0.0174398098528677,-0.0117911626595467,-0.0142007109244335,-0.0168477500939936,-0.0326837605144522,-0.0298106965716274,-0.026855842073339,-0.0162908728703529,-0.0102310783067012,-0.0235124909844874,-0.0323727186134404,-0.0158592011875459,-0.0264281576586278,-0.018391866195686,0.000622784988090652,0.00776724720459043,0.000646209629511674,-0.00684514934991509,0.00181492400830985,0.00152712777762032,0.00588709136957433,-0.0121164955700869,-0.00191278231014413,0.00754588115529287,0.0015437628134265,0.000132961306092083,0.00176683490732787,0.00333000058841493,-0.00955323366106975,-0.00731548915986202,-0.0248139918094424,-0.0242044173166254,-0.0211497585850128,-0.0222367594114034,-0.0379880823819689,-0.0275139704140343,-0.0289042507776922,-0.0341802442809189,-0.0387349824975382,-0.0474343858058573,-0.0398595745532708,-0.0365398973630895,-0.0261831870519145,-0.0089287174045064,-0.0269955401525288,-0.0389141685625741,-0.0227394526586479,-0.0409462052682283,-0.0467584235526185,-0.0387360312145955,-0.0390193772315583,-0.050134341141892,-0.0478066779527535,-0.0386712796271119,-0.0289030143189373,-0.0147397712158658,-0.0190281534242688,-0.0273370843286923,-0.0370289748739807,-0.0263939983540787,-0.0146660110135148,-0.0162295254183653,-0.0166323969209251,-0.0188296367613513,-0.0154235191896792,-0.00970391684996574,-0.0028608018825278,0.00774965805478245,0.0232397450246133,0.0189350688590382,0.0357104730026352,0.0214035150606349,0.010481109352086,0.00900458124884085,0.0160627526195993,0.0300777307647788,0.0142041517527238,0.0262876780687711,0.0379469891474218,0.0517735699446391,0.0451242518533692,0.0476042910284165,0.0432245358877392,0.0268005600849692,0.0178818030611156,-0.00241942966149722,-0.0177532722646238,-0.0126383072934853,0.00556158728120448,-0.00025891306771153],[-0.0145162242185325,-0.00578580013559427,-0.0249420759523219,-0.0206929970910156,-0.0319713969502577,-0.0135261637977565,-0.0118041368943825,0.00792240572872505,-0.000314724862777727,-0.0192766256017249,-0.0235872047312664,-0.00645358477118296,0.00533154585325324,-0.00486717947976956,-0.00610581072834615,0.00169258712334552,0.00480237586442134,0.0153336655766125,0.025637302309208,0.0394128510357423,0.0324629558382594,0.0307031898456922,0.0464281552999857,0.0259407901488744,0.0350350974332061,0.0161900641073676,0.00822297615473655,0.00269296052582946,-0.00320467747223918,0.00968577592665643,0.0215497954631583,0.019552398867263,0.0219078516071218,0.0413499760188762,0.0411589062059514,0.0486410141956259,0.0278585338375079,0.0456284848944817,0.0300012855886409,0.0296345079089915,0.0251972530338178,0.0297925382789546,0.0400347854266361,0.0303165912425358,0.0106365152904468,0.0264910205695055,0.03185622805768,0.0261330566766884,0.0200186785309713,0.00637328162988493,0.0248099333528264,0.0407451736435158,0.0450499953952734,0.0591001231923041,0.0446173558794905,0.0254790061834012,0.0316255613173499,0.0222474055522575,0.0410095846987781,0.0489369654206713,0.0502865039223888,0.0653287166577292,0.0480321863001301,0.0557935364524917,0.0661646899725357,0.0449287712862221,0.025681133539833,0.00662099615365919,0.0115662241163594,-0.00394789636649528,-0.0208963042048174,-0.0389495270295348,-0.0221752407715951,-0.00840997173258662,-0.0183297477003703,-0.0110191518113123,-0.0249232156840988,-0.0168056387357997,-0.0298612115805788,-0.0220187947041737,-0.0197009355948361,-0.0362586459482599,-0.026555953694492,-0.0113991279442214,-0.00172292090184756,-0.0154894441380208,-0.000238309188375307,-0.0181287085642293,-0.0287775782360516,-0.041090845270678,-0.0332164988829731,-0.0429091589135637,-0.0517490049414607,-0.062654733962507,-0.0535355740315793,-0.045188381930485,-0.0454815425237027,-0.0510947011793635,-0.0349311917851194,-0.02556682377343,-0.0170658616587015,-0.0199407925417482,-0.00843493211591329,-0.000837176417844421,0.00622121741962411,-0.00585873976211515,0.0127695698718231,0.0123354750796412,0.0206176478269597,0.0203058692840317,0.01213573153766,0.0292780439763041,0.0344384428465294,0.0204457573577761,0.0144884627573616,0.0268992189840522,0.0139681458925416,0.014721216736244,0.0251743712723989,0.0446185308169906,0.0323350266574127,0.0163983823996923,0.0131510648673423,0.0332135162423401,0.033451916514545,0.0228728007148762,0.0205659253619614,0.00744594408038157,-0.00235578027617211,0.00038130827775662,-0.00770476475003479,-0.0206432981239337,-0.0116122425505062,-0.00615230194547489,0.00577140444093338,0.0225867267795949,0.0287432744795886,0.0111899180026613,0.0234410068589024,0.0102454949503361,-0.00226500029652676,0.00851899618874263,0.00929548895532184,0.0148365974655027,0.028343003749453,0.0454679322476874,0.0573644523925367,0.0751569338309654,0.0668441179032984,0.0755504787992125,0.069051516909828,0.0552420880182791,0.0600073237057013,0.0795601074065797,0.0711007478838197,0.0891267298597738,0.098967320494675,0.0889134482041403,0.0883572379422288,0.0732402868973971,0.0758797856203368,0.0775123896004657,0.090188889979953,0.0867523286540985,0.0904729547470948,0.0866630216387307,0.081336882306887,0.0791114879554855,0.090092554183866,0.080187433716947,0.097051567714395,0.11350096398886,0.0946819103697476,0.0797223671642318,0.0609761053777964,0.0746556417088435,0.0754314015749007,0.0662149105961654,0.0748511184658416,0.0599267098581244,0.0640875557572409,0.0647570099242469,0.0646557648972894,0.0719192453385125,0.0607432420581766,0.0687318639809344,0.0874979392469681,0.102150051390482,0.0913182581242118,0.0973758666118045,0.0868366630121482,0.0771549787601742,0.0572462768811648,0.0440890688136992,0.0553777308962391,0.075067974190316,0.0676369341001855,0.0828335000163449,0.0940622659205388,0.100798940362369,0.116835587879698,0.11587449255634,0.101305383565259,0.099398300332999,0.105895989408463,0.116708595986529,0.0954592032545227,0.107946715868429,0.0983900498526005,0.0861628419051965,0.080596346477779,0.0964273474498512,0.0885962725049543,0.0973983109761523,0.107903512209867,0.1290061888958,0.112417384638469,0.113040322314073,0.129421020283548,0.118815388267103,0.103755424399077,0.106237237908118,0.0994363760559993,0.113326482888925,0.120279599507422,0.139523716818774,0.123501647346678,0.125275454953573,0.104896921915959,0.108212635860578,0.0881179147174684,0.0707287334428732,0.0858704356756974,0.0894927682892597,0.0784839771976691,0.0820956018392998,0.102873477233369,0.0901932916607027,0.0785773176689537,0.0648634438585052,0.0565551409969844,0.0550521818081033,0.0419948482964416,0.0370956710579673,0.0202832772705734,0.00838651273796609,0.00285532444254732,0.00770032525951203,-0.00425764488014913,-0.0120274398348007,-0.0299280468085034,-0.0206011538527603,-0.0155002662749835,-0.0342196111250231,-0.0456901100198811,-0.0337375619439654,-0.0479907225207211,-0.0653936889732292,-0.0737667153770465,-0.0682574354778609,-0.0508142855368651,-0.0525905007730492,-0.0697168026297937,-0.0687087674160187,-0.0840909231553667,-0.0906585276342463,-0.0860237028333426,-0.093769946172808,-0.0928247628551088,-0.101746478916804,-0.107801720883447,-0.116036128915946,-0.110862415963232,-0.124273754259758,-0.118628333723248,-0.107782053528207,-0.11423734164447,-0.0969497886206198,-0.090664636107999,-0.100168234174201,-0.0837238473487639,-0.0773814323208047,-0.0895865017628836,-0.0752143858616322,-0.0831335082262925,-0.0773318926776989,-0.076265279364681,-0.0670892083041411,-0.0544092070795821,-0.0528864795575315,-0.0687236543079547,-0.0599656384365561,-0.0634445856155221,-0.0721120866929787,-0.0652505042347138,-0.0520954555571057,-0.050230624072768,-0.051325635636924,-0.0331048034392822,-0.0468793729627657,-0.0413051101217933,-0.0570913848611337,-0.0520140453373409,-0.0692492968757469,-0.0778485914268792,-0.0876443618266373,-0.0748319759795787,-0.0636727028599243,-0.0777970188829589,-0.0639544217711293,-0.0727869073877959,-0.0548503509172095,-0.0598227453213984,-0.0644485800901109,-0.0822005619926465,-0.0679610991967049,-0.071662028531064,-0.0896918873984359,-0.10074035831747,-0.11603078760752,-0.129541713008544,-0.132039810172549,-0.129309508468113,-0.139613394778801,-0.143715651230735,-0.160499100058376,-0.171530776353815,-0.155733301642057,-0.141511265416411,-0.139447335686593,-0.130635828570683,-0.125699917126504,-0.119640148994355,-0.13716628469898,-0.133045291377002,-0.127118659728952,-0.14192141380636,-0.144623116251902,-0.153538190807073,-0.153656952837667,-0.15049226710935,-0.155308194724507,-0.14015004969377,-0.134655496379907,-0.134394459271773,-0.131856534611893,-0.146156148872682,-0.139079883274752,-0.125633906334299,-0.120509173102459,-0.122754051743902,-0.116319082146444,-0.132395066418844,-0.134636772463384,-0.130713575930141,-0.126203246599126,-0.112436530660299,-0.100980669683525,-0.103536744008027,-0.114630351439554,-0.10288552192981,-0.0857376763285869,-0.0696425745256779,-0.0619189934392708,-0.0605658177562969,-0.0677660276840403,-0.0841929700354537,-0.0946190658962939,-0.0837114594833481,-0.066185531286579,-0.062863165565556,-0.062658894764818,-0.0707251325019016,-0.0587041298379695,-0.0609384982504129,-0.0751990018556831,-0.0874249439219075,-0.0788268810230596,-0.0773692230729862,-0.0594718921485269,-0.0407801918037414,-0.0280521563764818,-0.0253448228508663,-0.0258776091732401,-0.0155482245206683,-0.00222099102733531,0.0036026571154002,-0.00583824914872133,-0.00932491727604812,-0.02880417582462,-0.0266455401223095,-0.0238265197384009,-0.0362298800779511,-0.026782429303015,-0.0436791530764237,-0.0563751572960446,-0.0567249333336991,-0.0658851807353348,-0.0755789169420581,-0.0732939037495981,-0.059790187477432,-0.0601019426113323,-0.0617953284362248,-0.0778754996289244,-0.0843492146665289,-0.0811126569668282,-0.0656667410364477,-0.0824309276250711,-0.0876622208420293,-0.0992982032911846,-0.0846051320172921,-0.0908702306224753,-0.0766477626029684,-0.0856754792075604,-0.0986478396976791,-0.0968864418955612,-0.0808078913170815,-0.0677340434939029,-0.0609034588564813,-0.0653395490967247,-0.053113189652125,-0.0355549339991927,-0.0334576958881208,-0.0220494387778879,-0.0415374344214768,-0.0596673911830179,-0.0448612681234976,-0.0517414255949755,-0.0520411401385932,-0.0400261281330843,-0.0218267100612713,-0.00936002909304456,0.0100093188646977,0.0128696386584657,0.0214354383890751,0.0374891618756585,0.0324239308142336,0.0124780174797448,0.0160348171800451,0.0310037816237518,0.0281908790065513,0.0273090583818858,0.0320531305464284,0.0357867455803464,0.0506883026894014,0.0456340523229921,0.0445739387011235,0.0562217919775099,0.0502672432203237,0.0640252328394677,0.0647114583840749,0.0694970362463001,0.0875605394487324,0.0975643023451693,0.119325313103783,0.136563634785832,0.147979796209735,0.142684409220787,0.133769605546331,0.132683991263185,0.131911521777724,0.127075712154299,0.129272716087591,0.132366018182159,0.121409493548157,0.12470530956324,0.115533884712208,0.136611032016478,0.127203610095463,0.107905474249812,0.0978294366858483,0.108439771475704,0.105830399942037,0.11679858168735,0.11906988514109,0.132882339694528,0.116676186672369,0.122786784747674,0.108309234409756,0.11517433853314,0.103262602987631,0.109535062078762,0.111466374082092,0.126192301935006,0.147706226867611,0.153695417090679,0.133848564400297,0.147840138293781,0.147021993603866,0.144106265177365,0.160089393877343,0.14907408417126,0.16766256718566,0.165100668743167,0.173153218550413,0.174697432994215,0.156939279282695,0.136374019531209,0.153585444042173,0.166844079497684,0.17902425830632,0.159777324243906,0.150082909679976,0.163237155393394,0.154018990107119,0.162623987003222,0.17886561987861,0.182821266301582,0.185476648088156,0.177228408832518,0.156572928719532,0.177348580818729,0.188352330460887,0.201215105221729,0.210414530524761,0.196610345297639,0.195600819775236,0.213831730894276,0.190725653178751,0.190844395263313,0.169113148183227,0.155153033318098,0.142345911951067,0.161127344981459,0.154317100981622,0.161247696730957,0.159916957733598,0.168074733065762,0.145551891575586,0.162229368285369,0.158745379855048,0.16129251275691,0.149757052340352,0.160091383825139,0.163732293634722,0.181058221264901,0.18258687944789,0.164138781523484,0.145236304791849,0.130871790530263,0.119931597579382,0.116575465970768,0.131029666329604,0.132788734397613,0.118582779569893,0.100799871463172,0.112217429212728,0.132181895904005,0.14903465526105,0.138512376958153,0.129130189163285,0.135153669107073,0.151424505435503,0.135065368759624,0.116942993881234,0.133661300192641,0.130043769869542,0.110234620744679,0.0947708798817855,0.10626755761532,0.103803214086722,0.104352786034965,0.108010403757115,0.107418986258578,0.127653421056416,0.123289480304278,0.137800153862901,0.147684074795469,0.129178915590139,0.134939084869913,0.129037836840533,0.107187411730927,0.103070852464067,0.111216366909819,0.113678642956071,0.122534811498062,0.144403013638415,0.164379018377194,0.160261054736086,0.161170816202584,0.172531856297,0.172459622095325,0.169284950541561,0.148585275913011,0.163335881644088,0.174594892938247,0.188940872842121,0.173456182825177,0.170660207011789,0.189139453787474,0.167488865642447,0.151872460821096,0.172489475420173,0.158277189745668,0.168300858276167,0.170002185595241,0.162484718364988,0.147597228138616,0.150247570395883,0.172212680998218,0.163915291321455,0.186428468670968,0.176957260139247,0.180291188622215,0.168946510177702,0.192007312271542,0.18965027303949,0.212502319814632,0.191091356847574,0.186104203044557,0.168528770476064,0.165189991425292,0.18481707107256,0.176636916196605,0.18235404778859,0.205936643175606,0.225278648938697,0.249464070287063,0.254727434560365,0.269661104408708,0.264752625171282,0.279705477044667,0.288335225442729,0.287615712499084,0.266047290496385,0.271346367694694,0.29116483665821,0.282819201900462,0.276280150559725,0.256874421393803,0.239144713416195,0.256983714105384,0.271823167903705,0.272892618089459,0.248813037036191,0.249981088077749,0.259685477650074,0.274166603762775,0.290741955767756,0.288876172975922,0.269196624725991,0.291292175013908,0.275617180036853,0.295967385915891,0.287720981734131,0.283590886608559,0.286266054375454,0.278345552462222,0.284316213768512,0.281375999496333,0.256725990182947,0.275449299156028,0.25937486663391,0.274976372543508,0.256273783029914,0.274860875683303,0.250379856603139,0.240347773038588,0.217385033999844,0.230877333391149,0.229448246172616,0.214978034438317,0.199169952575464,0.217092515470965,0.210677659221475,0.195228235050294,0.186763032587733,0.185989556790182,0.170515227777148,0.164635416705604,0.151358644513508,0.135319887761142,0.145791026698216,0.123066729855345,0.104574953314455,0.0994383635354423,0.110884639868506,0.101846104771159,0.10053258153947,0.101906224423422,0.108238630600993,0.0901269380766765,0.103329274412268,0.118905218995589,0.122313213912248,0.120011697805001,0.129587644731602,0.130014292607758,0.14713622912813,0.139993149484659,0.131410165484395,0.133036277994112,0.13147644903505,0.122546579805846,0.110903502925869,0.0993066931212032,0.110393824953794,0.0929660396999232,0.0907516034171507,0.0882875619210972,0.103540674427087,0.0895921426209461,0.0964861058007616,0.115782573746503,0.108755851452859,0.106264002496843,0.0865769302761619,0.0663309914333814,0.0578431991240851,0.0708905284878605,0.0576037651890529,0.0428626974873947,0.028317397733657,0.0148863739459297,-0.000187196942773915,0.0124966167884555,0.00355181855354059,0.00353396141044349,0.00218074906138677,-0.00564357213431366,0.00143210419111028,0.00490695058528212,0.0227863396055448,0.013655554195724,0.0151396986630294,0.00620227911824256,-0.000278160215547052,0.00707721945243001,0.0250844213906434,0.0184931976690916,0.00367497964926677,0.0163709905491174,0.0301330670361635,0.0182630506327461,0.0301653395285175,0.0168675052610374,0.00633623490169088,0.00233331964166528,-0.0160170274542306,-0.0246011070870407,-0.0401188474414018,-0.0457542875548074,-0.0584705465835101,-0.0746527566855747,-0.0654948532922018,-0.0534493466967084,-0.0468226966517861,-0.0520460022138586,-0.0534218354161611,-0.0443901827263996,-0.0563495167923506,-0.0641313730630686,-0.0663618679057552,-0.0751442750856001,-0.0711946322770433,-0.0664595142527885,-0.0496011724421199,-0.0591657758240999,-0.0733670528204068,-0.0902892903768276,-0.107107545752725,-0.101273724945958,-0.0918862495203963,-0.0972286688944637,-0.0831142015960729,-0.0842884993156781,-0.0709813637515675,-0.0825278226969992,-0.0798264423177431,-0.0635584743449099,-0.0654550433437671,-0.0586551742260469,-0.0577594982793284,-0.0558435999328927,-0.0658599766885039,-0.0490727060494665,-0.0318106429468428,-0.0351951789341391,-0.0505458393650662,-0.0631370612286353,-0.0501361527421454,-0.0609485589006663,-0.0753788906126887,-0.0579045666252825,-0.0697621258320713,-0.0876666531216148,-0.0793086547569183,-0.0930989284591914,-0.0809096476755663,-0.0869114764985115,-0.084478971458542,-0.0806023758266184,-0.0910723068587259,-0.10600985866398,-0.109746731423193,-0.0950472229927617,-0.0872938925238124,-0.0745544972495271,-0.0665349206395335,-0.0660627054836472,-0.0695734529713251,-0.0612190514032385,-0.0566194586283064,-0.0509786023089198,-0.0538643486771402,-0.0390767468905463,-0.0496131749523124,-0.0559383664913562,-0.0463064725546717,-0.0523687104851306,-0.0420120407125671,-0.0403702209163341,-0.0288933711474354,-0.0349775099738583,-0.040340819308601,-0.0342149932778768,-0.038196420750393,-0.0425000427620481,-0.0278748026031114,-0.0184310483898257,-0.0297136239814472,-0.0150069971541072,-0.0233534474490605,-0.0164485293497573,-0.0193520562403363,-0.0235562793846469,-0.020632939628879,-0.0112884632818596,-0.016934345516174,-0.0161630433414478,-0.0110155116015587,-0.0263454258987277,-0.0115075335087128,0.00711487407837041,-0.012012067480073,0.00495976720409863,0.0163961135358637,0.0273910006148479,0.0155832671605951,0.0285948203081612,0.0188096686137493,0.00899504425555153,0.00907341574090981,0.0177973935729441,0.0126819649042544,-0.00543966708558874,-0.0025308457769686,0.000534897577199711,-0.00249596531571028,0.00573988570366146,0.0145726657070731,0.00810859120734508,0.0183425405094391,0.0100491456811111,0.025502127476664,0.0380627809986465,0.0384077974973129,0.0423847199022951,0.0581562743167683,0.0469024840806924,0.0455026413854087,0.0532167221703865,0.0651347334737478,0.0528183920844509,0.0398733339471533,0.04469382874651,0.0480588331756893,0.0620083333886665,0.0559480789113413,0.0418891022479351,0.0233127732394811,0.0331472237330694,0.0462065942376002,0.0270690639336375,0.0421013742629315,0.0259243234254816,0.0158870011837673,0.0137043199924414,0.0106840225194706,-0.00834794427836694,-0.02397407039712,-0.00508651917081604,-0.00947079422748498,-0.00299894768458708,-0.0101010211570162,0.00417257118834069,0.0130485993425813,0.0265862662400422,0.00756414579838038,0.0128707655282039,-0.00485263862225993,-0.0179837879410231,-0.0181595050729505,-0.0127699045442072,-0.00307981192391904,0.00330140240683541,0.00858624326584612,0.00403482221936136,0.0235942881877271,0.0376875061685502,0.0392794137268795,0.0419585994339575,0.0583724484055674,0.0421027109906738,0.0268640934693696,0.0140146881106371,0.0121164428728227,0.00287347380172953,0.0152582844404212,0.0302723109258687,0.0308920606182046,0.02772531539102,0.0445517701665596,0.0647979371029186,0.0696468414398532,0.0620335021877112,0.0800686741739869,0.0866207611037564,0.0664822849389561,0.0471602271900196,0.0399796893646052,0.0299952945348885,0.0350700459478774,0.0238888177281575,0.014533273075664,-0.00155653893444208,-0.00315118734760178,-0.0201126799595641,-0.0355700101069676,-0.0540745761096572,-0.0420472892991479,-0.051843470567965,-0.0706922054629735,-0.0666152786570158,-0.0609285450990513,-0.0499905884687398,-0.0530033211043675,-0.0540194905863381,-0.0487316338701858,-0.0545284983180874,-0.0557398702760534,-0.062122688583498,-0.0741340206658333,-0.0850156881524066,-0.0884032741736283,-0.0851143127550889,-0.0778025284558119,-0.0599511000628179,-0.0585707321919297,-0.0610396889947299,-0.0613773090581975,-0.0707980800370143,-0.0546893631204147,-0.0734713976746638,-0.0879715751715912,-0.0882991947205441,-0.0875528336533812,-0.0729059191371629,-0.0657224047102616,-0.0688567996192555,-0.0768698810902293,-0.0907062646450529,-0.0760270254768882,-0.0933497000983816,-0.0785389261610664,-0.0854779239203035,-0.0998593204517143,-0.0905291750991046,-0.0794418439161045,-0.0879226800869589,-0.0715238659173624,-0.0646221201503537,-0.061750816516762,-0.0737850653053089,-0.0862727948816256,-0.0847328116787289,-0.0752650824414735,-0.0590179618211982,-0.0477521391811189,-0.0525350619393818,-0.0677635454884792,-0.080338776354363,-0.0625188820127912,-0.0502271895514735,-0.0365286204615698,-0.0266012930341407,-0.00945396213426386,0.00529369114131706,-0.00564485706597595,-0.0166798011095454,-0.0254026921698616,-0.036108095705919,-0.0170887929202285,-0.0265862219689951,-0.0255990703409968,-0.0407618919778833,-0.0461505020768829,-0.0476816540744086,-0.0411050372592733,-0.0292526391355811],[0.00564286768436428,0.0208338860004915,0.0220545574025159,0.0236440115084102,0.00860721651446994,-0.0114280784581996,-0.0144889914803534,-0.00317527732912604,-0.0178616982005699,-0.0197140802612605,-0.0346866143022142,-0.0196301826497249,-0.0031461231600336,0.00801874179069384,0.00199094199368233,0.0154910714261489,0.0300030534749061,0.0427467751968307,0.0264342684770478,0.0459356227081493,0.0531219783640591,0.04087235091129,0.0591050350240367,0.064250509602368,0.0831846614841363,0.0968390962981378,0.0864930406927531,0.0924216721547886,0.0754260357322565,0.0706589592212796,0.082853444663159,0.0699752939141223,0.0554734707036104,0.0628415118818357,0.0795947312555874,0.0698103781426851,0.0830648436311947,0.0809601336526407,0.0594854627268522,0.0743765704964252,0.0845371217957029,0.0703119693207466,0.066117256654149,0.0577965048937712,0.0787448755118065,0.0583146635557279,0.0408908761166182,0.0490256246578049,0.0539267342858196,0.0723326422471857,0.0666827802758494,0.0759554427014404,0.0738166369158362,0.0642050644365901,0.0623443444987759,0.0646199474196454,0.0521438512462558,0.0515396165358715,0.041915044137496,0.0236304010191011,0.0123762602275244,0.0283301241392386,0.0146509316155796,0.0219314341406527,0.0239241858594961,0.00426228418408225,0.00767500319609682,0.0104933676223606,0.00830501785496818,0.00850840734849445,0.0249253378844636,0.02197696266048,0.0389343032352127,0.0554833333498819,0.0444867373664015,0.0309583072808042,0.0150246941307228,0.0177904043563706,-0.00145367115298078,-0.00169090868892319,-0.00370302566684488,-0.0187818359440204,-0.035257379158646,-0.0475905801179956,-0.0620560222834503,-0.0644520485248413,-0.0572719586139319,-0.0487734645032155,-0.0549321018361776,-0.0441423588961144,-0.053469366701728,-0.0654964754569466,-0.0502879699833227,-0.035812809489247,-0.0450906066753396,-0.0605213354994519,-0.0603435971808076,-0.0533564709634088,-0.0518642227485945,-0.0354274849708512,-0.0180886959929134,-0.00236800303793505,-0.0194459618585703,-0.0343592756368709,-0.0151383768980605,-0.033506087602115,-0.0295848428381069,-0.0138570802702102,-0.0198369012235938,-0.00708554380481941,0.00758396334958933,0.0160002690804997,0.00229088316247616,-0.0105488472096256,-0.02322873380837,-0.0157798723752164,-0.0334436067819674,-0.0456259901781249,-0.036499454235341,-0.0223713942698548,-0.0403997094495874,-0.0408305511328813,-0.0391347566671549,-0.0280260107992675,-0.00897019704958268,-0.016901877617483,-0.0213016086688466,-0.0197113976339046,-0.0086703523765983,-0.00153006251850674,0.0103677273278429,-0.00473828579468771,-0.0216087939296488,-0.0298729370290481,-0.0361387167224837,-0.0435077838591656,-0.0255891020322171,-0.0133656361134773,-0.0304935317013257,-0.0163410042610432,-0.00455180052799542,0.00819642723525238,0.0219975866739512,0.0104173175877706,0.0023014142012352,0.00448562321417434,0.0172345013267563,0.00808088120947126,0.0161774694974364,0.0224994109817507,0.0314904299222345,0.0496357970184602,0.0601521208313647,0.0567316371139432,0.0500606539689989,0.0381079629969887,0.0246822160250255,0.017829789902527,0.0163803123589095,0.0317343180636986,0.031221506323958,0.0341599799991676,0.021413408883,0.0150033362012345,0.00980900900832005,-0.005749627762066,-0.0069319843997413,0.0119570445669874,0.00893231910890258,0.0267546632759605,0.013918020392151,0.021363485463745,0.0290366326860119,0.0267964594891927,0.028714880681828,0.0313137342368031,0.0395711198037345,0.0342115201810067,0.0416154990945681,0.0218348375732771,0.0311657973300605,0.0260694503192982,0.0342946829173489,0.0157946270299436,0.0263670443146655,0.0272420832289464,0.0370289525402865,0.0259475637810891,0.00548442497476742,0.0200716584326768,0.0087060916959667,0.00777718994059828,0.0227968540130001,0.0236297770284235,0.0330840834758481,0.0396494637906268,0.0320859449437378,0.0254166520193626,0.0318058877262386,0.0472013441277732,0.0516202019336005,0.0678509312620332,0.0648208158876062,0.0816290288274799,0.0994030332783931,0.102593461099171,0.0924386240772574,0.106748460793592,0.122049500243843,0.105324701619491,0.0846926083502495,0.0941056112754148,0.0853976484033792,0.083429497787078,0.064027397927773,0.0771105897677571,0.0875033661739832,0.0675806333425406,0.0677680701128409,0.0587251948804948,0.041369747719076,0.0433413559587397,0.0234941270596325,0.0422932208354594,0.055159737234139,0.0413169068527284,0.0612605914086715,0.0793258332202194,0.0590884097758595,0.0705870470546128,0.0825655214902252,0.0710076703048663,0.0810154948132575,0.0675175016211489,0.0595129644765835,0.0486410149287153,0.0455781604931027,0.0642440442895875,0.0787663319773173,0.0807944962314608,0.0706185182390542,0.0495635056975139,0.0409275246351739,0.0242665988417234,0.0184732067955293,0.00727125738392398,-0.0119628311716763,-0.0306536569347166,-0.0327570310798077,-0.0148330902321775,-0.00802996258665478,-0.00683335373338334,-0.0225834498414074,-0.0394892071700009,-0.0449062888197211,-0.0441371771700586,-0.0280220894500054,-0.0422041861256793,-0.0251283111108807,-0.0179109157246505,-0.0168178570587644,-0.00098503894966806,-0.00275681317319543,-0.0175430883770454,-0.00691607196303545,0.00552147623030241,0.00101651663388891,-0.00360355078176444,-0.00330696286842591,-0.0112755687823687,-0.0103828712643007,-0.00600933638283696,-0.00119837611608276,0.00337477421160237,0.0116325257449152,-0.00182639532812701,-0.018592920806306,-0.0273374163781189,-0.0104302877682693,-0.0204544787704916,-0.0225233902795112,-0.0322610358155723,-0.0347210084284764,-0.0200751346461021,-0.00721108085849831,-0.00300625600370552,-0.0178467157048362,-0.00410195226387733,0.014933393333272,0.0351296137000645,0.0265508169539233,0.0380247094953547,0.0275410475251741,0.00757074038391958,-0.00650014676970123,0.0100432028984403,0.0227174515819428,0.0398338032708119,0.0393865904773043,0.0426594061668604,0.0362801849738308,0.0279521420328859,0.036584236942061,0.0556135709159902,0.075024994980154,0.0804304458226066,0.0735197965896095,0.0909163140687077,0.0850694725094088,0.0898790880118916,0.0769774887661312,0.0887911204910703,0.0991315207670358,0.0793460021620416,0.0940110990086713,0.0950629174396254,0.0740352875104291,0.0931797108676522,0.07190703086758,0.092383631891106,0.0823646109393628,0.0744982046945319,0.0954947095734646,0.0893108495978385,0.0717145645719035,0.0896053433453676,0.0688873571267679,0.0554278210671293,0.0750679616257475,0.0621415962975926,0.0737917113566517,0.0928987686226268,0.0941808200718774,0.0992055027898291,0.0874158089454626,0.105369869467577,0.103354322515037,0.118215290056207,0.106639149235912,0.108191344369895,0.108467815512754,0.119959155714103,0.109706774256903,0.129816865812023,0.146819529333422,0.144581379062753,0.124107316943541,0.129094300113833,0.109346036474814,0.098504935932006,0.096924989230851,0.112478869670273,0.119817686829492,0.10322842490512,0.113964011942454,0.118894225089217,0.138330348765622,0.158207672977973,0.16965415557985,0.177233496698061,0.186348781518049,0.184425628975567,0.167660634678209,0.145324841853086,0.127653388753416,0.115588848594848,0.127190139146057,0.130705803126455,0.12674986336739,0.110843769092861,0.0996355067705228,0.104504607212589,0.0888683117601934,0.0816882127416665,0.0872601874096648,0.0769458469952022,0.0704708483883949,0.0684420748339389,0.0780219135251086,0.0717431543260889,0.0563454415339337,0.0560958521270538,0.0438238076208128,0.0370893183936474,0.0255298372362187,0.0358929119123146,0.0270144765100027,0.0446366269428486,0.0528174966122059,0.0565890207753168,0.0402592303808909,0.0576670003418289,0.0749926957608162,0.0748901080988336,0.0835903927028701,0.0751178889882316,0.0766120491037854,0.0738868026941133,0.0567341381809012,0.0653055919240701,0.0808597351284206,0.0929633445732274,0.0902368611717572,0.075984370074403,0.0861811164785156,0.0856654430216635,0.0952881881843246,0.0839520205356361,0.087791876158549,0.0760440345577815,0.057336058944542,0.0398696983675413,0.0317836629093178,0.0344277904733099,0.0325659703082257,0.0392632504768082,0.0355633658436885,0.0466670471416351,0.0491005363767829,0.0302427103404193,0.0174117110570542,0.0119942781588598,0.000927117486096973,0.0105060877068825,-0.00542583868867219,-0.0232710468533871,-0.0350921800162742,-0.0320821743261115,-0.0259932113513348,-0.0346804177413436,-0.0519184903079751,-0.0488212694836067,-0.0610058590862766,-0.0678746453611618,-0.0839884280403432,-0.0917222472174575,-0.0925378552642013,-0.075363790101011,-0.0746956932559356,-0.0633863407102709,-0.0799741088501381,-0.0909327334170593,-0.0981836839590555,-0.100460901148735,-0.111930508410814,-0.0962890270887802,-0.0929943050546298,-0.0976666284428427,-0.101150843665526,-0.106616042898995,-0.113052533201526,-0.11532992338021,-0.128559092697378,-0.136120657465211,-0.145784319239044,-0.148629222515002,-0.137071364810623,-0.124550961615529,-0.109605284070367,-0.106770467787653,-0.0974167619729001,-0.105544606699661,-0.119002957156023,-0.114473091532846,-0.100495092466088,-0.0938292865995652,-0.0779050369436668,-0.0791748864853494,-0.0733353893902494,-0.0863868104003612,-0.0807876237956011,-0.0937473179015382,-0.0926775700691118,-0.0997131776757889,-0.114708320871131,-0.117874888935042,-0.113258546975901,-0.129246993888101,-0.120926531986732,-0.113742865826497,-0.113914488997052,-0.111240919842458,-0.118359395344118,-0.125932483507125,-0.132463342283491,-0.141474800986726,-0.144336831654716,-0.129602645755831,-0.144632736984868,-0.154454111104154,-0.139831657315974,-0.146075738582088,-0.138583343230653,-0.136892048314216,-0.133686653481809,-0.129741247901706,-0.139984514977685,-0.124676688740101,-0.112330438517665,-0.12868600201342,-0.132436869694273,-0.140259506246706,-0.12578515472501,-0.14160618015812,-0.132594523098874,-0.136221614284099,-0.128070697731109,-0.1209154853412,-0.113524171377351,-0.0982716268286709,-0.100092466344748,-0.106464039535131,-0.113507759437963,-0.113694538975403,-0.0981999655055555,-0.0919811287232248,-0.0906939444773989,-0.106799152464501,-0.0942671251429973,-0.111945750623311,-0.0980112753846808,-0.0978497625039553,-0.0958653095583388,-0.0854429352239068,-0.0893517872399127,-0.10520687195986,-0.0956166305146187,-0.10793468468941,-0.0978242802706112,-0.115399975531568,-0.0993963613653996,-0.113102110938035,-0.0975126583052039,-0.0917055705290675,-0.0823424684645895,-0.0693444367561674,-0.0848957077388786,-0.0977421478223118,-0.0869047963550319,-0.0867627348968234,-0.0976047538831202,-0.106361944209939,-0.109416171223349,-0.126020377725893,-0.131930182745796,-0.133685831792271,-0.143970684410975,-0.132794487209099,-0.144946573674366,-0.127880593502902,-0.11072201663146,-0.102312341918924,-0.0981447320827292,-0.0806433340673059,-0.0752502496710651,-0.0569733166911006,-0.072707685931569,-0.0778770783575231,-0.0894745350739798,-0.073213140521504,-0.0773164765797006,-0.0705060582708793,-0.0524587870029665,-0.0470539596503293,-0.0483743953011595,-0.0577869952084851,-0.0511576229271228,-0.0492492451951213,-0.0304972005072328,-0.0125463441841842,-0.0174017185904031,-0.00466894991566646,-0.0147770428083575,-0.0269086491962522,-0.00989339222208363,-0.00682458107361261,-0.00526079997046047,-0.00401686055494688,0.0129144569349309,0.0208226102161859,0.00699256068346665,0.00643441424235491,0.0252269790815747,0.0422144677028533,0.0476708354485353,0.062481968525737,0.0546476140923129,0.049137565455581,0.0529269370213032,0.0532317439268046,0.0348072390280276,0.049460241567036,0.030208407004221,0.0407941240529217,0.0494911615405824,0.0555206036583202,0.0657631646083616,0.0532134739585954,0.0426183080887179,0.0323516907134682,0.017812788857628,0.0371223244572469,0.0510096304427317,0.0354649419340545,0.0263680686709842,0.0246069642654752,0.0293575499255396,0.0254484779344977,0.0230706305301724,0.018113250814034,0.0198771357284235,0.00420507549491145,-0.00642709592105006,-0.00559473271264188,-0.0199450823904209,-0.0167430310337691,-0.030146922087689,-0.0410778014867358,-0.039846248637711,-0.0343528408832954,-0.0262938576533278,-0.0403799465778655,-0.0239210464184592,-0.00796376556532719,-0.024295621230361,-0.0113608635232514,-0.0288423559441716,-0.013196691550188,-0.00869262856140107,-0.00646197189517861,-0.0129252456853879,-0.031954142606744,-0.0495886472854526,-0.0376041251271518,-0.0545148184590519,-0.053240608205959,-0.053166275798851,-0.0716679253158669,-0.0801634185769096,-0.0753451722835191,-0.0859610900531086,-0.0822086000617747,-0.0818470567750093,-0.094499868234136,-0.101408077841033,-0.110658444121781,-0.0978545880186051,-0.114089445001423,-0.0987223885591147,-0.10176419998067,-0.0979916044262991,-0.102457903506818,-0.0983152227533116,-0.114138423204374,-0.109789097353684,-0.0967645690852562,-0.0876875388006209,-0.099224395736524,-0.0918093982538126,-0.0790667899318377,-0.0913080143816472,-0.102769310060049,-0.116398856361737,-0.125493645746079,-0.110050047335967,-0.107854821825849,-0.100585775663757,-0.117055748806835,-0.106863321407475,-0.0970930349038389,-0.105898065575815,-0.0997468359698197,-0.0923954573166883,-0.0780416797388603,-0.0766595246311729,-0.0897339719585686,-0.105763299595857,-0.0928741552704477,-0.109284462565328,-0.0938329673431358,-0.0861933928557616,-0.0822766368791893,-0.0722158917304756,-0.0865053782744164,-0.0689438767196521,-0.0549266206276888,-0.0502264410897515,-0.0587180015002101,-0.0401708908572537,-0.0552826665940416,-0.0693623163411414,-0.077744937042491,-0.0689789536862735,-0.0657256539866311,-0.0750354222404029,-0.0882228754908579,-0.0839510218618289,-0.0921421269688842,-0.0881426628156289,-0.100071155763789,-0.10941859697144,-0.119445807959676,-0.125351068960679,-0.139103238195604,-0.154729581777623,-0.167827288298675,-0.17772378895524,-0.180678127900752,-0.165684972168861,-0.150937467652289,-0.152065831410419,-0.136998466158442,-0.138417662182756,-0.127339531667505,-0.126302192997436,-0.121275476536516,-0.131997124682771,-0.149233066258636,-0.138464918960774,-0.145524888788737,-0.144365675391271,-0.1537882946924,-0.169219480639696,-0.17401466397751,-0.174201289852343,-0.175112034649271,-0.164163420286751,-0.156834027783223,-0.164583475619331,-0.156754482425577,-0.168185791866692,-0.153060133968049,-0.16114795387244,-0.169241963508657,-0.178074848880195,-0.16786556572236,-0.170387931327443,-0.179312250359529,-0.189417146236302,-0.175957903900995,-0.186329233044301,-0.19509190320069,-0.202063886969956,-0.214569559111393,-0.21388418592207,-0.213677667475223,-0.204806779468088,-0.201436416686216,-0.188125429850795,-0.179286199794403,-0.188072947447432,-0.193152052159592,-0.189047761412031,-0.194902977294874,-0.210940462281505,-0.203409071954366,-0.191277214061627,-0.197261022678273,-0.213092261711714,-0.199090281352292,-0.185924213642551,-0.177992012749358,-0.168272562278838,-0.173704841605532,-0.159689370272981,-0.151221498506062,-0.14592436620193,-0.155592507453149,-0.158513181969347,-0.147146409707265,-0.156686051800178,-0.16771316137702,-0.183997486749546,-0.167950540511874,-0.179940522854557,-0.17856073550526,-0.180919766090855,-0.179292575315738,-0.192341447248918,-0.180949474795295,-0.172401067643012,-0.187302295132367,-0.17651616407724,-0.166857467179721,-0.158715263016364,-0.153908289358868,-0.162441528839376,-0.145779665818286,-0.137993109350152,-0.131943083081477,-0.142007486043573,-0.127942067272337,-0.115038183654536,-0.101683426517597,-0.116274551999628,-0.102003786971771,-0.109533776589799,-0.0991931407659357,-0.113473364319971,-0.113179379875372,-0.116893536494539,-0.122952821349937,-0.120821983027985,-0.13749728339731,-0.129057236820218,-0.13158279094165,-0.128975957349159,-0.138382293724411,-0.136304272331175,-0.150543380553393,-0.160894763693245,-0.171712044088668,-0.161823248828966,-0.162909937364317,-0.167164466715306,-0.160105620927895,-0.143472195179485,-0.130342975059681,-0.116276513606004,-0.116202706351378,-0.101856412472484,-0.0875702444473349,-0.0912816404891023,-0.101743790715596,-0.0910123922406054,-0.104585962813552,-0.115677715295795,-0.099760829666404,-0.0874445698322335,-0.0812619924447741,-0.0947044461177585,-0.100275085868898,-0.0998044587272021,-0.111107709116854,-0.115104730921755,-0.126476683538728,-0.119070240414284,-0.1115460206778,-0.11418657034439,-0.104569007104617,-0.112833253669833,-0.124948990173125,-0.128749528507075,-0.135588412200932,-0.141460761810318,-0.149042374654438,-0.133867021420809,-0.149215709006964,-0.142693681741226,-0.140023076103081,-0.151812539441999,-0.135071362271323,-0.12466581612188,-0.129398759595672,-0.123332357506305,-0.140787156352971,-0.139576534706647,-0.139636482747057,-0.148917593207194,-0.140085868909931,-0.138826466107252,-0.151817594574529,-0.151736716821886,-0.147501627531461,-0.140742415619087,-0.141018416338303,-0.143613773681132,-0.144152141274985,-0.133314789408531,-0.139939364921853,-0.127194663412884,-0.113410497436033,-0.0970412743748038,-0.096663105745959,-0.0884661843837237,-0.0891352264013373,-0.0826628708937713,-0.0974313111735662,-0.109762122475824,-0.101553784205109,-0.0860948050748469,-0.0841307022807504,-0.0939537335729008,-0.108093603265131,-0.115941833675457,-0.104032100918305,-0.0881971595980769,-0.0990430226706779,-0.100537665374983,-0.0836972791442155,-0.0792340197888121,-0.0760372254240747,-0.0707679075174672,-0.0752998102375902,-0.0621649033684644,-0.052965975907133,-0.0446101259986778,-0.0257477874101627,-0.0162039013482944,-0.023123086495199,-0.0116230326913936,0.00718571899109577,0.0214605595772195,0.0262431381947017,0.0358560589950385,0.0411431599298864,0.0579327335331614,0.051593029073681,0.0671759817520332,0.0794629451558899,0.0875500793942181,0.0824309093441222,0.100868266353961,0.0992074209620097,0.115965465820367,0.135417384141864,0.129639784603392,0.1512015006561,0.149752760640369,0.143691311421783,0.154133338406113,0.137337555130835,0.139704557885227,0.152004961414324,0.144978761815909,0.134766875095388,0.121464630178558,0.132799473786545,0.137105996166444,0.158185546731331,0.159170291095356,0.141935842628958,0.138427777628991,0.133275881198543,0.12169174662573,0.111228285757219,0.107514382351307,0.113871928477705,0.104823399594447,0.107120426496772,0.125277247164728,0.145203235437084,0.16640604988583,0.163299981963718,0.141551309494687,0.161652759702638,0.140282849616715,0.154937218679146,0.156906015526976,0.171849918032156,0.180993282919995,0.201912655664403,0.224374130634053,0.232981488796931,0.223598143613457,0.237934539873983,0.237745121107924,0.251021703665007,0.263140199935199,0.269861330170496,0.282112457500904,0.260080569153199,0.276846299679882,0.292242371679784,0.275555164010934,0.289481777901748,0.27333011899244,0.255590057438553,0.234574455889318,0.25290709500401,0.277146330707972,0.284071149986076,0.298902473194439,0.290664404167508,0.296869996357945,0.295848747550141,0.281056227183324,0.273779918856978,0.270046598552605,0.27404034890518,0.255173739592255,0.24165168660319,0.21781653676952,0.221702489802277,0.206397582665536,0.190108018334535,0.201783125969658,0.179259863823898,0.182833973108616,0.187764534794133,0.169717264108119,0.161752151069603,0.172602563735961,0.170701651168429,0.174700896096513,0.198152615143075,0.206107477817734,0.212935101297587,0.223681172214777,0.204889207090698],[0.00848462021909646,-0.00492750414096443,0.00490212254294309,-0.0102691668151035,-0.00417026272797838,0.0120359614688175,0.00525813905638484,0.00874863032229101,0.0197102410361731,0.0291257826965432,0.032006228995052,0.0497537159412487,0.057449440115348,0.0443264004485937,0.0255964188508786,0.0107434351888376,0.02488848867169,0.0428394185042946,0.0278907507864774,0.0153228395765062,0.0197049749639773,0.0354725270701099,0.047992294932595,0.0520207506675794,0.0523539030794486,0.0442569359084302,0.0432430238114652,0.0421413677343325,0.0489443800109197,0.0582244406488333,0.0739417563176508,0.0646986134511709,0.0829763670399579,0.0617823992469524,0.0462411273494083,0.0561446200796283,0.066572184080433,0.0653498453835459,0.0742046842468362,0.0823243148556738,0.0781290928870702,0.0673344628267998,0.0466234459780392,0.0446752422648042,0.0394675024337539,0.0570621337490835,0.0383164954965278,0.0556153540875692,0.0697530972806029,0.08453511842033,0.0644995330375713,0.0792869513408549,0.0584982506531297,0.0444414283508217,0.0402714499313885,0.0265369075807036,0.0333815460942268,0.0165258663101211,-0.000822494263784668,-0.00255146237274662,-0.00525251540945826,0.00996221917678342,0.013288215352385,0.013787921521202,0.0122955323559226,0.00877221824809205,0.0250212529794018,0.0325031152474884,0.0399383284926862,0.0322738388021482,0.0330474617215286,0.0366453238575288,0.0325225330134193,0.046792049002967,0.0574521288884886,0.0446529583545203,0.055052916764853,0.075556460543039,0.0946865007141546,0.0925090057333273,0.0918234017898576,0.0880915120788581,0.103191463577967,0.118362876005125,0.135903254295021,0.124869633340494,0.123665134330088,0.131171587861088,0.147785705480846,0.157477775545914,0.15080650140678,0.155779972097763,0.149248624306547,0.144341819611053,0.156990489881749,0.163658866083621,0.175187468471036,0.180990282361605,0.175814917732575,0.192917744042368,0.188698522836105,0.211118397011729,0.190394905510882,0.192567642820913,0.205663408201815,0.214524923957451,0.194110485072669,0.186891048026768,0.186778604124814,0.19560543991114,0.176164714301832,0.188970014874549,0.174370488031953,0.190632866716795,0.200511585797061,0.202549333165416,0.184090050007143,0.166562165117263,0.180731696852373,0.199133866577323,0.21246860336179,0.19773278420868,0.206390566475465,0.182819962782971,0.170519333410465,0.148065213376894,0.16816594061954,0.15512938960937,0.149375309604937,0.168555718789636,0.182417008790636,0.204380888655501,0.223824890355712,0.212461066874312,0.212622243264063,0.225672215898403,0.204254251318264,0.183935596218912,0.178618559607263,0.174681948538693,0.173729099051819,0.175568785573882,0.155061841553999,0.171789281851116,0.192760651148874,0.196454695271244,0.192777864407324,0.180687739867056,0.159837770520956,0.149152966863727,0.155382918827025,0.15578451458749,0.168237012907871,0.146591837341347,0.150885335284704,0.156327947551393,0.135619044645471,0.122792394209942,0.126274783489615,0.123624346986182,0.12858034669326,0.110486996408903,0.13247083489987,0.132437170638837,0.134384999878681,0.133106161001761,0.113451398977313,0.112441287454088,0.118630064736793,0.102338759014347,0.117559064795794,0.120647081701125,0.139231999183209,0.146912354210153,0.146428216051657,0.134656070626668,0.138198944463871,0.116688788960023,0.133308474439244,0.154493698798163,0.150221821652824,0.151967492951491,0.142707197185872,0.135881091322991,0.123953986505331,0.11584094635468,0.1004882659909,0.105071737655835,0.126980020000687,0.114233652622856,0.110127960751614,0.104259772668779,0.119235238568363,0.13492988009697,0.150212834402532,0.168654892475312,0.18120289014078,0.174800339031169,0.155793986213289,0.15876190700759,0.142477195819022,0.136792036393365,0.139193033375738,0.129562863104461,0.131002777098607,0.141904248279878,0.136690731290374,0.151585852421743,0.129543644480647,0.113714288436922,0.132396203667246,0.12974638025475,0.127409781554113,0.135442982111998,0.12940504850029,0.130711100970663,0.14982745535461,0.158885590860923,0.154819769794726,0.134153843252508,0.14342168846151,0.142431592748006,0.14675641470595,0.156081912178832,0.175461754556725,0.169002446400011,0.18729243829986,0.207360205253991,0.18498538751453,0.205144457081558,0.198921159737649,0.178558231816398,0.191512105167442,0.195298898314325,0.177786163919209,0.163645982453538,0.147718161857951,0.137104946668838,0.132359945611331,0.150154485702863,0.133160349403403,0.133715988519507,0.134806347770074,0.146244124135223,0.124941609914357,0.116207156053439,0.0998030491610873,0.0786295310113148,0.0800237494694989,0.0946556613724865,0.0999643834666162,0.121316830861605,0.125735004835811,0.109178442316024,0.106029478043371,0.117781675863544,0.121814314899612,0.114260490649968,0.10645178140211,0.117488513787426,0.134335265571304,0.146185728087095,0.125910570693786,0.11013492782973,0.107993767414835,0.111683530822975,0.122406661873329,0.130051358998966,0.109793023225803,0.131127592383715,0.150485740069362,0.150309662272902,0.14679877014306,0.140445842173902,0.122993958802013,0.136185866973639,0.157466269183827,0.134797931727253,0.125362578563372,0.114635948171145,0.10469704354365,0.0961341584255082,0.0769477401897589,0.0611213946296496,0.0641036484541981,0.0528788217209677,0.041112558613674,0.0274042874272371,0.0442165031055748,0.0272978092332026,0.0247862340173162,0.0279718109061931,0.0284799066659107,0.0393699339324052,0.023386720139984,0.00895348065674417,0.0103769624377674,0.0116203894657703,0.0243608673625144,0.0181009741530278,0.0250291152111561,0.0054370843833953,0.0107929888833556,0.00891233410582748,0.00822873819928627,0.00999849330210933,0.0301665315369288,0.0472283570687428,0.0500256636371801,0.0470673447093886,0.0400936923938406,0.0272140170508317,0.0178108569048701,0.006933043784904,0.0022863600569234,0.00173647075968653,-0.012423228234124,-0.00916745363187099,0.00161473798793721,0.00351809990916596,-0.00959934785595196,0.00500818696271033,0.00758377092684892,0.00870594888759491,0.0272141391603626,0.0453144373254013,0.048514297765379,0.0328777902070088,0.0330212784032446,0.0166546200065667,0.0264621716536351,0.0453226954226669,0.0404537049785267,0.047272852093502,0.062402442916867,0.0727041332569354,0.0862231002331659,0.0940136888648517,0.0893125394636503,0.0848549350606589,0.098980559486691,0.0809871509985618,0.0680071674110587,0.0885644957982772,0.0929508480844261,0.0834484901638728,0.0781164269579289,0.0801478461656242,0.093552864133321,0.0855799595092597,0.0717169105353506,0.0595855322520376,0.0615238330346048,0.0427322479032564,0.05177568801388,0.0672275093035797,0.0756970137022037,0.0892825309939234,0.0943709855289447,0.0753668958059186,0.0885559696465472,0.0797018755317724,0.0906772834111109,0.0749153227509567,0.0868173248282413,0.101030279911686,0.0843320245217098,0.100466983648475,0.112266006887571,0.090234737894753,0.0770399442391199,0.0658736380379195,0.0663984510541402,0.087043560861874,0.105056355702415,0.104619566159851,0.0992260738281063,0.0779994121296006,0.0654972326803009,0.0535723037083329,0.0609879754169962,0.0633028168956489,0.0837210995668092,0.0813128811355515,0.0701697921532989,0.0672736365631563,0.0653579087079579,0.0462266338937944,0.0326138243145144,0.0273375375029141,0.0212365252592674,0.0336278687604399,0.0499581604191131,0.0674761068475636,0.0803017862858957,0.0628083471647012,0.0630027465609166,0.0421494806087575,0.0220687192819204,0.0414647614438399,0.0426236511489331,0.023904604506227,0.0233419541095143,0.023830031361932,0.0418025962440061,0.0576199012750205,0.0469572188202851,0.0333903357011542,0.0518219434807727,0.0574510729870101,0.0675327664018794,0.062143478996453,0.0451203705747232,0.0497181477463384,0.04412834561521,0.0629017724763432,0.0661521296525183,0.0466116083461421,0.0278926674203701,0.0412742751247002,0.0378539199167176,0.022111828682476,0.0135707597625137,0.0199944771556926,0.00999345960061371,-0.00180671203215754,0.000472472959219372,-0.00344217725272944,0.0153541081741975,0.00296221572791078,0.00879913304632995,-0.00612445009505047,-0.00106027023392519,-0.0152463979402901,-0.0109764350418977,-0.0231541344353713,-0.0230611994277553,-0.0392462681318324,-0.0569040803831113,-0.0548804999876399,-0.0466597811588157,-0.0285078555994399,-0.043517275920515,-0.0459757069061545,-0.0426712778276608,-0.0390336516334334,-0.0462937202029979,-0.0611845125051508,-0.0504990558418184,-0.0501935807441001,-0.0608587772785487,-0.0627355351085536,-0.0736603831979673,-0.0874401745903378,-0.0838259392677361,-0.0779959026438676,-0.0867445520615322,-0.0945832001462595,-0.105249967325523,-0.1011961819852,-0.114446721039478,-0.102755842888638,-0.0903428223366753,-0.0919055532655723,-0.095448993321157,-0.112383349373981,-0.108841814206447,-0.0964825331943998,-0.0893156204618676,-0.0769510850556485,-0.094312291537835,-0.106272270578259,-0.122187844007815,-0.132262761335467,-0.118272988826842,-0.126044669278823,-0.134633026877676,-0.118797274166177,-0.111314042201624,-0.116751358157866,-0.118989895400348,-0.114450792788786,-0.114558885335679,-0.098012075092701,-0.0909887244276972,-0.0944014650205216,-0.0977511902286061,-0.106500703981509,-0.0923491472995708,-0.0771413149715252,-0.0783409096275449,-0.0681305688666605,-0.0851636434343879,-0.103440404956867,-0.105962561437891,-0.102813043208272,-0.114268933248663,-0.111207113958197,-0.0951509115437629,-0.103544072172183,-0.104156243673265,-0.0906328267828986,-0.0790863582050619,-0.0752777213349416,-0.0716557881607008,-0.0688076286773294,-0.081960715602609,-0.0736648051504809,-0.085952797165542,-0.0807012307967887,-0.0755145465253694,-0.0742463624990775,-0.0910724187641092,-0.0902256660223697,-0.0894288164871827,-0.0855401814908896,-0.103278217766682,-0.100416290756235,-0.113351800507356,-0.104461769832235,-0.116711618156279,-0.13078875863974,-0.132175040678488,-0.145695528633552,-0.14194080242971,-0.136669986663535,-0.141351450079735,-0.134855898236452,-0.130062802746922,-0.13615282641339,-0.143314843558032,-0.151671926144296,-0.147437071550609,-0.136916248002048,-0.14360381167453,-0.151601914761397,-0.162226436289807,-0.164092636222114,-0.165401694980173,-0.160630260667143,-0.145394549423804,-0.145091793075361,-0.156488574154365,-0.142313006734042,-0.143095431103393,-0.140637787716931,-0.152870120925898,-0.148163258667113,-0.158441322384221,-0.167165643819241,-0.164262767456652,-0.157246516908049,-0.145639946657093,-0.147801849634596,-0.150003576460889,-0.153180755979355,-0.148846133256817,-0.158247301525244,-0.167965741564693,-0.174981587759812,-0.165286560276335,-0.168925707320343,-0.16965318618568,-0.172207878662799,-0.168525235078197,-0.16124508119408,-0.156964468874611,-0.155709371879179,-0.170265659470407,-0.181127800242387,-0.181376478961471,-0.182623889438407,-0.170200408258512,-0.176179550381912,-0.162561242206819,-0.165813950347488,-0.179814501133868,-0.188312154679203,-0.194592701425857,-0.191443219794818,-0.206657154866268,-0.207778603880944,-0.223095542359809,-0.227808041305857,-0.212609448109434,-0.201843180750834,-0.188058469107581,-0.20293077861916,-0.201418814090618,-0.191203394182045,-0.178681505663411,-0.182726265671904,-0.168810819868668,-0.157396865159411,-0.151030773311836,-0.155320143486176,-0.155302182132008,-0.154924558393194,-0.166929849416365,-0.176273252534069,-0.173396238815485,-0.171569272707747,-0.168314994579469,-0.184089284639983,-0.196731208871761,-0.20058676885059,-0.199557542904748,-0.199892017624788,-0.192021447252418,-0.188763821764882,-0.185403006594997,-0.187999445161928,-0.19858759023499,-0.202522313998595,-0.196514261139882,-0.210320767132302,-0.203726024869956,-0.210855275927696,-0.196748896338776,-0.211162839710263,-0.200224644764034,-0.185771546033494,-0.171016002712578,-0.186299354274998,-0.193785055514066,-0.188595403499916,-0.177796198753565,-0.178026655538976,-0.186377757767625,-0.182446886165739,-0.195402473101678,-0.192571003553554,-0.196902197743867,-0.205103846990619,-0.204502724671328,-0.194591878171743,-0.205186965528717,-0.208209589299058,-0.214913306716028,-0.203269731038464,-0.195898752495066,-0.210992390113413,-0.223329678116336,-0.228953373661268,-0.215532792362427,-0.213168792122914,-0.215129679062037,-0.221406334292781,-0.220449120340437,-0.21800780316675,-0.223595726158517,-0.225454869738037,-0.231621957525177,-0.235757089365596,-0.241638829920239,-0.249079471388894,-0.236449377753848,-0.231861218363752,-0.229119514998569,-0.213869468746326,-0.198359846184877,-0.191792888408094,-0.184583110169077,-0.179360458453122,-0.171575859313768,-0.168675845932851,-0.165932717938713,-0.150038511381837,-0.138423520926027,-0.140126159695915,-0.144464585405408,-0.1596877398687,-0.176161558062098,-0.176652009666146,-0.184009033733368,-0.17110915423525,-0.164211347181436,-0.17669503895186,-0.178851077098413,-0.170506802324564,-0.185557918043201,-0.201488048578297,-0.206649027903753,-0.194782491912105,-0.18488035610145,-0.169641568736148,-0.162254580997041,-0.150747776655254,-0.137232432139724,-0.135029649464694,-0.124863692316958,-0.123106585866411,-0.10988048524724,-0.109984455877877,-0.125780423860805,-0.115644698188639,-0.116412397078941,-0.128092321539479,-0.124110759242196,-0.125656544121391,-0.138480699164186,-0.142190530826098,-0.137167680111051,-0.152037919452779,-0.157109886281101,-0.166364533920088,-0.172615759375427,-0.15804530736473,-0.174531164475688,-0.164658204214695,-0.155553675386426,-0.155881921474362,-0.170052070748365,-0.171304233193255,-0.163865234068322,-0.161055752797232,-0.15451224493464,-0.16636200388861,-0.158856563249749,-0.142870247780945,-0.134835107197596,-0.120902529072998,-0.125108723412382,-0.123016666190883,-0.123328284456465,-0.116251098254647,-0.0988164662283177,-0.0848439871684844,-0.0979056468428112,-0.0862138508071866,-0.0693207998712547,-0.0645832291531198,-0.0521207524482651,-0.0641042857591483,-0.0676804691631716,-0.0786410436765909,-0.0693583437625175,-0.0744217152454182,-0.0887437455751433,-0.0978928554298474,-0.111082426635124,-0.108880964253533,-0.106842038256934,-0.117289054690468,-0.122845368375303,-0.110751102280336,-0.106169583424334,-0.102615592411049,-0.0927888960989156,-0.0905335886044955,-0.108674952466442,-0.101975203094625,-0.101251931694364,-0.105997632541039,-0.111964092877873,-0.107369918100797,-0.121114053561482,-0.121370860088938,-0.119671478095823,-0.116407850607849,-0.118391700158502,-0.101596789410681,-0.115521259399236,-0.122261310464173,-0.112854872974251,-0.109111202224156,-0.118364550110186,-0.119547360094887,-0.108065962635637,-0.111441369182506,-0.112289986929905,-0.096923657796571,-0.109062135043031,-0.118426628000562,-0.121320914828415,-0.105687663814728,-0.0965901033759523,-0.0975681306822644,-0.112465614294172,-0.113243788935842,-0.115528705591986,-0.113195217640159,-0.100832355360985,-0.106269729280733,-0.108508963873448,-0.111979159742384,-0.1042918985254,-0.108657969588601,-0.125310486142368,-0.109852353327655,-0.095233947276514,-0.079252011114419,-0.0964525564194758,-0.0837183177625673,-0.0837195172622909,-0.0680131341831252,-0.0553655313511815,-0.0547279942025808,-0.0729580878206435,-0.0747694952419695,-0.0585432359487692,-0.0461972576151328,-0.0273050591129566,-0.0406872533549399,-0.0310563180734577,-0.0285616543643898,-0.0354491241685013,-0.0274673614166024,-0.00938559059810729,-0.0155578843018724,-0.0297886423997495,-0.0401160557991814,-0.0220132784666492,-0.0222198824148163,-0.035028907356447,-0.0309369790854953,-0.0343052524383337,-0.0232993976534502,-0.0193130865487448,-0.0161328566699154,-0.0229729832879473,-0.0313729085213104,-0.0205225111436904,-0.0216619798666517,-0.00230044515491823,-0.00267704007276282,-0.00650322205452469,0.010259544350534,0.0178820908162007,0.0104245214187786,0.00500135836255766,-0.00851097067043127,-0.00160238036241223,-0.00430040560182776,-0.0213378743480671,-0.0107851859559867,0.00713940432804949,0.0148375267397329,0.0275093000489646,0.0421851611878066,0.0236849991691357,0.0329695526063649,0.0492857134543265,0.0338791865927008,0.0338447718120165,0.0502206924142392,0.044126265829163,0.0263891375394969,0.0162631192110454,0.0289328755598528,0.0173913312398022,0.00673091532156644,0.0188165066419459,0.00138498117203345,-0.0133560389207273,-0.0217713325310533,-0.0300636262106881,-0.0196587987321137,-0.0370718393516526,-0.046301677047949,-0.0278917804462742,-0.0290181267131513,-0.0483711635299741,-0.0294683711732493,-0.0305284935151633,-0.0297977135021728,-0.0286985800263324,-0.0329077431211301,-0.0520903496926873,-0.0588838739206958,-0.069529275330764,-0.0619244802698122,-0.0599815362578139,-0.0618842868937282,-0.0645811823776868,-0.0773147823458786,-0.0889193444187649,-0.0782529812628355,-0.0803115439330008,-0.0772276307300146,-0.0901056109987631,-0.0907073252867743,-0.0801783381142546,-0.0636240551217024,-0.0488480821662538,-0.0422573190147761,-0.0258155893233203,-0.00772373596589571,0.000916061814044467,0.0142291468415201,0.0322872360358271,0.0232930469271304,0.021064575475805,0.035574783455915,0.0461317230279401,0.0594846304909753,0.0417781557752002,0.0409215182584006,0.0435744759153534,0.0623688068802903,0.0551432449329146,0.0668325433731172,0.0640602236450332,0.0465803793788453,0.057563722821601,0.0606387535209509,0.0403906345838514,0.0446618156884131,0.0316334659829673,0.0139347530002703,0.028043752954648,0.0459709381960929,0.0359874505347311,0.053808706557497,0.0336671035643727,0.0377683732052025,0.0191059299464778,0.0370365512640192,0.042583563304722,0.0233140649047414,0.0198165133570425,0.0317782848874237,0.0162960539688854,0.0289336001713152,0.0214054158947568,0.0225529717482968,0.0336865704835261,0.0487174952006906,0.0406670191500142,0.0568381597491892,0.0624207376073922,0.0563351691002436,0.0476740217408194,0.0320259219749859,0.027838409901445,0.0302318724433686,0.0220310474209173,0.00202546908651402,0.010011786419766,0.00336245735170992,-0.0103416086772377,-0.00117462080852726,-0.00232504040794668,0.0133092241712427,0.0124964967522829,-0.00233519593861387,0.0128674825101831,0.00352840015364464,-9.90091481183342e-005,-0.0161190098097239,-0.0055351828907656,-0.0188123266085806,-0.0313733463466331,-0.0240146726694414,-0.0294136833477938,-0.0411838956217095,-0.035481550472793,-0.0216538185305121,-0.0152710801517911,-0.0249772864319097,-0.0345420034300387,-0.0429511406496459,-0.047539062073695,-0.061429851625435,-0.0693970242990818,-0.0593134202737061,-0.0442197796063117,-0.051163099644836,-0.0595217057119246,-0.047785501752773,-0.064970402652978,-0.0686274699743463,-0.0809223881040502,-0.0930006261377491,-0.106118592984862,-0.0945704699527212,-0.085394569586371,-0.0871246602899609,-0.0930301212155196,-0.108111305719252,-0.11755459867522,-0.129803733850886,-0.113356409045276,-0.100216983207312,-0.0846636765483426,-0.0955134016783651,-0.104493775949332,-0.093472248802993,-0.105933193748827,-0.104756719096276,-0.100668837021266,-0.0892398931877816,-0.0816297296984035,-0.0699754434379261,-0.0692679985258381,-0.0874200857677634,-0.101506325481296,-0.107141893514837,-0.0999687999551206,-0.0822974682561094],[0.0191575785167515,0.0282593715353532,0.0136938082172189,0.0315089696193394,0.0182893654088572,0.0268304164395863,0.0305705947590957,0.0101671815523052,0.00784060698499189,0.0099386373696424,0.000840536193085883,0.00256712753108235,-0.014917890363822,-0.00496154454177811,-0.0196368139787735,-0.0192045974334637,-0.0158839718508621,-0.0111185925767175,-0.00662442522220907,-0.00505636339210846,-0.0216795847713352,-0.0260410162582929,-0.0238827997360399,-0.0419224643960199,-0.0268438299742955,-0.0315642239014761,-0.0461752976704726,-0.060218447805682,-0.0789082183975053,-0.0698291200144325,-0.0601991475868504,-0.055411319306273,-0.0735687243866593,-0.0821918192309615,-0.0784338044239834,-0.0832654260353191,-0.0707206072808881,-0.0736679886123882,-0.0652601333810015,-0.0519844953224703,-0.0526804248493061,-0.0653625884119998,-0.073731610267553,-0.0762265277681952,-0.0643572552772456,-0.0746017753864481,-0.0830979041499358,-0.0804797260534071,-0.081125257648308,-0.0960830994060711,-0.0870769376979723,-0.0796714024585954,-0.0895321208375006,-0.0970864367344154,-0.0809217537562282,-0.0904472125658683,-0.0754589422568266,-0.0587718489923846,-0.0568420969616401,-0.0463629933493628,-0.045063513120345,-0.0427236360630702,-0.0401889001893041,-0.0481444546059202,-0.0494960172229526,-0.0669144051621581,-0.0510647665663094,-0.0551190270647622,-0.0617065503275103,-0.0540312397302645,-0.0535397905706487,-0.0422475248487473,-0.0530141306828028,-0.0681479753612905,-0.0626506665208754,-0.0538175191962381,-0.055288266538685,-0.0708324073648037,-0.0601974646001228,-0.0455682153560852,-0.03350946463986,-0.035593602931723,-0.0216096318427301,-0.019684608298618,-0.0247168898342095,-0.036831600325762,-0.0452373466149895,-0.0358429442615934,-0.0339104880801111,-0.0408304207701419,-0.0289857188062038,-0.0414093656958289,-0.0454218748086366,-0.0419758875911433,-0.0598755676019205,-0.0762773640006733,-0.0748549044709259,-0.0647427051213036,-0.0782984937530213,-0.0792588549432351,-0.0618440269832136,-0.0476034583369529,-0.0583801671943948,-0.0588344897924363,-0.0586762355358881,-0.0522660401244039,-0.068613431781487,-0.084186352577977,-0.0740777235589957,-0.0684066289567714,-0.0868739546525593,-0.0743292521451673,-0.0846176477655205,-0.102839445230409,-0.118919588998055,-0.127380786904633,-0.126537999812638,-0.133644876243634,-0.149441376292981,-0.133751573650056,-0.139484708074792,-0.133548146290413,-0.125645800023949,-0.135569664753784,-0.118799486553802,-0.121618499097329,-0.114365223066701,-0.131020062307439,-0.117251682535396,-0.129028085955385,-0.125579814151934,-0.133119687629775,-0.131780355721013,-0.141003830528916,-0.152967257435452,-0.1694369151716,-0.172582233093812,-0.169083097608675,-0.178017632347406,-0.181379476890969,-0.182837849330431,-0.169155439934714,-0.169741686749464,-0.160801099359855,-0.16480535141759,-0.157913749192528,-0.161135038916051,-0.170831671827477,-0.159115395264149,-0.163653389683364,-0.175942509177358,-0.167104846521198,-0.153609804785405,-0.145988046940108,-0.145587036252998,-0.149958630448196,-0.162223590400831,-0.167507871576563,-0.180658260996474,-0.171746563268027,-0.160274921905811,-0.163000354027799,-0.165097165670572,-0.181317766828554,-0.189901796896709,-0.182003141795498,-0.191456160776751,-0.190215479968633,-0.180432044832647,-0.194579704758379,-0.19107193378932,-0.201180899823067,-0.208457662205727,-0.197687291819904,-0.183285406925898,-0.172259838905712,-0.164376133933966,-0.175250267389436,-0.16897423976787,-0.181068125410028,-0.19643488395656,-0.194197534383024,-0.185433891573371,-0.17480206166609,-0.170341316751678,-0.180963787837888,-0.190109160144344,-0.188742651551949,-0.174014219738512,-0.165630894264452,-0.167473479295907,-0.168485590273002,-0.183999232760519,-0.184288370666567,-0.191882755618704,-0.199768756707469,-0.189296111556689,-0.198439689647429,-0.213779451467593,-0.21274837638664,-0.212536986619412,-0.219700407159314,-0.231999541090815,-0.240504481914261,-0.247125474695246,-0.232215238136904,-0.241004267268409,-0.240420615845166,-0.231961285474331,-0.246074970719225,-0.244261491792945,-0.239137648345874,-0.23423744816767,-0.222103814310496,-0.217112651317772,-0.204746929699526,-0.202089076396363,-0.210653102881742,-0.214981905420057,-0.216487145522714,-0.220007800745241,-0.205678613339682,-0.213952723820007,-0.209202549919637,-0.198930234550455,-0.203074944943818,-0.191631647499235,-0.195094598879695,-0.201955853607913,-0.198967206411832,-0.187548911543768,-0.191426553108294,-0.18507674455687,-0.17069400958286,-0.160760431688179,-0.166705877935864,-0.165049774507541,-0.162871268582461,-0.154206369861306,-0.157604313988061,-0.16911152505591,-0.154364939278695,-0.138052829322178,-0.135969886210682,-0.142865502039505,-0.153916290570965,-0.152788419524051,-0.160814401935761,-0.147624133490381,-0.137486718866173,-0.138843888735293,-0.127756438762623,-0.127483922186143,-0.139585946956917,-0.139970022856654,-0.145870242556772,-0.153102938381152,-0.149652993203806,-0.139231849600083,-0.128215565520825,-0.129821508349804,-0.120210512059028,-0.12444345535899,-0.123674435114927,-0.131138498085411,-0.115423038740712,-0.102709455166708,-0.0867913109047483,-0.0697845157728749,-0.0546956274282414,-0.0645688192239965,-0.0768677454537753,-0.0909762888613551,-0.0748575684385364,-0.0767085217631898,-0.0900394965590855,-0.0952585834999231,-0.0802872115902711,-0.0848467129106716,-0.0879935268837638,-0.105502269065094,-0.090528220111085,-0.0970147471866938,-0.100959809082724,-0.084785533466441,-0.0959058970950551,-0.0844690037277618,-0.0854666693433991,-0.0781475285520282,-0.0784518817314406,-0.0736972563316346,-0.0802139017936159,-0.0630626516128826,-0.0763841648555105,-0.0592479545076962,-0.0504636209805447,-0.0516464617551248,-0.0584358425414637,-0.0501765282760684,-0.0366774909637005,-0.0354818497067351,-0.0172183986117318,-0.0226128663999339,-0.0250193883184492,-0.0234463903563951,-0.0264931259145604,-0.0217495373975733,-0.0392780997255363,-0.0282495356356006,-0.0136899019244197,-0.00272941864491638,-0.00736900373381,0.00944013118347597,-0.00865591993977632,-0.0189660944088057,0.000456185204475323,-0.0101659613460029,-0.00707931973430087,-0.0135353015568321,0.00481909300507977,0.0116636484813255,-0.00665276392791048,0.00112144280296445,0.00699898814825684,0.0228520179542087,0.0393677117112365,0.036563082630934,0.0427111964169777,0.0380326173176513,0.0343323264761135,0.0483802899461814,0.0339200957889987,0.0399003915858975,0.0304363122798446,0.0362385161637777,0.0270714233252305,0.0225184684066724,0.00358318842185734,-0.00618030483001641,-0.0222901403343815,-0.0172209116827294,-0.0111652415376187,-0.0189715683361935,0.000418320890206436,-0.0142555143356972,0.00540156051606067,-0.00537411124137854,-0.0221648782876666,-0.0189012255069552,-0.0353822647213942,-0.0334477812753529,-0.0378672285667281,-0.0251621502806303,-0.0368468618682954,-0.0484499019335849,-0.0563068281489184,-0.0391624358736967,-0.0509104444918606,-0.0670946433125275,-0.0781811382936615,-0.0729893062450327,-0.055023807538974,-0.0373537863197027,-0.0189742700082084,-0.0131713647524924,-0.0112560822182266,0.00655697822630508,0.000963197611075106,-0.00384685989248812,-0.0200387646560186,-0.0344070482176927,-0.0224076113387012,-0.0344278162093247,-0.0383194366600295,-0.0254075746508392,-0.0364684141858991,-0.0373729852263935,-0.025896845729543,-0.0389808392941178,-0.0282875930155414,-0.0308928782772235,-0.0244850375002839,-0.0327961990498139,-0.0294580729225199,-0.0239626793587217,-0.0224532616771995,-0.0392519482116247,-0.0438614349109103,-0.0475513752823516,-0.0600096669583533,-0.060804526770373,-0.0760632048769403,-0.0927722486167508,-0.0922201343049914,-0.107997129461111,-0.101997261851743,-0.108203707854583,-0.12302109279192,-0.12418168332914,-0.139447233585584,-0.127351205521115,-0.12523303573213,-0.13714387855063,-0.149333218806794,-0.136443506905774,-0.143870821415553,-0.127587578315836,-0.131340829700429,-0.13258730462858,-0.117416873148383,-0.101083471030684,-0.113805268566484,-0.125273886634282,-0.127508990881632,-0.127319200861217,-0.139726989984536,-0.13942572836675,-0.136496603272695,-0.132706210420499,-0.122087718919089,-0.137834143570325,-0.139588876540254,-0.139818662621393,-0.138886677456821,-0.127014473287259,-0.11425057650246,-0.106465992060853,-0.113250238808166,-0.124358266414678,-0.138009518818076,-0.147522264273636,-0.149777304631526,-0.145779271125442,-0.129477647082769,-0.142698451449964,-0.157828982072132,-0.146962962463924,-0.137679605044528,-0.152152211708996,-0.137047532611464,-0.153533171274151,-0.168668011570982,-0.182455845035189,-0.166564553841931,-0.181221297936812,-0.185226831882744,-0.172749441284211,-0.15826520565826,-0.143876321498832,-0.129993712051429,-0.114734033480362,-0.097981218271659,-0.108434252013367,-0.0919158671117751,-0.105031879678349,-0.119744827320418,-0.130351020570107,-0.147588375185575,-0.153650932120982,-0.139380368033488,-0.147917127557748,-0.135309496660595,-0.152199889792558,-0.152526215225855,-0.1670044054457,-0.164766595596882,-0.161932008909791,-0.164779793253326,-0.168096459980446,-0.172233597464838,-0.18300987936736,-0.177602059975017,-0.168591593419928,-0.184752091176034,-0.182126746228934,-0.195955260757781,-0.182506967371019,-0.169269754338516,-0.180823885080711,-0.190249344930951,-0.179863768617445,-0.19402975232682,-0.203724753730796,-0.215090198140798,-0.199560424715084,-0.187977674653326,-0.198627095540469,-0.209860826655212,-0.212599802086408,-0.210563327973725,-0.215090382478417,-0.220791811325767,-0.217651189906675,-0.204385033057384,-0.189998843397481,-0.190522562781691,-0.175459974106147,-0.170005685126524,-0.164052295987687,-0.148003605411428,-0.134130040717551,-0.149829507119872,-0.13447747602168,-0.131455107979654,-0.144888363080461,-0.161275693935902,-0.154705327118821,-0.157623592616375,-0.158487638550855,-0.171197328933173,-0.155039063866839,-0.16490243915574,-0.163580240869341,-0.158773053217375,-0.166720007299141,-0.172132852836859,-0.177720810619664,-0.162644105114435,-0.166279514470357,-0.149840593771085,-0.133189843517281,-0.116791044654578,-0.100635060543688,-0.0903353260672775,-0.0815394687935845,-0.068164594671555,-0.0734183192716823,-0.0803454474495167,-0.0645047723257477,-0.0527897381070654,-0.034182710620617,-0.051992314960549,-0.0614698574349146,-0.0515314490589989,-0.0523465950199308,-0.0649617420629267,-0.0471087700475649,-0.0633313030151774,-0.0773969694442748,-0.08531326926838,-0.0767716922914725,-0.0767416149737257,-0.0875940011887535,-0.0876166135729733,-0.0869636810061141,-0.0825056856062143,-0.0920624328580326,-0.0869797546750026,-0.0891902637733164,-0.0991532785598921,-0.100165495320712,-0.0889670533174411,-0.0993011382895846,-0.0856058536266898,-0.093456129423768,-0.0868256309045931,-0.0751976739170699,-0.0776591809307904,-0.0638359005357574,-0.0747207122932492,-0.0611918249999132,-0.0679143451408722,-0.0665254793783783,-0.0570638779788027,-0.0738259088046844,-0.0585950034216361,-0.0498187830325714,-0.0617472050458397,-0.0700884059947664,-0.0789854510899207,-0.0843915084654169,-0.0943904647113447,-0.102224126947416,-0.1169548131312,-0.103686283219437,-0.100694992913342,-0.0952045079458606,-0.11087214403272,-0.115443989371003,-0.111667050735056,-0.127778462969171,-0.13722804396216,-0.13595404211418,-0.121503043250457,-0.111898507572226,-0.124531571111029,-0.11641991543999,-0.110131856874169,-0.0948238167091645,-0.100068981025444,-0.115090533129035,-0.112701879315458,-0.109387796103905,-0.096444731817687,-0.0983888971195725,-0.0853358202926354,-0.0974833458723567,-0.109622492517968,-0.101564488771739,-0.0944552669237897,-0.0898617401127669,-0.107282155744681,-0.119053986771198,-0.118258254959027,-0.1355354288294,-0.142411129258917,-0.15832274740112,-0.156341891461813,-0.15370216268628,-0.168426827959156,-0.179283967169219,-0.167231254546794,-0.18003139228214,-0.187771478991953,-0.19432303997718,-0.200590185843536,-0.19158046367828,-0.18027452072302,-0.193221233643469,-0.194698308680041,-0.187194383580565,-0.198159548265902,-0.192011175064355,-0.207961233330658,-0.206083774753433,-0.214341854779724,-0.2263938351201,-0.237700393745399,-0.248275962228546,-0.235454382436084,-0.23320660746368,-0.226905806532764,-0.217774849019278,-0.226510463263707,-0.233919273309675,-0.23406693587875,-0.231616949661664,-0.242341302425005,-0.241656592540086,-0.247309338839627,-0.235217125247936,-0.2349986865172,-0.23812376580687,-0.235158708558797,-0.239470227060812,-0.23199822647846,-0.217058256100749,-0.228397827707321,-0.243429229726394,-0.239024131675401,-0.23231650368114,-0.244392632797466,-0.230101993083947,-0.241432805387447,-0.226292344334297,-0.238742585625564,-0.249410297431156,-0.246297613891092,-0.254454014957806,-0.250055372913457,-0.256351734904995,-0.26645828415221,-0.265938162600407,-0.257171153413193,-0.245670375572255,-0.239101428537015,-0.246178900524332,-0.242284709848876,-0.243344953576904,-0.241972431897398,-0.241744494332402,-0.229713997042081,-0.226728717007172,-0.237322055373872,-0.227882827078156,-0.227656196640725,-0.241053283065537,-0.234069935002086,-0.24812940517506,-0.252051189588033,-0.244754595896179,-0.247894837542451,-0.253295797385227,-0.267676187887545,-0.264376656320359,-0.266942168134225,-0.274613228700991,-0.275858908492484,-0.274565692738878,-0.274384351103743,-0.27811562363361,-0.276229853270526,-0.269387477649642,-0.280922854749672,-0.276520499016523,-0.262257336401364,-0.253681398227311,-0.259685090594355,-0.26739742394163,-0.28166752504507,-0.271519657402921,-0.265557510903126,-0.269613613816969,-0.262249499452317,-0.249195389748015,-0.235645036218501,-0.229791577188101,-0.231272702476637,-0.230959775319914,-0.230088486985605,-0.224524818667699,-0.231548411762641,-0.230452016765683,-0.227593483182679,-0.229843612260445,-0.223095785978773,-0.234163536007536,-0.245509026999508,-0.253723374245583,-0.245634959214131,-0.244411080642545,-0.24549690699069,-0.24932676831763,-0.260085773798438,-0.251056450753736,-0.254981780909573,-0.256638907415135,-0.255483542521574,-0.266934236213707,-0.272836352548574,-0.276983937003586,-0.291103289836812,-0.277738240196031,-0.264939603186796,-0.270041019805084,-0.271957020575819,-0.267643316098243,-0.279320037658638,-0.28342070408811,-0.283527859879566,-0.272826979709571,-0.281057176219303,-0.283436688477733,-0.273738434449898,-0.269812432176846,-0.283634980388642,-0.295941047054948,-0.284302101627338,-0.271098018745548,-0.260490222477669,-0.263354104023076,-0.26027977609183,-0.245604192928905,-0.246500639099113,-0.258903698245343,-0.245222857610757,-0.240876664455957,-0.231343615373402,-0.238320041439456,-0.23293205232974,-0.242227986510779,-0.245718989802451,-0.248782438053547,-0.261982680392775,-0.267994296636075,-0.275456289923503,-0.261338488355921,-0.258704743890363,-0.266272140306544,-0.25726069223356,-0.255600584311391,-0.263109450471713,-0.262313681980034,-0.264537556681605,-0.250038794851355,-0.260010142178252,-0.251524214561433,-0.258577114471484,-0.247807526966018,-0.246278354644728,-0.241394966706014,-0.234833733412675,-0.235350467912606,-0.221099751763211,-0.236588834506246,-0.248017820727931,-0.236201673954357,-0.241345524995128,-0.25240633304797,-0.263170453919278,-0.271342281160153,-0.281022550711687,-0.289120754521065,-0.275072534241703,-0.279022090295228,-0.274773261710416,-0.282583318898759,-0.277439986047063,-0.285746897913938,-0.271976617771111,-0.262732540312662,-0.269540940925065,-0.279563061905899,-0.29101770447757,-0.296540012353632,-0.29813757392806,-0.308184370167431,-0.319658326148929,-0.3309293154347,-0.323209435938846,-0.335204429463433,-0.324542755692631,-0.311646365870338,-0.306190790420199,-0.317375862308035,-0.305673633675987,-0.307044048071413,-0.306725808671765,-0.30126460450997,-0.312057868826151,-0.315815275608264,-0.321836855368136,-0.332669237999821,-0.344518126089703,-0.33446465978807,-0.333107561266801,-0.320639967163427,-0.329190072555308,-0.335914061246664,-0.329462521383967,-0.34203605010133,-0.336034542537059,-0.343848910668362,-0.332630586240589,-0.324397653354381,-0.321803087148011,-0.317976652750616,-0.325848266676612,-0.319454141877619,-0.319004046525471,-0.324866647278209,-0.32704376435049,-0.323745083088467,-0.322074992721509,-0.314406601114301,-0.315328477814081,-0.325096496648159,-0.31575247066993,-0.309688582248095,-0.314193915040064,-0.309268505473951,-0.311533778038875,-0.297915478514609,-0.295387012716704,-0.287317474641684,-0.285109407199703,-0.285697041781292,-0.287851458433986,-0.284447001151872,-0.290838623933054,-0.290947896722128,-0.287914350144747,-0.294241021017165,-0.282579317509459,-0.273117945636745,-0.268377504156946,-0.26869956576218,-0.267935661022218,-0.261514510404269,-0.262314246897662,-0.266471615030183,-0.278130939628777,-0.281512139345891,-0.2796478877605,-0.287479640817592,-0.298555887711024,-0.298244574905838,-0.285560575290374,-0.284096768572575,-0.289646690228075,-0.296836896960078,-0.296166891020887,-0.302283791083498,-0.315751228939034,-0.320107174795522,-0.330693899945413,-0.334017001013238,-0.337420033732803,-0.336175503283134,-0.343713257916766,-0.346763191569362,-0.359596332613217,-0.365220170123874,-0.352874840881344,-0.346231275986695,-0.358701388253081,-0.367884211282587,-0.35832240961191,-0.363326562847647,-0.357542998717181,-0.35670653069582,-0.353718283341087,-0.35171895695228,-0.355625688700838,-0.344616196948598,-0.347965745792878,-0.339037048121322,-0.352237102571741,-0.360789415858708,-0.349172316757068,-0.345478360366351,-0.340650306115044,-0.340150988429398,-0.33889387683673,-0.332543533094215,-0.321698628310058,-0.328901605024695,-0.334533513182931,-0.338910901570589,-0.352000447873675,-0.3569179208801,-0.36232048084315,-0.361929482342218,-0.36417947280811,-0.360060736108542,-0.362930720329428,-0.375486170597342,-0.386484269916211,-0.377551406405209,-0.375881429925555,-0.364801263851957,-0.369663978371968,-0.375903211713807,-0.364172482888854,-0.364772103867769,-0.367368359728647,-0.356421606164032,-0.35033851209853,-0.359069848030865,-0.34662538179576,-0.351331941500135,-0.339582379838598,-0.340656409431555,-0.333965302949601,-0.32265754681988,-0.319653664812565,-0.322893368102742,-0.32222800157334,-0.3123450161407,-0.300945190354105,-0.303344814562563,-0.296712994296193,-0.286046408576078,-0.295235436738401,-0.301672162992001,-0.294790114638283,-0.289843086585558,-0.286451059947865,-0.279148891123759,-0.271972406899771,-0.269213249903032,-0.28175158867647,-0.295549190693925,-0.28447378528894,-0.295837626240187,-0.307957815048326,-0.314525442507,-0.311870699457883,-0.301870892304177,-0.314000041071389,-0.320325368157568,-0.307976014611548,-0.304095982095901,-0.312010955400564,-0.307753133043282,-0.30224361572235,-0.294369790330227,-0.300653031203869,-0.303910368232104,-0.313672997959027,-0.319256042966433,-0.312576155941081,-0.300630048653237,-0.286839623209877,-0.290754863806207,-0.300349576571651,-0.313065351904282,-0.299811254840447,-0.300009192529564,-0.290320107738427,-0.296746643191782,-0.29746133756804,-0.283565539417358,-0.275118490094042,-0.276762610068592,-0.26815819690714,-0.279784029895014,-0.291617799979455,-0.298521808046114,-0.295840402171093],[0.0105361908953636,0.0137174487008735,0.0198012720463736,0.00983354826704419,-0.00311989585237904,-0.00968578398669784,-0.0132967633250691,-0.0262497542337267,-0.0148139219157282,-0.0301055164267398,-0.0444131400387795,-0.0382425809413358,-0.0245550662926366,-0.0134352268974589,-0.0138295869218168,-0.0112141941648892,-0.0169970213346313,-0.00761586892360289,-0.0202143611769271,-0.034922347657357,-0.0175559138917963,-0.0168041438010317,-0.0253070168564516,-0.0332021587535327,-0.014034441412755,-0.00272800064757639,-0.0168481309269591,-0.0341684401142361,-0.0346613194371463,-0.0521737039798637,-0.0608369019554132,-0.0780599967436725,-0.0708765634693692,-0.0557418848530415,-0.0740412590025569,-0.0870905194307655,-0.0900816455219927,-0.0777243365697312,-0.0844313497852737,-0.0835584148501498,-0.0654676545745057,-0.0834030577189825,-0.0660974522825069,-0.0575002273291169,-0.0403602893702062,-0.0441316745963372,-0.0456310145544603,-0.0529312847232126,-0.0455078575241539,-0.0530233505795976,-0.0425227836825601,-0.0356331172861344,-0.032419715559095,-0.026567462160322,-0.0360875535363182,-0.0264537131744679,-0.0130765172087983,0.00268504975735229,0.00102686269140984,-0.00085124747211851,-0.0131407463228368,-0.0267322649703708,-0.042818394758697,-0.0246347337469014,-0.0253045280116375,-0.0280649772099967,-0.0349400677976518,-0.0329414812006432,-0.0468065256943124,-0.0493310732400444,-0.0444437674044994,-0.0412129333974922,-0.046069701536833,-0.0639311898756416,-0.0712443634527323,-0.0799877792720707,-0.0700381909899286,-0.0701280555272027,-0.0818082905026773,-0.0924880640141935,-0.0977005667545336,-0.095885229823703,-0.0953841408557089,-0.104979244766825,-0.111276793862509,-0.0990558738181083,-0.101252338798738,-0.100423095419659,-0.0851376700390681,-0.0701901097263357,-0.0587347886650542,-0.0760647225370363,-0.0600596906974897,-0.0426839604324158,-0.0272059312692845,-0.0185340987448186,-0.0376206410526114,-0.0341151672859826,-0.0159632567687999,0.00286003770558407,0.0208333441023763,0.0120175042868558,-0.00366703727751483,-0.00351062540511904,-0.00291434129756951,0.0099811560898404,0.0207549955005082,0.00692537919107705,0.0127725414319262,0.00624804329905282,-0.00359445169985573,-0.0194081924313584,-0.0280987769838053,-0.0110793542160161,-0.0267022162891224,-0.0175910156509754,-0.00812265650835053,-0.0179766635499617,-0.000180129150698982,-0.0180327716952403,-0.0284541799518608,-0.0220159098446028,-0.0283222530475307,-0.0180526318958796,-0.0201501959059462,-0.0281964703316975,-0.0102516376406998,0.0026203814758694,-0.0153811633256259,-0.00536681874501266,0.00115856299598516,-0.00197033427813553,0.0114051459459834,-0.00858969121325537,-0.00379452220894505,-0.0228402158048808,-0.0357363221789044,-0.0507078720090226,-0.06848381635575,-0.0530324732843375,-0.0622500974427407,-0.0686701780425902,-0.0738104037933535,-0.0916824841802523,-0.0797038937361841,-0.0874225737034684,-0.0809315762389839,-0.0800274663692344,-0.0976747608774067,-0.0957812859590653,-0.0785363986825124,-0.095627039610851,-0.0923901812775709,-0.0745164245735699,-0.0695781806083765,-0.0679079255739805,-0.0668368858636061,-0.0662922311639309,-0.0647409720737124,-0.0701029795472474,-0.0764586776187576,-0.0893607471328673,-0.0971502489651367,-0.085058672659368,-0.0984311243894626,-0.0992442310530794,-0.111369061965719,-0.0955675788086741,-0.0810059971141479,-0.0721103668326238,-0.070749472590374,-0.0658081828495315,-0.0782712144671347,-0.0618600656763563,-0.050161169413477,-0.067033878559447,-0.0526172144982126,-0.0445228831667495,-0.05272230867211,-0.0392506381555213,-0.0405127541787802,-0.0350316168838377,-0.0236513921474192,-0.0283148458173624,-0.0168439498093348,-0.0166323155510167,-0.0335437000349619,-0.0271025243804051,-0.00925928122378328,-0.0152715716139312,-0.00225243692546095,0.0122692991164552,0.0129988992187522,0.0136096828173662,0.0257880553118961,0.0438976307138477,0.0332042248334801,0.0262428790301446,0.0125273990082742,0.00376303803464717,0.0131851185504095,0.0143029686598832,0.0230231456390224,0.00585815874456097,-0.0110329965911029,-0.0205129689367851,-0.019719111116536,-0.0314235555131362,-0.0286101896940663,-0.0272618997704204,-0.0258105129498907,-0.0445759078098302,-0.0282592559048286,-0.0372440088668475,-0.0472767487825289,-0.0646238216832701,-0.0655921561224602,-0.0682782768986949,-0.0601345624339958,-0.0688682767708578,-0.0599139505110327,-0.0711927815156103,-0.0881526030487028,-0.106300825585981,-0.121215277356979,-0.127932281117876,-0.139069821717891,-0.143672064189141,-0.130255276045929,-0.133980093388984,-0.128184812362513,-0.143718581236338,-0.129025670579847,-0.133425329459121,-0.126956552943906,-0.109884081536634,-0.118595465675414,-0.128312175697889,-0.144062782295771,-0.148766422693155,-0.141872783167492,-0.126501628236597,-0.128231848975094,-0.123484634650181,-0.113147434845282,-0.122966034618505,-0.138929034864214,-0.123971600614283,-0.139805059552723,-0.15316704894098,-0.148192310973609,-0.160084087679067,-0.153487444749621,-0.167891965930395,-0.173815471141452,-0.176468127011931,-0.189101742478032,-0.190103136981931,-0.196490992808087,-0.202842804248192,-0.195616963636694,-0.208336813868853,-0.212695835153776,-0.2098963270804,-0.195327948859907,-0.18354199083351,-0.181987117577979,-0.195354741019927,-0.195144085932413,-0.188174343814915,-0.201486900887066,-0.208399347008009,-0.216317351512643,-0.213587988459564,-0.225174995997611,-0.235980193045239,-0.24917630728596,-0.244647536761374,-0.245678905414536,-0.232006870644787,-0.237992342045014,-0.249739518959386,-0.253234988697792,-0.267248737015724,-0.252838599468142,-0.261208021855524,-0.247475558340611,-0.232735108062524,-0.233367847329102,-0.242147757684347,-0.250208239457376,-0.261222528145703,-0.262298338628909,-0.275841857831894,-0.287736447019771,-0.296482242174323,-0.291796351411822,-0.300338973417996,-0.309195338113089,-0.312677367831456,-0.311594093813755,-0.305046143520899,-0.301936108578712,-0.29999446665377,-0.29118293873665,-0.302363819442726,-0.312115331723363,-0.311910848573655,-0.317229392144522,-0.311843853607741,-0.298118467361005,-0.286944683401425,-0.297101152454696,-0.296480196528448,-0.283691871603912,-0.271844280577041,-0.28219692751729,-0.273586058268537,-0.259164774551313,-0.259368539349097,-0.258347840788067,-0.258434677316612,-0.267909154208608,-0.270804654145851,-0.267508098765505,-0.272442365814311,-0.259637411624337,-0.260333553393133,-0.260603986625752,-0.256839047267234,-0.24566936047188,-0.259337821051381,-0.266578257434782,-0.265871782385298,-0.271597206152208,-0.26079710988275,-0.249717930534378,-0.256273799731942,-0.260131424961292,-0.272190819742883,-0.261122589180365,-0.270439328742919,-0.260596783422398,-0.246137466220703,-0.237122340093549,-0.234279652145125,-0.238329930119041,-0.232973270974828,-0.231986756266241,-0.23606443581859,-0.233044577303297,-0.236996190591975,-0.247100210244254,-0.254935822480739,-0.255797679968055,-0.256639599361883,-0.259928673130529,-0.262806415429192,-0.263747160416546,-0.270220691753809,-0.276424343667909,-0.283844036511146,-0.29780557931781,-0.284584458532012,-0.292941207406035,-0.292698265943207,-0.29918360143785,-0.296444335997917,-0.294040066326026,-0.280045825366359,-0.27356644410777,-0.270869195660195,-0.268640379645532,-0.256794929474154,-0.246656000234889,-0.242685827143906,-0.238391872232963,-0.22825199287731,-0.224940673335157,-0.234909520197822,-0.248419492929158,-0.236462798746457,-0.230655392736482,-0.236358143709564,-0.243455712498264,-0.243286619909208,-0.234694485403065,-0.221706393453038,-0.235441801479486,-0.221153071142149,-0.226390027682687,-0.23199822189711,-0.219364095031877,-0.224542169183505,-0.223368025411661,-0.214690225553048,-0.218462544715628,-0.217503654687829,-0.210205229036714,-0.196377048257812,-0.182711395242457,-0.180506334040094,-0.167027050866712,-0.162321008889089,-0.145842944888848,-0.161841066630627,-0.167379942723283,-0.157561451351232,-0.152679925426027,-0.149243618979777,-0.140650184257289,-0.145293920585225,-0.152589610820979,-0.146267319751366,-0.150864198531391,-0.143245315204734,-0.134369811642423,-0.140385322557046,-0.12764576856009,-0.132357577022328,-0.148264770914457,-0.139188298928602,-0.152560048664237,-0.161261971811506,-0.151617492789746,-0.166051991938092,-0.170134790153134,-0.171208582584057,-0.185791144785293,-0.188129289537076,-0.203532448078854,-0.188882598299719,-0.193701871894025,-0.199761026912959,-0.210511204836596,-0.198043064128714,-0.210697895519613,-0.21150882231119,-0.20551062621604,-0.19002736581825,-0.183875392532561,-0.169627398498996,-0.15830314912857,-0.143964391942175,-0.13153164744596,-0.141590230939694,-0.124995772628331,-0.108860025213473,-0.126203839371611,-0.132396465576535,-0.132224823581781,-0.131127044331751,-0.131809956469766,-0.134393958549009,-0.131401482528076,-0.127624508023142,-0.133955122058334,-0.146046185020657,-0.161910409053798,-0.154561487577367,-0.156091640538637,-0.144558045519765,-0.149300667888992,-0.144630059105786,-0.12783537612103,-0.132398695127679,-0.149058163211223,-0.146070920150804,-0.14181096892254,-0.143334404577902,-0.160400475452045,-0.161239322819493,-0.1530309764072,-0.164184512913722,-0.163790957334697,-0.17393314114984,-0.17337421984186,-0.175992503050964,-0.173636974014991,-0.174639129245786,-0.188904803317387,-0.183354659645297,-0.169499624965533,-0.161181092088968,-0.152925789162352,-0.163869044406418,-0.158125068267414,-0.168266443605295,-0.167366614231061,-0.180199620743928,-0.172234718426035,-0.159709659615413,-0.158624511707441,-0.157710429519327,-0.150274098905853,-0.150220267048435,-0.138137158364948,-0.12588086377256,-0.119911070931045,-0.112601203986525,-0.0996279205745619,-0.0952613497033187,-0.0780383349321686,-0.0643733684161971,-0.0688336431730407,-0.0736317940672646,-0.0827326082005998,-0.0758011771731033,-0.0837785927488517,-0.0674730650287291,-0.053972815180966,-0.051777706158013,-0.0387085290385345,-0.0484427925567992,-0.0297086633955073,-0.0321401669279193,-0.0402722799011072,-0.0284961147690458,-0.0226086484006779,-0.0039569503199437,0.0110895995546147,0.0243809236522334,0.00587657153923171,-0.00825887782518986,-0.0182304152120827,-0.0281401284726912,-0.0189551145502274,-0.0192318196019291,-0.0374580161437297,-0.04212984758758,-0.0317573120726536,-0.0292330281121083,-0.0163342023874194,-0.0245480872897664,-0.00712010138698771,0.0109028285880051,0.011352060241566,0.0157742623084016,0.0315308863082644,0.0150875590209054,0.0290250219189938,0.0132284383947849,0.0264666543446228,0.00729654317012995,0.0112348652530694,-0.00326436279127074,-0.0139329081164279,-0.010316827945153,-0.0154777952292068,-0.0206923865784658,-0.0164127336259517,-0.0282733810675353,-0.0307537410403694,-0.0471741283958944,-0.0443280710591694,-0.0538652468133966,-0.0501793117909042,-0.0561371906053144,-0.0601133806977819,-0.0429823598221357,-0.0274498199825884,-0.0125699415857022,-0.0296049675022854,-0.0438525752140704,-0.0471838935423095,-0.036152572833264,-0.0197717598144741,-0.0292197741601155,-0.04802017258527,-0.033312111506515,-0.0507837076296012,-0.0352240219668567,-0.0404445714852723,-0.0444983490182437,-0.0279961985566238,-0.0233892877270818,-0.010426201180316,-0.0248097433999733,-0.0428688236228716,-0.041156373701856,-0.0450723852473695,-0.0565637424213552,-0.0661617188610067,-0.0804578236562601,-0.074251736128116,-0.0577355075577923,-0.0563688714123901,-0.0589381003732959,-0.0603870029095652,-0.0571625602877763,-0.0624129624468179,-0.0681690367313277,-0.0703277893175515,-0.0556639540460566,-0.0566325158103551,-0.0645620874456544,-0.0578689877130998,-0.0616438447330951,-0.069219545195404,-0.0855969104363004,-0.0997678098538229,-0.0851496954181744,-0.0998103614563419,-0.088376029535308,-0.0761308455561875,-0.0945709890651384,-0.109801704852215,-0.109671931158687,-0.120756106929222,-0.123018745310883,-0.127873862824761,-0.125613596643527,-0.11386090475826,-0.108642017575746,-0.124016008754661,-0.136134270557177,-0.135323724735382,-0.14453690449576,-0.15147852329414,-0.165196463254648,-0.181642178658124,-0.194357444090363,-0.178604656906343,-0.170213827663303,-0.168984927187024,-0.162570483353745,-0.163043165185781,-0.161935645161766,-0.15098960613976,-0.166225969049995,-0.174639199365284,-0.168443098752144,-0.168671619817518,-0.177398530888805,-0.189296733916601,-0.192330040313548,-0.207712965451897,-0.211897478911576,-0.214745035528359,-0.220449537015987,-0.228372383292566,-0.228647684861011,-0.217243421394109,-0.208773773040748,-0.204768164478675,-0.197651932224137,-0.201907690680171,-0.186799928216532,-0.197807146320895,-0.186806165764538,-0.175426999920234,-0.160829177450937,-0.156570118972399,-0.142533196293819,-0.140344393413595,-0.131497168494731,-0.130291673066175,-0.139487249777769,-0.127964560242718,-0.116491687229559,-0.107118749808423,-0.104148045709073,-0.115934144411351,-0.108220595813987,-0.11613238868522,-0.102015071921832,-0.115239664050562,-0.101753093266986,-0.0933750645707039,-0.101013837474641,-0.0869112846541434,-0.0735202983536943,-0.0574057490857677,-0.0558683598005222,-0.0562040938008403,-0.0638343685297655,-0.0598903768112951,-0.0473794440379253,-0.0532317611740053,-0.0419076484178619,-0.0265680894820191,-0.0211389509746969,-0.0271504305231178,-0.0164582492263977,-0.00888605380537599,-0.00419261129933557,-0.00435383167040504,-0.0147872855606687,-0.00143845089338268,-0.00818162595969163,-0.0135849793437769,0.00262142338070248,0.00732895793004573,0.027444758350692,0.0341614404009716,0.0393208016722293,0.0548695792379659,0.0411211612112312,0.0583654365499029,0.051674152980369,0.0357537779282837,0.0231212813638861,0.0271383459059231,0.0278808184195027,0.0253712796363943,0.0128512965085414,0.0271518020489396,0.0328447629314226,0.0353498975805022,0.016126349332968,0.00564481258333971,-0.00765511851534262,0.00123109565796575,-0.000464573480075003,-0.0150078223798561,0.000673117010593804,0.0164121859502941,0.00567921563706375,-0.00752401043155382,0.00767484427233112,-0.00290357563866783,-0.0192803276006613,0.000131368878869553,0.0048438072309176,-0.0131668821968006,-0.00741311951321955,-0.0240196624501505,-0.0398032518020562,-0.0342450092707371,-0.0244684332176617,-0.00939437005235744,-0.0126570262258937,-0.00192485818397981,0.00769679529634759,0.00641662767970819,-0.0116490860775804,0.00241950798165047,-0.0104643035110601,-0.00625701383536903,-0.0130113424159252,-0.0136287747554413,-0.0284388054443988,-0.0225951786487567,-0.0395837527114555,-0.0384200975507342,-0.031551223962747,-0.042251102401701,-0.0373732938486666,-0.0296513454144854,-0.0365113718322539,-0.0321798669816222,-0.0415684304982771,-0.0226789573377512,-0.0236902338038438,-0.0136111738728633,-0.00206448759974431,-0.0115514616913472,-0.00416762263186365,0.00659428283416941,0.00304850066717832,-0.0160910153721276,-0.019386619570395,-0.0322484897099616,-0.0166317950042366,-0.0333534479800545,-0.0329629379306184,-0.0434889206481096,-0.0270092131990273,-0.040590736531291,-0.0470905204295423,-0.0626181267854693,-0.0796581479751857,-0.0697601011435507,-0.070888404885953,-0.0525956692628111,-0.0649656483701446,-0.0563397432707065,-0.0514923918896049,-0.0510737360912832,-0.0560671643828639,-0.0484214296996912,-0.0385043622830712,-0.0475857550446187,-0.0344991357910474,-0.0421839335199237,-0.0572387605691043,-0.0402078722790755,-0.0362574781388305,-0.0227034280055733,-0.0148322901437923,-0.027001244572077,-0.0386422006377977,-0.0236183538593219,-0.0380386998170303,-0.0522524232161955,-0.0481272263202975,-0.0465320794763526,-0.0349452153181339,-0.0164430434914572,-0.000117569287639729,0.013586037265886,0.00679794198378358,0.0178328592069281,0.0272145820478851,0.0217461812271778,0.00750007112317186,0.000896486338625158,-0.00630602862472529,-0.0155040324589985,-0.00689136998850159,-0.0167205455213245,-0.0267534024889799,-0.0134008858939794,-0.00106020241286198,-0.00718947073281295,-0.0105834455694175,-0.0114131969374357,-0.00489199652224781,-0.0193545828123322,-0.0105377059911543,-0.0115880386591551,-0.0140248823565888,-0.029701128049324,-0.0195979859588467,-0.0199120953138671,-0.0129863911133747,-0.0211371349050287,-0.0276808110113876,-0.0193925717796154,-0.0181150139178123,-0.0221149375241664,-0.0385563530571131,-0.0525858603722102,-0.0521701815848765,-0.0492690445548913,-0.0476279448225803,-0.0605386756988678,-0.0612985244445375,-0.0706868113240307,-0.0789744031745544,-0.0948144956653019,-0.0854593226164304,-0.0909989853030151,-0.0822857274827413,-0.0856965913611351,-0.0975606143876848,-0.114533096762,-0.117024880526309,-0.131010044104515,-0.132682632881666,-0.130019236522728,-0.122499409898385,-0.112271433185508,-0.121586102803939,-0.132843770919539,-0.120969567637929,-0.113424881745738,-0.111249418126938,-0.121360548170496,-0.117870710237522,-0.111321551586064,-0.100171365263068,-0.106735056885834,-0.107017669181378,-0.121579245092633,-0.131290647472783,-0.122730927408653,-0.135056942068394,-0.138188734460661,-0.139570205860796,-0.131268487598514,-0.133927893818929,-0.120676699734844,-0.135342815213372,-0.139876596608448,-0.126749549533538,-0.141957919238935,-0.129691733535456,-0.130788483257743,-0.120437225706706,-0.130040834624845,-0.120638145362074,-0.115333127886118,-0.129712637228445,-0.141660650181014,-0.126702470908551,-0.110139529868892,-0.0954978860043144,-0.1097726446132,-0.0958328454030994,-0.0874024900555093,-0.0941349786517051,-0.0831395402592194,-0.0885746307584778,-0.0882605241494306,-0.0962006641292015,-0.106459801899337,-0.102911874395322,-0.0851375559622894,-0.0866757311034013,-0.0980579583087503,-0.100147181094432,-0.0915259781069367,-0.108569412550895,-0.092499938146264,-0.101330080942774,-0.0836958217707457,-0.0770715855608508,-0.0782388813874451,-0.089575208275715,-0.102419955498741,-0.105689836746276,-0.117136261234014,-0.108039843187926,-0.119864304998817,-0.116707110751595,-0.101606498532039,-0.0879593864574202,-0.0936682419261912,-0.0849473140890847,-0.0714693315419627,-0.053605109602743,-0.0529246905563373,-0.0363984996150897,-0.0358102829142791,-0.0208500135210982,-0.0122308871901801,-0.0233695287364208,-0.0102398141184052,-0.0221410353305562,-0.0216262907960814,-0.0261385683275682,-0.0133036708158017,-0.030020203172481,-0.0128360565701104,-0.0104255306506484,0.00778344363598782,-0.0104182749546075,-0.0273130061492478,-0.0458870570726214,-0.0642279684126669,-0.0558333340696102,-0.0503904414473292,-0.0472149964586991,-0.047573561144252,-0.0309799846909214,-0.0479018932522249,-0.0349526712823643,-0.0333303098612018,-0.0161838894687606,-0.0330307258106411,-0.0416037784128374,-0.035083970401051,-0.0296651263729114,-0.0130269179619582,-0.00464534876504541,0.00285489130876981,-0.00916682686725356,-0.0119303745352927,-0.0187102804274597,-0.00326524246298987,0.00427640705582366,-0.000772052348164909,-0.0098904802529568,-0.026209095006926,-0.039333101524226,-0.0497697501111034,-0.0359588232650578,-0.0384770765409435,-0.0256216261994732,-0.0290160455515295,-0.0397041022564244,-0.030226714217029,-0.0462372969774191,-0.0534907880569803,-0.0382370916303849,-0.0557738950080567,-0.0412916211331161,-0.0260974054497027,-0.0143853981748999,-0.00994325112897398,-0.0136568642479934,-0.0234285885392227,-0.0328315984503884,-0.0446494873483986,-0.0513482853753772,-0.0611203228429023,-0.0706769110587099,-0.0737285628348204,-0.0586252348592827,-0.0670627496670438,-0.0791482473558982,-0.0818825252285081,-0.0729488522707898,-0.0559992508555012,-0.0406538113505889,-0.0278306147325214,-0.00907654268830382,-0.0276680806304153,-0.0164454890444622]],"options":{"height":7,"title":"","colors":["#313695","#4575b4","#74add1","#abd9e9","#fee090","#fdae61","#f46d43","#d73027"],"mode":"mirror"}},"evals":[],"jsHooks":{"render":[{"code":"\nfunction(el,x) {\n var hzs = d3.select(el).selectAll('.horizon');\n var hz_zoom = d3.select('#horizonzoom');\n hz_zoom.style('width', el.style.width);\n\n hzs.on('mouseover', function(d) {\n d3.select(this).style('border-width','2.5px');\n var hzw = HTMLWidgets.widgets.filter(function(d){return d.name==='d3horizon'})[0];\n var instance = hzw.initialize(hz_zoom.node());\n instance.renderValue({data:[d], options:{height: 200}});\n });\n\n hzs.on('mouseout', function(d) {\n d3.select(this).style('border-width','1px');\n })\n}\n","data":null}]}}</script>
<div style="margin-top: 20px">
<div id="horizonzoom">
</div>
</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment