Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active November 23, 2016 14:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/fff10346123c40db25cdc9e40b52dd5d to your computer and use it in GitHub Desktop.
Save timelyportfolio/fff10346123c40db25cdc9e40b52dd5d to your computer and use it in GitHub Desktop.
crosstalk bound dc.js + networkD3 force network
license: mit
scrolling: yes

Built with blockbuilder.org

Building of this block, we add a quick example of bi-directional communication so clicking on a node in the force network will filter the dc.js heat chart. dc.js helps here with its filter handlers, so filtering in effect works like toggling.

R Code to Replicate

library(htmltools)
library(crosstalk)
library(igraph)
library(networkD3)

# Use igraph to make the graph and find membership
karate <- make_graph("Zachary")

# example from ?networkD3::igraph_to_networkD3
karate <- make_graph("Zachary")
wc <- cluster_walktrap(karate)
members <- membership(wc)
karate_d3 <- igraph_to_networkD3(karate, group = members)
fn <- forceNetwork(
  Links = karate_d3$links, Nodes = karate_d3$nodes,
  Source = 'source', Target = 'target', NodeID = 'name',
  Group = 'group',
  height = 400, width = 400
)

fn <- htmlwidgets::onRender(
  fn,
"
function(el,x) {
  // as a quick example of bidirectional communication
  //   filter force node if clicked and is source
  //   in dc heat chart
  d3.select(el).selectAll('.node').on('click.ct',function(d,i){
    heatChart.data().map(function(dd,ii){
      if(dd.key[0]==d.name){
        heatChart.filter(dd.key);
      }
    });
  });
}
"
)

browsable(
  attachDependencies(
    tagList(
      tags$head(
        tags$script(src="https://d3js.org/d3.v3.min.js"),
        tags$script(src="http://dc-js.github.io/dc.js/js/crossfilter.js"),
        tags$script(src="http://dc-js.github.io/dc.js/js/dc.js"),
        tags$link(
          href="http://dc-js.github.io/dc.js/css/dc.css",
          rel="stylesheet"
        )
      ),
      tags$div(id="chart-heat", style="display:inline-block;"),
      tags$div(as.tags(fn), style="display:inline-block"),
      tags$script(
        HTML(
          sprintf(
  "
  var data = %s;

  var ndx = crossfilter(data);
  var netDim = ndx.dimension(function(d){return [+d.from,+d.to]});
  var netGrp = netDim.group().reduceSum(function(d){return 1});

  var heatChart = dc.heatMap('#chart-heat')
  heatChart
    .width(400)
    .height(400)
    .dimension(netDim)
    .group(netGrp)
    .keyAccessor(function(d) { return +d.key[0]; })
    .valueAccessor(function(d) { return +d.key[1]; })
    .title(function(d) {
      return 'Source:   ' + d.key[0] + '\\n' +
      'Target:  ' + d.key[1] + '\\n'});// +
      //'Weight: ' + d.value;})

  heatChart.render();

  // we do not need crosstalk for this
  //   but use it anyways to demonstate and experiment
  //   with crosstalk as our holder for filter state
  var ct_filter = new crosstalk.FilterHandle('grp1');

  // add a filter listener on our dc.js heatmap
  heatChart.on('filtered',function(chart){
    ct_filter.set(chart.filters());
  })

  // now make a function to highlight selected nodes and links
  function highlightForce(filters){
    var force_svg = d3.select('.forceNetwork svg');
    var force_nodes = force_svg.selectAll('.node');
    var force_links = force_svg.selectAll('.link');

    var matched = function(link){
      var found = false;
      for(i=0; i< filters.length; i++){
        if(filters[i][0] == link.source.name && filters[i][1] == link.target.name){
          found = true;
          break;
        }
      }
      return found;
    };

    force_links.each(function(link){
      if(matched(link)){
        d3.select(this).style('stroke-width',5);
      } else {
        d3.select(this).style('stroke-width',1);
      }
    });
  }

  // when crosstalk filter changes highlight
  ct_filter.on('change',function(val){
    highlightForce(val.value);
    heatChart.redrawGroup();
  })

",
            jsonlite::toJSON(
              get.data.frame(karate),
              dataframe="rows"
            )
          )
        )
      )
    ),
    crosstalk::crosstalkLibs()
  )
)
This file has been truncated, but you can view the full file.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgfTsKCiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgcmVzaXplIGlmIGJpbmRpbmdEZWYgaW1wbGVtZW50cyBpdAogICAgICBpZiAoYmluZGluZ0RlZi5yZXNpemUpIHsKICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgIC8vIFNoaW55IGNhbiBjYWxsIHJlc2l6ZSBiZWZvcmUgaW5pdGlhbGl6ZS9yZW5kZXJWYWx1ZSBoYXZlIGJlZW4KICAgICAgICAgIC8vIGNhbGxlZCwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciB3aWRnZXRzLgogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgICBiaW5kaW5nRGVmLnJlc2l6ZShlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7CiAgICB9CiAgfTsKCiAgdmFyIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgZnVuY3Rpb24gc2NoZWR1bGVTdGF0aWNSZW5kZXIoKSB7CiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgewogICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9LCAxKTsKICAgIH0KICB9CgogIC8vIFJlbmRlciBzdGF0aWMgd2lkZ2V0cyBhZnRlciB0aGUgZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZwogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzCiAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGJpbmRpbmdzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgIHZhciBtYXRjaGVzID0gYmluZGluZy5maW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgIGZvckVhY2gobWF0Y2hlcywgZnVuY3Rpb24oZWwpIHsKICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOwoKICAgICAgICBpZiAoaGFzQ2xhc3MoZWwsICJodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUgKyAiIGh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCI7CgogICAgICAgIHZhciBpbml0UmVzdWx0OwogICAgICAgIGlmIChiaW5kaW5nLmluaXRpYWxpemUpIHsKICAgICAgICAgIGluaXRSZXN1bHQgPSBiaW5kaW5nLmluaXRpYWxpemUoZWwsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsKICAgICAgICAgIHZhciBsYXN0U2l6ZSA9IHt9OwogICAgICAgICAgdmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSAwICYmIHNpemUuaCA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbGFzdFNpemUgPSBzaXplOwogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOwogICAgICAgICAgfTsKCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgd2UncmUgcnVubmluZyBpbiBhIFNoaW55CiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dAogICAgICAgICAgLy8gcmF0aGVyIGEgc2ltcGxlIHN0YXRpYyB3aWRnZXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMKICAgICAgICAgIC8vIGFuIHJtYXJrZG93biBkb2N1bWVudCB0aGF0IGhhcyBydW50aW1lOnNoaW55IGFuZCB3aWRnZXQKICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8KICAgICAgICAgIC8vIGNhbGwgcmVzaXplIGhhbmRsZXJzIGZvciBTaGlueSBvdXRwdXRzLCBub3QgZm9yIHN0YXRpYwogICAgICAgICAgLy8gd2lkZ2V0cywgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgInNob3duLmh0bWx3aWRnZXRzIHNob3duLmJzLnRhYi5odG1sd2lkZ2V0cyBzaG93bi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigKICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwKICAgICAgICAgICAgICByZXNpemVIYW5kbGVyCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlIG9mIGlvc2xpZGVzLCB3aGljaAogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLgogICAgICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBub3QgaGF2ZSB0byBoYXZlIGlvc2xpZGUtc3BlY2lmaWMgY29kZQogICAgICAgICAgLy8gaGVyZSwgYnV0IHJhdGhlciBoYXZlIGlvc2xpZGVzIHJhaXNlIGEgZ2VuZXJpYyBldmVudCwKICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlCiAgICAgICAgICAvLyB3aW5kb3cgdG8gZ2V0dGluZyB0aGF0IGZpeGVkIG1heSBiZSBsb25nLgogICAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAvLyBicm93c2VycyBiZWNhdXNlIGlvc2xpZGVzIGl0c2VsZiBvbmx5IHN1cHBvcnRzCiAgICAgICAgICAgIC8vIHN1Y2ggYnJvd3NlcnMuCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlbGVhdmUiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHREYXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vanNvbiddIik7CiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsKICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzY3JpcHREYXRhLnRleHRDb250ZW50IHx8IHNjcmlwdERhdGEudGV4dCk7CiAgICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBkYXRhLmV2YWxzICYmIGsgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNba10pOwogICAgICAgICAgfQogICAgICAgICAgYmluZGluZy5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBpbml0UmVzdWx0KTsKICAgICAgICAgIGV2YWxBbmRSdW4oZGF0YS5qc0hvb2tzLnJlbmRlciwgaW5pdFJlc3VsdCwgW2VsLCBkYXRhLnhdKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAgaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCk7CiAgfQoKICAvLyBXYWl0IHVudGlsIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIHRvIHJlbmRlciB0aGUgd2lkZ2V0cy4KICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgYXJndW1lbnRzLmNhbGxlZSwgZmFsc2UpOwogICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICB9LCBmYWxzZSk7CiAgfSBlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgewogICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgewogICAgICAgIGRvY3VtZW50LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0KCgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRBdHRhY2htZW50VXJsID0gZnVuY3Rpb24oZGVwbmFtZSwga2V5KSB7CiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0KICAgIGlmICh0eXBlb2Yoa2V5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgIGtleSA9IDE7CgogICAgdmFyIGxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkZXBuYW1lICsgIi0iICsga2V5ICsgIi1hdHRhY2htZW50Iik7CiAgICBpZiAoIWxpbmspIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsKICAgIH0KICAgIHJldHVybiBsaW5rLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzID0gZnVuY3Rpb24oZGYpIHsKICAgIHZhciBuYW1lcyA9IFtdOwogICAgdmFyIGxlbmd0aDsKICAgIGZvciAodmFyIG5hbWUgaW4gZGYpIHsKICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpCiAgICAgICAgICAgIG5hbWVzLnB1c2gobmFtZSk7CiAgICAgICAgaWYgKHR5cGVvZihkZltuYW1lXSkgIT09ICJvYmplY3QiIHx8IHR5cGVvZihkZltuYW1lXS5sZW5ndGgpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihsZW5ndGgpICE9PSAidW5kZWZpbmVkIiAmJiBsZW5ndGggIT09IGRmW25hbWVdLmxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIik7CiAgICAgICAgfQogICAgICAgIGxlbmd0aCA9IGRmW25hbWVdLmxlbmd0aDsKICAgIH0KICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgaXRlbTsKICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IGxlbmd0aDsgcm93KyspIHsKICAgICAgICBpdGVtID0ge307CiAgICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgbmFtZXMubGVuZ3RoOyBjb2wrKykgewogICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1dID0gZGZbbmFtZXNbY29sXV1bcm93XTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZW0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgewogICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gYXJyYXk7CiAgICAgIHZhciBuZXdBcnJheSA9IGFycmF5WzBdLm1hcChmdW5jdGlvbihjb2wsIGkpIHsKICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJvd1tpXQogICAgICAgICAgfSkKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXdBcnJheTsKICB9OwogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkCiAgLy8gdXNpbmcgZXNjYXBlQ2hhci4gQW55IG90aGVyIGNoYXJhY3RlcnMgZXNjYXBlZCBieSBlc2NhcGVDaGFyCiAgLy8gd2lsbCBiZSBpbmNsdWRlZCBhcyB1c3VhbCAoaW5jbHVkaW5nIGVzY2FwZUNoYXIgaXRzZWxmKS4KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOwogICAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgdmFsdWUubGVuZ3RoOyBwb3MrKykgewogICAgICBpZiAoIWVzY2FwZU1vZGUpIHsKICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7CiAgICAgICAgICBlc2NhcGVNb2RlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoY3VycmVudFJlc3VsdCAhPT0gIiIpIHsKICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUKICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIgPSBmdW5jdGlvbihvLCBtZW1iZXIpIHsKICAgIHZhciBwYXJ0cyA9IHNwbGl0V2l0aEVzY2FwZShtZW1iZXIsICcuJywgJ1xcJyk7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOwogICAgICAvLyBwYXJ0IG1heSBiZSBhIGNoYXJhY3RlciBvciAnbnVtZXJpYycgbWVtYmVyIG5hbWUKICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgewogICAgICAgIGlmIChpID09IChsIC0gMSkpIHsgLy8gaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgdGhlbiBldmFsdWxhdGUKICAgICAgICAgIGlmICh0eXBlb2Ygb1twYXJ0XSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOwogICAgICAgIH0gZWxzZSB7IC8vIG90aGVyd2lzZSBjb250aW51ZSB0byBuZXh0IGVtYmVkZGVkIG9iamVjdAogICAgICAgICAgbyA9IG9bcGFydF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCiAgLy8gUmV0cmlldmUgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZiBhbgogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZS4KICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbihlbCkgewogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsKICB9OwoKICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwKICAvLyBhbmQgcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUKICAvLyBzZWxlY3Rvciwgb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgaGFzIG5vIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBlbCA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgaWYgKGVsID09PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7CiAgICB9CiAgfTsKCiAgLy8gRmluZHMgYWxsIGVsZW1lbnRzIGluIHRoZSBzY29wZSB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciwgYW5kCiAgLy8gcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZXMgKGkuZS4gdGhlIHJldHVybiB2YWx1ZXMgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudHMsIGluIGFuIGFycmF5LiBJZiBlbGVtZW50cyB0aGF0CiAgLy8gbWF0Y2ggdGhlIHNlbGVjdG9yIGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgIHZhciByZXN1bHRzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHZhciBwb3N0UmVuZGVySGFuZGxlcnMgPSBbXTsKICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7CiAgICB3aGlsZSAocG9zdFJlbmRlckhhbmRsZXJzLmxlbmd0aCkgewogICAgICB2YXIgaGFuZGxlciA9IHBvc3RSZW5kZXJIYW5kbGVycy5zaGlmdCgpOwogICAgICBpZiAoaGFuZGxlcikgewogICAgICAgIGhhbmRsZXIoKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlCiAgLy8gbmV4dCB0aW1lIHN0YXRpYyB3aWRnZXRzIGFyZSByZW5kZXJlZC4KICB3aW5kb3cuSFRNTFdpZGdldHMuYWRkUG9zdFJlbmRlckhhbmRsZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOwogIH07CgogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuCiAgLy8gb2xkLXN0eWxlIGNsYXNzLWJvdW5kIGRlZmluaXRpb24uIFRoaXMgc2F2ZXMgdXMgZnJvbSBoYXZpbmcKICAvLyB0byByZXdyaXRlIGFsbCB0aGUgbG9naWMgaW4gdGhpcyBmaWxlIHRvIGFjY29tb2RhdGUgYm90aAogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLgogIGZ1bmN0aW9uIGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZm4pIHsKICAgIHZhciByZXN1bHQgPSB7CiAgICAgIG5hbWU6IGRlZm4ubmFtZSwKICAgICAgdHlwZTogZGVmbi50eXBlLAogICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOwogICAgICB9LAogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHgsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOwogICAgICB9LAogICAgICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgIH0KICAgIH07CgogICAgaWYgKGRlZm4uZmluZCkKICAgICAgcmVzdWx0LmZpbmQgPSBkZWZuLmZpbmQ7CiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikKICAgICAgcmVzdWx0LnJlbmRlckVycm9yID0gZGVmbi5yZW5kZXJFcnJvcjsKICAgIGlmIChkZWZuLmNsZWFyRXJyb3IpCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9KSgpOwoK"></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiB0KG4pe3JldHVybiBudWxsPT09bj8wLzA6K259ZnVuY3Rpb24gZShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gcihuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiB1KG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBpKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBvKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGEoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBjKG4pe3JldHVybihuKz0iIik9PT1kYXx8blswXT09PW1hP21hK246bn1mdW5jdGlvbiBsKG4pe3JldHVybihuKz0iIilbMF09PT1tYT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gcyhuKXtyZXR1cm4gYyhuKWluIHRoaXMuX31mdW5jdGlvbiBmKG4pe3JldHVybihuPWMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIGgoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChsKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiBnKCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBwKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB2KCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24gZChuLHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZS5hcHBseSh0LGFyZ3VtZW50cyk7cmV0dXJuIHI9PT10P246cn19ZnVuY3Rpb24gbShuLHQpe2lmKHQgaW4gbilyZXR1cm4gdDt0PXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtmb3IodmFyIGU9MCxyPXlhLmxlbmd0aDtyPmU7KytlKXt2YXIgdT15YVtlXSt0O2lmKHUgaW4gbilyZXR1cm4gdX19ZnVuY3Rpb24geSgpe31mdW5jdGlvbiBNKCl7fWZ1bmN0aW9uIHgobil7ZnVuY3Rpb24gdCgpe2Zvcih2YXIgdCxyPWUsdT0tMSxpPXIubGVuZ3RoOysrdTxpOykodD1yW3VdLm9uKSYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG59dmFyIGU9W10scj1uZXcgYTtyZXR1cm4gdC5vbj1mdW5jdGlvbih0LHUpe3ZhciBpLG89ci5nZXQodCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9vJiZvLm9uOihvJiYoby5vbj1udWxsLGU9ZS5zbGljZSgwLGk9ZS5pbmRleE9mKG8pKS5jb25jYXQoZS5zbGljZShpKzEpKSxyLnJlbW92ZSh0KSksdSYmZS5wdXNoKHIuc2V0KHQse29uOnV9KSksbil9LHR9ZnVuY3Rpb24gYigpe3RhLmV2ZW50LnByZXZlbnREZWZhdWx0KCl9ZnVuY3Rpb24gXygpe2Zvcih2YXIgbix0PXRhLmV2ZW50O249dC5zb3VyY2VFdmVudDspdD1uO3JldHVybiB0fWZ1bmN0aW9uIHcobil7Zm9yKHZhciB0PW5ldyBNLGU9MCxyPWFyZ3VtZW50cy5sZW5ndGg7KytlPHI7KXRbYXJndW1lbnRzW2VdXT14KHQpO3JldHVybiB0Lm9mPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKHUpe3RyeXt2YXIgaT11LnNvdXJjZUV2ZW50PXRhLmV2ZW50O3UudGFyZ2V0PW4sdGEuZXZlbnQ9dSx0W3UudHlwZV0uYXBwbHkoZSxyKX1maW5hbGx5e3RhLmV2ZW50PWl9fX0sdH1mdW5jdGlvbiBTKG4pe3JldHVybiB4YShuLGthKSxufWZ1bmN0aW9uIGsobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiBiYShuLHRoaXMpfX1mdW5jdGlvbiBFKG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gX2Eobix0aGlzKX19ZnVuY3Rpb24gQShuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShuKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpfWZ1bmN0aW9uIHUoKXt0aGlzLnNldEF0dHJpYnV0ZShuLHQpfWZ1bmN0aW9uIGkoKXt0aGlzLnNldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCx0KX1mdW5jdGlvbiBvKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZShuKTp0aGlzLnNldEF0dHJpYnV0ZShuLGUpfWZ1bmN0aW9uIGEoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCxlKX1yZXR1cm4gbj10YS5ucy5xdWFsaWZ5KG4pLG51bGw9PXQ/bi5sb2NhbD9yOmU6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bi5sb2NhbD9hOm86bi5sb2NhbD9pOnV9ZnVuY3Rpb24gTihuKXtyZXR1cm4gbi50cmltKCkucmVwbGFjZSgvXHMrL2csIiAiKX1mdW5jdGlvbiBDKG4pe3JldHVybiBuZXcgUmVnRXhwKCIoPzpefFxccyspIit0YS5yZXF1b3RlKG4pKyIoPzpcXHMrfCQpIiwiZyIpfWZ1bmN0aW9uIHoobil7cmV0dXJuKG4rIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBxKG4sdCl7ZnVuY3Rpb24gZSgpe2Zvcih2YXIgZT0tMTsrK2U8dTspbltlXSh0aGlzLHQpfWZ1bmN0aW9uIHIoKXtmb3IodmFyIGU9LTEscj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsrK2U8dTspbltlXSh0aGlzLHIpfW49eihuKS5tYXAoTCk7dmFyIHU9bi5sZW5ndGg7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/cjplfWZ1bmN0aW9uIEwobil7dmFyIHQ9QyhuKTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtpZih1PWUuY2xhc3NMaXN0KXJldHVybiByP3UuYWRkKG4pOnUucmVtb3ZlKG4pO3ZhciB1PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIjtyPyh0Lmxhc3RJbmRleD0wLHQudGVzdCh1KXx8ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixOKHUrIiAiK24pKSk6ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixOKHUucmVwbGFjZSh0LCIgIikpKX19ZnVuY3Rpb24gVChuLHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gdSgpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobix0LGUpfWZ1bmN0aW9uIGkoKXt2YXIgcj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1yP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobik6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIsZSl9cmV0dXJuIG51bGw9PXQ/cjoiZnVuY3Rpb24iPT10eXBlb2YgdD9pOnV9ZnVuY3Rpb24gUihuLHQpe2Z1bmN0aW9uIGUoKXtkZWxldGUgdGhpc1tuXX1mdW5jdGlvbiByKCl7dGhpc1tuXT10fWZ1bmN0aW9uIHUoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP2RlbGV0ZSB0aGlzW25dOnRoaXNbbl09ZX1yZXR1cm4gbnVsbD09dD9lOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3U6cn1mdW5jdGlvbiBEKG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49dGEubnMucXVhbGlmeShuKSkubG9jYWw/ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLG4pfX1mdW5jdGlvbiBQKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gVShuKXtyZXR1cm57X19kYXRhX186bn19ZnVuY3Rpb24gaihuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gU2EodGhpcyxuKX19ZnVuY3Rpb24gRih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aHx8KHQ9biksZnVuY3Rpb24obixlKXtyZXR1cm4gbiYmZT90KG4uX19kYXRhX18sZS5fX2RhdGFfXyk6IW4tIWV9fWZ1bmN0aW9uIEgobix0KXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoO3I+ZTtlKyspZm9yKHZhciB1LGk9bltlXSxvPTAsYT1pLmxlbmd0aDthPm87bysrKSh1PWlbb10pJiZ0KHUsbyxlKTtyZXR1cm4gbn1mdW5jdGlvbiBPKG4pe3JldHVybiB4YShuLEFhKSxufWZ1bmN0aW9uIFkobil7dmFyIHQsZTtyZXR1cm4gZnVuY3Rpb24ocix1LGkpe3ZhciBvLGE9bltpXS51cGRhdGUsYz1hLmxlbmd0aDtmb3IoaSE9ZSYmKGU9aSx0PTApLHU+PXQmJih0PXUrMSk7IShvPWFbdF0pJiYrK3Q8YzspO3JldHVybiBvfX1mdW5jdGlvbiBJKG4sdCxlKXtmdW5jdGlvbiByKCl7dmFyIHQ9dGhpc1tvXTt0JiYodGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG4sdCx0LiQpLGRlbGV0ZSB0aGlzW29dKX1mdW5jdGlvbiB1KCl7dmFyIHU9Yyh0LHJhKGFyZ3VtZW50cykpO3IuY2FsbCh0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIobix0aGlzW29dPXUsdS4kPWUpLHUuXz10fWZ1bmN0aW9uIGkoKXt2YXIgdCxlPW5ldyBSZWdFeHAoIl5fX29uKFteLl0rKSIrdGEucmVxdW90ZShuKSsiJCIpO2Zvcih2YXIgciBpbiB0aGlzKWlmKHQ9ci5tYXRjaChlKSl7dmFyIHU9dGhpc1tyXTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodFsxXSx1LHUuJCksZGVsZXRlIHRoaXNbcl19fXZhciBvPSJfX29uIituLGE9bi5pbmRleE9mKCIuIiksYz1aO2E+MCYmKG49bi5zbGljZSgwLGEpKTt2YXIgbD1DYS5nZXQobik7cmV0dXJuIGwmJihuPWwsYz1WKSxhP3Q/dTpyOnQ/eTppfWZ1bmN0aW9uIFoobix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9dGEuZXZlbnQ7dGEuZXZlbnQ9ZSx0WzBdPXRoaXMuX19kYXRhX187dHJ5e24uYXBwbHkodGhpcyx0KX1maW5hbGx5e3RhLmV2ZW50PXJ9fX1mdW5jdGlvbiBWKG4sdCl7dmFyIGU9WihuLHQpO3JldHVybiBmdW5jdGlvbihuKXt2YXIgdD10aGlzLHI9bi5yZWxhdGVkVGFyZ2V0O3ImJihyPT09dHx8OCZyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpKXx8ZS5jYWxsKHQsbil9fWZ1bmN0aW9uIFgoKXt2YXIgbj0iLmRyYWdzdXBwcmVzcy0iKyArK3FhLHQ9ImNsaWNrIituLGU9dGEuc2VsZWN0KG9hKS5vbigidG91Y2htb3ZlIituLGIpLm9uKCJkcmFnc3RhcnQiK24sYikub24oInNlbGVjdHN0YXJ0IituLGIpO2lmKHphKXt2YXIgcj1pYS5zdHlsZSx1PXJbemFdO3JbemFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24oaSl7aWYoZS5vbihuLG51bGwpLHphJiYoclt6YV09dSksaSl7dmFyIG89ZnVuY3Rpb24oKXtlLm9uKHQsbnVsbCl9O2Uub24odCxmdW5jdGlvbigpe2IoKSxvKCl9LCEwKSxzZXRUaW1lb3V0KG8sMCl9fX1mdW5jdGlvbiAkKG4sdCl7dC5jaGFuZ2VkVG91Y2hlcyYmKHQ9dC5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIGU9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO2lmKDA+TGEmJihvYS5zY3JvbGxYfHxvYS5zY3JvbGxZKSl7ZT10YS5zZWxlY3QoImJvZHkiKS5hcHBlbmQoInN2ZyIpLnN0eWxlKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxtYXJnaW46MCxwYWRkaW5nOjAsYm9yZGVyOiJub25lIn0sImltcG9ydGFudCIpO3ZhciB1PWVbMF1bMF0uZ2V0U2NyZWVuQ1RNKCk7TGE9ISh1LmZ8fHUuZSksZS5yZW1vdmUoKX1yZXR1cm4gTGE/KHIueD10LnBhZ2VYLHIueT10LnBhZ2VZKTooci54PXQuY2xpZW50WCxyLnk9dC5jbGllbnRZKSxyPXIubWF0cml4VHJhbnNmb3JtKG4uZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSxbci54LHIueV19dmFyIGk9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bdC5jbGllbnRYLWkubGVmdC1uLmNsaWVudExlZnQsdC5jbGllbnRZLWkudG9wLW4uY2xpZW50VG9wXX1mdW5jdGlvbiBCKCl7cmV0dXJuIHRhLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXJ9ZnVuY3Rpb24gVygpe3JldHVybiB0YS5ldmVudC50YXJnZXR9ZnVuY3Rpb24gSigpe3JldHVybiBvYX1mdW5jdGlvbiBHKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBLKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBRKG4pe3JldHVybiBuPjE/MDotMT5uP0RhOk1hdGguYWNvcyhuKX1mdW5jdGlvbiBudChuKXtyZXR1cm4gbj4xP2phOi0xPm4/LWphOk1hdGguYXNpbihuKX1mdW5jdGlvbiB0dChuKXtyZXR1cm4oKG49TWF0aC5leHAobikpLTEvbikvMn1mdW5jdGlvbiBldChuKXtyZXR1cm4oKG49TWF0aC5leHAobikpKzEvbikvMn1mdW5jdGlvbiBydChuKXtyZXR1cm4oKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSl9ZnVuY3Rpb24gdXQobil7cmV0dXJuKG49TWF0aC5zaW4obi8yKSkqbn1mdW5jdGlvbiBpdCgpe31mdW5jdGlvbiBvdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBvdD8odGhpcy5oPStuLHRoaXMucz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2Ygb3Q/bmV3IG90KG4uaCxuLnMsbi5sKTp4dCgiIituLGJ0LG90KTpuZXcgb3Qobix0LGUpfWZ1bmN0aW9uIGF0KG4sdCxlKXtmdW5jdGlvbiByKG4pe3JldHVybiBuPjM2MD9uLT0zNjA6MD5uJiYobis9MzYwKSw2MD5uP2krKG8taSkqbi82MDoxODA+bj9vOjI0MD5uP2krKG8taSkqKDI0MC1uKS82MDppfWZ1bmN0aW9uIHUobil7cmV0dXJuIE1hdGgucm91bmQoMjU1KnIobikpfXZhciBpLG87cmV0dXJuIG49aXNOYU4obik/MDoobiU9MzYwKTwwP24rMzYwOm4sdD1pc05hTih0KT8wOjA+dD8wOnQ+MT8xOnQsZT0wPmU/MDplPjE/MTplLG89LjU+PWU/ZSooMSt0KTplK3QtZSp0LGk9MiplLW8sbmV3IGR0KHUobisxMjApLHUobiksdShuLTEyMCkpfWZ1bmN0aW9uIGN0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGN0Pyh0aGlzLmg9K24sdGhpcy5jPSt0LHZvaWQodGhpcy5sPStlKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBjdD9uZXcgY3Qobi5oLG4uYyxuLmwpOm4gaW5zdGFuY2VvZiBzdD9odChuLmwsbi5hLG4uYik6aHQoKG49X3QoKG49dGEucmdiKG4pKS5yLG4uZyxuLmIpKS5sLG4uYSxuLmIpOm5ldyBjdChuLHQsZSl9ZnVuY3Rpb24gbHQobix0LGUpe3JldHVybiBpc05hTihuKSYmKG49MCksaXNOYU4odCkmJih0PTApLG5ldyBzdChlLE1hdGguY29zKG4qPUZhKSp0LE1hdGguc2luKG4pKnQpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHN0Pyh0aGlzLmw9K24sdGhpcy5hPSt0LHZvaWQodGhpcy5iPStlKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBzdD9uZXcgc3Qobi5sLG4uYSxuLmIpOm4gaW5zdGFuY2VvZiBjdD9sdChuLmgsbi5jLG4ubCk6X3QoKG49ZHQobikpLnIsbi5nLG4uYik6bmV3IHN0KG4sdCxlKX1mdW5jdGlvbiBmdChuLHQsZSl7dmFyIHI9KG4rMTYpLzExNix1PXIrdC81MDAsaT1yLWUvMjAwO3JldHVybiB1PWd0KHUpKkphLHI9Z3QocikqR2EsaT1ndChpKSpLYSxuZXcgZHQodnQoMy4yNDA0NTQyKnUtMS41MzcxMzg1KnItLjQ5ODUzMTQqaSksdnQoLS45NjkyNjYqdSsxLjg3NjAxMDgqcisuMDQxNTU2KmkpLHZ0KC4wNTU2NDM0KnUtLjIwNDAyNTkqcisxLjA1NzIyNTIqaSkpfWZ1bmN0aW9uIGh0KG4sdCxlKXtyZXR1cm4gbj4wP25ldyBjdChNYXRoLmF0YW4yKGUsdCkqSGEsTWF0aC5zcXJ0KHQqdCtlKmUpLG4pOm5ldyBjdCgwLzAsMC8wLG4pfWZ1bmN0aW9uIGd0KG4pe3JldHVybiBuPi4yMDY4OTMwMzQ/bipuKm46KG4tNC8yOSkvNy43ODcwMzd9ZnVuY3Rpb24gcHQobil7cmV0dXJuIG4+LjAwODg1Nj9NYXRoLnBvdyhuLDEvMyk6Ny43ODcwMzcqbis0LzI5fWZ1bmN0aW9uIHZ0KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSooLjAwMzA0Pj1uPzEyLjkyKm46MS4wNTUqTWF0aC5wb3cobiwxLzIuNCktLjA1NSkpfWZ1bmN0aW9uIGR0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGR0Pyh0aGlzLnI9fn5uLHRoaXMuZz1+fnQsdm9pZCh0aGlzLmI9fn5lKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBkdD9uZXcgZHQobi5yLG4uZyxuLmIpOnh0KCIiK24sZHQsYXQpOm5ldyBkdChuLHQsZSl9ZnVuY3Rpb24gbXQobil7cmV0dXJuIG5ldyBkdChuPj4xNiwyNTUmbj4+OCwyNTUmbil9ZnVuY3Rpb24geXQobil7cmV0dXJuIG10KG4pKyIifWZ1bmN0aW9uIE10KG4pe3JldHVybiAxNj5uPyIwIitNYXRoLm1heCgwLG4pLnRvU3RyaW5nKDE2KTpNYXRoLm1pbigyNTUsbikudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIHh0KG4sdCxlKXt2YXIgcix1LGksbz0wLGE9MCxjPTA7aWYocj0vKFthLXpdKylcKCguKilcKS9pLmV4ZWMobikpc3dpdGNoKHU9clsyXS5zcGxpdCgiLCIpLHJbMV0pe2Nhc2UiaHNsIjpyZXR1cm4gZShwYXJzZUZsb2F0KHVbMF0pLHBhcnNlRmxvYXQodVsxXSkvMTAwLHBhcnNlRmxvYXQodVsyXSkvMTAwKTtjYXNlInJnYiI6cmV0dXJuIHQoU3QodVswXSksU3QodVsxXSksU3QodVsyXSkpfXJldHVybihpPXRjLmdldChuKSk/dChpLnIsaS5nLGkuYik6KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc2xpY2UoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLGM9MTUmaSxjPWM8PDR8Yyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LGM9MjU1JmkpKSx0KG8sYSxjKSl9ZnVuY3Rpb24gYnQobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PS41PmM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9Yz4wJiYxPmM/MDpyKSxuZXcgb3Qocix1LGMpfWZ1bmN0aW9uIF90KG4sdCxlKXtuPXd0KG4pLHQ9d3QodCksZT13dChlKTt2YXIgcj1wdCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL0phKSx1PXB0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS9HYSksaT1wdCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvS2EpO3JldHVybiBzdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiB3dChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBTdChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIGt0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gRXQobil7cmV0dXJuIG59ZnVuY3Rpb24gQXQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksTnQodCxlLG4scil9fWZ1bmN0aW9uIE50KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZ6dChjKXx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0dXJuIG8uZXJyb3IuY2FsbChpLHIpLHZvaWQgMH1vLmxvYWQuY2FsbChpLG4pfWVsc2Ugby5lcnJvci5jYWxsKGksYyl9dmFyIGk9e30sbz10YS5kaXNwYXRjaCgiYmVmb3Jlc2VuZCIsInByb2dyZXNzIiwibG9hZCIsImVycm9yIiksYT17fSxjPW5ldyBYTUxIdHRwUmVxdWVzdCxsPW51bGw7cmV0dXJuIW9hLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PXRhLmV2ZW50O3RhLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7dGEuZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KHJhKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBzIGluIGEpYy5zZXRSZXF1ZXN0SGVhZGVyKHMsYVtzXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGMuYWJvcnQoKSxpfSx0YS5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChDdChyKSl9ZnVuY3Rpb24gQ3Qobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIHp0KG4pe3ZhciB0PW4ucmVzcG9uc2VUeXBlO3JldHVybiB0JiYidGV4dCIhPT10P24ucmVzcG9uc2U6bi5yZXNwb25zZVRleHR9ZnVuY3Rpb24gcXQoKXt2YXIgbj1MdCgpLHQ9VHQoKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KGljKSxpYz1zZXRUaW1lb3V0KHF0LHQpKSx1Yz0wKToodWM9MSxhYyhxdCkpfWZ1bmN0aW9uIEx0KCl7dmFyIG49RGF0ZS5ub3coKTtmb3Iob2M9ZWM7b2M7KW4+PW9jLnQmJihvYy5mPW9jLmMobi1vYy50KSksb2M9b2MubjtyZXR1cm4gbn1mdW5jdGlvbiBUdCgpe2Zvcih2YXIgbix0PWVjLGU9MS8wO3Q7KXQuZj90PW4/bi5uPXQubjplYz10Lm46KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik7cmV0dXJuIHJjPW4sZX1mdW5jdGlvbiBSdChuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIER0KG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMyp2YSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBQdChuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLG89MCxhPXJbMF0sYz0wO3U+MCYmYT4wJiYoYythKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWMpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09YSx1K2EpKSwhKChjKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTpFdDtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bGMuZXhlYyhuKSxyPWVbMV18fCIgIixvPWVbMl18fCI+IixhPWVbM118fCItIixjPWVbNF18fCIiLGw9ZVs1XSxzPStlWzZdLGY9ZVs3XSxoPWVbOF0sZz1lWzldLHA9MSx2PSIiLGQ9IiIsbT0hMSx5PSEwO3N3aXRjaChoJiYoaD0raC5zdWJzdHJpbmcoMSkpLChsfHwiMCI9PT1yJiYiPSI9PT1vKSYmKGw9cj0iMCIsbz0iPSIpLGcpe2Nhc2UibiI6Zj0hMCxnPSJnIjticmVhaztjYXNlIiUiOnA9MTAwLGQ9IiUiLGc9ImYiO2JyZWFrO2Nhc2UicCI6cD0xMDAsZD0iJSIsZz0iciI7YnJlYWs7Y2FzZSJiIjpjYXNlIm8iOmNhc2UieCI6Y2FzZSJYIjoiIyI9PT1jJiYodj0iMCIrZy50b0xvd2VyQ2FzZSgpKTtjYXNlImMiOnk9ITE7Y2FzZSJkIjptPSEwLGg9MDticmVhaztjYXNlInMiOnA9LTEsZz0iciJ9IiQiPT09YyYmKHY9dVswXSxkPXVbMV0pLCJyIiE9Z3x8aHx8KGc9ImciKSxudWxsIT1oJiYoImciPT1nP2g9TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxoKSk6KCJlIj09Z3x8ImYiPT1nKSYmKGg9TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxoKSkpKSxnPXNjLmdldChnKXx8VXQ7dmFyIE09bCYmZjtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9ZDtpZihtJiZuJTEpcmV0dXJuIiI7dmFyIHU9MD5ufHwwPT09biYmMD4xL24/KG49LW4sIi0iKToiLSI9PT1hPyIiOmE7aWYoMD5wKXt2YXIgYz10YS5mb3JtYXRQcmVmaXgobixoKTtuPWMuc2NhbGUobiksZT1jLnN5bWJvbCtkfWVsc2Ugbio9cDtuPWcobixoKTt2YXIgeCxiLF89bi5sYXN0SW5kZXhPZigiLiIpO2lmKDA+Xyl7dmFyIHc9eT9uLmxhc3RJbmRleE9mKCJlIik6LTE7MD53Pyh4PW4sYj0iIik6KHg9bi5zdWJzdHJpbmcoMCx3KSxiPW4uc3Vic3RyaW5nKHcpKX1lbHNlIHg9bi5zdWJzdHJpbmcoMCxfKSxiPXQrbi5zdWJzdHJpbmcoXysxKTshbCYmZiYmKHg9aSh4LDEvMCkpO3ZhciBTPXYubGVuZ3RoK3gubGVuZ3RoK2IubGVuZ3RoKyhNPzA6dS5sZW5ndGgpLGs9cz5TP25ldyBBcnJheShTPXMtUysxKS5qb2luKHIpOiIiO3JldHVybiBNJiYoeD1pKGsreCxrLmxlbmd0aD9zLWIubGVuZ3RoOjEvMCkpLHUrPXYsbj14K2IsKCI8Ij09PW8/dStuK2s6Ij4iPT09bz9rK3UrbjoiXiI9PT1vP2suc3Vic3RyaW5nKDAsUz4+PTEpK3UrbitrLnN1YnN0cmluZyhTKTp1KyhNP246aytuKSkrZX19fWZ1bmN0aW9uIFV0KG4pe3JldHVybiBuKyIifWZ1bmN0aW9uIGp0KCl7dGhpcy5fPW5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGg+MT9EYXRlLlVUQy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzWzBdKX1mdW5jdGlvbiBGdChuLHQsZSl7ZnVuY3Rpb24gcih0KXt2YXIgZT1uKHQpLHI9aShlLDEpO3JldHVybiByLXQ+dC1lP2U6cn1mdW5jdGlvbiB1KGUpe3JldHVybiB0KGU9bihuZXcgaGMoZS0xKSksMSksZX1mdW5jdGlvbiBpKG4sZSl7cmV0dXJuIHQobj1uZXcgaGMoK24pLGUpLG59ZnVuY3Rpb24gbyhuLHIsaSl7dmFyIG89dShuKSxhPVtdO2lmKGk+MSlmb3IoO3I+bzspZShvKSVpfHxhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7ZWxzZSBmb3IoO3I+bzspYS5wdXNoKG5ldyBEYXRlKCtvKSksdChvLDEpO3JldHVybiBhfWZ1bmN0aW9uIGEobix0LGUpe3RyeXtoYz1qdDt2YXIgcj1uZXcganQ7cmV0dXJuIHIuXz1uLG8ocix0LGUpfWZpbmFsbHl7aGM9RGF0ZX19bi5mbG9vcj1uLG4ucm91bmQ9cixuLmNlaWw9dSxuLm9mZnNldD1pLG4ucmFuZ2U9bzt2YXIgYz1uLnV0Yz1IdChuKTtyZXR1cm4gYy5mbG9vcj1jLGMucm91bmQ9SHQociksYy5jZWlsPUh0KHUpLGMub2Zmc2V0PUh0KGkpLGMucmFuZ2U9YSxufWZ1bmN0aW9uIEh0KG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3RyeXtoYz1qdDt2YXIgcj1uZXcganQ7cmV0dXJuIHIuXz10LG4ocixlKS5ffWZpbmFsbHl7aGM9RGF0ZX19fWZ1bmN0aW9uIE90KG4pe2Z1bmN0aW9uIHQobil7ZnVuY3Rpb24gdCh0KXtmb3IodmFyIGUsdSxpLG89W10sYT0tMSxjPTA7KythPHI7KTM3PT09bi5jaGFyQ29kZUF0KGEpJiYoby5wdXNoKG4uc2xpY2UoYyxhKSksbnVsbCE9KHU9cGNbZT1uLmNoYXJBdCgrK2EpXSkmJihlPW4uY2hhckF0KCsrYSkpLChpPU5bZV0pJiYoZT1pKHQsbnVsbD09dT8iZSI9PT1lPyIgIjoiMCI6dSkpLG8ucHVzaChlKSxjPWErMSk7cmV0dXJuIG8ucHVzaChuLnNsaWNlKGMsYSkpLG8uam9pbigiIil9dmFyIHI9bi5sZW5ndGg7cmV0dXJuIHQucGFyc2U9ZnVuY3Rpb24odCl7dmFyIHI9e3k6MTkwMCxtOjAsZDoxLEg6MCxNOjAsUzowLEw6MCxaOm51bGx9LHU9ZShyLG4sdCwwKTtpZih1IT10Lmxlbmd0aClyZXR1cm4gbnVsbDsicCJpbiByJiYoci5IPXIuSCUxMisxMipyLnApO3ZhciBpPW51bGwhPXIuWiYmaGMhPT1qdCxvPW5ldyhpP2p0OmhjKTtyZXR1cm4iaiJpbiByP28uc2V0RnVsbFllYXIoci55LDAsci5qKToidyJpbiByJiYoIlciaW4gcnx8IlUiaW4gcik/KG8uc2V0RnVsbFllYXIoci55LDAsMSksby5zZXRGdWxsWWVhcihyLnksMCwiVyJpbiByPyhyLncrNiklNys3KnIuVy0oby5nZXREYXkoKSs1KSU3OnIudys3KnIuVS0oby5nZXREYXkoKSs2KSU3KSk6by5zZXRGdWxsWWVhcihyLnksci5tLHIuZCksby5zZXRIb3VycyhyLkgrKDB8ci5aLzEwMCksci5NK3IuWiUxMDAsci5TLHIuTCksaT9vLl86b30sdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBufSx0fWZ1bmN0aW9uIGUobix0LGUscil7Zm9yKHZhciB1LGksbyxhPTAsYz10Lmxlbmd0aCxsPWUubGVuZ3RoO2M+YTspe2lmKHI+PWwpcmV0dXJuLTE7aWYodT10LmNoYXJDb2RlQXQoYSsrKSwzNz09PXUpe2lmKG89dC5jaGFyQXQoYSsrKSxpPUNbbyBpbiBwYz90LmNoYXJBdChhKyspOm9dLCFpfHwocj1pKG4sZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKHUhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfWZ1bmN0aW9uIHIobix0LGUpe18ubGFzdEluZGV4PTA7dmFyIHI9Xy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9dy5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1KG4sdCxlKXt4Lmxhc3RJbmRleD0wO3ZhciByPXguZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi53PWIuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaShuLHQsZSl7RS5sYXN0SW5kZXg9MDt2YXIgcj1FLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1BLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG8obix0LGUpe1MubGFzdEluZGV4PTA7dmFyIHI9Uy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLm09ay5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhKG4sdCxyKXtyZXR1cm4gZShuLE4uYy50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gYyhuLHQscil7cmV0dXJuIGUobixOLngudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIGwobix0LHIpe3JldHVybiBlKG4sTi5YLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBzKG4sdCxlKXt2YXIgcj1NLmdldCh0LnNsaWNlKGUsZSs9MikudG9Mb3dlckNhc2UoKSk7cmV0dXJuIG51bGw9PXI/LTE6KG4ucD1yLGUpfXZhciBmPW4uZGF0ZVRpbWUsaD1uLmRhdGUsZz1uLnRpbWUscD1uLnBlcmlvZHMsdj1uLmRheXMsZD1uLnNob3J0RGF5cyxtPW4ubW9udGhzLHk9bi5zaG9ydE1vbnRoczt0LnV0Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBlKG4pe3RyeXtoYz1qdDt2YXIgdD1uZXcgaGM7cmV0dXJuIHQuXz1uLHIodCl9ZmluYWxseXtoYz1EYXRlfX12YXIgcj10KG4pO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4pe3RyeXtoYz1qdDt2YXIgdD1yLnBhcnNlKG4pO3JldHVybiB0JiZ0Ll99ZmluYWxseXtoYz1EYXRlfX0sZS50b1N0cmluZz1yLnRvU3RyaW5nLGV9LHQubXVsdGk9dC51dGMubXVsdGk9YWU7dmFyIE09dGEubWFwKCkseD1JdCh2KSxiPVp0KHYpLF89SXQoZCksdz1adChkKSxTPUl0KG0pLGs9WnQobSksRT1JdCh5KSxBPVp0KHkpO3AuZm9yRWFjaChmdW5jdGlvbihuLHQpe00uc2V0KG4udG9Mb3dlckNhc2UoKSx0KX0pO3ZhciBOPXthOmZ1bmN0aW9uKG4pe3JldHVybiBkW24uZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKG4pe3JldHVybiB2W24uZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKG4pe3JldHVybiB5W24uZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24obil7cmV0dXJuIG1bbi5nZXRNb250aCgpXX0sYzp0KGYpLGQ6ZnVuY3Rpb24obix0KXtyZXR1cm4gWXQobi5nZXREYXRlKCksdCwyKX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldERhdGUoKSx0LDIpfSxIOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0SG91cnMoKSx0LDIpfSxJOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0SG91cnMoKSUxMnx8MTIsdCwyKX0sajpmdW5jdGlvbihuLHQpe3JldHVybiBZdCgxK2ZjLmRheU9mWWVhcihuKSx0LDMpfSxMOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0TWlsbGlzZWNvbmRzKCksdCwzKX0sbTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldE1vbnRoKCkrMSx0LDIpfSxNOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0TWludXRlcygpLHQsMil9LHA6ZnVuY3Rpb24obil7cmV0dXJuIHBbKyhuLmdldEhvdXJzKCk+PTEyKV19LFM6ZnVuY3Rpb24obix0KXtyZXR1cm4gWXQobi5nZXRTZWNvbmRzKCksdCwyKX0sVTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChmYy5zdW5kYXlPZlllYXIobiksdCwyKX0sdzpmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKX0sVzpmdW5jdGlvbihuLHQpe3JldHVybiBZdChmYy5tb25kYXlPZlllYXIobiksdCwyKX0seDp0KGgpLFg6dChnKSx5OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0RnVsbFllYXIoKSUxMDAsdCwyKX0sWTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldEZ1bGxZZWFyKCklMWU0LHQsNCl9LFo6aWUsIiUiOmZ1bmN0aW9uKCl7cmV0dXJuIiUifX0sQz17YTpyLEE6dSxiOmksQjpvLGM6YSxkOlF0LGU6UXQsSDp0ZSxJOnRlLGo6bmUsTDp1ZSxtOkt0LE06ZWUscDpzLFM6cmUsVTpYdCx3OlZ0LFc6JHQseDpjLFg6bCx5Old0LFk6QnQsWjpKdCwiJSI6b2V9O3JldHVybiB0fWZ1bmN0aW9uIFl0KG4sdCxlKXt2YXIgcj0wPm4/Ii0iOiIiLHU9KHI/LW46bikrIiIsaT11Lmxlbmd0aDtyZXR1cm4gcisoZT5pP25ldyBBcnJheShlLWkrMSkuam9pbih0KSt1OnUpfWZ1bmN0aW9uIEl0KG4pe3JldHVybiBuZXcgUmVnRXhwKCJeKD86IituLm1hcCh0YS5yZXF1b3RlKS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gWnQobil7Zm9yKHZhciB0PW5ldyBhLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5zZXQobltlXS50b0xvd2VyQ2FzZSgpLGUpO3JldHVybiB0fWZ1bmN0aW9uIFZ0KG4sdCxlKXt2Yy5sYXN0SW5kZXg9MDt2YXIgcj12Yy5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8obi53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFh0KG4sdCxlKXt2Yy5sYXN0SW5kZXg9MDt2YXIgcj12Yy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLlU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gJHQobix0LGUpe3ZjLmxhc3RJbmRleD0wO3ZhciByPXZjLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBCdChuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KG4ueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBXdChuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4ueT1HdCgrclswXSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSnQobix0LGUpe3JldHVybi9eWystXVxkezR9JC8udGVzdCh0PXQuc2xpY2UoZSxlKzUpKT8obi5aPS10LGUrNSk6LTF9ZnVuY3Rpb24gR3Qobil7cmV0dXJuIG4rKG4+Njg/MTkwMDoyZTMpfWZ1bmN0aW9uIEt0KG4sdCxlKXt2Yy5sYXN0SW5kZXg9MDt2YXIgcj12Yy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRdChuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBuZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uaj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0ZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBlZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiByZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uUz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1ZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpZShuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCksZT10PjA/Ii0iOiIrIixyPTB8dmEodCkvNjAsdT12YSh0KSU2MDtyZXR1cm4gZStZdChyLCIwIiwyKStZdCh1LCIwIiwyKX1mdW5jdGlvbiBvZShuLHQsZSl7ZGMubGFzdEluZGV4PTA7dmFyIHI9ZGMuZXhlYyh0LnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBhZShuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT0tMTsrK2U8dDspbltlXVswXT10aGlzKG5bZV1bMF0pO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPW5bZV07IXJbMV0odCk7KXI9blsrK2VdO3JldHVybiByWzBdKHQpfX1mdW5jdGlvbiBjZSgpe31mdW5jdGlvbiBsZShuLHQsZSl7dmFyIHI9ZS5zPW4rdCx1PXItbixpPXItdTtlLnQ9bi1pKyh0LXUpfWZ1bmN0aW9uIHNlKG4sdCl7biYmeGMuaGFzT3duUHJvcGVydHkobi50eXBlKSYmeGNbbi50eXBlXShuLHQpfWZ1bmN0aW9uIGZlKG4sdCxlKXt2YXIgcix1PS0xLGk9bi5sZW5ndGgtZTtmb3IodC5saW5lU3RhcnQoKTsrK3U8aTspcj1uW3VdLHQucG9pbnQoclswXSxyWzFdLHJbMl0pO3QubGluZUVuZCgpfWZ1bmN0aW9uIGhlKG4sdCl7dmFyIGU9LTEscj1uLmxlbmd0aDtmb3IodC5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZmUobltlXSx0LDEpO3QucG9seWdvbkVuZCgpfWZ1bmN0aW9uIGdlKCl7ZnVuY3Rpb24gbihuLHQpe24qPUZhLHQ9dCpGYS8yK0RhLzQ7dmFyIGU9bi1yLG89ZT49MD8xOi0xLGE9byplLGM9TWF0aC5jb3ModCksbD1NYXRoLnNpbih0KSxzPWkqbCxmPXUqYytzKk1hdGguY29zKGEpLGg9cypvKk1hdGguc2luKGEpO19jLmFkZChNYXRoLmF0YW4yKGgsZikpLHI9bix1PWMsaT1sfXZhciB0LGUscix1LGk7d2MucG9pbnQ9ZnVuY3Rpb24obyxhKXt3Yy5wb2ludD1uLHI9KHQ9bykqRmEsdT1NYXRoLmNvcyhhPShlPWEpKkZhLzIrRGEvNCksaT1NYXRoLnNpbihhKX0sd2MubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gcGUobil7dmFyIHQ9blswXSxlPW5bMV0scj1NYXRoLmNvcyhlKTtyZXR1cm5bcipNYXRoLmNvcyh0KSxyKk1hdGguc2luKHQpLE1hdGguc2luKGUpXX1mdW5jdGlvbiB2ZShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXX1mdW5jdGlvbiBkZShuLHQpe3JldHVybltuWzFdKnRbMl0tblsyXSp0WzFdLG5bMl0qdFswXS1uWzBdKnRbMl0sblswXSp0WzFdLW5bMV0qdFswXV19ZnVuY3Rpb24gbWUobix0KXtuWzBdKz10WzBdLG5bMV0rPXRbMV0sblsyXSs9dFsyXX1mdW5jdGlvbiB5ZShuLHQpe3JldHVybltuWzBdKnQsblsxXSp0LG5bMl0qdF19ZnVuY3Rpb24gTWUobil7dmFyIHQ9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFdKm5bMV0rblsyXSpuWzJdKTtuWzBdLz10LG5bMV0vPXQsblsyXS89dH1mdW5jdGlvbiB4ZShuKXtyZXR1cm5bTWF0aC5hdGFuMihuWzFdLG5bMF0pLG50KG5bMl0pXX1mdW5jdGlvbiBiZShuLHQpe3JldHVybiB2YShuWzBdLXRbMF0pPFRhJiZ2YShuWzFdLXRbMV0pPFRhfWZ1bmN0aW9uIF9lKG4sdCl7bio9RmE7dmFyIGU9TWF0aC5jb3ModCo9RmEpO3dlKGUqTWF0aC5jb3MobiksZSpNYXRoLnNpbihuKSxNYXRoLnNpbih0KSl9ZnVuY3Rpb24gd2Uobix0LGUpeysrU2MsRWMrPShuLUVjKS9TYyxBYys9KHQtQWMpL1NjLE5jKz0oZS1OYykvU2N9ZnVuY3Rpb24gU2UoKXtmdW5jdGlvbiBuKG4sdSl7bio9RmE7dmFyIGk9TWF0aC5jb3ModSo9RmEpLG89aSpNYXRoLmNvcyhuKSxhPWkqTWF0aC5zaW4obiksYz1NYXRoLnNpbih1KSxsPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChsPWUqYy1yKmEpKmwrKGw9cipvLXQqYykqbCsobD10KmEtZSpvKSpsKSx0Km8rZSphK3IqYyk7a2MrPWwsQ2MrPWwqKHQrKHQ9bykpLHpjKz1sKihlKyhlPWEpKSxxYys9bCoocisocj1jKSksd2UodCxlLHIpfXZhciB0LGUscjtEYy5wb2ludD1mdW5jdGlvbih1LGkpe3UqPUZhO3ZhciBvPU1hdGguY29zKGkqPUZhKTt0PW8qTWF0aC5jb3ModSksZT1vKk1hdGguc2luKHUpLHI9TWF0aC5zaW4oaSksRGMucG9pbnQ9bix3ZSh0LGUscil9fWZ1bmN0aW9uIGtlKCl7RGMucG9pbnQ9X2V9ZnVuY3Rpb24gRWUoKXtmdW5jdGlvbiBuKG4sdCl7bio9RmE7dmFyIGU9TWF0aC5jb3ModCo9RmEpLG89ZSpNYXRoLmNvcyhuKSxhPWUqTWF0aC5zaW4obiksYz1NYXRoLnNpbih0KSxsPXUqYy1pKmEscz1pKm8tcipjLGY9ciphLXUqbyxoPU1hdGguc3FydChsKmwrcypzK2YqZiksZz1yKm8rdSphK2kqYyxwPWgmJi1RKGcpL2gsdj1NYXRoLmF0YW4yKGgsZyk7TGMrPXAqbCxUYys9cCpzLFJjKz1wKmYsa2MrPXYsQ2MrPXYqKHIrKHI9bykpLHpjKz12Kih1Kyh1PWEpKSxxYys9diooaSsoaT1jKSksd2Uocix1LGkpfXZhciB0LGUscix1LGk7RGMucG9pbnQ9ZnVuY3Rpb24obyxhKXt0PW8sZT1hLERjLnBvaW50PW4sbyo9RmE7dmFyIGM9TWF0aC5jb3MoYSo9RmEpO3I9YypNYXRoLmNvcyhvKSx1PWMqTWF0aC5zaW4obyksaT1NYXRoLnNpbihhKSx3ZShyLHUsaSl9LERjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSksRGMubGluZUVuZD1rZSxEYy5wb2ludD1fZX19ZnVuY3Rpb24gQWUobix0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9bihlLHIpLHQoZVswXSxlWzFdKX1yZXR1cm4gbi5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT10LmludmVydChlLHIpLGUmJm4uaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIE5lKCl7cmV0dXJuITB9ZnVuY3Rpb24gQ2Uobix0LGUscix1KXt2YXIgaT1bXSxvPVtdO2lmKG4uZm9yRWFjaChmdW5jdGlvbihuKXtpZighKCh0PW4ubGVuZ3RoLTEpPD0wKSl7dmFyIHQsZT1uWzBdLHI9blt0XTtpZihiZShlLHIpKXt1LmxpbmVTdGFydCgpO2Zvcih2YXIgYT0wO3Q+YTsrK2EpdS5wb2ludCgoZT1uW2FdKVswXSxlWzFdKTtyZXR1cm4gdS5saW5lRW5kKCksdm9pZCAwfXZhciBjPW5ldyBxZShlLG4sbnVsbCwhMCksbD1uZXcgcWUoZSxudWxsLGMsITEpO2Mubz1sLGkucHVzaChjKSxvLnB1c2gobCksYz1uZXcgcWUocixuLG51bGwsITEpLGw9bmV3IHFlKHIsbnVsbCxjLCEwKSxjLm89bCxpLnB1c2goYyksby5wdXNoKGwpfX0pLG8uc29ydCh0KSx6ZShpKSx6ZShvKSxpLmxlbmd0aCl7Zm9yKHZhciBhPTAsYz1lLGw9by5sZW5ndGg7bD5hOysrYSlvW2FdLmU9Yz0hYztmb3IodmFyIHMsZixoPWlbMF07Oyl7Zm9yKHZhciBnPWgscD0hMDtnLnY7KWlmKChnPWcubik9PT1oKXJldHVybjtzPWcueix1LmxpbmVTdGFydCgpO2Rve2lmKGcudj1nLm8udj0hMCxnLmUpe2lmKHApZm9yKHZhciBhPTAsbD1zLmxlbmd0aDtsPmE7KythKXUucG9pbnQoKGY9c1thXSlbMF0sZlsxXSk7ZWxzZSByKGcueCxnLm4ueCwxLHUpO2c9Zy5ufWVsc2V7aWYocCl7cz1nLnAuejtmb3IodmFyIGE9cy5sZW5ndGgtMTthPj0wOy0tYSl1LnBvaW50KChmPXNbYV0pWzBdLGZbMV0pfWVsc2UgcihnLngsZy5wLngsLTEsdSk7Zz1nLnB9Zz1nLm8scz1nLnoscD0hcH13aGlsZSghZy52KTt1LmxpbmVFbmQoKX19fWZ1bmN0aW9uIHplKG4pe2lmKHQ9bi5sZW5ndGgpe2Zvcih2YXIgdCxlLHI9MCx1PW5bMF07KytyPHQ7KXUubj1lPW5bcl0sZS5wPXUsdT1lO3Uubj1lPW5bMF0sZS5wPXV9fWZ1bmN0aW9uIHFlKG4sdCxlLHIpe3RoaXMueD1uLHRoaXMuej10LHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gTGUobix0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHUsaSl7ZnVuY3Rpb24gbyh0LGUpe3ZhciByPXUodCxlKTtuKHQ9clswXSxlPXJbMV0pJiZpLnBvaW50KHQsZSl9ZnVuY3Rpb24gYShuLHQpe3ZhciBlPXUobix0KTtkLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gYygpe3kucG9pbnQ9YSxkLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGwoKXt5LnBvaW50PW8sZC5saW5lRW5kKCl9ZnVuY3Rpb24gcyhuLHQpe3YucHVzaChbbix0XSk7dmFyIGU9dShuLHQpO3gucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBmKCl7eC5saW5lU3RhcnQoKSx2PVtdfWZ1bmN0aW9uIGgoKXtzKHZbMF1bMF0sdlswXVsxXSkseC5saW5lRW5kKCk7dmFyIG4sdD14LmNsZWFuKCksZT1NLmJ1ZmZlcigpLHI9ZS5sZW5ndGg7aWYodi5wb3AoKSxwLnB1c2godiksdj1udWxsLHIpaWYoMSZ0KXtuPWVbMF07dmFyIHUscj1uLmxlbmd0aC0xLG89LTE7aWYocj4wKXtmb3IoYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksaS5saW5lU3RhcnQoKTsrK288cjspaS5wb2ludCgodT1uW29dKVswXSx1WzFdKTtpLmxpbmVFbmQoKX19ZWxzZSByPjEmJjImdCYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpLGcucHVzaChlLmZpbHRlcihUZSkpfXZhciBnLHAsdixkPXQoaSksbT11LmludmVydChyWzBdLHJbMV0pLHk9e3BvaW50Om8sbGluZVN0YXJ0OmMsbGluZUVuZDpsLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3kucG9pbnQ9cyx5LmxpbmVTdGFydD1mLHkubGluZUVuZD1oLGc9W10scD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3kucG9pbnQ9byx5LmxpbmVTdGFydD1jLHkubGluZUVuZD1sLGc9dGEubWVyZ2UoZyk7dmFyIG49RmUobSxwKTtnLmxlbmd0aD8oYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksQ2UoZyxEZSxuLGUsaSkpOm4mJihifHwoaS5wb2x5Z29uU3RhcnQoKSxiPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGImJihpLnBvbHlnb25FbmQoKSxiPSExKSxnPXA9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fSxNPVJlKCkseD10KE0pLGI9ITE7cmV0dXJuIHl9fWZ1bmN0aW9uIFRlKG4pe3JldHVybiBuLmxlbmd0aD4xfWZ1bmN0aW9uIFJlKCl7dmFyIG4sdD1bXTtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5wdXNoKG49W10pfSxwb2ludDpmdW5jdGlvbih0LGUpe24ucHVzaChbdCxlXSl9LGxpbmVFbmQ6eSxidWZmZXI6ZnVuY3Rpb24oKXt2YXIgZT10O3JldHVybiB0PVtdLG49bnVsbCxlfSxyZWpvaW46ZnVuY3Rpb24oKXt0Lmxlbmd0aD4xJiZ0LnB1c2godC5wb3AoKS5jb25jYXQodC5zaGlmdCgpKSl9fX1mdW5jdGlvbiBEZShuLHQpe3JldHVybigobj1uLngpWzBdPDA/blsxXS1qYS1UYTpqYS1uWzFdKS0oKHQ9dC54KVswXTwwP3RbMV0tamEtVGE6amEtdFsxXSl9ZnVuY3Rpb24gUGUobil7dmFyIHQsZT0wLzAscj0wLzAsdT0wLzA7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCksdD0xfSxwb2ludDpmdW5jdGlvbihpLG8pe3ZhciBhPWk+MD9EYTotRGEsYz12YShpLWUpO3ZhKGMtRGEpPFRhPyhuLnBvaW50KGUscj0ocitvKS8yPjA/amE6LWphKSxuLnBvaW50KHUsciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksbi5wb2ludChpLHIpLHQ9MCk6dSE9PWEmJmM+PURhJiYodmEoZS11KTxUYSYmKGUtPXUqVGEpLHZhKGktYSk8VGEmJihpLT1hKlRhKSxyPVVlKGUscixpLG8pLG4ucG9pbnQodSxyKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQoYSxyKSx0PTApLG4ucG9pbnQoZT1pLHI9byksdT1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bi5saW5lRW5kKCksZT1yPTAvMH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi10fX19ZnVuY3Rpb24gVWUobix0LGUscil7dmFyIHUsaSxvPU1hdGguc2luKG4tZSk7cmV0dXJuIHZhKG8pPlRhP01hdGguYXRhbigoTWF0aC5zaW4odCkqKGk9TWF0aC5jb3MocikpKk1hdGguc2luKGUpLU1hdGguc2luKHIpKih1PU1hdGguY29zKHQpKSpNYXRoLnNpbihuKSkvKHUqaSpvKSk6KHQrcikvMn1mdW5jdGlvbiBqZShuLHQsZSxyKXt2YXIgdTtpZihudWxsPT1uKXU9ZSpqYSxyLnBvaW50KC1EYSx1KSxyLnBvaW50KDAsdSksci5wb2ludChEYSx1KSxyLnBvaW50KERhLDApLHIucG9pbnQoRGEsLXUpLHIucG9pbnQoMCwtdSksci5wb2ludCgtRGEsLXUpLHIucG9pbnQoLURhLDApLHIucG9pbnQoLURhLHUpO2Vsc2UgaWYodmEoblswXS10WzBdKT5UYSl7dmFyIGk9blswXTx0WzBdP0RhOi1EYTt1PWUqaS8yLHIucG9pbnQoLWksdSksci5wb2ludCgwLHUpLHIucG9pbnQoaSx1KX1lbHNlIHIucG9pbnQodFswXSx0WzFdKX1mdW5jdGlvbiBGZShuLHQpe3ZhciBlPW5bMF0scj1uWzFdLHU9W01hdGguc2luKGUpLC1NYXRoLmNvcyhlKSwwXSxpPTAsbz0wO19jLnJlc2V0KCk7Zm9yKHZhciBhPTAsYz10Lmxlbmd0aDtjPmE7KythKXt2YXIgbD10W2FdLHM9bC5sZW5ndGg7aWYocylmb3IodmFyIGY9bFswXSxoPWZbMF0sZz1mWzFdLzIrRGEvNCxwPU1hdGguc2luKGcpLHY9TWF0aC5jb3MoZyksZD0xOzspe2Q9PT1zJiYoZD0wKSxuPWxbZF07dmFyIG09blswXSx5PW5bMV0vMitEYS80LE09TWF0aC5zaW4oeSkseD1NYXRoLmNvcyh5KSxiPW0taCxfPWI+PTA/MTotMSx3PV8qYixTPXc+RGEsaz1wKk07aWYoX2MuYWRkKE1hdGguYXRhbjIoaypfKk1hdGguc2luKHcpLHYqeCtrKk1hdGguY29zKHcpKSksaSs9Uz9iK18qUGE6YixTXmg+PWVebT49ZSl7dmFyIEU9ZGUocGUoZikscGUobikpO01lKEUpO3ZhciBBPWRlKHUsRSk7TWUoQSk7dmFyIE49KFNeYj49MD8tMToxKSpudChBWzJdKTsocj5OfHxyPT09TiYmKEVbMF18fEVbMV0pKSYmKG8rPVNeYj49MD8xOi0xKX1pZighZCsrKWJyZWFrO2g9bSxwPU0sdj14LGY9bn19cmV0dXJuKC1UYT5pfHxUYT5pJiYwPl9jKV4xJm99ZnVuY3Rpb24gSGUobil7ZnVuY3Rpb24gdChuLHQpe3JldHVybiBNYXRoLmNvcyhuKSpNYXRoLmNvcyh0KT5pfWZ1bmN0aW9uIGUobil7dmFyIGUsaSxjLGwscztyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7bD1jPSExLHM9MX0scG9pbnQ6ZnVuY3Rpb24oZixoKXt2YXIgZyxwPVtmLGhdLHY9dChmLGgpLGQ9bz92PzA6dShmLGgpOnY/dShmKygwPmY/RGE6LURhKSxoKTowO2lmKCFlJiYobD1jPXYpJiZuLmxpbmVTdGFydCgpLHYhPT1jJiYoZz1yKGUscCksKGJlKGUsZyl8fGJlKHAsZykpJiYocFswXSs9VGEscFsxXSs9VGEsdj10KHBbMF0scFsxXSkpKSx2IT09YylzPTAsdj8obi5saW5lU3RhcnQoKSxnPXIocCxlKSxuLnBvaW50KGdbMF0sZ1sxXSkpOihnPXIoZSxwKSxuLnBvaW50KGdbMF0sZ1sxXSksbi5saW5lRW5kKCkpLGU9ZztlbHNlIGlmKGEmJmUmJm9edil7dmFyIG07ZCZpfHwhKG09cihwLGUsITApKXx8KHM9MCxvPyhuLmxpbmVTdGFydCgpLG4ucG9pbnQobVswXVswXSxtWzBdWzFdKSxuLnBvaW50KG1bMV1bMF0sbVsxXVsxXSksbi5saW5lRW5kKCkpOihuLnBvaW50KG1bMV1bMF0sbVsxXVsxXSksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSkpKX0hdnx8ZSYmYmUoZSxwKXx8bi5wb2ludChwWzBdLHBbMV0pLGU9cCxjPXYsaT1kfSxsaW5lRW5kOmZ1bmN0aW9uKCl7YyYmbi5saW5lRW5kKCksZT1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChsJiZjKTw8MX19fWZ1bmN0aW9uIHIobix0LGUpe3ZhciByPXBlKG4pLHU9cGUodCksbz1bMSwwLDBdLGE9ZGUocix1KSxjPXZlKGEsYSksbD1hWzBdLHM9Yy1sKmw7aWYoIXMpcmV0dXJuIWUmJm47dmFyIGY9aSpjL3MsaD0taSpsL3MsZz1kZShvLGEpLHA9eWUobyxmKSx2PXllKGEsaCk7bWUocCx2KTt2YXIgZD1nLG09dmUocCxkKSx5PXZlKGQsZCksTT1tKm0teSoodmUocCxwKS0xKTtpZighKDA+TSkpe3ZhciB4PU1hdGguc3FydChNKSxiPXllKGQsKC1tLXgpL3kpO2lmKG1lKGIscCksYj14ZShiKSwhZSlyZXR1cm4gYjt2YXIgXyx3PW5bMF0sUz10WzBdLGs9blsxXSxFPXRbMV07dz5TJiYoXz13LHc9UyxTPV8pO3ZhciBBPVMtdyxOPXZhKEEtRGEpPFRhLEM9Tnx8VGE+QTtpZighTiYmaz5FJiYoXz1rLGs9RSxFPV8pLEM/Tj9rK0U+MF5iWzFdPCh2YShiWzBdLXcpPFRhP2s6RSk6azw9YlsxXSYmYlsxXTw9RTpBPkRhXih3PD1iWzBdJiZiWzBdPD1TKSl7dmFyIHo9eWUoZCwoLW0reCkveSk7cmV0dXJuIG1lKHoscCksW2IseGUoeildfX19ZnVuY3Rpb24gdSh0LGUpe3ZhciByPW8/bjpEYS1uLHU9MDtyZXR1cm4tcj50P3V8PTE6dD5yJiYodXw9MiksLXI+ZT91fD00OmU+ciYmKHV8PTgpLHV9dmFyIGk9TWF0aC5jb3Mobiksbz1pPjAsYT12YShpKT5UYSxjPWdyKG4sNipGYSk7cmV0dXJuIExlKHQsZSxjLG8/WzAsLW5dOlstRGEsbi1EYV0pfWZ1bmN0aW9uIE9lKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1KXt2YXIgaSxvPXUuYSxhPXUuYixjPW8ueCxsPW8ueSxzPWEueCxmPWEueSxoPTAsZz0xLHA9cy1jLHY9Zi1sO2lmKGk9bi1jLHB8fCEoaT4wKSl7aWYoaS89cCwwPnApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1lbHNlIGlmKHA+MCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWlmKGk9ZS1jLHB8fCEoMD5pKSl7aWYoaS89cCwwPnApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1lbHNlIGlmKHA+MCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfWlmKGk9dC1sLHZ8fCEoaT4wKSl7aWYoaS89diwwPnYpe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1lbHNlIGlmKHY+MCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWlmKGk9ci1sLHZ8fCEoMD5pKSl7aWYoaS89diwwPnYpe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1lbHNlIGlmKHY+MCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfXJldHVybiBoPjAmJih1LmE9e3g6YytoKnAseTpsK2gqdn0pLDE+ZyYmKHUuYj17eDpjK2cqcCx5OmwrZyp2fSksdX19fX19fWZ1bmN0aW9uIFllKG4sdCxlLHIpe2Z1bmN0aW9uIHUocix1KXtyZXR1cm4gdmEoclswXS1uKTxUYT91PjA/MDozOnZhKHJbMF0tZSk8VGE/dT4wPzI6MTp2YShyWzFdLXQpPFRhP3U+MD8xOjA6dT4wPzM6Mn1mdW5jdGlvbiBpKG4sdCl7cmV0dXJuIG8obi54LHQueCl9ZnVuY3Rpb24gbyhuLHQpe3ZhciBlPXUobiwxKSxyPXUodCwxKTtyZXR1cm4gZSE9PXI/ZS1yOjA9PT1lP3RbMV0tblsxXToxPT09ZT9uWzBdLXRbMF06Mj09PWU/blsxXS10WzFdOnRbMF0tblswXX1yZXR1cm4gZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhuKXtmb3IodmFyIHQ9MCxlPWQubGVuZ3RoLHI9blsxXSx1PTA7ZT51OysrdSlmb3IodmFyIGksbz0xLGE9ZFt1XSxjPWEubGVuZ3RoLGw9YVswXTtjPm87KytvKWk9YVtvXSxsWzFdPD1yP2lbMV0+ciYmSyhsLGksbik+MCYmKyt0OmlbMV08PXImJksobCxpLG4pPDAmJi0tdCxsPWk7cmV0dXJuIDAhPT10fWZ1bmN0aW9uIGwoaSxhLGMsbCl7dmFyIHM9MCxmPTA7aWYobnVsbD09aXx8KHM9dShpLGMpKSE9PShmPXUoYSxjKSl8fG8oaSxhKTwwXmM+MCl7ZG8gbC5wb2ludCgwPT09c3x8Mz09PXM/bjplLHM+MT9yOnQpO3doaWxlKChzPShzK2MrNCklNCkhPT1mKX1lbHNlIGwucG9pbnQoYVswXSxhWzFdKX1mdW5jdGlvbiBzKHUsaSl7cmV0dXJuIHU+PW4mJmU+PXUmJmk+PXQmJnI+PWl9ZnVuY3Rpb24gZihuLHQpe3Mobix0KSYmYS5wb2ludChuLHQpfWZ1bmN0aW9uIGgoKXtDLnBvaW50PXAsZCYmZC5wdXNoKG09W10pLFM9ITAsdz0hMSxiPV89MC8wfWZ1bmN0aW9uIGcoKXt2JiYocCh5LE0pLHgmJncmJkEucmVqb2luKCksdi5wdXNoKEEuYnVmZmVyKCkpKSxDLnBvaW50PWYsdyYmYS5saW5lRW5kKCl9ZnVuY3Rpb24gcChuLHQpe249TWF0aC5tYXgoLVVjLE1hdGgubWluKFVjLG4pKSx0PU1hdGgubWF4KC1VYyxNYXRoLm1pbihVYyx0KSk7dmFyIGU9cyhuLHQpO2lmKGQmJm0ucHVzaChbbix0XSksUyl5PW4sTT10LHg9ZSxTPSExLGUmJihhLmxpbmVTdGFydCgpLGEucG9pbnQobix0KSk7ZWxzZSBpZihlJiZ3KWEucG9pbnQobix0KTtlbHNle3ZhciByPXthOnt4OmIseTpffSxiOnt4Om4seTp0fX07TihyKT8od3x8KGEubGluZVN0YXJ0KCksYS5wb2ludChyLmEueCxyLmEueSkpLGEucG9pbnQoci5iLngsci5iLnkpLGV8fGEubGluZUVuZCgpLGs9ITEpOmUmJihhLmxpbmVTdGFydCgpLGEucG9pbnQobix0KSxrPSExKX1iPW4sXz10LHc9ZX12YXIgdixkLG0seSxNLHgsYixfLHcsUyxrLEU9YSxBPVJlKCksTj1PZShuLHQsZSxyKSxDPXtwb2ludDpmLGxpbmVTdGFydDpoLGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthPUEsdj1bXSxkPVtdLGs9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthPUUsdj10YS5tZXJnZSh2KTt2YXIgdD1jKFtuLHJdKSxlPWsmJnQsdT12Lmxlbmd0aDsoZXx8dSkmJihhLnBvbHlnb25TdGFydCgpLGUmJihhLmxpbmVTdGFydCgpLGwobnVsbCxudWxsLDEsYSksYS5saW5lRW5kKCkpLHUmJkNlKHYsaSx0LGwsYSksYS5wb2x5Z29uRW5kKCkpLHY9ZD1tPW51bGx9fTtyZXR1cm4gQ319ZnVuY3Rpb24gSWUobil7dmFyIHQ9MCxlPURhLzMscj1pcihuKSx1PXIodCxlKTtyZXR1cm4gdS5wYXJhbGxlbHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cih0PW5bMF0qRGEvMTgwLGU9blsxXSpEYS8xODApOlsxODAqKHQvRGEpLDE4MCooZS9EYSldfSx1fWZ1bmN0aW9uIFplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguc3FydChpLTIqdSpNYXRoLnNpbih0KSkvdTtyZXR1cm5bZSpNYXRoLnNpbihuKj11KSxvLWUqTWF0aC5jb3MobildfXZhciByPU1hdGguc2luKG4pLHU9KHIrTWF0aC5zaW4odCkpLzIsaT0xK3IqKDIqdS1yKSxvPU1hdGguc3FydChpKS91O3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsbnQoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9uIG4obix0KXtGYys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O1pjLnBvaW50PWZ1bmN0aW9uKGksbyl7WmMucG9pbnQ9bix0PXI9aSxlPXU9b30sWmMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gWGUobix0KXtIYz5uJiYoSGM9biksbj5ZYyYmKFljPW4pLE9jPnQmJihPYz10KSx0PkljJiYoSWM9dCl9ZnVuY3Rpb24gJGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixuLCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1mdW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1ufWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEucG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAxLDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBXZShuLHQpe0VjKz1uLEFjKz10LCsrTmN9ZnVuY3Rpb24gSmUoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO0NjKz1vKih0K24pLzIsemMrPW8qKGUrcikvMixxYys9byxXZSh0PW4sZT1yKX12YXIgdCxlO1hjLnBvaW50PWZ1bmN0aW9uKHIsdSl7WGMucG9pbnQ9bixXZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtYYy5wb2ludD1XZX1mdW5jdGlvbiBLZSgpe2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7Q2MrPW8qKHIrbikvMix6Yys9byoodSt0KS8yLHFjKz1vLG89dSpuLXIqdCxMYys9byoocituKSxUYys9byoodSt0KSxSYys9MypvLFdlKHI9bix1PXQpfXZhciB0LGUscix1O1hjLnBvaW50PWZ1bmN0aW9uKGksbyl7WGMucG9pbnQ9bixXZSh0PXI9aSxlPXU9byl9LFhjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0K28sZSksbi5hcmModCxlLG8sMCxQYSl9ZnVuY3Rpb24gZSh0LGUpe24ubW92ZVRvKHQsZSksYS5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtuLmxpbmVUbyh0LGUpfWZ1bmN0aW9uIHUoKXthLnBvaW50PXR9ZnVuY3Rpb24gaSgpe24uY2xvc2VQYXRoKCl9dmFyIG89NC41LGE9e3BvaW50OnQsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YS5wb2ludD1lfSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YS5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dSxhLnBvaW50PXR9LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBvPW4sYX0scmVzdWx0Onl9O3JldHVybiBhfWZ1bmN0aW9uIG5yKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuKGE/cjplKShuKX1mdW5jdGlvbiBlKHQpe3JldHVybiBycih0LGZ1bmN0aW9uKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfSl9ZnVuY3Rpb24gcih0KXtmdW5jdGlvbiBlKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHIoKXtNPTAvMCxTLnBvaW50PWksdC5saW5lU3RhcnQoKX1mdW5jdGlvbiBpKGUscil7dmFyIGk9cGUoW2Uscl0pLG89bihlLHIpO3UoTSx4LHksYixfLHcsTT1vWzBdLHg9b1sxXSx5PWUsYj1pWzBdLF89aVsxXSx3PWlbMl0sYSx0KSx0LnBvaW50KE0seCl9ZnVuY3Rpb24gbygpe1MucG9pbnQ9ZSx0LmxpbmVFbmQoKX1mdW5jdGlvbiBjKCl7cigpLFMucG9pbnQ9bCxTLmxpbmVFbmQ9c31mdW5jdGlvbiBsKG4sdCl7aShmPW4saD10KSxnPU0scD14LHY9YixkPV8sbT13LFMucG9pbnQ9aX1mdW5jdGlvbiBzKCl7dShNLHgseSxiLF8sdyxnLHAsZix2LGQsbSxhLHQpLFMubGluZUVuZD1vLG8oKX12YXIgZixoLGcscCx2LGQsbSx5LE0seCxiLF8sdyxTPXtwb2ludDplLGxpbmVTdGFydDpyLGxpbmVFbmQ6byxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLFMubGluZVN0YXJ0PWN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25FbmQoKSxTLmxpbmVTdGFydD1yfX07cmV0dXJuIFN9ZnVuY3Rpb24gdSh0LGUscixhLGMsbCxzLGYsaCxnLHAsdixkLG0pe3ZhciB5PXMtdCxNPWYtZSx4PXkqeStNKk07aWYoeD40KmkmJmQtLSl7dmFyIGI9YStnLF89YytwLHc9bCt2LFM9TWF0aC5zcXJ0KGIqYitfKl8rdyp3KSxrPU1hdGguYXNpbih3Lz1TKSxFPXZhKHZhKHcpLTEpPFRhfHx2YShyLWgpPFRhPyhyK2gpLzI6TWF0aC5hdGFuMihfLGIpLEE9bihFLGspLE49QVswXSxDPUFbMV0sej1OLXQscT1DLWUsTD1NKnoteSpxOwooTCpML3g+aXx8dmEoKHkqeitNKnEpL3gtLjUpPi4zfHxvPmEqZytjKnArbCp2KSYmKHUodCxlLHIsYSxjLGwsTixDLEUsYi89UyxfLz1TLHcsZCxtKSxtLnBvaW50KE4sQyksdShOLEMsRSxiLF8sdyxzLGYsaCxnLHAsdixkLG0pKX19dmFyIGk9LjUsbz1NYXRoLmNvcygzMCpGYSksYT0xNjtyZXR1cm4gdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9KGk9bipuKT4wJiYxNix0KTpNYXRoLnNxcnQoaSl9LHR9ZnVuY3Rpb24gdHIobil7dmFyIHQ9bnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihbdCpIYSxlKkhhXSl9KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG9yKHQobikpfX1mdW5jdGlvbiBlcihuKXt0aGlzLnN0cmVhbT1ufWZ1bmN0aW9uIHJyKG4sdCl7cmV0dXJue3BvaW50OnQsc3BoZXJlOmZ1bmN0aW9uKCl7bi5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCl9fX1mdW5jdGlvbiB1cihuKXtyZXR1cm4gaXIoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKCl9ZnVuY3Rpb24gaXIobil7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj1hKG5bMF0qRmEsblsxXSpGYSksW25bMF0qaCtjLGwtblsxXSpoXX1mdW5jdGlvbiBlKG4pe3JldHVybiBuPWEuaW52ZXJ0KChuWzBdLWMpL2gsKGwtblsxXSkvaCksbiYmW25bMF0qSGEsblsxXSpIYV19ZnVuY3Rpb24gcigpe2E9QWUobz1scihtLHksTSksaSk7dmFyIG49aSh2LGQpO3JldHVybiBjPWctblswXSpoLGw9cCtuWzFdKmgsdSgpfWZ1bmN0aW9uIHUoKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEscz1udWxsKSx0fXZhciBpLG8sYSxjLGwscyxmPW5yKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49aShuLHQpLFtuWzBdKmgrYyxsLW5bMV0qaF19KSxoPTE1MCxnPTQ4MCxwPTI1MCx2PTAsZD0wLG09MCx5PTAsTT0wLHg9UGMsYj1FdCxfPW51bGwsdz1udWxsO3JldHVybiB0LnN0cmVhbT1mdW5jdGlvbihuKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEpLHM9b3IoeChvLGYoYihuKSkpKSxzLnZhbGlkPSEwLHN9LHQuY2xpcEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PW51bGw9PW4/KF89bixQYyk6SGUoKF89K24pKkZhKSx1KCkpOl99LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz1uLGI9bj9ZZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKTpFdCx1KCkpOnd9LHQuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K24scigpKTpofSx0LnRyYW5zbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0rblswXSxwPStuWzFdLHIoKSk6W2cscF19LHQuY2VudGVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PW5bMF0lMzYwKkZhLGQ9blsxXSUzNjAqRmEscigpKTpbdipIYSxkKkhhXX0sdC5yb3RhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09blswXSUzNjAqRmEseT1uWzFdJTM2MCpGYSxNPW4ubGVuZ3RoPjI/blsyXSUzNjAqRmE6MCxyKCkpOlttKkhhLHkqSGEsTSpIYV19LHRhLnJlYmluZCh0LGYsInByZWNpc2lvbiIpLGZ1bmN0aW9uKCl7cmV0dXJuIGk9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5pbnZlcnQ9aS5pbnZlcnQmJmUscigpfX1mdW5jdGlvbiBvcihuKXtyZXR1cm4gcnIobixmdW5jdGlvbih0LGUpe24ucG9pbnQodCpGYSxlKkZhKX0pfWZ1bmN0aW9uIGFyKG4sdCl7cmV0dXJuW24sdF19ZnVuY3Rpb24gY3Iobix0KXtyZXR1cm5bbj5EYT9uLVBhOi1EYT5uP24rUGE6bix0XX1mdW5jdGlvbiBscihuLHQsZSl7cmV0dXJuIG4/dHx8ZT9BZShmcihuKSxocih0LGUpKTpmcihuKTp0fHxlP2hyKHQsZSk6Y3J9ZnVuY3Rpb24gc3Iobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrPW4sW3Q+RGE/dC1QYTotRGE+dD90K1BhOnQsZV19fWZ1bmN0aW9uIGZyKG4pe3ZhciB0PXNyKG4pO3JldHVybiB0LmludmVydD1zcigtbiksdH1mdW5jdGlvbiBocihuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1NYXRoLmNvcyh0KSxhPU1hdGguY29zKG4pKmUsYz1NYXRoLnNpbihuKSplLGw9TWF0aC5zaW4odCkscz1sKnIrYSp1O3JldHVybltNYXRoLmF0YW4yKGMqaS1zKm8sYSpyLWwqdSksbnQocyppK2MqbyldfXZhciByPU1hdGguY29zKG4pLHU9TWF0aC5zaW4obiksaT1NYXRoLmNvcyh0KSxvPU1hdGguc2luKHQpO3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPU1hdGguY29zKHQpLGE9TWF0aC5jb3MobikqZSxjPU1hdGguc2luKG4pKmUsbD1NYXRoLnNpbih0KSxzPWwqaS1jKm87cmV0dXJuW01hdGguYXRhbjIoYyppK2wqbyxhKnIrcyp1KSxudChzKnItYSp1KV19LGV9ZnVuY3Rpb24gZ3Iobix0KXt2YXIgZT1NYXRoLmNvcyhuKSxyPU1hdGguc2luKG4pO3JldHVybiBmdW5jdGlvbih1LGksbyxhKXt2YXIgYz1vKnQ7bnVsbCE9dT8odT1wcihlLHUpLGk9cHIoZSxpKSwobz4wP2k+dTp1PmkpJiYodSs9bypQYSkpOih1PW4rbypQYSxpPW4tLjUqYyk7Zm9yKHZhciBsLHM9dTtvPjA/cz5pOmk+cztzLT1jKWEucG9pbnQoKGw9eGUoW2UsLXIqTWF0aC5jb3MocyksLXIqTWF0aC5zaW4ocyldKSlbMF0sbFsxXSl9fWZ1bmN0aW9uIHByKG4sdCl7dmFyIGU9cGUodCk7ZVswXS09bixNZShlKTt2YXIgcj1RKC1lWzFdKTtyZXR1cm4oKC1lWzJdPDA/LXI6cikrMipNYXRoLlBJLVRhKSUoMipNYXRoLlBJKX1mdW5jdGlvbiB2cihuLHQsZSl7dmFyIHI9dGEucmFuZ2Uobix0LVRhLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGRyKG4sdCxlKXt2YXIgcj10YS5yYW5nZShuLHQtVGEsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gbXIobil7cmV0dXJuIG4uc291cmNlfWZ1bmN0aW9uIHlyKG4pe3JldHVybiBuLnRhcmdldH1mdW5jdGlvbiBNcihuLHQsZSxyKXt2YXIgdT1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpLG89TWF0aC5jb3MociksYT1NYXRoLnNpbihyKSxjPXUqTWF0aC5jb3MobiksbD11Kk1hdGguc2luKG4pLHM9bypNYXRoLmNvcyhlKSxmPW8qTWF0aC5zaW4oZSksaD0yKk1hdGguYXNpbihNYXRoLnNxcnQodXQoci10KSt1Km8qdXQoZS1uKSkpLGc9MS9NYXRoLnNpbihoKSxwPWg/ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zaW4obio9aCkqZyxlPU1hdGguc2luKGgtbikqZyxyPWUqYyt0KnMsdT1lKmwrdCpmLG89ZSppK3QqYTtyZXR1cm5bTWF0aC5hdGFuMih1LHIpKkhhLE1hdGguYXRhbjIobyxNYXRoLnNxcnQocipyK3UqdSkpKkhhXX06ZnVuY3Rpb24oKXtyZXR1cm5bbipIYSx0KkhhXX07cmV0dXJuIHAuZGlzdGFuY2U9aCxwfWZ1bmN0aW9uIHhyKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPU1hdGguc2luKHUqPUZhKSxvPU1hdGguY29zKHUpLGE9dmEoKG4qPUZhKS10KSxjPU1hdGguY29zKGEpOyRjKz1NYXRoLmF0YW4yKE1hdGguc3FydCgoYT1vKk1hdGguc2luKGEpKSphKyhhPXIqaS1lKm8qYykqYSksZSppK3IqbypjKSx0PW4sZT1pLHI9b312YXIgdCxlLHI7QmMucG9pbnQ9ZnVuY3Rpb24odSxpKXt0PXUqRmEsZT1NYXRoLnNpbihpKj1GYSkscj1NYXRoLmNvcyhpKSxCYy5wb2ludD1ufSxCYy5saW5lRW5kPWZ1bmN0aW9uKCl7QmMucG9pbnQ9QmMubGluZUVuZD15fX1mdW5jdGlvbiBicihuLHQpe2Z1bmN0aW9uIGUodCxlKXt2YXIgcj1NYXRoLmNvcyh0KSx1PU1hdGguY29zKGUpLGk9bihyKnUpO3JldHVybltpKnUqTWF0aC5zaW4odCksaSpNYXRoLnNpbihlKV19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sZSl7dmFyIHI9TWF0aC5zcXJ0KG4qbitlKmUpLHU9dChyKSxpPU1hdGguc2luKHUpLG89TWF0aC5jb3ModSk7cmV0dXJuW01hdGguYXRhbjIobippLHIqbyksTWF0aC5hc2luKHImJmUqaS9yKV19LGV9ZnVuY3Rpb24gX3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7bz4wPy1qYStUYT50JiYodD0tamErVGEpOnQ+amEtVGEmJih0PWphLVRhKTt2YXIgZT1vL01hdGgucG93KHUodCksaSk7cmV0dXJuW2UqTWF0aC5zaW4oaSpuKSxvLWUqTWF0aC5jb3MoaSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1mdW5jdGlvbihuKXtyZXR1cm4gTWF0aC50YW4oRGEvNCtuLzIpfSxpPW49PT10P01hdGguc2luKG4pOk1hdGgubG9nKHIvTWF0aC5jb3ModCkpL01hdGgubG9nKHUodCkvdShuKSksbz1yKk1hdGgucG93KHUobiksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1vLXQscj1HKGkpKk1hdGguc3FydChuKm4rZSplKTtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL2ksMipNYXRoLmF0YW4oTWF0aC5wb3coby9yLDEvaSkpLWphXX0sZSk6U3J9ZnVuY3Rpb24gd3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9aS10O3JldHVybltlKk1hdGguc2luKHUqbiksaS1lKk1hdGguY29zKHUqbildfXZhciByPU1hdGguY29zKG4pLHU9bj09PXQ/TWF0aC5zaW4obik6KHItTWF0aC5jb3ModCkpLyh0LW4pLGk9ci91K247cmV0dXJuIHZhKHUpPFRhP2FyOihlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPWktdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsaS1HKHUpKk1hdGguc3FydChuKm4rZSplKV19LGUpfWZ1bmN0aW9uIFNyKG4sdCl7cmV0dXJuW24sTWF0aC5sb2coTWF0aC50YW4oRGEvNCt0LzIpKV19ZnVuY3Rpb24ga3Iobil7dmFyIHQsZT11cihuKSxyPWUuc2NhbGUsdT1lLnRyYW5zbGF0ZSxpPWUuY2xpcEV4dGVudDtyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90P2UuY2xpcEV4dGVudChudWxsKTplOm59LGUudHJhbnNsYXRlPWZ1bmN0aW9uKCl7dmFyIG49dS5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3ZhciBvPWkuYXBwbHkoZSxhcmd1bWVudHMpO2lmKG89PT1lKXtpZih0PW51bGw9PW4pe3ZhciBhPURhKnIoKSxjPXUoKTtpKFtbY1swXS1hLGNbMV0tYV0sW2NbMF0rYSxjWzFdK2FdXSl9fWVsc2UgdCYmKG89bnVsbCk7cmV0dXJuIG99LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBFcihuLHQpe3JldHVybltNYXRoLmxvZyhNYXRoLnRhbihEYS80K3QvMikpLC1uXX1mdW5jdGlvbiBBcihuKXtyZXR1cm4gblswXX1mdW5jdGlvbiBOcihuKXtyZXR1cm4gblsxXX1mdW5jdGlvbiBDcihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1bMCwxXSxyPTIsdT0yO3Q+dTt1Kyspe2Zvcig7cj4xJiZLKG5bZVtyLTJdXSxuW2Vbci0xXV0sblt1XSk8PTA7KS0tcjtlW3IrK109dX1yZXR1cm4gZS5zbGljZSgwLHIpfWZ1bmN0aW9uIHpyKG4sdCl7cmV0dXJuIG5bMF0tdFswXXx8blsxXS10WzFdfWZ1bmN0aW9uIHFyKG4sdCxlKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKTwoZVsxXS10WzFdKSooblswXS10WzBdKX1mdW5jdGlvbiBMcihuLHQsZSxyKXt2YXIgdT1uWzBdLGk9ZVswXSxvPXRbMF0tdSxhPXJbMF0taSxjPW5bMV0sbD1lWzFdLHM9dFsxXS1jLGY9clsxXS1sLGg9KGEqKGMtbCktZioodS1pKSkvKGYqby1hKnMpO3JldHVyblt1K2gqbyxjK2gqc119ZnVuY3Rpb24gVHIobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuISh0WzBdLWVbMF18fHRbMV0tZVsxXSl9ZnVuY3Rpb24gUnIoKXt0dSh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gRHIobil7dmFyIHQ9b2wucG9wKCl8fG5ldyBScjtyZXR1cm4gdC5zaXRlPW4sdH1mdW5jdGlvbiBQcihuKXtYcihuKSxybC5yZW1vdmUobiksb2wucHVzaChuKSx0dShuKX1mdW5jdGlvbiBVcihuKXt2YXIgdD1uLmNpcmNsZSxlPXQueCxyPXQuY3ksdT17eDplLHk6cn0saT1uLlAsbz1uLk4sYT1bbl07UHIobik7Zm9yKHZhciBjPWk7Yy5jaXJjbGUmJnZhKGUtYy5jaXJjbGUueCk8VGEmJnZhKHItYy5jaXJjbGUuY3kpPFRhOylpPWMuUCxhLnVuc2hpZnQoYyksUHIoYyksYz1pO2EudW5zaGlmdChjKSxYcihjKTtmb3IodmFyIGw9bztsLmNpcmNsZSYmdmEoZS1sLmNpcmNsZS54KTxUYSYmdmEoci1sLmNpcmNsZS5jeSk8VGE7KW89bC5OLGEucHVzaChsKSxQcihsKSxsPW87YS5wdXNoKGwpLFhyKGwpO3ZhciBzLGY9YS5sZW5ndGg7Zm9yKHM9MTtmPnM7KytzKWw9YVtzXSxjPWFbcy0xXSxLcihsLmVkZ2UsYy5zaXRlLGwuc2l0ZSx1KTtjPWFbMF0sbD1hW2YtMV0sbC5lZGdlPUpyKGMuc2l0ZSxsLnNpdGUsbnVsbCx1KSxWcihjKSxWcihsKX1mdW5jdGlvbiBqcihuKXtmb3IodmFyIHQsZSxyLHUsaT1uLngsbz1uLnksYT1ybC5fO2E7KWlmKHI9RnIoYSxvKS1pLHI+VGEpYT1hLkw7ZWxzZXtpZih1PWktSHIoYSxvKSwhKHU+VGEpKXtyPi1UYT8odD1hLlAsZT1hKTp1Pi1UYT8odD1hLGU9YS5OKTp0PWU9YTticmVha31pZighYS5SKXt0PWE7YnJlYWt9YT1hLlJ9dmFyIGM9RHIobik7aWYocmwuaW5zZXJ0KHQsYyksdHx8ZSl7aWYodD09PWUpcmV0dXJuIFhyKHQpLGU9RHIodC5zaXRlKSxybC5pbnNlcnQoYyxlKSxjLmVkZ2U9ZS5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpLFZyKHQpLFZyKGUpLHZvaWQgMDtpZighZSlyZXR1cm4gYy5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpLHZvaWQgMDtYcih0KSxYcihlKTt2YXIgbD10LnNpdGUscz1sLngsZj1sLnksaD1uLngtcyxnPW4ueS1mLHA9ZS5zaXRlLHY9cC54LXMsZD1wLnktZixtPTIqKGgqZC1nKnYpLHk9aCpoK2cqZyxNPXYqditkKmQseD17eDooZCp5LWcqTSkvbStzLHk6KGgqTS12KnkpL20rZn07S3IoZS5lZGdlLGwscCx4KSxjLmVkZ2U9SnIobCxuLG51bGwseCksZS5lZGdlPUpyKG4scCxudWxsLHgpLFZyKHQpLFZyKGUpfX1mdW5jdGlvbiBGcihuLHQpe3ZhciBlPW4uc2l0ZSxyPWUueCx1PWUueSxpPXUtdDtpZighaSlyZXR1cm4gcjt2YXIgbz1uLlA7aWYoIW8pcmV0dXJuLTEvMDtlPW8uc2l0ZTt2YXIgYT1lLngsYz1lLnksbD1jLXQ7aWYoIWwpcmV0dXJuIGE7dmFyIHM9YS1yLGY9MS9pLTEvbCxoPXMvbDtyZXR1cm4gZj8oLWgrTWF0aC5zcXJ0KGgqaC0yKmYqKHMqcy8oLTIqbCktYytsLzIrdS1pLzIpKSkvZityOihyK2EpLzJ9ZnVuY3Rpb24gSHIobix0KXt2YXIgZT1uLk47aWYoZSlyZXR1cm4gRnIoZSx0KTt2YXIgcj1uLnNpdGU7cmV0dXJuIHIueT09PXQ/ci54OjEvMH1mdW5jdGlvbiBPcihuKXt0aGlzLnNpdGU9bix0aGlzLmVkZ2VzPVtdfWZ1bmN0aW9uIFlyKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG8sYSxjLGwscyxmPW5bMF1bMF0saD1uWzFdWzBdLGc9blswXVsxXSxwPW5bMV1bMV0sdj1lbCxkPXYubGVuZ3RoO2QtLTspaWYoaT12W2RdLGkmJmkucHJlcGFyZSgpKWZvcihhPWkuZWRnZXMsYz1hLmxlbmd0aCxvPTA7Yz5vOylzPWFbb10uZW5kKCkscj1zLngsdT1zLnksbD1hWysrbyVjXS5zdGFydCgpLHQ9bC54LGU9bC55LCh2YShyLXQpPlRhfHx2YSh1LWUpPlRhKSYmKGEuc3BsaWNlKG8sMCxuZXcgUXIoR3IoaS5zaXRlLHMsdmEoci1mKTxUYSYmcC11PlRhP3t4OmYseTp2YSh0LWYpPFRhP2U6cH06dmEodS1wKTxUYSYmaC1yPlRhP3t4OnZhKGUtcCk8VGE/dDpoLHk6cH06dmEoci1oKTxUYSYmdS1nPlRhP3t4OmgseTp2YSh0LWgpPFRhP2U6Z306dmEodS1nKTxUYSYmci1mPlRhP3t4OnZhKGUtZyk8VGE/dDpmLHk6Z306bnVsbCksaS5zaXRlLG51bGwpKSwrK2MpfWZ1bmN0aW9uIElyKG4sdCl7cmV0dXJuIHQuYW5nbGUtbi5hbmdsZX1mdW5jdGlvbiBacigpe3R1KHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBWcihuKXt2YXIgdD1uLlAsZT1uLk47aWYodCYmZSl7dmFyIHI9dC5zaXRlLHU9bi5zaXRlLGk9ZS5zaXRlO2lmKHIhPT1pKXt2YXIgbz11LngsYT11LnksYz1yLngtbyxsPXIueS1hLHM9aS54LW8sZj1pLnktYSxoPTIqKGMqZi1sKnMpO2lmKCEoaD49LVJhKSl7dmFyIGc9YypjK2wqbCxwPXMqcytmKmYsdj0oZipnLWwqcCkvaCxkPShjKnAtcypnKS9oLGY9ZCthLG09YWwucG9wKCl8fG5ldyBacjttLmFyYz1uLG0uc2l0ZT11LG0ueD12K28sbS55PWYrTWF0aC5zcXJ0KHYqditkKmQpLG0uY3k9ZixuLmNpcmNsZT1tO2Zvcih2YXIgeT1udWxsLE09aWwuXztNOylpZihtLnk8TS55fHxtLnk9PT1NLnkmJm0ueDw9TS54KXtpZighTS5MKXt5PU0uUDticmVha31NPU0uTH1lbHNle2lmKCFNLlIpe3k9TTticmVha31NPU0uUn1pbC5pbnNlcnQoeSxtKSx5fHwodWw9bSl9fX19ZnVuY3Rpb24gWHIobil7dmFyIHQ9bi5jaXJjbGU7dCYmKHQuUHx8KHVsPXQuTiksaWwucmVtb3ZlKHQpLGFsLnB1c2godCksdHUodCksbi5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24gJHIobil7Zm9yKHZhciB0LGU9dGwscj1PZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKSx1PWUubGVuZ3RoO3UtLTspdD1lW3VdLCghQnIodCxuKXx8IXIodCl8fHZhKHQuYS54LXQuYi54KTxUYSYmdmEodC5hLnktdC5iLnkpPFRhKSYmKHQuYT10LmI9bnVsbCxlLnNwbGljZSh1LDEpKX1mdW5jdGlvbiBCcihuLHQpe3ZhciBlPW4uYjtpZihlKXJldHVybiEwO3ZhciByLHUsaT1uLmEsbz10WzBdWzBdLGE9dFsxXVswXSxjPXRbMF1bMV0sbD10WzFdWzFdLHM9bi5sLGY9bi5yLGg9cy54LGc9cy55LHA9Zi54LHY9Zi55LGQ9KGgrcCkvMixtPShnK3YpLzI7aWYodj09PWcpe2lmKG8+ZHx8ZD49YSlyZXR1cm47aWYoaD5wKXtpZihpKXtpZihpLnk+PWwpcmV0dXJufWVsc2UgaT17eDpkLHk6Y307ZT17eDpkLHk6bH19ZWxzZXtpZihpKXtpZihpLnk8YylyZXR1cm59ZWxzZSBpPXt4OmQseTpsfTtlPXt4OmQseTpjfX19ZWxzZSBpZihyPShoLXApLyh2LWcpLHU9bS1yKmQsLTE+cnx8cj4xKWlmKGg+cCl7aWYoaSl7aWYoaS55Pj1sKXJldHVybn1lbHNlIGk9e3g6KGMtdSkvcix5OmN9O2U9e3g6KGwtdSkvcix5Omx9fWVsc2V7aWYoaSl7aWYoaS55PGMpcmV0dXJufWVsc2UgaT17eDoobC11KS9yLHk6bH07ZT17eDooYy11KS9yLHk6Y319ZWxzZSBpZih2Pmcpe2lmKGkpe2lmKGkueD49YSlyZXR1cm59ZWxzZSBpPXt4Om8seTpyKm8rdX07ZT17eDphLHk6ciphK3V9fWVsc2V7aWYoaSl7aWYoaS54PG8pcmV0dXJufWVsc2UgaT17eDphLHk6ciphK3V9O2U9e3g6byx5OnIqbyt1fX1yZXR1cm4gbi5hPWksbi5iPWUsITB9ZnVuY3Rpb24gV3Iobix0KXt0aGlzLmw9bix0aGlzLnI9dCx0aGlzLmE9dGhpcy5iPW51bGx9ZnVuY3Rpb24gSnIobix0LGUscil7dmFyIHU9bmV3IFdyKG4sdCk7cmV0dXJuIHRsLnB1c2godSksZSYmS3IodSxuLHQsZSksciYmS3IodSx0LG4sciksZWxbbi5pXS5lZGdlcy5wdXNoKG5ldyBRcih1LG4sdCkpLGVsW3QuaV0uZWRnZXMucHVzaChuZXcgUXIodSx0LG4pKSx1fWZ1bmN0aW9uIEdyKG4sdCxlKXt2YXIgcj1uZXcgV3IobixudWxsKTtyZXR1cm4gci5hPXQsci5iPWUsdGwucHVzaChyKSxyfWZ1bmN0aW9uIEtyKG4sdCxlLHIpe24uYXx8bi5iP24ubD09PWU/bi5iPXI6bi5hPXI6KG4uYT1yLG4ubD10LG4ucj1lKX1mdW5jdGlvbiBRcihuLHQsZSl7dmFyIHI9bi5hLHU9bi5iO3RoaXMuZWRnZT1uLHRoaXMuc2l0ZT10LHRoaXMuYW5nbGU9ZT9NYXRoLmF0YW4yKGUueS10LnksZS54LXQueCk6bi5sPT09dD9NYXRoLmF0YW4yKHUueC1yLngsci55LXUueSk6TWF0aC5hdGFuMihyLngtdS54LHUueS1yLnkpfWZ1bmN0aW9uIG51KCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gdHUobil7bi5VPW4uQz1uLkw9bi5SPW4uUD1uLk49bnVsbH1mdW5jdGlvbiBldShuLHQpe3ZhciBlPXQscj10LlIsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuUj1yLkwsZS5SJiYoZS5SLlU9ZSksci5MPWV9ZnVuY3Rpb24gcnUobix0KXt2YXIgZT10LHI9dC5MLHU9ZS5VO3U/dS5MPT09ZT91Lkw9cjp1LlI9cjpuLl89cixyLlU9dSxlLlU9cixlLkw9ci5SLGUuTCYmKGUuTC5VPWUpLHIuUj1lfWZ1bmN0aW9uIHV1KG4pe2Zvcig7bi5MOyluPW4uTDtyZXR1cm4gbn1mdW5jdGlvbiBpdShuLHQpe3ZhciBlLHIsdSxpPW4uc29ydChvdSkucG9wKCk7Zm9yKHRsPVtdLGVsPW5ldyBBcnJheShuLmxlbmd0aCkscmw9bmV3IG51LGlsPW5ldyBudTs7KWlmKHU9dWwsaSYmKCF1fHxpLnk8dS55fHxpLnk9PT11LnkmJmkueDx1LngpKShpLnghPT1lfHxpLnkhPT1yKSYmKGVsW2kuaV09bmV3IE9yKGkpLGpyKGkpLGU9aS54LHI9aS55KSxpPW4ucG9wKCk7ZWxzZXtpZighdSlicmVhaztVcih1LmFyYyl9dCYmKCRyKHQpLFlyKHQpKTt2YXIgbz17Y2VsbHM6ZWwsZWRnZXM6dGx9O3JldHVybiBybD1pbD10bD1lbD1udWxsLG99ZnVuY3Rpb24gb3Uobix0KXtyZXR1cm4gdC55LW4ueXx8dC54LW4ueH1mdW5jdGlvbiBhdShuLHQsZSl7cmV0dXJuKG4ueC1lLngpKih0Lnktbi55KS0obi54LXQueCkqKGUueS1uLnkpfWZ1bmN0aW9uIGN1KG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gbHUobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBzdSgpe3JldHVybntsZWFmOiEwLG5vZGVzOltdLHBvaW50Om51bGwseDpudWxsLHk6bnVsbH19ZnVuY3Rpb24gZnUobix0LGUscix1LGkpe2lmKCFuKHQsZSxyLHUsaSkpe3ZhciBvPS41KihlK3UpLGE9LjUqKHIraSksYz10Lm5vZGVzO2NbMF0mJmZ1KG4sY1swXSxlLHIsbyxhKSxjWzFdJiZmdShuLGNbMV0sbyxyLHUsYSksY1syXSYmZnUobixjWzJdLGUsYSxvLGkpLGNbM10mJmZ1KG4sY1szXSxvLGEsdSxpKX19ZnVuY3Rpb24gaHUobix0LGUscix1LGksbyl7dmFyIGEsYz0xLzA7cmV0dXJuIGZ1bmN0aW9uIGwobixzLGYsaCxnKXtpZighKHM+aXx8Zj5vfHxyPmh8fHU+Zykpe2lmKHA9bi5wb2ludCl7dmFyIHAsdj10LXBbMF0sZD1lLXBbMV0sbT12KnYrZCpkO2lmKGM+bSl7dmFyIHk9TWF0aC5zcXJ0KGM9bSk7cj10LXksdT1lLXksaT10K3ksbz1lK3ksYT1wfX1mb3IodmFyIE09bi5ub2Rlcyx4PS41KihzK2gpLGI9LjUqKGYrZyksXz10Pj14LHc9ZT49YixTPXc8PDF8XyxrPVMrNDtrPlM7KytTKWlmKG49TVszJlNdKXN3aXRjaCgzJlMpe2Nhc2UgMDpsKG4scyxmLHgsYik7YnJlYWs7Y2FzZSAxOmwobix4LGYsaCxiKTticmVhaztjYXNlIDI6bChuLHMsYix4LGcpO2JyZWFrO2Nhc2UgMzpsKG4seCxiLGgsZyl9fX0obixyLHUsaSxvKSxhfWZ1bmN0aW9uIGd1KG4sdCl7bj10YS5yZ2IobiksdD10YS5yZ2IodCk7dmFyIGU9bi5yLHI9bi5nLHU9bi5iLGk9dC5yLWUsbz10LmctcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4iIyIrTXQoTWF0aC5yb3VuZChlK2kqbikpK010KE1hdGgucm91bmQocitvKm4pKStNdChNYXRoLnJvdW5kKHUrYSpuKSl9fWZ1bmN0aW9uIHB1KG4sdCl7dmFyIGUscj17fSx1PXt9O2ZvcihlIGluIG4pZSBpbiB0P3JbZV09bXUobltlXSx0W2VdKTp1W2VdPW5bZV07Zm9yKGUgaW4gdCllIGluIG58fCh1W2VdPXRbZV0pO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZSBpbiByKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gdnUobix0KXtyZXR1cm4gbj0rbix0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBuKigxLWUpK3QqZX19ZnVuY3Rpb24gZHUobix0KXt2YXIgZSxyLHUsaT1sbC5sYXN0SW5kZXg9c2wubGFzdEluZGV4PTAsbz0tMSxhPVtdLGM9W107Zm9yKG4rPSIiLHQrPSIiOyhlPWxsLmV4ZWMobikpJiYocj1zbC5leGVjKHQpKTspKHU9ci5pbmRleCk+aSYmKHU9dC5zbGljZShpLHUpLGFbb10/YVtvXSs9dTphWysrb109dSksKGU9ZVswXSk9PT0ocj1yWzBdKT9hW29dP2Fbb10rPXI6YVsrK29dPXI6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6dnUoZSxyKX0pKSxpPXNsLmxhc3RJbmRleDtyZXR1cm4gaTx0Lmxlbmd0aCYmKHU9dC5zbGljZShpKSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLGEubGVuZ3RoPDI/Y1swXT8odD1jWzBdLngsZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9KTpmdW5jdGlvbigpe3JldHVybiB0fToodD1jLmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIGUscj0wO3Q+cjsrK3IpYVsoZT1jW3JdKS5pXT1lLngobik7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBtdShuLHQpe2Zvcih2YXIgZSxyPXRhLmludGVycG9sYXRvcnMubGVuZ3RoOy0tcj49MCYmIShlPXRhLmludGVycG9sYXRvcnNbcl0obix0KSk7KTtyZXR1cm4gZX1mdW5jdGlvbiB5dShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPW4ubGVuZ3RoLG89dC5sZW5ndGgsYT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKGU9MDthPmU7KytlKXIucHVzaChtdShuW2VdLHRbZV0pKTtmb3IoO2k+ZTsrK2UpdVtlXT1uW2VdO2Zvcig7bz5lOysrZSl1W2VdPXRbZV07cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlPTA7YT5lOysrZSl1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIE11KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD49dD8wOnQ+PTE/MTpuKHQpfX1mdW5jdGlvbiB4dShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDEtbigxLXQpfX1mdW5jdGlvbiBidShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuLjUqKC41PnQ/bigyKnQpOjItbigyLTIqdCkpfX1mdW5jdGlvbiBfdShuKXtyZXR1cm4gbipufWZ1bmN0aW9uIHd1KG4pe3JldHVybiBuKm4qbn1mdW5jdGlvbiBTdShuKXtpZigwPj1uKXJldHVybiAwO2lmKG4+PTEpcmV0dXJuIDE7dmFyIHQ9bipuLGU9dCpuO3JldHVybiA0KiguNT5uP2U6Myoobi10KStlLS43NSl9ZnVuY3Rpb24ga3Uobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBFdShuKXtyZXR1cm4gMS1NYXRoLmNvcyhuKmphKX1mdW5jdGlvbiBBdShuKXtyZXR1cm4gTWF0aC5wb3coMiwxMCoobi0xKSl9ZnVuY3Rpb24gTnUobil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtbipuKX1mdW5jdGlvbiBDdShuLHQpe3ZhciBlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PS40NSksYXJndW1lbnRzLmxlbmd0aD9lPXQvUGEqTWF0aC5hc2luKDEvbik6KG49MSxlPXQvNCksZnVuY3Rpb24ocil7cmV0dXJuIDErbipNYXRoLnBvdygyLC0xMCpyKSpNYXRoLnNpbigoci1lKSpQYS90KX19ZnVuY3Rpb24genUobil7cmV0dXJuIG58fChuPTEuNzAxNTgpLGZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKChuKzEpKnQtbil9fWZ1bmN0aW9uIHF1KG4pe3JldHVybiAxLzIuNzU+bj83LjU2MjUqbipuOjIvMi43NT5uPzcuNTYyNSoobi09MS41LzIuNzUpKm4rLjc1OjIuNS8yLjc1Pm4/Ny41NjI1KihuLT0yLjI1LzIuNzUpKm4rLjkzNzU6Ny41NjI1KihuLT0yLjYyNS8yLjc1KSpuKy45ODQzNzV9ZnVuY3Rpb24gTHUobix0KXtuPXRhLmhjbChuKSx0PXRhLmhjbCh0KTt2YXIgZT1uLmgscj1uLmMsdT1uLmwsaT10LmgtZSxvPXQuYy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5jOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGx0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gVHUobix0KXtuPXRhLmhzbChuKSx0PXRhLmhzbCh0KTt2YXIgZT1uLmgscj1uLnMsdT1uLmwsaT10LmgtZSxvPXQucy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5zOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGF0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gUnUobix0KXtuPXRhLmxhYihuKSx0PXRhLmxhYih0KTt2YXIgZT1uLmwscj1uLmEsdT1uLmIsaT10LmwtZSxvPXQuYS1yLGE9dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBmdChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIER1KG4sdCl7cmV0dXJuIHQtPW4sZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQobit0KmUpfX1mdW5jdGlvbiBQdShuKXt2YXIgdD1bbi5hLG4uYl0sZT1bbi5jLG4uZF0scj1qdSh0KSx1PVV1KHQsZSksaT1qdShGdShlLHQsLXUpKXx8MDt0WzBdKmVbMV08ZVswXSp0WzFdJiYodFswXSo9LTEsdFsxXSo9LTEscio9LTEsdSo9LTEpLHRoaXMucm90YXRlPShyP01hdGguYXRhbjIodFsxXSx0WzBdKTpNYXRoLmF0YW4yKC1lWzBdLGVbMV0pKSpIYSx0aGlzLnRyYW5zbGF0ZT1bbi5lLG4uZl0sdGhpcy5zY2FsZT1bcixpXSx0aGlzLnNrZXc9aT9NYXRoLmF0YW4yKHUsaSkqSGE6MH1mdW5jdGlvbiBVdShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdfWZ1bmN0aW9uIGp1KG4pe3ZhciB0PU1hdGguc3FydChVdShuLG4pKTtyZXR1cm4gdCYmKG5bMF0vPXQsblsxXS89dCksdH1mdW5jdGlvbiBGdShuLHQsZSl7cmV0dXJuIG5bMF0rPWUqdFswXSxuWzFdKz1lKnRbMV0sbn1mdW5jdGlvbiBIdShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPXRhLnRyYW5zZm9ybShuKSxvPXRhLnRyYW5zZm9ybSh0KSxhPWkudHJhbnNsYXRlLGM9by50cmFuc2xhdGUsbD1pLnJvdGF0ZSxzPW8ucm90YXRlLGY9aS5za2V3LGg9by5za2V3LGc9aS5zY2FsZSxwPW8uc2NhbGU7cmV0dXJuIGFbMF0hPWNbMF18fGFbMV0hPWNbMV0/KHIucHVzaCgidHJhbnNsYXRlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aToxLHg6dnUoYVswXSxjWzBdKX0se2k6Myx4OnZ1KGFbMV0sY1sxXSl9KSk6Y1swXXx8Y1sxXT9yLnB1c2goInRyYW5zbGF0ZSgiK2MrIikiKTpyLnB1c2goIiIpLGwhPXM/KGwtcz4xODA/cys9MzYwOnMtbD4xODAmJihsKz0zNjApLHUucHVzaCh7aTpyLnB1c2goci5wb3AoKSsicm90YXRlKCIsbnVsbCwiKSIpLTIseDp2dShsLHMpfSkpOnMmJnIucHVzaChyLnBvcCgpKyJyb3RhdGUoIitzKyIpIiksZiE9aD91LnB1c2goe2k6ci5wdXNoKHIucG9wKCkrInNrZXdYKCIsbnVsbCwiKSIpLTIseDp2dShmLGgpfSk6aCYmci5wdXNoKHIucG9wKCkrInNrZXdYKCIraCsiKSIpLGdbMF0hPXBbMF18fGdbMV0hPXBbMV0/KGU9ci5wdXNoKHIucG9wKCkrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aTplLTQseDp2dShnWzBdLHBbMF0pfSx7aTplLTIseDp2dShnWzFdLHBbMV0pfSkpOigxIT1wWzBdfHwxIT1wWzFdKSYmci5wdXNoKHIucG9wKCkrInNjYWxlKCIrcCsiKSIpLGU9dS5sZW5ndGgsZnVuY3Rpb24obil7Zm9yKHZhciB0LGk9LTE7KytpPGU7KXJbKHQ9dVtpXSkuaV09dC54KG4pO3JldHVybiByLmpvaW4oIiIpfX1mdW5jdGlvbiBPdShuLHQpe3JldHVybiB0PSh0LT1uPStuKXx8MS90LGZ1bmN0aW9uKGUpe3JldHVybihlLW4pL3R9fWZ1bmN0aW9uIFl1KG4sdCl7cmV0dXJuIHQ9KHQtPW49K24pfHwxL3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSwoZS1uKS90KSl9fWZ1bmN0aW9uIEl1KG4pe2Zvcih2YXIgdD1uLnNvdXJjZSxlPW4udGFyZ2V0LHI9VnUodCxlKSx1PVt0XTt0IT09cjspdD10LnBhcmVudCx1LnB1c2godCk7Zm9yKHZhciBpPXUubGVuZ3RoO2UhPT1yOyl1LnNwbGljZShpLDAsZSksZT1lLnBhcmVudDtyZXR1cm4gdX1mdW5jdGlvbiBadShuKXtmb3IodmFyIHQ9W10sZT1uLnBhcmVudDtudWxsIT1lOyl0LnB1c2gobiksbj1lLGU9ZS5wYXJlbnQ7cmV0dXJuIHQucHVzaChuKSx0fWZ1bmN0aW9uIFZ1KG4sdCl7aWYobj09PXQpcmV0dXJuIG47Zm9yKHZhciBlPVp1KG4pLHI9WnUodCksdT1lLnBvcCgpLGk9ci5wb3AoKSxvPW51bGw7dT09PWk7KW89dSx1PWUucG9wKCksaT1yLnBvcCgpO3JldHVybiBvfWZ1bmN0aW9uIFh1KG4pe24uZml4ZWR8PTJ9ZnVuY3Rpb24gJHUobil7bi5maXhlZCY9LTd9ZnVuY3Rpb24gQnUobil7bi5maXhlZHw9NCxuLnB4PW4ueCxuLnB5PW4ueX1mdW5jdGlvbiBXdShuKXtuLmZpeGVkJj0tNX1mdW5jdGlvbiBKdShuLHQsZSl7dmFyIHI9MCx1PTA7aWYobi5jaGFyZ2U9MCwhbi5sZWFmKWZvcih2YXIgaSxvPW4ubm9kZXMsYT1vLmxlbmd0aCxjPS0xOysrYzxhOylpPW9bY10sbnVsbCE9aSYmKEp1KGksdCxlKSxuLmNoYXJnZSs9aS5jaGFyZ2Uscis9aS5jaGFyZ2UqaS5jeCx1Kz1pLmNoYXJnZSppLmN5KTtpZihuLnBvaW50KXtuLmxlYWZ8fChuLnBvaW50LngrPU1hdGgucmFuZG9tKCktLjUsbi5wb2ludC55Kz1NYXRoLnJhbmRvbSgpLS41KTt2YXIgbD10KmVbbi5wb2ludC5pbmRleF07bi5jaGFyZ2UrPW4ucG9pbnRDaGFyZ2U9bCxyKz1sKm4ucG9pbnQueCx1Kz1sKm4ucG9pbnQueX1uLmN4PXIvbi5jaGFyZ2Usbi5jeT11L24uY2hhcmdlfWZ1bmN0aW9uIEd1KG4sdCl7cmV0dXJuIHRhLnJlYmluZChuLHQsInNvcnQiLCJjaGlsZHJlbiIsInZhbHVlIiksbi5ub2Rlcz1uLG4ubGlua3M9cmksbn1mdW5jdGlvbiBLdShuLHQpe2Zvcih2YXIgZT1bbl07bnVsbCE9KG49ZS5wb3AoKSk7KWlmKHQobiksKHU9bi5jaGlsZHJlbikmJihyPXUubGVuZ3RoKSlmb3IodmFyIHIsdTstLXI+PTA7KWUucHVzaCh1W3JdKX1mdW5jdGlvbiBRdShuLHQpe2Zvcih2YXIgZT1bbl0scj1bXTtudWxsIT0obj1lLnBvcCgpKTspaWYoci5wdXNoKG4pLChpPW4uY2hpbGRyZW4pJiYodT1pLmxlbmd0aCkpZm9yKHZhciB1LGksbz0tMTsrK288dTspZS5wdXNoKGlbb10pO2Zvcig7bnVsbCE9KG49ci5wb3AoKSk7KXQobil9ZnVuY3Rpb24gbmkobil7cmV0dXJuIG4uY2hpbGRyZW59ZnVuY3Rpb24gdGkobil7cmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gZWkobix0KXtyZXR1cm4gdC52YWx1ZS1uLnZhbHVlfWZ1bmN0aW9uIHJpKG4pe3JldHVybiB0YS5tZXJnZShuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi5jaGlsZHJlbnx8W10pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOm4sdGFyZ2V0OnR9fSl9KSl9ZnVuY3Rpb24gdWkobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBpaShuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIG9pKG4sdCxlKXtuLnkwPXQsbi55PWV9ZnVuY3Rpb24gYWkobil7cmV0dXJuIHRhLnJhbmdlKG4ubGVuZ3RoKX1mdW5jdGlvbiBjaShuKXtmb3IodmFyIHQ9LTEsZT1uWzBdLmxlbmd0aCxyPVtdOysrdDxlOylyW3RdPTA7cmV0dXJuIHJ9ZnVuY3Rpb24gbGkobil7Zm9yKHZhciB0LGU9MSxyPTAsdT1uWzBdWzFdLGk9bi5sZW5ndGg7aT5lOysrZSkodD1uW2VdWzFdKT51JiYocj1lLHU9dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gc2kobil7cmV0dXJuIG4ucmVkdWNlKGZpLDApfWZ1bmN0aW9uIGZpKG4sdCl7cmV0dXJuIG4rdFsxXX1mdW5jdGlvbiBoaShuLHQpe3JldHVybiBnaShuLE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIrMSkpfWZ1bmN0aW9uIGdpKG4sdCl7Zm9yKHZhciBlPS0xLHI9K25bMF0sdT0oblsxXS1yKS90LGk9W107KytlPD10OylpW2VdPXUqZStyO3JldHVybiBpfWZ1bmN0aW9uIHBpKG4pe3JldHVyblt0YS5taW4obiksdGEubWF4KG4pXX1mdW5jdGlvbiB2aShuLHQpe3JldHVybiBuLnZhbHVlLXQudmFsdWV9ZnVuY3Rpb24gZGkobix0KXt2YXIgZT1uLl9wYWNrX25leHQ7bi5fcGFja19uZXh0PXQsdC5fcGFja19wcmV2PW4sdC5fcGFja19uZXh0PWUsZS5fcGFja19wcmV2PXR9ZnVuY3Rpb24gbWkobix0KXtuLl9wYWNrX25leHQ9dCx0Ll9wYWNrX3ByZXY9bn1mdW5jdGlvbiB5aShuLHQpe3ZhciBlPXQueC1uLngscj10Lnktbi55LHU9bi5yK3QucjtyZXR1cm4uOTk5KnUqdT5lKmUrcipyfWZ1bmN0aW9uIE1pKG4pe2Z1bmN0aW9uIHQobil7cz1NYXRoLm1pbihuLngtbi5yLHMpLGY9TWF0aC5tYXgobi54K24ucixmKSxoPU1hdGgubWluKG4ueS1uLnIsaCksZz1NYXRoLm1heChuLnkrbi5yLGcpfWlmKChlPW4uY2hpbGRyZW4pJiYobD1lLmxlbmd0aCkpe3ZhciBlLHIsdSxpLG8sYSxjLGwscz0xLzAsZj0tMS8wLGg9MS8wLGc9LTEvMDtpZihlLmZvckVhY2goeGkpLHI9ZVswXSxyLng9LXIucixyLnk9MCx0KHIpLGw+MSYmKHU9ZVsxXSx1Lng9dS5yLHUueT0wLHQodSksbD4yKSlmb3IoaT1lWzJdLHdpKHIsdSxpKSx0KGkpLGRpKHIsaSksci5fcGFja19wcmV2PWksZGkoaSx1KSx1PXIuX3BhY2tfbmV4dCxvPTM7bD5vO28rKyl7d2kocix1LGk9ZVtvXSk7dmFyIHA9MCx2PTEsZD0xO2ZvcihhPXUuX3BhY2tfbmV4dDthIT09dTthPWEuX3BhY2tfbmV4dCx2KyspaWYoeWkoYSxpKSl7cD0xO2JyZWFrfWlmKDE9PXApZm9yKGM9ci5fcGFja19wcmV2O2MhPT1hLl9wYWNrX3ByZXYmJiF5aShjLGkpO2M9Yy5fcGFja19wcmV2LGQrKyk7cD8oZD52fHx2PT1kJiZ1LnI8ci5yP21pKHIsdT1hKTptaShyPWMsdSksby0tKTooZGkocixpKSx1PWksdChpKSl9dmFyIG09KHMrZikvMix5PShoK2cpLzIsTT0wO2ZvcihvPTA7bD5vO28rKylpPWVbb10saS54LT1tLGkueS09eSxNPU1hdGgubWF4KE0saS5yK01hdGguc3FydChpLngqaS54K2kueSppLnkpKTtuLnI9TSxlLmZvckVhY2goYmkpfX1mdW5jdGlvbiB4aShuKXtuLl9wYWNrX25leHQ9bi5fcGFja19wcmV2PW59ZnVuY3Rpb24gYmkobil7ZGVsZXRlIG4uX3BhY2tfbmV4dCxkZWxldGUgbi5fcGFja19wcmV2fWZ1bmN0aW9uIF9pKG4sdCxlLHIpe3ZhciB1PW4uY2hpbGRyZW47aWYobi54PXQrPXIqbi54LG4ueT1lKz1yKm4ueSxuLnIqPXIsdSlmb3IodmFyIGk9LTEsbz11Lmxlbmd0aDsrK2k8bzspX2kodVtpXSx0LGUscil9ZnVuY3Rpb24gd2kobix0LGUpe3ZhciByPW4ucitlLnIsdT10Lngtbi54LGk9dC55LW4ueTtpZihyJiYodXx8aSkpe3ZhciBvPXQucitlLnIsYT11KnUraSppO28qPW8scio9cjt2YXIgYz0uNSsoci1vKS8oMiphKSxsPU1hdGguc3FydChNYXRoLm1heCgwLDIqbyoocithKS0oci09YSkqci1vKm8pKS8oMiphKTtlLng9bi54K2MqdStsKmksZS55PW4ueStjKmktbCp1fWVsc2UgZS54PW4ueCtyLGUueT1uLnl9ZnVuY3Rpb24gU2kobix0KXtyZXR1cm4gbi5wYXJlbnQ9PXQucGFyZW50PzE6Mn1mdW5jdGlvbiBraShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0Lmxlbmd0aD90WzBdOm4udH1mdW5jdGlvbiBFaShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuKHQ9ZS5sZW5ndGgpP2VbdC0xXTpuLnR9ZnVuY3Rpb24gQWkobix0LGUpe3ZhciByPWUvKHQuaS1uLmkpO3QuYy09cix0LnMrPWUsbi5jKz1yLHQueis9ZSx0Lm0rPWV9ZnVuY3Rpb24gTmkobil7Zm9yKHZhciB0LGU9MCxyPTAsdT1uLmNoaWxkcmVuLGk9dS5sZW5ndGg7LS1pPj0wOyl0PXVbaV0sdC56Kz1lLHQubSs9ZSxlKz10LnMrKHIrPXQuYyl9ZnVuY3Rpb24gQ2kobix0LGUpe3JldHVybiBuLmEucGFyZW50PT09dC5wYXJlbnQ/bi5hOmV9ZnVuY3Rpb24gemkobil7cmV0dXJuIDErdGEubWF4KG4sZnVuY3Rpb24obil7cmV0dXJuIG4ueX0pfWZ1bmN0aW9uIHFpKG4pe3JldHVybiBuLnJlZHVjZShmdW5jdGlvbihuLHQpe3JldHVybiBuK3QueH0sMCkvbi5sZW5ndGh9ZnVuY3Rpb24gTGkobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdCYmdC5sZW5ndGg/TGkodFswXSk6bn1mdW5jdGlvbiBUaShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuIGUmJih0PWUubGVuZ3RoKT9UaShlW3QtMV0pOm59ZnVuY3Rpb24gUmkobil7cmV0dXJue3g6bi54LHk6bi55LGR4Om4uZHgsZHk6bi5keX19ZnVuY3Rpb24gRGkobix0KXt2YXIgZT1uLngrdFszXSxyPW4ueSt0WzBdLHU9bi5keC10WzFdLXRbM10saT1uLmR5LXRbMF0tdFsyXTtyZXR1cm4gMD51JiYoZSs9dS8yLHU9MCksMD5pJiYocis9aS8yLGk9MCkse3g6ZSx5OnIsZHg6dSxkeTppfX1mdW5jdGlvbiBQaShuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4gZT50P1t0LGVdOltlLHRdfWZ1bmN0aW9uIFVpKG4pe3JldHVybiBuLnJhbmdlRXh0ZW50P24ucmFuZ2VFeHRlbnQoKTpQaShuLnJhbmdlKCkpfWZ1bmN0aW9uIGppKG4sdCxlLHIpe3ZhciB1PWUoblswXSxuWzFdKSxpPXIodFswXSx0WzFdKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGkodShuKSl9fWZ1bmN0aW9uIEZpKG4sdCl7dmFyIGUscj0wLHU9bi5sZW5ndGgtMSxpPW5bcl0sbz1uW3VdO3JldHVybiBpPm8mJihlPXIscj11LHU9ZSxlPWksaT1vLG89ZSksbltyXT10LmZsb29yKGkpLG5bdV09dC5jZWlsKG8pLG59ZnVuY3Rpb24gSGkobil7cmV0dXJuIG4/e2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKHQvbikqbn0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5jZWlsKHQvbikqbn19OmJsfWZ1bmN0aW9uIE9pKG4sdCxlLHIpe3ZhciB1PVtdLGk9W10sbz0wLGE9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpLTE7Zm9yKG5bYV08blswXSYmKG49bi5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrbzw9YTspdS5wdXNoKGUobltvLTFdLG5bb10pKSxpLnB1c2gocih0W28tMV0sdFtvXSkpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10YS5iaXNlY3Qobix0LDEsYSktMTtyZXR1cm4gaVtlXSh1W2VdKHQpKX19ZnVuY3Rpb24gWWkobix0LGUscil7ZnVuY3Rpb24gdSgpe3ZhciB1PU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKT4yP09pOmppLGM9cj9ZdTpPdTtyZXR1cm4gbz11KG4sdCxjLGUpLGE9dSh0LG4sYyxtdSksaX1mdW5jdGlvbiBpKG4pe3JldHVybiBvKG4pfXZhciBvLGE7cmV0dXJuIGkuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBhKG4pfSxpLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChOdW1iZXIpLHUoKSk6bn0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHUoKSk6dH0saS5yYW5nZVJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBpLnJhbmdlKG4pLmludGVycG9sYXRlKER1KX0saS5jbGFtcD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHUoKSk6cn0saS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0saS50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gWGkobix0KX0saS50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuICRpKG4sdCxlKX0saS5uaWNlPWZ1bmN0aW9uKHQpe3JldHVybiBaaShuLHQpLHUoKX0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFlpKG4sdCxlLHIpfSx1KCl9ZnVuY3Rpb24gSWkobix0KXtyZXR1cm4gdGEucmViaW5kKG4sdCwicmFuZ2UiLCJyYW5nZVJvdW5kIiwiaW50ZXJwb2xhdGUiLCJjbGFtcCIpfWZ1bmN0aW9uIFppKG4sdCl7cmV0dXJuIEZpKG4sSGkoVmkobix0KVsyXSkpfWZ1bmN0aW9uIFZpKG4sdCl7bnVsbD09dCYmKHQ9MTApO3ZhciBlPVBpKG4pLHI9ZVsxXS1lWzBdLHU9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhyL3QpL01hdGguTE4xMCkpLGk9dC9yKnU7cmV0dXJuLjE1Pj1pP3UqPTEwOi4zNT49aT91Kj01Oi43NT49aSYmKHUqPTIpLGVbMF09TWF0aC5jZWlsKGVbMF0vdSkqdSxlWzFdPU1hdGguZmxvb3IoZVsxXS91KSp1Ky41KnUsZVsyXT11LGV9ZnVuY3Rpb24gWGkobix0KXtyZXR1cm4gdGEucmFuZ2UuYXBwbHkodGEsVmkobix0KSl9ZnVuY3Rpb24gJGkobix0LGUpe3ZhciByPVZpKG4sdCk7aWYoZSl7dmFyIHU9bGMuZXhlYyhlKTtpZih1LnNoaWZ0KCksInMiPT09dVs4XSl7dmFyIGk9dGEuZm9ybWF0UHJlZml4KE1hdGgubWF4KHZhKHJbMF0pLHZhKHJbMV0pKSk7cmV0dXJuIHVbN118fCh1WzddPSIuIitCaShpLnNjYWxlKHJbMl0pKSksdVs4XT0iZiIsZT10YS5mb3JtYXQodS5qb2luKCIiKSksZnVuY3Rpb24obil7cmV0dXJuIGUoaS5zY2FsZShuKSkraS5zeW1ib2x9fXVbN118fCh1WzddPSIuIitXaSh1WzhdLHIpKSxlPXUuam9pbigiIil9ZWxzZSBlPSIsLiIrQmkoclsyXSkrImYiO3JldHVybiB0YS5mb3JtYXQoZSl9ZnVuY3Rpb24gQmkobil7cmV0dXJuLU1hdGguZmxvb3IoTWF0aC5sb2cobikvTWF0aC5MTjEwKy4wMSl9ZnVuY3Rpb24gV2kobix0KXt2YXIgZT1CaSh0WzJdKTtyZXR1cm4gbiBpbiBfbD9NYXRoLmFicyhlLUJpKE1hdGgubWF4KHZhKHRbMF0pLHZhKHRbMV0pKSkpKyArKCJlIiE9PW4pOmUtMiooIiUiPT09bil9ZnVuY3Rpb24gSmkobix0LGUscil7ZnVuY3Rpb24gdShuKXtyZXR1cm4oZT9NYXRoLmxvZygwPm4/MDpuKTotTWF0aC5sb2cobj4wPzA6LW4pKS9NYXRoLmxvZyh0KX1mdW5jdGlvbiBpKG4pe3JldHVybiBlP01hdGgucG93KHQsbik6LU1hdGgucG93KHQsLW4pfWZ1bmN0aW9uIG8odCl7cmV0dXJuIG4odSh0KSl9cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBpKG4uaW52ZXJ0KHQpKX0sby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dFswXT49MCxuLmRvbWFpbigocj10Lm1hcChOdW1iZXIpKS5tYXAodSkpLG8pOnJ9LG8uYmFzZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZSxuLmRvbWFpbihyLm1hcCh1KSksbyk6dH0sby5uaWNlPWZ1bmN0aW9uKCl7dmFyIHQ9Rmkoci5tYXAodSksZT9NYXRoOlNsKTtyZXR1cm4gbi5kb21haW4odCkscj10Lm1hcChpKSxvfSxvLnRpY2tzPWZ1bmN0aW9uKCl7dmFyIG49UGkociksbz1bXSxhPW5bMF0sYz1uWzFdLGw9TWF0aC5mbG9vcih1KGEpKSxzPU1hdGguY2VpbCh1KGMpKSxmPXQlMT8yOnQ7aWYoaXNGaW5pdGUocy1sKSl7aWYoZSl7Zm9yKDtzPmw7bCsrKWZvcih2YXIgaD0xO2Y+aDtoKyspby5wdXNoKGkobCkqaCk7by5wdXNoKGkobCkpfWVsc2UgZm9yKG8ucHVzaChpKGwpKTtsKys8czspZm9yKHZhciBoPWYtMTtoPjA7aC0tKW8ucHVzaChpKGwpKmgpO2ZvcihsPTA7b1tsXTxhO2wrKyk7Zm9yKHM9by5sZW5ndGg7b1tzLTFdPmM7cy0tKTtvPW8uc2xpY2UobCxzKX1yZXR1cm4gb30sby50aWNrRm9ybWF0PWZ1bmN0aW9uKG4sdCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHdsO2FyZ3VtZW50cy5sZW5ndGg8Mj90PXdsOiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD10YS5mb3JtYXQodCkpO3ZhciByLGE9TWF0aC5tYXgoLjEsbi9vLnRpY2tzKCkubGVuZ3RoKSxjPWU/KHI9MWUtMTIsTWF0aC5jZWlsKToocj0tMWUtMTIsTWF0aC5mbG9vcik7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuL2koYyh1KG4pK3IpKTw9YT90KG4pOiIifX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEppKG4uY29weSgpLHQsZSxyKX0sSWkobyxuKX1mdW5jdGlvbiBHaShuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih1KHQpKX12YXIgdT1LaSh0KSxpPUtpKDEvdCk7cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBpKG4uaW52ZXJ0KHQpKX0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4uZG9tYWluKChlPXQubWFwKE51bWJlcikpLm1hcCh1KSkscik6ZX0sci50aWNrcz1mdW5jdGlvbihuKXtyZXR1cm4gWGkoZSxuKX0sci50aWNrRm9ybWF0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuICRpKGUsbix0KX0sci5uaWNlPWZ1bmN0aW9uKG4pe3JldHVybiByLmRvbWFpbihaaShlLG4pKX0sci5leHBvbmVudD1mdW5jdGlvbihvKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1LaSh0PW8pLGk9S2koMS90KSxuLmRvbWFpbihlLm1hcCh1KSkscik6dH0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEdpKG4uY29weSgpLHQsZSl9LElpKHIsbil9ZnVuY3Rpb24gS2kobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAwPnQ/LU1hdGgucG93KC10LG4pOk1hdGgucG93KHQsbil9fWZ1bmN0aW9uIFFpKG4sdCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gaVsoKHUuZ2V0KGUpfHwoInJhbmdlIj09PXQudD91LnNldChlLG4ucHVzaChlKSk6MC8wKSktMSklaS5sZW5ndGhdfWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gdGEucmFuZ2Uobi5sZW5ndGgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gdCtlKm59KX12YXIgdSxpLG87cmV0dXJuIGUuZG9tYWluPWZ1bmN0aW9uKHIpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuO249W10sdT1uZXcgYTtmb3IodmFyIGksbz0tMSxjPXIubGVuZ3RoOysrbzxjOyl1LmhhcyhpPXJbb10pfHx1LnNldChpLG4ucHVzaChpKSk7cmV0dXJuIGVbdC50XS5hcHBseShlLHQuYSl9LGUucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bixvPTAsdD17dDoicmFuZ2UiLGE6YXJndW1lbnRzfSxlKTppfSxlLnJhbmdlUG9pbnRzPWZ1bmN0aW9uKHUsYSl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKTt2YXIgYz11WzBdLGw9dVsxXSxzPW4ubGVuZ3RoPDI/KGM9KGMrbCkvMiwwKToobC1jKS8obi5sZW5ndGgtMSthKTtyZXR1cm4gaT1yKGMrcyphLzIscyksbz0wLHQ9e3Q6InJhbmdlUG9pbnRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZVJvdW5kUG9pbnRzPWZ1bmN0aW9uKHUsYSl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKTt2YXIgYz11WzBdLGw9dVsxXSxzPW4ubGVuZ3RoPDI/KGM9bD1NYXRoLnJvdW5kKChjK2wpLzIpLDApOjB8KGwtYykvKG4ubGVuZ3RoLTErYSk7cmV0dXJuIGk9cihjK01hdGgucm91bmQocyphLzIrKGwtYy0obi5sZW5ndGgtMSthKSpzKS8yKSxzKSxvPTAsdD17dDoicmFuZ2VSb3VuZFBvaW50cyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VCYW5kcz1mdW5jdGlvbih1LGEsYyl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKSxhcmd1bWVudHMubGVuZ3RoPDMmJihjPWEpO3ZhciBsPXVbMV08dVswXSxzPXVbbC0wXSxmPXVbMS1sXSxoPShmLXMpLyhuLmxlbmd0aC1hKzIqYyk7cmV0dXJuIGk9cihzK2gqYyxoKSxsJiZpLnJldmVyc2UoKSxvPWgqKDEtYSksdD17dDoicmFuZ2VCYW5kcyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VSb3VuZEJhbmRzPWZ1bmN0aW9uKHUsYSxjKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGM9YSk7dmFyIGw9dVsxXTx1WzBdLHM9dVtsLTBdLGY9dVsxLWxdLGg9TWF0aC5mbG9vcigoZi1zKS8obi5sZW5ndGgtYSsyKmMpKTtyZXR1cm4gaT1yKHMrTWF0aC5yb3VuZCgoZi1zLShuLmxlbmd0aC1hKSpoKS8yKSxoKSxsJiZpLnJldmVyc2UoKSxvPU1hdGgucm91bmQoaCooMS1hKSksdD17dDoicmFuZ2VSb3VuZEJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gb30sZS5yYW5nZUV4dGVudD1mdW5jdGlvbigpe3JldHVybiBQaSh0LmFbMF0pfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gUWkobix0KX0sZS5kb21haW4obil9ZnVuY3Rpb24gbm8ocix1KXtmdW5jdGlvbiBpKCl7dmFyIG49MCx0PXUubGVuZ3RoO2ZvcihhPVtdOysrbjx0OylhW24tMV09dGEucXVhbnRpbGUocixuL3QpO3JldHVybiBvfWZ1bmN0aW9uIG8obil7cmV0dXJuIGlzTmFOKG49K24pP3ZvaWQgMDp1W3RhLmJpc2VjdChhLG4pXX12YXIgYTtyZXR1cm4gby5kb21haW49ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dS5tYXAodCkuZmlsdGVyKGUpLnNvcnQobiksaSgpKTpyfSxvLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4saSgpKTp1fSxvLnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBhfSxvLmludmVydEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gbj11LmluZGV4T2YobiksMD5uP1swLzAsMC8wXTpbbj4wP2Fbbi0xXTpyWzBdLG48YS5sZW5ndGg/YVtuXTpyW3IubGVuZ3RoLTFdXX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG5vKHIsdSl9LGkoKX1mdW5jdGlvbiB0byhuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gZVtNYXRoLm1heCgwLE1hdGgubWluKG8sTWF0aC5mbG9vcihpKih0LW4pKSkpXX1mdW5jdGlvbiB1KCl7cmV0dXJuIGk9ZS5sZW5ndGgvKHQtbiksbz1lLmxlbmd0aC0xLHJ9dmFyIGksbztyZXR1cm4gci5kb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF0sdD0rZVtlLmxlbmd0aC0xXSx1KCkpOltuLHRdfSxyLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdSgpKTplfSxyLmludmVydEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdD1lLmluZGV4T2YodCksdD0wPnQ/MC8wOnQvaStuLFt0LHQrMS9pXX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKG4sdCxlKX0sdSgpfWZ1bmN0aW9uIGVvKG4sdCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZT49ZT90W3RhLmJpc2VjdChuLGUpXTp2b2lkIDB9cmV0dXJuIGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGUpOnR9LGUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuaW5kZXhPZihlKSxbbltlLTFdLG5bZV1dfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gZW8obix0KX0sZX1mdW5jdGlvbiBybyhuKXtmdW5jdGlvbiB0KG4pe3JldHVybitufXJldHVybiB0LmludmVydD10LHQuZG9tYWluPXQucmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZS5tYXAodCksdCk6bn0sdC50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gWGkobix0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuICRpKG4sdCxlKX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHJvKG4pfSx0fWZ1bmN0aW9uIHVvKCl7cmV0dXJuIDB9ZnVuY3Rpb24gaW8obil7cmV0dXJuIG4uaW5uZXJSYWRpdXN9ZnVuY3Rpb24gb28obil7cmV0dXJuIG4ub3V0ZXJSYWRpdXN9ZnVuY3Rpb24gYW8obil7cmV0dXJuIG4uc3RhcnRBbmdsZX1mdW5jdGlvbiBjbyhuKXtyZXR1cm4gbi5lbmRBbmdsZX1mdW5jdGlvbiBsbyhuKXtyZXR1cm4gbiYmbi5wYWRBbmdsZX1mdW5jdGlvbiBzbyhuLHQsZSxyKXtyZXR1cm4obi1lKSp0LSh0LXIpKm4+MD8wOjF9ZnVuY3Rpb24gZm8obix0LGUscix1KXt2YXIgaT1uWzBdLXRbMF0sbz1uWzFdLXRbMV0sYT0odT9yOi1yKS9NYXRoLnNxcnQoaSppK28qbyksYz1hKm8sbD0tYSppLHM9blswXStjLGY9blsxXStsLGg9dFswXStjLGc9dFsxXStsLHA9KHMraCkvMix2PShmK2cpLzIsZD1oLXMsbT1nLWYseT1kKmQrbSptLE09ZS1yLHg9cypnLWgqZixiPSgwPm0/LTE6MSkqTWF0aC5zcXJ0KE0qTSp5LXgqeCksXz0oeCptLWQqYikveSx3PSgteCpkLW0qYikveSxTPSh4Km0rZCpiKS95LGs9KC14KmQrbSpiKS95LEU9Xy1wLEE9dy12LE49Uy1wLEM9ay12O3JldHVybiBFKkUrQSpBPk4qTitDKkMmJihfPVMsdz1rKSxbW18tYyx3LWxdLFtfKmUvTSx3KmUvTV1dfWZ1bmN0aW9uIGhvKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gbygpe2wucHVzaCgiTSIsaShuKHMpLGEpKX1mb3IodmFyIGMsbD1bXSxzPVtdLGY9LTEsaD10Lmxlbmd0aCxnPWt0KGUpLHA9a3Qocik7KytmPGg7KXUuY2FsbCh0aGlzLGM9dFtmXSxmKT9zLnB1c2goWytnLmNhbGwodGhpcyxjLGYpLCtwLmNhbGwodGhpcyxjLGYpXSk6cy5sZW5ndGgmJihvKCkscz1bXSk7cmV0dXJuIHMubGVuZ3RoJiZvKCksbC5sZW5ndGg/bC5qb2luKCIiKTpudWxsfXZhciBlPUFyLHI9TnIsdT1OZSxpPWdvLG89aS5rZXksYT0uNztyZXR1cm4gdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9pPW46KGk9emwuZ2V0KG4pfHxnbykua2V5LHQpOm99LHQudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1uLHQpOmF9LHR9ZnVuY3Rpb24gZ28obil7cmV0dXJuIG4uam9pbigiTCIpfWZ1bmN0aW9uIHBvKG4pe3JldHVybiBnbyhuKSsiWiJ9ZnVuY3Rpb24gdm8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiSCIsKHJbMF0rKHI9blt0XSlbMF0pLzIsIlYiLHJbMV0pO3JldHVybiBlPjEmJnUucHVzaCgiSCIsclswXSksdS5qb2luKCIiKX1mdW5jdGlvbiBtbyhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSx1PVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspdS5wdXNoKCJWIiwocj1uW3RdKVsxXSwiSCIsclswXSk7cmV0dXJuIHUuam9pbigiIil9ZnVuY3Rpb24geW8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiSCIsKHI9blt0XSlbMF0sIlYiLHJbMV0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIE1vKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDQ/Z28obik6blsxXStfbyhuLnNsaWNlKDEsLTEpLHdvKG4sdCkpfWZ1bmN0aW9uIHhvKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDM/Z28obik6blswXStfbygobi5wdXNoKG5bMF0pLG4pLHdvKFtuW24ubGVuZ3RoLTJdXS5jb25jYXQobixbblsxXV0pLHQpKX1mdW5jdGlvbiBibyhuLHQpe3JldHVybiBuLmxlbmd0aDwzP2dvKG4pOm5bMF0rX28obix3byhuLHQpKX1mdW5jdGlvbiBfbyhuLHQpe2lmKHQubGVuZ3RoPDF8fG4ubGVuZ3RoIT10Lmxlbmd0aCYmbi5sZW5ndGghPXQubGVuZ3RoKzIpcmV0dXJuIGdvKG4pO3ZhciBlPW4ubGVuZ3RoIT10Lmxlbmd0aCxyPSIiLHU9blswXSxpPW5bMV0sbz10WzBdLGE9byxjPTE7aWYoZSYmKHIrPSJRIisoaVswXS0yKm9bMF0vMykrIiwiKyhpWzFdLTIqb1sxXS8zKSsiLCIraVswXSsiLCIraVsxXSx1PW5bMV0sYz0yKSx0Lmxlbmd0aD4xKXthPXRbMV0saT1uW2NdLGMrKyxyKz0iQyIrKHVbMF0rb1swXSkrIiwiKyh1WzFdK29bMV0pKyIsIisoaVswXS1hWzBdKSsiLCIrKGlbMV0tYVsxXSkrIiwiK2lbMF0rIiwiK2lbMV07Zm9yKHZhciBsPTI7bDx0Lmxlbmd0aDtsKyssYysrKWk9bltjXSxhPXRbbF0scis9IlMiKyhpWzBdLWFbMF0pKyIsIisoaVsxXS1hWzFdKSsiLCIraVswXSsiLCIraVsxXX1pZihlKXt2YXIgcz1uW2NdO3IrPSJRIisoaVswXSsyKmFbMF0vMykrIiwiKyhpWzFdKzIqYVsxXS8zKSsiLCIrc1swXSsiLCIrc1sxXX1yZXR1cm4gcn1mdW5jdGlvbiB3byhuLHQpe2Zvcih2YXIgZSxyPVtdLHU9KDEtdCkvMixpPW5bMF0sbz1uWzFdLGE9MSxjPW4ubGVuZ3RoOysrYTxjOyllPWksaT1vLG89blthXSxyLnB1c2goW3UqKG9bMF0tZVswXSksdSoob1sxXS1lWzFdKV0pO3JldHVybiByfWZ1bmN0aW9uIFNvKG4pe2lmKG4ubGVuZ3RoPDMpcmV0dXJuIGdvKG4pO3ZhciB0PTEsZT1uLmxlbmd0aCxyPW5bMF0sdT1yWzBdLGk9clsxXSxvPVt1LHUsdSwocj1uWzFdKVswXV0sYT1baSxpLGksclsxXV0sYz1bdSwiLCIsaSwiTCIsTm8oVGwsbyksIiwiLE5vKFRsLGEpXTtmb3Iobi5wdXNoKG5bZS0xXSk7Kyt0PD1lOylyPW5bdF0sby5zaGlmdCgpLG8ucHVzaChyWzBdKSxhLnNoaWZ0KCksYS5wdXNoKHJbMV0pLENvKGMsbyxhKTtyZXR1cm4gbi5wb3AoKSxjLnB1c2goIkwiLHIpLGMuam9pbigiIil9ZnVuY3Rpb24ga28obil7aWYobi5sZW5ndGg8NClyZXR1cm4gZ28obik7Zm9yKHZhciB0LGU9W10scj0tMSx1PW4ubGVuZ3RoLGk9WzBdLG89WzBdOysrcjwzOyl0PW5bcl0saS5wdXNoKHRbMF0pLG8ucHVzaCh0WzFdKTtmb3IoZS5wdXNoKE5vKFRsLGkpKyIsIitObyhUbCxvKSksLS1yOysrcjx1Oyl0PW5bcl0saS5zaGlmdCgpLGkucHVzaCh0WzBdKSxvLnNoaWZ0KCksby5wdXNoKHRbMV0pLENvKGUsaSxvKTtyZXR1cm4gZS5qb2luKCIiKX1mdW5jdGlvbiBFbyhuKXtmb3IodmFyIHQsZSxyPS0xLHU9bi5sZW5ndGgsaT11KzQsbz1bXSxhPVtdOysrcjw0OyllPW5bciV1XSxvLnB1c2goZVswXSksYS5wdXNoKGVbMV0pO2Zvcih0PVtObyhUbCxvKSwiLCIsTm8oVGwsYSldLC0tcjsrK3I8aTspZT1uW3IldV0sby5zaGlmdCgpLG8ucHVzaChlWzBdKSxhLnNoaWZ0KCksYS5wdXNoKGVbMV0pLENvKHQsbyxhKTtyZXR1cm4gdC5qb2luKCIiKX1mdW5jdGlvbiBBbyhuLHQpe3ZhciBlPW4ubGVuZ3RoLTE7aWYoZSlmb3IodmFyIHIsdSxpPW5bMF1bMF0sbz1uWzBdWzFdLGE9bltlXVswXS1pLGM9bltlXVsxXS1vLGw9LTE7KytsPD1lOylyPW5bbF0sdT1sL2UsclswXT10KnJbMF0rKDEtdCkqKGkrdSphKSxyWzFdPXQqclsxXSsoMS10KSoobyt1KmMpO3JldHVybiBTbyhuKX1mdW5jdGlvbiBObyhuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXStuWzNdKnRbM119ZnVuY3Rpb24gQ28obix0LGUpe24ucHVzaCgiQyIsTm8ocWwsdCksIiwiLE5vKHFsLGUpLCIsIixObyhMbCx0KSwiLCIsTm8oTGwsZSksIiwiLE5vKFRsLHQpLCIsIixObyhUbCxlKSl9ZnVuY3Rpb24gem8obix0KXtyZXR1cm4odFsxXS1uWzFdKS8odFswXS1uWzBdKX1mdW5jdGlvbiBxbyhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLTEscj1bXSx1PW5bMF0saT1uWzFdLG89clswXT16byh1LGkpOysrdDxlOylyW3RdPShvKyhvPXpvKHU9aSxpPW5bdCsxXSkpKS8yO3JldHVybiByW3RdPW8scn1mdW5jdGlvbiBMbyhuKXtmb3IodmFyIHQsZSxyLHUsaT1bXSxvPXFvKG4pLGE9LTEsYz1uLmxlbmd0aC0xOysrYTxjOyl0PXpvKG5bYV0sblthKzFdKSx2YSh0KTxUYT9vW2FdPW9bYSsxXT0wOihlPW9bYV0vdCxyPW9bYSsxXS90LHU9ZSplK3Iqcix1PjkmJih1PTMqdC9NYXRoLnNxcnQodSksb1thXT11KmUsb1thKzFdPXUqcikpO2ZvcihhPS0xOysrYTw9YzspdT0obltNYXRoLm1pbihjLGErMSldWzBdLW5bTWF0aC5tYXgoMCxhLTEpXVswXSkvKDYqKDErb1thXSpvW2FdKSksaS5wdXNoKFt1fHwwLG9bYV0qdXx8MF0pO3JldHVybiBpfWZ1bmN0aW9uIFRvKG4pe3JldHVybiBuLmxlbmd0aDwzP2dvKG4pOm5bMF0rX28obixMbyhuKSl9ZnVuY3Rpb24gUm8obil7Zm9yKHZhciB0LGUscix1PS0xLGk9bi5sZW5ndGg7Kyt1PGk7KXQ9blt1XSxlPXRbMF0scj10WzFdLWphLHRbMF09ZSpNYXRoLmNvcyhyKSx0WzFdPWUqTWF0aC5zaW4ocik7cmV0dXJuIG59ZnVuY3Rpb24gRG8obil7ZnVuY3Rpb24gdCh0KXtmdW5jdGlvbiBjKCl7di5wdXNoKCJNIixhKG4obSksZikscyxsKG4oZC5yZXZlcnNlKCkpLGYpLCJaIil9Zm9yKHZhciBoLGcscCx2PVtdLGQ9W10sbT1bXSx5PS0xLE09dC5sZW5ndGgseD1rdChlKSxiPWt0KHUpLF89ZT09PXI/ZnVuY3Rpb24oKXtyZXR1cm4gZ306a3Qociksdz11PT09aT9mdW5jdGlvbigpe3JldHVybiBwfTprdChpKTsrK3k8TTspby5jYWxsKHRoaXMsaD10W3ldLHkpPyhkLnB1c2goW2c9K3guY2FsbCh0aGlzLGgseSkscD0rYi5jYWxsKHRoaXMsaCx5KV0pLG0ucHVzaChbK18uY2FsbCh0aGlzLGgseSksK3cuY2FsbCh0aGlzLGgseSldKSk6ZC5sZW5ndGgmJihjKCksZD1bXSxtPVtdKTtyZXR1cm4gZC5sZW5ndGgmJmMoKSx2Lmxlbmd0aD92LmpvaW4oIiIpOm51bGx9dmFyIGU9QXIscj1Bcix1PTAsaT1OcixvPU5lLGE9Z28sYz1hLmtleSxsPWEscz0iTCIsZj0uNztyZXR1cm4gdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXI9bix0KTpyfSx0LngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC54MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1pPW4sdCk6aX0sdC55MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLHQpOnV9LHQueTE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bix0KTppfSx0LmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bix0KTpvfSx0LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiBuP2E9bjooYT16bC5nZXQobil8fGdvKS5rZXksbD1hLnJldmVyc2V8fGEscz1hLmNsb3NlZD8iTSI6IkwiLHQpOmMKfSx0LnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bix0KTpmfSx0fWZ1bmN0aW9uIFBvKG4pe3JldHVybiBuLnJhZGl1c31mdW5jdGlvbiBVbyhuKXtyZXR1cm5bbi54LG4ueV19ZnVuY3Rpb24gam8obil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10WzBdLHI9dFsxXS1qYTtyZXR1cm5bZSpNYXRoLmNvcyhyKSxlKk1hdGguc2luKHIpXX19ZnVuY3Rpb24gRm8oKXtyZXR1cm4gNjR9ZnVuY3Rpb24gSG8oKXtyZXR1cm4iY2lyY2xlIn1mdW5jdGlvbiBPbyhuKXt2YXIgdD1NYXRoLnNxcnQobi9EYSk7cmV0dXJuIk0wLCIrdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIistdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIit0KyJaIn1mdW5jdGlvbiBZbyhuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdCxlOyh0PXRoaXNbbl0pJiYoZT10W3QuYWN0aXZlXSkmJigtLXQuY291bnQ/KGRlbGV0ZSB0W3QuYWN0aXZlXSx0LmFjdGl2ZSs9LjUpOmRlbGV0ZSB0aGlzW25dLGUuZXZlbnQmJmUuZXZlbnQuaW50ZXJydXB0LmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGUuaW5kZXgpKX19ZnVuY3Rpb24gSW8obix0LGUpe3JldHVybiB4YShuLEhsKSxuLm5hbWVzcGFjZT10LG4uaWQ9ZSxufWZ1bmN0aW9uIFpvKG4sdCxlLHIpe3ZhciB1PW4uaWQsaT1uLm5hbWVzcGFjZTtyZXR1cm4gSChuLCJmdW5jdGlvbiI9PXR5cGVvZiBlP2Z1bmN0aW9uKG4sbyxhKXtuW2ldW3VdLnR3ZWVuLnNldCh0LHIoZS5jYWxsKG4sbi5fX2RhdGFfXyxvLGEpKSl9OihlPXIoZSksZnVuY3Rpb24obil7bltpXVt1XS50d2Vlbi5zZXQodCxlKX0pKX1mdW5jdGlvbiBWbyhuKXtyZXR1cm4gbnVsbD09biYmKG49IiIpLGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD1ufX1mdW5jdGlvbiBYbyhuKXtyZXR1cm4gbnVsbD09bj8iX190cmFuc2l0aW9uX18iOiJfX3RyYW5zaXRpb25fIituKyJfXyJ9ZnVuY3Rpb24gJG8obix0LGUscix1KXt2YXIgaT1uW2VdfHwobltlXT17YWN0aXZlOjAsY291bnQ6MH0pLG89aVtyXTtpZighbyl7dmFyIGM9dS50aW1lO289aVtyXT17dHdlZW46bmV3IGEsdGltZTpjLGRlbGF5OnUuZGVsYXksZHVyYXRpb246dS5kdXJhdGlvbixlYXNlOnUuZWFzZSxpbmRleDp0fSx1PW51bGwsKytpLmNvdW50LHRhLnRpbWVyKGZ1bmN0aW9uKHUpe2Z1bmN0aW9uIGEoZSl7aWYoaS5hY3RpdmU+cilyZXR1cm4gcygpO3ZhciB1PWlbaS5hY3RpdmVdO3UmJigtLWkuY291bnQsZGVsZXRlIGlbaS5hY3RpdmVdLHUuZXZlbnQmJnUuZXZlbnQuaW50ZXJydXB0LmNhbGwobixuLl9fZGF0YV9fLHUuaW5kZXgpKSxpLmFjdGl2ZT1yLG8uZXZlbnQmJm8uZXZlbnQuc3RhcnQuY2FsbChuLG4uX19kYXRhX18sdCksby50d2Vlbi5mb3JFYWNoKGZ1bmN0aW9uKGUscil7KHI9ci5jYWxsKG4sbi5fX2RhdGFfXyx0KSkmJnYucHVzaChyKX0pLGg9by5lYXNlLGY9by5kdXJhdGlvbix0YS50aW1lcihmdW5jdGlvbigpe3JldHVybiBwLmM9bChlfHwxKT9OZTpsLDF9LDAsYyl9ZnVuY3Rpb24gbChlKXtpZihpLmFjdGl2ZSE9PXIpcmV0dXJuIDE7Zm9yKHZhciB1PWUvZixhPWgodSksYz12Lmxlbmd0aDtjPjA7KXZbLS1jXS5jYWxsKG4sYSk7cmV0dXJuIHU+PTE/KG8uZXZlbnQmJm8uZXZlbnQuZW5kLmNhbGwobixuLl9fZGF0YV9fLHQpLHMoKSk6dm9pZCAwfWZ1bmN0aW9uIHMoKXtyZXR1cm4tLWkuY291bnQ/ZGVsZXRlIGlbcl06ZGVsZXRlIG5bZV0sMX12YXIgZixoLGc9by5kZWxheSxwPW9jLHY9W107cmV0dXJuIHAudD1nK2MsdT49Zz9hKHUtZyk6KHAuYz1hLHZvaWQgMCl9LDAsYyl9fWZ1bmN0aW9uIEJvKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIiwwKSJ9KX1mdW5jdGlvbiBXbyhuLHQsZSl7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3ZhciByPXQobik7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIikifSl9ZnVuY3Rpb24gSm8obil7cmV0dXJuIG4udG9JU09TdHJpbmcoKX1mdW5jdGlvbiBHbyhuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih0KX1mdW5jdGlvbiB1KG4sZSl7dmFyIHI9blsxXS1uWzBdLHU9ci9lLGk9dGEuYmlzZWN0KFdsLHUpO3JldHVybiBpPT1XbC5sZW5ndGg/W3QueWVhcixWaShuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi8zMTUzNmU2fSksZSlbMl1dOmk/dFt1L1dsW2ktMV08V2xbaV0vdT9pLTE6aV06W0tsLFZpKG4sZSlbMl1dfXJldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gS28obi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4odCkscik6bi5kb21haW4oKS5tYXAoS28pfSxyLm5pY2U9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiFpc05hTihlKSYmIW4ucmFuZ2UoZSxLbygrZSsxKSx0KS5sZW5ndGh9dmFyIGk9ci5kb21haW4oKSxvPVBpKGkpLGE9bnVsbD09bj91KG8sMTApOiJudW1iZXIiPT10eXBlb2YgbiYmdShvLG4pO3JldHVybiBhJiYobj1hWzBdLHQ9YVsxXSksci5kb21haW4oRmkoaSx0PjE/e2Zsb29yOmZ1bmN0aW9uKHQpe2Zvcig7ZSh0PW4uZmxvb3IodCkpOyl0PUtvKHQtMSk7cmV0dXJuIHR9LGNlaWw6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5jZWlsKHQpKTspdD1LbygrdCsxKTtyZXR1cm4gdH19Om4pKX0sci50aWNrcz1mdW5jdGlvbihuLHQpe3ZhciBlPVBpKHIuZG9tYWluKCkpLGk9bnVsbD09bj91KGUsMTApOiJudW1iZXIiPT10eXBlb2Ygbj91KGUsbik6IW4ucmFuZ2UmJlt7cmFuZ2U6bn0sdF07cmV0dXJuIGkmJihuPWlbMF0sdD1pWzFdKSxuLnJhbmdlKGVbMF0sS28oK2VbMV0rMSksMT50PzE6dCl9LHIudGlja0Zvcm1hdD1mdW5jdGlvbigpe3JldHVybiBlfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gR28obi5jb3B5KCksdCxlKX0sSWkocixuKX1mdW5jdGlvbiBLbyhuKXtyZXR1cm4gbmV3IERhdGUobil9ZnVuY3Rpb24gUW8obil7cmV0dXJuIEpTT04ucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIG5hKG4pe3ZhciB0PXVhLmNyZWF0ZVJhbmdlKCk7cmV0dXJuIHQuc2VsZWN0Tm9kZSh1YS5ib2R5KSx0LmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChuLnJlc3BvbnNlVGV4dCl9dmFyIHRhPXt2ZXJzaW9uOiIzLjUuMiJ9O0RhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KTt2YXIgZWE9W10uc2xpY2UscmE9ZnVuY3Rpb24obil7cmV0dXJuIGVhLmNhbGwobil9LHVhPWRvY3VtZW50LGlhPXVhLmRvY3VtZW50RWxlbWVudCxvYT13aW5kb3c7dHJ5e3JhKGlhLmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKGFhKXtyYT1mdW5jdGlvbihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1uZXcgQXJyYXkodCk7dC0tOyllW3RdPW5bdF07cmV0dXJuIGV9fXRyeXt1YS5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsMCwiIil9Y2F0Y2goY2Epe3ZhciBsYT1vYS5FbGVtZW50LnByb3RvdHlwZSxzYT1sYS5zZXRBdHRyaWJ1dGUsZmE9bGEuc2V0QXR0cmlidXRlTlMsaGE9b2EuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsZ2E9aGEuc2V0UHJvcGVydHk7bGEuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKG4sdCl7c2EuY2FsbCh0aGlzLG4sdCsiIil9LGxhLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKG4sdCxlKXtmYS5jYWxsKHRoaXMsbix0LGUrIiIpfSxoYS5zZXRQcm9wZXJ0eT1mdW5jdGlvbihuLHQsZSl7Z2EuY2FsbCh0aGlzLG4sdCsiIixlKX19dGEuYXNjZW5kaW5nPW4sdGEuZGVzY2VuZGluZz1mdW5jdGlvbihuLHQpe3JldHVybiBuPnQ/LTE6dD5uPzE6dD49bj8wOjAvMH0sdGEubWluPWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPW5bdV0pJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9blt1XSkmJmU+ciYmKGU9cil9ZWxzZXtmb3IoOysrdTxpOylpZihudWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZlPnImJihlPXIpfXJldHVybiBlfSx0YS5tYXg9ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmcj5lJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+ZSYmKGU9cil9cmV0dXJuIGV9LHRhLmV4dGVudD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdSxpPS0xLG89bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPG87KWlmKG51bGwhPShyPW5baV0pJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxvOyludWxsIT0ocj1uW2ldKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9ZWxzZXtmb3IoOysraTxvOylpZihudWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmcj49cil7ZT11PXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9dC5jYWxsKG4sbltpXSxpKSkmJihlPnImJihlPXIpLHI+dSYmKHU9cikpfXJldHVybltlLHVdfSx0YS5zdW09ZnVuY3Rpb24obix0KXt2YXIgcix1PTAsaT1uLmxlbmd0aCxvPS0xO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KytvPGk7KWUocj0rbltvXSkmJih1Kz1yKTtlbHNlIGZvcig7KytvPGk7KWUocj0rdC5jYWxsKG4sbltvXSxvKSkmJih1Kz1yKTtyZXR1cm4gdX0sdGEubWVhbj1mdW5jdGlvbihuLHIpe3ZhciB1LGk9MCxvPW4ubGVuZ3RoLGE9LTEsYz1vO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KythPG87KWUodT10KG5bYV0pKT9pKz11Oi0tYztlbHNlIGZvcig7KythPG87KWUodT10KHIuY2FsbChuLG5bYV0sYSkpKT9pKz11Oi0tYztyZXR1cm4gYz9pL2M6dm9pZCAwfSx0YS5xdWFudGlsZT1mdW5jdGlvbihuLHQpe3ZhciBlPShuLmxlbmd0aC0xKSp0KzEscj1NYXRoLmZsb29yKGUpLHU9K25bci0xXSxpPWUtcjtyZXR1cm4gaT91K2kqKG5bcl0tdSk6dX0sdGEubWVkaWFuPWZ1bmN0aW9uKHIsdSl7dmFyIGksbz1bXSxhPXIubGVuZ3RoLGM9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2M8YTspZShpPXQocltjXSkpJiZvLnB1c2goaSk7ZWxzZSBmb3IoOysrYzxhOyllKGk9dCh1LmNhbGwocixyW2NdLGMpKSkmJm8ucHVzaChpKTtyZXR1cm4gby5sZW5ndGg/dGEucXVhbnRpbGUoby5zb3J0KG4pLC41KTp2b2lkIDB9LHRhLnZhcmlhbmNlPWZ1bmN0aW9uKG4scil7dmFyIHUsaSxvPW4ubGVuZ3RoLGE9MCxjPTAsbD0tMSxzPTA7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2w8bzspZSh1PXQobltsXSkpJiYoaT11LWEsYSs9aS8rK3MsYys9aSoodS1hKSk7ZWxzZSBmb3IoOysrbDxvOyllKHU9dChyLmNhbGwobixuW2xdLGwpKSkmJihpPXUtYSxhKz1pLysrcyxjKz1pKih1LWEpKTtyZXR1cm4gcz4xP2MvKHMtMSk6dm9pZCAwfSx0YS5kZXZpYXRpb249ZnVuY3Rpb24oKXt2YXIgbj10YS52YXJpYW5jZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4/TWF0aC5zcXJ0KG4pOm59O3ZhciBwYT1yKG4pO3RhLmJpc2VjdExlZnQ9cGEubGVmdCx0YS5iaXNlY3Q9dGEuYmlzZWN0UmlnaHQ9cGEucmlnaHQsdGEuYmlzZWN0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHIoMT09PXQubGVuZ3RoP2Z1bmN0aW9uKGUscil7cmV0dXJuIG4odChlKSxyKX06dCl9LHRhLnNodWZmbGU9ZnVuY3Rpb24obix0LGUpeyhpPWFyZ3VtZW50cy5sZW5ndGgpPDMmJihlPW4ubGVuZ3RoLDI+aSYmKHQ9MCkpO2Zvcih2YXIgcix1LGk9ZS10O2k7KXU9MHxNYXRoLnJhbmRvbSgpKmktLSxyPW5baSt0XSxuW2krdF09blt1K3RdLG5bdSt0XT1yO3JldHVybiBufSx0YS5wZXJtdXRlPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT1uW3RbZV1dO3JldHVybiByfSx0YS5wYWlycz1mdW5jdGlvbihuKXtmb3IodmFyIHQsZT0wLHI9bi5sZW5ndGgtMSx1PW5bMF0saT1uZXcgQXJyYXkoMD5yPzA6cik7cj5lOylpW2VdPVt0PXUsdT1uWysrZV1dO3JldHVybiBpfSx0YS56aXA9ZnVuY3Rpb24oKXtpZighKHI9YXJndW1lbnRzLmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLHQ9dGEubWluKGFyZ3VtZW50cyx1KSxlPW5ldyBBcnJheSh0KTsrK248dDspZm9yKHZhciByLGk9LTEsbz1lW25dPW5ldyBBcnJheShyKTsrK2k8cjspb1tpXT1hcmd1bWVudHNbaV1bbl07cmV0dXJuIGV9LHRhLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtyZXR1cm4gdGEuemlwLmFwcGx5KHRhLG4pfSx0YS5rZXlzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChlKTtyZXR1cm4gdH0sdGEudmFsdWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChuW2VdKTtyZXR1cm4gdH0sdGEuZW50cmllcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goe2tleTplLHZhbHVlOm5bZV19KTtyZXR1cm4gdH0sdGEubWVyZ2U9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1PW4ubGVuZ3RoLGk9LTEsbz0wOysraTx1OylvKz1uW2ldLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobyk7LS11Pj0wOylmb3Iocj1uW3VdLHQ9ci5sZW5ndGg7LS10Pj0wOyllWy0tb109clt0XTtyZXR1cm4gZX07dmFyIHZhPU1hdGguYWJzO3RhLnJhbmdlPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPTEsYXJndW1lbnRzLmxlbmd0aDwyJiYodD1uLG49MCkpLDEvMD09PSh0LW4pL2UpdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpO3ZhciByLHU9W10sbz1pKHZhKGUpKSxhPS0xO2lmKG4qPW8sdCo9byxlKj1vLDA+ZSlmb3IoOyhyPW4rZSorK2EpPnQ7KXUucHVzaChyL28pO2Vsc2UgZm9yKDsocj1uK2UqKythKTx0Oyl1LnB1c2goci9vKTtyZXR1cm4gdX0sdGEubWFwPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bmV3IGE7aWYobiBpbnN0YW5jZW9mIGEpbi5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7ZS5zZXQobix0KX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShuKSl7dmFyIHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7Kyt1PGk7KWUuc2V0KHUsblt1XSk7ZWxzZSBmb3IoOysrdTxpOyllLnNldCh0LmNhbGwobixyPW5bdV0sdSkscil9ZWxzZSBmb3IodmFyIG8gaW4gbillLnNldChvLG5bb10pO3JldHVybiBlfTt2YXIgZGE9Il9fcHJvdG9fXyIsbWE9Ilx4MDAiO28oYSx7aGFzOnMsZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bYyhuKV19LHNldDpmdW5jdGlvbihuLHQpe3JldHVybiB0aGlzLl9bYyhuKV09dH0scmVtb3ZlOmYsa2V5czpoLHZhbHVlczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHRoaXMuX1t0XSk7cmV0dXJuIG59LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaCh7a2V5OmwodCksdmFsdWU6dGhpcy5fW3RdfSk7cmV0dXJuIG59LHNpemU6ZyxlbXB0eTpwLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxsKHQpLHRoaXMuX1t0XSl9fSksdGEubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxvLGMpe2lmKGM+PWkubGVuZ3RoKXJldHVybiByP3IuY2FsbCh1LG8pOmU/by5zb3J0KGUpOm87Zm9yKHZhciBsLHMsZixoLGc9LTEscD1vLmxlbmd0aCx2PWlbYysrXSxkPW5ldyBhOysrZzxwOykoaD1kLmdldChsPXYocz1vW2ddKSkpP2gucHVzaChzKTpkLnNldChsLFtzXSk7cmV0dXJuIHQ/KHM9dCgpLGY9ZnVuY3Rpb24oZSxyKXtzLnNldChlLG4odCxyLGMpKX0pOihzPXt9LGY9ZnVuY3Rpb24oZSxyKXtzW2VdPW4odCxyLGMpfSksZC5mb3JFYWNoKGYpLHN9ZnVuY3Rpb24gdChuLGUpe2lmKGU+PWkubGVuZ3RoKXJldHVybiBuO3ZhciByPVtdLHU9b1tlKytdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obix1KXtyLnB1c2goe2tleTpuLHZhbHVlczp0KHUsZSl9KX0pLHU/ci5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHUobi5rZXksdC5rZXkpfSk6cn12YXIgZSxyLHU9e30saT1bXSxvPVtdO3JldHVybiB1Lm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuKGUsdCwwKX0sdS5lbnRyaWVzPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4odGEubWFwLGUsMCksMCl9LHUua2V5PWZ1bmN0aW9uKG4pe3JldHVybiBpLnB1c2gobiksdX0sdS5zb3J0S2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gb1tpLmxlbmd0aC0xXT1uLHV9LHUuc29ydFZhbHVlcz1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLHV9LHUucm9sbHVwPWZ1bmN0aW9uKG4pe3JldHVybiByPW4sdX0sdX0sdGEuc2V0PWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyB2O2lmKG4pZm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7KytlKXQuYWRkKG5bZV0pO3JldHVybiB0fSxvKHYse2hhczpzLGFkZDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fW2Mobis9IiIpXT0hMCxufSxyZW1vdmU6Zix2YWx1ZXM6aCxzaXplOmcsZW1wdHk6cCxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5jYWxsKHRoaXMsbCh0KSl9fSksdGEuYmVoYXZpb3I9e30sdGEucmViaW5kPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlLHI9MSx1PWFyZ3VtZW50cy5sZW5ndGg7KytyPHU7KW5bZT1hcmd1bWVudHNbcl1dPWQobix0LHRbZV0pO3JldHVybiBufTt2YXIgeWE9WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07dGEuZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IE0sdD0tMSxlPWFyZ3VtZW50cy5sZW5ndGg7Kyt0PGU7KW5bYXJndW1lbnRzW3RdXT14KG4pO3JldHVybiBufSxNLnByb3RvdHlwZS5vbj1mdW5jdGlvbihuLHQpe3ZhciBlPW4uaW5kZXhPZigiLiIpLHI9IiI7aWYoZT49MCYmKHI9bi5zbGljZShlKzEpLG49bi5zbGljZSgwLGUpKSxuKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1tuXS5vbihyKTp0aGlzW25dLm9uKHIsdCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PXQpZm9yKG4gaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KG4pJiZ0aGlzW25dLm9uKHIsbnVsbCk7cmV0dXJuIHRoaXN9fSx0YS5ldmVudD1udWxsLHRhLnJlcXVvdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZShNYSwiXFwkJiIpfTt2YXIgTWE9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLHhhPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbihuLHQpe24uX19wcm90b19fPXR9OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlIGluIHQpbltlXT10W2VdfSxiYT1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3Iobil9LF9hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChuKX0sd2E9aWEubWF0Y2hlc3x8aWFbbShpYSwibWF0Y2hlc1NlbGVjdG9yIildLFNhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHdhLmNhbGwobix0KX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKGJhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFNpenpsZShuLHQpWzBdfHxudWxsfSxfYT1TaXp6bGUsU2E9U2l6emxlLm1hdGNoZXNTZWxlY3RvciksdGEuc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIE5hfTt2YXIga2E9dGEuc2VsZWN0aW9uLnByb3RvdHlwZT1bXTtrYS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaT1bXTtuPWsobik7Zm9yKHZhciBvPS0xLGE9dGhpcy5sZW5ndGg7KytvPGE7KXtpLnB1c2godD1bXSksdC5wYXJlbnROb2RlPShyPXRoaXNbb10pLnBhcmVudE5vZGU7Zm9yKHZhciBjPS0xLGw9ci5sZW5ndGg7KytjPGw7KSh1PXJbY10pPyh0LnB1c2goZT1uLmNhbGwodSx1Ll9fZGF0YV9fLGMsbykpLGUmJiJfX2RhdGFfXyJpbiB1JiYoZS5fX2RhdGFfXz11Ll9fZGF0YV9fKSk6dC5wdXNoKG51bGwpfXJldHVybiBTKGkpfSxrYS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyPVtdO249RShuKTtmb3IodmFyIHU9LTEsaT10aGlzLmxlbmd0aDsrK3U8aTspZm9yKHZhciBvPXRoaXNbdV0sYT0tMSxjPW8ubGVuZ3RoOysrYTxjOykoZT1vW2FdKSYmKHIucHVzaCh0PXJhKG4uY2FsbChlLGUuX19kYXRhX18sYSx1KSkpLHQucGFyZW50Tm9kZT1lKTtyZXR1cm4gUyhyKX07dmFyIEVhPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTt0YS5ucz17cHJlZml4OkVhLHF1YWxpZnk6ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCI6IiksZT1uO3JldHVybiB0Pj0wJiYoZT1uLnNsaWNlKDAsdCksbj1uLnNsaWNlKHQrMSkpLEVhLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpFYVtlXSxsb2NhbDpufTpufX0sa2EuYXR0cj1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgZT10aGlzLm5vZGUoKTtyZXR1cm4gbj10YS5ucy5xdWFsaWZ5KG4pLG4ubG9jYWw/ZS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmUuZ2V0QXR0cmlidXRlKG4pfWZvcih0IGluIG4pdGhpcy5lYWNoKEEodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChBKG4sdCkpfSxrYS5jbGFzc2VkPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpLHI9KG49eihuKSkubGVuZ3RoLHU9LTE7aWYodD1lLmNsYXNzTGlzdCl7Zm9yKDsrK3U8cjspaWYoIXQuY29udGFpbnMoblt1XSkpcmV0dXJuITF9ZWxzZSBmb3IodD1lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsrK3U8cjspaWYoIUMoblt1XSkudGVzdCh0KSlyZXR1cm4hMTtyZXR1cm4hMH1mb3IodCBpbiBuKXRoaXMuZWFjaChxKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2gocShuLHQpKX0sa2Euc3R5bGU9ZnVuY3Rpb24obix0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5yKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+ciYmKHQ9IiIpO2ZvcihlIGluIG4pdGhpcy5lYWNoKFQoZSxuW2VdLHQpKTtyZXR1cm4gdGhpc31pZigyPnIpcmV0dXJuIG9hLmdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlKCksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtlPSIifXJldHVybiB0aGlzLmVhY2goVChuLHQsZSkpfSxrYS5wcm9wZXJ0eT1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXJldHVybiB0aGlzLm5vZGUoKVtuXTtmb3IodCBpbiBuKXRoaXMuZWFjaChSKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goUihuLHQpKX0sa2EudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oKXt2YXIgdD1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9OmZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD1ufSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LGthLmh0bWw9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09dD8iIjp0fTpudWxsPT1uP2Z1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9IiJ9OmZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9bn0pOnRoaXMubm9kZSgpLmlubmVySFRNTH0sa2EuYXBwZW5kPWZ1bmN0aW9uKG4pe3JldHVybiBuPUQobiksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0sa2EuaW5zZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49RChuKSx0PWsodCksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LGthLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goUCl9LGthLmRhdGE9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSl7dmFyIHIsdSxpLG89bi5sZW5ndGgsZj1lLmxlbmd0aCxoPU1hdGgubWluKG8sZiksZz1uZXcgQXJyYXkoZikscD1uZXcgQXJyYXkoZiksdj1uZXcgQXJyYXkobyk7aWYodCl7dmFyIGQsbT1uZXcgYSx5PW5ldyBBcnJheShvKTtmb3Iocj0tMTsrK3I8bzspbS5oYXMoZD10LmNhbGwodT1uW3JdLHUuX19kYXRhX18scikpP3Zbcl09dTptLnNldChkLHUpLHlbcl09ZDtmb3Iocj0tMTsrK3I8ZjspKHU9bS5nZXQoZD10LmNhbGwoZSxpPWVbcl0scikpKT91IT09ITAmJihnW3JdPXUsdS5fX2RhdGFfXz1pKTpwW3JdPVUoaSksbS5zZXQoZCwhMCk7Zm9yKHI9LTE7KytyPG87KW0uZ2V0KHlbcl0pIT09ITAmJih2W3JdPW5bcl0pfWVsc2V7Zm9yKHI9LTE7KytyPGg7KXU9bltyXSxpPWVbcl0sdT8odS5fX2RhdGFfXz1pLGdbcl09dSk6cFtyXT1VKGkpO2Zvcig7Zj5yOysrcilwW3JdPVUoZVtyXSk7Zm9yKDtvPnI7KytyKXZbcl09bltyXX1wLnVwZGF0ZT1nLHAucGFyZW50Tm9kZT1nLnBhcmVudE5vZGU9di5wYXJlbnROb2RlPW4ucGFyZW50Tm9kZSxjLnB1c2gocCksbC5wdXNoKGcpLHMucHVzaCh2KX12YXIgcix1LGk9LTEsbz10aGlzLmxlbmd0aDtpZighYXJndW1lbnRzLmxlbmd0aCl7Zm9yKG49bmV3IEFycmF5KG89KHI9dGhpc1swXSkubGVuZ3RoKTsrK2k8bzspKHU9cltpXSkmJihuW2ldPXUuX19kYXRhX18pO3JldHVybiBufXZhciBjPU8oW10pLGw9UyhbXSkscz1TKFtdKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbilmb3IoOysraTxvOyllKHI9dGhpc1tpXSxuLmNhbGwocixyLnBhcmVudE5vZGUuX19kYXRhX18saSkpO2Vsc2UgZm9yKDsrK2k8bzspZShyPXRoaXNbaV0sbik7cmV0dXJuIGwuZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gY30sbC5leGl0PWZ1bmN0aW9uKCl7cmV0dXJuIHN9LGx9LGthLmRhdHVtPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIixuKTp0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIpfSxrYS5maWx0ZXI9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9W107ImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPWoobikpO2Zvcih2YXIgaT0wLG89dGhpcy5sZW5ndGg7bz5pO2krKyl7dS5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT0oZT10aGlzW2ldKS5wYXJlbnROb2RlO2Zvcih2YXIgYT0wLGM9ZS5sZW5ndGg7Yz5hO2ErKykocj1lW2FdKSYmbi5jYWxsKHIsci5fX2RhdGFfXyxhLGkpJiZ0LnB1c2gocil9cmV0dXJuIFModSl9LGthLm9yZGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xLHQ9dGhpcy5sZW5ndGg7KytuPHQ7KWZvcih2YXIgZSxyPXRoaXNbbl0sdT1yLmxlbmd0aC0xLGk9clt1XTstLXU+PTA7KShlPXJbdV0pJiYoaSYmaSE9PWUubmV4dFNpYmxpbmcmJmkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxpKSxpPWUpO3JldHVybiB0aGlzfSxrYS5zb3J0PWZ1bmN0aW9uKG4pe249Ri5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Zm9yKHZhciB0PS0xLGU9dGhpcy5sZW5ndGg7Kyt0PGU7KXRoaXNbdF0uc29ydChuKTtyZXR1cm4gdGhpcy5vcmRlcigpfSxrYS5lYWNoPWZ1bmN0aW9uKG4pe3JldHVybiBIKHRoaXMsZnVuY3Rpb24odCxlLHIpe24uY2FsbCh0LHQuX19kYXRhX18sZSxyKX0pfSxrYS5jYWxsPWZ1bmN0aW9uKG4pe3ZhciB0PXJhKGFyZ3VtZW50cyk7cmV0dXJuIG4uYXBwbHkodFswXT10aGlzLHQpLHRoaXN9LGthLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxrYS5ub2RlPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsdD10aGlzLmxlbmd0aDt0Pm47bisrKWZvcih2YXIgZT10aGlzW25dLHI9MCx1PWUubGVuZ3RoO3U+cjtyKyspe3ZhciBpPWVbcl07aWYoaSlyZXR1cm4gaX1yZXR1cm4gbnVsbH0sa2Euc2l6ZT1mdW5jdGlvbigpe3ZhciBuPTA7cmV0dXJuIEgodGhpcyxmdW5jdGlvbigpeysrbn0pLG59O3ZhciBBYT1bXTt0YS5zZWxlY3Rpb24uZW50ZXI9Tyx0YS5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlPUFhLEFhLmFwcGVuZD1rYS5hcHBlbmQsQWEuZW1wdHk9a2EuZW1wdHksQWEubm9kZT1rYS5ub2RlLEFhLmNhbGw9a2EuY2FsbCxBYS5zaXplPWthLnNpemUsQWEuc2VsZWN0PWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG89W10sYT0tMSxjPXRoaXMubGVuZ3RoOysrYTxjOyl7cj0odT10aGlzW2FdKS51cGRhdGUsby5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT11LnBhcmVudE5vZGU7Zm9yKHZhciBsPS0xLHM9dS5sZW5ndGg7KytsPHM7KShpPXVbbF0pPyh0LnB1c2gocltsXT1lPW4uY2FsbCh1LnBhcmVudE5vZGUsaS5fX2RhdGFfXyxsLGEpKSxlLl9fZGF0YV9fPWkuX19kYXRhX18pOnQucHVzaChudWxsKX1yZXR1cm4gUyhvKX0sQWEuaW5zZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9WSh0aGlzKSksa2EuaW5zZXJ0LmNhbGwodGhpcyxuLHQpfSx0YS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQ9WyJzdHJpbmciPT10eXBlb2Ygbj9iYShuLHVhKTpuXTtyZXR1cm4gdC5wYXJlbnROb2RlPWlhLFMoW3RdKX0sdGEuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0PXJhKCJzdHJpbmciPT10eXBlb2Ygbj9fYShuLHVhKTpuKTtyZXR1cm4gdC5wYXJlbnROb2RlPWlhLFMoW3RdKX07dmFyIE5hPXRhLnNlbGVjdChpYSk7a2Eub249ZnVuY3Rpb24obix0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5yKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+ciYmKHQ9ITEpO2ZvcihlIGluIG4pdGhpcy5lYWNoKEkoZSxuW2VdLHQpKTtyZXR1cm4gdGhpc31pZigyPnIpcmV0dXJuKHI9dGhpcy5ub2RlKClbIl9fb24iK25dKSYmci5fO2U9ITF9cmV0dXJuIHRoaXMuZWFjaChJKG4sdCxlKSl9O3ZhciBDYT10YS5tYXAoe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSk7Q2EuZm9yRWFjaChmdW5jdGlvbihuKXsib24iK24gaW4gdWEmJkNhLnJlbW92ZShuKX0pO3ZhciB6YT0ib25zZWxlY3RzdGFydCJpbiB1YT9udWxsOm0oaWEuc3R5bGUsInVzZXJTZWxlY3QiKSxxYT0wO3RhLm1vdXNlPWZ1bmN0aW9uKG4pe3JldHVybiAkKG4sXygpKX07dmFyIExhPS9XZWJLaXQvLnRlc3Qob2EubmF2aWdhdG9yLnVzZXJBZ2VudCk/LTE6MDt0YS50b3VjaD1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT10LHQ9XygpLmNoYW5nZWRUb3VjaGVzKSx0KWZvcih2YXIgcix1PTAsaT10Lmxlbmd0aDtpPnU7Kyt1KWlmKChyPXRbdV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiAkKG4scil9LHRhLmJlaGF2aW9yLmRyYWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dGhpcy5vbigibW91c2Vkb3duLmRyYWciLHUpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLGkpfWZ1bmN0aW9uIHQobix0LHUsaSxvKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIG4sZSxyPXQoaCx2KTtyJiYobj1yWzBdLU1bMF0sZT1yWzFdLU1bMV0scHw9bnxlLE09cixnKHt0eXBlOiJkcmFnIix4OnJbMF0rbFswXSx5OnJbMV0rbFsxXSxkeDpuLGR5OmV9KSl9ZnVuY3Rpb24gYygpe3QoaCx2KSYmKG0ub24oaStkLG51bGwpLm9uKG8rZCxudWxsKSx5KHAmJnRhLmV2ZW50LnRhcmdldD09PWYpLGcoe3R5cGU6ImRyYWdlbmQifSkpfXZhciBsLHM9dGhpcyxmPXRhLmV2ZW50LnRhcmdldCxoPXMucGFyZW50Tm9kZSxnPWUub2Yocyxhcmd1bWVudHMpLHA9MCx2PW4oKSxkPSIuZHJhZyIrKG51bGw9PXY/IiI6Ii0iK3YpLG09dGEuc2VsZWN0KHUoKSkub24oaStkLGEpLm9uKG8rZCxjKSx5PVgoKSxNPXQoaCx2KTtyPyhsPXIuYXBwbHkocyxhcmd1bWVudHMpLGw9W2wueC1NWzBdLGwueS1NWzFdXSk6bD1bMCwwXSxnKHt0eXBlOiJkcmFnc3RhcnQifSl9fXZhciBlPXcobiwiZHJhZyIsImRyYWdzdGFydCIsImRyYWdlbmQiKSxyPW51bGwsdT10KHksdGEubW91c2UsSiwibW91c2Vtb3ZlIiwibW91c2V1cCIpLGk9dChCLHRhLnRvdWNoLFcsInRvdWNobW92ZSIsInRvdWNoZW5kIik7cmV0dXJuIG4ub3JpZ2luPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sdGEucmViaW5kKG4sZSwib24iKX0sdGEudG91Y2hlcz1mdW5jdGlvbihuLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PV8oKS50b3VjaGVzKSx0P3JhKHQpLm1hcChmdW5jdGlvbih0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGUuaWRlbnRpZmllcj10LmlkZW50aWZpZXIsZX0pOltdfTt2YXIgVGE9MWUtNixSYT1UYSpUYSxEYT1NYXRoLlBJLFBhPTIqRGEsVWE9UGEtVGEsamE9RGEvMixGYT1EYS8xODAsSGE9MTgwL0RhLE9hPU1hdGguU1FSVDIsWWE9MixJYT00O3RhLmludGVycG9sYXRlWm9vbT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobil7dmFyIHQ9bip5O2lmKG0pe3ZhciBlPWV0KHYpLG89aS8oWWEqaCkqKGUqcnQoT2EqdCt2KS10dCh2KSk7cmV0dXJuW3IrbypsLHUrbypzLGkqZS9ldChPYSp0K3YpXX1yZXR1cm5bcituKmwsdStuKnMsaSpNYXRoLmV4cChPYSp0KV19dmFyIHI9blswXSx1PW5bMV0saT1uWzJdLG89dFswXSxhPXRbMV0sYz10WzJdLGw9by1yLHM9YS11LGY9bCpsK3MqcyxoPU1hdGguc3FydChmKSxnPShjKmMtaSppK0lhKmYpLygyKmkqWWEqaCkscD0oYypjLWkqaS1JYSpmKS8oMipjKllhKmgpLHY9TWF0aC5sb2coTWF0aC5zcXJ0KGcqZysxKS1nKSxkPU1hdGgubG9nKE1hdGguc3FydChwKnArMSktcCksbT1kLXYseT0obXx8TWF0aC5sb2coYy9pKSkvT2E7cmV0dXJuIGUuZHVyYXRpb249MWUzKnksZX0sdGEuYmVoYXZpb3Iuem9vbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7bi5vbih6LHMpLm9uKFhhKyIuem9vbSIsaCkub24oImRibGNsaWNrLnpvb20iLGcpLm9uKFQsZil9ZnVuY3Rpb24gdChuKXtyZXR1cm5bKG5bMF0tay54KS9rLmssKG5bMV0tay55KS9rLmtdfWZ1bmN0aW9uIGUobil7cmV0dXJuW25bMF0qay5rK2sueCxuWzFdKmsuaytrLnldfWZ1bmN0aW9uIHIobil7ay5rPU1hdGgubWF4KEFbMF0sTWF0aC5taW4oQVsxXSxuKSl9ZnVuY3Rpb24gdShuLHQpe3Q9ZSh0KSxrLngrPW5bMF0tdFswXSxrLnkrPW5bMV0tdFsxXX1mdW5jdGlvbiBpKHQsZSxpLG8pe3QuX19jaGFydF9fPXt4OmsueCx5OmsueSxrOmsua30scihNYXRoLnBvdygyLG8pKSx1KHY9ZSxpKSx0PXRhLnNlbGVjdCh0KSxOPjAmJih0PXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKE4pKSx0LmNhbGwobi5ldmVudCl9ZnVuY3Rpb24gbygpe3gmJnguZG9tYWluKE0ucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay54KS9rLmt9KS5tYXAoTS5pbnZlcnQpKSxTJiZTLmRvbWFpbihfLnJhbmdlKCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLWsueSkvay5rfSkubWFwKF8uaW52ZXJ0KSl9ZnVuY3Rpb24gYShuKXtDKyt8fG4oe3R5cGU6Inpvb21zdGFydCJ9KX1mdW5jdGlvbiBjKG4pe28oKSxuKHt0eXBlOiJ6b29tIixzY2FsZTprLmssdHJhbnNsYXRlOltrLngsay55XX0pfWZ1bmN0aW9uIGwobil7LS1DfHxuKHt0eXBlOiJ6b29tZW5kIn0pLHY9bnVsbH1mdW5jdGlvbiBzKCl7ZnVuY3Rpb24gbigpe3M9MSx1KHRhLm1vdXNlKHIpLGgpLGMobyl9ZnVuY3Rpb24gZSgpe2Yub24ocSxudWxsKS5vbihMLG51bGwpLGcocyYmdGEuZXZlbnQudGFyZ2V0PT09aSksbChvKX12YXIgcj10aGlzLGk9dGEuZXZlbnQudGFyZ2V0LG89Ui5vZihyLGFyZ3VtZW50cykscz0wLGY9dGEuc2VsZWN0KG9hKS5vbihxLG4pLm9uKEwsZSksaD10KHRhLm1vdXNlKHIpKSxnPVgoKTtGbC5jYWxsKHIpLGEobyl9ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIG4oKXt2YXIgbj10YS50b3VjaGVzKHApO3JldHVybiBnPWsuayxuLmZvckVhY2goZnVuY3Rpb24obil7bi5pZGVudGlmaWVyIGluIGQmJihkW24uaWRlbnRpZmllcl09dChuKSl9KSxufWZ1bmN0aW9uIGUoKXt2YXIgdD10YS5ldmVudC50YXJnZXQ7dGEuc2VsZWN0KHQpLm9uKHgsbykub24oXyxoKSx3LnB1c2godCk7Zm9yKHZhciBlPXRhLmV2ZW50LmNoYW5nZWRUb3VjaGVzLHI9MCx1PWUubGVuZ3RoO3U+cjsrK3IpZFtlW3JdLmlkZW50aWZpZXJdPW51bGw7dmFyIGE9bigpLGM9RGF0ZS5ub3coKTtpZigxPT09YS5sZW5ndGgpe2lmKDUwMD5jLXkpe3ZhciBsPWFbMF07aShwLGwsZFtsLmlkZW50aWZpZXJdLE1hdGguZmxvb3IoTWF0aC5sb2coay5rKS9NYXRoLkxOMikrMSksYigpfXk9Y31lbHNlIGlmKGEubGVuZ3RoPjEpe3ZhciBsPWFbMF0scz1hWzFdLGY9bFswXS1zWzBdLGc9bFsxXS1zWzFdO209ZipmK2cqZ319ZnVuY3Rpb24gbygpe3ZhciBuLHQsZSxpLG89dGEudG91Y2hlcyhwKTtGbC5jYWxsKHApO2Zvcih2YXIgYT0wLGw9by5sZW5ndGg7bD5hOysrYSxpPW51bGwpaWYoZT1vW2FdLGk9ZFtlLmlkZW50aWZpZXJdKXtpZih0KWJyZWFrO249ZSx0PWl9aWYoaSl7dmFyIHM9KHM9ZVswXS1uWzBdKSpzKyhzPWVbMV0tblsxXSkqcyxmPW0mJk1hdGguc3FydChzL20pO249WyhuWzBdK2VbMF0pLzIsKG5bMV0rZVsxXSkvMl0sdD1bKHRbMF0raVswXSkvMiwodFsxXStpWzFdKS8yXSxyKGYqZyl9eT1udWxsLHUobix0KSxjKHYpfWZ1bmN0aW9uIGgoKXtpZih0YS5ldmVudC50b3VjaGVzLmxlbmd0aCl7Zm9yKHZhciB0PXRhLmV2ZW50LmNoYW5nZWRUb3VjaGVzLGU9MCxyPXQubGVuZ3RoO3I+ZTsrK2UpZGVsZXRlIGRbdFtlXS5pZGVudGlmaWVyXTtmb3IodmFyIHUgaW4gZClyZXR1cm4gdm9pZCBuKCl9dGEuc2VsZWN0QWxsKHcpLm9uKE0sbnVsbCksUy5vbih6LHMpLm9uKFQsZiksRSgpLGwodil9dmFyIGcscD10aGlzLHY9Ui5vZihwLGFyZ3VtZW50cyksZD17fSxtPTAsTT0iLnpvb20tIit0YS5ldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyLHg9InRvdWNobW92ZSIrTSxfPSJ0b3VjaGVuZCIrTSx3PVtdLFM9dGEuc2VsZWN0KHApLEU9WCgpO2UoKSxhKHYpLFMub24oeixudWxsKS5vbihULGUpfWZ1bmN0aW9uIGgoKXt2YXIgbj1SLm9mKHRoaXMsYXJndW1lbnRzKTttP2NsZWFyVGltZW91dChtKToocD10KHY9ZHx8dGEubW91c2UodGhpcykpLEZsLmNhbGwodGhpcyksYShuKSksbT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bT1udWxsLGwobil9LDUwKSxiKCkscihNYXRoLnBvdygyLC4wMDIqWmEoKSkqay5rKSx1KHYscCksYyhuKX1mdW5jdGlvbiBnKCl7dmFyIG49dGEubW91c2UodGhpcyksZT1NYXRoLmxvZyhrLmspL01hdGguTE4yO2kodGhpcyxuLHQobiksdGEuZXZlbnQuc2hpZnRLZXk/TWF0aC5jZWlsKGUpLTE6TWF0aC5mbG9vcihlKSsxKX12YXIgcCx2LGQsbSx5LE0seCxfLFMsaz17eDowLHk6MCxrOjF9LEU9Wzk2MCw1MDBdLEE9VmEsTj0yNTAsQz0wLHo9Im1vdXNlZG93bi56b29tIixxPSJtb3VzZW1vdmUuem9vbSIsTD0ibW91c2V1cC56b29tIixUPSJ0b3VjaHN0YXJ0Lnpvb20iLFI9dyhuLCJ6b29tc3RhcnQiLCJ6b29tIiwiem9vbWVuZCIpO3JldHVybiBuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPVIub2YodGhpcyxhcmd1bWVudHMpLHQ9aztVbD90YS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7az10aGlzLl9fY2hhcnRfX3x8e3g6MCx5OjAsazoxfSxhKG4pfSkudHdlZW4oInpvb206em9vbSIsZnVuY3Rpb24oKXt2YXIgZT1FWzBdLHI9RVsxXSx1PXY/dlswXTplLzIsaT12P3ZbMV06ci8yLG89dGEuaW50ZXJwb2xhdGVab29tKFsodS1rLngpL2suaywoaS1rLnkpL2suayxlL2sua10sWyh1LXQueCkvdC5rLChpLXQueSkvdC5rLGUvdC5rXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPW8odCksYT1lL3JbMl07dGhpcy5fX2NoYXJ0X189az17eDp1LXJbMF0qYSx5OmktclsxXSphLGs6YX0sYyhuKX19KS5lYWNoKCJpbnRlcnJ1cHQuem9vbSIsZnVuY3Rpb24oKXtsKG4pfSkuZWFjaCgiZW5kLnpvb20iLGZ1bmN0aW9uKCl7bChuKX0pOih0aGlzLl9fY2hhcnRfXz1rLGEobiksYyhuKSxsKG4pKX0pfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDordFswXSx5Oit0WzFdLGs6ay5rfSxvKCksbik6W2sueCxrLnldfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXt4OmsueCx5OmsueSxrOit0fSxvKCksbik6ay5rfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPW51bGw9PXQ/VmE6Wyt0WzBdLCt0WzFdXSxuKTpBfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD10JiZbK3RbMF0sK3RbMV1dLG4pOmR9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT10JiZbK3RbMF0sK3RbMV1dLG4pOkV9LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE49K3Qsbik6Tn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXQsTT10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6eH0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPXQsXz10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6U30sdGEucmViaW5kKG4sUiwib24iKX07dmFyIFphLFZhPVswLDEvMF0sWGE9Im9ud2hlZWwiaW4gdWE/KFphPWZ1bmN0aW9uKCl7cmV0dXJuLXRhLmV2ZW50LmRlbHRhWSoodGEuZXZlbnQuZGVsdGFNb2RlPzEyMDoxKX0sIndoZWVsIik6Im9ubW91c2V3aGVlbCJpbiB1YT8oWmE9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZXZlbnQud2hlZWxEZWx0YX0sIm1vdXNld2hlZWwiKTooWmE9ZnVuY3Rpb24oKXtyZXR1cm4tdGEuZXZlbnQuZGV0YWlsfSwiTW96TW91c2VQaXhlbFNjcm9sbCIpO3RhLmNvbG9yPWl0LGl0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKyIifSx0YS5oc2w9b3Q7dmFyICRhPW90LnByb3RvdHlwZT1uZXcgaXQ7JGEuYnJpZ2h0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBvdCh0aGlzLmgsdGhpcy5zLHRoaXMubC9uKX0sJGEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgb3QodGhpcy5oLHRoaXMucyxuKnRoaXMubCl9LCRhLnJnYj1mdW5jdGlvbigpe3JldHVybiBhdCh0aGlzLmgsdGhpcy5zLHRoaXMubCl9LHRhLmhjbD1jdDt2YXIgQmE9Y3QucHJvdG90eXBlPW5ldyBpdDtCYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGN0KHRoaXMuaCx0aGlzLmMsTWF0aC5taW4oMTAwLHRoaXMubCtXYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LEJhLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGN0KHRoaXMuaCx0aGlzLmMsTWF0aC5tYXgoMCx0aGlzLmwtV2EqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSkpfSxCYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gbHQodGhpcy5oLHRoaXMuYyx0aGlzLmwpLnJnYigpfSx0YS5sYWI9c3Q7dmFyIFdhPTE4LEphPS45NTA0NyxHYT0xLEthPTEuMDg4ODMsUWE9c3QucHJvdG90eXBlPW5ldyBpdDtRYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IHN0KE1hdGgubWluKDEwMCx0aGlzLmwrV2EqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LFFhLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IHN0KE1hdGgubWF4KDAsdGhpcy5sLVdhKihhcmd1bWVudHMubGVuZ3RoP246MSkpLHRoaXMuYSx0aGlzLmIpfSxRYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gZnQodGhpcy5sLHRoaXMuYSx0aGlzLmIpfSx0YS5yZ2I9ZHQ7dmFyIG5jPWR0LnByb3RvdHlwZT1uZXcgaXQ7bmMuYnJpZ2h0ZXI9ZnVuY3Rpb24obil7bj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSk7dmFyIHQ9dGhpcy5yLGU9dGhpcy5nLHI9dGhpcy5iLHU9MzA7cmV0dXJuIHR8fGV8fHI/KHQmJnU+dCYmKHQ9dSksZSYmdT5lJiYoZT11KSxyJiZ1PnImJihyPXUpLG5ldyBkdChNYXRoLm1pbigyNTUsdC9uKSxNYXRoLm1pbigyNTUsZS9uKSxNYXRoLm1pbigyNTUsci9uKSkpOm5ldyBkdCh1LHUsdSl9LG5jLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGR0KG4qdGhpcy5yLG4qdGhpcy5nLG4qdGhpcy5iKX0sbmMuaHNsPWZ1bmN0aW9uKCl7cmV0dXJuIGJ0KHRoaXMucix0aGlzLmcsdGhpcy5iKX0sbmMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIyIrTXQodGhpcy5yKStNdCh0aGlzLmcpK010KHRoaXMuYil9O3ZhciB0Yz10YS5tYXAoe2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7dGMuZm9yRWFjaChmdW5jdGlvbihuLHQpe3RjLnNldChuLG10KHQpKX0pLHRhLmZ1bmN0b3I9a3QsdGEueGhyPUF0KEV0KSx0YS5kc3Y9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSxpKXthcmd1bWVudHMubGVuZ3RoPDMmJihpPWUsZT1udWxsKTt2YXIgbz1OdChuLHQsbnVsbD09ZT9yOnUoZSksaSk7cmV0dXJuIG8ucm93PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP28ucmVzcG9uc2UobnVsbD09KGU9bik/cjp1KG4pKTplfSxvfWZ1bmN0aW9uIHIobil7cmV0dXJuIGUucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIHUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLnBhcnNlKHQucmVzcG9uc2VUZXh0LG4pfX1mdW5jdGlvbiBpKHQpe3JldHVybiB0Lm1hcChvKS5qb2luKG4pfWZ1bmN0aW9uIG8obil7cmV0dXJuIGEudGVzdChuKT8nIicrbi5yZXBsYWNlKC9cIi9nLCciIicpKyciJzpufXZhciBhPW5ldyBSZWdFeHAoJ1siJytuKyJcbl0iKSxjPW4uY2hhckNvZGVBdCgwKTtyZXR1cm4gZS5wYXJzZT1mdW5jdGlvbihuLHQpe3ZhciByO3JldHVybiBlLnBhcnNlUm93cyhuLGZ1bmN0aW9uKG4sZSl7aWYocilyZXR1cm4gcihuLGUtMSk7dmFyIHU9bmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK24ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG4pKyI6IGRbIit0KyJdIn0pLmpvaW4oIiwiKSsifSIpO3I9dD9mdW5jdGlvbihuLGUpe3JldHVybiB0KHUobiksZSl9OnV9KX0sZS5wYXJzZVJvd3M9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKCl7aWYocz49bClyZXR1cm4gbztpZih1KXJldHVybiB1PSExLGk7dmFyIHQ9cztpZigzND09PW4uY2hhckNvZGVBdCh0KSl7Zm9yKHZhciBlPXQ7ZSsrPGw7KWlmKDM0PT09bi5jaGFyQ29kZUF0KGUpKXtpZigzNCE9PW4uY2hhckNvZGVBdChlKzEpKWJyZWFrOysrZX1zPWUrMjt2YXIgcj1uLmNoYXJDb2RlQXQoZSsxKTtyZXR1cm4gMTM9PT1yPyh1PSEwLDEwPT09bi5jaGFyQ29kZUF0KGUrMikmJisrcyk6MTA9PT1yJiYodT0hMCksbi5zbGljZSh0KzEsZSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7bD5zOyl7dmFyIHI9bi5jaGFyQ29kZUF0KHMrKyksYT0xO2lmKDEwPT09cil1PSEwO2Vsc2UgaWYoMTM9PT1yKXU9ITAsMTA9PT1uLmNoYXJDb2RlQXQocykmJigrK3MsKythKTtlbHNlIGlmKHIhPT1jKWNvbnRpbnVlO3JldHVybiBuLnNsaWNlKHQscy1hKX1yZXR1cm4gbi5zbGljZSh0KX1mb3IodmFyIHIsdSxpPXt9LG89e30sYT1bXSxsPW4ubGVuZ3RoLHM9MCxmPTA7KHI9ZSgpKSE9PW87KXtmb3IodmFyIGg9W107ciE9PWkmJnIhPT1vOyloLnB1c2gocikscj1lKCk7dCYmbnVsbD09KGg9dChoLGYrKykpfHxhLnB1c2goaCl9cmV0dXJuIGF9LGUuZm9ybWF0PWZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodFswXSkpcmV0dXJuIGUuZm9ybWF0Um93cyh0KTt2YXIgcj1uZXcgdix1PVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIG4pci5oYXModCl8fHUucHVzaChyLmFkZCh0KSl9KSxbdS5tYXAobykuam9pbihuKV0uY29uY2F0KHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB1Lm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbyh0W25dKX0pLmpvaW4obil9KSkuam9pbigiXG4iKX0sZS5mb3JtYXRSb3dzPWZ1bmN0aW9uKG4pe3JldHVybiBuLm1hcChpKS5qb2luKCJcbiIpfSxlfSx0YS5jc3Y9dGEuZHN2KCIsIiwidGV4dC9jc3YiKSx0YS50c3Y9dGEuZHN2KCIJIiwidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIpO3ZhciBlYyxyYyx1YyxpYyxvYyxhYz1vYVttKG9hLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKG4pe3NldFRpbWVvdXQobiwxNyl9O3RhLnRpbWVyPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoOzI+ciYmKHQ9MCksMz5yJiYoZT1EYXRlLm5vdygpKTt2YXIgdT1lK3QsaT17YzpuLHQ6dSxmOiExLG46bnVsbH07cmM/cmMubj1pOmVjPWkscmM9aSx1Y3x8KGljPWNsZWFyVGltZW91dChpYyksdWM9MSxhYyhxdCkpfSx0YS50aW1lci5mbHVzaD1mdW5jdGlvbigpe0x0KCksVHQoKX0sdGEucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9O3ZhciBjYz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoRHQpO3RhLmZvcm1hdFByZWZpeD1mdW5jdGlvbihuLHQpe3ZhciBlPTA7cmV0dXJuIG4mJigwPm4mJihuKj0tMSksdCYmKG49dGEucm91bmQobixSdChuLHQpKSksZT0xK01hdGguZmxvb3IoMWUtMTIrTWF0aC5sb2cobikvTWF0aC5MTjEwKSxlPU1hdGgubWF4KC0yNCxNYXRoLm1pbigyNCwzKk1hdGguZmxvb3IoKGUtMSkvMykpKSksY2NbOCtlLzNdfTt2YXIgbGM9Lyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pLHNjPXRhLm1hcCh7YjpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygyKX0sYzpmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuKX0sbzpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZyg4KX0seDpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygxNil9LFg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LGc6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b1ByZWNpc2lvbih0KX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvRXhwb25lbnRpYWwodCl9LGY6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0ZpeGVkKHQpfSxyOmZ1bmN0aW9uKG4sdCl7cmV0dXJuKG49dGEucm91bmQobixSdChuLHQpKSkudG9GaXhlZChNYXRoLm1heCgwLE1hdGgubWluKDIwLFJ0KG4qKDErMWUtMTUpLHQpKSkpfX0pLGZjPXRhLnRpbWU9e30saGM9RGF0ZTtqdC5wcm90b3R5cGU9e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RhdGUoKX0sZ2V0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKX0sZ2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCl9LGdldEhvdXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENIb3VycygpfSxnZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpfSxnZXRNaW51dGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCl9LGdldE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNb250aCgpfSxnZXRTZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCl9LGdldFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFRpbWUoKX0sZ2V0VGltZXpvbmVPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8udmFsdWVPZigpfSxzZXREYXRlOmZ1bmN0aW9uKCl7Z2Muc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RGF5OmZ1bmN0aW9uKCl7Z2Muc2V0VVRDRGF5LmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRGdWxsWWVhcjpmdW5jdGlvbigpe2djLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRIb3VyczpmdW5jdGlvbigpe2djLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtnYy5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbnV0ZXM6ZnVuY3Rpb24oKXtnYy5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNb250aDpmdW5jdGlvbigpe2djLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRTZWNvbmRzOmZ1bmN0aW9uKCl7Z2Muc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0VGltZTpmdW5jdGlvbigpe2djLnNldFRpbWUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9fTt2YXIgZ2M9RGF0ZS5wcm90b3R5cGU7ZmMueWVhcj1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1mYy5kYXkobiksbi5zZXRNb250aCgwLDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCl9KSxmYy55ZWFycz1mYy55ZWFyLnJhbmdlLGZjLnllYXJzLnV0Yz1mYy55ZWFyLnV0Yy5yYW5nZSxmYy5kYXk9RnQoZnVuY3Rpb24obil7dmFyIHQ9bmV3IGhjKDJlMywwKTtyZXR1cm4gdC5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpKSx0fSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF0ZSgpLTF9KSxmYy5kYXlzPWZjLmRheS5yYW5nZSxmYy5kYXlzLnV0Yz1mYy5kYXkudXRjLnJhbmdlLGZjLmRheU9mWWVhcj1mdW5jdGlvbihuKXt2YXIgdD1mYy55ZWFyKG4pO3JldHVybiBNYXRoLmZsb29yKChuLXQtNmU0KihuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvODY0ZTUpfSxbInN1bmRheSIsIm1vbmRheSIsInR1ZXNkYXkiLCJ3ZWRuZXNkYXkiLCJ0aHVyc2RheSIsImZyaWRheSIsInNhdHVyZGF5Il0uZm9yRWFjaChmdW5jdGlvbihuLHQpe3Q9Ny10O3ZhciBlPWZjW25dPUZ0KGZ1bmN0aW9uKG4pe3JldHVybihuPWZjLmRheShuKSkuc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSt0KSU3KSxufSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSs3Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXt2YXIgZT1mYy55ZWFyKG4pLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChmYy5kYXlPZlllYXIobikrKGUrdCklNykvNyktKGUhPT10KX0pO2ZjW24rInMiXT1lLnJhbmdlLGZjW24rInMiXS51dGM9ZS51dGMucmFuZ2UsZmNbbisiT2ZZZWFyIl09ZnVuY3Rpb24obil7dmFyIGU9ZmMueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoZmMuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpfX0pLGZjLndlZWs9ZmMuc3VuZGF5LGZjLndlZWtzPWZjLnN1bmRheS5yYW5nZSxmYy53ZWVrcy51dGM9ZmMuc3VuZGF5LnV0Yy5yYW5nZSxmYy53ZWVrT2ZZZWFyPWZjLnN1bmRheU9mWWVhcjt2YXIgcGM9eyItIjoiIixfOiIgIiwwOiIwIn0sdmM9L15ccypcZCsvLGRjPS9eJS87dGEubG9jYWxlPWZ1bmN0aW9uKG4pe3JldHVybntudW1iZXJGb3JtYXQ6UHQobiksdGltZUZvcm1hdDpPdChuKX19O3ZhciBtYz10YS5sb2NhbGUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdLGRhdGVUaW1lOiIlYSAlYiAlZSAlWCAlWSIsZGF0ZToiJW0vJWQvJVkiLHRpbWU6IiVIOiVNOiVTIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3RhLmZvcm1hdD1tYy5udW1iZXJGb3JtYXQsdGEuZ2VvPXt9LGNlLnByb3RvdHlwZT17czowLHQ6MCxhZGQ6ZnVuY3Rpb24obil7bGUobix0aGlzLnQseWMpLGxlKHljLnMsdGhpcy5zLHRoaXMpLHRoaXMucz90aGlzLnQrPXljLnQ6dGhpcy5zPXljLnR9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciB5Yz1uZXcgY2U7dGEuZ2VvLnN0cmVhbT1mdW5jdGlvbihuLHQpe24mJk1jLmhhc093blByb3BlcnR5KG4udHlwZSk/TWNbbi50eXBlXShuLHQpOnNlKG4sdCl9O3ZhciBNYz17RmVhdHVyZTpmdW5jdGlvbihuLHQpe3NlKG4uZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZmVhdHVyZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylzZShlW3JdLmdlb21ldHJ5LHQpfX0seGM9e1NwaGVyZTpmdW5jdGlvbihuLHQpe3Quc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKG4sdCl7bj1uLmNvb3JkaW5hdGVzLHQucG9pbnQoblswXSxuWzFdLG5bMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OyluPWVbcl0sdC5wb2ludChuWzBdLG5bMV0sblsyXSkKfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7ZmUobi5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWZlKGVbcl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihuLHQpe2hlKG4uY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmNvb3JkaW5hdGVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspaGUoZVtyXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZ2VvbWV0cmllcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXNlKGVbcl0sdCl9fTt0YS5nZW8uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gYmM9MCx0YS5nZW8uc3RyZWFtKG4sd2MpLGJjfTt2YXIgYmMsX2M9bmV3IGNlLHdjPXtzcGhlcmU6ZnVuY3Rpb24oKXtiYys9NCpEYX0scG9pbnQ6eSxsaW5lU3RhcnQ6eSxsaW5lRW5kOnkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7X2MucmVzZXQoKSx3Yy5saW5lU3RhcnQ9Z2V9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgbj0yKl9jO2JjKz0wPm4/NCpEYStuOm4sd2MubGluZVN0YXJ0PXdjLmxpbmVFbmQ9d2MucG9pbnQ9eX19O3RhLmdlby5ib3VuZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdCl7TS5wdXNoKHg9W3M9bixoPW5dKSxmPnQmJihmPXQpLHQ+ZyYmKGc9dCl9ZnVuY3Rpb24gdCh0LGUpe3ZhciByPXBlKFt0KkZhLGUqRmFdKTtpZihtKXt2YXIgdT1kZShtLHIpLGk9W3VbMV0sLXVbMF0sMF0sbz1kZShpLHUpO01lKG8pLG89eGUobyk7dmFyIGM9dC1wLGw9Yz4wPzE6LTEsdj1vWzBdKkhhKmwsZD12YShjKT4xODA7aWYoZF4odj5sKnAmJmwqdD52KSl7dmFyIHk9b1sxXSpIYTt5PmcmJihnPXkpfWVsc2UgaWYodj0odiszNjApJTM2MC0xODAsZF4odj5sKnAmJmwqdD52KSl7dmFyIHk9LW9bMV0qSGE7Zj55JiYoZj15KX1lbHNlIGY+ZSYmKGY9ZSksZT5nJiYoZz1lKTtkP3A+dD9hKHMsdCk+YShzLGgpJiYoaD10KTphKHQsaCk+YShzLGgpJiYocz10KTpoPj1zPyhzPnQmJihzPXQpLHQ+aCYmKGg9dCkpOnQ+cD9hKHMsdCk+YShzLGgpJiYoaD10KTphKHQsaCk+YShzLGgpJiYocz10KX1lbHNlIG4odCxlKTttPXIscD10fWZ1bmN0aW9uIGUoKXtiLnBvaW50PXR9ZnVuY3Rpb24gcigpe3hbMF09cyx4WzFdPWgsYi5wb2ludD1uLG09bnVsbH1mdW5jdGlvbiB1KG4sZSl7aWYobSl7dmFyIHI9bi1wO3krPXZhKHIpPjE4MD9yKyhyPjA/MzYwOi0zNjApOnJ9ZWxzZSB2PW4sZD1lO3djLnBvaW50KG4sZSksdChuLGUpfWZ1bmN0aW9uIGkoKXt3Yy5saW5lU3RhcnQoKX1mdW5jdGlvbiBvKCl7dSh2LGQpLHdjLmxpbmVFbmQoKSx2YSh5KT5UYSYmKHM9LShoPTE4MCkpLHhbMF09cyx4WzFdPWgsbT1udWxsfWZ1bmN0aW9uIGEobix0KXtyZXR1cm4odC09bik8MD90KzM2MDp0fWZ1bmN0aW9uIGMobix0KXtyZXR1cm4gblswXS10WzBdfWZ1bmN0aW9uIGwobix0KXtyZXR1cm4gdFswXTw9dFsxXT90WzBdPD1uJiZuPD10WzFdOm48dFswXXx8dFsxXTxufXZhciBzLGYsaCxnLHAsdixkLG0seSxNLHgsYj17cG9pbnQ6bixsaW5lU3RhcnQ6ZSxsaW5lRW5kOnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Yi5wb2ludD11LGIubGluZVN0YXJ0PWksYi5saW5lRW5kPW8seT0wLHdjLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7d2MucG9seWdvbkVuZCgpLGIucG9pbnQ9bixiLmxpbmVTdGFydD1lLGIubGluZUVuZD1yLDA+X2M/KHM9LShoPTE4MCksZj0tKGc9OTApKTp5PlRhP2c9OTA6LVRhPnkmJihmPS05MCkseFswXT1zLHhbMV09aH19O3JldHVybiBmdW5jdGlvbihuKXtnPWg9LShzPWY9MS8wKSxNPVtdLHRhLmdlby5zdHJlYW0obixiKTt2YXIgdD1NLmxlbmd0aDtpZih0KXtNLnNvcnQoYyk7Zm9yKHZhciBlLHI9MSx1PU1bMF0saT1bdV07dD5yOysrcillPU1bcl0sbChlWzBdLHUpfHxsKGVbMV0sdSk/KGEodVswXSxlWzFdKT5hKHVbMF0sdVsxXSkmJih1WzFdPWVbMV0pLGEoZVswXSx1WzFdKT5hKHVbMF0sdVsxXSkmJih1WzBdPWVbMF0pKTppLnB1c2godT1lKTtmb3IodmFyIG8sZSxwPS0xLzAsdD1pLmxlbmd0aC0xLHI9MCx1PWlbdF07dD49cjt1PWUsKytyKWU9aVtyXSwobz1hKHVbMV0sZVswXSkpPnAmJihwPW8scz1lWzBdLGg9dVsxXSl9cmV0dXJuIE09eD1udWxsLDEvMD09PXN8fDEvMD09PWY/W1swLzAsMC8wXSxbMC8wLDAvMF1dOltbcyxmXSxbaCxnXV19fSgpLHRhLmdlby5jZW50cm9pZD1mdW5jdGlvbihuKXtTYz1rYz1FYz1BYz1OYz1DYz16Yz1xYz1MYz1UYz1SYz0wLHRhLmdlby5zdHJlYW0obixEYyk7dmFyIHQ9TGMsZT1UYyxyPVJjLHU9dCp0K2UqZStyKnI7cmV0dXJuIFJhPnUmJih0PUNjLGU9emMscj1xYyxUYT5rYyYmKHQ9RWMsZT1BYyxyPU5jKSx1PXQqdCtlKmUrcipyLFJhPnUpP1swLzAsMC8wXTpbTWF0aC5hdGFuMihlLHQpKkhhLG50KHIvTWF0aC5zcXJ0KHUpKSpIYV19O3ZhciBTYyxrYyxFYyxBYyxOYyxDYyx6YyxxYyxMYyxUYyxSYyxEYz17c3BoZXJlOnkscG9pbnQ6X2UsbGluZVN0YXJ0OlNlLGxpbmVFbmQ6a2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7RGMubGluZVN0YXJ0PUVlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7RGMubGluZVN0YXJ0PVNlfX0sUGM9TGUoTmUsUGUsamUsWy1EYSwtRGEvMl0pLFVjPTFlOTt0YS5nZW8uY2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciBuLHQsZSxyLHUsaSxvPXtzdHJlYW06ZnVuY3Rpb24obil7cmV0dXJuIHUmJih1LnZhbGlkPSExKSx1PWkobiksdS52YWxpZD0hMCx1fSxleHRlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9WWUobj0rYVswXVswXSx0PSthWzBdWzFdLGU9K2FbMV1bMF0scj0rYVsxXVsxXSksdSYmKHUudmFsaWQ9ITEsdT1udWxsKSxvKTpbW24sdF0sW2Uscl1dfX07cmV0dXJuIG8uZXh0ZW50KFtbMCwwXSxbOTYwLDUwMF1dKX0sKHRhLmdlby5jb25pY0VxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBJZShaZSl9KS5yYXc9WmUsdGEuZ2VvLmFsYmVycz1mdW5jdGlvbigpe3JldHVybiB0YS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKX0sdGEuZ2VvLmFsYmVyc1VzYT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7dmFyIGk9blswXSxvPW5bMV07cmV0dXJuIHQ9bnVsbCxlKGksbyksdHx8KHIoaSxvKSx0KXx8dShpLG8pLHR9dmFyIHQsZSxyLHUsaT10YS5nZW8uYWxiZXJzKCksbz10YS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGE9dGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGM9e3BvaW50OmZ1bmN0aW9uKG4sZSl7dD1bbixlXX19O3JldHVybiBuLmludmVydD1mdW5jdGlvbihuKXt2YXIgdD1pLnNjYWxlKCksZT1pLnRyYW5zbGF0ZSgpLHI9KG5bMF0tZVswXSkvdCx1PShuWzFdLWVbMV0pL3Q7cmV0dXJuKHU+PS4xMiYmLjIzND51JiZyPj0tLjQyNSYmLS4yMTQ+cj9vOnU+PS4xNjYmJi4yMzQ+dSYmcj49LS4yMTQmJi0uMTE1PnI/YTppKS5pbnZlcnQobil9LG4uc3RyZWFtPWZ1bmN0aW9uKG4pe3ZhciB0PWkuc3RyZWFtKG4pLGU9by5zdHJlYW0obikscj1hLnN0cmVhbShuKTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obix1KXt0LnBvaW50KG4sdSksZS5wb2ludChuLHUpLHIucG9pbnQobix1KX0sc3BoZXJlOmZ1bmN0aW9uKCl7dC5zcGhlcmUoKSxlLnNwaGVyZSgpLHIuc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksZS5saW5lU3RhcnQoKSxyLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dC5saW5lRW5kKCksZS5saW5lRW5kKCksci5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCksZS5wb2x5Z29uU3RhcnQoKSxyLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksZS5wb2x5Z29uRW5kKCksci5wb2x5Z29uRW5kKCl9fX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkucHJlY2lzaW9uKHQpLG8ucHJlY2lzaW9uKHQpLGEucHJlY2lzaW9uKHQpLG4pOmkucHJlY2lzaW9uKCl9LG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkuc2NhbGUodCksby5zY2FsZSguMzUqdCksYS5zY2FsZSh0KSxuLnRyYW5zbGF0ZShpLnRyYW5zbGF0ZSgpKSk6aS5zY2FsZSgpfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gaS50cmFuc2xhdGUoKTt2YXIgbD1pLnNjYWxlKCkscz0rdFswXSxmPSt0WzFdO3JldHVybiBlPWkudHJhbnNsYXRlKHQpLmNsaXBFeHRlbnQoW1tzLS40NTUqbCxmLS4yMzgqbF0sW3MrLjQ1NSpsLGYrLjIzOCpsXV0pLnN0cmVhbShjKS5wb2ludCxyPW8udHJhbnNsYXRlKFtzLS4zMDcqbCxmKy4yMDEqbF0pLmNsaXBFeHRlbnQoW1tzLS40MjUqbCtUYSxmKy4xMipsK1RhXSxbcy0uMjE0KmwtVGEsZisuMjM0KmwtVGFdXSkuc3RyZWFtKGMpLnBvaW50LHU9YS50cmFuc2xhdGUoW3MtLjIwNSpsLGYrLjIxMipsXSkuY2xpcEV4dGVudChbW3MtLjIxNCpsK1RhLGYrLjE2NipsK1RhXSxbcy0uMTE1KmwtVGEsZisuMjM0KmwtVGFdXSkuc3RyZWFtKGMpLnBvaW50LG59LG4uc2NhbGUoMTA3MCl9O3ZhciBqYyxGYyxIYyxPYyxZYyxJYyxaYz17cG9pbnQ6eSxsaW5lU3RhcnQ6eSxsaW5lRW5kOnkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7RmM9MCxaYy5saW5lU3RhcnQ9VmV9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaYy5saW5lU3RhcnQ9WmMubGluZUVuZD1aYy5wb2ludD15LGpjKz12YShGYy8yKX19LFZjPXtwb2ludDpYZSxsaW5lU3RhcnQ6eSxsaW5lRW5kOnkscG9seWdvblN0YXJ0OnkscG9seWdvbkVuZDp5fSxYYz17cG9pbnQ6V2UsbGluZVN0YXJ0OkplLGxpbmVFbmQ6R2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WGMubGluZVN0YXJ0PUtlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7WGMucG9pbnQ9V2UsWGMubGluZVN0YXJ0PUplLFhjLmxpbmVFbmQ9R2V9fTt0YS5nZW8ucGF0aD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG4mJigiZnVuY3Rpb24iPT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cygrYS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLG8mJm8udmFsaWR8fChvPXUoaSkpLHRhLmdlby5zdHJlYW0obixvKSksaS5yZXN1bHQoKX1mdW5jdGlvbiB0KCl7cmV0dXJuIG89bnVsbCxufXZhciBlLHIsdSxpLG8sYT00LjU7cmV0dXJuIG4uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gamM9MCx0YS5nZW8uc3RyZWFtKG4sdShaYykpLGpjfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3JldHVybiBFYz1BYz1OYz1DYz16Yz1xYz1MYz1UYz1SYz0wLHRhLmdlby5zdHJlYW0obix1KFhjKSksUmM/W0xjL1JjLFRjL1JjXTpxYz9bQ2MvcWMsemMvcWNdOk5jP1tFYy9OYyxBYy9OY106WzAvMCwwLzBdfSxuLmJvdW5kcz1mdW5jdGlvbihuKXtyZXR1cm4gWWM9SWM9LShIYz1PYz0xLzApLHRhLmdlby5zdHJlYW0obix1KFZjKSksW1tIYyxPY10sW1ljLEljXV19LG4ucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0oZT1uKT9uLnN0cmVhbXx8dHIobik6RXQsdCgpKTplfSxuLmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09KHI9bik/bmV3ICRlOm5ldyBRZShuKSwiZnVuY3Rpb24iIT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cyhhKSx0KCkpOnJ9LG4ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG4pOmF9LG4ucHJvamVjdGlvbih0YS5nZW8uYWxiZXJzVXNhKCkpLmNvbnRleHQobnVsbCl9LHRhLmdlby50cmFuc2Zvcm09ZnVuY3Rpb24obil7cmV0dXJue3N0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgZXIodCk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfX19LGVyLnByb3RvdHlwZT17cG9pbnQ6ZnVuY3Rpb24obix0KXt0aGlzLnN0cmVhbS5wb2ludChuLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX0sdGEuZ2VvLnByb2plY3Rpb249dXIsdGEuZ2VvLnByb2plY3Rpb25NdXRhdG9yPWlyLCh0YS5nZW8uZXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKGFyKX0pLnJhdz1hci5pbnZlcnQ9YXIsdGEuZ2VvLnJvdGF0aW9uPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQ9bih0WzBdKkZhLHRbMV0qRmEpLHRbMF0qPUhhLHRbMV0qPUhhLHR9cmV0dXJuIG49bHIoblswXSUzNjAqRmEsblsxXSpGYSxuLmxlbmd0aD4yP25bMl0qRmE6MCksdC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bi5pbnZlcnQodFswXSpGYSx0WzFdKkZhKSx0WzBdKj1IYSx0WzFdKj1IYSx0fSx0fSxjci5pbnZlcnQ9YXIsdGEuZ2VvLmNpcmNsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyLHQ9bHIoLW5bMF0qRmEsLW5bMV0qRmEsMCkuaW52ZXJ0LHU9W107cmV0dXJuIGUobnVsbCxudWxsLDEse3BvaW50OmZ1bmN0aW9uKG4sZSl7dS5wdXNoKG49dChuLGUpKSxuWzBdKj1IYSxuWzFdKj1IYX19KSx7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3VdfX12YXIgdCxlLHI9WzAsMF0sdT02O3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uYW5nbGU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Z3IoKHQ9K3IpKkZhLHUqRmEpLG4pOnR9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWdyKHQqRmEsKHU9K3IpKkZhKSxuKTp1fSxuLmFuZ2xlKDkwKX0sdGEuZ2VvLmRpc3RhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUscj0odFswXS1uWzBdKSpGYSx1PW5bMV0qRmEsaT10WzFdKkZhLG89TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKSxjPU1hdGguc2luKHUpLGw9TWF0aC5jb3ModSkscz1NYXRoLnNpbihpKSxmPU1hdGguY29zKGkpO3JldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgoZT1mKm8pKmUrKGU9bCpzLWMqZiphKSplKSxjKnMrbCpmKmEpfSx0YS5nZW8uZ3JhdGljdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQoKX19ZnVuY3Rpb24gdCgpe3JldHVybiB0YS5yYW5nZShNYXRoLmNlaWwoaS9kKSpkLHUsZCkubWFwKGgpLmNvbmNhdCh0YS5yYW5nZShNYXRoLmNlaWwobC9tKSptLGMsbSkubWFwKGcpKS5jb25jYXQodGEucmFuZ2UoTWF0aC5jZWlsKHIvcCkqcCxlLHApLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gdmEobiVkKT5UYX0pLm1hcChzKSkuY29uY2F0KHRhLnJhbmdlKE1hdGguY2VpbChhL3YpKnYsbyx2KS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIHZhKG4lbSk+VGF9KS5tYXAoZikpfXZhciBlLHIsdSxpLG8sYSxjLGwscyxmLGgsZyxwPTEwLHY9cCxkPTkwLG09MzYwLHk9Mi41O3JldHVybiBuLmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOm59fSl9LG4ub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChpKS5jb25jYXQoZyhjKS5zbGljZSgxKSxoKHUpLnJldmVyc2UoKS5zbGljZSgxKSxnKGwpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvckV4dGVudCh0KS5taW5vckV4dGVudCh0KTpuLm1pbm9yRXh0ZW50KCl9LG4ubWFqb3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3RbMF1bMF0sdT0rdFsxXVswXSxsPSt0WzBdWzFdLGM9K3RbMV1bMV0saT51JiYodD1pLGk9dSx1PXQpLGw+YyYmKHQ9bCxsPWMsYz10KSxuLnByZWNpc2lvbih5KSk6W1tpLGxdLFt1LGNdXX0sbi5taW5vckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLGE9K3RbMF1bMV0sbz0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksYT5vJiYodD1hLGE9byxvPXQpLG4ucHJlY2lzaW9uKHkpKTpbW3IsYV0sW2Usb11dfSxuLnN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvclN0ZXAodCkubWlub3JTdGVwKHQpOm4ubWlub3JTdGVwKCl9LG4ubWFqb3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLG09K3RbMV0sbik6W2QsbV19LG4ubWlub3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0WzBdLHY9K3RbMV0sbik6W3Asdl19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0LHM9dnIoYSxvLDkwKSxmPWRyKHIsZSx5KSxoPXZyKGwsYyw5MCksZz1kcihpLHUseSksbik6eX0sbi5tYWpvckV4dGVudChbWy0xODAsLTkwK1RhXSxbMTgwLDkwLVRhXV0pLm1pbm9yRXh0ZW50KFtbLTE4MCwtODAtVGFdLFsxODAsODArVGFdXSl9LHRhLmdlby5ncmVhdEFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3R8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpXX19dmFyIHQsZSxyPW1yLHU9eXI7cmV0dXJuIG4uZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmRpc3RhbmNlKHR8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP251bGw6ZSxuKTpyfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bnVsbDp0LG4pOnV9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bjowfSxufSx0YS5nZW8uaW50ZXJwb2xhdGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gTXIoblswXSpGYSxuWzFdKkZhLHRbMF0qRmEsdFsxXSpGYSl9LHRhLmdlby5sZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuICRjPTAsdGEuZ2VvLnN0cmVhbShuLEJjKSwkY307dmFyICRjLEJjPXtzcGhlcmU6eSxwb2ludDp5LGxpbmVTdGFydDp4cixsaW5lRW5kOnkscG9seWdvblN0YXJ0OnkscG9seWdvbkVuZDp5fSxXYz1icihmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5zcXJ0KDIvKDErbikpfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmFzaW4obi8yKX0pOyh0YS5nZW8uYXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFdjKX0pLnJhdz1XYzt2YXIgSmM9YnIoZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5hY29zKG4pO3JldHVybiB0JiZ0L01hdGguc2luKHQpfSxFdCk7KHRhLmdlby5hemltdXRoYWxFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiB1cihKYyl9KS5yYXc9SmMsKHRhLmdlby5jb25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiBJZShfcil9KS5yYXc9X3IsKHRhLmdlby5jb25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIEllKHdyKX0pLnJhdz13cjt2YXIgR2M9YnIoZnVuY3Rpb24obil7cmV0dXJuIDEvbn0sTWF0aC5hdGFuKTsodGEuZ2VvLmdub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKEdjKX0pLnJhdz1HYyxTci5pbnZlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm5bbiwyKk1hdGguYXRhbihNYXRoLmV4cCh0KSktamFdfSwodGEuZ2VvLm1lcmNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGtyKFNyKX0pLnJhdz1Tcjt2YXIgS2M9YnIoZnVuY3Rpb24oKXtyZXR1cm4gMX0sTWF0aC5hc2luKTsodGEuZ2VvLm9ydGhvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiB1cihLYyl9KS5yYXc9S2M7dmFyIFFjPWJyKGZ1bmN0aW9uKG4pe3JldHVybiAxLygxK24pfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmF0YW4obil9KTsodGEuZ2VvLnN0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoUWMpfSkucmF3PVFjLEVyLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVyblstdCwyKk1hdGguYXRhbihNYXRoLmV4cChuKSktamFdfSwodGEuZ2VvLnRyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciBuPWtyKEVyKSx0PW4uY2VudGVyLGU9bi5yb3RhdGU7cmV0dXJuIG4uY2VudGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuP3QoWy1uWzFdLG5bMF1dKToobj10KCksW25bMV0sLW5bMF1dKX0sbi5yb3RhdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4/ZShbblswXSxuWzFdLG4ubGVuZ3RoPjI/blsyXSs5MDo5MF0pOihuPWUoKSxbblswXSxuWzFdLG5bMl0tOTBdKX0sZShbMCwwLDkwXSl9KS5yYXc9RXIsdGEuZ2VvbT17fSx0YS5nZW9tLmh1bGw9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXtpZihuLmxlbmd0aDwzKXJldHVybltdO3ZhciB0LHU9a3QoZSksaT1rdChyKSxvPW4ubGVuZ3RoLGE9W10sYz1bXTtmb3IodD0wO28+dDt0KyspYS5wdXNoKFsrdS5jYWxsKHRoaXMsblt0XSx0KSwraS5jYWxsKHRoaXMsblt0XSx0KSx0XSk7Zm9yKGEuc29ydCh6ciksdD0wO28+dDt0KyspYy5wdXNoKFthW3RdWzBdLC1hW3RdWzFdXSk7dmFyIGw9Q3IoYSkscz1DcihjKSxmPXNbMF09PT1sWzBdLGg9c1tzLmxlbmd0aC0xXT09PWxbbC5sZW5ndGgtMV0sZz1bXTtmb3IodD1sLmxlbmd0aC0xO3Q+PTA7LS10KWcucHVzaChuW2FbbFt0XV1bMl1dKTtmb3IodD0rZjt0PHMubGVuZ3RoLWg7Kyt0KWcucHVzaChuW2Fbc1t0XV1bMl1dKTtyZXR1cm4gZ312YXIgZT1BcixyPU5yO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Qobik6KHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQpfSx0YS5nZW9tLnBvbHlnb249ZnVuY3Rpb24obil7cmV0dXJuIHhhKG4sbmwpLG59O3ZhciBubD10YS5nZW9tLnBvbHlnb24ucHJvdG90eXBlPVtdO25sLmFyZWE9ZnVuY3Rpb24oKXtmb3IodmFyIG4sdD0tMSxlPXRoaXMubGVuZ3RoLHI9dGhpc1tlLTFdLHU9MDsrK3Q8ZTspbj1yLHI9dGhpc1t0XSx1Kz1uWzFdKnJbMF0tblswXSpyWzFdO3JldHVybi41KnV9LG5sLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3ZhciB0LGUscj0tMSx1PXRoaXMubGVuZ3RoLGk9MCxvPTAsYT10aGlzW3UtMV07Zm9yKGFyZ3VtZW50cy5sZW5ndGh8fChuPS0xLyg2KnRoaXMuYXJlYSgpKSk7KytyPHU7KXQ9YSxhPXRoaXNbcl0sZT10WzBdKmFbMV0tYVswXSp0WzFdLGkrPSh0WzBdK2FbMF0pKmUsbys9KHRbMV0rYVsxXSkqZTtyZXR1cm5baSpuLG8qbl19LG5sLmNsaXA9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1LGksbyxhPVRyKG4pLGM9LTEsbD10aGlzLmxlbmd0aC1Ucih0aGlzKSxzPXRoaXNbbC0xXTsrK2M8bDspe2Zvcih0PW4uc2xpY2UoKSxuLmxlbmd0aD0wLHU9dGhpc1tjXSxpPXRbKHI9dC5sZW5ndGgtYSktMV0sZT0tMTsrK2U8cjspbz10W2VdLHFyKG8scyx1KT8ocXIoaSxzLHUpfHxuLnB1c2goTHIoaSxvLHMsdSkpLG4ucHVzaChvKSk6cXIoaSxzLHUpJiZuLnB1c2goTHIoaSxvLHMsdSkpLGk9bzthJiZuLnB1c2goblswXSkscz11fXJldHVybiBufTt2YXIgdGwsZWwscmwsdWwsaWwsb2w9W10sYWw9W107T3IucHJvdG90eXBlLnByZXBhcmU9ZnVuY3Rpb24oKXtmb3IodmFyIG4sdD10aGlzLmVkZ2VzLGU9dC5sZW5ndGg7ZS0tOyluPXRbZV0uZWRnZSxuLmImJm4uYXx8dC5zcGxpY2UoZSwxKTtyZXR1cm4gdC5zb3J0KElyKSx0Lmxlbmd0aH0sUXIucHJvdG90eXBlPXtzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2UubD09PXRoaXMuc2l0ZT90aGlzLmVkZ2UuYTp0aGlzLmVkZ2UuYn0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5iOnRoaXMuZWRnZS5hfX0sbnUucHJvdG90eXBlPXtpbnNlcnQ6ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU7aWYobil7aWYodC5QPW4sdC5OPW4uTixuLk4mJihuLk4uUD10KSxuLk49dCxuLlIpe2ZvcihuPW4uUjtuLkw7KW49bi5MO24uTD10fWVsc2Ugbi5SPXQ7ZT1ufWVsc2UgdGhpcy5fPyhuPXV1KHRoaXMuXyksdC5QPW51bGwsdC5OPW4sbi5QPW4uTD10LGU9bik6KHQuUD10Lk49bnVsbCx0aGlzLl89dCxlPW51bGwpO2Zvcih0Lkw9dC5SPW51bGwsdC5VPWUsdC5DPSEwLG49dDtlJiZlLkM7KXI9ZS5VLGU9PT1yLkw/KHU9ci5SLHUmJnUuQz8oZS5DPXUuQz0hMSxyLkM9ITAsbj1yKToobj09PWUuUiYmKGV1KHRoaXMsZSksbj1lLGU9bi5VKSxlLkM9ITEsci5DPSEwLHJ1KHRoaXMscikpKToodT1yLkwsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5MJiYocnUodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAsZXUodGhpcyxyKSkpLGU9bi5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24obil7bi5OJiYobi5OLlA9bi5QKSxuLlAmJihuLlAuTj1uLk4pLG4uTj1uLlA9bnVsbDt2YXIgdCxlLHIsdT1uLlUsaT1uLkwsbz1uLlI7aWYoZT1pP28/dXUobyk6aTpvLHU/dS5MPT09bj91Lkw9ZTp1LlI9ZTp0aGlzLl89ZSxpJiZvPyhyPWUuQyxlLkM9bi5DLGUuTD1pLGkuVT1lLGUhPT1vPyh1PWUuVSxlLlU9bi5VLG49ZS5SLHUuTD1uLGUuUj1vLG8uVT1lKTooZS5VPXUsdT1lLG49ZS5SKSk6KHI9bi5DLG49ZSksbiYmKG4uVT11KSwhcil7aWYobiYmbi5DKXJldHVybiBuLkM9ITEsdm9pZCAwO2Rve2lmKG49PT10aGlzLl8pYnJlYWs7aWYobj09PXUuTCl7aWYodD11LlIsdC5DJiYodC5DPSExLHUuQz0hMCxldSh0aGlzLHUpLHQ9dS5SKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LlImJnQuUi5DfHwodC5MLkM9ITEsdC5DPSEwLHJ1KHRoaXMsdCksdD11LlIpLHQuQz11LkMsdS5DPXQuUi5DPSExLGV1KHRoaXMsdSksbj10aGlzLl87YnJlYWt9fWVsc2UgaWYodD11LkwsdC5DJiYodC5DPSExLHUuQz0hMCxydSh0aGlzLHUpLHQ9dS5MKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LkwmJnQuTC5DfHwodC5SLkM9ITEsdC5DPSEwLGV1KHRoaXMsdCksdD11LkwpLHQuQz11LkMsdS5DPXQuTC5DPSExLHJ1KHRoaXMsdSksbj10aGlzLl87YnJlYWt9dC5DPSEwLG49dSx1PXUuVX13aGlsZSghbi5DKTtuJiYobi5DPSExKX19fSx0YS5nZW9tLnZvcm9ub2k9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXt2YXIgdD1uZXcgQXJyYXkobi5sZW5ndGgpLHI9YVswXVswXSx1PWFbMF1bMV0saT1hWzFdWzBdLG89YVsxXVsxXTtyZXR1cm4gaXUoZShuKSxhKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUsYSl7dmFyIGM9ZS5lZGdlcyxsPWUuc2l0ZSxzPXRbYV09Yy5sZW5ndGg/Yy5tYXAoZnVuY3Rpb24obil7dmFyIHQ9bi5zdGFydCgpO3JldHVyblt0LngsdC55XX0pOmwueD49ciYmbC54PD1pJiZsLnk+PXUmJmwueTw9bz9bW3Isb10sW2ksb10sW2ksdV0sW3IsdV1dOltdO3MucG9pbnQ9blthXX0pLHR9ZnVuY3Rpb24gZShuKXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm57eDpNYXRoLnJvdW5kKGkobix0KS9UYSkqVGEseTpNYXRoLnJvdW5kKG8obix0KS9UYSkqVGEsaTp0fX0pfXZhciByPUFyLHU9TnIsaT1yLG89dSxhPWNsO3JldHVybiBuP3Qobik6KHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGl1KGUobikpLmVkZ2VzLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gbi5sJiZuLnJ9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuW3QubC5pXSx0YXJnZXQ6blt0LnIuaV19fSl9LHQudHJpYW5nbGVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO3JldHVybiBpdShlKG4pKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7Zm9yKHZhciB1LGksbz1lLnNpdGUsYT1lLmVkZ2VzLnNvcnQoSXIpLGM9LTEsbD1hLmxlbmd0aCxzPWFbbC0xXS5lZGdlLGY9cy5sPT09bz9zLnI6cy5sOysrYzxsOyl1PXMsaT1mLHM9YVtjXS5lZGdlLGY9cy5sPT09bz9zLnI6cy5sLHI8aS5pJiZyPGYuaSYmYXUobyxpLGYpPDAmJnQucHVzaChbbltyXSxuW2kuaV0sbltmLmldXSl9KSx0fSx0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9a3Qocj1uKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89a3QodT1uKSx0KTp1fSx0LmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bnVsbD09bj9jbDpuLHQpOmE9PT1jbD9udWxsOmF9LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LmNsaXBFeHRlbnQobiYmW1swLDBdLG5dKTphPT09Y2w/bnVsbDphJiZhWzFdfSx0KX07dmFyIGNsPVtbLTFlNiwtMWU2XSxbMWU2LDFlNl1dO3RhLmdlb20uZGVsYXVuYXk9ZnVuY3Rpb24obil7cmV0dXJuIHRhLmdlb20udm9yb25vaSgpLnRyaWFuZ2xlcyhuKX0sdGEuZ2VvbS5xdWFkdHJlZT1mdW5jdGlvbihuLHQsZSxyLHUpe2Z1bmN0aW9uIGkobil7ZnVuY3Rpb24gaShuLHQsZSxyLHUsaSxvLGEpe2lmKCFpc05hTihlKSYmIWlzTmFOKHIpKWlmKG4ubGVhZil7dmFyIGM9bi54LHM9bi55O2lmKG51bGwhPWMpaWYodmEoYy1lKSt2YShzLXIpPC4wMSlsKG4sdCxlLHIsdSxpLG8sYSk7ZWxzZXt2YXIgZj1uLnBvaW50O24ueD1uLnk9bi5wb2ludD1udWxsLGwobixmLGMscyx1LGksbyxhKSxsKG4sdCxlLHIsdSxpLG8sYSl9ZWxzZSBuLng9ZSxuLnk9cixuLnBvaW50PXR9ZWxzZSBsKG4sdCxlLHIsdSxpLG8sYSl9ZnVuY3Rpb24gbChuLHQsZSxyLHUsbyxhLGMpe3ZhciBsPS41Kih1K2EpLHM9LjUqKG8rYyksZj1lPj1sLGg9cj49cyxnPWg8PDF8ZjtuLmxlYWY9ITEsbj1uLm5vZGVzW2ddfHwobi5ub2Rlc1tnXT1zdSgpKSxmP3U9bDphPWwsaD9vPXM6Yz1zLGkobix0LGUscix1LG8sYSxjKX12YXIgcyxmLGgsZyxwLHYsZCxtLHksTT1rdChhKSx4PWt0KGMpO2lmKG51bGwhPXQpdj10LGQ9ZSxtPXIseT11O2Vsc2UgaWYobT15PS0odj1kPTEvMCksZj1bXSxoPVtdLHA9bi5sZW5ndGgsbylmb3IoZz0wO3A+ZzsrK2cpcz1uW2ddLHMueDx2JiYodj1zLngpLHMueTxkJiYoZD1zLnkpLHMueD5tJiYobT1zLngpLHMueT55JiYoeT1zLnkpLGYucHVzaChzLngpLGgucHVzaChzLnkpO2Vsc2UgZm9yKGc9MDtwPmc7KytnKXt2YXIgYj0rTShzPW5bZ10sZyksXz0reChzLGcpO3Y+YiYmKHY9YiksZD5fJiYoZD1fKSxiPm0mJihtPWIpLF8+eSYmKHk9XyksZi5wdXNoKGIpLGgucHVzaChfKX12YXIgdz1tLXYsUz15LWQ7dz5TP3k9ZCt3Om09ditTO3ZhciBrPXN1KCk7aWYoay5hZGQ9ZnVuY3Rpb24obil7aShrLG4sK00obiwrK2cpLCt4KG4sZyksdixkLG0seSl9LGsudmlzaXQ9ZnVuY3Rpb24obil7ZnUobixrLHYsZCxtLHkpfSxrLmZpbmQ9ZnVuY3Rpb24obil7cmV0dXJuIGh1KGssblswXSxuWzFdLHYsZCxtLHkpfSxnPS0xLG51bGw9PXQpe2Zvcig7KytnPHA7KWkoayxuW2ddLGZbZ10saFtnXSx2LGQsbSx5KTstLWd9ZWxzZSBuLmZvckVhY2goay5hZGQpO3JldHVybiBmPWg9bj1zPW51bGwsa312YXIgbyxhPUFyLGM9TnI7cmV0dXJuKG89YXJndW1lbnRzLmxlbmd0aCk/KGE9Y3UsYz1sdSwzPT09byYmKHU9ZSxyPXQsZT10PTApLGkobikpOihpLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixpKTphfSxpLnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bixpKTpjfSxpLmV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj90PWU9cj11PW51bGw6KHQ9K25bMF1bMF0sZT0rblswXVsxXSxyPStuWzFdWzBdLHU9K25bMV1bMV0pLGkpOm51bGw9PXQ/bnVsbDpbW3QsZV0sW3IsdV1dfSxpLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PWU9MCxyPStuWzBdLHU9K25bMV0pLGkpOm51bGw9PXQ/bnVsbDpbci10LHUtZV19LGkpfSx0YS5pbnRlcnBvbGF0ZVJnYj1ndSx0YS5pbnRlcnBvbGF0ZU9iamVjdD1wdSx0YS5pbnRlcnBvbGF0ZU51bWJlcj12dSx0YS5pbnRlcnBvbGF0ZVN0cmluZz1kdTt2YXIgbGw9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLHNsPW5ldyBSZWdFeHAobGwuc291cmNlLCJnIik7dGEuaW50ZXJwb2xhdGU9bXUsdGEuaW50ZXJwb2xhdG9ycz1bZnVuY3Rpb24obix0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4oInN0cmluZyI9PT1lP3RjLmhhcyh0KXx8L14oI3xyZ2JcKHxoc2xcKCkvLnRlc3QodCk/Z3U6ZHU6dCBpbnN0YW5jZW9mIGl0P2d1OkFycmF5LmlzQXJyYXkodCk/eXU6Im9iamVjdCI9PT1lJiZpc05hTih0KT9wdTp2dSkobix0KX1dLHRhLmludGVycG9sYXRlQXJyYXk9eXU7dmFyIGZsPWZ1bmN0aW9uKCl7cmV0dXJuIEV0fSxobD10YS5tYXAoe2xpbmVhcjpmbCxwb2x5Omt1LHF1YWQ6ZnVuY3Rpb24oKXtyZXR1cm4gX3V9LGN1YmljOmZ1bmN0aW9uKCl7cmV0dXJuIHd1fSxzaW46ZnVuY3Rpb24oKXtyZXR1cm4gRXV9LGV4cDpmdW5jdGlvbigpe3JldHVybiBBdX0sY2lyY2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE51fSxlbGFzdGljOkN1LGJhY2s6enUsYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHF1fX0pLGdsPXRhLm1hcCh7ImluIjpFdCxvdXQ6eHUsImluLW91dCI6YnUsIm91dC1pbiI6ZnVuY3Rpb24obil7cmV0dXJuIGJ1KHh1KG4pKX19KTt0YS5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PW4uaW5kZXhPZigiLSIpLGU9dD49MD9uLnNsaWNlKDAsdCk6bixyPXQ+PTA/bi5zbGljZSh0KzEpOiJpbiI7cmV0dXJuIGU9aGwuZ2V0KGUpfHxmbCxyPWdsLmdldChyKXx8RXQsTXUocihlLmFwcGx5KG51bGwsZWEuY2FsbChhcmd1bWVudHMsMSkpKSl9LHRhLmludGVycG9sYXRlSGNsPUx1LHRhLmludGVycG9sYXRlSHNsPVR1LHRhLmludGVycG9sYXRlTGFiPVJ1LHRhLmludGVycG9sYXRlUm91bmQ9RHUsdGEudHJhbnNmb3JtPWZ1bmN0aW9uKG4pe3ZhciB0PXVhLmNyZWF0ZUVsZW1lbnROUyh0YS5ucy5wcmVmaXguc3ZnLCJnIik7cmV0dXJuKHRhLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtpZihudWxsIT1uKXt0LnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIixuKTt2YXIgZT10LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCl9cmV0dXJuIG5ldyBQdShlP2UubWF0cml4OnBsKX0pKG4pfSxQdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy50cmFuc2xhdGUrIilyb3RhdGUoIit0aGlzLnJvdGF0ZSsiKXNrZXdYKCIrdGhpcy5za2V3KyIpc2NhbGUoIit0aGlzLnNjYWxlKyIpIn07dmFyIHBsPXthOjEsYjowLGM6MCxkOjEsZTowLGY6MH07dGEuaW50ZXJwb2xhdGVUcmFuc2Zvcm09SHUsdGEubGF5b3V0PXt9LHRhLmxheW91dC5idW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKHZhciB0PVtdLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5wdXNoKEl1KG5bZV0pKTtyZXR1cm4gdH19LHRhLmxheW91dC5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbixsLGYsaCxnLHA9e30sdj1bXSxkPXRhLnJhbmdlKGkpLG09W107Zm9yKGU9W10scj1bXSxuPTAsaD0tMTsrK2g8aTspe2ZvcihsPTAsZz0tMTsrK2c8aTspbCs9dVtoXVtnXTt2LnB1c2gobCksbS5wdXNoKHRhLnJhbmdlKGkpKSxuKz1sfWZvcihvJiZkLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gbyh2W25dLHZbdF0pfSksYSYmbS5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7bi5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGEodVt0XVtuXSx1W3RdW2VdKX0pfSksbj0oUGEtcyppKS9uLGw9MCxoPS0xOysraDxpOyl7Zm9yKGY9bCxnPS0xOysrZzxpOyl7dmFyIHk9ZFtoXSxNPW1beV1bZ10seD11W3ldW01dLGI9bCxfPWwrPXgqbjtwW3krIi0iK01dPXtpbmRleDp5LHN1YmluZGV4Ok0sc3RhcnRBbmdsZTpiLGVuZEFuZ2xlOl8sdmFsdWU6eH19clt5XT17aW5kZXg6eSxzdGFydEFuZ2xlOmYsZW5kQW5nbGU6bCx2YWx1ZToobC1mKS9ufSxsKz1zfWZvcihoPS0xOysraDxpOylmb3IoZz1oLTE7KytnPGk7KXt2YXIgdz1wW2grIi0iK2ddLFM9cFtnKyItIitoXTsody52YWx1ZXx8Uy52YWx1ZSkmJmUucHVzaCh3LnZhbHVlPFMudmFsdWU/e3NvdXJjZTpTLHRhcmdldDp3fTp7c291cmNlOncsdGFyZ2V0OlN9KX1jJiZ0KCl9ZnVuY3Rpb24gdCgpe2Uuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiBjKChuLnNvdXJjZS52YWx1ZStuLnRhcmdldC52YWx1ZSkvMiwodC5zb3VyY2UudmFsdWUrdC50YXJnZXQudmFsdWUpLzIpfSl9dmFyIGUscix1LGksbyxhLGMsbD17fSxzPTA7cmV0dXJuIGwubWF0cml4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSh1PW4pJiZ1Lmxlbmd0aCxlPXI9bnVsbCxsKTp1fSxsLnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bixlPXI9bnVsbCxsKTpzfSxsLnNvcnRHcm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bixlPXI9bnVsbCxsKTpvfSxsLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixlPW51bGwsbCk6YX0sbC5zb3J0Q2hvcmRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4sZSYmdCgpLGwpOmN9LGwuY2hvcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fG4oKSxlfSxsLmdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiByfHxuKCkscn0sbH0sdGEubGF5b3V0LmZvcmNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsdSl7aWYodC5wb2ludCE9PW4pe3ZhciBpPXQuY3gtbi54LG89dC5jeS1uLnksYT11LWUsYz1pKmkrbypvO2lmKGM+YSphL2Qpe2lmKHA+Yyl7dmFyIGw9dC5jaGFyZ2UvYztuLnB4LT1pKmwsbi5weS09bypsfXJldHVybiEwfWlmKHQucG9pbnQmJmMmJnA+Yyl7dmFyIGw9dC5wb2ludENoYXJnZS9jO24ucHgtPWkqbCxuLnB5LT1vKmx9fXJldHVybiF0LmNoYXJnZX19ZnVuY3Rpb24gdChuKXtuLnB4PXRhLmV2ZW50Lngsbi5weT10YS5ldmVudC55LGEucmVzdW1lKCl9dmFyIGUscix1LGksbyxhPXt9LGM9dGEuZGlzcGF0Y2goInN0YXJ0IiwidGljayIsImVuZCIpLGw9WzEsMV0scz0uOSxmPXZsLGg9ZGwsZz0tMzAscD1tbCx2PS4xLGQ9LjY0LG09W10seT1bXTtyZXR1cm4gYS50aWNrPWZ1bmN0aW9uKCl7aWYoKHIqPS45OSk8LjAwNSlyZXR1cm4gYy5lbmQoe3R5cGU6ImVuZCIsYWxwaGE6cj0wfSksITA7dmFyIHQsZSxhLGYsaCxwLGQsTSx4LGI9bS5sZW5ndGgsXz15Lmxlbmd0aDtmb3IoZT0wO18+ZTsrK2UpYT15W2VdLGY9YS5zb3VyY2UsaD1hLnRhcmdldCxNPWgueC1mLngseD1oLnktZi55LChwPU0qTSt4KngpJiYocD1yKmlbZV0qKChwPU1hdGguc3FydChwKSktdVtlXSkvcCxNKj1wLHgqPXAsaC54LT1NKihkPWYud2VpZ2h0LyhoLndlaWdodCtmLndlaWdodCkpLGgueS09eCpkLGYueCs9TSooZD0xLWQpLGYueSs9eCpkKTtpZigoZD1yKnYpJiYoTT1sWzBdLzIseD1sWzFdLzIsZT0tMSxkKSlmb3IoOysrZTxiOylhPW1bZV0sYS54Kz0oTS1hLngpKmQsYS55Kz0oeC1hLnkpKmQ7aWYoZylmb3IoSnUodD10YS5nZW9tLnF1YWR0cmVlKG0pLHIsbyksZT0tMTsrK2U8YjspKGE9bVtlXSkuZml4ZWR8fHQudmlzaXQobihhKSk7Zm9yKGU9LTE7KytlPGI7KWE9bVtlXSxhLmZpeGVkPyhhLng9YS5weCxhLnk9YS5weSk6KGEueC09KGEucHgtKGEucHg9YS54KSkqcyxhLnktPShhLnB5LShhLnB5PWEueSkpKnMpO2MudGljayh7dHlwZToidGljayIsYWxwaGE6cn0pfSxhLm5vZGVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW4sYSk6bX0sYS5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1uLGEpOnl9LGEuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uLGEpOmx9LGEubGlua0Rpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Zn0sYS5kaXN0YW5jZT1hLmxpbmtEaXN0YW5jZSxhLmxpbmtTdHJlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmh9LGEuZnJpY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K24sYSk6c30sYS5jaGFyZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpnfSxhLmNoYXJnZURpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPW4qbixhKTpNYXRoLnNxcnQocCl9LGEuZ3Jhdml0eT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj0rbixhKTp2fSxhLnRoZXRhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW4qbixhKTpNYXRoLnNxcnQoZCl9LGEuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K24scj9yPW4+MD9uOjA6bj4wJiYoYy5zdGFydCh7dHlwZToic3RhcnQiLGFscGhhOnI9bn0pLHRhLnRpbWVyKGEudGljaykpLGEpOnJ9LGEuc3RhcnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4scil7aWYoIWUpe2ZvcihlPW5ldyBBcnJheShjKSxhPTA7Yz5hOysrYSllW2FdPVtdO2ZvcihhPTA7bD5hOysrYSl7dmFyIHU9eVthXTtlW3Uuc291cmNlLmluZGV4XS5wdXNoKHUudGFyZ2V0KSxlW3UudGFyZ2V0LmluZGV4XS5wdXNoKHUuc291cmNlKX19Zm9yKHZhciBpLG89ZVt0XSxhPS0xLGw9by5sZW5ndGg7KythPGw7KWlmKCFpc05hTihpPW9bYV1bbl0pKXJldHVybiBpO3JldHVybiBNYXRoLnJhbmRvbSgpKnJ9dmFyIHQsZSxyLGM9bS5sZW5ndGgscz15Lmxlbmd0aCxwPWxbMF0sdj1sWzFdO2Zvcih0PTA7Yz50OysrdCkocj1tW3RdKS5pbmRleD10LHIud2VpZ2h0PTA7Zm9yKHQ9MDtzPnQ7Kyt0KXI9eVt0XSwibnVtYmVyIj09dHlwZW9mIHIuc291cmNlJiYoci5zb3VyY2U9bVtyLnNvdXJjZV0pLCJudW1iZXIiPT10eXBlb2Ygci50YXJnZXQmJihyLnRhcmdldD1tW3IudGFyZ2V0XSksKytyLnNvdXJjZS53ZWlnaHQsKytyLnRhcmdldC53ZWlnaHQ7Zm9yKHQ9MDtjPnQ7Kyt0KXI9bVt0XSxpc05hTihyLngpJiYoci54PW4oIngiLHApKSxpc05hTihyLnkpJiYoci55PW4oInkiLHYpKSxpc05hTihyLnB4KSYmKHIucHg9ci54KSxpc05hTihyLnB5KSYmKHIucHk9ci55KTtpZih1PVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBmKWZvcih0PTA7cz50OysrdCl1W3RdPStmLmNhbGwodGhpcyx5W3RdLHQpO2Vsc2UgZm9yKHQ9MDtzPnQ7Kyt0KXVbdF09ZjtpZihpPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBoKWZvcih0PTA7cz50OysrdClpW3RdPStoLmNhbGwodGhpcyx5W3RdLHQpO2Vsc2UgZm9yKHQ9MDtzPnQ7Kyt0KWlbdF09aDtpZihvPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBnKWZvcih0PTA7Yz50OysrdClvW3RdPStnLmNhbGwodGhpcyxtW3RdLHQpO2Vsc2UgZm9yKHQ9MDtjPnQ7Kyt0KW9bdF09ZztyZXR1cm4gYS5yZXN1bWUoKX0sYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSguMSl9LGEuc3RvcD1mdW5jdGlvbigpe3JldHVybiBhLmFscGhhKDApfSxhLmRyYWc9ZnVuY3Rpb24oKXtyZXR1cm4gZXx8KGU9dGEuYmVoYXZpb3IuZHJhZygpLm9yaWdpbihFdCkub24oImRyYWdzdGFydC5mb3JjZSIsWHUpLm9uKCJkcmFnLmZvcmNlIix0KS5vbigiZHJhZ2VuZC5mb3JjZSIsJHUpKSxhcmd1bWVudHMubGVuZ3RoPyh0aGlzLm9uKCJtb3VzZW92ZXIuZm9yY2UiLEJ1KS5vbigibW91c2VvdXQuZm9yY2UiLFd1KS5jYWxsKGUpLHZvaWQgMCk6ZX0sdGEucmViaW5kKGEsYywib24iKX07dmFyIHZsPTIwLGRsPTEsbWw9MS8wO3RhLmxheW91dC5oaWVyYXJjaHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHUpe3ZhciBpLG89W3VdLGE9W107Zm9yKHUuZGVwdGg9MDtudWxsIT0oaT1vLnBvcCgpKTspaWYoYS5wdXNoKGkpLChsPWUuY2FsbChuLGksaS5kZXB0aCkpJiYoYz1sLmxlbmd0aCkpe2Zvcih2YXIgYyxsLHM7LS1jPj0wOylvLnB1c2gocz1sW2NdKSxzLnBhcmVudD1pLHMuZGVwdGg9aS5kZXB0aCsxO3ImJihpLnZhbHVlPTApLGkuY2hpbGRyZW49bH1lbHNlIHImJihpLnZhbHVlPStyLmNhbGwobixpLGkuZGVwdGgpfHwwKSxkZWxldGUgaS5jaGlsZHJlbjtyZXR1cm4gUXUodSxmdW5jdGlvbihuKXt2YXIgZSx1O3QmJihlPW4uY2hpbGRyZW4pJiZlLnNvcnQodCksciYmKHU9bi5wYXJlbnQpJiYodS52YWx1ZSs9bi52YWx1ZSl9KSxhfXZhciB0PWVpLGU9bmkscj10aTtyZXR1cm4gbi5zb3J0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5jaGlsZHJlbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLnJldmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHImJihLdSh0LGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJihuLnZhbHVlPTApfSksUXUodCxmdW5jdGlvbih0KXt2YXIgZTt0LmNoaWxkcmVufHwodC52YWx1ZT0rci5jYWxsKG4sdCx0LmRlcHRoKXx8MCksKGU9dC5wYXJlbnQpJiYoZS52YWx1ZSs9dC52YWx1ZSl9KSksdH0sbn0sdGEubGF5b3V0LnBhcnRpdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxlLHIsdSl7dmFyIGk9dC5jaGlsZHJlbjtpZih0Lng9ZSx0Lnk9dC5kZXB0aCp1LHQuZHg9cix0LmR5PXUsaSYmKG89aS5sZW5ndGgpKXt2YXIgbyxhLGMsbD0tMTtmb3Iocj10LnZhbHVlP3IvdC52YWx1ZTowOysrbDxvOyluKGE9aVtsXSxlLGM9YS52YWx1ZSpyLHUpLGUrPWN9fWZ1bmN0aW9uIHQobil7dmFyIGU9bi5jaGlsZHJlbixyPTA7aWYoZSYmKHU9ZS5sZW5ndGgpKWZvcih2YXIgdSxpPS0xOysraTx1OylyPU1hdGgubWF4KHIsdChlW2ldKSk7cmV0dXJuIDErcn1mdW5jdGlvbiBlKGUsaSl7dmFyIG89ci5jYWxsKHRoaXMsZSxpKTtyZXR1cm4gbihvWzBdLDAsdVswXSx1WzFdL3Qob1swXSkpLG99dmFyIHI9dGEubGF5b3V0LmhpZXJhcmNoeSgpLHU9WzEsMV07cmV0dXJuIGUuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLGUpOnV9LEd1KGUscil9LHRhLmxheW91dC5waWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG8pe3ZhciBhLGM9by5sZW5ndGgsbD1vLm1hcChmdW5jdGlvbihlLHIpe3JldHVybit0LmNhbGwobixlLHIpfSkscz0rKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIpLGY9KCJmdW5jdGlvbiI9PXR5cGVvZiB1P3UuYXBwbHkodGhpcyxhcmd1bWVudHMpOnUpLXMsaD1NYXRoLm1pbihNYXRoLmFicyhmKS9jLCsoImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6aSkpLGc9aCooMD5mPy0xOjEpLHA9KGYtYypnKS90YS5zdW0obCksdj10YS5yYW5nZShjKSxkPVtdO3JldHVybiBudWxsIT1lJiZ2LnNvcnQoZT09PXlsP2Z1bmN0aW9uKG4sdCl7cmV0dXJuIGxbdF0tbFtuXX06ZnVuY3Rpb24obix0KXtyZXR1cm4gZShvW25dLG9bdF0pfSksdi5mb3JFYWNoKGZ1bmN0aW9uKG4pe2Rbbl09e2RhdGE6b1tuXSx2YWx1ZTphPWxbbl0sc3RhcnRBbmdsZTpzLGVuZEFuZ2xlOnMrPWEqcCtnLHBhZEFuZ2xlOmh9fSksZH12YXIgdD1OdW1iZXIsZT15bCxyPTAsdT1QYSxpPTA7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsbik6dX0sbi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG4pOml9LG59O3ZhciB5bD17fTt0YS5sYXlvdXQuc3RhY2s9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGEsYyl7aWYoIShoPWEubGVuZ3RoKSlyZXR1cm4gYTt2YXIgbD1hLm1hcChmdW5jdGlvbihlLHIpe3JldHVybiB0LmNhbGwobixlLHIpfSkscz1sLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm5baS5jYWxsKG4sdCxlKSxvLmNhbGwobix0LGUpXX0pfSksZj1lLmNhbGwobixzLGMpO2w9dGEucGVybXV0ZShsLGYpLHM9dGEucGVybXV0ZShzLGYpO3ZhciBoLGcscCx2LGQ9ci5jYWxsKG4scyxjKSxtPWxbMF0ubGVuZ3RoO2ZvcihwPTA7bT5wOysrcClmb3IodS5jYWxsKG4sbFswXVtwXSx2PWRbcF0sc1swXVtwXVsxXSksZz0xO2g+ZzsrK2cpdS5jYWxsKG4sbFtnXVtwXSx2Kz1zW2ctMV1bcF1bMV0sc1tnXVtwXVsxXSk7cmV0dXJuIGF9dmFyIHQ9RXQsZT1haSxyPWNpLHU9b2ksaT11aSxvPWlpO3JldHVybiBuLnZhbHVlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4ub3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpNbC5nZXQodCl8fGFpLG4pOmV9LG4ub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eGwuZ2V0KHQpfHxjaSxuKTpyfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxuKTpvfSxuLm91dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG59O3ZhciBNbD10YS5tYXAoeyJpbnNpZGUtb3V0IjpmdW5jdGlvbihuKXt2YXIgdCxlLHI9bi5sZW5ndGgsdT1uLm1hcChsaSksaT1uLm1hcChzaSksbz10YS5yYW5nZShyKS5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHVbbl0tdVt0XX0pLGE9MCxjPTAsbD1bXSxzPVtdO2Zvcih0PTA7cj50OysrdCllPW9bdF0sYz5hPyhhKz1pW2VdLGwucHVzaChlKSk6KGMrPWlbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGwpfSxyZXZlcnNlOmZ1bmN0aW9uKG4pe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCkucmV2ZXJzZSgpfSwiZGVmYXVsdCI6YWl9KSx4bD10YS5tYXAoe3NpbGhvdWV0dGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9bi5sZW5ndGgsaT1uWzBdLmxlbmd0aCxvPVtdLGE9MCxjPVtdO2ZvcihlPTA7aT5lOysrZSl7Zm9yKHQ9MCxyPTA7dT50O3QrKylyKz1uW3RdW2VdWzFdO3I+YSYmKGE9ciksby5wdXNoKHIpfWZvcihlPTA7aT5lOysrZSljW2VdPShhLW9bZV0pLzI7cmV0dXJuIGN9LHdpZ2dsZTpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpLG8sYSxjLGwscz1uLmxlbmd0aCxmPW5bMF0saD1mLmxlbmd0aCxnPVtdO2ZvcihnWzBdPWM9bD0wLGU9MTtoPmU7KytlKXtmb3IodD0wLHU9MDtzPnQ7Kyt0KXUrPW5bdF1bZV1bMV07Zm9yKHQ9MCxpPTAsYT1mW2VdWzBdLWZbZS0xXVswXTtzPnQ7Kyt0KXtmb3Iocj0wLG89KG5bdF1bZV1bMV0tblt0XVtlLTFdWzFdKS8oMiphKTt0PnI7KytyKW8rPShuW3JdW2VdWzFdLW5bcl1bZS0xXVsxXSkvYTtpKz1vKm5bdF1bZV1bMV19Z1tlXT1jLT11P2kvdSphOjAsbD5jJiYobD1jKX1mb3IoZT0wO2g+ZTsrK2UpZ1tlXS09bDtyZXR1cm4gZ30sZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsbz0xL3UsYT1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtpZihyKWZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdLz1yO2Vsc2UgZm9yKHQ9MDt1PnQ7dCsrKW5bdF1bZV1bMV09b31mb3IoZT0wO2k+ZTsrK2UpYVtlXT0wO3JldHVybiBhfSx6ZXJvOmNpfSk7dGEubGF5b3V0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXtmb3IodmFyIG8sYSxjPVtdLGw9bi5tYXAoZSx0aGlzKSxzPXIuY2FsbCh0aGlzLGwsaSksZj11LmNhbGwodGhpcyxzLGwsaSksaT0tMSxoPWwubGVuZ3RoLGc9Zi5sZW5ndGgtMSxwPXQ/MToxL2g7KytpPGc7KW89Y1tpXT1bXSxvLmR4PWZbaSsxXS0oby54PWZbaV0pLG8ueT0wO2lmKGc+MClmb3IoaT0tMTsrK2k8aDspYT1sW2ldLGE+PXNbMF0mJmE8PXNbMV0mJihvPWNbdGEuYmlzZWN0KGYsYSwxLGcpLTFdLG8ueSs9cCxvLnB1c2gobltpXSkpO3JldHVybiBjfXZhciB0PSEwLGU9TnVtYmVyLHI9cGksdT1oaTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9a3QodCksbik6cn0sbi5iaW5zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbihuKXtyZXR1cm4gZ2kobix0KX06a3QodCksbik6dX0sbi5mcmVxdWVuY3k9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ISFlLG4pOnR9LG59LHRhLmxheW91dC5wYWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBvPWUuY2FsbCh0aGlzLG4saSksYT1vWzBdLGM9dVswXSxsPXVbMV0scz1udWxsPT10P01hdGguc3FydDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O2lmKGEueD1hLnk9MCxRdShhLGZ1bmN0aW9uKG4pe24ucj0rcyhuLnZhbHVlKX0pLFF1KGEsTWkpLHIpe3ZhciBmPXIqKHQ/MTpNYXRoLm1heCgyKmEuci9jLDIqYS5yL2wpKS8yO1F1KGEsZnVuY3Rpb24obil7bi5yKz1mfSksUXUoYSxNaSksUXUoYSxmdW5jdGlvbihuKXtuLnItPWZ9KX1yZXR1cm4gX2koYSxjLzIsbC8yLHQ/MToxL01hdGgubWF4KDIqYS5yL2MsMiphLnIvbCkpLG99dmFyIHQsZT10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydCh2aSkscj0wLHU9WzEsMV07cmV0dXJuIG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PWV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6K2Usbik6dH0sbi5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG4pOnJ9LEd1KG4sZSl9LHRhLmxheW91dC50cmVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBzPW8uY2FsbCh0aGlzLG4sdSksZj1zWzBdLGg9dChmKTtpZihRdShoLGUpLGgucGFyZW50Lm09LWgueixLdShoLHIpLGwpS3UoZixpKTtlbHNle3ZhciBnPWYscD1mLHY9ZjtLdShmLGZ1bmN0aW9uKG4pe24ueDxnLngmJihnPW4pLG4ueD5wLngmJihwPW4pLG4uZGVwdGg+di5kZXB0aCYmKHY9bil9KTt2YXIgZD1hKGcscCkvMi1nLngsbT1jWzBdLyhwLngrYShwLGcpLzIrZCkseT1jWzFdLyh2LmRlcHRofHwxKTtLdShmLGZ1bmN0aW9uKG4pe24ueD0obi54K2QpKm0sbi55PW4uZGVwdGgqeX0pfXJldHVybiBzfWZ1bmN0aW9uIHQobil7Zm9yKHZhciB0LGU9e0E6bnVsbCxjaGlsZHJlbjpbbl19LHI9W2VdO251bGwhPSh0PXIucG9wKCkpOylmb3IodmFyIHUsaT10LmNoaWxkcmVuLG89MCxhPWkubGVuZ3RoO2E+bzsrK28pci5wdXNoKChpW29dPXU9e186aVtvXSxwYXJlbnQ6dCxjaGlsZHJlbjoodT1pW29dLmNoaWxkcmVuKSYmdS5zbGljZSgpfHxbXSxBOm51bGwsYTpudWxsLHo6MCxtOjAsYzowLHM6MCx0Om51bGwsaTpvfSkuYT11KTtyZXR1cm4gZS5jaGlsZHJlblswXX1mdW5jdGlvbiBlKG4pe3ZhciB0PW4uY2hpbGRyZW4sZT1uLnBhcmVudC5jaGlsZHJlbixyPW4uaT9lW24uaS0xXTpudWxsO2lmKHQubGVuZ3RoKXtOaShuKTt2YXIgaT0odFswXS56K3RbdC5sZW5ndGgtMV0ueikvMjtyPyhuLno9ci56K2Eobi5fLHIuXyksbi5tPW4uei1pKTpuLno9aX1lbHNlIHImJihuLno9ci56K2Eobi5fLHIuXykpO24ucGFyZW50LkE9dShuLHIsbi5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gcihuKXtuLl8ueD1uLnorbi5wYXJlbnQubSxuLm0rPW4ucGFyZW50Lm19ZnVuY3Rpb24gdShuLHQsZSl7aWYodCl7Zm9yKHZhciByLHU9bixpPW4sbz10LGM9dS5wYXJlbnQuY2hpbGRyZW5bMF0sbD11Lm0scz1pLm0sZj1vLm0saD1jLm07bz1FaShvKSx1PWtpKHUpLG8mJnU7KWM9a2koYyksaT1FaShpKSxpLmE9bixyPW8ueitmLXUuei1sK2Eoby5fLHUuXykscj4wJiYoQWkoQ2kobyxuLGUpLG4sciksbCs9cixzKz1yKSxmKz1vLm0sbCs9dS5tLGgrPWMubSxzKz1pLm07byYmIUVpKGkpJiYoaS50PW8saS5tKz1mLXMpLHUmJiFraShjKSYmKGMudD11LGMubSs9bC1oLGU9bil9cmV0dXJuIGV9ZnVuY3Rpb24gaShuKXtuLngqPWNbMF0sbi55PW4uZGVwdGgqY1sxXX12YXIgbz10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxhPVNpLGM9WzEsMV0sbD1udWxsO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxuKTphfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bnVsbD09KGM9dCk/aTpudWxsLG4pOmw/bnVsbDpjfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW51bGw9PShjPXQpP251bGw6aSxuKTpsP2M6bnVsbH0sR3UobixvKX0sdGEubGF5b3V0LmNsdXN0ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7dmFyIG8sYT10LmNhbGwodGhpcyxuLGkpLGM9YVswXSxsPTA7UXUoYyxmdW5jdGlvbihuKXt2YXIgdD1uLmNoaWxkcmVuO3QmJnQubGVuZ3RoPyhuLng9cWkodCksbi55PXppKHQpKToobi54PW8/bCs9ZShuLG8pOjAsbi55PTAsbz1uKX0pO3ZhciBzPUxpKGMpLGY9VGkoYyksaD1zLngtZShzLGYpLzIsZz1mLngrZShmLHMpLzI7cmV0dXJuIFF1KGMsdT9mdW5jdGlvbihuKXtuLng9KG4ueC1jLngpKnJbMF0sbi55PShjLnktbi55KSpyWzFdfTpmdW5jdGlvbihuKXtuLng9KG4ueC1oKS8oZy1oKSpyWzBdLG4ueT0oMS0oYy55P24ueS9jLnk6MSkpKnJbMV19KSxhfXZhciB0PXRhLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLGU9U2kscj1bMSwxXSx1PSExO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09KHI9dCksbik6dT9udWxsOnJ9LG4ubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbCE9KHI9dCksbik6dT9yOm51bGx9LEd1KG4sdCl9LHRhLmxheW91dC50cmVlbWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe2Zvcih2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspcj0oZT1uW3VdKS52YWx1ZSooMD50PzA6dCksZS5hcmVhPWlzTmFOKHIpfHwwPj1yPzA6cn1mdW5jdGlvbiB0KGUpe3ZhciBpPWUuY2hpbGRyZW47aWYoaSYmaS5sZW5ndGgpe3ZhciBvLGEsYyxsPWYoZSkscz1bXSxoPWkuc2xpY2UoKSxwPTEvMCx2PSJzbGljZSI9PT1nP2wuZHg6ImRpY2UiPT09Zz9sLmR5OiJzbGljZS1kaWNlIj09PWc/MSZlLmRlcHRoP2wuZHk6bC5keDpNYXRoLm1pbihsLmR4LGwuZHkpO2ZvcihuKGgsbC5keCpsLmR5L2UudmFsdWUpLHMuYXJlYT0wOyhjPWgubGVuZ3RoKT4wOylzLnB1c2gobz1oW2MtMV0pLHMuYXJlYSs9by5hcmVhLCJzcXVhcmlmeSIhPT1nfHwoYT1yKHMsdikpPD1wPyhoLnBvcCgpLHA9YSk6KHMuYXJlYS09cy5wb3AoKS5hcmVhLHUocyx2LGwsITEpLHY9TWF0aC5taW4obC5keCxsLmR5KSxzLmxlbmd0aD1zLmFyZWE9MCxwPTEvMCk7cy5sZW5ndGgmJih1KHMsdixsLCEwKSxzLmxlbmd0aD1zLmFyZWE9MCksaS5mb3JFYWNoKHQpfX1mdW5jdGlvbiBlKHQpe3ZhciByPXQuY2hpbGRyZW47aWYociYmci5sZW5ndGgpe3ZhciBpLG89Zih0KSxhPXIuc2xpY2UoKSxjPVtdO2ZvcihuKGEsby5keCpvLmR5L3QudmFsdWUpLGMuYXJlYT0wO2k9YS5wb3AoKTspYy5wdXNoKGkpLGMuYXJlYSs9aS5hcmVhLG51bGwhPWkueiYmKHUoYyxpLno/by5keDpvLmR5LG8sIWEubGVuZ3RoKSxjLmxlbmd0aD1jLmFyZWE9MCk7ci5mb3JFYWNoKGUpfX1mdW5jdGlvbiByKG4sdCl7Zm9yKHZhciBlLHI9bi5hcmVhLHU9MCxpPTEvMCxvPS0xLGE9bi5sZW5ndGg7KytvPGE7KShlPW5bb10uYXJlYSkmJihpPmUmJihpPWUpLGU+dSYmKHU9ZSkpO3JldHVybiByKj1yLHQqPXQscj9NYXRoLm1heCh0KnUqcC9yLHIvKHQqaSpwKSk6MS8wfWZ1bmN0aW9uIHUobix0LGUscil7dmFyIHUsaT0tMSxvPW4ubGVuZ3RoLGE9ZS54LGw9ZS55LHM9dD9jKG4uYXJlYS90KTowO2lmKHQ9PWUuZHgpe2Zvcigocnx8cz5lLmR5KSYmKHM9ZS5keSk7KytpPG87KXU9bltpXSx1Lng9YSx1Lnk9bCx1LmR5PXMsYSs9dS5keD1NYXRoLm1pbihlLngrZS5keC1hLHM/Yyh1LmFyZWEvcyk6MCk7dS56PSEwLHUuZHgrPWUueCtlLmR4LWEsZS55Kz1zLGUuZHktPXN9ZWxzZXtmb3IoKHJ8fHM+ZS5keCkmJihzPWUuZHgpOysraTxvOyl1PW5baV0sdS54PWEsdS55PWwsdS5keD1zLGwrPXUuZHk9TWF0aC5taW4oZS55K2UuZHktbCxzP2ModS5hcmVhL3MpOjApO3Uuej0hMSx1LmR5Kz1lLnkrZS5keS1sLGUueCs9cyxlLmR4LT1zfX1mdW5jdGlvbiBpKHIpe3ZhciB1PW98fGEociksaT11WzBdO3JldHVybiBpLng9MCxpLnk9MCxpLmR4PWxbMF0saS5keT1sWzFdLG8mJmEucmV2YWx1ZShpKSxuKFtpXSxpLmR4KmkuZHkvaS52YWx1ZSksKG8/ZTp0KShpKSxoJiYobz11KSx1fXZhciBvLGE9dGEubGF5b3V0LmhpZXJhcmNoeSgpLGM9TWF0aC5yb3VuZCxsPVsxLDFdLHM9bnVsbCxmPVJpLGg9ITEsZz0ic3F1YXJpZnkiLHA9LjUqKDErTWF0aC5zcXJ0KDUpKTtyZXR1cm4gaS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5wYWRkaW5nPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7dmFyIGU9bi5jYWxsKGksdCx0LmRlcHRoKTtyZXR1cm4gbnVsbD09ZT9SaSh0KTpEaSh0LCJudW1iZXIiPT10eXBlb2YgZT9bZSxlLGUsZV06ZSl9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gRGkodCxuKX1pZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gczt2YXIgcjtyZXR1cm4gZj1udWxsPT0ocz1uKT9SaToiZnVuY3Rpb24iPT0ocj10eXBlb2Ygbik/dDoibnVtYmVyIj09PXI/KG49W24sbixuLG5dLGUpOmUsaX0saS5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uP01hdGgucm91bmQ6TnVtYmVyLGkpOmMhPU51bWJlcn0saS5zdGlja3k9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bixvPW51bGwsaSk6aAp9LGkucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9bixpKTpwfSxpLm1vZGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9bisiIixpKTpnfSxHdShpLGEpfSx0YS5yYW5kb209e25vcm1hbDpmdW5jdGlvbihuLHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIDI+ZSYmKHQ9MSksMT5lJiYobj0wKSxmdW5jdGlvbigpe3ZhciBlLHIsdTtkbyBlPTIqTWF0aC5yYW5kb20oKS0xLHI9MipNYXRoLnJhbmRvbSgpLTEsdT1lKmUrcipyO3doaWxlKCF1fHx1PjEpO3JldHVybiBuK3QqZSpNYXRoLnNxcnQoLTIqTWF0aC5sb2codSkvdSl9fSxsb2dOb3JtYWw6ZnVuY3Rpb24oKXt2YXIgbj10YS5yYW5kb20ubm9ybWFsLmFwcGx5KHRhLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKG4oKSl9fSxiYXRlczpmdW5jdGlvbihuKXt2YXIgdD10YS5yYW5kb20uaXJ3aW5IYWxsKG4pO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KCkvbn19LGlyd2luSGFsbDpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7bj5lO2UrKyl0Kz1NYXRoLnJhbmRvbSgpO3JldHVybiB0fX19LHRhLnNjYWxlPXt9O3ZhciBibD17Zmxvb3I6RXQsY2VpbDpFdH07dGEuc2NhbGUubGluZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIFlpKFswLDFdLFswLDFdLG11LCExKX07dmFyIF9sPXtzOjEsZzoxLHA6MSxyOjEsZToxfTt0YS5zY2FsZS5sb2c9ZnVuY3Rpb24oKXtyZXR1cm4gSmkodGEuc2NhbGUubGluZWFyKCkuZG9tYWluKFswLDFdKSwxMCwhMCxbMSwxMF0pfTt2YXIgd2w9dGEuZm9ybWF0KCIuMGUiKSxTbD17Zmxvb3I6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguY2VpbCgtbil9LGNlaWw6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguZmxvb3IoLW4pfX07dGEuc2NhbGUucG93PWZ1bmN0aW9uKCl7cmV0dXJuIEdpKHRhLnNjYWxlLmxpbmVhcigpLDEsWzAsMV0pfSx0YS5zY2FsZS5zcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KX0sdGEuc2NhbGUub3JkaW5hbD1mdW5jdGlvbigpe3JldHVybiBRaShbXSx7dDoicmFuZ2UiLGE6W1tdXX0pfSx0YS5zY2FsZS5jYXRlZ29yeTEwPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZShrbCl9LHRhLnNjYWxlLmNhdGVnb3J5MjA9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKEVsKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGI9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKEFsKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKE5sKX07dmFyIGtsPVsyMDYyMjYwLDE2NzQ0MjA2LDI5MjQ1ODgsMTQwMzQ3MjgsOTcyNTg4NSw5MTk3MTMxLDE0OTA3MzMwLDgzNTU3MTEsMTIzNjkxODYsMTU1NjE3NV0ubWFwKHl0KSxFbD1bMjA2MjI2MCwxMTQ1NDQ0MCwxNjc0NDIwNiwxNjc1OTY3MiwyOTI0NTg4LDEwMDE4Njk4LDE0MDM0NzI4LDE2NzUwNzQyLDk3MjU4ODUsMTI5NTU4NjEsOTE5NzEzMSwxMjg4NTE0MCwxNDkwNzMzMCwxNjIzNDE5NCw4MzU1NzExLDEzMDkyODA3LDEyMzY5MTg2LDE0NDA4NTg5LDE1NTYxNzUsMTA0MTA3MjVdLm1hcCh5dCksQWw9WzM3NTA3NzcsNTM5NTYxOSw3MDQwNzE5LDEwMjY0Mjg2LDY1MTkwOTcsOTIxNjU5NCwxMTkxNTExNSwxMzU1NjYzNiw5MjAyOTkzLDEyNDI2ODA5LDE1MTg2NTE0LDE1MTkwOTMyLDg2NjYxNjksMTEzNTY0OTAsMTQwNDk2NDMsMTUxNzczNzIsODA3NzY4MywxMDgzNDMyNCwxMzUyODUwOSwxNDU4OTY1NF0ubWFwKHl0KSxObD1bMzI0NDczMyw3MDU3MTEwLDEwNDA2NjI1LDEzMDMyNDMxLDE1MDk1MDUzLDE2NjE2NzY0LDE2NjI1MjU5LDE2NjM0MDE4LDMyNTMwNzYsNzY1MjQ3MCwxMDYwNzAwMywxMzEwMTUwNCw3Njk1MjgxLDEwMzk0MzEyLDEyMzY5MzcyLDE0MzQyODkxLDY1MTM1MDcsOTg2ODk1MCwxMjQzNDg3NywxNDI3NzA4MV0ubWFwKHl0KTt0YS5zY2FsZS5xdWFudGlsZT1mdW5jdGlvbigpe3JldHVybiBubyhbXSxbXSl9LHRhLnNjYWxlLnF1YW50aXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRvKDAsMSxbMCwxXSl9LHRhLnNjYWxlLnRocmVzaG9sZD1mdW5jdGlvbigpe3JldHVybiBlbyhbLjVdLFswLDFdKX0sdGEuc2NhbGUuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gcm8oWzAsMV0pfSx0YS5zdmc9e30sdGEuc3ZnLmFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj1NYXRoLm1heCgwLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbD1NYXRoLm1heCgwLCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscz1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1qYSxmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLWphLGg9TWF0aC5hYnMoZi1zKSxnPXM+Zj8wOjE7aWYobj5sJiYocD1sLGw9bixuPXApLGg+PVVhKXJldHVybiB0KGwsZykrKG4/dChuLDEtZyk6IiIpKyJaIjt2YXIgcCx2LGQsbSx5LE0seCxiLF8sdyxTLGssRT0wLEE9MCxOPVtdO2lmKChtPSgrYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDApLzIpJiYoZD1pPT09Q2w/TWF0aC5zcXJ0KG4qbitsKmwpOitpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnfHwoQSo9LTEpLGwmJihBPW50KGQvbCpNYXRoLnNpbihtKSkpLG4mJihFPW50KGQvbipNYXRoLnNpbihtKSkpKSxsKXt5PWwqTWF0aC5jb3MocytBKSxNPWwqTWF0aC5zaW4ocytBKSx4PWwqTWF0aC5jb3MoZi1BKSxiPWwqTWF0aC5zaW4oZi1BKTt2YXIgQz1NYXRoLmFicyhmLXMtMipBKTw9RGE/MDoxO2lmKEEmJnNvKHksTSx4LGIpPT09Z15DKXt2YXIgej0ocytmKS8yO3k9bCpNYXRoLmNvcyh6KSxNPWwqTWF0aC5zaW4oeikseD1iPW51bGx9fWVsc2UgeT1NPTA7aWYobil7Xz1uKk1hdGguY29zKGYtRSksdz1uKk1hdGguc2luKGYtRSksUz1uKk1hdGguY29zKHMrRSksaz1uKk1hdGguc2luKHMrRSk7dmFyIHE9TWF0aC5hYnMocy1mKzIqRSk8PURhPzA6MTtpZihFJiZzbyhfLHcsUyxrKT09PTEtZ15xKXt2YXIgTD0ocytmKS8yO189bipNYXRoLmNvcyhMKSx3PW4qTWF0aC5zaW4oTCksUz1rPW51bGx9fWVsc2UgXz13PTA7aWYoKHA9TWF0aC5taW4oTWF0aC5hYnMobC1uKS8yLCt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpPi4wMDEpe3Y9bD5uXmc/MDoxO3ZhciBUPW51bGw9PVM/W18sd106bnVsbD09eD9beSxNXTpMcihbeSxNXSxbUyxrXSxbeCxiXSxbXyx3XSksUj15LVRbMF0sRD1NLVRbMV0sUD14LVRbMF0sVT1iLVRbMV0saj0xL01hdGguc2luKE1hdGguYWNvcygoUipQK0QqVSkvKE1hdGguc3FydChSKlIrRCpEKSpNYXRoLnNxcnQoUCpQK1UqVSkpKS8yKSxGPU1hdGguc3FydChUWzBdKlRbMF0rVFsxXSpUWzFdKTtpZihudWxsIT14KXt2YXIgSD1NYXRoLm1pbihwLChsLUYpLyhqKzEpKSxPPWZvKG51bGw9PVM/W18sd106W1Msa10sW3ksTV0sbCxILGcpLFk9Zm8oW3gsYl0sW18sd10sbCxILGcpO3A9PT1IP04ucHVzaCgiTSIsT1swXSwiQSIsSCwiLCIsSCwiIDAgMCwiLHYsIiAiLE9bMV0sIkEiLGwsIiwiLGwsIiAwICIsMS1nXnNvKE9bMV1bMF0sT1sxXVsxXSxZWzFdWzBdLFlbMV1bMV0pLCIsIixnLCIgIixZWzFdLCJBIixILCIsIixILCIgMCAwLCIsdiwiICIsWVswXSk6Ti5wdXNoKCJNIixPWzBdLCJBIixILCIsIixILCIgMCAxLCIsdiwiICIsWVswXSl9ZWxzZSBOLnB1c2goIk0iLHksIiwiLE0pO2lmKG51bGwhPVMpe3ZhciBJPU1hdGgubWluKHAsKG4tRikvKGotMSkpLFo9Zm8oW3ksTV0sW1Msa10sbiwtSSxnKSxWPWZvKFtfLHddLG51bGw9PXg/W3ksTV06W3gsYl0sbiwtSSxnKTtwPT09ST9OLnB1c2goIkwiLFZbMF0sIkEiLEksIiwiLEksIiAwIDAsIix2LCIgIixWWzFdLCJBIixuLCIsIixuLCIgMCAiLGdec28oVlsxXVswXSxWWzFdWzFdLFpbMV1bMF0sWlsxXVsxXSksIiwiLDEtZywiICIsWlsxXSwiQSIsSSwiLCIsSSwiIDAgMCwiLHYsIiAiLFpbMF0pOk4ucHVzaCgiTCIsVlswXSwiQSIsSSwiLCIsSSwiIDAgMCwiLHYsIiAiLFpbMF0pfWVsc2UgTi5wdXNoKCJMIixfLCIsIix3KX1lbHNlIE4ucHVzaCgiTSIseSwiLCIsTSksbnVsbCE9eCYmTi5wdXNoKCJBIixsLCIsIixsLCIgMCAiLEMsIiwiLGcsIiAiLHgsIiwiLGIpLE4ucHVzaCgiTCIsXywiLCIsdyksbnVsbCE9UyYmTi5wdXNoKCJBIixuLCIsIixuLCIgMCAiLHEsIiwiLDEtZywiICIsUywiLCIsayk7cmV0dXJuIE4ucHVzaCgiWiIpLE4uam9pbigiIil9ZnVuY3Rpb24gdChuLHQpe3JldHVybiJNMCwiK24rIkEiK24rIiwiK24rIiAwIDEsIit0KyIgMCwiKy1uKyJBIituKyIsIituKyIgMCAxLCIrdCsiIDAsIitufXZhciBlPWlvLHI9b28sdT11byxpPUNsLG89YW8sYT1jbyxjPWxvO3JldHVybiBuLmlubmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWt0KHQpLG4pOmV9LG4ub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9a3QodCksbik6cn0sbi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9a3QodCksbik6dX0sbi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dD09Q2w/Q2w6a3QodCksbik6aX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWt0KHQpLG4pOm99LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9a3QodCksbik6YX0sbi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1rdCh0KSxuKTpjfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIG49KCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHQ9KCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLWphO3JldHVybltNYXRoLmNvcyh0KSpuLE1hdGguc2luKHQpKm5dfSxufTt2YXIgQ2w9ImF1dG8iO3RhLnN2Zy5saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIGhvKEV0KX07dmFyIHpsPXRhLm1hcCh7bGluZWFyOmdvLCJsaW5lYXItY2xvc2VkIjpwbyxzdGVwOnZvLCJzdGVwLWJlZm9yZSI6bW8sInN0ZXAtYWZ0ZXIiOnlvLGJhc2lzOlNvLCJiYXNpcy1vcGVuIjprbywiYmFzaXMtY2xvc2VkIjpFbyxidW5kbGU6QW8sY2FyZGluYWw6Ym8sImNhcmRpbmFsLW9wZW4iOk1vLCJjYXJkaW5hbC1jbG9zZWQiOnhvLG1vbm90b25lOlRvfSk7emwuZm9yRWFjaChmdW5jdGlvbihuLHQpe3Qua2V5PW4sdC5jbG9zZWQ9Ly1jbG9zZWQkLy50ZXN0KG4pfSk7dmFyIHFsPVswLDIvMywxLzMsMF0sTGw9WzAsMS8zLDIvMywwXSxUbD1bMCwxLzYsMi8zLDEvNl07dGEuc3ZnLmxpbmUucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49aG8oUm8pO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG59LG1vLnJldmVyc2U9eW8seW8ucmV2ZXJzZT1tbyx0YS5zdmcuYXJlYT1mdW5jdGlvbigpe3JldHVybiBEbyhFdCl9LHRhLnN2Zy5hcmVhLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPURvKFJvKTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5pbm5lclJhZGl1cz1uLngwLGRlbGV0ZSBuLngwLG4ub3V0ZXJSYWRpdXM9bi54MSxkZWxldGUgbi54MSxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG4uc3RhcnRBbmdsZT1uLnkwLGRlbGV0ZSBuLnkwLG4uZW5kQW5nbGU9bi55MSxkZWxldGUgbi55MSxufSx0YS5zdmcuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sYSl7dmFyIGM9dCh0aGlzLGksbixhKSxsPXQodGhpcyxvLG4sYSk7cmV0dXJuIk0iK2MucDArcihjLnIsYy5wMSxjLmExLWMuYTApKyhlKGMsbCk/dShjLnIsYy5wMSxjLnIsYy5wMCk6dShjLnIsYy5wMSxsLnIsbC5wMCkrcihsLnIsbC5wMSxsLmExLWwuYTApK3UobC5yLGwucDEsYy5yLGMucDApKSsiWiJ9ZnVuY3Rpb24gdChuLHQsZSxyKXt2YXIgdT10LmNhbGwobixlLHIpLGk9YS5jYWxsKG4sdSxyKSxvPWMuY2FsbChuLHUsciktamEscz1sLmNhbGwobix1LHIpLWphO3JldHVybntyOmksYTA6byxhMTpzLHAwOltpKk1hdGguY29zKG8pLGkqTWF0aC5zaW4obyldLHAxOltpKk1hdGguY29zKHMpLGkqTWF0aC5zaW4ocyldfX1mdW5jdGlvbiBlKG4sdCl7cmV0dXJuIG4uYTA9PXQuYTAmJm4uYTE9PXQuYTF9ZnVuY3Rpb24gcihuLHQsZSl7cmV0dXJuIkEiK24rIiwiK24rIiAwICIrICsoZT5EYSkrIiwxICIrdH1mdW5jdGlvbiB1KG4sdCxlLHIpe3JldHVybiJRIDAsMCAiK3J9dmFyIGk9bXIsbz15cixhPVBvLGM9YW8sbD1jbztyZXR1cm4gbi5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9a3QodCksbik6YX0sbi5zb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9a3QodCksbik6aX0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89a3QodCksbik6b30sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWt0KHQpLG4pOmN9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9a3QodCksbik6bH0sbn0sdGEuc3ZnLmRpYWdvbmFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPXQuY2FsbCh0aGlzLG4sdSksbz1lLmNhbGwodGhpcyxuLHUpLGE9KGkueStvLnkpLzIsYz1baSx7eDppLngseTphfSx7eDpvLngseTphfSxvXTtyZXR1cm4gYz1jLm1hcChyKSwiTSIrY1swXSsiQyIrY1sxXSsiICIrY1syXSsiICIrY1szXX12YXIgdD1tcixlPXlyLHI9VW87cmV0dXJuIG4uc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWt0KGUpLG4pOnR9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWt0KHQpLG4pOmV9LG4ucHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG59LHRhLnN2Zy5kaWFnb25hbC5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj10YS5zdmcuZGlhZ29uYWwoKSx0PVVvLGU9bi5wcm9qZWN0aW9uO3JldHVybiBuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZShqbyh0PW4pKTp0fSxufSx0YS5zdmcuc3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe3JldHVybihSbC5nZXQodC5jYWxsKHRoaXMsbixyKSl8fE9vKShlLmNhbGwodGhpcyxuLHIpKX12YXIgdD1IbyxlPUZvO3JldHVybiBuLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9a3QoZSksbik6dH0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWt0KHQpLG4pOmV9LG59O3ZhciBSbD10YS5tYXAoe2NpcmNsZTpPbyxjcm9zczpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi81KS8yO3JldHVybiJNIistMyp0KyIsIistdCsiSCIrLXQrIlYiKy0zKnQrIkgiK3QrIlYiKy10KyJIIiszKnQrIlYiK3QrIkgiK3QrIlYiKzMqdCsiSCIrLXQrIlYiK3QrIkgiKy0zKnQrIloifSxkaWFtb25kOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuLygyKlBsKSksZT10KlBsO3JldHVybiJNMCwiKy10KyJMIitlKyIsMCIrIiAwLCIrdCsiICIrLWUrIiwwIisiWiJ9LHNxdWFyZTpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobikvMjtyZXR1cm4iTSIrLXQrIiwiKy10KyJMIit0KyIsIistdCsiICIrdCsiLCIrdCsiICIrLXQrIiwiK3QrIloifSwidHJpYW5nbGUtZG93biI6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vRGwpLGU9dCpEbC8yO3JldHVybiJNMCwiK2UrIkwiK3QrIiwiKy1lKyIgIistdCsiLCIrLWUrIloifSwidHJpYW5nbGUtdXAiOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL0RsKSxlPXQqRGwvMjtyZXR1cm4iTTAsIistZSsiTCIrdCsiLCIrZSsiICIrLXQrIiwiK2UrIloifX0pO3RhLnN2Zy5zeW1ib2xUeXBlcz1SbC5rZXlzKCk7dmFyIERsPU1hdGguc3FydCgzKSxQbD1NYXRoLnRhbigzMCpGYSk7a2EudHJhbnNpdGlvbj1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyPVVsfHwrK09sLHU9WG8obiksaT1bXSxvPWpsfHx7dGltZTpEYXRlLm5vdygpLGVhc2U6U3UsZGVsYXk6MCxkdXJhdGlvbjoyNTB9LGE9LTEsYz10aGlzLmxlbmd0aDsrK2E8Yzspe2kucHVzaCh0PVtdKTtmb3IodmFyIGw9dGhpc1thXSxzPS0xLGY9bC5sZW5ndGg7KytzPGY7KShlPWxbc10pJiYkbyhlLHMsdSxyLG8pLHQucHVzaChlKX1yZXR1cm4gSW8oaSx1LHIpfSxrYS5pbnRlcnJ1cHQ9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChudWxsPT1uP0ZsOllvKFhvKG4pKSl9O3ZhciBVbCxqbCxGbD1ZbyhYbygpKSxIbD1bXSxPbD0wO0hsLmNhbGw9a2EuY2FsbCxIbC5lbXB0eT1rYS5lbXB0eSxIbC5ub2RlPWthLm5vZGUsSGwuc2l6ZT1rYS5zaXplLHRhLnRyYW5zaXRpb249ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi50cmFuc2l0aW9uP1VsP24udHJhbnNpdGlvbih0KTpuOk5hLnRyYW5zaXRpb24obil9LHRhLnRyYW5zaXRpb24ucHJvdG90eXBlPUhsLEhsLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT10aGlzLmlkLGk9dGhpcy5uYW1lc3BhY2Usbz1bXTtuPWsobik7Zm9yKHZhciBhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtvLnB1c2godD1bXSk7Zm9yKHZhciBsPXRoaXNbYV0scz0tMSxmPWwubGVuZ3RoOysrczxmOykocj1sW3NdKSYmKGU9bi5jYWxsKHIsci5fX2RhdGFfXyxzLGEpKT8oIl9fZGF0YV9fImluIHImJihlLl9fZGF0YV9fPXIuX19kYXRhX18pLCRvKGUscyxpLHUscltpXVt1XSksdC5wdXNoKGUpKTp0LnB1c2gobnVsbCl9cmV0dXJuIElvKG8saSx1KX0sSGwuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1LGksbz10aGlzLmlkLGE9dGhpcy5uYW1lc3BhY2UsYz1bXTtuPUUobik7Zm9yKHZhciBsPS0xLHM9dGhpcy5sZW5ndGg7KytsPHM7KWZvcih2YXIgZj10aGlzW2xdLGg9LTEsZz1mLmxlbmd0aDsrK2g8ZzspaWYocj1mW2hdKXtpPXJbYV1bb10sZT1uLmNhbGwocixyLl9fZGF0YV9fLGgsbCksYy5wdXNoKHQ9W10pO2Zvcih2YXIgcD0tMSx2PWUubGVuZ3RoOysrcDx2OykodT1lW3BdKSYmJG8odSxwLGEsbyxpKSx0LnB1c2godSl9cmV0dXJuIElvKGMsYSxvKX0sSGwuZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1qKG4pKTtmb3IodmFyIGk9MCxvPXRoaXMubGVuZ3RoO28+aTtpKyspe3UucHVzaCh0PVtdKTtmb3IodmFyIGU9dGhpc1tpXSxhPTAsYz1lLmxlbmd0aDtjPmE7YSsrKShyPWVbYV0pJiZuLmNhbGwocixyLl9fZGF0YV9fLGEsaSkmJnQucHVzaChyKX1yZXR1cm4gSW8odSx0aGlzLm5hbWVzcGFjZSx0aGlzLmlkKX0sSGwudHdlZW49ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzLm5vZGUoKVtyXVtlXS50d2Vlbi5nZXQobik6SCh0aGlzLG51bGw9PXQ/ZnVuY3Rpb24odCl7dFtyXVtlXS50d2Vlbi5yZW1vdmUobil9OmZ1bmN0aW9uKHUpe3Vbcl1bZV0udHdlZW4uc2V0KG4sdCl9KX0sSGwuYXR0cj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShhKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwpfWZ1bmN0aW9uIHUobil7cmV0dXJuIG51bGw9PW4/ZToobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlKGEpO3JldHVybiBlIT09biYmKHQ9byhlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKGEsdChuKSl9KX0pfWZ1bmN0aW9uIGkobil7cmV0dXJuIG51bGw9PW4/cjoobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsKTtyZXR1cm4gZSE9PW4mJih0PW8oZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCx0KG4pKX0pfSl9aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodCBpbiBuKXRoaXMuYXR0cih0LG5bdF0pO3JldHVybiB0aGlzfXZhciBvPSJ0cmFuc2Zvcm0iPT1uP0h1Om11LGE9dGEubnMucXVhbGlmeShuKTtyZXR1cm4gWm8odGhpcywiYXR0ci4iK24sdCxhLmxvY2FsP2k6dSl9LEhsLmF0dHJUd2Vlbj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGUodSkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh1LHIobikpfX1mdW5jdGlvbiByKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsKSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsLHIobikpfX12YXIgdT10YS5ucy5xdWFsaWZ5KG4pO3JldHVybiB0aGlzLnR3ZWVuKCJhdHRyLiIrbix1LmxvY2FsP3I6ZSl9LEhsLnN0eWxlPWZ1bmN0aW9uKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT10P3I6KHQrPSIiLGZ1bmN0aW9uKCl7dmFyIHIsdT1vYS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtyZXR1cm4gdSE9PXQmJihyPW11KHUsdCksZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIodCksZSl9KX0pfXZhciBpPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5pKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+aSYmKHQ9IiIpO2ZvcihlIGluIG4pdGhpcy5zdHlsZShlLG5bZV0sdCk7cmV0dXJuIHRoaXN9ZT0iIn1yZXR1cm4gWm8odGhpcywic3R5bGUuIituLHQsdSl9LEhsLnN0eWxlVHdlZW49ZnVuY3Rpb24obix0LGUpe2Z1bmN0aW9uIHIocix1KXt2YXIgaT10LmNhbGwodGhpcyxyLHUsb2EuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobikpO3JldHVybiBpJiZmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4saSh0KSxlKX19cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MyYmKGU9IiIpLHRoaXMudHdlZW4oInN0eWxlLiIrbixyKX0sSGwudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gWm8odGhpcywidGV4dCIsbixWbyl9LEhsLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBuPXRoaXMubmFtZXNwYWNlO3JldHVybiB0aGlzLmVhY2goImVuZC50cmFuc2l0aW9uIixmdW5jdGlvbigpe3ZhciB0O3RoaXNbbl0uY291bnQ8MiYmKHQ9dGhpcy5wYXJlbnROb2RlKSYmdC5yZW1vdmVDaGlsZCh0aGlzKX0pfSxIbC5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmVhc2U6KCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj10YS5lYXNlLmFwcGx5KHRhLGFyZ3VtZW50cykpLEgodGhpcyxmdW5jdGlvbihyKXtyW2VdW3RdLmVhc2U9bn0pKX0sSGwuZGVsYXk9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZGVsYXk6SCh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmRlbGF5PStuLmNhbGwocixyLl9fZGF0YV9fLHUsaSl9OihuPStuLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZGVsYXk9bn0pKX0sSGwuZHVyYXRpb249ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZHVyYXRpb246SCh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmR1cmF0aW9uPU1hdGgubWF4KDEsbi5jYWxsKHIsci5fX2RhdGFfXyx1LGkpKX06KG49TWF0aC5tYXgoMSxuKSxmdW5jdGlvbihyKXtyW2VdW3RdLmR1cmF0aW9uPW59KSl9LEhsLmVhY2g9ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgdT1qbCxpPVVsO3RyeXtVbD1lLEgodGhpcyxmdW5jdGlvbih0LHUsaSl7amw9dFtyXVtlXSxuLmNhbGwodCx0Ll9fZGF0YV9fLHUsaSl9KX1maW5hbGx5e2psPXUsVWw9aX19ZWxzZSBIKHRoaXMsZnVuY3Rpb24odSl7dmFyIGk9dVtyXVtlXTsoaS5ldmVudHx8KGkuZXZlbnQ9dGEuZGlzcGF0Y2goInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikpKS5vbihuLHQpfSk7cmV0dXJuIHRoaXN9LEhsLnRyYW5zaXRpb249ZnVuY3Rpb24oKXtmb3IodmFyIG4sdCxlLHIsdT10aGlzLmlkLGk9KytPbCxvPXRoaXMubmFtZXNwYWNlLGE9W10sYz0wLGw9dGhpcy5sZW5ndGg7bD5jO2MrKyl7YS5wdXNoKG49W10pO2Zvcih2YXIgdD10aGlzW2NdLHM9MCxmPXQubGVuZ3RoO2Y+cztzKyspKGU9dFtzXSkmJihyPWVbb11bdV0sJG8oZSxzLG8saSx7dGltZTpyLnRpbWUsZWFzZTpyLmVhc2UsZGVsYXk6ci5kZWxheStyLmR1cmF0aW9uLGR1cmF0aW9uOnIuZHVyYXRpb259KSksbi5wdXNoKGUpfXJldHVybiBJbyhhLG8saSl9LHRhLnN2Zy5heGlzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbixsPXRhLnNlbGVjdCh0aGlzKSxzPXRoaXMuX19jaGFydF9ffHxlLGY9dGhpcy5fX2NoYXJ0X189ZS5jb3B5KCksaD1udWxsPT1jP2YudGlja3M/Zi50aWNrcy5hcHBseShmLGEpOmYuZG9tYWluKCk6YyxnPW51bGw9PXQ/Zi50aWNrRm9ybWF0P2YudGlja0Zvcm1hdC5hcHBseShmLGEpOkV0OnQscD1sLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsZiksdj1wLmVudGVyKCkuaW5zZXJ0KCJnIiwiLmRvbWFpbiIpLmF0dHIoImNsYXNzIiwidGljayIpLnN0eWxlKCJvcGFjaXR5IixUYSksZD10YS50cmFuc2l0aW9uKHAuZXhpdCgpKS5zdHlsZSgib3BhY2l0eSIsVGEpLnJlbW92ZSgpLG09dGEudHJhbnNpdGlvbihwLm9yZGVyKCkpLnN0eWxlKCJvcGFjaXR5IiwxKSx5PU1hdGgubWF4KHUsMCkrbyxNPVVpKGYpLHg9bC5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFswXSksYj0oeC5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwiZG9tYWluIiksdGEudHJhbnNpdGlvbih4KSk7di5hcHBlbmQoImxpbmUiKSx2LmFwcGVuZCgidGV4dCIpO3ZhciBfLHcsUyxrLEU9di5zZWxlY3QoImxpbmUiKSxBPW0uc2VsZWN0KCJsaW5lIiksTj1wLnNlbGVjdCgidGV4dCIpLnRleHQoZyksQz12LnNlbGVjdCgidGV4dCIpLHo9bS5zZWxlY3QoInRleHQiKSxxPSJ0b3AiPT09cnx8ImxlZnQiPT09cj8tMToxO2lmKCJib3R0b20iPT09cnx8InRvcCI9PT1yPyhuPUJvLF89IngiLFM9InkiLHc9IngyIixrPSJ5MiIsTi5hdHRyKCJkeSIsMD5xPyIwZW0iOiIuNzFlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLGIuYXR0cigiZCIsIk0iK01bMF0rIiwiK3EqaSsiVjBIIitNWzFdKyJWIitxKmkpKToobj1XbyxfPSJ5IixTPSJ4Iix3PSJ5MiIsaz0ieDIiLE4uYXR0cigiZHkiLCIuMzJlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsMD5xPyJlbmQiOiJzdGFydCIpLGIuYXR0cigiZCIsIk0iK3EqaSsiLCIrTVswXSsiSDBWIitNWzFdKyJIIitxKmkpKSxFLmF0dHIoayxxKnUpLEMuYXR0cihTLHEqeSksQS5hdHRyKHcsMCkuYXR0cihrLHEqdSksei5hdHRyKF8sMCkuYXR0cihTLHEqeSksZi5yYW5nZUJhbmQpe3ZhciBMPWYsVD1MLnJhbmdlQmFuZCgpLzI7cz1mPWZ1bmN0aW9uKG4pe3JldHVybiBMKG4pK1R9fWVsc2Ugcy5yYW5nZUJhbmQ/cz1mOmQuY2FsbChuLGYscyk7di5jYWxsKG4scyxmKSxtLmNhbGwobixmLGYpfSl9dmFyIHQsZT10YS5zY2FsZS5saW5lYXIoKSxyPVlsLHU9NixpPTYsbz0zLGE9WzEwXSxjPW51bGw7cmV0dXJuIG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLm9yaWVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10IGluIElsP3QrIiI6WWwsbik6cn0sbi50aWNrcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWFyZ3VtZW50cyxuKTphfSxuLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9dCxuKTpjfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIGU/KHU9K3QsaT0rYXJndW1lbnRzW2UtMV0sbik6dX0sbi5pbm5lclRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG4pOnV9LG4ub3V0ZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKTppfSxuLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LG4pOm99LG4udGlja1N1YmRpdmlkZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoJiZufSxufTt2YXIgWWw9ImJvdHRvbSIsSWw9e3RvcDoxLHJpZ2h0OjEsYm90dG9tOjEsbGVmdDoxfTt0YS5zdmcuYnJ1c2g9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGkpe2kuZWFjaChmdW5jdGlvbigpe3ZhciBpPXRhLnNlbGVjdCh0aGlzKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2giLHUpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIix1KSxvPWkuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpLmRhdGEoWzBdKTtvLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJiYWNrZ3JvdW5kIikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKS5zdHlsZSgiY3Vyc29yIiwiY3Jvc3NoYWlyIiksaS5zZWxlY3RBbGwoIi5leHRlbnQiKS5kYXRhKFswXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImV4dGVudCIpLnN0eWxlKCJjdXJzb3IiLCJtb3ZlIik7dmFyIGE9aS5zZWxlY3RBbGwoIi5yZXNpemUiKS5kYXRhKHAsRXQpO2EuZXhpdCgpLnJlbW92ZSgpLGEuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24obil7cmV0dXJuInJlc2l6ZSAiK259KS5zdHlsZSgiY3Vyc29yIixmdW5jdGlvbihuKXtyZXR1cm4gWmxbbl19KS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IixmdW5jdGlvbihuKXtyZXR1cm4vW2V3XSQvLnRlc3Qobik/LTM6bnVsbH0pLmF0dHIoInkiLGZ1bmN0aW9uKG4pe3JldHVybi9eW25zXS8udGVzdChuKT8tMzpudWxsfSkuYXR0cigid2lkdGgiLDYpLmF0dHIoImhlaWdodCIsNikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxhLnN0eWxlKCJkaXNwbGF5IixuLmVtcHR5KCk/Im5vbmUiOm51bGwpO3ZhciBzLGY9dGEudHJhbnNpdGlvbihpKSxoPXRhLnRyYW5zaXRpb24obyk7YyYmKHM9VWkoYyksaC5hdHRyKCJ4IixzWzBdKS5hdHRyKCJ3aWR0aCIsc1sxXS1zWzBdKSxlKGYpKSxsJiYocz1VaShsKSxoLmF0dHIoInkiLHNbMF0pLmF0dHIoImhlaWdodCIsc1sxXS1zWzBdKSxyKGYpKSx0KGYpfSl9ZnVuY3Rpb24gdChuKXtuLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7cmV0dXJuInRyYW5zbGF0ZSgiK3NbKy9lJC8udGVzdChuKV0rIiwiK2ZbKy9ecy8udGVzdChuKV0rIikifSl9ZnVuY3Rpb24gZShuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoIngiLHNbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIixzWzFdLXNbMF0pfWZ1bmN0aW9uIHIobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IixmWzBdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLGZbMV0tZlswXSl9ZnVuY3Rpb24gdSgpe2Z1bmN0aW9uIHUoKXszMj09dGEuZXZlbnQua2V5Q29kZSYmKE58fCh5PW51bGwselswXS09c1sxXSx6WzFdLT1mWzFdLE49MiksYigpKX1mdW5jdGlvbiBwKCl7MzI9PXRhLmV2ZW50LmtleUNvZGUmJjI9PU4mJih6WzBdKz1zWzFdLHpbMV0rPWZbMV0sTj0wLGIoKSl9ZnVuY3Rpb24gdigpe3ZhciBuPXRhLm1vdXNlKHgpLHU9ITE7TSYmKG5bMF0rPU1bMF0sblsxXSs9TVsxXSksTnx8KHRhLmV2ZW50LmFsdEtleT8oeXx8KHk9WyhzWzBdK3NbMV0pLzIsKGZbMF0rZlsxXSkvMl0pLHpbMF09c1srKG5bMF08eVswXSldLHpbMV09ZlsrKG5bMV08eVsxXSldKTp5PW51bGwpLEUmJmQobixjLDApJiYoZShTKSx1PSEwKSxBJiZkKG4sbCwxKSYmKHIoUyksdT0hMCksdSYmKHQoUyksdyh7dHlwZToiYnJ1c2giLG1vZGU6Tj8ibW92ZSI6InJlc2l6ZSJ9KSl9ZnVuY3Rpb24gZChuLHQsZSl7dmFyIHIsdSxhPVVpKHQpLGM9YVswXSxsPWFbMV0scD16W2VdLHY9ZT9mOnMsZD12WzFdLXZbMF07cmV0dXJuIE4mJihjLT1wLGwtPWQrcCkscj0oZT9nOmgpP01hdGgubWF4KGMsTWF0aC5taW4obCxuW2VdKSk6bltlXSxOP3U9KHIrPXApK2Q6KHkmJihwPU1hdGgubWF4KGMsTWF0aC5taW4obCwyKnlbZV0tcikpKSxyPnA/KHU9cixyPXApOnU9cCksdlswXSE9cnx8dlsxXSE9dT8oZT9vPW51bGw6aT1udWxsLHZbMF09cix2WzFdPXUsITApOnZvaWQgMH1mdW5jdGlvbiBtKCl7digpLFMuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCksdGEuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsbnVsbCkscS5vbigibW91c2Vtb3ZlLmJydXNoIixudWxsKS5vbigibW91c2V1cC5icnVzaCIsbnVsbCkub24oInRvdWNobW92ZS5icnVzaCIsbnVsbCkub24oInRvdWNoZW5kLmJydXNoIixudWxsKS5vbigia2V5ZG93bi5icnVzaCIsbnVsbCkub24oImtleXVwLmJydXNoIixudWxsKSxDKCksdyh7dHlwZToiYnJ1c2hlbmQifSl9dmFyIHksTSx4PXRoaXMsXz10YS5zZWxlY3QodGEuZXZlbnQudGFyZ2V0KSx3PWEub2YoeCxhcmd1bWVudHMpLFM9dGEuc2VsZWN0KHgpLGs9Xy5kYXR1bSgpLEU9IS9eKG58cykkLy50ZXN0KGspJiZjLEE9IS9eKGV8dykkLy50ZXN0KGspJiZsLE49Xy5jbGFzc2VkKCJleHRlbnQiKSxDPVgoKSx6PXRhLm1vdXNlKHgpLHE9dGEuc2VsZWN0KG9hKS5vbigia2V5ZG93bi5icnVzaCIsdSkub24oImtleXVwLmJydXNoIixwKTtpZih0YS5ldmVudC5jaGFuZ2VkVG91Y2hlcz9xLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLHYpLm9uKCJ0b3VjaGVuZC5icnVzaCIsbSk6cS5vbigibW91c2Vtb3ZlLmJydXNoIix2KS5vbigibW91c2V1cC5icnVzaCIsbSksUy5pbnRlcnJ1cHQoKS5zZWxlY3RBbGwoIioiKS5pbnRlcnJ1cHQoKSxOKXpbMF09c1swXS16WzBdLHpbMV09ZlswXS16WzFdO2Vsc2UgaWYoayl7dmFyIEw9Ky93JC8udGVzdChrKSxUPSsvXm4vLnRlc3Qoayk7TT1bc1sxLUxdLXpbMF0sZlsxLVRdLXpbMV1dLHpbMF09c1tMXSx6WzFdPWZbVF19ZWxzZSB0YS5ldmVudC5hbHRLZXkmJih5PXouc2xpY2UoKSk7Uy5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLHRhLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLF8uc3R5bGUoImN1cnNvciIpKSx3KHt0eXBlOiJicnVzaHN0YXJ0In0pLHYoKX12YXIgaSxvLGE9dyhuLCJicnVzaHN0YXJ0IiwiYnJ1c2giLCJicnVzaGVuZCIpLGM9bnVsbCxsPW51bGwscz1bMCwwXSxmPVswLDBdLGg9ITAsZz0hMCxwPVZsWzBdO3JldHVybiBuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPWEub2YodGhpcyxhcmd1bWVudHMpLHQ9e3g6cyx5OmYsaTppLGo6b30sZT10aGlzLl9fY2hhcnRfX3x8dDt0aGlzLl9fY2hhcnRfXz10LFVsP3RhLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZWFjaCgic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7aT1lLmksbz1lLmoscz1lLngsZj1lLnksbih7dHlwZToiYnJ1c2hzdGFydCJ9KX0pLnR3ZWVuKCJicnVzaDpicnVzaCIsZnVuY3Rpb24oKXt2YXIgZT15dShzLHQueCkscj15dShmLHQueSk7cmV0dXJuIGk9bz1udWxsLGZ1bmN0aW9uKHUpe3M9dC54PWUodSksZj10Lnk9cih1KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pfX0pLmVhY2goImVuZC5icnVzaCIsZnVuY3Rpb24oKXtpPXQuaSxvPXQuaixuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pfSk6KG4oe3R5cGU6ImJydXNoc3RhcnQifSksbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSxuKHt0eXBlOiJicnVzaGVuZCJ9KSl9KX0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQscD1WbFshYzw8MXwhbF0sbik6Y30sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQscD1WbFshYzw8MXwhbF0sbik6bH0sbi5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYyYmbD8oaD0hIXRbMF0sZz0hIXRbMV0pOmM/aD0hIXQ6bCYmKGc9ISF0KSxuKTpjJiZsP1toLGddOmM/aDpsP2c6bnVsbH0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGUscix1LGEsaDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYyYmKGU9dFswXSxyPXRbMV0sbCYmKGU9ZVswXSxyPXJbMF0pLGk9W2Uscl0sYy5pbnZlcnQmJihlPWMoZSkscj1jKHIpKSxlPnImJihoPWUsZT1yLHI9aCksKGUhPXNbMF18fHIhPXNbMV0pJiYocz1bZSxyXSkpLGwmJih1PXRbMF0sYT10WzFdLGMmJih1PXVbMV0sYT1hWzFdKSxvPVt1LGFdLGwuaW52ZXJ0JiYodT1sKHUpLGE9bChhKSksdT5hJiYoaD11LHU9YSxhPWgpLCh1IT1mWzBdfHxhIT1mWzFdKSYmKGY9W3UsYV0pKSxuKTooYyYmKGk/KGU9aVswXSxyPWlbMV0pOihlPXNbMF0scj1zWzFdLGMuaW52ZXJ0JiYoZT1jLmludmVydChlKSxyPWMuaW52ZXJ0KHIpKSxlPnImJihoPWUsZT1yLHI9aCkpKSxsJiYobz8odT1vWzBdLGE9b1sxXSk6KHU9ZlswXSxhPWZbMV0sbC5pbnZlcnQmJih1PWwuaW52ZXJ0KHUpLGE9bC5pbnZlcnQoYSkpLHU+YSYmKGg9dSx1PWEsYT1oKSkpLGMmJmw/W1tlLHVdLFtyLGFdXTpjP1tlLHJdOmwmJlt1LGFdKX0sbi5jbGVhcj1mdW5jdGlvbigpe3JldHVybiBuLmVtcHR5KCl8fChzPVswLDBdLGY9WzAsMF0saT1vPW51bGwpLG59LG4uZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hIWMmJnNbMF09PXNbMV18fCEhbCYmZlswXT09ZlsxXX0sdGEucmViaW5kKG4sYSwib24iKX07dmFyIFpsPXtuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LFZsPVtbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLFsiZSIsInciXSxbIm4iLCJzIl0sW11dLFhsPWZjLmZvcm1hdD1tYy50aW1lRm9ybWF0LCRsPVhsLnV0YyxCbD0kbCgiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7WGwuaXNvPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nJiYrbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP0pvOkJsLEpvLnBhcnNlPWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBEYXRlKG4pO3JldHVybiBpc05hTih0KT9udWxsOnR9LEpvLnRvU3RyaW5nPUJsLnRvU3RyaW5nLGZjLnNlY29uZD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IGhjKDFlMypNYXRoLmZsb29yKG4vMWUzKSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzFlMypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfSksZmMuc2Vjb25kcz1mYy5zZWNvbmQucmFuZ2UsZmMuc2Vjb25kcy51dGM9ZmMuc2Vjb25kLnV0Yy5yYW5nZSxmYy5taW51dGU9RnQoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBoYyg2ZTQqTWF0aC5mbG9vcihuLzZlNCkpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSs2ZTQqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX0pLGZjLm1pbnV0ZXM9ZmMubWludXRlLnJhbmdlLGZjLm1pbnV0ZXMudXRjPWZjLm1pbnV0ZS51dGMucmFuZ2UsZmMuaG91cj1GdChmdW5jdGlvbihuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCkvNjA7cmV0dXJuIG5ldyBoYygzNmU1KihNYXRoLmZsb29yKG4vMzZlNS10KSt0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzM2ZTUqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9KSxmYy5ob3Vycz1mYy5ob3VyLnJhbmdlLGZjLmhvdXJzLnV0Yz1mYy5ob3VyLnV0Yy5yYW5nZSxmYy5tb250aD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1mYy5kYXkobiksbi5zZXREYXRlKDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRNb250aChuLmdldE1vbnRoKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9KSxmYy5tb250aHM9ZmMubW9udGgucmFuZ2UsZmMubW9udGhzLnV0Yz1mYy5tb250aC51dGMucmFuZ2U7dmFyIFdsPVsxZTMsNWUzLDE1ZTMsM2U0LDZlNCwzZTUsOWU1LDE4ZTUsMzZlNSwxMDhlNSwyMTZlNSw0MzJlNSw4NjRlNSwxNzI4ZTUsNjA0OGU1LDI1OTJlNiw3Nzc2ZTYsMzE1MzZlNl0sSmw9W1tmYy5zZWNvbmQsMV0sW2ZjLnNlY29uZCw1XSxbZmMuc2Vjb25kLDE1XSxbZmMuc2Vjb25kLDMwXSxbZmMubWludXRlLDFdLFtmYy5taW51dGUsNV0sW2ZjLm1pbnV0ZSwxNV0sW2ZjLm1pbnV0ZSwzMF0sW2ZjLmhvdXIsMV0sW2ZjLmhvdXIsM10sW2ZjLmhvdXIsNl0sW2ZjLmhvdXIsMTJdLFtmYy5kYXksMV0sW2ZjLmRheSwyXSxbZmMud2VlaywxXSxbZmMubW9udGgsMV0sW2ZjLm1vbnRoLDNdLFtmYy55ZWFyLDFdXSxHbD1YbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKSYmMSE9bi5nZXREYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbihuKXtyZXR1cm4gMSE9bi5nZXREYXRlKCl9XSxbIiVCIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfV0sWyIlWSIsTmVdXSksS2w9e3JhbmdlOmZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gdGEucmFuZ2UoTWF0aC5jZWlsKG4vZSkqZSwrdCxlKS5tYXAoS28pfSxmbG9vcjpFdCxjZWlsOkV0fTtKbC55ZWFyPWZjLnllYXIsZmMuc2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gR28odGEuc2NhbGUubGluZWFyKCksSmwsR2wpfTt2YXIgUWw9SmwubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuWzBdLnV0YyxuWzFdXX0pLG5zPSRsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDU2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDSG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ0RheSgpJiYxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCl9XSxbIiVZIixOZV1dKTtRbC55ZWFyPWZjLnllYXIudXRjLGZjLnNjYWxlLnV0Yz1mdW5jdGlvbigpe3JldHVybiBHbyh0YS5zY2FsZS5saW5lYXIoKSxRbCxucyl9LHRhLnRleHQ9QXQoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VUZXh0fSksdGEuanNvbj1mdW5jdGlvbihuLHQpe3JldHVybiBOdChuLCJhcHBsaWNhdGlvbi9qc29uIixRbyx0KX0sdGEuaHRtbD1mdW5jdGlvbihuLHQpe3JldHVybiBOdChuLCJ0ZXh0L2h0bWwiLG5hLHQpfSx0YS54bWw9QXQoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VYTUx9KSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0YSk6Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYobW9kdWxlLmV4cG9ydHM9dGEpLHRoaXMuZDM9dGF9KCk7"></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogImZvcmNlTmV0d29yayIsCgogIHR5cGU6ICJvdXRwdXQiLAoKICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewoKICAgIGQzLnNlbGVjdChlbCkuYXBwZW5kKCJzdmciKQogICAgICAgIC5hdHRyKCJ3aWR0aCIsIHdpZHRoKQogICAgICAgIC5hdHRyKCJoZWlnaHQiLCBoZWlnaHQpOwoKICAgIHJldHVybiBkMy5sYXlvdXQuZm9yY2UoKTsKICB9LAoKICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBmb3JjZSkgewoKICAgIGQzLnNlbGVjdChlbCkuc2VsZWN0KCJzdmciKQogICAgICAgIC5hdHRyKCJ3aWR0aCIsIHdpZHRoKQogICAgICAgIC5hdHRyKCJoZWlnaHQiLCBoZWlnaHQpOwoKICAgIGZvcmNlLnNpemUoW3dpZHRoLCBoZWlnaHRdKS5yZXN1bWUoKTsKICB9LAoKICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHgsIGZvcmNlKSB7CgogIC8vIENvbXB1dGUgdGhlIG5vZGUgcmFkaXVzICB1c2luZyB0aGUgamF2YXNjcmlwdCBtYXRoIGV4cHJlc3Npb24gc3BlY2lmaWVkCiAgICBmdW5jdGlvbiBub2RlU2l6ZShkKSB7CiAgICAgICAgICAgIGlmKG9wdGlvbnMubm9kZXNpemUpewogICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsKG9wdGlvbnMucmFkaXVzQ2FsY3VsYXRpb24pOwoKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDZ9CgogICAgfQoKCiAgICAvLyBhbGlhcyBvcHRpb25zCiAgICB2YXIgb3B0aW9ucyA9IHgub3B0aW9uczsKCiAgICAvLyBjb252ZXJ0IGxpbmtzIGFuZCBub2RlcyBkYXRhIGZyYW1lcyB0byBkMyBmcmllbmRseSBmb3JtYXQKICAgIHZhciBsaW5rcyA9IEhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMoeC5saW5rcyk7CiAgICB2YXIgbm9kZXMgPSBIVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzKHgubm9kZXMpOwoKICAgIC8vIGdldCB0aGUgd2lkdGggYW5kIGhlaWdodAogICAgdmFyIHdpZHRoID0gZWwub2Zmc2V0V2lkdGg7CiAgICB2YXIgaGVpZ2h0ID0gZWwub2Zmc2V0SGVpZ2h0OwoKICAgIHZhciBjb2xvciA9IGV2YWwob3B0aW9ucy5jb2xvdXJTY2FsZSk7CgogICAgLy8gc2V0IHRoaXMgdXAgZXZlbiBpZiB6b29tID0gRgogICAgdmFyIHpvb20gPSBkMy5iZWhhdmlvci56b29tKCk7CgogICAgLy8gY3JlYXRlIGQzIGZvcmNlIGxheW91dAogICAgZm9yY2UKICAgICAgLm5vZGVzKGQzLnZhbHVlcyhub2RlcykpCiAgICAgIC5saW5rcyhsaW5rcykKICAgICAgLnNpemUoW3dpZHRoLCBoZWlnaHRdKQogICAgICAubGlua0Rpc3RhbmNlKG9wdGlvbnMubGlua0Rpc3RhbmNlKQogICAgICAuY2hhcmdlKG9wdGlvbnMuY2hhcmdlKQogICAgICAub24oInRpY2siLCB0aWNrKQogICAgICAuc3RhcnQoKTsKCiAgICAvLyB0aGFua3MgaHR0cDovL3BsbmtyLmNvL2VkaXQvY3hMbHZJbG1vMVk2dkp5UHM2Tjk/cD1wcmV2aWV3CiAgICAvLyAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yMjkyNDI1My9hZGRpbmctcGFuLXpvb20tdG8tZDNqcy1mb3JjZS1kaXJlY3RlZAogICAgICB2YXIgZHJhZyA9IGZvcmNlLmRyYWcoKQogICAgICAgIC5vbigiZHJhZ3N0YXJ0IiwgZHJhZ3N0YXJ0KQogICAgICAvLyBhbGxvdyBmb3JjZSBkcmFnIHRvIHdvcmsgd2l0aCBwYW4vem9vbSBkcmFnCiAgICAgIGZ1bmN0aW9uIGRyYWdzdGFydChkKSB7CiAgICAgICAgZDMuZXZlbnQuc291cmNlRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICBkMy5ldmVudC5zb3VyY2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgfQoKICAgIC8vIHNlbGVjdCB0aGUgc3ZnIGVsZW1lbnQgYW5kIHJlbW92ZSBleGlzdGluZyBjaGlsZHJlbgogICAgdmFyIHN2ZyA9IGQzLnNlbGVjdChlbCkuc2VsZWN0KCJzdmciKTsKICAgIHN2Zy5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTsKICAgIC8vIGFkZCB0d28gZyBsYXllcnM7IHRoZSBmaXJzdCB3aWxsIGJlIHpvb20gdGFyZ2V0IGlmIHpvb20gPSBUCiAgICAvLyAgZmluZSB0byBoYXZlIHR3byBnIGxheWVycyBldmVuIGlmIHpvb20gPSBGCiAgICBzdmcgPSBzdmcKICAgICAgICAuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJ6b29tLWxheWVyIikKICAgICAgICAuYXBwZW5kKCJnIikKCiAgICAvLyBhZGQgem9vbWluZyBpZiByZXF1ZXN0ZWQKICAgIGlmIChvcHRpb25zLnpvb20pIHsKICAgICAgZnVuY3Rpb24gcmVkcmF3KCkgewogICAgICAgIGQzLnNlbGVjdChlbCkuc2VsZWN0KCIuem9vbS1sYXllciIpLmF0dHIoInRyYW5zZm9ybSIsCiAgICAgICAgICAidHJhbnNsYXRlKCIgKyBkMy5ldmVudC50cmFuc2xhdGUgKyAiKSIrCiAgICAgICAgICAiIHNjYWxlKCIgKyBkMy5ldmVudC5zY2FsZSArICIpIik7CiAgICAgIH0KICAgICAgem9vbS5vbigiem9vbSIsIHJlZHJhdykKCiAgICAgIGQzLnNlbGVjdChlbCkuc2VsZWN0KCJzdmciKQogICAgICAgIC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKQogICAgICAgIC5jYWxsKHpvb20pOwoKICAgIH0gZWxzZSB7CiAgICAgIHpvb20ub24oInpvb20iLCBudWxsKTsKICAgIH0KCiAgICAvLyBkcmF3IGxpbmtzCiAgICB2YXIgbGluayA9IHN2Zy5zZWxlY3RBbGwoIi5saW5rIikKICAgICAgLmRhdGEoZm9yY2UubGlua3MoKSkKICAgICAgLmVudGVyKCkuYXBwZW5kKCJsaW5lIikKICAgICAgLmF0dHIoImNsYXNzIiwgImxpbmsiKQogICAgICAuc3R5bGUoInN0cm9rZSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuY29sb3VyIDsgfSkKICAgICAgLy8uc3R5bGUoInN0cm9rZSIsIG9wdGlvbnMubGlua0NvbG91cikKICAgICAgLnN0eWxlKCJvcGFjaXR5Iiwgb3B0aW9ucy5vcGFjaXR5KQogICAgICAuc3R5bGUoInN0cm9rZS13aWR0aCIsIGV2YWwoIigiICsgb3B0aW9ucy5saW5rV2lkdGggKyAiKSIpKQogICAgICAub24oIm1vdXNlb3ZlciIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKQogICAgICAgICAgICAuc3R5bGUoIm9wYWNpdHkiLCAxKTsKICAgICAgfSkKICAgICAgLm9uKCJtb3VzZW91dCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKQogICAgICAgICAgICAuc3R5bGUoIm9wYWNpdHkiLCBvcHRpb25zLm9wYWNpdHkpOwogICAgICB9KTsKCiAgICAvLyBkcmF3IG5vZGVzCiAgICB2YXIgbm9kZSA9IHN2Zy5zZWxlY3RBbGwoIi5ub2RlIikKICAgICAgLmRhdGEoZm9yY2Uubm9kZXMoKSkKICAgICAgLmVudGVyKCkuYXBwZW5kKCJnIikKICAgICAgLmF0dHIoImNsYXNzIiwgIm5vZGUiKQogICAgICAuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBjb2xvcihkLmdyb3VwKTsgfSkKICAgICAgLnN0eWxlKCJvcGFjaXR5Iiwgb3B0aW9ucy5vcGFjaXR5KQogICAgICAub24oIm1vdXNlb3ZlciIsIG1vdXNlb3ZlcikKICAgICAgLm9uKCJtb3VzZW91dCIsIG1vdXNlb3V0KQogICAgICAub24oImNsaWNrIiwgY2xpY2spCiAgICAgIC5jYWxsKGZvcmNlLmRyYWcpOwoKICAgIG5vZGUuYXBwZW5kKCJjaXJjbGUiKQogICAgICAuYXR0cigiciIsIGZ1bmN0aW9uKGQpe3JldHVybiBub2RlU2l6ZShkKTt9KQogICAgICAuc3R5bGUoInN0cm9rZSIsICIjZmZmIikKICAgICAgLnN0eWxlKCJvcGFjaXR5Iiwgb3B0aW9ucy5vcGFjaXR5KQogICAgICAuc3R5bGUoInN0cm9rZS13aWR0aCIsICIxLjVweCIpOwoKICAgIG5vZGUuYXBwZW5kKCJzdmc6dGV4dCIpCiAgICAgIC5hdHRyKCJjbGFzcyIsICJub2RldGV4dCIpCiAgICAgIC5hdHRyKCJkeCIsIDEyKQogICAgICAuYXR0cigiZHkiLCAiLjM1ZW0iKQogICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLm5hbWUgfSkKICAgICAgLnN0eWxlKCJmb250Iiwgb3B0aW9ucy5mb250U2l6ZSArICJweCAiICsgb3B0aW9ucy5mb250RmFtaWx5KQogICAgICAuc3R5bGUoIm9wYWNpdHkiLCBvcHRpb25zLm9wYWNpdHlOb0hvdmVyKQogICAgICAuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwgIm5vbmUiKTsKCiAgICBmdW5jdGlvbiB0aWNrKCkgewogICAgICBub2RlLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICBpZihvcHRpb25zLmJvdW5kZWQpeyAvLyBhZGRzIGJvdW5kaW5nIGJveAogICAgICAgICAgICBkLnggPSBNYXRoLm1heChub2RlU2l6ZShkKSwgTWF0aC5taW4od2lkdGggLSBub2RlU2l6ZShkKSwgZC54KSk7CiAgICAgICAgICAgIGQueSA9IE1hdGgubWF4KG5vZGVTaXplKGQpLCBNYXRoLm1pbihoZWlnaHQgLSBub2RlU2l6ZShkKSwgZC55KSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyBkLnggKyAiLCIgKyBkLnkgKyAiKSJ9KTsKICAgICAgICAKICAgICAgbGluawogICAgICAgIC5hdHRyKCJ4MSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuc291cmNlLng7IH0pCiAgICAgICAgLmF0dHIoInkxIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5zb3VyY2UueTsgfSkKICAgICAgICAuYXR0cigieDIiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnRhcmdldC54OyB9KQogICAgICAgIC5hdHRyKCJ5MiIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudGFyZ2V0Lnk7IH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdXNlb3ZlcigpIHsKICAgICAgZDMuc2VsZWN0KHRoaXMpLnNlbGVjdCgiY2lyY2xlIikudHJhbnNpdGlvbigpCiAgICAgICAgLmR1cmF0aW9uKDc1MCkKICAgICAgICAuYXR0cigiciIsIGZ1bmN0aW9uKGQpe3JldHVybiBub2RlU2l6ZShkKSs1O30pOwogICAgICBkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJ0ZXh0IikudHJhbnNpdGlvbigpCiAgICAgICAgLmR1cmF0aW9uKDc1MCkKICAgICAgICAuYXR0cigieCIsIDEzKQogICAgICAgIC5zdHlsZSgic3Ryb2tlLXdpZHRoIiwgIi41cHgiKQogICAgICAgIC5zdHlsZSgiZm9udCIsIG9wdGlvbnMuY2xpY2tUZXh0U2l6ZSArICJweCAiKQogICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdXNlb3V0KCkgewogICAgICBkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJjaXJjbGUiKS50cmFuc2l0aW9uKCkKICAgICAgICAuZHVyYXRpb24oNzUwKQogICAgICAgIC5hdHRyKCJyIiwgZnVuY3Rpb24oZCl7cmV0dXJuIG5vZGVTaXplKGQpO30pOwogICAgICBkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJ0ZXh0IikudHJhbnNpdGlvbigpCiAgICAgICAgLmR1cmF0aW9uKDEyNTApCiAgICAgICAgLmF0dHIoIngiLCAwKQogICAgICAgIC5zdHlsZSgiZm9udCIsIG9wdGlvbnMuZm9udFNpemUgKyAicHggIikgCiAgICAgICAgLnN0eWxlKCJvcGFjaXR5Iiwgb3B0aW9ucy5vcGFjaXR5Tm9Ib3Zlcik7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNsaWNrKGQpIHsKICAgICAgcmV0dXJuIGV2YWwob3B0aW9ucy5jbGlja0FjdGlvbikKICAgIH0KCiAgICAvLyBhZGQgbGVnZW5kIG9wdGlvbgogICAgaWYob3B0aW9ucy5sZWdlbmQpewogICAgICAgIHZhciBsZWdlbmRSZWN0U2l6ZSA9IDE4OwogICAgICAgIHZhciBsZWdlbmRTcGFjaW5nID0gNDsKICAgICAgICB2YXIgbGVnZW5kID0gc3ZnLnNlbGVjdEFsbCgnLmxlZ2VuZCcpCiAgICAgICAgICAuZGF0YShjb2xvci5kb21haW4oKSkKICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsZWdlbmQnKQogICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICAgICAgdmFyIGhlaWdodCA9IGxlZ2VuZFJlY3RTaXplICsgbGVnZW5kU3BhY2luZzsKICAgICAgICAgICAgdmFyIG9mZnNldCA9ICBoZWlnaHQgKiBjb2xvci5kb21haW4oKS5sZW5ndGggLyAyOwogICAgICAgICAgICB2YXIgaG9yeiA9IGxlZ2VuZFJlY3RTaXplOwogICAgICAgICAgICB2YXIgdmVydCA9IGkgKiBoZWlnaHQrNDsKICAgICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIGhvcnogKyAnLCcgKyB2ZXJ0ICsgJyknOwogICAgICAgICAgfSk7CgogICAgICAgIGxlZ2VuZC5hcHBlbmQoJ3JlY3QnKQogICAgICAgICAgLmF0dHIoJ3dpZHRoJywgbGVnZW5kUmVjdFNpemUpCiAgICAgICAgICAuYXR0cignaGVpZ2h0JywgbGVnZW5kUmVjdFNpemUpCiAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBjb2xvcikKICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgY29sb3IpOwoKICAgICAgICBsZWdlbmQuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgIC5hdHRyKCd4JywgbGVnZW5kUmVjdFNpemUgKyBsZWdlbmRTcGFjaW5nKQogICAgICAgICAgLmF0dHIoJ3knLCBsZWdlbmRSZWN0U2l6ZSAtIGxlZ2VuZFNwYWNpbmcpCiAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkOyB9KTsKICAgIH0KICAgIAogICAgLy8gbWFrZSBmb250LWZhbWlseSBjb25zaXN0ZW50IGFjcm9zcyBhbGwgZWxlbWVudHMKICAgIGQzLnNlbGVjdChlbCkuc2VsZWN0QWxsKCd0ZXh0Jykuc3R5bGUoJ2ZvbnQtZmFtaWx5Jywgb3B0aW9ucy5mb250RmFtaWx5KTsKICB9LAp9KTsK"></script>
<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMS4zIHwgKGMpIDIwMDUsIDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9IjEuMTEuMyIsbT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbS5mbi5pbml0KGEsYil9LG49L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLG89L14tbXMtLyxwPS8tKFtcZGEtel0pL2dpLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTttLmZuPW0ucHJvdG90eXBlPXtqcXVlcnk6bCxjb25zdHJ1Y3RvcjptLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1tLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbS5leHRlbmQ9bS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG0uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihtLmlzUGxhaW5PYmplY3QoYyl8fChiPW0uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbS5pc0FycmF5KGEpP2E6W10pOmY9YSYmbS5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1tLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbS5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGwrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW0udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bS50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4hbS5pc0FycmF5KGEpJiZhLXBhcnNlRmxvYXQoYSkrMT49MH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFhfHwib2JqZWN0IiE9PW0udHlwZShhKXx8YS5ub2RlVHlwZXx8bS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9aWYoay5vd25MYXN0KWZvcihiIGluIGEpcmV0dXJuIGouY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxqLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZtLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UobywibXMtIikucmVwbGFjZShwLHEpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cihhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShuLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihyKE9iamVjdChhKSk/bS5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGcpcmV0dXJuIGcuY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXIoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9ZiksbS5pc0Z1bmN0aW9uKGEpPyhjPWQuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZS5ndWlkPWEuZ3VpZD1hLmd1aWR8fG0uZ3VpZCsrLGUpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omt9KSxtLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHIoYSl7dmFyIGI9Imxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPW0udHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iPT09Y3x8bS5pc1dpbmRvdyhhKT8hMToxPT09YS5ub2RlVHlwZSYmYj8hMDoiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgcz1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PSJzaXp6bGUiKzEqbmV3IERhdGUsdj1hLmRvY3VtZW50LHc9MCx4PTAseT1oYSgpLHo9aGEoKSxBPWhhKCksQj1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09YiYmKGw9ITApLDB9LEM9MTw8MzEsRD17fS5oYXNPd25Qcm9wZXJ0eSxFPVtdLEY9RS5wb3AsRz1FLnB1c2gsSD1FLnB1c2gsST1FLnNsaWNlLEo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LEs9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixMPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixNPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTj1NLnJlcGxhY2UoInciLCJ3IyIpLE89IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitOKyIpKXwpIitMKyIqXFxdIixQPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTysiKSopfC4qKVxcKXwpIixRPW5ldyBSZWdFeHAoTCsiKyIsImciKSxSPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUz1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFQ9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxVPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFY9bmV3IFJlZ0V4cChQKSxXPW5ldyBSZWdFeHAoIl4iK04rIiQiKSxYPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTS5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrTyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK1ApLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTCsiKig/OihbKy1dfCkiK0wrIiooXFxkKyl8KSkiK0wrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0srIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitMKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0wrIiooKD86LVxcZCk/XFxkKikiK0wrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxaPS9eaFxkJC9pLCQ9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLF89L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxhYT0vWyt+XS8sYmE9Lyd8XFwvZyxjYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksZGE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGVhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChmYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZ2EoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3LHg7aWYoKGI/Yi5vd25lckRvY3VtZW50fHxiOnYpIT09biYmbShiKSxiPWJ8fG4sZD1kfHxbXSxrPWIubm9kZVR5cGUsInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIGQ7aWYoIWUmJnApe2lmKDExIT09ayYmKGY9Xy5leGVjKGEpKSlpZihqPWZbMV0pe2lmKDk9PT1rKXtpZihoPWIuZ2V0RWxlbWVudEJ5SWQoaiksIWh8fCFoLnBhcmVudE5vZGUpcmV0dXJuIGQ7aWYoaC5pZD09PWopcmV0dXJuIGQucHVzaChoKSxkfWVsc2UgaWYoYi5vd25lckRvY3VtZW50JiYoaD1iLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaikpJiZ0KGIsaCkmJmguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNle2lmKGZbMl0pcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChqPWZbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaikpLGR9aWYoYy5xc2EmJighcXx8IXEudGVzdChhKSkpe2lmKHM9cj11LHc9Yix4PTEhPT1rJiZhLDE9PT1rJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bz1nKGEpLChyPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXIucmVwbGFjZShiYSwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscykscz0iW2lkPSciK3MrIiddICIsbD1vLmxlbmd0aDt3aGlsZShsLS0pb1tsXT1zK3JhKG9bbF0pO3c9YWEudGVzdChhKSYmcGEoYi5wYXJlbnROb2RlKXx8Yix4PW8uam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBILmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHgpKSxkfWNhdGNoKHkpe31maW5hbGx5e3J8fGIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFIsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGhhKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBpYShhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGphKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEMpLSh+YS5zb3VyY2VJbmRleHx8Qyk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gaWEoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaWEoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBwYShhKXtyZXR1cm4gYSYmInVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZhfWM9Z2Euc3VwcG9ydD17fSxmPWdhLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxtPWdhLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGUsZz1hP2Eub3duZXJEb2N1bWVudHx8YTp2O3JldHVybiBnIT09biYmOT09PWcubm9kZVR5cGUmJmcuZG9jdW1lbnRFbGVtZW50PyhuPWcsbz1nLmRvY3VtZW50RWxlbWVudCxlPWcuZGVmYXVsdFZpZXcsZSYmZSE9PWUudG9wJiYoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixlYSwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib251bmxvYWQiLGVhKSkscD0hZihnKSxjLmF0dHJpYnV0ZXM9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChnLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT0kLnRlc3QoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxjLmdldEJ5SWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIG8uYXBwZW5kQ2hpbGQoYSkuaWQ9dSwhZy5nZXRFbGVtZW50c0J5TmFtZXx8IWcuZ2V0RWxlbWVudHNCeU5hbWUodSkubGVuZ3RofSksYy5nZXRCeUlkPyhkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGMmJmMucGFyZW50Tm9kZT9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuIHA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT0kLnRlc3QoZy5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXGZdJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK0wrIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK0wrIiooPzp2YWx1ZXwiK0srIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit1KyItXSIpLmxlbmd0aHx8cS5wdXNoKCJ+PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHEucHVzaCgiOmNoZWNrZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit1KyIrKiIpLmxlbmd0aHx8cS5wdXNoKCIuIy4rWyt+XSIpfSksamEoZnVuY3Rpb24oYSl7dmFyIGI9Zy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmcS5wdXNoKCJuYW1lIitMKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fHEucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxxLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9JC50ZXN0KHM9by5tYXRjaGVzfHxvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8by5tb3pNYXRjaGVzU2VsZWN0b3J8fG8ub01hdGNoZXNTZWxlY3Rvcnx8by5tc01hdGNoZXNTZWxlY3RvcikpJiZqYShmdW5jdGlvbihhKXtjLmRpc2Nvbm5lY3RlZE1hdGNoPXMuY2FsbChhLCJkaXYiKSxzLmNhbGwoYSwiW3MhPScnXTp4Iiksci5wdXNoKCIhPSIsUCl9KSxxPXEubGVuZ3RoJiZuZXcgUmVnRXhwKHEuam9pbigifCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbigifCIpKSxiPSQudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fCQudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PWd8fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09Z3x8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9KKGssYSktSihrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGU9YS5wYXJlbnROb2RlLGY9Yi5wYXJlbnROb2RlLGg9W2FdLGk9W2JdO2lmKCFlfHwhZilyZXR1cm4gYT09PWc/LTE6Yj09PWc/MTplPy0xOmY/MTprP0ooayxhKS1KKGssYik6MDtpZihlPT09ZilyZXR1cm4gbGEoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlpLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWlbZF0pZCsrO3JldHVybiBkP2xhKGhbZF0saVtkXSk6aFtkXT09PXY/LTE6aVtkXT09PXY/MTowfSxnKTpufSxnYS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdhKGEsbnVsbCxudWxsLGIpfSxnYS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksYj1iLnJlcGxhY2UoVSwiPSckMSddIiksISghYy5tYXRjaGVzU2VsZWN0b3J8fCFwfHxyJiZyLnRlc3QoYil8fHEmJnEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGdhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGdhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZ2EuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGdhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZ2EudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWdhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1nYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzppYSxtYXRjaDpYLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoY2EsZGEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGNhLGRhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8Z2EuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZ2EuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFguQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVi50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9Z2EuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShRLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmcyl7az1xW3VdfHwocVt1XT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLG09alswXT09PXcmJmpbMl0sbD1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoMT09PWwubm9kZVR5cGUmJisrbSYmbD09PWIpe2tbYV09W3csbixtXTticmVha319ZWxzZSBpZihzJiYoaj0oYlt1XXx8KGJbdV09e30pKVthXSkmJmpbMF09PT13KW09alsxXTtlbHNlIHdoaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKChoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpJiYrK20mJihzJiYoKGxbdV18fChsW3VdPXt9KSlbYV09W3csbV0pLGw9PT1iKSlicmVhaztyZXR1cm4gbS09ZSxtPT09ZHx8bSVkPT09MCYmbS9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVt1XT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9pYShmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SihhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDppYShmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUiwiJDEiKSk7cmV0dXJuIGRbdV0/aWEoZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSkoZj1nW2hdKSYmKGFbaF09IShiW2hdPWYpKX0pOmZ1bmN0aW9uKGEsZSxmKXtyZXR1cm4gYlswXT1hLGQoYixudWxsLGYsYyksYlswXT1udWxsLCFjLnBvcCgpfX0pLGhhczppYShmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGdhKGEsYikubGVuZ3RoPjB9fSksY29udGFpbnM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKGNhLGRhKSxmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzppYShmdW5jdGlvbihhKXtyZXR1cm4gVy50ZXN0KGF8fCIiKXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBaLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBZLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0Om9hKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpvYShmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6b2EoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6b2EoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPW1hKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPW5hKGIpO2Z1bmN0aW9uIHFhKCl7fXFhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgcWEsZz1nYS50b2tlbml6ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9elthKyIgIl07aWYoaylyZXR1cm4gYj8wOmsuc2xpY2UoMCk7aD1hLGk9W10saj1kLnByZUZpbHRlcjt3aGlsZShoKXsoIWN8fChlPVMuZXhlYyhoKSkpJiYoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1ULmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFIsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1YW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiByYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHNhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGo9W3csZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihpPWJbdV18fChiW3VdPXt9KSwoaD1pW2RdKSYmaFswXT09PXcmJmhbMV09PT1mKXJldHVybiBqWzJdPWhbMl07aWYoaVtkXT1qLGpbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiB0YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB1YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB2YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHdhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXdhKGQpKSxlJiYhZVt1XSYmKGU9d2EoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dWEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6dmEocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXZhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9KKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj12YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SC5hcHBseShnLHIpfSl9ZnVuY3Rpb24geGEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1zYShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIEooYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2Y+aTtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bc2EodGEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHdhKGk+MSYmdGEobSksaT4xJiZyYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFIsIiQxIiksYyxlPmkmJnhhKGEuc2xpY2UoaSxlKSksZj5lJiZ4YShhPWEuc2xpY2UoZSkpLGY+ZSYmcmEoYSkpfW0ucHVzaChjKX1yZXR1cm4gdGEobSl9ZnVuY3Rpb24geWEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbSxvLHA9MCxxPSIwIixyPWYmJltdLHM9W10sdD1qLHU9Znx8ZSYmZC5maW5kLlRBRygiKiIsayksdj13Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD11Lmxlbmd0aDtmb3IoayYmKGo9ZyE9PW4mJmcpO3EhPT14JiZudWxsIT0obD11W3FdKTtxKyspe2lmKGUmJmwpe209MDt3aGlsZShvPWFbbSsrXSlpZihvKGwsZyxoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXYpfWMmJigobD0hbyYmbCkmJnAtLSxmJiZyLnB1c2gobCkpfWlmKHArPXEsYyYmcSE9PXApe209MDt3aGlsZShvPWJbbSsrXSlvKHIscyxnLGgpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09Ri5jYWxsKGkpKTtzPXZhKHMpfUguYXBwbHkoaSxzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz12LGo9dCkscn07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eGEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHlhKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGUsZil7dmFyIGksaixrLGwsbSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG89IWYmJmcoYT1uLnNlbGVjdG9yfHxhKTtpZihlPWV8fFtdLDE9PT1vLmxlbmd0aCl7aWYoaj1vWzBdPW9bMF0uc2xpY2UoMCksai5sZW5ndGg+MiYmIklEIj09PShrPWpbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJnAmJmQucmVsYXRpdmVbalsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO24mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGouc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9WC5uZWVkc0NvbnRleHQudGVzdChhKT8wOmoubGVuZ3RoO3doaWxlKGktLSl7aWYoaz1qW2ldLGQucmVsYXRpdmVbbD1rLnR5cGVdKWJyZWFrO2lmKChtPWQuZmluZFtsXSkmJihmPW0oay5tYXRjaGVzWzBdLnJlcGxhY2UoY2EsZGEpLGFhLnRlc3QoalswXS50eXBlKSYmcGEoYi5wYXJlbnROb2RlKXx8YikpKXtpZihqLnNwbGljZShpLDEpLGE9Zi5sZW5ndGgmJnJhKGopLCFhKXJldHVybiBILmFwcGx5KGUsZiksZTticmVha319fXJldHVybihufHxoKGEsbykpKGYsYiwhcCxlLGFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpLGV9LGMuc29ydFN0YWJsZT11LnNwbGl0KCIiKS5zb3J0KEIpLmpvaW4oIiIpPT09dSxjLmRldGVjdER1cGxpY2F0ZXM9ISFsLG0oKSxjLnNvcnREZXRhY2hlZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gMSZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG4uY3JlYXRlRWxlbWVudCgiZGl2IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYz92b2lkIDA6YS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGN8fCJpbnB1dCIhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dm9pZCAwOmEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEssZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDphW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTttLmZpbmQ9cyxtLmV4cHI9cy5zZWxlY3RvcnMsbS5leHByWyI6Il09bS5leHByLnBzZXVkb3MsbS51bmlxdWU9cy51bmlxdWVTb3J0LG0udGV4dD1zLmdldFRleHQsbS5pc1hNTERvYz1zLmlzWE1MLG0uY29udGFpbnM9cy5jb250YWluczt2YXIgdD1tLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHU9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyx2PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gdyhhLGIsYyl7aWYobS5pc0Z1bmN0aW9uKGIpKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih2LnRlc3QoYikpcmV0dXJuIG0uZmlsdGVyKGIsYSxjKTtiPW0uZmlsdGVyKGIsYSl9cmV0dXJuIG0uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBtLmluQXJyYXkoYSxiKT49MCE9PWN9KX1tLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9tLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm0uZmluZC5tYXRjaGVzKGEsbS5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxtLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobShhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobS5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyltLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9tLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhdyh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdC50ZXN0KGEpP20oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgeCx5PWEuZG9jdW1lbnQsej0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEE9bS5mbi5pbml0PWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtpZighYSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGEpe2lmKGM9IjwiPT09YS5jaGFyQXQoMCkmJiI+Ij09PWEuY2hhckF0KGEubGVuZ3RoLTEpJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOnouZXhlYyhhKSwhY3x8IWNbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHx4KS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihjWzFdKXtpZihiPWIgaW5zdGFuY2VvZiBtP2JbMF06YixtLm1lcmdlKHRoaXMsbS5wYXJzZUhUTUwoY1sxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8Yjp5LCEwKSksdS50ZXN0KGNbMV0pJiZtLmlzUGxhaW5PYmplY3QoYikpZm9yKGMgaW4gYiltLmlzRnVuY3Rpb24odGhpc1tjXSk/dGhpc1tjXShiW2NdKTp0aGlzLmF0dHIoYyxiW2NdKTtyZXR1cm4gdGhpc31pZihkPXkuZ2V0RWxlbWVudEJ5SWQoY1syXSksZCYmZC5wYXJlbnROb2RlKXtpZihkLmlkIT09Y1syXSlyZXR1cm4geC5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1kfXJldHVybiB0aGlzLmNvbnRleHQ9eSx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0uaXNGdW5jdGlvbihhKT8idW5kZWZpbmVkIiE9dHlwZW9mIHgucmVhZHk/eC5yZWFkeShhKTphKG0pOih2b2lkIDAhPT1hLnNlbGVjdG9yJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpLG0ubWFrZUFycmF5KGEsdGhpcykpfTtBLnByb3RvdHlwZT1tLmZuLHg9bSh5KTt2YXIgQj0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxDPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O20uZXh0ZW5kKHtkaXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9YVtiXTt3aGlsZShlJiY5IT09ZS5ub2RlVHlwZSYmKHZvaWQgMD09PWN8fDEhPT1lLm5vZGVUeXBlfHwhbShlKS5pcyhjKSkpMT09PWUubm9kZVR5cGUmJmQucHVzaChlKSxlPWVbYl07cmV0dXJuIGR9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSksbS5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW0oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihtLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dC50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bShhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbS5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP20udW5pcXVlKGYpOmYpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT8ic3RyaW5nIj09dHlwZW9mIGE/bS5pbkFycmF5KHRoaXNbMF0sbShhKSk6bS5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnB1c2hTdGFjayhtLnVuaXF1ZShtLm1lcmdlKHRoaXMuZ2V0KCksbShhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBEKGEsYil7ZG8gYT1hW2JdO3doaWxlKGEmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1tLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRChhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50Om0ubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPW0ubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9bS5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKENbYV18fChlPW0udW5pcXVlKGUpKSxCLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKSksdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEU9L1xTKy9nLEY9e307ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBtLmVhY2goYS5tYXRjaChFKXx8W10sZnVuY3Rpb24oYSxjKXtiW2NdPSEwfSksYn1tLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPSJzdHJpbmciPT10eXBlb2YgYT9GW2FdfHxHKGEpOm0uZXh0ZW5kKHt9LGEpO3ZhciBiLGMsZCxlLGYsZyxoPVtdLGk9IWEub25jZSYmW10saj1mdW5jdGlvbihsKXtmb3IoYz1hLm1lbW9yeSYmbCxkPSEwLGY9Z3x8MCxnPTAsZT1oLmxlbmd0aCxiPSEwO2gmJmU+ZjtmKyspaWYoaFtmXS5hcHBseShsWzBdLGxbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2M9ITE7YnJlYWt9Yj0hMSxoJiYoaT9pLmxlbmd0aCYmaihpLnNoaWZ0KCkpOmM/aD1bXTprLmRpc2FibGUoKSl9LGs9e2FkZDpmdW5jdGlvbigpe2lmKGgpe3ZhciBkPWgubGVuZ3RoOyFmdW5jdGlvbiBmKGIpe20uZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9bS50eXBlKGMpOyJmdW5jdGlvbiI9PT1kP2EudW5pcXVlJiZrLmhhcyhjKXx8aC5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PWQmJmYoYyl9KX0oYXJndW1lbnRzKSxiP2U9aC5sZW5ndGg6YyYmKGc9ZCxqKGMpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGgmJm0uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxjKXt2YXIgZDt3aGlsZSgoZD1tLmluQXJyYXkoYyxoLGQpKT4tMSloLnNwbGljZShkLDEpLGImJihlPj1kJiZlLS0sZj49ZCYmZi0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9tLmluQXJyYXkoYSxoKT4tMTohKCFofHwhaC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBoPVtdLGU9MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGg9aT1jPXZvaWQgMCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFofSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9dm9pZCAwLGN8fGsuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFpfSxmaXJlV2l0aDpmdW5jdGlvbihhLGMpe3JldHVybiFofHxkJiYhaXx8KGM9Y3x8W10sYz1bYSxjLnNsaWNlP2Muc2xpY2UoKTpjXSxiP2kucHVzaChjKTpqKGMpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGsuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFkfX07cmV0dXJuIGt9LG0uZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1bWyJyZXNvbHZlIiwiZG9uZSIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixtLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVqZWN0ZWQiXSxbIm5vdGlmeSIsInByb2dyZXNzIixtLkNhbGxiYWNrcygibWVtb3J5IildXSxjPSJwZW5kaW5nIixkPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7cmV0dXJuIG0uRGVmZXJyZWQoZnVuY3Rpb24oYyl7bS5lYWNoKGIsZnVuY3Rpb24oYixmKXt2YXIgZz1tLmlzRnVuY3Rpb24oYVtiXSkmJmFbYl07ZVtmWzFdXShmdW5jdGlvbigpe3ZhciBhPWcmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2EucHJvbWlzZSgpLmRvbmUoYy5yZXNvbHZlKS5mYWlsKGMucmVqZWN0KS5wcm9ncmVzcyhjLm5vdGlmeSk6Y1tmWzBdKyJXaXRoIl0odGhpcz09PWQ/Yy5wcm9taXNlKCk6dGhpcyxnP1thXTphcmd1bWVudHMpfSl9KSxhPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/bS5leHRlbmQoYSxkKTpkfX0sZT17fTtyZXR1cm4gZC5waXBlPWQudGhlbixtLmVhY2goYixmdW5jdGlvbihhLGYpe3ZhciBnPWZbMl0saD1mWzNdO2RbZlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtjPWh9LGJbMV5hXVsyXS5kaXNhYmxlLGJbMl1bMl0ubG9jayksZVtmWzBdXT1mdW5jdGlvbigpe3JldHVybiBlW2ZbMF0rIldpdGgiXSh0aGlzPT09ZT9kOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWQuY2FsbChhcmd1bWVudHMpLGU9Yy5sZW5ndGgsZj0xIT09ZXx8YSYmbS5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZTowLGc9MT09PWY/YTptLkRlZmVycmVkKCksaD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9kLmNhbGwoYXJndW1lbnRzKTplLGM9PT1pP2cubm90aWZ5V2l0aChiLGMpOi0tZnx8Zy5yZXNvbHZlV2l0aChiLGMpfX0saSxqLGs7aWYoZT4xKWZvcihpPW5ldyBBcnJheShlKSxqPW5ldyBBcnJheShlKSxrPW5ldyBBcnJheShlKTtlPmI7YisrKWNbYl0mJm0uaXNGdW5jdGlvbihjW2JdLnByb21pc2UpP2NbYl0ucHJvbWlzZSgpLmRvbmUoaChiLGssYykpLmZhaWwoZy5yZWplY3QpLnByb2dyZXNzKGgoYixqLGkpKTotLWY7cmV0dXJuIGZ8fGcucmVzb2x2ZVdpdGgoayxjKSxnLnByb21pc2UoKX19KTt2YXIgSDttLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBtLnJlYWR5LnByb21pc2UoKS5kb25lKGEpLHRoaXN9LG0uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP20ucmVhZHlXYWl0Kys6bS5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMD8hLS1tLnJlYWR5V2FpdDohbS5pc1JlYWR5KXtpZigheS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KG0ucmVhZHkpO20uaXNSZWFkeT0hMCxhIT09ITAmJi0tbS5yZWFkeVdhaXQ+MHx8KEgucmVzb2x2ZVdpdGgoeSxbbV0pLG0uZm4udHJpZ2dlckhhbmRsZXImJihtKHkpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG0oeSkub2ZmKCJyZWFkeSIpKSl9fX0pO2Z1bmN0aW9uIEkoKXt5LmFkZEV2ZW50TGlzdGVuZXI/KHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSiwhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixKLCExKSk6KHkuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSiksYS5kZXRhY2hFdmVudCgib25sb2FkIixKKSl9ZnVuY3Rpb24gSigpeyh5LmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWV2ZW50LnR5cGV8fCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpJiYoSSgpLG0ucmVhZHkoKSl9bS5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGIpe2lmKCFIKWlmKEg9bS5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpc2V0VGltZW91dChtLnJlYWR5KTtlbHNlIGlmKHkuYWRkRXZlbnRMaXN0ZW5lcil5LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSk7ZWxzZXt5LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuYXR0YWNoRXZlbnQoIm9ubG9hZCIsSik7dmFyIGM9ITE7dHJ5e2M9bnVsbD09YS5mcmFtZUVsZW1lbnQmJnkuZG9jdW1lbnRFbGVtZW50fWNhdGNoKGQpe31jJiZjLmRvU2Nyb2xsJiYhZnVuY3Rpb24gZSgpe2lmKCFtLmlzUmVhZHkpe3RyeXtjLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7cmV0dXJuIHNldFRpbWVvdXQoZSw1MCl9SSgpLG0ucmVhZHkoKX19KCl9cmV0dXJuIEgucHJvbWlzZShiKX07dmFyIEs9InVuZGVmaW5lZCIsTDtmb3IoTCBpbiBtKGspKWJyZWFrO2sub3duTGFzdD0iMCIhPT1MLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxtKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7Yz15LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChkKS5hcHBlbmRDaGlsZChiKSx0eXBlb2YgYi5zdHlsZS56b29tIT09SyYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChkKSl9KSxmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYobnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2goYil7ay5kZWxldGVFeHBhbmRvPSExfX1hPW51bGx9KCksbS5hY2NlcHREYXRhPWZ1bmN0aW9uKGEpe3ZhciBiPW0ubm9EYXRhWyhhLm5vZGVOYW1lKyIgIikudG9Mb3dlckNhc2UoKV0sYz0rYS5ub2RlVHlwZXx8MTtyZXR1cm4gMSE9PWMmJjkhPT1jPyExOiFifHxiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifTt2YXIgTT0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLE49LyhbQS1aXSkvZztmdW5jdGlvbiBPKGEsYixjKXtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSl7dmFyIGQ9ImRhdGEtIitiLnJlcGxhY2UoTiwiLSQxIikudG9Mb3dlckNhc2UoKTtpZihjPWEuZ2V0QXR0cmlidXRlKGQpLCJzdHJpbmciPT10eXBlb2YgYyl7dHJ5e2M9InRydWUiPT09Yz8hMDoiZmFsc2UiPT09Yz8hMToibnVsbCI9PT1jP251bGw6K2MrIiI9PT1jPytjOk0udGVzdChjKT9tLnBhcnNlSlNPTihjKTpjfWNhdGNoKGUpe31tLmRhdGEoYSxiLGMpfWVsc2UgYz12b2lkIDB9cmV0dXJuIGN9ZnVuY3Rpb24gUChhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbS5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExOwoKcmV0dXJuITB9ZnVuY3Rpb24gUShhLGIsZCxlKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBmLGcsaD1tLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9tLmNhY2hlOmEsaz1pP2FbaF06YVtoXSYmaDtpZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGNhKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2EoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWE6YmEpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJhLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJhLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFhLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmE7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRhKGEpe3ZhciBiPWVhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYT0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmE9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYT1uZXcgUmVnRXhwKCI8KD86IitlYSsiKVtcXHMvPl0iLCJpIiksaGE9L15ccysvLGlhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamE9LzwoW1x3Ol0rKS8sa2E9Lzx0Ym9keS9pLGxhPS88fCYjP1x3KzsvLG1hPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2E9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBhPS9edHJ1ZVwvKC4qKS8scWE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJhPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2E9ZGEoeSksdGE9c2EuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmEub3B0Z3JvdXA9cmEub3B0aW9uLHJhLnRib2R5PXJhLnRmb290PXJhLmNvbGdyb3VwPXJhLmNhcHRpb249cmEudGhlYWQscmEudGg9cmEudGQ7ZnVuY3Rpb24gdWEoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWEoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZhKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdhKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWEoYSl7dmFyIGI9cGEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGEoYikudGV4dD1hLnRleHQseWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRhLmlubmVySFRNTD1hLm91dGVySFRNTCx0YS5yZW1vdmVDaGlsZChmPXRhLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YShmKSxoPXVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmEoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWEoYSksZD1kfHx1YShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFhKGUsZFtnXSk7ZWxzZSBBYShhLGYpO3JldHVybiBkPXVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnphKGQsIWkmJnVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYShiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYS50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamEuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJhW2ldfHxyYS5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYSwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhhLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2EudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYS50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHVhKHAsImlucHV0IiksdmEpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXVhKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnphKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2EudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13YSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWEoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6YSh1YShjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmEsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWEudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2EudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoYSl8fHJhWyhqYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGlhLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YShiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWEodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5hLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YShpLCJzY3JpcHQiKSx4YSksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWEoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWEpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYS50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWEsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENhLERhPXt9O2Z1bmN0aW9uIEVhKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYShhKXt2YXIgYj15LGM9RGFbYV07cmV0dXJuIGN8fChjPUVhKGEsYiksIm5vbmUiIT09YyYmY3x8KENhPShDYXx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2FbMF0uY29udGVudFdpbmRvd3x8Q2FbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWEoYSxiKSxDYS5kZXRhY2goKSksRGFbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYT0vXm1hcmdpbi8sSGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYSxKYSxLYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYT1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLGMmJigiIiE9PWd8fG0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1tLnN0eWxlKGEsYikpLEhhLnRlc3QoZykmJkdhLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMD09PWc/ZzpnKyIifSk6eS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoSWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jW2JdOnZvaWQgMCxudWxsPT1nJiZoJiZoW2JdJiYoZz1oW2JdKSxIYS50ZXN0KGcpJiYhS2EudGVzdChiKSYmKGQ9aC5sZWZ0LGU9YS5ydW50aW1lU3R5bGUsZj1lJiZlLmxlZnQsZiYmKGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxoLmxlZnQ9ImZvbnRTaXplIj09PWI/IjFlbSI6ZyxnPWgucGl4ZWxMZWZ0KyJweCIsaC5sZWZ0PWQsZiYmKGUubGVmdD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ8fCJhdXRvIn0pO2Z1bmN0aW9uIExhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3ZhciBjPWEoKTtpZihudWxsIT1jKXJldHVybiBjP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaDtpZihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz1kJiZkLnN0eWxlKXtjLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsay5vcGFjaXR5PSIwLjUiPT09Yy5vcGFjaXR5LGsuY3NzRmxvYXQ9ISFjLmNzc0Zsb2F0LGIuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixiLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWIuc3R5bGUuYmFja2dyb3VuZENsaXAsay5ib3hTaXppbmc9IiI9PT1jLmJveFNpemluZ3x8IiI9PT1jLk1vekJveFNpemluZ3x8IiI9PT1jLldlYmtpdEJveFNpemluZyxtLmV4dGVuZChrLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZyYmaSgpLGd9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmkoKSxmfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmkoKSxlfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWgmJmkoKSxofX0pO2Z1bmN0aW9uIGkoKXt2YXIgYixjLGQsaTtjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlJiYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGU9Zj0hMSxoPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9IjElIiE9PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e30pLnRvcCxmPSI0cHgiPT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxpPWIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSksaS5zdHlsZS5jc3NUZXh0PWIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixpLnN0eWxlLm1hcmdpblJpZ2h0PWkuc3R5bGUud2lkdGg9IjAiLGIuc3R5bGUud2lkdGg9IjFweCIsaD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS5tYXJnaW5SaWdodCksYi5yZW1vdmVDaGlsZChpKSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYT0vYWxwaGFcKFteKV0qXCkvaSxOYT0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYT1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmE9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFVhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYS5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGFbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmEoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdhKGEsYixjKXt2YXIgZD1QYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhhKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWEoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUlhKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hhKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUphKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYShpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFhLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVVhKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUphKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNhJiYoZj1TYVtiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2EudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYSxmdW5jdGlvbigpe3JldHVybiBZYShhLGIsZCl9KTpZYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJklhKGEpO3JldHVybiBXYShhLGMsZD9YYShhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1hLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1hLnRlc3QoZik/Zi5yZXBsYWNlKE1hLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGEoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEphLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdhLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdhKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWEoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYShhLGIsYyxkLGUpewpyZXR1cm4gbmV3IFphLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bS5Ud2Vlbj1aYSxaYS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlphLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fCJzd2luZyIsdGhpcy5vcHRpb25zPWIsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPWQsdGhpcy51bml0PWZ8fChtLmNzc051bWJlcltjXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGEmJmEuZ2V0P2EuZ2V0KHRoaXMpOlphLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihhKXt2YXIgYixjPVphLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9Yj1tLmVhc2luZ1t0aGlzLmVhc2luZ10oYSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qYSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1iPWEsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmIrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksYyYmYy5zZXQ/Yy5zZXQodGhpcyk6WmEucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sWmEucHJvdG90eXBlLmluaXQucHJvdG90eXBlPVphLnByb3RvdHlwZSxaYS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIG51bGw9PWEuZWxlbVthLnByb3BdfHxhLmVsZW0uc3R5bGUmJm51bGwhPWEuZWxlbS5zdHlsZVthLnByb3BdPyhiPW0uY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKTphLmVsZW1bYS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGEpe20uZnguc3RlcFthLnByb3BdP20uZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5zdHlsZSYmKG51bGwhPWEuZWxlbS5zdHlsZVttLmNzc1Byb3BzW2EucHJvcF1dfHxtLmNzc0hvb2tzW2EucHJvcF0pP20uc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpOmEuZWxlbVthLnByb3BdPWEubm93fX19LFphLnByb3BIb29rcy5zY3JvbGxUb3A9WmEucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sbS5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX0sbS5meD1aYS5wcm90b3R5cGUuaW5pdCxtLmZ4LnN0ZXA9e307dmFyICRhLF9hLGFiPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxiYj1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrUysiKShbYS16JV0qKSQiLCJpIiksY2I9L3F1ZXVlSG9va3MkLyxkYj1baWJdLGViPXsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpLGQ9Yy5jdXIoKSxlPWJiLmV4ZWMoYiksZj1lJiZlWzNdfHwobS5jc3NOdW1iZXJbYV0/IiI6InB4IiksZz0obS5jc3NOdW1iZXJbYV18fCJweCIhPT1mJiYrZCkmJmJiLmV4ZWMobS5jc3MoYy5lbGVtLGEpKSxoPTEsaT0yMDtpZihnJiZnWzNdIT09Zil7Zj1mfHxnWzNdLGU9ZXx8W10sZz0rZHx8MTtkbyBoPWh8fCIuNSIsZy89aCxtLnN0eWxlKGMuZWxlbSxhLGcrZik7d2hpbGUoaCE9PShoPWMuY3VyKCkvZCkmJjEhPT1oJiYtLWkpfXJldHVybiBlJiYoZz1jLnN0YXJ0PStnfHwrZHx8MCxjLnVuaXQ9ZixjLmVuZD1lWzFdP2crKGVbMV0rMSkqZVsyXTorZVsyXSksY31dfTtmdW5jdGlvbiBmYigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JGE9dm9pZCAwfSksJGE9bS5ub3coKX1mdW5jdGlvbiBnYihhLGIpe3ZhciBjLGQ9e2hlaWdodDphfSxlPTA7Zm9yKGI9Yj8xOjA7ND5lO2UrPTItYiljPVRbZV0sZFsibWFyZ2luIitjXT1kWyJwYWRkaW5nIitjXT1hO3JldHVybiBiJiYoZC5vcGFjaXR5PWQud2lkdGg9YSksZH1mdW5jdGlvbiBoYihhLGIsYyl7Zm9yKHZhciBkLGU9KGViW2JdfHxbXSkuY29uY2F0KGViWyIqIl0pLGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspaWYoZD1lW2ZdLmNhbGwoYyxiLGEpKXJldHVybiBkfWZ1bmN0aW9uIGliKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixsLG49dGhpcyxvPXt9LHA9YS5zdHlsZSxxPWEubm9kZVR5cGUmJlUoYSkscj1tLl9kYXRhKGEsImZ4c2hvdyIpO2MucXVldWV8fChoPW0uX3F1ZXVlSG9va3MoYSwiZngiKSxudWxsPT1oLnVucXVldWVkJiYoaC51bnF1ZXVlZD0wLGk9aC5lbXB0eS5maXJlLGguZW1wdHkuZmlyZT1mdW5jdGlvbigpe2gudW5xdWV1ZWR8fGkoKX0pLGgudW5xdWV1ZWQrKyxuLmFsd2F5cyhmdW5jdGlvbigpe24uYWx3YXlzKGZ1bmN0aW9uKCl7aC51bnF1ZXVlZC0tLG0ucXVldWUoYSwiZngiKS5sZW5ndGh8fGguZW1wdHkuZmlyZSgpfSl9KSksMT09PWEubm9kZVR5cGUmJigiaGVpZ2h0ImluIGJ8fCJ3aWR0aCJpbiBiKSYmKGMub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLGo9bS5jc3MoYSwiZGlzcGxheSIpLGw9Im5vbmUiPT09aj9tLl9kYXRhKGEsIm9sZGRpc3BsYXkiKXx8RmEoYS5ub2RlTmFtZSk6aiwiaW5saW5lIj09PWwmJiJub25lIj09PW0uY3NzKGEsImZsb2F0IikmJihrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09RmEoYS5ub2RlTmFtZSk/cC56b29tPTE6cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksYy5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsay5zaHJpbmtXcmFwQmxvY2tzKCl8fG4uYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxhYi5leGVjKGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHE/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFyfHx2b2lkIDA9PT1yW2RdKWNvbnRpbnVlO3E9ITB9b1tkXT1yJiZyW2RdfHxtLnN0eWxlKGEsZCl9ZWxzZSBqPXZvaWQgMDtpZihtLmlzRW1wdHlPYmplY3QobykpImlubGluZSI9PT0oIm5vbmUiPT09aj9GYShhLm5vZGVOYW1lKTpqKSYmKHAuZGlzcGxheT1qKTtlbHNle3I/ImhpZGRlbiJpbiByJiYocT1yLmhpZGRlbik6cj1tLl9kYXRhKGEsImZ4c2hvdyIse30pLGYmJihyLmhpZGRlbj0hcSkscT9tKGEpLnNob3coKTpuLmRvbmUoZnVuY3Rpb24oKXttKGEpLmhpZGUoKX0pLG4uZG9uZShmdW5jdGlvbigpe3ZhciBiO20uX3JlbW92ZURhdGEoYSwiZnhzaG93Iik7Zm9yKGIgaW4gbyltLnN0eWxlKGEsYixvW2JdKX0pO2ZvcihkIGluIG8pZz1oYihxP3JbZF06MCxkLG4pLGQgaW4gcnx8KHJbZF09Zy5zdGFydCxxJiYoZy5lbmQ9Zy5zdGFydCxnLnN0YXJ0PSJ3aWR0aCI9PT1kfHwiaGVpZ2h0Ij09PWQ/MTowKSl9fWZ1bmN0aW9uIGpiKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoYyBpbiBhKWlmKGQ9bS5jYW1lbENhc2UoYyksZT1iW2RdLGY9YVtjXSxtLmlzQXJyYXkoZikmJihlPWZbMV0sZj1hW2NdPWZbMF0pLGMhPT1kJiYoYVtkXT1mLGRlbGV0ZSBhW2NdKSxnPW0uY3NzSG9va3NbZF0sZyYmImV4cGFuZCJpbiBnKXtmPWcuZXhwYW5kKGYpLGRlbGV0ZSBhW2RdO2ZvcihjIGluIGYpYyBpbiBhfHwoYVtjXT1mW2NdLGJbY109ZSl9ZWxzZSBiW2RdPWV9ZnVuY3Rpb24ga2IoYSxiLGMpe3ZhciBkLGUsZj0wLGc9ZGIubGVuZ3RoLGg9bS5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4hMTtmb3IodmFyIGI9JGF8fGZiKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD1jL2ouZHVyYXRpb258fDAsZj0xLWQsZz0wLGk9ai50d2VlbnMubGVuZ3RoO2k+ZztnKyspai50d2VlbnNbZ10ucnVuKGYpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixmLGNdKSwxPmYmJmk/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOm0uZXh0ZW5kKHt9LGIpLG9wdHM6bS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTokYXx8ZmIoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMpe3ZhciBkPW0uVHdlZW4oYSxqLm9wdHMsYixjLGoub3B0cy5zcGVjaWFsRWFzaW5nW2JdfHxqLm9wdHMuZWFzaW5nKTtyZXR1cm4gai50d2VlbnMucHVzaChkKSxkfSxzdG9wOmZ1bmN0aW9uKGIpe3ZhciBjPTAsZD1iP2oudHdlZW5zLmxlbmd0aDowO2lmKGUpcmV0dXJuIHRoaXM7Zm9yKGU9ITA7ZD5jO2MrKylqLnR3ZWVuc1tjXS5ydW4oMSk7cmV0dXJuIGI/aC5yZXNvbHZlV2l0aChhLFtqLGJdKTpoLnJlamVjdFdpdGgoYSxbaixiXSksdGhpc319KSxrPWoucHJvcHM7Zm9yKGpiKGssai5vcHRzLnNwZWNpYWxFYXNpbmcpO2c+ZjtmKyspaWYoZD1kYltmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIGQ7cmV0dXJuIG0ubWFwKGssaGIsaiksbS5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaiksbS5meC50aW1lcihtLmV4dGVuZChpLHtlbGVtOmEsYW5pbTpqLHF1ZXVlOmoub3B0cy5xdWV1ZX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1tLkFuaW1hdGlvbj1tLmV4dGVuZChrYix7dHdlZW5lcjpmdW5jdGlvbihhLGIpe20uaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWM9YVtkXSxlYltjXT1lYltjXXx8W10sZWJbY10udW5zaGlmdChiKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9kYi51bnNoaWZ0KGEpOmRiLnB1c2goYSl9fSksbS5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmIm9iamVjdCI9PXR5cGVvZiBhP20uZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8bS5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFtLmlzRnVuY3Rpb24oYikmJmJ9O3JldHVybiBkLmR1cmF0aW9uPW0uZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiBkLmR1cmF0aW9uP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBtLmZ4LnNwZWVkcz9tLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTptLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ZC5xdWV1ZXx8ZC5xdWV1ZT09PSEwKSYmKGQucXVldWU9ImZ4IiksZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bS5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZtLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0sbS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoVSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5pc0VtcHR5T2JqZWN0KGEpLGY9bS5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsbS5leHRlbmQoe30sYSksZik7KGV8fG0uX2RhdGEodGhpcywiZmluaXNoIikpJiZiLnN0b3AoITApfTtyZXR1cm4gZy5maW5pc2g9ZyxlfHxmLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZi5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zdG9wO2RlbGV0ZSBhLnN0b3AsYihjKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYz1iLGI9YSxhPXZvaWQgMCksYiYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPSEwLGU9bnVsbCE9YSYmYSsicXVldWVIb29rcyIsZj1tLnRpbWVycyxnPW0uX2RhdGEodGhpcyk7aWYoZSlnW2VdJiZnW2VdLnN0b3AmJmQoZ1tlXSk7ZWxzZSBmb3IoZSBpbiBnKWdbZV0mJmdbZV0uc3RvcCYmY2IudGVzdChlKSYmZChnW2VdKTtmb3IoZT1mLmxlbmd0aDtlLS07KWZbZV0uZWxlbSE9PXRoaXN8fG51bGwhPWEmJmZbZV0ucXVldWUhPT1hfHwoZltlXS5hbmltLnN0b3AoYyksYj0hMSxmLnNwbGljZShlLDEpKTsoYnx8IWMpJiZtLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1tLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1tLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbS5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxtLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bS5mbltiXTttLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoZ2IoYiwhMCksYSxkLGUpfX0pLG0uZWFjaCh7c2xpZGVEb3duOmdiKCJzaG93Iiksc2xpZGVVcDpnYigiaGlkZSIpLHNsaWRlVG9nZ2xlOmdiKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxtLnRpbWVycz1bXSxtLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW0udGltZXJzLGM9MDtmb3IoJGE9bS5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxtLmZ4LnN0b3AoKSwkYT12b2lkIDB9LG0uZngudGltZXI9ZnVuY3Rpb24oYSl7bS50aW1lcnMucHVzaChhKSxhKCk/bS5meC5zdGFydCgpOm0udGltZXJzLnBvcCgpfSxtLmZ4LmludGVydmFsPTEzLG0uZnguc3RhcnQ9ZnVuY3Rpb24oKXtfYXx8KF9hPXNldEludGVydmFsKG0uZngudGljayxtLmZ4LmludGVydmFsKSl9LG0uZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoX2EpLF9hPW51bGx9LG0uZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LG0uZm4uZGVsYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1tLmZ4P20uZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiLHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZTtiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxjPXkuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksZT1jLmFwcGVuZENoaWxkKHkuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxkLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGsuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWIuY2xhc3NOYW1lLGsuc3R5bGU9L3RvcC8udGVzdChkLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksay5ocmVmTm9ybWFsaXplZD0iL2EiPT09ZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSxrLmNoZWNrT249ISFhLnZhbHVlLGsub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCxrLmVuY3R5cGU9ISF5LmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGMuZGlzYWJsZWQ9ITAsay5vcHREaXNhYmxlZD0hZS5kaXNhYmxlZCxhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxrLmlucHV0PSIiPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYS52YWx1ZT0idCIsYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGsucmFkaW9WYWx1ZT0idCI9PT1hLnZhbHVlfSgpO3ZhciBsYj0vXHIvZzttLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9bS5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZTsxPT09dGhpcy5ub2RlVHlwZSYmKGU9ZD9hLmNhbGwodGhpcyxjLG0odGhpcykudmFsKCkpOmEsbnVsbD09ZT9lPSIiOiJudW1iZXIiPT10eXBlb2YgZT9lKz0iIjptLmlzQXJyYXkoZSkmJihlPW0ubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPW0udmFsSG9va3NbdGhpcy50eXBlXXx8bS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPW0udmFsSG9va3NbZS50eXBlXXx8bS52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UobGIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLG0uZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bS5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOm0udHJpbShtLnRleHQoYSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChrLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZtLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bShjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW0ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWlmKGQ9ZVtnXSxtLmluQXJyYXkobS52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPj0wKXRyeXtkLnNlbGVjdGVkPWM9ITB9Y2F0Y2goaCl7ZC5zY3JvbGxIZWlnaHR9ZWxzZSBkLnNlbGVjdGVkPSExO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxlfX19fSksbS5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bS52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uaXNBcnJheShiKT9hLmNoZWNrZWQ9bS5pbkFycmF5KG0oYSkudmFsKCksYik+PTA6dm9pZCAwfX0say5jaGVja09ufHwobS52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBtYixuYixvYj1tLmV4cHIuYXR0ckhhbmRsZSxwYj0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLHFiPWsuZ2V0U2V0QXR0cmlidXRlLHJiPWsuaW5wdXQ7bS5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxtLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09Sz9tLnByb3AoYSxiLGMpOigxPT09ZiYmbS5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bS5hdHRySG9va3NbYl18fChtLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP25iOm1iKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW0uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBtLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRSk7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1tLnByb3BGaXhbY118fGMsbS5leHByLm1hdGNoLmJvb2wudGVzdChjKT9yYiYmcWJ8fCFwYi50ZXN0KGMpP2FbZF09ITE6YVttLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2MpXT1hW2RdPSExOm0uYXR0cihhLGMsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHFiP2M6ZCl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWsucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm0ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksbmI9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9tLnJlbW92ZUF0dHIoYSxjKTpyYiYmcWJ8fCFwYi50ZXN0KGMpP2Euc2V0QXR0cmlidXRlKCFxYiYmbS5wcm9wRml4W2NdfHxjLGMpOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtjXT0hMCxjfX0sbS5lYWNoKG0uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9b2JbYl18fG0uZmluZC5hdHRyO29iW2JdPXJiJiZxYnx8IXBiLnRlc3QoYik/ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPW9iW2JdLG9iW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCxvYltiXT1mKSxlfTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitiKV0/Yi50b0xvd2VyQ2FzZSgpOm51bGx9fSkscmImJnFifHwobS5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaW5wdXQiKT92b2lkKGEuZGVmYXVsdFZhbHVlPWIpOm1iJiZtYi5zZXQoYSxiLGMpfX0pLHFifHwobWI9e3NldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHxhLnNldEF0dHJpYnV0ZU5vZGUoZD1hLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGMpKSxkLnZhbHVlPWIrPSIiLCJ2YWx1ZSI9PT1jfHxiPT09YS5nZXRBdHRyaWJ1dGUoYyk/Yjp2b2lkIDB9fSxvYi5pZD1vYi5uYW1lPW9iLmNvb3Jkcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09ZC52YWx1ZT9kLnZhbHVlOm51bGx9LG0udmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoYik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP2MudmFsdWU6dm9pZCAwfSxzZXQ6bWIuc2V0fSxtLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e3NldDpmdW5jdGlvbihhLGIsYyl7bWIuc2V0KGEsIiI9PT1iPyExOmIsYyl9fSxtLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7bS5hdHRySG9va3NbYl09e3NldDpmdW5jdGlvbihhLGMpe3JldHVybiIiPT09Yz8oYS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpLGMpOnZvaWQgMH19fSkpLGsuc3R5bGV8fChtLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHR8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD1iKyIifX0pO3ZhciBzYj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSx0Yj0vXig/OmF8YXJlYSkkL2k7bS5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1tLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09dm9pZCAwLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGIpe319KX19KSxtLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW0uaXNYTUxEb2MoYSksZiYmKGI9bS5wcm9wRml4W2JdfHxiLGU9bS5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW0uZmluZC5hdHRyKGEsInRhYmluZGV4Iik7cmV0dXJuIGI/cGFyc2VJbnQoYiwxMCk6c2IudGVzdChhLm5vZGVOYW1lKXx8dGIudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6LTF9fX19KSxrLmhyZWZOb3JtYWxpemVkfHxtLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXttLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxrLm9wdFNlbGVjdGVkfHwobS5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSxtLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe20ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxrLmVuY3R5cGV8fChtLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKTt2YXIgdWI9L1tcdFxyXG5cZl0vZzttLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoailmb3IoYj0oYXx8IiIpLm1hdGNoKEUpfHxbXTtpPmg7aCsrKWlmKGM9dGhpc1toXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW0udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP20udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXttKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1tKHRoaXMpLGY9YS5tYXRjaChFKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09S3x8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmbS5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjptLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKS5pbmRleE9mKGIpPj0wKXJldHVybiEwO3JldHVybiExfX0pLG0uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG0uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIHZiPW0ubm93KCksd2I9L1w/Lyx4Yj0vKCwpfChcW3x7KXwofXxdKXwiKD86W14iXFxcclxuXXxcXFsiXFxcL2JmbnJ0XXxcXHVbXGRhLWZBLUZdezR9KSoiXHMqOj98dHJ1ZXxmYWxzZXxudWxsfC0/KD8hMFxkKVxkKyg/OlwuXGQrfCkoPzpbZUVdWystXT9cZCt8KS9nO20ucGFyc2VKU09OPWZ1bmN0aW9uKGIpe2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYisiIik7dmFyIGMsZD1udWxsLGU9bS50cmltKGIrIiIpO3JldHVybiBlJiYhbS50cmltKGUucmVwbGFjZSh4YixmdW5jdGlvbihhLGIsZSxmKXtyZXR1cm4gYyYmYiYmKGQ9MCksMD09PWQ/YTooYz1lfHxiLGQrPSFmLSFlLCIiKX0pKT9GdW5jdGlvbigicmV0dXJuICIrZSkoKTptLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LG0ucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGMsZDtpZighYnx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZD1uZXcgRE9NUGFyc2VyLGM9ZC5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKSk6KGM9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bS5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIHliLHpiLEFiPS8jLiokLyxCYj0vKFs/Jl0pXz1bXiZdKi8sQ2I9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxEYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxFYj0vXig/OkdFVHxIRUFEKSQvLEZiPS9eXC9cLy8sR2I9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sSGI9e30sSWI9e30sSmI9IiovIi5jb25jYXQoIioiKTt0cnl7emI9bG9jYXRpb24uaHJlZn1jYXRjaChLYil7emI9eS5jcmVhdGVFbGVtZW50KCJhIiksemIuaHJlZj0iIix6Yj16Yi5ocmVmfXliPUdiLmV4ZWMoemIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIExiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXTtpZihtLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SWI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxtLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBOYihhLGIpe3ZhciBjLGQsZT1tLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZtLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gT2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gUGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1tLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6emIsdHlwZToiR0VUIixpc0xvY2FsOkRiLnRlc3QoeWJbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SmIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjptLnBhcnNlSlNPTiwidGV4dCB4bWwiOm0ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP05iKE5iKGEsbS5hamF4U2V0dGluZ3MpLGIpOk5iKG0uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOkxiKEhiKSxhamF4VHJhbnNwb3J0OkxiKEliKSxhamF4OmZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1tLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxuPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9tKGwpOm0uZXZlbnQsbz1tLkRlZmVycmVkKCkscD1tLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PSJjYW5jZWxlZCIsdj17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT10KXtpZighail7aj17fTt3aGlsZShiPUNiLmV4ZWMoZikpaltiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1qW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXQ/ZjpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB0fHwoYT1zW2NdPXNbY118fGEsclthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB0fHwoay5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj50KWZvcihiIGluIGEpcVtiXT1bcVtiXSxhW2JdXTtlbHNlIHYuYWx3YXlzKGFbdi5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dTtyZXR1cm4gaSYmaS5hYm9ydChiKSx4KDAsYiksdGhpc319O2lmKG8ucHJvbWlzZSh2KS5jb21wbGV0ZT1wLmFkZCx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLGsudXJsPSgoYXx8ay51cmx8fHpiKSsiIikucmVwbGFjZShBYiwiIikucmVwbGFjZShGYix5YlsxXSsiLy8iKSxrLnR5cGU9Yi5tZXRob2R8fGIudHlwZXx8ay5tZXRob2R8fGsudHlwZSxrLmRhdGFUeXBlcz1tLnRyaW0oay5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbIiJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihjPUdiLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFjfHxjWzFdPT09eWJbMV0mJmNbMl09PT15YlsyXSYmKGNbM118fCgiaHR0cDoiPT09Y1sxXT8iODAiOiI0NDMiKSk9PT0oeWJbM118fCgiaHR0cDoiPT09eWJbMV0/IjgwIjoiNDQzIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGsuZGF0YSYmKGsuZGF0YT1tLnBhcmFtKGsuZGF0YSxrLnRyYWRpdGlvbmFsKSksTWIoSGIsayxiLHYpLDI9PT10KXJldHVybiB2O2g9bS5ldmVudCYmay5nbG9iYWwsaCYmMD09PW0uYWN0aXZlKysmJm0uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0hRWIudGVzdChrLnR5cGUpLGU9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZT1rLnVybCs9KHdiLnRlc3QoZSk/IiYiOiI/Iikray5kYXRhLGRlbGV0ZSBrLmRhdGEpLGsuY2FjaGU9PT0hMSYmKGsudXJsPUJiLnRlc3QoZSk/ZS5yZXBsYWNlKEJiLCIkMV89Iit2YisrKTplKyh3Yi50ZXN0KGUpPyImIjoiPyIpKyJfPSIrdmIrKykpLGsuaWZNb2RpZmllZCYmKG0ubGFzdE1vZGlmaWVkW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixtLmxhc3RNb2RpZmllZFtlXSksbS5ldGFnW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG0uZXRhZ1tlXSkpLChrLmRhdGEmJmsuaGFzQ29udGVudCYmay5jb250ZW50VHlwZSE9PSExfHxiLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKygiKiIhPT1rLmRhdGFUeXBlc1swXT8iLCAiK0piKyI7IHE9MC4wMSI6IiIpOmsuYWNjZXB0c1siKiJdKTtmb3IoZCBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGQsay5oZWFkZXJzW2RdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT0iYWJvcnQiO2ZvcihkIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbZF0oa1tkXSk7aWYoaT1NYihJYixrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGgmJm4udHJpZ2dlcigiYWpheFNlbmQiLFt2LGtdKSxrLmFzeW5jJiZrLnRpbWVvdXQ+MCYmKGc9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxpLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHgoYSxiLGMsZCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGk9dm9pZCAwLGY9ZHx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjAsaj1hPj0yMDAmJjMwMD5hfHwzMDQ9PT1hLGMmJih1PU9iKGssdixjKSksdT1QYihrLHUsdixqKSxqPyhrLmlmTW9kaWZpZWQmJih3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYobS5sYXN0TW9kaWZpZWRbZV09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKG0uZXRhZ1tlXT13KSksMjA0PT09YXx8IkhFQUQiPT09ay50eXBlP3g9Im5vY29udGVudCI6MzA0PT09YT94PSJub3Rtb2RpZmllZCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9ImVycm9yIiwwPmEmJihhPTApKSksdi5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9KGJ8fHgpKyIiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxoJiZuLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt2LGssaj9yOnNdKSxwLmZpcmVXaXRoKGwsW3YseF0pLGgmJihuLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3Ysa10pLC0tbS5hY3RpdmV8fG0uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG0uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe21bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG0uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG0uYWpheCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0pfX0pLG0uX2V2YWxVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG0uYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sbS5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPW0oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJjE9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXttKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bSh0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1tLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXttKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bS5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG0odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG0uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB8fCFrLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpJiYibm9uZSI9PT0oYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxtLmNzcyhhLCJkaXNwbGF5IikpfSxtLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFtLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciBRYj0vJTIwL2csUmI9L1xbXF0kLyxTYj0vXHI/XG4vZyxUYj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksVWI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIFZiKGEsYixjLGQpe3ZhciBlO2lmKG0uaXNBcnJheShiKSltLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fFJiLnRlc3QoYSk/ZChhLGUpOlZiKGErIlsiKygib2JqZWN0Ij09dHlwZW9mIGU/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoY3x8Im9iamVjdCIhPT1tLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilWYihhKyJbIitlKyJdIixiW2VdLGMsZCl9bS5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bS5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iPyIiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2lmKHZvaWQgMD09PWImJihiPW0uYWpheFNldHRpbmdzJiZtLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksbS5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIW0uaXNQbGFpbk9iamVjdChhKSltLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYyBpbiBhKVZiKGMsYVtjXSxiLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKFFiLCIrIil9LG0uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW0ucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP20ubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIW0odGhpcykuaXMoIjpkaXNhYmxlZCIpJiZVYi50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVGIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVcudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1tKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bS5pc0FycmF5KGMpP20ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShTYiwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoU2IsIlxyXG4iKX19KS5nZXQoKX19KSxtLmFqYXhTZXR0aW5ncy54aHI9dm9pZCAwIT09YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmL14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmWmIoKXx8JGIoKX06WmI7dmFyIFdiPTAsWGI9e30sWWI9bS5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIFhiKVhiW2FdKHZvaWQgMCwhMCl9KSxrLmNvcnM9ISFZYiYmIndpdGhDcmVkZW50aWFscyJpbiBZYixZYj1rLmFqYXg9ISFZYixZYiYmbS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxrLmNvcnMpe3ZhciBiO3JldHVybntzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytXYjtpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKXZvaWQgMCE9PWNbZV0mJmYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0rIiIpO2Yuc2VuZChhLmhhc0NvbnRlbnQmJmEuZGF0YXx8bnVsbCksYj1mdW5jdGlvbihjLGUpe3ZhciBoLGksajtpZihiJiYoZXx8ND09PWYucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIFhiW2ddLGI9dm9pZCAwLGYub25yZWFkeXN0YXRlY2hhbmdlPW0ubm9vcCxlKTQhPT1mLnJlYWR5U3RhdGUmJmYuYWJvcnQoKTtlbHNle2o9e30saD1mLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0JiYoai50ZXh0PWYucmVzcG9uc2VUZXh0KTt0cnl7aT1mLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1ofHwhYS5pc0xvY2FsfHxhLmNyb3NzRG9tYWluPzEyMjM9PT1oJiYoaD0yMDQpOmg9ai50ZXh0PzIwMDo0MDR9aiYmZChoLGksaixmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYS5hc3luYz80PT09Zi5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYik6Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9WGJbZ109YjpiKCl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYih2b2lkIDAsITApfX19fSk7ZnVuY3Rpb24gWmIoKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gJGIoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1tLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBtLmdsb2JhbEV2YWwoYSksYX19fSksbS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG0uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPXkuaGVhZHx8bSgiaGVhZCIpWzBdfHx5LmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihkLGUpe2I9eS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxlKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgX2I9W10sYWM9Lyg9KVw/KD89JnwkKXxcP1w/LzttLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9X2IucG9wKCl8fG0uZXhwYW5kbysiXyIrdmIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG0uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGFjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmYWMudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW0uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGFjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPSh3Yi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bS5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssX2IucHVzaChlKSksZyYmbS5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbS5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fHk7dmFyIGQ9dS5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW0uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbShlKS5yZW1vdmUoKSxtLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgYmM9bS5mbi5sb2FkO20uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZiYylyZXR1cm4gYmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9bS50cmltKGEuc2xpY2UoaCxhLmxlbmd0aCkpLGE9YS5zbGljZSgwLGgpKSxtLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmIm9iamVjdCI9PXR5cGVvZiBiJiYoZj0iUE9TVCIpLGcubGVuZ3RoPjAmJm0uYWpheCh7dXJsOmEsdHlwZTpmLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2U9YXJndW1lbnRzLGcuaHRtbChkP20oIjxkaXY+IikuYXBwZW5kKG0ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuY29tcGxldGUoYyYmZnVuY3Rpb24oYSxiKXtnLmVhY2goYyxlfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KSx0aGlzfSxtLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxtLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gbS5ncmVwKG0udGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofTt2YXIgY2M9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZnVuY3Rpb24gZGMoYSl7cmV0dXJuIG0uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1tLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW0uY3NzKGEsInBvc2l0aW9uIiksbD1tKGEpLG49e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1tLmNzcyhhLCJ0b3AiKSxpPW0uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZtLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbS5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGgpKSxudWxsIT1iLnRvcCYmKG4udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG4ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG4pOmwuY3NzKG4pfX0sbS5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20ub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQ9e3RvcDowLGxlZnQ6MH0sZT10aGlzWzBdLGY9ZSYmZS5vd25lckRvY3VtZW50O2lmKGYpcmV0dXJuIGI9Zi5kb2N1bWVudEVsZW1lbnQsbS5jb250YWlucyhiLGUpPyh0eXBlb2YgZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPT1LJiYoZD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxjPWRjKGYpLHt0b3A6ZC50b3ArKGMucGFnZVlPZmZzZXR8fGIuc2Nyb2xsVG9wKS0oYi5jbGllbnRUb3B8fDApLGxlZnQ6ZC5sZWZ0KyhjLnBhZ2VYT2Zmc2V0fHxiLnNjcm9sbExlZnQpLShiLmNsaWVudExlZnR8fDApfSk6ZH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgYSxiLGM9e3RvcDowLGxlZnQ6MH0sZD10aGlzWzBdO3JldHVybiJmaXhlZCI9PT1tLmNzcyhkLCJwb3NpdGlvbiIpP2I9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTooYT10aGlzLm9mZnNldFBhcmVudCgpLGI9dGhpcy5vZmZzZXQoKSxtLm5vZGVOYW1lKGFbMF0sImh0bWwiKXx8KGM9YS5vZmZzZXQoKSksYy50b3ArPW0uY3NzKGFbMF0sImJvcmRlclRvcFdpZHRoIiwhMCksYy5sZWZ0Kz1tLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSkse3RvcDpiLnRvcC1jLnRvcC1tLmNzcyhkLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmIubGVmdC1jLmxlZnQtbS5jc3MoZCwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjYzt3aGlsZShhJiYhbS5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bS5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxjY30pfX0pLG0uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO20uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9ZGMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bShmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bShmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbS5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bS5jc3NIb29rc1tiXT1MYShrLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1KYShhLGIpLEhhLnRlc3QoYyk/bShhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxtLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe20uZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpiLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24oYyxkKXttLmZuW2RdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aCYmKGN8fCJib29sZWFuIiE9dHlwZW9mIGQpLGc9Y3x8KGQ9PT0hMHx8ZT09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZTtyZXR1cm4gbS5pc1dpbmRvdyhiKT9iLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09Yi5ub2RlVHlwZT8oZT1iLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChiLmJvZHlbInNjcm9sbCIrYV0sZVsic2Nyb2xsIithXSxiLmJvZHlbIm9mZnNldCIrYV0sZVsib2Zmc2V0IithXSxlWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09ZD9tLmNzcyhiLGMsZyk6bS5zdHlsZShiLGMsZCxnKX0sYixmP2Q6dm9pZCAwLGYsbnVsbCl9fSl9KSxtLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG0uZm4uYW5kU2VsZj1tLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG19KTt2YXIgZWM9YS5qUXVlcnksZmM9YS4kO3JldHVybiBtLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW0mJihhLiQ9ZmMpLGImJmEualF1ZXJ5PT09bSYmKGEualF1ZXJ5PWVjKSxtfSx0eXBlb2YgYj09PUsmJihhLmpRdWVyeT1hLiQ9bSksbX0pOwo="></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKCnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpOwoKZXhwb3J0cy5zdGFtcCA9IHN0YW1wOwoKZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsgfSB9Cgp2YXIgRXZlbnRzID0gZnVuY3Rpb24gKCkgewogIGZ1bmN0aW9uIEV2ZW50cygpIHsKICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFdmVudHMpOwoKICAgIHRoaXMuX3R5cGVzID0ge307CiAgICB0aGlzLl9zZXEgPSAwOwogIH0KCiAgX2NyZWF0ZUNsYXNzKEV2ZW50cywgW3sKICAgIGtleTogIm9uIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudFR5cGUsIGxpc3RlbmVyKSB7CiAgICAgIHZhciBzdWJzID0gdGhpcy5fdHlwZXNbZXZlbnRUeXBlXTsKICAgICAgaWYgKCFzdWJzKSB7CiAgICAgICAgc3VicyA9IHRoaXMuX3R5cGVzW2V2ZW50VHlwZV0gPSB7fTsKICAgICAgfQogICAgICB2YXIgc3ViID0gInN1YiIgKyB0aGlzLl9zZXErKzsKICAgICAgc3Vic1tzdWJdID0gbGlzdGVuZXI7CiAgICAgIHJldHVybiBzdWI7CiAgICB9CiAgfSwgewogICAga2V5OiAib2ZmIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYoZXZlbnRUeXBlLCBsaXN0ZW5lcikgewogICAgICB2YXIgc3VicyA9IHRoaXMuX3R5cGVzW2V2ZW50VHlwZV07CiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3VicykgewogICAgICAgICAgaWYgKHN1YnMuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICBpZiAoc3Vic1trZXldID09PSBsaXN0ZW5lcikgewogICAgICAgICAgICAgIGRlbGV0ZSBzdWJzW2tleV07CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ZW5lciA9PT0gInN0cmluZyIpIHsKICAgICAgICBpZiAoc3VicykgewogICAgICAgICAgZGVsZXRlIHN1YnNbbGlzdGVuZXJdOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSBmb3IgbGlzdGVuZXIiKTsKICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogInRyaWdnZXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIHRyaWdnZXIoZXZlbnRUeXBlLCBhcmcsIHRoaXNPYmopIHsKICAgICAgdmFyIHN1YnMgPSB0aGlzLl90eXBlc1tldmVudFR5cGVdOwogICAgICBmb3IgKHZhciBrZXkgaW4gc3VicykgewogICAgICAgIGlmIChzdWJzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgIHN1YnNba2V5XS5jYWxsKHRoaXNPYmosIGFyZyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfV0pOwoKICByZXR1cm4gRXZlbnRzOwp9KCk7CgpleHBvcnRzLmRlZmF1bHQgPSBFdmVudHM7CgoKdmFyIHN0YW1wU2VxID0gMTsKCmZ1bmN0aW9uIHN0YW1wKGVsKSB7CiAgaWYgKGVsID09PSBudWxsKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIGlmICghZWwuX19jcm9zc3RhbGtTdGFtcCkgewogICAgZWwuX19jcm9zc3RhbGtTdGFtcCA9ICJjdCIgKyBzdGFtcFNlcSsrOwogIH0KICByZXR1cm4gZWwuX19jcm9zc3RhbGtTdGFtcDsKfQoKCn0se31dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgdmFsdWU6IHRydWUKfSk7Cgp2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTsKCmV4cG9ydHMuY3JlYXRlSGFuZGxlID0gY3JlYXRlSGFuZGxlOwoKdmFyIF9maWx0ZXJzZXQgPSByZXF1aXJlKCIuL2ZpbHRlcnNldCIpOwoKdmFyIF9maWx0ZXJzZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZmlsdGVyc2V0KTsKCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9CgpmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KCmZ1bmN0aW9uIGdldEZpbHRlclNldChncm91cCkgewogIHZhciBmc1ZhciA9IGdyb3VwLnZhcigiZmlsdGVyc2V0Iik7CiAgdmFyIHJlc3VsdCA9IGZzVmFyLmdldCgpOwogIGlmICghcmVzdWx0KSB7CiAgICByZXN1bHQgPSBuZXcgX2ZpbHRlcnNldDIuZGVmYXVsdCgpOwogICAgZnNWYXIuc2V0KHJlc3VsdCk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KCnZhciBpZCA9IDE7CmZ1bmN0aW9uIG5leHRJZCgpIHsKICByZXR1cm4gaWQrKzsKfQoKZnVuY3Rpb24gY3JlYXRlSGFuZGxlKGdyb3VwKSB7CiAgcmV0dXJuIG5ldyBGaWx0ZXJIYW5kbGUoZ2V0RmlsdGVyU2V0KGdyb3VwKSwgZ3JvdXAudmFyKCJmaWx0ZXIiKSk7Cn0KCnZhciBGaWx0ZXJIYW5kbGUgPSBmdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gRmlsdGVySGFuZGxlKGZpbHRlclNldCwgZmlsdGVyVmFyKSB7CiAgICB2YXIgaGFuZGxlSWQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyAiZmlsdGVyIiArIG5leHRJZCgpIDogYXJndW1lbnRzWzJdOwoKICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGaWx0ZXJIYW5kbGUpOwoKICAgIHRoaXMuX2ZpbHRlclNldCA9IGZpbHRlclNldDsKICAgIHRoaXMuX2ZpbHRlclZhciA9IGZpbHRlclZhcjsKICAgIHRoaXMuX2lkID0gaGFuZGxlSWQ7CiAgfQoKICBfY3JlYXRlQ2xhc3MoRmlsdGVySGFuZGxlLCBbewogICAga2V5OiAiY2xvc2UiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKCkgewogICAgICB0aGlzLmNsZWFyKCk7CiAgICB9CiAgfSwgewogICAga2V5OiAiY2xlYXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkgewogICAgICB0aGlzLl9maWx0ZXJTZXQuY2xlYXIodGhpcy5faWQpOwogICAgICB0aGlzLl9vbkNoYW5nZSgpOwogICAgfQogIH0sIHsKICAgIGtleTogInNldCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGtleXMpIHsKICAgICAgdGhpcy5fZmlsdGVyU2V0LnVwZGF0ZSh0aGlzLl9pZCwga2V5cyk7CiAgICAgIHRoaXMuX29uQ2hhbmdlKCk7CiAgICB9CiAgfSwgewogICAga2V5OiAib24iLAogICAgdmFsdWU6IGZ1bmN0aW9uIG9uKGV2ZW50VHlwZSwgbGlzdGVuZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlclZhci5vbihldmVudFR5cGUsIGxpc3RlbmVyKTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJfb25DaGFuZ2UiLAogICAgdmFsdWU6IGZ1bmN0aW9uIF9vbkNoYW5nZSgpIHsKICAgICAgdGhpcy5fZmlsdGVyVmFyLnNldCh0aGlzLl9maWx0ZXJTZXQudmFsdWUpOwogICAgfQogIH0sIHsKICAgIGtleTogImZpbHRlcmVkS2V5cyIsCiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlclNldC52YWx1ZTsKICAgIH0KICB9XSk7CgogIHJldHVybiBGaWx0ZXJIYW5kbGU7Cn0oKTsKCgp9LHsiLi9maWx0ZXJzZXQiOjN9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwoKdmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7Cgp2YXIgX3V0aWwgPSByZXF1aXJlKCIuL3V0aWwiKTsKCmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQoKZnVuY3Rpb24gbmF0dXJhbENvbXBhcmF0b3IoYSwgYikgewogIGlmIChhID09PSBiKSB7CiAgICByZXR1cm4gMDsKICB9IGVsc2UgaWYgKGEgPCBiKSB7CiAgICByZXR1cm4gLTE7CiAgfSBlbHNlIGlmIChhID4gYikgewogICAgcmV0dXJuIDE7CiAgfQp9Cgp2YXIgRmlsdGVyU2V0ID0gZnVuY3Rpb24gKCkgewogIGZ1bmN0aW9uIEZpbHRlclNldCgpIHsKICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGaWx0ZXJTZXQpOwoKICAgIHRoaXMucmVzZXQoKTsKICB9CgogIF9jcmVhdGVDbGFzcyhGaWx0ZXJTZXQsIFt7CiAgICBrZXk6ICJyZXNldCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgIC8vIEtleTogaGFuZGxlIElELCBWYWx1ZTogYXJyYXkgb2Ygc2VsZWN0ZWQga2V5cywgb3IgbnVsbAogICAgICB0aGlzLl9oYW5kbGVzID0ge307CiAgICAgIC8vIEtleToga2V5IHN0cmluZywgVmFsdWU6IGNvdW50IG9mIGhhbmRsZXMgdGhhdCBpbmNsdWRlIGl0CiAgICAgIHRoaXMuX2tleXMgPSB7fTsKICAgICAgdGhpcy5fdmFsdWUgPSBudWxsOwogICAgICB0aGlzLl9hY3RpdmVIYW5kbGVzID0gMDsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJ1cGRhdGUiLAogICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZShoYW5kbGVJZCwga2V5cykgewogICAgICBpZiAoa2V5cyAhPT0gbnVsbCkgewogICAgICAgIGtleXMgPSBrZXlzLnNsaWNlKDApOyAvLyBjbG9uZSBiZWZvcmUgc29ydGluZwogICAgICAgIGtleXMuc29ydChuYXR1cmFsQ29tcGFyYXRvcik7CiAgICAgIH0KCiAgICAgIHZhciBfZGlmZlNvcnRlZExpc3RzID0gKDAsIF91dGlsLmRpZmZTb3J0ZWRMaXN0cykodGhpcy5faGFuZGxlc1toYW5kbGVJZF0sIGtleXMpOwoKICAgICAgdmFyIGFkZGVkID0gX2RpZmZTb3J0ZWRMaXN0cy5hZGRlZDsKICAgICAgdmFyIHJlbW92ZWQgPSBfZGlmZlNvcnRlZExpc3RzLnJlbW92ZWQ7CgogICAgICB0aGlzLl9oYW5kbGVzW2hhbmRsZUlkXSA9IGtleXM7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFkZGVkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5fa2V5c1thZGRlZFtpXV0gPSAodGhpcy5fa2V5c1thZGRlZFtpXV0gfHwgMCkgKyAxOwogICAgICB9CiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCByZW1vdmVkLmxlbmd0aDsgX2krKykgewogICAgICAgIHRoaXMuX2tleXNbcmVtb3ZlZFtfaV1dLS07CiAgICAgIH0KCiAgICAgIHRoaXMuX3VwZGF0ZVZhbHVlKGtleXMpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmdbXX0ga2V5cyBTb3J0ZWQgYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IGluZGljYXRlCiAgICAgKiBhIHN1cGVyc2V0IG9mIHBvc3NpYmxlIGtleXMuCiAgICAgKi8KCiAgfSwgewogICAga2V5OiAiX3VwZGF0ZVZhbHVlIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlVmFsdWUoKSB7CiAgICAgIHZhciBrZXlzID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5fYWxsS2V5cyA6IGFyZ3VtZW50c1swXTsKCiAgICAgIHZhciBoYW5kbGVDb3VudCA9IE9iamVjdC5rZXlzKHRoaXMuX2hhbmRsZXMpLmxlbmd0aDsKICAgICAgaWYgKGhhbmRsZUNvdW50ID09PSAwKSB7CiAgICAgICAgdGhpcy5fdmFsdWUgPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuX3ZhbHVlID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgY291bnQgPSB0aGlzLl9rZXlzW2tleXNbaV1dOwogICAgICAgICAgaWYgKGNvdW50ID09PSBoYW5kbGVDb3VudCkgewogICAgICAgICAgICB0aGlzLl92YWx1ZS5wdXNoKGtleXNbaV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogImNsZWFyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcihoYW5kbGVJZCkgewogICAgICBpZiAodHlwZW9mIHRoaXMuX2hhbmRsZXNbaGFuZGxlSWRdID09PSAidW5kZWZpbmVkIikgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIGtleXMgPSB0aGlzLl9oYW5kbGVzW2hhbmRsZUlkXSB8fCBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5fa2V5c1trZXlzW2ldXS0tOwogICAgICB9CiAgICAgIGRlbGV0ZSB0aGlzLl9oYW5kbGVzW2hhbmRsZUlkXTsKCiAgICAgIHRoaXMuX3VwZGF0ZVZhbHVlKCk7CiAgICB9CiAgfSwgewogICAga2V5OiAidmFsdWUiLAogICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLl92YWx1ZTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJfYWxsS2V5cyIsCiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgdmFyIGFsbEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLl9rZXlzKTsKICAgICAgYWxsS2V5cy5zb3J0KG5hdHVyYWxDb21wYXJhdG9yKTsKICAgICAgcmV0dXJuIGFsbEtleXM7CiAgICB9CiAgfV0pOwoKICByZXR1cm4gRmlsdGVyU2V0Owp9KCk7CgpleHBvcnRzLmRlZmF1bHQgPSBGaWx0ZXJTZXQ7CgoKfSx7Ii4vdXRpbCI6MTF9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwoKdmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7CgpleHBvcnRzLmRlZmF1bHQgPSBncm91cDsKCnZhciBfdmFyMiA9IHJlcXVpcmUoIi4vdmFyIik7Cgp2YXIgX3ZhcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92YXIyKTsKCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9CgpmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KCnZhciBncm91cHMgPSB7fTsKCmZ1bmN0aW9uIGdyb3VwKGdyb3VwTmFtZSkgewogIGlmICghZ3JvdXBzLmhhc093blByb3BlcnR5KGdyb3VwTmFtZSkpIHsKICAgIGdyb3Vwc1tncm91cE5hbWVdID0gbmV3IEdyb3VwKGdyb3VwTmFtZSk7CiAgfQogIHJldHVybiBncm91cHNbZ3JvdXBOYW1lXTsKfQoKdmFyIEdyb3VwID0gZnVuY3Rpb24gKCkgewogIGZ1bmN0aW9uIEdyb3VwKG5hbWUpIHsKICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBHcm91cCk7CgogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMuX3ZhcnMgPSB7fTsKICB9CgogIF9jcmVhdGVDbGFzcyhHcm91cCwgW3sKICAgIGtleTogInZhciIsCiAgICB2YWx1ZTogZnVuY3Rpb24gX3ZhcihuYW1lKSB7CiAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gInN0cmluZyIpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdmFyIG5hbWUiKTsKICAgICAgfQoKICAgICAgaWYgKCF0aGlzLl92YXJzLmhhc093blByb3BlcnR5KG5hbWUpKSB0aGlzLl92YXJzW25hbWVdID0gbmV3IF92YXIzLmRlZmF1bHQodGhpcywgbmFtZSk7CiAgICAgIHJldHVybiB0aGlzLl92YXJzW25hbWVdOwogICAgfQogIH0sIHsKICAgIGtleTogImhhcyIsCiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKG5hbWUpIHsKICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAic3RyaW5nIikgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCB2YXIgbmFtZSIpOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5fdmFycy5oYXNPd25Qcm9wZXJ0eShuYW1lKTsKICAgIH0KICB9XSk7CgogIHJldHVybiBHcm91cDsKfSgpOwoKCn0seyIuL3ZhciI6MTJ9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKGZ1bmN0aW9uIChnbG9iYWwpewoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgdmFsdWU6IHRydWUKfSk7Cgp2YXIgX2dyb3VwID0gcmVxdWlyZSgiLi9ncm91cCIpOwoKdmFyIF9ncm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ncm91cCk7Cgp2YXIgX3NlbGVjdGlvbiA9IHJlcXVpcmUoIi4vc2VsZWN0aW9uIik7Cgp2YXIgc2VsZWN0aW9uID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3NlbGVjdGlvbik7Cgp2YXIgX2ZpbHRlciA9IHJlcXVpcmUoIi4vZmlsdGVyIik7Cgp2YXIgZmlsdGVyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2ZpbHRlcik7CgpyZXF1aXJlKCIuL2lucHV0Iik7CgpyZXF1aXJlKCIuL2lucHV0X3NlbGVjdGl6ZSIpOwoKcmVxdWlyZSgiLi9pbnB1dF9jaGVja2JveGdyb3VwIik7CgpyZXF1aXJlKCIuL2lucHV0X3NsaWRlciIpOwoKZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH0KCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9Cgp2YXIgZGVmYXVsdEdyb3VwID0gKDAsIF9ncm91cDIuZGVmYXVsdCkoImRlZmF1bHQiKTsKCmZ1bmN0aW9uIHZhcl8obmFtZSkgewogIHJldHVybiBkZWZhdWx0R3JvdXAudmFyKG5hbWUpOwp9CgpmdW5jdGlvbiBoYXMobmFtZSkgewogIHJldHVybiBkZWZhdWx0R3JvdXAuaGFzKG5hbWUpOwp9CgppZiAoZ2xvYmFsLlNoaW55KSB7CiAgZ2xvYmFsLlNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCJ1cGRhdGUtY2xpZW50LXZhbHVlIiwgZnVuY3Rpb24gKG1lc3NhZ2UpIHsKICAgIGlmICh0eXBlb2YgbWVzc2FnZS5ncm91cCA9PT0gInN0cmluZyIpIHsKICAgICAgKDAsIF9ncm91cDIuZGVmYXVsdCkobWVzc2FnZS5ncm91cCkudmFyKG1lc3NhZ2UubmFtZSkuc2V0KG1lc3NhZ2UudmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyXyhtZXNzYWdlLm5hbWUpLnNldChtZXNzYWdlLnZhbHVlKTsKICAgIH0KICB9KTsKfQoKdmFyIGNyb3NzdGFsayA9IHsKICBncm91cDogX2dyb3VwMi5kZWZhdWx0LAogIHZhcjogdmFyXywKICBoYXM6IGhhcywKICBzZWxlY3Rpb246IHNlbGVjdGlvbiwKICBmaWx0ZXI6IGZpbHRlcgp9OwoKZXhwb3J0cy5kZWZhdWx0ID0gY3Jvc3N0YWxrOwoKZ2xvYmFsLmNyb3NzdGFsayA9IGNyb3NzdGFsazsKCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7Ii4vZmlsdGVyIjoyLCIuL2dyb3VwIjo0LCIuL2lucHV0Ijo2LCIuL2lucHV0X2NoZWNrYm94Z3JvdXAiOjcsIi4vaW5wdXRfc2VsZWN0aXplIjo4LCIuL2lucHV0X3NsaWRlciI6OSwiLi9zZWxlY3Rpb24iOjEwfV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoZ2xvYmFsKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLnJlZ2lzdGVyID0gcmVnaXN0ZXI7CnZhciAkID0gZ2xvYmFsLmpRdWVyeTsKCnZhciBiaW5kaW5ncyA9IHt9OwoKZnVuY3Rpb24gcmVnaXN0ZXIocmVnKSB7CiAgYmluZGluZ3NbcmVnLmNsYXNzTmFtZV0gPSByZWc7CiAgaWYgKGdsb2JhbC5kb2N1bWVudCAmJiBnbG9iYWwuZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gImNvbXBsZXRlIikgewogICAgJChmdW5jdGlvbiAoKSB7CiAgICAgIGJpbmQoKTsKICAgIH0pOwogIH0gZWxzZSB7CiAgICBzZXRUaW1lb3V0KGJpbmQsIDEwMCk7CiAgfQp9CgpmdW5jdGlvbiBiaW5kKCkgewogIE9iamVjdC5rZXlzKGJpbmRpbmdzKS5mb3JFYWNoKGZ1bmN0aW9uIChjbGFzc05hbWUpIHsKICAgIHZhciBiaW5kaW5nID0gYmluZGluZ3NbY2xhc3NOYW1lXTsKICAgICQoIi4iICsgYmluZGluZy5jbGFzc05hbWUpLm5vdCgiLmNyb3NzdGFsay1pbnB1dC1ib3VuZCIpLmVhY2goZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgIGJpbmRJbnN0YW5jZShiaW5kaW5nLCBlbCk7CiAgICB9KTsKICB9KTsKfQoKLy8gRXNjYXBlIGpRdWVyeSBpZGVudGlmaWVyCmZ1bmN0aW9uICRlc2NhcGUodmFsKSB7CiAgcmV0dXJuIHZhbC5yZXBsYWNlKC8oWyEiIyQlJicoKSorLC5cLzo7PD0+P0BcW1xcXF1eYHt8fX5dKS9nLCAiXFwkMSIpOwp9CgpmdW5jdGlvbiBiaW5kSW5zdGFuY2UoYmluZGluZywgZWwpIHsKICB2YXIganNvbkVsID0gJChlbCkuZmluZCgic2NyaXB0W3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXVtkYXRhLWZvcj0nIiArICRlc2NhcGUoZWwuaWQpICsgIiddIik7CiAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKGpzb25FbFswXS5pbm5lclRleHQpOwoKICB2YXIgaW5zdGFuY2UgPSBiaW5kaW5nLmZhY3RvcnkoZWwsIGRhdGEpOwogICQoZWwpLmRhdGEoImNyb3NzdGFsay1pbnN0YW5jZSIsIGluc3RhbmNlKTsKICAkKGVsKS5hZGRDbGFzcygiY3Jvc3N0YWxrLWlucHV0LWJvdW5kIik7Cn0KCmlmIChnbG9iYWwuU2hpbnkpIHsKICAoZnVuY3Rpb24gKCkgewogICAgdmFyIGlucHV0QmluZGluZyA9IG5ldyBnbG9iYWwuU2hpbnkuSW5wdXRCaW5kaW5nKCk7CiAgICB2YXIgJCA9IGdsb2JhbC5qUXVlcnk7CiAgICAkLmV4dGVuZChpbnB1dEJpbmRpbmcsIHsKICAgICAgZmluZDogZnVuY3Rpb24gZmluZChzY29wZSkgewogICAgICAgIHJldHVybiAkKHNjb3BlKS5maW5kKCIuY3Jvc3N0YWxrLWlucHV0Iik7CiAgICAgIH0sCiAgICAgIGdldElkOiBmdW5jdGlvbiBnZXRJZChlbCkgewogICAgICAgIHJldHVybiBlbC5pZDsKICAgICAgfSwKICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlKGVsKSB7fSwKICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uIHNldFZhbHVlKGVsLCB2YWx1ZSkge30sCiAgICAgIHJlY2VpdmVNZXNzYWdlOiBmdW5jdGlvbiByZWNlaXZlTWVzc2FnZShlbCwgZGF0YSkge30sCiAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKGVsLCBjYWxsYmFjaykgewogICAgICAgICQoZWwpLm9uKCJjcm9zc3RhbGstdmFsdWUtY2hhbmdlLmNyb3NzdGFsayIsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgY2FsbGJhY2soZmFsc2UpOwogICAgICAgIH0pOwogICAgICB9LAogICAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24gdW5zdWJzY3JpYmUoZWwpIHsKICAgICAgICAkKGVsKS5vZmYoIi5jcm9zc3RhbGsiKTsKICAgICAgfQogICAgfSk7CiAgICBnbG9iYWwuU2hpbnkuaW5wdXRCaW5kaW5ncy5yZWdpc3RlcihpbnB1dEJpbmRpbmcsICJjcm9zc3RhbGsuaW5wdXRCaW5kaW5nIik7CiAgfSkoKTsKfQoKCn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQp9LHt9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKGZ1bmN0aW9uIChnbG9iYWwpewoidXNlIHN0cmljdCI7Cgp2YXIgX2lucHV0ID0gcmVxdWlyZSgiLi9pbnB1dCIpOwoKdmFyIGlucHV0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2lucHV0KTsKCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7IHZhciBuZXdPYmogPSB7fTsgaWYgKG9iaiAhPSBudWxsKSB7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9Cgp2YXIgJCA9IGdsb2JhbC5qUXVlcnk7CgppbnB1dC5yZWdpc3Rlcih7CiAgY2xhc3NOYW1lOiAiY3Jvc3N0YWxrLWlucHV0LWNoZWNrYm94Z3JvdXAiLAoKICBmYWN0b3J5OiBmdW5jdGlvbiBmYWN0b3J5KGVsLCBkYXRhKSB7CiAgICAvKgogICAgICogbWFwOiB7Imdyb3VwQSI6IFsia2V5QSIsICJrZXlCIiwgLi4uXSwgLi4ufQogICAgICogZ3JvdXA6ICJjdC1ncm91cG5hbWUiCiAgICAgKi8KICAgIHZhciBjdEdyb3VwID0gZ2xvYmFsLmNyb3NzdGFsay5ncm91cChkYXRhLmdyb3VwKTsKICAgIHZhciBjdEhhbmRsZSA9IGdsb2JhbC5jcm9zc3RhbGsuZmlsdGVyLmNyZWF0ZUhhbmRsZShjdEdyb3VwKTsKCiAgICB2YXIgJGVsID0gJChlbCk7CiAgICAkZWwub24oImNoYW5nZSIsICJpbnB1dFt0eXBlPSdjaGVja2JveCddIiwgZnVuY3Rpb24gKCkgewogICAgICB2YXIgY2hlY2tlZCA9ICRlbC5maW5kKCJpbnB1dFt0eXBlPSdjaGVja2JveCddOmNoZWNrZWQiKTsKICAgICAgaWYgKGNoZWNrZWQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgY3RIYW5kbGUuY2xlYXIoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGtleXMgPSB7fTsKICAgICAgICAgIGNoZWNrZWQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGRhdGEubWFwW3RoaXMudmFsdWVdLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgIGtleXNba2V5XSA9IHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIga2V5QXJyYXkgPSBPYmplY3Qua2V5cyhrZXlzKTsKICAgICAgICAgIGtleUFycmF5LnNvcnQoKTsKICAgICAgICAgIGN0SGFuZGxlLnNldChrZXlBcnJheSk7CiAgICAgICAgfSkoKTsKICAgICAgfQogICAgfSk7CiAgfQp9KTsKCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7Ii4vaW5wdXQiOjZ9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKGZ1bmN0aW9uIChnbG9iYWwpewoidXNlIHN0cmljdCI7Cgp2YXIgX2lucHV0ID0gcmVxdWlyZSgiLi9pbnB1dCIpOwoKdmFyIGlucHV0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2lucHV0KTsKCnZhciBfdXRpbCA9IHJlcXVpcmUoIi4vdXRpbCIpOwoKdmFyIHV0aWwgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfdXRpbCk7CgpmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgeyB2YXIgbmV3T2JqID0ge307IGlmIChvYmogIT0gbnVsbCkgeyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IHJldHVybiBuZXdPYmo7IH0gfQoKdmFyICQgPSBnbG9iYWwualF1ZXJ5OwoKaW5wdXQucmVnaXN0ZXIoewogIGNsYXNzTmFtZTogImNyb3NzdGFsay1pbnB1dC1zZWxlY3QiLAoKICBmYWN0b3J5OiBmdW5jdGlvbiBmYWN0b3J5KGVsLCBkYXRhKSB7CiAgICAvKgogICAgICogaXRlbXM6IHt2YWx1ZTogWy4uLl0sIGxhYmVsOiBbLi4uXX0KICAgICAqIG1hcDogeyJncm91cEEiOiBbImtleUEiLCAia2V5QiIsIC4uLl0sIC4uLn0KICAgICAqIGdyb3VwOiAiY3QtZ3JvdXBuYW1lIgogICAgICovCgogICAgdmFyIGZpcnN0ID0gW3sgdmFsdWU6ICIiLCBsYWJlbDogIihBbGwpIiB9XTsKICAgIHZhciBpdGVtcyA9IHV0aWwuZGF0YWZyYW1lVG9EMyhkYXRhLml0ZW1zKTsKICAgIHZhciBvcHRzID0gewogICAgICBvcHRpb25zOiBmaXJzdC5jb25jYXQoaXRlbXMpLAogICAgICB2YWx1ZUZpZWxkOiAidmFsdWUiLAogICAgICBsYWJlbEZpZWxkOiAibGFiZWwiCiAgICB9OwoKICAgIHZhciBzZWxlY3QgPSAkKGVsKS5maW5kKCJzZWxlY3QiKVswXTsKCiAgICB2YXIgc2VsZWN0aXplID0gJChzZWxlY3QpLnNlbGVjdGl6ZShvcHRzKVswXS5zZWxlY3RpemU7CgogICAgdmFyIGN0R3JvdXAgPSBnbG9iYWwuY3Jvc3N0YWxrLmdyb3VwKGRhdGEuZ3JvdXApOwogICAgdmFyIGN0SGFuZGxlID0gZ2xvYmFsLmNyb3NzdGFsay5maWx0ZXIuY3JlYXRlSGFuZGxlKGN0R3JvdXApOwoKICAgIHNlbGVjdGl6ZS5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgewogICAgICBpZiAoc2VsZWN0aXplLml0ZW1zLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGN0SGFuZGxlLmNsZWFyKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBrZXlzID0ge307CiAgICAgICAgICBzZWxlY3RpemUuaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoZ3JvdXApIHsKICAgICAgICAgICAgZGF0YS5tYXBbZ3JvdXBdLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgIGtleXNba2V5XSA9IHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIga2V5QXJyYXkgPSBPYmplY3Qua2V5cyhrZXlzKTsKICAgICAgICAgIGtleUFycmF5LnNvcnQoKTsKICAgICAgICAgIGN0SGFuZGxlLnNldChrZXlBcnJheSk7CiAgICAgICAgfSkoKTsKICAgICAgfQogICAgfSk7CgogICAgcmV0dXJuIHNlbGVjdGl6ZTsKICB9Cn0pOwoKCn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQp9LHsiLi9pbnB1dCI6NiwiLi91dGlsIjoxMX1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCl7CiJ1c2Ugc3RyaWN0IjsKCnZhciBfc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbInJldHVybiJdKSBfaVsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9IHJldHVybiBmdW5jdGlvbiAoYXJyLCBpKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgcmV0dXJuIGFycjsgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHsgcmV0dXJuIHNsaWNlSXRlcmF0b3IoYXJyLCBpKTsgfSBlbHNlIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZSIpOyB9IH07IH0oKTsKCnZhciBfaW5wdXQgPSByZXF1aXJlKCIuL2lucHV0Iik7Cgp2YXIgaW5wdXQgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaW5wdXQpOwoKZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH0KCnZhciAkID0gZ2xvYmFsLmpRdWVyeTsKdmFyIHN0cmZ0aW1lID0gZ2xvYmFsLnN0cmZ0aW1lOwoKaW5wdXQucmVnaXN0ZXIoewogIGNsYXNzTmFtZTogImNyb3NzdGFsay1pbnB1dC1zbGlkZXIiLAoKICBmYWN0b3J5OiBmdW5jdGlvbiBmYWN0b3J5KGVsLCBkYXRhKSB7CiAgICAvKgogICAgICogbWFwOiB7Imdyb3VwQSI6IFsia2V5QSIsICJrZXlCIiwgLi4uXSwgLi4ufQogICAgICogZ3JvdXA6ICJjdC1ncm91cG5hbWUiCiAgICAgKi8KICAgIHZhciBjdEdyb3VwID0gZ2xvYmFsLmNyb3NzdGFsay5ncm91cChkYXRhLmdyb3VwKTsKICAgIHZhciBjdEhhbmRsZSA9IGdsb2JhbC5jcm9zc3RhbGsuZmlsdGVyLmNyZWF0ZUhhbmRsZShjdEdyb3VwKTsKCiAgICB2YXIgb3B0cyA9IHt9OwogICAgdmFyICRlbCA9ICQoZWwpLmZpbmQoImlucHV0Iik7CiAgICB2YXIgZGF0YVR5cGUgPSAkZWwuZGF0YSgiZGF0YS10eXBlIik7CiAgICB2YXIgdGltZUZvcm1hdCA9ICRlbC5kYXRhKCJ0aW1lLWZvcm1hdCIpOwogICAgdmFyIHRpbWVGb3JtYXR0ZXI7CgogICAgLy8gU2V0IHVwIGZvcm1hdHRpbmcgZnVuY3Rpb25zCiAgICBpZiAoZGF0YVR5cGUgPT09ICJkYXRlIikgewogICAgICB0aW1lRm9ybWF0dGVyID0gc3RyZnRpbWUudXRjKCk7CiAgICAgIG9wdHMucHJldHRpZnkgPSBmdW5jdGlvbiAobnVtKSB7CiAgICAgICAgcmV0dXJuIHRpbWVGb3JtYXR0ZXIodGltZUZvcm1hdCwgbmV3IERhdGUobnVtKSk7CiAgICAgIH07CiAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSAiZGF0ZXRpbWUiKSB7CiAgICAgIHZhciB0aW1lem9uZSA9ICRlbC5kYXRhKCJ0aW1lem9uZSIpOwogICAgICBpZiAodGltZXpvbmUpIHRpbWVGb3JtYXR0ZXIgPSBzdHJmdGltZS50aW1lem9uZSh0aW1lem9uZSk7ZWxzZSB0aW1lRm9ybWF0dGVyID0gc3RyZnRpbWU7CgogICAgICBvcHRzLnByZXR0aWZ5ID0gZnVuY3Rpb24gKG51bSkgewogICAgICAgIHJldHVybiB0aW1lRm9ybWF0dGVyKHRpbWVGb3JtYXQsIG5ldyBEYXRlKG51bSkpOwogICAgICB9OwogICAgfQoKICAgICRlbC5pb25SYW5nZVNsaWRlcihvcHRzKTsKCiAgICBmdW5jdGlvbiBnZXRWYWx1ZSgpIHsKICAgICAgdmFyIHJlc3VsdCA9ICRlbC5kYXRhKCJpb25SYW5nZVNsaWRlciIpLnJlc3VsdDsKCiAgICAgIC8vIEZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIG51bWVyaWMgdmFsdWUgZnJvbSBzbGlkZXIgdG8gYXBwcm9wcmlhdGUgdHlwZS4KICAgICAgdmFyIGNvbnZlcnQgPSB2b2lkIDA7CiAgICAgIHZhciBkYXRhVHlwZSA9ICRlbC5kYXRhKCJkYXRhLXR5cGUiKTsKICAgICAgaWYgKGRhdGFUeXBlID09PSAiZGF0ZSIpIHsKICAgICAgICBjb252ZXJ0ID0gZnVuY3Rpb24gY29udmVydCh2YWwpIHsKICAgICAgICAgIHJldHVybiBmb3JtYXREYXRlVVRDKG5ldyBEYXRlKCt2YWwpKTsKICAgICAgICB9OwogICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSAiZGF0ZXRpbWUiKSB7CiAgICAgICAgY29udmVydCA9IGZ1bmN0aW9uIGNvbnZlcnQodmFsKSB7CiAgICAgICAgICAvLyBDb252ZXJ0IG1zIHRvIHMKICAgICAgICAgIHJldHVybiArdmFsIC8gMTAwMDsKICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnZlcnQgPSBmdW5jdGlvbiBjb252ZXJ0KHZhbCkgewogICAgICAgICAgcmV0dXJuICt2YWw7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgaWYgKCRlbC5kYXRhKCJpb25SYW5nZVNsaWRlciIpLm9wdGlvbnMudHlwZSA9PT0gImRvdWJsZSIpIHsKICAgICAgICByZXR1cm4gW2NvbnZlcnQocmVzdWx0LmZyb20pLCBjb252ZXJ0KHJlc3VsdC50byldOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjb252ZXJ0KHJlc3VsdC5mcm9tKTsKICAgICAgfQogICAgfQoKICAgICRlbC5vbigiY2hhbmdlLmNyb3NzdGFsa1NsaWRlcklucHV0IiwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgIGlmICghJGVsLmRhdGEoInVwZGF0aW5nIikgJiYgISRlbC5kYXRhKCJhbmltYXRpbmciKSkgewogICAgICAgIHZhciBfZ2V0VmFsdWUgPSBnZXRWYWx1ZSgpOwoKICAgICAgICB2YXIgX2dldFZhbHVlMiA9IF9zbGljZWRUb0FycmF5KF9nZXRWYWx1ZSwgMik7CgogICAgICAgIHZhciBmcm9tID0gX2dldFZhbHVlMlswXTsKICAgICAgICB2YXIgdG8gPSBfZ2V0VmFsdWUyWzFdOwoKICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS52YWx1ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciB2YWwgPSBkYXRhLnZhbHVlc1tpXTsKICAgICAgICAgIGlmICh2YWwgPj0gZnJvbSAmJiB2YWwgPD0gdG8pIHsKICAgICAgICAgICAga2V5cy5wdXNoKGRhdGEua2V5c1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGtleXMuc29ydCgpOwogICAgICAgIGN0SGFuZGxlLnNldChrZXlzKTsKICAgICAgfQogICAgfSk7CgogICAgLy8gbGV0ICRlbCA9ICQoZWwpOwogICAgLy8gJGVsLm9uKCJjaGFuZ2UiLCAiaW5wdXRbdHlwZT0iY2hlY2tib3giXSIsIGZ1bmN0aW9uKCkgewogICAgLy8gICBsZXQgY2hlY2tlZCA9ICRlbC5maW5kKCJpbnB1dFt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQiKTsKICAgIC8vICAgaWYgKGNoZWNrZWQubGVuZ3RoID09PSAwKSB7CiAgICAvLyAgICAgY3RIYW5kbGUuY2xlYXIoKTsKICAgIC8vICAgfSBlbHNlIHsKICAgIC8vICAgICBsZXQga2V5cyA9IHt9OwogICAgLy8gICAgIGNoZWNrZWQuZWFjaChmdW5jdGlvbigpIHsKICAgIC8vICAgICAgIGRhdGEubWFwW3RoaXMudmFsdWVdLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7CiAgICAvLyAgICAgICAgIGtleXNba2V5XSA9IHRydWU7CiAgICAvLyAgICAgICB9KTsKICAgIC8vICAgICB9KTsKICAgIC8vICAgICBsZXQga2V5QXJyYXkgPSBPYmplY3Qua2V5cyhrZXlzKTsKICAgIC8vICAgICBrZXlBcnJheS5zb3J0KCk7CiAgICAvLyAgICAgY3RIYW5kbGUuc2V0KGtleUFycmF5KTsKICAgIC8vICAgfQogICAgLy8gfSk7CiAgfQp9KTsKCi8vIENvbnZlcnQgYSBudW1iZXIgdG8gYSBzdHJpbmcgd2l0aCBsZWFkaW5nIHplcm9zCmZ1bmN0aW9uIHBhZFplcm9zKG4sIGRpZ2l0cykgewogIHZhciBzdHIgPSBuLnRvU3RyaW5nKCk7CiAgd2hpbGUgKHN0ci5sZW5ndGggPCBkaWdpdHMpIHsKICAgIHN0ciA9ICIwIiArIHN0cjsKICB9cmV0dXJuIHN0cjsKfQoKLy8gR2l2ZW4gYSBEYXRlIG9iamVjdCwgcmV0dXJuIGEgc3RyaW5nIGluIHl5eXktbW0tZGQgZm9ybWF0LCB1c2luZyB0aGUKLy8gVVRDIGRhdGUuIFRoaXMgbWF5IGJlIGEgZGF5IG9mZiBmcm9tIHRoZSBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmUuCmZ1bmN0aW9uIGZvcm1hdERhdGVVVEMoZGF0ZSkgewogIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkgewogICAgcmV0dXJuIGRhdGUuZ2V0VVRDRnVsbFllYXIoKSArICItIiArIHBhZFplcm9zKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEsIDIpICsgIi0iICsgcGFkWmVyb3MoZGF0ZS5nZXRVVENEYXRlKCksIDIpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7Ii4vaW5wdXQiOjZ9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKZXhwb3J0cy5hZGQgPSBhZGQ7CmV4cG9ydHMucmVtb3ZlID0gcmVtb3ZlOwpleHBvcnRzLnRvZ2dsZSA9IHRvZ2dsZTsKZnVuY3Rpb24gYWRkKGdyb3VwLCBrZXlzKSB7CiAgaWYgKCFrZXlzIHx8IGtleXMubGVuZ3RoID09PSAwKSB7CiAgICAvLyBOb3RoaW5nIHRvIGRvCiAgICByZXR1cm4gdGhpczsKICB9CgogIHZhciBzZWwgPSBncm91cC52YXIoInNlbGVjdGlvbiIpLmdldCgpOwoKICBpZiAoIXNlbCkgewogICAgLy8gTm8ga2V5cyB0byBrZWVwLCBidXQgZ28gdGhyb3VnaCB0aGUgbWFjaGluZXJ5IGJlbG93IGFueXdheSwKICAgIC8vIHRvIHJlbW92ZSBkdXBlcyBpbiBga2V5c2AKICAgIHNlbCA9IFtdOwogIH0KCiAgdmFyIHJlc3VsdCA9IHNlbC5zbGljZSgwKTsKCiAgLy8gUG9wdWxhdGUgYW4gb2JqZWN0IHdpdGggdGhlIGtleXMgdG8gYWRkCiAgdmFyIGtleVNldCA9IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAga2V5U2V0W2tleXNbaV1dID0gdHJ1ZTsKICB9CgogIC8vIFJlbW92ZSBhbnkga2V5cyB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBzZXQKICBmb3IgKHZhciBqID0gMDsgaiA8IHNlbC5sZW5ndGg7IGorKykgewogICAgZGVsZXRlIGtleVNldFtzZWxbal1dOwogIH0KCiAgdmFyIGFueUtleXMgPSBmYWxzZTsKICAvLyBBZGQgdGhlIHJlbWFpbmluZyBrZXlzCiAgZm9yICh2YXIga2V5IGluIGtleVNldCkgewogICAgYW55S2V5cyA9IHRydWU7CiAgICBpZiAoa2V5U2V0Lmhhc093blByb3BlcnR5KGtleSkpIHJlc3VsdC5wdXNoKGtleSk7CiAgfQoKICBpZiAoYW55S2V5cykgewogICAgZ3JvdXAudmFyKCJzZWxlY3Rpb24iKS5zZXQocmVzdWx0KTsKICB9CgogIHJldHVybiB0aGlzOwp9CgpmdW5jdGlvbiByZW1vdmUoZ3JvdXAsIGtleXMpIHsKICBpZiAoIWtleXMgfHwga2V5cy5sZW5ndGggPT09IDApIHsKICAgIC8vIE5vdGhpbmcgdG8gZG8KICAgIHJldHVybiB0aGlzOwogIH0KCiAgdmFyIHNlbCA9IGdyb3VwLnZhcigic2VsZWN0aW9uIikuZ2V0KCk7CgogIHZhciBrZXlTZXQgPSB7fTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgIGtleVNldFtrZXlzW2ldXSA9IHRydWU7CiAgfQoKICB2YXIgYW55S2V5cyA9IGZhbHNlOwogIHZhciByZXN1bHQgPSBbXTsKICBmb3IgKHZhciBqID0gMDsgaiA8IHNlbC5sZW5ndGg7IGorKykgewogICAgaWYgKCFrZXlTZXQuaGFzT3duUHJvcGVydHkoc2VsW2pdKSkgewogICAgICByZXN1bHQucHVzaChzZWxbal0pOwogICAgfSBlbHNlIHsKICAgICAgYW55S2V5cyA9IHRydWU7CiAgICB9CiAgfQoKICAvLyBPbmx5IHNldCB0aGUgc2VsZWN0aW9uIGlmIHZhbHVlcyBhY3R1YWxseSBjaGFuZ2VkCiAgaWYgKGFueUtleXMpIHsKICAgIGdyb3VwLnZhcigic2VsZWN0aW9uIikuc2V0KHJlc3VsdCk7CiAgfQoKICByZXR1cm4gdGhpczsKfQoKZnVuY3Rpb24gdG9nZ2xlKGdyb3VwLCBrZXlzKSB7CiAgaWYgKCFrZXlzIHx8IGtleXMubGVuZ3RoID09PSAwKSB7CiAgICAvLyBOb3RoaW5nIHRvIGRvCiAgICByZXR1cm4gdGhpczsKICB9CgogIHZhciBzZWwgPSBncm91cC52YXIoInNlbGVjdGlvbiIpLmdldCgpOwoKICB2YXIga2V5U2V0ID0ge307CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICBrZXlTZXRba2V5c1tpXV0gPSB0cnVlOwogIH0KCiAgdmFyIHJlc3VsdCA9IFtdOwogIGZvciAodmFyIGogPSAwOyBqIDwgc2VsLmxlbmd0aDsgaisrKSB7CiAgICBpZiAoIWtleVNldC5oYXNPd25Qcm9wZXJ0eShzZWxbal0pKSB7CiAgICAgIHJlc3VsdC5wdXNoKHNlbFtqXSk7CiAgICB9IGVsc2UgewogICAgICBrZXlTZXRbc2VsW2pdXSA9IGZhbHNlOwogICAgfQogIH0KCiAgZm9yICh2YXIga2V5IGluIGtleVNldCkgewogICAgaWYgKGtleVNldFtrZXldKSB7CiAgICAgIHJlc3VsdC5wdXNoKGtleSk7CiAgICB9CiAgfQoKICBncm91cC52YXIoInNlbGVjdGlvbiIpLnNldChyZXN1bHQpOwogIHJldHVybiB0aGlzOwp9CgoKfSx7fV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgdmFsdWU6IHRydWUKfSk7Cgp2YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7IH07CgpleHBvcnRzLmNoZWNrU29ydGVkID0gY2hlY2tTb3J0ZWQ7CmV4cG9ydHMuZGlmZlNvcnRlZExpc3RzID0gZGlmZlNvcnRlZExpc3RzOwpleHBvcnRzLmRhdGFmcmFtZVRvRDMgPSBkYXRhZnJhbWVUb0QzOwpmdW5jdGlvbiBjaGVja1NvcnRlZChsaXN0KSB7CiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICBpZiAobGlzdFtpXSA8PSBsaXN0W2kgLSAxXSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkxpc3QgaXMgbm90IHNvcnRlZCBvciBjb250YWlucyBkdXBsaWNhdGUiKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGRpZmZTb3J0ZWRMaXN0cyhhLCBiKSB7CiAgdmFyIGlfYSA9IDA7CiAgdmFyIGlfYiA9IDA7CgogIGEgPSBhIHx8IFtdOwogIGIgPSBiIHx8IFtdOwoKICB2YXIgYV9vbmx5ID0gW107CiAgdmFyIGJfb25seSA9IFtdOwoKICBjaGVja1NvcnRlZChhKTsKICBjaGVja1NvcnRlZChiKTsKCiAgd2hpbGUgKGlfYSA8IGEubGVuZ3RoICYmIGlfYiA8IGIubGVuZ3RoKSB7CiAgICBpZiAoYVtpX2FdID09PSBiW2lfYl0pIHsKICAgICAgaV9hKys7CiAgICAgIGlfYisrOwogICAgfSBlbHNlIGlmIChhW2lfYV0gPCBiW2lfYl0pIHsKICAgICAgYV9vbmx5LnB1c2goYVtpX2ErK10pOwogICAgfSBlbHNlIHsKICAgICAgYl9vbmx5LnB1c2goYltpX2IrK10pOwogICAgfQogIH0KCiAgaWYgKGlfYSA8IGEubGVuZ3RoKSBhX29ubHkgPSBhX29ubHkuY29uY2F0KGEuc2xpY2UoaV9hKSk7CiAgaWYgKGlfYiA8IGIubGVuZ3RoKSBiX29ubHkgPSBiX29ubHkuY29uY2F0KGIuc2xpY2UoaV9iKSk7CiAgcmV0dXJuIHsKICAgIHJlbW92ZWQ6IGFfb25seSwKICAgIGFkZGVkOiBiX29ubHkKICB9Owp9CgovLyBDb252ZXJ0IGZyb20gd2lkZTogeyBjb2xBOiBbMSwyLDNdLCBjb2xCOiBbNCw1LDZdLCAuLi4gfQovLyB0byBsb25nOiBbIHtjb2xBOiAxLCBjb2xCOiA0fSwge2NvbEE6IDIsIGNvbEI6IDV9LCAuLi4gXQpmdW5jdGlvbiBkYXRhZnJhbWVUb0QzKGRmKSB7CiAgdmFyIG5hbWVzID0gW107CiAgdmFyIGxlbmd0aCA9IHZvaWQgMDsKICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpIG5hbWVzLnB1c2gobmFtZSk7CiAgICBpZiAoX3R5cGVvZihkZltuYW1lXSkgIT09ICJvYmplY3QiIHx8IHR5cGVvZiBkZltuYW1lXS5sZW5ndGggPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyIpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgbGVuZ3RoICE9PSAidW5kZWZpbmVkIiAmJiBsZW5ndGggIT09IGRmW25hbWVdLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIik7CiAgICB9CiAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgfQogIHZhciByZXN1bHRzID0gW107CiAgdmFyIGl0ZW0gPSB2b2lkIDA7CiAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgewogICAgaXRlbSA9IHt9OwogICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgbmFtZXMubGVuZ3RoOyBjb2wrKykgewogICAgICBpdGVtW25hbWVzW2NvbF1dID0gZGZbbmFtZXNbY29sXV1bcm93XTsKICAgIH0KICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICB9CiAgcmV0dXJuIHJlc3VsdHM7Cn0KCgp9LHt9XSwxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoZ2xvYmFsKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwoKdmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOyB9OwoKdmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7Cgp2YXIgX2V2ZW50cyA9IHJlcXVpcmUoIi4vZXZlbnRzIik7Cgp2YXIgX2V2ZW50czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ldmVudHMpOwoKZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0KCmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQoKdmFyIFZhciA9IGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBWYXIoZ3JvdXAsIG5hbWUsIC8qb3B0aW9uYWwqL3ZhbHVlKSB7CiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmFyKTsKCiAgICB0aGlzLl9ncm91cCA9IGdyb3VwOwogICAgdGhpcy5fbmFtZSA9IG5hbWU7CiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOwogICAgdGhpcy5fZXZlbnRzID0gbmV3IF9ldmVudHMyLmRlZmF1bHQoKTsKICB9CgogIF9jcmVhdGVDbGFzcyhWYXIsIFt7CiAgICBrZXk6ICJnZXQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlOwogICAgfQogIH0sIHsKICAgIGtleTogInNldCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KHZhbHVlLCAvKm9wdGlvbmFsKi9ldmVudCkgewogICAgICBpZiAodGhpcy5fdmFsdWUgPT09IHZhbHVlKSB7CiAgICAgICAgLy8gRG8gbm90aGluZzsgdGhlIHZhbHVlIGhhc24ndCBjaGFuZ2VkCiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlOwogICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOwogICAgICAvLyBBbGVydCBKYXZhU2NyaXB0IGxpc3RlbmVycyB0aGF0IHRoZSB2YWx1ZSBoYXMgY2hhbmdlZAogICAgICB2YXIgZXZ0ID0ge307CiAgICAgIGlmIChldmVudCAmJiAodHlwZW9mIGV2ZW50ID09PSAidW5kZWZpbmVkIiA/ICJ1bmRlZmluZWQiIDogX3R5cGVvZihldmVudCkpID09PSAib2JqZWN0IikgewogICAgICAgIGZvciAodmFyIGsgaW4gZXZlbnQpIHsKICAgICAgICAgIGlmIChldmVudC5oYXNPd25Qcm9wZXJ0eShrKSkgZXZ0W2tdID0gZXZlbnRba107CiAgICAgICAgfQogICAgICB9CiAgICAgIGV2dC5vbGRWYWx1ZSA9IG9sZFZhbHVlOwogICAgICBldnQudmFsdWUgPSB2YWx1ZTsKICAgICAgdGhpcy5fZXZlbnRzLnRyaWdnZXIoImNoYW5nZSIsIGV2dCwgdGhpcyk7CgogICAgICAvLyBUT0RPOiBNYWtlIHRoaXMgZXh0ZW5zaWJsZSwgdG8gbGV0IGFyYml0cmFyeSBiYWNrLWVuZHMga25vdyB0aGF0CiAgICAgIC8vIHNvbWV0aGluZyBoYXMgY2hhbmdlZAogICAgICBpZiAoZ2xvYmFsLlNoaW55ICYmIGdsb2JhbC5TaGlueS5vbklucHV0Q2hhbmdlKSB7CiAgICAgICAgZ2xvYmFsLlNoaW55Lm9uSW5wdXRDaGFuZ2UoIi5jbGllbnRWYWx1ZS0iICsgKHRoaXMuX2dyb3VwLm5hbWUgIT09IG51bGwgPyB0aGlzLl9ncm91cC5uYW1lICsgIi0iIDogIiIpICsgdGhpcy5fbmFtZSwgdmFsdWUpOwogICAgICB9CiAgICB9CiAgfSwgewogICAga2V5OiAib24iLAogICAgdmFsdWU6IGZ1bmN0aW9uIG9uKGV2ZW50VHlwZSwgbGlzdGVuZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50cy5vbihldmVudFR5cGUsIGxpc3RlbmVyKTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJyZW1vdmVDaGFuZ2VMaXN0ZW5lcmZ1bmN0aW9uIiwKICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVDaGFuZ2VMaXN0ZW5lcmZ1bmN0aW9uKGV2ZW50VHlwZSwgbGlzdGVuZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50cy5vZmYoZXZlbnRUeXBlLCBsaXN0ZW5lcik7CiAgICB9CiAgfV0pOwoKICByZXR1cm4gVmFyOwp9KCk7CgpleHBvcnRzLmRlZmF1bHQgPSBWYXI7CgoKfSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDoge30pCn0seyIuL2V2ZW50cyI6MX1dfSx7fSxbNV0pOwo="></script>
<script src="data:application/javascript; charset=utf-8;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKG4ub3duZXJEb2N1bWVudHx8bi5kb2N1bWVudHx8bikuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIHQobil7cmV0dXJuIG4mJihuLm93bmVyRG9jdW1lbnQmJm4ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8bi5kb2N1bWVudCYmbnx8bi5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gZShuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOk5hTn1mdW5jdGlvbiByKG4pe3JldHVybiBudWxsPT09bj9OYU46K259ZnVuY3Rpb24gaShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gdShuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscixpKXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJihpPXQubGVuZ3RoKTtpPnI7KXt2YXIgdT1yK2k+Pj4xO24odFt1XSxlKTwwP3I9dSsxOmk9dX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsaSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYoaT10Lmxlbmd0aCk7aT5yOyl7dmFyIHU9citpPj4+MTtuKHRbdV0sZSk+MD9pPXU6cj11KzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiBvKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBhKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBsKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGMoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBmKG4pe3JldHVybihuKz0iIik9PT1ib3x8blswXT09PV9vP19vK246bn1mdW5jdGlvbiBzKG4pe3JldHVybihuKz0iIilbMF09PT1fbz9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gaChuKXtyZXR1cm4gZihuKWluIHRoaXMuX31mdW5jdGlvbiBwKG4pe3JldHVybihuPWYobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIGcoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChzKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiB2KCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBkKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB5KCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24gbShuKXtyZXR1cm4gbn1mdW5jdGlvbiBNKG4sdCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHQsYXJndW1lbnRzKTtyZXR1cm4gcj09PXQ/bjpyfX1mdW5jdGlvbiB4KG4sdCl7aWYodCBpbiBuKXJldHVybiB0O3Q9dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2Zvcih2YXIgZT0wLHI9d28ubGVuZ3RoO3I+ZTsrK2Upe3ZhciBpPXdvW2VdK3Q7aWYoaSBpbiBuKXJldHVybiBpfX1mdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIF8oKXt9ZnVuY3Rpb24gdyhuKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciB0LHI9ZSxpPS0xLHU9ci5sZW5ndGg7KytpPHU7KSh0PXJbaV0ub24pJiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbn12YXIgZT1bXSxyPW5ldyBjO3JldHVybiB0Lm9uPWZ1bmN0aW9uKHQsaSl7dmFyIHUsbz1yLmdldCh0KTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP28mJm8ub246KG8mJihvLm9uPW51bGwsZT1lLnNsaWNlKDAsdT1lLmluZGV4T2YobykpLmNvbmNhdChlLnNsaWNlKHUrMSkpLHIucmVtb3ZlKHQpKSxpJiZlLnB1c2goci5zZXQodCx7b246aX0pKSxuKX0sdH1mdW5jdGlvbiBTKCl7YW8uZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBrKCl7Zm9yKHZhciBuLHQ9YW8uZXZlbnQ7bj10LnNvdXJjZUV2ZW50Oyl0PW47cmV0dXJuIHR9ZnVuY3Rpb24gTihuKXtmb3IodmFyIHQ9bmV3IF8sZT0wLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPXcodCk7cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dHJ5e3ZhciB1PWkuc291cmNlRXZlbnQ9YW8uZXZlbnQ7aS50YXJnZXQ9bixhby5ldmVudD1pLHRbaS50eXBlXS5hcHBseShlLHIpfWZpbmFsbHl7YW8uZXZlbnQ9dX19fSx0fWZ1bmN0aW9uIEUobil7cmV0dXJuIGtvKG4sQ28pLG59ZnVuY3Rpb24gQShuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIE5vKG4sdGhpcyl9fWZ1bmN0aW9uIEMobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiBFbyhuLHRoaXMpfX1mdW5jdGlvbiB6KG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlKG4sdCl9ZnVuY3Rpb24gdSgpe3RoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLHQpfWZ1bmN0aW9uIG8oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pOnRoaXMuc2V0QXR0cmlidXRlKG4sZSl9ZnVuY3Rpb24gYSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLGUpfXJldHVybiBuPWFvLm5zLnF1YWxpZnkobiksbnVsbD09dD9uLmxvY2FsP3I6ZToiZnVuY3Rpb24iPT10eXBlb2YgdD9uLmxvY2FsP2E6bzpuLmxvY2FsP3U6aX1mdW5jdGlvbiBMKG4pe3JldHVybiBuLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIHEobil7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK2FvLnJlcXVvdGUobikrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gVChuKXtyZXR1cm4obisiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFIobix0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlPS0xOysrZTxpOyluW2VdKHRoaXMsdCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgZT0tMSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrZTxpOyluW2VdKHRoaXMscil9bj1UKG4pLm1hcChEKTt2YXIgaT1uLmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9yOmV9ZnVuY3Rpb24gRChuKXt2YXIgdD1xKG4pO3JldHVybiBmdW5jdGlvbihlLHIpe2lmKGk9ZS5jbGFzc0xpc3QpcmV0dXJuIHI/aS5hZGQobik6aS5yZW1vdmUobik7dmFyIGk9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO3I/KHQubGFzdEluZGV4PTAsdC50ZXN0KGkpfHxlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLEwoaSsiICIrbikpKTplLnNldEF0dHJpYnV0ZSgiY2xhc3MiLEwoaS5yZXBsYWNlKHQsIiAiKSkpfX1mdW5jdGlvbiBQKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiBpKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHQsZSl9ZnVuY3Rpb24gdSgpe3ZhciByPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4scixlKX1yZXR1cm4gbnVsbD09dD9yOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3U6aX1mdW5jdGlvbiBVKG4sdCl7ZnVuY3Rpb24gZSgpe2RlbGV0ZSB0aGlzW25dfWZ1bmN0aW9uIHIoKXt0aGlzW25dPXR9ZnVuY3Rpb24gaSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbbl06dGhpc1tuXT1lfXJldHVybiBudWxsPT10P2U6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/aTpyfWZ1bmN0aW9uIGoobil7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09em8mJnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PXpvP3QuY3JlYXRlRWxlbWVudChuKTp0LmNyZWF0ZUVsZW1lbnROUyhlLG4pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49YW8ubnMucXVhbGlmeShuKSkubG9jYWw/ZTp0fWZ1bmN0aW9uIEYoKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7biYmbi5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBIKG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBPKG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBBbyh0aGlzLG4pfX1mdW5jdGlvbiBJKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwobj1lKSxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZlP24odC5fX2RhdGFfXyxlLl9fZGF0YV9fKTohdC0hZX19ZnVuY3Rpb24gWShuLHQpe2Zvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIGksdT1uW2VdLG89MCxhPXUubGVuZ3RoO2E+bztvKyspKGk9dVtvXSkmJnQoaSxvLGUpO3JldHVybiBufWZ1bmN0aW9uIFoobil7cmV0dXJuIGtvKG4scW8pLG59ZnVuY3Rpb24gVihuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLGksdSl7dmFyIG8sYT1uW3VdLnVwZGF0ZSxsPWEubGVuZ3RoO2Zvcih1IT1lJiYoZT11LHQ9MCksaT49dCYmKHQ9aSsxKTshKG89YVt0XSkmJisrdDxsOyk7cmV0dXJuIG99fWZ1bmN0aW9uIFgobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW29dO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbb10pfWZ1bmN0aW9uIGkoKXt2YXIgaT1sKHQsY28oYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbb109aSxpLiQ9ZSksaS5fPXR9ZnVuY3Rpb24gdSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIithby5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgaT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLGksaS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIG89Il9fb24iK24sYT1uLmluZGV4T2YoIi4iKSxsPSQ7YT4wJiYobj1uLnNsaWNlKDAsYSkpO3ZhciBjPVRvLmdldChuKTtyZXR1cm4gYyYmKG49YyxsPUIpLGE/dD9pOnI6dD9iOnV9ZnVuY3Rpb24gJChuLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1hby5ldmVudDthby5ldmVudD1lLHRbMF09dGhpcy5fX2RhdGFfXzt0cnl7bi5hcHBseSh0aGlzLHQpfWZpbmFsbHl7YW8uZXZlbnQ9cn19fWZ1bmN0aW9uIEIobix0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMscj1uLnJlbGF0ZWRUYXJnZXQ7ciYmKHI9PT10fHw4JnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkpfHxlLmNhbGwodCxuKX19ZnVuY3Rpb24gVyhlKXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK0RvLGk9ImNsaWNrIityLHU9YW8uc2VsZWN0KHQoZSkpLm9uKCJ0b3VjaG1vdmUiK3IsUykub24oImRyYWdzdGFydCIrcixTKS5vbigic2VsZWN0c3RhcnQiK3IsUyk7aWYobnVsbD09Um8mJihSbz0ib25zZWxlY3RzdGFydCJpbiBlPyExOngoZS5zdHlsZSwidXNlclNlbGVjdCIpKSxSbyl7dmFyIG89bihlKS5zdHlsZSxhPW9bUm9dO29bUm9dPSJub25lIn1yZXR1cm4gZnVuY3Rpb24obil7aWYodS5vbihyLG51bGwpLFJvJiYob1tSb109YSksbil7dmFyIHQ9ZnVuY3Rpb24oKXt1Lm9uKGksbnVsbCl9O3Uub24oaSxmdW5jdGlvbigpe1MoKSx0KCl9LCEwKSxzZXRUaW1lb3V0KHQsMCl9fX1mdW5jdGlvbiBKKG4sZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIGk9ci5jcmVhdGVTVkdQb2ludCgpO2lmKDA+UG8pe3ZhciB1PXQobik7aWYodS5zY3JvbGxYfHx1LnNjcm9sbFkpe3I9YW8uc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgbz1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO1BvPSEoby5mfHxvLmUpLHIucmVtb3ZlKCl9fXJldHVybiBQbz8oaS54PWUucGFnZVgsaS55PWUucGFnZVkpOihpLng9ZS5jbGllbnRYLGkueT1lLmNsaWVudFkpLGk9aS5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFtpLngsaS55XX12YXIgYT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtYS5sZWZ0LW4uY2xpZW50TGVmdCxlLmNsaWVudFktYS50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIEcoKXtyZXR1cm4gYW8uZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiBLKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBRKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBubihuKXtyZXR1cm4gbj4xPzA6LTE+bj9GbzpNYXRoLmFjb3Mobil9ZnVuY3Rpb24gdG4obil7cmV0dXJuIG4+MT9JbzotMT5uPy1JbzpNYXRoLmFzaW4obil9ZnVuY3Rpb24gZW4obil7cmV0dXJuKChuPU1hdGguZXhwKG4pKS0xL24pLzJ9ZnVuY3Rpb24gcm4obil7cmV0dXJuKChuPU1hdGguZXhwKG4pKSsxL24pLzJ9ZnVuY3Rpb24gdW4obil7cmV0dXJuKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpfWZ1bmN0aW9uIG9uKG4pe3JldHVybihuPU1hdGguc2luKG4vMikpKm59ZnVuY3Rpb24gYW4oKXt9ZnVuY3Rpb24gbG4obix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbG4/KHRoaXMuaD0rbix0aGlzLnM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGxuP25ldyBsbihuLmgsbi5zLG4ubCk6X24oIiIrbix3bixsbik6bmV3IGxuKG4sdCxlKX1mdW5jdGlvbiBjbihuLHQsZSl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gbj4zNjA/bi09MzYwOjA+biYmKG4rPTM2MCksNjA+bj91KyhvLXUpKm4vNjA6MTgwPm4/bzoyNDA+bj91KyhvLXUpKigyNDAtbikvNjA6dX1mdW5jdGlvbiBpKG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSpyKG4pKX12YXIgdSxvO3JldHVybiBuPWlzTmFOKG4pPzA6KG4lPTM2MCk8MD9uKzM2MDpuLHQ9aXNOYU4odCk/MDowPnQ/MDp0PjE/MTp0LGU9MD5lPzA6ZT4xPzE6ZSxvPS41Pj1lP2UqKDErdCk6ZSt0LWUqdCx1PTIqZS1vLG5ldyBtbihpKG4rMTIwKSxpKG4pLGkobi0xMjApKX1mdW5jdGlvbiBmbihuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBmbj8odGhpcy5oPStuLHRoaXMuYz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgZm4/bmV3IGZuKG4uaCxuLmMsbi5sKTpuIGluc3RhbmNlb2YgaG4/Z24obi5sLG4uYSxuLmIpOmduKChuPVNuKChuPWFvLnJnYihuKSkucixuLmcsbi5iKSkubCxuLmEsbi5iKTpuZXcgZm4obix0LGUpfWZ1bmN0aW9uIHNuKG4sdCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxuZXcgaG4oZSxNYXRoLmNvcyhuKj1ZbykqdCxNYXRoLnNpbihuKSp0KX1mdW5jdGlvbiBobihuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBobj8odGhpcy5sPStuLHRoaXMuYT0rdCx2b2lkKHRoaXMuYj0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgaG4/bmV3IGhuKG4ubCxuLmEsbi5iKTpuIGluc3RhbmNlb2YgZm4/c24obi5oLG4uYyxuLmwpOlNuKChuPW1uKG4pKS5yLG4uZyxuLmIpOm5ldyBobihuLHQsZSl9ZnVuY3Rpb24gcG4obix0LGUpe3ZhciByPShuKzE2KS8xMTYsaT1yK3QvNTAwLHU9ci1lLzIwMDtyZXR1cm4gaT12bihpKSpuYSxyPXZuKHIpKnRhLHU9dm4odSkqZWEsbmV3IG1uKHluKDMuMjQwNDU0MippLTEuNTM3MTM4NSpyLS40OTg1MzE0KnUpLHluKC0uOTY5MjY2KmkrMS44NzYwMTA4KnIrLjA0MTU1Nip1KSx5biguMDU1NjQzNCppLS4yMDQwMjU5KnIrMS4wNTcyMjUyKnUpKX1mdW5jdGlvbiBnbihuLHQsZSl7cmV0dXJuIG4+MD9uZXcgZm4oTWF0aC5hdGFuMihlLHQpKlpvLE1hdGguc3FydCh0KnQrZSplKSxuKTpuZXcgZm4oTmFOLE5hTixuKX1mdW5jdGlvbiB2bihuKXtyZXR1cm4gbj4uMjA2ODkzMDM0P24qbipuOihuLTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIGRuKG4pe3JldHVybiBuPi4wMDg4NTY/TWF0aC5wb3cobiwxLzMpOjcuNzg3MDM3Km4rNC8yOX1mdW5jdGlvbiB5bihuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKC4wMDMwND49bj8xMi45MipuOjEuMDU1Kk1hdGgucG93KG4sMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiBtbihuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBtbj8odGhpcy5yPX5+bix0aGlzLmc9fn50LHZvaWQodGhpcy5iPX5+ZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbW4/bmV3IG1uKG4ucixuLmcsbi5iKTpfbigiIituLG1uLGNuKTpuZXcgbW4obix0LGUpfWZ1bmN0aW9uIE1uKG4pe3JldHVybiBuZXcgbW4obj4+MTYsbj4+OCYyNTUsMjU1Jm4pfWZ1bmN0aW9uIHhuKG4pe3JldHVybiBNbihuKSsiIn1mdW5jdGlvbiBibihuKXtyZXR1cm4gMTY+bj8iMCIrTWF0aC5tYXgoMCxuKS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LG4pLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBfbihuLHQsZSl7dmFyIHIsaSx1LG89MCxhPTAsbD0wO2lmKHI9LyhbYS16XSspXCgoLiopXCkvLmV4ZWMobj1uLnRvTG93ZXJDYXNlKCkpKXN3aXRjaChpPXJbMl0uc3BsaXQoIiwiKSxyWzFdKXtjYXNlImhzbCI6cmV0dXJuIGUocGFyc2VGbG9hdChpWzBdKSxwYXJzZUZsb2F0KGlbMV0pLzEwMCxwYXJzZUZsb2F0KGlbMl0pLzEwMCk7Y2FzZSJyZ2IiOnJldHVybiB0KE5uKGlbMF0pLE5uKGlbMV0pLE5uKGlbMl0pKX1yZXR1cm4odT11YS5nZXQobikpP3QodS5yLHUuZyx1LmIpOihudWxsPT1ufHwiIyIhPT1uLmNoYXJBdCgwKXx8aXNOYU4odT1wYXJzZUludChuLnNsaWNlKDEpLDE2KSl8fCg0PT09bi5sZW5ndGg/KG89KDM4NDAmdSk+PjQsbz1vPj40fG8sYT0yNDAmdSxhPWE+PjR8YSxsPTE1JnUsbD1sPDw0fGwpOjc9PT1uLmxlbmd0aCYmKG89KDE2NzExNjgwJnUpPj4xNixhPSg2NTI4MCZ1KT4+OCxsPTI1NSZ1KSksdChvLGEsbCkpfWZ1bmN0aW9uIHduKG4sdCxlKXt2YXIgcixpLHU9TWF0aC5taW4obi89MjU1LHQvPTI1NSxlLz0yNTUpLG89TWF0aC5tYXgobix0LGUpLGE9by11LGw9KG8rdSkvMjtyZXR1cm4gYT8oaT0uNT5sP2EvKG8rdSk6YS8oMi1vLXUpLHI9bj09bz8odC1lKS9hKyhlPnQ/NjowKTp0PT1vPyhlLW4pL2ErMjoobi10KS9hKzQscio9NjApOihyPU5hTixpPWw+MCYmMT5sPzA6ciksbmV3IGxuKHIsaSxsKX1mdW5jdGlvbiBTbihuLHQsZSl7bj1rbihuKSx0PWtuKHQpLGU9a24oZSk7dmFyIHI9ZG4oKC40MTI0NTY0Km4rLjM1NzU3NjEqdCsuMTgwNDM3NSplKS9uYSksaT1kbigoLjIxMjY3MjkqbisuNzE1MTUyMip0Ky4wNzIxNzUqZSkvdGEpLHU9ZG4oKC4wMTkzMzM5Km4rLjExOTE5Mip0Ky45NTAzMDQxKmUpL2VhKTtyZXR1cm4gaG4oMTE2KmktMTYsNTAwKihyLWkpLDIwMCooaS11KSl9ZnVuY3Rpb24ga24obil7cmV0dXJuKG4vPTI1NSk8PS4wNDA0NT9uLzEyLjkyOk1hdGgucG93KChuKy4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gTm4obil7dmFyIHQ9cGFyc2VGbG9hdChuKTtyZXR1cm4iJSI9PT1uLmNoYXJBdChuLmxlbmd0aC0xKT9NYXRoLnJvdW5kKDIuNTUqdCk6dH1mdW5jdGlvbiBFbihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIG59fWZ1bmN0aW9uIEFuKG4pe3JldHVybiBmdW5jdGlvbih0LGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLENuKHQsZSxuLHIpfX1mdW5jdGlvbiBDbihuLHQsZSxyKXtmdW5jdGlvbiBpKCl7dmFyIG4sdD1sLnN0YXR1cztpZighdCYmTG4obCl8fHQ+PTIwMCYmMzAwPnR8fDMwND09PXQpe3RyeXtuPWUuY2FsbCh1LGwpfWNhdGNoKHIpe3JldHVybiB2b2lkIG8uZXJyb3IuY2FsbCh1LHIpfW8ubG9hZC5jYWxsKHUsbil9ZWxzZSBvLmVycm9yLmNhbGwodSxsKX12YXIgdT17fSxvPWFvLmRpc3BhdGNoKCJiZWZvcmVzZW5kIiwicHJvZ3Jlc3MiLCJsb2FkIiwiZXJyb3IiKSxhPXt9LGw9bmV3IFhNTEh0dHBSZXF1ZXN0LGM9bnVsbDtyZXR1cm4hdGhpcy5YRG9tYWluUmVxdWVzdHx8IndpdGhDcmVkZW50aWFscyJpbiBsfHwhL14oaHR0cChzKT86KT9cL1wvLy50ZXN0KG4pfHwobD1uZXcgWERvbWFpblJlcXVlc3QpLCJvbmxvYWQiaW4gbD9sLm9ubG9hZD1sLm9uZXJyb3I9aTpsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2wucmVhZHlTdGF0ZT4zJiZpKCl9LGwub25wcm9ncmVzcz1mdW5jdGlvbihuKXt2YXIgdD1hby5ldmVudDthby5ldmVudD1uO3RyeXtvLnByb2dyZXNzLmNhbGwodSxsKX1maW5hbGx5e2FvLmV2ZW50PXR9fSx1LmhlYWRlcj1mdW5jdGlvbihuLHQpe3JldHVybiBuPShuKyIiKS50b0xvd2VyQ2FzZSgpLGFyZ3VtZW50cy5sZW5ndGg8Mj9hW25dOihudWxsPT10P2RlbGV0ZSBhW25dOmFbbl09dCsiIix1KX0sdS5taW1lVHlwZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT1uP251bGw6bisiIix1KTp0fSx1LnJlc3BvbnNlVHlwZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLHUpOmN9LHUucmVzcG9uc2U9ZnVuY3Rpb24obil7cmV0dXJuIGU9bix1fSxbImdldCIsInBvc3QiXS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3Vbbl09ZnVuY3Rpb24oKXtyZXR1cm4gdS5zZW5kLmFwcGx5KHUsW25dLmNvbmNhdChjbyhhcmd1bWVudHMpKSl9fSksdS5zZW5kPWZ1bmN0aW9uKGUscixpKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIHImJihpPXIscj1udWxsKSxsLm9wZW4oZSxuLCEwKSxudWxsPT10fHwiYWNjZXB0ImluIGF8fChhLmFjY2VwdD10KyIsKi8qIiksbC5zZXRSZXF1ZXN0SGVhZGVyKWZvcih2YXIgZiBpbiBhKWwuc2V0UmVxdWVzdEhlYWRlcihmLGFbZl0pO3JldHVybiBudWxsIT10JiZsLm92ZXJyaWRlTWltZVR5cGUmJmwub3ZlcnJpZGVNaW1lVHlwZSh0KSxudWxsIT1jJiYobC5yZXNwb25zZVR5cGU9YyksbnVsbCE9aSYmdS5vbigiZXJyb3IiLGkpLm9uKCJsb2FkIixmdW5jdGlvbihuKXtpKG51bGwsbil9KSxvLmJlZm9yZXNlbmQuY2FsbCh1LGwpLGwuc2VuZChudWxsPT1yP251bGw6ciksdX0sdS5hYm9ydD1mdW5jdGlvbigpe3JldHVybiBsLmFib3J0KCksdX0sYW8ucmViaW5kKHUsbywib24iKSxudWxsPT1yP3U6dS5nZXQoem4ocikpfWZ1bmN0aW9uIHpuKG4pe3JldHVybiAxPT09bi5sZW5ndGg/ZnVuY3Rpb24odCxlKXtuKG51bGw9PXQ/ZTpudWxsKX06bn1mdW5jdGlvbiBMbihuKXt2YXIgdD1uLnJlc3BvbnNlVHlwZTtyZXR1cm4gdCYmInRleHQiIT09dD9uLnJlc3BvbnNlOm4ucmVzcG9uc2VUZXh0fWZ1bmN0aW9uIHFuKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoOzI+ciYmKHQ9MCksMz5yJiYoZT1EYXRlLm5vdygpKTt2YXIgaT1lK3QsdT17YzpuLHQ6aSxuOm51bGx9O3JldHVybiBhYT9hYS5uPXU6b2E9dSxhYT11LGxhfHwoY2E9Y2xlYXJUaW1lb3V0KGNhKSxsYT0xLGZhKFRuKSksdX1mdW5jdGlvbiBUbigpe3ZhciBuPVJuKCksdD1EbigpLW47dD4yND8oaXNGaW5pdGUodCkmJihjbGVhclRpbWVvdXQoY2EpLGNhPXNldFRpbWVvdXQoVG4sdCkpLGxhPTApOihsYT0xLGZhKFRuKSl9ZnVuY3Rpb24gUm4oKXtmb3IodmFyIG49RGF0ZS5ub3coKSx0PW9hO3Q7KW4+PXQudCYmdC5jKG4tdC50KSYmKHQuYz1udWxsKSx0PXQubjtyZXR1cm4gbn1mdW5jdGlvbiBEbigpe2Zvcih2YXIgbix0PW9hLGU9MS8wO3Q7KXQuYz8odC50PGUmJihlPXQudCksdD0obj10KS5uKTp0PW4/bi5uPXQubjpvYT10Lm47cmV0dXJuIGFhPW4sZX1mdW5jdGlvbiBQbihuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIFVuKG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMyp4byg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBqbihuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsaT1uLmN1cnJlbmN5LHU9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgaT1uLmxlbmd0aCx1PVtdLG89MCxhPXJbMF0sbD0wO2k+MCYmYT4wJiYobCthKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWwpKSx1LnB1c2gobi5zdWJzdHJpbmcoaS09YSxpK2EpKSwhKChsKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiB1LnJldmVyc2UoKS5qb2luKGUpfTptO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1oYS5leGVjKG4pLHI9ZVsxXXx8IiAiLG89ZVsyXXx8Ij4iLGE9ZVszXXx8Ii0iLGw9ZVs0XXx8IiIsYz1lWzVdLGY9K2VbNl0scz1lWzddLGg9ZVs4XSxwPWVbOV0sZz0xLHY9IiIsZD0iIix5PSExLG09ITA7c3dpdGNoKGgmJihoPStoLnN1YnN0cmluZygxKSksKGN8fCIwIj09PXImJiI9Ij09PW8pJiYoYz1yPSIwIixvPSI9IikscCl7Y2FzZSJuIjpzPSEwLHA9ImciO2JyZWFrO2Nhc2UiJSI6Zz0xMDAsZD0iJSIscD0iZiI7YnJlYWs7Y2FzZSJwIjpnPTEwMCxkPSIlIixwPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWwmJih2PSIwIitwLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6bT0hMTtjYXNlImQiOnk9ITAsaD0wO2JyZWFrO2Nhc2UicyI6Zz0tMSxwPSJyIn0iJCI9PT1sJiYodj1pWzBdLGQ9aVsxXSksInIiIT1wfHxofHwocD0iZyIpLG51bGwhPWgmJigiZyI9PXA/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgpKToiZSIhPXAmJiJmIiE9cHx8KGg9TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxoKSkpKSxwPXBhLmdldChwKXx8Rm47dmFyIE09YyYmcztyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9ZDtpZih5JiZuJTEpcmV0dXJuIiI7dmFyIGk9MD5ufHwwPT09biYmMD4xL24/KG49LW4sIi0iKToiLSI9PT1hPyIiOmE7aWYoMD5nKXt2YXIgbD1hby5mb3JtYXRQcmVmaXgobixoKTtuPWwuc2NhbGUobiksZT1sLnN5bWJvbCtkfWVsc2Ugbio9ZztuPXAobixoKTt2YXIgeCxiLF89bi5sYXN0SW5kZXhPZigiLiIpO2lmKDA+Xyl7dmFyIHc9bT9uLmxhc3RJbmRleE9mKCJlIik6LTE7MD53Pyh4PW4sYj0iIik6KHg9bi5zdWJzdHJpbmcoMCx3KSxiPW4uc3Vic3RyaW5nKHcpKX1lbHNlIHg9bi5zdWJzdHJpbmcoMCxfKSxiPXQrbi5zdWJzdHJpbmcoXysxKTshYyYmcyYmKHg9dSh4LDEvMCkpO3ZhciBTPXYubGVuZ3RoK3gubGVuZ3RoK2IubGVuZ3RoKyhNPzA6aS5sZW5ndGgpLGs9Zj5TP25ldyBBcnJheShTPWYtUysxKS5qb2luKHIpOiIiO3JldHVybiBNJiYoeD11KGsreCxrLmxlbmd0aD9mLWIubGVuZ3RoOjEvMCkpLGkrPXYsbj14K2IsKCI8Ij09PW8/aStuK2s6Ij4iPT09bz9rK2krbjoiXiI9PT1vP2suc3Vic3RyaW5nKDAsUz4+PTEpK2krbitrLnN1YnN0cmluZyhTKTppKyhNP246aytuKSkrZX19fWZ1bmN0aW9uIEZuKG4pe3JldHVybiBuKyIifWZ1bmN0aW9uIEhuKCl7dGhpcy5fPW5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGg+MT9EYXRlLlVUQy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzWzBdKX1mdW5jdGlvbiBPbihuLHQsZSl7ZnVuY3Rpb24gcih0KXt2YXIgZT1uKHQpLHI9dShlLDEpO3JldHVybiByLXQ+dC1lP2U6cn1mdW5jdGlvbiBpKGUpe3JldHVybiB0KGU9bihuZXcgdmEoZS0xKSksMSksZX1mdW5jdGlvbiB1KG4sZSl7cmV0dXJuIHQobj1uZXcgdmEoK24pLGUpLG59ZnVuY3Rpb24gbyhuLHIsdSl7dmFyIG89aShuKSxhPVtdO2lmKHU+MSlmb3IoO3I+bzspZShvKSV1fHxhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7ZWxzZSBmb3IoO3I+bzspYS5wdXNoKG5ldyBEYXRlKCtvKSksdChvLDEpO3JldHVybiBhfWZ1bmN0aW9uIGEobix0LGUpe3RyeXt2YT1Ibjt2YXIgcj1uZXcgSG47cmV0dXJuIHIuXz1uLG8ocix0LGUpfWZpbmFsbHl7dmE9RGF0ZX19bi5mbG9vcj1uLG4ucm91bmQ9cixuLmNlaWw9aSxuLm9mZnNldD11LG4ucmFuZ2U9bzt2YXIgbD1uLnV0Yz1JbihuKTtyZXR1cm4gbC5mbG9vcj1sLGwucm91bmQ9SW4ociksbC5jZWlsPUluKGkpLGwub2Zmc2V0PUluKHUpLGwucmFuZ2U9YSxufWZ1bmN0aW9uIEluKG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3RyeXt2YT1Ibjt2YXIgcj1uZXcgSG47cmV0dXJuIHIuXz10LG4ocixlKS5ffWZpbmFsbHl7dmE9RGF0ZX19fWZ1bmN0aW9uIFluKG4pe2Z1bmN0aW9uIHQobil7ZnVuY3Rpb24gdCh0KXtmb3IodmFyIGUsaSx1LG89W10sYT0tMSxsPTA7KythPHI7KTM3PT09bi5jaGFyQ29kZUF0KGEpJiYoby5wdXNoKG4uc2xpY2UobCxhKSksbnVsbCE9KGk9eWFbZT1uLmNoYXJBdCgrK2EpXSkmJihlPW4uY2hhckF0KCsrYSkpLCh1PUFbZV0pJiYoZT11KHQsbnVsbD09aT8iZSI9PT1lPyIgIjoiMCI6aSkpLG8ucHVzaChlKSxsPWErMSk7cmV0dXJuIG8ucHVzaChuLnNsaWNlKGwsYSkpLG8uam9pbigiIil9dmFyIHI9bi5sZW5ndGg7cmV0dXJuIHQucGFyc2U9ZnVuY3Rpb24odCl7dmFyIHI9e3k6MTkwMCxtOjAsZDoxLEg6MCxNOjAsUzowLEw6MCxaOm51bGx9LGk9ZShyLG4sdCwwKTtpZihpIT10Lmxlbmd0aClyZXR1cm4gbnVsbDsicCJpbiByJiYoci5IPXIuSCUxMisxMipyLnApO3ZhciB1PW51bGwhPXIuWiYmdmEhPT1IbixvPW5ldyh1P0huOnZhKTtyZXR1cm4iaiJpbiByP28uc2V0RnVsbFllYXIoci55LDAsci5qKToiVyJpbiByfHwiVSJpbiByPygidyJpbiByfHwoci53PSJXImluIHI/MTowKSxvLnNldEZ1bGxZZWFyKHIueSwwLDEpLG8uc2V0RnVsbFllYXIoci55LDAsIlciaW4gcj8oci53KzYpJTcrNypyLlctKG8uZ2V0RGF5KCkrNSklNzpyLncrNypyLlUtKG8uZ2V0RGF5KCkrNiklNykpOm8uc2V0RnVsbFllYXIoci55LHIubSxyLmQpLG8uc2V0SG91cnMoci5IKyhyLlovMTAwfDApLHIuTStyLlolMTAwLHIuUyxyLkwpLHU/by5fOm99LHQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sdH1mdW5jdGlvbiBlKG4sdCxlLHIpe2Zvcih2YXIgaSx1LG8sYT0wLGw9dC5sZW5ndGgsYz1lLmxlbmd0aDtsPmE7KXtpZihyPj1jKXJldHVybi0xO2lmKGk9dC5jaGFyQ29kZUF0KGErKyksMzc9PT1pKXtpZihvPXQuY2hhckF0KGErKyksdT1DW28gaW4geWE/dC5jaGFyQXQoYSsrKTpvXSwhdXx8KHI9dShuLGUscikpPDApcmV0dXJuLTF9ZWxzZSBpZihpIT1lLmNoYXJDb2RlQXQocisrKSlyZXR1cm4tMX1yZXR1cm4gcn1mdW5jdGlvbiByKG4sdCxlKXtfLmxhc3RJbmRleD0wO3ZhciByPV8uZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi53PXcuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaShuLHQsZSl7eC5sYXN0SW5kZXg9MDt2YXIgcj14LmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4udz1iLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHUobix0LGUpe04ubGFzdEluZGV4PTA7dmFyIHI9Ti5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLm09RS5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvKG4sdCxlKXtTLmxhc3RJbmRleD0wO3ZhciByPVMuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5tPWsuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYShuLHQscil7cmV0dXJuIGUobixBLmMudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIGwobix0LHIpe3JldHVybiBlKG4sQS54LnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBjKG4sdCxyKXtyZXR1cm4gZShuLEEuWC50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gZihuLHQsZSl7dmFyIHI9TS5nZXQodC5zbGljZShlLGUrPTIpLnRvTG93ZXJDYXNlKCkpO3JldHVybiBudWxsPT1yPy0xOihuLnA9cixlKX12YXIgcz1uLmRhdGVUaW1lLGg9bi5kYXRlLHA9bi50aW1lLGc9bi5wZXJpb2RzLHY9bi5kYXlzLGQ9bi5zaG9ydERheXMseT1uLm1vbnRocyxtPW4uc2hvcnRNb250aHM7dC51dGM9ZnVuY3Rpb24obil7ZnVuY3Rpb24gZShuKXt0cnl7dmE9SG47dmFyIHQ9bmV3IHZhO3JldHVybiB0Ll89bixyKHQpfWZpbmFsbHl7dmE9RGF0ZX19dmFyIHI9dChuKTtyZXR1cm4gZS5wYXJzZT1mdW5jdGlvbihuKXt0cnl7dmE9SG47dmFyIHQ9ci5wYXJzZShuKTtyZXR1cm4gdCYmdC5ffWZpbmFsbHl7dmE9RGF0ZX19LGUudG9TdHJpbmc9ci50b1N0cmluZyxlfSx0Lm11bHRpPXQudXRjLm11bHRpPWN0O3ZhciBNPWFvLm1hcCgpLHg9Vm4odiksYj1Ybih2KSxfPVZuKGQpLHc9WG4oZCksUz1Wbih5KSxrPVhuKHkpLE49Vm4obSksRT1YbihtKTtnLmZvckVhY2goZnVuY3Rpb24obix0KXtNLnNldChuLnRvTG93ZXJDYXNlKCksdCl9KTt2YXIgQT17YTpmdW5jdGlvbihuKXtyZXR1cm4gZFtuLmdldERheSgpXX0sQTpmdW5jdGlvbihuKXtyZXR1cm4gdltuLmdldERheSgpXX0sYjpmdW5jdGlvbihuKXtyZXR1cm4gbVtuLmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uKG4pe3JldHVybiB5W24uZ2V0TW9udGgoKV19LGM6dChzKSxkOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0RGF0ZSgpLHQsMil9LGU6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4obi5nZXREYXRlKCksdCwyKX0sSDpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldEhvdXJzKCksdCwyKX0sSTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldEhvdXJzKCklMTJ8fDEyLHQsMil9LGo6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4oMStnYS5kYXlPZlllYXIobiksdCwzKX0sTDpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldE1pbGxpc2Vjb25kcygpLHQsMyl9LG06ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4obi5nZXRNb250aCgpKzEsdCwyKX0sTTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldE1pbnV0ZXMoKSx0LDIpfSxwOmZ1bmN0aW9uKG4pe3JldHVybiBnWysobi5nZXRIb3VycygpPj0xMildfSxTOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0U2Vjb25kcygpLHQsMil9LFU6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4oZ2Euc3VuZGF5T2ZZZWFyKG4pLHQsMil9LHc6ZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF5KCl9LFc6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4oZ2EubW9uZGF5T2ZZZWFyKG4pLHQsMil9LHg6dChoKSxYOnQocCkseTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldEZ1bGxZZWFyKCklMTAwLHQsMil9LFk6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4obi5nZXRGdWxsWWVhcigpJTFlNCx0LDQpfSxaOmF0LCIlIjpmdW5jdGlvbigpe3JldHVybiIlIn19LEM9e2E6cixBOmksYjp1LEI6byxjOmEsZDp0dCxlOnR0LEg6cnQsSTpydCxqOmV0LEw6b3QsbTpudCxNOml0LHA6ZixTOnV0LFU6Qm4sdzokbixXOlduLHg6bCxYOmMseTpHbixZOkpuLFo6S24sIiUiOmx0fTtyZXR1cm4gdH1mdW5jdGlvbiBabihuLHQsZSl7dmFyIHI9MD5uPyItIjoiIixpPShyPy1uOm4pKyIiLHU9aS5sZW5ndGg7cmV0dXJuIHIrKGU+dT9uZXcgQXJyYXkoZS11KzEpLmpvaW4odCkraTppKX1mdW5jdGlvbiBWbihuKXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrbi5tYXAoYW8ucmVxdW90ZSkuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIFhuKG4pe2Zvcih2YXIgdD1uZXcgYyxlPS0xLHI9bi5sZW5ndGg7KytlPHI7KXQuc2V0KG5bZV0udG9Mb3dlckNhc2UoKSxlKTtyZXR1cm4gdH1mdW5jdGlvbiAkbihuLHQsZSl7bWEubGFzdEluZGV4PTA7dmFyIHI9bWEuZXhlYyh0LnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KG4udz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBCbihuLHQsZSl7bWEubGFzdEluZGV4PTA7dmFyIHI9bWEuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5VPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFduKG4sdCxlKXttYS5sYXN0SW5kZXg9MDt2YXIgcj1tYS5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLlc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSm4obix0LGUpe21hLmxhc3RJbmRleD0wO3ZhciByPW1hLmV4ZWModC5zbGljZShlLGUrNCkpO3JldHVybiByPyhuLnk9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gR24obix0LGUpe21hLmxhc3RJbmRleD0wO3ZhciByPW1hLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLnk9UW4oK3JbMF0pLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEtuKG4sdCxlKXtyZXR1cm4vXlsrLV1cZHs0fSQvLnRlc3QodD10LnNsaWNlKGUsZSs1KSk/KG4uWj0tdCxlKzUpOi0xfWZ1bmN0aW9uIFFuKG4pe3JldHVybiBuKyhuPjY4PzE5MDA6MmUzKX1mdW5jdGlvbiBudChuLHQsZSl7bWEubGFzdEluZGV4PTA7dmFyIHI9bWEuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4ubT1yWzBdLTEsZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdHQobix0LGUpe21hLmxhc3RJbmRleD0wO3ZhciByPW1hLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZXQobix0LGUpe21hLmxhc3RJbmRleD0wO3ZhciByPW1hLmV4ZWModC5zbGljZShlLGUrMykpO3JldHVybiByPyhuLmo9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcnQobix0LGUpe21hLmxhc3RJbmRleD0wO3ZhciByPW1hLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLkg9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaXQobix0LGUpe21hLmxhc3RJbmRleD0wO3ZhciByPW1hLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLk09K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdXQobix0LGUpe21hLmxhc3RJbmRleD0wO3ZhciByPW1hLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLlM9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gb3Qobix0LGUpe21hLmxhc3RJbmRleD0wO3ZhciByPW1hLmV4ZWModC5zbGljZShlLGUrMykpO3JldHVybiByPyhuLkw9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYXQobil7dmFyIHQ9bi5nZXRUaW1lem9uZU9mZnNldCgpLGU9dD4wPyItIjoiKyIscj14byh0KS82MHwwLGk9eG8odCklNjA7cmV0dXJuIGUrWm4ociwiMCIsMikrWm4oaSwiMCIsMil9ZnVuY3Rpb24gbHQobix0LGUpe01hLmxhc3RJbmRleD0wO3ZhciByPU1hLmV4ZWModC5zbGljZShlLGUrMSkpO3JldHVybiByP2UrclswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gY3Qobil7Zm9yKHZhciB0PW4ubGVuZ3RoLGU9LTE7KytlPHQ7KW5bZV1bMF09dGhpcyhuW2VdWzBdKTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj1uW2VdOyFyWzFdKHQpOylyPW5bKytlXTtyZXR1cm4gclswXSh0KX19ZnVuY3Rpb24gZnQoKXt9ZnVuY3Rpb24gc3Qobix0LGUpe3ZhciByPWUucz1uK3QsaT1yLW4sdT1yLWk7ZS50PW4tdSsodC1pKX1mdW5jdGlvbiBodChuLHQpe24mJndhLmhhc093blByb3BlcnR5KG4udHlwZSkmJndhW24udHlwZV0obix0KX1mdW5jdGlvbiBwdChuLHQsZSl7dmFyIHIsaT0tMSx1PW4ubGVuZ3RoLWU7Zm9yKHQubGluZVN0YXJ0KCk7KytpPHU7KXI9bltpXSx0LnBvaW50KHJbMF0sclsxXSxyWzJdKTt0LmxpbmVFbmQoKX1mdW5jdGlvbiBndChuLHQpe3ZhciBlPS0xLHI9bi5sZW5ndGg7Zm9yKHQucG9seWdvblN0YXJ0KCk7KytlPHI7KXB0KG5bZV0sdCwxKTt0LnBvbHlnb25FbmQoKX1mdW5jdGlvbiB2dCgpe2Z1bmN0aW9uIG4obix0KXtuKj1Zbyx0PXQqWW8vMitGby80O3ZhciBlPW4tcixvPWU+PTA/MTotMSxhPW8qZSxsPU1hdGguY29zKHQpLGM9TWF0aC5zaW4odCksZj11KmMscz1pKmwrZipNYXRoLmNvcyhhKSxoPWYqbypNYXRoLnNpbihhKTtrYS5hZGQoTWF0aC5hdGFuMihoLHMpKSxyPW4saT1sLHU9Y312YXIgdCxlLHIsaSx1O05hLnBvaW50PWZ1bmN0aW9uKG8sYSl7TmEucG9pbnQ9bixyPSh0PW8pKllvLGk9TWF0aC5jb3MoYT0oZT1hKSpZby8yK0ZvLzQpLHU9TWF0aC5zaW4oYSl9LE5hLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIGR0KG4pe3ZhciB0PW5bMF0sZT1uWzFdLHI9TWF0aC5jb3MoZSk7cmV0dXJuW3IqTWF0aC5jb3ModCkscipNYXRoLnNpbih0KSxNYXRoLnNpbihlKV19ZnVuY3Rpb24geXQobix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXStuWzJdKnRbMl19ZnVuY3Rpb24gbXQobix0KXtyZXR1cm5bblsxXSp0WzJdLW5bMl0qdFsxXSxuWzJdKnRbMF0tblswXSp0WzJdLG5bMF0qdFsxXS1uWzFdKnRbMF1dfWZ1bmN0aW9uIE10KG4sdCl7blswXSs9dFswXSxuWzFdKz10WzFdLG5bMl0rPXRbMl19ZnVuY3Rpb24geHQobix0KXtyZXR1cm5bblswXSp0LG5bMV0qdCxuWzJdKnRdfWZ1bmN0aW9uIGJ0KG4pe3ZhciB0PU1hdGguc3FydChuWzBdKm5bMF0rblsxXSpuWzFdK25bMl0qblsyXSk7blswXS89dCxuWzFdLz10LG5bMl0vPXR9ZnVuY3Rpb24gX3Qobil7cmV0dXJuW01hdGguYXRhbjIoblsxXSxuWzBdKSx0bihuWzJdKV19ZnVuY3Rpb24gd3Qobix0KXtyZXR1cm4geG8oblswXS10WzBdKTxVbyYmeG8oblsxXS10WzFdKTxVb31mdW5jdGlvbiBTdChuLHQpe24qPVlvO3ZhciBlPU1hdGguY29zKHQqPVlvKTtrdChlKk1hdGguY29zKG4pLGUqTWF0aC5zaW4obiksTWF0aC5zaW4odCkpfWZ1bmN0aW9uIGt0KG4sdCxlKXsrK0VhLENhKz0obi1DYSkvRWEsemErPSh0LXphKS9FYSxMYSs9KGUtTGEpL0VhfWZ1bmN0aW9uIE50KCl7ZnVuY3Rpb24gbihuLGkpe24qPVlvO3ZhciB1PU1hdGguY29zKGkqPVlvKSxvPXUqTWF0aC5jb3MobiksYT11Kk1hdGguc2luKG4pLGw9TWF0aC5zaW4oaSksYz1NYXRoLmF0YW4yKE1hdGguc3FydCgoYz1lKmwtciphKSpjKyhjPXIqby10KmwpKmMrKGM9dCphLWUqbykqYyksdCpvK2UqYStyKmwpO0FhKz1jLHFhKz1jKih0Kyh0PW8pKSxUYSs9YyooZSsoZT1hKSksUmErPWMqKHIrKHI9bCkpLGt0KHQsZSxyKX12YXIgdCxlLHI7amEucG9pbnQ9ZnVuY3Rpb24oaSx1KXtpKj1Zbzt2YXIgbz1NYXRoLmNvcyh1Kj1Zbyk7dD1vKk1hdGguY29zKGkpLGU9bypNYXRoLnNpbihpKSxyPU1hdGguc2luKHUpLGphLnBvaW50PW4sa3QodCxlLHIpfX1mdW5jdGlvbiBFdCgpe2phLnBvaW50PVN0fWZ1bmN0aW9uIEF0KCl7ZnVuY3Rpb24gbihuLHQpe24qPVlvO3ZhciBlPU1hdGguY29zKHQqPVlvKSxvPWUqTWF0aC5jb3MobiksYT1lKk1hdGguc2luKG4pLGw9TWF0aC5zaW4odCksYz1pKmwtdSphLGY9dSpvLXIqbCxzPXIqYS1pKm8saD1NYXRoLnNxcnQoYypjK2YqZitzKnMpLHA9cipvK2kqYSt1KmwsZz1oJiYtbm4ocCkvaCx2PU1hdGguYXRhbjIoaCxwKTtEYSs9ZypjLFBhKz1nKmYsVWErPWcqcyxBYSs9dixxYSs9dioocisocj1vKSksVGErPXYqKGkrKGk9YSkpLFJhKz12Kih1Kyh1PWwpKSxrdChyLGksdSl9dmFyIHQsZSxyLGksdTtqYS5wb2ludD1mdW5jdGlvbihvLGEpe3Q9byxlPWEsamEucG9pbnQ9bixvKj1Zbzt2YXIgbD1NYXRoLmNvcyhhKj1Zbyk7cj1sKk1hdGguY29zKG8pLGk9bCpNYXRoLnNpbihvKSx1PU1hdGguc2luKGEpLGt0KHIsaSx1KX0samEubGluZUVuZD1mdW5jdGlvbigpe24odCxlKSxqYS5saW5lRW5kPUV0LGphLnBvaW50PVN0fX1mdW5jdGlvbiBDdChuLHQpe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZT1uKGUsciksdChlWzBdLGVbMV0pfXJldHVybiBuLmludmVydCYmdC5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihlLHIpe3JldHVybiBlPXQuaW52ZXJ0KGUsciksZSYmbi5pbnZlcnQoZVswXSxlWzFdKX0pLGV9ZnVuY3Rpb24genQoKXtyZXR1cm4hMH1mdW5jdGlvbiBMdChuLHQsZSxyLGkpe3ZhciB1PVtdLG89W107aWYobi5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKCEoKHQ9bi5sZW5ndGgtMSk8PTApKXt2YXIgdCxlPW5bMF0scj1uW3RdO2lmKHd0KGUscikpe2kubGluZVN0YXJ0KCk7Zm9yKHZhciBhPTA7dD5hOysrYSlpLnBvaW50KChlPW5bYV0pWzBdLGVbMV0pO3JldHVybiB2b2lkIGkubGluZUVuZCgpfXZhciBsPW5ldyBUdChlLG4sbnVsbCwhMCksYz1uZXcgVHQoZSxudWxsLGwsITEpO2wubz1jLHUucHVzaChsKSxvLnB1c2goYyksbD1uZXcgVHQocixuLG51bGwsITEpLGM9bmV3IFR0KHIsbnVsbCxsLCEwKSxsLm89Yyx1LnB1c2gobCksby5wdXNoKGMpfX0pLG8uc29ydCh0KSxxdCh1KSxxdChvKSx1Lmxlbmd0aCl7Zm9yKHZhciBhPTAsbD1lLGM9by5sZW5ndGg7Yz5hOysrYSlvW2FdLmU9bD0hbDtmb3IodmFyIGYscyxoPXVbMF07Oyl7Zm9yKHZhciBwPWgsZz0hMDtwLnY7KWlmKChwPXAubik9PT1oKXJldHVybjtmPXAueixpLmxpbmVTdGFydCgpO2Rve2lmKHAudj1wLm8udj0hMCxwLmUpe2lmKGcpZm9yKHZhciBhPTAsYz1mLmxlbmd0aDtjPmE7KythKWkucG9pbnQoKHM9ZlthXSlbMF0sc1sxXSk7ZWxzZSByKHAueCxwLm4ueCwxLGkpO3A9cC5ufWVsc2V7aWYoZyl7Zj1wLnAuejtmb3IodmFyIGE9Zi5sZW5ndGgtMTthPj0wOy0tYSlpLnBvaW50KChzPWZbYV0pWzBdLHNbMV0pfWVsc2UgcihwLngscC5wLngsLTEsaSk7cD1wLnB9cD1wLm8sZj1wLnosZz0hZ313aGlsZSghcC52KTtpLmxpbmVFbmQoKX19fWZ1bmN0aW9uIHF0KG4pe2lmKHQ9bi5sZW5ndGgpe2Zvcih2YXIgdCxlLHI9MCxpPW5bMF07KytyPHQ7KWkubj1lPW5bcl0sZS5wPWksaT1lO2kubj1lPW5bMF0sZS5wPWl9fWZ1bmN0aW9uIFR0KG4sdCxlLHIpe3RoaXMueD1uLHRoaXMuej10LHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gUnQobix0LGUscil7cmV0dXJuIGZ1bmN0aW9uKGksdSl7ZnVuY3Rpb24gbyh0LGUpe3ZhciByPWkodCxlKTtuKHQ9clswXSxlPXJbMV0pJiZ1LnBvaW50KHQsZSl9ZnVuY3Rpb24gYShuLHQpe3ZhciBlPWkobix0KTtkLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gbCgpe20ucG9pbnQ9YSxkLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGMoKXttLnBvaW50PW8sZC5saW5lRW5kKCl9ZnVuY3Rpb24gZihuLHQpe3YucHVzaChbbix0XSk7dmFyIGU9aShuLHQpO3gucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBzKCl7eC5saW5lU3RhcnQoKSx2PVtdfWZ1bmN0aW9uIGgoKXtmKHZbMF1bMF0sdlswXVsxXSkseC5saW5lRW5kKCk7dmFyIG4sdD14LmNsZWFuKCksZT1NLmJ1ZmZlcigpLHI9ZS5sZW5ndGg7aWYodi5wb3AoKSxnLnB1c2godiksdj1udWxsLHIpaWYoMSZ0KXtuPWVbMF07dmFyIGkscj1uLmxlbmd0aC0xLG89LTE7aWYocj4wKXtmb3IoYnx8KHUucG9seWdvblN0YXJ0KCksYj0hMCksdS5saW5lU3RhcnQoKTsrK288cjspdS5wb2ludCgoaT1uW29dKVswXSxpWzFdKTt1LmxpbmVFbmQoKX19ZWxzZSByPjEmJjImdCYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpLHAucHVzaChlLmZpbHRlcihEdCkpfXZhciBwLGcsdixkPXQodSkseT1pLmludmVydChyWzBdLHJbMV0pLG09e3BvaW50Om8sbGluZVN0YXJ0OmwsbGluZUVuZDpjLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe20ucG9pbnQ9ZixtLmxpbmVTdGFydD1zLG0ubGluZUVuZD1oLHA9W10sZz1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe20ucG9pbnQ9byxtLmxpbmVTdGFydD1sLG0ubGluZUVuZD1jLHA9YW8ubWVyZ2UocCk7dmFyIG49T3QoeSxnKTtwLmxlbmd0aD8oYnx8KHUucG9seWdvblN0YXJ0KCksYj0hMCksTHQocCxVdCxuLGUsdSkpOm4mJihifHwodS5wb2x5Z29uU3RhcnQoKSxiPSEwKSx1LmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsdSksdS5saW5lRW5kKCkpLGImJih1LnBvbHlnb25FbmQoKSxiPSExKSxwPWc9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7dS5wb2x5Z29uU3RhcnQoKSx1LmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsdSksdS5saW5lRW5kKCksdS5wb2x5Z29uRW5kKCl9fSxNPVB0KCkseD10KE0pLGI9ITE7cmV0dXJuIG19fWZ1bmN0aW9uIER0KG4pe3JldHVybiBuLmxlbmd0aD4xfWZ1bmN0aW9uIFB0KCl7dmFyIG4sdD1bXTtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5wdXNoKG49W10pfSxwb2ludDpmdW5jdGlvbih0LGUpe24ucHVzaChbdCxlXSl9LGxpbmVFbmQ6YixidWZmZXI6ZnVuY3Rpb24oKXt2YXIgZT10O3JldHVybiB0PVtdLG49bnVsbCxlfSxyZWpvaW46ZnVuY3Rpb24oKXt0Lmxlbmd0aD4xJiZ0LnB1c2godC5wb3AoKS5jb25jYXQodC5zaGlmdCgpKSl9fX1mdW5jdGlvbiBVdChuLHQpe3JldHVybigobj1uLngpWzBdPDA/blsxXS1Jby1VbzpJby1uWzFdKS0oKHQ9dC54KVswXTwwP3RbMV0tSW8tVW86SW8tdFsxXSl9ZnVuY3Rpb24ganQobil7dmFyIHQsZT1OYU4scj1OYU4saT1OYU47cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCksdD0xfSxwb2ludDpmdW5jdGlvbih1LG8pe3ZhciBhPXU+MD9GbzotRm8sbD14byh1LWUpO3hvKGwtRm8pPFVvPyhuLnBvaW50KGUscj0ocitvKS8yPjA/SW86LUlvKSxuLnBvaW50KGksciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksbi5wb2ludCh1LHIpLHQ9MCk6aSE9PWEmJmw+PUZvJiYoeG8oZS1pKTxVbyYmKGUtPWkqVW8pLHhvKHUtYSk8VW8mJih1LT1hKlVvKSxyPUZ0KGUscix1LG8pLG4ucG9pbnQoaSxyKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQoYSxyKSx0PTApLG4ucG9pbnQoZT11LHI9byksaT1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bi5saW5lRW5kKCksZT1yPU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi10fX19ZnVuY3Rpb24gRnQobix0LGUscil7dmFyIGksdSxvPU1hdGguc2luKG4tZSk7cmV0dXJuIHhvKG8pPlVvP01hdGguYXRhbigoTWF0aC5zaW4odCkqKHU9TWF0aC5jb3MocikpKk1hdGguc2luKGUpLU1hdGguc2luKHIpKihpPU1hdGguY29zKHQpKSpNYXRoLnNpbihuKSkvKGkqdSpvKSk6KHQrcikvMn1mdW5jdGlvbiBIdChuLHQsZSxyKXt2YXIgaTtpZihudWxsPT1uKWk9ZSpJbyxyLnBvaW50KC1GbyxpKSxyLnBvaW50KDAsaSksci5wb2ludChGbyxpKSxyLnBvaW50KEZvLDApLHIucG9pbnQoRm8sLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtRm8sLWkpLHIucG9pbnQoLUZvLDApLHIucG9pbnQoLUZvLGkpO2Vsc2UgaWYoeG8oblswXS10WzBdKT5Vbyl7dmFyIHU9blswXTx0WzBdP0ZvOi1GbztpPWUqdS8yLHIucG9pbnQoLXUsaSksci5wb2ludCgwLGkpLHIucG9pbnQodSxpKX1lbHNlIHIucG9pbnQodFswXSx0WzFdKX1mdW5jdGlvbiBPdChuLHQpe3ZhciBlPW5bMF0scj1uWzFdLGk9W01hdGguc2luKGUpLC1NYXRoLmNvcyhlKSwwXSx1PTAsbz0wO2thLnJlc2V0KCk7Zm9yKHZhciBhPTAsbD10Lmxlbmd0aDtsPmE7KythKXt2YXIgYz10W2FdLGY9Yy5sZW5ndGg7aWYoZilmb3IodmFyIHM9Y1swXSxoPXNbMF0scD1zWzFdLzIrRm8vNCxnPU1hdGguc2luKHApLHY9TWF0aC5jb3MocCksZD0xOzspe2Q9PT1mJiYoZD0wKSxuPWNbZF07dmFyIHk9blswXSxtPW5bMV0vMitGby80LE09TWF0aC5zaW4obSkseD1NYXRoLmNvcyhtKSxiPXktaCxfPWI+PTA/MTotMSx3PV8qYixTPXc+Rm8saz1nKk07aWYoa2EuYWRkKE1hdGguYXRhbjIoaypfKk1hdGguc2luKHcpLHYqeCtrKk1hdGguY29zKHcpKSksdSs9Uz9iK18qSG86YixTXmg+PWVeeT49ZSl7dmFyIE49bXQoZHQocyksZHQobikpO2J0KE4pO3ZhciBFPW10KGksTik7YnQoRSk7dmFyIEE9KFNeYj49MD8tMToxKSp0bihFWzJdKTsocj5BfHxyPT09QSYmKE5bMF18fE5bMV0pKSYmKG8rPVNeYj49MD8xOi0xKX1pZighZCsrKWJyZWFrO2g9eSxnPU0sdj14LHM9bn19cmV0dXJuKC1Vbz51fHxVbz51JiYtVW8+a2EpXjEmb31mdW5jdGlvbiBJdChuKXtmdW5jdGlvbiB0KG4sdCl7cmV0dXJuIE1hdGguY29zKG4pKk1hdGguY29zKHQpPnV9ZnVuY3Rpb24gZShuKXt2YXIgZSx1LGwsYyxmO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtjPWw9ITEsZj0xfSxwb2ludDpmdW5jdGlvbihzLGgpe3ZhciBwLGc9W3MsaF0sdj10KHMsaCksZD1vP3Y/MDppKHMsaCk6dj9pKHMrKDA+cz9GbzotRm8pLGgpOjA7aWYoIWUmJihjPWw9dikmJm4ubGluZVN0YXJ0KCksdiE9PWwmJihwPXIoZSxnKSwod3QoZSxwKXx8d3QoZyxwKSkmJihnWzBdKz1VbyxnWzFdKz1Vbyx2PXQoZ1swXSxnWzFdKSkpLHYhPT1sKWY9MCx2PyhuLmxpbmVTdGFydCgpLHA9cihnLGUpLG4ucG9pbnQocFswXSxwWzFdKSk6KHA9cihlLGcpLG4ucG9pbnQocFswXSxwWzFdKSxuLmxpbmVFbmQoKSksZT1wO2Vsc2UgaWYoYSYmZSYmb152KXt2YXIgeTtkJnV8fCEoeT1yKGcsZSwhMCkpfHwoZj0wLG8/KG4ubGluZVN0YXJ0KCksbi5wb2ludCh5WzBdWzBdLHlbMF1bMV0pLG4ucG9pbnQoeVsxXVswXSx5WzFdWzFdKSxuLmxpbmVFbmQoKSk6KG4ucG9pbnQoeVsxXVswXSx5WzFdWzFdKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQoeVswXVswXSx5WzBdWzFdKSkpfSF2fHxlJiZ3dChlLGcpfHxuLnBvaW50KGdbMF0sZ1sxXSksZT1nLGw9dix1PWR9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtsJiZuLmxpbmVFbmQoKSxlPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIGZ8KGMmJmwpPDwxfX19ZnVuY3Rpb24gcihuLHQsZSl7dmFyIHI9ZHQobiksaT1kdCh0KSxvPVsxLDAsMF0sYT1tdChyLGkpLGw9eXQoYSxhKSxjPWFbMF0sZj1sLWMqYztpZighZilyZXR1cm4hZSYmbjt2YXIgcz11KmwvZixoPS11KmMvZixwPW10KG8sYSksZz14dChvLHMpLHY9eHQoYSxoKTtNdChnLHYpO3ZhciBkPXAseT15dChnLGQpLG09eXQoZCxkKSxNPXkqeS1tKih5dChnLGcpLTEpO2lmKCEoMD5NKSl7dmFyIHg9TWF0aC5zcXJ0KE0pLGI9eHQoZCwoLXkteCkvbSk7aWYoTXQoYixnKSxiPV90KGIpLCFlKXJldHVybiBiO3ZhciBfLHc9blswXSxTPXRbMF0saz1uWzFdLE49dFsxXTt3PlMmJihfPXcsdz1TLFM9Xyk7dmFyIEU9Uy13LEE9eG8oRS1Gbyk8VW8sQz1BfHxVbz5FO2lmKCFBJiZrPk4mJihfPWssaz1OLE49XyksQz9BP2srTj4wXmJbMV08KHhvKGJbMF0tdyk8VW8/azpOKTprPD1iWzFdJiZiWzFdPD1OOkU+Rm9eKHc8PWJbMF0mJmJbMF08PVMpKXt2YXIgej14dChkLCgteSt4KS9tKTtyZXR1cm4gTXQoeixnKSxbYixfdCh6KV19fX1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9bz9uOkZvLW4saT0wO3JldHVybi1yPnQ/aXw9MTp0PnImJihpfD0yKSwtcj5lP2l8PTQ6ZT5yJiYoaXw9OCksaX12YXIgdT1NYXRoLmNvcyhuKSxvPXU+MCxhPXhvKHUpPlVvLGw9dmUobiw2KllvKTtyZXR1cm4gUnQodCxlLGwsbz9bMCwtbl06Wy1GbyxuLUZvXSl9ZnVuY3Rpb24gWXQobix0LGUscil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciB1LG89aS5hLGE9aS5iLGw9by54LGM9by55LGY9YS54LHM9YS55LGg9MCxwPTEsZz1mLWwsdj1zLWM7aWYodT1uLWwsZ3x8ISh1PjApKXtpZih1Lz1nLDA+Zyl7aWYoaD51KXJldHVybjtwPnUmJihwPXUpfWVsc2UgaWYoZz4wKXtpZih1PnApcmV0dXJuO3U+aCYmKGg9dSl9aWYodT1lLWwsZ3x8ISgwPnUpKXtpZih1Lz1nLDA+Zyl7aWYodT5wKXJldHVybjt1PmgmJihoPXUpfWVsc2UgaWYoZz4wKXtpZihoPnUpcmV0dXJuO3A+dSYmKHA9dSl9aWYodT10LWMsdnx8ISh1PjApKXtpZih1Lz12LDA+dil7aWYoaD51KXJldHVybjtwPnUmJihwPXUpfWVsc2UgaWYodj4wKXtpZih1PnApcmV0dXJuO3U+aCYmKGg9dSl9aWYodT1yLWMsdnx8ISgwPnUpKXtpZih1Lz12LDA+dil7aWYodT5wKXJldHVybjt1PmgmJihoPXUpfWVsc2UgaWYodj4wKXtpZihoPnUpcmV0dXJuO3A+dSYmKHA9dSl9cmV0dXJuIGg+MCYmKGkuYT17eDpsK2gqZyx5OmMraCp2fSksMT5wJiYoaS5iPXt4OmwrcCpnLHk6YytwKnZ9KSxpfX19fX19ZnVuY3Rpb24gWnQobix0LGUscil7ZnVuY3Rpb24gaShyLGkpe3JldHVybiB4byhyWzBdLW4pPFVvP2k+MD8wOjM6eG8oclswXS1lKTxVbz9pPjA/MjoxOnhvKHJbMV0tdCk8VW8/aT4wPzE6MDppPjA/MzoyfWZ1bmN0aW9uIHUobix0KXtyZXR1cm4gbyhuLngsdC54KX1mdW5jdGlvbiBvKG4sdCl7dmFyIGU9aShuLDEpLHI9aSh0LDEpO3JldHVybiBlIT09cj9lLXI6MD09PWU/dFsxXS1uWzFdOjE9PT1lP25bMF0tdFswXToyPT09ZT9uWzFdLXRbMV06dFswXS1uWzBdfXJldHVybiBmdW5jdGlvbihhKXtmdW5jdGlvbiBsKG4pe2Zvcih2YXIgdD0wLGU9ZC5sZW5ndGgscj1uWzFdLGk9MDtlPmk7KytpKWZvcih2YXIgdSxvPTEsYT1kW2ldLGw9YS5sZW5ndGgsYz1hWzBdO2w+bzsrK28pdT1hW29dLGNbMV08PXI/dVsxXT5yJiZRKGMsdSxuKT4wJiYrK3Q6dVsxXTw9ciYmUShjLHUsbik8MCYmLS10LGM9dTtyZXR1cm4gMCE9PXR9ZnVuY3Rpb24gYyh1LGEsbCxjKXt2YXIgZj0wLHM9MDtpZihudWxsPT11fHwoZj1pKHUsbCkpIT09KHM9aShhLGwpKXx8byh1LGEpPDBebD4wKXtkbyBjLnBvaW50KDA9PT1mfHwzPT09Zj9uOmUsZj4xP3I6dCk7d2hpbGUoKGY9KGYrbCs0KSU0KSE9PXMpfWVsc2UgYy5wb2ludChhWzBdLGFbMV0pfWZ1bmN0aW9uIGYoaSx1KXtyZXR1cm4gaT49biYmZT49aSYmdT49dCYmcj49dX1mdW5jdGlvbiBzKG4sdCl7ZihuLHQpJiZhLnBvaW50KG4sdCl9ZnVuY3Rpb24gaCgpe0MucG9pbnQ9ZyxkJiZkLnB1c2goeT1bXSksUz0hMCx3PSExLGI9Xz1OYU59ZnVuY3Rpb24gcCgpe3YmJihnKG0sTSkseCYmdyYmRS5yZWpvaW4oKSx2LnB1c2goRS5idWZmZXIoKSkpLEMucG9pbnQ9cyx3JiZhLmxpbmVFbmQoKX1mdW5jdGlvbiBnKG4sdCl7bj1NYXRoLm1heCgtSGEsTWF0aC5taW4oSGEsbikpLHQ9TWF0aC5tYXgoLUhhLE1hdGgubWluKEhhLHQpKTt2YXIgZT1mKG4sdCk7aWYoZCYmeS5wdXNoKFtuLHRdKSxTKW09bixNPXQseD1lLFM9ITEsZSYmKGEubGluZVN0YXJ0KCksYS5wb2ludChuLHQpKTtlbHNlIGlmKGUmJncpYS5wb2ludChuLHQpO2Vsc2V7dmFyIHI9e2E6e3g6Yix5Ol99LGI6e3g6bix5OnR9fTtBKHIpPyh3fHwoYS5saW5lU3RhcnQoKSxhLnBvaW50KHIuYS54LHIuYS55KSksYS5wb2ludChyLmIueCxyLmIueSksZXx8YS5saW5lRW5kKCksaz0hMSk6ZSYmKGEubGluZVN0YXJ0KCksYS5wb2ludChuLHQpLGs9ITEpfWI9bixfPXQsdz1lfXZhciB2LGQseSxtLE0seCxiLF8sdyxTLGssTj1hLEU9UHQoKSxBPVl0KG4sdCxlLHIpLEM9e3BvaW50OnMsbGluZVN0YXJ0OmgsbGluZUVuZDpwLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2E9RSx2PVtdLGQ9W10saz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2E9Tix2PWFvLm1lcmdlKHYpO3ZhciB0PWwoW24scl0pLGU9ayYmdCxpPXYubGVuZ3RoOyhlfHxpKSYmKGEucG9seWdvblN0YXJ0KCksZSYmKGEubGluZVN0YXJ0KCksYyhudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksaSYmTHQodix1LHQsYyxhKSxhLnBvbHlnb25FbmQoKSksdj1kPXk9bnVsbH19O3JldHVybiBDfX1mdW5jdGlvbiBWdChuKXt2YXIgdD0wLGU9Rm8vMyxyPWFlKG4pLGk9cih0LGUpO3JldHVybiBpLnBhcmFsbGVscz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKHQ9blswXSpGby8xODAsZT1uWzFdKkZvLzE4MCk6W3QvRm8qMTgwLGUvRm8qMTgwXX0saX1mdW5jdGlvbiBYdChuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1NYXRoLnNxcnQodS0yKmkqTWF0aC5zaW4odCkpL2k7cmV0dXJuW2UqTWF0aC5zaW4obio9aSksby1lKk1hdGguY29zKG4pXX12YXIgcj1NYXRoLnNpbihuKSxpPShyK01hdGguc2luKHQpKS8yLHU9MStyKigyKmktciksbz1NYXRoLnNxcnQodSkvaTtyZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1vLXQ7cmV0dXJuW01hdGguYXRhbjIobixlKS9pLHRuKCh1LShuKm4rZSplKSppKmkpLygyKmkpKV19LGV9ZnVuY3Rpb24gJHQoKXtmdW5jdGlvbiBuKG4sdCl7SWErPWkqbi1yKnQscj1uLGk9dH12YXIgdCxlLHIsaTskYS5wb2ludD1mdW5jdGlvbih1LG8peyRhLnBvaW50PW4sdD1yPXUsZT1pPW99LCRhLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIEJ0KG4sdCl7WWE+biYmKFlhPW4pLG4+VmEmJihWYT1uKSxaYT50JiYoWmE9dCksdD5YYSYmKFhhPXQpfWZ1bmN0aW9uIFd0KCl7ZnVuY3Rpb24gbihuLHQpe28ucHVzaCgiTSIsbiwiLCIsdCx1KX1mdW5jdGlvbiB0KG4sdCl7by5wdXNoKCJNIixuLCIsIix0KSxhLnBvaW50PWV9ZnVuY3Rpb24gZShuLHQpe28ucHVzaCgiTCIsbiwiLCIsdCl9ZnVuY3Rpb24gcigpe2EucG9pbnQ9bn1mdW5jdGlvbiBpKCl7by5wdXNoKCJaIil9dmFyIHU9SnQoNC41KSxvPVtdLGE9e3BvaW50Om4sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YS5wb2ludD10fSxsaW5lRW5kOnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YS5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9cixhLnBvaW50PW59LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiB1PUp0KG4pLGF9LHJlc3VsdDpmdW5jdGlvbigpe2lmKG8ubGVuZ3RoKXt2YXIgbj1vLmpvaW4oIiIpO3JldHVybiBvPVtdLG59fX07cmV0dXJuIGF9ZnVuY3Rpb24gSnQobil7cmV0dXJuIm0wLCIrbisiYSIrbisiLCIrbisiIDAgMSwxIDAsIistMipuKyJhIituKyIsIituKyIgMCAxLDEgMCwiKzIqbisieiJ9ZnVuY3Rpb24gR3Qobix0KXtDYSs9bix6YSs9dCwrK0xhfWZ1bmN0aW9uIEt0KCl7ZnVuY3Rpb24gbihuLHIpe3ZhciBpPW4tdCx1PXItZSxvPU1hdGguc3FydChpKmkrdSp1KTtxYSs9byoodCtuKS8yLFRhKz1vKihlK3IpLzIsUmErPW8sR3QodD1uLGU9cil9dmFyIHQsZTtXYS5wb2ludD1mdW5jdGlvbihyLGkpe1dhLnBvaW50PW4sR3QodD1yLGU9aSl9fWZ1bmN0aW9uIFF0KCl7V2EucG9pbnQ9R3R9ZnVuY3Rpb24gbmUoKXtmdW5jdGlvbiBuKG4sdCl7dmFyIGU9bi1yLHU9dC1pLG89TWF0aC5zcXJ0KGUqZSt1KnUpO3FhKz1vKihyK24pLzIsVGErPW8qKGkrdCkvMixSYSs9byxvPWkqbi1yKnQsRGErPW8qKHIrbiksUGErPW8qKGkrdCksVWErPTMqbyxHdChyPW4saT10KX12YXIgdCxlLHIsaTtXYS5wb2ludD1mdW5jdGlvbih1LG8pe1dhLnBvaW50PW4sR3QodD1yPXUsZT1pPW8pfSxXYS5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiB0ZShuKXtmdW5jdGlvbiB0KHQsZSl7bi5tb3ZlVG8odCtvLGUpLG4uYXJjKHQsZSxvLDAsSG8pfWZ1bmN0aW9uIGUodCxlKXtuLm1vdmVUbyh0LGUpLGEucG9pbnQ9cn1mdW5jdGlvbiByKHQsZSl7bi5saW5lVG8odCxlKX1mdW5jdGlvbiBpKCl7YS5wb2ludD10fWZ1bmN0aW9uIHUoKXtuLmNsb3NlUGF0aCgpfXZhciBvPTQuNSxhPXtwb2ludDp0LGxpbmVTdGFydDpmdW5jdGlvbigpe2EucG9pbnQ9ZX0sbGluZUVuZDppLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2EubGluZUVuZD11fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7YS5saW5lRW5kPWksYS5wb2ludD10fSxwb2ludFJhZGl1czpmdW5jdGlvbihuKXtyZXR1cm4gbz1uLGF9LHJlc3VsdDpifTtyZXR1cm4gYX1mdW5jdGlvbiBlZShuKXtmdW5jdGlvbiB0KG4pe3JldHVybihhP3I6ZSkobil9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdWUodCxmdW5jdGlvbihlLHIpe2U9bihlLHIpLHQucG9pbnQoZVswXSxlWzFdKX0pfWZ1bmN0aW9uIHIodCl7ZnVuY3Rpb24gZShlLHIpe2U9bihlLHIpLHQucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiByKCl7TT1OYU4sUy5wb2ludD11LHQubGluZVN0YXJ0KCl9ZnVuY3Rpb24gdShlLHIpe3ZhciB1PWR0KFtlLHJdKSxvPW4oZSxyKTtpKE0seCxtLGIsXyx3LE09b1swXSx4PW9bMV0sbT1lLGI9dVswXSxfPXVbMV0sdz11WzJdLGEsdCksdC5wb2ludChNLHgpfWZ1bmN0aW9uIG8oKXtTLnBvaW50PWUsdC5saW5lRW5kKCl9ZnVuY3Rpb24gbCgpewpyKCksUy5wb2ludD1jLFMubGluZUVuZD1mfWZ1bmN0aW9uIGMobix0KXt1KHM9bixoPXQpLHA9TSxnPXgsdj1iLGQ9Xyx5PXcsUy5wb2ludD11fWZ1bmN0aW9uIGYoKXtpKE0seCxtLGIsXyx3LHAsZyxzLHYsZCx5LGEsdCksUy5saW5lRW5kPW8sbygpfXZhciBzLGgscCxnLHYsZCx5LG0sTSx4LGIsXyx3LFM9e3BvaW50OmUsbGluZVN0YXJ0OnIsbGluZUVuZDpvLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCksUy5saW5lU3RhcnQ9bH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLFMubGluZVN0YXJ0PXJ9fTtyZXR1cm4gU31mdW5jdGlvbiBpKHQsZSxyLGEsbCxjLGYscyxoLHAsZyx2LGQseSl7dmFyIG09Zi10LE09cy1lLHg9bSptK00qTTtpZih4PjQqdSYmZC0tKXt2YXIgYj1hK3AsXz1sK2csdz1jK3YsUz1NYXRoLnNxcnQoYipiK18qXyt3KncpLGs9TWF0aC5hc2luKHcvPVMpLE49eG8oeG8odyktMSk8VW98fHhvKHItaCk8VW8/KHIraCkvMjpNYXRoLmF0YW4yKF8sYiksRT1uKE4sayksQT1FWzBdLEM9RVsxXSx6PUEtdCxMPUMtZSxxPU0qei1tKkw7KHEqcS94PnV8fHhvKChtKnorTSpMKS94LS41KT4uM3x8bz5hKnArbCpnK2MqdikmJihpKHQsZSxyLGEsbCxjLEEsQyxOLGIvPVMsXy89Uyx3LGQseSkseS5wb2ludChBLEMpLGkoQSxDLE4sYixfLHcsZixzLGgscCxnLHYsZCx5KSl9fXZhciB1PS41LG89TWF0aC5jb3MoMzAqWW8pLGE9MTY7cmV0dXJuIHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSh1PW4qbik+MCYmMTYsdCk6TWF0aC5zcXJ0KHUpfSx0fWZ1bmN0aW9uIHJlKG4pe3ZhciB0PWVlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oW3QqWm8sZSpab10pfSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBsZSh0KG4pKX19ZnVuY3Rpb24gaWUobil7dGhpcy5zdHJlYW09bn1mdW5jdGlvbiB1ZShuLHQpe3JldHVybntwb2ludDp0LHNwaGVyZTpmdW5jdGlvbigpe24uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpfX19ZnVuY3Rpb24gb2Uobil7cmV0dXJuIGFlKGZ1bmN0aW9uKCl7cmV0dXJuIG59KSgpfWZ1bmN0aW9uIGFlKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuIG49YShuWzBdKllvLG5bMV0qWW8pLFtuWzBdKmgrbCxjLW5bMV0qaF19ZnVuY3Rpb24gZShuKXtyZXR1cm4gbj1hLmludmVydCgoblswXS1sKS9oLChjLW5bMV0pL2gpLG4mJltuWzBdKlpvLG5bMV0qWm9dfWZ1bmN0aW9uIHIoKXthPUN0KG89c2UoeSxNLHgpLHUpO3ZhciBuPXUodixkKTtyZXR1cm4gbD1wLW5bMF0qaCxjPWcrblsxXSpoLGkoKX1mdW5jdGlvbiBpKCl7cmV0dXJuIGYmJihmLnZhbGlkPSExLGY9bnVsbCksdH12YXIgdSxvLGEsbCxjLGYscz1lZShmdW5jdGlvbihuLHQpe3JldHVybiBuPXUobix0KSxbblswXSpoK2wsYy1uWzFdKmhdfSksaD0xNTAscD00ODAsZz0yNTAsdj0wLGQ9MCx5PTAsTT0wLHg9MCxiPUZhLF89bSx3PW51bGwsUz1udWxsO3JldHVybiB0LnN0cmVhbT1mdW5jdGlvbihuKXtyZXR1cm4gZiYmKGYudmFsaWQ9ITEpLGY9bGUoYihvLHMoXyhuKSkpKSxmLnZhbGlkPSEwLGZ9LHQuY2xpcEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPW51bGw9PW4/KHc9bixGYSk6SXQoKHc9K24pKllvKSxpKCkpOnd9LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz1uLF89bj9adChuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKTptLGkoKSk6U30sdC5zY2FsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rbixyKCkpOmh9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPStuWzBdLGc9K25bMV0scigpKTpbcCxnXX0sdC5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9blswXSUzNjAqWW8sZD1uWzFdJTM2MCpZbyxyKCkpOlt2KlpvLGQqWm9dfSx0LnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1uWzBdJTM2MCpZbyxNPW5bMV0lMzYwKllvLHg9bi5sZW5ndGg+Mj9uWzJdJTM2MCpZbzowLHIoKSk6W3kqWm8sTSpabyx4KlpvXX0sYW8ucmViaW5kKHQscywicHJlY2lzaW9uIiksZnVuY3Rpb24oKXtyZXR1cm4gdT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmludmVydD11LmludmVydCYmZSxyKCl9fWZ1bmN0aW9uIGxlKG4pe3JldHVybiB1ZShuLGZ1bmN0aW9uKHQsZSl7bi5wb2ludCh0KllvLGUqWW8pfSl9ZnVuY3Rpb24gY2Uobix0KXtyZXR1cm5bbix0XX1mdW5jdGlvbiBmZShuLHQpe3JldHVybltuPkZvP24tSG86LUZvPm4/bitIbzpuLHRdfWZ1bmN0aW9uIHNlKG4sdCxlKXtyZXR1cm4gbj90fHxlP0N0KHBlKG4pLGdlKHQsZSkpOnBlKG4pOnR8fGU/Z2UodCxlKTpmZX1mdW5jdGlvbiBoZShuKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9bixbdD5Gbz90LUhvOi1Gbz50P3QrSG86dCxlXX19ZnVuY3Rpb24gcGUobil7dmFyIHQ9aGUobik7cmV0dXJuIHQuaW52ZXJ0PWhlKC1uKSx0fWZ1bmN0aW9uIGdlKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguY29zKHQpLGE9TWF0aC5jb3MobikqZSxsPU1hdGguc2luKG4pKmUsYz1NYXRoLnNpbih0KSxmPWMqcithKmk7cmV0dXJuW01hdGguYXRhbjIobCp1LWYqbyxhKnItYyppKSx0bihmKnUrbCpvKV19dmFyIHI9TWF0aC5jb3MobiksaT1NYXRoLnNpbihuKSx1PU1hdGguY29zKHQpLG89TWF0aC5zaW4odCk7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksYT1NYXRoLmNvcyhuKSplLGw9TWF0aC5zaW4obikqZSxjPU1hdGguc2luKHQpLGY9Yyp1LWwqbztyZXR1cm5bTWF0aC5hdGFuMihsKnUrYypvLGEqcitmKmkpLHRuKGYqci1hKmkpXX0sZX1mdW5jdGlvbiB2ZShuLHQpe3ZhciBlPU1hdGguY29zKG4pLHI9TWF0aC5zaW4obik7cmV0dXJuIGZ1bmN0aW9uKGksdSxvLGEpe3ZhciBsPW8qdDtudWxsIT1pPyhpPWRlKGUsaSksdT1kZShlLHUpLChvPjA/dT5pOmk+dSkmJihpKz1vKkhvKSk6KGk9bitvKkhvLHU9bi0uNSpsKTtmb3IodmFyIGMsZj1pO28+MD9mPnU6dT5mO2YtPWwpYS5wb2ludCgoYz1fdChbZSwtcipNYXRoLmNvcyhmKSwtcipNYXRoLnNpbihmKV0pKVswXSxjWzFdKX19ZnVuY3Rpb24gZGUobix0KXt2YXIgZT1kdCh0KTtlWzBdLT1uLGJ0KGUpO3ZhciByPW5uKC1lWzFdKTtyZXR1cm4oKC1lWzJdPDA/LXI6cikrMipNYXRoLlBJLVVvKSUoMipNYXRoLlBJKX1mdW5jdGlvbiB5ZShuLHQsZSl7dmFyIHI9YW8ucmFuZ2Uobix0LVVvLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIG1lKG4sdCxlKXt2YXIgcj1hby5yYW5nZShuLHQtVW8sZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gTWUobil7cmV0dXJuIG4uc291cmNlfWZ1bmN0aW9uIHhlKG4pe3JldHVybiBuLnRhcmdldH1mdW5jdGlvbiBiZShuLHQsZSxyKXt2YXIgaT1NYXRoLmNvcyh0KSx1PU1hdGguc2luKHQpLG89TWF0aC5jb3MociksYT1NYXRoLnNpbihyKSxsPWkqTWF0aC5jb3MobiksYz1pKk1hdGguc2luKG4pLGY9bypNYXRoLmNvcyhlKSxzPW8qTWF0aC5zaW4oZSksaD0yKk1hdGguYXNpbihNYXRoLnNxcnQob24oci10KStpKm8qb24oZS1uKSkpLHA9MS9NYXRoLnNpbihoKSxnPWg/ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zaW4obio9aCkqcCxlPU1hdGguc2luKGgtbikqcCxyPWUqbCt0KmYsaT1lKmMrdCpzLG89ZSp1K3QqYTtyZXR1cm5bTWF0aC5hdGFuMihpLHIpKlpvLE1hdGguYXRhbjIobyxNYXRoLnNxcnQocipyK2kqaSkpKlpvXX06ZnVuY3Rpb24oKXtyZXR1cm5bbipabyx0KlpvXX07cmV0dXJuIGcuZGlzdGFuY2U9aCxnfWZ1bmN0aW9uIF9lKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciB1PU1hdGguc2luKGkqPVlvKSxvPU1hdGguY29zKGkpLGE9eG8oKG4qPVlvKS10KSxsPU1hdGguY29zKGEpO0phKz1NYXRoLmF0YW4yKE1hdGguc3FydCgoYT1vKk1hdGguc2luKGEpKSphKyhhPXIqdS1lKm8qbCkqYSksZSp1K3IqbypsKSx0PW4sZT11LHI9b312YXIgdCxlLHI7R2EucG9pbnQ9ZnVuY3Rpb24oaSx1KXt0PWkqWW8sZT1NYXRoLnNpbih1Kj1Zbykscj1NYXRoLmNvcyh1KSxHYS5wb2ludD1ufSxHYS5saW5lRW5kPWZ1bmN0aW9uKCl7R2EucG9pbnQ9R2EubGluZUVuZD1ifX1mdW5jdGlvbiB3ZShuLHQpe2Z1bmN0aW9uIGUodCxlKXt2YXIgcj1NYXRoLmNvcyh0KSxpPU1hdGguY29zKGUpLHU9bihyKmkpO3JldHVyblt1KmkqTWF0aC5zaW4odCksdSpNYXRoLnNpbihlKV19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sZSl7dmFyIHI9TWF0aC5zcXJ0KG4qbitlKmUpLGk9dChyKSx1PU1hdGguc2luKGkpLG89TWF0aC5jb3MoaSk7cmV0dXJuW01hdGguYXRhbjIobip1LHIqbyksTWF0aC5hc2luKHImJmUqdS9yKV19LGV9ZnVuY3Rpb24gU2Uobix0KXtmdW5jdGlvbiBlKG4sdCl7bz4wPy1JbytVbz50JiYodD0tSW8rVW8pOnQ+SW8tVW8mJih0PUlvLVVvKTt2YXIgZT1vL01hdGgucG93KGkodCksdSk7cmV0dXJuW2UqTWF0aC5zaW4odSpuKSxvLWUqTWF0aC5jb3ModSpuKV19dmFyIHI9TWF0aC5jb3MobiksaT1mdW5jdGlvbihuKXtyZXR1cm4gTWF0aC50YW4oRm8vNCtuLzIpfSx1PW49PT10P01hdGguc2luKG4pOk1hdGgubG9nKHIvTWF0aC5jb3ModCkpL01hdGgubG9nKGkodCkvaShuKSksbz1yKk1hdGgucG93KGkobiksdSkvdTtyZXR1cm4gdT8oZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1vLXQscj1LKHUpKk1hdGguc3FydChuKm4rZSplKTtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsMipNYXRoLmF0YW4oTWF0aC5wb3coby9yLDEvdSkpLUlvXX0sZSk6TmV9ZnVuY3Rpb24ga2Uobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9dS10O3JldHVybltlKk1hdGguc2luKGkqbiksdS1lKk1hdGguY29zKGkqbildfXZhciByPU1hdGguY29zKG4pLGk9bj09PXQ/TWF0aC5zaW4obik6KHItTWF0aC5jb3ModCkpLyh0LW4pLHU9ci9pK247cmV0dXJuIHhvKGkpPFVvP2NlOihlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPXUtdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL2ksdS1LKGkpKk1hdGguc3FydChuKm4rZSplKV19LGUpfWZ1bmN0aW9uIE5lKG4sdCl7cmV0dXJuW24sTWF0aC5sb2coTWF0aC50YW4oRm8vNCt0LzIpKV19ZnVuY3Rpb24gRWUobil7dmFyIHQsZT1vZShuKSxyPWUuc2NhbGUsaT1lLnRyYW5zbGF0ZSx1PWUuY2xpcEV4dGVudDtyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90P2UuY2xpcEV4dGVudChudWxsKTplOm59LGUudHJhbnNsYXRlPWZ1bmN0aW9uKCl7dmFyIG49aS5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3ZhciBvPXUuYXBwbHkoZSxhcmd1bWVudHMpO2lmKG89PT1lKXtpZih0PW51bGw9PW4pe3ZhciBhPUZvKnIoKSxsPWkoKTt1KFtbbFswXS1hLGxbMV0tYV0sW2xbMF0rYSxsWzFdK2FdXSl9fWVsc2UgdCYmKG89bnVsbCk7cmV0dXJuIG99LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBBZShuLHQpe3JldHVybltNYXRoLmxvZyhNYXRoLnRhbihGby80K3QvMikpLC1uXX1mdW5jdGlvbiBDZShuKXtyZXR1cm4gblswXX1mdW5jdGlvbiB6ZShuKXtyZXR1cm4gblsxXX1mdW5jdGlvbiBMZShuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1bMCwxXSxyPTIsaT0yO3Q+aTtpKyspe2Zvcig7cj4xJiZRKG5bZVtyLTJdXSxuW2Vbci0xXV0sbltpXSk8PTA7KS0tcjtlW3IrK109aX1yZXR1cm4gZS5zbGljZSgwLHIpfWZ1bmN0aW9uIHFlKG4sdCl7cmV0dXJuIG5bMF0tdFswXXx8blsxXS10WzFdfWZ1bmN0aW9uIFRlKG4sdCxlKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKTwoZVsxXS10WzFdKSooblswXS10WzBdKX1mdW5jdGlvbiBSZShuLHQsZSxyKXt2YXIgaT1uWzBdLHU9ZVswXSxvPXRbMF0taSxhPXJbMF0tdSxsPW5bMV0sYz1lWzFdLGY9dFsxXS1sLHM9clsxXS1jLGg9KGEqKGwtYyktcyooaS11KSkvKHMqby1hKmYpO3JldHVybltpK2gqbyxsK2gqZl19ZnVuY3Rpb24gRGUobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuISh0WzBdLWVbMF18fHRbMV0tZVsxXSl9ZnVuY3Rpb24gUGUoKXtycih0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gVWUobil7dmFyIHQ9Y2wucG9wKCl8fG5ldyBQZTtyZXR1cm4gdC5zaXRlPW4sdH1mdW5jdGlvbiBqZShuKXtCZShuKSxvbC5yZW1vdmUobiksY2wucHVzaChuKSxycihuKX1mdW5jdGlvbiBGZShuKXt2YXIgdD1uLmNpcmNsZSxlPXQueCxyPXQuY3ksaT17eDplLHk6cn0sdT1uLlAsbz1uLk4sYT1bbl07amUobik7Zm9yKHZhciBsPXU7bC5jaXJjbGUmJnhvKGUtbC5jaXJjbGUueCk8VW8mJnhvKHItbC5jaXJjbGUuY3kpPFVvOyl1PWwuUCxhLnVuc2hpZnQobCksamUobCksbD11O2EudW5zaGlmdChsKSxCZShsKTtmb3IodmFyIGM9bztjLmNpcmNsZSYmeG8oZS1jLmNpcmNsZS54KTxVbyYmeG8oci1jLmNpcmNsZS5jeSk8VW87KW89Yy5OLGEucHVzaChjKSxqZShjKSxjPW87YS5wdXNoKGMpLEJlKGMpO3ZhciBmLHM9YS5sZW5ndGg7Zm9yKGY9MTtzPmY7KytmKWM9YVtmXSxsPWFbZi0xXSxucihjLmVkZ2UsbC5zaXRlLGMuc2l0ZSxpKTtsPWFbMF0sYz1hW3MtMV0sYy5lZGdlPUtlKGwuc2l0ZSxjLnNpdGUsbnVsbCxpKSwkZShsKSwkZShjKX1mdW5jdGlvbiBIZShuKXtmb3IodmFyIHQsZSxyLGksdT1uLngsbz1uLnksYT1vbC5fO2E7KWlmKHI9T2UoYSxvKS11LHI+VW8pYT1hLkw7ZWxzZXtpZihpPXUtSWUoYSxvKSwhKGk+VW8pKXtyPi1Vbz8odD1hLlAsZT1hKTppPi1Vbz8odD1hLGU9YS5OKTp0PWU9YTticmVha31pZighYS5SKXt0PWE7YnJlYWt9YT1hLlJ9dmFyIGw9VWUobik7aWYob2wuaW5zZXJ0KHQsbCksdHx8ZSl7aWYodD09PWUpcmV0dXJuIEJlKHQpLGU9VWUodC5zaXRlKSxvbC5pbnNlcnQobCxlKSxsLmVkZ2U9ZS5lZGdlPUtlKHQuc2l0ZSxsLnNpdGUpLCRlKHQpLHZvaWQgJGUoZSk7aWYoIWUpcmV0dXJuIHZvaWQobC5lZGdlPUtlKHQuc2l0ZSxsLnNpdGUpKTtCZSh0KSxCZShlKTt2YXIgYz10LnNpdGUsZj1jLngscz1jLnksaD1uLngtZixwPW4ueS1zLGc9ZS5zaXRlLHY9Zy54LWYsZD1nLnktcyx5PTIqKGgqZC1wKnYpLG09aCpoK3AqcCxNPXYqditkKmQseD17eDooZCptLXAqTSkveStmLHk6KGgqTS12Km0pL3krc307bnIoZS5lZGdlLGMsZyx4KSxsLmVkZ2U9S2UoYyxuLG51bGwseCksZS5lZGdlPUtlKG4sZyxudWxsLHgpLCRlKHQpLCRlKGUpfX1mdW5jdGlvbiBPZShuLHQpe3ZhciBlPW4uc2l0ZSxyPWUueCxpPWUueSx1PWktdDtpZighdSlyZXR1cm4gcjt2YXIgbz1uLlA7aWYoIW8pcmV0dXJuLSgxLzApO2U9by5zaXRlO3ZhciBhPWUueCxsPWUueSxjPWwtdDtpZighYylyZXR1cm4gYTt2YXIgZj1hLXIscz0xL3UtMS9jLGg9Zi9jO3JldHVybiBzPygtaCtNYXRoLnNxcnQoaCpoLTIqcyooZipmLygtMipjKS1sK2MvMitpLXUvMikpKS9zK3I6KHIrYSkvMn1mdW5jdGlvbiBJZShuLHQpe3ZhciBlPW4uTjtpZihlKXJldHVybiBPZShlLHQpO3ZhciByPW4uc2l0ZTtyZXR1cm4gci55PT09dD9yLng6MS8wfWZ1bmN0aW9uIFllKG4pe3RoaXMuc2l0ZT1uLHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gWmUobil7Zm9yKHZhciB0LGUscixpLHUsbyxhLGwsYyxmLHM9blswXVswXSxoPW5bMV1bMF0scD1uWzBdWzFdLGc9blsxXVsxXSx2PXVsLGQ9di5sZW5ndGg7ZC0tOylpZih1PXZbZF0sdSYmdS5wcmVwYXJlKCkpZm9yKGE9dS5lZGdlcyxsPWEubGVuZ3RoLG89MDtsPm87KWY9YVtvXS5lbmQoKSxyPWYueCxpPWYueSxjPWFbKytvJWxdLnN0YXJ0KCksdD1jLngsZT1jLnksKHhvKHItdCk+VW98fHhvKGktZSk+VW8pJiYoYS5zcGxpY2UobywwLG5ldyB0cihRZSh1LnNpdGUsZix4byhyLXMpPFVvJiZnLWk+VW8/e3g6cyx5OnhvKHQtcyk8VW8/ZTpnfTp4byhpLWcpPFVvJiZoLXI+VW8/e3g6eG8oZS1nKTxVbz90OmgseTpnfTp4byhyLWgpPFVvJiZpLXA+VW8/e3g6aCx5OnhvKHQtaCk8VW8/ZTpwfTp4byhpLXApPFVvJiZyLXM+VW8/e3g6eG8oZS1wKTxVbz90OnMseTpwfTpudWxsKSx1LnNpdGUsbnVsbCkpLCsrbCl9ZnVuY3Rpb24gVmUobix0KXtyZXR1cm4gdC5hbmdsZS1uLmFuZ2xlfWZ1bmN0aW9uIFhlKCl7cnIodGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uICRlKG4pe3ZhciB0PW4uUCxlPW4uTjtpZih0JiZlKXt2YXIgcj10LnNpdGUsaT1uLnNpdGUsdT1lLnNpdGU7aWYociE9PXUpe3ZhciBvPWkueCxhPWkueSxsPXIueC1vLGM9ci55LWEsZj11LngtbyxzPXUueS1hLGg9MioobCpzLWMqZik7aWYoIShoPj0tam8pKXt2YXIgcD1sKmwrYypjLGc9ZipmK3Mqcyx2PShzKnAtYypnKS9oLGQ9KGwqZy1mKnApL2gscz1kK2EseT1mbC5wb3AoKXx8bmV3IFhlO3kuYXJjPW4seS5zaXRlPWkseS54PXYrbyx5Lnk9cytNYXRoLnNxcnQodip2K2QqZCkseS5jeT1zLG4uY2lyY2xlPXk7Zm9yKHZhciBtPW51bGwsTT1sbC5fO007KWlmKHkueTxNLnl8fHkueT09PU0ueSYmeS54PD1NLngpe2lmKCFNLkwpe209TS5QO2JyZWFrfU09TS5MfWVsc2V7aWYoIU0uUil7bT1NO2JyZWFrfU09TS5SfWxsLmluc2VydChtLHkpLG18fChhbD15KX19fX1mdW5jdGlvbiBCZShuKXt2YXIgdD1uLmNpcmNsZTt0JiYodC5QfHwoYWw9dC5OKSxsbC5yZW1vdmUodCksZmwucHVzaCh0KSxycih0KSxuLmNpcmNsZT1udWxsKX1mdW5jdGlvbiBXZShuKXtmb3IodmFyIHQsZT1pbCxyPVl0KG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pLGk9ZS5sZW5ndGg7aS0tOyl0PWVbaV0sKCFKZSh0LG4pfHwhcih0KXx8eG8odC5hLngtdC5iLngpPFVvJiZ4byh0LmEueS10LmIueSk8VW8pJiYodC5hPXQuYj1udWxsLGUuc3BsaWNlKGksMSkpfWZ1bmN0aW9uIEplKG4sdCl7dmFyIGU9bi5iO2lmKGUpcmV0dXJuITA7dmFyIHIsaSx1PW4uYSxvPXRbMF1bMF0sYT10WzFdWzBdLGw9dFswXVsxXSxjPXRbMV1bMV0sZj1uLmwscz1uLnIsaD1mLngscD1mLnksZz1zLngsdj1zLnksZD0oaCtnKS8yLHk9KHArdikvMjtpZih2PT09cCl7aWYobz5kfHxkPj1hKXJldHVybjtpZihoPmcpe2lmKHUpe2lmKHUueT49YylyZXR1cm59ZWxzZSB1PXt4OmQseTpsfTtlPXt4OmQseTpjfX1lbHNle2lmKHUpe2lmKHUueTxsKXJldHVybn1lbHNlIHU9e3g6ZCx5OmN9O2U9e3g6ZCx5Omx9fX1lbHNlIGlmKHI9KGgtZykvKHYtcCksaT15LXIqZCwtMT5yfHxyPjEpaWYoaD5nKXtpZih1KXtpZih1Lnk+PWMpcmV0dXJufWVsc2UgdT17eDoobC1pKS9yLHk6bH07ZT17eDooYy1pKS9yLHk6Y319ZWxzZXtpZih1KXtpZih1Lnk8bClyZXR1cm59ZWxzZSB1PXt4OihjLWkpL3IseTpjfTtlPXt4OihsLWkpL3IseTpsfX1lbHNlIGlmKHY+cCl7aWYodSl7aWYodS54Pj1hKXJldHVybn1lbHNlIHU9e3g6byx5OnIqbytpfTtlPXt4OmEseTpyKmEraX19ZWxzZXtpZih1KXtpZih1Lng8bylyZXR1cm59ZWxzZSB1PXt4OmEseTpyKmEraX07ZT17eDpvLHk6cipvK2l9fXJldHVybiBuLmE9dSxuLmI9ZSwhMH1mdW5jdGlvbiBHZShuLHQpe3RoaXMubD1uLHRoaXMucj10LHRoaXMuYT10aGlzLmI9bnVsbH1mdW5jdGlvbiBLZShuLHQsZSxyKXt2YXIgaT1uZXcgR2Uobix0KTtyZXR1cm4gaWwucHVzaChpKSxlJiZucihpLG4sdCxlKSxyJiZucihpLHQsbixyKSx1bFtuLmldLmVkZ2VzLnB1c2gobmV3IHRyKGksbix0KSksdWxbdC5pXS5lZGdlcy5wdXNoKG5ldyB0cihpLHQsbikpLGl9ZnVuY3Rpb24gUWUobix0LGUpe3ZhciByPW5ldyBHZShuLG51bGwpO3JldHVybiByLmE9dCxyLmI9ZSxpbC5wdXNoKHIpLHJ9ZnVuY3Rpb24gbnIobix0LGUscil7bi5hfHxuLmI/bi5sPT09ZT9uLmI9cjpuLmE9cjoobi5hPXIsbi5sPXQsbi5yPWUpfWZ1bmN0aW9uIHRyKG4sdCxlKXt2YXIgcj1uLmEsaT1uLmI7dGhpcy5lZGdlPW4sdGhpcy5zaXRlPXQsdGhpcy5hbmdsZT1lP01hdGguYXRhbjIoZS55LXQueSxlLngtdC54KTpuLmw9PT10P01hdGguYXRhbjIoaS54LXIueCxyLnktaS55KTpNYXRoLmF0YW4yKHIueC1pLngsaS55LXIueSl9ZnVuY3Rpb24gZXIoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBycihuKXtuLlU9bi5DPW4uTD1uLlI9bi5QPW4uTj1udWxsfWZ1bmN0aW9uIGlyKG4sdCl7dmFyIGU9dCxyPXQuUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6bi5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiB1cihuLHQpe3ZhciBlPXQscj10LkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOm4uXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gb3Iobil7Zm9yKDtuLkw7KW49bi5MO3JldHVybiBufWZ1bmN0aW9uIGFyKG4sdCl7dmFyIGUscixpLHU9bi5zb3J0KGxyKS5wb3AoKTtmb3IoaWw9W10sdWw9bmV3IEFycmF5KG4ubGVuZ3RoKSxvbD1uZXcgZXIsbGw9bmV3IGVyOzspaWYoaT1hbCx1JiYoIWl8fHUueTxpLnl8fHUueT09PWkueSYmdS54PGkueCkpdS54PT09ZSYmdS55PT09cnx8KHVsW3UuaV09bmV3IFllKHUpLEhlKHUpLGU9dS54LHI9dS55KSx1PW4ucG9wKCk7ZWxzZXtpZighaSlicmVhaztGZShpLmFyYyl9dCYmKFdlKHQpLFplKHQpKTt2YXIgbz17Y2VsbHM6dWwsZWRnZXM6aWx9O3JldHVybiBvbD1sbD1pbD11bD1udWxsLG99ZnVuY3Rpb24gbHIobix0KXtyZXR1cm4gdC55LW4ueXx8dC54LW4ueH1mdW5jdGlvbiBjcihuLHQsZSl7cmV0dXJuKG4ueC1lLngpKih0Lnktbi55KS0obi54LXQueCkqKGUueS1uLnkpfWZ1bmN0aW9uIGZyKG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gc3Iobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBocigpe3JldHVybntsZWFmOiEwLG5vZGVzOltdLHBvaW50Om51bGwseDpudWxsLHk6bnVsbH19ZnVuY3Rpb24gcHIobix0LGUscixpLHUpe2lmKCFuKHQsZSxyLGksdSkpe3ZhciBvPS41KihlK2kpLGE9LjUqKHIrdSksbD10Lm5vZGVzO2xbMF0mJnByKG4sbFswXSxlLHIsbyxhKSxsWzFdJiZwcihuLGxbMV0sbyxyLGksYSksbFsyXSYmcHIobixsWzJdLGUsYSxvLHUpLGxbM10mJnByKG4sbFszXSxvLGEsaSx1KX19ZnVuY3Rpb24gZ3Iobix0LGUscixpLHUsbyl7dmFyIGEsbD0xLzA7cmV0dXJuIGZ1bmN0aW9uIGMobixmLHMsaCxwKXtpZighKGY+dXx8cz5vfHxyPmh8fGk+cCkpe2lmKGc9bi5wb2ludCl7dmFyIGcsdj10LW4ueCxkPWUtbi55LHk9dip2K2QqZDtpZihsPnkpe3ZhciBtPU1hdGguc3FydChsPXkpO3I9dC1tLGk9ZS1tLHU9dCttLG89ZSttLGE9Z319Zm9yKHZhciBNPW4ubm9kZXMseD0uNSooZitoKSxiPS41KihzK3ApLF89dD49eCx3PWU+PWIsUz13PDwxfF8saz1TKzQ7az5TOysrUylpZihuPU1bMyZTXSlzd2l0Y2goMyZTKXtjYXNlIDA6YyhuLGYscyx4LGIpO2JyZWFrO2Nhc2UgMTpjKG4seCxzLGgsYik7YnJlYWs7Y2FzZSAyOmMobixmLGIseCxwKTticmVhaztjYXNlIDM6YyhuLHgsYixoLHApfX19KG4scixpLHUsbyksYX1mdW5jdGlvbiB2cihuLHQpe249YW8ucmdiKG4pLHQ9YW8ucmdiKHQpO3ZhciBlPW4ucixyPW4uZyxpPW4uYix1PXQuci1lLG89dC5nLXIsYT10LmItaTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIiMiK2JuKE1hdGgucm91bmQoZSt1Km4pKStibihNYXRoLnJvdW5kKHIrbypuKSkrYm4oTWF0aC5yb3VuZChpK2EqbikpfX1mdW5jdGlvbiBkcihuLHQpe3ZhciBlLHI9e30saT17fTtmb3IoZSBpbiBuKWUgaW4gdD9yW2VdPU1yKG5bZV0sdFtlXSk6aVtlXT1uW2VdO2ZvcihlIGluIHQpZSBpbiBufHwoaVtlXT10W2VdKTtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKGUgaW4gcilpW2VdPXJbZV0obik7cmV0dXJuIGl9fWZ1bmN0aW9uIHlyKG4sdCl7cmV0dXJuIG49K24sdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gbiooMS1lKSt0KmV9fWZ1bmN0aW9uIG1yKG4sdCl7dmFyIGUscixpLHU9aGwubGFzdEluZGV4PXBsLmxhc3RJbmRleD0wLG89LTEsYT1bXSxsPVtdO2ZvcihuKz0iIix0Kz0iIjsoZT1obC5leGVjKG4pKSYmKHI9cGwuZXhlYyh0KSk7KShpPXIuaW5kZXgpPnUmJihpPXQuc2xpY2UodSxpKSxhW29dP2Fbb10rPWk6YVsrK29dPWkpLChlPWVbMF0pPT09KHI9clswXSk/YVtvXT9hW29dKz1yOmFbKytvXT1yOihhWysrb109bnVsbCxsLnB1c2goe2k6byx4OnlyKGUscil9KSksdT1wbC5sYXN0SW5kZXg7cmV0dXJuIHU8dC5sZW5ndGgmJihpPXQuc2xpY2UodSksYVtvXT9hW29dKz1pOmFbKytvXT1pKSxhLmxlbmd0aDwyP2xbMF0/KHQ9bFswXS54LGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifSk6ZnVuY3Rpb24oKXtyZXR1cm4gdH06KHQ9bC5sZW5ndGgsZnVuY3Rpb24obil7Zm9yKHZhciBlLHI9MDt0PnI7KytyKWFbKGU9bFtyXSkuaV09ZS54KG4pO3JldHVybiBhLmpvaW4oIiIpfSl9ZnVuY3Rpb24gTXIobix0KXtmb3IodmFyIGUscj1hby5pbnRlcnBvbGF0b3JzLmxlbmd0aDstLXI+PTAmJiEoZT1hby5pbnRlcnBvbGF0b3JzW3JdKG4sdCkpOyk7cmV0dXJuIGV9ZnVuY3Rpb24geHIobix0KXt2YXIgZSxyPVtdLGk9W10sdT1uLmxlbmd0aCxvPXQubGVuZ3RoLGE9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpO2ZvcihlPTA7YT5lOysrZSlyLnB1c2goTXIobltlXSx0W2VdKSk7Zm9yKDt1PmU7KytlKWlbZV09bltlXTtmb3IoO28+ZTsrK2UpaVtlXT10W2VdO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZT0wO2E+ZTsrK2UpaVtlXT1yW2VdKG4pO3JldHVybiBpfX1mdW5jdGlvbiBicihuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+PXQ/MDp0Pj0xPzE6bih0KX19ZnVuY3Rpb24gX3Iobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAxLW4oMS10KX19ZnVuY3Rpb24gd3Iobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybi41KiguNT50P24oMip0KToyLW4oMi0yKnQpKX19ZnVuY3Rpb24gU3Iobil7cmV0dXJuIG4qbn1mdW5jdGlvbiBrcihuKXtyZXR1cm4gbipuKm59ZnVuY3Rpb24gTnIobil7aWYoMD49bilyZXR1cm4gMDtpZihuPj0xKXJldHVybiAxO3ZhciB0PW4qbixlPXQqbjtyZXR1cm4gNCooLjU+bj9lOjMqKG4tdCkrZS0uNzUpfWZ1bmN0aW9uIEVyKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gQXIobil7cmV0dXJuIDEtTWF0aC5jb3MobipJbyl9ZnVuY3Rpb24gQ3Iobil7cmV0dXJuIE1hdGgucG93KDIsMTAqKG4tMSkpfWZ1bmN0aW9uIHpyKG4pe3JldHVybiAxLU1hdGguc3FydCgxLW4qbil9ZnVuY3Rpb24gTHIobix0KXt2YXIgZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD0uNDUpLGFyZ3VtZW50cy5sZW5ndGg/ZT10L0hvKk1hdGguYXNpbigxL24pOihuPTEsZT10LzQpLGZ1bmN0aW9uKHIpe3JldHVybiAxK24qTWF0aC5wb3coMiwtMTAqcikqTWF0aC5zaW4oKHItZSkqSG8vdCl9fWZ1bmN0aW9uIHFyKG4pe3JldHVybiBufHwobj0xLjcwMTU4KSxmdW5jdGlvbih0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfX1mdW5jdGlvbiBUcihuKXtyZXR1cm4gMS8yLjc1Pm4/Ny41NjI1Km4qbjoyLzIuNzU+bj83LjU2MjUqKG4tPTEuNS8yLjc1KSpuKy43NToyLjUvMi43NT5uPzcuNTYyNSoobi09Mi4yNS8yLjc1KSpuKy45Mzc1OjcuNTYyNSoobi09Mi42MjUvMi43NSkqbisuOTg0Mzc1fWZ1bmN0aW9uIFJyKG4sdCl7bj1hby5oY2wobiksdD1hby5oY2wodCk7dmFyIGU9bi5oLHI9bi5jLGk9bi5sLHU9dC5oLWUsbz10LmMtcixhPXQubC1pO3JldHVybiBpc05hTihvKSYmKG89MCxyPWlzTmFOKHIpP3QuYzpyKSxpc05hTih1KT8odT0wLGU9aXNOYU4oZSk/dC5oOmUpOnU+MTgwP3UtPTM2MDotMTgwPnUmJih1Kz0zNjApLGZ1bmN0aW9uKG4pe3JldHVybiBzbihlK3UqbixyK28qbixpK2EqbikrIiJ9fWZ1bmN0aW9uIERyKG4sdCl7bj1hby5oc2wobiksdD1hby5oc2wodCk7dmFyIGU9bi5oLHI9bi5zLGk9bi5sLHU9dC5oLWUsbz10LnMtcixhPXQubC1pO3JldHVybiBpc05hTihvKSYmKG89MCxyPWlzTmFOKHIpP3QuczpyKSxpc05hTih1KT8odT0wLGU9aXNOYU4oZSk/dC5oOmUpOnU+MTgwP3UtPTM2MDotMTgwPnUmJih1Kz0zNjApLGZ1bmN0aW9uKG4pe3JldHVybiBjbihlK3UqbixyK28qbixpK2EqbikrIiJ9fWZ1bmN0aW9uIFByKG4sdCl7bj1hby5sYWIobiksdD1hby5sYWIodCk7dmFyIGU9bi5sLHI9bi5hLGk9bi5iLHU9dC5sLWUsbz10LmEtcixhPXQuYi1pO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gcG4oZSt1Km4scitvKm4saSthKm4pKyIifX1mdW5jdGlvbiBVcihuLHQpe3JldHVybiB0LT1uLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKG4rdCplKX19ZnVuY3Rpb24ganIobil7dmFyIHQ9W24uYSxuLmJdLGU9W24uYyxuLmRdLHI9SHIodCksaT1Gcih0LGUpLHU9SHIoT3IoZSx0LC1pKSl8fDA7dFswXSplWzFdPGVbMF0qdFsxXSYmKHRbMF0qPS0xLHRbMV0qPS0xLHIqPS0xLGkqPS0xKSx0aGlzLnJvdGF0ZT0ocj9NYXRoLmF0YW4yKHRbMV0sdFswXSk6TWF0aC5hdGFuMigtZVswXSxlWzFdKSkqWm8sdGhpcy50cmFuc2xhdGU9W24uZSxuLmZdLHRoaXMuc2NhbGU9W3IsdV0sdGhpcy5za2V3PXU/TWF0aC5hdGFuMihpLHUpKlpvOjB9ZnVuY3Rpb24gRnIobix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXX1mdW5jdGlvbiBIcihuKXt2YXIgdD1NYXRoLnNxcnQoRnIobixuKSk7cmV0dXJuIHQmJihuWzBdLz10LG5bMV0vPXQpLHR9ZnVuY3Rpb24gT3Iobix0LGUpe3JldHVybiBuWzBdKz1lKnRbMF0sblsxXSs9ZSp0WzFdLG59ZnVuY3Rpb24gSXIobil7cmV0dXJuIG4ubGVuZ3RoP24ucG9wKCkrIiwiOiIifWZ1bmN0aW9uIFlyKG4sdCxlLHIpe2lmKG5bMF0hPT10WzBdfHxuWzFdIT09dFsxXSl7dmFyIGk9ZS5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLCIsIixudWxsLCIpIik7ci5wdXNoKHtpOmktNCx4OnlyKG5bMF0sdFswXSl9LHtpOmktMix4OnlyKG5bMV0sdFsxXSl9KX1lbHNlKHRbMF18fHRbMV0pJiZlLnB1c2goInRyYW5zbGF0ZSgiK3QrIikiKX1mdW5jdGlvbiBacihuLHQsZSxyKXtuIT09dD8obi10PjE4MD90Kz0zNjA6dC1uPjE4MCYmKG4rPTM2MCksci5wdXNoKHtpOmUucHVzaChJcihlKSsicm90YXRlKCIsbnVsbCwiKSIpLTIseDp5cihuLHQpfSkpOnQmJmUucHVzaChJcihlKSsicm90YXRlKCIrdCsiKSIpfWZ1bmN0aW9uIFZyKG4sdCxlLHIpe24hPT10P3IucHVzaCh7aTplLnB1c2goSXIoZSkrInNrZXdYKCIsbnVsbCwiKSIpLTIseDp5cihuLHQpfSk6dCYmZS5wdXNoKElyKGUpKyJza2V3WCgiK3QrIikiKX1mdW5jdGlvbiBYcihuLHQsZSxyKXtpZihuWzBdIT09dFswXXx8blsxXSE9PXRbMV0pe3ZhciBpPWUucHVzaChJcihlKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7ci5wdXNoKHtpOmktNCx4OnlyKG5bMF0sdFswXSl9LHtpOmktMix4OnlyKG5bMV0sdFsxXSl9KX1lbHNlIDE9PT10WzBdJiYxPT09dFsxXXx8ZS5wdXNoKElyKGUpKyJzY2FsZSgiK3QrIikiKX1mdW5jdGlvbiAkcihuLHQpe3ZhciBlPVtdLHI9W107cmV0dXJuIG49YW8udHJhbnNmb3JtKG4pLHQ9YW8udHJhbnNmb3JtKHQpLFlyKG4udHJhbnNsYXRlLHQudHJhbnNsYXRlLGUsciksWnIobi5yb3RhdGUsdC5yb3RhdGUsZSxyKSxWcihuLnNrZXcsdC5za2V3LGUsciksWHIobi5zY2FsZSx0LnNjYWxlLGUsciksbj10PW51bGwsZnVuY3Rpb24obil7Zm9yKHZhciB0LGk9LTEsdT1yLmxlbmd0aDsrK2k8dTspZVsodD1yW2ldKS5pXT10Lngobik7cmV0dXJuIGUuam9pbigiIil9fWZ1bmN0aW9uIEJyKG4sdCl7cmV0dXJuIHQ9KHQtPW49K24pfHwxL3QsZnVuY3Rpb24oZSl7cmV0dXJuKGUtbikvdH19ZnVuY3Rpb24gV3Iobix0KXtyZXR1cm4gdD0odC09bj0rbil8fDEvdCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLChlLW4pL3QpKX19ZnVuY3Rpb24gSnIobil7Zm9yKHZhciB0PW4uc291cmNlLGU9bi50YXJnZXQscj1Lcih0LGUpLGk9W3RdO3QhPT1yOyl0PXQucGFyZW50LGkucHVzaCh0KTtmb3IodmFyIHU9aS5sZW5ndGg7ZSE9PXI7KWkuc3BsaWNlKHUsMCxlKSxlPWUucGFyZW50O3JldHVybiBpfWZ1bmN0aW9uIEdyKG4pe2Zvcih2YXIgdD1bXSxlPW4ucGFyZW50O251bGwhPWU7KXQucHVzaChuKSxuPWUsZT1lLnBhcmVudDtyZXR1cm4gdC5wdXNoKG4pLHR9ZnVuY3Rpb24gS3Iobix0KXtpZihuPT09dClyZXR1cm4gbjtmb3IodmFyIGU9R3Iobikscj1Hcih0KSxpPWUucG9wKCksdT1yLnBvcCgpLG89bnVsbDtpPT09dTspbz1pLGk9ZS5wb3AoKSx1PXIucG9wKCk7cmV0dXJuIG99ZnVuY3Rpb24gUXIobil7bi5maXhlZHw9Mn1mdW5jdGlvbiBuaShuKXtuLmZpeGVkJj0tN31mdW5jdGlvbiB0aShuKXtuLmZpeGVkfD00LG4ucHg9bi54LG4ucHk9bi55fWZ1bmN0aW9uIGVpKG4pe24uZml4ZWQmPS01fWZ1bmN0aW9uIHJpKG4sdCxlKXt2YXIgcj0wLGk9MDtpZihuLmNoYXJnZT0wLCFuLmxlYWYpZm9yKHZhciB1LG89bi5ub2RlcyxhPW8ubGVuZ3RoLGw9LTE7KytsPGE7KXU9b1tsXSxudWxsIT11JiYocmkodSx0LGUpLG4uY2hhcmdlKz11LmNoYXJnZSxyKz11LmNoYXJnZSp1LmN4LGkrPXUuY2hhcmdlKnUuY3kpO2lmKG4ucG9pbnQpe24ubGVhZnx8KG4ucG9pbnQueCs9TWF0aC5yYW5kb20oKS0uNSxuLnBvaW50LnkrPU1hdGgucmFuZG9tKCktLjUpO3ZhciBjPXQqZVtuLnBvaW50LmluZGV4XTtuLmNoYXJnZSs9bi5wb2ludENoYXJnZT1jLHIrPWMqbi5wb2ludC54LGkrPWMqbi5wb2ludC55fW4uY3g9ci9uLmNoYXJnZSxuLmN5PWkvbi5jaGFyZ2V9ZnVuY3Rpb24gaWkobix0KXtyZXR1cm4gYW8ucmViaW5kKG4sdCwic29ydCIsImNoaWxkcmVuIiwidmFsdWUiKSxuLm5vZGVzPW4sbi5saW5rcz1maSxufWZ1bmN0aW9uIHVpKG4sdCl7Zm9yKHZhciBlPVtuXTtudWxsIT0obj1lLnBvcCgpKTspaWYodChuKSwoaT1uLmNoaWxkcmVuKSYmKHI9aS5sZW5ndGgpKWZvcih2YXIgcixpOy0tcj49MDspZS5wdXNoKGlbcl0pfWZ1bmN0aW9uIG9pKG4sdCl7Zm9yKHZhciBlPVtuXSxyPVtdO251bGwhPShuPWUucG9wKCkpOylpZihyLnB1c2gobiksKHU9bi5jaGlsZHJlbikmJihpPXUubGVuZ3RoKSlmb3IodmFyIGksdSxvPS0xOysrbzxpOyllLnB1c2godVtvXSk7Zm9yKDtudWxsIT0obj1yLnBvcCgpKTspdChuKX1mdW5jdGlvbiBhaShuKXtyZXR1cm4gbi5jaGlsZHJlbn1mdW5jdGlvbiBsaShuKXtyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBjaShuLHQpe3JldHVybiB0LnZhbHVlLW4udmFsdWV9ZnVuY3Rpb24gZmkobil7cmV0dXJuIGFvLm1lcmdlKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLmNoaWxkcmVufHxbXSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6bix0YXJnZXQ6dH19KX0pKX1mdW5jdGlvbiBzaShuKXtyZXR1cm4gbi54fWZ1bmN0aW9uIGhpKG4pe3JldHVybiBuLnl9ZnVuY3Rpb24gcGkobix0LGUpe24ueTA9dCxuLnk9ZX1mdW5jdGlvbiBnaShuKXtyZXR1cm4gYW8ucmFuZ2Uobi5sZW5ndGgpfWZ1bmN0aW9uIHZpKG4pe2Zvcih2YXIgdD0tMSxlPW5bMF0ubGVuZ3RoLHI9W107Kyt0PGU7KXJbdF09MDtyZXR1cm4gcn1mdW5jdGlvbiBkaShuKXtmb3IodmFyIHQsZT0xLHI9MCxpPW5bMF1bMV0sdT1uLmxlbmd0aDt1PmU7KytlKSh0PW5bZV1bMV0pPmkmJihyPWUsaT10KTtyZXR1cm4gcn1mdW5jdGlvbiB5aShuKXtyZXR1cm4gbi5yZWR1Y2UobWksMCl9ZnVuY3Rpb24gbWkobix0KXtyZXR1cm4gbit0WzFdfWZ1bmN0aW9uIE1pKG4sdCl7cmV0dXJuIHhpKG4sTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMisxKSl9ZnVuY3Rpb24geGkobix0KXtmb3IodmFyIGU9LTEscj0rblswXSxpPShuWzFdLXIpL3QsdT1bXTsrK2U8PXQ7KXVbZV09aSplK3I7cmV0dXJuIHV9ZnVuY3Rpb24gYmkobil7cmV0dXJuW2FvLm1pbihuKSxhby5tYXgobildfWZ1bmN0aW9uIF9pKG4sdCl7cmV0dXJuIG4udmFsdWUtdC52YWx1ZX1mdW5jdGlvbiB3aShuLHQpe3ZhciBlPW4uX3BhY2tfbmV4dDtuLl9wYWNrX25leHQ9dCx0Ll9wYWNrX3ByZXY9bix0Ll9wYWNrX25leHQ9ZSxlLl9wYWNrX3ByZXY9dH1mdW5jdGlvbiBTaShuLHQpe24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1ufWZ1bmN0aW9uIGtpKG4sdCl7dmFyIGU9dC54LW4ueCxyPXQueS1uLnksaT1uLnIrdC5yO3JldHVybi45OTkqaSppPmUqZStyKnJ9ZnVuY3Rpb24gTmkobil7ZnVuY3Rpb24gdChuKXtmPU1hdGgubWluKG4ueC1uLnIsZikscz1NYXRoLm1heChuLngrbi5yLHMpLGg9TWF0aC5taW4obi55LW4ucixoKSxwPU1hdGgubWF4KG4ueStuLnIscCl9aWYoKGU9bi5jaGlsZHJlbikmJihjPWUubGVuZ3RoKSl7dmFyIGUscixpLHUsbyxhLGwsYyxmPTEvMCxzPS0oMS8wKSxoPTEvMCxwPS0oMS8wKTtpZihlLmZvckVhY2goRWkpLHI9ZVswXSxyLng9LXIucixyLnk9MCx0KHIpLGM+MSYmKGk9ZVsxXSxpLng9aS5yLGkueT0wLHQoaSksYz4yKSlmb3IodT1lWzJdLHppKHIsaSx1KSx0KHUpLHdpKHIsdSksci5fcGFja19wcmV2PXUsd2kodSxpKSxpPXIuX3BhY2tfbmV4dCxvPTM7Yz5vO28rKyl7emkocixpLHU9ZVtvXSk7dmFyIGc9MCx2PTEsZD0xO2ZvcihhPWkuX3BhY2tfbmV4dDthIT09aTthPWEuX3BhY2tfbmV4dCx2KyspaWYoa2koYSx1KSl7Zz0xO2JyZWFrfWlmKDE9PWcpZm9yKGw9ci5fcGFja19wcmV2O2whPT1hLl9wYWNrX3ByZXYmJiFraShsLHUpO2w9bC5fcGFja19wcmV2LGQrKyk7Zz8oZD52fHx2PT1kJiZpLnI8ci5yP1NpKHIsaT1hKTpTaShyPWwsaSksby0tKTood2kocix1KSxpPXUsdCh1KSl9dmFyIHk9KGYrcykvMixtPShoK3ApLzIsTT0wO2ZvcihvPTA7Yz5vO28rKyl1PWVbb10sdS54LT15LHUueS09bSxNPU1hdGgubWF4KE0sdS5yK01hdGguc3FydCh1LngqdS54K3UueSp1LnkpKTtuLnI9TSxlLmZvckVhY2goQWkpfX1mdW5jdGlvbiBFaShuKXtuLl9wYWNrX25leHQ9bi5fcGFja19wcmV2PW59ZnVuY3Rpb24gQWkobil7ZGVsZXRlIG4uX3BhY2tfbmV4dCxkZWxldGUgbi5fcGFja19wcmV2fWZ1bmN0aW9uIENpKG4sdCxlLHIpe3ZhciBpPW4uY2hpbGRyZW47aWYobi54PXQrPXIqbi54LG4ueT1lKz1yKm4ueSxuLnIqPXIsaSlmb3IodmFyIHU9LTEsbz1pLmxlbmd0aDsrK3U8bzspQ2koaVt1XSx0LGUscil9ZnVuY3Rpb24gemkobix0LGUpe3ZhciByPW4ucitlLnIsaT10Lngtbi54LHU9dC55LW4ueTtpZihyJiYoaXx8dSkpe3ZhciBvPXQucitlLnIsYT1pKmkrdSp1O28qPW8scio9cjt2YXIgbD0uNSsoci1vKS8oMiphKSxjPU1hdGguc3FydChNYXRoLm1heCgwLDIqbyoocithKS0oci09YSkqci1vKm8pKS8oMiphKTtlLng9bi54K2wqaStjKnUsZS55PW4ueStsKnUtYyppfWVsc2UgZS54PW4ueCtyLGUueT1uLnl9ZnVuY3Rpb24gTGkobix0KXtyZXR1cm4gbi5wYXJlbnQ9PXQucGFyZW50PzE6Mn1mdW5jdGlvbiBxaShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0Lmxlbmd0aD90WzBdOm4udH1mdW5jdGlvbiBUaShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuKHQ9ZS5sZW5ndGgpP2VbdC0xXTpuLnR9ZnVuY3Rpb24gUmkobix0LGUpe3ZhciByPWUvKHQuaS1uLmkpO3QuYy09cix0LnMrPWUsbi5jKz1yLHQueis9ZSx0Lm0rPWV9ZnVuY3Rpb24gRGkobil7Zm9yKHZhciB0LGU9MCxyPTAsaT1uLmNoaWxkcmVuLHU9aS5sZW5ndGg7LS11Pj0wOyl0PWlbdV0sdC56Kz1lLHQubSs9ZSxlKz10LnMrKHIrPXQuYyl9ZnVuY3Rpb24gUGkobix0LGUpe3JldHVybiBuLmEucGFyZW50PT09dC5wYXJlbnQ/bi5hOmV9ZnVuY3Rpb24gVWkobil7cmV0dXJuIDErYW8ubWF4KG4sZnVuY3Rpb24obil7cmV0dXJuIG4ueX0pfWZ1bmN0aW9uIGppKG4pe3JldHVybiBuLnJlZHVjZShmdW5jdGlvbihuLHQpe3JldHVybiBuK3QueH0sMCkvbi5sZW5ndGh9ZnVuY3Rpb24gRmkobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdCYmdC5sZW5ndGg/RmkodFswXSk6bn1mdW5jdGlvbiBIaShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuIGUmJih0PWUubGVuZ3RoKT9IaShlW3QtMV0pOm59ZnVuY3Rpb24gT2kobil7cmV0dXJue3g6bi54LHk6bi55LGR4Om4uZHgsZHk6bi5keX19ZnVuY3Rpb24gSWkobix0KXt2YXIgZT1uLngrdFszXSxyPW4ueSt0WzBdLGk9bi5keC10WzFdLXRbM10sdT1uLmR5LXRbMF0tdFsyXTtyZXR1cm4gMD5pJiYoZSs9aS8yLGk9MCksMD51JiYocis9dS8yLHU9MCkse3g6ZSx5OnIsZHg6aSxkeTp1fX1mdW5jdGlvbiBZaShuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4gZT50P1t0LGVdOltlLHRdfWZ1bmN0aW9uIFppKG4pe3JldHVybiBuLnJhbmdlRXh0ZW50P24ucmFuZ2VFeHRlbnQoKTpZaShuLnJhbmdlKCkpfWZ1bmN0aW9uIFZpKG4sdCxlLHIpe3ZhciBpPWUoblswXSxuWzFdKSx1PXIodFswXSx0WzFdKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHUoaShuKSl9fWZ1bmN0aW9uIFhpKG4sdCl7dmFyIGUscj0wLGk9bi5sZW5ndGgtMSx1PW5bcl0sbz1uW2ldO3JldHVybiB1Pm8mJihlPXIscj1pLGk9ZSxlPXUsdT1vLG89ZSksbltyXT10LmZsb29yKHUpLG5baV09dC5jZWlsKG8pLG59ZnVuY3Rpb24gJGkobil7cmV0dXJuIG4/e2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKHQvbikqbn0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5jZWlsKHQvbikqbn19OlNsfWZ1bmN0aW9uIEJpKG4sdCxlLHIpe3ZhciBpPVtdLHU9W10sbz0wLGE9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpLTE7Zm9yKG5bYV08blswXSYmKG49bi5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrbzw9YTspaS5wdXNoKGUobltvLTFdLG5bb10pKSx1LnB1c2gocih0W28tMV0sdFtvXSkpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1hby5iaXNlY3Qobix0LDEsYSktMTtyZXR1cm4gdVtlXShpW2VdKHQpKX19ZnVuY3Rpb24gV2kobix0LGUscil7ZnVuY3Rpb24gaSgpe3ZhciBpPU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKT4yP0JpOlZpLGw9cj9XcjpCcjtyZXR1cm4gbz1pKG4sdCxsLGUpLGE9aSh0LG4sbCxNciksdX1mdW5jdGlvbiB1KG4pe3JldHVybiBvKG4pfXZhciBvLGE7cmV0dXJuIHUuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBhKG4pfSx1LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChOdW1iZXIpLGkoKSk6bn0sdS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGkoKSk6dH0sdS5yYW5nZVJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiB1LnJhbmdlKG4pLmludGVycG9sYXRlKFVyKX0sdS5jbGFtcD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLGkoKSk6cn0sdS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLGkoKSk6ZX0sdS50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gUWkobix0KX0sdS50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51KG4sdCxlKX0sdS5uaWNlPWZ1bmN0aW9uKHQpe3JldHVybiBHaShuLHQpLGkoKX0sdS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFdpKG4sdCxlLHIpfSxpKCl9ZnVuY3Rpb24gSmkobix0KXtyZXR1cm4gYW8ucmViaW5kKG4sdCwicmFuZ2UiLCJyYW5nZVJvdW5kIiwiaW50ZXJwb2xhdGUiLCJjbGFtcCIpfWZ1bmN0aW9uIEdpKG4sdCl7cmV0dXJuIFhpKG4sJGkoS2kobix0KVsyXSkpLFhpKG4sJGkoS2kobix0KVsyXSkpLG59ZnVuY3Rpb24gS2kobix0KXtudWxsPT10JiYodD0xMCk7dmFyIGU9WWkobikscj1lWzFdLWVbMF0saT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIvdCkvTWF0aC5MTjEwKSksdT10L3IqaTtyZXR1cm4uMTU+PXU/aSo9MTA6LjM1Pj11P2kqPTU6Ljc1Pj11JiYoaSo9MiksZVswXT1NYXRoLmNlaWwoZVswXS9pKSppLGVbMV09TWF0aC5mbG9vcihlWzFdL2kpKmkrLjUqaSxlWzJdPWksZX1mdW5jdGlvbiBRaShuLHQpe3JldHVybiBhby5yYW5nZS5hcHBseShhbyxLaShuLHQpKX1mdW5jdGlvbiBudShuLHQsZSl7dmFyIHI9S2kobix0KTtpZihlKXt2YXIgaT1oYS5leGVjKGUpO2lmKGkuc2hpZnQoKSwicyI9PT1pWzhdKXt2YXIgdT1hby5mb3JtYXRQcmVmaXgoTWF0aC5tYXgoeG8oclswXSkseG8oclsxXSkpKTtyZXR1cm4gaVs3XXx8KGlbN109Ii4iK3R1KHUuc2NhbGUoclsyXSkpKSxpWzhdPSJmIixlPWFvLmZvcm1hdChpLmpvaW4oIiIpKSxmdW5jdGlvbihuKXtyZXR1cm4gZSh1LnNjYWxlKG4pKSt1LnN5bWJvbH19aVs3XXx8KGlbN109Ii4iK2V1KGlbOF0scikpLGU9aS5qb2luKCIiKX1lbHNlIGU9IiwuIit0dShyWzJdKSsiZiI7cmV0dXJuIGFvLmZvcm1hdChlKX1mdW5jdGlvbiB0dShuKXtyZXR1cm4tTWF0aC5mbG9vcihNYXRoLmxvZyhuKS9NYXRoLkxOMTArLjAxKX1mdW5jdGlvbiBldShuLHQpe3ZhciBlPXR1KHRbMl0pO3JldHVybiBuIGluIGtsP01hdGguYWJzKGUtdHUoTWF0aC5tYXgoeG8odFswXSkseG8odFsxXSkpKSkrICsoImUiIT09bik6ZS0yKigiJSI9PT1uKX1mdW5jdGlvbiBydShuLHQsZSxyKXtmdW5jdGlvbiBpKG4pe3JldHVybihlP01hdGgubG9nKDA+bj8wOm4pOi1NYXRoLmxvZyhuPjA/MDotbikpL01hdGgubG9nKHQpfWZ1bmN0aW9uIHUobil7cmV0dXJuIGU/TWF0aC5wb3codCxuKTotTWF0aC5wb3codCwtbil9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbihpKHQpKX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUobi5pbnZlcnQodCkpfSxvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10WzBdPj0wLG4uZG9tYWluKChyPXQubWFwKE51bWJlcikpLm1hcChpKSksbyk6cn0sby5iYXNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlLG4uZG9tYWluKHIubWFwKGkpKSxvKTp0fSxvLm5pY2U9ZnVuY3Rpb24oKXt2YXIgdD1YaShyLm1hcChpKSxlP01hdGg6RWwpO3JldHVybiBuLmRvbWFpbih0KSxyPXQubWFwKHUpLG99LG8udGlja3M9ZnVuY3Rpb24oKXt2YXIgbj1ZaShyKSxvPVtdLGE9blswXSxsPW5bMV0sYz1NYXRoLmZsb29yKGkoYSkpLGY9TWF0aC5jZWlsKGkobCkpLHM9dCUxPzI6dDtpZihpc0Zpbml0ZShmLWMpKXtpZihlKXtmb3IoO2Y+YztjKyspZm9yKHZhciBoPTE7cz5oO2grKylvLnB1c2godShjKSpoKTtvLnB1c2godShjKSl9ZWxzZSBmb3Ioby5wdXNoKHUoYykpO2MrKzxmOylmb3IodmFyIGg9cy0xO2g+MDtoLS0pby5wdXNoKHUoYykqaCk7Zm9yKGM9MDtvW2NdPGE7YysrKTtmb3IoZj1vLmxlbmd0aDtvW2YtMV0+bDtmLS0pO289by5zbGljZShjLGYpfXJldHVybiBvfSxvLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gTmw7YXJndW1lbnRzLmxlbmd0aDwyP2U9Tmw6ImZ1bmN0aW9uIiE9dHlwZW9mIGUmJihlPWFvLmZvcm1hdChlKSk7dmFyIHI9TWF0aC5tYXgoMSx0Km4vby50aWNrcygpLmxlbmd0aCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBvPW4vdShNYXRoLnJvdW5kKGkobikpKTtyZXR1cm4gdC0uNT5vKnQmJihvKj10KSxyPj1vP2Uobik6IiJ9fSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcnUobi5jb3B5KCksdCxlLHIpfSxKaShvLG4pfWZ1bmN0aW9uIGl1KG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKGkodCkpfXZhciBpPXV1KHQpLHU9dXUoMS90KTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUobi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4oKGU9dC5tYXAoTnVtYmVyKSkubWFwKGkpKSxyKTplfSxyLnRpY2tzPWZ1bmN0aW9uKG4pe3JldHVybiBRaShlLG4pfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gbnUoZSxuLHQpfSxyLm5pY2U9ZnVuY3Rpb24obil7cmV0dXJuIHIuZG9tYWluKEdpKGUsbikpfSxyLmV4cG9uZW50PWZ1bmN0aW9uKG8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXV1KHQ9byksdT11dSgxL3QpLG4uZG9tYWluKGUubWFwKGkpKSxyKTp0fSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaXUobi5jb3B5KCksdCxlKX0sSmkocixuKX1mdW5jdGlvbiB1dShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+dD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX19ZnVuY3Rpb24gb3Uobix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiB1WygoaS5nZXQoZSl8fCgicmFuZ2UiPT09dC50P2kuc2V0KGUsbi5wdXNoKGUpKTpOYU4pKS0xKSV1Lmxlbmd0aF19ZnVuY3Rpb24gcih0LGUpe3JldHVybiBhby5yYW5nZShuLmxlbmd0aCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0K2Uqbn0pfXZhciBpLHUsbztyZXR1cm4gZS5kb21haW49ZnVuY3Rpb24ocil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG47bj1bXSxpPW5ldyBjO2Zvcih2YXIgdSxvPS0xLGE9ci5sZW5ndGg7KytvPGE7KWkuaGFzKHU9cltvXSl8fGkuc2V0KHUsbi5wdXNoKHUpKTtyZXR1cm4gZVt0LnRdLmFwcGx5KGUsdC5hKX0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLG89MCx0PXt0OiJyYW5nZSIsYTphcmd1bWVudHN9LGUpOnV9LGUucmFuZ2VQb2ludHM9ZnVuY3Rpb24oaSxhKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApO3ZhciBsPWlbMF0sYz1pWzFdLGY9bi5sZW5ndGg8Mj8obD0obCtjKS8yLDApOihjLWwpLyhuLmxlbmd0aC0xK2EpO3JldHVybiB1PXIobCtmKmEvMixmKSxvPTAsdD17dDoicmFuZ2VQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRQb2ludHM9ZnVuY3Rpb24oaSxhKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApO3ZhciBsPWlbMF0sYz1pWzFdLGY9bi5sZW5ndGg8Mj8obD1jPU1hdGgucm91bmQoKGwrYykvMiksMCk6KGMtbCkvKG4ubGVuZ3RoLTErYSl8MDtyZXR1cm4gdT1yKGwrTWF0aC5yb3VuZChmKmEvMisoYy1sLShuLmxlbmd0aC0xK2EpKmYpLzIpLGYpLG89MCx0PXt0OiJyYW5nZVJvdW5kUG9pbnRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmRzPWZ1bmN0aW9uKGksYSxsKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGw9YSk7dmFyIGM9aVsxXTxpWzBdLGY9aVtjLTBdLHM9aVsxLWNdLGg9KHMtZikvKG4ubGVuZ3RoLWErMipsKTtyZXR1cm4gdT1yKGYraCpsLGgpLGMmJnUucmV2ZXJzZSgpLG89aCooMS1hKSx0PXt0OiJyYW5nZUJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZVJvdW5kQmFuZHM9ZnVuY3Rpb24oaSxhLGwpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYobD1hKTt2YXIgYz1pWzFdPGlbMF0sZj1pW2MtMF0scz1pWzEtY10saD1NYXRoLmZsb29yKChzLWYpLyhuLmxlbmd0aC1hKzIqbCkpO3JldHVybiB1PXIoZitNYXRoLnJvdW5kKChzLWYtKG4ubGVuZ3RoLWEpKmgpLzIpLGgpLGMmJnUucmV2ZXJzZSgpLG89TWF0aC5yb3VuZChoKigxLWEpKSx0PXt0OiJyYW5nZVJvdW5kQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiBvfSxlLnJhbmdlRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIFlpKHQuYVswXSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBvdShuLHQpfSxlLmRvbWFpbihuKX1mdW5jdGlvbiBhdShuLHQpe2Z1bmN0aW9uIHUoKXt2YXIgZT0wLHI9dC5sZW5ndGg7Zm9yKGE9W107KytlPHI7KWFbZS0xXT1hby5xdWFudGlsZShuLGUvcik7cmV0dXJuIG99ZnVuY3Rpb24gbyhuKXtyZXR1cm4gaXNOYU4obj0rbik/dm9pZCAwOnRbYW8uYmlzZWN0KGEsbildfXZhciBhO3JldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChyKS5maWx0ZXIoaSkuc29ydChlKSx1KCkpOm59LG8ucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bix1KCkpOnR9LG8ucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuaW5kZXhPZihlKSwwPmU/W05hTixOYU5dOltlPjA/YVtlLTFdOm5bMF0sZTxhLmxlbmd0aD9hW2VdOm5bbi5sZW5ndGgtMV1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gYXUobix0KX0sdSgpfWZ1bmN0aW9uIGx1KG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBlW01hdGgubWF4KDAsTWF0aC5taW4obyxNYXRoLmZsb29yKHUqKHQtbikpKSldfWZ1bmN0aW9uIGkoKXtyZXR1cm4gdT1lLmxlbmd0aC8odC1uKSxvPWUubGVuZ3RoLTEscn12YXIgdSxvO3JldHVybiByLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rZVswXSx0PStlW2UubGVuZ3RoLTFdLGkoKSk6W24sdF19LHIucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bixpKCkpOmV9LHIuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0PWUuaW5kZXhPZih0KSx0PTA+dD9OYU46dC91K24sW3QsdCsxL3VdfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbHUobix0LGUpfSxpKCl9ZnVuY3Rpb24gY3Uobix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBlPj1lP3RbYW8uYmlzZWN0KG4sZSldOnZvaWQgMH1yZXR1cm4gZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlKTpufSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sZSk6dH0sZS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5pbmRleE9mKGUpLFtuW2UtMV0sbltlXV19LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBjdShuLHQpfSxlfWZ1bmN0aW9uIGZ1KG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuK259cmV0dXJuIHQuaW52ZXJ0PXQsdC5kb21haW49dC5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLm1hcCh0KSx0KTpufSx0LnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBRaShuLHQpfSx0LnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnUobix0LGUpfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gZnUobil9LHR9ZnVuY3Rpb24gc3UoKXtyZXR1cm4gMH1mdW5jdGlvbiBodShuKXtyZXR1cm4gbi5pbm5lclJhZGl1c31mdW5jdGlvbiBwdShuKXtyZXR1cm4gbi5vdXRlclJhZGl1c31mdW5jdGlvbiBndShuKXtyZXR1cm4gbi5zdGFydEFuZ2xlfWZ1bmN0aW9uIHZ1KG4pe3JldHVybiBuLmVuZEFuZ2xlfWZ1bmN0aW9uIGR1KG4pe3JldHVybiBuJiZuLnBhZEFuZ2xlfWZ1bmN0aW9uIHl1KG4sdCxlLHIpe3JldHVybihuLWUpKnQtKHQtcikqbj4wPzA6MX1mdW5jdGlvbiBtdShuLHQsZSxyLGkpe3ZhciB1PW5bMF0tdFswXSxvPW5bMV0tdFsxXSxhPShpP3I6LXIpL01hdGguc3FydCh1KnUrbypvKSxsPWEqbyxjPS1hKnUsZj1uWzBdK2wscz1uWzFdK2MsaD10WzBdK2wscD10WzFdK2MsZz0oZitoKS8yLHY9KHMrcCkvMixkPWgtZix5PXAtcyxtPWQqZCt5KnksTT1lLXIseD1mKnAtaCpzLGI9KDA+eT8tMToxKSpNYXRoLnNxcnQoTWF0aC5tYXgoMCxNKk0qbS14KngpKSxfPSh4KnktZCpiKS9tLHc9KC14KmQteSpiKS9tLFM9KHgqeStkKmIpL20saz0oLXgqZCt5KmIpL20sTj1fLWcsRT13LXYsQT1TLWcsQz1rLXY7cmV0dXJuIE4qTitFKkU+QSpBK0MqQyYmKF89Uyx3PWspLFtbXy1sLHctY10sW18qZS9NLHcqZS9NXV19ZnVuY3Rpb24gTXUobil7ZnVuY3Rpb24gdCh0KXtmdW5jdGlvbiBvKCl7Yy5wdXNoKCJNIix1KG4oZiksYSkpfWZvcih2YXIgbCxjPVtdLGY9W10scz0tMSxoPXQubGVuZ3RoLHA9RW4oZSksZz1FbihyKTsrK3M8aDspaS5jYWxsKHRoaXMsbD10W3NdLHMpP2YucHVzaChbK3AuY2FsbCh0aGlzLGwscyksK2cuY2FsbCh0aGlzLGwscyldKTpmLmxlbmd0aCYmKG8oKSxmPVtdKTtyZXR1cm4gZi5sZW5ndGgmJm8oKSxjLmxlbmd0aD9jLmpvaW4oIiIpOm51bGx9dmFyIGU9Q2Uscj16ZSxpPXp0LHU9eHUsbz11LmtleSxhPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0LmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bix0KTppfSx0LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP3U9bjoodT1UbC5nZXQobil8fHh1KS5rZXksdCk6b30sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sdCk6YX0sdH1mdW5jdGlvbiB4dShuKXtyZXR1cm4gbi5sZW5ndGg+MT9uLmpvaW4oIkwiKTpuKyJaIn1mdW5jdGlvbiBidShuKXtyZXR1cm4gbi5qb2luKCJMIikrIloifWZ1bmN0aW9uIF91KG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLGk9W3JbMF0sIiwiLHJbMV1dOysrdDxlOylpLnB1c2goIkgiLChyWzBdKyhyPW5bdF0pWzBdKS8yLCJWIixyWzFdKTtyZXR1cm4gZT4xJiZpLnB1c2goIkgiLHJbMF0pLGkuam9pbigiIil9ZnVuY3Rpb24gd3Uobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0saT1bclswXSwiLCIsclsxXV07Kyt0PGU7KWkucHVzaCgiViIsKHI9blt0XSlbMV0sIkgiLHJbMF0pO3JldHVybiBpLmpvaW4oIiIpfWZ1bmN0aW9uIFN1KG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLGk9W3JbMF0sIiwiLHJbMV1dOysrdDxlOylpLnB1c2goIkgiLChyPW5bdF0pWzBdLCJWIixyWzFdKTtyZXR1cm4gaS5qb2luKCIiKX1mdW5jdGlvbiBrdShuLHQpe3JldHVybiBuLmxlbmd0aDw0P3h1KG4pOm5bMV0rQXUobi5zbGljZSgxLC0xKSxDdShuLHQpKX1mdW5jdGlvbiBOdShuLHQpe3JldHVybiBuLmxlbmd0aDwzP2J1KG4pOm5bMF0rQXUoKG4ucHVzaChuWzBdKSxuKSxDdShbbltuLmxlbmd0aC0yXV0uY29uY2F0KG4sW25bMV1dKSx0KSl9ZnVuY3Rpb24gRXUobix0KXtyZXR1cm4gbi5sZW5ndGg8Mz94dShuKTpuWzBdK0F1KG4sQ3Uobix0KSl9ZnVuY3Rpb24gQXUobix0KXtpZih0Lmxlbmd0aDwxfHxuLmxlbmd0aCE9dC5sZW5ndGgmJm4ubGVuZ3RoIT10Lmxlbmd0aCsyKXJldHVybiB4dShuKTt2YXIgZT1uLmxlbmd0aCE9dC5sZW5ndGgscj0iIixpPW5bMF0sdT1uWzFdLG89dFswXSxhPW8sbD0xO2lmKGUmJihyKz0iUSIrKHVbMF0tMipvWzBdLzMpKyIsIisodVsxXS0yKm9bMV0vMykrIiwiK3VbMF0rIiwiK3VbMV0saT1uWzFdLGw9MiksdC5sZW5ndGg+MSl7YT10WzFdLHU9bltsXSxsKysscis9IkMiKyhpWzBdK29bMF0pKyIsIisoaVsxXStvWzFdKSsiLCIrKHVbMF0tYVswXSkrIiwiKyh1WzFdLWFbMV0pKyIsIit1WzBdKyIsIit1WzFdO2Zvcih2YXIgYz0yO2M8dC5sZW5ndGg7YysrLGwrKyl1PW5bbF0sYT10W2NdLHIrPSJTIisodVswXS1hWzBdKSsiLCIrKHVbMV0tYVsxXSkrIiwiK3VbMF0rIiwiK3VbMV19aWYoZSl7dmFyIGY9bltsXTtyKz0iUSIrKHVbMF0rMiphWzBdLzMpKyIsIisodVsxXSsyKmFbMV0vMykrIiwiK2ZbMF0rIiwiK2ZbMV19cmV0dXJuIHJ9ZnVuY3Rpb24gQ3Uobix0KXtmb3IodmFyIGUscj1bXSxpPSgxLXQpLzIsdT1uWzBdLG89blsxXSxhPTEsbD1uLmxlbmd0aDsrK2E8bDspZT11LHU9byxvPW5bYV0sci5wdXNoKFtpKihvWzBdLWVbMF0pLGkqKG9bMV0tZVsxXSldKTtyZXR1cm4gcn1mdW5jdGlvbiB6dShuKXtpZihuLmxlbmd0aDwzKXJldHVybiB4dShuKTt2YXIgdD0xLGU9bi5sZW5ndGgscj1uWzBdLGk9clswXSx1PXJbMV0sbz1baSxpLGksKHI9blsxXSlbMF1dLGE9W3UsdSx1LHJbMV1dLGw9W2ksIiwiLHUsIkwiLFJ1KFBsLG8pLCIsIixSdShQbCxhKV07Zm9yKG4ucHVzaChuW2UtMV0pOysrdDw9ZTspcj1uW3RdLG8uc2hpZnQoKSxvLnB1c2goclswXSksYS5zaGlmdCgpLGEucHVzaChyWzFdKSxEdShsLG8sYSk7cmV0dXJuIG4ucG9wKCksbC5wdXNoKCJMIixyKSxsLmpvaW4oIiIpfWZ1bmN0aW9uIEx1KG4pe2lmKG4ubGVuZ3RoPDQpcmV0dXJuIHh1KG4pO2Zvcih2YXIgdCxlPVtdLHI9LTEsaT1uLmxlbmd0aCx1PVswXSxvPVswXTsrK3I8MzspdD1uW3JdLHUucHVzaCh0WzBdKSxvLnB1c2godFsxXSk7Zm9yKGUucHVzaChSdShQbCx1KSsiLCIrUnUoUGwsbykpLC0tcjsrK3I8aTspdD1uW3JdLHUuc2hpZnQoKSx1LnB1c2godFswXSksby5zaGlmdCgpLG8ucHVzaCh0WzFdKSxEdShlLHUsbyk7cmV0dXJuIGUuam9pbigiIil9ZnVuY3Rpb24gcXUobil7Zm9yKHZhciB0LGUscj0tMSxpPW4ubGVuZ3RoLHU9aSs0LG89W10sYT1bXTsrK3I8NDspZT1uW3IlaV0sby5wdXNoKGVbMF0pLGEucHVzaChlWzFdKTtmb3IodD1bUnUoUGwsbyksIiwiLFJ1KFBsLGEpXSwtLXI7KytyPHU7KWU9bltyJWldLG8uc2hpZnQoKSxvLnB1c2goZVswXSksYS5zaGlmdCgpLGEucHVzaChlWzFdKSxEdSh0LG8sYSk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gVHUobix0KXt2YXIgZT1uLmxlbmd0aC0xO2lmKGUpZm9yKHZhciByLGksdT1uWzBdWzBdLG89blswXVsxXSxhPW5bZV1bMF0tdSxsPW5bZV1bMV0tbyxjPS0xOysrYzw9ZTspcj1uW2NdLGk9Yy9lLHJbMF09dCpyWzBdKygxLXQpKih1K2kqYSksclsxXT10KnJbMV0rKDEtdCkqKG8raSpsKTtyZXR1cm4genUobil9ZnVuY3Rpb24gUnUobix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXStuWzJdKnRbMl0rblszXSp0WzNdfWZ1bmN0aW9uIER1KG4sdCxlKXtuLnB1c2goIkMiLFJ1KFJsLHQpLCIsIixSdShSbCxlKSwiLCIsUnUoRGwsdCksIiwiLFJ1KERsLGUpLCIsIixSdShQbCx0KSwiLCIsUnUoUGwsZSkpfWZ1bmN0aW9uIFB1KG4sdCl7cmV0dXJuKHRbMV0tblsxXSkvKHRbMF0tblswXSl9ZnVuY3Rpb24gVXUobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aC0xLHI9W10saT1uWzBdLHU9blsxXSxvPXJbMF09UHUoaSx1KTsrK3Q8ZTspclt0XT0obysobz1QdShpPXUsdT1uW3QrMV0pKSkvMjtyZXR1cm4gclt0XT1vLHJ9ZnVuY3Rpb24ganUobil7Zm9yKHZhciB0LGUscixpLHU9W10sbz1VdShuKSxhPS0xLGw9bi5sZW5ndGgtMTsrK2E8bDspdD1QdShuW2FdLG5bYSsxXSkseG8odCk8VW8/b1thXT1vW2ErMV09MDooZT1vW2FdL3Qscj1vW2ErMV0vdCxpPWUqZStyKnIsaT45JiYoaT0zKnQvTWF0aC5zcXJ0KGkpLG9bYV09aSplLG9bYSsxXT1pKnIpKTtmb3IoYT0tMTsrK2E8PWw7KWk9KG5bTWF0aC5taW4obCxhKzEpXVswXS1uW01hdGgubWF4KDAsYS0xKV1bMF0pLyg2KigxK29bYV0qb1thXSkpLHUucHVzaChbaXx8MCxvW2FdKml8fDBdKTtyZXR1cm4gdX1mdW5jdGlvbiBGdShuKXtyZXR1cm4gbi5sZW5ndGg8Mz94dShuKTpuWzBdK0F1KG4sanUobikpfWZ1bmN0aW9uIEh1KG4pe2Zvcih2YXIgdCxlLHIsaT0tMSx1PW4ubGVuZ3RoOysraTx1Oyl0PW5baV0sZT10WzBdLHI9dFsxXS1Jbyx0WzBdPWUqTWF0aC5jb3MociksdFsxXT1lKk1hdGguc2luKHIpO3JldHVybiBufWZ1bmN0aW9uIE91KG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gbCgpe3YucHVzaCgiTSIsYShuKHkpLHMpLGYsYyhuKGQucmV2ZXJzZSgpKSxzKSwiWiIpfWZvcih2YXIgaCxwLGcsdj1bXSxkPVtdLHk9W10sbT0tMSxNPXQubGVuZ3RoLHg9RW4oZSksYj1FbihpKSxfPWU9PT1yP2Z1bmN0aW9uKCl7CnJldHVybiBwfTpFbihyKSx3PWk9PT11P2Z1bmN0aW9uKCl7cmV0dXJuIGd9OkVuKHUpOysrbTxNOylvLmNhbGwodGhpcyxoPXRbbV0sbSk/KGQucHVzaChbcD0reC5jYWxsKHRoaXMsaCxtKSxnPStiLmNhbGwodGhpcyxoLG0pXSkseS5wdXNoKFsrXy5jYWxsKHRoaXMsaCxtKSwrdy5jYWxsKHRoaXMsaCxtKV0pKTpkLmxlbmd0aCYmKGwoKSxkPVtdLHk9W10pO3JldHVybiBkLmxlbmd0aCYmbCgpLHYubGVuZ3RoP3Yuam9pbigiIik6bnVsbH12YXIgZT1DZSxyPUNlLGk9MCx1PXplLG89enQsYT14dSxsPWEua2V5LGM9YSxmPSJMIixzPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cj1uLHQpOnJ9LHQueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXU9bix0KTp1fSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sdCk6aX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLHQpOnV9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLHQpOm99LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIG4/YT1uOihhPVRsLmdldChuKXx8eHUpLmtleSxjPWEucmV2ZXJzZXx8YSxmPWEuY2xvc2VkPyJNIjoiTCIsdCk6bH0sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4sdCk6c30sdH1mdW5jdGlvbiBJdShuKXtyZXR1cm4gbi5yYWRpdXN9ZnVuY3Rpb24gWXUobil7cmV0dXJuW24ueCxuLnldfWZ1bmN0aW9uIFp1KG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dFswXSxyPXRbMV0tSW87cmV0dXJuW2UqTWF0aC5jb3MociksZSpNYXRoLnNpbihyKV19fWZ1bmN0aW9uIFZ1KCl7cmV0dXJuIDY0fWZ1bmN0aW9uIFh1KCl7cmV0dXJuImNpcmNsZSJ9ZnVuY3Rpb24gJHUobil7dmFyIHQ9TWF0aC5zcXJ0KG4vRm8pO3JldHVybiJNMCwiK3QrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLXQrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrdCsiWiJ9ZnVuY3Rpb24gQnUobil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsZSxyOyh0PXRoaXNbbl0pJiYocj10W2U9dC5hY3RpdmVdKSYmKHIudGltZXIuYz1udWxsLHIudGltZXIudD1OYU4sLS10LmNvdW50P2RlbGV0ZSB0W2VdOmRlbGV0ZSB0aGlzW25dLHQuYWN0aXZlKz0uNSxyLmV2ZW50JiZyLmV2ZW50LmludGVycnVwdC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxyLmluZGV4KSl9fWZ1bmN0aW9uIFd1KG4sdCxlKXtyZXR1cm4ga28obixZbCksbi5uYW1lc3BhY2U9dCxuLmlkPWUsbn1mdW5jdGlvbiBKdShuLHQsZSxyKXt2YXIgaT1uLmlkLHU9bi5uYW1lc3BhY2U7cmV0dXJuIFkobiwiZnVuY3Rpb24iPT10eXBlb2YgZT9mdW5jdGlvbihuLG8sYSl7blt1XVtpXS50d2Vlbi5zZXQodCxyKGUuY2FsbChuLG4uX19kYXRhX18sbyxhKSkpfTooZT1yKGUpLGZ1bmN0aW9uKG4pe25bdV1baV0udHdlZW4uc2V0KHQsZSl9KSl9ZnVuY3Rpb24gR3Uobil7cmV0dXJuIG51bGw9PW4mJihuPSIiKSxmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn19ZnVuY3Rpb24gS3Uobil7cmV0dXJuIG51bGw9PW4/Il9fdHJhbnNpdGlvbl9fIjoiX190cmFuc2l0aW9uXyIrbisiX18ifWZ1bmN0aW9uIFF1KG4sdCxlLHIsaSl7ZnVuY3Rpb24gdShuKXt2YXIgdD12LmRlbGF5O3JldHVybiBmLnQ9dCtsLG4+PXQ/byhuLXQpOnZvaWQoZi5jPW8pfWZ1bmN0aW9uIG8oZSl7dmFyIGk9Zy5hY3RpdmUsdT1nW2ldO3UmJih1LnRpbWVyLmM9bnVsbCx1LnRpbWVyLnQ9TmFOLC0tZy5jb3VudCxkZWxldGUgZ1tpXSx1LmV2ZW50JiZ1LmV2ZW50LmludGVycnVwdC5jYWxsKG4sbi5fX2RhdGFfXyx1LmluZGV4KSk7Zm9yKHZhciBvIGluIGcpaWYocj4rbyl7dmFyIGM9Z1tvXTtjLnRpbWVyLmM9bnVsbCxjLnRpbWVyLnQ9TmFOLC0tZy5jb3VudCxkZWxldGUgZ1tvXX1mLmM9YSxxbihmdW5jdGlvbigpe3JldHVybiBmLmMmJmEoZXx8MSkmJihmLmM9bnVsbCxmLnQ9TmFOKSwxfSwwLGwpLGcuYWN0aXZlPXIsdi5ldmVudCYmdi5ldmVudC5zdGFydC5jYWxsKG4sbi5fX2RhdGFfXyx0KSxwPVtdLHYudHdlZW4uZm9yRWFjaChmdW5jdGlvbihlLHIpeyhyPXIuY2FsbChuLG4uX19kYXRhX18sdCkpJiZwLnB1c2gocil9KSxoPXYuZWFzZSxzPXYuZHVyYXRpb259ZnVuY3Rpb24gYShpKXtmb3IodmFyIHU9aS9zLG89aCh1KSxhPXAubGVuZ3RoO2E+MDspcFstLWFdLmNhbGwobixvKTtyZXR1cm4gdT49MT8odi5ldmVudCYmdi5ldmVudC5lbmQuY2FsbChuLG4uX19kYXRhX18sdCksLS1nLmNvdW50P2RlbGV0ZSBnW3JdOmRlbGV0ZSBuW2VdLDEpOnZvaWQgMH12YXIgbCxmLHMsaCxwLGc9bltlXXx8KG5bZV09e2FjdGl2ZTowLGNvdW50OjB9KSx2PWdbcl07dnx8KGw9aS50aW1lLGY9cW4odSwwLGwpLHY9Z1tyXT17dHdlZW46bmV3IGMsdGltZTpsLHRpbWVyOmYsZGVsYXk6aS5kZWxheSxkdXJhdGlvbjppLmR1cmF0aW9uLGVhc2U6aS5lYXNlLGluZGV4OnR9LGk9bnVsbCwrK2cuY291bnQpfWZ1bmN0aW9uIG5vKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIiwwKSJ9KX1mdW5jdGlvbiB0byhuLHQsZSl7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3ZhciByPXQobik7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIikifSl9ZnVuY3Rpb24gZW8obil7cmV0dXJuIG4udG9JU09TdHJpbmcoKX1mdW5jdGlvbiBybyhuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih0KX1mdW5jdGlvbiBpKG4sZSl7dmFyIHI9blsxXS1uWzBdLGk9ci9lLHU9YW8uYmlzZWN0KEtsLGkpO3JldHVybiB1PT1LbC5sZW5ndGg/W3QueWVhcixLaShuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi8zMTUzNmU2fSksZSlbMl1dOnU/dFtpL0tsW3UtMV08S2xbdV0vaT91LTE6dV06W3RjLEtpKG4sZSlbMl1dfXJldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gaW8obi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4odCkscik6bi5kb21haW4oKS5tYXAoaW8pfSxyLm5pY2U9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiFpc05hTihlKSYmIW4ucmFuZ2UoZSxpbygrZSsxKSx0KS5sZW5ndGh9dmFyIHU9ci5kb21haW4oKSxvPVlpKHUpLGE9bnVsbD09bj9pKG8sMTApOiJudW1iZXIiPT10eXBlb2YgbiYmaShvLG4pO3JldHVybiBhJiYobj1hWzBdLHQ9YVsxXSksci5kb21haW4oWGkodSx0PjE/e2Zsb29yOmZ1bmN0aW9uKHQpe2Zvcig7ZSh0PW4uZmxvb3IodCkpOyl0PWlvKHQtMSk7cmV0dXJuIHR9LGNlaWw6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5jZWlsKHQpKTspdD1pbygrdCsxKTtyZXR1cm4gdH19Om4pKX0sci50aWNrcz1mdW5jdGlvbihuLHQpe3ZhciBlPVlpKHIuZG9tYWluKCkpLHU9bnVsbD09bj9pKGUsMTApOiJudW1iZXIiPT10eXBlb2Ygbj9pKGUsbik6IW4ucmFuZ2UmJlt7cmFuZ2U6bn0sdF07cmV0dXJuIHUmJihuPXVbMF0sdD11WzFdKSxuLnJhbmdlKGVbMF0saW8oK2VbMV0rMSksMT50PzE6dCl9LHIudGlja0Zvcm1hdD1mdW5jdGlvbigpe3JldHVybiBlfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcm8obi5jb3B5KCksdCxlKX0sSmkocixuKX1mdW5jdGlvbiBpbyhuKXtyZXR1cm4gbmV3IERhdGUobil9ZnVuY3Rpb24gdW8obil7cmV0dXJuIEpTT04ucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIG9vKG4pe3ZhciB0PWZvLmNyZWF0ZVJhbmdlKCk7cmV0dXJuIHQuc2VsZWN0Tm9kZShmby5ib2R5KSx0LmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChuLnJlc3BvbnNlVGV4dCl9dmFyIGFvPXt2ZXJzaW9uOiIzLjUuMTcifSxsbz1bXS5zbGljZSxjbz1mdW5jdGlvbihuKXtyZXR1cm4gbG8uY2FsbChuKX0sZm89dGhpcy5kb2N1bWVudDtpZihmbyl0cnl7Y28oZm8uZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKHNvKXtjbz1mdW5jdGlvbihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1uZXcgQXJyYXkodCk7dC0tOyllW3RdPW5bdF07cmV0dXJuIGV9fWlmKERhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KSxmbyl0cnl7Zm8uY3JlYXRlRWxlbWVudCgiRElWIikuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLDAsIiIpfWNhdGNoKGhvKXt2YXIgcG89dGhpcy5FbGVtZW50LnByb3RvdHlwZSxnbz1wby5zZXRBdHRyaWJ1dGUsdm89cG8uc2V0QXR0cmlidXRlTlMseW89dGhpcy5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSxtbz15by5zZXRQcm9wZXJ0eTtwby5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24obix0KXtnby5jYWxsKHRoaXMsbix0KyIiKX0scG8uc2V0QXR0cmlidXRlTlM9ZnVuY3Rpb24obix0LGUpe3ZvLmNhbGwodGhpcyxuLHQsZSsiIil9LHlvLnNldFByb3BlcnR5PWZ1bmN0aW9uKG4sdCxlKXttby5jYWxsKHRoaXMsbix0KyIiLGUpfX1hby5hc2NlbmRpbmc9ZSxhby5kZXNjZW5kaW5nPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4+dD8tMTp0Pm4/MTp0Pj1uPzA6TmFOfSxhby5taW49ZnVuY3Rpb24obix0KXt2YXIgZSxyLGk9LTEsdT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8dTspaWYobnVsbCE9KHI9bltpXSkmJnI+PXIpe2U9cjticmVha31mb3IoOysraTx1OyludWxsIT0ocj1uW2ldKSYmZT5yJiYoZT1yKX1lbHNle2Zvcig7KytpPHU7KWlmKG51bGwhPShyPXQuY2FsbChuLG5baV0saSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK2k8dTspbnVsbCE9KHI9dC5jYWxsKG4sbltpXSxpKSkmJmU+ciYmKGU9cil9cmV0dXJuIGV9LGFvLm1heD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsaT0tMSx1PW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoOysraTx1OylpZihudWxsIT0ocj1uW2ldKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7KytpPHU7KW51bGwhPShyPW5baV0pJiZyPmUmJihlPXIpfWVsc2V7Zm9yKDsrK2k8dTspaWYobnVsbCE9KHI9dC5jYWxsKG4sbltpXSxpKSkmJnI+PXIpe2U9cjticmVha31mb3IoOysraTx1OyludWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmcj5lJiYoZT1yKX1yZXR1cm4gZX0sYW8uZXh0ZW50PWZ1bmN0aW9uKG4sdCl7dmFyIGUscixpLHU9LTEsbz1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8bzspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9aT1yO2JyZWFrfWZvcig7Kyt1PG87KW51bGwhPShyPW5bdV0pJiYoZT5yJiYoZT1yKSxyPmkmJihpPXIpKX1lbHNle2Zvcig7Kyt1PG87KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPWk9cjticmVha31mb3IoOysrdTxvOyludWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmKGU+ciYmKGU9cikscj5pJiYoaT1yKSl9cmV0dXJuW2UsaV19LGFvLnN1bT1mdW5jdGlvbihuLHQpe3ZhciBlLHI9MCx1PW4ubGVuZ3RoLG89LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK288dTspaShlPStuW29dKSYmKHIrPWUpO2Vsc2UgZm9yKDsrK288dTspaShlPSt0LmNhbGwobixuW29dLG8pKSYmKHIrPWUpO3JldHVybiByfSxhby5tZWFuPWZ1bmN0aW9uKG4sdCl7dmFyIGUsdT0wLG89bi5sZW5ndGgsYT0tMSxsPW87aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2E8bzspaShlPXIoblthXSkpP3UrPWU6LS1sO2Vsc2UgZm9yKDsrK2E8bzspaShlPXIodC5jYWxsKG4sblthXSxhKSkpP3UrPWU6LS1sO3JldHVybiBsP3UvbDp2b2lkIDB9LGFvLnF1YW50aWxlPWZ1bmN0aW9uKG4sdCl7dmFyIGU9KG4ubGVuZ3RoLTEpKnQrMSxyPU1hdGguZmxvb3IoZSksaT0rbltyLTFdLHU9ZS1yO3JldHVybiB1P2krdSoobltyXS1pKTppfSxhby5tZWRpYW49ZnVuY3Rpb24obix0KXt2YXIgdSxvPVtdLGE9bi5sZW5ndGgsbD0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrbDxhOylpKHU9cihuW2xdKSkmJm8ucHVzaCh1KTtlbHNlIGZvcig7KytsPGE7KWkodT1yKHQuY2FsbChuLG5bbF0sbCkpKSYmby5wdXNoKHUpO3JldHVybiBvLmxlbmd0aD9hby5xdWFudGlsZShvLnNvcnQoZSksLjUpOnZvaWQgMH0sYW8udmFyaWFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZSx1LG89bi5sZW5ndGgsYT0wLGw9MCxjPS0xLGY9MDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrYzxvOylpKGU9cihuW2NdKSkmJih1PWUtYSxhKz11LysrZixsKz11KihlLWEpKTtlbHNlIGZvcig7KytjPG87KWkoZT1yKHQuY2FsbChuLG5bY10sYykpKSYmKHU9ZS1hLGErPXUvKytmLGwrPXUqKGUtYSkpO3JldHVybiBmPjE/bC8oZi0xKTp2b2lkIDB9LGFvLmRldmlhdGlvbj1mdW5jdGlvbigpe3ZhciBuPWFvLnZhcmlhbmNlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbj9NYXRoLnNxcnQobik6bn07dmFyIE1vPXUoZSk7YW8uYmlzZWN0TGVmdD1Nby5sZWZ0LGFvLmJpc2VjdD1hby5iaXNlY3RSaWdodD1Nby5yaWdodCxhby5iaXNlY3Rvcj1mdW5jdGlvbihuKXtyZXR1cm4gdSgxPT09bi5sZW5ndGg/ZnVuY3Rpb24odCxyKXtyZXR1cm4gZShuKHQpLHIpfTpuKX0sYW8uc2h1ZmZsZT1mdW5jdGlvbihuLHQsZSl7KHU9YXJndW1lbnRzLmxlbmd0aCk8MyYmKGU9bi5sZW5ndGgsMj51JiYodD0wKSk7Zm9yKHZhciByLGksdT1lLXQ7dTspaT1NYXRoLnJhbmRvbSgpKnUtLXwwLHI9blt1K3RdLG5bdSt0XT1uW2krdF0sbltpK3RdPXI7cmV0dXJuIG59LGFvLnBlcm11dGU9ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPW5bdFtlXV07cmV0dXJuIHJ9LGFvLnBhaXJzPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlPTAscj1uLmxlbmd0aC0xLGk9blswXSx1PW5ldyBBcnJheSgwPnI/MDpyKTtyPmU7KXVbZV09W3Q9aSxpPW5bKytlXV07cmV0dXJuIHV9LGFvLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtpZighKGk9bi5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgdD0tMSxlPWFvLm1pbihuLG8pLHI9bmV3IEFycmF5KGUpOysrdDxlOylmb3IodmFyIGksdT0tMSxhPXJbdF09bmV3IEFycmF5KGkpOysrdTxpOylhW3VdPW5bdV1bdF07cmV0dXJuIHJ9LGFvLnppcD1mdW5jdGlvbigpe3JldHVybiBhby50cmFuc3Bvc2UoYXJndW1lbnRzKX0sYW8ua2V5cz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goZSk7cmV0dXJuIHR9LGFvLnZhbHVlcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2gobltlXSk7cmV0dXJuIHR9LGFvLmVudHJpZXM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciBlIGluIG4pdC5wdXNoKHtrZXk6ZSx2YWx1ZTpuW2VdfSk7cmV0dXJuIHR9LGFvLm1lcmdlPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsaT1uLmxlbmd0aCx1PS0xLG89MDsrK3U8aTspbys9blt1XS5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KG8pOy0taT49MDspZm9yKHI9bltpXSx0PXIubGVuZ3RoOy0tdD49MDspZVstLW9dPXJbdF07cmV0dXJuIGV9O3ZhciB4bz1NYXRoLmFiczthby5yYW5nZT1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT0xLGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9bixuPTApKSwodC1uKS9lPT09MS8wKXRocm93IG5ldyBFcnJvcigiaW5maW5pdGUgcmFuZ2UiKTt2YXIgcixpPVtdLHU9YSh4byhlKSksbz0tMTtpZihuKj11LHQqPXUsZSo9dSwwPmUpZm9yKDsocj1uK2UqKytvKT50OylpLnB1c2goci91KTtlbHNlIGZvcig7KHI9bitlKisrbyk8dDspaS5wdXNoKHIvdSk7cmV0dXJuIGl9LGFvLm1hcD1mdW5jdGlvbihuLHQpe3ZhciBlPW5ldyBjO2lmKG4gaW5zdGFuY2VvZiBjKW4uZm9yRWFjaChmdW5jdGlvbihuLHQpe2Uuc2V0KG4sdCl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkobikpe3ZhciByLGk9LTEsdT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysraTx1OyllLnNldChpLG5baV0pO2Vsc2UgZm9yKDsrK2k8dTspZS5zZXQodC5jYWxsKG4scj1uW2ldLGkpLHIpfWVsc2UgZm9yKHZhciBvIGluIG4pZS5zZXQobyxuW29dKTtyZXR1cm4gZX07dmFyIGJvPSJfX3Byb3RvX18iLF9vPSJceDAwIjtsKGMse2hhczpoLGdldDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fW2YobildfSxzZXQ6ZnVuY3Rpb24obix0KXtyZXR1cm4gdGhpcy5fW2YobildPXR9LHJlbW92ZTpwLGtleXM6Zyx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaCh0aGlzLl9bdF0pO3JldHVybiBufSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIG49W107Zm9yKHZhciB0IGluIHRoaXMuXyluLnB1c2goe2tleTpzKHQpLHZhbHVlOnRoaXMuX1t0XX0pO3JldHVybiBufSxzaXplOnYsZW1wdHk6ZCxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5jYWxsKHRoaXMscyh0KSx0aGlzLl9bdF0pfX0pLGFvLm5lc3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsbyxhKXtpZihhPj11Lmxlbmd0aClyZXR1cm4gcj9yLmNhbGwoaSxvKTplP28uc29ydChlKTpvO2Zvcih2YXIgbCxmLHMsaCxwPS0xLGc9by5sZW5ndGgsdj11W2ErK10sZD1uZXcgYzsrK3A8ZzspKGg9ZC5nZXQobD12KGY9b1twXSkpKT9oLnB1c2goZik6ZC5zZXQobCxbZl0pO3JldHVybiB0PyhmPXQoKSxzPWZ1bmN0aW9uKGUscil7Zi5zZXQoZSxuKHQscixhKSl9KTooZj17fSxzPWZ1bmN0aW9uKGUscil7ZltlXT1uKHQscixhKX0pLGQuZm9yRWFjaChzKSxmfWZ1bmN0aW9uIHQobixlKXtpZihlPj11Lmxlbmd0aClyZXR1cm4gbjt2YXIgcj1bXSxpPW9bZSsrXTtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKG4saSl7ci5wdXNoKHtrZXk6bix2YWx1ZXM6dChpLGUpfSl9KSxpP3Iuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiBpKG4ua2V5LHQua2V5KX0pOnJ9dmFyIGUscixpPXt9LHU9W10sbz1bXTtyZXR1cm4gaS5tYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbihlLHQsMCl9LGkuZW50cmllcz1mdW5jdGlvbihlKXtyZXR1cm4gdChuKGFvLm1hcCxlLDApLDApfSxpLmtleT1mdW5jdGlvbihuKXtyZXR1cm4gdS5wdXNoKG4pLGl9LGkuc29ydEtleXM9ZnVuY3Rpb24obil7cmV0dXJuIG9bdS5sZW5ndGgtMV09bixpfSxpLnNvcnRWYWx1ZXM9ZnVuY3Rpb24obil7cmV0dXJuIGU9bixpfSxpLnJvbGx1cD1mdW5jdGlvbihuKXtyZXR1cm4gcj1uLGl9LGl9LGFvLnNldD1mdW5jdGlvbihuKXt2YXIgdD1uZXcgeTtpZihuKWZvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lOysrZSl0LmFkZChuW2VdKTtyZXR1cm4gdH0sbCh5LHtoYXM6aCxhZGQ6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX1tmKG4rPSIiKV09ITAsbn0scmVtb3ZlOnAsdmFsdWVzOmcsc2l6ZTp2LGVtcHR5OmQsZm9yRWFjaDpmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gdGhpcy5fKW4uY2FsbCh0aGlzLHModCkpfX0pLGFvLmJlaGF2aW9yPXt9LGFvLnJlYmluZD1mdW5jdGlvbihuLHQpe2Zvcih2YXIgZSxyPTEsaT1hcmd1bWVudHMubGVuZ3RoOysrcjxpOyluW2U9YXJndW1lbnRzW3JdXT1NKG4sdCx0W2VdKTtyZXR1cm4gbn07dmFyIHdvPVsid2Via2l0IiwibXMiLCJtb3oiLCJNb3oiLCJvIiwiTyJdO2FvLmRpc3BhdGNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPW5ldyBfLHQ9LTEsZT1hcmd1bWVudHMubGVuZ3RoOysrdDxlOyluW2FyZ3VtZW50c1t0XV09dyhuKTtyZXR1cm4gbn0sXy5wcm90b3R5cGUub249ZnVuY3Rpb24obix0KXt2YXIgZT1uLmluZGV4T2YoIi4iKSxyPSIiO2lmKGU+PTAmJihyPW4uc2xpY2UoZSsxKSxuPW4uc2xpY2UoMCxlKSksbilyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP3RoaXNbbl0ub24ocik6dGhpc1tuXS5vbihyLHQpO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihudWxsPT10KWZvcihuIGluIHRoaXMpdGhpcy5oYXNPd25Qcm9wZXJ0eShuKSYmdGhpc1tuXS5vbihyLG51bGwpO3JldHVybiB0aGlzfX0sYW8uZXZlbnQ9bnVsbCxhby5yZXF1b3RlPWZ1bmN0aW9uKG4pe3JldHVybiBuLnJlcGxhY2UoU28sIlxcJCYiKX07dmFyIFNvPS9bXFxcXlwkXCpcK1w/XHxcW1xdXChcKVwuXHtcfV0vZyxrbz17fS5fX3Byb3RvX18/ZnVuY3Rpb24obix0KXtuLl9fcHJvdG9fXz10fTpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZSBpbiB0KW5bZV09dFtlXX0sTm89ZnVuY3Rpb24obix0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKG4pfSxFbz1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3JBbGwobil9LEFvPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bi5tYXRjaGVzfHxuW3gobiwibWF0Y2hlc1NlbGVjdG9yIildO3JldHVybihBbz1mdW5jdGlvbihuLHQpe3JldHVybiBlLmNhbGwobix0KX0pKG4sdCl9OyJmdW5jdGlvbiI9PXR5cGVvZiBTaXp6bGUmJihObz1mdW5jdGlvbihuLHQpe3JldHVybiBTaXp6bGUobix0KVswXXx8bnVsbH0sRW89U2l6emxlLEFvPVNpenpsZS5tYXRjaGVzU2VsZWN0b3IpLGFvLnNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiBhby5zZWxlY3QoZm8uZG9jdW1lbnRFbGVtZW50KX07dmFyIENvPWFvLnNlbGVjdGlvbi5wcm90b3R5cGU9W107Q28uc2VsZWN0PWZ1bmN0aW9uKG4pe3ZhciB0LGUscixpLHU9W107bj1BKG4pO2Zvcih2YXIgbz0tMSxhPXRoaXMubGVuZ3RoOysrbzxhOyl7dS5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT0ocj10aGlzW29dKS5wYXJlbnROb2RlO2Zvcih2YXIgbD0tMSxjPXIubGVuZ3RoOysrbDxjOykoaT1yW2xdKT8odC5wdXNoKGU9bi5jYWxsKGksaS5fX2RhdGFfXyxsLG8pKSxlJiYiX19kYXRhX18iaW4gaSYmKGUuX19kYXRhX189aS5fX2RhdGFfXykpOnQucHVzaChudWxsKX1yZXR1cm4gRSh1KX0sQ28uc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0LGUscj1bXTtuPUMobik7Zm9yKHZhciBpPS0xLHU9dGhpcy5sZW5ndGg7KytpPHU7KWZvcih2YXIgbz10aGlzW2ldLGE9LTEsbD1vLmxlbmd0aDsrK2E8bDspKGU9b1thXSkmJihyLnB1c2godD1jbyhuLmNhbGwoZSxlLl9fZGF0YV9fLGEsaSkpKSx0LnBhcmVudE5vZGU9ZSk7cmV0dXJuIEUocil9O3ZhciB6bz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsTG89e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOnpvLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn07YW8ubnM9e3ByZWZpeDpMbyxxdWFsaWZ5OmZ1bmN0aW9uKG4pe3ZhciB0PW4uaW5kZXhPZigiOiIpLGU9bjtyZXR1cm4gdD49MCYmInhtbG5zIiE9PShlPW4uc2xpY2UoMCx0KSkmJihuPW4uc2xpY2UodCsxKSksTG8uaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOkxvW2VdLGxvY2FsOm59Om59fSxDby5hdHRyPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpO3JldHVybiBuPWFvLm5zLnF1YWxpZnkobiksbi5sb2NhbD9lLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6ZS5nZXRBdHRyaWJ1dGUobil9Zm9yKHQgaW4gbil0aGlzLmVhY2goeih0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKHoobix0KSl9LENvLmNsYXNzZWQ9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGU9dGhpcy5ub2RlKCkscj0obj1UKG4pKS5sZW5ndGgsaT0tMTtpZih0PWUuY2xhc3NMaXN0KXtmb3IoOysraTxyOylpZighdC5jb250YWlucyhuW2ldKSlyZXR1cm4hMX1lbHNlIGZvcih0PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOysraTxyOylpZighcShuW2ldKS50ZXN0KHQpKXJldHVybiExO3JldHVybiEwfWZvcih0IGluIG4pdGhpcy5lYWNoKFIodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChSKG4sdCkpfSxDby5zdHlsZT1mdW5jdGlvbihuLGUscil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aDtpZigzPmkpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj5pJiYoZT0iIik7Zm9yKHIgaW4gbil0aGlzLmVhY2goUChyLG5bcl0sZSkpO3JldHVybiB0aGlzfWlmKDI+aSl7dmFyIHU9dGhpcy5ub2RlKCk7cmV0dXJuIHQodSkuZ2V0Q29tcHV0ZWRTdHlsZSh1LG51bGwpLmdldFByb3BlcnR5VmFsdWUobil9cj0iIn1yZXR1cm4gdGhpcy5lYWNoKFAobixlLHIpKX0sQ28ucHJvcGVydHk9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gdGhpcy5ub2RlKClbbl07Zm9yKHQgaW4gbil0aGlzLmVhY2goVSh0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKFUobix0KSl9LENvLnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PSIifTpmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn0pOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxDby5odG1sPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPSIifTpmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPW59KTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LENvLmFwcGVuZD1mdW5jdGlvbihuKXtyZXR1cm4gbj1qKG4pLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LENvLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBuPWoobiksdD1BKHQpLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pfSxDby5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKEYpfSxDby5kYXRhPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUpe3ZhciByLGksdSxvPW4ubGVuZ3RoLHM9ZS5sZW5ndGgsaD1NYXRoLm1pbihvLHMpLHA9bmV3IEFycmF5KHMpLGc9bmV3IEFycmF5KHMpLHY9bmV3IEFycmF5KG8pO2lmKHQpe3ZhciBkLHk9bmV3IGMsbT1uZXcgQXJyYXkobyk7Zm9yKHI9LTE7KytyPG87KShpPW5bcl0pJiYoeS5oYXMoZD10LmNhbGwoaSxpLl9fZGF0YV9fLHIpKT92W3JdPWk6eS5zZXQoZCxpKSxtW3JdPWQpO2ZvcihyPS0xOysrcjxzOykoaT15LmdldChkPXQuY2FsbChlLHU9ZVtyXSxyKSkpP2khPT0hMCYmKHBbcl09aSxpLl9fZGF0YV9fPXUpOmdbcl09SCh1KSx5LnNldChkLCEwKTtmb3Iocj0tMTsrK3I8bzspciBpbiBtJiZ5LmdldChtW3JdKSE9PSEwJiYodltyXT1uW3JdKX1lbHNle2ZvcihyPS0xOysrcjxoOylpPW5bcl0sdT1lW3JdLGk/KGkuX19kYXRhX189dSxwW3JdPWkpOmdbcl09SCh1KTtmb3IoO3M+cjsrK3IpZ1tyXT1IKGVbcl0pO2Zvcig7bz5yOysrcil2W3JdPW5bcl19Zy51cGRhdGU9cCxnLnBhcmVudE5vZGU9cC5wYXJlbnROb2RlPXYucGFyZW50Tm9kZT1uLnBhcmVudE5vZGUsYS5wdXNoKGcpLGwucHVzaChwKSxmLnB1c2godil9dmFyIHIsaSx1PS0xLG89dGhpcy5sZW5ndGg7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe2ZvcihuPW5ldyBBcnJheShvPShyPXRoaXNbMF0pLmxlbmd0aCk7Kyt1PG87KShpPXJbdV0pJiYoblt1XT1pLl9fZGF0YV9fKTtyZXR1cm4gbn12YXIgYT1aKFtdKSxsPUUoW10pLGY9RShbXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pZm9yKDsrK3U8bzspZShyPXRoaXNbdV0sbi5jYWxsKHIsci5wYXJlbnROb2RlLl9fZGF0YV9fLHUpKTtlbHNlIGZvcig7Kyt1PG87KWUocj10aGlzW3VdLG4pO3JldHVybiBsLmVudGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LGwuZXhpdD1mdW5jdGlvbigpe3JldHVybiBmfSxsfSxDby5kYXR1bT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsbik6dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iKX0sQ28uZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscixpPVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1PKG4pKTtmb3IodmFyIHU9MCxvPXRoaXMubGVuZ3RoO28+dTt1Kyspe2kucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9KGU9dGhpc1t1XSkucGFyZW50Tm9kZTtmb3IodmFyIGE9MCxsPWUubGVuZ3RoO2w+YTthKyspKHI9ZVthXSkmJm4uY2FsbChyLHIuX19kYXRhX18sYSx1KSYmdC5wdXNoKHIpfXJldHVybiBFKGkpfSxDby5vcmRlcj1mdW5jdGlvbigpe2Zvcih2YXIgbj0tMSx0PXRoaXMubGVuZ3RoOysrbjx0Oylmb3IodmFyIGUscj10aGlzW25dLGk9ci5sZW5ndGgtMSx1PXJbaV07LS1pPj0wOykoZT1yW2ldKSYmKHUmJnUhPT1lLm5leHRTaWJsaW5nJiZ1LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdSksdT1lKTtyZXR1cm4gdGhpc30sQ28uc29ydD1mdW5jdGlvbihuKXtuPUkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2Zvcih2YXIgdD0tMSxlPXRoaXMubGVuZ3RoOysrdDxlOyl0aGlzW3RdLnNvcnQobik7cmV0dXJuIHRoaXMub3JkZXIoKX0sQ28uZWFjaD1mdW5jdGlvbihuKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKHQsZSxyKXtuLmNhbGwodCx0Ll9fZGF0YV9fLGUscil9KX0sQ28uY2FsbD1mdW5jdGlvbihuKXt2YXIgdD1jbyhhcmd1bWVudHMpO3JldHVybiBuLmFwcGx5KHRbMF09dGhpcyx0KSx0aGlzfSxDby5lbXB0eT1mdW5jdGlvbigpe3JldHVybiF0aGlzLm5vZGUoKX0sQ28ubm9kZT1mdW5jdGlvbigpe2Zvcih2YXIgbj0wLHQ9dGhpcy5sZW5ndGg7dD5uO24rKylmb3IodmFyIGU9dGhpc1tuXSxyPTAsaT1lLmxlbmd0aDtpPnI7cisrKXt2YXIgdT1lW3JdO2lmKHUpcmV0dXJuIHV9cmV0dXJuIG51bGx9LENvLnNpemU9ZnVuY3Rpb24oKXt2YXIgbj0wO3JldHVybiBZKHRoaXMsZnVuY3Rpb24oKXsrK259KSxufTt2YXIgcW89W107YW8uc2VsZWN0aW9uLmVudGVyPVosYW8uc2VsZWN0aW9uLmVudGVyLnByb3RvdHlwZT1xbyxxby5hcHBlbmQ9Q28uYXBwZW5kLHFvLmVtcHR5PUNvLmVtcHR5LHFvLm5vZGU9Q28ubm9kZSxxby5jYWxsPUNvLmNhbGwscW8uc2l6ZT1Dby5zaXplLHFvLnNlbGVjdD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLGksdSxvPVtdLGE9LTEsbD10aGlzLmxlbmd0aDsrK2E8bDspe3I9KGk9dGhpc1thXSkudXBkYXRlLG8ucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9aS5wYXJlbnROb2RlO2Zvcih2YXIgYz0tMSxmPWkubGVuZ3RoOysrYzxmOykodT1pW2NdKT8odC5wdXNoKHJbY109ZT1uLmNhbGwoaS5wYXJlbnROb2RlLHUuX19kYXRhX18sYyxhKSksZS5fX2RhdGFfXz11Ll9fZGF0YV9fKTp0LnB1c2gobnVsbCl9cmV0dXJuIEUobyl9LHFvLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PVYodGhpcykpLENvLmluc2VydC5jYWxsKHRoaXMsbix0KX0sYW8uc2VsZWN0PWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8oZT1bTm8odCxmbyldLGUucGFyZW50Tm9kZT1mby5kb2N1bWVudEVsZW1lbnQpOihlPVt0XSxlLnBhcmVudE5vZGU9bih0KSksRShbZV0pfSxhby5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQ7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuPyh0PWNvKEVvKG4sZm8pKSx0LnBhcmVudE5vZGU9Zm8uZG9jdW1lbnRFbGVtZW50KToodD1jbyhuKSx0LnBhcmVudE5vZGU9bnVsbCksRShbdF0pfSxDby5vbj1mdW5jdGlvbihuLHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtpZigzPnIpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj5yJiYodD0hMSk7Zm9yKGUgaW4gbil0aGlzLmVhY2goWChlLG5bZV0sdCkpO3JldHVybiB0aGlzfWlmKDI+cilyZXR1cm4ocj10aGlzLm5vZGUoKVsiX19vbiIrbl0pJiZyLl87ZT0hMX1yZXR1cm4gdGhpcy5lYWNoKFgobix0LGUpKX07dmFyIFRvPWFvLm1hcCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KTtmbyYmVG8uZm9yRWFjaChmdW5jdGlvbihuKXsib24iK24gaW4gZm8mJlRvLnJlbW92ZShuKX0pO3ZhciBSbyxEbz0wO2FvLm1vdXNlPWZ1bmN0aW9uKG4pe3JldHVybiBKKG4saygpKX07dmFyIFBvPXRoaXMubmF2aWdhdG9yJiYvV2ViS2l0Ly50ZXN0KHRoaXMubmF2aWdhdG9yLnVzZXJBZ2VudCk/LTE6MDthby50b3VjaD1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT10LHQ9aygpLmNoYW5nZWRUb3VjaGVzKSx0KWZvcih2YXIgcixpPTAsdT10Lmxlbmd0aDt1Pmk7KytpKWlmKChyPXRbaV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBKKG4scil9LGFvLmJlaGF2aW9yLmRyYWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dGhpcy5vbigibW91c2Vkb3duLmRyYWciLHUpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLG8pfWZ1bmN0aW9uIGUobix0LGUsdSxvKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIG4sZSxyPXQoaCx2KTtyJiYobj1yWzBdLU1bMF0sZT1yWzFdLU1bMV0sZ3w9bnxlLE09cixwKHt0eXBlOiJkcmFnIix4OnJbMF0rY1swXSx5OnJbMV0rY1sxXSxkeDpuLGR5OmV9KSl9ZnVuY3Rpb24gbCgpe3QoaCx2KSYmKHkub24odStkLG51bGwpLm9uKG8rZCxudWxsKSxtKGcpLHAoe3R5cGU6ImRyYWdlbmQifSkpfXZhciBjLGY9dGhpcyxzPWFvLmV2ZW50LnRhcmdldC5jb3JyZXNwb25kaW5nRWxlbWVudHx8YW8uZXZlbnQudGFyZ2V0LGg9Zi5wYXJlbnROb2RlLHA9ci5vZihmLGFyZ3VtZW50cyksZz0wLHY9bigpLGQ9Ii5kcmFnIisobnVsbD09dj8iIjoiLSIrdikseT1hby5zZWxlY3QoZShzKSkub24odStkLGEpLm9uKG8rZCxsKSxtPVcocyksTT10KGgsdik7aT8oYz1pLmFwcGx5KGYsYXJndW1lbnRzKSxjPVtjLngtTVswXSxjLnktTVsxXV0pOmM9WzAsMF0scCh7dHlwZToiZHJhZ3N0YXJ0In0pfX12YXIgcj1OKG4sImRyYWciLCJkcmFnc3RhcnQiLCJkcmFnZW5kIiksaT1udWxsLHU9ZShiLGFvLm1vdXNlLHQsIm1vdXNlbW92ZSIsIm1vdXNldXAiKSxvPWUoRyxhby50b3VjaCxtLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIpO3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG4pOml9LGFvLnJlYmluZChuLHIsIm9uIil9LGFvLnRvdWNoZXM9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1rKCkudG91Y2hlcyksdD9jbyh0KS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9SihuLHQpO3JldHVybiBlLmlkZW50aWZpZXI9dC5pZGVudGlmaWVyLGV9KTpbXX07dmFyIFVvPTFlLTYsam89VW8qVW8sRm89TWF0aC5QSSxIbz0yKkZvLE9vPUhvLVVvLElvPUZvLzIsWW89Rm8vMTgwLFpvPTE4MC9GbyxWbz1NYXRoLlNRUlQyLFhvPTIsJG89NDthby5pbnRlcnBvbGF0ZVpvb209ZnVuY3Rpb24obix0KXt2YXIgZSxyLGk9blswXSx1PW5bMV0sbz1uWzJdLGE9dFswXSxsPXRbMV0sYz10WzJdLGY9YS1pLHM9bC11LGg9ZipmK3MqcztpZihqbz5oKXI9TWF0aC5sb2coYy9vKS9WbyxlPWZ1bmN0aW9uKG4pe3JldHVybltpK24qZix1K24qcyxvKk1hdGguZXhwKFZvKm4qcildfTtlbHNle3ZhciBwPU1hdGguc3FydChoKSxnPShjKmMtbypvKyRvKmgpLygyKm8qWG8qcCksdj0oYypjLW8qby0kbypoKS8oMipjKlhvKnApLGQ9TWF0aC5sb2coTWF0aC5zcXJ0KGcqZysxKS1nKSx5PU1hdGgubG9nKE1hdGguc3FydCh2KnYrMSktdik7cj0oeS1kKS9WbyxlPWZ1bmN0aW9uKG4pe3ZhciB0PW4qcixlPXJuKGQpLGE9by8oWG8qcCkqKGUqdW4oVm8qdCtkKS1lbihkKSk7cmV0dXJuW2krYSpmLHUrYSpzLG8qZS9ybihWbyp0K2QpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX0sYW8uYmVoYXZpb3Iuem9vbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7bi5vbihMLHMpLm9uKFdvKyIuem9vbSIscCkub24oImRibGNsaWNrLnpvb20iLGcpLm9uKFIsaCl9ZnVuY3Rpb24gZShuKXtyZXR1cm5bKG5bMF0tay54KS9rLmssKG5bMV0tay55KS9rLmtdfWZ1bmN0aW9uIHIobil7cmV0dXJuW25bMF0qay5rK2sueCxuWzFdKmsuaytrLnldfWZ1bmN0aW9uIGkobil7ay5rPU1hdGgubWF4KEFbMF0sTWF0aC5taW4oQVsxXSxuKSl9ZnVuY3Rpb24gdShuLHQpe3Q9cih0KSxrLngrPW5bMF0tdFswXSxrLnkrPW5bMV0tdFsxXX1mdW5jdGlvbiBvKHQsZSxyLG8pe3QuX19jaGFydF9fPXt4OmsueCx5OmsueSxrOmsua30saShNYXRoLnBvdygyLG8pKSx1KGQ9ZSxyKSx0PWFvLnNlbGVjdCh0KSxDPjAmJih0PXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKEMpKSx0LmNhbGwobi5ldmVudCl9ZnVuY3Rpb24gYSgpe2ImJmIuZG9tYWluKHgucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay54KS9rLmt9KS5tYXAoeC5pbnZlcnQpKSx3JiZ3LmRvbWFpbihfLnJhbmdlKCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLWsueSkvay5rfSkubWFwKF8uaW52ZXJ0KSl9ZnVuY3Rpb24gbChuKXt6Kyt8fG4oe3R5cGU6Inpvb21zdGFydCJ9KX1mdW5jdGlvbiBjKG4pe2EoKSxuKHt0eXBlOiJ6b29tIixzY2FsZTprLmssdHJhbnNsYXRlOltrLngsay55XX0pfWZ1bmN0aW9uIGYobil7LS16fHwobih7dHlwZToiem9vbWVuZCJ9KSxkPW51bGwpfWZ1bmN0aW9uIHMoKXtmdW5jdGlvbiBuKCl7YT0xLHUoYW8ubW91c2UoaSksaCksYyhvKX1mdW5jdGlvbiByKCl7cy5vbihxLG51bGwpLm9uKFQsbnVsbCkscChhKSxmKG8pfXZhciBpPXRoaXMsbz1ELm9mKGksYXJndW1lbnRzKSxhPTAscz1hby5zZWxlY3QodChpKSkub24ocSxuKS5vbihULHIpLGg9ZShhby5tb3VzZShpKSkscD1XKGkpO0lsLmNhbGwoaSksbChvKX1mdW5jdGlvbiBoKCl7ZnVuY3Rpb24gbigpe3ZhciBuPWFvLnRvdWNoZXMoZyk7cmV0dXJuIHA9ay5rLG4uZm9yRWFjaChmdW5jdGlvbihuKXtuLmlkZW50aWZpZXIgaW4gZCYmKGRbbi5pZGVudGlmaWVyXT1lKG4pKX0pLG59ZnVuY3Rpb24gdCgpe3ZhciB0PWFvLmV2ZW50LnRhcmdldDthby5zZWxlY3QodCkub24oeCxyKS5vbihiLGEpLF8ucHVzaCh0KTtmb3IodmFyIGU9YW8uZXZlbnQuY2hhbmdlZFRvdWNoZXMsaT0wLHU9ZS5sZW5ndGg7dT5pOysraSlkW2VbaV0uaWRlbnRpZmllcl09bnVsbDt2YXIgbD1uKCksYz1EYXRlLm5vdygpO2lmKDE9PT1sLmxlbmd0aCl7aWYoNTAwPmMtTSl7dmFyIGY9bFswXTtvKGcsZixkW2YuaWRlbnRpZmllcl0sTWF0aC5mbG9vcihNYXRoLmxvZyhrLmspL01hdGguTE4yKSsxKSxTKCl9TT1jfWVsc2UgaWYobC5sZW5ndGg+MSl7dmFyIGY9bFswXSxzPWxbMV0saD1mWzBdLXNbMF0scD1mWzFdLXNbMV07eT1oKmgrcCpwfX1mdW5jdGlvbiByKCl7dmFyIG4sdCxlLHIsbz1hby50b3VjaGVzKGcpO0lsLmNhbGwoZyk7Zm9yKHZhciBhPTAsbD1vLmxlbmd0aDtsPmE7KythLHI9bnVsbClpZihlPW9bYV0scj1kW2UuaWRlbnRpZmllcl0pe2lmKHQpYnJlYWs7bj1lLHQ9cn1pZihyKXt2YXIgZj0oZj1lWzBdLW5bMF0pKmYrKGY9ZVsxXS1uWzFdKSpmLHM9eSYmTWF0aC5zcXJ0KGYveSk7bj1bKG5bMF0rZVswXSkvMiwoblsxXStlWzFdKS8yXSx0PVsodFswXStyWzBdKS8yLCh0WzFdK3JbMV0pLzJdLGkocypwKX1NPW51bGwsdShuLHQpLGModil9ZnVuY3Rpb24gYSgpe2lmKGFvLmV2ZW50LnRvdWNoZXMubGVuZ3RoKXtmb3IodmFyIHQ9YW8uZXZlbnQuY2hhbmdlZFRvdWNoZXMsZT0wLHI9dC5sZW5ndGg7cj5lOysrZSlkZWxldGUgZFt0W2VdLmlkZW50aWZpZXJdO2Zvcih2YXIgaSBpbiBkKXJldHVybiB2b2lkIG4oKX1hby5zZWxlY3RBbGwoXykub24obSxudWxsKSx3Lm9uKEwscykub24oUixoKSxOKCksZih2KX12YXIgcCxnPXRoaXMsdj1ELm9mKGcsYXJndW1lbnRzKSxkPXt9LHk9MCxtPSIuem9vbS0iK2FvLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIseD0idG91Y2htb3ZlIittLGI9InRvdWNoZW5kIittLF89W10sdz1hby5zZWxlY3QoZyksTj1XKGcpO3QoKSxsKHYpLHcub24oTCxudWxsKS5vbihSLHQpfWZ1bmN0aW9uIHAoKXt2YXIgbj1ELm9mKHRoaXMsYXJndW1lbnRzKTttP2NsZWFyVGltZW91dChtKTooSWwuY2FsbCh0aGlzKSx2PWUoZD15fHxhby5tb3VzZSh0aGlzKSksbChuKSksbT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bT1udWxsLGYobil9LDUwKSxTKCksaShNYXRoLnBvdygyLC4wMDIqQm8oKSkqay5rKSx1KGQsdiksYyhuKX1mdW5jdGlvbiBnKCl7dmFyIG49YW8ubW91c2UodGhpcyksdD1NYXRoLmxvZyhrLmspL01hdGguTE4yO28odGhpcyxuLGUobiksYW8uZXZlbnQuc2hpZnRLZXk/TWF0aC5jZWlsKHQpLTE6TWF0aC5mbG9vcih0KSsxKX12YXIgdixkLHksbSxNLHgsYixfLHcsaz17eDowLHk6MCxrOjF9LEU9Wzk2MCw1MDBdLEE9Sm8sQz0yNTAsej0wLEw9Im1vdXNlZG93bi56b29tIixxPSJtb3VzZW1vdmUuem9vbSIsVD0ibW91c2V1cC56b29tIixSPSJ0b3VjaHN0YXJ0Lnpvb20iLEQ9TihuLCJ6b29tc3RhcnQiLCJ6b29tIiwiem9vbWVuZCIpO3JldHVybiBXb3x8KFdvPSJvbndoZWVsImluIGZvPyhCbz1mdW5jdGlvbigpe3JldHVybi1hby5ldmVudC5kZWx0YVkqKGFvLmV2ZW50LmRlbHRhTW9kZT8xMjA6MSl9LCJ3aGVlbCIpOiJvbm1vdXNld2hlZWwiaW4gZm8/KEJvPWZ1bmN0aW9uKCl7cmV0dXJuIGFvLmV2ZW50LndoZWVsRGVsdGF9LCJtb3VzZXdoZWVsIik6KEJvPWZ1bmN0aW9uKCl7cmV0dXJuLWFvLmV2ZW50LmRldGFpbH0sIk1vek1vdXNlUGl4ZWxTY3JvbGwiKSksbi5ldmVudD1mdW5jdGlvbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1ELm9mKHRoaXMsYXJndW1lbnRzKSx0PWs7SGw/YW8uc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC56b29tIixmdW5jdGlvbigpe2s9dGhpcy5fX2NoYXJ0X198fHt4OjAseTowLGs6MX0sbChuKX0pLnR3ZWVuKCJ6b29tOnpvb20iLGZ1bmN0aW9uKCl7dmFyIGU9RVswXSxyPUVbMV0saT1kP2RbMF06ZS8yLHU9ZD9kWzFdOnIvMixvPWFvLmludGVycG9sYXRlWm9vbShbKGktay54KS9rLmssKHUtay55KS9rLmssZS9rLmtdLFsoaS10LngpL3QuaywodS10LnkpL3QuayxlL3Qua10pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1vKHQpLGE9ZS9yWzJdO3RoaXMuX19jaGFydF9fPWs9e3g6aS1yWzBdKmEseTp1LXJbMV0qYSxrOmF9LGMobil9fSkuZWFjaCgiaW50ZXJydXB0Lnpvb20iLGZ1bmN0aW9uKCl7ZihuKX0pLmVhY2goImVuZC56b29tIixmdW5jdGlvbigpe2Yobil9KToodGhpcy5fX2NoYXJ0X189ayxsKG4pLGMobiksZihuKSl9KX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGs9e3g6K3RbMF0seTordFsxXSxrOmsua30sYSgpLG4pOltrLngsay55XX0sbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDprLngseTprLnksazpudWxsfSxpKCt0KSxhKCksbik6ay5rfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPW51bGw9PXQ/Sm86Wyt0WzBdLCt0WzFdXSxuKTpBfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT10JiZbK3RbMF0sK3RbMV1dLG4pOnl9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT10JiZbK3RbMF0sK3RbMV1dLG4pOkV9LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEM9K3Qsbik6Q30sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXQseD10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6Yn0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PXQsXz10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6d30sYW8ucmViaW5kKG4sRCwib24iKX07dmFyIEJvLFdvLEpvPVswLDEvMF07YW8uY29sb3I9YW4sYW4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LGFvLmhzbD1sbjt2YXIgR289bG4ucHJvdG90eXBlPW5ldyBhbjtHby5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGxuKHRoaXMuaCx0aGlzLnMsdGhpcy5sL24pfSxHby5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBsbih0aGlzLmgsdGhpcy5zLG4qdGhpcy5sKX0sR28ucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGNuKHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sYW8uaGNsPWZuO3ZhciBLbz1mbi5wcm90b3R5cGU9bmV3IGFuO0tvLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZm4odGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK1FvKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0sS28uZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZm4odGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC1RbyooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LEtvLnJnYj1mdW5jdGlvbigpe3JldHVybiBzbih0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LGFvLmxhYj1objt2YXIgUW89MTgsbmE9Ljk1MDQ3LHRhPTEsZWE9MS4wODg4MyxyYT1obi5wcm90b3R5cGU9bmV3IGFuO3JhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaG4oTWF0aC5taW4oMTAwLHRoaXMubCtRbyooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0scmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaG4oTWF0aC5tYXgoMCx0aGlzLmwtUW8qKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LHJhLnJnYj1mdW5jdGlvbigpe3JldHVybiBwbih0aGlzLmwsdGhpcy5hLHRoaXMuYil9LGFvLnJnYj1tbjt2YXIgaWE9bW4ucHJvdG90eXBlPW5ldyBhbjtpYS5icmlnaHRlcj1mdW5jdGlvbihuKXtuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKTt2YXIgdD10aGlzLnIsZT10aGlzLmcscj10aGlzLmIsaT0zMDtyZXR1cm4gdHx8ZXx8cj8odCYmaT50JiYodD1pKSxlJiZpPmUmJihlPWkpLHImJmk+ciYmKHI9aSksbmV3IG1uKE1hdGgubWluKDI1NSx0L24pLE1hdGgubWluKDI1NSxlL24pLE1hdGgubWluKDI1NSxyL24pKSk6bmV3IG1uKGksaSxpKX0saWEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgbW4obip0aGlzLnIsbip0aGlzLmcsbip0aGlzLmIpfSxpYS5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gd24odGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxpYS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIitibih0aGlzLnIpK2JuKHRoaXMuZykrYm4odGhpcy5iKX07dmFyIHVhPWFvLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7dWEuZm9yRWFjaChmdW5jdGlvbihuLHQpe3VhLnNldChuLE1uKHQpKX0pLGFvLmZ1bmN0b3I9RW4sYW8ueGhyPUFuKG0pLGFvLmRzdj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlLHUpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKHU9ZSxlPW51bGwpO3ZhciBvPUNuKG4sdCxudWxsPT1lP3I6aShlKSx1KTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShudWxsPT0oZT1uKT9yOmkobikpOmV9LG99ZnVuY3Rpb24gcihuKXtyZXR1cm4gZS5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucGFyc2UodC5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIHUodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4obil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gYS50ZXN0KG4pPyciJytuLnJlcGxhY2UoL1wiL2csJyIiJykrJyInOm59dmFyIGE9bmV3IFJlZ0V4cCgnWyInK24rIlxuXSIpLGw9bi5jaGFyQ29kZUF0KDApO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4sdCl7dmFyIHI7cmV0dXJuIGUucGFyc2VSb3dzKG4sZnVuY3Rpb24obixlKXtpZihyKXJldHVybiByKG4sZS0xKTt2YXIgaT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobikrIjogZFsiK3QrIl0ifSkuam9pbigiLCIpKyJ9Iik7cj10P2Z1bmN0aW9uKG4sZSl7cmV0dXJuIHQoaShuKSxlKX06aX0pfSxlLnBhcnNlUm93cz1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXtpZihmPj1jKXJldHVybiBvO2lmKGkpcmV0dXJuIGk9ITEsdTt2YXIgdD1mO2lmKDM0PT09bi5jaGFyQ29kZUF0KHQpKXtmb3IodmFyIGU9dDtlKys8YzspaWYoMzQ9PT1uLmNoYXJDb2RlQXQoZSkpe2lmKDM0IT09bi5jaGFyQ29kZUF0KGUrMSkpYnJlYWs7KytlfWY9ZSsyO3ZhciByPW4uY2hhckNvZGVBdChlKzEpO3JldHVybiAxMz09PXI/KGk9ITAsMTA9PT1uLmNoYXJDb2RlQXQoZSsyKSYmKytmKToxMD09PXImJihpPSEwKSxuLnNsaWNlKHQrMSxlKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDtjPmY7KXt2YXIgcj1uLmNoYXJDb2RlQXQoZisrKSxhPTE7aWYoMTA9PT1yKWk9ITA7ZWxzZSBpZigxMz09PXIpaT0hMCwxMD09PW4uY2hhckNvZGVBdChmKSYmKCsrZiwrK2EpO2Vsc2UgaWYociE9PWwpY29udGludWU7cmV0dXJuIG4uc2xpY2UodCxmLWEpfXJldHVybiBuLnNsaWNlKHQpfWZvcih2YXIgcixpLHU9e30sbz17fSxhPVtdLGM9bi5sZW5ndGgsZj0wLHM9MDsocj1lKCkpIT09bzspe2Zvcih2YXIgaD1bXTtyIT09dSYmciE9PW87KWgucHVzaChyKSxyPWUoKTt0JiZudWxsPT0oaD10KGgscysrKSl8fGEucHVzaChoKX1yZXR1cm4gYX0sZS5mb3JtYXQ9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSlyZXR1cm4gZS5mb3JtYXRSb3dzKHQpO3ZhciByPW5ldyB5LGk9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilyLmhhcyh0KXx8aS5wdXNoKHIuYWRkKHQpKX0pLFtpLm1hcChvKS5qb2luKG4pXS5jb25jYXQodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKHRbbl0pfSkuam9pbihuKX0pKS5qb2luKCJcbiIpfSxlLmZvcm1hdFJvd3M9ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKHUpLmpvaW4oIlxuIil9LGV9LGFvLmNzdj1hby5kc3YoIiwiLCJ0ZXh0L2NzdiIpLGFvLnRzdj1hby5kc3YoIgkiLCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIik7dmFyIG9hLGFhLGxhLGNhLGZhPXRoaXNbeCh0aGlzLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKG4pe3NldFRpbWVvdXQobiwxNyl9O2FvLnRpbWVyPWZ1bmN0aW9uKCl7cW4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhby50aW1lci5mbHVzaD1mdW5jdGlvbigpe1JuKCksRG4oKX0sYW8ucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9O3ZhciBzYT1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoVW4pO2FvLmZvcm1hdFByZWZpeD1mdW5jdGlvbihuLHQpe3ZhciBlPTA7cmV0dXJuKG49K24pJiYoMD5uJiYobio9LTEpLHQmJihuPWFvLnJvdW5kKG4sUG4obix0KSkpLGU9MStNYXRoLmZsb29yKDFlLTEyK01hdGgubG9nKG4pL01hdGguTE4xMCksZT1NYXRoLm1heCgtMjQsTWF0aC5taW4oMjQsMypNYXRoLmZsb29yKChlLTEpLzMpKSkpLHNhWzgrZS8zXX07dmFyIGhhPS8oPzooW157XSk/KFs8Pj1eXSkpPyhbK1wtIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLi0/XGQrKT8oW2EteiVdKT8vaSxwYT1hby5tYXAoe2I6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24obil7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobil9LG86ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoOCl9LHg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpfSxYOmZ1bmN0aW9uKG4pe3JldHVybiBuLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSxnOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9QcmVjaXNpb24odCl9LGU6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0V4cG9uZW50aWFsKHQpfSxmOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9GaXhlZCh0KX0scjpmdW5jdGlvbihuLHQpe3JldHVybihuPWFvLnJvdW5kKG4sUG4obix0KSkpLnRvRml4ZWQoTWF0aC5tYXgoMCxNYXRoLm1pbigyMCxQbihuKigxKzFlLTE1KSx0KSkpKX19KSxnYT1hby50aW1lPXt9LHZhPURhdGU7SG4ucHJvdG90eXBlPXtnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCl9LGdldERheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCl9LGdldEZ1bGxZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpfSxnZXRIb3VyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKX0sZ2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKX0sZ2V0TWludXRlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpfSxnZXRNb250aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKX0sZ2V0U2Vjb25kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpfSxnZXRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRUaW1lKCl9LGdldFRpbWV6b25lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLnZhbHVlT2YoKX0sc2V0RGF0ZTpmdW5jdGlvbigpe2RhLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldERheTpmdW5jdGlvbigpe2RhLnNldFVUQ0RheS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtkYS5zZXRVVENGdWxsWWVhci5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0SG91cnM6ZnVuY3Rpb24oKXtkYS5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7ZGEuc2V0VVRDTWlsbGlzZWNvbmRzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaW51dGVzOmZ1bmN0aW9uKCl7ZGEuc2V0VVRDTWludXRlcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TW9udGg6ZnVuY3Rpb24oKXtkYS5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0U2Vjb25kczpmdW5jdGlvbigpe2RhLnNldFVUQ1NlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldFRpbWU6ZnVuY3Rpb24oKXtkYS5zZXRUaW1lLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfX07dmFyIGRhPURhdGUucHJvdG90eXBlO2dhLnllYXI9T24oZnVuY3Rpb24obil7cmV0dXJuIG49Z2EuZGF5KG4pLG4uc2V0TW9udGgoMCwxKSxufSxmdW5jdGlvbihuLHQpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK3QpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRGdWxsWWVhcigpfSksZ2EueWVhcnM9Z2EueWVhci5yYW5nZSxnYS55ZWFycy51dGM9Z2EueWVhci51dGMucmFuZ2UsZ2EuZGF5PU9uKGZ1bmN0aW9uKG4pe3ZhciB0PW5ldyB2YSgyZTMsMCk7cmV0dXJuIHQuc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKSksdH0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERhdGUoKS0xfSksZ2EuZGF5cz1nYS5kYXkucmFuZ2UsZ2EuZGF5cy51dGM9Z2EuZGF5LnV0Yy5yYW5nZSxnYS5kYXlPZlllYXI9ZnVuY3Rpb24obil7dmFyIHQ9Z2EueWVhcihuKTtyZXR1cm4gTWF0aC5mbG9vcigobi10LTZlNCoobi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkpLzg2NGU1KX0sWyJzdW5kYXkiLCJtb25kYXkiLCJ0dWVzZGF5Iiwid2VkbmVzZGF5IiwidGh1cnNkYXkiLCJmcmlkYXkiLCJzYXR1cmRheSJdLmZvckVhY2goZnVuY3Rpb24obix0KXt0PTctdDt2YXIgZT1nYVtuXT1PbihmdW5jdGlvbihuKXtyZXR1cm4obj1nYS5kYXkobikpLnNldERhdGUobi5nZXREYXRlKCktKG4uZ2V0RGF5KCkrdCklNyksbn0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrNypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7dmFyIGU9Z2EueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoZ2EuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpLShlIT09dCl9KTtnYVtuKyJzIl09ZS5yYW5nZSxnYVtuKyJzIl0udXRjPWUudXRjLnJhbmdlLGdhW24rIk9mWWVhciJdPWZ1bmN0aW9uKG4pe3ZhciBlPWdhLnllYXIobikuZ2V0RGF5KCk7cmV0dXJuIE1hdGguZmxvb3IoKGdhLmRheU9mWWVhcihuKSsoZSt0KSU3KS83KX19KSxnYS53ZWVrPWdhLnN1bmRheSxnYS53ZWVrcz1nYS5zdW5kYXkucmFuZ2UsZ2Eud2Vla3MudXRjPWdhLnN1bmRheS51dGMucmFuZ2UsZ2Eud2Vla09mWWVhcj1nYS5zdW5kYXlPZlllYXI7dmFyIHlhPXsiLSI6IiIsXzoiICIsMDoiMCJ9LG1hPS9eXHMqXGQrLyxNYT0vXiUvO2FvLmxvY2FsZT1mdW5jdGlvbihuKXtyZXR1cm57bnVtYmVyRm9ybWF0OmpuKG4pLHRpbWVGb3JtYXQ6WW4obil9fTt2YXIgeGE9YW8ubG9jYWxlKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXSxkYXRlVGltZToiJWEgJWIgJWUgJVggJVkiLGRhdGU6IiVtLyVkLyVZIix0aW1lOiIlSDolTTolUyIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSwKc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7YW8uZm9ybWF0PXhhLm51bWJlckZvcm1hdCxhby5nZW89e30sZnQucHJvdG90eXBlPXtzOjAsdDowLGFkZDpmdW5jdGlvbihuKXtzdChuLHRoaXMudCxiYSksc3QoYmEucyx0aGlzLnMsdGhpcyksdGhpcy5zP3RoaXMudCs9YmEudDp0aGlzLnM9YmEudH0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIGJhPW5ldyBmdDthby5nZW8uc3RyZWFtPWZ1bmN0aW9uKG4sdCl7biYmX2EuaGFzT3duUHJvcGVydHkobi50eXBlKT9fYVtuLnR5cGVdKG4sdCk6aHQobix0KX07dmFyIF9hPXtGZWF0dXJlOmZ1bmN0aW9uKG4sdCl7aHQobi5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWh0KGVbcl0uZ2VvbWV0cnksdCl9fSx3YT17U3BoZXJlOmZ1bmN0aW9uKG4sdCl7dC5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24obix0KXtuPW4uY29vcmRpbmF0ZXMsdC5wb2ludChuWzBdLG5bMV0sblsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KW49ZVtyXSx0LnBvaW50KG5bMF0sblsxXSxuWzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbihuLHQpe3B0KG4uY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylwdChlW3JdLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24obix0KXtndChuLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWd0KGVbcl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmdlb21ldHJpZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylodChlW3JdLHQpfX07YW8uZ2VvLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIFNhPTAsYW8uZ2VvLnN0cmVhbShuLE5hKSxTYX07dmFyIFNhLGthPW5ldyBmdCxOYT17c3BoZXJlOmZ1bmN0aW9uKCl7U2ErPTQqRm99LHBvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2thLnJlc2V0KCksTmEubGluZVN0YXJ0PXZ0fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIG49MiprYTtTYSs9MD5uPzQqRm8rbjpuLE5hLmxpbmVTdGFydD1OYS5saW5lRW5kPU5hLnBvaW50PWJ9fTthby5nZW8uYm91bmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe00ucHVzaCh4PVtmPW4saD1uXSkscz50JiYocz10KSx0PnAmJihwPXQpfWZ1bmN0aW9uIHQodCxlKXt2YXIgcj1kdChbdCpZbyxlKllvXSk7aWYoeSl7dmFyIGk9bXQoeSxyKSx1PVtpWzFdLC1pWzBdLDBdLG89bXQodSxpKTtidChvKSxvPV90KG8pO3ZhciBsPXQtZyxjPWw+MD8xOi0xLHY9b1swXSpabypjLGQ9eG8obCk+MTgwO2lmKGReKHY+YypnJiZjKnQ+dikpe3ZhciBtPW9bMV0qWm87bT5wJiYocD1tKX1lbHNlIGlmKHY9KHYrMzYwKSUzNjAtMTgwLGReKHY+YypnJiZjKnQ+dikpe3ZhciBtPS1vWzFdKlpvO3M+bSYmKHM9bSl9ZWxzZSBzPmUmJihzPWUpLGU+cCYmKHA9ZSk7ZD9nPnQ/YShmLHQpPmEoZixoKSYmKGg9dCk6YSh0LGgpPmEoZixoKSYmKGY9dCk6aD49Zj8oZj50JiYoZj10KSx0PmgmJihoPXQpKTp0Pmc/YShmLHQpPmEoZixoKSYmKGg9dCk6YSh0LGgpPmEoZixoKSYmKGY9dCl9ZWxzZSBuKHQsZSk7eT1yLGc9dH1mdW5jdGlvbiBlKCl7Yi5wb2ludD10fWZ1bmN0aW9uIHIoKXt4WzBdPWYseFsxXT1oLGIucG9pbnQ9bix5PW51bGx9ZnVuY3Rpb24gaShuLGUpe2lmKHkpe3ZhciByPW4tZzttKz14byhyKT4xODA/cisocj4wPzM2MDotMzYwKTpyfWVsc2Ugdj1uLGQ9ZTtOYS5wb2ludChuLGUpLHQobixlKX1mdW5jdGlvbiB1KCl7TmEubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbygpe2kodixkKSxOYS5saW5lRW5kKCkseG8obSk+VW8mJihmPS0oaD0xODApKSx4WzBdPWYseFsxXT1oLHk9bnVsbH1mdW5jdGlvbiBhKG4sdCl7cmV0dXJuKHQtPW4pPDA/dCszNjA6dH1mdW5jdGlvbiBsKG4sdCl7cmV0dXJuIG5bMF0tdFswXX1mdW5jdGlvbiBjKG4sdCl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgZixzLGgscCxnLHYsZCx5LG0sTSx4LGI9e3BvaW50Om4sbGluZVN0YXJ0OmUsbGluZUVuZDpyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2IucG9pbnQ9aSxiLmxpbmVTdGFydD11LGIubGluZUVuZD1vLG09MCxOYS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe05hLnBvbHlnb25FbmQoKSxiLnBvaW50PW4sYi5saW5lU3RhcnQ9ZSxiLmxpbmVFbmQ9ciwwPmthPyhmPS0oaD0xODApLHM9LShwPTkwKSk6bT5Vbz9wPTkwOi1Vbz5tJiYocz0tOTApLHhbMF09Zix4WzFdPWh9fTtyZXR1cm4gZnVuY3Rpb24obil7cD1oPS0oZj1zPTEvMCksTT1bXSxhby5nZW8uc3RyZWFtKG4sYik7dmFyIHQ9TS5sZW5ndGg7aWYodCl7TS5zb3J0KGwpO2Zvcih2YXIgZSxyPTEsaT1NWzBdLHU9W2ldO3Q+cjsrK3IpZT1NW3JdLGMoZVswXSxpKXx8YyhlWzFdLGkpPyhhKGlbMF0sZVsxXSk+YShpWzBdLGlbMV0pJiYoaVsxXT1lWzFdKSxhKGVbMF0saVsxXSk+YShpWzBdLGlbMV0pJiYoaVswXT1lWzBdKSk6dS5wdXNoKGk9ZSk7Zm9yKHZhciBvLGUsZz0tKDEvMCksdD11Lmxlbmd0aC0xLHI9MCxpPXVbdF07dD49cjtpPWUsKytyKWU9dVtyXSwobz1hKGlbMV0sZVswXSkpPmcmJihnPW8sZj1lWzBdLGg9aVsxXSl9cmV0dXJuIE09eD1udWxsLGY9PT0xLzB8fHM9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbZixzXSxbaCxwXV19fSgpLGFvLmdlby5jZW50cm9pZD1mdW5jdGlvbihuKXtFYT1BYT1DYT16YT1MYT1xYT1UYT1SYT1EYT1QYT1VYT0wLGFvLmdlby5zdHJlYW0obixqYSk7dmFyIHQ9RGEsZT1QYSxyPVVhLGk9dCp0K2UqZStyKnI7cmV0dXJuIGpvPmkmJih0PXFhLGU9VGEscj1SYSxVbz5BYSYmKHQ9Q2EsZT16YSxyPUxhKSxpPXQqdCtlKmUrcipyLGpvPmkpP1tOYU4sTmFOXTpbTWF0aC5hdGFuMihlLHQpKlpvLHRuKHIvTWF0aC5zcXJ0KGkpKSpab119O3ZhciBFYSxBYSxDYSx6YSxMYSxxYSxUYSxSYSxEYSxQYSxVYSxqYT17c3BoZXJlOmIscG9pbnQ6U3QsbGluZVN0YXJ0Ok50LGxpbmVFbmQ6RXQscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7amEubGluZVN0YXJ0PUF0fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7amEubGluZVN0YXJ0PU50fX0sRmE9UnQoenQsanQsSHQsWy1GbywtRm8vMl0pLEhhPTFlOTthby5nZW8uY2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciBuLHQsZSxyLGksdSxvPXtzdHJlYW06ZnVuY3Rpb24obil7cmV0dXJuIGkmJihpLnZhbGlkPSExKSxpPXUobiksaS52YWxpZD0hMCxpfSxleHRlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9WnQobj0rYVswXVswXSx0PSthWzBdWzFdLGU9K2FbMV1bMF0scj0rYVsxXVsxXSksaSYmKGkudmFsaWQ9ITEsaT1udWxsKSxvKTpbW24sdF0sW2Uscl1dfX07cmV0dXJuIG8uZXh0ZW50KFtbMCwwXSxbOTYwLDUwMF1dKX0sKGFvLmdlby5jb25pY0VxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBWdChYdCl9KS5yYXc9WHQsYW8uZ2VvLmFsYmVycz1mdW5jdGlvbigpe3JldHVybiBhby5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKX0sYW8uZ2VvLmFsYmVyc1VzYT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7dmFyIHU9blswXSxvPW5bMV07cmV0dXJuIHQ9bnVsbCxlKHUsbyksdHx8KHIodSxvKSx0KXx8aSh1LG8pLHR9dmFyIHQsZSxyLGksdT1hby5nZW8uYWxiZXJzKCksbz1hby5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGE9YW8uZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGw9e3BvaW50OmZ1bmN0aW9uKG4sZSl7dD1bbixlXX19O3JldHVybiBuLmludmVydD1mdW5jdGlvbihuKXt2YXIgdD11LnNjYWxlKCksZT11LnRyYW5zbGF0ZSgpLHI9KG5bMF0tZVswXSkvdCxpPShuWzFdLWVbMV0pL3Q7cmV0dXJuKGk+PS4xMiYmLjIzND5pJiZyPj0tLjQyNSYmLS4yMTQ+cj9vOmk+PS4xNjYmJi4yMzQ+aSYmcj49LS4yMTQmJi0uMTE1PnI/YTp1KS5pbnZlcnQobil9LG4uc3RyZWFtPWZ1bmN0aW9uKG4pe3ZhciB0PXUuc3RyZWFtKG4pLGU9by5zdHJlYW0obikscj1hLnN0cmVhbShuKTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obixpKXt0LnBvaW50KG4saSksZS5wb2ludChuLGkpLHIucG9pbnQobixpKX0sc3BoZXJlOmZ1bmN0aW9uKCl7dC5zcGhlcmUoKSxlLnNwaGVyZSgpLHIuc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksZS5saW5lU3RhcnQoKSxyLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dC5saW5lRW5kKCksZS5saW5lRW5kKCksci5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCksZS5wb2x5Z29uU3RhcnQoKSxyLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksZS5wb2x5Z29uRW5kKCksci5wb2x5Z29uRW5kKCl9fX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHUucHJlY2lzaW9uKHQpLG8ucHJlY2lzaW9uKHQpLGEucHJlY2lzaW9uKHQpLG4pOnUucHJlY2lzaW9uKCl9LG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHUuc2NhbGUodCksby5zY2FsZSguMzUqdCksYS5zY2FsZSh0KSxuLnRyYW5zbGF0ZSh1LnRyYW5zbGF0ZSgpKSk6dS5zY2FsZSgpfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdS50cmFuc2xhdGUoKTt2YXIgYz11LnNjYWxlKCksZj0rdFswXSxzPSt0WzFdO3JldHVybiBlPXUudHJhbnNsYXRlKHQpLmNsaXBFeHRlbnQoW1tmLS40NTUqYyxzLS4yMzgqY10sW2YrLjQ1NSpjLHMrLjIzOCpjXV0pLnN0cmVhbShsKS5wb2ludCxyPW8udHJhbnNsYXRlKFtmLS4zMDcqYyxzKy4yMDEqY10pLmNsaXBFeHRlbnQoW1tmLS40MjUqYytVbyxzKy4xMipjK1VvXSxbZi0uMjE0KmMtVW8scysuMjM0KmMtVW9dXSkuc3RyZWFtKGwpLnBvaW50LGk9YS50cmFuc2xhdGUoW2YtLjIwNSpjLHMrLjIxMipjXSkuY2xpcEV4dGVudChbW2YtLjIxNCpjK1VvLHMrLjE2NipjK1VvXSxbZi0uMTE1KmMtVW8scysuMjM0KmMtVW9dXSkuc3RyZWFtKGwpLnBvaW50LG59LG4uc2NhbGUoMTA3MCl9O3ZhciBPYSxJYSxZYSxaYSxWYSxYYSwkYT17cG9pbnQ6YixsaW5lU3RhcnQ6YixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7SWE9MCwkYS5saW5lU3RhcnQ9JHR9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXskYS5saW5lU3RhcnQ9JGEubGluZUVuZD0kYS5wb2ludD1iLE9hKz14byhJYS8yKX19LEJhPXtwb2ludDpCdCxsaW5lU3RhcnQ6YixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmIscG9seWdvbkVuZDpifSxXYT17cG9pbnQ6R3QsbGluZVN0YXJ0Okt0LGxpbmVFbmQ6UXQscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7V2EubGluZVN0YXJ0PW5lfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7V2EucG9pbnQ9R3QsV2EubGluZVN0YXJ0PUt0LFdhLmxpbmVFbmQ9UXR9fTthby5nZW8ucGF0aD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG4mJigiZnVuY3Rpb24iPT10eXBlb2YgYSYmdS5wb2ludFJhZGl1cygrYS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLG8mJm8udmFsaWR8fChvPWkodSkpLGFvLmdlby5zdHJlYW0obixvKSksdS5yZXN1bHQoKX1mdW5jdGlvbiB0KCl7cmV0dXJuIG89bnVsbCxufXZhciBlLHIsaSx1LG8sYT00LjU7cmV0dXJuIG4uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gT2E9MCxhby5nZW8uc3RyZWFtKG4saSgkYSkpLE9hfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3JldHVybiBDYT16YT1MYT1xYT1UYT1SYT1EYT1QYT1VYT0wLGFvLmdlby5zdHJlYW0obixpKFdhKSksVWE/W0RhL1VhLFBhL1VhXTpSYT9bcWEvUmEsVGEvUmFdOkxhP1tDYS9MYSx6YS9MYV06W05hTixOYU5dfSxuLmJvdW5kcz1mdW5jdGlvbihuKXtyZXR1cm4gVmE9WGE9LShZYT1aYT0xLzApLGFvLmdlby5zdHJlYW0obixpKEJhKSksW1tZYSxaYV0sW1ZhLFhhXV19LG4ucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0oZT1uKT9uLnN0cmVhbXx8cmUobik6bSx0KCkpOmV9LG4uY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsPT0ocj1uKT9uZXcgV3Q6bmV3IHRlKG4pLCJmdW5jdGlvbiIhPXR5cGVvZiBhJiZ1LnBvaW50UmFkaXVzKGEpLHQoKSk6cn0sbi5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Oih1LnBvaW50UmFkaXVzKCt0KSwrdCksbik6YX0sbi5wcm9qZWN0aW9uKGFvLmdlby5hbGJlcnNVc2EoKSkuY29udGV4dChudWxsKX0sYW8uZ2VvLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtyZXR1cm57c3RyZWFtOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBpZSh0KTtmb3IodmFyIHIgaW4gbillW3JdPW5bcl07cmV0dXJuIGV9fX0saWUucHJvdG90eXBlPXtwb2ludDpmdW5jdGlvbihuLHQpe3RoaXMuc3RyZWFtLnBvaW50KG4sdCl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fSxhby5nZW8ucHJvamVjdGlvbj1vZSxhby5nZW8ucHJvamVjdGlvbk11dGF0b3I9YWUsKGFvLmdlby5lcXVpcmVjdGFuZ3VsYXI9ZnVuY3Rpb24oKXtyZXR1cm4gb2UoY2UpfSkucmF3PWNlLmludmVydD1jZSxhby5nZW8ucm90YXRpb249ZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdD1uKHRbMF0qWW8sdFsxXSpZbyksdFswXSo9Wm8sdFsxXSo9Wm8sdH1yZXR1cm4gbj1zZShuWzBdJTM2MCpZbyxuWzFdKllvLG4ubGVuZ3RoPjI/blsyXSpZbzowKSx0LmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdD1uLmludmVydCh0WzBdKllvLHRbMV0qWW8pLHRbMF0qPVpvLHRbMV0qPVpvLHR9LHR9LGZlLmludmVydD1jZSxhby5nZW8uY2lyY2xlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIsdD1zZSgtblswXSpZbywtblsxXSpZbywwKS5pbnZlcnQsaT1bXTtyZXR1cm4gZShudWxsLG51bGwsMSx7cG9pbnQ6ZnVuY3Rpb24obixlKXtpLnB1c2gobj10KG4sZSkpLG5bMF0qPVpvLG5bMV0qPVpvfX0pLHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaV19fXZhciB0LGUscj1bMCwwXSxpPTY7cmV0dXJuIG4ub3JpZ2luPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5hbmdsZT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT12ZSgodD0rcikqWW8saSpZbyksbik6dH0sbi5wcmVjaXNpb249ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dmUodCpZbywoaT0rcikqWW8pLG4pOml9LG4uYW5nbGUoOTApfSxhby5nZW8uZGlzdGFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZSxyPSh0WzBdLW5bMF0pKllvLGk9blsxXSpZbyx1PXRbMV0qWW8sbz1NYXRoLnNpbihyKSxhPU1hdGguY29zKHIpLGw9TWF0aC5zaW4oaSksYz1NYXRoLmNvcyhpKSxmPU1hdGguc2luKHUpLHM9TWF0aC5jb3ModSk7cmV0dXJuIE1hdGguYXRhbjIoTWF0aC5zcXJ0KChlPXMqbykqZSsoZT1jKmYtbCpzKmEpKmUpLGwqZitjKnMqYSl9LGFvLmdlby5ncmF0aWN1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dCgpfX1mdW5jdGlvbiB0KCl7cmV0dXJuIGFvLnJhbmdlKE1hdGguY2VpbCh1L2QpKmQsaSxkKS5tYXAoaCkuY29uY2F0KGFvLnJhbmdlKE1hdGguY2VpbChjL3kpKnksbCx5KS5tYXAocCkpLmNvbmNhdChhby5yYW5nZShNYXRoLmNlaWwoci9nKSpnLGUsZykuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiB4byhuJWQpPlVvfSkubWFwKGYpKS5jb25jYXQoYW8ucmFuZ2UoTWF0aC5jZWlsKGEvdikqdixvLHYpLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4geG8obiV5KT5Vb30pLm1hcChzKSl9dmFyIGUscixpLHUsbyxhLGwsYyxmLHMsaCxwLGc9MTAsdj1nLGQ9OTAseT0zNjAsbT0yLjU7cmV0dXJuIG4ubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bn19KX0sbi5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltoKHUpLmNvbmNhdChwKGwpLnNsaWNlKDEpLGgoaSkucmV2ZXJzZSgpLnNsaWNlKDEpLHAoYykucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSxuLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uLm1ham9yRXh0ZW50KHQpLm1pbm9yRXh0ZW50KHQpOm4ubWlub3JFeHRlbnQoKX0sbi5tYWpvckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdFswXVswXSxpPSt0WzFdWzBdLGM9K3RbMF1bMV0sbD0rdFsxXVsxXSx1PmkmJih0PXUsdT1pLGk9dCksYz5sJiYodD1jLGM9bCxsPXQpLG4ucHJlY2lzaW9uKG0pKTpbW3UsY10sW2ksbF1dfSxuLm1pbm9yRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sYT0rdFswXVsxXSxvPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSxhPm8mJih0PWEsYT1vLG89dCksbi5wcmVjaXNpb24obSkpOltbcixhXSxbZSxvXV19LG4uc3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uLm1ham9yU3RlcCh0KS5taW5vclN0ZXAodCk6bi5taW5vclN0ZXAoKX0sbi5tYWpvclN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9K3RbMF0seT0rdFsxXSxuKTpbZCx5XX0sbi5taW5vclN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9K3RbMF0sdj0rdFsxXSxuKTpbZyx2XX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09K3QsZj15ZShhLG8sOTApLHM9bWUocixlLG0pLGg9eWUoYyxsLDkwKSxwPW1lKHUsaSxtKSxuKTptfSxuLm1ham9yRXh0ZW50KFtbLTE4MCwtOTArVW9dLFsxODAsOTAtVW9dXSkubWlub3JFeHRlbnQoW1stMTgwLC04MC1Vb10sWzE4MCw4MCtVb11dKX0sYW8uZ2VvLmdyZWF0QXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpbdHx8ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZXx8aS5hcHBseSh0aGlzLGFyZ3VtZW50cyldfX12YXIgdCxlLHI9TWUsaT14ZTtyZXR1cm4gbi5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiBhby5nZW8uZGlzdGFuY2UodHx8ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZXx8aS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxuLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/bnVsbDplLG4pOnJ9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsZT0iZnVuY3Rpb24iPT10eXBlb2YgdD9udWxsOnQsbik6aX0sbi5wcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uOjB9LG59LGFvLmdlby5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuLHQpe3JldHVybiBiZShuWzBdKllvLG5bMV0qWW8sdFswXSpZbyx0WzFdKllvKX0sYW8uZ2VvLmxlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gSmE9MCxhby5nZW8uc3RyZWFtKG4sR2EpLEphfTt2YXIgSmEsR2E9e3NwaGVyZTpiLHBvaW50OmIsbGluZVN0YXJ0Ol9lLGxpbmVFbmQ6Yixwb2x5Z29uU3RhcnQ6Yixwb2x5Z29uRW5kOmJ9LEthPXdlKGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnNxcnQoMi8oMStuKSl9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXNpbihuLzIpfSk7KGFvLmdlby5hemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gb2UoS2EpfSkucmF3PUthO3ZhciBRYT13ZShmdW5jdGlvbihuKXt2YXIgdD1NYXRoLmFjb3Mobik7cmV0dXJuIHQmJnQvTWF0aC5zaW4odCl9LG0pOyhhby5nZW8uYXppbXV0aGFsRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gb2UoUWEpfSkucmF3PVFhLChhby5nZW8uY29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4gVnQoU2UpfSkucmF3PVNlLChhby5nZW8uY29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBWdChrZSl9KS5yYXc9a2U7dmFyIG5sPXdlKGZ1bmN0aW9uKG4pe3JldHVybiAxL259LE1hdGguYXRhbik7KGFvLmdlby5nbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiBvZShubCl9KS5yYXc9bmwsTmUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuW24sMipNYXRoLmF0YW4oTWF0aC5leHAodCkpLUlvXX0sKGFvLmdlby5tZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBFZShOZSl9KS5yYXc9TmU7dmFyIHRsPXdlKGZ1bmN0aW9uKCl7cmV0dXJuIDF9LE1hdGguYXNpbik7KGFvLmdlby5vcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gb2UodGwpfSkucmF3PXRsO3ZhciBlbD13ZShmdW5jdGlvbihuKXtyZXR1cm4gMS8oMStuKX0sZnVuY3Rpb24obil7cmV0dXJuIDIqTWF0aC5hdGFuKG4pfSk7KGFvLmdlby5zdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIG9lKGVsKX0pLnJhdz1lbCxBZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm5bLXQsMipNYXRoLmF0YW4oTWF0aC5leHAobikpLUlvXX0sKGFvLmdlby50cmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgbj1FZShBZSksdD1uLmNlbnRlcixlPW4ucm90YXRlO3JldHVybiBuLmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj90KFstblsxXSxuWzBdXSk6KG49dCgpLFtuWzFdLC1uWzBdXSl9LG4ucm90YXRlPWZ1bmN0aW9uKG4pe3JldHVybiBuP2UoW25bMF0sblsxXSxuLmxlbmd0aD4yP25bMl0rOTA6OTBdKToobj1lKCksW25bMF0sblsxXSxuWzJdLTkwXSl9LGUoWzAsMCw5MF0pfSkucmF3PUFlLGFvLmdlb209e30sYW8uZ2VvbS5odWxsPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQobil7aWYobi5sZW5ndGg8MylyZXR1cm5bXTt2YXIgdCxpPUVuKGUpLHU9RW4ociksbz1uLmxlbmd0aCxhPVtdLGw9W107Zm9yKHQ9MDtvPnQ7dCsrKWEucHVzaChbK2kuY2FsbCh0aGlzLG5bdF0sdCksK3UuY2FsbCh0aGlzLG5bdF0sdCksdF0pO2ZvcihhLnNvcnQocWUpLHQ9MDtvPnQ7dCsrKWwucHVzaChbYVt0XVswXSwtYVt0XVsxXV0pO3ZhciBjPUxlKGEpLGY9TGUobCkscz1mWzBdPT09Y1swXSxoPWZbZi5sZW5ndGgtMV09PT1jW2MubGVuZ3RoLTFdLHA9W107Zm9yKHQ9Yy5sZW5ndGgtMTt0Pj0wOy0tdClwLnB1c2goblthW2NbdF1dWzJdXSk7Zm9yKHQ9K3M7dDxmLmxlbmd0aC1oOysrdClwLnB1c2goblthW2ZbdF1dWzJdXSk7cmV0dXJuIHB9dmFyIGU9Q2Uscj16ZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90KG4pOih0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0KX0sYW8uZ2VvbS5wb2x5Z29uPWZ1bmN0aW9uKG4pe3JldHVybiBrbyhuLHJsKSxufTt2YXIgcmw9YW8uZ2VvbS5wb2x5Z29uLnByb3RvdHlwZT1bXTtybC5hcmVhPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQ9LTEsZT10aGlzLmxlbmd0aCxyPXRoaXNbZS0xXSxpPTA7Kyt0PGU7KW49cixyPXRoaXNbdF0saSs9blsxXSpyWzBdLW5bMF0qclsxXTtyZXR1cm4uNSppfSxybC5jZW50cm9pZD1mdW5jdGlvbihuKXt2YXIgdCxlLHI9LTEsaT10aGlzLmxlbmd0aCx1PTAsbz0wLGE9dGhpc1tpLTFdO2Zvcihhcmd1bWVudHMubGVuZ3RofHwobj0tMS8oNip0aGlzLmFyZWEoKSkpOysrcjxpOyl0PWEsYT10aGlzW3JdLGU9dFswXSphWzFdLWFbMF0qdFsxXSx1Kz0odFswXSthWzBdKSplLG8rPSh0WzFdK2FbMV0pKmU7cmV0dXJuW3UqbixvKm5dfSxybC5jbGlwPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsaSx1LG8sYT1EZShuKSxsPS0xLGM9dGhpcy5sZW5ndGgtRGUodGhpcyksZj10aGlzW2MtMV07KytsPGM7KXtmb3IodD1uLnNsaWNlKCksbi5sZW5ndGg9MCxpPXRoaXNbbF0sdT10WyhyPXQubGVuZ3RoLWEpLTFdLGU9LTE7KytlPHI7KW89dFtlXSxUZShvLGYsaSk/KFRlKHUsZixpKXx8bi5wdXNoKFJlKHUsbyxmLGkpKSxuLnB1c2gobykpOlRlKHUsZixpKSYmbi5wdXNoKFJlKHUsbyxmLGkpKSx1PW87YSYmbi5wdXNoKG5bMF0pLGY9aX1yZXR1cm4gbn07dmFyIGlsLHVsLG9sLGFsLGxsLGNsPVtdLGZsPVtdO1llLnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQ9dGhpcy5lZGdlcyxlPXQubGVuZ3RoO2UtLTspbj10W2VdLmVkZ2Usbi5iJiZuLmF8fHQuc3BsaWNlKGUsMSk7cmV0dXJuIHQuc29ydChWZSksdC5sZW5ndGh9LHRyLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmE6dGhpcy5lZGdlLmJ9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2UubD09PXRoaXMuc2l0ZT90aGlzLmVkZ2UuYjp0aGlzLmVkZ2UuYX19LGVyLnByb3RvdHlwZT17aW5zZXJ0OmZ1bmN0aW9uKG4sdCl7dmFyIGUscixpO2lmKG4pe2lmKHQuUD1uLHQuTj1uLk4sbi5OJiYobi5OLlA9dCksbi5OPXQsbi5SKXtmb3Iobj1uLlI7bi5MOyluPW4uTDtuLkw9dH1lbHNlIG4uUj10O2U9bn1lbHNlIHRoaXMuXz8obj1vcih0aGlzLl8pLHQuUD1udWxsLHQuTj1uLG4uUD1uLkw9dCxlPW4pOih0LlA9dC5OPW51bGwsdGhpcy5fPXQsZT1udWxsKTtmb3IodC5MPXQuUj1udWxsLHQuVT1lLHQuQz0hMCxuPXQ7ZSYmZS5DOylyPWUuVSxlPT09ci5MPyhpPXIuUixpJiZpLkM/KGUuQz1pLkM9ITEsci5DPSEwLG49cik6KG49PT1lLlImJihpcih0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCx1cih0aGlzLHIpKSk6KGk9ci5MLGkmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsbj1yKToobj09PWUuTCYmKHVyKHRoaXMsZSksbj1lLGU9bi5VKSxlLkM9ITEsci5DPSEwLGlyKHRoaXMscikpKSxlPW4uVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKG4pe24uTiYmKG4uTi5QPW4uUCksbi5QJiYobi5QLk49bi5OKSxuLk49bi5QPW51bGw7dmFyIHQsZSxyLGk9bi5VLHU9bi5MLG89bi5SO2lmKGU9dT9vP29yKG8pOnU6byxpP2kuTD09PW4/aS5MPWU6aS5SPWU6dGhpcy5fPWUsdSYmbz8ocj1lLkMsZS5DPW4uQyxlLkw9dSx1LlU9ZSxlIT09bz8oaT1lLlUsZS5VPW4uVSxuPWUuUixpLkw9bixlLlI9byxvLlU9ZSk6KGUuVT1pLGk9ZSxuPWUuUikpOihyPW4uQyxuPWUpLG4mJihuLlU9aSksIXIpe2lmKG4mJm4uQylyZXR1cm4gdm9pZChuLkM9ITEpO2Rve2lmKG49PT10aGlzLl8pYnJlYWs7aWYobj09PWkuTCl7aWYodD1pLlIsdC5DJiYodC5DPSExLGkuQz0hMCxpcih0aGlzLGkpLHQ9aS5SKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LlImJnQuUi5DfHwodC5MLkM9ITEsdC5DPSEwLHVyKHRoaXMsdCksdD1pLlIpLHQuQz1pLkMsaS5DPXQuUi5DPSExLGlyKHRoaXMsaSksbj10aGlzLl87YnJlYWt9fWVsc2UgaWYodD1pLkwsdC5DJiYodC5DPSExLGkuQz0hMCx1cih0aGlzLGkpLHQ9aS5MKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LkwmJnQuTC5DfHwodC5SLkM9ITEsdC5DPSEwLGlyKHRoaXMsdCksdD1pLkwpLHQuQz1pLkMsaS5DPXQuTC5DPSExLHVyKHRoaXMsaSksbj10aGlzLl87YnJlYWt9dC5DPSEwLG49aSxpPWkuVX13aGlsZSghbi5DKTtuJiYobi5DPSExKX19fSxhby5nZW9tLnZvcm9ub2k9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXt2YXIgdD1uZXcgQXJyYXkobi5sZW5ndGgpLHI9YVswXVswXSxpPWFbMF1bMV0sdT1hWzFdWzBdLG89YVsxXVsxXTtyZXR1cm4gYXIoZShuKSxhKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUsYSl7dmFyIGw9ZS5lZGdlcyxjPWUuc2l0ZSxmPXRbYV09bC5sZW5ndGg/bC5tYXAoZnVuY3Rpb24obil7dmFyIHQ9bi5zdGFydCgpO3JldHVyblt0LngsdC55XX0pOmMueD49ciYmYy54PD11JiZjLnk+PWkmJmMueTw9bz9bW3Isb10sW3Usb10sW3UsaV0sW3IsaV1dOltdO2YucG9pbnQ9blthXX0pLHR9ZnVuY3Rpb24gZShuKXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm57eDpNYXRoLnJvdW5kKHUobix0KS9VbykqVW8seTpNYXRoLnJvdW5kKG8obix0KS9VbykqVW8saTp0fX0pfXZhciByPUNlLGk9emUsdT1yLG89aSxhPXNsO3JldHVybiBuP3Qobik6KHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyKGUobikpLmVkZ2VzLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gbi5sJiZuLnJ9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuW3QubC5pXSx0YXJnZXQ6blt0LnIuaV19fSl9LHQudHJpYW5nbGVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO3JldHVybiBhcihlKG4pKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7Zm9yKHZhciBpLHUsbz1lLnNpdGUsYT1lLmVkZ2VzLnNvcnQoVmUpLGw9LTEsYz1hLmxlbmd0aCxmPWFbYy0xXS5lZGdlLHM9Zi5sPT09bz9mLnI6Zi5sOysrbDxjOylpPWYsdT1zLGY9YVtsXS5lZGdlLHM9Zi5sPT09bz9mLnI6Zi5sLHI8dS5pJiZyPHMuaSYmY3Iobyx1LHMpPDAmJnQucHVzaChbbltyXSxuW3UuaV0sbltzLmldXSl9KSx0fSx0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9RW4ocj1uKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RW4oaT1uKSx0KTppfSx0LmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bnVsbD09bj9zbDpuLHQpOmE9PT1zbD9udWxsOmF9LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LmNsaXBFeHRlbnQobiYmW1swLDBdLG5dKTphPT09c2w/bnVsbDphJiZhWzFdfSx0KX07dmFyIHNsPVtbLTFlNiwtMWU2XSxbMWU2LDFlNl1dO2FvLmdlb20uZGVsYXVuYXk9ZnVuY3Rpb24obil7cmV0dXJuIGFvLmdlb20udm9yb25vaSgpLnRyaWFuZ2xlcyhuKX0sYW8uZ2VvbS5xdWFkdHJlZT1mdW5jdGlvbihuLHQsZSxyLGkpe2Z1bmN0aW9uIHUobil7ZnVuY3Rpb24gdShuLHQsZSxyLGksdSxvLGEpe2lmKCFpc05hTihlKSYmIWlzTmFOKHIpKWlmKG4ubGVhZil7dmFyIGw9bi54LGY9bi55O2lmKG51bGwhPWwpaWYoeG8obC1lKSt4byhmLXIpPC4wMSljKG4sdCxlLHIsaSx1LG8sYSk7ZWxzZXt2YXIgcz1uLnBvaW50O24ueD1uLnk9bi5wb2ludD1udWxsLGMobixzLGwsZixpLHUsbyxhKSxjKG4sdCxlLHIsaSx1LG8sYSl9ZWxzZSBuLng9ZSxuLnk9cixuLnBvaW50PXR9ZWxzZSBjKG4sdCxlLHIsaSx1LG8sYSl9ZnVuY3Rpb24gYyhuLHQsZSxyLGksbyxhLGwpe3ZhciBjPS41KihpK2EpLGY9LjUqKG8rbCkscz1lPj1jLGg9cj49ZixwPWg8PDF8cztuLmxlYWY9ITEsbj1uLm5vZGVzW3BdfHwobi5ub2Rlc1twXT1ocigpKSxzP2k9YzphPWMsaD9vPWY6bD1mLHUobix0LGUscixpLG8sYSxsKX12YXIgZixzLGgscCxnLHYsZCx5LG0sTT1FbihhKSx4PUVuKGwpO2lmKG51bGwhPXQpdj10LGQ9ZSx5PXIsbT1pO2Vsc2UgaWYoeT1tPS0odj1kPTEvMCkscz1bXSxoPVtdLGc9bi5sZW5ndGgsbylmb3IocD0wO2c+cDsrK3ApZj1uW3BdLGYueDx2JiYodj1mLngpLGYueTxkJiYoZD1mLnkpLGYueD55JiYoeT1mLngpLGYueT5tJiYobT1mLnkpLHMucHVzaChmLngpLGgucHVzaChmLnkpO2Vsc2UgZm9yKHA9MDtnPnA7KytwKXt2YXIgYj0rTShmPW5bcF0scCksXz0reChmLHApO3Y+YiYmKHY9YiksZD5fJiYoZD1fKSxiPnkmJih5PWIpLF8+bSYmKG09Xykscy5wdXNoKGIpLGgucHVzaChfKX12YXIgdz15LXYsUz1tLWQ7dz5TP209ZCt3Onk9ditTO3ZhciBrPWhyKCk7aWYoay5hZGQ9ZnVuY3Rpb24obil7dShrLG4sK00obiwrK3ApLCt4KG4scCksdixkLHksbSl9LGsudmlzaXQ9ZnVuY3Rpb24obil7cHIobixrLHYsZCx5LG0pfSxrLmZpbmQ9ZnVuY3Rpb24obil7cmV0dXJuIGdyKGssblswXSxuWzFdLHYsZCx5LG0pfSxwPS0xLG51bGw9PXQpe2Zvcig7KytwPGc7KXUoayxuW3BdLHNbcF0saFtwXSx2LGQseSxtKTstLXB9ZWxzZSBuLmZvckVhY2goay5hZGQpO3JldHVybiBzPWg9bj1mPW51bGwsa312YXIgbyxhPUNlLGw9emU7cmV0dXJuKG89YXJndW1lbnRzLmxlbmd0aCk/KGE9ZnIsbD1zciwzPT09byYmKGk9ZSxyPXQsZT10PTApLHUobikpOih1Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bix1KTphfSx1Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bix1KTpsfSx1LmV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj90PWU9cj1pPW51bGw6KHQ9K25bMF1bMF0sZT0rblswXVsxXSxyPStuWzFdWzBdLGk9K25bMV1bMV0pLHUpOm51bGw9PXQ/bnVsbDpbW3QsZV0sW3IsaV1dfSx1LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9aT1udWxsOih0PWU9MCxyPStuWzBdLGk9K25bMV0pLHUpOm51bGw9PXQ/bnVsbDpbci10LGktZV19LHUpfSxhby5pbnRlcnBvbGF0ZVJnYj12cixhby5pbnRlcnBvbGF0ZU9iamVjdD1kcixhby5pbnRlcnBvbGF0ZU51bWJlcj15cixhby5pbnRlcnBvbGF0ZVN0cmluZz1tcjt2YXIgaGw9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLHBsPW5ldyBSZWdFeHAoaGwuc291cmNlLCJnIik7YW8uaW50ZXJwb2xhdGU9TXIsYW8uaW50ZXJwb2xhdG9ycz1bZnVuY3Rpb24obix0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4oInN0cmluZyI9PT1lP3VhLmhhcyh0LnRvTG93ZXJDYXNlKCkpfHwvXigjfHJnYlwofGhzbFwoKS9pLnRlc3QodCk/dnI6bXI6dCBpbnN0YW5jZW9mIGFuP3ZyOkFycmF5LmlzQXJyYXkodCk/eHI6Im9iamVjdCI9PT1lJiZpc05hTih0KT9kcjp5cikobix0KX1dLGFvLmludGVycG9sYXRlQXJyYXk9eHI7dmFyIGdsPWZ1bmN0aW9uKCl7cmV0dXJuIG19LHZsPWFvLm1hcCh7bGluZWFyOmdsLHBvbHk6RXIscXVhZDpmdW5jdGlvbigpe3JldHVybiBTcn0sY3ViaWM6ZnVuY3Rpb24oKXtyZXR1cm4ga3J9LHNpbjpmdW5jdGlvbigpe3JldHVybiBBcn0sZXhwOmZ1bmN0aW9uKCl7cmV0dXJuIENyfSxjaXJjbGU6ZnVuY3Rpb24oKXtyZXR1cm4genJ9LGVsYXN0aWM6THIsYmFjazpxcixib3VuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gVHJ9fSksZGw9YW8ubWFwKHsiaW4iOm0sb3V0Ol9yLCJpbi1vdXQiOndyLCJvdXQtaW4iOmZ1bmN0aW9uKG4pe3JldHVybiB3cihfcihuKSl9fSk7YW8uZWFzZT1mdW5jdGlvbihuKXt2YXIgdD1uLmluZGV4T2YoIi0iKSxlPXQ+PTA/bi5zbGljZSgwLHQpOm4scj10Pj0wP24uc2xpY2UodCsxKToiaW4iO3JldHVybiBlPXZsLmdldChlKXx8Z2wscj1kbC5nZXQocil8fG0sYnIocihlLmFwcGx5KG51bGwsbG8uY2FsbChhcmd1bWVudHMsMSkpKSl9LGFvLmludGVycG9sYXRlSGNsPVJyLGFvLmludGVycG9sYXRlSHNsPURyLGFvLmludGVycG9sYXRlTGFiPVByLGFvLmludGVycG9sYXRlUm91bmQ9VXIsYW8udHJhbnNmb3JtPWZ1bmN0aW9uKG4pe3ZhciB0PWZvLmNyZWF0ZUVsZW1lbnROUyhhby5ucy5wcmVmaXguc3ZnLCJnIik7cmV0dXJuKGFvLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtpZihudWxsIT1uKXt0LnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIixuKTt2YXIgZT10LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCl9cmV0dXJuIG5ldyBqcihlP2UubWF0cml4OnlsKX0pKG4pfSxqci5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy50cmFuc2xhdGUrIilyb3RhdGUoIit0aGlzLnJvdGF0ZSsiKXNrZXdYKCIrdGhpcy5za2V3KyIpc2NhbGUoIit0aGlzLnNjYWxlKyIpIn07dmFyIHlsPXthOjEsYjowLGM6MCxkOjEsZTowLGY6MH07YW8uaW50ZXJwb2xhdGVUcmFuc2Zvcm09JHIsYW8ubGF5b3V0PXt9LGFvLmxheW91dC5idW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKHZhciB0PVtdLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5wdXNoKEpyKG5bZV0pKTtyZXR1cm4gdH19LGFvLmxheW91dC5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbixjLHMsaCxwLGc9e30sdj1bXSxkPWFvLnJhbmdlKHUpLHk9W107Zm9yKGU9W10scj1bXSxuPTAsaD0tMTsrK2g8dTspe2ZvcihjPTAscD0tMTsrK3A8dTspYys9aVtoXVtwXTt2LnB1c2goYykseS5wdXNoKGFvLnJhbmdlKHUpKSxuKz1jfWZvcihvJiZkLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gbyh2W25dLHZbdF0pfSksYSYmeS5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7bi5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGEoaVt0XVtuXSxpW3RdW2VdKX0pfSksbj0oSG8tZip1KS9uLGM9MCxoPS0xOysraDx1Oyl7Zm9yKHM9YyxwPS0xOysrcDx1Oyl7dmFyIG09ZFtoXSxNPXlbbV1bcF0seD1pW21dW01dLGI9YyxfPWMrPXgqbjtnW20rIi0iK01dPXtpbmRleDptLHN1YmluZGV4Ok0sc3RhcnRBbmdsZTpiLGVuZEFuZ2xlOl8sdmFsdWU6eH19clttXT17aW5kZXg6bSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6Yyx2YWx1ZTp2W21dfSxjKz1mfWZvcihoPS0xOysraDx1Oylmb3IocD1oLTE7KytwPHU7KXt2YXIgdz1nW2grIi0iK3BdLFM9Z1twKyItIitoXTsody52YWx1ZXx8Uy52YWx1ZSkmJmUucHVzaCh3LnZhbHVlPFMudmFsdWU/e3NvdXJjZTpTLHRhcmdldDp3fTp7c291cmNlOncsdGFyZ2V0OlN9KX1sJiZ0KCl9ZnVuY3Rpb24gdCgpe2Uuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiBsKChuLnNvdXJjZS52YWx1ZStuLnRhcmdldC52YWx1ZSkvMiwodC5zb3VyY2UudmFsdWUrdC50YXJnZXQudmFsdWUpLzIpfSl9dmFyIGUscixpLHUsbyxhLGwsYz17fSxmPTA7cmV0dXJuIGMubWF0cml4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PShpPW4pJiZpLmxlbmd0aCxlPXI9bnVsbCxjKTppfSxjLnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bixlPXI9bnVsbCxjKTpmfSxjLnNvcnRHcm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bixlPXI9bnVsbCxjKTpvfSxjLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixlPW51bGwsYyk6YX0sYy5zb3J0Q2hvcmRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4sZSYmdCgpLGMpOmx9LGMuY2hvcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fG4oKSxlfSxjLmdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiByfHxuKCkscn0sY30sYW8ubGF5b3V0LmZvcmNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsaSl7aWYodC5wb2ludCE9PW4pe3ZhciB1PXQuY3gtbi54LG89dC5jeS1uLnksYT1pLWUsbD11KnUrbypvO2lmKGw+YSphL3kpe2lmKHY+bCl7dmFyIGM9dC5jaGFyZ2UvbDtuLnB4LT11KmMsbi5weS09bypjfXJldHVybiEwfWlmKHQucG9pbnQmJmwmJnY+bCl7dmFyIGM9dC5wb2ludENoYXJnZS9sO24ucHgtPXUqYyxuLnB5LT1vKmN9fXJldHVybiF0LmNoYXJnZX19ZnVuY3Rpb24gdChuKXtuLnB4PWFvLmV2ZW50Lngsbi5weT1hby5ldmVudC55LGwucmVzdW1lKCl9dmFyIGUscixpLHUsbyxhLGw9e30sYz1hby5kaXNwYXRjaCgic3RhcnQiLCJ0aWNrIiwiZW5kIiksZj1bMSwxXSxzPS45LGg9bWwscD1NbCxnPS0zMCx2PXhsLGQ9LjEseT0uNjQsTT1bXSx4PVtdO3JldHVybiBsLnRpY2s9ZnVuY3Rpb24oKXtpZigoaSo9Ljk5KTwuMDA1KXJldHVybiBlPW51bGwsYy5lbmQoe3R5cGU6ImVuZCIsYWxwaGE6aT0wfSksITA7dmFyIHQscixsLGgscCx2LHksbSxiLF89TS5sZW5ndGgsdz14Lmxlbmd0aDtmb3Iocj0wO3c+cjsrK3IpbD14W3JdLGg9bC5zb3VyY2UscD1sLnRhcmdldCxtPXAueC1oLngsYj1wLnktaC55LCh2PW0qbStiKmIpJiYodj1pKm9bcl0qKCh2PU1hdGguc3FydCh2KSktdVtyXSkvdixtKj12LGIqPXYscC54LT1tKih5PWgud2VpZ2h0K3Aud2VpZ2h0P2gud2VpZ2h0LyhoLndlaWdodCtwLndlaWdodCk6LjUpLHAueS09Yip5LGgueCs9bSooeT0xLXkpLGgueSs9Yip5KTtpZigoeT1pKmQpJiYobT1mWzBdLzIsYj1mWzFdLzIscj0tMSx5KSlmb3IoOysrcjxfOylsPU1bcl0sbC54Kz0obS1sLngpKnksbC55Kz0oYi1sLnkpKnk7aWYoZylmb3IocmkodD1hby5nZW9tLnF1YWR0cmVlKE0pLGksYSkscj0tMTsrK3I8XzspKGw9TVtyXSkuZml4ZWR8fHQudmlzaXQobihsKSk7Zm9yKHI9LTE7KytyPF87KWw9TVtyXSxsLmZpeGVkPyhsLng9bC5weCxsLnk9bC5weSk6KGwueC09KGwucHgtKGwucHg9bC54KSkqcyxsLnktPShsLnB5LShsLnB5PWwueSkpKnMpO2MudGljayh7dHlwZToidGljayIsYWxwaGE6aX0pfSxsLm5vZGVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPW4sbCk6TX0sbC5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1uLGwpOnh9LGwuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1uLGwpOmZ9LGwubGlua0Rpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sbCk6aH0sbC5kaXN0YW5jZT1sLmxpbmtEaXN0YW5jZSxsLmxpbmtTdHJlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGwpOnB9LGwuZnJpY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K24sbCk6c30sbC5jaGFyZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixsKTpnfSxsLmNoYXJnZURpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PW4qbixsKTpNYXRoLnNxcnQodil9LGwuZ3Jhdml0eT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rbixsKTpkfSxsLnRoZXRhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PW4qbixsKTpNYXRoLnNxcnQoeSl9LGwuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K24saT9uPjA/aT1uOihlLmM9bnVsbCxlLnQ9TmFOLGU9bnVsbCxjLmVuZCh7dHlwZToiZW5kIixhbHBoYTppPTB9KSk6bj4wJiYoYy5zdGFydCh7dHlwZToic3RhcnQiLGFscGhhOmk9bn0pLGU9cW4obC50aWNrKSksbCk6aX0sbC5zdGFydD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixyKXtpZighZSl7Zm9yKGU9bmV3IEFycmF5KGkpLGw9MDtpPmw7KytsKWVbbF09W107Zm9yKGw9MDtjPmw7KytsKXt2YXIgdT14W2xdO2VbdS5zb3VyY2UuaW5kZXhdLnB1c2godS50YXJnZXQpLGVbdS50YXJnZXQuaW5kZXhdLnB1c2godS5zb3VyY2UpfX1mb3IodmFyIG8sYT1lW3RdLGw9LTEsZj1hLmxlbmd0aDsrK2w8ZjspaWYoIWlzTmFOKG89YVtsXVtuXSkpcmV0dXJuIG87cmV0dXJuIE1hdGgucmFuZG9tKCkqcn12YXIgdCxlLHIsaT1NLmxlbmd0aCxjPXgubGVuZ3RoLHM9ZlswXSx2PWZbMV07Zm9yKHQ9MDtpPnQ7Kyt0KShyPU1bdF0pLmluZGV4PXQsci53ZWlnaHQ9MDtmb3IodD0wO2M+dDsrK3Qpcj14W3RdLCJudW1iZXIiPT10eXBlb2Ygci5zb3VyY2UmJihyLnNvdXJjZT1NW3Iuc291cmNlXSksIm51bWJlciI9PXR5cGVvZiByLnRhcmdldCYmKHIudGFyZ2V0PU1bci50YXJnZXRdKSwrK3Iuc291cmNlLndlaWdodCwrK3IudGFyZ2V0LndlaWdodDtmb3IodD0wO2k+dDsrK3Qpcj1NW3RdLGlzTmFOKHIueCkmJihyLng9bigieCIscykpLGlzTmFOKHIueSkmJihyLnk9bigieSIsdikpLGlzTmFOKHIucHgpJiYoci5weD1yLngpLGlzTmFOKHIucHkpJiYoci5weT1yLnkpO2lmKHU9W10sImZ1bmN0aW9uIj09dHlwZW9mIGgpZm9yKHQ9MDtjPnQ7Kyt0KXVbdF09K2guY2FsbCh0aGlzLHhbdF0sdCk7ZWxzZSBmb3IodD0wO2M+dDsrK3QpdVt0XT1oO2lmKG89W10sImZ1bmN0aW9uIj09dHlwZW9mIHApZm9yKHQ9MDtjPnQ7Kyt0KW9bdF09K3AuY2FsbCh0aGlzLHhbdF0sdCk7ZWxzZSBmb3IodD0wO2M+dDsrK3Qpb1t0XT1wO2lmKGE9W10sImZ1bmN0aW9uIj09dHlwZW9mIGcpZm9yKHQ9MDtpPnQ7Kyt0KWFbdF09K2cuY2FsbCh0aGlzLE1bdF0sdCk7ZWxzZSBmb3IodD0wO2k+dDsrK3QpYVt0XT1nO3JldHVybiBsLnJlc3VtZSgpfSxsLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBsLmFscGhhKC4xKX0sbC5zdG9wPWZ1bmN0aW9uKCl7cmV0dXJuIGwuYWxwaGEoMCl9LGwuZHJhZz1mdW5jdGlvbigpe3JldHVybiByfHwocj1hby5iZWhhdmlvci5kcmFnKCkub3JpZ2luKG0pLm9uKCJkcmFnc3RhcnQuZm9yY2UiLFFyKS5vbigiZHJhZy5mb3JjZSIsdCkub24oImRyYWdlbmQuZm9yY2UiLG5pKSksYXJndW1lbnRzLmxlbmd0aD92b2lkIHRoaXMub24oIm1vdXNlb3Zlci5mb3JjZSIsdGkpLm9uKCJtb3VzZW91dC5mb3JjZSIsZWkpLmNhbGwocik6cn0sYW8ucmViaW5kKGwsYywib24iKX07dmFyIG1sPTIwLE1sPTEseGw9MS8wO2FvLmxheW91dC5oaWVyYXJjaHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGkpe3ZhciB1LG89W2ldLGE9W107Zm9yKGkuZGVwdGg9MDtudWxsIT0odT1vLnBvcCgpKTspaWYoYS5wdXNoKHUpLChjPWUuY2FsbChuLHUsdS5kZXB0aCkpJiYobD1jLmxlbmd0aCkpe2Zvcih2YXIgbCxjLGY7LS1sPj0wOylvLnB1c2goZj1jW2xdKSxmLnBhcmVudD11LGYuZGVwdGg9dS5kZXB0aCsxO3ImJih1LnZhbHVlPTApLHUuY2hpbGRyZW49Y31lbHNlIHImJih1LnZhbHVlPStyLmNhbGwobix1LHUuZGVwdGgpfHwwKSxkZWxldGUgdS5jaGlsZHJlbjtyZXR1cm4gb2koaSxmdW5jdGlvbihuKXt2YXIgZSxpO3QmJihlPW4uY2hpbGRyZW4pJiZlLnNvcnQodCksciYmKGk9bi5wYXJlbnQpJiYoaS52YWx1ZSs9bi52YWx1ZSl9KSxhfXZhciB0PWNpLGU9YWkscj1saTtyZXR1cm4gbi5zb3J0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5jaGlsZHJlbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLnJldmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHImJih1aSh0LGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJihuLnZhbHVlPTApfSksb2kodCxmdW5jdGlvbih0KXt2YXIgZTt0LmNoaWxkcmVufHwodC52YWx1ZT0rci5jYWxsKG4sdCx0LmRlcHRoKXx8MCksKGU9dC5wYXJlbnQpJiYoZS52YWx1ZSs9dC52YWx1ZSl9KSksdH0sbn0sYW8ubGF5b3V0LnBhcnRpdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxlLHIsaSl7dmFyIHU9dC5jaGlsZHJlbjtpZih0Lng9ZSx0Lnk9dC5kZXB0aCppLHQuZHg9cix0LmR5PWksdSYmKG89dS5sZW5ndGgpKXt2YXIgbyxhLGwsYz0tMTtmb3Iocj10LnZhbHVlP3IvdC52YWx1ZTowOysrYzxvOyluKGE9dVtjXSxlLGw9YS52YWx1ZSpyLGkpLGUrPWx9fWZ1bmN0aW9uIHQobil7dmFyIGU9bi5jaGlsZHJlbixyPTA7aWYoZSYmKGk9ZS5sZW5ndGgpKWZvcih2YXIgaSx1PS0xOysrdTxpOylyPU1hdGgubWF4KHIsdChlW3VdKSk7cmV0dXJuIDErcn1mdW5jdGlvbiBlKGUsdSl7dmFyIG89ci5jYWxsKHRoaXMsZSx1KTtyZXR1cm4gbihvWzBdLDAsaVswXSxpWzFdL3Qob1swXSkpLG99dmFyIHI9YW8ubGF5b3V0LmhpZXJhcmNoeSgpLGk9WzEsMV07cmV0dXJuIGUuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLGUpOml9LGlpKGUscil9LGFvLmxheW91dC5waWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG8pe3ZhciBhLGw9by5sZW5ndGgsYz1vLm1hcChmdW5jdGlvbihlLHIpe3JldHVybit0LmNhbGwobixlLHIpfSksZj0rKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIpLHM9KCJmdW5jdGlvbiI9PXR5cGVvZiBpP2kuYXBwbHkodGhpcyxhcmd1bWVudHMpOmkpLWYsaD1NYXRoLm1pbihNYXRoLmFicyhzKS9sLCsoImZ1bmN0aW9uIj09dHlwZW9mIHU/dS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dSkpLHA9aCooMD5zPy0xOjEpLGc9YW8uc3VtKGMpLHY9Zz8ocy1sKnApL2c6MCxkPWFvLnJhbmdlKGwpLHk9W107cmV0dXJuIG51bGwhPWUmJmQuc29ydChlPT09Ymw/ZnVuY3Rpb24obix0KXtyZXR1cm4gY1t0XS1jW25dfTpmdW5jdGlvbihuLHQpe3JldHVybiBlKG9bbl0sb1t0XSl9KSxkLmZvckVhY2goZnVuY3Rpb24obil7eVtuXT17ZGF0YTpvW25dLHZhbHVlOmE9Y1tuXSxzdGFydEFuZ2xlOmYsZW5kQW5nbGU6Zis9YSp2K3AscGFkQW5nbGU6aH19KSx5fXZhciB0PU51bWJlcixlPWJsLHI9MCxpPUhvLHU9MDtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxuLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsbik6dX0sbn07dmFyIGJsPXt9O2FvLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oYSxsKXtpZighKGg9YS5sZW5ndGgpKXJldHVybiBhO3ZhciBjPWEubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQuY2FsbChuLGUscil9KSxmPWMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVyblt1LmNhbGwobix0LGUpLG8uY2FsbChuLHQsZSldfSl9KSxzPWUuY2FsbChuLGYsbCk7Yz1hby5wZXJtdXRlKGMscyksZj1hby5wZXJtdXRlKGYscyk7dmFyIGgscCxnLHYsZD1yLmNhbGwobixmLGwpLHk9Y1swXS5sZW5ndGg7Zm9yKGc9MDt5Pmc7KytnKWZvcihpLmNhbGwobixjWzBdW2ddLHY9ZFtnXSxmWzBdW2ddWzFdKSxwPTE7aD5wOysrcClpLmNhbGwobixjW3BdW2ddLHYrPWZbcC0xXVtnXVsxXSxmW3BdW2ddWzFdKTtyZXR1cm4gYX12YXIgdD1tLGU9Z2kscj12aSxpPXBpLHU9c2ksbz1oaTtyZXR1cm4gbi52YWx1ZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLm9yZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6X2wuZ2V0KHQpfHxnaSxuKTplfSxuLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OndsLmdldCh0KXx8dmksbik6cn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsbik6dX0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsbik6b30sbi5vdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxufTt2YXIgX2w9YW8ubWFwKHsiaW5zaWRlLW91dCI6ZnVuY3Rpb24obil7dmFyIHQsZSxyPW4ubGVuZ3RoLGk9bi5tYXAoZGkpLHU9bi5tYXAoeWkpLG89YW8ucmFuZ2Uocikuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiBpW25dLWlbdF19KSxhPTAsbD0wLGM9W10sZj1bXTtmb3IodD0wO3I+dDsrK3QpZT1vW3RdLGw+YT8oYSs9dVtlXSxjLnB1c2goZSkpOihsKz11W2VdLGYucHVzaChlKSk7cmV0dXJuIGYucmV2ZXJzZSgpLmNvbmNhdChjKX0scmV2ZXJzZTpmdW5jdGlvbihuKXtyZXR1cm4gYW8ucmFuZ2Uobi5sZW5ndGgpLnJldmVyc2UoKX0sImRlZmF1bHQiOmdpfSksd2w9YW8ubWFwKHtzaWxob3VldHRlOmZ1bmN0aW9uKG4pe3ZhciB0LGUscixpPW4ubGVuZ3RoLHU9blswXS5sZW5ndGgsbz1bXSxhPTAsbD1bXTtmb3IoZT0wO3U+ZTsrK2Upe2Zvcih0PTAscj0wO2k+dDt0Kyspcis9blt0XVtlXVsxXTtyPmEmJihhPXIpLG8ucHVzaChyKX1mb3IoZT0wO3U+ZTsrK2UpbFtlXT0oYS1vW2VdKS8yO3JldHVybiBsfSx3aWdnbGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLGksdSxvLGEsbCxjLGY9bi5sZW5ndGgscz1uWzBdLGg9cy5sZW5ndGgscD1bXTtmb3IocFswXT1sPWM9MCxlPTE7aD5lOysrZSl7Zm9yKHQ9MCxpPTA7Zj50OysrdClpKz1uW3RdW2VdWzFdO2Zvcih0PTAsdT0wLGE9c1tlXVswXS1zW2UtMV1bMF07Zj50OysrdCl7Zm9yKHI9MCxvPShuW3RdW2VdWzFdLW5bdF1bZS0xXVsxXSkvKDIqYSk7dD5yOysrcilvKz0obltyXVtlXVsxXS1uW3JdW2UtMV1bMV0pL2E7dSs9bypuW3RdW2VdWzFdfXBbZV09bC09aT91L2kqYTowLGM+bCYmKGM9bCl9Zm9yKGU9MDtoPmU7KytlKXBbZV0tPWM7cmV0dXJuIHB9LGV4cGFuZDpmdW5jdGlvbihuKXt2YXIgdCxlLHIsaT1uLmxlbmd0aCx1PW5bMF0ubGVuZ3RoLG89MS9pLGE9W107Zm9yKGU9MDt1PmU7KytlKXtmb3IodD0wLHI9MDtpPnQ7dCsrKXIrPW5bdF1bZV1bMV07aWYocilmb3IodD0wO2k+dDt0Kyspblt0XVtlXVsxXS89cjtlbHNlIGZvcih0PTA7aT50O3QrKyluW3RdW2VdWzFdPW99Zm9yKGU9MDt1PmU7KytlKWFbZV09MDtyZXR1cm4gYX0semVybzp2aX0pO2FvLmxheW91dC5oaXN0b2dyYW09ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdSl7Zm9yKHZhciBvLGEsbD1bXSxjPW4ubWFwKGUsdGhpcyksZj1yLmNhbGwodGhpcyxjLHUpLHM9aS5jYWxsKHRoaXMsZixjLHUpLHU9LTEsaD1jLmxlbmd0aCxwPXMubGVuZ3RoLTEsZz10PzE6MS9oOysrdTxwOylvPWxbdV09W10sby5keD1zW3UrMV0tKG8ueD1zW3VdKSxvLnk9MDtpZihwPjApZm9yKHU9LTE7Kyt1PGg7KWE9Y1t1XSxhPj1mWzBdJiZhPD1mWzFdJiYobz1sW2FvLmJpc2VjdChzLGEsMSxwKS0xXSxvLnkrPWcsby5wdXNoKG5bdV0pKTtyZXR1cm4gbH12YXIgdD0hMCxlPU51bWJlcixyPWJpLGk9TWk7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUVuKHQpLG4pOnJ9LG4uYmlucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24obil7cmV0dXJuIHhpKG4sdCl9OkVuKHQpLG4pOml9LG4uZnJlcXVlbmN5PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSEhZSxuKTp0fSxufSxhby5sYXlvdXQucGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgbz1lLmNhbGwodGhpcyxuLHUpLGE9b1swXSxsPWlbMF0sYz1pWzFdLGY9bnVsbD09dD9NYXRoLnNxcnQ6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fTtpZihhLng9YS55PTAsb2koYSxmdW5jdGlvbihuKXtuLnI9K2Yobi52YWx1ZSl9KSxvaShhLE5pKSxyKXt2YXIgcz1yKih0PzE6TWF0aC5tYXgoMiphLnIvbCwyKmEuci9jKSkvMjtvaShhLGZ1bmN0aW9uKG4pe24ucis9c30pLG9pKGEsTmkpLG9pKGEsZnVuY3Rpb24obil7bi5yLT1zfSl9cmV0dXJuIENpKGEsbC8yLGMvMix0PzE6MS9NYXRoLm1heCgyKmEuci9sLDIqYS5yL2MpKSxvfXZhciB0LGU9YW8ubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQoX2kpLHI9MCxpPVsxLDFdO3JldHVybiBuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxuLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT1lfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9lOitlLG4pOnR9LG4ucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxpaShuLGUpfSxhby5sYXlvdXQudHJlZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXt2YXIgZj1vLmNhbGwodGhpcyxuLGkpLHM9ZlswXSxoPXQocyk7aWYob2koaCxlKSxoLnBhcmVudC5tPS1oLnosdWkoaCxyKSxjKXVpKHMsdSk7ZWxzZXt2YXIgcD1zLGc9cyx2PXM7dWkocyxmdW5jdGlvbihuKXtuLng8cC54JiYocD1uKSxuLng+Zy54JiYoZz1uKSxuLmRlcHRoPnYuZGVwdGgmJih2PW4pfSk7dmFyIGQ9YShwLGcpLzItcC54LHk9bFswXS8oZy54K2EoZyxwKS8yK2QpLG09bFsxXS8odi5kZXB0aHx8MSk7dWkocyxmdW5jdGlvbihuKXtuLng9KG4ueCtkKSp5LG4ueT1uLmRlcHRoKm19KX1yZXR1cm4gZn1mdW5jdGlvbiB0KG4pe2Zvcih2YXIgdCxlPXtBOm51bGwsY2hpbGRyZW46W25dfSxyPVtlXTtudWxsIT0odD1yLnBvcCgpKTspZm9yKHZhciBpLHU9dC5jaGlsZHJlbixvPTAsYT11Lmxlbmd0aDthPm87KytvKXIucHVzaCgodVtvXT1pPXtfOnVbb10scGFyZW50OnQsY2hpbGRyZW46KGk9dVtvXS5jaGlsZHJlbikmJmkuc2xpY2UoKXx8W10sQTpudWxsLGE6bnVsbCx6OjAsbTowLGM6MCxzOjAsdDpudWxsLGk6b30pLmE9aSk7cmV0dXJuIGUuY2hpbGRyZW5bMF19ZnVuY3Rpb24gZShuKXt2YXIgdD1uLmNoaWxkcmVuLGU9bi5wYXJlbnQuY2hpbGRyZW4scj1uLmk/ZVtuLmktMV06bnVsbDtpZih0Lmxlbmd0aCl7RGkobik7dmFyIHU9KHRbMF0ueit0W3QubGVuZ3RoLTFdLnopLzI7cj8obi56PXIueithKG4uXyxyLl8pLG4ubT1uLnotdSk6bi56PXV9ZWxzZSByJiYobi56PXIueithKG4uXyxyLl8pKTtuLnBhcmVudC5BPWkobixyLG4ucGFyZW50LkF8fGVbMF0pfWZ1bmN0aW9uIHIobil7bi5fLng9bi56K24ucGFyZW50Lm0sbi5tKz1uLnBhcmVudC5tfWZ1bmN0aW9uIGkobix0LGUpe2lmKHQpe2Zvcih2YXIgcixpPW4sdT1uLG89dCxsPWkucGFyZW50LmNoaWxkcmVuWzBdLGM9aS5tLGY9dS5tLHM9by5tLGg9bC5tO289VGkobyksaT1xaShpKSxvJiZpOylsPXFpKGwpLHU9VGkodSksdS5hPW4scj1vLnorcy1pLnotYythKG8uXyxpLl8pLHI+MCYmKFJpKFBpKG8sbixlKSxuLHIpLGMrPXIsZis9cikscys9by5tLGMrPWkubSxoKz1sLm0sZis9dS5tO28mJiFUaSh1KSYmKHUudD1vLHUubSs9cy1mKSxpJiYhcWkobCkmJihsLnQ9aSxsLm0rPWMtaCxlPW4pfXJldHVybiBlfWZ1bmN0aW9uIHUobil7bi54Kj1sWzBdLG4ueT1uLmRlcHRoKmxbMV19dmFyIG89YW8ubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksYT1MaSxsPVsxLDFdLGM9bnVsbDtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbik6YX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PShsPXQpP3U6bnVsbCxuKTpjP251bGw6bH0sbi5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1udWxsPT0obD10KT9udWxsOnUsbik6Yz9sOm51bGx9LGlpKG4sbyl9LGFvLmxheW91dC5jbHVzdGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBvLGE9dC5jYWxsKHRoaXMsbix1KSxsPWFbMF0sYz0wO29pKGwsZnVuY3Rpb24obil7dmFyIHQ9bi5jaGlsZHJlbjt0JiZ0Lmxlbmd0aD8obi54PWppKHQpLG4ueT1VaSh0KSk6KG4ueD1vP2MrPWUobixvKTowLG4ueT0wLG89bil9KTt2YXIgZj1GaShsKSxzPUhpKGwpLGg9Zi54LWUoZixzKS8yLHA9cy54K2UocyxmKS8yO3JldHVybiBvaShsLGk/ZnVuY3Rpb24obil7bi54PShuLngtbC54KSpyWzBdLG4ueT0obC55LW4ueSkqclsxXX06ZnVuY3Rpb24obil7bi54PShuLngtaCkvKHAtaCkqclswXSxuLnk9KDEtKGwueT9uLnkvbC55OjEpKSpyWzFdfSksYX12YXIgdD1hby5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxlPUxpLHI9WzEsMV0saT0hMTtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PShyPXQpLG4pOmk/bnVsbDpyfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGwhPShyPXQpLG4pOmk/cjpudWxsfSxpaShuLHQpfSxhby5sYXlvdXQudHJlZW1hcD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtmb3IodmFyIGUscixpPS0xLHU9bi5sZW5ndGg7KytpPHU7KXI9KGU9bltpXSkudmFsdWUqKDA+dD8wOnQpLGUuYXJlYT1pc05hTihyKXx8MD49cj8wOnJ9ZnVuY3Rpb24gdChlKXt2YXIgdT1lLmNoaWxkcmVuO2lmKHUmJnUubGVuZ3RoKXt2YXIgbyxhLGwsYz1zKGUpLGY9W10saD11LnNsaWNlKCksZz0xLzAsdj0ic2xpY2UiPT09cD9jLmR4OiJkaWNlIj09PXA/Yy5keToic2xpY2UtZGljZSI9PT1wPzEmZS5kZXB0aD9jLmR5OmMuZHg6TWF0aC5taW4oYy5keCxjLmR5KTtmb3IobihoLGMuZHgqYy5keS9lLnZhbHVlKSxmLmFyZWE9MDsobD1oLmxlbmd0aCk+MDspZi5wdXNoKG89aFtsLTFdKSxmLmFyZWErPW8uYXJlYSwic3F1YXJpZnkiIT09cHx8KGE9cihmLHYpKTw9Zz8oaC5wb3AoKSxnPWEpOihmLmFyZWEtPWYucG9wKCkuYXJlYSxpKGYsdixjLCExKSx2PU1hdGgubWluKGMuZHgsYy5keSksZi5sZW5ndGg9Zi5hcmVhPTAsZz0xLzApO2YubGVuZ3RoJiYoaShmLHYsYywhMCksZi5sZW5ndGg9Zi5hcmVhPTApLHUuZm9yRWFjaCh0KX19ZnVuY3Rpb24gZSh0KXt2YXIgcj10LmNoaWxkcmVuO2lmKHImJnIubGVuZ3RoKXt2YXIgdSxvPXModCksYT1yLnNsaWNlKCksbD1bXTtmb3IobihhLG8uZHgqby5keS90LnZhbHVlKSxsLmFyZWE9MDt1PWEucG9wKCk7KWwucHVzaCh1KSxsLmFyZWErPXUuYXJlYSxudWxsIT11LnomJihpKGwsdS56P28uZHg6by5keSxvLCFhLmxlbmd0aCksbC5sZW5ndGg9bC5hcmVhPTApO3IuZm9yRWFjaChlKX19ZnVuY3Rpb24gcihuLHQpe2Zvcih2YXIgZSxyPW4uYXJlYSxpPTAsdT0xLzAsbz0tMSxhPW4ubGVuZ3RoOysrbzxhOykoZT1uW29dLmFyZWEpJiYodT5lJiYodT1lKSxlPmkmJihpPWUpKTtyZXR1cm4gcio9cix0Kj10LHI/TWF0aC5tYXgodCppKmcvcixyLyh0KnUqZykpOjEvMH1mdW5jdGlvbiBpKG4sdCxlLHIpe3ZhciBpLHU9LTEsbz1uLmxlbmd0aCxhPWUueCxjPWUueSxmPXQ/bChuLmFyZWEvdCk6MDsKaWYodD09ZS5keCl7Zm9yKChyfHxmPmUuZHkpJiYoZj1lLmR5KTsrK3U8bzspaT1uW3VdLGkueD1hLGkueT1jLGkuZHk9ZixhKz1pLmR4PU1hdGgubWluKGUueCtlLmR4LWEsZj9sKGkuYXJlYS9mKTowKTtpLno9ITAsaS5keCs9ZS54K2UuZHgtYSxlLnkrPWYsZS5keS09Zn1lbHNle2Zvcigocnx8Zj5lLmR4KSYmKGY9ZS5keCk7Kyt1PG87KWk9blt1XSxpLng9YSxpLnk9YyxpLmR4PWYsYys9aS5keT1NYXRoLm1pbihlLnkrZS5keS1jLGY/bChpLmFyZWEvZik6MCk7aS56PSExLGkuZHkrPWUueStlLmR5LWMsZS54Kz1mLGUuZHgtPWZ9fWZ1bmN0aW9uIHUocil7dmFyIGk9b3x8YShyKSx1PWlbMF07cmV0dXJuIHUueD11Lnk9MCx1LnZhbHVlPyh1LmR4PWNbMF0sdS5keT1jWzFdKTp1LmR4PXUuZHk9MCxvJiZhLnJldmFsdWUodSksbihbdV0sdS5keCp1LmR5L3UudmFsdWUpLChvP2U6dCkodSksaCYmKG89aSksaX12YXIgbyxhPWFvLmxheW91dC5oaWVyYXJjaHkoKSxsPU1hdGgucm91bmQsYz1bMSwxXSxmPW51bGwscz1PaSxoPSExLHA9InNxdWFyaWZ5IixnPS41KigxK01hdGguc3FydCg1KSk7cmV0dXJuIHUuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLHUpOmN9LHUucGFkZGluZz1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KHQpe3ZhciBlPW4uY2FsbCh1LHQsdC5kZXB0aCk7cmV0dXJuIG51bGw9PWU/T2kodCk6SWkodCwibnVtYmVyIj09dHlwZW9mIGU/W2UsZSxlLGVdOmUpfWZ1bmN0aW9uIGUodCl7cmV0dXJuIElpKHQsbil9aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGY7dmFyIHI7cmV0dXJuIHM9bnVsbD09KGY9bik/T2k6ImZ1bmN0aW9uIj09KHI9dHlwZW9mIG4pP3Q6Im51bWJlciI9PT1yPyhuPVtuLG4sbixuXSxlKTplLHV9LHUucm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bj9NYXRoLnJvdW5kOk51bWJlcix1KTpsIT1OdW1iZXJ9LHUuc3RpY2t5PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPW4sbz1udWxsLHUpOmh9LHUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9bix1KTpnfSx1Lm1vZGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9bisiIix1KTpwfSxpaSh1LGEpfSxhby5yYW5kb209e25vcm1hbDpmdW5jdGlvbihuLHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIDI+ZSYmKHQ9MSksMT5lJiYobj0wKSxmdW5jdGlvbigpe3ZhciBlLHIsaTtkbyBlPTIqTWF0aC5yYW5kb20oKS0xLHI9MipNYXRoLnJhbmRvbSgpLTEsaT1lKmUrcipyO3doaWxlKCFpfHxpPjEpO3JldHVybiBuK3QqZSpNYXRoLnNxcnQoLTIqTWF0aC5sb2coaSkvaSl9fSxsb2dOb3JtYWw6ZnVuY3Rpb24oKXt2YXIgbj1hby5yYW5kb20ubm9ybWFsLmFwcGx5KGFvLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKG4oKSl9fSxiYXRlczpmdW5jdGlvbihuKXt2YXIgdD1hby5yYW5kb20uaXJ3aW5IYWxsKG4pO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KCkvbn19LGlyd2luSGFsbDpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7bj5lO2UrKyl0Kz1NYXRoLnJhbmRvbSgpO3JldHVybiB0fX19LGFvLnNjYWxlPXt9O3ZhciBTbD17Zmxvb3I6bSxjZWlsOm19O2FvLnNjYWxlLmxpbmVhcj1mdW5jdGlvbigpe3JldHVybiBXaShbMCwxXSxbMCwxXSxNciwhMSl9O3ZhciBrbD17czoxLGc6MSxwOjEscjoxLGU6MX07YW8uc2NhbGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHJ1KGFvLnNjYWxlLmxpbmVhcigpLmRvbWFpbihbMCwxXSksMTAsITAsWzEsMTBdKX07dmFyIE5sPWFvLmZvcm1hdCgiLjBlIiksRWw9e2Zsb29yOmZ1bmN0aW9uKG4pe3JldHVybi1NYXRoLmNlaWwoLW4pfSxjZWlsOmZ1bmN0aW9uKG4pe3JldHVybi1NYXRoLmZsb29yKC1uKX19O2FvLnNjYWxlLnBvdz1mdW5jdGlvbigpe3JldHVybiBpdShhby5zY2FsZS5saW5lYXIoKSwxLFswLDFdKX0sYW8uc2NhbGUuc3FydD1mdW5jdGlvbigpe3JldHVybiBhby5zY2FsZS5wb3coKS5leHBvbmVudCguNSl9LGFvLnNjYWxlLm9yZGluYWw9ZnVuY3Rpb24oKXtyZXR1cm4gb3UoW10se3Q6InJhbmdlIixhOltbXV19KX0sYW8uc2NhbGUuY2F0ZWdvcnkxMD1mdW5jdGlvbigpe3JldHVybiBhby5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoQWwpfSxhby5zY2FsZS5jYXRlZ29yeTIwPWZ1bmN0aW9uKCl7cmV0dXJuIGFvLnNjYWxlLm9yZGluYWwoKS5yYW5nZShDbCl9LGFvLnNjYWxlLmNhdGVnb3J5MjBiPWZ1bmN0aW9uKCl7cmV0dXJuIGFvLnNjYWxlLm9yZGluYWwoKS5yYW5nZSh6bCl9LGFvLnNjYWxlLmNhdGVnb3J5MjBjPWZ1bmN0aW9uKCl7cmV0dXJuIGFvLnNjYWxlLm9yZGluYWwoKS5yYW5nZShMbCl9O3ZhciBBbD1bMjA2MjI2MCwxNjc0NDIwNiwyOTI0NTg4LDE0MDM0NzI4LDk3MjU4ODUsOTE5NzEzMSwxNDkwNzMzMCw4MzU1NzExLDEyMzY5MTg2LDE1NTYxNzVdLm1hcCh4biksQ2w9WzIwNjIyNjAsMTE0NTQ0NDAsMTY3NDQyMDYsMTY3NTk2NzIsMjkyNDU4OCwxMDAxODY5OCwxNDAzNDcyOCwxNjc1MDc0Miw5NzI1ODg1LDEyOTU1ODYxLDkxOTcxMzEsMTI4ODUxNDAsMTQ5MDczMzAsMTYyMzQxOTQsODM1NTcxMSwxMzA5MjgwNywxMjM2OTE4NiwxNDQwODU4OSwxNTU2MTc1LDEwNDEwNzI1XS5tYXAoeG4pLHpsPVszNzUwNzc3LDUzOTU2MTksNzA0MDcxOSwxMDI2NDI4Niw2NTE5MDk3LDkyMTY1OTQsMTE5MTUxMTUsMTM1NTY2MzYsOTIwMjk5MywxMjQyNjgwOSwxNTE4NjUxNCwxNTE5MDkzMiw4NjY2MTY5LDExMzU2NDkwLDE0MDQ5NjQzLDE1MTc3MzcyLDgwNzc2ODMsMTA4MzQzMjQsMTM1Mjg1MDksMTQ1ODk2NTRdLm1hcCh4biksTGw9WzMyNDQ3MzMsNzA1NzExMCwxMDQwNjYyNSwxMzAzMjQzMSwxNTA5NTA1MywxNjYxNjc2NCwxNjYyNTI1OSwxNjYzNDAxOCwzMjUzMDc2LDc2NTI0NzAsMTA2MDcwMDMsMTMxMDE1MDQsNzY5NTI4MSwxMDM5NDMxMiwxMjM2OTM3MiwxNDM0Mjg5MSw2NTEzNTA3LDk4Njg5NTAsMTI0MzQ4NzcsMTQyNzcwODFdLm1hcCh4bik7YW8uc2NhbGUucXVhbnRpbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXUoW10sW10pfSxhby5zY2FsZS5xdWFudGl6ZT1mdW5jdGlvbigpe3JldHVybiBsdSgwLDEsWzAsMV0pfSxhby5zY2FsZS50aHJlc2hvbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gY3UoWy41XSxbMCwxXSl9LGFvLnNjYWxlLmlkZW50aXR5PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1KFswLDFdKX0sYW8uc3ZnPXt9LGFvLnN2Zy5hcmM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG49TWF0aC5tYXgoMCwrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGM9TWF0aC5tYXgoMCwrci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGY9by5hcHBseSh0aGlzLGFyZ3VtZW50cyktSW8scz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1JbyxoPU1hdGguYWJzKHMtZikscD1mPnM/MDoxO2lmKG4+YyYmKGc9YyxjPW4sbj1nKSxoPj1PbylyZXR1cm4gdChjLHApKyhuP3QobiwxLXApOiIiKSsiWiI7dmFyIGcsdixkLHksbSxNLHgsYixfLHcsUyxrLE49MCxFPTAsQT1bXTtpZigoeT0oK2wuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwKS8yKSYmKGQ9dT09PXFsP01hdGguc3FydChuKm4rYypjKTordS5hcHBseSh0aGlzLGFyZ3VtZW50cykscHx8KEUqPS0xKSxjJiYoRT10bihkL2MqTWF0aC5zaW4oeSkpKSxuJiYoTj10bihkL24qTWF0aC5zaW4oeSkpKSksYyl7bT1jKk1hdGguY29zKGYrRSksTT1jKk1hdGguc2luKGYrRSkseD1jKk1hdGguY29zKHMtRSksYj1jKk1hdGguc2luKHMtRSk7dmFyIEM9TWF0aC5hYnMocy1mLTIqRSk8PUZvPzA6MTtpZihFJiZ5dShtLE0seCxiKT09PXBeQyl7dmFyIHo9KGYrcykvMjttPWMqTWF0aC5jb3MoeiksTT1jKk1hdGguc2luKHopLHg9Yj1udWxsfX1lbHNlIG09TT0wO2lmKG4pe189bipNYXRoLmNvcyhzLU4pLHc9bipNYXRoLnNpbihzLU4pLFM9bipNYXRoLmNvcyhmK04pLGs9bipNYXRoLnNpbihmK04pO3ZhciBMPU1hdGguYWJzKGYtcysyKk4pPD1Gbz8wOjE7aWYoTiYmeXUoXyx3LFMsayk9PT0xLXBeTCl7dmFyIHE9KGYrcykvMjtfPW4qTWF0aC5jb3MocSksdz1uKk1hdGguc2luKHEpLFM9az1udWxsfX1lbHNlIF89dz0wO2lmKGg+VW8mJihnPU1hdGgubWluKE1hdGguYWJzKGMtbikvMiwraS5hcHBseSh0aGlzLGFyZ3VtZW50cykpKT4uMDAxKXt2PWM+bl5wPzA6MTt2YXIgVD1nLFI9ZztpZihGbz5oKXt2YXIgRD1udWxsPT1TP1tfLHddOm51bGw9PXg/W20sTV06UmUoW20sTV0sW1Msa10sW3gsYl0sW18sd10pLFA9bS1EWzBdLFU9TS1EWzFdLGo9eC1EWzBdLEY9Yi1EWzFdLEg9MS9NYXRoLnNpbihNYXRoLmFjb3MoKFAqaitVKkYpLyhNYXRoLnNxcnQoUCpQK1UqVSkqTWF0aC5zcXJ0KGoqaitGKkYpKSkvMiksTz1NYXRoLnNxcnQoRFswXSpEWzBdK0RbMV0qRFsxXSk7Uj1NYXRoLm1pbihnLChuLU8pLyhILTEpKSxUPU1hdGgubWluKGcsKGMtTykvKEgrMSkpfWlmKG51bGwhPXgpe3ZhciBJPW11KG51bGw9PVM/W18sd106W1Msa10sW20sTV0sYyxULHApLFk9bXUoW3gsYl0sW18sd10sYyxULHApO2c9PT1UP0EucHVzaCgiTSIsSVswXSwiQSIsVCwiLCIsVCwiIDAgMCwiLHYsIiAiLElbMV0sIkEiLGMsIiwiLGMsIiAwICIsMS1wXnl1KElbMV1bMF0sSVsxXVsxXSxZWzFdWzBdLFlbMV1bMV0pLCIsIixwLCIgIixZWzFdLCJBIixULCIsIixULCIgMCAwLCIsdiwiICIsWVswXSk6QS5wdXNoKCJNIixJWzBdLCJBIixULCIsIixULCIgMCAxLCIsdiwiICIsWVswXSl9ZWxzZSBBLnB1c2goIk0iLG0sIiwiLE0pO2lmKG51bGwhPVMpe3ZhciBaPW11KFttLE1dLFtTLGtdLG4sLVIscCksVj1tdShbXyx3XSxudWxsPT14P1ttLE1dOlt4LGJdLG4sLVIscCk7Zz09PVI/QS5wdXNoKCJMIixWWzBdLCJBIixSLCIsIixSLCIgMCAwLCIsdiwiICIsVlsxXSwiQSIsbiwiLCIsbiwiIDAgIixwXnl1KFZbMV1bMF0sVlsxXVsxXSxaWzFdWzBdLFpbMV1bMV0pLCIsIiwxLXAsIiAiLFpbMV0sIkEiLFIsIiwiLFIsIiAwIDAsIix2LCIgIixaWzBdKTpBLnB1c2goIkwiLFZbMF0sIkEiLFIsIiwiLFIsIiAwIDAsIix2LCIgIixaWzBdKX1lbHNlIEEucHVzaCgiTCIsXywiLCIsdyl9ZWxzZSBBLnB1c2goIk0iLG0sIiwiLE0pLG51bGwhPXgmJkEucHVzaCgiQSIsYywiLCIsYywiIDAgIixDLCIsIixwLCIgIix4LCIsIixiKSxBLnB1c2goIkwiLF8sIiwiLHcpLG51bGwhPVMmJkEucHVzaCgiQSIsbiwiLCIsbiwiIDAgIixMLCIsIiwxLXAsIiAiLFMsIiwiLGspO3JldHVybiBBLnB1c2goIloiKSxBLmpvaW4oIiIpfWZ1bmN0aW9uIHQobix0KXtyZXR1cm4iTTAsIituKyJBIituKyIsIituKyIgMCAxLCIrdCsiIDAsIistbisiQSIrbisiLCIrbisiIDAgMSwiK3QrIiAwLCIrbn12YXIgZT1odSxyPXB1LGk9c3UsdT1xbCxvPWd1LGE9dnUsbD1kdTtyZXR1cm4gbi5pbm5lclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1Fbih0KSxuKTplfSxuLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUVuKHQpLG4pOnJ9LG4uY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUVuKHQpLG4pOml9LG4ucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQ9PXFsP3FsOkVuKHQpLG4pOnV9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1Fbih0KSxuKTpvfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUVuKHQpLG4pOmF9LG4ucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9RW4odCksbik6bH0sbi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBuPSgrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMix0PSgrby5hcHBseSh0aGlzLGFyZ3VtZW50cykrICthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1JbztyZXR1cm5bTWF0aC5jb3ModCkqbixNYXRoLnNpbih0KSpuXX0sbn07dmFyIHFsPSJhdXRvIjthby5zdmcubGluZT1mdW5jdGlvbigpe3JldHVybiBNdShtKX07dmFyIFRsPWFvLm1hcCh7bGluZWFyOnh1LCJsaW5lYXItY2xvc2VkIjpidSxzdGVwOl91LCJzdGVwLWJlZm9yZSI6d3UsInN0ZXAtYWZ0ZXIiOlN1LGJhc2lzOnp1LCJiYXNpcy1vcGVuIjpMdSwiYmFzaXMtY2xvc2VkIjpxdSxidW5kbGU6VHUsY2FyZGluYWw6RXUsImNhcmRpbmFsLW9wZW4iOmt1LCJjYXJkaW5hbC1jbG9zZWQiOk51LG1vbm90b25lOkZ1fSk7VGwuZm9yRWFjaChmdW5jdGlvbihuLHQpe3Qua2V5PW4sdC5jbG9zZWQ9Ly1jbG9zZWQkLy50ZXN0KG4pfSk7dmFyIFJsPVswLDIvMywxLzMsMF0sRGw9WzAsMS8zLDIvMywwXSxQbD1bMCwxLzYsMi8zLDEvNl07YW8uc3ZnLmxpbmUucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49TXUoSHUpO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG59LHd1LnJldmVyc2U9U3UsU3UucmV2ZXJzZT13dSxhby5zdmcuYXJlYT1mdW5jdGlvbigpe3JldHVybiBPdShtKX0sYW8uc3ZnLmFyZWEucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49T3UoSHUpO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmlubmVyUmFkaXVzPW4ueDAsZGVsZXRlIG4ueDAsbi5vdXRlclJhZGl1cz1uLngxLGRlbGV0ZSBuLngxLG4uYW5nbGU9bi55LGRlbGV0ZSBuLnksbi5zdGFydEFuZ2xlPW4ueTAsZGVsZXRlIG4ueTAsbi5lbmRBbmdsZT1uLnkxLGRlbGV0ZSBuLnkxLG59LGFvLnN2Zy5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixhKXt2YXIgbD10KHRoaXMsdSxuLGEpLGM9dCh0aGlzLG8sbixhKTtyZXR1cm4iTSIrbC5wMCtyKGwucixsLnAxLGwuYTEtbC5hMCkrKGUobCxjKT9pKGwucixsLnAxLGwucixsLnAwKTppKGwucixsLnAxLGMucixjLnAwKStyKGMucixjLnAxLGMuYTEtYy5hMCkraShjLnIsYy5wMSxsLnIsbC5wMCkpKyJaIn1mdW5jdGlvbiB0KG4sdCxlLHIpe3ZhciBpPXQuY2FsbChuLGUsciksdT1hLmNhbGwobixpLHIpLG89bC5jYWxsKG4saSxyKS1JbyxmPWMuY2FsbChuLGksciktSW87cmV0dXJue3I6dSxhMDpvLGExOmYscDA6W3UqTWF0aC5jb3MobyksdSpNYXRoLnNpbihvKV0scDE6W3UqTWF0aC5jb3MoZiksdSpNYXRoLnNpbihmKV19fWZ1bmN0aW9uIGUobix0KXtyZXR1cm4gbi5hMD09dC5hMCYmbi5hMT09dC5hMX1mdW5jdGlvbiByKG4sdCxlKXtyZXR1cm4iQSIrbisiLCIrbisiIDAgIisgKyhlPkZvKSsiLDEgIit0fWZ1bmN0aW9uIGkobix0LGUscil7cmV0dXJuIlEgMCwwICIrcn12YXIgdT1NZSxvPXhlLGE9SXUsbD1ndSxjPXZ1O3JldHVybiBuLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1Fbih0KSxuKTphfSxuLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1Fbih0KSxuKTp1fSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1Fbih0KSxuKTpvfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9RW4odCksbik6bH0sbi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1Fbih0KSxuKTpjfSxufSxhby5zdmcuZGlhZ29uYWw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7dmFyIHU9dC5jYWxsKHRoaXMsbixpKSxvPWUuY2FsbCh0aGlzLG4saSksYT0odS55K28ueSkvMixsPVt1LHt4OnUueCx5OmF9LHt4Om8ueCx5OmF9LG9dO3JldHVybiBsPWwubWFwKHIpLCJNIitsWzBdKyJDIitsWzFdKyIgIitsWzJdKyIgIitsWzNdfXZhciB0PU1lLGU9eGUscj1ZdTtyZXR1cm4gbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9RW4oZSksbik6dH0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RW4odCksbik6ZX0sbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbn0sYW8uc3ZnLmRpYWdvbmFsLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPWFvLnN2Zy5kaWFnb25hbCgpLHQ9WXUsZT1uLnByb2plY3Rpb247cmV0dXJuIG4ucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKFp1KHQ9bikpOnR9LG59LGFvLnN2Zy5zeW1ib2w9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4scil7cmV0dXJuKFVsLmdldCh0LmNhbGwodGhpcyxuLHIpKXx8JHUpKGUuY2FsbCh0aGlzLG4scikpfXZhciB0PVh1LGU9VnU7cmV0dXJuIG4udHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1FbihlKSxuKTp0fSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RW4odCksbik6ZX0sbn07dmFyIFVsPWFvLm1hcCh7Y2lyY2xlOiR1LGNyb3NzOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuLzUpLzI7cmV0dXJuIk0iKy0zKnQrIiwiKy10KyJIIistdCsiViIrLTMqdCsiSCIrdCsiViIrLXQrIkgiKzMqdCsiViIrdCsiSCIrdCsiViIrMyp0KyJIIistdCsiViIrdCsiSCIrLTMqdCsiWiJ9LGRpYW1vbmQ6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vKDIqRmwpKSxlPXQqRmw7cmV0dXJuIk0wLCIrLXQrIkwiK2UrIiwwIDAsIit0KyIgIistZSsiLDBaIn0sc3F1YXJlOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuKS8yO3JldHVybiJNIistdCsiLCIrLXQrIkwiK3QrIiwiKy10KyIgIit0KyIsIit0KyIgIistdCsiLCIrdCsiWiJ9LCJ0cmlhbmdsZS1kb3duIjpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi9qbCksZT10KmpsLzI7cmV0dXJuIk0wLCIrZSsiTCIrdCsiLCIrLWUrIiAiKy10KyIsIistZSsiWiJ9LCJ0cmlhbmdsZS11cCI6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vamwpLGU9dCpqbC8yO3JldHVybiJNMCwiKy1lKyJMIit0KyIsIitlKyIgIistdCsiLCIrZSsiWiJ9fSk7YW8uc3ZnLnN5bWJvbFR5cGVzPVVsLmtleXMoKTt2YXIgamw9TWF0aC5zcXJ0KDMpLEZsPU1hdGgudGFuKDMwKllvKTtDby50cmFuc2l0aW9uPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHI9SGx8fCsrWmwsaT1LdShuKSx1PVtdLG89T2x8fHt0aW1lOkRhdGUubm93KCksZWFzZTpOcixkZWxheTowLGR1cmF0aW9uOjI1MH0sYT0tMSxsPXRoaXMubGVuZ3RoOysrYTxsOyl7dS5wdXNoKHQ9W10pO2Zvcih2YXIgYz10aGlzW2FdLGY9LTEscz1jLmxlbmd0aDsrK2Y8czspKGU9Y1tmXSkmJlF1KGUsZixpLHIsbyksdC5wdXNoKGUpfXJldHVybiBXdSh1LGkscil9LENvLmludGVycnVwdD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5lYWNoKG51bGw9PW4/SWw6QnUoS3UobikpKX07dmFyIEhsLE9sLElsPUJ1KEt1KCkpLFlsPVtdLFpsPTA7WWwuY2FsbD1Dby5jYWxsLFlsLmVtcHR5PUNvLmVtcHR5LFlsLm5vZGU9Q28ubm9kZSxZbC5zaXplPUNvLnNpemUsYW8udHJhbnNpdGlvbj1mdW5jdGlvbihuLHQpe3JldHVybiBuJiZuLnRyYW5zaXRpb24/SGw/bi50cmFuc2l0aW9uKHQpOm46YW8uc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuKX0sYW8udHJhbnNpdGlvbi5wcm90b3R5cGU9WWwsWWwuc2VsZWN0PWZ1bmN0aW9uKG4pe3ZhciB0LGUscixpPXRoaXMuaWQsdT10aGlzLm5hbWVzcGFjZSxvPVtdO249QShuKTtmb3IodmFyIGE9LTEsbD10aGlzLmxlbmd0aDsrK2E8bDspe28ucHVzaCh0PVtdKTtmb3IodmFyIGM9dGhpc1thXSxmPS0xLHM9Yy5sZW5ndGg7KytmPHM7KShyPWNbZl0pJiYoZT1uLmNhbGwocixyLl9fZGF0YV9fLGYsYSkpPygiX19kYXRhX18iaW4gciYmKGUuX19kYXRhX189ci5fX2RhdGFfXyksUXUoZSxmLHUsaSxyW3VdW2ldKSx0LnB1c2goZSkpOnQucHVzaChudWxsKX1yZXR1cm4gV3Uobyx1LGkpfSxZbC5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyLGksdSxvPXRoaXMuaWQsYT10aGlzLm5hbWVzcGFjZSxsPVtdO249QyhuKTtmb3IodmFyIGM9LTEsZj10aGlzLmxlbmd0aDsrK2M8ZjspZm9yKHZhciBzPXRoaXNbY10saD0tMSxwPXMubGVuZ3RoOysraDxwOylpZihyPXNbaF0pe3U9clthXVtvXSxlPW4uY2FsbChyLHIuX19kYXRhX18saCxjKSxsLnB1c2godD1bXSk7Zm9yKHZhciBnPS0xLHY9ZS5sZW5ndGg7KytnPHY7KShpPWVbZ10pJiZRdShpLGcsYSxvLHUpLHQucHVzaChpKX1yZXR1cm4gV3UobCxhLG8pfSxZbC5maWx0ZXI9ZnVuY3Rpb24obil7dmFyIHQsZSxyLGk9W107ImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPU8obikpO2Zvcih2YXIgdT0wLG89dGhpcy5sZW5ndGg7bz51O3UrKyl7aS5wdXNoKHQ9W10pO2Zvcih2YXIgZT10aGlzW3VdLGE9MCxsPWUubGVuZ3RoO2w+YTthKyspKHI9ZVthXSkmJm4uY2FsbChyLHIuX19kYXRhX18sYSx1KSYmdC5wdXNoKHIpfXJldHVybiBXdShpLHRoaXMubmFtZXNwYWNlLHRoaXMuaWQpfSxZbC50d2Vlbj1mdW5jdGlvbihuLHQpe3ZhciBlPXRoaXMuaWQscj10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP3RoaXMubm9kZSgpW3JdW2VdLnR3ZWVuLmdldChuKTpZKHRoaXMsbnVsbD09dD9mdW5jdGlvbih0KXt0W3JdW2VdLnR3ZWVuLnJlbW92ZShuKX06ZnVuY3Rpb24oaSl7aVtyXVtlXS50d2Vlbi5zZXQobix0KX0pfSxZbC5hdHRyPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKGEpfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbnVsbD09bj9lOihuKz0iIixmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5nZXRBdHRyaWJ1dGUoYSk7cmV0dXJuIGUhPT1uJiYodD1vKGUsbiksZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUoYSx0KG4pKX0pfSl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gbnVsbD09bj9yOihuKz0iIixmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5nZXRBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwpO3JldHVybiBlIT09biYmKHQ9byhlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsLHQobikpfSl9KX1pZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih0IGluIG4pdGhpcy5hdHRyKHQsblt0XSk7cmV0dXJuIHRoaXN9dmFyIG89InRyYW5zZm9ybSI9PW4/JHI6TXIsYT1hby5ucy5xdWFsaWZ5KG4pO3JldHVybiBKdSh0aGlzLCJhdHRyLiIrbix0LGEubG9jYWw/dTppKX0sWWwuYXR0clR3ZWVuPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUpe3ZhciByPXQuY2FsbCh0aGlzLG4sZSx0aGlzLmdldEF0dHJpYnV0ZShpKSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKGkscihuKSl9fWZ1bmN0aW9uIHIobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGVOUyhpLnNwYWNlLGkubG9jYWwpKTtyZXR1cm4gciYmZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyhpLnNwYWNlLGkubG9jYWwscihuKSl9fXZhciBpPWFvLm5zLnF1YWxpZnkobik7cmV0dXJuIHRoaXMudHdlZW4oImF0dHIuIituLGkubG9jYWw/cjplKX0sWWwuc3R5bGU9ZnVuY3Rpb24obixlLHIpe2Z1bmN0aW9uIGkoKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG4pfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIG51bGw9PWU/aTooZSs9IiIsZnVuY3Rpb24oKXt2YXIgaSx1PXQodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobik7cmV0dXJuIHUhPT1lJiYoaT1Ncih1LGUpLGZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobixpKHQpLHIpfSl9KX12YXIgbz1hcmd1bWVudHMubGVuZ3RoO2lmKDM+byl7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPm8mJihlPSIiKTtmb3IociBpbiBuKXRoaXMuc3R5bGUocixuW3JdLGUpO3JldHVybiB0aGlzfXI9IiJ9cmV0dXJuIEp1KHRoaXMsInN0eWxlLiIrbixlLHUpfSxZbC5zdHlsZVR3ZWVuPWZ1bmN0aW9uKG4sZSxyKXtmdW5jdGlvbiBpKGksdSl7dmFyIG89ZS5jYWxsKHRoaXMsaSx1LHQodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobikpO3JldHVybiBvJiZmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4sbyh0KSxyKX19cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9IiIpLHRoaXMudHdlZW4oInN0eWxlLiIrbixpKX0sWWwudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gSnUodGhpcywidGV4dCIsbixHdSl9LFlsLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBuPXRoaXMubmFtZXNwYWNlO3JldHVybiB0aGlzLmVhY2goImVuZC50cmFuc2l0aW9uIixmdW5jdGlvbigpe3ZhciB0O3RoaXNbbl0uY291bnQ8MiYmKHQ9dGhpcy5wYXJlbnROb2RlKSYmdC5yZW1vdmVDaGlsZCh0aGlzKX0pfSxZbC5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmVhc2U6KCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1hby5lYXNlLmFwcGx5KGFvLGFyZ3VtZW50cykpLFkodGhpcyxmdW5jdGlvbihyKXtyW2VdW3RdLmVhc2U9bn0pKX0sWWwuZGVsYXk9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZGVsYXk6WSh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsaSx1KXtyW2VdW3RdLmRlbGF5PStuLmNhbGwocixyLl9fZGF0YV9fLGksdSl9OihuPStuLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZGVsYXk9bn0pKX0sWWwuZHVyYXRpb249ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZHVyYXRpb246WSh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsaSx1KXtyW2VdW3RdLmR1cmF0aW9uPU1hdGgubWF4KDEsbi5jYWxsKHIsci5fX2RhdGFfXyxpLHUpKX06KG49TWF0aC5tYXgoMSxuKSxmdW5jdGlvbihyKXtyW2VdW3RdLmR1cmF0aW9uPW59KSl9LFlsLmVhY2g9ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgaT1PbCx1PUhsO3RyeXtIbD1lLFkodGhpcyxmdW5jdGlvbih0LGksdSl7T2w9dFtyXVtlXSxuLmNhbGwodCx0Ll9fZGF0YV9fLGksdSl9KX1maW5hbGx5e09sPWksSGw9dX19ZWxzZSBZKHRoaXMsZnVuY3Rpb24oaSl7dmFyIHU9aVtyXVtlXTsodS5ldmVudHx8KHUuZXZlbnQ9YW8uZGlzcGF0Y2goInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikpKS5vbihuLHQpfSk7cmV0dXJuIHRoaXN9LFlsLnRyYW5zaXRpb249ZnVuY3Rpb24oKXtmb3IodmFyIG4sdCxlLHIsaT10aGlzLmlkLHU9KytabCxvPXRoaXMubmFtZXNwYWNlLGE9W10sbD0wLGM9dGhpcy5sZW5ndGg7Yz5sO2wrKyl7YS5wdXNoKG49W10pO2Zvcih2YXIgdD10aGlzW2xdLGY9MCxzPXQubGVuZ3RoO3M+ZjtmKyspKGU9dFtmXSkmJihyPWVbb11baV0sUXUoZSxmLG8sdSx7dGltZTpyLnRpbWUsZWFzZTpyLmVhc2UsZGVsYXk6ci5kZWxheStyLmR1cmF0aW9uLGR1cmF0aW9uOnIuZHVyYXRpb259KSksbi5wdXNoKGUpfXJldHVybiBXdShhLG8sdSl9LGFvLnN2Zy5heGlzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbixjPWFvLnNlbGVjdCh0aGlzKSxmPXRoaXMuX19jaGFydF9ffHxlLHM9dGhpcy5fX2NoYXJ0X189ZS5jb3B5KCksaD1udWxsPT1sP3MudGlja3M/cy50aWNrcy5hcHBseShzLGEpOnMuZG9tYWluKCk6bCxwPW51bGw9PXQ/cy50aWNrRm9ybWF0P3MudGlja0Zvcm1hdC5hcHBseShzLGEpOm06dCxnPWMuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoaCxzKSx2PWcuZW50ZXIoKS5pbnNlcnQoImciLCIuZG9tYWluIikuYXR0cigiY2xhc3MiLCJ0aWNrIikuc3R5bGUoIm9wYWNpdHkiLFVvKSxkPWFvLnRyYW5zaXRpb24oZy5leGl0KCkpLnN0eWxlKCJvcGFjaXR5IixVbykucmVtb3ZlKCkseT1hby50cmFuc2l0aW9uKGcub3JkZXIoKSkuc3R5bGUoIm9wYWNpdHkiLDEpLE09TWF0aC5tYXgoaSwwKStvLHg9WmkocyksYj1jLnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoWzBdKSxfPShiLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJkb21haW4iKSxhby50cmFuc2l0aW9uKGIpKTt2LmFwcGVuZCgibGluZSIpLHYuYXBwZW5kKCJ0ZXh0Iik7dmFyIHcsUyxrLE4sRT12LnNlbGVjdCgibGluZSIpLEE9eS5zZWxlY3QoImxpbmUiKSxDPWcuc2VsZWN0KCJ0ZXh0IikudGV4dChwKSx6PXYuc2VsZWN0KCJ0ZXh0IiksTD15LnNlbGVjdCgidGV4dCIpLHE9InRvcCI9PT1yfHwibGVmdCI9PT1yPy0xOjE7aWYoImJvdHRvbSI9PT1yfHwidG9wIj09PXI/KG49bm8sdz0ieCIsaz0ieSIsUz0ieDIiLE49InkyIixDLmF0dHIoImR5IiwwPnE/IjBlbSI6Ii43MWVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIiksXy5hdHRyKCJkIiwiTSIreFswXSsiLCIrcSp1KyJWMEgiK3hbMV0rIlYiK3EqdSkpOihuPXRvLHc9InkiLGs9IngiLFM9InkyIixOPSJ4MiIsQy5hdHRyKCJkeSIsIi4zMmVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwwPnE/ImVuZCI6InN0YXJ0IiksXy5hdHRyKCJkIiwiTSIrcSp1KyIsIit4WzBdKyJIMFYiK3hbMV0rIkgiK3EqdSkpLEUuYXR0cihOLHEqaSksei5hdHRyKGsscSpNKSxBLmF0dHIoUywwKS5hdHRyKE4scSppKSxMLmF0dHIodywwKS5hdHRyKGsscSpNKSxzLnJhbmdlQmFuZCl7dmFyIFQ9cyxSPVQucmFuZ2VCYW5kKCkvMjtmPXM9ZnVuY3Rpb24obil7cmV0dXJuIFQobikrUn19ZWxzZSBmLnJhbmdlQmFuZD9mPXM6ZC5jYWxsKG4scyxmKTt2LmNhbGwobixmLHMpLHkuY2FsbChuLHMscyl9KX12YXIgdCxlPWFvLnNjYWxlLmxpbmVhcigpLHI9VmwsaT02LHU9NixvPTMsYT1bMTBdLGw9bnVsbDtyZXR1cm4gbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ub3JpZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQgaW4gWGw/dCsiIjpWbCxuKTpyfSxuLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9Y28oYXJndW1lbnRzKSxuKTphfSxuLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCxuKTpsfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIGU/KGk9K3QsdT0rYXJndW1lbnRzW2UtMV0sbik6aX0sbi5pbm5lclRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOml9LG4ub3V0ZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxuKTp1fSxuLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LG4pOm99LG4udGlja1N1YmRpdmlkZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoJiZufSxufTt2YXIgVmw9ImJvdHRvbSIsWGw9e3RvcDoxLHJpZ2h0OjEsYm90dG9tOjEsbGVmdDoxfTthby5zdmcuYnJ1c2g9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQpe3QuZWFjaChmdW5jdGlvbigpe3ZhciB0PWFvLnNlbGVjdCh0aGlzKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2giLHUpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIix1KSxvPXQuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpLmRhdGEoWzBdKTtvLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJiYWNrZ3JvdW5kIikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKS5zdHlsZSgiY3Vyc29yIiwiY3Jvc3NoYWlyIiksdC5zZWxlY3RBbGwoIi5leHRlbnQiKS5kYXRhKFswXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImV4dGVudCIpLnN0eWxlKCJjdXJzb3IiLCJtb3ZlIik7dmFyIGE9dC5zZWxlY3RBbGwoIi5yZXNpemUiKS5kYXRhKHYsbSk7YS5leGl0KCkucmVtb3ZlKCksYS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixmdW5jdGlvbihuKXtyZXR1cm4icmVzaXplICIrbn0pLnN0eWxlKCJjdXJzb3IiLGZ1bmN0aW9uKG4pe3JldHVybiAkbFtuXX0pLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLGZ1bmN0aW9uKG4pe3JldHVybi9bZXddJC8udGVzdChuKT8tMzpudWxsfSkuYXR0cigieSIsZnVuY3Rpb24obil7cmV0dXJuL15bbnNdLy50ZXN0KG4pPy0zOm51bGx9KS5hdHRyKCJ3aWR0aCIsNikuYXR0cigiaGVpZ2h0Iiw2KS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLGEuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCk7dmFyIGwscz1hby50cmFuc2l0aW9uKHQpLGg9YW8udHJhbnNpdGlvbihvKTtjJiYobD1aaShjKSxoLmF0dHIoIngiLGxbMF0pLmF0dHIoIndpZHRoIixsWzFdLWxbMF0pLHIocykpLGYmJihsPVppKGYpLGguYXR0cigieSIsbFswXSkuYXR0cigiaGVpZ2h0IixsWzFdLWxbMF0pLGkocykpLGUocyl9KX1mdW5jdGlvbiBlKG4pe24uc2VsZWN0QWxsKCIucmVzaXplIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXtyZXR1cm4idHJhbnNsYXRlKCIrc1srL2UkLy50ZXN0KG4pXSsiLCIraFsrL15zLy50ZXN0KG4pXSsiKSJ9KX1mdW5jdGlvbiByKG4pe24uc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieCIsc1swXSksbi5zZWxlY3RBbGwoIi5leHRlbnQsLm4+cmVjdCwucz5yZWN0IikuYXR0cigid2lkdGgiLHNbMV0tc1swXSl9ZnVuY3Rpb24gaShuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoInkiLGhbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5lPnJlY3QsLnc+cmVjdCIpLmF0dHIoImhlaWdodCIsaFsxXS1oWzBdKX1mdW5jdGlvbiB1KCl7ZnVuY3Rpb24gdSgpezMyPT1hby5ldmVudC5rZXlDb2RlJiYoQ3x8KE09bnVsbCxMWzBdLT1zWzFdLExbMV0tPWhbMV0sQz0yKSxTKCkpfWZ1bmN0aW9uIHYoKXszMj09YW8uZXZlbnQua2V5Q29kZSYmMj09QyYmKExbMF0rPXNbMV0sTFsxXSs9aFsxXSxDPTAsUygpKX1mdW5jdGlvbiBkKCl7dmFyIG49YW8ubW91c2UoYiksdD0hMTt4JiYoblswXSs9eFswXSxuWzFdKz14WzFdKSxDfHwoYW8uZXZlbnQuYWx0S2V5PyhNfHwoTT1bKHNbMF0rc1sxXSkvMiwoaFswXStoWzFdKS8yXSksTFswXT1zWysoblswXTxNWzBdKV0sTFsxXT1oWysoblsxXTxNWzFdKV0pOk09bnVsbCksRSYmeShuLGMsMCkmJihyKGspLHQ9ITApLEEmJnkobixmLDEpJiYoaShrKSx0PSEwKSx0JiYoZShrKSx3KHt0eXBlOiJicnVzaCIsbW9kZTpDPyJtb3ZlIjoicmVzaXplIn0pKX1mdW5jdGlvbiB5KG4sdCxlKXt2YXIgcixpLHU9WmkodCksbD11WzBdLGM9dVsxXSxmPUxbZV0sdj1lP2g6cyxkPXZbMV0tdlswXTtyZXR1cm4gQyYmKGwtPWYsYy09ZCtmKSxyPShlP2c6cCk/TWF0aC5tYXgobCxNYXRoLm1pbihjLG5bZV0pKTpuW2VdLEM/aT0ocis9ZikrZDooTSYmKGY9TWF0aC5tYXgobCxNYXRoLm1pbihjLDIqTVtlXS1yKSkpLHI+Zj8oaT1yLHI9Zik6aT1mKSx2WzBdIT1yfHx2WzFdIT1pPyhlP2E9bnVsbDpvPW51bGwsdlswXT1yLHZbMV09aSwhMCk6dm9pZCAwfWZ1bmN0aW9uIG0oKXtkKCksay5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsbi5lbXB0eSgpPyJub25lIjpudWxsKSxhby5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIixudWxsKSxxLm9uKCJtb3VzZW1vdmUuYnJ1c2giLG51bGwpLm9uKCJtb3VzZXVwLmJydXNoIixudWxsKS5vbigidG91Y2htb3ZlLmJydXNoIixudWxsKS5vbigidG91Y2hlbmQuYnJ1c2giLG51bGwpLm9uKCJrZXlkb3duLmJydXNoIixudWxsKS5vbigia2V5dXAuYnJ1c2giLG51bGwpLHooKSx3KHt0eXBlOiJicnVzaGVuZCJ9KX12YXIgTSx4LGI9dGhpcyxfPWFvLnNlbGVjdChhby5ldmVudC50YXJnZXQpLHc9bC5vZihiLGFyZ3VtZW50cyksaz1hby5zZWxlY3QoYiksTj1fLmRhdHVtKCksRT0hL14obnxzKSQvLnRlc3QoTikmJmMsQT0hL14oZXx3KSQvLnRlc3QoTikmJmYsQz1fLmNsYXNzZWQoImV4dGVudCIpLHo9VyhiKSxMPWFvLm1vdXNlKGIpLHE9YW8uc2VsZWN0KHQoYikpLm9uKCJrZXlkb3duLmJydXNoIix1KS5vbigia2V5dXAuYnJ1c2giLHYpO2lmKGFvLmV2ZW50LmNoYW5nZWRUb3VjaGVzP3Eub24oInRvdWNobW92ZS5icnVzaCIsZCkub24oInRvdWNoZW5kLmJydXNoIixtKTpxLm9uKCJtb3VzZW1vdmUuYnJ1c2giLGQpLm9uKCJtb3VzZXVwLmJydXNoIixtKSxrLmludGVycnVwdCgpLnNlbGVjdEFsbCgiKiIpLmludGVycnVwdCgpLEMpTFswXT1zWzBdLUxbMF0sTFsxXT1oWzBdLUxbMV07ZWxzZSBpZihOKXt2YXIgVD0rL3ckLy50ZXN0KE4pLFI9Ky9ebi8udGVzdChOKTt4PVtzWzEtVF0tTFswXSxoWzEtUl0tTFsxXV0sTFswXT1zW1RdLExbMV09aFtSXX1lbHNlIGFvLmV2ZW50LmFsdEtleSYmKE09TC5zbGljZSgpKTtrLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsbnVsbCksYW8uc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsXy5zdHlsZSgiY3Vyc29yIikpLHcoe3R5cGU6ImJydXNoc3RhcnQifSksZCgpfXZhciBvLGEsbD1OKG4sImJydXNoc3RhcnQiLCJicnVzaCIsImJydXNoZW5kIiksYz1udWxsLGY9bnVsbCxzPVswLDBdLGg9WzAsMF0scD0hMCxnPSEwLHY9QmxbMF07cmV0dXJuIG4uZXZlbnQ9ZnVuY3Rpb24obil7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49bC5vZih0aGlzLGFyZ3VtZW50cyksdD17eDpzLHk6aCxpOm8sajphfSxlPXRoaXMuX19jaGFydF9ffHx0O3RoaXMuX19jaGFydF9fPXQsSGw/YW8uc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC5icnVzaCIsZnVuY3Rpb24oKXtvPWUuaSxhPWUuaixzPWUueCxoPWUueSxuKHt0eXBlOiJicnVzaHN0YXJ0In0pfSkudHdlZW4oImJydXNoOmJydXNoIixmdW5jdGlvbigpe3ZhciBlPXhyKHMsdC54KSxyPXhyKGgsdC55KTtyZXR1cm4gbz1hPW51bGwsZnVuY3Rpb24oaSl7cz10Lng9ZShpKSxoPXQueT1yKGkpLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSl9fSkuZWFjaCgiZW5kLmJydXNoIixmdW5jdGlvbigpe289dC5pLGE9dC5qLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSksbih7dHlwZToiYnJ1c2hlbmQifSl9KToobih7dHlwZToiYnJ1c2hzdGFydCJ9KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pKX0pfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9dCx2PUJsWyFjPDwxfCFmXSxuKTpjfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9dCx2PUJsWyFjPDwxfCFmXSxuKTpmfSxuLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjJiZmPyhwPSEhdFswXSxnPSEhdFsxXSk6Yz9wPSEhdDpmJiYoZz0hIXQpLG4pOmMmJmY/W3AsZ106Yz9wOmY/ZzpudWxsfSxuLmV4dGVudD1mdW5jdGlvbih0KXt2YXIgZSxyLGksdSxsO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjJiYoZT10WzBdLHI9dFsxXSxmJiYoZT1lWzBdLHI9clswXSksbz1bZSxyXSxjLmludmVydCYmKGU9YyhlKSxyPWMocikpLGU+ciYmKGw9ZSxlPXIscj1sKSxlPT1zWzBdJiZyPT1zWzFdfHwocz1bZSxyXSkpLGYmJihpPXRbMF0sdT10WzFdLGMmJihpPWlbMV0sdT11WzFdKSxhPVtpLHVdLGYuaW52ZXJ0JiYoaT1mKGkpLHU9Zih1KSksaT51JiYobD1pLGk9dSx1PWwpLGk9PWhbMF0mJnU9PWhbMV18fChoPVtpLHVdKSksbik6KGMmJihvPyhlPW9bMF0scj1vWzFdKTooZT1zWzBdLHI9c1sxXSxjLmludmVydCYmKGU9Yy5pbnZlcnQoZSkscj1jLmludmVydChyKSksZT5yJiYobD1lLGU9cixyPWwpKSksZiYmKGE/KGk9YVswXSx1PWFbMV0pOihpPWhbMF0sdT1oWzFdLGYuaW52ZXJ0JiYoaT1mLmludmVydChpKSx1PWYuaW52ZXJ0KHUpKSxpPnUmJihsPWksaT11LHU9bCkpKSxjJiZmP1tbZSxpXSxbcix1XV06Yz9bZSxyXTpmJiZbaSx1XSl9LG4uY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gbi5lbXB0eSgpfHwocz1bMCwwXSxoPVswLDBdLG89YT1udWxsKSxufSxuLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuISFjJiZzWzBdPT1zWzFdfHwhIWYmJmhbMF09PWhbMV19LGFvLnJlYmluZChuLGwsIm9uIil9O3ZhciAkbD17bjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxCbD1bWyJuIiwiZSIsInMiLCJ3IiwibnciLCJuZSIsInNlIiwic3ciXSxbImUiLCJ3Il0sWyJuIiwicyJdLFtdXSxXbD1nYS5mb3JtYXQ9eGEudGltZUZvcm1hdCxKbD1XbC51dGMsR2w9SmwoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO1dsLmlzbz1EYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyYmK25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9lbzpHbCxlby5wYXJzZT1mdW5jdGlvbihuKXt2YXIgdD1uZXcgRGF0ZShuKTtyZXR1cm4gaXNOYU4odCk/bnVsbDp0fSxlby50b1N0cmluZz1HbC50b1N0cmluZyxnYS5zZWNvbmQ9T24oZnVuY3Rpb24obil7cmV0dXJuIG5ldyB2YSgxZTMqTWF0aC5mbG9vcihuLzFlMykpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSsxZTMqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX0pLGdhLnNlY29uZHM9Z2Euc2Vjb25kLnJhbmdlLGdhLnNlY29uZHMudXRjPWdhLnNlY29uZC51dGMucmFuZ2UsZ2EubWludXRlPU9uKGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgdmEoNmU0Kk1hdGguZmxvb3Iobi82ZTQpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrNmU0Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaW51dGVzKCl9KSxnYS5taW51dGVzPWdhLm1pbnV0ZS5yYW5nZSxnYS5taW51dGVzLnV0Yz1nYS5taW51dGUudXRjLnJhbmdlLGdhLmhvdXI9T24oZnVuY3Rpb24obil7dmFyIHQ9bi5nZXRUaW1lem9uZU9mZnNldCgpLzYwO3JldHVybiBuZXcgdmEoMzZlNSooTWF0aC5mbG9vcihuLzM2ZTUtdCkrdCkpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSszNmU1Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRIb3VycygpfSksZ2EuaG91cnM9Z2EuaG91ci5yYW5nZSxnYS5ob3Vycy51dGM9Z2EuaG91ci51dGMucmFuZ2UsZ2EubW9udGg9T24oZnVuY3Rpb24obil7cmV0dXJuIG49Z2EuZGF5KG4pLG4uc2V0RGF0ZSgxKSxufSxmdW5jdGlvbihuLHQpe24uc2V0TW9udGgobi5nZXRNb250aCgpK3QpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfSksZ2EubW9udGhzPWdhLm1vbnRoLnJhbmdlLGdhLm1vbnRocy51dGM9Z2EubW9udGgudXRjLnJhbmdlO3ZhciBLbD1bMWUzLDVlMywxNWUzLDNlNCw2ZTQsM2U1LDllNSwxOGU1LDM2ZTUsMTA4ZTUsMjE2ZTUsNDMyZTUsODY0ZTUsMTcyOGU1LDYwNDhlNSwyNTkyZTYsNzc3NmU2LDMxNTM2ZTZdLFFsPVtbZ2Euc2Vjb25kLDFdLFtnYS5zZWNvbmQsNV0sW2dhLnNlY29uZCwxNV0sW2dhLnNlY29uZCwzMF0sW2dhLm1pbnV0ZSwxXSxbZ2EubWludXRlLDVdLFtnYS5taW51dGUsMTVdLFtnYS5taW51dGUsMzBdLFtnYS5ob3VyLDFdLFtnYS5ob3VyLDNdLFtnYS5ob3VyLDZdLFtnYS5ob3VyLDEyXSxbZ2EuZGF5LDFdLFtnYS5kYXksMl0sW2dhLndlZWssMV0sW2dhLm1vbnRoLDFdLFtnYS5tb250aCwzXSxbZ2EueWVhciwxXV0sbmM9V2wubXVsdGkoW1siLiVMIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaWxsaXNlY29uZHMoKX1dLFsiOiVTIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRTZWNvbmRzKCl9XSxbIiVJOiVNIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaW51dGVzKCl9XSxbIiVJICVwIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRIb3VycygpfV0sWyIlYSAlZCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF5KCkmJjEhPW4uZ2V0RGF0ZSgpfV0sWyIlYiAlZCIsZnVuY3Rpb24obil7cmV0dXJuIDEhPW4uZ2V0RGF0ZSgpfV0sWyIlQiIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TW9udGgoKX1dLFsiJVkiLHp0XV0pLHRjPXtyYW5nZTpmdW5jdGlvbihuLHQsZSl7cmV0dXJuIGFvLnJhbmdlKE1hdGguY2VpbChuL2UpKmUsK3QsZSkubWFwKGlvKX0sZmxvb3I6bSxjZWlsOm19O1FsLnllYXI9Z2EueWVhcixnYS5zY2FsZT1mdW5jdGlvbigpe3JldHVybiBybyhhby5zY2FsZS5saW5lYXIoKSxRbCxuYyl9O3ZhciBlYz1RbC5tYXAoZnVuY3Rpb24obil7cmV0dXJuW25bMF0udXRjLG5bMV1dfSkscmM9SmwubXVsdGkoW1siLiVMIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaWxsaXNlY29uZHMoKX1dLFsiOiVTIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENTZWNvbmRzKCl9XSxbIiVJOiVNIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaW51dGVzKCl9XSxbIiVJICVwIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENIb3VycygpfV0sWyIlYSAlZCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDRGF5KCkmJjEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlYiAlZCIsZnVuY3Rpb24obil7cmV0dXJuIDEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlQiIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTW9udGgoKX1dLFsiJVkiLHp0XV0pO2VjLnllYXI9Z2EueWVhci51dGMsZ2Euc2NhbGUudXRjPWZ1bmN0aW9uKCl7cmV0dXJuIHJvKGFvLnNjYWxlLmxpbmVhcigpLGVjLHJjKX0sYW8udGV4dD1BbihmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVRleHR9KSxhby5qc29uPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIENuKG4sImFwcGxpY2F0aW9uL2pzb24iLHVvLHQpfSxhby5odG1sPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIENuKG4sInRleHQvaHRtbCIsb28sdCl9LGFvLnhtbD1BbihmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVhNTH0pLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/KHRoaXMuZDM9YW8sZGVmaW5lKGFvKSk6Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWFvOnRoaXMuZDM9YW99KCk7"></script>
<script src="data:application/javascript; charset=utf-8;base64,KGZ1bmN0aW9uKGV4cG9ydHMpewpjcm9zc2ZpbHRlci52ZXJzaW9uID0gIjEuMy4xNCI7CmZ1bmN0aW9uIGNyb3NzZmlsdGVyX2lkZW50aXR5KGQpIHsKICByZXR1cm4gZDsKfQpjcm9zc2ZpbHRlci5wZXJtdXRlID0gcGVybXV0ZTsKCmZ1bmN0aW9uIHBlcm11dGUoYXJyYXksIGluZGV4KSB7CiAgZm9yICh2YXIgaSA9IDAsIG4gPSBpbmRleC5sZW5ndGgsIGNvcHkgPSBuZXcgQXJyYXkobik7IGkgPCBuOyArK2kpIHsKICAgIGNvcHlbaV0gPSBhcnJheVtpbmRleFtpXV07CiAgfQogIHJldHVybiBjb3B5Owp9CnZhciBiaXNlY3QgPSBjcm9zc2ZpbHRlci5iaXNlY3QgPSBiaXNlY3RfYnkoY3Jvc3NmaWx0ZXJfaWRlbnRpdHkpOwoKYmlzZWN0LmJ5ID0gYmlzZWN0X2J5OwoKZnVuY3Rpb24gYmlzZWN0X2J5KGYpIHsKCiAgLy8gTG9jYXRlIHRoZSBpbnNlcnRpb24gcG9pbnQgZm9yIHggaW4gYSB0byBtYWludGFpbiBzb3J0ZWQgb3JkZXIuIFRoZQogIC8vIGFyZ3VtZW50cyBsbyBhbmQgaGkgbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSBhIHN1YnNldCBvZiB0aGUgYXJyYXkgd2hpY2gKICAvLyBzaG91bGQgYmUgY29uc2lkZXJlZDsgYnkgZGVmYXVsdCB0aGUgZW50aXJlIGFycmF5IGlzIHVzZWQuIElmIHggaXMgYWxyZWFkeQogIC8vIHByZXNlbnQgaW4gYSwgdGhlIGluc2VydGlvbiBwb2ludCB3aWxsIGJlIGJlZm9yZSAodG8gdGhlIGxlZnQgb2YpIGFueQogIC8vIGV4aXN0aW5nIGVudHJpZXMuIFRoZSByZXR1cm4gdmFsdWUgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgZmlyc3QKICAvLyBhcmd1bWVudCB0byBgYXJyYXkuc3BsaWNlYCBhc3N1bWluZyB0aGF0IGEgaXMgYWxyZWFkeSBzb3J0ZWQuCiAgLy8KICAvLyBUaGUgcmV0dXJuZWQgaW5zZXJ0aW9uIHBvaW50IGkgcGFydGl0aW9ucyB0aGUgYXJyYXkgYSBpbnRvIHR3byBoYWx2ZXMgc28KICAvLyB0aGF0IGFsbCB2IDwgeCBmb3IgdiBpbiBhW2xvOmldIGZvciB0aGUgbGVmdCBzaWRlIGFuZCBhbGwgdiA+PSB4IGZvciB2IGluCiAgLy8gYVtpOmhpXSBmb3IgdGhlIHJpZ2h0IHNpZGUuCiAgZnVuY3Rpb24gYmlzZWN0TGVmdChhLCB4LCBsbywgaGkpIHsKICAgIHdoaWxlIChsbyA8IGhpKSB7CiAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxOwogICAgICBpZiAoZihhW21pZF0pIDwgeCkgbG8gPSBtaWQgKyAxOwogICAgICBlbHNlIGhpID0gbWlkOwogICAgfQogICAgcmV0dXJuIGxvOwogIH0KCiAgLy8gU2ltaWxhciB0byBiaXNlY3RMZWZ0LCBidXQgcmV0dXJucyBhbiBpbnNlcnRpb24gcG9pbnQgd2hpY2ggY29tZXMgYWZ0ZXIgKHRvCiAgLy8gdGhlIHJpZ2h0IG9mKSBhbnkgZXhpc3RpbmcgZW50cmllcyBvZiB4IGluIGEuCiAgLy8KICAvLyBUaGUgcmV0dXJuZWQgaW5zZXJ0aW9uIHBvaW50IGkgcGFydGl0aW9ucyB0aGUgYXJyYXkgaW50byB0d28gaGFsdmVzIHNvIHRoYXQKICAvLyBhbGwgdiA8PSB4IGZvciB2IGluIGFbbG86aV0gZm9yIHRoZSBsZWZ0IHNpZGUgYW5kIGFsbCB2ID4geCBmb3IgdiBpbgogIC8vIGFbaTpoaV0gZm9yIHRoZSByaWdodCBzaWRlLgogIGZ1bmN0aW9uIGJpc2VjdFJpZ2h0KGEsIHgsIGxvLCBoaSkgewogICAgd2hpbGUgKGxvIDwgaGkpIHsKICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7CiAgICAgIGlmICh4IDwgZihhW21pZF0pKSBoaSA9IG1pZDsKICAgICAgZWxzZSBsbyA9IG1pZCArIDE7CiAgICB9CiAgICByZXR1cm4gbG87CiAgfQoKICBiaXNlY3RSaWdodC5yaWdodCA9IGJpc2VjdFJpZ2h0OwogIGJpc2VjdFJpZ2h0LmxlZnQgPSBiaXNlY3RMZWZ0OwogIHJldHVybiBiaXNlY3RSaWdodDsKfQp2YXIgaGVhcCA9IGNyb3NzZmlsdGVyLmhlYXAgPSBoZWFwX2J5KGNyb3NzZmlsdGVyX2lkZW50aXR5KTsKCmhlYXAuYnkgPSBoZWFwX2J5OwoKZnVuY3Rpb24gaGVhcF9ieShmKSB7CgogIC8vIEJ1aWxkcyBhIGJpbmFyeSBoZWFwIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGFbbG86aGldLiBUaGUgaGVhcCBoYXMgdGhlCiAgLy8gcHJvcGVydHkgc3VjaCB0aGF0IHRoZSBwYXJlbnQgYVtsbytpXSBpcyBhbHdheXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGl0cwogIC8vIHR3byBjaGlsZHJlbjogYVtsbysyKmkrMV0gYW5kIGFbbG8rMippKzJdLgogIGZ1bmN0aW9uIGhlYXAoYSwgbG8sIGhpKSB7CiAgICB2YXIgbiA9IGhpIC0gbG8sCiAgICAgICAgaSA9IChuID4+PiAxKSArIDE7CiAgICB3aGlsZSAoLS1pID4gMCkgc2lmdChhLCBpLCBuLCBsbyk7CiAgICByZXR1cm4gYTsKICB9CgogIC8vIFNvcnRzIHRoZSBzcGVjaWZpZWQgYXJyYXkgYVtsbzpoaV0gaW4gZGVzY2VuZGluZyBvcmRlciwgYXNzdW1pbmcgaXQgaXMKICAvLyBhbHJlYWR5IGEgaGVhcC4KICBmdW5jdGlvbiBzb3J0KGEsIGxvLCBoaSkgewogICAgdmFyIG4gPSBoaSAtIGxvLAogICAgICAgIHQ7CiAgICB3aGlsZSAoLS1uID4gMCkgdCA9IGFbbG9dLCBhW2xvXSA9IGFbbG8gKyBuXSwgYVtsbyArIG5dID0gdCwgc2lmdChhLCAxLCBuLCBsbyk7CiAgICByZXR1cm4gYTsKICB9CgogIC8vIFNpZnRzIHRoZSBlbGVtZW50IGFbbG8raS0xXSBkb3duIHRoZSBoZWFwLCB3aGVyZSB0aGUgaGVhcCBpcyB0aGUgY29udGlndW91cwogIC8vIHNsaWNlIG9mIGFycmF5IGFbbG86bG8rbl0uIFRoaXMgbWV0aG9kIGNhbiBhbHNvIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBoZWFwCiAgLy8gaW5jcmVtZW50YWxseSwgd2l0aG91dCBpbmN1cnJpbmcgdGhlIGZ1bGwgY29zdCBvZiByZWNvbnN0cnVjdGluZyB0aGUgaGVhcC4KICBmdW5jdGlvbiBzaWZ0KGEsIGksIG4sIGxvKSB7CiAgICB2YXIgZCA9IGFbLS1sbyArIGldLAogICAgICAgIHggPSBmKGQpLAogICAgICAgIGNoaWxkOwogICAgd2hpbGUgKChjaGlsZCA9IGkgPDwgMSkgPD0gbikgewogICAgICBpZiAoY2hpbGQgPCBuICYmIGYoYVtsbyArIGNoaWxkXSkgPiBmKGFbbG8gKyBjaGlsZCArIDFdKSkgY2hpbGQrKzsKICAgICAgaWYgKHggPD0gZihhW2xvICsgY2hpbGRdKSkgYnJlYWs7CiAgICAgIGFbbG8gKyBpXSA9IGFbbG8gKyBjaGlsZF07CiAgICAgIGkgPSBjaGlsZDsKICAgIH0KICAgIGFbbG8gKyBpXSA9IGQ7CiAgfQoKICBoZWFwLnNvcnQgPSBzb3J0OwogIHJldHVybiBoZWFwOwp9CnZhciBoZWFwc2VsZWN0ID0gY3Jvc3NmaWx0ZXIuaGVhcHNlbGVjdCA9IGhlYXBzZWxlY3RfYnkoY3Jvc3NmaWx0ZXJfaWRlbnRpdHkpOwoKaGVhcHNlbGVjdC5ieSA9IGhlYXBzZWxlY3RfYnk7CgpmdW5jdGlvbiBoZWFwc2VsZWN0X2J5KGYpIHsKICB2YXIgaGVhcCA9IGhlYXBfYnkoZik7CgogIC8vIFJldHVybnMgYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgdG9wIGsgZWxlbWVudHMgaW4gdGhlIGFycmF5IGFbbG86aGldLgogIC8vIFRoZSByZXR1cm5lZCBhcnJheSBpcyBub3Qgc29ydGVkLCBidXQgbWFpbnRhaW5zIHRoZSBoZWFwIHByb3BlcnR5LiBJZiBrIGlzCiAgLy8gZ3JlYXRlciB0aGFuIGhpIC0gbG8sIHRoZW4gZmV3ZXIgdGhhbiBrIGVsZW1lbnRzIHdpbGwgYmUgcmV0dXJuZWQuIFRoZQogIC8vIG9yZGVyIG9mIGVsZW1lbnRzIGluIGEgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgb3BlcmF0aW9uLgogIGZ1bmN0aW9uIGhlYXBzZWxlY3QoYSwgbG8sIGhpLCBrKSB7CiAgICB2YXIgcXVldWUgPSBuZXcgQXJyYXkoayA9IE1hdGgubWluKGhpIC0gbG8sIGspKSwKICAgICAgICBtaW4sCiAgICAgICAgaSwKICAgICAgICB4LAogICAgICAgIGQ7CgogICAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgcXVldWVbaV0gPSBhW2xvKytdOwogICAgaGVhcChxdWV1ZSwgMCwgayk7CgogICAgaWYgKGxvIDwgaGkpIHsKICAgICAgbWluID0gZihxdWV1ZVswXSk7CiAgICAgIGRvIHsKICAgICAgICBpZiAoeCA9IGYoZCA9IGFbbG9dKSA+IG1pbikgewogICAgICAgICAgcXVldWVbMF0gPSBkOwogICAgICAgICAgbWluID0gZihoZWFwKHF1ZXVlLCAwLCBrKVswXSk7CiAgICAgICAgfQogICAgICB9IHdoaWxlICgrK2xvIDwgaGkpOwogICAgfQoKICAgIHJldHVybiBxdWV1ZTsKICB9CgogIHJldHVybiBoZWFwc2VsZWN0Owp9CnZhciBpbnNlcnRpb25zb3J0ID0gY3Jvc3NmaWx0ZXIuaW5zZXJ0aW9uc29ydCA9IGluc2VydGlvbnNvcnRfYnkoY3Jvc3NmaWx0ZXJfaWRlbnRpdHkpOwoKaW5zZXJ0aW9uc29ydC5ieSA9IGluc2VydGlvbnNvcnRfYnk7CgpmdW5jdGlvbiBpbnNlcnRpb25zb3J0X2J5KGYpIHsKCiAgZnVuY3Rpb24gaW5zZXJ0aW9uc29ydChhLCBsbywgaGkpIHsKICAgIGZvciAodmFyIGkgPSBsbyArIDE7IGkgPCBoaTsgKytpKSB7CiAgICAgIGZvciAodmFyIGogPSBpLCB0ID0gYVtpXSwgeCA9IGYodCk7IGogPiBsbyAmJiBmKGFbaiAtIDFdKSA+IHg7IC0taikgewogICAgICAgIGFbal0gPSBhW2ogLSAxXTsKICAgICAgfQogICAgICBhW2pdID0gdDsKICAgIH0KICAgIHJldHVybiBhOwogIH0KCiAgcmV0dXJuIGluc2VydGlvbnNvcnQ7Cn0KLy8gQWxnb3JpdGhtIGRlc2lnbmVkIGJ5IFZsYWRpbWlyIFlhcm9zbGF2c2tpeS4KLy8gSW1wbGVtZW50YXRpb24gYmFzZWQgb24gdGhlIERhcnQgcHJvamVjdDsgc2VlIGxpYi9kYXJ0L0xJQ0VOU0UgZm9yIGRldGFpbHMuCgp2YXIgcXVpY2tzb3J0ID0gY3Jvc3NmaWx0ZXIucXVpY2tzb3J0ID0gcXVpY2tzb3J0X2J5KGNyb3NzZmlsdGVyX2lkZW50aXR5KTsKCnF1aWNrc29ydC5ieSA9IHF1aWNrc29ydF9ieTsKCmZ1bmN0aW9uIHF1aWNrc29ydF9ieShmKSB7CiAgdmFyIGluc2VydGlvbnNvcnQgPSBpbnNlcnRpb25zb3J0X2J5KGYpOwoKICBmdW5jdGlvbiBzb3J0KGEsIGxvLCBoaSkgewogICAgcmV0dXJuIChoaSAtIGxvIDwgcXVpY2tzb3J0X3NpemVUaHJlc2hvbGQKICAgICAgICA/IGluc2VydGlvbnNvcnQKICAgICAgICA6IHF1aWNrc29ydCkoYSwgbG8sIGhpKTsKICB9CgogIGZ1bmN0aW9uIHF1aWNrc29ydChhLCBsbywgaGkpIHsKICAgIC8vIENvbXB1dGUgdGhlIHR3byBwaXZvdHMgYnkgbG9va2luZyBhdCA1IGVsZW1lbnRzLgogICAgdmFyIHNpeHRoID0gKGhpIC0gbG8pIC8gNiB8IDAsCiAgICAgICAgaTEgPSBsbyArIHNpeHRoLAogICAgICAgIGk1ID0gaGkgLSAxIC0gc2l4dGgsCiAgICAgICAgaTMgPSBsbyArIGhpIC0gMSA+PiAxLCAgLy8gVGhlIG1pZHBvaW50LgogICAgICAgIGkyID0gaTMgLSBzaXh0aCwKICAgICAgICBpNCA9IGkzICsgc2l4dGg7CgogICAgdmFyIGUxID0gYVtpMV0sIHgxID0gZihlMSksCiAgICAgICAgZTIgPSBhW2kyXSwgeDIgPSBmKGUyKSwKICAgICAgICBlMyA9IGFbaTNdLCB4MyA9IGYoZTMpLAogICAgICAgIGU0ID0gYVtpNF0sIHg0ID0gZihlNCksCiAgICAgICAgZTUgPSBhW2k1XSwgeDUgPSBmKGU1KTsKCiAgICB2YXIgdDsKCiAgICAvLyBTb3J0IHRoZSBzZWxlY3RlZCA1IGVsZW1lbnRzIHVzaW5nIGEgc29ydGluZyBuZXR3b3JrLgogICAgaWYgKHgxID4geDIpIHQgPSBlMSwgZTEgPSBlMiwgZTIgPSB0LCB0ID0geDEsIHgxID0geDIsIHgyID0gdDsKICAgIGlmICh4NCA+IHg1KSB0ID0gZTQsIGU0ID0gZTUsIGU1ID0gdCwgdCA9IHg0LCB4NCA9IHg1LCB4NSA9IHQ7CiAgICBpZiAoeDEgPiB4MykgdCA9IGUxLCBlMSA9IGUzLCBlMyA9IHQsIHQgPSB4MSwgeDEgPSB4MywgeDMgPSB0OwogICAgaWYgKHgyID4geDMpIHQgPSBlMiwgZTIgPSBlMywgZTMgPSB0LCB0ID0geDIsIHgyID0geDMsIHgzID0gdDsKICAgIGlmICh4MSA+IHg0KSB0ID0gZTEsIGUxID0gZTQsIGU0ID0gdCwgdCA9IHgxLCB4MSA9IHg0LCB4NCA9IHQ7CiAgICBpZiAoeDMgPiB4NCkgdCA9IGUzLCBlMyA9IGU0LCBlNCA9IHQsIHQgPSB4MywgeDMgPSB4NCwgeDQgPSB0OwogICAgaWYgKHgyID4geDUpIHQgPSBlMiwgZTIgPSBlNSwgZTUgPSB0LCB0ID0geDIsIHgyID0geDUsIHg1ID0gdDsKICAgIGlmICh4MiA+IHgzKSB0ID0gZTIsIGUyID0gZTMsIGUzID0gdCwgdCA9IHgyLCB4MiA9IHgzLCB4MyA9IHQ7CiAgICBpZiAoeDQgPiB4NSkgdCA9IGU0LCBlNCA9IGU1LCBlNSA9IHQsIHQgPSB4NCwgeDQgPSB4NSwgeDUgPSB0OwoKICAgIHZhciBwaXZvdDEgPSBlMiwgcGl2b3RWYWx1ZTEgPSB4MiwKICAgICAgICBwaXZvdDIgPSBlNCwgcGl2b3RWYWx1ZTIgPSB4NDsKCiAgICAvLyBlMiBhbmQgZTQgaGF2ZSBiZWVuIHNhdmVkIGluIHRoZSBwaXZvdCB2YXJpYWJsZXMuIFRoZXkgd2lsbCBiZSB3cml0dGVuCiAgICAvLyBiYWNrLCBvbmNlIHRoZSBwYXJ0aXRpb25pbmcgaXMgZmluaXNoZWQuCiAgICBhW2kxXSA9IGUxOwogICAgYVtpMl0gPSBhW2xvXTsKICAgIGFbaTNdID0gZTM7CiAgICBhW2k0XSA9IGFbaGkgLSAxXTsKICAgIGFbaTVdID0gZTU7CgogICAgdmFyIGxlc3MgPSBsbyArIDEsICAgLy8gRmlyc3QgZWxlbWVudCBpbiB0aGUgbWlkZGxlIHBhcnRpdGlvbi4KICAgICAgICBncmVhdCA9IGhpIC0gMjsgIC8vIExhc3QgZWxlbWVudCBpbiB0aGUgbWlkZGxlIHBhcnRpdGlvbi4KCiAgICAvLyBOb3RlIHRoYXQgZm9yIHZhbHVlIGNvbXBhcmlzb24sIDwsIDw9LCA+PSBhbmQgPiBjb2VyY2UgdG8gYSBwcmltaXRpdmUgdmlhCiAgICAvLyBPYmplY3QucHJvdG90eXBlLnZhbHVlT2Y7ID09IGFuZCA9PT0gZG8gbm90LCBzbyBpbiBvcmRlciB0byBiZSBjb25zaXN0ZW50CiAgICAvLyB3aXRoIG5hdHVyYWwgb3JkZXIgKHN1Y2ggYXMgZm9yIERhdGUgb2JqZWN0cyksIHdlIG11c3QgZG8gdHdvIGNvbXBhcmVzLgogICAgdmFyIHBpdm90c0VxdWFsID0gcGl2b3RWYWx1ZTEgPD0gcGl2b3RWYWx1ZTIgJiYgcGl2b3RWYWx1ZTEgPj0gcGl2b3RWYWx1ZTI7CiAgICBpZiAocGl2b3RzRXF1YWwpIHsKCiAgICAgIC8vIERlZ2VuZXJhdGVkIGNhc2Ugd2hlcmUgdGhlIHBhcnRpdGlvbmluZyBiZWNvbWVzIGEgZHV0Y2ggbmF0aW9uYWwgZmxhZwogICAgICAvLyBwcm9ibGVtLgogICAgICAvLwogICAgICAvLyBbIHwgIDwgcGl2b3QgIHwgPT0gcGl2b3QgfCB1bnBhcnRpdGlvbmVkIHwgPiBwaXZvdCAgfCBdCiAgICAgIC8vICBeICAgICAgICAgICAgIF4gICAgICAgICAgXiAgICAgICAgICAgICBeICAgICAgICAgICAgXgogICAgICAvLyBsZWZ0ICAgICAgICAgbGVzcyAgICAgICAgIGsgICAgICAgICAgIGdyZWF0ICAgICAgICAgcmlnaHQKICAgICAgLy8KICAgICAgLy8gYVtsZWZ0XSBhbmQgYVtyaWdodF0gYXJlIHVuZGVmaW5lZCBhbmQgYXJlIGZpbGxlZCBhZnRlciB0aGUKICAgICAgLy8gcGFydGl0aW9uaW5nLgogICAgICAvLwogICAgICAvLyBJbnZhcmlhbnRzOgogICAgICAvLyAgIDEpIGZvciB4IGluIF1sZWZ0LCBsZXNzWyA6IHggPCBwaXZvdC4KICAgICAgLy8gICAyKSBmb3IgeCBpbiBbbGVzcywga1sgOiB4ID09IHBpdm90LgogICAgICAvLyAgIDMpIGZvciB4IGluIF1ncmVhdCwgcmlnaHRbIDogeCA+IHBpdm90LgogICAgICBmb3IgKHZhciBrID0gbGVzczsgayA8PSBncmVhdDsgKytrKSB7CiAgICAgICAgdmFyIGVrID0gYVtrXSwgeGsgPSBmKGVrKTsKICAgICAgICBpZiAoeGsgPCBwaXZvdFZhbHVlMSkgewogICAgICAgICAgaWYgKGsgIT09IGxlc3MpIHsKICAgICAgICAgICAgYVtrXSA9IGFbbGVzc107CiAgICAgICAgICAgIGFbbGVzc10gPSBlazsKICAgICAgICAgIH0KICAgICAgICAgICsrbGVzczsKICAgICAgICB9IGVsc2UgaWYgKHhrID4gcGl2b3RWYWx1ZTEpIHsKCiAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBlbGVtZW50IDw9IHBpdm90IGluIHRoZSByYW5nZSBbayAtIDEsIGdyZWF0XSBhbmQKICAgICAgICAgIC8vIHB1dCBbOmVrOl0gdGhlcmUuIFdlIGtub3cgdGhhdCBzdWNoIGFuIGVsZW1lbnQgbXVzdCBleGlzdDoKICAgICAgICAgIC8vIFdoZW4gayA9PSBsZXNzLCB0aGVuIGVsMyAod2hpY2ggaXMgZXF1YWwgdG8gcGl2b3QpIGxpZXMgaW4gdGhlCiAgICAgICAgICAvLyBpbnRlcnZhbC4gT3RoZXJ3aXNlIGFbayAtIDFdID09IHBpdm90IGFuZCB0aGUgc2VhcmNoIHN0b3BzIGF0IGstMS4KICAgICAgICAgIC8vIE5vdGUgdGhhdCBpbiB0aGUgbGF0dGVyIGNhc2UgaW52YXJpYW50IDIgd2lsbCBiZSB2aW9sYXRlZCBmb3IgYQogICAgICAgICAgLy8gc2hvcnQgYW1vdW50IG9mIHRpbWUuIFRoZSBpbnZhcmlhbnQgd2lsbCBiZSByZXN0b3JlZCB3aGVuIHRoZQogICAgICAgICAgLy8gcGl2b3RzIGFyZSBwdXQgaW50byB0aGVpciBmaW5hbCBwb3NpdGlvbnMuCiAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICB2YXIgZ3JlYXRWYWx1ZSA9IGYoYVtncmVhdF0pOwogICAgICAgICAgICBpZiAoZ3JlYXRWYWx1ZSA+IHBpdm90VmFsdWUxKSB7CiAgICAgICAgICAgICAgZ3JlYXQtLTsKICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IGxvY2F0aW9uIGluIHRoZSB3aGlsZS1sb29wIHdoZXJlIGEgbmV3CiAgICAgICAgICAgICAgLy8gaXRlcmF0aW9uIGlzIHN0YXJ0ZWQuCiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JlYXRWYWx1ZSA8IHBpdm90VmFsdWUxKSB7CiAgICAgICAgICAgICAgLy8gVHJpcGxlIGV4Y2hhbmdlLgogICAgICAgICAgICAgIGFba10gPSBhW2xlc3NdOwogICAgICAgICAgICAgIGFbbGVzcysrXSA9IGFbZ3JlYXRdOwogICAgICAgICAgICAgIGFbZ3JlYXQtLV0gPSBlazsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhW2tdID0gYVtncmVhdF07CiAgICAgICAgICAgICAgYVtncmVhdC0tXSA9IGVrOwogICAgICAgICAgICAgIC8vIE5vdGU6IGlmIGdyZWF0IDwgayB0aGVuIHdlIHdpbGwgZXhpdCB0aGUgb3V0ZXIgbG9vcCBhbmQgZml4CiAgICAgICAgICAgICAgLy8gaW52YXJpYW50IDIgKHdoaWNoIHdlIGp1c3QgdmlvbGF0ZWQpLgogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewoKICAgICAgLy8gV2UgcGFydGl0aW9uIHRoZSBsaXN0IGludG8gdGhyZWUgcGFydHM6CiAgICAgIC8vICAxLiA8IHBpdm90MQogICAgICAvLyAgMi4gPj0gcGl2b3QxICYmIDw9IHBpdm90MgogICAgICAvLyAgMy4gPiBwaXZvdDIKICAgICAgLy8KICAgICAgLy8gRHVyaW5nIHRoZSBsb29wIHdlIGhhdmU6CiAgICAgIC8vIFsgfCA8IHBpdm90MSB8ID49IHBpdm90MSAmJiA8PSBwaXZvdDIgfCB1bnBhcnRpdGlvbmVkICB8ID4gcGl2b3QyICB8IF0KICAgICAgLy8gIF4gICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgXiAgICAgICAgICAgICBeCiAgICAgIC8vIGxlZnQgICAgICAgICBsZXNzICAgICAgICAgICAgICAgICAgICAgayAgICAgICAgICAgICAgZ3JlYXQgICAgICAgIHJpZ2h0CiAgICAgIC8vCiAgICAgIC8vIGFbbGVmdF0gYW5kIGFbcmlnaHRdIGFyZSB1bmRlZmluZWQgYW5kIGFyZSBmaWxsZWQgYWZ0ZXIgdGhlCiAgICAgIC8vIHBhcnRpdGlvbmluZy4KICAgICAgLy8KICAgICAgLy8gSW52YXJpYW50czoKICAgICAgLy8gICAxLiBmb3IgeCBpbiBdbGVmdCwgbGVzc1sgOiB4IDwgcGl2b3QxCiAgICAgIC8vICAgMi4gZm9yIHggaW4gW2xlc3MsIGtbIDogcGl2b3QxIDw9IHggJiYgeCA8PSBwaXZvdDIKICAgICAgLy8gICAzLiBmb3IgeCBpbiBdZ3JlYXQsIHJpZ2h0WyA6IHggPiBwaXZvdDIKICAgICAgZm9yICh2YXIgayA9IGxlc3M7IGsgPD0gZ3JlYXQ7IGsrKykgewogICAgICAgIHZhciBlayA9IGFba10sIHhrID0gZihlayk7CiAgICAgICAgaWYgKHhrIDwgcGl2b3RWYWx1ZTEpIHsKICAgICAgICAgIGlmIChrICE9PSBsZXNzKSB7CiAgICAgICAgICAgIGFba10gPSBhW2xlc3NdOwogICAgICAgICAgICBhW2xlc3NdID0gZWs7CiAgICAgICAgICB9CiAgICAgICAgICArK2xlc3M7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh4ayA+IHBpdm90VmFsdWUyKSB7CiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgdmFyIGdyZWF0VmFsdWUgPSBmKGFbZ3JlYXRdKTsKICAgICAgICAgICAgICBpZiAoZ3JlYXRWYWx1ZSA+IHBpdm90VmFsdWUyKSB7CiAgICAgICAgICAgICAgICBncmVhdC0tOwogICAgICAgICAgICAgICAgaWYgKGdyZWF0IDwgaykgYnJlYWs7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IGxvY2F0aW9uIGluc2lkZSB0aGUgbG9vcCB3aGVyZSBhIG5ldwogICAgICAgICAgICAgICAgLy8gaXRlcmF0aW9uIGlzIHN0YXJ0ZWQuCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gYVtncmVhdF0gPD0gcGl2b3QyLgogICAgICAgICAgICAgICAgaWYgKGdyZWF0VmFsdWUgPCBwaXZvdFZhbHVlMSkgewogICAgICAgICAgICAgICAgICAvLyBUcmlwbGUgZXhjaGFuZ2UuCiAgICAgICAgICAgICAgICAgIGFba10gPSBhW2xlc3NdOwogICAgICAgICAgICAgICAgICBhW2xlc3MrK10gPSBhW2dyZWF0XTsKICAgICAgICAgICAgICAgICAgYVtncmVhdC0tXSA9IGVrOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gYVtncmVhdF0gPj0gcGl2b3QxLgogICAgICAgICAgICAgICAgICBhW2tdID0gYVtncmVhdF07CiAgICAgICAgICAgICAgICAgIGFbZ3JlYXQtLV0gPSBlazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIE1vdmUgcGl2b3RzIGludG8gdGhlaXIgZmluYWwgcG9zaXRpb25zLgogICAgLy8gV2Ugc2hydW5rIHRoZSBsaXN0IGZyb20gYm90aCBzaWRlcyAoYVtsZWZ0XSBhbmQgYVtyaWdodF0gaGF2ZQogICAgLy8gbWVhbmluZ2xlc3MgdmFsdWVzIGluIHRoZW0pIGFuZCBub3cgd2UgbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBmaXJzdAogICAgLy8gYW5kIHRoaXJkIHBhcnRpdGlvbiBpbnRvIHRoZXNlIGxvY2F0aW9ucyBzbyB0aGF0IHdlIGNhbiBzdG9yZSB0aGUKICAgIC8vIHBpdm90cy4KICAgIGFbbG9dID0gYVtsZXNzIC0gMV07CiAgICBhW2xlc3MgLSAxXSA9IHBpdm90MTsKICAgIGFbaGkgLSAxXSA9IGFbZ3JlYXQgKyAxXTsKICAgIGFbZ3JlYXQgKyAxXSA9IHBpdm90MjsKCiAgICAvLyBUaGUgbGlzdCBpcyBub3cgcGFydGl0aW9uZWQgaW50byB0aHJlZSBwYXJ0aXRpb25zOgogICAgLy8gWyA8IHBpdm90MSAgIHwgPj0gcGl2b3QxICYmIDw9IHBpdm90MiAgIHwgID4gcGl2b3QyICAgXQogICAgLy8gIF4gICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICBeCiAgICAvLyBsZWZ0ICAgICAgICAgbGVzcyAgICAgICAgICAgICAgICAgICAgIGdyZWF0ICAgICAgICByaWdodAoKICAgIC8vIFJlY3Vyc2l2ZSBkZXNjZW50LiAoRG9uJ3QgaW5jbHVkZSB0aGUgcGl2b3QgdmFsdWVzLikKICAgIHNvcnQoYSwgbG8sIGxlc3MgLSAxKTsKICAgIHNvcnQoYSwgZ3JlYXQgKyAyLCBoaSk7CgogICAgaWYgKHBpdm90c0VxdWFsKSB7CiAgICAgIC8vIEFsbCBlbGVtZW50cyBpbiB0aGUgc2Vjb25kIHBhcnRpdGlvbiBhcmUgZXF1YWwgdG8gdGhlIHBpdm90LiBObwogICAgICAvLyBuZWVkIHRvIHNvcnQgdGhlbS4KICAgICAgcmV0dXJuIGE7CiAgICB9CgogICAgLy8gSW4gdGhlb3J5IGl0IHNob3VsZCBiZSBlbm91Z2ggdG8gY2FsbCBfZG9Tb3J0IHJlY3Vyc2l2ZWx5IG9uIHRoZSBzZWNvbmQKICAgIC8vIHBhcnRpdGlvbi4KICAgIC8vIFRoZSBBbmRyb2lkIHNvdXJjZSBob3dldmVyIHJlbW92ZXMgdGhlIHBpdm90IGVsZW1lbnRzIGZyb20gdGhlIHJlY3Vyc2l2ZQogICAgLy8gY2FsbCBpZiB0aGUgc2Vjb25kIHBhcnRpdGlvbiBpcyB0b28gbGFyZ2UgKG1vcmUgdGhhbiAyLzMgb2YgdGhlIGxpc3QpLgogICAgaWYgKGxlc3MgPCBpMSAmJiBncmVhdCA+IGk1KSB7CiAgICAgIHZhciBsZXNzVmFsdWUsIGdyZWF0VmFsdWU7CiAgICAgIHdoaWxlICgobGVzc1ZhbHVlID0gZihhW2xlc3NdKSkgPD0gcGl2b3RWYWx1ZTEgJiYgbGVzc1ZhbHVlID49IHBpdm90VmFsdWUxKSArK2xlc3M7CiAgICAgIHdoaWxlICgoZ3JlYXRWYWx1ZSA9IGYoYVtncmVhdF0pKSA8PSBwaXZvdFZhbHVlMiAmJiBncmVhdFZhbHVlID49IHBpdm90VmFsdWUyKSAtLWdyZWF0OwoKICAgICAgLy8gQ29weSBwYXN0ZSBvZiB0aGUgcHJldmlvdXMgMy13YXkgcGFydGl0aW9uaW5nIHdpdGggYWRhcHRpb25zLgogICAgICAvLwogICAgICAvLyBXZSBwYXJ0aXRpb24gdGhlIGxpc3QgaW50byB0aHJlZSBwYXJ0czoKICAgICAgLy8gIDEuID09IHBpdm90MQogICAgICAvLyAgMi4gPiBwaXZvdDEgJiYgPCBwaXZvdDIKICAgICAgLy8gIDMuID09IHBpdm90MgogICAgICAvLwogICAgICAvLyBEdXJpbmcgdGhlIGxvb3Agd2UgaGF2ZToKICAgICAgLy8gWyA9PSBwaXZvdDEgfCA+IHBpdm90MSAmJiA8IHBpdm90MiB8IHVucGFydGl0aW9uZWQgIHwgPT0gcGl2b3QyIF0KICAgICAgLy8gICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgXgogICAgICAvLyAgICAgICAgICAgIGxlc3MgICAgICAgICAgICAgICAgICAgICBrICAgICAgICAgICAgICBncmVhdAogICAgICAvLwogICAgICAvLyBJbnZhcmlhbnRzOgogICAgICAvLyAgIDEuIGZvciB4IGluIFsgKiwgbGVzc1sgOiB4ID09IHBpdm90MQogICAgICAvLyAgIDIuIGZvciB4IGluIFtsZXNzLCBrWyA6IHBpdm90MSA8IHggJiYgeCA8IHBpdm90MgogICAgICAvLyAgIDMuIGZvciB4IGluIF1ncmVhdCwgKiBdIDogeCA9PSBwaXZvdDIKICAgICAgZm9yICh2YXIgayA9IGxlc3M7IGsgPD0gZ3JlYXQ7IGsrKykgewogICAgICAgIHZhciBlayA9IGFba10sIHhrID0gZihlayk7CiAgICAgICAgaWYgKHhrIDw9IHBpdm90VmFsdWUxICYmIHhrID49IHBpdm90VmFsdWUxKSB7CiAgICAgICAgICBpZiAoayAhPT0gbGVzcykgewogICAgICAgICAgICBhW2tdID0gYVtsZXNzXTsKICAgICAgICAgICAgYVtsZXNzXSA9IGVrOwogICAgICAgICAgfQogICAgICAgICAgbGVzcysrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoeGsgPD0gcGl2b3RWYWx1ZTIgJiYgeGsgPj0gcGl2b3RWYWx1ZTIpIHsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICB2YXIgZ3JlYXRWYWx1ZSA9IGYoYVtncmVhdF0pOwogICAgICAgICAgICAgIGlmIChncmVhdFZhbHVlIDw9IHBpdm90VmFsdWUyICYmIGdyZWF0VmFsdWUgPj0gcGl2b3RWYWx1ZTIpIHsKICAgICAgICAgICAgICAgIGdyZWF0LS07CiAgICAgICAgICAgICAgICBpZiAoZ3JlYXQgPCBrKSBicmVhazsKICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgbG9jYXRpb24gaW5zaWRlIHRoZSBsb29wIHdoZXJlIGEgbmV3CiAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gaXMgc3RhcnRlZC4KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBhW2dyZWF0XSA8IHBpdm90Mi4KICAgICAgICAgICAgICAgIGlmIChncmVhdFZhbHVlIDwgcGl2b3RWYWx1ZTEpIHsKICAgICAgICAgICAgICAgICAgLy8gVHJpcGxlIGV4Y2hhbmdlLgogICAgICAgICAgICAgICAgICBhW2tdID0gYVtsZXNzXTsKICAgICAgICAgICAgICAgICAgYVtsZXNzKytdID0gYVtncmVhdF07CiAgICAgICAgICAgICAgICAgIGFbZ3JlYXQtLV0gPSBlazsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8vIGFbZ3JlYXRdID09IHBpdm90MS4KICAgICAgICAgICAgICAgICAgYVtrXSA9IGFbZ3JlYXRdOwogICAgICAgICAgICAgICAgICBhW2dyZWF0LS1dID0gZWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBUaGUgc2Vjb25kIHBhcnRpdGlvbiBoYXMgbm93IGJlZW4gY2xlYXJlZCBvZiBwaXZvdCBlbGVtZW50cyBhbmQgbG9va3MKICAgIC8vIGFzIGZvbGxvd3M6CiAgICAvLyBbICAqICB8ICA+IHBpdm90MSAmJiA8IHBpdm90MiAgfCAqIF0KICAgIC8vICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgIF4KICAgIC8vICAgICAgIGxlc3MgICAgICAgICAgICAgICAgICBncmVhdAogICAgLy8gU29ydCB0aGUgc2Vjb25kIHBhcnRpdGlvbiB1c2luZyByZWN1cnNpdmUgZGVzY2VudC4KCiAgICAvLyBUaGUgc2Vjb25kIHBhcnRpdGlvbiBsb29rcyBhcyBmb2xsb3dzOgogICAgLy8gWyAgKiAgfCAgPj0gcGl2b3QxICYmIDw9IHBpdm90MiAgfCAqIF0KICAgIC8vICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgLy8gICAgICAgbGVzcyAgICAgICAgICAgICAgICAgICAgZ3JlYXQKICAgIC8vIFNpbXBseSBzb3J0IGl0IGJ5IHJlY3Vyc2l2ZSBkZXNjZW50LgoKICAgIHJldHVybiBzb3J0KGEsIGxlc3MsIGdyZWF0ICsgMSk7CiAgfQoKICByZXR1cm4gc29ydDsKfQoKdmFyIHF1aWNrc29ydF9zaXplVGhyZXNob2xkID0gMzI7CnZhciBjcm9zc2ZpbHRlcl9hcnJheTggPSBjcm9zc2ZpbHRlcl9hcnJheVVudHlwZWQsCiAgICBjcm9zc2ZpbHRlcl9hcnJheTE2ID0gY3Jvc3NmaWx0ZXJfYXJyYXlVbnR5cGVkLAogICAgY3Jvc3NmaWx0ZXJfYXJyYXkzMiA9IGNyb3NzZmlsdGVyX2FycmF5VW50eXBlZCwKICAgIGNyb3NzZmlsdGVyX2FycmF5TGVuZ3RoZW4gPSBjcm9zc2ZpbHRlcl9hcnJheUxlbmd0aGVuVW50eXBlZCwKICAgIGNyb3NzZmlsdGVyX2FycmF5V2lkZW4gPSBjcm9zc2ZpbHRlcl9hcnJheVdpZGVuVW50eXBlZDsKCmlmICh0eXBlb2YgVWludDhBcnJheSAhPT0gInVuZGVmaW5lZCIpIHsKICBjcm9zc2ZpbHRlcl9hcnJheTggPSBmdW5jdGlvbihuKSB7IHJldHVybiBuZXcgVWludDhBcnJheShuKTsgfTsKICBjcm9zc2ZpbHRlcl9hcnJheTE2ID0gZnVuY3Rpb24obikgeyByZXR1cm4gbmV3IFVpbnQxNkFycmF5KG4pOyB9OwogIGNyb3NzZmlsdGVyX2FycmF5MzIgPSBmdW5jdGlvbihuKSB7IHJldHVybiBuZXcgVWludDMyQXJyYXkobik7IH07CgogIGNyb3NzZmlsdGVyX2FycmF5TGVuZ3RoZW4gPSBmdW5jdGlvbihhcnJheSwgbGVuZ3RoKSB7CiAgICBpZiAoYXJyYXkubGVuZ3RoID49IGxlbmd0aCkgcmV0dXJuIGFycmF5OwogICAgdmFyIGNvcHkgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTsKICAgIGNvcHkuc2V0KGFycmF5KTsKICAgIHJldHVybiBjb3B5OwogIH07CgogIGNyb3NzZmlsdGVyX2FycmF5V2lkZW4gPSBmdW5jdGlvbihhcnJheSwgd2lkdGgpIHsKICAgIHZhciBjb3B5OwogICAgc3dpdGNoICh3aWR0aCkgewogICAgICBjYXNlIDE2OiBjb3B5ID0gY3Jvc3NmaWx0ZXJfYXJyYXkxNihhcnJheS5sZW5ndGgpOyBicmVhazsKICAgICAgY2FzZSAzMjogY29weSA9IGNyb3NzZmlsdGVyX2FycmF5MzIoYXJyYXkubGVuZ3RoKTsgYnJlYWs7CiAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBhcnJheSB3aWR0aCEiKTsKICAgIH0KICAgIGNvcHkuc2V0KGFycmF5KTsKICAgIHJldHVybiBjb3B5OwogIH07Cn0KCmZ1bmN0aW9uIGNyb3NzZmlsdGVyX2FycmF5VW50eXBlZChuKSB7CiAgdmFyIGFycmF5ID0gbmV3IEFycmF5KG4pLCBpID0gLTE7CiAgd2hpbGUgKCsraSA8IG4pIGFycmF5W2ldID0gMDsKICByZXR1cm4gYXJyYXk7Cn0KCmZ1bmN0aW9uIGNyb3NzZmlsdGVyX2FycmF5TGVuZ3RoZW5VbnR5cGVkKGFycmF5LCBsZW5ndGgpIHsKICB2YXIgbiA9IGFycmF5Lmxlbmd0aDsKICB3aGlsZSAobiA8IGxlbmd0aCkgYXJyYXlbbisrXSA9IDA7CiAgcmV0dXJuIGFycmF5Owp9CgpmdW5jdGlvbiBjcm9zc2ZpbHRlcl9hcnJheVdpZGVuVW50eXBlZChhcnJheSwgd2lkdGgpIHsKICBpZiAod2lkdGggPiAzMikgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGFycmF5IHdpZHRoISIpOwogIHJldHVybiBhcnJheTsKfQpmdW5jdGlvbiBjcm9zc2ZpbHRlcl9maWx0ZXJFeGFjdChiaXNlY3QsIHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlcykgewogICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoOwogICAgcmV0dXJuIFtiaXNlY3QubGVmdCh2YWx1ZXMsIHZhbHVlLCAwLCBuKSwgYmlzZWN0LnJpZ2h0KHZhbHVlcywgdmFsdWUsIDAsIG4pXTsKICB9Owp9CgpmdW5jdGlvbiBjcm9zc2ZpbHRlcl9maWx0ZXJSYW5nZShiaXNlY3QsIHJhbmdlKSB7CiAgdmFyIG1pbiA9IHJhbmdlWzBdLAogICAgICBtYXggPSByYW5nZVsxXTsKICByZXR1cm4gZnVuY3Rpb24odmFsdWVzKSB7CiAgICB2YXIgbiA9IHZhbHVlcy5sZW5ndGg7CiAgICByZXR1cm4gW2Jpc2VjdC5sZWZ0KHZhbHVlcywgbWluLCAwLCBuKSwgYmlzZWN0LmxlZnQodmFsdWVzLCBtYXgsIDAsIG4pXTsKICB9Owp9CgpmdW5jdGlvbiBjcm9zc2ZpbHRlcl9maWx0ZXJBbGwodmFsdWVzKSB7CiAgcmV0dXJuIFswLCB2YWx1ZXMubGVuZ3RoXTsKfQpmdW5jdGlvbiBjcm9zc2ZpbHRlcl9udWxsKCkgewogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIGNyb3NzZmlsdGVyX3plcm8oKSB7CiAgcmV0dXJuIDA7Cn0KZnVuY3Rpb24gY3Jvc3NmaWx0ZXJfcmVkdWNlSW5jcmVtZW50KHApIHsKICByZXR1cm4gcCArIDE7Cn0KCmZ1bmN0aW9uIGNyb3NzZmlsdGVyX3JlZHVjZURlY3JlbWVudChwKSB7CiAgcmV0dXJuIHAgLSAxOwp9CgpmdW5jdGlvbiBjcm9zc2ZpbHRlcl9yZWR1Y2VBZGQoZikgewogIHJldHVybiBmdW5jdGlvbihwLCB2KSB7CiAgICByZXR1cm4gcCArICtmKHYpOwogIH07Cn0KCmZ1bmN0aW9uIGNyb3NzZmlsdGVyX3JlZHVjZVN1YnRyYWN0KGYpIHsKICByZXR1cm4gZnVuY3Rpb24ocCwgdikgewogICAgcmV0dXJuIHAgLSBmKHYpOwogIH07Cn0KZXhwb3J0cy5jcm9zc2ZpbHRlciA9IGNyb3NzZmlsdGVyOwoKZnVuY3Rpb24gY3Jvc3NmaWx0ZXIoKSB7CiAgdmFyIGNyb3NzZmlsdGVyID0gewogICAgYWRkOiBhZGQsCiAgICByZW1vdmU6IHJlbW92ZURhdGEsCiAgICBkaW1lbnNpb246IGRpbWVuc2lvbiwKICAgIGdyb3VwQWxsOiBncm91cEFsbCwKICAgIHNpemU6IHNpemUKICB9OwoKICB2YXIgZGF0YSA9IFtdLCAvLyB0aGUgcmVjb3JkcwogICAgICBuID0gMCwgLy8gdGhlIG51bWJlciBvZiByZWNvcmRzOyBkYXRhLmxlbmd0aAogICAgICBtID0gMCwgLy8gYSBiaXQgbWFzayByZXByZXNlbnRpbmcgd2hpY2ggZGltZW5zaW9ucyBhcmUgaW4gdXNlCiAgICAgIE0gPSA4LCAvLyBudW1iZXIgb2YgZGltZW5zaW9ucyB0aGF0IGNhbiBmaXQgaW4gYGZpbHRlcnNgCiAgICAgIGZpbHRlcnMgPSBjcm9zc2ZpbHRlcl9hcnJheTgoMCksIC8vIE0gYml0cyBwZXIgcmVjb3JkOyAxIGlzIGZpbHRlcmVkIG91dAogICAgICBmaWx0ZXJMaXN0ZW5lcnMgPSBbXSwgLy8gd2hlbiB0aGUgZmlsdGVycyBjaGFuZ2UKICAgICAgZGF0YUxpc3RlbmVycyA9IFtdLCAvLyB3aGVuIGRhdGEgaXMgYWRkZWQKICAgICAgcmVtb3ZlRGF0YUxpc3RlbmVycyA9IFtdOyAvLyB3aGVuIGRhdGEgaXMgcmVtb3ZlZAoKICAvLyBBZGRzIHRoZSBzcGVjaWZpZWQgbmV3IHJlY29yZHMgdG8gdGhpcyBjcm9zc2ZpbHRlci4KICBmdW5jdGlvbiBhZGQobmV3RGF0YSkgewogICAgdmFyIG4wID0gbiwKICAgICAgICBuMSA9IG5ld0RhdGEubGVuZ3RoOwoKICAgIC8vIElmIHRoZXJlJ3MgYWN0dWFsbHkgbmV3IGRhdGEgdG8gYWRk4oCmCiAgICAvLyBNZXJnZSB0aGUgbmV3IGRhdGEgaW50byB0aGUgZXhpc3RpbmcgZGF0YS4KICAgIC8vIExlbmd0aGVuIHRoZSBmaWx0ZXIgYml0c2V0IHRvIGhhbmRsZSB0aGUgbmV3IHJlY29yZHMuCiAgICAvLyBOb3RpZnkgbGlzdGVuZXJzIChkaW1lbnNpb25zIGFuZCBncm91cHMpIHRoYXQgbmV3IGRhdGEgaXMgYXZhaWxhYmxlLgogICAgaWYgKG4xKSB7CiAgICAgIGRhdGEgPSBkYXRhLmNvbmNhdChuZXdEYXRhKTsKICAgICAgZmlsdGVycyA9IGNyb3NzZmlsdGVyX2FycmF5TGVuZ3RoZW4oZmlsdGVycywgbiArPSBuMSk7CiAgICAgIGRhdGFMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbihsKSB7IGwobmV3RGF0YSwgbjAsIG4xKTsgfSk7CiAgICB9CgogICAgcmV0dXJuIGNyb3NzZmlsdGVyOwogIH0KCiAgLy8gUmVtb3ZlcyBhbGwgcmVjb3JkcyB0aGF0IG1hdGNoIHRoZSBjdXJyZW50IGZpbHRlcnMuCiAgZnVuY3Rpb24gcmVtb3ZlRGF0YSgpIHsKICAgIHZhciBuZXdJbmRleCA9IGNyb3NzZmlsdGVyX2luZGV4KG4sIG4pLAogICAgICAgIHJlbW92ZWQgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwLCBqID0gMDsgaSA8IG47ICsraSkgewogICAgICBpZiAoZmlsdGVyc1tpXSkgbmV3SW5kZXhbaV0gPSBqKys7CiAgICAgIGVsc2UgcmVtb3ZlZC5wdXNoKGkpOwogICAgfQoKICAgIC8vIFJlbW92ZSBhbGwgbWF0Y2hpbmcgcmVjb3JkcyBmcm9tIGdyb3Vwcy4KICAgIGZpbHRlckxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGwpIHsgbCgwLCBbXSwgcmVtb3ZlZCk7IH0pOwoKICAgIC8vIFVwZGF0ZSBpbmRleGVzLgogICAgcmVtb3ZlRGF0YUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGwpIHsgbChuZXdJbmRleCk7IH0pOwoKICAgIC8vIFJlbW92ZSBvbGQgZmlsdGVycyBhbmQgZGF0YSBieSBvdmVyd3JpdGluZy4KICAgIGZvciAodmFyIGkgPSAwLCBqID0gMCwgazsgaSA8IG47ICsraSkgewogICAgICBpZiAoayA9IGZpbHRlcnNbaV0pIHsKICAgICAgICBpZiAoaSAhPT0gaikgZmlsdGVyc1tqXSA9IGssIGRhdGFbal0gPSBkYXRhW2ldOwogICAgICAgICsrajsKICAgICAgfQogICAgfQogICAgZGF0YS5sZW5ndGggPSBqOwogICAgd2hpbGUgKG4gPiBqKSBmaWx0ZXJzWy0tbl0gPSAwOwogIH0KCiAgLy8gQWRkcyBhIG5ldyBkaW1lbnNpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFjY2Vzc29yIGZ1bmN0aW9uLgogIGZ1bmN0aW9uIGRpbWVuc2lvbih2YWx1ZSkgewogICAgdmFyIGRpbWVuc2lvbiA9IHsKICAgICAgZmlsdGVyOiBmaWx0ZXIsCiAgICAgIGZpbHRlckV4YWN0OiBmaWx0ZXJFeGFjdCwKICAgICAgZmlsdGVyUmFuZ2U6IGZpbHRlclJhbmdlLAogICAgICBmaWx0ZXJGdW5jdGlvbjogZmlsdGVyRnVuY3Rpb24sCiAgICAgIGZpbHRlckFsbDogZmlsdGVyQWxsLAogICAgICB0b3A6IHRvcCwKICAgICAgYm90dG9tOiBib3R0b20sCiAgICAgIGdyb3VwOiBncm91cCwKICAgICAgZ3JvdXBBbGw6IGdyb3VwQWxsLAogICAgICBkaXNwb3NlOiBkaXNwb3NlLAogICAgICByZW1vdmU6IGRpc3Bvc2UgLy8gZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5CiAgICB9OwoKICAgIHZhciBvbmUgPSB+bSAmIC1+bSwgLy8gbG93ZXN0IHVuc2V0IGJpdCBhcyBtYXNrLCBlLmcuLCAwMDAwMTAwMAogICAgICAgIHplcm8gPSB+b25lLCAvLyBpbnZlcnRlZCBvbmUsIGUuZy4sIDExMTEwMTExCiAgICAgICAgdmFsdWVzLCAvLyBzb3J0ZWQsIGNhY2hlZCBhcnJheQogICAgICAgIGluZGV4LCAvLyB2YWx1ZSByYW5rIOKGpiBvYmplY3QgaWQKICAgICAgICBuZXdWYWx1ZXMsIC8vIHRlbXBvcmFyeSBhcnJheSBzdG9yaW5nIG5ld2x5LWFkZGVkIHZhbHVlcwogICAgICAgIG5ld0luZGV4LCAvLyB0ZW1wb3JhcnkgYXJyYXkgc3RvcmluZyBuZXdseS1hZGRlZCBpbmRleAogICAgICAgIHNvcnQgPSBxdWlja3NvcnRfYnkoZnVuY3Rpb24oaSkgeyByZXR1cm4gbmV3VmFsdWVzW2ldOyB9KSwKICAgICAgICByZWZpbHRlciA9IGNyb3NzZmlsdGVyX2ZpbHRlckFsbCwgLy8gZm9yIHJlY29tcHV0aW5nIGZpbHRlcgogICAgICAgIHJlZmlsdGVyRnVuY3Rpb24sIC8vIHRoZSBjdXN0b20gZmlsdGVyIGZ1bmN0aW9uIGluIHVzZQogICAgICAgIGluZGV4TGlzdGVuZXJzID0gW10sIC8vIHdoZW4gZGF0YSBpcyBhZGRlZAogICAgICAgIGRpbWVuc2lvbkdyb3VwcyA9IFtdLAogICAgICAgIGxvMCA9IDAsCiAgICAgICAgaGkwID0gMDsKCiAgICAvLyBVcGRhdGluZyBhIGRpbWVuc2lvbiBpcyBhIHR3by1zdGFnZSBwcm9jZXNzLiBGaXJzdCwgd2UgbXVzdCB1cGRhdGUgdGhlCiAgICAvLyBhc3NvY2lhdGVkIGZpbHRlcnMgZm9yIHRoZSBuZXdseS1hZGRlZCByZWNvcmRzLiBPbmNlIGFsbCBkaW1lbnNpb25zIGhhdmUKICAgIC8vIHVwZGF0ZWQgdGhlaXIgZmlsdGVycywgdGhlIGdyb3VwcyBhcmUgbm90aWZpZWQgdG8gdXBkYXRlLgogICAgZGF0YUxpc3RlbmVycy51bnNoaWZ0KHByZUFkZCk7CiAgICBkYXRhTGlzdGVuZXJzLnB1c2gocG9zdEFkZCk7CgogICAgcmVtb3ZlRGF0YUxpc3RlbmVycy5wdXNoKHJlbW92ZURhdGEpOwoKICAgIC8vIEluY29ycG9yYXRlIGFueSBleGlzdGluZyBkYXRhIGludG8gdGhpcyBkaW1lbnNpb24sIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUKICAgIC8vIGZpbHRlciBiaXRzZXQgaXMgd2lkZSBlbm91Z2ggdG8gaGFuZGxlIHRoZSBuZXcgZGltZW5zaW9uLgogICAgbSB8PSBvbmU7CiAgICBpZiAoTSA+PSAzMiA/ICFvbmUgOiBtICYgLSgxIDw8IE0pKSB7CiAgICAgIGZpbHRlcnMgPSBjcm9zc2ZpbHRlcl9hcnJheVdpZGVuKGZpbHRlcnMsIE0gPDw9IDEpOwogICAgfQogICAgcHJlQWRkKGRhdGEsIDAsIG4pOwogICAgcG9zdEFkZChkYXRhLCAwLCBuKTsKCiAgICAvLyBJbmNvcnBvcmF0ZXMgdGhlIHNwZWNpZmllZCBuZXcgcmVjb3JkcyBpbnRvIHRoaXMgZGltZW5zaW9uLgogICAgLy8gVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgZmlsdGVycywgdmFsdWVzLCBhbmQgaW5kZXguCiAgICBmdW5jdGlvbiBwcmVBZGQobmV3RGF0YSwgbjAsIG4xKSB7CgogICAgICAvLyBQZXJtdXRlIG5ldyB2YWx1ZXMgaW50byBuYXR1cmFsIG9yZGVyIHVzaW5nIGEgc29ydGVkIGluZGV4LgogICAgICBuZXdWYWx1ZXMgPSBuZXdEYXRhLm1hcCh2YWx1ZSk7CiAgICAgIG5ld0luZGV4ID0gc29ydChjcm9zc2ZpbHRlcl9yYW5nZShuMSksIDAsIG4xKTsKICAgICAgbmV3VmFsdWVzID0gcGVybXV0ZShuZXdWYWx1ZXMsIG5ld0luZGV4KTsKCiAgICAgIC8vIEJpc2VjdCBuZXdWYWx1ZXMgdG8gZGV0ZXJtaW5lIHdoaWNoIG5ldyByZWNvcmRzIGFyZSBzZWxlY3RlZC4KICAgICAgdmFyIGJvdW5kcyA9IHJlZmlsdGVyKG5ld1ZhbHVlcyksIGxvMSA9IGJvdW5kc1swXSwgaGkxID0gYm91bmRzWzFdLCBpOwogICAgICBpZiAocmVmaWx0ZXJGdW5jdGlvbikgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuMTsgKytpKSB7CiAgICAgICAgICBpZiAoIXJlZmlsdGVyRnVuY3Rpb24obmV3VmFsdWVzW2ldLCBpKSkgZmlsdGVyc1tuZXdJbmRleFtpXSArIG4wXSB8PSBvbmU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsbzE7ICsraSkgZmlsdGVyc1tuZXdJbmRleFtpXSArIG4wXSB8PSBvbmU7CiAgICAgICAgZm9yIChpID0gaGkxOyBpIDwgbjE7ICsraSkgZmlsdGVyc1tuZXdJbmRleFtpXSArIG4wXSB8PSBvbmU7CiAgICAgIH0KCiAgICAgIC8vIElmIHRoaXMgZGltZW5zaW9uIHByZXZpb3VzbHkgaGFkIG5vIGRhdGEsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyB0aGUKICAgICAgLy8gbW9yZSBleHBlbnNpdmUgbWVyZ2Ugb3BlcmF0aW9uOyB1c2UgdGhlIG5ldyB2YWx1ZXMgYW5kIGluZGV4IGFzLWlzLgogICAgICBpZiAoIW4wKSB7CiAgICAgICAgdmFsdWVzID0gbmV3VmFsdWVzOwogICAgICAgIGluZGV4ID0gbmV3SW5kZXg7CiAgICAgICAgbG8wID0gbG8xOwogICAgICAgIGhpMCA9IGhpMTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBvbGRWYWx1ZXMgPSB2YWx1ZXMsCiAgICAgICAgICBvbGRJbmRleCA9IGluZGV4LAogICAgICAgICAgaTAgPSAwLAogICAgICAgICAgaTEgPSAwOwoKICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgbmV3IGFycmF5cyBpbnRvIHdoaWNoIHRvIG1lcmdlIG5ldyBhbmQgb2xkLgogICAgICB2YWx1ZXMgPSBuZXcgQXJyYXkobik7CiAgICAgIGluZGV4ID0gY3Jvc3NmaWx0ZXJfaW5kZXgobiwgbik7CgogICAgICAvLyBNZXJnZSB0aGUgb2xkIGFuZCBuZXcgc29ydGVkIHZhbHVlcywgYW5kIG9sZCBhbmQgbmV3IGluZGV4LgogICAgICBmb3IgKGkgPSAwOyBpMCA8IG4wICYmIGkxIDwgbjE7ICsraSkgewogICAgICAgIGlmIChvbGRWYWx1ZXNbaTBdIDwgbmV3VmFsdWVzW2kxXSkgewogICAgICAgICAgdmFsdWVzW2ldID0gb2xkVmFsdWVzW2kwXTsKICAgICAgICAgIGluZGV4W2ldID0gb2xkSW5kZXhbaTArK107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhbHVlc1tpXSA9IG5ld1ZhbHVlc1tpMV07CiAgICAgICAgICBpbmRleFtpXSA9IG5ld0luZGV4W2kxKytdICsgbjA7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBvbGQgdmFsdWVzLgogICAgICBmb3IgKDsgaTAgPCBuMDsgKytpMCwgKytpKSB7CiAgICAgICAgdmFsdWVzW2ldID0gb2xkVmFsdWVzW2kwXTsKICAgICAgICBpbmRleFtpXSA9IG9sZEluZGV4W2kwXTsKICAgICAgfQoKICAgICAgLy8gQWRkIGFueSByZW1haW5pbmcgbmV3IHZhbHVlcy4KICAgICAgZm9yICg7IGkxIDwgbjE7ICsraTEsICsraSkgewogICAgICAgIHZhbHVlc1tpXSA9IG5ld1ZhbHVlc1tpMV07CiAgICAgICAgaW5kZXhbaV0gPSBuZXdJbmRleFtpMV0gKyBuMDsKICAgICAgfQoKICAgICAgLy8gQmlzZWN0IGFnYWluIHRvIHJlY29tcHV0ZSBsbzAgYW5kIGhpMC4KICAgICAgYm91bmRzID0gcmVmaWx0ZXIodmFsdWVzKSwgbG8wID0gYm91bmRzWzBdLCBoaTAgPSBib3VuZHNbMV07CiAgICB9CgogICAgLy8gV2hlbiBhbGwgZmlsdGVycyBoYXZlIHVwZGF0ZWQsIG5vdGlmeSBpbmRleCBsaXN0ZW5lcnMgb2YgdGhlIG5ldyB2YWx1ZXMuCiAgICBmdW5jdGlvbiBwb3N0QWRkKG5ld0RhdGEsIG4wLCBuMSkgewogICAgICBpbmRleExpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGwpIHsgbChuZXdWYWx1ZXMsIG5ld0luZGV4LCBuMCwgbjEpOyB9KTsKICAgICAgbmV3VmFsdWVzID0gbmV3SW5kZXggPSBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZURhdGEocmVJbmRleCkgewogICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDAsIGs7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoZmlsdGVyc1trID0gaW5kZXhbaV1dKSB7CiAgICAgICAgICBpZiAoaSAhPT0gaikgdmFsdWVzW2pdID0gdmFsdWVzW2ldOwogICAgICAgICAgaW5kZXhbal0gPSByZUluZGV4W2tdOwogICAgICAgICAgKytqOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWx1ZXMubGVuZ3RoID0gajsKICAgICAgd2hpbGUgKGogPCBuKSBpbmRleFtqKytdID0gMDsKCiAgICAgIC8vIEJpc2VjdCBhZ2FpbiB0byByZWNvbXB1dGUgbG8wIGFuZCBoaTAuCiAgICAgIHZhciBib3VuZHMgPSByZWZpbHRlcih2YWx1ZXMpOwogICAgICBsbzAgPSBib3VuZHNbMF0sIGhpMCA9IGJvdW5kc1sxXTsKICAgIH0KCiAgICAvLyBVcGRhdGVzIHRoZSBzZWxlY3RlZCB2YWx1ZXMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBib3VuZHMgW2xvLCBoaV0uCiAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgYnkgYWxsIHRoZSBwdWJsaWMgZmlsdGVyIG1ldGhvZHMuCiAgICBmdW5jdGlvbiBmaWx0ZXJJbmRleEJvdW5kcyhib3VuZHMpIHsKICAgICAgdmFyIGxvMSA9IGJvdW5kc1swXSwKICAgICAgICAgIGhpMSA9IGJvdW5kc1sxXTsKCiAgICAgIGlmIChyZWZpbHRlckZ1bmN0aW9uKSB7CiAgICAgICAgcmVmaWx0ZXJGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgZmlsdGVySW5kZXhGdW5jdGlvbihmdW5jdGlvbihkLCBpKSB7IHJldHVybiBsbzEgPD0gaSAmJiBpIDwgaGkxOyB9KTsKICAgICAgICBsbzAgPSBsbzE7CiAgICAgICAgaGkwID0gaGkxOwogICAgICAgIHJldHVybiBkaW1lbnNpb247CiAgICAgIH0KCiAgICAgIHZhciBpLAogICAgICAgICAgaiwKICAgICAgICAgIGssCiAgICAgICAgICBhZGRlZCA9IFtdLAogICAgICAgICAgcmVtb3ZlZCA9IFtdOwoKICAgICAgLy8gRmFzdCBpbmNyZW1lbnRhbCB1cGRhdGUgYmFzZWQgb24gcHJldmlvdXMgbG8gaW5kZXguCiAgICAgIGlmIChsbzEgPCBsbzApIHsKICAgICAgICBmb3IgKGkgPSBsbzEsIGogPSBNYXRoLm1pbihsbzAsIGhpMSk7IGkgPCBqOyArK2kpIHsKICAgICAgICAgIGZpbHRlcnNbayA9IGluZGV4W2ldXSBePSBvbmU7CiAgICAgICAgICBhZGRlZC5wdXNoKGspOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChsbzEgPiBsbzApIHsKICAgICAgICBmb3IgKGkgPSBsbzAsIGogPSBNYXRoLm1pbihsbzEsIGhpMCk7IGkgPCBqOyArK2kpIHsKICAgICAgICAgIGZpbHRlcnNbayA9IGluZGV4W2ldXSBePSBvbmU7CiAgICAgICAgICByZW1vdmVkLnB1c2goayk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBGYXN0IGluY3JlbWVudGFsIHVwZGF0ZSBiYXNlZCBvbiBwcmV2aW91cyBoaSBpbmRleC4KICAgICAgaWYgKGhpMSA+IGhpMCkgewogICAgICAgIGZvciAoaSA9IE1hdGgubWF4KGxvMSwgaGkwKSwgaiA9IGhpMTsgaSA8IGo7ICsraSkgewogICAgICAgICAgZmlsdGVyc1trID0gaW5kZXhbaV1dIF49IG9uZTsKICAgICAgICAgIGFkZGVkLnB1c2goayk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGhpMSA8IGhpMCkgewogICAgICAgIGZvciAoaSA9IE1hdGgubWF4KGxvMCwgaGkxKSwgaiA9IGhpMDsgaSA8IGo7ICsraSkgewogICAgICAgICAgZmlsdGVyc1trID0gaW5kZXhbaV1dIF49IG9uZTsKICAgICAgICAgIHJlbW92ZWQucHVzaChrKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGxvMCA9IGxvMTsKICAgICAgaGkwID0gaGkxOwogICAgICBmaWx0ZXJMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbihsKSB7IGwob25lLCBhZGRlZCwgcmVtb3ZlZCk7IH0pOwogICAgICByZXR1cm4gZGltZW5zaW9uOwogICAgfQoKICAgIC8vIEZpbHRlcnMgdGhpcyBkaW1lbnNpb24gdXNpbmcgdGhlIHNwZWNpZmllZCByYW5nZSwgdmFsdWUsIG9yIG51bGwuCiAgICAvLyBJZiB0aGUgcmFuZ2UgaXMgbnVsbCwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGZpbHRlckFsbC4KICAgIC8vIElmIHRoZSByYW5nZSBpcyBhbiBhcnJheSwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGZpbHRlclJhbmdlLgogICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gZmlsdGVyRXhhY3QuCiAgICBmdW5jdGlvbiBmaWx0ZXIocmFuZ2UpIHsKICAgICAgcmV0dXJuIHJhbmdlID09IG51bGwKICAgICAgICAgID8gZmlsdGVyQWxsKCkgOiBBcnJheS5pc0FycmF5KHJhbmdlKQogICAgICAgICAgPyBmaWx0ZXJSYW5nZShyYW5nZSkgOiB0eXBlb2YgcmFuZ2UgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gZmlsdGVyRnVuY3Rpb24ocmFuZ2UpCiAgICAgICAgICA6IGZpbHRlckV4YWN0KHJhbmdlKTsKICAgIH0KCiAgICAvLyBGaWx0ZXJzIHRoaXMgZGltZW5zaW9uIHRvIHNlbGVjdCB0aGUgZXhhY3QgdmFsdWUuCiAgICBmdW5jdGlvbiBmaWx0ZXJFeGFjdCh2YWx1ZSkgewogICAgICByZXR1cm4gZmlsdGVySW5kZXhCb3VuZHMoKHJlZmlsdGVyID0gY3Jvc3NmaWx0ZXJfZmlsdGVyRXhhY3QoYmlzZWN0LCB2YWx1ZSkpKHZhbHVlcykpOwogICAgfQoKICAgIC8vIEZpbHRlcnMgdGhpcyBkaW1lbnNpb24gdG8gc2VsZWN0IHRoZSBzcGVjaWZpZWQgcmFuZ2UgW2xvLCBoaV0uCiAgICAvLyBUaGUgbG93ZXIgYm91bmQgaXMgaW5jbHVzaXZlLCBhbmQgdGhlIHVwcGVyIGJvdW5kIGlzIGV4Y2x1c2l2ZS4KICAgIGZ1bmN0aW9uIGZpbHRlclJhbmdlKHJhbmdlKSB7CiAgICAgIHJldHVybiBmaWx0ZXJJbmRleEJvdW5kcygocmVmaWx0ZXIgPSBjcm9zc2ZpbHRlcl9maWx0ZXJSYW5nZShiaXNlY3QsIHJhbmdlKSkodmFsdWVzKSk7CiAgICB9CgogICAgLy8gQ2xlYXJzIGFueSBmaWx0ZXJzIG9uIHRoaXMgZGltZW5zaW9uLgogICAgZnVuY3Rpb24gZmlsdGVyQWxsKCkgewogICAgICByZXR1cm4gZmlsdGVySW5kZXhCb3VuZHMoKHJlZmlsdGVyID0gY3Jvc3NmaWx0ZXJfZmlsdGVyQWxsKSh2YWx1ZXMpKTsKICAgIH0KCiAgICAvLyBGaWx0ZXJzIHRoaXMgZGltZW5zaW9uIHVzaW5nIGFuIGFyYml0cmFyeSBmdW5jdGlvbi4KICAgIGZ1bmN0aW9uIGZpbHRlckZ1bmN0aW9uKGYpIHsKICAgICAgcmVmaWx0ZXIgPSBjcm9zc2ZpbHRlcl9maWx0ZXJBbGw7CgogICAgICBmaWx0ZXJJbmRleEZ1bmN0aW9uKHJlZmlsdGVyRnVuY3Rpb24gPSBmKTsKCiAgICAgIGxvMCA9IDA7CiAgICAgIGhpMCA9IG47CgogICAgICByZXR1cm4gZGltZW5zaW9uOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbHRlckluZGV4RnVuY3Rpb24oZikgewogICAgICB2YXIgaSwKICAgICAgICAgIGssCiAgICAgICAgICB4LAogICAgICAgICAgYWRkZWQgPSBbXSwKICAgICAgICAgIHJlbW92ZWQgPSBbXTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoIShmaWx0ZXJzW2sgPSBpbmRleFtpXV0gJiBvbmUpIF4gISEoeCA9IGYodmFsdWVzW2ldLCBpKSkpIHsKICAgICAgICAgIGlmICh4KSBmaWx0ZXJzW2tdICY9IHplcm8sIGFkZGVkLnB1c2goayk7CiAgICAgICAgICBlbHNlIGZpbHRlcnNba10gfD0gb25lLCByZW1vdmVkLnB1c2goayk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZpbHRlckxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGwpIHsgbChvbmUsIGFkZGVkLCByZW1vdmVkKTsgfSk7CiAgICB9CgogICAgLy8gUmV0dXJucyB0aGUgdG9wIEsgc2VsZWN0ZWQgcmVjb3JkcyBiYXNlZCBvbiB0aGlzIGRpbWVuc2lvbidzIG9yZGVyLgogICAgLy8gTm90ZTogb2JzZXJ2ZXMgdGhpcyBkaW1lbnNpb24ncyBmaWx0ZXIsIHVubGlrZSBncm91cCBhbmQgZ3JvdXBBbGwuCiAgICBmdW5jdGlvbiB0b3AoaykgewogICAgICB2YXIgYXJyYXkgPSBbXSwKICAgICAgICAgIGkgPSBoaTAsCiAgICAgICAgICBqOwoKICAgICAgd2hpbGUgKC0taSA+PSBsbzAgJiYgayA+IDApIHsKICAgICAgICBpZiAoIWZpbHRlcnNbaiA9IGluZGV4W2ldXSkgewogICAgICAgICAgYXJyYXkucHVzaChkYXRhW2pdKTsKICAgICAgICAgIC0tazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KCiAgICAvLyBSZXR1cm5zIHRoZSBib3R0b20gSyBzZWxlY3RlZCByZWNvcmRzIGJhc2VkIG9uIHRoaXMgZGltZW5zaW9uJ3Mgb3JkZXIuCiAgICAvLyBOb3RlOiBvYnNlcnZlcyB0aGlzIGRpbWVuc2lvbidzIGZpbHRlciwgdW5saWtlIGdyb3VwIGFuZCBncm91cEFsbC4KICAgIGZ1bmN0aW9uIGJvdHRvbShrKSB7CiAgICAgIHZhciBhcnJheSA9IFtdLAogICAgICAgICAgaSA9IGxvMCwKICAgICAgICAgIGo7CgogICAgICB3aGlsZSAoaSA8IGhpMCAmJiBrID4gMCkgewogICAgICAgIGlmICghZmlsdGVyc1tqID0gaW5kZXhbaV1dKSB7CiAgICAgICAgICBhcnJheS5wdXNoKGRhdGFbal0pOwogICAgICAgICAgLS1rOwogICAgICAgIH0KICAgICAgICBpKys7CiAgICAgIH0KCiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KCiAgICAvLyBBZGRzIGEgbmV3IGdyb3VwIHRvIHRoaXMgZGltZW5zaW9uLCB1c2luZyB0aGUgc3BlY2lmaWVkIGtleSBmdW5jdGlvbi4KICAgIGZ1bmN0aW9uIGdyb3VwKGtleSkgewogICAgICB2YXIgZ3JvdXAgPSB7CiAgICAgICAgdG9wOiB0b3AsCiAgICAgICAgYWxsOiBhbGwsCiAgICAgICAgcmVkdWNlOiByZWR1Y2UsCiAgICAgICAgcmVkdWNlQ291bnQ6IHJlZHVjZUNvdW50LAogICAgICAgIHJlZHVjZVN1bTogcmVkdWNlU3VtLAogICAgICAgIG9yZGVyOiBvcmRlciwKICAgICAgICBvcmRlck5hdHVyYWw6IG9yZGVyTmF0dXJhbCwKICAgICAgICBzaXplOiBzaXplLAogICAgICAgIGRpc3Bvc2U6IGRpc3Bvc2UsCiAgICAgICAgcmVtb3ZlOiBkaXNwb3NlIC8vIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eQogICAgICB9OwoKICAgICAgLy8gRW5zdXJlIHRoYXQgdGhpcyBncm91cCB3aWxsIGJlIHJlbW92ZWQgd2hlbiB0aGUgZGltZW5zaW9uIGlzIHJlbW92ZWQuCiAgICAgIGRpbWVuc2lvbkdyb3Vwcy5wdXNoKGdyb3VwKTsKCiAgICAgIHZhciBncm91cHMsIC8vIGFycmF5IG9mIHtrZXksIHZhbHVlfQogICAgICAgICAgZ3JvdXBJbmRleCwgLy8gb2JqZWN0IGlkIOKGpiBncm91cCBpZAogICAgICAgICAgZ3JvdXBXaWR0aCA9IDgsCiAgICAgICAgICBncm91cENhcGFjaXR5ID0gY3Jvc3NmaWx0ZXJfY2FwYWNpdHkoZ3JvdXBXaWR0aCksCiAgICAgICAgICBrID0gMCwgLy8gY2FyZGluYWxpdHkKICAgICAgICAgIHNlbGVjdCwKICAgICAgICAgIGhlYXAsCiAgICAgICAgICByZWR1Y2VBZGQsCiAgICAgICAgICByZWR1Y2VSZW1vdmUsCiAgICAgICAgICByZWR1Y2VJbml0aWFsLAogICAgICAgICAgdXBkYXRlID0gY3Jvc3NmaWx0ZXJfbnVsbCwKICAgICAgICAgIHJlc2V0ID0gY3Jvc3NmaWx0ZXJfbnVsbCwKICAgICAgICAgIHJlc2V0TmVlZGVkID0gdHJ1ZSwKICAgICAgICAgIGdyb3VwQWxsID0ga2V5ID09PSBjcm9zc2ZpbHRlcl9udWxsOwoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSBrZXkgPSBjcm9zc2ZpbHRlcl9pZGVudGl0eTsKCiAgICAgIC8vIFRoZSBncm91cCBsaXN0ZW5zIHRvIHRoZSBjcm9zc2ZpbHRlciBmb3Igd2hlbiBhbnkgZGltZW5zaW9uIGNoYW5nZXMsIHNvCiAgICAgIC8vIHRoYXQgaXQgY2FuIHVwZGF0ZSB0aGUgYXNzb2NpYXRlZCByZWR1Y2UgdmFsdWVzLiBJdCBtdXN0IGFsc28gbGlzdGVuIHRvCiAgICAgIC8vIHRoZSBwYXJlbnQgZGltZW5zaW9uIGZvciB3aGVuIGRhdGEgaXMgYWRkZWQsIGFuZCBjb21wdXRlIG5ldyBrZXlzLgogICAgICBmaWx0ZXJMaXN0ZW5lcnMucHVzaCh1cGRhdGUpOwogICAgICBpbmRleExpc3RlbmVycy5wdXNoKGFkZCk7CiAgICAgIHJlbW92ZURhdGFMaXN0ZW5lcnMucHVzaChyZW1vdmVEYXRhKTsKCiAgICAgIC8vIEluY29ycG9yYXRlIGFueSBleGlzdGluZyBkYXRhIGludG8gdGhlIGdyb3VwaW5nLgogICAgICBhZGQodmFsdWVzLCBpbmRleCwgMCwgbik7CgogICAgICAvLyBJbmNvcnBvcmF0ZXMgdGhlIHNwZWNpZmllZCBuZXcgdmFsdWVzIGludG8gdGhpcyBncm91cC4KICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgZ3JvdXBzIGFuZCBncm91cEluZGV4LgogICAgICBmdW5jdGlvbiBhZGQobmV3VmFsdWVzLCBuZXdJbmRleCwgbjAsIG4xKSB7CiAgICAgICAgdmFyIG9sZEdyb3VwcyA9IGdyb3VwcywKICAgICAgICAgICAgcmVJbmRleCA9IGNyb3NzZmlsdGVyX2luZGV4KGssIGdyb3VwQ2FwYWNpdHkpLAogICAgICAgICAgICBhZGQgPSByZWR1Y2VBZGQsCiAgICAgICAgICAgIGluaXRpYWwgPSByZWR1Y2VJbml0aWFsLAogICAgICAgICAgICBrMCA9IGssIC8vIG9sZCBjYXJkaW5hbGl0eQogICAgICAgICAgICBpMCA9IDAsIC8vIGluZGV4IG9mIG9sZCBncm91cAogICAgICAgICAgICBpMSA9IDAsIC8vIGluZGV4IG9mIG5ldyByZWNvcmQKICAgICAgICAgICAgaiwgLy8gb2JqZWN0IGlkCiAgICAgICAgICAgIGcwLCAvLyBvbGQgZ3JvdXAKICAgICAgICAgICAgeDAsIC8vIG9sZCBrZXkKICAgICAgICAgICAgeDEsIC8vIG5ldyBrZXkKICAgICAgICAgICAgZywgLy8gZ3JvdXAgdG8gYWRkCiAgICAgICAgICAgIHg7IC8vIGtleSBvZiBncm91cCB0byBhZGQKCiAgICAgICAgLy8gSWYgYSByZXNldCBpcyBuZWVkZWQsIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIHRoZSByZWR1Y2UgdmFsdWVzLgogICAgICAgIGlmIChyZXNldE5lZWRlZCkgYWRkID0gaW5pdGlhbCA9IGNyb3NzZmlsdGVyX251bGw7CgogICAgICAgIC8vIFJlc2V0IHRoZSBuZXcgZ3JvdXBzIChrIGlzIGEgbG93ZXIgYm91bmQpLgogICAgICAgIC8vIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGdyb3VwSW5kZXggZXhpc3RzIGFuZCBpcyBsb25nIGVub3VnaC4KICAgICAgICBncm91cHMgPSBuZXcgQXJyYXkoayksIGsgPSAwOwogICAgICAgIGdyb3VwSW5kZXggPSBrMCA+IDEgPyBjcm9zc2ZpbHRlcl9hcnJheUxlbmd0aGVuKGdyb3VwSW5kZXgsIG4pIDogY3Jvc3NmaWx0ZXJfaW5kZXgobiwgZ3JvdXBDYXBhY2l0eSk7CgogICAgICAgIC8vIEdldCB0aGUgZmlyc3Qgb2xkIGtleSAoeDAgb2YgZzApLCBpZiBpdCBleGlzdHMuCiAgICAgICAgaWYgKGswKSB4MCA9IChnMCA9IG9sZEdyb3Vwc1swXSkua2V5OwoKICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBuZXcga2V5ICh4MSksIHNraXBwaW5nIE5hTiBrZXlzLgogICAgICAgIHdoaWxlIChpMSA8IG4xICYmICEoKHgxID0ga2V5KG5ld1ZhbHVlc1tpMV0pKSA+PSB4MSkpICsraTE7CgogICAgICAgIC8vIFdoaWxlIG5ldyBrZXlzIHJlbWFpbuKApgogICAgICAgIHdoaWxlIChpMSA8IG4xKSB7CgogICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBsZXNzZXIgb2YgdGhlIHR3byBjdXJyZW50IGtleXM7IG5ldyBhbmQgb2xkLgogICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIG9sZCBrZXlzIHJlbWFpbmluZywgdGhlbiBhbHdheXMgYWRkIHRoZSBuZXcga2V5LgogICAgICAgICAgaWYgKGcwICYmIHgwIDw9IHgxKSB7CiAgICAgICAgICAgIGcgPSBnMCwgeCA9IHgwOwoKICAgICAgICAgICAgLy8gUmVjb3JkIHRoZSBuZXcgaW5kZXggb2YgdGhlIG9sZCBncm91cC4KICAgICAgICAgICAgcmVJbmRleFtpMF0gPSBrOwoKICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIG5leHQgb2xkIGtleS4KICAgICAgICAgICAgaWYgKGcwID0gb2xkR3JvdXBzWysraTBdKSB4MCA9IGcwLmtleTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGcgPSB7a2V5OiB4MSwgdmFsdWU6IGluaXRpYWwoKX0sIHggPSB4MTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBBZGQgdGhlIGxlc3NlciBncm91cC4KICAgICAgICAgIGdyb3Vwc1trXSA9IGc7CgogICAgICAgICAgLy8gQWRkIGFueSBzZWxlY3RlZCByZWNvcmRzIGJlbG9uZ2luZyB0byB0aGUgYWRkZWQgZ3JvdXAsIHdoaWxlCiAgICAgICAgICAvLyBhZHZhbmNpbmcgdGhlIG5ldyBrZXkgYW5kIHBvcHVsYXRpbmcgdGhlIGFzc29jaWF0ZWQgZ3JvdXAgaW5kZXguCiAgICAgICAgICB3aGlsZSAoISh4MSA+IHgpKSB7CiAgICAgICAgICAgIGdyb3VwSW5kZXhbaiA9IG5ld0luZGV4W2kxXSArIG4wXSA9IGs7CiAgICAgICAgICAgIGlmICghKGZpbHRlcnNbal0gJiB6ZXJvKSkgZy52YWx1ZSA9IGFkZChnLnZhbHVlLCBkYXRhW2pdKTsKICAgICAgICAgICAgaWYgKCsraTEgPj0gbjEpIGJyZWFrOwogICAgICAgICAgICB4MSA9IGtleShuZXdWYWx1ZXNbaTFdKTsKICAgICAgICAgIH0KCiAgICAgICAgICBncm91cEluY3JlbWVudCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gQWRkIGFueSByZW1haW5pbmcgb2xkIGdyb3VwcyB0aGF0IHdlcmUgZ3JlYXRlciB0aGFuIGFsbCBuZXcga2V5cy4KICAgICAgICAvLyBObyBpbmNyZW1lbnRhbCByZWR1Y2UgaXMgbmVlZGVkOyB0aGVzZSBncm91cHMgaGF2ZSBubyBuZXcgcmVjb3Jkcy4KICAgICAgICAvLyBBbHNvIHJlY29yZCB0aGUgbmV3IGluZGV4IG9mIHRoZSBvbGQgZ3JvdXAuCiAgICAgICAgd2hpbGUgKGkwIDwgazApIHsKICAgICAgICAgIGdyb3Vwc1tyZUluZGV4W2kwXSA9IGtdID0gb2xkR3JvdXBzW2kwKytdOwogICAgICAgICAgZ3JvdXBJbmNyZW1lbnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIElmIHdlIGFkZGVkIGFueSBuZXcgZ3JvdXBzIGJlZm9yZSBhbnkgb2xkIGdyb3VwcywKICAgICAgICAvLyB1cGRhdGUgdGhlIGdyb3VwIGluZGV4IG9mIGFsbCB0aGUgb2xkIHJlY29yZHMuCiAgICAgICAgaWYgKGsgPiBpMCkgZm9yIChpMCA9IDA7IGkwIDwgbjA7ICsraTApIHsKICAgICAgICAgIGdyb3VwSW5kZXhbaTBdID0gcmVJbmRleFtncm91cEluZGV4W2kwXV07CiAgICAgICAgfQoKICAgICAgICAvLyBNb2RpZnkgdGhlIHVwZGF0ZSBhbmQgcmVzZXQgYmVoYXZpb3IgYmFzZWQgb24gdGhlIGNhcmRpbmFsaXR5LgogICAgICAgIC8vIElmIHRoZSBjYXJkaW5hbGl0eSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gb25lLCB0aGVuIHRoZSBncm91cEluZGV4CiAgICAgICAgLy8gaXMgbm90IG5lZWRlZC4gSWYgdGhlIGNhcmRpbmFsaXR5IGlzIHplcm8sIHRoZW4gdGhlcmUgYXJlIG5vIHJlY29yZHMKICAgICAgICAvLyBhbmQgdGhlcmVmb3JlIG5vIGdyb3VwcyB0byB1cGRhdGUgb3IgcmVzZXQuIE5vdGUgdGhhdCB3ZSBhbHNvIG11c3QKICAgICAgICAvLyBjaGFuZ2UgdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXIgdG8gcG9pbnQgdG8gdGhlIG5ldyBtZXRob2QuCiAgICAgICAgaiA9IGZpbHRlckxpc3RlbmVycy5pbmRleE9mKHVwZGF0ZSk7CiAgICAgICAgaWYgKGsgPiAxKSB7CiAgICAgICAgICB1cGRhdGUgPSB1cGRhdGVNYW55OwogICAgICAgICAgcmVzZXQgPSByZXNldE1hbnk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghayAmJiBncm91cEFsbCkgewogICAgICAgICAgICBrID0gMTsKICAgICAgICAgICAgZ3JvdXBzID0gW3trZXk6IG51bGwsIHZhbHVlOiBpbml0aWFsKCl9XTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChrID09PSAxKSB7CiAgICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZU9uZTsKICAgICAgICAgICAgcmVzZXQgPSByZXNldE9uZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVwZGF0ZSA9IGNyb3NzZmlsdGVyX251bGw7CiAgICAgICAgICAgIHJlc2V0ID0gY3Jvc3NmaWx0ZXJfbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGdyb3VwSW5kZXggPSBudWxsOwogICAgICAgIH0KICAgICAgICBmaWx0ZXJMaXN0ZW5lcnNbal0gPSB1cGRhdGU7CgogICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgYWRkZWQgZ3JvdXBzLAogICAgICAgIC8vIGFuZCB3aWRlbiB0aGUgZ3JvdXAgaW5kZXggYXMgbmVlZGVkLgogICAgICAgIGZ1bmN0aW9uIGdyb3VwSW5jcmVtZW50KCkgewogICAgICAgICAgaWYgKCsrayA9PT0gZ3JvdXBDYXBhY2l0eSkgewogICAgICAgICAgICByZUluZGV4ID0gY3Jvc3NmaWx0ZXJfYXJyYXlXaWRlbihyZUluZGV4LCBncm91cFdpZHRoIDw8PSAxKTsKICAgICAgICAgICAgZ3JvdXBJbmRleCA9IGNyb3NzZmlsdGVyX2FycmF5V2lkZW4oZ3JvdXBJbmRleCwgZ3JvdXBXaWR0aCk7CiAgICAgICAgICAgIGdyb3VwQ2FwYWNpdHkgPSBjcm9zc2ZpbHRlcl9jYXBhY2l0eShncm91cFdpZHRoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHJlbW92ZURhdGEoKSB7CiAgICAgICAgaWYgKGsgPiAxKSB7CiAgICAgICAgICB2YXIgb2xkSyA9IGssCiAgICAgICAgICAgICAgb2xkR3JvdXBzID0gZ3JvdXBzLAogICAgICAgICAgICAgIHNlZW5Hcm91cHMgPSBjcm9zc2ZpbHRlcl9pbmRleChvbGRLLCBvbGRLKTsKCiAgICAgICAgICAvLyBGaWx0ZXIgb3V0IG5vbi1tYXRjaGVzIGJ5IGNvcHlpbmcgbWF0Y2hpbmcgZ3JvdXAgaW5kZXggZW50cmllcyB0bwogICAgICAgICAgLy8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuCiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgaWYgKGZpbHRlcnNbaV0pIHsKICAgICAgICAgICAgICBzZWVuR3JvdXBzW2dyb3VwSW5kZXhbal0gPSBncm91cEluZGV4W2ldXSA9IDE7CiAgICAgICAgICAgICAgKytqOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gUmVhc3NlbWJsZSBncm91cHMgaW5jbHVkaW5nIG9ubHkgdGhvc2UgZ3JvdXBzIHRoYXQgd2VyZSByZWZlcnJlZAogICAgICAgICAgLy8gdG8gYnkgbWF0Y2hpbmcgZ3JvdXAgaW5kZXggZW50cmllcy4gIE5vdGUgdGhlIG5ldyBncm91cCBpbmRleCBpbgogICAgICAgICAgLy8gc2Vlbkdyb3Vwcy4KICAgICAgICAgIGdyb3VwcyA9IFtdLCBrID0gMDsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGRLOyArK2kpIHsKICAgICAgICAgICAgaWYgKHNlZW5Hcm91cHNbaV0pIHsKICAgICAgICAgICAgICBzZWVuR3JvdXBzW2ldID0gaysrOwogICAgICAgICAgICAgIGdyb3Vwcy5wdXNoKG9sZEdyb3Vwc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoayA+IDEpIHsKICAgICAgICAgICAgLy8gUmVpbmRleCB0aGUgZ3JvdXAgaW5kZXggdXNpbmcgc2Vlbkdyb3VwcyB0byBmaW5kIHRoZSBuZXcgaW5kZXguCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgajsgKytpKSBncm91cEluZGV4W2ldID0gc2Vlbkdyb3Vwc1tncm91cEluZGV4W2ldXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdyb3VwSW5kZXggPSBudWxsOwogICAgICAgICAgfQogICAgICAgICAgZmlsdGVyTGlzdGVuZXJzW2ZpbHRlckxpc3RlbmVycy5pbmRleE9mKHVwZGF0ZSldID0gayA+IDEKICAgICAgICAgICAgICA/IChyZXNldCA9IHJlc2V0TWFueSwgdXBkYXRlID0gdXBkYXRlTWFueSkKICAgICAgICAgICAgICA6IGsgPT09IDEgPyAocmVzZXQgPSByZXNldE9uZSwgdXBkYXRlID0gdXBkYXRlT25lKQogICAgICAgICAgICAgIDogcmVzZXQgPSB1cGRhdGUgPSBjcm9zc2ZpbHRlcl9udWxsOwogICAgICAgIH0gZWxzZSBpZiAoayA9PT0gMSkgewogICAgICAgICAgaWYgKGdyb3VwQWxsKSByZXR1cm47CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgaWYgKGZpbHRlcnNbaV0pIHJldHVybjsKICAgICAgICAgIGdyb3VwcyA9IFtdLCBrID0gMDsKICAgICAgICAgIGZpbHRlckxpc3RlbmVyc1tmaWx0ZXJMaXN0ZW5lcnMuaW5kZXhPZih1cGRhdGUpXSA9CiAgICAgICAgICB1cGRhdGUgPSByZXNldCA9IGNyb3NzZmlsdGVyX251bGw7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBSZWR1Y2VzIHRoZSBzcGVjaWZpZWQgc2VsZWN0ZWQgb3IgZGVzZWxlY3RlZCByZWNvcmRzLgogICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBjYXJkaW5hbGl0eSBpcyBncmVhdGVyIHRoYW4gMS4KICAgICAgZnVuY3Rpb24gdXBkYXRlTWFueShmaWx0ZXJPbmUsIGFkZGVkLCByZW1vdmVkKSB7CiAgICAgICAgaWYgKGZpbHRlck9uZSA9PT0gb25lIHx8IHJlc2V0TmVlZGVkKSByZXR1cm47CgogICAgICAgIHZhciBpLAogICAgICAgICAgICBrLAogICAgICAgICAgICBuLAogICAgICAgICAgICBnOwoKICAgICAgICAvLyBBZGQgdGhlIGFkZGVkIHZhbHVlcy4KICAgICAgICBmb3IgKGkgPSAwLCBuID0gYWRkZWQubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoIShmaWx0ZXJzW2sgPSBhZGRlZFtpXV0gJiB6ZXJvKSkgewogICAgICAgICAgICBnID0gZ3JvdXBzW2dyb3VwSW5kZXhba11dOwogICAgICAgICAgICBnLnZhbHVlID0gcmVkdWNlQWRkKGcudmFsdWUsIGRhdGFba10pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUmVtb3ZlIHRoZSByZW1vdmVkIHZhbHVlcy4KICAgICAgICBmb3IgKGkgPSAwLCBuID0gcmVtb3ZlZC5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmICgoZmlsdGVyc1trID0gcmVtb3ZlZFtpXV0gJiB6ZXJvKSA9PT0gZmlsdGVyT25lKSB7CiAgICAgICAgICAgIGcgPSBncm91cHNbZ3JvdXBJbmRleFtrXV07CiAgICAgICAgICAgIGcudmFsdWUgPSByZWR1Y2VSZW1vdmUoZy52YWx1ZSwgZGF0YVtrXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBSZWR1Y2VzIHRoZSBzcGVjaWZpZWQgc2VsZWN0ZWQgb3IgZGVzZWxlY3RlZCByZWNvcmRzLgogICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBjYXJkaW5hbGl0eSBpcyAxLgogICAgICBmdW5jdGlvbiB1cGRhdGVPbmUoZmlsdGVyT25lLCBhZGRlZCwgcmVtb3ZlZCkgewogICAgICAgIGlmIChmaWx0ZXJPbmUgPT09IG9uZSB8fCByZXNldE5lZWRlZCkgcmV0dXJuOwoKICAgICAgICB2YXIgaSwKICAgICAgICAgICAgaywKICAgICAgICAgICAgbiwKICAgICAgICAgICAgZyA9IGdyb3Vwc1swXTsKCiAgICAgICAgLy8gQWRkIHRoZSBhZGRlZCB2YWx1ZXMuCiAgICAgICAgZm9yIChpID0gMCwgbiA9IGFkZGVkLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKCEoZmlsdGVyc1trID0gYWRkZWRbaV1dICYgemVybykpIHsKICAgICAgICAgICAgZy52YWx1ZSA9IHJlZHVjZUFkZChnLnZhbHVlLCBkYXRhW2tdKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFJlbW92ZSB0aGUgcmVtb3ZlZCB2YWx1ZXMuCiAgICAgICAgZm9yIChpID0gMCwgbiA9IHJlbW92ZWQubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKGZpbHRlcnNbayA9IHJlbW92ZWRbaV1dICYgemVybykgPT09IGZpbHRlck9uZSkgewogICAgICAgICAgICBnLnZhbHVlID0gcmVkdWNlUmVtb3ZlKGcudmFsdWUsIGRhdGFba10pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gUmVjb21wdXRlcyB0aGUgZ3JvdXAgcmVkdWNlIHZhbHVlcyBmcm9tIHNjcmF0Y2guCiAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHdoZW4gdGhlIGNhcmRpbmFsaXR5IGlzIGdyZWF0ZXIgdGhhbiAxLgogICAgICBmdW5jdGlvbiByZXNldE1hbnkoKSB7CiAgICAgICAgdmFyIGksCiAgICAgICAgICAgIGc7CgogICAgICAgIC8vIFJlc2V0IGFsbCBncm91cCB2YWx1ZXMuCiAgICAgICAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgICAgICAgZ3JvdXBzW2ldLnZhbHVlID0gcmVkdWNlSW5pdGlhbCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gQWRkIGFueSBzZWxlY3RlZCByZWNvcmRzLgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmICghKGZpbHRlcnNbaV0gJiB6ZXJvKSkgewogICAgICAgICAgICBnID0gZ3JvdXBzW2dyb3VwSW5kZXhbaV1dOwogICAgICAgICAgICBnLnZhbHVlID0gcmVkdWNlQWRkKGcudmFsdWUsIGRhdGFbaV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gUmVjb21wdXRlcyB0aGUgZ3JvdXAgcmVkdWNlIHZhbHVlcyBmcm9tIHNjcmF0Y2guCiAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHdoZW4gdGhlIGNhcmRpbmFsaXR5IGlzIDEuCiAgICAgIGZ1bmN0aW9uIHJlc2V0T25lKCkgewogICAgICAgIHZhciBpLAogICAgICAgICAgICBnID0gZ3JvdXBzWzBdOwoKICAgICAgICAvLyBSZXNldCB0aGUgc2luZ2xldG9uIGdyb3VwIHZhbHVlcy4KICAgICAgICBnLnZhbHVlID0gcmVkdWNlSW5pdGlhbCgpOwoKICAgICAgICAvLyBBZGQgYW55IHNlbGVjdGVkIHJlY29yZHMuCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKCEoZmlsdGVyc1tpXSAmIHplcm8pKSB7CiAgICAgICAgICAgIGcudmFsdWUgPSByZWR1Y2VBZGQoZy52YWx1ZSwgZGF0YVtpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBSZXR1cm5zIHRoZSBhcnJheSBvZiBncm91cCB2YWx1ZXMsIGluIHRoZSBkaW1lbnNpb24ncyBuYXR1cmFsIG9yZGVyLgogICAgICBmdW5jdGlvbiBhbGwoKSB7CiAgICAgICAgaWYgKHJlc2V0TmVlZGVkKSByZXNldCgpLCByZXNldE5lZWRlZCA9IGZhbHNlOwogICAgICAgIHJldHVybiBncm91cHM7CiAgICAgIH0KCiAgICAgIC8vIFJldHVybnMgYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgdG9wIEsgZ3JvdXAgdmFsdWVzLCBpbiByZWR1Y2Ugb3JkZXIuCiAgICAgIGZ1bmN0aW9uIHRvcChrKSB7CiAgICAgICAgdmFyIHRvcCA9IHNlbGVjdChhbGwoKSwgMCwgZ3JvdXBzLmxlbmd0aCwgayk7CiAgICAgICAgcmV0dXJuIGhlYXAuc29ydCh0b3AsIDAsIHRvcC5sZW5ndGgpOwogICAgICB9CgogICAgICAvLyBTZXRzIHRoZSByZWR1Y2UgYmVoYXZpb3IgZm9yIHRoaXMgZ3JvdXAgdG8gdXNlIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb25zLgogICAgICAvLyBUaGlzIG1ldGhvZCBsYXppbHkgcmVjb21wdXRlcyB0aGUgcmVkdWNlIHZhbHVlcywgd2FpdGluZyB1bnRpbCBuZWVkZWQuCiAgICAgIGZ1bmN0aW9uIHJlZHVjZShhZGQsIHJlbW92ZSwgaW5pdGlhbCkgewogICAgICAgIHJlZHVjZUFkZCA9IGFkZDsKICAgICAgICByZWR1Y2VSZW1vdmUgPSByZW1vdmU7CiAgICAgICAgcmVkdWNlSW5pdGlhbCA9IGluaXRpYWw7CiAgICAgICAgcmVzZXROZWVkZWQgPSB0cnVlOwogICAgICAgIHJldHVybiBncm91cDsKICAgICAgfQoKICAgICAgLy8gQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHJlZHVjaW5nIGJ5IGNvdW50LgogICAgICBmdW5jdGlvbiByZWR1Y2VDb3VudCgpIHsKICAgICAgICByZXR1cm4gcmVkdWNlKGNyb3NzZmlsdGVyX3JlZHVjZUluY3JlbWVudCwgY3Jvc3NmaWx0ZXJfcmVkdWNlRGVjcmVtZW50LCBjcm9zc2ZpbHRlcl96ZXJvKTsKICAgICAgfQoKICAgICAgLy8gQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHJlZHVjaW5nIGJ5IHN1bSh2YWx1ZSkuCiAgICAgIGZ1bmN0aW9uIHJlZHVjZVN1bSh2YWx1ZSkgewogICAgICAgIHJldHVybiByZWR1Y2UoY3Jvc3NmaWx0ZXJfcmVkdWNlQWRkKHZhbHVlKSwgY3Jvc3NmaWx0ZXJfcmVkdWNlU3VidHJhY3QodmFsdWUpLCBjcm9zc2ZpbHRlcl96ZXJvKTsKICAgICAgfQoKICAgICAgLy8gU2V0cyB0aGUgcmVkdWNlIG9yZGVyLCB1c2luZyB0aGUgc3BlY2lmaWVkIGFjY2Vzc29yLgogICAgICBmdW5jdGlvbiBvcmRlcih2YWx1ZSkgewogICAgICAgIHNlbGVjdCA9IGhlYXBzZWxlY3RfYnkodmFsdWVPZik7CiAgICAgICAgaGVhcCA9IGhlYXBfYnkodmFsdWVPZik7CiAgICAgICAgZnVuY3Rpb24gdmFsdWVPZihkKSB7IHJldHVybiB2YWx1ZShkLnZhbHVlKTsgfQogICAgICAgIHJldHVybiBncm91cDsKICAgICAgfQoKICAgICAgLy8gQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIG5hdHVyYWwgb3JkZXJpbmcgYnkgcmVkdWNlIHZhbHVlLgogICAgICBmdW5jdGlvbiBvcmRlck5hdHVyYWwoKSB7CiAgICAgICAgcmV0dXJuIG9yZGVyKGNyb3NzZmlsdGVyX2lkZW50aXR5KTsKICAgICAgfQoKICAgICAgLy8gUmV0dXJucyB0aGUgY2FyZGluYWxpdHkgb2YgdGhpcyBncm91cCwgaXJyZXNwZWN0aXZlIG9mIGFueSBmaWx0ZXJzLgogICAgICBmdW5jdGlvbiBzaXplKCkgewogICAgICAgIHJldHVybiBrOwogICAgICB9CgogICAgICAvLyBSZW1vdmVzIHRoaXMgZ3JvdXAgYW5kIGFzc29jaWF0ZWQgZXZlbnQgbGlzdGVuZXJzLgogICAgICBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgICAgIHZhciBpID0gZmlsdGVyTGlzdGVuZXJzLmluZGV4T2YodXBkYXRlKTsKICAgICAgICBpZiAoaSA+PSAwKSBmaWx0ZXJMaXN0ZW5lcnMuc3BsaWNlKGksIDEpOwogICAgICAgIGkgPSBpbmRleExpc3RlbmVycy5pbmRleE9mKGFkZCk7CiAgICAgICAgaWYgKGkgPj0gMCkgaW5kZXhMaXN0ZW5lcnMuc3BsaWNlKGksIDEpOwogICAgICAgIGkgPSByZW1vdmVEYXRhTGlzdGVuZXJzLmluZGV4T2YocmVtb3ZlRGF0YSk7CiAgICAgICAgaWYgKGkgPj0gMCkgcmVtb3ZlRGF0YUxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgcmV0dXJuIGdyb3VwOwogICAgICB9CgogICAgICByZXR1cm4gcmVkdWNlQ291bnQoKS5vcmRlck5hdHVyYWwoKTsKICAgIH0KCiAgICAvLyBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZW5lcmF0aW5nIGEgc2luZ2xldG9uIGdyb3VwLgogICAgZnVuY3Rpb24gZ3JvdXBBbGwoKSB7CiAgICAgIHZhciBnID0gZ3JvdXAoY3Jvc3NmaWx0ZXJfbnVsbCksIGFsbCA9IGcuYWxsOwogICAgICBkZWxldGUgZy5hbGw7CiAgICAgIGRlbGV0ZSBnLnRvcDsKICAgICAgZGVsZXRlIGcub3JkZXI7CiAgICAgIGRlbGV0ZSBnLm9yZGVyTmF0dXJhbDsKICAgICAgZGVsZXRlIGcuc2l6ZTsKICAgICAgZy52YWx1ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gYWxsKClbMF0udmFsdWU7IH07CiAgICAgIHJldHVybiBnOwogICAgfQoKICAgIC8vIFJlbW92ZXMgdGhpcyBkaW1lbnNpb24gYW5kIGFzc29jaWF0ZWQgZ3JvdXBzIGFuZCBldmVudCBsaXN0ZW5lcnMuCiAgICBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgICBkaW1lbnNpb25Hcm91cHMuZm9yRWFjaChmdW5jdGlvbihncm91cCkgeyBncm91cC5kaXNwb3NlKCk7IH0pOwogICAgICB2YXIgaSA9IGRhdGFMaXN0ZW5lcnMuaW5kZXhPZihwcmVBZGQpOwogICAgICBpZiAoaSA+PSAwKSBkYXRhTGlzdGVuZXJzLnNwbGljZShpLCAxKTsKICAgICAgaSA9IGRhdGFMaXN0ZW5lcnMuaW5kZXhPZihwb3N0QWRkKTsKICAgICAgaWYgKGkgPj0gMCkgZGF0YUxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CiAgICAgIGkgPSByZW1vdmVEYXRhTGlzdGVuZXJzLmluZGV4T2YocmVtb3ZlRGF0YSk7CiAgICAgIGlmIChpID49IDApIHJlbW92ZURhdGFMaXN0ZW5lcnMuc3BsaWNlKGksIDEpOwogICAgICBtICY9IHplcm87CiAgICAgIHJldHVybiBmaWx0ZXJBbGwoKTsKICAgIH0KCiAgICByZXR1cm4gZGltZW5zaW9uOwogIH0KCiAgLy8gQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdyb3VwQWxsIG9uIGEgZHVtbXkgZGltZW5zaW9uLgogIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIG9wdGltaXplZCBzaW5jZSBpdCBhbHdheXMgaGFzIGNhcmRpbmFsaXR5IDEuCiAgZnVuY3Rpb24gZ3JvdXBBbGwoKSB7CiAgICB2YXIgZ3JvdXAgPSB7CiAgICAgIHJlZHVjZTogcmVkdWNlLAogICAgICByZWR1Y2VDb3VudDogcmVkdWNlQ291bnQsCiAgICAgIHJlZHVjZVN1bTogcmVkdWNlU3VtLAogICAgICB2YWx1ZTogdmFsdWUsCiAgICAgIGRpc3Bvc2U6IGRpc3Bvc2UsCiAgICAgIHJlbW92ZTogZGlzcG9zZSAvLyBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkKICAgIH07CgogICAgdmFyIHJlZHVjZVZhbHVlLAogICAgICAgIHJlZHVjZUFkZCwKICAgICAgICByZWR1Y2VSZW1vdmUsCiAgICAgICAgcmVkdWNlSW5pdGlhbCwKICAgICAgICByZXNldE5lZWRlZCA9IHRydWU7CgogICAgLy8gVGhlIGdyb3VwIGxpc3RlbnMgdG8gdGhlIGNyb3NzZmlsdGVyIGZvciB3aGVuIGFueSBkaW1lbnNpb24gY2hhbmdlcywgc28KICAgIC8vIHRoYXQgaXQgY2FuIHVwZGF0ZSB0aGUgcmVkdWNlIHZhbHVlLiBJdCBtdXN0IGFsc28gbGlzdGVuIHRvIHRoZSBwYXJlbnQKICAgIC8vIGRpbWVuc2lvbiBmb3Igd2hlbiBkYXRhIGlzIGFkZGVkLgogICAgZmlsdGVyTGlzdGVuZXJzLnB1c2godXBkYXRlKTsKICAgIGRhdGFMaXN0ZW5lcnMucHVzaChhZGQpOwoKICAgIC8vIEZvciBjb25zaXN0ZW5jeTsgYWN0dWFsbHkgYSBuby1vcCBzaW5jZSByZXNldE5lZWRlZCBpcyB0cnVlLgogICAgYWRkKGRhdGEsIDAsIG4pOwoKICAgIC8vIEluY29ycG9yYXRlcyB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZXMgaW50byB0aGlzIGdyb3VwLgogICAgZnVuY3Rpb24gYWRkKG5ld0RhdGEsIG4wKSB7CiAgICAgIHZhciBpOwoKICAgICAgaWYgKHJlc2V0TmVlZGVkKSByZXR1cm47CgogICAgICAvLyBBZGQgdGhlIGFkZGVkIHZhbHVlcy4KICAgICAgZm9yIChpID0gbjA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoIWZpbHRlcnNbaV0pIHsKICAgICAgICAgIHJlZHVjZVZhbHVlID0gcmVkdWNlQWRkKHJlZHVjZVZhbHVlLCBkYXRhW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZWR1Y2VzIHRoZSBzcGVjaWZpZWQgc2VsZWN0ZWQgb3IgZGVzZWxlY3RlZCByZWNvcmRzLgogICAgZnVuY3Rpb24gdXBkYXRlKGZpbHRlck9uZSwgYWRkZWQsIHJlbW92ZWQpIHsKICAgICAgdmFyIGksCiAgICAgICAgICBrLAogICAgICAgICAgbjsKCiAgICAgIGlmIChyZXNldE5lZWRlZCkgcmV0dXJuOwoKICAgICAgLy8gQWRkIHRoZSBhZGRlZCB2YWx1ZXMuCiAgICAgIGZvciAoaSA9IDAsIG4gPSBhZGRlZC5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoIWZpbHRlcnNbayA9IGFkZGVkW2ldXSkgewogICAgICAgICAgcmVkdWNlVmFsdWUgPSByZWR1Y2VBZGQocmVkdWNlVmFsdWUsIGRhdGFba10pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gUmVtb3ZlIHRoZSByZW1vdmVkIHZhbHVlcy4KICAgICAgZm9yIChpID0gMCwgbiA9IHJlbW92ZWQubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKGZpbHRlcnNbayA9IHJlbW92ZWRbaV1dID09PSBmaWx0ZXJPbmUpIHsKICAgICAgICAgIHJlZHVjZVZhbHVlID0gcmVkdWNlUmVtb3ZlKHJlZHVjZVZhbHVlLCBkYXRhW2tdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZWNvbXB1dGVzIHRoZSBncm91cCByZWR1Y2UgdmFsdWUgZnJvbSBzY3JhdGNoLgogICAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgIHZhciBpOwoKICAgICAgcmVkdWNlVmFsdWUgPSByZWR1Y2VJbml0aWFsKCk7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCFmaWx0ZXJzW2ldKSB7CiAgICAgICAgICByZWR1Y2VWYWx1ZSA9IHJlZHVjZUFkZChyZWR1Y2VWYWx1ZSwgZGF0YVtpXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gU2V0cyB0aGUgcmVkdWNlIGJlaGF2aW9yIGZvciB0aGlzIGdyb3VwIHRvIHVzZSB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9ucy4KICAgIC8vIFRoaXMgbWV0aG9kIGxhemlseSByZWNvbXB1dGVzIHRoZSByZWR1Y2UgdmFsdWUsIHdhaXRpbmcgdW50aWwgbmVlZGVkLgogICAgZnVuY3Rpb24gcmVkdWNlKGFkZCwgcmVtb3ZlLCBpbml0aWFsKSB7CiAgICAgIHJlZHVjZUFkZCA9IGFkZDsKICAgICAgcmVkdWNlUmVtb3ZlID0gcmVtb3ZlOwogICAgICByZWR1Y2VJbml0aWFsID0gaW5pdGlhbDsKICAgICAgcmVzZXROZWVkZWQgPSB0cnVlOwogICAgICByZXR1cm4gZ3JvdXA7CiAgICB9CgogICAgLy8gQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHJlZHVjaW5nIGJ5IGNvdW50LgogICAgZnVuY3Rpb24gcmVkdWNlQ291bnQoKSB7CiAgICAgIHJldHVybiByZWR1Y2UoY3Jvc3NmaWx0ZXJfcmVkdWNlSW5jcmVtZW50LCBjcm9zc2ZpbHRlcl9yZWR1Y2VEZWNyZW1lbnQsIGNyb3NzZmlsdGVyX3plcm8pOwogICAgfQoKICAgIC8vIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciByZWR1Y2luZyBieSBzdW0odmFsdWUpLgogICAgZnVuY3Rpb24gcmVkdWNlU3VtKHZhbHVlKSB7CiAgICAgIHJldHVybiByZWR1Y2UoY3Jvc3NmaWx0ZXJfcmVkdWNlQWRkKHZhbHVlKSwgY3Jvc3NmaWx0ZXJfcmVkdWNlU3VidHJhY3QodmFsdWUpLCBjcm9zc2ZpbHRlcl96ZXJvKTsKICAgIH0KCiAgICAvLyBSZXR1cm5zIHRoZSBjb21wdXRlZCByZWR1Y2UgdmFsdWUuCiAgICBmdW5jdGlvbiB2YWx1ZSgpIHsKICAgICAgaWYgKHJlc2V0TmVlZGVkKSByZXNldCgpLCByZXNldE5lZWRlZCA9IGZhbHNlOwogICAgICByZXR1cm4gcmVkdWNlVmFsdWU7CiAgICB9CgogICAgLy8gUmVtb3ZlcyB0aGlzIGdyb3VwIGFuZCBhc3NvY2lhdGVkIGV2ZW50IGxpc3RlbmVycy4KICAgIGZ1bmN0aW9uIGRpc3Bvc2UoKSB7CiAgICAgIHZhciBpID0gZmlsdGVyTGlzdGVuZXJzLmluZGV4T2YodXBkYXRlKTsKICAgICAgaWYgKGkgPj0gMCkgZmlsdGVyTGlzdGVuZXJzLnNwbGljZShpKTsKICAgICAgaSA9IGRhdGFMaXN0ZW5lcnMuaW5kZXhPZihhZGQpOwogICAgICBpZiAoaSA+PSAwKSBkYXRhTGlzdGVuZXJzLnNwbGljZShpKTsKICAgICAgcmV0dXJuIGdyb3VwOwogICAgfQoKICAgIHJldHVybiByZWR1Y2VDb3VudCgpOwogIH0KCiAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhpcyBjcm9zc2ZpbHRlciwgaXJyZXNwZWN0aXZlIG9mIGFueSBmaWx0ZXJzLgogIGZ1bmN0aW9uIHNpemUoKSB7CiAgICByZXR1cm4gbjsKICB9CgogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgID8gYWRkKGFyZ3VtZW50c1swXSkKICAgICAgOiBjcm9zc2ZpbHRlcjsKfQoKLy8gUmV0dXJucyBhbiBhcnJheSBvZiBzaXplIG4sIGJpZyBlbm91Z2ggdG8gc3RvcmUgaWRzIHVwIHRvIG0uCmZ1bmN0aW9uIGNyb3NzZmlsdGVyX2luZGV4KG4sIG0pIHsKICByZXR1cm4gKG0gPCAweDEwMQogICAgICA/IGNyb3NzZmlsdGVyX2FycmF5OCA6IG0gPCAweDEwMDAxCiAgICAgID8gY3Jvc3NmaWx0ZXJfYXJyYXkxNgogICAgICA6IGNyb3NzZmlsdGVyX2FycmF5MzIpKG4pOwp9CgovLyBDb25zdHJ1Y3RzIGEgbmV3IGFycmF5IG9mIHNpemUgbiwgd2l0aCBzZXF1ZW50aWFsIHZhbHVlcyBmcm9tIDAgdG8gbiAtIDEuCmZ1bmN0aW9uIGNyb3NzZmlsdGVyX3JhbmdlKG4pIHsKICB2YXIgcmFuZ2UgPSBjcm9zc2ZpbHRlcl9pbmRleChuLCBuKTsKICBmb3IgKHZhciBpID0gLTE7ICsraSA8IG47KSByYW5nZVtpXSA9IGk7CiAgcmV0dXJuIHJhbmdlOwp9CgpmdW5jdGlvbiBjcm9zc2ZpbHRlcl9jYXBhY2l0eSh3KSB7CiAgcmV0dXJuIHcgPT09IDgKICAgICAgPyAweDEwMCA6IHcgPT09IDE2CiAgICAgID8gMHgxMDAwMAogICAgICA6IDB4MTAwMDAwMDAwOwp9Cn0pKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyAmJiBleHBvcnRzIHx8IHRoaXMpOwo="></script>
<script src="data:application/javascript; charset=utf-8;base64,LyohCiAqICBkYyAyLjAuMC1iZXRhLjMyCiAqICBodHRwOi8vZGMtanMuZ2l0aHViLmlvL2RjLmpzLwogKiAgQ29weXJpZ2h0IDIwMTItMjAxNiBOaWNrIFpodSAmIHRoZSBkYy5qcyBEZXZlbG9wZXJzCiAqICBodHRwczovL2dpdGh1Yi5jb20vZGMtanMvZGMuanMvYmxvYi9tYXN0ZXIvQVVUSE9SUwogKgogKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KKGZ1bmN0aW9uKCkgeyBmdW5jdGlvbiBfZGMoZDMsIGNyb3NzZmlsdGVyKSB7Cid1c2Ugc3RyaWN0JzsKCi8qKgogKiBUaGUgZW50aXJlIGRjLmpzIGxpYnJhcnkgaXMgc2NvcGVkIHVuZGVyIHRoZSAqKmRjKiogbmFtZSBzcGFjZS4gSXQgZG9lcyBub3QgaW50cm9kdWNlCiAqIGFueXRoaW5nIGVsc2UgaW50byB0aGUgZ2xvYmFsIG5hbWUgc3BhY2UuCiAqCiAqIE1vc3QgYGRjYCBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIHRvIGFsbG93IGZ1bmN0aW9uIGNoYWluaW5nLCBtZWFuaW5nIHRoZXkgcmV0dXJuIHRoZSBjdXJyZW50IGNoYXJ0CiAqIGluc3RhbmNlIHdoZW5ldmVyIGl0IGlzIGFwcHJvcHJpYXRlLiAgVGhlIGdldHRlciBmb3JtcyBvZiBmdW5jdGlvbnMgZG8gbm90IHBhcnRpY2lwYXRlIGluIGZ1bmN0aW9uCiAqIGNoYWluaW5nIGJlY2F1c2UgdGhleSByZXR1cm4gdmFsdWVzIHRoYXQgYXJlIG5vdCB0aGUgY2hhcnQsIGFsdGhvdWdoIHNvbWUsCiAqIHN1Y2ggYXMge0BsaW5rIGRjLmJhc2VNaXhpbiNzdmcgLnN2Z30gYW5kIHtAbGluayBkYy5jb29yZGluYXRlR3JpZE1peGluI3hBeGlzIC54QXhpc30sCiAqIHJldHVybiB2YWx1ZXMgdGhhdCBhcmUgdGhlbXNlbHZlcyBjaGFpbmFibGUgZDMgb2JqZWN0cy4KICogQG5hbWVzcGFjZSBkYwogKiBAdmVyc2lvbiAyLjAuMC1iZXRhLjMyCiAqIEBleGFtcGxlCiAqIC8vIEV4YW1wbGUgY2hhaW5pbmcKICogY2hhcnQud2lkdGgoMzAwKQogKiAgICAgIC5oZWlnaHQoMzAwKQogKiAgICAgIC5maWx0ZXIoJ3N1bmRheScpOwogKi8KLypqc2hpbnQgLVcwNzkqLwp2YXIgZGMgPSB7CiAgICB2ZXJzaW9uOiAnMi4wLjAtYmV0YS4zMicsCiAgICBjb25zdGFudHM6IHsKICAgICAgICBDSEFSVF9DTEFTUzogJ2RjLWNoYXJ0JywKICAgICAgICBERUJVR19HUk9VUF9DTEFTUzogJ2RlYnVnJywKICAgICAgICBTVEFDS19DTEFTUzogJ3N0YWNrJywKICAgICAgICBERVNFTEVDVEVEX0NMQVNTOiAnZGVzZWxlY3RlZCcsCiAgICAgICAgU0VMRUNURURfQ0xBU1M6ICdzZWxlY3RlZCcsCiAgICAgICAgTk9ERV9JTkRFWF9OQU1FOiAnX19pbmRleF9fJywKICAgICAgICBHUk9VUF9JTkRFWF9OQU1FOiAnX19ncm91cF9pbmRleF9fJywKICAgICAgICBERUZBVUxUX0NIQVJUX0dST1VQOiAnX19kZWZhdWx0X2NoYXJ0X2dyb3VwX18nLAogICAgICAgIEVWRU5UX0RFTEFZOiA0MCwKICAgICAgICBORUdMSUdJQkxFX05VTUJFUjogMWUtMTAKICAgIH0sCiAgICBfcmVuZGVybGV0OiBudWxsCn07Ci8qanNoaW50ICtXMDc5Ki8KCi8qKgogKiBUaGUgZGMuY2hhcnRSZWdpc3RyeSBvYmplY3QgbWFpbnRhaW5zIHNldHMgb2YgYWxsIGluc3RhbnRpYXRlZCBkYy5qcyBjaGFydHMgdW5kZXIgbmFtZWQgZ3JvdXBzCiAqIGFuZCB0aGUgZGVmYXVsdCBncm91cC4KICoKICogQSBjaGFydCBncm91cCBvZnRlbiBjb3JyZXNwb25kcyB0byBhIGNyb3NzZmlsdGVyIGluc3RhbmNlLiBJdCBzcGVjaWZpZXMKICogdGhlIHNldCBvZiBjaGFydHMgd2hpY2ggc2hvdWxkIGJlIHVwZGF0ZWQgd2hlbiBhIGZpbHRlciBjaGFuZ2VzIG9uIG9uZSBvZiB0aGUgY2hhcnRzIG9yIHdoZW4gdGhlCiAqIGdsb2JhbCBmdW5jdGlvbnMge0BsaW5rIGRjLmZpbHRlckFsbCBkYy5maWx0ZXJBbGx9LCB7QGxpbmsgZGMucmVmb2N1c0FsbCBkYy5yZWZvY3VzQWxsfSwKICoge0BsaW5rIGRjLnJlbmRlckFsbCBkYy5yZW5kZXJBbGx9LCB7QGxpbmsgZGMucmVkcmF3QWxsIGRjLnJlZHJhd0FsbH0sIG9yIGNoYXJ0IGZ1bmN0aW9ucwogKiB7QGxpbmsgZGMuYmFzZU1peGluI3JlbmRlckdyb3VwIGJhc2VNaXhpbi5yZW5kZXJHcm91cH0sCiAqIHtAbGluayBkYy5iYXNlTWl4aW4jcmVkcmF3R3JvdXAgYmFzZU1peGluLnJlZHJhd0dyb3VwfSBhcmUgY2FsbGVkLgogKgogKiBAbmFtZXNwYWNlIGNoYXJ0UmVnaXN0cnkKICogQG1lbWJlcm9mIGRjCiAqIEB0eXBlIHt7aGFzLCByZWdpc3RlciwgZGVyZWdpc3RlciwgY2xlYXIsIGxpc3R9fQogKi8KZGMuY2hhcnRSZWdpc3RyeSA9IChmdW5jdGlvbiAoKSB7CiAgICAvLyBjaGFydEdyb3VwOnN0cmluZyA9PiBjaGFydHM6YXJyYXkKICAgIHZhciBfY2hhcnRNYXAgPSB7fTsKCiAgICBmdW5jdGlvbiBpbml0aWFsaXplQ2hhcnRHcm91cCAoZ3JvdXApIHsKICAgICAgICBpZiAoIWdyb3VwKSB7CiAgICAgICAgICAgIGdyb3VwID0gZGMuY29uc3RhbnRzLkRFRkFVTFRfQ0hBUlRfR1JPVVA7CiAgICAgICAgfQoKICAgICAgICBpZiAoIV9jaGFydE1hcFtncm91cF0pIHsKICAgICAgICAgICAgX2NoYXJ0TWFwW2dyb3VwXSA9IFtdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGdyb3VwOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gY2hhcnQgaW5zdGFuY2UgcmVzaWRlcyBpbiBhbnkgZ3JvdXAgaW4gdGhlIHJlZ2lzdHJ5LgogICAgICAgICAqIEBtZXRob2QgaGFzCiAgICAgICAgICogQG1lbWJlcm9mIGRjLmNoYXJ0UmVnaXN0cnkKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2hhcnQgZGMuanMgY2hhcnQgaW5zdGFuY2UKICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBoYXM6IGZ1bmN0aW9uIChjaGFydCkgewogICAgICAgICAgICBmb3IgKHZhciBlIGluIF9jaGFydE1hcCkgewogICAgICAgICAgICAgICAgaWYgKF9jaGFydE1hcFtlXS5pbmRleE9mKGNoYXJ0KSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFkZCBnaXZlbiBjaGFydCBpbnN0YW5jZSB0byB0aGUgZ2l2ZW4gZ3JvdXAsIGNyZWF0aW5nIHRoZSBncm91cCBpZiBuZWNlc3NhcnkuCiAgICAgICAgICogSWYgbm8gZ3JvdXAgaXMgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGdyb3VwIGBkYy5jb25zdGFudHMuREVGQVVMVF9DSEFSVF9HUk9VUGAgd2lsbCBiZSB1c2VkLgogICAgICAgICAqIEBtZXRob2QgcmVnaXN0ZXIKICAgICAgICAgKiBAbWVtYmVyb2YgZGMuY2hhcnRSZWdpc3RyeQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaGFydCBkYy5qcyBjaGFydCBpbnN0YW5jZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbZ3JvdXBdIEdyb3VwIG5hbWUKICAgICAgICAgKi8KICAgICAgICByZWdpc3RlcjogZnVuY3Rpb24gKGNoYXJ0LCBncm91cCkgewogICAgICAgICAgICBncm91cCA9IGluaXRpYWxpemVDaGFydEdyb3VwKGdyb3VwKTsKICAgICAgICAgICAgX2NoYXJ0TWFwW2dyb3VwXS5wdXNoKGNoYXJ0KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmUgZ2l2ZW4gY2hhcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gZ3JvdXAsIGNyZWF0aW5nIHRoZSBncm91cCBpZiBuZWNlc3NhcnkuCiAgICAgICAgICogSWYgbm8gZ3JvdXAgaXMgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGdyb3VwIGBkYy5jb25zdGFudHMuREVGQVVMVF9DSEFSVF9HUk9VUGAgd2lsbCBiZSB1c2VkLgogICAgICAgICAqIEBtZXRob2QgZGVyZWdpc3RlcgogICAgICAgICAqIEBtZW1iZXJvZiBkYy5jaGFydFJlZ2lzdHJ5CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNoYXJ0IGRjLmpzIGNoYXJ0IGluc3RhbmNlCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm91cF0gR3JvdXAgbmFtZQogICAgICAgICAqLwogICAgICAgIGRlcmVnaXN0ZXI6IGZ1bmN0aW9uIChjaGFydCwgZ3JvdXApIHsKICAgICAgICAgICAgZ3JvdXAgPSBpbml0aWFsaXplQ2hhcnRHcm91cChncm91cCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2NoYXJ0TWFwW2dyb3VwXS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKF9jaGFydE1hcFtncm91cF1baV0uYW5jaG9yTmFtZSgpID09PSBjaGFydC5hbmNob3JOYW1lKCkpIHsKICAgICAgICAgICAgICAgICAgICBfY2hhcnRNYXBbZ3JvdXBdLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENsZWFyIGdpdmVuIGdyb3VwIGlmIG9uZSBpcyBwcm92aWRlZCwgb3RoZXJ3aXNlIGNsZWFycyBhbGwgZ3JvdXBzLgogICAgICAgICAqIEBtZXRob2QgY2xlYXIKICAgICAgICAgKiBAbWVtYmVyb2YgZGMuY2hhcnRSZWdpc3RyeQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cCBHcm91cCBuYW1lCiAgICAgICAgICovCiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uIChncm91cCkgewogICAgICAgICAgICBpZiAoZ3JvdXApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBfY2hhcnRNYXBbZ3JvdXBdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgX2NoYXJ0TWFwID0ge307CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXQgYW4gYXJyYXkgb2YgZWFjaCBjaGFydCBpbnN0YW5jZSBpbiB0aGUgZ2l2ZW4gZ3JvdXAuCiAgICAgICAgICogSWYgbm8gZ3JvdXAgaXMgcHJvdmlkZWQsIHRoZSBjaGFydHMgaW4gdGhlIGRlZmF1bHQgZ3JvdXAgYXJlIHJldHVybmVkLgogICAgICAgICAqIEBtZXRob2QgbGlzdAogICAgICAgICAqIEBtZW1iZXJvZiBkYy5jaGFydFJlZ2lzdHJ5CiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm91cF0gR3JvdXAgbmFtZQogICAgICAgICAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fQogICAgICAgICAqLwogICAgICAgIGxpc3Q6IGZ1bmN0aW9uIChncm91cCkgewogICAgICAgICAgICBncm91cCA9IGluaXRpYWxpemVDaGFydEdyb3VwKGdyb3VwKTsKICAgICAgICAgICAgcmV0dXJuIF9jaGFydE1hcFtncm91cF07CiAgICAgICAgfQogICAgfTsKfSkoKTsKCi8qKgogKiBBZGQgZ2l2ZW4gY2hhcnQgaW5zdGFuY2UgdG8gdGhlIGdpdmVuIGdyb3VwLCBjcmVhdGluZyB0aGUgZ3JvdXAgaWYgbmVjZXNzYXJ5LgogKiBJZiBubyBncm91cCBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgZ3JvdXAgYGRjLmNvbnN0YW50cy5ERUZBVUxUX0NIQVJUX0dST1VQYCB3aWxsIGJlIHVzZWQuCiAqIEBtZW1iZXJvZiBkYwogKiBAbWV0aG9kIHJlZ2lzdGVyQ2hhcnQKICogQHBhcmFtIHtPYmplY3R9IGNoYXJ0IGRjLmpzIGNoYXJ0IGluc3RhbmNlCiAqIEBwYXJhbSB7U3RyaW5nfSBbZ3JvdXBdIEdyb3VwIG5hbWUKICovCmRjLnJlZ2lzdGVyQ2hhcnQgPSBmdW5jdGlvbiAoY2hhcnQsIGdyb3VwKSB7CiAgICBkYy5jaGFydFJlZ2lzdHJ5LnJlZ2lzdGVyKGNoYXJ0LCBncm91cCk7Cn07CgovKioKICogUmVtb3ZlIGdpdmVuIGNoYXJ0IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIGdyb3VwLCBjcmVhdGluZyB0aGUgZ3JvdXAgaWYgbmVjZXNzYXJ5LgogKiBJZiBubyBncm91cCBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgZ3JvdXAgYGRjLmNvbnN0YW50cy5ERUZBVUxUX0NIQVJUX0dST1VQYCB3aWxsIGJlIHVzZWQuCiAqIEBtZW1iZXJvZiBkYwogKiBAbWV0aG9kIGRlcmVnaXN0ZXJDaGFydAogKiBAcGFyYW0ge09iamVjdH0gY2hhcnQgZGMuanMgY2hhcnQgaW5zdGFuY2UKICogQHBhcmFtIHtTdHJpbmd9IFtncm91cF0gR3JvdXAgbmFtZQogKi8KZGMuZGVyZWdpc3RlckNoYXJ0ID0gZnVuY3Rpb24gKGNoYXJ0LCBncm91cCkgewogICAgZGMuY2hhcnRSZWdpc3RyeS5kZXJlZ2lzdGVyKGNoYXJ0LCBncm91cCk7Cn07CgovKioKICogRGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gY2hhcnQgaW5zdGFuY2UgcmVzaWRlcyBpbiBhbnkgZ3JvdXAgaW4gdGhlIHJlZ2lzdHJ5LgogKiBAbWVtYmVyb2YgZGMKICogQG1ldGhvZCBoYXNDaGFydAogKiBAcGFyYW0ge09iamVjdH0gY2hhcnQgZGMuanMgY2hhcnQgaW5zdGFuY2UKICogQHJldHVybnMge0Jvb2xlYW59CiAqLwpkYy5oYXNDaGFydCA9IGZ1bmN0aW9uIChjaGFydCkgewogICAgcmV0dXJuIGRjLmNoYXJ0UmVnaXN0cnkuaGFzKGNoYXJ0KTsKfTsKCi8qKgogKiBDbGVhciBnaXZlbiBncm91cCBpZiBvbmUgaXMgcHJvdmlkZWQsIG90aGVyd2lzZSBjbGVhcnMgYWxsIGdyb3Vwcy4KICogQG1lbWJlcm9mIGRjCiAqIEBtZXRob2QgZGVyZWdpc3RlckFsbENoYXJ0cwogKiBAcGFyYW0ge1N0cmluZ30gZ3JvdXAgR3JvdXAgbmFtZQogKi8KZGMuZGVyZWdpc3RlckFsbENoYXJ0cyA9IGZ1bmN0aW9uIChncm91cCkgewogICAgZGMuY2hhcnRSZWdpc3RyeS5jbGVhcihncm91cCk7Cn07CgovKioKICogQ2xlYXIgYWxsIGZpbHRlcnMgb24gYWxsIGNoYXJ0cyB3aXRoaW4gdGhlIGdpdmVuIGNoYXJ0IGdyb3VwLiBJZiB0aGUgY2hhcnQgZ3JvdXAgaXMgbm90IGdpdmVuIHRoZW4KICogb25seSBjaGFydHMgdGhhdCBiZWxvbmcgdG8gdGhlIGRlZmF1bHQgY2hhcnQgZ3JvdXAgd2lsbCBiZSByZXNldC4KICogQG1lbWJlcm9mIGRjCiAqIEBtZXRob2QgZmlsdGVyQWxsCiAqIEBwYXJhbSB7U3RyaW5nfSBbZ3JvdXBdCiAqLwpkYy5maWx0ZXJBbGwgPSBmdW5jdGlvbiAoZ3JvdXApIHsKICAgIHZhciBjaGFydHMgPSBkYy5jaGFydFJlZ2lzdHJ5Lmxpc3QoZ3JvdXApOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFydHMubGVuZ3RoOyArK2kpIHsKICAgICAgICBjaGFydHNbaV0uZmlsdGVyQWxsKCk7CiAgICB9Cn07CgovKioKICogUmVzZXQgem9vbSBsZXZlbCAvIGZvY3VzIG9uIGFsbCBjaGFydHMgdGhhdCBiZWxvbmcgdG8gdGhlIGdpdmVuIGNoYXJ0IGdyb3VwLiBJZiB0aGUgY2hhcnQgZ3JvdXAgaXMKICogbm90IGdpdmVuIHRoZW4gb25seSBjaGFydHMgdGhhdCBiZWxvbmcgdG8gdGhlIGRlZmF1bHQgY2hhcnQgZ3JvdXAgd2lsbCBiZSByZXNldC4KICogQG1lbWJlcm9mIGRjCiAqIEBtZXRob2QgcmVmb2N1c0FsbAogKiBAcGFyYW0ge1N0cmluZ30gW2dyb3VwXQogKi8KZGMucmVmb2N1c0FsbCA9IGZ1bmN0aW9uIChncm91cCkgewogICAgdmFyIGNoYXJ0cyA9IGRjLmNoYXJ0UmVnaXN0cnkubGlzdChncm91cCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJ0cy5sZW5ndGg7ICsraSkgewogICAgICAgIGlmIChjaGFydHNbaV0uZm9jdXMpIHsKICAgICAgICAgICAgY2hhcnRzW2ldLmZvY3VzKCk7CiAgICAgICAgfQogICAgfQp9OwoKLyoqCiAqIFJlLXJlbmRlciBhbGwgY2hhcnRzIGJlbG9uZyB0byB0aGUgZ2l2ZW4gY2hhcnQgZ3JvdXAuIElmIHRoZSBjaGFydCBncm91cCBpcyBub3QgZ2l2ZW4gdGhlbiBvbmx5CiAqIGNoYXJ0cyB0aGF0IGJlbG9uZyB0byB0aGUgZGVmYXVsdCBjaGFydCBncm91cCB3aWxsIGJlIHJlLXJlbmRlcmVkLgogKiBAbWVtYmVyb2YgZGMKICogQG1ldGhvZCByZW5kZXJBbGwKICogQHBhcmFtIHtTdHJpbmd9IFtncm91cF0KICovCmRjLnJlbmRlckFsbCA9IGZ1bmN0aW9uIChncm91cCkgewogICAgdmFyIGNoYXJ0cyA9IGRjLmNoYXJ0UmVnaXN0cnkubGlzdChncm91cCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJ0cy5sZW5ndGg7ICsraSkgewogICAgICAgIGNoYXJ0c1tpXS5yZW5kZXIoKTsKICAgIH0KCiAgICBpZiAoZGMuX3JlbmRlcmxldCAhPT0gbnVsbCkgewogICAgICAgIGRjLl9yZW5kZXJsZXQoZ3JvdXApOwogICAgfQp9OwoKLyoqCiAqIFJlZHJhdyBhbGwgY2hhcnRzIGJlbG9uZyB0byB0aGUgZ2l2ZW4gY2hhcnQgZ3JvdXAuIElmIHRoZSBjaGFydCBncm91cCBpcyBub3QgZ2l2ZW4gdGhlbiBvbmx5IGNoYXJ0cwogKiB0aGF0IGJlbG9uZyB0byB0aGUgZGVmYXVsdCBjaGFydCBncm91cCB3aWxsIGJlIHJlLWRyYXduLiBSZWRyYXcgaXMgZGlmZmVyZW50IGZyb20gcmUtcmVuZGVyIHNpbmNlCiAqIHdoZW4gcmVkcmF3aW5nIGRjIHRyaWVzIHRvIHVwZGF0ZSB0aGUgZ3JhcGhpYyBpbmNyZW1lbnRhbGx5LCB1c2luZyB0cmFuc2l0aW9ucywgaW5zdGVhZCBvZiBzdGFydGluZwogKiBmcm9tIHNjcmF0Y2guCiAqIEBtZW1iZXJvZiBkYwogKiBAbWV0aG9kIHJlZHJhd0FsbAogKiBAcGFyYW0ge1N0cmluZ30gW2dyb3VwXQogKi8KZGMucmVkcmF3QWxsID0gZnVuY3Rpb24gKGdyb3VwKSB7CiAgICB2YXIgY2hhcnRzID0gZGMuY2hhcnRSZWdpc3RyeS5saXN0KGdyb3VwKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgY2hhcnRzW2ldLnJlZHJhdygpOwogICAgfQoKICAgIGlmIChkYy5fcmVuZGVybGV0ICE9PSBudWxsKSB7CiAgICAgICAgZGMuX3JlbmRlcmxldChncm91cCk7CiAgICB9Cn07CgovKioKICogSWYgdGhpcyBib29sZWFuIGlzIHNldCB0cnV0aHksIGFsbCB0cmFuc2l0aW9ucyB3aWxsIGJlIGRpc2FibGVkLCBhbmQgY2hhbmdlcyB0byB0aGUgY2hhcnRzIHdpbGwgaGFwcGVuCiAqIGltbWVkaWF0ZWx5CiAqIEBtZW1iZXJvZiBkYwogKiBAbWV0aG9kIGRpc2FibGVUcmFuc2l0aW9ucwogKiBAdHlwZSB7Qm9vbGVhbn0KICogQGRlZmF1bHQgZmFsc2UKICovCmRjLmRpc2FibGVUcmFuc2l0aW9ucyA9IGZhbHNlOwoKZGMudHJhbnNpdGlvbiA9IGZ1bmN0aW9uIChzZWxlY3Rpb25zLCBkdXJhdGlvbiwgY2FsbGJhY2ssIG5hbWUpIHsKICAgIGlmIChkdXJhdGlvbiA8PSAwIHx8IGR1cmF0aW9uID09PSB1bmRlZmluZWQgfHwgZGMuZGlzYWJsZVRyYW5zaXRpb25zKSB7CiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbnM7CiAgICB9CgogICAgdmFyIHMgPSBzZWxlY3Rpb25zCiAgICAgICAgLnRyYW5zaXRpb24obmFtZSkKICAgICAgICAuZHVyYXRpb24oZHVyYXRpb24pOwoKICAgIGlmICh0eXBlb2YoY2FsbGJhY2spID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgY2FsbGJhY2socyk7CiAgICB9CgogICAgcmV0dXJuIHM7Cn07CgovKiBzb21ld2hhdCBzaWxseSwgYnV0IHRvIGF2b2lkIGR1cGxpY2F0aW5nIGxvZ2ljICovCmRjLm9wdGlvbmFsVHJhbnNpdGlvbiA9IGZ1bmN0aW9uIChlbmFibGUsIGR1cmF0aW9uLCBjYWxsYmFjaywgbmFtZSkgewogICAgaWYgKGVuYWJsZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VsZWN0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiBkYy50cmFuc2l0aW9uKHNlbGVjdGlvbiwgZHVyYXRpb24sIGNhbGxiYWNrLCBuYW1lKTsKICAgICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNlbGVjdGlvbikgewogICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uOwogICAgICAgIH07CiAgICB9Cn07CgovLyBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjA3NzM4NDYKZGMuYWZ0ZXJUcmFuc2l0aW9uID0gZnVuY3Rpb24gKHRyYW5zaXRpb24sIGNhbGxiYWNrKSB7CiAgICBpZiAodHJhbnNpdGlvbi5lbXB0eSgpIHx8ICF0cmFuc2l0aW9uLmR1cmF0aW9uKSB7CiAgICAgICAgY2FsbGJhY2suY2FsbCh0cmFuc2l0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG4gPSAwOwogICAgICAgIHRyYW5zaXRpb24KICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKCkgeyArK247IH0pCiAgICAgICAgICAgIC5lYWNoKCdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIS0tbikgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodHJhbnNpdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgfQp9OwoKLyoqCiAqIEBuYW1lc3BhY2UgdW5pdHMKICogQG1lbWJlcm9mIGRjCiAqIEB0eXBlIHt7fX0KICovCmRjLnVuaXRzID0ge307CgovKioKICogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHtAbGluayBkYy5jb29yZGluYXRlR3JpZE1peGluI3hVbml0cyAueFVuaXRzfSBmb3IgdGhlCiAqIHtAbGluayBkYy5jb29yZGluYXRlR3JpZE1peGluIENvb3JkaW5hdGUgR3JpZCBDaGFydH0gYW5kIHNob3VsZAogKiBiZSB1c2VkIHdoZW4gdGhlIHggdmFsdWVzIGFyZSBhIHNlcXVlbmNlIG9mIGludGVnZXJzLgogKiBJdCBpcyBhIGZ1bmN0aW9uIHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgaW50ZWdlcnMgaW4gdGhlIHJhbmdlIHN1cHBsaWVkIGluIGl0cyBzdGFydCBhbmQgZW5kIHBhcmFtZXRlcnMuCiAqIEBtZXRob2QgaW50ZWdlcnMKICogQG1lbWJlcm9mIGRjLnVuaXRzCiAqIEBzZWUge0BsaW5rIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4jeFVuaXRzIGNvb3JkaW5hdGVHcmlkTWl4aW4ueFVuaXRzfQogKiBAZXhhbXBsZQogKiBjaGFydC54VW5pdHMoZGMudW5pdHMuaW50ZWdlcnMpIC8vIGFscmVhZHkgdGhlIGRlZmF1bHQKICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0CiAqIEBwYXJhbSB7TnVtYmVyfSBlbmQKICogQHJldHVybiB7TnVtYmVyfQogKi8KZGMudW5pdHMuaW50ZWdlcnMgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkgewogICAgcmV0dXJuIE1hdGguYWJzKGVuZCAtIHN0YXJ0KTsKfTsKCi8qKgogKiBUaGlzIGFyZ3VtZW50IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHtAbGluayBkYy5jb29yZGluYXRlR3JpZE1peGluI3hVbml0cyAueFVuaXRzfSBmdW5jdGlvbiBvZiB0aGUgdG8KICogc3BlY2lmeSBvcmRpbmFsIHVuaXRzIGZvciB0aGUgeCBheGlzLiBVc3VhbGx5IHRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBwYXNzaW5nCiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWJvc3RvY2svZDMvd2lraS9PcmRpbmFsLVNjYWxlcyBkMy5zY2FsZS5vcmRpbmFsfSB0bwogKiB7QGxpbmsgZGMuY29vcmRpbmF0ZUdyaWRNaXhpbiN4IC54fS4KICogSXQganVzdCByZXR1cm5zIHRoZSBkb21haW4gcGFzc2VkIHRvIGl0LCB3aGljaCBmb3Igb3JkaW5hbCBjaGFydHMgaXMgYW4gYXJyYXkgb2YgYWxsIHZhbHVlcy4KICogQG1ldGhvZCBvcmRpbmFsCiAqIEBtZW1iZXJvZiBkYy51bml0cwogKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWJvc3RvY2svZDMvd2lraS9PcmRpbmFsLVNjYWxlcyBkMy5zY2FsZS5vcmRpbmFsfQogKiBAc2VlIHtAbGluayBkYy5jb29yZGluYXRlR3JpZE1peGluI3hVbml0cyBjb29yZGluYXRlR3JpZE1peGluLnhVbml0c30KICogQHNlZSB7QGxpbmsgZGMuY29vcmRpbmF0ZUdyaWRNaXhpbiN4IGNvb3JkaW5hdGVHcmlkTWl4aW4ueH0KICogQGV4YW1wbGUKICogY2hhcnQueFVuaXRzKGRjLnVuaXRzLm9yZGluYWwpCiAqICAgICAgLngoZDMuc2NhbGUub3JkaW5hbCgpKQogKiBAcGFyYW0geyp9IHN0YXJ0CiAqIEBwYXJhbSB7Kn0gZW5kCiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gZG9tYWluCiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59CiAqLwpkYy51bml0cy5vcmRpbmFsID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQsIGRvbWFpbikgewogICAgcmV0dXJuIGRvbWFpbjsKfTsKCi8qKgogKiBAbmFtZXNwYWNlIGZwCiAqIEBtZW1iZXJvZiBkYy51bml0cwogKiBAdHlwZSB7e319CiAqLwpkYy51bml0cy5mcCA9IHt9OwovKioKICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gYXJndW1lbnQgZm9yIHRoZSB7QGxpbmsgZGMuY29vcmRpbmF0ZUdyaWRNaXhpbiBDb29yZGluYXRlIEdyaWQgQ2hhcnR9CiAqIHtAbGluayBkYy5jb29yZGluYXRlR3JpZE1peGluI3hVbml0cyAueFVuaXRzfSBmdW5jdGlvbiBzcGVjaWZ5aW5nIHRoYXQgdGhlIHggdmFsdWVzIGFyZSBmbG9hdGluZy1wb2ludAogKiBudW1iZXJzIHdpdGggdGhlIGdpdmVuIHByZWNpc2lvbi4KICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIGRldGVybWluZXMgaG93IG1hbnkgdmFsdWVzIGF0IHRoZSBnaXZlbiBwcmVjaXNpb24gd2lsbCBmaXQgaW50byB0aGUgcmFuZ2UKICogc3VwcGxpZWQgaW4gaXRzIHN0YXJ0IGFuZCBlbmQgcGFyYW1ldGVycy4KICogQG1ldGhvZCBwcmVjaXNpb24KICogQG1lbWJlcm9mIGRjLnVuaXRzLmZwCiAqIEBzZWUge0BsaW5rIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4jeFVuaXRzIGNvb3JkaW5hdGVHcmlkTWl4aW4ueFVuaXRzfQogKiBAZXhhbXBsZQogKiAvLyBzcGVjaWZ5IHZhbHVlcyAoYW5kIHRpY2tzKSBldmVyeSAwLjEgdW5pdHMKICogY2hhcnQueFVuaXRzKGRjLnVuaXRzLmZwLnByZWNpc2lvbigwLjEpCiAqIC8vIHRoZXJlIGFyZSA1MDAgdW5pdHMgYmV0d2VlbiAwLjUgYW5kIDEgaWYgdGhlIHByZWNpc2lvbiBpcyAwLjAwMQogKiB2YXIgdGhvdXNhbmR0aHMgPSBkYy51bml0cy5mcC5wcmVjaXNpb24oMC4wMDEpOwogKiB0aG91c2FuZHRocygwLjUsIDEuMCkgLy8gcmV0dXJucyA1MDAKICogQHBhcmFtIHtOdW1iZXJ9IHByZWNpc2lvbgogKiBAcmV0dXJuIHtGdW5jdGlvbn0gc3RhcnQtZW5kIHVuaXQgZnVuY3Rpb24KICovCmRjLnVuaXRzLmZwLnByZWNpc2lvbiA9IGZ1bmN0aW9uIChwcmVjaXNpb24pIHsKICAgIHZhciBfZiA9IGZ1bmN0aW9uIChzLCBlKSB7CiAgICAgICAgdmFyIGQgPSBNYXRoLmFicygoZSAtIHMpIC8gX2YucmVzb2x1dGlvbik7CiAgICAgICAgaWYgKGRjLnV0aWxzLmlzTmVnbGlnaWJsZShkIC0gTWF0aC5mbG9vcihkKSkpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChkKTsKICAgICAgICB9CiAgICB9OwogICAgX2YucmVzb2x1dGlvbiA9IHByZWNpc2lvbjsKICAgIHJldHVybiBfZjsKfTsKCmRjLnJvdW5kID0ge307CmRjLnJvdW5kLmZsb29yID0gZnVuY3Rpb24gKG4pIHsKICAgIHJldHVybiBNYXRoLmZsb29yKG4pOwp9OwpkYy5yb3VuZC5jZWlsID0gZnVuY3Rpb24gKG4pIHsKICAgIHJldHVybiBNYXRoLmNlaWwobik7Cn07CmRjLnJvdW5kLnJvdW5kID0gZnVuY3Rpb24gKG4pIHsKICAgIHJldHVybiBNYXRoLnJvdW5kKG4pOwp9OwoKZGMub3ZlcnJpZGUgPSBmdW5jdGlvbiAob2JqLCBmdW5jdGlvbk5hbWUsIG5ld0Z1bmN0aW9uKSB7CiAgICB2YXIgZXhpc3RpbmdGdW5jdGlvbiA9IG9ialtmdW5jdGlvbk5hbWVdOwogICAgb2JqWydfJyArIGZ1bmN0aW9uTmFtZV0gPSBleGlzdGluZ0Z1bmN0aW9uOwogICAgb2JqW2Z1bmN0aW9uTmFtZV0gPSBuZXdGdW5jdGlvbjsKfTsKCmRjLnJlbmRlcmxldCA9IGZ1bmN0aW9uIChfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gZGMuX3JlbmRlcmxldDsKICAgIH0KICAgIGRjLl9yZW5kZXJsZXQgPSBfOwogICAgcmV0dXJuIGRjOwp9OwoKZGMuaW5zdGFuY2VPZkNoYXJ0ID0gZnVuY3Rpb24gKG8pIHsKICAgIHJldHVybiBvIGluc3RhbmNlb2YgT2JqZWN0ICYmIG8uX19kY0ZsYWdfXyAmJiB0cnVlOwp9OwoKZGMuZXJyb3JzID0ge307CgpkYy5lcnJvcnMuRXhjZXB0aW9uID0gZnVuY3Rpb24gKG1zZykgewogICAgdmFyIF9tc2cgPSBtc2cgfHwgJ1VuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3InOwoKICAgIHRoaXMubWVzc2FnZSA9IF9tc2c7CgogICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX21zZzsKICAgIH07CiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjazsKfTsKZGMuZXJyb3JzLkV4Y2VwdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CmRjLmVycm9ycy5FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gZGMuZXJyb3JzLkV4Y2VwdGlvbjsKCmRjLmVycm9ycy5JbnZhbGlkU3RhdGVFeGNlcHRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICBkYy5lcnJvcnMuRXhjZXB0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07CgpkYy5lcnJvcnMuSW52YWxpZFN0YXRlRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZGMuZXJyb3JzLkV4Y2VwdGlvbi5wcm90b3R5cGUpOwpkYy5lcnJvcnMuSW52YWxpZFN0YXRlRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGRjLmVycm9ycy5JbnZhbGlkU3RhdGVFeGNlcHRpb247CgpkYy5lcnJvcnMuQmFkQXJndW1lbnRFeGNlcHRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICBkYy5lcnJvcnMuRXhjZXB0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07CgpkYy5lcnJvcnMuQmFkQXJndW1lbnRFeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShkYy5lcnJvcnMuRXhjZXB0aW9uLnByb3RvdHlwZSk7CmRjLmVycm9ycy5CYWRBcmd1bWVudEV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBkYy5lcnJvcnMuQmFkQXJndW1lbnRFeGNlcHRpb247CgovKioKICogVGhlIGRlZmF1bHQgZGF0ZSBmb3JtYXQgZm9yIGRjLmpzCiAqIEBuYW1lIGRhdGVGb3JtYXQKICogQG1lbWJlcm9mIGRjCiAqIEB0eXBlIHtGdW5jdGlvbn0KICogQGRlZmF1bHQgZDMudGltZS5mb3JtYXQoJyVtLyVkLyVZJykKICovCmRjLmRhdGVGb3JtYXQgPSBkMy50aW1lLmZvcm1hdCgnJW0vJWQvJVknKTsKCi8qKgogKiBAbmFtZXNwYWNlIHByaW50ZXJzCiAqIEBtZW1iZXJvZiBkYwogKiBAdHlwZSB7e319CiAqLwpkYy5wcmludGVycyA9IHt9OwoKLyoqCiAqIENvbnZlcnRzIGEgbGlzdCBvZiBmaWx0ZXJzIGludG8gYSByZWFkYWJsZSBzdHJpbmcKICogQG1ldGhvZCBmaWx0ZXJzCiAqIEBtZW1iZXJvZiBkYy5wcmludGVycwogKiBAcGFyYW0ge0FycmF5PGRjLmZpbHRlcnN8YW55Pn0gZmlsdGVycwogKiBAcmV0dXJucyB7U3RyaW5nfQogKi8KZGMucHJpbnRlcnMuZmlsdGVycyA9IGZ1bmN0aW9uIChmaWx0ZXJzKSB7CiAgICB2YXIgcyA9ICcnOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgICBzICs9ICcsICc7CiAgICAgICAgfQogICAgICAgIHMgKz0gZGMucHJpbnRlcnMuZmlsdGVyKGZpbHRlcnNbaV0pOwogICAgfQoKICAgIHJldHVybiBzOwp9OwoKLyoqCiAqIENvbnZlcnRzIGEgZmlsdGVyIGludG8gYSByZWFkYWJsZSBzdHJpbmcKICogQG1ldGhvZCBmaWx0ZXIKICogQG1lbWJlcm9mIGRjLnByaW50ZXJzCiAqIEBwYXJhbSB7ZGMuZmlsdGVyc3xhbnl8QXJyYXk8YW55Pn0gZmlsdGVyCiAqIEByZXR1cm5zIHtTdHJpbmd9CiAqLwpkYy5wcmludGVycy5maWx0ZXIgPSBmdW5jdGlvbiAoZmlsdGVyKSB7CiAgICB2YXIgcyA9ICcnOwoKICAgIGlmICh0eXBlb2YgZmlsdGVyICE9PSAndW5kZWZpbmVkJyAmJiBmaWx0ZXIgIT09IG51bGwpIHsKICAgICAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgaWYgKGZpbHRlci5sZW5ndGggPj0gMikgewogICAgICAgICAgICAgICAgcyA9ICdbJyArIGRjLnV0aWxzLnByaW50U2luZ2xlVmFsdWUoZmlsdGVyWzBdKSArICcgLT4gJyArIGRjLnV0aWxzLnByaW50U2luZ2xlVmFsdWUoZmlsdGVyWzFdKSArICddJzsKICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIubGVuZ3RoID49IDEpIHsKICAgICAgICAgICAgICAgIHMgPSBkYy51dGlscy5wcmludFNpbmdsZVZhbHVlKGZpbHRlclswXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzID0gZGMudXRpbHMucHJpbnRTaW5nbGVWYWx1ZShmaWx0ZXIpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gczsKfTsKCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBnaXZlbiBhIHN0cmluZyBwcm9wZXJ0eSBuYW1lLCBjYW4gYmUgdXNlZCB0byBwbHVjayB0aGUgcHJvcGVydHkgb2ZmIGFuIG9iamVjdC4gIEEgZnVuY3Rpb24KICogY2FuIGJlIHBhc3NlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGFsc28gYWx0ZXIgdGhlIGRhdGEgYmVpbmcgcmV0dXJuZWQuICBUaGlzIGNhbiBiZSBhIHVzZWZ1bCBzaG9ydGhhbmQgbWV0aG9kIHRvIGNyZWF0ZQogKiBhY2Nlc3NvciBmdW5jdGlvbnMuCiAqIEBtZXRob2QgcGx1Y2sKICogQG1lbWJlcm9mIGRjCiAqIEBleGFtcGxlCiAqIHZhciB4UGx1Y2sgPSBkYy5wbHVjaygneCcpOwogKiB2YXIgb2JqQSA9IHt4OiAxfTsKICogeFBsdWNrKG9iakEpIC8vIDEKICogQGV4YW1wbGUKICogdmFyIHhQb3NpdGlvbiA9IGRjLnBsdWNrKCd4JywgZnVuY3Rpb24gKHgsIGkpIHsKICogICAgIC8vIGB0aGlzYCBpcyB0aGUgb3JpZ2luYWwgZGF0dW0sCiAqICAgICAvLyBgeGAgaXMgdGhlIHggcHJvcGVydHkgb2YgdGhlIGRhdHVtLAogKiAgICAgLy8gYGlgIGlzIHRoZSBwb3NpdGlvbiBpbiB0aGUgYXJyYXkKICogICAgIHJldHVybiB0aGlzLnJhZGl1cyArIHg7CiAqIH0pOwogKiBkYy5zZWxlY3RBbGwoJy5jaXJjbGUnKS5kYXRhKC4uLikueCh4UG9zaXRpb24pOwogKiBAcGFyYW0ge1N0cmluZ30gbgogKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZl0KICogQHJldHVybnMge0Z1bmN0aW9ufQogKi8KZGMucGx1Y2sgPSBmdW5jdGlvbiAobiwgZikgewogICAgaWYgKCFmKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkW25dOyB9OwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBmLmNhbGwoZCwgZFtuXSwgaSk7IH07Cn07CgovKioKICogQG5hbWVzcGFjZSB1dGlscwogKiBAbWVtYmVyb2YgZGMKICogQHR5cGUge3t9fQogKi8KZGMudXRpbHMgPSB7fTsKCi8qKgogKiBQcmludCBhIHNpbmdsZSB2YWx1ZSBmaWx0ZXIKICogQG1ldGhvZCBwcmludFNpbmdsZVZhbHVlCiAqIEBtZW1iZXJvZiBkYy51dGlscwogKiBAcGFyYW0ge2FueX0gZmlsdGVyCiAqIEByZXR1cm5zIHtTdHJpbmd9CiAqLwpkYy51dGlscy5wcmludFNpbmdsZVZhbHVlID0gZnVuY3Rpb24gKGZpbHRlcikgewogICAgdmFyIHMgPSAnJyArIGZpbHRlcjsKCiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgIHMgPSBkYy5kYXRlRm9ybWF0KGZpbHRlcik7CiAgICB9IGVsc2UgaWYgKHR5cGVvZihmaWx0ZXIpID09PSAnc3RyaW5nJykgewogICAgICAgIHMgPSBmaWx0ZXI7CiAgICB9IGVsc2UgaWYgKGRjLnV0aWxzLmlzRmxvYXQoZmlsdGVyKSkgewogICAgICAgIHMgPSBkYy51dGlscy5wcmludFNpbmdsZVZhbHVlLmZmb3JtYXQoZmlsdGVyKTsKICAgIH0gZWxzZSBpZiAoZGMudXRpbHMuaXNJbnRlZ2VyKGZpbHRlcikpIHsKICAgICAgICBzID0gTWF0aC5yb3VuZChmaWx0ZXIpOwogICAgfQoKICAgIHJldHVybiBzOwp9OwpkYy51dGlscy5wcmludFNpbmdsZVZhbHVlLmZmb3JtYXQgPSBkMy5mb3JtYXQoJy4yZicpOwoKLyoqCiAqIEFyYml0cmFyeSBhZGQgb25lIHZhbHVlIHRvIGFub3RoZXIuCiAqIEBtZXRob2QgYWRkCiAqIEBtZW1iZXJvZiBkYy51dGlscwogKiBAdG9kbwogKiBUaGVzZSBhc3N1bWUgdGhhbiBhbnkgc3RyaW5nIHIgaXMgYSBwZXJjZW50YWdlICh3aGV0aGVyIG9yIG5vdCBpdCBpbmNsdWRlcyAlKS4KICogVGhleSBhbHNvIGdlbmVyYXRlIHN0cmFuZ2UgcmVzdWx0cyBpZiBsIGlzIGEgc3RyaW5nLgogKiBAcGFyYW0ge1N0cmluZ3xEYXRlfE51bWJlcn0gbAogKiBAcGFyYW0ge051bWJlcn0gcgogKiBAcmV0dXJucyB7U3RyaW5nfERhdGV8TnVtYmVyfQogKi8KZGMudXRpbHMuYWRkID0gZnVuY3Rpb24gKGwsIHIpIHsKICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycpIHsKICAgICAgICByID0gci5yZXBsYWNlKCclJywgJycpOwogICAgfQoKICAgIGlmIChsIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgciA9ICtyOwogICAgICAgIH0KICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKCk7CiAgICAgICAgZC5zZXRUaW1lKGwuZ2V0VGltZSgpKTsKICAgICAgICBkLnNldERhdGUobC5nZXREYXRlKCkgKyByKTsKICAgICAgICByZXR1cm4gZDsKICAgIH0gZWxzZSBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgdmFyIHBlcmNlbnRhZ2UgPSAoK3IgLyAxMDApOwogICAgICAgIHJldHVybiBsID4gMCA/IGwgKiAoMSArIHBlcmNlbnRhZ2UpIDogbCAqICgxIC0gcGVyY2VudGFnZSk7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBsICsgcjsKICAgIH0KfTsKCi8qKgogKiBBcmJpdHJhcnkgc3VidHJhY3Qgb25lIHZhbHVlIGZyb20gYW5vdGhlci4KICogQG1ldGhvZCBzdWJ0cmFjdAogKiBAbWVtYmVyb2YgZGMudXRpbHMKICogQHRvZG8KICogVGhlc2UgYXNzdW1lIHRoYW4gYW55IHN0cmluZyByIGlzIGEgcGVyY2VudGFnZSAod2hldGhlciBvciBub3QgaXQgaW5jbHVkZXMgJSkuCiAqIFRoZXkgYWxzbyBnZW5lcmF0ZSBzdHJhbmdlIHJlc3VsdHMgaWYgbCBpcyBhIHN0cmluZy4KICogQHBhcmFtIHtTdHJpbmd8RGF0ZXxOdW1iZXJ9IGwKICogQHBhcmFtIHtOdW1iZXJ9IHIKICogQHJldHVybnMge1N0cmluZ3xEYXRlfE51bWJlcn0KICovCmRjLnV0aWxzLnN1YnRyYWN0ID0gZnVuY3Rpb24gKGwsIHIpIHsKICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycpIHsKICAgICAgICByID0gci5yZXBsYWNlKCclJywgJycpOwogICAgfQoKICAgIGlmIChsIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgciA9ICtyOwogICAgICAgIH0KICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKCk7CiAgICAgICAgZC5zZXRUaW1lKGwuZ2V0VGltZSgpKTsKICAgICAgICBkLnNldERhdGUobC5nZXREYXRlKCkgLSByKTsKICAgICAgICByZXR1cm4gZDsKICAgIH0gZWxzZSBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgdmFyIHBlcmNlbnRhZ2UgPSAoK3IgLyAxMDApOwogICAgICAgIHJldHVybiBsIDwgMCA/IGwgKiAoMSArIHBlcmNlbnRhZ2UpIDogbCAqICgxIC0gcGVyY2VudGFnZSk7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBsIC0gcjsKICAgIH0KfTsKCi8qKgogKiBJcyB0aGUgdmFsdWUgYSBudW1iZXI/CiAqIEBtZXRob2QgaXNOdW1iZXIKICogQG1lbWJlcm9mIGRjLnV0aWxzCiAqIEBwYXJhbSB7YW55fSBuCiAqIEByZXR1cm5zIHtCb29sZWFufQogKi8KZGMudXRpbHMuaXNOdW1iZXIgPSBmdW5jdGlvbiAobikgewogICAgcmV0dXJuIG4gPT09ICtuOwp9OwoKLyoqCiAqIElzIHRoZSB2YWx1ZSBhIGZsb2F0PwogKiBAbWV0aG9kIGlzRmxvYXQKICogQG1lbWJlcm9mIGRjLnV0aWxzCiAqIEBwYXJhbSB7YW55fSBuCiAqIEByZXR1cm5zIHtCb29sZWFufQogKi8KZGMudXRpbHMuaXNGbG9hdCA9IGZ1bmN0aW9uIChuKSB7CiAgICByZXR1cm4gbiA9PT0gK24gJiYgbiAhPT0gKG4gfCAwKTsKfTsKCi8qKgogKiBJcyB0aGUgdmFsdWUgYW4gaW50ZWdlcj8KICogQG1ldGhvZCBpc0ludGVnZXIKICogQG1lbWJlcm9mIGRjLnV0aWxzCiAqIEBwYXJhbSB7YW55fSBuCiAqIEByZXR1cm5zIHtCb29sZWFufQogKi8KZGMudXRpbHMuaXNJbnRlZ2VyID0gZnVuY3Rpb24gKG4pIHsKICAgIHJldHVybiBuID09PSArbiAmJiBuID09PSAobiB8IDApOwp9OwoKLyoqCiAqIElzIHRoZSB2YWx1ZSB2ZXJ5IGNsb3NlIHRvIHplcm8/CiAqIEBtZXRob2QgaXNOZWdsaWdpYmxlCiAqIEBtZW1iZXJvZiBkYy51dGlscwogKiBAcGFyYW0ge2FueX0gbgogKiBAcmV0dXJucyB7Qm9vbGVhbn0KICovCmRjLnV0aWxzLmlzTmVnbGlnaWJsZSA9IGZ1bmN0aW9uIChuKSB7CiAgICByZXR1cm4gIWRjLnV0aWxzLmlzTnVtYmVyKG4pIHx8IChuIDwgZGMuY29uc3RhbnRzLk5FR0xJR0lCTEVfTlVNQkVSICYmIG4gPiAtZGMuY29uc3RhbnRzLk5FR0xJR0lCTEVfTlVNQkVSKTsKfTsKCi8qKgogKiBFbnN1cmUgdGhlIHZhbHVlIGlzIG5vIGdyZWF0ZXIgb3IgbGVzcyB0aGFuIHRoZSBtaW4vbWF4IHZhbHVlcy4gIElmIGl0IGlzIHJldHVybiB0aGUgYm91bmRhcnkgdmFsdWUuCiAqIEBtZXRob2QgY2xhbXAKICogQG1lbWJlcm9mIGRjLnV0aWxzCiAqIEBwYXJhbSB7YW55fSB2YWwKICogQHBhcmFtIHthbnl9IG1pbgogKiBAcGFyYW0ge2FueX0gbWF4CiAqIEByZXR1cm5zIHthbnl9CiAqLwpkYy51dGlscy5jbGFtcCA9IGZ1bmN0aW9uICh2YWwsIG1pbiwgbWF4KSB7CiAgICByZXR1cm4gdmFsIDwgbWluID8gbWluIDogKHZhbCA+IG1heCA/IG1heCA6IHZhbCk7Cn07CgovKioKICogVXNpbmcgYSBzaW1wbGUgc3RhdGljIGNvdW50ZXIsIHByb3ZpZGUgYSB1bmlxdWUgaW50ZWdlciBpZC4KICogQG1ldGhvZCB1bmlxdWVJZAogKiBAbWVtYmVyb2YgZGMudXRpbHMKICogQHJldHVybnMge051bWJlcn0KICovCnZhciBfaWRDb3VudGVyID0gMDsKZGMudXRpbHMudW5pcXVlSWQgPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gKytfaWRDb3VudGVyOwp9OwoKLyoqCiAqIENvbnZlcnQgYSBuYW1lIHRvIGFuIElELgogKiBAbWV0aG9kIG5hbWVUb0lkCiAqIEBtZW1iZXJvZiBkYy51dGlscwogKiBAcGFyYW0ge1N0cmluZ30gbmFtZQogKiBAcmV0dXJucyB7U3RyaW5nfQogKi8KZGMudXRpbHMubmFtZVRvSWQgPSBmdW5jdGlvbiAobmFtZSkgewogICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXHNdL2csICdfJykucmVwbGFjZSgvW1wuJ10vZywgJycpOwp9OwoKLyoqCiAqIEFwcGVuZCBvciBzZWxlY3QgYW4gaXRlbSBvbiBhIHBhcmVudCBlbGVtZW50CiAqIEBtZXRob2QgYXBwZW5kT3JTZWxlY3QKICogQG1lbWJlcm9mIGRjLnV0aWxzCiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBwYXJlbnQKICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yCiAqIEBwYXJhbSB7U3RyaW5nfSB0YWcKICogQHJldHVybnMge2QzLnNlbGVjdGlvbn0KICovCmRjLnV0aWxzLmFwcGVuZE9yU2VsZWN0ID0gZnVuY3Rpb24gKHBhcmVudCwgc2VsZWN0b3IsIHRhZykgewogICAgdGFnID0gdGFnIHx8IHNlbGVjdG9yOwogICAgdmFyIGVsZW1lbnQgPSBwYXJlbnQuc2VsZWN0KHNlbGVjdG9yKTsKICAgIGlmIChlbGVtZW50LmVtcHR5KCkpIHsKICAgICAgICBlbGVtZW50ID0gcGFyZW50LmFwcGVuZCh0YWcpOwogICAgfQogICAgcmV0dXJuIGVsZW1lbnQ7Cn07CgovKioKICogUmV0dXJuIHRoZSBudW1iZXIgaWYgdGhlIHZhbHVlIGlzIGEgbnVtYmVyOyBlbHNlIDAuCiAqIEBtZXRob2Qgc2FmZU51bWJlcgogKiBAbWVtYmVyb2YgZGMudXRpbHMKICogQHBhcmFtIHtOdW1iZXJ8YW55fSBuCiAqIEByZXR1cm5zIHtOdW1iZXJ9CiAqLwpkYy51dGlscy5zYWZlTnVtYmVyID0gZnVuY3Rpb24gKG4pIHsgcmV0dXJuIGRjLnV0aWxzLmlzTnVtYmVyKCtuKSA/ICtuIDogMDt9OwoKZGMubG9nZ2VyID0ge307CgpkYy5sb2dnZXIuZW5hYmxlRGVidWdMb2cgPSBmYWxzZTsKCmRjLmxvZ2dlci53YXJuID0gZnVuY3Rpb24gKG1zZykgewogICAgaWYgKGNvbnNvbGUpIHsKICAgICAgICBpZiAoY29uc29sZS53YXJuKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2Fybihtc2cpOwogICAgICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHsKICAgICAgICAgICAgY29uc29sZS5sb2cobXNnKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGRjLmxvZ2dlcjsKfTsKCmRjLmxvZ2dlci5kZWJ1ZyA9IGZ1bmN0aW9uIChtc2cpIHsKICAgIGlmIChkYy5sb2dnZXIuZW5hYmxlRGVidWdMb2cgJiYgY29uc29sZSkgewogICAgICAgIGlmIChjb25zb2xlLmRlYnVnKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcobXNnKTsKICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBkYy5sb2dnZXI7Cn07CgpkYy5sb2dnZXIuZGVwcmVjYXRlID0gZnVuY3Rpb24gKGZuLCBtc2cpIHsKICAgIC8vIEFsbG93IGxvZ2dpbmcgb2YgZGVwcmVjYXRpb24KICAgIHZhciB3YXJuZWQgPSBmYWxzZTsKICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZWQgKCkgewogICAgICAgIGlmICghd2FybmVkKSB7CiAgICAgICAgICAgIGRjLmxvZ2dlci53YXJuKG1zZyk7CiAgICAgICAgICAgIHdhcm5lZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfQogICAgcmV0dXJuIGRlcHJlY2F0ZWQ7Cn07CgpkYy5ldmVudHMgPSB7CiAgICBjdXJyZW50OiBudWxsCn07CgovKioKICogVGhpcyBmdW5jdGlvbiB0cmlnZ2VycyBhIHRocm90dGxlZCBldmVudCBmdW5jdGlvbiB3aXRoIGEgc3BlY2lmaWVkIGRlbGF5IChpbiBtaWxsaS1zZWNvbmRzKS4gIEV2ZW50cwogKiB0aGF0IGFyZSB0cmlnZ2VyZWQgcmVwZXRpdGl2ZWx5IGR1ZSB0byB1c2VyIGludGVyYWN0aW9uIHN1Y2ggYnJ1c2ggZHJhZ2dpbmcgbWlnaHQgZmxvb2QgdGhlIGxpYnJhcnkKICogYW5kIGludm9rZSBtb3JlIHJlbmRlcnMgdGhhbiBjYW4gYmUgZXhlY3V0ZWQgaW4gdGltZS4gVXNpbmcgdGhpcyBmdW5jdGlvbiB0byB3cmFwIHlvdXIgZXZlbnQKICogZnVuY3Rpb24gYWxsb3dzIHRoZSBsaWJyYXJ5IHRvIHNtb290aCBvdXQgdGhlIHJlbmRlcmluZyBieSB0aHJvdHRsaW5nIGV2ZW50cyBhbmQgb25seSByZXNwb25kaW5nIHRvCiAqIHRoZSBtb3N0IHJlY2VudCBldmVudC4KICogQG5hbWUgZXZlbnRzLnRyaWdnZXIKICogQG1lbWJlcm9mIGRjCiAqIEBleGFtcGxlCiAqIGNoYXJ0Lm9uKCdyZW5kZXJsZXQnLCBmdW5jdGlvbihjaGFydCkgewogKiAgICAgLy8gc21vb3RoIHRoZSByZW5kZXJpbmcgdGhyb3VnaCBldmVudCB0aHJvdHRsaW5nCiAqICAgICBkYy5ldmVudHMudHJpZ2dlcihmdW5jdGlvbigpewogKiAgICAgICAgIC8vIGZvY3VzIHNvbWUgb3RoZXIgY2hhcnQgdG8gdGhlIHJhbmdlIHNlbGVjdGVkIGJ5IHVzZXIgb24gdGhpcyBjaGFydAogKiAgICAgICAgIHNvbWVPdGhlckNoYXJ0LmZvY3VzKGNoYXJ0LmZpbHRlcigpKTsKICogICAgIH0pOwogKiB9KQogKiBAcGFyYW0ge0Z1bmN0aW9ufSBjbG9zdXJlCiAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsYXldCiAqLwpkYy5ldmVudHMudHJpZ2dlciA9IGZ1bmN0aW9uIChjbG9zdXJlLCBkZWxheSkgewogICAgaWYgKCFkZWxheSkgewogICAgICAgIGNsb3N1cmUoKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZGMuZXZlbnRzLmN1cnJlbnQgPSBjbG9zdXJlOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChjbG9zdXJlID09PSBkYy5ldmVudHMuY3VycmVudCkgewogICAgICAgICAgICBjbG9zdXJlKCk7CiAgICAgICAgfQogICAgfSwgZGVsYXkpOwp9OwoKLyoqCiAqIFRoZSBkYy5qcyBmaWx0ZXJzIGFyZSBmdW5jdGlvbnMgd2hpY2ggYXJlIHBhc3NlZCBpbnRvIGNyb3NzZmlsdGVyIHRvIGNob3NlIHdoaWNoIHJlY29yZHMgd2lsbCBiZQogKiBhY2N1bXVsYXRlZCB0byBwcm9kdWNlIHZhbHVlcyBmb3IgdGhlIGNoYXJ0cy4gIEluIHRoZSBjcm9zc2ZpbHRlciBtb2RlbCwgYW55IGZpbHRlcnMgYXBwbGllZCBvbiBvbmUKICogZGltZW5zaW9uIHdpbGwgYWZmZWN0IGFsbCB0aGUgb3RoZXIgZGltZW5zaW9ucyBidXQgbm90IHRoYXQgb25lLiAgZGMgYWx3YXlzIGFwcGxpZXMgYSBmaWx0ZXIKICogZnVuY3Rpb24gdG8gdGhlIGRpbWVuc2lvbjsgdGhlIGZ1bmN0aW9uIGNvbWJpbmVzIG11bHRpcGxlIGZpbHRlcnMgYW5kIGlmIGFueSBvZiB0aGVtIGFjY2VwdCBhCiAqIHJlY29yZCwgaXQgaXMgZmlsdGVyZWQgaW4uCiAqCiAqIFRoZXNlIGZpbHRlciBjb25zdHJ1Y3RvcnMgYXJlIHVzZWQgYXMgYXBwcm9wcmlhdGUgYnkgdGhlIHZhcmlvdXMgY2hhcnRzIHRvIGltcGxlbWVudCBicnVzaGluZy4gIFdlCiAqIG1lbnRpb24gYmVsb3cgd2hpY2ggY2hhcnQgdXNlcyB3aGljaCBmaWx0ZXIuICBJbiBzb21lIGNhc2VzLCBtYW55IGluc3RhbmNlcyBvZiBhIGZpbHRlciB3aWxsIGJlIGFkZGVkLgogKgogKiBFYWNoIG9mIHRoZSBkYy5qcyBmaWx0ZXJzIGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICogKiBgaXNGaWx0ZXJlZGAgLSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgaXMgd2l0aGluIHRoZSBmaWx0ZXIKICogKiBgZmlsdGVyVHlwZWAgLSBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgZmlsdGVyLCBoZXJlIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3RvcgogKgogKiBDdXJyZW50bHkgdGhlc2UgZmlsdGVyIG9iamVjdHMgYXJlIGFsc28gYXJyYXlzLCBidXQgdGhpcyBpcyBub3QgYSByZXF1aXJlbWVudC4gQ3VzdG9tIGZpbHRlcnMKICogY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyB0aGV5IGhhdmUgdGhlIHByb3BlcnRpZXMgYWJvdmUuCiAqIEBuYW1lc3BhY2UgZmlsdGVycwogKiBAbWVtYmVyb2YgZGMKICogQHR5cGUge3t9fQogKi8KZGMuZmlsdGVycyA9IHt9OwoKLyoqCiAqIFJhbmdlZEZpbHRlciBpcyBhIGZpbHRlciB3aGljaCBhY2NlcHRzIGtleXMgYmV0d2VlbiBgbG93YCBhbmQgYGhpZ2hgLiAgSXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgWAogKiBheGlzIGJydXNoaW5nIGZvciB0aGUge0BsaW5rIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4gY29vcmRpbmF0ZSBncmlkIGNoYXJ0c30uCiAqCiAqIEl0cyBgZmlsdGVyVHlwZWAgaXMgJ1JhbmdlZEZpbHRlcicKICogQG5hbWUgUmFuZ2VkRmlsdGVyCiAqIEBtZW1iZXJvZiBkYy5maWx0ZXJzCiAqIEBwYXJhbSB7TnVtYmVyfSBsb3cKICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2gKICogQHJldHVybiB7QXJyYXk8TnVtYmVyPn0KICogQGNvbnN0cnVjdG9yCiAqLwpkYy5maWx0ZXJzLlJhbmdlZEZpbHRlciA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHsKICAgIHZhciByYW5nZSA9IG5ldyBBcnJheShsb3csIGhpZ2gpOwogICAgcmFuZ2UuaXNGaWx0ZXJlZCA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZSA+PSB0aGlzWzBdICYmIHZhbHVlIDwgdGhpc1sxXTsKICAgIH07CiAgICByYW5nZS5maWx0ZXJUeXBlID0gJ1JhbmdlZEZpbHRlcic7CgogICAgcmV0dXJuIHJhbmdlOwp9OwoKLyoqCiAqIFR3b0RpbWVuc2lvbmFsRmlsdGVyIGlzIGEgZmlsdGVyIHdoaWNoIGFjY2VwdHMgYSBzaW5nbGUgdHdvLWRpbWVuc2lvbmFsIHZhbHVlLiAgSXQgaXMgdXNlZCBieSB0aGUKICoge0BsaW5rIGRjLmhlYXRNYXAgaGVhdCBtYXAgY2hhcnR9IHRvIGluY2x1ZGUgcGFydGljdWxhciBjZWxscyBhcyB0aGV5IGFyZSBjbGlja2VkLiAgKFJvd3MgYW5kIGNvbHVtbnMgYXJlCiAqIGZpbHRlcmVkIGJ5IGZpbHRlcmluZyBhbGwgdGhlIGNlbGxzIGluIHRoZSByb3cgb3IgY29sdW1uLikKICoKICogSXRzIGBmaWx0ZXJUeXBlYCBpcyAnVHdvRGltZW5zaW9uYWxGaWx0ZXInCiAqIEBuYW1lIFR3b0RpbWVuc2lvbmFsRmlsdGVyCiAqIEBtZW1iZXJvZiBkYy5maWx0ZXJzCiAqIEBwYXJhbSB7QXJyYXk8TnVtYmVyPn0gZmlsdGVyCiAqIEByZXR1cm4ge0FycmF5PE51bWJlcj59CiAqIEBjb25zdHJ1Y3RvcgogKi8KZGMuZmlsdGVycy5Ud29EaW1lbnNpb25hbEZpbHRlciA9IGZ1bmN0aW9uIChmaWx0ZXIpIHsKICAgIGlmIChmaWx0ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH0KCiAgICB2YXIgZiA9IGZpbHRlcjsKICAgIGYuaXNGaWx0ZXJlZCA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggJiYgdmFsdWUubGVuZ3RoID09PSBmLmxlbmd0aCAmJgogICAgICAgICAgICAgICB2YWx1ZVswXSA9PT0gZlswXSAmJiB2YWx1ZVsxXSA9PT0gZlsxXTsKICAgIH07CiAgICBmLmZpbHRlclR5cGUgPSAnVHdvRGltZW5zaW9uYWxGaWx0ZXInOwoKICAgIHJldHVybiBmOwp9OwoKLyoqCiAqIFRoZSBSYW5nZWRUd29EaW1lbnNpb25hbEZpbHRlciBhbGxvd3MgZmlsdGVyaW5nIGFsbCB2YWx1ZXMgd2hpY2ggZml0IHdpdGhpbiBhIHJlY3Rhbmd1bGFyCiAqIHJlZ2lvbi4gSXQgaXMgdXNlZCBieSB0aGUge0BsaW5rIGRjLnNjYXR0ZXJQbG90IHNjYXR0ZXIgcGxvdH0gdG8gaW1wbGVtZW50IHJlY3Rhbmd1bGFyIGJydXNoaW5nLgogKgogKiBJdCB0YWtlcyB0d28gdHdvLWRpbWVuc2lvbmFsIHBvaW50cyBpbiB0aGUgZm9ybSBgW1t4MSx5MV0sW3gyLHkyXV1gLCBhbmQgbm9ybWFsaXplcyB0aGVtIHNvIHRoYXQKICogYHgxIDw9IHgyYCBhbmQgYHkxIDw9IHkyYC4gSXQgdGhlbiByZXR1cm5zIGEgZmlsdGVyIHdoaWNoIGFjY2VwdHMgYW55IHBvaW50cyB3aGljaCBhcmUgaW4gdGhlCiAqIHJlY3Rhbmd1bGFyIHJhbmdlIGluY2x1ZGluZyB0aGUgbG93ZXIgdmFsdWVzIGJ1dCBleGNsdWRpbmcgdGhlIGhpZ2hlciB2YWx1ZXMuCiAqCiAqIElmIGFuIGFycmF5IG9mIHR3byB2YWx1ZXMgYXJlIGdpdmVuIHRvIHRoZSBSYW5nZWRUd29EaW1lbnNpb25hbEZpbHRlciwgaXQgaW50ZXJwcmV0cyB0aGUgdmFsdWVzIGFzCiAqIHR3byB4IGNvb3JkaW5hdGVzIGB4MWAgYW5kIGB4MmAgYW5kIHJldHVybnMgYSBmaWx0ZXIgd2hpY2ggYWNjZXB0cyBhbnkgcG9pbnRzIGZvciB3aGljaCBgeDEgPD0geCA8CiAqIHgyYC4KICoKICogSXRzIGBmaWx0ZXJUeXBlYCBpcyAnUmFuZ2VkVHdvRGltZW5zaW9uYWxGaWx0ZXInCiAqIEBuYW1lIFJhbmdlZFR3b0RpbWVuc2lvbmFsRmlsdGVyCiAqIEBtZW1iZXJvZiBkYy5maWx0ZXJzCiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8TnVtYmVyPj59IGZpbHRlcgogKiBAcmV0dXJuIHtBcnJheTxBcnJheTxOdW1iZXI+Pn0KICogQGNvbnN0cnVjdG9yCiAqLwpkYy5maWx0ZXJzLlJhbmdlZFR3b0RpbWVuc2lvbmFsRmlsdGVyID0gZnVuY3Rpb24gKGZpbHRlcikgewogICAgaWYgKGZpbHRlciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfQoKICAgIHZhciBmID0gZmlsdGVyOwogICAgdmFyIGZyb21Cb3R0b21MZWZ0OwoKICAgIGlmIChmWzBdIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICBmcm9tQm90dG9tTGVmdCA9IFsKICAgICAgICAgICAgW01hdGgubWluKGZpbHRlclswXVswXSwgZmlsdGVyWzFdWzBdKSwgTWF0aC5taW4oZmlsdGVyWzBdWzFdLCBmaWx0ZXJbMV1bMV0pXSwKICAgICAgICAgICAgW01hdGgubWF4KGZpbHRlclswXVswXSwgZmlsdGVyWzFdWzBdKSwgTWF0aC5tYXgoZmlsdGVyWzBdWzFdLCBmaWx0ZXJbMV1bMV0pXQogICAgICAgIF07CiAgICB9IGVsc2UgewogICAgICAgIGZyb21Cb3R0b21MZWZ0ID0gW1tmaWx0ZXJbMF0sIC1JbmZpbml0eV0sIFtmaWx0ZXJbMV0sIEluZmluaXR5XV07CiAgICB9CgogICAgZi5pc0ZpbHRlcmVkID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgdmFyIHgsIHk7CgogICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB4ID0gdmFsdWVbMF07CiAgICAgICAgICAgIHkgPSB2YWx1ZVsxXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB4ID0gdmFsdWU7CiAgICAgICAgICAgIHkgPSBmcm9tQm90dG9tTGVmdFswXVsxXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB4ID49IGZyb21Cb3R0b21MZWZ0WzBdWzBdICYmIHggPCBmcm9tQm90dG9tTGVmdFsxXVswXSAmJgogICAgICAgICAgICAgICB5ID49IGZyb21Cb3R0b21MZWZ0WzBdWzFdICYmIHkgPCBmcm9tQm90dG9tTGVmdFsxXVsxXTsKICAgIH07CiAgICBmLmZpbHRlclR5cGUgPSAnUmFuZ2VkVHdvRGltZW5zaW9uYWxGaWx0ZXInOwoKICAgIHJldHVybiBmOwp9OwoKLyoqCiAqIGBkYy5iYXNlTWl4aW5gIGlzIGFuIGFic3RyYWN0IGZ1bmN0aW9uYWwgb2JqZWN0IHJlcHJlc2VudGluZyBhIGJhc2ljIGBkY2AgY2hhcnQgb2JqZWN0CiAqIGZvciBhbGwgY2hhcnQgYW5kIHdpZGdldCBpbXBsZW1lbnRhdGlvbnMuIE1ldGhvZHMgZnJvbSB0aGUge0BsaW5rICNkYy5iYXNlTWl4aW4gZGMuYmFzZU1peGlufSBhcmUgaW5oZXJpdGVkCiAqIGFuZCBhdmFpbGFibGUgb24gYWxsIGNoYXJ0IGltcGxlbWVudGF0aW9ucyBpbiB0aGUgYGRjYCBsaWJyYXJ5LgogKiBAbmFtZSBiYXNlTWl4aW4KICogQG1lbWJlcm9mIGRjCiAqIEBtaXhpbgogKiBAcGFyYW0ge09iamVjdH0gX2NoYXJ0CiAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICovCmRjLmJhc2VNaXhpbiA9IGZ1bmN0aW9uIChfY2hhcnQpIHsKICAgIF9jaGFydC5fX2RjRmxhZ19fID0gZGMudXRpbHMudW5pcXVlSWQoKTsKCiAgICB2YXIgX2RpbWVuc2lvbjsKICAgIHZhciBfZ3JvdXA7CgogICAgdmFyIF9hbmNob3I7CiAgICB2YXIgX3Jvb3Q7CiAgICB2YXIgX3N2ZzsKICAgIHZhciBfaXNDaGlsZDsKCiAgICB2YXIgX21pbldpZHRoID0gMjAwOwogICAgdmFyIF9kZWZhdWx0V2lkdGhDYWxjID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKICAgICAgICB2YXIgd2lkdGggPSBlbGVtZW50ICYmIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7CiAgICAgICAgcmV0dXJuICh3aWR0aCAmJiB3aWR0aCA+IF9taW5XaWR0aCkgPyB3aWR0aCA6IF9taW5XaWR0aDsKICAgIH07CiAgICB2YXIgX3dpZHRoQ2FsYyA9IF9kZWZhdWx0V2lkdGhDYWxjOwoKICAgIHZhciBfbWluSGVpZ2h0ID0gMjAwOwogICAgdmFyIF9kZWZhdWx0SGVpZ2h0Q2FsYyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgICAgdmFyIGhlaWdodCA9IGVsZW1lbnQgJiYgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgJiYgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7CiAgICAgICAgcmV0dXJuIChoZWlnaHQgJiYgaGVpZ2h0ID4gX21pbkhlaWdodCkgPyBoZWlnaHQgOiBfbWluSGVpZ2h0OwogICAgfTsKICAgIHZhciBfaGVpZ2h0Q2FsYyA9IF9kZWZhdWx0SGVpZ2h0Q2FsYzsKICAgIHZhciBfd2lkdGgsIF9oZWlnaHQ7CgogICAgdmFyIF9rZXlBY2Nlc3NvciA9IGRjLnBsdWNrKCdrZXknKTsKICAgIHZhciBfdmFsdWVBY2Nlc3NvciA9IGRjLnBsdWNrKCd2YWx1ZScpOwogICAgdmFyIF9sYWJlbCA9IGRjLnBsdWNrKCdrZXknKTsKCiAgICB2YXIgX29yZGVyaW5nID0gZGMucGx1Y2soJ2tleScpOwogICAgdmFyIF9vcmRlclNvcnQ7CgogICAgdmFyIF9yZW5kZXJMYWJlbCA9IGZhbHNlOwoKICAgIHZhciBfdGl0bGUgPSBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBfY2hhcnQua2V5QWNjZXNzb3IoKShkKSArICc6ICcgKyBfY2hhcnQudmFsdWVBY2Nlc3NvcigpKGQpOwogICAgfTsKICAgIHZhciBfcmVuZGVyVGl0bGUgPSB0cnVlOwogICAgdmFyIF9jb250cm9sc1VzZVZpc2liaWxpdHkgPSBmYWxzZTsKCiAgICB2YXIgX3RyYW5zaXRpb25EdXJhdGlvbiA9IDc1MDsKCiAgICB2YXIgX2ZpbHRlclByaW50ZXIgPSBkYy5wcmludGVycy5maWx0ZXJzOwoKICAgIHZhciBfbWFuZGF0b3J5QXR0cmlidXRlcyA9IFsnZGltZW5zaW9uJywgJ2dyb3VwJ107CgogICAgdmFyIF9jaGFydEdyb3VwID0gZGMuY29uc3RhbnRzLkRFRkFVTFRfQ0hBUlRfR1JPVVA7CgogICAgdmFyIF9saXN0ZW5lcnMgPSBkMy5kaXNwYXRjaCgKICAgICAgICAncHJlUmVuZGVyJywKICAgICAgICAncG9zdFJlbmRlcicsCiAgICAgICAgJ3ByZVJlZHJhdycsCiAgICAgICAgJ3Bvc3RSZWRyYXcnLAogICAgICAgICdmaWx0ZXJlZCcsCiAgICAgICAgJ3pvb21lZCcsCiAgICAgICAgJ3JlbmRlcmxldCcsCiAgICAgICAgJ3ByZXRyYW5zaXRpb24nKTsKCiAgICB2YXIgX2xlZ2VuZDsKICAgIHZhciBfY29tbWl0SGFuZGxlcjsKCiAgICB2YXIgX2ZpbHRlcnMgPSBbXTsKICAgIHZhciBfZmlsdGVySGFuZGxlciA9IGZ1bmN0aW9uIChkaW1lbnNpb24sIGZpbHRlcnMpIHsKICAgICAgICBpZiAoZmlsdGVycy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgZGltZW5zaW9uLmZpbHRlcihudWxsKTsKICAgICAgICB9IGVsc2UgaWYgKGZpbHRlcnMubGVuZ3RoID09PSAxICYmICFmaWx0ZXJzWzBdLmlzRmlsdGVyZWQpIHsKICAgICAgICAgICAgLy8gc2luZ2xlIHZhbHVlIGFuZCBub3QgYSBmdW5jdGlvbi1iYXNlZCBmaWx0ZXIKICAgICAgICAgICAgZGltZW5zaW9uLmZpbHRlckV4YWN0KGZpbHRlcnNbMF0pOwogICAgICAgIH0gZWxzZSBpZiAoZmlsdGVycy5sZW5ndGggPT09IDEgJiYgZmlsdGVyc1swXS5maWx0ZXJUeXBlID09PSAnUmFuZ2VkRmlsdGVyJykgewogICAgICAgICAgICAvLyBzaW5nbGUgcmFuZ2UtYmFzZWQgZmlsdGVyCiAgICAgICAgICAgIGRpbWVuc2lvbi5maWx0ZXJSYW5nZShmaWx0ZXJzWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkaW1lbnNpb24uZmlsdGVyRnVuY3Rpb24oZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSBmaWx0ZXJzW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIuaXNGaWx0ZXJlZCAmJiBmaWx0ZXIuaXNGaWx0ZXJlZChkKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlciA8PSBkICYmIGZpbHRlciA+PSBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmaWx0ZXJzOwogICAgfTsKCiAgICB2YXIgX2RhdGEgPSBmdW5jdGlvbiAoZ3JvdXApIHsKICAgICAgICByZXR1cm4gZ3JvdXAuYWxsKCk7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IG9yIGdldCB0aGUgaGVpZ2h0IGF0dHJpYnV0ZSBvZiBhIGNoYXJ0LiBUaGUgaGVpZ2h0IGlzIGFwcGxpZWQgdG8gdGhlIFNWR0VsZW1lbnQgZ2VuZXJhdGVkIGJ5CiAgICAgKiB0aGUgY2hhcnQgd2hlbiByZW5kZXJlZCAob3IgcmUtcmVuZGVyZWQpLiBJZiBhIHZhbHVlIGlzIGdpdmVuLCB0aGVuIGl0IHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUKICAgICAqIHRoZSBuZXcgaGVpZ2h0IGFuZCB0aGUgY2hhcnQgcmV0dXJuZWQgZm9yIG1ldGhvZCBjaGFpbmluZy4gIFRoZSB2YWx1ZSBjYW4gZWl0aGVyIGJlIGEgbnVtZXJpYywgYQogICAgICogZnVuY3Rpb24sIG9yIGZhbHN5LiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgaGVpZ2h0IGF0dHJpYnV0ZSB3aWxsCiAgICAgKiBiZSByZXR1cm5lZC4KICAgICAqCiAgICAgKiBCeSBkZWZhdWx0LCB3aXRob3V0IGFuIGV4cGxpY2l0IGhlaWdodCBiZWluZyBnaXZlbiwgdGhlIGNoYXJ0IHdpbGwgc2VsZWN0IHRoZSB3aWR0aCBvZiBpdHMKICAgICAqIGFuY2hvciBlbGVtZW50LiBJZiB0aGF0IGlzbid0IHBvc3NpYmxlIGl0IGRlZmF1bHRzIHRvIDIwMCAocHJvdmlkZWQgYnkgdGhlCiAgICAgKiB7QGxpbmsgZGMuYmFzZU1peGluI21pbkhlaWdodCBtaW5IZWlnaHR9IHByb3BlcnR5KS4gU2V0dGluZyB0aGUgdmFsdWUgZmFsc3kgd2lsbCByZXR1cm4KICAgICAqIHRoZSBjaGFydCB0byB0aGUgZGVmYXVsdCBiZWhhdmlvci4KICAgICAqIEBtZXRob2QgaGVpZ2h0CiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBzZWUge0BsaW5rIGRjLmJhc2VNaXhpbiNtaW5IZWlnaHQgbWluSGVpZ2h0fQogICAgICogQGV4YW1wbGUKICAgICAqIC8vIERlZmF1bHQgaGVpZ2h0CiAgICAgKiBjaGFydC5oZWlnaHQoZnVuY3Rpb24gKGVsZW1lbnQpIHsKICAgICAqICAgICB2YXIgaGVpZ2h0ID0gZWxlbWVudCAmJiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDsKICAgICAqICAgICByZXR1cm4gKGhlaWdodCAmJiBoZWlnaHQgPiBjaGFydC5taW5IZWlnaHQoKSkgPyBoZWlnaHQgOiBjaGFydC5taW5IZWlnaHQoKTsKICAgICAqIH0pOwogICAgICoKICAgICAqIGNoYXJ0LmhlaWdodCgyNTApOyAvLyBTZXQgdGhlIGNoYXJ0J3MgaGVpZ2h0IHRvIDI1MHB4OwogICAgICogY2hhcnQuaGVpZ2h0KGZ1bmN0aW9uKGFuY2hvcikgeyByZXR1cm4gZG9Tb21ldGhpbmdXaXRoKGFuY2hvcik7IH0pOyAvLyBzZXQgdGhlIGNoYXJ0J3MgaGVpZ2h0IHdpdGggYSBmdW5jdGlvbgogICAgICogY2hhcnQuaGVpZ2h0KG51bGwpOyAvLyByZXNldCB0aGUgaGVpZ2h0IHRvIHRoZSBkZWZhdWx0IGF1dG8gY2FsY3VsYXRpb24KICAgICAqIEBwYXJhbSB7TnVtYmVyfEZ1bmN0aW9ufSBbaGVpZ2h0XQogICAgICogQHJldHVybiB7TnVtYmVyfQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQuaGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICBpZiAoIWRjLnV0aWxzLmlzTnVtYmVyKF9oZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAvLyBvbmx5IGNhbGN1bGF0ZSBvbmNlCiAgICAgICAgICAgICAgICBfaGVpZ2h0ID0gX2hlaWdodENhbGMoX3Jvb3Qubm9kZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gX2hlaWdodDsKICAgICAgICB9CiAgICAgICAgX2hlaWdodENhbGMgPSBkMy5mdW5jdG9yKGhlaWdodCB8fCBfZGVmYXVsdEhlaWdodENhbGMpOwogICAgICAgIF9oZWlnaHQgPSB1bmRlZmluZWQ7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBTZXQgb3IgZ2V0IHRoZSB3aWR0aCBhdHRyaWJ1dGUgb2YgYSBjaGFydC4KICAgICAqIEBtZXRob2Qgd2lkdGgKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHNlZSB7QGxpbmsgZGMuYmFzZU1peGluI2hlaWdodCBoZWlnaHR9CiAgICAgKiBAc2VlIHtAbGluayBkYy5iYXNlTWl4aW4jbWluV2lkdGggbWluV2lkdGh9CiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gRGVmYXVsdCB3aWR0aAogICAgICogY2hhcnQud2lkdGgoZnVuY3Rpb24gKGVsZW1lbnQpIHsKICAgICAqICAgICB2YXIgd2lkdGggPSBlbGVtZW50ICYmIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7CiAgICAgKiAgICAgcmV0dXJuICh3aWR0aCAmJiB3aWR0aCA+IGNoYXJ0Lm1pbldpZHRoKCkpID8gd2lkdGggOiBjaGFydC5taW5XaWR0aCgpOwogICAgICogfSk7CiAgICAgKiBAcGFyYW0ge051bWJlcnxGdW5jdGlvbn0gW3dpZHRoXQogICAgICogQHJldHVybiB7TnVtYmVyfQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQud2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgaWYgKCFkYy51dGlscy5pc051bWJlcihfd2lkdGgpKSB7CiAgICAgICAgICAgICAgICAvLyBvbmx5IGNhbGN1bGF0ZSBvbmNlCiAgICAgICAgICAgICAgICBfd2lkdGggPSBfd2lkdGhDYWxjKF9yb290Lm5vZGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF93aWR0aDsKICAgICAgICB9CiAgICAgICAgX3dpZHRoQ2FsYyA9IGQzLmZ1bmN0b3Iod2lkdGggfHwgX2RlZmF1bHRXaWR0aENhbGMpOwogICAgICAgIF93aWR0aCA9IHVuZGVmaW5lZDsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCBvciBnZXQgdGhlIG1pbmltdW0gd2lkdGggYXR0cmlidXRlIG9mIGEgY2hhcnQuIFRoaXMgb25seSBoYXMgZWZmZWN0IHdoZW4gdXNlZCB3aXRoIHRoZSBkZWZhdWx0CiAgICAgKiB7QGxpbmsgZGMuYmFzZU1peGluI3dpZHRoIHdpZHRofSBmdW5jdGlvbi4KICAgICAqIEBtZXRob2QgbWluV2lkdGgKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHNlZSB7QGxpbmsgZGMuYmFzZU1peGluI3dpZHRoIHdpZHRofQogICAgICogQHBhcmFtIHtOdW1iZXJ9IFttaW5XaWR0aD0yMDBdCiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9CiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5taW5XaWR0aCA9IGZ1bmN0aW9uIChtaW5XaWR0aCkgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX21pbldpZHRoOwogICAgICAgIH0KICAgICAgICBfbWluV2lkdGggPSBtaW5XaWR0aDsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCBvciBnZXQgdGhlIG1pbmltdW0gaGVpZ2h0IGF0dHJpYnV0ZSBvZiBhIGNoYXJ0LiBUaGlzIG9ubHkgaGFzIGVmZmVjdCB3aGVuIHVzZWQgd2l0aCB0aGUgZGVmYXVsdAogICAgICoge0BsaW5rIGRjLmJhc2VNaXhpbiNoZWlnaHQgaGVpZ2h0fSBmdW5jdGlvbi4KICAgICAqIEBtZXRob2QgbWluSGVpZ2h0CiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBzZWUge0BsaW5rIGRjLmJhc2VNaXhpbiNoZWlnaHQgaGVpZ2h0fQogICAgICogQHBhcmFtIHtOdW1iZXJ9IFttaW5IZWlnaHQ9MjAwXQogICAgICogQHJldHVybiB7TnVtYmVyfQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQubWluSGVpZ2h0ID0gZnVuY3Rpb24gKG1pbkhlaWdodCkgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX21pbkhlaWdodDsKICAgICAgICB9CiAgICAgICAgX21pbkhlaWdodCA9IG1pbkhlaWdodDsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqICoqbWFuZGF0b3J5KioKICAgICAqCiAgICAgKiBTZXQgb3IgZ2V0IHRoZSBkaW1lbnNpb24gYXR0cmlidXRlIG9mIGEgY2hhcnQuIEluIGBkY2AsIGEgZGltZW5zaW9uIGNhbiBiZSBhbnkgdmFsaWQgW2Nyb3NzZmlsdGVyCiAgICAgKiBkaW1lbnNpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9zcXVhcmUvY3Jvc3NmaWx0ZXIvd2lraS9BUEktUmVmZXJlbmNlI3dpa2ktZGltZW5zaW9uKS4KICAgICAqCiAgICAgKiBJZiBhIHZhbHVlIGlzIGdpdmVuLCB0aGVuIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgbmV3IGRpbWVuc2lvbi4gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkIHRoZW4KICAgICAqIHRoZSBjdXJyZW50IGRpbWVuc2lvbiB3aWxsIGJlIHJldHVybmVkLgogICAgICogQG1ldGhvZCBkaW1lbnNpb24KICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3NxdWFyZS9jcm9zc2ZpbHRlci93aWtpL0FQSS1SZWZlcmVuY2UjZGltZW5zaW9uIGNyb3NzZmlsdGVyLmRpbWVuc2lvbn0KICAgICAqIEBleGFtcGxlCiAgICAgKiB2YXIgaW5kZXggPSBjcm9zc2ZpbHRlcihbXSk7CiAgICAgKiB2YXIgZGltZW5zaW9uID0gaW5kZXguZGltZW5zaW9uKGRjLnBsdWNrKCdrZXknKSk7CiAgICAgKiBjaGFydC5kaW1lbnNpb24oZGltZW5zaW9uKTsKICAgICAqIEBwYXJhbSB7Y3Jvc3NmaWx0ZXIuZGltZW5zaW9ufSBbZGltZW5zaW9uXQogICAgICogQHJldHVybiB7Y3Jvc3NmaWx0ZXIuZGltZW5zaW9ufQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQuZGltZW5zaW9uID0gZnVuY3Rpb24gKGRpbWVuc2lvbikgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX2RpbWVuc2lvbjsKICAgICAgICB9CiAgICAgICAgX2RpbWVuc2lvbiA9IGRpbWVuc2lvbjsKICAgICAgICBfY2hhcnQuZXhwaXJlQ2FjaGUoKTsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCB0aGUgZGF0YSBjYWxsYmFjayBvciByZXRyaWV2ZSB0aGUgY2hhcnQncyBkYXRhIHNldC4gVGhlIGRhdGEgY2FsbGJhY2sgaXMgcGFzc2VkIHRoZSBjaGFydCdzCiAgICAgKiBncm91cCBhbmQgYnkgZGVmYXVsdCB3aWxsIHJldHVybgogICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9zcXVhcmUvY3Jvc3NmaWx0ZXIvd2lraS9BUEktUmVmZXJlbmNlI2dyb3VwX2FsbCBncm91cC5hbGx9LgogICAgICogVGhpcyBiZWhhdmlvciBtYXkgYmUgbW9kaWZpZWQgdG8sIGZvciBpbnN0YW5jZSwgcmV0dXJuIG9ubHkgdGhlIHRvcCA1IGdyb3Vwcy4KICAgICAqIEBtZXRob2QgZGF0YQogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gRGVmYXVsdCBkYXRhIGZ1bmN0aW9uCiAgICAgKiBjaGFydC5kYXRhKGZ1bmN0aW9uIChncm91cCkgeyByZXR1cm4gZ3JvdXAuYWxsKCk7IH0pOwogICAgICoKICAgICAqIGNoYXJ0LmRhdGEoZnVuY3Rpb24gKGdyb3VwKSB7IHJldHVybiBncm91cC50b3AoNSk7IH0pOwogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXQogICAgICogQHJldHVybiB7Kn0KICAgICAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LmRhdGEgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9kYXRhLmNhbGwoX2NoYXJ0LCBfZ3JvdXApOwogICAgICAgIH0KICAgICAgICBfZGF0YSA9IGQzLmZ1bmN0b3IoY2FsbGJhY2spOwogICAgICAgIF9jaGFydC5leHBpcmVDYWNoZSgpOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogKiptYW5kYXRvcnkqKgogICAgICoKICAgICAqIFNldCBvciBnZXQgdGhlIGdyb3VwIGF0dHJpYnV0ZSBvZiBhIGNoYXJ0LiBJbiBgZGNgIGEgZ3JvdXAgaXMgYQogICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9zcXVhcmUvY3Jvc3NmaWx0ZXIvd2lraS9BUEktUmVmZXJlbmNlI2dyb3VwLW1hcC1yZWR1Y2UgY3Jvc3NmaWx0ZXIgZ3JvdXB9LgogICAgICogVXN1YWxseSB0aGUgZ3JvdXAgc2hvdWxkIGJlIGNyZWF0ZWQgZnJvbSB0aGUgcGFydGljdWxhciBkaW1lbnNpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lIGNoYXJ0LiBJZiBhIHZhbHVlIGlzCiAgICAgKiBnaXZlbiwgdGhlbiBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5ldyBncm91cC4KICAgICAqCiAgICAgKiBJZiBubyB2YWx1ZSBzcGVjaWZpZWQgdGhlbiB0aGUgY3VycmVudCBncm91cCB3aWxsIGJlIHJldHVybmVkLgogICAgICogSWYgYG5hbWVgIGlzIHNwZWNpZmllZCB0aGVuIGl0IHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBsZWdlbmQgbGFiZWwuCiAgICAgKiBAbWV0aG9kIGdyb3VwCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9zcXVhcmUvY3Jvc3NmaWx0ZXIvd2lraS9BUEktUmVmZXJlbmNlI2dyb3VwLW1hcC1yZWR1Y2UgY3Jvc3NmaWx0ZXIuZ3JvdXB9CiAgICAgKiBAZXhhbXBsZQogICAgICogdmFyIGluZGV4ID0gY3Jvc3NmaWx0ZXIoW10pOwogICAgICogdmFyIGRpbWVuc2lvbiA9IGluZGV4LmRpbWVuc2lvbihkYy5wbHVjaygna2V5JykpOwogICAgICogY2hhcnQuZGltZW5zaW9uKGRpbWVuc2lvbik7CiAgICAgKiBjaGFydC5ncm91cChkaW1lbnNpb24uZ3JvdXAoY3Jvc3NmaWx0ZXIucmVkdWNlU3VtKCkpKTsKICAgICAqIEBwYXJhbSB7Y3Jvc3NmaWx0ZXIuZ3JvdXB9IFtncm91cF0KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZV0KICAgICAqIEByZXR1cm4ge2Nyb3NzZmlsdGVyLmdyb3VwfQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQuZ3JvdXAgPSBmdW5jdGlvbiAoZ3JvdXAsIG5hbWUpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9ncm91cDsKICAgICAgICB9CiAgICAgICAgX2dyb3VwID0gZ3JvdXA7CiAgICAgICAgX2NoYXJ0Ll9ncm91cE5hbWUgPSBuYW1lOwogICAgICAgIF9jaGFydC5leHBpcmVDYWNoZSgpOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IG9yIHNldCBhbiBhY2Nlc3NvciB0byBvcmRlciBvcmRpbmFsIGRpbWVuc2lvbnMuICBUaGUgY2hhcnQgdXNlcwogICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9zcXVhcmUvY3Jvc3NmaWx0ZXIvd2lraS9BUEktUmVmZXJlbmNlI3F1aWNrc29ydF9ieSBjcm9zc2ZpbHRlci5xdWlja3NvcnQuYnl9CiAgICAgKiB0byBzb3J0IGVsZW1lbnRzOyB0aGlzIGFjY2Vzc29yIHJldHVybnMgdGhlIHZhbHVlIHRvIG9yZGVyIG9uLgogICAgICogQG1ldGhvZCBvcmRlcmluZwogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc3F1YXJlL2Nyb3NzZmlsdGVyL3dpa2kvQVBJLVJlZmVyZW5jZSNxdWlja3NvcnRfYnkgY3Jvc3NmaWx0ZXIucXVpY2tzb3J0LmJ5fQogICAgICogQGV4YW1wbGUKICAgICAqIC8vIERlZmF1bHQgb3JkZXJpbmcgYWNjZXNzb3IKICAgICAqIF9jaGFydC5vcmRlcmluZyhkYy5wbHVjaygna2V5JykpOwogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29yZGVyRnVuY3Rpb25dCiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0KICAgICAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0Lm9yZGVyaW5nID0gZnVuY3Rpb24gKG9yZGVyRnVuY3Rpb24pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9vcmRlcmluZzsKICAgICAgICB9CiAgICAgICAgX29yZGVyaW5nID0gb3JkZXJGdW5jdGlvbjsKICAgICAgICBfb3JkZXJTb3J0ID0gY3Jvc3NmaWx0ZXIucXVpY2tzb3J0LmJ5KF9vcmRlcmluZyk7CiAgICAgICAgX2NoYXJ0LmV4cGlyZUNhY2hlKCk7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgX2NoYXJ0Ll9jb21wdXRlT3JkZXJlZEdyb3VwcyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgdmFyIGRhdGFDb3B5ID0gZGF0YS5zbGljZSgwKTsKCiAgICAgICAgaWYgKGRhdGFDb3B5Lmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgIHJldHVybiBkYXRhQ29weTsKICAgICAgICB9CgogICAgICAgIGlmICghX29yZGVyU29ydCkgewogICAgICAgICAgICBfb3JkZXJTb3J0ID0gY3Jvc3NmaWx0ZXIucXVpY2tzb3J0LmJ5KF9vcmRlcmluZyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gX29yZGVyU29ydChkYXRhQ29weSwgMCwgZGF0YUNvcHkubGVuZ3RoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgZmlsdGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjaGFydAogICAgICoKICAgICAqIFRoZSBzYW1lIGNhbiBiZSBhY2hpZXZlZCBieSBjYWxsaW5nIHtAbGluayBkYy5iYXNlTWl4aW4jZmlsdGVyIGNoYXJ0LmZpbHRlcihudWxsKX0uCiAgICAgKiBAbWV0aG9kIGZpbHRlckFsbAogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5maWx0ZXJBbGwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIF9jaGFydC5maWx0ZXIobnVsbCk7CiAgICB9OwoKICAgIC8qKgogICAgICogRXhlY3V0ZSBkMyBzaW5nbGUgc2VsZWN0aW9uIGluIHRoZSBjaGFydCdzIHNjb3BlIHVzaW5nIHRoZSBnaXZlbiBzZWxlY3RvciBhbmQgcmV0dXJuIHRoZSBkMwogICAgICogc2VsZWN0aW9uLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgKipub3QgY2hhaW5hYmxlKiogc2luY2UgaXQgZG9lcyBub3QgcmV0dXJuIGEgY2hhcnQgaW5zdGFuY2U7IGhvd2V2ZXIgdGhlIGQzCiAgICAgKiBzZWxlY3Rpb24gcmVzdWx0IGNhbiBiZSBjaGFpbmVkIHRvIGQzIGZ1bmN0aW9uIGNhbGxzLgogICAgICogQG1ldGhvZCBzZWxlY3QKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvU2VsZWN0aW9ucyBkMy5zZWxlY3Rpb259CiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gU2ltaWxhciB0bzoKICAgICAqIGQzLnNlbGVjdCgnI2NoYXJ0LWlkJykuc2VsZWN0KHNlbGVjdG9yKTsKICAgICAqIEByZXR1cm4ge2QzLnNlbGVjdGlvbn0KICAgICAqLwogICAgX2NoYXJ0LnNlbGVjdCA9IGZ1bmN0aW9uIChzKSB7CiAgICAgICAgcmV0dXJuIF9yb290LnNlbGVjdChzKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBFeGVjdXRlIGluIHNjb3BlIGQzIHNlbGVjdEFsbCB1c2luZyB0aGUgZ2l2ZW4gc2VsZWN0b3IgYW5kIHJldHVybiBkMyBzZWxlY3Rpb24gcmVzdWx0LgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgKipub3QgY2hhaW5hYmxlKiogc2luY2UgaXQgZG9lcyBub3QgcmV0dXJuIGEgY2hhcnQgaW5zdGFuY2U7IGhvd2V2ZXIgdGhlIGQzCiAgICAgKiBzZWxlY3Rpb24gcmVzdWx0IGNhbiBiZSBjaGFpbmVkIHRvIGQzIGZ1bmN0aW9uIGNhbGxzLgogICAgICogQG1ldGhvZCBzZWxlY3RBbGwKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvU2VsZWN0aW9ucyBkMy5zZWxlY3Rpb259CiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gU2ltaWxhciB0bzoKICAgICAqIGQzLnNlbGVjdCgnI2NoYXJ0LWlkJykuc2VsZWN0QWxsKHNlbGVjdG9yKTsKICAgICAqIEByZXR1cm4ge2QzLnNlbGVjdGlvbn0KICAgICAqLwogICAgX2NoYXJ0LnNlbGVjdEFsbCA9IGZ1bmN0aW9uIChzKSB7CiAgICAgICAgcmV0dXJuIF9yb290ID8gX3Jvb3Quc2VsZWN0QWxsKHMpIDogbnVsbDsKICAgIH07CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHJvb3QgU1ZHRWxlbWVudCB0byBlaXRoZXIgYmUgYW4gZXhpc3RpbmcgY2hhcnQncyByb290OyBvciBhbnkgdmFsaWQgW2QzIHNpbmdsZQogICAgICogc2VsZWN0b3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYm9zdG9jay9kMy93aWtpL1NlbGVjdGlvbnMjc2VsZWN0aW5nLWVsZW1lbnRzKSBzcGVjaWZ5aW5nIGEgZG9tCiAgICAgKiBibG9jayBlbGVtZW50IHN1Y2ggYXMgYSBkaXY7IG9yIGEgZG9tIGVsZW1lbnQgb3IgZDMgc2VsZWN0aW9uLiBPcHRpb25hbGx5IHJlZ2lzdGVycyB0aGUgY2hhcnQKICAgICAqIHdpdGhpbiB0aGUgY2hhcnRHcm91cC4gVGhpcyBjbGFzcyBpcyBjYWxsZWQgaW50ZXJuYWxseSBvbiBjaGFydCBpbml0aWFsaXphdGlvbiwgYnV0IGJlIGNhbGxlZAogICAgICogYWdhaW4gdG8gcmVsb2NhdGUgdGhlIGNoYXJ0LiBIb3dldmVyLCBpdCB3aWxsIG9ycGhhbiBhbnkgcHJldmlvdXNseSBjcmVhdGVkIFNWR0VsZW1lbnRzLgogICAgICogQG1ldGhvZCBhbmNob3IKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHthbmNob3JDaGFydHxhbmNob3JTZWxlY3RvcnxhbmNob3JOb2RlfSBbcGFyZW50XQogICAgICogQHBhcmFtIHtTdHJpbmd9IFtjaGFydEdyb3VwXQogICAgICogQHJldHVybiB7U3RyaW5nfG5vZGV8ZDMuc2VsZWN0aW9ufQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQuYW5jaG9yID0gZnVuY3Rpb24gKHBhcmVudCwgY2hhcnRHcm91cCkgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX2FuY2hvcjsKICAgICAgICB9CiAgICAgICAgaWYgKGRjLmluc3RhbmNlT2ZDaGFydChwYXJlbnQpKSB7CiAgICAgICAgICAgIF9hbmNob3IgPSBwYXJlbnQuYW5jaG9yKCk7CiAgICAgICAgICAgIF9yb290ID0gcGFyZW50LnJvb3QoKTsKICAgICAgICAgICAgX2lzQ2hpbGQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAocGFyZW50KSB7CiAgICAgICAgICAgIGlmIChwYXJlbnQuc2VsZWN0ICYmIHBhcmVudC5jbGFzc2VkKSB7IC8vIGRldGVjdCBkMyBzZWxlY3Rpb24KICAgICAgICAgICAgICAgIF9hbmNob3IgPSBwYXJlbnQubm9kZSgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgX2FuY2hvciA9IHBhcmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBfcm9vdCA9IGQzLnNlbGVjdChfYW5jaG9yKTsKICAgICAgICAgICAgX3Jvb3QuY2xhc3NlZChkYy5jb25zdGFudHMuQ0hBUlRfQ0xBU1MsIHRydWUpOwogICAgICAgICAgICBkYy5yZWdpc3RlckNoYXJ0KF9jaGFydCwgY2hhcnRHcm91cCk7CiAgICAgICAgICAgIF9pc0NoaWxkID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IGRjLmVycm9ycy5CYWRBcmd1bWVudEV4Y2VwdGlvbigncGFyZW50IG11c3QgYmUgZGVmaW5lZCcpOwogICAgICAgIH0KICAgICAgICBfY2hhcnRHcm91cCA9IGNoYXJ0R3JvdXA7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBET00gaWQgZm9yIHRoZSBjaGFydCdzIGFuY2hvcmVkIGxvY2F0aW9uLgogICAgICogQG1ldGhvZCBhbmNob3JOYW1lCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEByZXR1cm4ge1N0cmluZ30KICAgICAqLwogICAgX2NoYXJ0LmFuY2hvck5hbWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGEgPSBfY2hhcnQuYW5jaG9yKCk7CiAgICAgICAgaWYgKGEgJiYgYS5pZCkgewogICAgICAgICAgICByZXR1cm4gYS5pZDsKICAgICAgICB9CiAgICAgICAgaWYgKGEgJiYgYS5yZXBsYWNlKSB7CiAgICAgICAgICAgIHJldHVybiBhLnJlcGxhY2UoJyMnLCAnJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnZGMtY2hhcnQnICsgX2NoYXJ0LmNoYXJ0SUQoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByb290IGVsZW1lbnQgd2hlcmUgYSBjaGFydCByZXNpZGVzLiBVc3VhbGx5IGl0IHdpbGwgYmUgdGhlIHBhcmVudCBkaXYgZWxlbWVudCB3aGVyZQogICAgICogdGhlIFNWR0VsZW1lbnQgd2FzIGNyZWF0ZWQuIFlvdSBjYW4gYWxzbyBwYXNzIGluIGEgbmV3IHJvb3QgZWxlbWVudCBob3dldmVyIHRoaXMgaXMgdXN1YWxseSBoYW5kbGVkIGJ5CiAgICAgKiBkYyBpbnRlcm5hbGx5LiBSZXNldHRpbmcgdGhlIHJvb3QgZWxlbWVudCBvbiBhIGNoYXJ0IG91dHNpZGUgb2YgZGMgaW50ZXJuYWxzIG1heSBoYXZlCiAgICAgKiB1bmV4cGVjdGVkIGNvbnNlcXVlbmNlcy4KICAgICAqIEBtZXRob2Qgcm9vdAogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEVsZW1lbnQgSFRNTEVsZW1lbnR9CiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbcm9vdEVsZW1lbnRdCiAgICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0KICAgICAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnJvb3QgPSBmdW5jdGlvbiAocm9vdEVsZW1lbnQpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9yb290OwogICAgICAgIH0KICAgICAgICBfcm9vdCA9IHJvb3RFbGVtZW50OwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdG9wIFNWR0VsZW1lbnQgZm9yIHRoaXMgc3BlY2lmaWMgY2hhcnQuIFlvdSBjYW4gYWxzbyBwYXNzIGluIGEgbmV3IFNWR0VsZW1lbnQsCiAgICAgKiBob3dldmVyIHRoaXMgaXMgdXN1YWxseSBoYW5kbGVkIGJ5IGRjIGludGVybmFsbHkuIFJlc2V0dGluZyB0aGUgU1ZHRWxlbWVudCBvbiBhIGNoYXJ0IG91dHNpZGUKICAgICAqIG9mIGRjIGludGVybmFscyBtYXkgaGF2ZSB1bmV4cGVjdGVkIGNvbnNlcXVlbmNlcy4KICAgICAqIEBtZXRob2Qgc3ZnCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TVkdFbGVtZW50IFNWR0VsZW1lbnR9CiAgICAgKiBAcGFyYW0ge1NWR0VsZW1lbnR8ZDMuc2VsZWN0aW9ufSBbc3ZnRWxlbWVudF0KICAgICAqIEByZXR1cm4ge1NWR0VsZW1lbnR8ZDMuc2VsZWN0aW9ufQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQuc3ZnID0gZnVuY3Rpb24gKHN2Z0VsZW1lbnQpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdmc7CiAgICAgICAgfQogICAgICAgIF9zdmcgPSBzdmdFbGVtZW50OwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogUmVtb3ZlIHRoZSBjaGFydCdzIFNWR0VsZW1lbnRzIGZyb20gdGhlIGRvbSBhbmQgcmVjcmVhdGUgdGhlIGNvbnRhaW5lciBTVkdFbGVtZW50LgogICAgICogQG1ldGhvZCByZXNldFN2ZwogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU1ZHRWxlbWVudCBTVkdFbGVtZW50fQogICAgICogQHJldHVybiB7U1ZHRWxlbWVudH0KICAgICAqLwogICAgX2NoYXJ0LnJlc2V0U3ZnID0gZnVuY3Rpb24gKCkgewogICAgICAgIF9jaGFydC5zZWxlY3QoJ3N2ZycpLnJlbW92ZSgpOwogICAgICAgIHJldHVybiBnZW5lcmF0ZVN2ZygpOwogICAgfTsKCiAgICBmdW5jdGlvbiBzaXplU3ZnICgpIHsKICAgICAgICBpZiAoX3N2ZykgewogICAgICAgICAgICBfc3ZnCiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBfY2hhcnQud2lkdGgoKSkKICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBfY2hhcnQuaGVpZ2h0KCkpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBnZW5lcmF0ZVN2ZyAoKSB7CiAgICAgICAgX3N2ZyA9IF9jaGFydC5yb290KCkuYXBwZW5kKCdzdmcnKTsKICAgICAgICBzaXplU3ZnKCk7CiAgICAgICAgcmV0dXJuIF9zdmc7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgb3IgZ2V0IHRoZSBmaWx0ZXIgcHJpbnRlciBmdW5jdGlvbi4gVGhlIGZpbHRlciBwcmludGVyIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2VuZXJhdGUgaHVtYW4KICAgICAqIGZyaWVuZGx5IHRleHQgZm9yIGZpbHRlciB2YWx1ZShzKSBhc3NvY2lhdGVkIHdpdGggdGhlIGNoYXJ0IGluc3RhbmNlLiBCeSBkZWZhdWx0IGRjIGNoYXJ0cyB1c2UgYQogICAgICogZGVmYXVsdCBmaWx0ZXIgcHJpbnRlciBgZGMucHJpbnRlcnMuZmlsdGVyYCB0aGF0IHByb3ZpZGVzIHNpbXBsZSBwcmludGluZyBzdXBwb3J0IGZvciBib3RoCiAgICAgKiBzaW5nbGUgdmFsdWUgYW5kIHJhbmdlZCBmaWx0ZXJzLgogICAgICogQG1ldGhvZCBmaWx0ZXJQcmludGVyCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmaWx0ZXJQcmludGVyRnVuY3Rpb249ZGMucHJpbnRlcnMuZmlsdGVyXQogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5maWx0ZXJQcmludGVyID0gZnVuY3Rpb24gKGZpbHRlclByaW50ZXJGdW5jdGlvbikgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX2ZpbHRlclByaW50ZXI7CiAgICAgICAgfQogICAgICAgIF9maWx0ZXJQcmludGVyID0gZmlsdGVyUHJpbnRlckZ1bmN0aW9uOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogSWYgc2V0LCB1c2UgdGhlIGB2aXNpYmlsaXR5YCBhdHRyaWJ1dGUgaW5zdGVhZCBvZiB0aGUgYGRpc3BsYXlgIGF0dHJpYnV0ZSBmb3Igc2hvd2luZy9oaWRpbmcKICAgICAqIGNoYXJ0IHJlc2V0IGFuZCBmaWx0ZXIgY29udHJvbHMsIGZvciBsZXNzIGRpc3J1cHRpb24gdG8gdGhlIGxheW91dC4KICAgICAqIEBtZXRob2QgY29udHJvbHNVc2VWaXNpYmlsaXR5CiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2NvbnRyb2xzVXNlVmlzaWJpbGl0eT1mYWxzZV0KICAgICAqIEByZXR1cm4ge0Jvb2xlYW59CiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKiovCiAgICBfY2hhcnQuY29udHJvbHNVc2VWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9jb250cm9sc1VzZVZpc2liaWxpdHk7CiAgICAgICAgfQogICAgICAgIF9jb250cm9sc1VzZVZpc2liaWxpdHkgPSBfOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogVHVybiBvbiBvcHRpb25hbCBjb250cm9sIGVsZW1lbnRzIHdpdGhpbiB0aGUgcm9vdCBlbGVtZW50LiBkYyBjdXJyZW50bHkgc3VwcG9ydHMgdGhlCiAgICAgKiBmb2xsb3dpbmcgaHRtbCBjb250cm9sIGVsZW1lbnRzLgogICAgICogKiByb290LnNlbGVjdEFsbCgnLnJlc2V0JykgLSBlbGVtZW50cyBhcmUgdHVybmVkIG9uIGlmIHRoZSBjaGFydCBoYXMgYW4gYWN0aXZlIGZpbHRlci4gVGhpcyB0eXBlCiAgICAgKiBvZiBjb250cm9sIGVsZW1lbnQgaXMgdXN1YWxseSB1c2VkIHRvIHN0b3JlIGEgcmVzZXQgbGluayB0byBhbGxvdyB1c2VyIHRvIHJlc2V0IGZpbHRlciBvbiBhCiAgICAgKiBjZXJ0YWluIGNoYXJ0LiBUaGlzIGVsZW1lbnQgd2lsbCBiZSB0dXJuZWQgb2ZmIGF1dG9tYXRpY2FsbHkgaWYgdGhlIGZpbHRlciBpcyBjbGVhcmVkLgogICAgICogKiByb290LnNlbGVjdEFsbCgnLmZpbHRlcicpIGVsZW1lbnRzIGFyZSB0dXJuZWQgb24gaWYgdGhlIGNoYXJ0IGhhcyBhbiBhY3RpdmUgZmlsdGVyLiBUaGUgdGV4dAogICAgICogY29udGVudCBvZiB0aGlzIGVsZW1lbnQgaXMgdGhlbiByZXBsYWNlZCB3aXRoIHRoZSBjdXJyZW50IGZpbHRlciB2YWx1ZSB1c2luZyB0aGUgZmlsdGVyIHByaW50ZXIKICAgICAqIGZ1bmN0aW9uLiBUaGlzIHR5cGUgb2YgZWxlbWVudCB3aWxsIGJlIHR1cm5lZCBvZmYgYXV0b21hdGljYWxseSBpZiB0aGUgZmlsdGVyIGlzIGNsZWFyZWQuCiAgICAgKiBAbWV0aG9kIHR1cm5PbkNvbnRyb2xzCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnR1cm5PbkNvbnRyb2xzID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChfcm9vdCkgewogICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gX2NoYXJ0LmNvbnRyb2xzVXNlVmlzaWJpbGl0eSgpID8gJ3Zpc2liaWxpdHknIDogJ2Rpc3BsYXknOwogICAgICAgICAgICBfY2hhcnQuc2VsZWN0QWxsKCcucmVzZXQnKS5zdHlsZShhdHRyaWJ1dGUsIG51bGwpOwogICAgICAgICAgICBfY2hhcnQuc2VsZWN0QWxsKCcuZmlsdGVyJykudGV4dChfZmlsdGVyUHJpbnRlcihfY2hhcnQuZmlsdGVycygpKSkuc3R5bGUoYXR0cmlidXRlLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBUdXJuIG9mZiBvcHRpb25hbCBjb250cm9sIGVsZW1lbnRzIHdpdGhpbiB0aGUgcm9vdCBlbGVtZW50LgogICAgICogQG1ldGhvZCB0dXJuT2ZmQ29udHJvbHMKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBzZWUge0BsaW5rIGRjLmJhc2VNaXhpbiN0dXJuT25Db250cm9scyB0dXJuT25Db250cm9sc30KICAgICAqIEBpbnN0YW5jZQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQudHVybk9mZkNvbnRyb2xzID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChfcm9vdCkgewogICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gX2NoYXJ0LmNvbnRyb2xzVXNlVmlzaWJpbGl0eSgpID8gJ3Zpc2liaWxpdHknIDogJ2Rpc3BsYXknOwogICAgICAgICAgICB2YXIgdmFsdWUgPSBfY2hhcnQuY29udHJvbHNVc2VWaXNpYmlsaXR5KCkgPyAnaGlkZGVuJyA6ICdub25lJzsKICAgICAgICAgICAgX2NoYXJ0LnNlbGVjdEFsbCgnLnJlc2V0Jykuc3R5bGUoYXR0cmlidXRlLCB2YWx1ZSk7CiAgICAgICAgICAgIF9jaGFydC5zZWxlY3RBbGwoJy5maWx0ZXInKS5zdHlsZShhdHRyaWJ1dGUsIHZhbHVlKS50ZXh0KF9jaGFydC5maWx0ZXIoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IG9yIGdldCB0aGUgYW5pbWF0aW9uIHRyYW5zaXRpb24gZHVyYXRpb24gKGluIG1pbGxpc2Vjb25kcykgZm9yIHRoaXMgY2hhcnQgaW5zdGFuY2UuCiAgICAgKiBAbWV0aG9kIHRyYW5zaXRpb25EdXJhdGlvbgogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2R1cmF0aW9uPTc1MF0KICAgICAqIEByZXR1cm4ge051bWJlcn0KICAgICAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uIChkdXJhdGlvbikgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX3RyYW5zaXRpb25EdXJhdGlvbjsKICAgICAgICB9CiAgICAgICAgX3RyYW5zaXRpb25EdXJhdGlvbiA9IGR1cmF0aW9uOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIF9jaGFydC5fbWFuZGF0b3J5QXR0cmlidXRlcyA9IGZ1bmN0aW9uIChfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfbWFuZGF0b3J5QXR0cmlidXRlczsKICAgICAgICB9CiAgICAgICAgX21hbmRhdG9yeUF0dHJpYnV0ZXMgPSBfOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNoZWNrRm9yTWFuZGF0b3J5QXR0cmlidXRlcyAoYSkgewogICAgICAgIGlmICghX2NoYXJ0W2FdIHx8ICFfY2hhcnRbYV0oKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgZGMuZXJyb3JzLkludmFsaWRTdGF0ZUV4Y2VwdGlvbignTWFuZGF0b3J5IGF0dHJpYnV0ZSBjaGFydC4nICsgYSArCiAgICAgICAgICAgICAgICAnIGlzIG1pc3Npbmcgb24gY2hhcnRbIycgKyBfY2hhcnQuYW5jaG9yTmFtZSgpICsgJ10nKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBJbnZva2luZyB0aGlzIG1ldGhvZCB3aWxsIGZvcmNlIHRoZSBjaGFydCB0byByZS1yZW5kZXIgZXZlcnl0aGluZyBmcm9tIHNjcmF0Y2guIEdlbmVyYWxseSBpdAogICAgICogc2hvdWxkIG9ubHkgYmUgdXNlZCB0byByZW5kZXIgdGhlIGNoYXJ0IGZvciB0aGUgZmlyc3QgdGltZSBvbiB0aGUgcGFnZSBvciBpZiB5b3Ugd2FudCB0byBtYWtlCiAgICAgKiBzdXJlIGV2ZXJ5dGhpbmcgaXMgcmVkcmF3biBmcm9tIHNjcmF0Y2ggaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRoZSBkZWZhdWx0IGluY3JlbWVudGFsIHJlZHJhd2luZwogICAgICogYmVoYXZpb3VyLgogICAgICogQG1ldGhvZCByZW5kZXIKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQucmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgICAgIF9oZWlnaHQgPSBfd2lkdGggPSB1bmRlZmluZWQ7IC8vIGZvcmNlIHJlY2FsY3VsYXRlCiAgICAgICAgX2xpc3RlbmVycy5wcmVSZW5kZXIoX2NoYXJ0KTsKCiAgICAgICAgaWYgKF9tYW5kYXRvcnlBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgIF9tYW5kYXRvcnlBdHRyaWJ1dGVzLmZvckVhY2goY2hlY2tGb3JNYW5kYXRvcnlBdHRyaWJ1dGVzKTsKICAgICAgICB9CgogICAgICAgIHZhciByZXN1bHQgPSBfY2hhcnQuX2RvUmVuZGVyKCk7CgogICAgICAgIGlmIChfbGVnZW5kKSB7CiAgICAgICAgICAgIF9sZWdlbmQucmVuZGVyKCk7CiAgICAgICAgfQoKICAgICAgICBfY2hhcnQuX2FjdGl2YXRlUmVuZGVybGV0cygncG9zdFJlbmRlcicpOwoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKCiAgICBfY2hhcnQuX2FjdGl2YXRlUmVuZGVybGV0cyA9IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgIF9saXN0ZW5lcnMucHJldHJhbnNpdGlvbihfY2hhcnQpOwogICAgICAgIGlmIChfY2hhcnQudHJhbnNpdGlvbkR1cmF0aW9uKCkgPiAwICYmIF9zdmcpIHsKICAgICAgICAgICAgX3N2Zy50cmFuc2l0aW9uKCkuZHVyYXRpb24oX2NoYXJ0LnRyYW5zaXRpb25EdXJhdGlvbigpKQogICAgICAgICAgICAgICAgLmVhY2goJ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBfbGlzdGVuZXJzLnJlbmRlcmxldChfY2hhcnQpOwogICAgICAgICAgICAgICAgICAgIGlmIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBfbGlzdGVuZXJzW2V2ZW50XShfY2hhcnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9saXN0ZW5lcnMucmVuZGVybGV0KF9jaGFydCk7CiAgICAgICAgICAgIGlmIChldmVudCkgewogICAgICAgICAgICAgICAgX2xpc3RlbmVyc1tldmVudF0oX2NoYXJ0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBDYWxsaW5nIHJlZHJhdyB3aWxsIGNhdXNlIHRoZSBjaGFydCB0byByZS1yZW5kZXIgZGF0YSBjaGFuZ2VzIGluY3JlbWVudGFsbHkuIElmIHRoZXJlIGlzIG5vCiAgICAgKiBjaGFuZ2UgaW4gdGhlIHVuZGVybHlpbmcgZGF0YSBkaW1lbnNpb24gdGhlbiBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyBlZmZlY3Qgb24gdGhlCiAgICAgKiBjaGFydC4gTW9zdCBjaGFydCBpbnRlcmFjdGlvbiBpbiBkYyB3aWxsIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGlzIG1ldGhvZCB0aHJvdWdoIGludGVybmFsCiAgICAgKiBldmVudHMgKGluIHBhcnRpY3VsYXIge0BsaW5rIGRjLnJlZHJhd0FsbCBkYy5yZWRyYXdBbGx9KTsgdGhlcmVmb3JlLCB5b3Ugb25seSBuZWVkIHRvCiAgICAgKiBtYW51YWxseSBpbnZva2UgdGhpcyBmdW5jdGlvbiBpZiBkYXRhIGlzIG1hbmlwdWxhdGVkIG91dHNpZGUgb2YgZGMncyBjb250cm9sIChmb3IgZXhhbXBsZSBpZgogICAgICogZGF0YSBpcyBsb2FkZWQgaW4gdGhlIGJhY2tncm91bmQgdXNpbmcKICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc3F1YXJlL2Nyb3NzZmlsdGVyL3dpa2kvQVBJLVJlZmVyZW5jZSNjcm9zc2ZpbHRlcl9hZGQgY3Jvc3NmaWx0ZXIuYWRkfS4KICAgICAqIEBtZXRob2QgcmVkcmF3CiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnJlZHJhdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBzaXplU3ZnKCk7CiAgICAgICAgX2xpc3RlbmVycy5wcmVSZWRyYXcoX2NoYXJ0KTsKCiAgICAgICAgdmFyIHJlc3VsdCA9IF9jaGFydC5fZG9SZWRyYXcoKTsKCiAgICAgICAgaWYgKF9sZWdlbmQpIHsKICAgICAgICAgICAgX2xlZ2VuZC5yZW5kZXIoKTsKICAgICAgICB9CgogICAgICAgIF9jaGFydC5fYWN0aXZhdGVSZW5kZXJsZXRzKCdwb3N0UmVkcmF3Jyk7CgogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0cy9zZXRzIHRoZSBjb21taXQgaGFuZGxlci4gSWYgdGhlIGNoYXJ0IGhhcyBhIGNvbW1pdCBoYW5kbGVyLCB0aGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCB3aGVuCiAgICAgKiB0aGUgY2hhcnQncyBmaWx0ZXJzIGhhdmUgY2hhbmdlZCwgaW4gb3JkZXIgdG8gc2VuZCB0aGUgZmlsdGVyIGRhdGEgYXN5bmNocm9ub3VzbHkgdG8gYSBzZXJ2ZXIuCiAgICAgKgogICAgICogVW5saWtlIG90aGVyIGZ1bmN0aW9ucyBpbiBkYy5qcywgdGhlIGNvbW1pdCBoYW5kbGVyIGlzIGFzeW5jaHJvbm91cy4gSXQgdGFrZXMgdHdvIGFyZ3VtZW50czoKICAgICAqIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBpcyBhIHJlbmRlciAodHJ1ZSkgb3IgYSByZWRyYXcgKGZhbHNlKSwgYW5kIGEgY2FsbGJhY2sgdG8gYmUKICAgICAqIHRyaWdnZXJlZCBvbmNlIHRoZSBjb21taXQgaXMgZmlsdGVyZWQuIFRoZSBjYWxsYmFjayBoYXMgdGhlIHN0YW5kYXJkIG5vZGUuanMgY29udGludWF0aW9uIHNpZ25hdHVyZQogICAgICogd2l0aCBlcnJvciBmaXJzdCBhbmQgcmVzdWx0IHNlY29uZC4KICAgICAqIEBtZXRob2QgY29tbWl0SGFuZGxlcgogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5jb21taXRIYW5kbGVyID0gZnVuY3Rpb24gKGNvbW1pdEhhbmRsZXIpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9jb21taXRIYW5kbGVyOwogICAgICAgIH0KICAgICAgICBfY29tbWl0SGFuZGxlciA9IGNvbW1pdEhhbmRsZXI7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZWRyYXdzIGFsbCBjaGFydHMgaW4gdGhlIHNhbWUgZ3JvdXAgYXMgdGhpcyBjaGFydCwgdHlwaWNhbGx5IGluIHJlYWN0aW9uIHRvIGEgZmlsdGVyCiAgICAgKiBjaGFuZ2UuIElmIHRoZSBjaGFydCBoYXMgYSB7QGxpbmsgZGMuYmFzZU1peGluLmNvbW1pdEZpbHRlciBjb21taXRIYW5kbGVyfSwgaXQgd2lsbAogICAgICogYmUgZXhlY3V0ZWQgYW5kIHdhaXRlZCBmb3IuCiAgICAgKiBAbWV0aG9kIHJlZHJhd0dyb3VwCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnJlZHJhd0dyb3VwID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChfY29tbWl0SGFuZGxlcikgewogICAgICAgICAgICBfY29tbWl0SGFuZGxlcihmYWxzZSwgZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHsKICAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZGMucmVkcmF3QWxsKF9jaGFydC5jaGFydEdyb3VwKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkYy5yZWRyYXdBbGwoX2NoYXJ0LmNoYXJ0R3JvdXAoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogUmVuZGVycyBhbGwgY2hhcnRzIGluIHRoZSBzYW1lIGdyb3VwIGFzIHRoaXMgY2hhcnQuIElmIHRoZSBjaGFydCBoYXMgYQogICAgICoge0BsaW5rIGRjLmJhc2VNaXhpbi5jb21taXRGaWx0ZXIgY29tbWl0SGFuZGxlcn0sIGl0IHdpbGwgYmUgZXhlY3V0ZWQgYW5kIHdhaXRlZCBmb3IKICAgICAqIEBtZXRob2QgcmVuZGVyR3JvdXAKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQucmVuZGVyR3JvdXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKF9jb21taXRIYW5kbGVyKSB7CiAgICAgICAgICAgIF9jb21taXRIYW5kbGVyKGZhbHNlLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdCkgewogICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkYy5yZW5kZXJBbGwoX2NoYXJ0LmNoYXJ0R3JvdXAoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRjLnJlbmRlckFsbChfY2hhcnQuY2hhcnRHcm91cCgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgX2NoYXJ0Ll9pbnZva2VGaWx0ZXJlZExpc3RlbmVyID0gZnVuY3Rpb24gKGYpIHsKICAgICAgICBpZiAoZiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIF9saXN0ZW5lcnMuZmlsdGVyZWQoX2NoYXJ0LCBmKTsKICAgICAgICB9CiAgICB9OwoKICAgIF9jaGFydC5faW52b2tlWm9vbWVkTGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgX2xpc3RlbmVycy56b29tZWQoX2NoYXJ0KTsKICAgIH07CgogICAgdmFyIF9oYXNGaWx0ZXJIYW5kbGVyID0gZnVuY3Rpb24gKGZpbHRlcnMsIGZpbHRlcikgewogICAgICAgIGlmIChmaWx0ZXIgPT09IG51bGwgfHwgdHlwZW9mKGZpbHRlcikgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJzLmxlbmd0aCA+IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmaWx0ZXJzLnNvbWUoZnVuY3Rpb24gKGYpIHsKICAgICAgICAgICAgcmV0dXJuIGZpbHRlciA8PSBmICYmIGZpbHRlciA+PSBmOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCBvciBnZXQgdGhlIGhhcyBmaWx0ZXIgaGFuZGxlci4gVGhlIGhhcyBmaWx0ZXIgaGFuZGxlciBpcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHRvIHNlZSBpZgogICAgICogdGhlIGNoYXJ0J3MgY3VycmVudCBmaWx0ZXJzIGluY2x1ZGUgYSBzcGVjaWZpYyBmaWx0ZXIuICBVc2luZyBhIGN1c3RvbSBoYXMgZmlsdGVyIGhhbmRsZXIgYWxsb3dzCiAgICAgKiB5b3UgdG8gY2hhbmdlIHRoZSB3YXkgZmlsdGVycyBhcmUgY2hlY2tlZCBmb3IgYW5kIHJlcGxhY2VkLgogICAgICogQG1ldGhvZCBoYXNGaWx0ZXJIYW5kbGVyCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBleGFtcGxlCiAgICAgKiAvLyBkZWZhdWx0IGhhcyBmaWx0ZXIgaGFuZGxlcgogICAgICogY2hhcnQuaGFzRmlsdGVySGFuZGxlcihmdW5jdGlvbiAoZmlsdGVycywgZmlsdGVyKSB7CiAgICAgKiAgICAgaWYgKGZpbHRlciA9PT0gbnVsbCB8fCB0eXBlb2YoZmlsdGVyKSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAqICAgICAgICAgcmV0dXJuIGZpbHRlcnMubGVuZ3RoID4gMDsKICAgICAqICAgICB9CiAgICAgKiAgICAgcmV0dXJuIGZpbHRlcnMuc29tZShmdW5jdGlvbiAoZikgewogICAgICogICAgICAgICByZXR1cm4gZmlsdGVyIDw9IGYgJiYgZmlsdGVyID49IGY7CiAgICAgKiAgICAgfSk7CiAgICAgKiB9KTsKICAgICAqCiAgICAgKiAvLyBjdXN0b20gZmlsdGVyIGhhbmRsZXIgKG5vLW9wKQogICAgICogY2hhcnQuaGFzRmlsdGVySGFuZGxlcihmdW5jdGlvbihmaWx0ZXJzLCBmaWx0ZXIpIHsKICAgICAqICAgICByZXR1cm4gZmFsc2U7CiAgICAgKiB9KTsKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtoYXNGaWx0ZXJIYW5kbGVyXQogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5oYXNGaWx0ZXJIYW5kbGVyID0gZnVuY3Rpb24gKGhhc0ZpbHRlckhhbmRsZXIpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9oYXNGaWx0ZXJIYW5kbGVyOwogICAgICAgIH0KICAgICAgICBfaGFzRmlsdGVySGFuZGxlciA9IGhhc0ZpbHRlckhhbmRsZXI7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBDaGVjayB3aGV0aGVyIGFueSBhY3RpdmUgZmlsdGVyIG9yIGEgc3BlY2lmaWMgZmlsdGVyIGlzIGFzc29jaWF0ZWQgd2l0aCBwYXJ0aWN1bGFyIGNoYXJ0IGluc3RhbmNlLgogICAgICogVGhpcyBmdW5jdGlvbiBpcyAqKm5vdCBjaGFpbmFibGUqKi4KICAgICAqIEBtZXRob2QgaGFzRmlsdGVyCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBzZWUge0BsaW5rIGRjLmJhc2VNaXhpbiNoYXNGaWx0ZXJIYW5kbGVyIGhhc0ZpbHRlckhhbmRsZXJ9CiAgICAgKiBAcGFyYW0geyp9IFtmaWx0ZXJdCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufQogICAgICovCiAgICBfY2hhcnQuaGFzRmlsdGVyID0gZnVuY3Rpb24gKGZpbHRlcikgewogICAgICAgIHJldHVybiBfaGFzRmlsdGVySGFuZGxlcihfZmlsdGVycywgZmlsdGVyKTsKICAgIH07CgogICAgdmFyIF9yZW1vdmVGaWx0ZXJIYW5kbGVyID0gZnVuY3Rpb24gKGZpbHRlcnMsIGZpbHRlcikgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoZmlsdGVyc1tpXSA8PSBmaWx0ZXIgJiYgZmlsdGVyc1tpXSA+PSBmaWx0ZXIpIHsKICAgICAgICAgICAgICAgIGZpbHRlcnMuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpbHRlcnM7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IG9yIGdldCB0aGUgcmVtb3ZlIGZpbHRlciBoYW5kbGVyLiBUaGUgcmVtb3ZlIGZpbHRlciBoYW5kbGVyIGlzIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIGEKICAgICAqIGZpbHRlciBmcm9tIHRoZSBjaGFydCdzIGN1cnJlbnQgZmlsdGVycy4gVXNpbmcgYSBjdXN0b20gcmVtb3ZlIGZpbHRlciBoYW5kbGVyIGFsbG93cyB5b3UgdG8KICAgICAqIGNoYW5nZSBob3cgZmlsdGVycyBhcmUgcmVtb3ZlZCBvciBwZXJmb3JtIGFkZGl0aW9uYWwgd29yayB3aGVuIHJlbW92aW5nIGEgZmlsdGVyLCBlLmcuIHdoZW4KICAgICAqIHVzaW5nIGEgZmlsdGVyIHNlcnZlciBvdGhlciB0aGFuIGNyb3NzZmlsdGVyLgogICAgICoKICAgICAqIEFueSBjaGFuZ2VzIHNob3VsZCBtb2RpZnkgdGhlIGBmaWx0ZXJzYCBhcnJheSBhcmd1bWVudCBhbmQgcmV0dXJuIHRoYXQgYXJyYXkuCiAgICAgKiBAbWV0aG9kIHJlbW92ZUZpbHRlckhhbmRsZXIKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQGV4YW1wbGUKICAgICAqIC8vIGRlZmF1bHQgcmVtb3ZlIGZpbHRlciBoYW5kbGVyCiAgICAgKiBjaGFydC5yZW1vdmVGaWx0ZXJIYW5kbGVyKGZ1bmN0aW9uIChmaWx0ZXJzLCBmaWx0ZXIpIHsKICAgICAqICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAqICAgICAgICAgaWYgKGZpbHRlcnNbaV0gPD0gZmlsdGVyICYmIGZpbHRlcnNbaV0gPj0gZmlsdGVyKSB7CiAgICAgKiAgICAgICAgICAgICBmaWx0ZXJzLnNwbGljZShpLCAxKTsKICAgICAqICAgICAgICAgICAgIGJyZWFrOwogICAgICogICAgICAgICB9CiAgICAgKiAgICAgfQogICAgICogICAgIHJldHVybiBmaWx0ZXJzOwogICAgICogfSk7CiAgICAgKgogICAgICogLy8gY3VzdG9tIGZpbHRlciBoYW5kbGVyIChuby1vcCkKICAgICAqIGNoYXJ0LnJlbW92ZUZpbHRlckhhbmRsZXIoZnVuY3Rpb24oZmlsdGVycywgZmlsdGVyKSB7CiAgICAgKiAgICAgcmV0dXJuIGZpbHRlcnM7CiAgICAgKiB9KTsKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZW1vdmVGaWx0ZXJIYW5kbGVyXQogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5yZW1vdmVGaWx0ZXJIYW5kbGVyID0gZnVuY3Rpb24gKHJlbW92ZUZpbHRlckhhbmRsZXIpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9yZW1vdmVGaWx0ZXJIYW5kbGVyOwogICAgICAgIH0KICAgICAgICBfcmVtb3ZlRmlsdGVySGFuZGxlciA9IHJlbW92ZUZpbHRlckhhbmRsZXI7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgdmFyIF9hZGRGaWx0ZXJIYW5kbGVyID0gZnVuY3Rpb24gKGZpbHRlcnMsIGZpbHRlcikgewogICAgICAgIGZpbHRlcnMucHVzaChmaWx0ZXIpOwogICAgICAgIHJldHVybiBmaWx0ZXJzOwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCBvciBnZXQgdGhlIGFkZCBmaWx0ZXIgaGFuZGxlci4gVGhlIGFkZCBmaWx0ZXIgaGFuZGxlciBpcyBhIGZ1bmN0aW9uIHRoYXQgYWRkcyBhIGZpbHRlciB0bwogICAgICogdGhlIGNoYXJ0J3MgZmlsdGVyIGxpc3QuIFVzaW5nIGEgY3VzdG9tIGFkZCBmaWx0ZXIgaGFuZGxlciBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgd2F5IGZpbHRlcnMKICAgICAqIGFyZSBhZGRlZCBvciBwZXJmb3JtIGFkZGl0aW9uYWwgd29yayB3aGVuIGFkZGluZyBhIGZpbHRlciwgZS5nLiB3aGVuIHVzaW5nIGEgZmlsdGVyIHNlcnZlciBvdGhlcgogICAgICogdGhhbiBjcm9zc2ZpbHRlci4KICAgICAqCiAgICAgKiBBbnkgY2hhbmdlcyBzaG91bGQgbW9kaWZ5IHRoZSBgZmlsdGVyc2AgYXJyYXkgYXJndW1lbnQgYW5kIHJldHVybiB0aGF0IGFycmF5LgogICAgICogQG1ldGhvZCBhZGRGaWx0ZXJIYW5kbGVyCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBleGFtcGxlCiAgICAgKiAvLyBkZWZhdWx0IGFkZCBmaWx0ZXIgaGFuZGxlcgogICAgICogY2hhcnQuYWRkRmlsdGVySGFuZGxlcihmdW5jdGlvbiAoZmlsdGVycywgZmlsdGVyKSB7CiAgICAgKiAgICAgZmlsdGVycy5wdXNoKGZpbHRlcik7CiAgICAgKiAgICAgcmV0dXJuIGZpbHRlcnM7CiAgICAgKiB9KTsKICAgICAqCiAgICAgKiAvLyBjdXN0b20gZmlsdGVyIGhhbmRsZXIgKG5vLW9wKQogICAgICogY2hhcnQuYWRkRmlsdGVySGFuZGxlcihmdW5jdGlvbihmaWx0ZXJzLCBmaWx0ZXIpIHsKICAgICAqICAgICByZXR1cm4gZmlsdGVyczsKICAgICAqIH0pOwogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2FkZEZpbHRlckhhbmRsZXJdCiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0KICAgICAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LmFkZEZpbHRlckhhbmRsZXIgPSBmdW5jdGlvbiAoYWRkRmlsdGVySGFuZGxlcikgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX2FkZEZpbHRlckhhbmRsZXI7CiAgICAgICAgfQogICAgICAgIF9hZGRGaWx0ZXJIYW5kbGVyID0gYWRkRmlsdGVySGFuZGxlcjsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICB2YXIgX3Jlc2V0RmlsdGVySGFuZGxlciA9IGZ1bmN0aW9uIChmaWx0ZXJzKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCBvciBnZXQgdGhlIHJlc2V0IGZpbHRlciBoYW5kbGVyLiBUaGUgcmVzZXQgZmlsdGVyIGhhbmRsZXIgaXMgYSBmdW5jdGlvbiB0aGF0IHJlc2V0cyB0aGUKICAgICAqIGNoYXJ0J3MgZmlsdGVyIGxpc3QgYnkgcmV0dXJuaW5nIGEgbmV3IGxpc3QuIFVzaW5nIGEgY3VzdG9tIHJlc2V0IGZpbHRlciBoYW5kbGVyIGFsbG93cyB5b3UgdG8KICAgICAqIGNoYW5nZSB0aGUgd2F5IGZpbHRlcnMgYXJlIHJlc2V0LCBvciBwZXJmb3JtIGFkZGl0aW9uYWwgd29yayB3aGVuIHJlc2V0dGluZyB0aGUgZmlsdGVycywKICAgICAqIGUuZy4gd2hlbiB1c2luZyBhIGZpbHRlciBzZXJ2ZXIgb3RoZXIgdGhhbiBjcm9zc2ZpbHRlci4KICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gYXJyYXkuCiAgICAgKiBAbWV0aG9kIHJlc2V0RmlsdGVySGFuZGxlcgogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gZGVmYXVsdCByZW1vdmUgZmlsdGVyIGhhbmRsZXIKICAgICAqIGZ1bmN0aW9uIChmaWx0ZXJzKSB7CiAgICAgKiAgICAgcmV0dXJuIFtdOwogICAgICogfQogICAgICoKICAgICAqIC8vIGN1c3RvbSBmaWx0ZXIgaGFuZGxlciAobm8tb3ApCiAgICAgKiBjaGFydC5yZXNldEZpbHRlckhhbmRsZXIoZnVuY3Rpb24oZmlsdGVycykgewogICAgICogICAgIHJldHVybiBmaWx0ZXJzOwogICAgICogfSk7CiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzZXRGaWx0ZXJIYW5kbGVyXQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQucmVzZXRGaWx0ZXJIYW5kbGVyID0gZnVuY3Rpb24gKHJlc2V0RmlsdGVySGFuZGxlcikgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX3Jlc2V0RmlsdGVySGFuZGxlcjsKICAgICAgICB9CiAgICAgICAgX3Jlc2V0RmlsdGVySGFuZGxlciA9IHJlc2V0RmlsdGVySGFuZGxlcjsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICBmdW5jdGlvbiBhcHBseUZpbHRlcnMgKCkgewogICAgICAgIGlmIChfY2hhcnQuZGltZW5zaW9uKCkgJiYgX2NoYXJ0LmRpbWVuc2lvbigpLmZpbHRlcikgewogICAgICAgICAgICB2YXIgZnMgPSBfZmlsdGVySGFuZGxlcihfY2hhcnQuZGltZW5zaW9uKCksIF9maWx0ZXJzKTsKICAgICAgICAgICAgX2ZpbHRlcnMgPSBmcyA/IGZzIDogX2ZpbHRlcnM7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmVwbGFjZSB0aGUgY2hhcnQgZmlsdGVyLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgY2hhcnQuZmlsdGVyKG51bGwpLmZpbHRlcihmaWx0ZXIpYAogICAgICoKICAgICAqIEBtZXRob2QgcmVwbGFjZUZpbHRlcgogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0geyp9IFtmaWx0ZXJdCiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKiovCiAgICBfY2hhcnQucmVwbGFjZUZpbHRlciA9IGZ1bmN0aW9uIChmaWx0ZXIpIHsKICAgICAgICBfZmlsdGVycyA9IF9yZXNldEZpbHRlckhhbmRsZXIoX2ZpbHRlcnMpOwogICAgICAgIF9jaGFydC5maWx0ZXIoZmlsdGVyKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBGaWx0ZXIgdGhlIGNoYXJ0IGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXIsIG9yIHJldHVybiB0aGUgY3VycmVudCBmaWx0ZXIgaWYgbm8gaW5wdXQgcGFyYW1ldGVyCiAgICAgKiBpcyBnaXZlbi4KICAgICAqCiAgICAgKiBUaGUgZmlsdGVyIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlc2UgZm9ybXM6CiAgICAgKiAqIEEgc2luZ2xlIHZhbHVlOiB0aGUgdmFsdWUgd2lsbCBiZSB0b2dnbGVkIChhZGRlZCBpZiBpdCBpcyBub3QgcHJlc2VudCBpbiB0aGUgY3VycmVudAogICAgICogZmlsdGVycywgcmVtb3ZlZCBpZiBpdCBpcyBwcmVzZW50KQogICAgICogKiBBbiBhcnJheSBjb250YWluaW5nIGEgc2luZ2xlIGFycmF5IG9mIHZhbHVlcyAoYFtbdmFsdWUsdmFsdWUsdmFsdWVdXWApOiBlYWNoIHZhbHVlIGlzCiAgICAgKiB0b2dnbGVkCiAgICAgKiAqIFdoZW4gYXBwcm9wcmlhdGUgZm9yIHRoZSBjaGFydCwgYSB7QGxpbmsgZGMuZmlsdGVycyBkYyBmaWx0ZXIgb2JqZWN0fSBzdWNoIGFzCiAgICAgKiAgICoge0BsaW5rIGRjLmZpbHRlcnMuUmFuZ2VkRmlsdGVyIGBkYy5maWx0ZXJzLlJhbmdlZEZpbHRlcmB9IGZvciB0aGUKICAgICAqIHtAbGluayBkYy5jb29yZGluYXRlR3JpZE1peGluIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW59IGNoYXJ0cwogICAgICogICAqIHtAbGluayBkYy5maWx0ZXJzLlR3b0RpbWVuc2lvbmFsRmlsdGVyIGBkYy5maWx0ZXJzLlR3b0RpbWVuc2lvbmFsRmlsdGVyYH0gZm9yIHRoZQogICAgICoge0BsaW5rIGRjLmhlYXRNYXAgaGVhdCBtYXB9CiAgICAgKiAgICoge0BsaW5rIGRjLmZpbHRlcnMuUmFuZ2VkVHdvRGltZW5zaW9uYWxGaWx0ZXIgYGRjLmZpbHRlcnMuUmFuZ2VkVHdvRGltZW5zaW9uYWxGaWx0ZXJgfQogICAgICogZm9yIHRoZSB7QGxpbmsgZGMuc2NhdHRlclBsb3Qgc2NhdHRlciBwbG90fQogICAgICogKiBgbnVsbGA6IHRoZSBmaWx0ZXIgd2lsbCBiZSByZXNldCB1c2luZyB0aGUKICAgICAqIHtAbGluayBkYy5iYXNlTWl4aW4jcmVzZXRGaWx0ZXJIYW5kbGVyIHJlc2V0RmlsdGVySGFuZGxlcn0KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBhbHdheXMgYSB0b2dnbGUgKGV2ZW4gd2hlbiBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHRoZSBmaWx0ZXIgdHlwZSkuIElmCiAgICAgKiB5b3Ugd2lzaCB0byByZXBsYWNlIHRoZSBjdXJyZW50IGZpbHRlciwgZWl0aGVyIGNhbGwgYGNoYXJ0LmZpbHRlcihudWxsKWAgZmlyc3QsIG9yCiAgICAgKiBlcXVpdmFsZW50bHksIGNhbGwge0BsaW5rIGRjLmJhc2VNaXhpbiNyZXBsYWNlRmlsdGVyIGBjaGFydC5yZXBsYWNlRmlsdGVyKGZpbHRlcilgfSBpbnN0ZWFkLgogICAgICoKICAgICAqIEVhY2ggdG9nZ2xlIGlzIGV4ZWN1dGVkIGJ5IGNoZWNraW5nIGlmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHByZXNlbnQgdXNpbmcgdGhlCiAgICAgKiB7QGxpbmsgZGMuYmFzZU1peGluI2hhc0ZpbHRlckhhbmRsZXIgaGFzRmlsdGVySGFuZGxlcn07IGlmIGl0IGlzIG5vdCBwcmVzZW50LCBpdCBpcyBhZGRlZAogICAgICogdXNpbmcgdGhlIHtAbGluayBkYy5iYXNlTWl4aW4jYWRkRmlsdGVySGFuZGxlciBhZGRGaWx0ZXJIYW5kbGVyfTsgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LAogICAgICogaXQgaXMgcmVtb3ZlZCB1c2luZyB0aGUge0BsaW5rIGRjLmJhc2VNaXhpbiNyZW1vdmVGaWx0ZXJIYW5kbGVyIHJlbW92ZUZpbHRlckhhbmRsZXJ9LgogICAgICoKICAgICAqIE9uY2UgdGhlIGZpbHRlcnMgYXJyYXkgaGFzIGJlZW4gdXBkYXRlZCwgdGhlIGZpbHRlcnMgYXJlIGFwcGxpZWQgdG8gdGhlCiAgICAgKiBjcm9zc2ZpbHRlciBkaW1lbnNpb24sIHVzaW5nIHRoZSB7QGxpbmsgZGMuYmFzZU1peGluI2ZpbHRlckhhbmRsZXIgZmlsdGVySGFuZGxlcn0uCiAgICAgKgogICAgICogT25jZSB5b3UgaGF2ZSBzZXQgdGhlIGZpbHRlcnMsIGNhbGwge0BsaW5rIGRjLmJhc2VNaXhpbiNyZWRyYXdHcm91cCBgY2hhcnQucmVkcmF3R3JvdXAoKWB9CiAgICAgKiAob3Ige0BsaW5rIGRjLnJlZHJhd0FsbCBgZGMucmVkcmF3QWxsKClgfSkgdG8gcmVkcmF3IHRoZSBjaGFydCdzIGdyb3VwLgogICAgICogQG1ldGhvZCBmaWx0ZXIKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHNlZSB7QGxpbmsgZGMuYmFzZU1peGluI2FkZEZpbHRlckhhbmRsZXIgYWRkRmlsdGVySGFuZGxlcn0KICAgICAqIEBzZWUge0BsaW5rIGRjLmJhc2VNaXhpbiNyZW1vdmVGaWx0ZXJIYW5kbGVyIHJlbW92ZUZpbHRlckhhbmRsZXJ9CiAgICAgKiBAc2VlIHtAbGluayBkYy5iYXNlTWl4aW4jcmVzZXRGaWx0ZXJIYW5kbGVyIHJlc2V0RmlsdGVySGFuZGxlcn0KICAgICAqIEBzZWUge0BsaW5rIGRjLmJhc2VNaXhpbiNmaWx0ZXJIYW5kbGVyIGZpbHRlckhhbmRsZXJ9CiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gZmlsdGVyIGJ5IGEgc2luZ2xlIHN0cmluZwogICAgICogY2hhcnQuZmlsdGVyKCdTdW5kYXknKTsKICAgICAqIC8vIGZpbHRlciBieSBhIHNpbmdsZSBhZ2UKICAgICAqIGNoYXJ0LmZpbHRlcigxOCk7CiAgICAgKiAvLyBmaWx0ZXIgYnkgYSBzZXQgb2Ygc3RhdGVzCiAgICAgKiBjaGFydC5maWx0ZXIoW1snTUEnLCAnVFgnLCAnTkQnLCAnV0EnXV0pOwogICAgICogLy8gZmlsdGVyIGJ5IHJhbmdlIC0tIG5vdGUgdGhlIHVzZSBvZiBkYy5maWx0ZXJzLlJhbmdlZEZpbHRlciwgd2hpY2ggaXMgZGlmZmVyZW50CiAgICAgKiAvLyBmcm9tIHRoZSBzeW50YXggZm9yIGZpbHRlcmluZyBhIGNyb3NzZmlsdGVyIGRpbWVuc2lvbiBkaXJlY3RseSwgZGltZW5zaW9uLmZpbHRlcihbMTUsMjBdKQogICAgICogY2hhcnQuZmlsdGVyKGRjLmZpbHRlcnMuUmFuZ2VkRmlsdGVyKDE1LDIwKSk7CiAgICAgKiBAcGFyYW0geyp9IFtmaWx0ZXJdCiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5maWx0ZXIgPSBmdW5jdGlvbiAoZmlsdGVyKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfZmlsdGVycy5sZW5ndGggPiAwID8gX2ZpbHRlcnNbMF0gOiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgQXJyYXkgJiYgZmlsdGVyWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgIWZpbHRlci5pc0ZpbHRlcmVkKSB7CiAgICAgICAgICAgIGZpbHRlclswXS5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICBpZiAoX2NoYXJ0Lmhhc0ZpbHRlcihkKSkgewogICAgICAgICAgICAgICAgICAgIF9yZW1vdmVGaWx0ZXJIYW5kbGVyKF9maWx0ZXJzLCBkKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgX2FkZEZpbHRlckhhbmRsZXIoX2ZpbHRlcnMsIGQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKGZpbHRlciA9PT0gbnVsbCkgewogICAgICAgICAgICBfZmlsdGVycyA9IF9yZXNldEZpbHRlckhhbmRsZXIoX2ZpbHRlcnMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChfY2hhcnQuaGFzRmlsdGVyKGZpbHRlcikpIHsKICAgICAgICAgICAgICAgIF9yZW1vdmVGaWx0ZXJIYW5kbGVyKF9maWx0ZXJzLCBmaWx0ZXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgX2FkZEZpbHRlckhhbmRsZXIoX2ZpbHRlcnMsIGZpbHRlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYXBwbHlGaWx0ZXJzKCk7CiAgICAgICAgX2NoYXJ0Ll9pbnZva2VGaWx0ZXJlZExpc3RlbmVyKGZpbHRlcik7CgogICAgICAgIGlmIChfcm9vdCAhPT0gbnVsbCAmJiBfY2hhcnQuaGFzRmlsdGVyKCkpIHsKICAgICAgICAgICAgX2NoYXJ0LnR1cm5PbkNvbnRyb2xzKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2NoYXJ0LnR1cm5PZmZDb250cm9scygpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFsbCBjdXJyZW50IGZpbHRlcnMuIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gZGVmZW5zaXZlIGNsb25pbmcgb2YgdGhlIGludGVybmFsCiAgICAgKiBmaWx0ZXIgYXJyYXkgYmVmb3JlIHJldHVybmluZywgdGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24gb2YgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgZWZmZWN0IHRoZQogICAgICogY2hhcnQncyBpbnRlcm5hbCBmaWx0ZXIgc3RvcmFnZS4KICAgICAqIEBtZXRob2QgZmlsdGVycwogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHtBcnJheTwqPn0KICAgICAqLwogICAgX2NoYXJ0LmZpbHRlcnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIF9maWx0ZXJzOwogICAgfTsKCiAgICBfY2hhcnQuaGlnaGxpZ2h0U2VsZWN0ZWQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgIGQzLnNlbGVjdChlKS5jbGFzc2VkKGRjLmNvbnN0YW50cy5TRUxFQ1RFRF9DTEFTUywgdHJ1ZSk7CiAgICAgICAgZDMuc2VsZWN0KGUpLmNsYXNzZWQoZGMuY29uc3RhbnRzLkRFU0VMRUNURURfQ0xBU1MsIGZhbHNlKTsKICAgIH07CgogICAgX2NoYXJ0LmZhZGVEZXNlbGVjdGVkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBkMy5zZWxlY3QoZSkuY2xhc3NlZChkYy5jb25zdGFudHMuU0VMRUNURURfQ0xBU1MsIGZhbHNlKTsKICAgICAgICBkMy5zZWxlY3QoZSkuY2xhc3NlZChkYy5jb25zdGFudHMuREVTRUxFQ1RFRF9DTEFTUywgdHJ1ZSk7CiAgICB9OwoKICAgIF9jaGFydC5yZXNldEhpZ2hsaWdodCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgZDMuc2VsZWN0KGUpLmNsYXNzZWQoZGMuY29uc3RhbnRzLlNFTEVDVEVEX0NMQVNTLCBmYWxzZSk7CiAgICAgICAgZDMuc2VsZWN0KGUpLmNsYXNzZWQoZGMuY29uc3RhbnRzLkRFU0VMRUNURURfQ0xBU1MsIGZhbHNlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byBkMyBhcyB0aGUgb25DbGljayBoYW5kbGVyIGZvciBlYWNoIGNoYXJ0LiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwogICAgICogZmlsdGVyIG9uIHRoZSBjbGlja2VkIGRhdHVtIChwYXNzZWQgdG8gdGhlIGNhbGxiYWNrKSBhbmQgcmVkcmF3IHRoZSBjaGFydCBncm91cC4KICAgICAqIEBtZXRob2Qgb25DbGljawogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0geyp9IGRhdHVtCiAgICAgKi8KICAgIF9jaGFydC5vbkNsaWNrID0gZnVuY3Rpb24gKGRhdHVtKSB7CiAgICAgICAgdmFyIGZpbHRlciA9IF9jaGFydC5rZXlBY2Nlc3NvcigpKGRhdHVtKTsKICAgICAgICBkYy5ldmVudHMudHJpZ2dlcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9jaGFydC5maWx0ZXIoZmlsdGVyKTsKICAgICAgICAgICAgX2NoYXJ0LnJlZHJhd0dyb3VwKCk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IG9yIGdldCB0aGUgZmlsdGVyIGhhbmRsZXIuIFRoZSBmaWx0ZXIgaGFuZGxlciBpcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgdGhlIGZpbHRlciBhY3Rpb24KICAgICAqIG9uIGEgc3BlY2lmaWMgZGltZW5zaW9uLiBVc2luZyBhIGN1c3RvbSBmaWx0ZXIgaGFuZGxlciBhbGxvd3MgeW91IHRvIHBlcmZvcm0gYWRkaXRpb25hbCBsb2dpYwogICAgICogYmVmb3JlIG9yIGFmdGVyIGZpbHRlcmluZy4KICAgICAqIEBtZXRob2QgZmlsdGVySGFuZGxlcgogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc3F1YXJlL2Nyb3NzZmlsdGVyL3dpa2kvQVBJLVJlZmVyZW5jZSNkaW1lbnNpb25fZmlsdGVyIGNyb3NzZmlsdGVyLmRpbWVuc2lvbi5maWx0ZXJ9CiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gZGVmYXVsdCBmaWx0ZXIgaGFuZGxlcgogICAgICogY2hhcnQuZmlsdGVySGFuZGxlcihmdW5jdGlvbiAoZGltZW5zaW9uLCBmaWx0ZXJzKSB7CiAgICAgKiAgICAgZGltZW5zaW9uLmZpbHRlcihudWxsKTsKICAgICAqICAgICBpZiAoZmlsdGVycy5sZW5ndGggPT09IDApIHsKICAgICAqICAgICAgICAgZGltZW5zaW9uLmZpbHRlcihudWxsKTsKICAgICAqICAgICB9IGVsc2UgewogICAgICogICAgICAgICBkaW1lbnNpb24uZmlsdGVyRnVuY3Rpb24oZnVuY3Rpb24gKGQpIHsKICAgICAqICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewogICAgICogICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSBmaWx0ZXJzW2ldOwogICAgICogICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIuaXNGaWx0ZXJlZCAmJiBmaWx0ZXIuaXNGaWx0ZXJlZChkKSkgewogICAgICogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAqICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlciA8PSBkICYmIGZpbHRlciA+PSBkKSB7CiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICogICAgICAgICAgICAgICAgIH0KICAgICAqICAgICAgICAgICAgIH0KICAgICAqICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAqICAgICAgICAgfSk7CiAgICAgKiAgICAgfQogICAgICogICAgIHJldHVybiBmaWx0ZXJzOwogICAgICogfSk7CiAgICAgKgogICAgICogLy8gY3VzdG9tIGZpbHRlciBoYW5kbGVyCiAgICAgKiBjaGFydC5maWx0ZXJIYW5kbGVyKGZ1bmN0aW9uKGRpbWVuc2lvbiwgZmlsdGVyKXsKICAgICAqICAgICB2YXIgbmV3RmlsdGVyID0gZmlsdGVyICsgMTA7CiAgICAgKiAgICAgZGltZW5zaW9uLmZpbHRlcihuZXdGaWx0ZXIpOwogICAgICogICAgIHJldHVybiBuZXdGaWx0ZXI7IC8vIHNldCB0aGUgYWN0dWFsIGZpbHRlciB2YWx1ZSB0byB0aGUgbmV3IHZhbHVlCiAgICAgKiB9KTsKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmaWx0ZXJIYW5kbGVyXQogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5maWx0ZXJIYW5kbGVyID0gZnVuY3Rpb24gKGZpbHRlckhhbmRsZXIpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9maWx0ZXJIYW5kbGVyOwogICAgICAgIH0KICAgICAgICBfZmlsdGVySGFuZGxlciA9IGZpbHRlckhhbmRsZXI7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLy8gYWJzdHJhY3QgZnVuY3Rpb24gc3R1YgogICAgX2NoYXJ0Ll9kb1JlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBkbyBub3RoaW5nIGluIGJhc2UsIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1Yi1mdW5jdGlvbgogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIF9jaGFydC5fZG9SZWRyYXcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gZG8gbm90aGluZyBpbiBiYXNlLCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBzdWItZnVuY3Rpb24KICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICBfY2hhcnQubGVnZW5kYWJsZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gZG8gbm90aGluZyBpbiBiYXNlLCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBzdWItZnVuY3Rpb24KICAgICAgICByZXR1cm4gW107CiAgICB9OwoKICAgIF9jaGFydC5sZWdlbmRIaWdobGlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gZG8gbm90aGluZyBpbiBiYXNlLCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBzdWItZnVuY3Rpb24KICAgIH07CgogICAgX2NoYXJ0LmxlZ2VuZFJlc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIGRvIG5vdGhpbmcgaW4gYmFzZSwgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViLWZ1bmN0aW9uCiAgICB9OwoKICAgIF9jaGFydC5sZWdlbmRUb2dnbGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gZG8gbm90aGluZyBpbiBiYXNlLCBzaG91bGQgYmUgb3ZlcnJpZGVuIGJ5IHN1Yi1mdW5jdGlvbgogICAgfTsKCiAgICBfY2hhcnQuaXNMZWdlbmRhYmxlSGlkZGVuID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIGRvIG5vdGhpbmcgaW4gYmFzZSwgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViLWZ1bmN0aW9uCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCBvciBnZXQgdGhlIGtleSBhY2Nlc3NvciBmdW5jdGlvbi4gVGhlIGtleSBhY2Nlc3NvciBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBrZXkKICAgICAqIHZhbHVlIGZyb20gdGhlIGNyb3NzZmlsdGVyIGdyb3VwLiBLZXkgdmFsdWVzIGFyZSB1c2VkIGRpZmZlcmVudGx5IGluIGRpZmZlcmVudCBjaGFydHMsIGZvcgogICAgICogZXhhbXBsZSBrZXlzIGNvcnJlc3BvbmQgdG8gc2xpY2VzIGluIGEgcGllIGNoYXJ0IGFuZCB4IGF4aXMgcG9zaXRpb25zIGluIGEgZ3JpZCBjb29yZGluYXRlIGNoYXJ0LgogICAgICogQG1ldGhvZCBrZXlBY2Nlc3NvcgogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gZGVmYXVsdCBrZXkgYWNjZXNzb3IKICAgICAqIGNoYXJ0LmtleUFjY2Vzc29yKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQua2V5OyB9KTsKICAgICAqIC8vIGN1c3RvbSBrZXkgYWNjZXNzb3IgZm9yIGEgbXVsdGktdmFsdWUgY3Jvc3NmaWx0ZXIgcmVkdWN0aW9uCiAgICAgKiBjaGFydC5rZXlBY2Nlc3NvcihmdW5jdGlvbihwKSB7IHJldHVybiBwLnZhbHVlLmFic0dhaW47IH0pOwogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2tleUFjY2Vzc29yXQogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5rZXlBY2Nlc3NvciA9IGZ1bmN0aW9uIChrZXlBY2Nlc3NvcikgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX2tleUFjY2Vzc29yOwogICAgICAgIH0KICAgICAgICBfa2V5QWNjZXNzb3IgPSBrZXlBY2Nlc3NvcjsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCBvciBnZXQgdGhlIHZhbHVlIGFjY2Vzc29yIGZ1bmN0aW9uLiBUaGUgdmFsdWUgYWNjZXNzb3IgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUKICAgICAqIHZhbHVlIGZyb20gdGhlIGNyb3NzZmlsdGVyIGdyb3VwLiBHcm91cCB2YWx1ZXMgYXJlIHVzZWQgZGlmZmVyZW50bHkgaW4gZGlmZmVyZW50IGNoYXJ0cywgZm9yCiAgICAgKiBleGFtcGxlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHNsaWNlIHNpemVzIGluIGEgcGllIGNoYXJ0IGFuZCB5IGF4aXMgcG9zaXRpb25zIGluIGEgZ3JpZAogICAgICogY29vcmRpbmF0ZSBjaGFydC4KICAgICAqIEBtZXRob2QgdmFsdWVBY2Nlc3NvcgogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gZGVmYXVsdCB2YWx1ZSBhY2Nlc3NvcgogICAgICogY2hhcnQudmFsdWVBY2Nlc3NvcihmdW5jdGlvbihkKSB7IHJldHVybiBkLnZhbHVlOyB9KTsKICAgICAqIC8vIGN1c3RvbSB2YWx1ZSBhY2Nlc3NvciBmb3IgYSBtdWx0aS12YWx1ZSBjcm9zc2ZpbHRlciByZWR1Y3Rpb24KICAgICAqIGNoYXJ0LnZhbHVlQWNjZXNzb3IoZnVuY3Rpb24ocCkgeyByZXR1cm4gcC52YWx1ZS5wZXJjZW50YWdlR2FpbjsgfSk7CiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdmFsdWVBY2Nlc3Nvcl0KICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQudmFsdWVBY2Nlc3NvciA9IGZ1bmN0aW9uICh2YWx1ZUFjY2Vzc29yKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfdmFsdWVBY2Nlc3NvcjsKICAgICAgICB9CiAgICAgICAgX3ZhbHVlQWNjZXNzb3IgPSB2YWx1ZUFjY2Vzc29yOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IG9yIGdldCB0aGUgbGFiZWwgZnVuY3Rpb24uIFRoZSBjaGFydCBjbGFzcyB3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHJlbmRlciBsYWJlbHMgZm9yIGVhY2gKICAgICAqIGNoaWxkIGVsZW1lbnQgaW4gdGhlIGNoYXJ0LCBlLmcuIHNsaWNlcyBpbiBhIHBpZSBjaGFydCBvciBidWJibGVzIGluIGEgYnViYmxlIGNoYXJ0LiBOb3QgZXZlcnkKICAgICAqIGNoYXJ0IHN1cHBvcnRzIHRoZSBsYWJlbCBmdW5jdGlvbiwgZm9yIGV4YW1wbGUgbGluZSBjaGFydCBkb2VzIG5vdCB1c2UgdGhpcyBmdW5jdGlvbgogICAgICogYXQgYWxsLiBCeSBkZWZhdWx0LCBlbmFibGVzIGxhYmVsczsgcGFzcyBmYWxzZSBmb3IgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaWYgdGhpcyBpcyBub3QgZGVzaXJlZC4KICAgICAqIEBtZXRob2QgbGFiZWwKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQGV4YW1wbGUKICAgICAqIC8vIGRlZmF1bHQgbGFiZWwgZnVuY3Rpb24ganVzdCByZXR1cm4gdGhlIGtleQogICAgICogY2hhcnQubGFiZWwoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5rZXk7IH0pOwogICAgICogLy8gbGFiZWwgZnVuY3Rpb24gaGFzIGFjY2VzcyB0byB0aGUgc3RhbmRhcmQgZDMgZGF0YSBiaW5kaW5nIGFuZCBjYW4gZ2V0IHF1aXRlIGNvbXBsaWNhdGVkCiAgICAgKiBjaGFydC5sYWJlbChmdW5jdGlvbihkKSB7IHJldHVybiBkLmRhdGEua2V5ICsgJygnICsgTWF0aC5mbG9vcihkLmRhdGEudmFsdWUgLyBhbGwudmFsdWUoKSAqIDEwMCkgKyAnJSknOyB9KTsKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtsYWJlbEZ1bmN0aW9uXQogICAgICogQHBhcmFtIHtCb29sZWFufSBbZW5hYmxlTGFiZWxzPXRydWVdCiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0KICAgICAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LmxhYmVsID0gZnVuY3Rpb24gKGxhYmVsRnVuY3Rpb24sIGVuYWJsZUxhYmVscykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX2xhYmVsOwogICAgICAgIH0KICAgICAgICBfbGFiZWwgPSBsYWJlbEZ1bmN0aW9uOwogICAgICAgIGlmICgoZW5hYmxlTGFiZWxzID09PSB1bmRlZmluZWQpIHx8IGVuYWJsZUxhYmVscykgewogICAgICAgICAgICBfcmVuZGVyTGFiZWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIFR1cm4gb24vb2ZmIGxhYmVsIHJlbmRlcmluZwogICAgICogQG1ldGhvZCByZW5kZXJMYWJlbAogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyZW5kZXJMYWJlbD1mYWxzZV0KICAgICAqIEByZXR1cm4ge0Jvb2xlYW59CiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5yZW5kZXJMYWJlbCA9IGZ1bmN0aW9uIChyZW5kZXJMYWJlbCkgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX3JlbmRlckxhYmVsOwogICAgICAgIH0KICAgICAgICBfcmVuZGVyTGFiZWwgPSByZW5kZXJMYWJlbDsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCBvciBnZXQgdGhlIHRpdGxlIGZ1bmN0aW9uLiBUaGUgY2hhcnQgY2xhc3Mgd2lsbCB1c2UgdGhpcyBmdW5jdGlvbiB0byByZW5kZXIgdGhlIFNWR0VsZW1lbnQgdGl0bGUKICAgICAqICh1c3VhbGx5IGludGVycHJldGVkIGJ5IGJyb3dzZXIgYXMgdG9vbHRpcHMpIGZvciBlYWNoIGNoaWxkIGVsZW1lbnQgaW4gdGhlIGNoYXJ0LCBlLmcuIGEgc2xpY2UKICAgICAqIGluIGEgcGllIGNoYXJ0IG9yIGEgYnViYmxlIGluIGEgYnViYmxlIGNoYXJ0LiBBbG1vc3QgZXZlcnkgY2hhcnQgc3VwcG9ydHMgdGhlIHRpdGxlIGZ1bmN0aW9uOwogICAgICogaG93ZXZlciBpbiBncmlkIGNvb3JkaW5hdGUgY2hhcnRzIHlvdSBuZWVkIHRvIHR1cm4gb2ZmIHRoZSBicnVzaCBpbiBvcmRlciB0byBzZWUgdGl0bGVzLCBiZWNhdXNlCiAgICAgKiBvdGhlcndpc2UgdGhlIGJydXNoIGxheWVyIHdpbGwgYmxvY2sgdG9vbHRpcCB0cmlnZ2VyaW5nLgogICAgICogQG1ldGhvZCB0aXRsZQogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gZGVmYXVsdCB0aXRsZSBmdW5jdGlvbiBzaG93cyAia2V5OiB2YWx1ZSIKICAgICAqIGNoYXJ0LnRpdGxlKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQua2V5ICsgJzogJyArIGQudmFsdWU7IH0pOwogICAgICogLy8gdGl0bGUgZnVuY3Rpb24gaGFzIGFjY2VzcyB0byB0aGUgc3RhbmRhcmQgZDMgZGF0YSBiaW5kaW5nIGFuZCBjYW4gZ2V0IHF1aXRlIGNvbXBsaWNhdGVkCiAgICAgKiBjaGFydC50aXRsZShmdW5jdGlvbihwKSB7CiAgICAgKiAgICByZXR1cm4gcC5rZXkuZ2V0RnVsbFllYXIoKQogICAgICogICAgICAgICsgJ1xuJwogICAgICogICAgICAgICsgJ0luZGV4IEdhaW46ICcgKyBudW1iZXJGb3JtYXQocC52YWx1ZS5hYnNHYWluKSArICdcbicKICAgICAqICAgICAgICArICdJbmRleCBHYWluIGluIFBlcmNlbnRhZ2U6ICcgKyBudW1iZXJGb3JtYXQocC52YWx1ZS5wZXJjZW50YWdlR2FpbikgKyAnJVxuJwogICAgICogICAgICAgICsgJ0ZsdWN0dWF0aW9uIC8gSW5kZXggUmF0aW86ICcgKyBudW1iZXJGb3JtYXQocC52YWx1ZS5mbHVjdHVhdGlvblBlcmNlbnRhZ2UpICsgJyUnOwogICAgICogfSk7CiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGl0bGVGdW5jdGlvbl0KICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQudGl0bGUgPSBmdW5jdGlvbiAodGl0bGVGdW5jdGlvbikgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX3RpdGxlOwogICAgICAgIH0KICAgICAgICBfdGl0bGUgPSB0aXRsZUZ1bmN0aW9uOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogVHVybiBvbi9vZmYgdGl0bGUgcmVuZGVyaW5nLCBvciByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSByZW5kZXIgdGl0bGUgZmxhZyBpZiBubyBhcmd1bWVudHMgYXJlCiAgICAgKiBnaXZlbi4KICAgICAqIEBtZXRob2QgcmVuZGVyVGl0bGUKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtCb29sZWFufSBbcmVuZGVyVGl0bGU9dHJ1ZV0KICAgICAqIEByZXR1cm4ge0Jvb2xlYW59CiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5yZW5kZXJUaXRsZSA9IGZ1bmN0aW9uIChyZW5kZXJUaXRsZSkgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX3JlbmRlclRpdGxlOwogICAgICAgIH0KICAgICAgICBfcmVuZGVyVGl0bGUgPSByZW5kZXJUaXRsZTsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIEEgcmVuZGVybGV0IGlzIHNpbWlsYXIgdG8gYW4gZXZlbnQgbGlzdGVuZXIgb24gcmVuZGVyaW5nIGV2ZW50LiBNdWx0aXBsZSByZW5kZXJsZXRzIGNhbiBiZSBhZGRlZAogICAgICogdG8gYW4gaW5kaXZpZHVhbCBjaGFydC4gIEVhY2ggdGltZSBhIGNoYXJ0IGlzIHJlcmVuZGVyZWQgb3IgcmVkcmF3biB0aGUgcmVuZGVybGV0cyBhcmUgaW52b2tlZAogICAgICogcmlnaHQgYWZ0ZXIgdGhlIGNoYXJ0IGZpbmlzaGVzIGl0cyB0cmFuc2l0aW9ucywgZ2l2aW5nIHlvdSBhIHdheSB0byBtb2RpZnkgdGhlIFNWR0VsZW1lbnRzLgogICAgICogUmVuZGVybGV0IGZ1bmN0aW9ucyB0YWtlIHRoZSBjaGFydCBpbnN0YW5jZSBhcyB0aGUgb25seSBpbnB1dCBwYXJhbWV0ZXIgYW5kIHlvdSBjYW4KICAgICAqIHVzZSB0aGUgZGMgQVBJIG9yIHVzZSByYXcgZDMgdG8gYWNoaWV2ZSBwcmV0dHkgbXVjaCBhbnkgZWZmZWN0LgogICAgICoKICAgICAqIFVzZSB7QGxpbmsgZGMuYmFzZU1peGluI29uIG9ufSB3aXRoIGEgJ3JlbmRlcmxldCcgcHJlZml4LgogICAgICogR2VuZXJhdGVzIGEgcmFuZG9tIGtleSBmb3IgdGhlIHJlbmRlcmxldCwgd2hpY2ggbWFrZXMgaXQgaGFyZCB0byByZW1vdmUuCiAgICAgKiBAbWV0aG9kIHJlbmRlcmxldAogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQGV4YW1wbGUKICAgICAqIC8vIGRvIHRoaXMgaW5zdGVhZCBvZiAucmVuZGVybGV0KGZ1bmN0aW9uKGNoYXJ0KSB7IC4uLiB9KQogICAgICogY2hhcnQub24oInJlbmRlcmxldCIsIGZ1bmN0aW9uKGNoYXJ0KXsKICAgICAqICAgICAvLyBtaXggb2YgZGMgQVBJIGFuZCBkMyBtYW5pcHVsYXRpb24KICAgICAqICAgICBjaGFydC5zZWxlY3QoJ2cueScpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAqICAgICAvLyBpdHMgYSBjbG9zdXJlIHNvIHlvdSBjYW4gYWxzbyBhY2Nlc3Mgb3RoZXIgY2hhcnQgdmFyaWFibGUgYXZhaWxhYmxlIGluIHRoZSBjbG9zdXJlIHNjb3BlCiAgICAgKiAgICAgbW92ZUNoYXJ0LmZpbHRlcihjaGFydC5maWx0ZXIoKSk7CiAgICAgKiB9KTsKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbmRlcmxldEZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5yZW5kZXJsZXQgPSBkYy5sb2dnZXIuZGVwcmVjYXRlKGZ1bmN0aW9uIChyZW5kZXJsZXRGdW5jdGlvbikgewogICAgICAgIF9jaGFydC5vbigncmVuZGVybGV0LicgKyBkYy51dGlscy51bmlxdWVJZCgpLCByZW5kZXJsZXRGdW5jdGlvbik7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH0sICdjaGFydC5yZW5kZXJsZXQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gIFBsZWFzZSB1c2UgY2hhcnQub24oInJlbmRlcmxldC48cmVuZGVybGV0S2V5PiIsIHJlbmRlcmxldEZ1bmN0aW9uKScpOwoKICAgIC8qKgogICAgICogR2V0IG9yIHNldCB0aGUgY2hhcnQgZ3JvdXAgdG8gd2hpY2ggdGhpcyBjaGFydCBiZWxvbmdzLiBDaGFydCBncm91cHMgYXJlIHJlbmRlcmVkIG9yIHJlZHJhd24KICAgICAqIHRvZ2V0aGVyIHNpbmNlIGl0IGlzIGV4cGVjdGVkIHRoZXkgc2hhcmUgdGhlIHNhbWUgdW5kZXJseWluZyBjcm9zc2ZpbHRlciBkYXRhIHNldC4KICAgICAqIEBtZXRob2QgY2hhcnRHcm91cAogICAgICogQG1lbWJlcm9mIGRjLmJhc2VNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW2NoYXJ0R3JvdXBdCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgKiBAcmV0dXJuIHtkYy5iYXNlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5jaGFydEdyb3VwID0gZnVuY3Rpb24gKGNoYXJ0R3JvdXApIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9jaGFydEdyb3VwOwogICAgICAgIH0KICAgICAgICBpZiAoIV9pc0NoaWxkKSB7CiAgICAgICAgICAgIGRjLmRlcmVnaXN0ZXJDaGFydChfY2hhcnQsIF9jaGFydEdyb3VwKTsKICAgICAgICB9CiAgICAgICAgX2NoYXJ0R3JvdXAgPSBjaGFydEdyb3VwOwogICAgICAgIGlmICghX2lzQ2hpbGQpIHsKICAgICAgICAgICAgZGMucmVnaXN0ZXJDaGFydChfY2hhcnQsIF9jaGFydEdyb3VwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBFeHBpcmUgdGhlIGludGVybmFsIGNoYXJ0IGNhY2hlLiBkYyBjaGFydHMgY2FjaGUgc29tZSBkYXRhIGludGVybmFsbHkgb24gYSBwZXIgY2hhcnQgYmFzaXMgdG8KICAgICAqIHNwZWVkIHVwIHJlbmRlcmluZyBhbmQgYXZvaWQgdW5uZWNlc3NhcnkgY2FsY3VsYXRpb247IGhvd2V2ZXIgaXQgbWlnaHQgYmUgdXNlZnVsIHRvIGNsZWFyIHRoZQogICAgICogY2FjaGUgaWYgeW91IGhhdmUgY2hhbmdlZCBzdGF0ZSB3aGljaCB3aWxsIGFmZmVjdCByZW5kZXJpbmcuICBGb3IgZXhhbXBsZSBpZiB5b3UgaW52b2tlIHRoZQogICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9zcXVhcmUvY3Jvc3NmaWx0ZXIvd2lraS9BUEktUmVmZXJlbmNlI2Nyb3NzZmlsdGVyX2FkZCBjcm9zc2ZpbHRlci5hZGR9CiAgICAgKiBmdW5jdGlvbiBvciByZXNldCBncm91cCBvciBkaW1lbnNpb24gYWZ0ZXIgcmVuZGVyaW5nIGl0IGlzIGEgZ29vZCBpZGVhIHRvCiAgICAgKiBjbGVhciB0aGUgY2FjaGUgdG8gbWFrZSBzdXJlIGNoYXJ0cyBhcmUgcmVuZGVyZWQgcHJvcGVybHkuCiAgICAgKiBAbWV0aG9kIGV4cGlyZUNhY2hlCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LmV4cGlyZUNhY2hlID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIGRvIG5vdGhpbmcgaW4gYmFzZSwgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViLWZ1bmN0aW9uCiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBBdHRhY2ggYSBkYy5sZWdlbmQgd2lkZ2V0IHRvIHRoaXMgY2hhcnQuIFRoZSBsZWdlbmQgd2lkZ2V0IHdpbGwgYXV0b21hdGljYWxseSBkcmF3IGxlZ2VuZCBsYWJlbHMKICAgICAqIGJhc2VkIG9uIHRoZSBjb2xvciBzZXR0aW5nIGFuZCBuYW1lcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBncm91cC4KICAgICAqIEBtZXRob2QgbGVnZW5kCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBleGFtcGxlCiAgICAgKiBjaGFydC5sZWdlbmQoZGMubGVnZW5kKCkueCg0MDApLnkoMTApLml0ZW1IZWlnaHQoMTMpLmdhcCg1KSkKICAgICAqIEBwYXJhbSB7ZGMubGVnZW5kfSBbbGVnZW5kXQogICAgICogQHJldHVybiB7ZGMubGVnZW5kfQogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQubGVnZW5kID0gZnVuY3Rpb24gKGxlZ2VuZCkgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX2xlZ2VuZDsKICAgICAgICB9CiAgICAgICAgX2xlZ2VuZCA9IGxlZ2VuZDsKICAgICAgICBfbGVnZW5kLnBhcmVudChfY2hhcnQpOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaW50ZXJuYWwgbnVtZXJpYyBJRCBvZiB0aGUgY2hhcnQuCiAgICAgKiBAbWV0aG9kIGNoYXJ0SUQKICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHJldHVybiB7U3RyaW5nfQogICAgICovCiAgICBfY2hhcnQuY2hhcnRJRCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX2NoYXJ0Ll9fZGNGbGFnX187CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IGNoYXJ0IG9wdGlvbnMgdXNpbmcgYSBjb25maWd1cmF0aW9uIG9iamVjdC4gRWFjaCBrZXkgaW4gdGhlIG9iamVjdCB3aWxsIGNhdXNlIHRoZSBtZXRob2Qgb2YKICAgICAqIHRoZSBzYW1lIG5hbWUgdG8gYmUgY2FsbGVkIHdpdGggdGhlIHZhbHVlIHRvIHNldCB0aGF0IGF0dHJpYnV0ZSBmb3IgdGhlIGNoYXJ0LgogICAgICogQG1ldGhvZCBvcHRpb25zCiAgICAgKiBAbWVtYmVyb2YgZGMuYmFzZU1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBleGFtcGxlCiAgICAgKiBjaGFydC5vcHRpb25zKHtkaW1lbnNpb246IG15RGltZW5zaW9uLCBncm91cDogbXlHcm91cH0pOwogICAgICogQHBhcmFtIHt7fX0gb3B0cwogICAgICogQHJldHVybiB7ZGMuYmFzZU1peGlufQogICAgICovCiAgICBfY2hhcnQub3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRzKSB7CiAgICAgICAgdmFyIGFwcGx5T3B0aW9ucyA9IFsKICAgICAgICAgICAgJ2FuY2hvcicsCiAgICAgICAgICAgICdncm91cCcsCiAgICAgICAgICAgICd4QXhpc0xhYmVsJywKICAgICAgICAgICAgJ3lBeGlzTGFiZWwnLAogICAgICAgICAgICAnc3RhY2snLAogICAgICAgICAgICAndGl0bGUnLAogICAgICAgICAgICAncG9pbnQnLAogICAgICAgICAgICAnZ2V0Q29sb3InLAogICAgICAgICAgICAnb3ZlcmxheUdlb0pzb24nCiAgICAgICAgXTsKCiAgICAgICAgZm9yICh2YXIgbyBpbiBvcHRzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YoX2NoYXJ0W29dKSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgaWYgKG9wdHNbb10gaW5zdGFuY2VvZiBBcnJheSAmJiBhcHBseU9wdGlvbnMuaW5kZXhPZihvKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBfY2hhcnRbb10uYXBwbHkoX2NoYXJ0LCBvcHRzW29dKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgX2NoYXJ0W29dLmNhbGwoX2NoYXJ0LCBvcHRzW29dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRjLmxvZ2dlci5kZWJ1ZygnTm90IGEgdmFsaWQgb3B0aW9uIHNldHRlciBuYW1lOiAnICsgbyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBBbGwgZGMgY2hhcnQgaW5zdGFuY2Ugc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBsaXN0ZW5lcnMuCiAgICAgKiBTdXBwb3J0cyB0aGUgZm9sbG93aW5nIGV2ZW50czoKICAgICAqICogYHJlbmRlcmxldGAgLSBUaGlzIGxpc3RlbmVyIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBhZnRlciB0cmFuc2l0aW9ucyBhZnRlciByZWRyYXcgYW5kIHJlbmRlci4gUmVwbGFjZXMgdGhlCiAgICAgKiBkZXByZWNhdGVkIHtAbGluayBkYy5iYXNlTWl4aW4jcmVuZGVybGV0IHJlbmRlcmxldH0gbWV0aG9kLgogICAgICogKiBgcHJldHJhbnNpdGlvbmAgLSBMaWtlIGAub24oJ3JlbmRlcmxldCcsIC4uLilgIGJ1dCB0aGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHRyYW5zaXRpb25zIHN0YXJ0LgogICAgICogKiBgcHJlUmVuZGVyYCAtIFRoaXMgbGlzdGVuZXIgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGJlZm9yZSBjaGFydCByZW5kZXJpbmcuCiAgICAgKiAqIGBwb3N0UmVuZGVyYCAtIFRoaXMgbGlzdGVuZXIgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGFmdGVyIGNoYXJ0IGZpbmlzaCByZW5kZXJpbmcgaW5jbHVkaW5nCiAgICAgKiBhbGwgcmVuZGVybGV0cycgbG9naWMuCiAgICAgKiAqIGBwcmVSZWRyYXdgIC0gVGhpcyBsaXN0ZW5lciBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgYmVmb3JlIGNoYXJ0IHJlZHJhd2luZy4KICAgICAqICogYHBvc3RSZWRyYXdgIC0gVGhpcyBsaXN0ZW5lciBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgY2hhcnQgZmluaXNoIHJlZHJhd2luZwogICAgICogaW5jbHVkaW5nIGFsbCByZW5kZXJsZXRzJyBsb2dpYy4KICAgICAqICogYGZpbHRlcmVkYCAtIFRoaXMgbGlzdGVuZXIgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGFmdGVyIGEgZmlsdGVyIGlzIGFwcGxpZWQsIGFkZGVkIG9yIHJlbW92ZWQuCiAgICAgKiAqIGB6b29tZWRgIC0gVGhpcyBsaXN0ZW5lciBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgYSB6b29tIGlzIHRyaWdnZXJlZC4KICAgICAqIEBtZXRob2Qgb24KICAgICAqIEBtZW1iZXJvZiBkYy5iYXNlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvSW50ZXJuYWxzI2Rpc3BhdGNoX29uIGQzLmRpc3BhdGNoLm9ufQogICAgICogQGV4YW1wbGUKICAgICAqIC5vbigncmVuZGVybGV0JywgZnVuY3Rpb24oY2hhcnQsIGZpbHRlcil7Li4ufSkKICAgICAqIC5vbigncHJldHJhbnNpdGlvbicsIGZ1bmN0aW9uKGNoYXJ0LCBmaWx0ZXIpey4uLn0pCiAgICAgKiAub24oJ3ByZVJlbmRlcicsIGZ1bmN0aW9uKGNoYXJ0KXsuLi59KQogICAgICogLm9uKCdwb3N0UmVuZGVyJywgZnVuY3Rpb24oY2hhcnQpey4uLn0pCiAgICAgKiAub24oJ3ByZVJlZHJhdycsIGZ1bmN0aW9uKGNoYXJ0KXsuLi59KQogICAgICogLm9uKCdwb3N0UmVkcmF3JywgZnVuY3Rpb24oY2hhcnQpey4uLn0pCiAgICAgKiAub24oJ2ZpbHRlcmVkJywgZnVuY3Rpb24oY2hhcnQsIGZpbHRlcil7Li4ufSkKICAgICAqIC5vbignem9vbWVkJywgZnVuY3Rpb24oY2hhcnQsIGZpbHRlcil7Li4ufSkKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudAogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIKICAgICAqIEByZXR1cm4ge2RjLmJhc2VNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0Lm9uID0gZnVuY3Rpb24gKGV2ZW50LCBsaXN0ZW5lcikgewogICAgICAgIF9saXN0ZW5lcnMub24oZXZlbnQsIGxpc3RlbmVyKTsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICByZXR1cm4gX2NoYXJ0Owp9OwoKLyoqCiAqIE1hcmdpbiBpcyBhIG1peGluIHRoYXQgcHJvdmlkZXMgbWFyZ2luIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBib3RoIHRoZSBSb3cgQ2hhcnQgYW5kIENvb3JkaW5hdGUgR3JpZAogKiBDaGFydHMuCiAqIEBuYW1lIG1hcmdpbk1peGluCiAqIEBtZW1iZXJvZiBkYwogKiBAbWl4aW4KICogQHBhcmFtIHtPYmplY3R9IF9jaGFydAogKiBAcmV0dXJuIHtkYy5tYXJnaW5NaXhpbn0KICovCmRjLm1hcmdpbk1peGluID0gZnVuY3Rpb24gKF9jaGFydCkgewogICAgdmFyIF9tYXJnaW4gPSB7dG9wOiAxMCwgcmlnaHQ6IDUwLCBib3R0b206IDMwLCBsZWZ0OiAzMH07CgogICAgLyoqCiAgICAgKiBHZXQgb3Igc2V0IHRoZSBtYXJnaW5zIGZvciBhIHBhcnRpY3VsYXIgY29vcmRpbmF0ZSBncmlkIGNoYXJ0IGluc3RhbmNlLiBUaGUgbWFyZ2lucyBpcyBzdG9yZWQgYXMKICAgICAqIGFuIGFzc29jaWF0aXZlIEphdmFzY3JpcHQgYXJyYXkuCiAgICAgKiBAbWV0aG9kIG1hcmdpbnMKICAgICAqIEBtZW1iZXJvZiBkYy5tYXJnaW5NaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAZXhhbXBsZQogICAgICogdmFyIGxlZnRNYXJnaW4gPSBjaGFydC5tYXJnaW5zKCkubGVmdDsgLy8gMzAgYnkgZGVmYXVsdAogICAgICogY2hhcnQubWFyZ2lucygpLmxlZnQgPSA1MDsKICAgICAqIGxlZnRNYXJnaW4gPSBjaGFydC5tYXJnaW5zKCkubGVmdDsgLy8gbm93IDUwCiAgICAgKiBAcGFyYW0ge3t0b3A6IE51bWJlciwgcmlnaHQ6IE51bWJlciwgbGVmdDogTnVtYmVyLCBib3R0b206IE51bWJlcn19IFttYXJnaW5zPXt0b3A6IDEwLCByaWdodDogNTAsIGJvdHRvbTogMzAsIGxlZnQ6IDMwfV0KICAgICAqIEByZXR1cm4ge3t0b3A6IE51bWJlciwgcmlnaHQ6IE51bWJlciwgbGVmdDogTnVtYmVyLCBib3R0b206IE51bWJlcn19CiAgICAgKiBAcmV0dXJuIHtkYy5tYXJnaW5NaXhpbn0KICAgICAqLwogICAgX2NoYXJ0Lm1hcmdpbnMgPSBmdW5jdGlvbiAobWFyZ2lucykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX21hcmdpbjsKICAgICAgICB9CiAgICAgICAgX21hcmdpbiA9IG1hcmdpbnM7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgX2NoYXJ0LmVmZmVjdGl2ZVdpZHRoID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBfY2hhcnQud2lkdGgoKSAtIF9jaGFydC5tYXJnaW5zKCkubGVmdCAtIF9jaGFydC5tYXJnaW5zKCkucmlnaHQ7CiAgICB9OwoKICAgIF9jaGFydC5lZmZlY3RpdmVIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIF9jaGFydC5oZWlnaHQoKSAtIF9jaGFydC5tYXJnaW5zKCkudG9wIC0gX2NoYXJ0Lm1hcmdpbnMoKS5ib3R0b207CiAgICB9OwoKICAgIHJldHVybiBfY2hhcnQ7Cn07CgovKioKICogVGhlIENvbG9yIE1peGluIGlzIGFuIGFic3RyYWN0IGNoYXJ0IGZ1bmN0aW9uYWwgY2xhc3MgcHJvdmlkaW5nIHVuaXZlcnNhbCBjb2xvcmluZyBzdXBwb3J0CiAqIGFzIGEgbWl4LWluIGZvciBhbnkgY29uY3JldGUgY2hhcnQgaW1wbGVtZW50YXRpb24uCiAqIEBuYW1lIGNvbG9yTWl4aW4KICogQG1lbWJlcm9mIGRjCiAqIEBtaXhpbgogKiBAcGFyYW0ge09iamVjdH0gX2NoYXJ0CiAqIEByZXR1cm4ge2RjLmNvbG9yTWl4aW59CiAqLwpkYy5jb2xvck1peGluID0gZnVuY3Rpb24gKF9jaGFydCkgewogICAgdmFyIF9jb2xvcnMgPSBkMy5zY2FsZS5jYXRlZ29yeTIwYygpOwogICAgdmFyIF9kZWZhdWx0QWNjZXNzb3IgPSB0cnVlOwoKICAgIHZhciBfY29sb3JBY2Nlc3NvciA9IGZ1bmN0aW9uIChkKSB7IHJldHVybiBfY2hhcnQua2V5QWNjZXNzb3IoKShkKTsgfTsKCiAgICAvKioKICAgICAqIFJldHJpZXZlIGN1cnJlbnQgY29sb3Igc2NhbGUgb3Igc2V0IGEgbmV3IGNvbG9yIHNjYWxlLiBUaGlzIG1ldGhvZHMgYWNjZXB0cyBhbnkgZnVuY3Rpb24gdGhhdAogICAgICogb3BlcmF0ZXMgbGlrZSBhIGQzIHNjYWxlLgogICAgICogQG1ldGhvZCBjb2xvcnMKICAgICAqIEBtZW1iZXJvZiBkYy5jb2xvck1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBzZWUge0BsaW5rIGh0dHA6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvU2NhbGVzIGQzLnNjYWxlfQogICAgICogQGV4YW1wbGUKICAgICAqIC8vIGFsdGVybmF0ZSBjYXRlZ29yaWNhbCBzY2FsZQogICAgICogY2hhcnQuY29sb3JzKGQzLnNjYWxlLmNhdGVnb3J5MjBiKCkpOwogICAgICogLy8gb3JkaW5hbCBzY2FsZQogICAgICogY2hhcnQuY29sb3JzKGQzLnNjYWxlLm9yZGluYWwoKS5yYW5nZShbJ3JlZCcsJ2dyZWVuJywnYmx1ZSddKSk7CiAgICAgKiAvLyBjb252ZW5pZW5jZSBtZXRob2QsIHRoZSBzYW1lIGFzIGFib3ZlCiAgICAgKiBjaGFydC5vcmRpbmFsQ29sb3JzKFsncmVkJywnZ3JlZW4nLCdibHVlJ10pOwogICAgICogLy8gc2V0IGEgbGluZWFyIHNjYWxlCiAgICAgKiBjaGFydC5saW5lYXJDb2xvcnMoWyIjNDU3NWI0IiwgIiNmZmZmYmYiLCAiI2E1MDAyNiJdKTsKICAgICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtjb2xvclNjYWxlPWQzLnNjYWxlLmNhdGVnb3J5MjBjKCldCiAgICAgKiBAcmV0dXJuIHtkMy5zY2FsZX0KICAgICAqIEByZXR1cm4ge2RjLmNvbG9yTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5jb2xvcnMgPSBmdW5jdGlvbiAoY29sb3JTY2FsZSkgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX2NvbG9yczsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbG9yU2NhbGUgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgICBfY29sb3JzID0gZDMuc2NhbGUucXVhbnRpemUoKS5yYW5nZShjb2xvclNjYWxlKTsgLy8gZGVwcmVjYXRlZCBsZWdhY3kgc3VwcG9ydCwgbm90ZTogdGhpcyBmYWlscyBmb3Igb3JkaW5hbCBkb21haW5zCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2NvbG9ycyA9IGQzLmZ1bmN0b3IoY29sb3JTY2FsZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCB0aGUgY29sb3Igc2NhbGUgdG8KICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWJvc3RvY2svZDMvd2lraS9PcmRpbmFsLVNjYWxlcyNvcmRpbmFsIGQzLnNjYWxlLm9yZGluYWx9IHdpdGgKICAgICAqIHJhbmdlIGByYC4KICAgICAqIEBtZXRob2Qgb3JkaW5hbENvbG9ycwogICAgICogQG1lbWJlcm9mIGRjLmNvbG9yTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSByCiAgICAgKiBAcmV0dXJuIHtkYy5jb2xvck1peGlufQogICAgICovCiAgICBfY2hhcnQub3JkaW5hbENvbG9ycyA9IGZ1bmN0aW9uIChyKSB7CiAgICAgICAgcmV0dXJuIF9jaGFydC5jb2xvcnMoZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKHIpKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2V0IHRoZSBjb2xvciBzY2FsZSB0byBhbiBIY2wgaW50ZXJwb2xhdGVkIGxpbmVhciBzY2FsZSB3aXRoIHJhbmdlIGByYC4KICAgICAqIEBtZXRob2QgbGluZWFyQ29sb3JzCiAgICAgKiBAbWVtYmVyb2YgZGMuY29sb3JNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge0FycmF5PE51bWJlcj59IHIKICAgICAqIEByZXR1cm4ge2RjLmNvbG9yTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5saW5lYXJDb2xvcnMgPSBmdW5jdGlvbiAocikgewogICAgICAgIHJldHVybiBfY2hhcnQuY29sb3JzKGQzLnNjYWxlLmxpbmVhcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJhbmdlKHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVycG9sYXRlKGQzLmludGVycG9sYXRlSGNsKSk7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IG9yIHRoZSBnZXQgY29sb3IgYWNjZXNzb3IgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIHRvIG1hcCBhIGRhdGEgcG9pbnQgaW4gYQogICAgICogY3Jvc3NmaWx0ZXIgZ3JvdXAgdG8gYSBjb2xvciB2YWx1ZSBvbiB0aGUgY29sb3Igc2NhbGUuIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHVzZXMgdGhlIGtleQogICAgICogYWNjZXNzb3IuCiAgICAgKiBAbWV0aG9kIGNvbG9yQWNjZXNzb3IKICAgICAqIEBtZW1iZXJvZiBkYy5jb2xvck1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBleGFtcGxlCiAgICAgKiAvLyBkZWZhdWx0IGluZGV4IGJhc2VkIGNvbG9yIGFjY2Vzc29yCiAgICAgKiAuY29sb3JBY2Nlc3NvcihmdW5jdGlvbiAoZCwgaSl7cmV0dXJuIGk7fSkKICAgICAqIC8vIGNvbG9yIGFjY2Vzc29yIGZvciBhIG11bHRpLXZhbHVlIGNyb3NzZmlsdGVyIHJlZHVjdGlvbgogICAgICogLmNvbG9yQWNjZXNzb3IoZnVuY3Rpb24gKGQpe3JldHVybiBkLnZhbHVlLmFic0dhaW47fSkKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb2xvckFjY2Vzc29yXQogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAcmV0dXJuIHtkYy5jb2xvck1peGlufQogICAgICovCiAgICBfY2hhcnQuY29sb3JBY2Nlc3NvciA9IGZ1bmN0aW9uIChjb2xvckFjY2Vzc29yKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfY29sb3JBY2Nlc3NvcjsKICAgICAgICB9CiAgICAgICAgX2NvbG9yQWNjZXNzb3IgPSBjb2xvckFjY2Vzc29yOwogICAgICAgIF9kZWZhdWx0QWNjZXNzb3IgPSBmYWxzZTsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvLyB3aGF0IGlzIHRoaXM/CiAgICBfY2hhcnQuZGVmYXVsdENvbG9yQWNjZXNzb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIF9kZWZhdWx0QWNjZXNzb3I7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IG9yIGdldCB0aGUgY3VycmVudCBkb21haW4gZm9yIHRoZSBjb2xvciBtYXBwaW5nIGZ1bmN0aW9uLiBUaGUgZG9tYWluIG11c3QgYmUgc3VwcGxpZWQgYXMgYW4KICAgICAqIGFycmF5LgogICAgICoKICAgICAqIE5vdGU6IHByZXZpb3VzbHkgdGhpcyBtZXRob2QgYWNjZXB0ZWQgYSBjYWxsYmFjayBmdW5jdGlvbi4gSW5zdGVhZCB5b3UgbWF5IHVzZSBhIGN1c3RvbSBzY2FsZQogICAgICogc2V0IGJ5IHtAbGluayBkYy5jb2xvck1peGluI2NvbG9ycyAuY29sb3JzfS4KICAgICAqIEBtZXRob2QgY29sb3JEb21haW4KICAgICAqIEBtZW1iZXJvZiBkYy5jb2xvck1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gW2RvbWFpbl0KICAgICAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59CiAgICAgKiBAcmV0dXJuIHtkYy5jb2xvck1peGlufQogICAgICovCiAgICBfY2hhcnQuY29sb3JEb21haW4gPSBmdW5jdGlvbiAoZG9tYWluKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfY29sb3JzLmRvbWFpbigpOwogICAgICAgIH0KICAgICAgICBfY29sb3JzLmRvbWFpbihkb21haW4pOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IHRoZSBkb21haW4gYnkgZGV0ZXJtaW5pbmcgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcyBhcyByZXRyaWV2ZWQgYnkKICAgICAqIHtAbGluayBkYy5jb2xvck1peGluI2NvbG9yQWNjZXNzb3IgLmNvbG9yQWNjZXNzb3J9IG92ZXIgdGhlIGNoYXJ0J3MgZGF0YXNldC4KICAgICAqIEBtZXRob2QgY2FsY3VsYXRlQ29sb3JEb21haW4KICAgICAqIEBtZW1iZXJvZiBkYy5jb2xvck1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEByZXR1cm4ge2RjLmNvbG9yTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5jYWxjdWxhdGVDb2xvckRvbWFpbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbmV3RG9tYWluID0gW2QzLm1pbihfY2hhcnQuZGF0YSgpLCBfY2hhcnQuY29sb3JBY2Nlc3NvcigpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGQzLm1heChfY2hhcnQuZGF0YSgpLCBfY2hhcnQuY29sb3JBY2Nlc3NvcigpKV07CiAgICAgICAgX2NvbG9ycy5kb21haW4obmV3RG9tYWluKTsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIEdldCB0aGUgY29sb3IgZm9yIHRoZSBkYXR1bSBkIGFuZCBjb3VudGVyIGkuIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IGNoYXJ0cyB0byByZXRyaWV2ZSBhIGNvbG9yLgogICAgICogQG1ldGhvZCBnZXRDb2xvcgogICAgICogQG1lbWJlcm9mIGRjLmNvbG9yTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHsqfSBkCiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2ldCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgKi8KICAgIF9jaGFydC5nZXRDb2xvciA9IGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgcmV0dXJuIF9jb2xvcnMoX2NvbG9yQWNjZXNzb3IuY2FsbCh0aGlzLCBkLCBpKSk7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IHRoZSBjb2xvciBmb3IgdGhlIGRhdHVtIGQgYW5kIGNvdW50ZXIgaS4gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgY2hhcnRzIHRvIHJldHJpZXZlIGEgY29sb3IuCiAgICAgKiBAbWV0aG9kIGNvbG9yQ2FsY3VsYXRvcgogICAgICogQG1lbWJlcm9mIGRjLmNvbG9yTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHsqfSBbY29sb3JDYWxjdWxhdG9yXQogICAgICogQHJldHVybiB7Kn0KICAgICAqLwogICAgX2NoYXJ0LmNvbG9yQ2FsY3VsYXRvciA9IGZ1bmN0aW9uIChjb2xvckNhbGN1bGF0b3IpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9jaGFydC5nZXRDb2xvcjsKICAgICAgICB9CiAgICAgICAgX2NoYXJ0LmdldENvbG9yID0gY29sb3JDYWxjdWxhdG9yOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIHJldHVybiBfY2hhcnQ7Cn07CgovKioKICogQ29vcmRpbmF0ZSBHcmlkIGlzIGFuIGFic3RyYWN0IGJhc2UgY2hhcnQgZGVzaWduZWQgdG8gc3VwcG9ydCBhIG51bWJlciBvZiBjb29yZGluYXRlIGdyaWQgYmFzZWQKICogY29uY3JldGUgY2hhcnQgdHlwZXMsIGUuZy4gYmFyIGNoYXJ0LCBsaW5lIGNoYXJ0LCBhbmQgYnViYmxlIGNoYXJ0LgogKiBAbmFtZSBjb29yZGluYXRlR3JpZE1peGluCiAqIEBtZW1iZXJvZiBkYwogKiBAbWl4aW4KICogQG1peGVzIGRjLmNvbG9yTWl4aW4KICogQG1peGVzIGRjLm1hcmdpbk1peGluCiAqIEBtaXhlcyBkYy5iYXNlTWl4aW4KICogQHBhcmFtIHtPYmplY3R9IF9jaGFydAogKiBAcmV0dXJuIHtkYy5jb29yZGluYXRlR3JpZE1peGlufQogKi8KZGMuY29vcmRpbmF0ZUdyaWRNaXhpbiA9IGZ1bmN0aW9uIChfY2hhcnQpIHsKICAgIHZhciBHUklEX0xJTkVfQ0xBU1MgPSAnZ3JpZC1saW5lJzsKICAgIHZhciBIT1JJWk9OVEFMX0NMQVNTID0gJ2hvcml6b250YWwnOwogICAgdmFyIFZFUlRJQ0FMX0NMQVNTID0gJ3ZlcnRpY2FsJzsKICAgIHZhciBZX0FYSVNfTEFCRUxfQ0xBU1MgPSAneS1heGlzLWxhYmVsJzsKICAgIHZhciBYX0FYSVNfTEFCRUxfQ0xBU1MgPSAneC1heGlzLWxhYmVsJzsKICAgIHZhciBERUZBVUxUX0FYSVNfTEFCRUxfUEFERElORyA9IDEyOwoKICAgIF9jaGFydCA9IGRjLmNvbG9yTWl4aW4oZGMubWFyZ2luTWl4aW4oZGMuYmFzZU1peGluKF9jaGFydCkpKTsKCiAgICBfY2hhcnQuY29sb3JzKGQzLnNjYWxlLmNhdGVnb3J5MTAoKSk7CiAgICBfY2hhcnQuX21hbmRhdG9yeUF0dHJpYnV0ZXMoKS5wdXNoKCd4Jyk7CgogICAgZnVuY3Rpb24gem9vbUhhbmRsZXIgKCkgewogICAgICAgIF9yZWZvY3VzZWQgPSB0cnVlOwogICAgICAgIGlmIChfem9vbU91dFJlc3RyaWN0KSB7CiAgICAgICAgICAgIF9jaGFydC54KCkuZG9tYWluKGNvbnN0cmFpblJhbmdlKF9jaGFydC54KCkuZG9tYWluKCksIF94T3JpZ2luYWxEb21haW4pKTsKICAgICAgICAgICAgaWYgKF9yYW5nZUNoYXJ0KSB7CiAgICAgICAgICAgICAgICBfY2hhcnQueCgpLmRvbWFpbihjb25zdHJhaW5SYW5nZShfY2hhcnQueCgpLmRvbWFpbigpLCBfcmFuZ2VDaGFydC54KCkuZG9tYWluKCkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIGRvbWFpbiA9IF9jaGFydC54KCkuZG9tYWluKCk7CiAgICAgICAgdmFyIGRvbUZpbHRlciA9IGRjLmZpbHRlcnMuUmFuZ2VkRmlsdGVyKGRvbWFpblswXSwgZG9tYWluWzFdKTsKCiAgICAgICAgX2NoYXJ0LnJlcGxhY2VGaWx0ZXIoZG9tRmlsdGVyKTsKICAgICAgICBfY2hhcnQucmVzY2FsZSgpOwogICAgICAgIF9jaGFydC5yZWRyYXcoKTsKCiAgICAgICAgaWYgKF9yYW5nZUNoYXJ0ICYmICFyYW5nZXNFcXVhbChfY2hhcnQuZmlsdGVyKCksIF9yYW5nZUNoYXJ0LmZpbHRlcigpKSkgewogICAgICAgICAgICBkYy5ldmVudHMudHJpZ2dlcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfcmFuZ2VDaGFydC5yZXBsYWNlRmlsdGVyKGRvbUZpbHRlcik7CiAgICAgICAgICAgICAgICBfcmFuZ2VDaGFydC5yZWRyYXcoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBfY2hhcnQuX2ludm9rZVpvb21lZExpc3RlbmVyKCk7CgogICAgICAgIGRjLmV2ZW50cy50cmlnZ2VyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX2NoYXJ0LnJlZHJhd0dyb3VwKCk7CiAgICAgICAgfSwgZGMuY29uc3RhbnRzLkVWRU5UX0RFTEFZKTsKCiAgICAgICAgX3JlZm9jdXNlZCA9ICFyYW5nZXNFcXVhbChkb21haW4sIF94T3JpZ2luYWxEb21haW4pOwogICAgfQoKICAgIHZhciBfcGFyZW50OwogICAgdmFyIF9nOwogICAgdmFyIF9jaGFydEJvZHlHOwoKICAgIHZhciBfeDsKICAgIHZhciBfeE9yaWdpbmFsRG9tYWluOwogICAgdmFyIF94QXhpcyA9IGQzLnN2Zy5heGlzKCkub3JpZW50KCdib3R0b20nKTsKICAgIHZhciBfeFVuaXRzID0gZGMudW5pdHMuaW50ZWdlcnM7CiAgICB2YXIgX3hBeGlzUGFkZGluZyA9IDA7CiAgICB2YXIgX3hFbGFzdGljaXR5ID0gZmFsc2U7CiAgICB2YXIgX3hBeGlzTGFiZWw7CiAgICB2YXIgX3hBeGlzTGFiZWxQYWRkaW5nID0gMDsKICAgIHZhciBfbGFzdFhEb21haW47CgogICAgdmFyIF95OwogICAgdmFyIF95QXhpcyA9IGQzLnN2Zy5heGlzKCkub3JpZW50KCdsZWZ0Jyk7CiAgICB2YXIgX3lBeGlzUGFkZGluZyA9IDA7CiAgICB2YXIgX3lFbGFzdGljaXR5ID0gZmFsc2U7CiAgICB2YXIgX3lBeGlzTGFiZWw7CiAgICB2YXIgX3lBeGlzTGFiZWxQYWRkaW5nID0gMDsKCiAgICB2YXIgX2JydXNoID0gZDMuc3ZnLmJydXNoKCk7CiAgICB2YXIgX2JydXNoT24gPSB0cnVlOwogICAgdmFyIF9yb3VuZDsKCiAgICB2YXIgX3JlbmRlckhvcml6b250YWxHcmlkTGluZSA9IGZhbHNlOwogICAgdmFyIF9yZW5kZXJWZXJ0aWNhbEdyaWRMaW5lID0gZmFsc2U7CgogICAgdmFyIF9yZWZvY3VzZWQgPSBmYWxzZSwgX3Jlc2l6aW5nID0gZmFsc2U7CiAgICB2YXIgX3VuaXRDb3VudDsKCiAgICB2YXIgX3pvb21TY2FsZSA9IFsxLCBJbmZpbml0eV07CiAgICB2YXIgX3pvb21PdXRSZXN0cmljdCA9IHRydWU7CgogICAgdmFyIF96b29tID0gZDMuYmVoYXZpb3Iuem9vbSgpLm9uKCd6b29tJywgem9vbUhhbmRsZXIpOwogICAgdmFyIF9udWxsWm9vbSA9IGQzLmJlaGF2aW9yLnpvb20oKS5vbignem9vbScsIG51bGwpOwogICAgdmFyIF9oYXNCZWVuTW91c2Vab29tYWJsZSA9IGZhbHNlOwoKICAgIHZhciBfcmFuZ2VDaGFydDsKICAgIHZhciBfZm9jdXNDaGFydDsKCiAgICB2YXIgX21vdXNlWm9vbWFibGUgPSBmYWxzZTsKICAgIHZhciBfY2xpcFBhZGRpbmcgPSAwOwoKICAgIHZhciBfb3V0ZXJSYW5nZUJhbmRQYWRkaW5nID0gMC41OwogICAgdmFyIF9yYW5nZUJhbmRQYWRkaW5nID0gMDsKCiAgICB2YXIgX3VzZVJpZ2h0WUF4aXMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZW4gY2hhbmdpbmcgdGhlIGRvbWFpbiBvZiB0aGUgeCBvciB5IHNjYWxlLCBpdCBpcyBuZWNlc3NhcnkgdG8gdGVsbCB0aGUgY2hhcnQgdG8gcmVjYWxjdWxhdGUKICAgICAqIGFuZCByZWRyYXcgdGhlIGF4ZXMuIChgLnJlc2NhbGUoKWAgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgeCBvciB5IHNjYWxlIGlzIHJlcGxhY2VkCiAgICAgKiB3aXRoIHtAbGluayBkYy5jb29yZGluYXRlR3JpZE1peGluK3ggLngoKX0gb3Ige0BsaW5rIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4jeSAueSgpfSwgYW5kIGhhcwogICAgICogbm8gZWZmZWN0IG9uIGVsYXN0aWMgc2NhbGVzLikKICAgICAqIEBtZXRob2QgcmVzY2FsZQogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnJlc2NhbGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgX3VuaXRDb3VudCA9IHVuZGVmaW5lZDsKICAgICAgICBfcmVzaXppbmcgPSB0cnVlOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIF9jaGFydC5yZXNpemluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX3Jlc2l6aW5nOwogICAgfTsKCiAgICAvKioKICAgICAqIEdldCBvciBzZXQgdGhlIHJhbmdlIHNlbGVjdGlvbiBjaGFydCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZS4gU2V0dGluZyB0aGUgcmFuZ2Ugc2VsZWN0aW9uCiAgICAgKiBjaGFydCB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgaXRzIHNlbGVjdGlvbiBicnVzaCB3aGVuIHRoZSBjdXJyZW50IGNoYXJ0CiAgICAgKiB6b29tcyBpbi4gSW4gcmV0dXJuIHRoZSBnaXZlbiByYW5nZSBjaGFydCB3aWxsIGFsc28gYXV0b21hdGljYWxseSBhdHRhY2ggdGhpcyBjaGFydCBhcyBpdHMgZm9jdXMKICAgICAqIGNoYXJ0IGhlbmNlIHpvb20gaW4gd2hlbiByYW5nZSBicnVzaCB1cGRhdGVzLgogICAgICoKICAgICAqIFVzdWFsbHkgdGhlIHJhbmdlIGFuZCBmb2N1cyBjaGFydHMgd2lsbCBzaGFyZSBhIGRpbWVuc2lvbi4gVGhlIHJhbmdlIGNoYXJ0IHdpbGwgc2V0IHRoZSB6b29tCiAgICAgKiBib3VuZGFyaWVzIGZvciB0aGUgZm9jdXMgY2hhcnQsIHNvIGl0cyBkaW1lbnNpb24gdmFsdWVzIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBkb21haW4gb2YKICAgICAqIHRoZSBmb2N1cyBjaGFydC4KICAgICAqCiAgICAgKiBTZWUgdGhlIFtOYXNkYXEgMTAwIEluZGV4XShodHRwOi8vZGMtanMuZ2l0aHViLmNvbS9kYy5qcy8pIGV4YW1wbGUgZm9yIHRoaXMgZWZmZWN0IGluIGFjdGlvbi4KICAgICAqIEBtZXRob2QgcmFuZ2VDaGFydAogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtkYy5jb29yZGluYXRlR3JpZE1peGlufSBbcmFuZ2VDaGFydF0KICAgICAqIEByZXR1cm4ge2RjLmNvb3JkaW5hdGVHcmlkTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5yYW5nZUNoYXJ0ID0gZnVuY3Rpb24gKHJhbmdlQ2hhcnQpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9yYW5nZUNoYXJ0OwogICAgICAgIH0KICAgICAgICBfcmFuZ2VDaGFydCA9IHJhbmdlQ2hhcnQ7CiAgICAgICAgX3JhbmdlQ2hhcnQuZm9jdXNDaGFydChfY2hhcnQpOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IG9yIHNldCB0aGUgc2NhbGUgZXh0ZW50IGZvciBtb3VzZSB6b29tcy4KICAgICAqIEBtZXRob2Qgem9vbVNjYWxlCiAgICAgKiBAbWVtYmVyb2YgZGMuY29vcmRpbmF0ZUdyaWRNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge0FycmF5PE51bWJlcnxEYXRlPn0gW2V4dGVudD1bMSwgSW5maW5pdHldXQogICAgICogQHJldHVybiB7QXJyYXk8TnVtYmVyfERhdGU+fQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0Lnpvb21TY2FsZSA9IGZ1bmN0aW9uIChleHRlbnQpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF96b29tU2NhbGU7CiAgICAgICAgfQogICAgICAgIF96b29tU2NhbGUgPSBleHRlbnQ7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXQgb3Igc2V0IHRoZSB6b29tIHJlc3RyaWN0aW9uIGZvciB0aGUgY2hhcnQuIElmIHRydWUgbGltaXRzIHRoZSB6b29tIHRvIG9yaWdpb25hbCBkb21haW4gb2YgdGhlIGNoYXJ0LgogICAgICogQG1ldGhvZCB6b29tT3V0UmVzdHJpY3QKICAgICAqIEBtZW1iZXJvZiBkYy5jb29yZGluYXRlR3JpZE1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3pvb21PdXRSZXN0cmljdD10cnVlXQogICAgICogQHJldHVybiB7Qm9vbGVhbn0KICAgICAqIEByZXR1cm4ge2RjLmNvb3JkaW5hdGVHcmlkTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC56b29tT3V0UmVzdHJpY3QgPSBmdW5jdGlvbiAoem9vbU91dFJlc3RyaWN0KSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfem9vbU91dFJlc3RyaWN0OwogICAgICAgIH0KICAgICAgICBfem9vbVNjYWxlWzBdID0gem9vbU91dFJlc3RyaWN0ID8gMSA6IDA7CiAgICAgICAgX3pvb21PdXRSZXN0cmljdCA9IHpvb21PdXRSZXN0cmljdDsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICBfY2hhcnQuX2dlbmVyYXRlRyA9IGZ1bmN0aW9uIChwYXJlbnQpIHsKICAgICAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgX3BhcmVudCA9IF9jaGFydC5zdmcoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfcGFyZW50ID0gcGFyZW50OwogICAgICAgIH0KCiAgICAgICAgdmFyIGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnIycpWzBdOwoKICAgICAgICBfZyA9IF9wYXJlbnQuYXBwZW5kKCdnJyk7CgogICAgICAgIF9jaGFydEJvZHlHID0gX2cuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnY2hhcnQtYm9keScpCiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyBfY2hhcnQubWFyZ2lucygpLmxlZnQgKyAnLCAnICsgX2NoYXJ0Lm1hcmdpbnMoKS50b3AgKyAnKScpCiAgICAgICAgICAgIC5hdHRyKCdjbGlwLXBhdGgnLCAndXJsKCcgKyBocmVmICsgJyMnICsgZ2V0Q2xpcFBhdGhJZCgpICsgJyknKTsKCiAgICAgICAgcmV0dXJuIF9nOwogICAgfTsKCiAgICAvKioKICAgICAqIEdldCBvciBzZXQgdGhlIHJvb3QgZyBlbGVtZW50LiBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5IHVzZWQgdG8gcmV0cmlldmUgdGhlIGcgZWxlbWVudCBpbiBvcmRlciB0bwogICAgICogb3ZlcmxheSBjdXN0b20gc3ZnIGRyYXdpbmcgcHJvZ3JhbWF0aWNhbGx5LiAqKkNhdXRpb24qKjogVGhlIHJvb3QgZyBlbGVtZW50IGlzIHVzdWFsbHkgZ2VuZXJhdGVkCiAgICAgKiBieSBkYy5qcyBpbnRlcm5hbHMsIGFuZCByZXNldHRpbmcgaXQgbWlnaHQgcHJvZHVjZSB1bnByZWRpY3RhYmxlIHJlc3VsdC4KICAgICAqIEBtZXRob2QgZwogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtTVkdFbGVtZW50fSBbZ0VsZW1lbnRdCiAgICAgKiBAcmV0dXJuIHtTVkdFbGVtZW50fQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LmcgPSBmdW5jdGlvbiAoZ0VsZW1lbnQpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9nOwogICAgICAgIH0KICAgICAgICBfZyA9IGdFbGVtZW50OwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IG9yIGdldCBtb3VzZSB6b29tIGNhcGFiaWxpdHkgZmxhZyAoZGVmYXVsdDogZmFsc2UpLiBXaGVuIHR1cm5lZCBvbiB0aGUgY2hhcnQgd2lsbCBiZQogICAgICogem9vbWFibGUgdXNpbmcgdGhlIG1vdXNlIHdoZWVsLiBJZiB0aGUgcmFuZ2Ugc2VsZWN0b3IgY2hhcnQgaXMgYXR0YWNoZWQgem9vbWluZyB3aWxsIGFsc28gdXBkYXRlCiAgICAgKiB0aGUgcmFuZ2Ugc2VsZWN0aW9uIGJydXNoIG9uIHRoZSBhc3NvY2lhdGVkIHJhbmdlIHNlbGVjdG9yIGNoYXJ0LgogICAgICogQG1ldGhvZCBtb3VzZVpvb21hYmxlCiAgICAgKiBAbWVtYmVyb2YgZGMuY29vcmRpbmF0ZUdyaWRNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttb3VzZVpvb21hYmxlPWZhbHNlXQogICAgICogQHJldHVybiB7Qm9vbGVhbn0KICAgICAqIEByZXR1cm4ge2RjLmNvb3JkaW5hdGVHcmlkTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5tb3VzZVpvb21hYmxlID0gZnVuY3Rpb24gKG1vdXNlWm9vbWFibGUpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9tb3VzZVpvb21hYmxlOwogICAgICAgIH0KICAgICAgICBfbW91c2Vab29tYWJsZSA9IG1vdXNlWm9vbWFibGU7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZSB0aGUgc3ZnIGdyb3VwIGZvciB0aGUgY2hhcnQgYm9keS4KICAgICAqIEBtZXRob2QgY2hhcnRCb2R5RwogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtTVkdFbGVtZW50fSBbY2hhcnRCb2R5R10KICAgICAqIEByZXR1cm4ge1NWR0VsZW1lbnR9CiAgICAgKi8KICAgIF9jaGFydC5jaGFydEJvZHlHID0gZnVuY3Rpb24gKGNoYXJ0Qm9keUcpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9jaGFydEJvZHlHOwogICAgICAgIH0KICAgICAgICBfY2hhcnRCb2R5RyA9IGNoYXJ0Qm9keUc7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiAqKm1hbmRhdG9yeSoqCiAgICAgKgogICAgICogR2V0IG9yIHNldCB0aGUgeCBzY2FsZS4gVGhlIHggc2NhbGUgY2FuIGJlIGFueSBkMwogICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tYm9zdG9jay9kMy93aWtpL1F1YW50aXRhdGl2ZS1TY2FsZXMgcXVhbnRpdGl2ZSBzY2FsZX0gb3IKICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWJvc3RvY2svZDMvd2lraS9PcmRpbmFsLVNjYWxlcyBvcmRpbmFsIHNjYWxlfS4KICAgICAqIEBtZXRob2QgeAogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHNlZSB7QGxpbmsgaHR0cDovL2dpdGh1Yi5jb20vbWJvc3RvY2svZDMvd2lraS9TY2FsZXMgZDMuc2NhbGV9CiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gc2V0IHggdG8gYSBsaW5lYXIgc2NhbGUKICAgICAqIGNoYXJ0LngoZDMuc2NhbGUubGluZWFyKCkuZG9tYWluKFstMjUwMCwgMjUwMF0pKQogICAgICogLy8gc2V0IHggdG8gYSB0aW1lIHNjYWxlIHRvIGdlbmVyYXRlIGhpc3RvZ3JhbQogICAgICogY2hhcnQueChkMy50aW1lLnNjYWxlKCkuZG9tYWluKFtuZXcgRGF0ZSgxOTg1LCAwLCAxKSwgbmV3IERhdGUoMjAxMiwgMTEsIDMxKV0pKQogICAgICogQHBhcmFtIHtkMy5zY2FsZX0gW3hTY2FsZV0KICAgICAqIEByZXR1cm4ge2QzLnNjYWxlfQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnggPSBmdW5jdGlvbiAoeFNjYWxlKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfeDsKICAgICAgICB9CiAgICAgICAgX3ggPSB4U2NhbGU7CiAgICAgICAgX3hPcmlnaW5hbERvbWFpbiA9IF94LmRvbWFpbigpOwogICAgICAgIF9jaGFydC5yZXNjYWxlKCk7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgX2NoYXJ0LnhPcmlnaW5hbERvbWFpbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX3hPcmlnaW5hbERvbWFpbjsKICAgIH07CgogICAgLyoqCiAgICAgKiBTZXQgb3IgZ2V0IHRoZSB4VW5pdHMgZnVuY3Rpb24uIFRoZSBjb29yZGluYXRlIGdyaWQgY2hhcnQgdXNlcyB0aGUgeFVuaXRzIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZQogICAgICogdGhlIG51bWJlciBvZiBkYXRhIHByb2plY3Rpb25zIG9uIHggYXhpcyBzdWNoIGFzIHRoZSBudW1iZXIgb2YgYmFycyBmb3IgYSBiYXIgY2hhcnQgb3IgdGhlCiAgICAgKiBudW1iZXIgb2YgZG90cyBmb3IgYSBsaW5lIGNoYXJ0LiBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIEphdmFzY3JpcHQgYXJyYXkgb2YgYWxsCiAgICAgKiBkYXRhIHBvaW50cyBvbiB4IGF4aXMsIG9yIHRoZSBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBheGlzLiBbZDMgdGltZSByYW5nZSBmdW5jdGlvbnMKICAgICAqIGQzLnRpbWUuZGF5cywgZDMudGltZS5tb250aHMsIGFuZAogICAgICogZDMudGltZS55ZWFyc10oaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvVGltZS1JbnRlcnZhbHMjYWxpYXNlcykgYXJlIGFsbCB2YWxpZCB4VW5pdHMKICAgICAqIGZ1bmN0aW9uLiBkYy5qcyBhbHNvIHByb3ZpZGVzIGEgZmV3IHVuaXRzIGZ1bmN0aW9uLCBzZWUgdGhlIHtAbGluayBkYy51dGlscyBVdGlsaXRpZXN9IHNlY3Rpb24gZm9yCiAgICAgKiBhIGxpc3Qgb2YgYnVpbHQtaW4gdW5pdHMgZnVuY3Rpb25zLiBUaGUgZGVmYXVsdCB4VW5pdHMgZnVuY3Rpb24gaXMgZGMudW5pdHMuaW50ZWdlcnMuCiAgICAgKiBAbWV0aG9kIHhVbml0cwogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHRvZG8gQWRkIGRvY3MgZm9yIHV0aWxpdGllcwogICAgICogQGV4YW1wbGUKICAgICAqIC8vIHNldCB4IHVuaXRzIHRvIGNvdW50IGRheXMKICAgICAqIGNoYXJ0LnhVbml0cyhkMy50aW1lLmRheXMpOwogICAgICogLy8gc2V0IHggdW5pdHMgdG8gY291bnQgbW9udGhzCiAgICAgKiBjaGFydC54VW5pdHMoZDMudGltZS5tb250aHMpOwogICAgICoKICAgICAqIC8vIEEgY3VzdG9tIHhVbml0cyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIGl0IGZvbGxvd3MgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2U6CiAgICAgKiAvLyB1bml0cyBpbiBpbnRlZ2VyCiAgICAgKiBmdW5jdGlvbihzdGFydCwgZW5kLCB4RG9tYWluKSB7CiAgICAgKiAgICAgIC8vIHNpbXBseSBjYWxjdWxhdGVzIGhvdyBtYW55IGludGVnZXJzIGluIHRoZSBkb21haW4KICAgICAqICAgICAgcmV0dXJuIE1hdGguYWJzKGVuZCAtIHN0YXJ0KTsKICAgICAqIH07CiAgICAgKgogICAgICogLy8gZml4ZWQgdW5pdHMKICAgICAqIGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHhEb21haW4pIHsKICAgICAqICAgICAgLy8gYmUgYXdhcmUgdXNpbmcgZml4ZWQgdW5pdHMgd2lsbCBkaXNhYmxlIHRoZSBmb2N1cy96b29tIGFiaWxpdHkgb24gdGhlIGNoYXJ0CiAgICAgKiAgICAgIHJldHVybiAxMDAwOwogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3hVbml0c10KICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnhVbml0cyA9IGZ1bmN0aW9uICh4VW5pdHMpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF94VW5pdHM7CiAgICAgICAgfQogICAgICAgIF94VW5pdHMgPSB4VW5pdHM7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBTZXQgb3IgZ2V0IHRoZSB4IGF4aXMgdXNlZCBieSBhIHBhcnRpY3VsYXIgY29vcmRpbmF0ZSBncmlkIGNoYXJ0IGluc3RhbmNlLiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3QKICAgICAqIHVzZWZ1bCB3aGVuIHggYXhpcyBjdXN0b21pemF0aW9uIGlzIHJlcXVpcmVkLiBUaGUgeCBheGlzIGluIGRjLmpzIGlzIGFuIGluc3RhbmNlIG9mIGEgW2QzCiAgICAgKiBheGlzIG9iamVjdF0oaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvU1ZHLUF4ZXMjd2lraS1heGlzKTsgdGhlcmVmb3JlIGl0IHN1cHBvcnRzIGFueQogICAgICogdmFsaWQgZDMgYXhpcyBtYW5pcHVsYXRpb24uICoqQ2F1dGlvbioqOiBUaGUgeCBheGlzIGlzIHVzdWFsbHkgZ2VuZXJhdGVkIGludGVybmFsbHkgYnkgZGM7CiAgICAgKiByZXNldHRpbmcgaXQgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgcmVzdWx0cy4KICAgICAqIEBtZXRob2QgeEF4aXMKICAgICAqIEBtZW1iZXJvZiBkYy5jb29yZGluYXRlR3JpZE1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBzZWUge0BsaW5rIGh0dHA6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvU1ZHLUF4ZXMgZDMuc3ZnLmF4aXN9CiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gY3VzdG9taXplIHggYXhpcyB0aWNrIGZvcm1hdAogICAgICogY2hhcnQueEF4aXMoKS50aWNrRm9ybWF0KGZ1bmN0aW9uKHYpIHtyZXR1cm4gdiArICclJzt9KTsKICAgICAqIC8vIGN1c3RvbWl6ZSB4IGF4aXMgdGljayB2YWx1ZXMKICAgICAqIGNoYXJ0LnhBeGlzKCkudGlja1ZhbHVlcyhbMCwgMTAwLCAyMDAsIDMwMF0pOwogICAgICogQHBhcmFtIHtkMy5zdmcuYXhpc30gW3hBeGlzPWQzLnN2Zy5heGlzKCkub3JpZW50KCdib3R0b20nKV0KICAgICAqIEByZXR1cm4ge2QzLnN2Zy5heGlzfQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnhBeGlzID0gZnVuY3Rpb24gKHhBeGlzKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfeEF4aXM7CiAgICAgICAgfQogICAgICAgIF94QXhpcyA9IHhBeGlzOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogVHVybiBvbi9vZmYgZWxhc3RpYyB4IGF4aXMgYmVoYXZpb3IuIElmIHggYXhpcyBlbGFzdGljaXR5IGlzIHR1cm5lZCBvbiwgdGhlbiB0aGUgZ3JpZCBjaGFydCB3aWxsCiAgICAgKiBhdHRlbXB0IHRvIHJlY2FsY3VsYXRlIHRoZSB4IGF4aXMgcmFuZ2Ugd2hlbmV2ZXIgYSByZWRyYXcgZXZlbnQgaXMgdHJpZ2dlcmVkLgogICAgICogQG1ldGhvZCBlbGFzdGljWAogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtCb29sZWFufSBbZWxhc3RpY1g9ZmFsc2VdCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LmVsYXN0aWNYID0gZnVuY3Rpb24gKGVsYXN0aWNYKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfeEVsYXN0aWNpdHk7CiAgICAgICAgfQogICAgICAgIF94RWxhc3RpY2l0eSA9IGVsYXN0aWNYOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IG9yIGdldCB4IGF4aXMgcGFkZGluZyBmb3IgdGhlIGVsYXN0aWMgeCBheGlzLiBUaGUgcGFkZGluZyB3aWxsIGJlIGFkZGVkIHRvIGJvdGggZW5kIG9mIHRoZSB4CiAgICAgKiBheGlzIGlmIGVsYXN0aWNYIGlzIHR1cm5lZCBvbjsgb3RoZXJ3aXNlIGl0IGlzIGlnbm9yZWQuCiAgICAgKgogICAgICogcGFkZGluZyBjYW4gYmUgYW4gaW50ZWdlciBvciBwZXJjZW50YWdlIGluIHN0cmluZyAoZS5nLiAnMTAlJykuIFBhZGRpbmcgY2FuIGJlIGFwcGxpZWQgdG8KICAgICAqIG51bWJlciBvciBkYXRlIHggYXhlcy4gIFdoZW4gcGFkZGluZyBhIGRhdGUgYXhpcywgYW4gaW50ZWdlciByZXByZXNlbnRzIG51bWJlciBvZiBkYXlzIGJlaW5nIHBhZGRlZAogICAgICogYW5kIGEgcGVyY2VudGFnZSBzdHJpbmcgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGludGVnZXIuCiAgICAgKiBAbWV0aG9kIHhBeGlzUGFkZGluZwogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBbcGFkZGluZz0wXQogICAgICogQHJldHVybiB7TnVtYmVyfFN0cmluZ30KICAgICAqIEByZXR1cm4ge2RjLmNvb3JkaW5hdGVHcmlkTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC54QXhpc1BhZGRpbmcgPSBmdW5jdGlvbiAocGFkZGluZykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX3hBeGlzUGFkZGluZzsKICAgICAgICB9CiAgICAgICAgX3hBeGlzUGFkZGluZyA9IHBhZGRpbmc7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5pdHMgZGlzcGxheWVkIG9uIHRoZSB4IGF4aXMgdXNpbmcgdGhlIHVuaXQgbWVhc3VyZSBjb25maWd1cmVkIGJ5CiAgICAgKiAueFVuaXRzLgogICAgICogQG1ldGhvZCB4VW5pdENvdW50CiAgICAgKiBAbWVtYmVyb2YgZGMuY29vcmRpbmF0ZUdyaWRNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9CiAgICAgKi8KICAgIF9jaGFydC54VW5pdENvdW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChfdW5pdENvdW50ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgdmFyIHVuaXRzID0gX2NoYXJ0LnhVbml0cygpKF9jaGFydC54KCkuZG9tYWluKClbMF0sIF9jaGFydC54KCkuZG9tYWluKClbMV0sIF9jaGFydC54KCkuZG9tYWluKCkpOwoKICAgICAgICAgICAgaWYgKHVuaXRzIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIF91bml0Q291bnQgPSB1bml0cy5sZW5ndGg7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfdW5pdENvdW50ID0gdW5pdHM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBfdW5pdENvdW50OwogICAgfTsKCiAgICAvKioKICAgICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRoZSBjaGFydCBzaG91bGQgYmUgZHJhd24gd2l0aCBhIHJpZ2h0IGF4aXMgaW5zdGVhZCBvZiBhIGxlZnQgYXhpcy4gV2hlbgogICAgICogdXNlZCB3aXRoIGEgY2hhcnQgaW4gYSBjb21wb3NpdGUgY2hhcnQsIGFsbG93cyBib3RoIGxlZnQgYW5kIHJpZ2h0IFkgYXhlcyB0byBiZSBzaG93biBvbiBhCiAgICAgKiBjaGFydC4KICAgICAqIEBtZXRob2QgdXNlUmlnaHRZQXhpcwogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtCb29sZWFufSBbdXNlUmlnaHRZQXhpcz1mYWxzZV0KICAgICAqIEByZXR1cm4ge0Jvb2xlYW59CiAgICAgKiBAcmV0dXJuIHtkYy5jb29yZGluYXRlR3JpZE1peGlufQogICAgICovCiAgICBfY2hhcnQudXNlUmlnaHRZQXhpcyA9IGZ1bmN0aW9uICh1c2VSaWdodFlBeGlzKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfdXNlUmlnaHRZQXhpczsKICAgICAgICB9CiAgICAgICAgX3VzZVJpZ2h0WUF4aXMgPSB1c2VSaWdodFlBeGlzOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjaGFydCBpcyB1c2luZyBvcmRpbmFsIHhVbml0cyAoe0BsaW5rIGRjLnVuaXRzLm9yZGluYWwgZGMudW5pdHMub3JkaW5hbH0sIG9yIGZhbHNlCiAgICAgKiBvdGhlcndpc2UuIE1vc3QgY2hhcnRzIGJlaGF2ZSBkaWZmZXJlbnRseSB3aXRoIG9yZGluYWwgZGF0YSBhbmQgdXNlIHRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgdG8KICAgICAqIHRyaWdnZXIgdGhlIGFwcHJvcHJpYXRlIGxvZ2ljLgogICAgICogQG1ldGhvZCBpc09yZGluYWwKICAgICAqIEBtZW1iZXJvZiBkYy5jb29yZGluYXRlR3JpZE1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEByZXR1cm4ge0Jvb2xlYW59CiAgICAgKi8KICAgIF9jaGFydC5pc09yZGluYWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIF9jaGFydC54VW5pdHMoKSA9PT0gZGMudW5pdHMub3JkaW5hbDsKICAgIH07CgogICAgX2NoYXJ0Ll91c2VPdXRlclBhZGRpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwoKICAgIF9jaGFydC5fb3JkaW5hbFhEb21haW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGdyb3VwcyA9IF9jaGFydC5fY29tcHV0ZU9yZGVyZWRHcm91cHMoX2NoYXJ0LmRhdGEoKSk7CiAgICAgICAgcmV0dXJuIGdyb3Vwcy5tYXAoX2NoYXJ0LmtleUFjY2Vzc29yKCkpOwogICAgfTsKCiAgICBmdW5jdGlvbiBjb21wYXJlRG9tYWlucyAoZDEsIGQyKSB7CiAgICAgICAgcmV0dXJuICFkMSB8fCAhZDIgfHwgZDEubGVuZ3RoICE9PSBkMi5sZW5ndGggfHwKICAgICAgICAgICAgZDEuc29tZShmdW5jdGlvbiAoZWxlbSwgaSkgeyByZXR1cm4gKGVsZW0gJiYgZDJbaV0pID8gZWxlbS50b1N0cmluZygpICE9PSBkMltpXS50b1N0cmluZygpIDogZWxlbSA9PT0gZDJbaV07IH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHByZXBhcmVYQXhpcyAoZywgcmVuZGVyKSB7CiAgICAgICAgaWYgKCFfY2hhcnQuaXNPcmRpbmFsKCkpIHsKICAgICAgICAgICAgaWYgKF9jaGFydC5lbGFzdGljWCgpKSB7CiAgICAgICAgICAgICAgICBfeC5kb21haW4oW19jaGFydC54QXhpc01pbigpLCBfY2hhcnQueEF4aXNNYXgoKV0pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsgLy8gX2NoYXJ0LmlzT3JkaW5hbCgpCiAgICAgICAgICAgIGlmIChfY2hhcnQuZWxhc3RpY1goKSB8fCBfeC5kb21haW4oKS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIF94LmRvbWFpbihfY2hhcnQuX29yZGluYWxYRG9tYWluKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBoYXMgdGhlIGRvbWFpbiBjaGFuZ2VkPwogICAgICAgIHZhciB4ZG9tID0gX3guZG9tYWluKCk7CiAgICAgICAgaWYgKHJlbmRlciB8fCBjb21wYXJlRG9tYWlucyhfbGFzdFhEb21haW4sIHhkb20pKSB7CiAgICAgICAgICAgIF9jaGFydC5yZXNjYWxlKCk7CiAgICAgICAgfQogICAgICAgIF9sYXN0WERvbWFpbiA9IHhkb207CgogICAgICAgIC8vIHBsZWFzZSBjYW4ndCB3ZSBhbHdheXMgdXNlIHJhbmdlQmFuZHMgZm9yIGJhciBjaGFydHM/CiAgICAgICAgaWYgKF9jaGFydC5pc09yZGluYWwoKSkgewogICAgICAgICAgICBfeC5yYW5nZUJhbmRzKFswLCBfY2hhcnQueEF4aXNMZW5ndGgoKV0sIF9yYW5nZUJhbmRQYWRkaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGFydC5fdXNlT3V0ZXJQYWRkaW5nKCkgPyBfb3V0ZXJSYW5nZUJhbmRQYWRkaW5nIDogMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3gucmFuZ2UoWzAsIF9jaGFydC54QXhpc0xlbmd0aCgpXSk7CiAgICAgICAgfQoKICAgICAgICBfeEF4aXMgPSBfeEF4aXMuc2NhbGUoX2NoYXJ0LngoKSk7CgogICAgICAgIHJlbmRlclZlcnRpY2FsR3JpZExpbmVzKGcpOwogICAgfQoKICAgIF9jaGFydC5yZW5kZXJYQXhpcyA9IGZ1bmN0aW9uIChnKSB7CiAgICAgICAgdmFyIGF4aXNYRyA9IGcuc2VsZWN0QWxsKCdnLngnKTsKCiAgICAgICAgaWYgKGF4aXNYRy5lbXB0eSgpKSB7CiAgICAgICAgICAgIGF4aXNYRyA9IGcuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheGlzIHgnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIF9jaGFydC5tYXJnaW5zKCkubGVmdCArICcsJyArIF9jaGFydC5feEF4aXNZKCkgKyAnKScpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGF4aXNYTGFiID0gZy5zZWxlY3RBbGwoJ3RleHQuJyArIFhfQVhJU19MQUJFTF9DTEFTUyk7CiAgICAgICAgaWYgKGF4aXNYTGFiLmVtcHR5KCkgJiYgX2NoYXJ0LnhBeGlzTGFiZWwoKSkgewogICAgICAgICAgICBheGlzWExhYiA9IGcuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIFhfQVhJU19MQUJFTF9DTEFTUykKICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAoX2NoYXJ0Lm1hcmdpbnMoKS5sZWZ0ICsgX2NoYXJ0LnhBeGlzTGVuZ3RoKCkgLyAyKSArICcsJyArCiAgICAgICAgICAgICAgICAgICAgICAoX2NoYXJ0LmhlaWdodCgpIC0gX3hBeGlzTGFiZWxQYWRkaW5nKSArICcpJykKICAgICAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTsKICAgICAgICB9CiAgICAgICAgaWYgKF9jaGFydC54QXhpc0xhYmVsKCkgJiYgYXhpc1hMYWIudGV4dCgpICE9PSBfY2hhcnQueEF4aXNMYWJlbCgpKSB7CiAgICAgICAgICAgIGF4aXNYTGFiLnRleHQoX2NoYXJ0LnhBeGlzTGFiZWwoKSk7CiAgICAgICAgfQoKICAgICAgICBkYy50cmFuc2l0aW9uKGF4aXNYRywgX2NoYXJ0LnRyYW5zaXRpb25EdXJhdGlvbigpKQogICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgX2NoYXJ0Lm1hcmdpbnMoKS5sZWZ0ICsgJywnICsgX2NoYXJ0Ll94QXhpc1koKSArICcpJykKICAgICAgICAgICAgLmNhbGwoX3hBeGlzKTsKICAgICAgICBkYy50cmFuc2l0aW9uKGF4aXNYTGFiLCBfY2hhcnQudHJhbnNpdGlvbkR1cmF0aW9uKCkpCiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAoX2NoYXJ0Lm1hcmdpbnMoKS5sZWZ0ICsgX2NoYXJ0LnhBeGlzTGVuZ3RoKCkgLyAyKSArICcsJyArCiAgICAgICAgICAgICAgICAgIChfY2hhcnQuaGVpZ2h0KCkgLSBfeEF4aXNMYWJlbFBhZGRpbmcpICsgJyknKTsKICAgIH07CgogICAgZnVuY3Rpb24gcmVuZGVyVmVydGljYWxHcmlkTGluZXMgKGcpIHsKICAgICAgICB2YXIgZ3JpZExpbmVHID0gZy5zZWxlY3RBbGwoJ2cuJyArIFZFUlRJQ0FMX0NMQVNTKTsKCiAgICAgICAgaWYgKF9yZW5kZXJWZXJ0aWNhbEdyaWRMaW5lKSB7CiAgICAgICAgICAgIGlmIChncmlkTGluZUcuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgZ3JpZExpbmVHID0gZy5pbnNlcnQoJ2cnLCAnOmZpcnN0LWNoaWxkJykKICAgICAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCBHUklEX0xJTkVfQ0xBU1MgKyAnICcgKyBWRVJUSUNBTF9DTEFTUykKICAgICAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgX2NoYXJ0Lm1hcmdpbnMoKS5sZWZ0ICsgJywnICsgX2NoYXJ0Lm1hcmdpbnMoKS50b3AgKyAnKScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdGlja3MgPSBfeEF4aXMudGlja1ZhbHVlcygpID8gX3hBeGlzLnRpY2tWYWx1ZXMoKSA6CiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBfeC50aWNrcyA9PT0gJ2Z1bmN0aW9uJyA/IF94LnRpY2tzKF94QXhpcy50aWNrcygpWzBdKSA6IF94LmRvbWFpbigpKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGdyaWRMaW5lRy5zZWxlY3RBbGwoJ2xpbmUnKQogICAgICAgICAgICAgICAgLmRhdGEodGlja3MpOwoKICAgICAgICAgICAgLy8gZW50ZXIKICAgICAgICAgICAgdmFyIGxpbmVzR0VudGVyID0gbGluZXMuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgnbGluZScpCiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfeChkKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCBfY2hhcnQuX3hBeGlzWSgpIC0gX2NoYXJ0Lm1hcmdpbnMoKS50b3ApCiAgICAgICAgICAgICAgICAuYXR0cigneDInLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfeChkKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuYXR0cigneTInLCAwKQogICAgICAgICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAwKTsKICAgICAgICAgICAgZGMudHJhbnNpdGlvbihsaW5lc0dFbnRlciwgX2NoYXJ0LnRyYW5zaXRpb25EdXJhdGlvbigpKQogICAgICAgICAgICAgICAgLmF0dHIoJ29wYWNpdHknLCAxKTsKCiAgICAgICAgICAgIC8vIHVwZGF0ZQogICAgICAgICAgICBkYy50cmFuc2l0aW9uKGxpbmVzLCBfY2hhcnQudHJhbnNpdGlvbkR1cmF0aW9uKCkpCiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfeChkKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCBfY2hhcnQuX3hBeGlzWSgpIC0gX2NoYXJ0Lm1hcmdpbnMoKS50b3ApCiAgICAgICAgICAgICAgICAuYXR0cigneDInLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfeChkKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuYXR0cigneTInLCAwKTsKCiAgICAgICAgICAgIC8vIGV4aXQKICAgICAgICAgICAgbGluZXMuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdyaWRMaW5lRy5zZWxlY3RBbGwoJ2xpbmUnKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICB9CgogICAgX2NoYXJ0Ll94QXhpc1kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIChfY2hhcnQuaGVpZ2h0KCkgLSBfY2hhcnQubWFyZ2lucygpLmJvdHRvbSk7CiAgICB9OwoKICAgIF9jaGFydC54QXhpc0xlbmd0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX2NoYXJ0LmVmZmVjdGl2ZVdpZHRoKCk7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0IG9yIGdldCB0aGUgeCBheGlzIGxhYmVsLiBJZiBzZXR0aW5nIHRoZSBsYWJlbCwgeW91IG1heSBvcHRpb25hbGx5IGluY2x1ZGUgYWRkaXRpb25hbCBwYWRkaW5nIHRvCiAgICAgKiB0aGUgbWFyZ2luIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGxhYmVsLiBCeSBkZWZhdWx0IHRoZSBwYWRkZWQgaXMgc2V0IHRvIDEyIHRvIGFjY29tb2RhdGUgdGhlIHRleHQgaGVpZ2h0LgogICAgICogQG1ldGhvZCB4QXhpc0xhYmVsCiAgICAgKiBAbWVtYmVyb2YgZGMuY29vcmRpbmF0ZUdyaWRNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW2xhYmVsVGV4dF0KICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFkZGluZz0xMl0KICAgICAqIEByZXR1cm4ge1N0cmluZ30KICAgICAqLwogICAgX2NoYXJ0LnhBeGlzTGFiZWwgPSBmdW5jdGlvbiAobGFiZWxUZXh0LCBwYWRkaW5nKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfeEF4aXNMYWJlbDsKICAgICAgICB9CiAgICAgICAgX3hBeGlzTGFiZWwgPSBsYWJlbFRleHQ7CiAgICAgICAgX2NoYXJ0Lm1hcmdpbnMoKS5ib3R0b20gLT0gX3hBeGlzTGFiZWxQYWRkaW5nOwogICAgICAgIF94QXhpc0xhYmVsUGFkZGluZyA9IChwYWRkaW5nID09PSB1bmRlZmluZWQpID8gREVGQVVMVF9BWElTX0xBQkVMX1BBRERJTkcgOiBwYWRkaW5nOwogICAgICAgIF9jaGFydC5tYXJnaW5zKCkuYm90dG9tICs9IF94QXhpc0xhYmVsUGFkZGluZzsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICBfY2hhcnQuX3ByZXBhcmVZQXhpcyA9IGZ1bmN0aW9uIChnKSB7CiAgICAgICAgaWYgKF95ID09PSB1bmRlZmluZWQgfHwgX2NoYXJ0LmVsYXN0aWNZKCkpIHsKICAgICAgICAgICAgaWYgKF95ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIF95ID0gZDMuc2NhbGUubGluZWFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG1pbiA9IF9jaGFydC55QXhpc01pbigpIHx8IDAsCiAgICAgICAgICAgICAgICBtYXggPSBfY2hhcnQueUF4aXNNYXgoKSB8fCAwOwogICAgICAgICAgICBfeS5kb21haW4oW21pbiwgbWF4XSkucmFuZ2VSb3VuZChbX2NoYXJ0LnlBeGlzSGVpZ2h0KCksIDBdKTsKICAgICAgICB9CgogICAgICAgIF95LnJhbmdlKFtfY2hhcnQueUF4aXNIZWlnaHQoKSwgMF0pOwogICAgICAgIF95QXhpcyA9IF95QXhpcy5zY2FsZShfeSk7CgogICAgICAgIGlmIChfdXNlUmlnaHRZQXhpcykgewogICAgICAgICAgICBfeUF4aXMub3JpZW50KCdyaWdodCcpOwogICAgICAgIH0KCiAgICAgICAgX2NoYXJ0Ll9yZW5kZXJIb3Jpem9udGFsR3JpZExpbmVzRm9yQXhpcyhnLCBfeSwgX3lBeGlzKTsKICAgIH07CgogICAgX2NoYXJ0LnJlbmRlcllBeGlzTGFiZWwgPSBmdW5jdGlvbiAoYXhpc0NsYXNzLCB0ZXh0LCByb3RhdGlvbiwgbGFiZWxYUG9zaXRpb24pIHsKICAgICAgICBsYWJlbFhQb3NpdGlvbiA9IGxhYmVsWFBvc2l0aW9uIHx8IF95QXhpc0xhYmVsUGFkZGluZzsKCiAgICAgICAgdmFyIGF4aXNZTGFiID0gX2NoYXJ0LmcoKS5zZWxlY3RBbGwoJ3RleHQuJyArIFlfQVhJU19MQUJFTF9DTEFTUyArICcuJyArIGF4aXNDbGFzcyArICctbGFiZWwnKTsKICAgICAgICB2YXIgbGFiZWxZUG9zaXRpb24gPSAoX2NoYXJ0Lm1hcmdpbnMoKS50b3AgKyBfY2hhcnQueUF4aXNIZWlnaHQoKSAvIDIpOwogICAgICAgIGlmIChheGlzWUxhYi5lbXB0eSgpICYmIHRleHQpIHsKICAgICAgICAgICAgYXhpc1lMYWIgPSBfY2hhcnQuZygpLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgbGFiZWxYUG9zaXRpb24gKyAnLCcgKyBsYWJlbFlQb3NpdGlvbiArICcpLHJvdGF0ZSgnICsgcm90YXRpb24gKyAnKScpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCBZX0FYSVNfTEFCRUxfQ0xBU1MgKyAnICcgKyBheGlzQ2xhc3MgKyAnLWxhYmVsJykKICAgICAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKQogICAgICAgICAgICAgICAgLnRleHQodGV4dCk7CiAgICAgICAgfQogICAgICAgIGlmICh0ZXh0ICYmIGF4aXNZTGFiLnRleHQoKSAhPT0gdGV4dCkgewogICAgICAgICAgICBheGlzWUxhYi50ZXh0KHRleHQpOwogICAgICAgIH0KICAgICAgICBkYy50cmFuc2l0aW9uKGF4aXNZTGFiLCBfY2hhcnQudHJhbnNpdGlvbkR1cmF0aW9uKCkpCiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyBsYWJlbFhQb3NpdGlvbiArICcsJyArIGxhYmVsWVBvc2l0aW9uICsgJykscm90YXRlKCcgKyByb3RhdGlvbiArICcpJyk7CiAgICB9OwoKICAgIF9jaGFydC5yZW5kZXJZQXhpc0F0ID0gZnVuY3Rpb24gKGF4aXNDbGFzcywgYXhpcywgcG9zaXRpb24pIHsKICAgICAgICB2YXIgYXhpc1lHID0gX2NoYXJ0LmcoKS5zZWxlY3RBbGwoJ2cuJyArIGF4aXNDbGFzcyk7CiAgICAgICAgaWYgKGF4aXNZRy5lbXB0eSgpKSB7CiAgICAgICAgICAgIGF4aXNZRyA9IF9jaGFydC5nKCkuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheGlzICcgKyBheGlzQ2xhc3MpCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgcG9zaXRpb24gKyAnLCcgKyBfY2hhcnQubWFyZ2lucygpLnRvcCArICcpJyk7CiAgICAgICAgfQoKICAgICAgICBkYy50cmFuc2l0aW9uKGF4aXNZRywgX2NoYXJ0LnRyYW5zaXRpb25EdXJhdGlvbigpKQogICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgcG9zaXRpb24gKyAnLCcgKyBfY2hhcnQubWFyZ2lucygpLnRvcCArICcpJykKICAgICAgICAgICAgLmNhbGwoYXhpcyk7CiAgICB9OwoKICAgIF9jaGFydC5yZW5kZXJZQXhpcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgYXhpc1Bvc2l0aW9uID0gX3VzZVJpZ2h0WUF4aXMgPyAoX2NoYXJ0LndpZHRoKCkgLSBfY2hhcnQubWFyZ2lucygpLnJpZ2h0KSA6IF9jaGFydC5feUF4aXNYKCk7CiAgICAgICAgX2NoYXJ0LnJlbmRlcllBeGlzQXQoJ3knLCBfeUF4aXMsIGF4aXNQb3NpdGlvbik7CiAgICAgICAgdmFyIGxhYmVsUG9zaXRpb24gPSBfdXNlUmlnaHRZQXhpcyA/IChfY2hhcnQud2lkdGgoKSAtIF95QXhpc0xhYmVsUGFkZGluZykgOiBfeUF4aXNMYWJlbFBhZGRpbmc7CiAgICAgICAgdmFyIHJvdGF0aW9uID0gX3VzZVJpZ2h0WUF4aXMgPyA5MCA6IC05MDsKICAgICAgICBfY2hhcnQucmVuZGVyWUF4aXNMYWJlbCgneScsIF9jaGFydC55QXhpc0xhYmVsKCksIHJvdGF0aW9uLCBsYWJlbFBvc2l0aW9uKTsKICAgIH07CgogICAgX2NoYXJ0Ll9yZW5kZXJIb3Jpem9udGFsR3JpZExpbmVzRm9yQXhpcyA9IGZ1bmN0aW9uIChnLCBzY2FsZSwgYXhpcykgewogICAgICAgIHZhciBncmlkTGluZUcgPSBnLnNlbGVjdEFsbCgnZy4nICsgSE9SSVpPTlRBTF9DTEFTUyk7CgogICAgICAgIGlmIChfcmVuZGVySG9yaXpvbnRhbEdyaWRMaW5lKSB7CiAgICAgICAgICAgIHZhciB0aWNrcyA9IGF4aXMudGlja1ZhbHVlcygpID8gYXhpcy50aWNrVmFsdWVzKCkgOiBzY2FsZS50aWNrcyhheGlzLnRpY2tzKClbMF0pOwoKICAgICAgICAgICAgaWYgKGdyaWRMaW5lRy5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICBncmlkTGluZUcgPSBnLmluc2VydCgnZycsICc6Zmlyc3QtY2hpbGQnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIEdSSURfTElORV9DTEFTUyArICcgJyArIEhPUklaT05UQUxfQ0xBU1MpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIF9jaGFydC5tYXJnaW5zKCkubGVmdCArICcsJyArIF9jaGFydC5tYXJnaW5zKCkudG9wICsgJyknKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGxpbmVzID0gZ3JpZExpbmVHLnNlbGVjdEFsbCgnbGluZScpCiAgICAgICAgICAgICAgICAuZGF0YSh0aWNrcyk7CgogICAgICAgICAgICAvLyBlbnRlcgogICAgICAgICAgICB2YXIgbGluZXNHRW50ZXIgPSBsaW5lcy5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdsaW5lJykKICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIDEpCiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzY2FsZShkKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuYXR0cigneDInLCBfY2hhcnQueEF4aXNMZW5ndGgoKSkKICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjYWxlKGQpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMCk7CiAgICAgICAgICAgIGRjLnRyYW5zaXRpb24obGluZXNHRW50ZXIsIF9jaGFydC50cmFuc2l0aW9uRHVyYXRpb24oKSkKICAgICAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMSk7CgogICAgICAgICAgICAvLyB1cGRhdGUKICAgICAgICAgICAgZGMudHJhbnNpdGlvbihsaW5lcywgX2NoYXJ0LnRyYW5zaXRpb25EdXJhdGlvbigpKQogICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgMSkKICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjYWxlKGQpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIF9jaGFydC54QXhpc0xlbmd0aCgpKQogICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NhbGUoZCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGV4aXQKICAgICAgICAgICAgbGluZXMuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdyaWRMaW5lRy5zZWxlY3RBbGwoJ2xpbmUnKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICB9OwoKICAgIF9jaGFydC5feUF4aXNYID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBfY2hhcnQudXNlUmlnaHRZQXhpcygpID8gX2NoYXJ0LndpZHRoKCkgLSBfY2hhcnQubWFyZ2lucygpLnJpZ2h0IDogX2NoYXJ0Lm1hcmdpbnMoKS5sZWZ0OwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCBvciBnZXQgdGhlIHkgYXhpcyBsYWJlbC4gSWYgc2V0dGluZyB0aGUgbGFiZWwsIHlvdSBtYXkgb3B0aW9uYWxseSBpbmNsdWRlIGFkZGl0aW9uYWwgcGFkZGluZwogICAgICogdG8gdGhlIG1hcmdpbiB0byBtYWtlIHJvb20gZm9yIHRoZSBsYWJlbC4gQnkgZGVmYXVsdCB0aGUgcGFkZGVkIGlzIHNldCB0byAxMiB0byBhY2NvbW9kYXRlIHRoZQogICAgICogdGV4dCBoZWlnaHQuCiAgICAgKiBAbWV0aG9kIHlBeGlzTGFiZWwKICAgICAqIEBtZW1iZXJvZiBkYy5jb29yZGluYXRlR3JpZE1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbbGFiZWxUZXh0XQogICAgICogQHBhcmFtIHtOdW1iZXJ9IFtwYWRkaW5nPTEyXQogICAgICogQHJldHVybiB7U3RyaW5nfQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnlBeGlzTGFiZWwgPSBmdW5jdGlvbiAobGFiZWxUZXh0LCBwYWRkaW5nKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfeUF4aXNMYWJlbDsKICAgICAgICB9CiAgICAgICAgX3lBeGlzTGFiZWwgPSBsYWJlbFRleHQ7CiAgICAgICAgX2NoYXJ0Lm1hcmdpbnMoKS5sZWZ0IC09IF95QXhpc0xhYmVsUGFkZGluZzsKICAgICAgICBfeUF4aXNMYWJlbFBhZGRpbmcgPSAocGFkZGluZyA9PT0gdW5kZWZpbmVkKSA/IERFRkFVTFRfQVhJU19MQUJFTF9QQURESU5HIDogcGFkZGluZzsKICAgICAgICBfY2hhcnQubWFyZ2lucygpLmxlZnQgKz0gX3lBeGlzTGFiZWxQYWRkaW5nOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IG9yIHNldCB0aGUgeSBzY2FsZS4gVGhlIHkgc2NhbGUgaXMgdHlwaWNhbGx5IGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBieSB0aGUgY2hhcnQgaW1wbGVtZW50YXRpb24uCiAgICAgKiBAbWV0aG9kIHkKICAgICAqIEBtZW1iZXJvZiBkYy5jb29yZGluYXRlR3JpZE1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBzZWUge0BsaW5rIGh0dHA6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvU2NhbGVzIGQzLnNjYWxlfQogICAgICogQHBhcmFtIHtkMy5zY2FsZX0gW3lTY2FsZV0KICAgICAqIEByZXR1cm4ge2QzLnNjYWxlfQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnkgPSBmdW5jdGlvbiAoeVNjYWxlKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfeTsKICAgICAgICB9CiAgICAgICAgX3kgPSB5U2NhbGU7CiAgICAgICAgX2NoYXJ0LnJlc2NhbGUoKTsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCBvciBnZXQgdGhlIHkgYXhpcyB1c2VkIGJ5IHRoZSBjb29yZGluYXRlIGdyaWQgY2hhcnQgaW5zdGFuY2UuIFRoaXMgZnVuY3Rpb24gaXMgbW9zdCB1c2VmdWwKICAgICAqIHdoZW4geSBheGlzIGN1c3RvbWl6YXRpb24gaXMgcmVxdWlyZWQuIFRoZSB5IGF4aXMgaW4gZGMuanMgaXMgc2ltcGx5IGFuIGluc3RhbmNlIG9mIGEgW2QzIGF4aXMKICAgICAqIG9iamVjdF0oaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvU1ZHLUF4ZXMjd2lraS1fYXhpcyk7IHRoZXJlZm9yZSBpdCBzdXBwb3J0cyBhbnkKICAgICAqIHZhbGlkIGQzIGF4aXMgbWFuaXB1bGF0aW9uLiAqKkNhdXRpb24qKjogVGhlIHkgYXhpcyBpcyB1c3VhbGx5IGdlbmVyYXRlZCBpbnRlcm5hbGx5IGJ5IGRjOwogICAgICogcmVzZXR0aW5nIGl0IG1heSBjYXVzZSB1bmV4cGVjdGVkIHJlc3VsdHMuCiAgICAgKiBAbWV0aG9kIHlBeGlzCiAgICAgKiBAbWVtYmVyb2YgZGMuY29vcmRpbmF0ZUdyaWRNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAc2VlIHtAbGluayBodHRwOi8vZ2l0aHViLmNvbS9tYm9zdG9jay9kMy93aWtpL1NWRy1BeGVzIGQzLnN2Zy5heGlzfQogICAgICogQGV4YW1wbGUKICAgICAqIC8vIGN1c3RvbWl6ZSB5IGF4aXMgdGljayBmb3JtYXQKICAgICAqIGNoYXJ0LnlBeGlzKCkudGlja0Zvcm1hdChmdW5jdGlvbih2KSB7cmV0dXJuIHYgKyAnJSc7fSk7CiAgICAgKiAvLyBjdXN0b21pemUgeSBheGlzIHRpY2sgdmFsdWVzCiAgICAgKiBjaGFydC55QXhpcygpLnRpY2tWYWx1ZXMoWzAsIDEwMCwgMjAwLCAzMDBdKTsKICAgICAqIEBwYXJhbSB7ZDMuc3ZnLmF4aXN9IFt5QXhpcz1kMy5zdmcuYXhpcygpLm9yaWVudCgnbGVmdCcpXQogICAgICogQHJldHVybiB7ZDMuc3ZnLmF4aXN9CiAgICAgKiBAcmV0dXJuIHtkYy5jb29yZGluYXRlR3JpZE1peGlufQogICAgICovCiAgICBfY2hhcnQueUF4aXMgPSBmdW5jdGlvbiAoeUF4aXMpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF95QXhpczsKICAgICAgICB9CiAgICAgICAgX3lBeGlzID0geUF4aXM7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBUdXJuIG9uL29mZiBlbGFzdGljIHkgYXhpcyBiZWhhdmlvci4gSWYgeSBheGlzIGVsYXN0aWNpdHkgaXMgdHVybmVkIG9uLCB0aGVuIHRoZSBncmlkIGNoYXJ0IHdpbGwKICAgICAqIGF0dGVtcHQgdG8gcmVjYWxjdWxhdGUgdGhlIHkgYXhpcyByYW5nZSB3aGVuZXZlciBhIHJlZHJhdyBldmVudCBpcyB0cmlnZ2VyZWQuCiAgICAgKiBAbWV0aG9kIGVsYXN0aWNZCiAgICAgKiBAbWVtYmVyb2YgZGMuY29vcmRpbmF0ZUdyaWRNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtlbGFzdGljWT1mYWxzZV0KICAgICAqIEByZXR1cm4ge0Jvb2xlYW59CiAgICAgKiBAcmV0dXJuIHtkYy5jb29yZGluYXRlR3JpZE1peGlufQogICAgICovCiAgICBfY2hhcnQuZWxhc3RpY1kgPSBmdW5jdGlvbiAoZWxhc3RpY1kpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF95RWxhc3RpY2l0eTsKICAgICAgICB9CiAgICAgICAgX3lFbGFzdGljaXR5ID0gZWxhc3RpY1k7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBUdXJuIG9uL29mZiBob3Jpem9udGFsIGdyaWQgbGluZXMuCiAgICAgKiBAbWV0aG9kIHJlbmRlckhvcml6b250YWxHcmlkTGluZXMKICAgICAqIEBtZW1iZXJvZiBkYy5jb29yZGluYXRlR3JpZE1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JlbmRlckhvcml6b250YWxHcmlkTGluZXM9ZmFsc2VdCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnJlbmRlckhvcml6b250YWxHcmlkTGluZXMgPSBmdW5jdGlvbiAocmVuZGVySG9yaXpvbnRhbEdyaWRMaW5lcykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX3JlbmRlckhvcml6b250YWxHcmlkTGluZTsKICAgICAgICB9CiAgICAgICAgX3JlbmRlckhvcml6b250YWxHcmlkTGluZSA9IHJlbmRlckhvcml6b250YWxHcmlkTGluZXM7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBUdXJuIG9uL29mZiB2ZXJ0aWNhbCBncmlkIGxpbmVzLgogICAgICogQG1ldGhvZCByZW5kZXJWZXJ0aWNhbEdyaWRMaW5lcwogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtCb29sZWFufSBbcmVuZGVyVmVydGljYWxHcmlkTGluZXM9ZmFsc2VdCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnJlbmRlclZlcnRpY2FsR3JpZExpbmVzID0gZnVuY3Rpb24gKHJlbmRlclZlcnRpY2FsR3JpZExpbmVzKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfcmVuZGVyVmVydGljYWxHcmlkTGluZTsKICAgICAgICB9CiAgICAgICAgX3JlbmRlclZlcnRpY2FsR3JpZExpbmUgPSByZW5kZXJWZXJ0aWNhbEdyaWRMaW5lczsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIG1pbmltdW0geCB2YWx1ZSB0byBkaXNwbGF5IGluIHRoZSBjaGFydC4gSW5jbHVkZXMgeEF4aXNQYWRkaW5nIGlmIHNldC4KICAgICAqIEBtZXRob2QgeEF4aXNNaW4KICAgICAqIEBtZW1iZXJvZiBkYy5jb29yZGluYXRlR3JpZE1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEByZXR1cm4geyp9CiAgICAgKi8KICAgIF9jaGFydC54QXhpc01pbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbWluID0gZDMubWluKF9jaGFydC5kYXRhKCksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHJldHVybiBfY2hhcnQua2V5QWNjZXNzb3IoKShlKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZGMudXRpbHMuc3VidHJhY3QobWluLCBfeEF4aXNQYWRkaW5nKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBDYWxjdWxhdGVzIHRoZSBtYXhpbXVtIHggdmFsdWUgdG8gZGlzcGxheSBpbiB0aGUgY2hhcnQuIEluY2x1ZGVzIHhBeGlzUGFkZGluZyBpZiBzZXQuCiAgICAgKiBAbWV0aG9kIHhBeGlzTWF4CiAgICAgKiBAbWVtYmVyb2YgZGMuY29vcmRpbmF0ZUdyaWRNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHsqfQogICAgICovCiAgICBfY2hhcnQueEF4aXNNYXggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIG1heCA9IGQzLm1heChfY2hhcnQuZGF0YSgpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICByZXR1cm4gX2NoYXJ0LmtleUFjY2Vzc29yKCkoZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGRjLnV0aWxzLmFkZChtYXgsIF94QXhpc1BhZGRpbmcpOwogICAgfTsKCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIG1pbmltdW0geSB2YWx1ZSB0byBkaXNwbGF5IGluIHRoZSBjaGFydC4gSW5jbHVkZXMgeUF4aXNQYWRkaW5nIGlmIHNldC4KICAgICAqIEBtZXRob2QgeUF4aXNNaW4KICAgICAqIEBtZW1iZXJvZiBkYy5jb29yZGluYXRlR3JpZE1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEByZXR1cm4geyp9CiAgICAgKi8KICAgIF9jaGFydC55QXhpc01pbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbWluID0gZDMubWluKF9jaGFydC5kYXRhKCksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHJldHVybiBfY2hhcnQudmFsdWVBY2Nlc3NvcigpKGUpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBkYy51dGlscy5zdWJ0cmFjdChtaW4sIF95QXhpc1BhZGRpbmcpOwogICAgfTsKCiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIG1heGltdW0geSB2YWx1ZSB0byBkaXNwbGF5IGluIHRoZSBjaGFydC4gSW5jbHVkZXMgeUF4aXNQYWRkaW5nIGlmIHNldC4KICAgICAqIEBtZXRob2QgeUF4aXNNYXgKICAgICAqIEBtZW1iZXJvZiBkYy5jb29yZGluYXRlR3JpZE1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEByZXR1cm4geyp9CiAgICAgKi8KICAgIF9jaGFydC55QXhpc01heCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbWF4ID0gZDMubWF4KF9jaGFydC5kYXRhKCksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHJldHVybiBfY2hhcnQudmFsdWVBY2Nlc3NvcigpKGUpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBkYy51dGlscy5hZGQobWF4LCBfeUF4aXNQYWRkaW5nKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBTZXQgb3IgZ2V0IHkgYXhpcyBwYWRkaW5nIGZvciB0aGUgZWxhc3RpYyB5IGF4aXMuIFRoZSBwYWRkaW5nIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRvcCBhbmQKICAgICAqIGJvdHRvbSBvZiB0aGUgeSBheGlzIGlmIGVsYXN0aWNZIGlzIHR1cm5lZCBvbjsgb3RoZXJ3aXNlIGl0IGlzIGlnbm9yZWQuCiAgICAgKgogICAgICogUGFkZGluZyBjYW4gYmUgYW4gaW50ZWdlciBvciBwZXJjZW50YWdlIGluIHN0cmluZyAoZS5nLiAnMTAlJykuIFBhZGRpbmcgY2FuIGJlIGFwcGxpZWQgdG8KICAgICAqIG51bWJlciBvciBkYXRlIGF4ZXMuIFdoZW4gcGFkZGluZyBhIGRhdGUgYXhpcywgYW4gaW50ZWdlciByZXByZXNlbnRzIG51bWJlciBvZiBkYXlzIGJlaW5nIHBhZGRlZAogICAgICogYW5kIGEgcGVyY2VudGFnZSBzdHJpbmcgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGludGVnZXIuCiAgICAgKiBAbWV0aG9kIHlBeGlzUGFkZGluZwogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBbcGFkZGluZz0wXQogICAgICogQHJldHVybiB7TnVtYmVyfQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnlBeGlzUGFkZGluZyA9IGZ1bmN0aW9uIChwYWRkaW5nKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfeUF4aXNQYWRkaW5nOwogICAgICAgIH0KICAgICAgICBfeUF4aXNQYWRkaW5nID0gcGFkZGluZzsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICBfY2hhcnQueUF4aXNIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIF9jaGFydC5lZmZlY3RpdmVIZWlnaHQoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBTZXQgb3IgZ2V0IHRoZSByb3VuZGluZyBmdW5jdGlvbiB1c2VkIHRvIHF1YW50aXplIHRoZSBzZWxlY3Rpb24gd2hlbiBicnVzaGluZyBpcyBlbmFibGVkLgogICAgICogQG1ldGhvZCByb3VuZAogICAgICogQG1lbWJlcm9mIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQGV4YW1wbGUKICAgICAqIC8vIHNldCB4IHVuaXQgcm91bmQgdG8gYnkgbW9udGgsIHRoaXMgd2lsbCBtYWtlIHN1cmUgcmFuZ2Ugc2VsZWN0aW9uIGJydXNoIHdpbGwKICAgICAqIC8vIHNlbGVjdCB3aG9sZSBtb250aHMKICAgICAqIGNoYXJ0LnJvdW5kKGQzLnRpbWUubW9udGgucm91bmQpOwogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3JvdW5kXQogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAcmV0dXJuIHtkYy5jb29yZGluYXRlR3JpZE1peGlufQogICAgICovCiAgICBfY2hhcnQucm91bmQgPSBmdW5jdGlvbiAocm91bmQpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9yb3VuZDsKICAgICAgICB9CiAgICAgICAgX3JvdW5kID0gcm91bmQ7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgX2NoYXJ0Ll9yYW5nZUJhbmRQYWRkaW5nID0gZnVuY3Rpb24gKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9yYW5nZUJhbmRQYWRkaW5nOwogICAgICAgIH0KICAgICAgICBfcmFuZ2VCYW5kUGFkZGluZyA9IF87CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgX2NoYXJ0Ll9vdXRlclJhbmdlQmFuZFBhZGRpbmcgPSBmdW5jdGlvbiAoXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX291dGVyUmFuZ2VCYW5kUGFkZGluZzsKICAgICAgICB9CiAgICAgICAgX291dGVyUmFuZ2VCYW5kUGFkZGluZyA9IF87CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgZGMub3ZlcnJpZGUoX2NoYXJ0LCAnZmlsdGVyJywgZnVuY3Rpb24gKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9jaGFydC5fZmlsdGVyKCk7CiAgICAgICAgfQoKICAgICAgICBfY2hhcnQuX2ZpbHRlcihfKTsKCiAgICAgICAgaWYgKF8pIHsKICAgICAgICAgICAgX2NoYXJ0LmJydXNoKCkuZXh0ZW50KF8pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9jaGFydC5icnVzaCgpLmNsZWFyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfSk7CgogICAgX2NoYXJ0LmJydXNoID0gZnVuY3Rpb24gKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9icnVzaDsKICAgICAgICB9CiAgICAgICAgX2JydXNoID0gXzsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICBmdW5jdGlvbiBicnVzaEhlaWdodCAoKSB7CiAgICAgICAgcmV0dXJuIF9jaGFydC5feEF4aXNZKCkgLSBfY2hhcnQubWFyZ2lucygpLnRvcDsKICAgIH0KCiAgICBfY2hhcnQucmVuZGVyQnJ1c2ggPSBmdW5jdGlvbiAoZykgewogICAgICAgIGlmIChfYnJ1c2hPbikgewogICAgICAgICAgICBfYnJ1c2gub24oJ2JydXNoJywgX2NoYXJ0Ll9icnVzaGluZyk7CiAgICAgICAgICAgIF9icnVzaC5vbignYnJ1c2hzdGFydCcsIF9jaGFydC5fZGlzYWJsZU1vdXNlWm9vbSk7CiAgICAgICAgICAgIF9icnVzaC5vbignYnJ1c2hlbmQnLCBjb25maWd1cmVNb3VzZVpvb20pOwoKICAgICAgICAgICAgdmFyIGdCcnVzaCA9IGcuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdicnVzaCcpCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgX2NoYXJ0Lm1hcmdpbnMoKS5sZWZ0ICsgJywnICsgX2NoYXJ0Lm1hcmdpbnMoKS50b3AgKyAnKScpCiAgICAgICAgICAgICAgICAuY2FsbChfYnJ1c2gueChfY2hhcnQueCgpKSk7CiAgICAgICAgICAgIF9jaGFydC5zZXRCcnVzaFkoZ0JydXNoLCBmYWxzZSk7CiAgICAgICAgICAgIF9jaGFydC5zZXRIYW5kbGVQYXRocyhnQnJ1c2gpOwoKICAgICAgICAgICAgaWYgKF9jaGFydC5oYXNGaWx0ZXIoKSkgewogICAgICAgICAgICAgICAgX2NoYXJ0LnJlZHJhd0JydXNoKGcsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgX2NoYXJ0LnNldEhhbmRsZVBhdGhzID0gZnVuY3Rpb24gKGdCcnVzaCkgewogICAgICAgIGdCcnVzaC5zZWxlY3RBbGwoJy5yZXNpemUnKS5hcHBlbmQoJ3BhdGgnKS5hdHRyKCdkJywgX2NoYXJ0LnJlc2l6ZUhhbmRsZVBhdGgpOwogICAgfTsKCiAgICBfY2hhcnQuc2V0QnJ1c2hZID0gZnVuY3Rpb24gKGdCcnVzaCkgewogICAgICAgIGdCcnVzaC5zZWxlY3RBbGwoJ3JlY3QnKQogICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgYnJ1c2hIZWlnaHQoKSk7CiAgICAgICAgZ0JydXNoLnNlbGVjdEFsbCgnLnJlc2l6ZSBwYXRoJykKICAgICAgICAgICAgLmF0dHIoJ2QnLCBfY2hhcnQucmVzaXplSGFuZGxlUGF0aCk7CiAgICB9OwoKICAgIF9jaGFydC5leHRlbmRCcnVzaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgZXh0ZW50ID0gX2JydXNoLmV4dGVudCgpOwogICAgICAgIGlmIChfY2hhcnQucm91bmQoKSkgewogICAgICAgICAgICBleHRlbnRbMF0gPSBleHRlbnQubWFwKF9jaGFydC5yb3VuZCgpKVswXTsKICAgICAgICAgICAgZXh0ZW50WzFdID0gZXh0ZW50Lm1hcChfY2hhcnQucm91bmQoKSlbMV07CgogICAgICAgICAgICBfZy5zZWxlY3QoJy5icnVzaCcpCiAgICAgICAgICAgICAgICAuY2FsbChfYnJ1c2guZXh0ZW50KGV4dGVudCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZXh0ZW50OwogICAgfTsKCiAgICBfY2hhcnQuYnJ1c2hJc0VtcHR5ID0gZnVuY3Rpb24gKGV4dGVudCkgewogICAgICAgIHJldHVybiBfYnJ1c2guZW1wdHkoKSB8fCAhZXh0ZW50IHx8IGV4dGVudFsxXSA8PSBleHRlbnRbMF07CiAgICB9OwoKICAgIF9jaGFydC5fYnJ1c2hpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGV4dGVudCA9IF9jaGFydC5leHRlbmRCcnVzaCgpOwoKICAgICAgICBfY2hhcnQucmVkcmF3QnJ1c2goX2csIGZhbHNlKTsKCiAgICAgICAgaWYgKF9jaGFydC5icnVzaElzRW1wdHkoZXh0ZW50KSkgewogICAgICAgICAgICBkYy5ldmVudHMudHJpZ2dlcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfY2hhcnQuZmlsdGVyKG51bGwpOwogICAgICAgICAgICAgICAgX2NoYXJ0LnJlZHJhd0dyb3VwKCk7CiAgICAgICAgICAgIH0sIGRjLmNvbnN0YW50cy5FVkVOVF9ERUxBWSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHJhbmdlZEZpbHRlciA9IGRjLmZpbHRlcnMuUmFuZ2VkRmlsdGVyKGV4dGVudFswXSwgZXh0ZW50WzFdKTsKCiAgICAgICAgICAgIGRjLmV2ZW50cy50cmlnZ2VyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF9jaGFydC5yZXBsYWNlRmlsdGVyKHJhbmdlZEZpbHRlcik7CiAgICAgICAgICAgICAgICBfY2hhcnQucmVkcmF3R3JvdXAoKTsKICAgICAgICAgICAgfSwgZGMuY29uc3RhbnRzLkVWRU5UX0RFTEFZKTsKICAgICAgICB9CiAgICB9OwoKICAgIF9jaGFydC5yZWRyYXdCcnVzaCA9IGZ1bmN0aW9uIChnLCBkb1RyYW5zaXRpb24pIHsKICAgICAgICBpZiAoX2JydXNoT24pIHsKICAgICAgICAgICAgaWYgKF9jaGFydC5maWx0ZXIoKSAmJiBfY2hhcnQuYnJ1c2goKS5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICBfY2hhcnQuYnJ1c2goKS5leHRlbnQoX2NoYXJ0LmZpbHRlcigpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGdCcnVzaCA9IGRjLm9wdGlvbmFsVHJhbnNpdGlvbihkb1RyYW5zaXRpb24sIF9jaGFydC50cmFuc2l0aW9uRHVyYXRpb24oKSkoZy5zZWxlY3QoJ2cuYnJ1c2gnKSk7CiAgICAgICAgICAgIF9jaGFydC5zZXRCcnVzaFkoZ0JydXNoKTsKICAgICAgICAgICAgZ0JydXNoLmNhbGwoX2NoYXJ0LmJydXNoKCkKICAgICAgICAgICAgICAgICAgICAgIC54KF9jaGFydC54KCkpCiAgICAgICAgICAgICAgICAgICAgICAuZXh0ZW50KF9jaGFydC5icnVzaCgpLmV4dGVudCgpKSk7CiAgICAgICAgfQoKICAgICAgICBfY2hhcnQuZmFkZURlc2VsZWN0ZWRBcmVhKCk7CiAgICB9OwoKICAgIF9jaGFydC5mYWRlRGVzZWxlY3RlZEFyZWEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gZG8gbm90aGluZywgc3ViLWNoYXJ0IHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uCiAgICB9OwoKICAgIC8vIGJvcnJvd2VkIGZyb20gQ3Jvc3NmaWx0ZXIgZXhhbXBsZQogICAgX2NoYXJ0LnJlc2l6ZUhhbmRsZVBhdGggPSBmdW5jdGlvbiAoZCkgewogICAgICAgIHZhciBlID0gKyhkID09PSAnZScpLCB4ID0gZSA/IDEgOiAtMSwgeSA9IGJydXNoSGVpZ2h0KCkgLyAzOwogICAgICAgIHJldHVybiAnTScgKyAoMC41ICogeCkgKyAnLCcgKyB5ICsKICAgICAgICAgICAgJ0E2LDYgMCAwICcgKyBlICsgJyAnICsgKDYuNSAqIHgpICsgJywnICsgKHkgKyA2KSArCiAgICAgICAgICAgICdWJyArICgyICogeSAtIDYpICsKICAgICAgICAgICAgJ0E2LDYgMCAwICcgKyBlICsgJyAnICsgKDAuNSAqIHgpICsgJywnICsgKDIgKiB5KSArCiAgICAgICAgICAgICdaJyArCiAgICAgICAgICAgICdNJyArICgyLjUgKiB4KSArICcsJyArICh5ICsgOCkgKwogICAgICAgICAgICAnVicgKyAoMiAqIHkgLSA4KSArCiAgICAgICAgICAgICdNJyArICg0LjUgKiB4KSArICcsJyArICh5ICsgOCkgKwogICAgICAgICAgICAnVicgKyAoMiAqIHkgLSA4KTsKICAgIH07CgogICAgZnVuY3Rpb24gZ2V0Q2xpcFBhdGhJZCAoKSB7CiAgICAgICAgcmV0dXJuIF9jaGFydC5hbmNob3JOYW1lKCkucmVwbGFjZSgvWyAuIz1cW1xdXS9nLCAnLScpICsgJy1jbGlwJzsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBvciBzZXQgdGhlIHBhZGRpbmcgaW4gcGl4ZWxzIGZvciB0aGUgY2xpcCBwYXRoLiBPbmNlIHNldCBwYWRkaW5nIHdpbGwgYmUgYXBwbGllZCBldmVubHkgdG8KICAgICAqIHRoZSB0b3AsIGxlZnQsIHJpZ2h0LCBhbmQgYm90dG9tIHdoZW4gdGhlIGNsaXAgcGF0aCBpcyBnZW5lcmF0ZWQuIElmIHNldCB0byB6ZXJvLCB0aGUgY2xpcCBhcmVhCiAgICAgKiB3aWxsIGJlIGV4YWN0bHkgdGhlIGNoYXJ0IGJvZHkgYXJlYSBtaW51cyB0aGUgbWFyZ2lucy4KICAgICAqIEBtZXRob2QgY2xpcFBhZGRpbmcKICAgICAqIEBtZW1iZXJvZiBkYy5jb29yZGluYXRlR3JpZE1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFkZGluZz01XQogICAgICogQHJldHVybiB7TnVtYmVyfQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LmNsaXBQYWRkaW5nID0gZnVuY3Rpb24gKHBhZGRpbmcpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9jbGlwUGFkZGluZzsKICAgICAgICB9CiAgICAgICAgX2NsaXBQYWRkaW5nID0gcGFkZGluZzsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICBmdW5jdGlvbiBnZW5lcmF0ZUNsaXBQYXRoICgpIHsKICAgICAgICB2YXIgZGVmcyA9IGRjLnV0aWxzLmFwcGVuZE9yU2VsZWN0KF9wYXJlbnQsICdkZWZzJyk7CiAgICAgICAgLy8gY2Fubm90IHNlbGVjdCA8Y2xpcHBhdGg+IGVsZW1lbnRzOyBidWcgaW4gV2ViS2l0LCBtdXN0IHNlbGVjdCBieSBpZAogICAgICAgIC8vIGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vIyF0b3BpYy9kMy1qcy82RXBBelEyZ1U5SQogICAgICAgIHZhciBpZCA9IGdldENsaXBQYXRoSWQoKTsKICAgICAgICB2YXIgY2hhcnRCb2R5Q2xpcCA9IGRjLnV0aWxzLmFwcGVuZE9yU2VsZWN0KGRlZnMsICcjJyArIGlkLCAnY2xpcFBhdGgnKS5hdHRyKCdpZCcsIGlkKTsKCiAgICAgICAgdmFyIHBhZGRpbmcgPSBfY2xpcFBhZGRpbmcgKiAyOwoKICAgICAgICBkYy51dGlscy5hcHBlbmRPclNlbGVjdChjaGFydEJvZHlDbGlwLCAncmVjdCcpCiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIF9jaGFydC54QXhpc0xlbmd0aCgpICsgcGFkZGluZykKICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIF9jaGFydC55QXhpc0hlaWdodCgpICsgcGFkZGluZykKICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoLScgKyBfY2xpcFBhZGRpbmcgKyAnLCAtJyArIF9jbGlwUGFkZGluZyArICcpJyk7CiAgICB9CgogICAgX2NoYXJ0Ll9wcmVwcm9jZXNzRGF0YSA9IGZ1bmN0aW9uICgpIHt9OwoKICAgIF9jaGFydC5fZG9SZW5kZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgX2NoYXJ0LnJlc2V0U3ZnKCk7CgogICAgICAgIF9jaGFydC5fcHJlcHJvY2Vzc0RhdGEoKTsKCiAgICAgICAgX2NoYXJ0Ll9nZW5lcmF0ZUcoKTsKICAgICAgICBnZW5lcmF0ZUNsaXBQYXRoKCk7CgogICAgICAgIGRyYXdDaGFydCh0cnVlKTsKCiAgICAgICAgY29uZmlndXJlTW91c2Vab29tKCk7CgogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIF9jaGFydC5fZG9SZWRyYXcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgX2NoYXJ0Ll9wcmVwcm9jZXNzRGF0YSgpOwoKICAgICAgICBkcmF3Q2hhcnQoZmFsc2UpOwogICAgICAgIGdlbmVyYXRlQ2xpcFBhdGgoKTsKCiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgZnVuY3Rpb24gZHJhd0NoYXJ0IChyZW5kZXIpIHsKICAgICAgICBpZiAoX2NoYXJ0LmlzT3JkaW5hbCgpKSB7CiAgICAgICAgICAgIF9icnVzaE9uID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBwcmVwYXJlWEF4aXMoX2NoYXJ0LmcoKSwgcmVuZGVyKTsKICAgICAgICBfY2hhcnQuX3ByZXBhcmVZQXhpcyhfY2hhcnQuZygpKTsKCiAgICAgICAgX2NoYXJ0LnBsb3REYXRhKCk7CgogICAgICAgIGlmIChfY2hhcnQuZWxhc3RpY1goKSB8fCBfcmVzaXppbmcgfHwgcmVuZGVyKSB7CiAgICAgICAgICAgIF9jaGFydC5yZW5kZXJYQXhpcyhfY2hhcnQuZygpKTsKICAgICAgICB9CgogICAgICAgIGlmIChfY2hhcnQuZWxhc3RpY1koKSB8fCBfcmVzaXppbmcgfHwgcmVuZGVyKSB7CiAgICAgICAgICAgIF9jaGFydC5yZW5kZXJZQXhpcyhfY2hhcnQuZygpKTsKICAgICAgICB9CgogICAgICAgIGlmIChyZW5kZXIpIHsKICAgICAgICAgICAgX2NoYXJ0LnJlbmRlckJydXNoKF9jaGFydC5nKCksIGZhbHNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfY2hhcnQucmVkcmF3QnJ1c2goX2NoYXJ0LmcoKSwgX3Jlc2l6aW5nKTsKICAgICAgICB9CiAgICAgICAgX2NoYXJ0LmZhZGVEZXNlbGVjdGVkQXJlYSgpOwogICAgICAgIF9yZXNpemluZyA9IGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbmZpZ3VyZU1vdXNlWm9vbSAoKSB7CiAgICAgICAgaWYgKF9tb3VzZVpvb21hYmxlKSB7CiAgICAgICAgICAgIF9jaGFydC5fZW5hYmxlTW91c2Vab29tKCk7CiAgICAgICAgfSBlbHNlIGlmIChfaGFzQmVlbk1vdXNlWm9vbWFibGUpIHsKICAgICAgICAgICAgX2NoYXJ0Ll9kaXNhYmxlTW91c2Vab29tKCk7CiAgICAgICAgfQogICAgfQoKICAgIF9jaGFydC5fZW5hYmxlTW91c2Vab29tID0gZnVuY3Rpb24gKCkgewogICAgICAgIF9oYXNCZWVuTW91c2Vab29tYWJsZSA9IHRydWU7CiAgICAgICAgX3pvb20ueChfY2hhcnQueCgpKQogICAgICAgICAgICAuc2NhbGVFeHRlbnQoX3pvb21TY2FsZSkKICAgICAgICAgICAgLnNpemUoW19jaGFydC53aWR0aCgpLCBfY2hhcnQuaGVpZ2h0KCldKQogICAgICAgICAgICAuZHVyYXRpb24oX2NoYXJ0LnRyYW5zaXRpb25EdXJhdGlvbigpKTsKICAgICAgICBfY2hhcnQucm9vdCgpLmNhbGwoX3pvb20pOwogICAgfTsKCiAgICBfY2hhcnQuX2Rpc2FibGVNb3VzZVpvb20gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgX2NoYXJ0LnJvb3QoKS5jYWxsKF9udWxsWm9vbSk7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNvbnN0cmFpblJhbmdlIChyYW5nZSwgY29uc3RyYWludCkgewogICAgICAgIHZhciBjb25zdHJhaW5lZFJhbmdlID0gW107CiAgICAgICAgY29uc3RyYWluZWRSYW5nZVswXSA9IGQzLm1heChbcmFuZ2VbMF0sIGNvbnN0cmFpbnRbMF1dKTsKICAgICAgICBjb25zdHJhaW5lZFJhbmdlWzFdID0gZDMubWluKFtyYW5nZVsxXSwgY29uc3RyYWludFsxXV0pOwogICAgICAgIHJldHVybiBjb25zdHJhaW5lZFJhbmdlOwogICAgfQoKICAgIC8qKgogICAgICogWm9vbSB0aGlzIGNoYXJ0IHRvIGZvY3VzIG9uIHRoZSBnaXZlbiByYW5nZS4gVGhlIGdpdmVuIHJhbmdlIHNob3VsZCBiZSBhbiBhcnJheSBjb250YWluaW5nIG9ubHkKICAgICAqIDIgZWxlbWVudHMgKGBbc3RhcnQsIGVuZF1gKSBkZWZpbmluZyBhIHJhbmdlIGluIHRoZSB4IGRvbWFpbi4gSWYgdGhlIHJhbmdlIGlzIG5vdCBnaXZlbiBvciBzZXQKICAgICAqIHRvIG51bGwsIHRoZW4gdGhlIHpvb20gd2lsbCBiZSByZXNldC4gX0ZvciBmb2N1cyB0byB3b3JrIGVsYXN0aWNYIGhhcyB0byBiZSB0dXJuZWQgb2ZmOwogICAgICogb3RoZXJ3aXNlIGZvY3VzIHdpbGwgYmUgaWdub3JlZC4KICAgICAqIEBtZXRob2QgZm9jdXMKICAgICAqIEBtZW1iZXJvZiBkYy5jb29yZGluYXRlR3JpZE1peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBleGFtcGxlCiAgICAgKiBjaGFydC5vbigncmVuZGVybGV0JywgZnVuY3Rpb24oY2hhcnQpIHsKICAgICAqICAgICAvLyBzbW9vdGggdGhlIHJlbmRlcmluZyB0aHJvdWdoIGV2ZW50IHRocm90dGxpbmcKICAgICAqICAgICBkYy5ldmVudHMudHJpZ2dlcihmdW5jdGlvbigpewogICAgICogICAgICAgICAgLy8gZm9jdXMgc29tZSBvdGhlciBjaGFydCB0byB0aGUgcmFuZ2Ugc2VsZWN0ZWQgYnkgdXNlciBvbiB0aGlzIGNoYXJ0CiAgICAgKiAgICAgICAgICBzb21lT3RoZXJDaGFydC5mb2N1cyhjaGFydC5maWx0ZXIoKSk7CiAgICAgKiAgICAgfSk7CiAgICAgKiB9KQogICAgICogQHBhcmFtIHtBcnJheTxOdW1iZXI+fSBbcmFuZ2VdCiAgICAgKi8KICAgIF9jaGFydC5mb2N1cyA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIGlmIChoYXNSYW5nZVNlbGVjdGVkKHJhbmdlKSkgewogICAgICAgICAgICBfY2hhcnQueCgpLmRvbWFpbihyYW5nZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2NoYXJ0LngoKS5kb21haW4oX3hPcmlnaW5hbERvbWFpbik7CiAgICAgICAgfQoKICAgICAgICBfem9vbS54KF9jaGFydC54KCkpOwogICAgICAgIHpvb21IYW5kbGVyKCk7CiAgICB9OwoKICAgIF9jaGFydC5yZWZvY3VzZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIF9yZWZvY3VzZWQ7CiAgICB9OwoKICAgIF9jaGFydC5mb2N1c0NoYXJ0ID0gZnVuY3Rpb24gKGMpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9mb2N1c0NoYXJ0OwogICAgICAgIH0KICAgICAgICBfZm9jdXNDaGFydCA9IGM7CiAgICAgICAgX2NoYXJ0Lm9uKCdmaWx0ZXJlZCcsIGZ1bmN0aW9uIChjaGFydCkgewogICAgICAgICAgICBpZiAoIWNoYXJ0LmZpbHRlcigpKSB7CiAgICAgICAgICAgICAgICBkYy5ldmVudHMudHJpZ2dlcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX2ZvY3VzQ2hhcnQueCgpLmRvbWFpbihfZm9jdXNDaGFydC54T3JpZ2luYWxEb21haW4oKSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmICghcmFuZ2VzRXF1YWwoY2hhcnQuZmlsdGVyKCksIF9mb2N1c0NoYXJ0LmZpbHRlcigpKSkgewogICAgICAgICAgICAgICAgZGMuZXZlbnRzLnRyaWdnZXIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIF9mb2N1c0NoYXJ0LmZvY3VzKGNoYXJ0LmZpbHRlcigpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgZnVuY3Rpb24gcmFuZ2VzRXF1YWwgKHJhbmdlMSwgcmFuZ2UyKSB7CiAgICAgICAgaWYgKCFyYW5nZTEgJiYgIXJhbmdlMikgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKCFyYW5nZTEgfHwgIXJhbmdlMikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSBlbHNlIGlmIChyYW5nZTEubGVuZ3RoID09PSAwICYmIHJhbmdlMi5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChyYW5nZTFbMF0udmFsdWVPZigpID09PSByYW5nZTJbMF0udmFsdWVPZigpICYmCiAgICAgICAgICAgIHJhbmdlMVsxXS52YWx1ZU9mKCkgPT09IHJhbmdlMlsxXS52YWx1ZU9mKCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFR1cm4gb24vb2ZmIHRoZSBicnVzaC1iYXNlZCByYW5nZSBmaWx0ZXIuIFdoZW4gYnJ1c2hpbmcgaXMgb24gdGhlbiB1c2VyIGNhbiBkcmFnIHRoZSBtb3VzZQogICAgICogYWNyb3NzIGEgY2hhcnQgd2l0aCBhIHF1YW50aXRhdGl2ZSBzY2FsZSB0byBwZXJmb3JtIHJhbmdlIGZpbHRlcmluZyBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHRoZQogICAgICogYnJ1c2gsIG9yIGNsaWNrIG9uIHRoZSBiYXJzIG9mIGFuIG9yZGluYWwgYmFyIGNoYXJ0IG9yIHNsaWNlcyBvZiBhIHBpZSBjaGFydCB0byBmaWx0ZXIgYW5kCiAgICAgKiB1bi1maWx0ZXIgdGhlbS4gSG93ZXZlciB0dXJuaW5nIG9uIHRoZSBicnVzaCBmaWx0ZXIgd2lsbCBkaXNhYmxlIG90aGVyIGludGVyYWN0aXZlIGVsZW1lbnRzIG9uCiAgICAgKiB0aGUgY2hhcnQgc3VjaCBhcyBoaWdobGlnaHRpbmcsIHRvb2wgdGlwcywgYW5kIHJlZmVyZW5jZSBsaW5lcy4gWm9vbWluZyB3aWxsIHN0aWxsIGJlIHBvc3NpYmxlCiAgICAgKiBpZiBlbmFibGVkLCBidXQgb25seSB2aWEgc2Nyb2xsaW5nIChwYW5uaW5nIHdpbGwgYmUgZGlzYWJsZWQuKQogICAgICogQG1ldGhvZCBicnVzaE9uCiAgICAgKiBAbWVtYmVyb2YgZGMuY29vcmRpbmF0ZUdyaWRNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFticnVzaE9uPXRydWVdCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufQogICAgICogQHJldHVybiB7ZGMuY29vcmRpbmF0ZUdyaWRNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LmJydXNoT24gPSBmdW5jdGlvbiAoYnJ1c2hPbikgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX2JydXNoT247CiAgICAgICAgfQogICAgICAgIF9icnVzaE9uID0gYnJ1c2hPbjsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICBmdW5jdGlvbiBoYXNSYW5nZVNlbGVjdGVkIChyYW5nZSkgewogICAgICAgIHJldHVybiByYW5nZSBpbnN0YW5jZW9mIEFycmF5ICYmIHJhbmdlLmxlbmd0aCA+IDE7CiAgICB9CgogICAgcmV0dXJuIF9jaGFydDsKfTsKCi8qKgogKiBTdGFjayBNaXhpbiBpcyBhbiBtaXhpbiB0aGF0IHByb3ZpZGVzIGNyb3NzLWNoYXJ0IHN1cHBvcnQgb2Ygc3RhY2thYmlsaXR5IHVzaW5nIGQzLmxheW91dC5zdGFjay4KICogQG5hbWUgc3RhY2tNaXhpbgogKiBAbWVtYmVyb2YgZGMKICogQG1peGluCiAqIEBwYXJhbSB7T2JqZWN0fSBfY2hhcnQKICogQHJldHVybiB7ZGMuc3RhY2tNaXhpbn0KICovCmRjLnN0YWNrTWl4aW4gPSBmdW5jdGlvbiAoX2NoYXJ0KSB7CgogICAgZnVuY3Rpb24gcHJlcGFyZVZhbHVlcyAobGF5ZXIsIGxheWVySWR4KSB7CiAgICAgICAgdmFyIHZhbEFjY2Vzc29yID0gbGF5ZXIuYWNjZXNzb3IgfHwgX2NoYXJ0LnZhbHVlQWNjZXNzb3IoKTsKICAgICAgICBsYXllci5uYW1lID0gU3RyaW5nKGxheWVyLm5hbWUgfHwgbGF5ZXJJZHgpOwogICAgICAgIGxheWVyLnZhbHVlcyA9IGxheWVyLmdyb3VwLmFsbCgpLm1hcChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgeDogX2NoYXJ0LmtleUFjY2Vzc29yKCkoZCwgaSksCiAgICAgICAgICAgICAgICB5OiBsYXllci5oaWRkZW4gPyBudWxsIDogdmFsQWNjZXNzb3IoZCwgaSksCiAgICAgICAgICAgICAgICBkYXRhOiBkLAogICAgICAgICAgICAgICAgbGF5ZXI6IGxheWVyLm5hbWUsCiAgICAgICAgICAgICAgICBoaWRkZW46IGxheWVyLmhpZGRlbgogICAgICAgICAgICB9OwogICAgICAgIH0pOwoKICAgICAgICBsYXllci52YWx1ZXMgPSBsYXllci52YWx1ZXMuZmlsdGVyKGRvbWFpbkZpbHRlcigpKTsKICAgICAgICByZXR1cm4gbGF5ZXIudmFsdWVzOwogICAgfQoKICAgIHZhciBfc3RhY2tMYXlvdXQgPSBkMy5sYXlvdXQuc3RhY2soKQogICAgICAgIC52YWx1ZXMocHJlcGFyZVZhbHVlcyk7CgogICAgdmFyIF9zdGFjayA9IFtdOwogICAgdmFyIF90aXRsZXMgPSB7fTsKCiAgICB2YXIgX2hpZGFibGVTdGFja3MgPSBmYWxzZTsKCiAgICBmdW5jdGlvbiBkb21haW5GaWx0ZXIgKCkgewogICAgICAgIGlmICghX2NoYXJ0LngoKSkgewogICAgICAgICAgICByZXR1cm4gZDMuZnVuY3Rvcih0cnVlKTsKICAgICAgICB9CiAgICAgICAgdmFyIHhEb21haW4gPSBfY2hhcnQueCgpLmRvbWFpbigpOwogICAgICAgIGlmIChfY2hhcnQuaXNPcmRpbmFsKCkpIHsKICAgICAgICAgICAgLy8gVE9ETyAjNDE2CiAgICAgICAgICAgIC8vdmFyIGRvbWFpblNldCA9IGQzLnNldCh4RG9tYWluKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvL2RvbWFpblNldC5oYXMocC54KTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgaWYgKF9jaGFydC5lbGFzdGljWCgpKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIHAueCA+PSB4RG9tYWluWzBdICYmIHAueCA8PSB4RG9tYWluW3hEb21haW4ubGVuZ3RoIC0gMV07CiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFN0YWNrIGEgbmV3IGNyb3NzZmlsdGVyIGdyb3VwIG9udG8gdGhpcyBjaGFydCB3aXRoIGFuIG9wdGlvbmFsIGN1c3RvbSB2YWx1ZSBhY2Nlc3Nvci4gQWxsIHN0YWNrcwogICAgICogaW4gdGhlIHNhbWUgY2hhcnQgd2lsbCBzaGFyZSB0aGUgc2FtZSBrZXkgYWNjZXNzb3IgYW5kIHRoZXJlZm9yZSB0aGUgc2FtZSBzZXQgb2Yga2V5cy4KICAgICAqCiAgICAgKiBGb3IgZXhhbXBsZSwgaW4gYSBzdGFja2VkIGJhciBjaGFydCwgdGhlIGJhcnMgb2YgZWFjaCBzdGFjayB3aWxsIGJlIHBvc2l0aW9uZWQgdXNpbmcgdGhlIHNhbWUgc2V0CiAgICAgKiBvZiBrZXlzIG9uIHRoZSB4IGF4aXMsIHdoaWxlIHN0YWNrZWQgdmVydGljYWxseS4gSWYgbmFtZSBpcyBzcGVjaWZpZWQgdGhlbiBpdCB3aWxsIGJlIHVzZWQgdG8KICAgICAqIGdlbmVyYXRlIHRoZSBsZWdlbmQgbGFiZWwuCiAgICAgKiBAbWV0aG9kIHN0YWNrCiAgICAgKiBAbWVtYmVyb2YgZGMuc3RhY2tNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc3F1YXJlL2Nyb3NzZmlsdGVyL3dpa2kvQVBJLVJlZmVyZW5jZSNncm91cC1tYXAtcmVkdWNlIGNyb3NzZmlsdGVyLmdyb3VwfQogICAgICogQGV4YW1wbGUKICAgICAqIC8vIHN0YWNrIGdyb3VwIHVzaW5nIGRlZmF1bHQgYWNjZXNzb3IKICAgICAqIGNoYXJ0LnN0YWNrKHZhbHVlU3VtR3JvdXApCiAgICAgKiAvLyBzdGFjayBncm91cCB1c2luZyBjdXN0b20gYWNjZXNzb3IKICAgICAqIC5zdGFjayhhdmdCeURheUdyb3VwLCBmdW5jdGlvbihkKXtyZXR1cm4gZC52YWx1ZS5hdmdCeURheTt9KTsKICAgICAqIEBwYXJhbSB7Y3Jvc3NmaWx0ZXIuZ3JvdXB9IGdyb3VwCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW25hbWVdCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbYWNjZXNzb3JdCiAgICAgKiBAcmV0dXJuIHtBcnJheTx7Z3JvdXA6IGNyb3NzZmlsdGVyLmdyb3VwLCBuYW1lOiBTdHJpbmcsIGFjY2Vzc29yOiBGdW5jdGlvbn0+fQogICAgICogQHJldHVybiB7ZGMuc3RhY2tNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnN0YWNrID0gZnVuY3Rpb24gKGdyb3VwLCBuYW1lLCBhY2Nlc3NvcikgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX3N0YWNrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPD0gMikgewogICAgICAgICAgICBhY2Nlc3NvciA9IG5hbWU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbGF5ZXIgPSB7Z3JvdXA6IGdyb3VwfTsKICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxheWVyLm5hbWUgPSBuYW1lOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGFjY2Vzc29yID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIGxheWVyLmFjY2Vzc29yID0gYWNjZXNzb3I7CiAgICAgICAgfQogICAgICAgIF9zdGFjay5wdXNoKGxheWVyKTsKCiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgZGMub3ZlcnJpZGUoX2NoYXJ0LCAnZ3JvdXAnLCBmdW5jdGlvbiAoZywgbiwgZikgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX2NoYXJ0Ll9ncm91cCgpOwogICAgICAgIH0KICAgICAgICBfc3RhY2sgPSBbXTsKICAgICAgICBfdGl0bGVzID0ge307CiAgICAgICAgX2NoYXJ0LnN0YWNrKGcsIG4pOwogICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgIF9jaGFydC52YWx1ZUFjY2Vzc29yKGYpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2NoYXJ0Ll9ncm91cChnLCBuKTsKICAgIH0pOwoKICAgIC8qKgogICAgICogQWxsb3cgbmFtZWQgc3RhY2tzIHRvIGJlIGhpZGRlbiBvciBzaG93biBieSBjbGlja2luZyBvbiBsZWdlbmQgaXRlbXMuCiAgICAgKiBUaGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgYmVoYXZpb3Igb2YgaGlkZVN0YWNrIG9yIHNob3dTdGFjay4KICAgICAqIEBtZXRob2QgaGlkYWJsZVN0YWNrcwogICAgICogQG1lbWJlcm9mIGRjLnN0YWNrTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtCb29sZWFufSBbaGlkYWJsZVN0YWNrcz1mYWxzZV0KICAgICAqIEByZXR1cm4ge0Jvb2xlYW59CiAgICAgKiBAcmV0dXJuIHtkYy5zdGFja01peGlufQogICAgICovCiAgICBfY2hhcnQuaGlkYWJsZVN0YWNrcyA9IGZ1bmN0aW9uIChoaWRhYmxlU3RhY2tzKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfaGlkYWJsZVN0YWNrczsKICAgICAgICB9CiAgICAgICAgX2hpZGFibGVTdGFja3MgPSBoaWRhYmxlU3RhY2tzOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGZpbmRMYXllckJ5TmFtZSAobikgewogICAgICAgIHZhciBpID0gX3N0YWNrLm1hcChkYy5wbHVjaygnbmFtZScpKS5pbmRleE9mKG4pOwogICAgICAgIHJldHVybiBfc3RhY2tbaV07CiAgICB9CgogICAgLyoqCiAgICAgKiBIaWRlIGFsbCBzdGFja3Mgb24gdGhlIGNoYXJ0IHdpdGggdGhlIGdpdmVuIG5hbWUuCiAgICAgKiBUaGUgY2hhcnQgbXVzdCBiZSByZS1yZW5kZXJlZCBmb3IgdGhpcyBjaGFuZ2UgdG8gYXBwZWFyLgogICAgICogQG1ldGhvZCBoaWRlU3RhY2sKICAgICAqIEBtZW1iZXJvZiBkYy5zdGFja01peGluCiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdGFja05hbWUKICAgICAqIEByZXR1cm4ge2RjLnN0YWNrTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5oaWRlU3RhY2sgPSBmdW5jdGlvbiAoc3RhY2tOYW1lKSB7CiAgICAgICAgdmFyIGxheWVyID0gZmluZExheWVyQnlOYW1lKHN0YWNrTmFtZSk7CiAgICAgICAgaWYgKGxheWVyKSB7CiAgICAgICAgICAgIGxheWVyLmhpZGRlbiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogU2hvdyBhbGwgc3RhY2tzIG9uIHRoZSBjaGFydCB3aXRoIHRoZSBnaXZlbiBuYW1lLgogICAgICogVGhlIGNoYXJ0IG11c3QgYmUgcmUtcmVuZGVyZWQgZm9yIHRoaXMgY2hhbmdlIHRvIGFwcGVhci4KICAgICAqIEBtZXRob2Qgc2hvd1N0YWNrCiAgICAgKiBAbWVtYmVyb2YgZGMuc3RhY2tNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhY2tOYW1lCiAgICAgKiBAcmV0dXJuIHtkYy5zdGFja01peGlufQogICAgICovCiAgICBfY2hhcnQuc2hvd1N0YWNrID0gZnVuY3Rpb24gKHN0YWNrTmFtZSkgewogICAgICAgIHZhciBsYXllciA9IGZpbmRMYXllckJ5TmFtZShzdGFja05hbWUpOwogICAgICAgIGlmIChsYXllcikgewogICAgICAgICAgICBsYXllci5oaWRkZW4gPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgX2NoYXJ0LmdldFZhbHVlQWNjZXNzb3JCeUluZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgcmV0dXJuIF9zdGFja1tpbmRleF0uYWNjZXNzb3IgfHwgX2NoYXJ0LnZhbHVlQWNjZXNzb3IoKTsKICAgIH07CgogICAgX2NoYXJ0LnlBeGlzTWluID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBtaW4gPSBkMy5taW4oZmxhdHRlblN0YWNrKCksIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgIHJldHVybiAocC55IDwgMCkgPyAocC55ICsgcC55MCkgOiBwLnkwOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gZGMudXRpbHMuc3VidHJhY3QobWluLCBfY2hhcnQueUF4aXNQYWRkaW5nKCkpOwoKICAgIH07CgogICAgX2NoYXJ0LnlBeGlzTWF4ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBtYXggPSBkMy5tYXgoZmxhdHRlblN0YWNrKCksIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgIHJldHVybiAocC55ID4gMCkgPyAocC55ICsgcC55MCkgOiBwLnkwOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gZGMudXRpbHMuYWRkKG1heCwgX2NoYXJ0LnlBeGlzUGFkZGluZygpKTsKICAgIH07CgogICAgZnVuY3Rpb24gZmxhdHRlblN0YWNrICgpIHsKICAgICAgICB2YXIgdmFsdWVzZXMgPSBfY2hhcnQuZGF0YSgpLm1hcChmdW5jdGlvbiAobGF5ZXIpIHsgcmV0dXJuIGxheWVyLnZhbHVlczsgfSk7CiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHZhbHVlc2VzKTsKICAgIH0KCiAgICBfY2hhcnQueEF4aXNNaW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIG1pbiA9IGQzLm1pbihmbGF0dGVuU3RhY2soKSwgZGMucGx1Y2soJ3gnKSk7CiAgICAgICAgcmV0dXJuIGRjLnV0aWxzLnN1YnRyYWN0KG1pbiwgX2NoYXJ0LnhBeGlzUGFkZGluZygpKTsKICAgIH07CgogICAgX2NoYXJ0LnhBeGlzTWF4ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBtYXggPSBkMy5tYXgoZmxhdHRlblN0YWNrKCksIGRjLnBsdWNrKCd4JykpOwogICAgICAgIHJldHVybiBkYy51dGlscy5hZGQobWF4LCBfY2hhcnQueEF4aXNQYWRkaW5nKCkpOwogICAgfTsKCiAgICAvKioKICAgICAqIFNldCBvciBnZXQgdGhlIHRpdGxlIGZ1bmN0aW9uLiBDaGFydCBjbGFzcyB3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHJlbmRlciBzdmcgdGl0bGUgKHVzdWFsbHkgaW50ZXJwcmV0ZWQgYnkKICAgICAqIGJyb3dzZXIgYXMgdG9vbHRpcHMpIGZvciBlYWNoIGNoaWxkIGVsZW1lbnQgaW4gdGhlIGNoYXJ0LCBpLmUuIGEgc2xpY2UgaW4gYSBwaWUgY2hhcnQgb3IgYSBidWJibGUgaW4gYSBidWJibGUgY2hhcnQuCiAgICAgKiBBbG1vc3QgZXZlcnkgY2hhcnQgc3VwcG9ydHMgdGl0bGUgZnVuY3Rpb24gaG93ZXZlciBpbiBncmlkIGNvb3JkaW5hdGUgY2hhcnQgeW91IG5lZWQgdG8gdHVybiBvZmYgYnJ1c2ggaW4gb3JkZXIgdG8KICAgICAqIHVzZSB0aXRsZSBvdGhlcndpc2UgdGhlIGJydXNoIGxheWVyIHdpbGwgYmxvY2sgdG9vbHRpcCB0cmlnZ2VyLgogICAgICoKICAgICAqIElmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHN0YWNrIG5hbWUsIHRoZSB0aXRsZSBmdW5jdGlvbiB3aWxsIGdldCBvciBzZXQgdGhlIHRpdGxlIGZvciB0aGF0IHN0YWNrLiBJZiBzdGFja05hbWUKICAgICAqIGlzIG5vdCBwcm92aWRlZCwgdGhlIGZpcnN0IHN0YWNrIGlzIGltcGxpZWQuCiAgICAgKiBAbWV0aG9kIHRpdGxlCiAgICAgKiBAbWVtYmVyb2YgZGMuc3RhY2tNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gc2V0IGEgdGl0bGUgZnVuY3Rpb24gb24gJ2ZpcnN0IHN0YWNrJwogICAgICogY2hhcnQudGl0bGUoJ2ZpcnN0IHN0YWNrJywgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5rZXkgKyAnOiAnICsgZC52YWx1ZTsgfSk7CiAgICAgKiAvLyBnZXQgYSB0aXRsZSBmdW5jdGlvbiBmcm9tICdzZWNvbmQgc3RhY2snCiAgICAgKiB2YXIgc2Vjb25kVGl0bGVGdW5jdGlvbiA9IGNoYXJ0LnRpdGxlKCdzZWNvbmQgc3RhY2snKTsKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbc3RhY2tOYW1lXQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3RpdGxlQWNjZXNzb3JdCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgKiBAcmV0dXJuIHtkYy5zdGFja01peGlufQogICAgICovCiAgICBkYy5vdmVycmlkZShfY2hhcnQsICd0aXRsZScsIGZ1bmN0aW9uIChzdGFja05hbWUsIHRpdGxlQWNjZXNzb3IpIHsKICAgICAgICBpZiAoIXN0YWNrTmFtZSkgewogICAgICAgICAgICByZXR1cm4gX2NoYXJ0Ll90aXRsZSgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHR5cGVvZiBzdGFja05hbWUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcmV0dXJuIF9jaGFydC5fdGl0bGUoc3RhY2tOYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YWNrTmFtZSA9PT0gX2NoYXJ0Ll9ncm91cE5hbWUgJiYgdHlwZW9mIHRpdGxlQWNjZXNzb3IgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcmV0dXJuIF9jaGFydC5fdGl0bGUodGl0bGVBY2Nlc3Nvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAodHlwZW9mIHRpdGxlQWNjZXNzb3IgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcmV0dXJuIF90aXRsZXNbc3RhY2tOYW1lXSB8fCBfY2hhcnQuX3RpdGxlKCk7CiAgICAgICAgfQoKICAgICAgICBfdGl0bGVzW3N0YWNrTmFtZV0gPSB0aXRsZUFjY2Vzc29yOwoKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfSk7CgogICAgLyoqCiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIHN0YWNrIGxheW91dCBhbGdvcml0aG0sIHdoaWNoIGNvbXB1dGVzIGEgYmFzZWxpbmUgZm9yIGVhY2ggc3RhY2sgYW5kCiAgICAgKiBwcm9wYWdhdGVzIGl0IHRvIHRoZSBuZXh0CiAgICAgKiBAbWV0aG9kIHN0YWNrTGF5b3V0CiAgICAgKiBAbWVtYmVyb2YgZGMuc3RhY2tNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAc2VlIHtAbGluayBodHRwOi8vZ2l0aHViLmNvbS9tYm9zdG9jay9kMy93aWtpL1N0YWNrLUxheW91dCBkMy5sYXlvdXQuc3RhY2t9CiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc3RhY2s9ZDMubGF5b3V0LnN0YWNrXQogICAgICogQHJldHVybiB7RnVuY3Rpb259CiAgICAgKiBAcmV0dXJuIHtkYy5zdGFja01peGlufQogICAgICovCiAgICBfY2hhcnQuc3RhY2tMYXlvdXQgPSBmdW5jdGlvbiAoc3RhY2spIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdGFja0xheW91dDsKICAgICAgICB9CiAgICAgICAgX3N0YWNrTGF5b3V0ID0gc3RhY2s7CiAgICAgICAgaWYgKF9zdGFja0xheW91dC52YWx1ZXMoKSA9PT0gZDMubGF5b3V0LnN0YWNrKCkudmFsdWVzKCkpIHsKICAgICAgICAgICAgX3N0YWNrTGF5b3V0LnZhbHVlcyhwcmVwYXJlVmFsdWVzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgZnVuY3Rpb24gdmlzYWJpbGl0eSAobCkgewogICAgICAgIHJldHVybiAhbC5oaWRkZW47CiAgICB9CgogICAgX2NoYXJ0LmRhdGEoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBsYXllcnMgPSBfc3RhY2suZmlsdGVyKHZpc2FiaWxpdHkpOwogICAgICAgIHJldHVybiBsYXllcnMubGVuZ3RoID8gX2NoYXJ0LnN0YWNrTGF5b3V0KCkobGF5ZXJzKSA6IFtdOwogICAgfSk7CgogICAgX2NoYXJ0Ll9vcmRpbmFsWERvbWFpbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgZmxhdCA9IGZsYXR0ZW5TdGFjaygpLm1hcChkYy5wbHVjaygnZGF0YScpKTsKICAgICAgICB2YXIgb3JkZXJlZCA9IF9jaGFydC5fY29tcHV0ZU9yZGVyZWRHcm91cHMoZmxhdCk7CiAgICAgICAgcmV0dXJuIG9yZGVyZWQubWFwKF9jaGFydC5rZXlBY2Nlc3NvcigpKTsKICAgIH07CgogICAgX2NoYXJ0LmNvbG9yQWNjZXNzb3IoZnVuY3Rpb24gKGQpIHsKICAgICAgICB2YXIgbGF5ZXIgPSB0aGlzLmxheWVyIHx8IHRoaXMubmFtZSB8fCBkLm5hbWUgfHwgZC5sYXllcjsKICAgICAgICByZXR1cm4gbGF5ZXI7CiAgICB9KTsKCiAgICBfY2hhcnQubGVnZW5kYWJsZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIF9zdGFjay5tYXAoZnVuY3Rpb24gKGxheWVyLCBpKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBjaGFydDogX2NoYXJ0LAogICAgICAgICAgICAgICAgbmFtZTogbGF5ZXIubmFtZSwKICAgICAgICAgICAgICAgIGhpZGRlbjogbGF5ZXIuaGlkZGVuIHx8IGZhbHNlLAogICAgICAgICAgICAgICAgY29sb3I6IF9jaGFydC5nZXRDb2xvci5jYWxsKGxheWVyLCBsYXllci52YWx1ZXMsIGkpCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9OwoKICAgIF9jaGFydC5pc0xlZ2VuZGFibGVIaWRkZW4gPSBmdW5jdGlvbiAoZCkgewogICAgICAgIHZhciBsYXllciA9IGZpbmRMYXllckJ5TmFtZShkLm5hbWUpOwogICAgICAgIHJldHVybiBsYXllciA/IGxheWVyLmhpZGRlbiA6IGZhbHNlOwogICAgfTsKCiAgICBfY2hhcnQubGVnZW5kVG9nZ2xlID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICBpZiAoX2hpZGFibGVTdGFja3MpIHsKICAgICAgICAgICAgaWYgKF9jaGFydC5pc0xlZ2VuZGFibGVIaWRkZW4oZCkpIHsKICAgICAgICAgICAgICAgIF9jaGFydC5zaG93U3RhY2soZC5uYW1lKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIF9jaGFydC5oaWRlU3RhY2soZC5uYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL19jaGFydC5yZWRyYXcoKTsKICAgICAgICAgICAgX2NoYXJ0LnJlbmRlckdyb3VwKCk7CiAgICAgICAgfQogICAgfTsKCiAgICByZXR1cm4gX2NoYXJ0Owp9OwoKLyoqCiAqIENhcCBpcyBhIG1peGluIHRoYXQgZ3JvdXBzIHNtYWxsIGRhdGEgZWxlbWVudHMgYmVsb3cgYSBfY2FwXyBpbnRvIGFuICpvdGhlcnMqIGdyb3VwaW5nIGZvciBib3RoIHRoZQogKiBSb3cgYW5kIFBpZSBDaGFydHMuCiAqCiAqIFRoZSB0b3Agb3JkZXJlZCBlbGVtZW50cyBpbiB0aGUgZ3JvdXAgdXAgdG8gdGhlIGNhcCBhbW91bnQgd2lsbCBiZSBrZXB0IGluIHRoZSBjaGFydCwgYW5kIHRoZSByZXN0CiAqIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhbiAqb3RoZXJzKiBlbGVtZW50LCB3aXRoIHZhbHVlIGVxdWFsIHRvIHRoZSBzdW0gb2YgdGhlIHJlcGxhY2VkIHZhbHVlcy4gVGhlCiAqIGtleXMgb2YgdGhlIGVsZW1lbnRzIGJlbG93IHRoZSBjYXAgbGltaXQgYXJlIHJlY29yZGVkIGluIG9yZGVyIHRvIGZpbHRlciBieSB0aG9zZSBrZXlzIHdoZW4gdGhlCiAqIG90aGVycyogZWxlbWVudCBpcyBjbGlja2VkLgogKiBAbmFtZSBjYXBNaXhpbgogKiBAbWVtYmVyb2YgZGMKICogQG1peGluCiAqIEBwYXJhbSB7T2JqZWN0fSBfY2hhcnQKICogQHJldHVybiB7ZGMuY2FwTWl4aW59CiAqLwpkYy5jYXBNaXhpbiA9IGZ1bmN0aW9uIChfY2hhcnQpIHsKCiAgICB2YXIgX2NhcCA9IEluZmluaXR5OwoKICAgIHZhciBfb3RoZXJzTGFiZWwgPSAnT3RoZXJzJzsKCiAgICB2YXIgX290aGVyc0dyb3VwZXIgPSBmdW5jdGlvbiAodG9wUm93cykgewogICAgICAgIHZhciB0b3BSb3dzU3VtID0gZDMuc3VtKHRvcFJvd3MsIF9jaGFydC52YWx1ZUFjY2Vzc29yKCkpLAogICAgICAgICAgICBhbGxSb3dzID0gX2NoYXJ0Lmdyb3VwKCkuYWxsKCksCiAgICAgICAgICAgIGFsbFJvd3NTdW0gPSBkMy5zdW0oYWxsUm93cywgX2NoYXJ0LnZhbHVlQWNjZXNzb3IoKSksCiAgICAgICAgICAgIHRvcEtleXMgPSB0b3BSb3dzLm1hcChfY2hhcnQua2V5QWNjZXNzb3IoKSksCiAgICAgICAgICAgIGFsbEtleXMgPSBhbGxSb3dzLm1hcChfY2hhcnQua2V5QWNjZXNzb3IoKSksCiAgICAgICAgICAgIHRvcFNldCA9IGQzLnNldCh0b3BLZXlzKSwKICAgICAgICAgICAgb3RoZXJzID0gYWxsS2V5cy5maWx0ZXIoZnVuY3Rpb24gKGQpIHtyZXR1cm4gIXRvcFNldC5oYXMoZCk7fSk7CiAgICAgICAgaWYgKGFsbFJvd3NTdW0gPiB0b3BSb3dzU3VtKSB7CiAgICAgICAgICAgIHJldHVybiB0b3BSb3dzLmNvbmNhdChbeydvdGhlcnMnOiBvdGhlcnMsICdrZXknOiBfb3RoZXJzTGFiZWwsICd2YWx1ZSc6IGFsbFJvd3NTdW0gLSB0b3BSb3dzU3VtfV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG9wUm93czsKICAgIH07CgogICAgX2NoYXJ0LmNhcHBlZEtleUFjY2Vzc29yID0gZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICBpZiAoZC5vdGhlcnMpIHsKICAgICAgICAgICAgcmV0dXJuIGQua2V5OwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2NoYXJ0LmtleUFjY2Vzc29yKCkoZCwgaSk7CiAgICB9OwoKICAgIF9jaGFydC5jYXBwZWRWYWx1ZUFjY2Vzc29yID0gZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICBpZiAoZC5vdGhlcnMpIHsKICAgICAgICAgICAgcmV0dXJuIGQudmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfY2hhcnQudmFsdWVBY2Nlc3NvcigpKGQsIGkpOwogICAgfTsKCiAgICBfY2hhcnQuZGF0YShmdW5jdGlvbiAoZ3JvdXApIHsKICAgICAgICBpZiAoX2NhcCA9PT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgcmV0dXJuIF9jaGFydC5fY29tcHV0ZU9yZGVyZWRHcm91cHMoZ3JvdXAuYWxsKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciB0b3BSb3dzID0gZ3JvdXAudG9wKF9jYXApOyAvLyBvcmRlcmVkIGJ5IGNyb3NzZmlsdGVyIGdyb3VwIG9yZGVyIChkZWZhdWx0IHZhbHVlKQogICAgICAgICAgICB0b3BSb3dzID0gX2NoYXJ0Ll9jb21wdXRlT3JkZXJlZEdyb3Vwcyh0b3BSb3dzKTsgLy8gcmUtb3JkZXIgdXNpbmcgb3JkZXJpbmcgKGRlZmF1bHQga2V5KQogICAgICAgICAgICBpZiAoX290aGVyc0dyb3VwZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfb3RoZXJzR3JvdXBlcih0b3BSb3dzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdG9wUm93czsKICAgICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgICAqIEdldCBvciBzZXQgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHRvIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgY2FwLgogICAgICogQG1ldGhvZCBjYXAKICAgICAqIEBtZW1iZXJvZiBkYy5jYXBNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2NvdW50PUluZmluaXR5XQogICAgICogQHJldHVybiB7TnVtYmVyfQogICAgICogQHJldHVybiB7ZGMuY2FwTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5jYXAgPSBmdW5jdGlvbiAoY291bnQpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9jYXA7CiAgICAgICAgfQogICAgICAgIF9jYXAgPSBjb3VudDsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIEdldCBvciBzZXQgdGhlIGxhYmVsIGZvciAqT3RoZXJzKiBzbGljZSB3aGVuIHNsaWNlcyBjYXAgaXMgc3BlY2lmaWVkCiAgICAgKiBAbWV0aG9kIG90aGVyc0xhYmVsCiAgICAgKiBAbWVtYmVyb2YgZGMuY2FwTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtTdHJpbmd9IFtsYWJlbD0iT3RoZXJzIl0KICAgICAqIEByZXR1cm4ge1N0cmluZ30KICAgICAqIEByZXR1cm4ge2RjLmNhcE1peGlufQogICAgICovCiAgICBfY2hhcnQub3RoZXJzTGFiZWwgPSBmdW5jdGlvbiAobGFiZWwpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9vdGhlcnNMYWJlbDsKICAgICAgICB9CiAgICAgICAgX290aGVyc0xhYmVsID0gbGFiZWw7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXQgb3Igc2V0IHRoZSBncm91cGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBwZXJmb3JtIHRoZSBpbnNlcnRpb24gb2YgZGF0YSBmb3IgdGhlICpPdGhlcnMqIHNsaWNlCiAgICAgKiBpZiB0aGUgc2xpY2VzIGNhcCBpcyBzcGVjaWZpZWQuIElmIHNldCB0byBhIGZhbHN5IHZhbHVlLCBubyBvdGhlcnMgd2lsbCBiZSBhZGRlZC4gQnkgZGVmYXVsdCB0aGUKICAgICAqIGdyb3VwZXIgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHN1bSBvZiBhbGwgdmFsdWVzIGJlbG93IHRoZSBjYXAuCiAgICAgKiBAbWV0aG9kIG90aGVyc0dyb3VwZXIKICAgICAqIEBtZW1iZXJvZiBkYy5jYXBNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAZXhhbXBsZQogICAgICogLy8gRGVmYXVsdCBvdGhlcnMgZ3JvdXBlcgogICAgICogY2hhcnQub3RoZXJzR3JvdXBlcihmdW5jdGlvbiAodG9wUm93cykgewogICAgICogICAgdmFyIHRvcFJvd3NTdW0gPSBkMy5zdW0odG9wUm93cywgX2NoYXJ0LnZhbHVlQWNjZXNzb3IoKSksCiAgICAgKiAgICAgICAgYWxsUm93cyA9IF9jaGFydC5ncm91cCgpLmFsbCgpLAogICAgICogICAgICAgIGFsbFJvd3NTdW0gPSBkMy5zdW0oYWxsUm93cywgX2NoYXJ0LnZhbHVlQWNjZXNzb3IoKSksCiAgICAgKiAgICAgICAgdG9wS2V5cyA9IHRvcFJvd3MubWFwKF9jaGFydC5rZXlBY2Nlc3NvcigpKSwKICAgICAqICAgICAgICBhbGxLZXlzID0gYWxsUm93cy5tYXAoX2NoYXJ0LmtleUFjY2Vzc29yKCkpLAogICAgICogICAgICAgIHRvcFNldCA9IGQzLnNldCh0b3BLZXlzKSwKICAgICAqICAgICAgICBvdGhlcnMgPSBhbGxLZXlzLmZpbHRlcihmdW5jdGlvbiAoZCkge3JldHVybiAhdG9wU2V0LmhhcyhkKTt9KTsKICAgICAqICAgIGlmIChhbGxSb3dzU3VtID4gdG9wUm93c1N1bSkgewogICAgICogICAgICAgIHJldHVybiB0b3BSb3dzLmNvbmNhdChbeydvdGhlcnMnOiBvdGhlcnMsICdrZXknOiBfb3RoZXJzTGFiZWwsICd2YWx1ZSc6IGFsbFJvd3NTdW0gLSB0b3BSb3dzU3VtfV0pOwogICAgICogICAgfQogICAgICogICAgcmV0dXJuIHRvcFJvd3M7CiAgICAgKiB9KTsKICAgICAqIC8vIEN1c3RvbSBvdGhlcnMgZ3JvdXBlcgogICAgICogY2hhcnQub3RoZXJzR3JvdXBlcihmdW5jdGlvbiAoZGF0YSkgewogICAgICogICAgIC8vIGNvbXB1dGUgdGhlIHZhbHVlIGZvciBvdGhlcnMsIHByZXN1bWFibHkgdGhlIHN1bSBvZiBhbGwgdmFsdWVzIGJlbG93IHRoZSBjYXAKICAgICAqICAgICB2YXIgb3RoZXJzU3VtICA9IHlvdXJDb21wdXRlT3RoZXJzVmFsdWVMb2dpYyhkYXRhKQogICAgICoKICAgICAqICAgICAvLyB0aGUga2V5cyBhcmUgbmVlZGVkIHRvIHByb3Blcmx5IGZpbHRlciB3aGVuIHRoZSBvdGhlcnMgZWxlbWVudCBpcyBjbGlja2VkCiAgICAgKiAgICAgdmFyIG90aGVyc0tleXMgPSB5b3VyQ29tcHV0ZU90aGVyc0tleXNBcnJheUxvZ2ljKGRhdGEpOwogICAgICoKICAgICAqICAgICAvLyBhZGQgdGhlIG90aGVycyByb3cgdG8gdGhlIGRhdGFzZXQKICAgICAqICAgICBkYXRhLnB1c2goeydrZXknOiAnT3RoZXJzJywgJ3ZhbHVlJzogb3RoZXJzU3VtLCAnb3RoZXJzJzogb3RoZXJzS2V5cyB9KTsKICAgICAqCiAgICAgKiAgICAgcmV0dXJuIGRhdGE7CiAgICAgKiB9KTsKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtncm91cGVyRnVuY3Rpb25dCiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0KICAgICAqIEByZXR1cm4ge2RjLmNhcE1peGlufQogICAgICovCiAgICBfY2hhcnQub3RoZXJzR3JvdXBlciA9IGZ1bmN0aW9uIChncm91cGVyRnVuY3Rpb24pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9vdGhlcnNHcm91cGVyOwogICAgICAgIH0KICAgICAgICBfb3RoZXJzR3JvdXBlciA9IGdyb3VwZXJGdW5jdGlvbjsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICBkYy5vdmVycmlkZShfY2hhcnQsICdvbkNsaWNrJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICBpZiAoZC5vdGhlcnMpIHsKICAgICAgICAgICAgX2NoYXJ0LmZpbHRlcihbZC5vdGhlcnNdKTsKICAgICAgICB9CiAgICAgICAgX2NoYXJ0Ll9vbkNsaWNrKGQpOwogICAgfSk7CgogICAgcmV0dXJuIF9jaGFydDsKfTsKCi8qKgogKiBUaGlzIE1peGluIHByb3ZpZGVzIHJldXNhYmxlIGZ1bmN0aW9uYWxpdGllcyBmb3IgYW55IGNoYXJ0IHRoYXQgbmVlZHMgdG8gdmlzdWFsaXplIGRhdGEgdXNpbmcgYnViYmxlcy4KICogQG5hbWUgYnViYmxlTWl4aW4KICogQG1lbWJlcm9mIGRjCiAqIEBtaXhpbgogKiBAbWl4ZXMgZGMuY29sb3JNaXhpbgogKiBAcGFyYW0ge09iamVjdH0gX2NoYXJ0CiAqIEByZXR1cm4ge2RjLmJ1YmJsZU1peGlufQogKi8KZGMuYnViYmxlTWl4aW4gPSBmdW5jdGlvbiAoX2NoYXJ0KSB7CiAgICB2YXIgX21heEJ1YmJsZVJlbGF0aXZlU2l6ZSA9IDAuMzsKICAgIHZhciBfbWluUmFkaXVzV2l0aExhYmVsID0gMTA7CgogICAgX2NoYXJ0LkJVQkJMRV9OT0RFX0NMQVNTID0gJ25vZGUnOwogICAgX2NoYXJ0LkJVQkJMRV9DTEFTUyA9ICdidWJibGUnOwogICAgX2NoYXJ0Lk1JTl9SQURJVVMgPSAxMDsKCiAgICBfY2hhcnQgPSBkYy5jb2xvck1peGluKF9jaGFydCk7CgogICAgX2NoYXJ0LnJlbmRlckxhYmVsKHRydWUpOwoKICAgIF9jaGFydC5kYXRhKGZ1bmN0aW9uIChncm91cCkgewogICAgICAgIHJldHVybiBncm91cC50b3AoSW5maW5pdHkpOwogICAgfSk7CgogICAgdmFyIF9yID0gZDMuc2NhbGUubGluZWFyKCkuZG9tYWluKFswLCAxMDBdKTsKCiAgICB2YXIgX3JWYWx1ZUFjY2Vzc29yID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5yOwogICAgfTsKCiAgICAvKioKICAgICAqIEdldCBvciBzZXQgdGhlIGJ1YmJsZSByYWRpdXMgc2NhbGUuIEJ5IGRlZmF1bHQgdGhlIGJ1YmJsZSBjaGFydCB1c2VzCiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvUXVhbnRpdGF0aXZlLVNjYWxlcyNsaW5lYXIgZDMuc2NhbGUubGluZWFyKCkuZG9tYWluKFswLCAxMDBdKX0KICAgICAqIGFzIGl0cyByYWRpdXMgc2NhbGUuCiAgICAgKiBAbWV0aG9kIHIKICAgICAqIEBtZW1iZXJvZiBkYy5idWJibGVNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAc2VlIHtAbGluayBodHRwOi8vZ2l0aHViLmNvbS9tYm9zdG9jay9kMy93aWtpL1NjYWxlcyBkMy5zY2FsZX0KICAgICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtidWJibGVSYWRpdXNTY2FsZT1kMy5zY2FsZS5saW5lYXIoKS5kb21haW4oWzAsIDEwMF0pXQogICAgICogQHJldHVybiB7ZDMuc2NhbGV9CiAgICAgKiBAcmV0dXJuIHtkYy5idWJibGVNaXhpbn0KICAgICAqLwogICAgX2NoYXJ0LnIgPSBmdW5jdGlvbiAoYnViYmxlUmFkaXVzU2NhbGUpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9yOwogICAgICAgIH0KICAgICAgICBfciA9IGJ1YmJsZVJhZGl1c1NjYWxlOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IG9yIHNldCB0aGUgcmFkaXVzIHZhbHVlIGFjY2Vzc29yIGZ1bmN0aW9uLiBJZiBzZXQsIHRoZSByYWRpdXMgdmFsdWUgYWNjZXNzb3IgZnVuY3Rpb24gd2lsbAogICAgICogYmUgdXNlZCB0byByZXRyaWV2ZSBhIGRhdGEgdmFsdWUgZm9yIGVhY2ggYnViYmxlLiBUaGUgZGF0YSByZXRyaWV2ZWQgdGhlbiB3aWxsIGJlIG1hcHBlZCB1c2luZwogICAgICogdGhlIHIgc2NhbGUgdG8gdGhlIGFjdHVhbCBidWJibGUgcmFkaXVzLiBUaGlzIGFsbG93cyB5b3UgdG8gZW5jb2RlIGEgZGF0YSBkaW1lbnNpb24gdXNpbmcgYnViYmxlCiAgICAgKiBzaXplLgogICAgICogQG1ldGhvZCByYWRpdXNWYWx1ZUFjY2Vzc29yCiAgICAgKiBAbWVtYmVyb2YgZGMuYnViYmxlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3JhZGl1c1ZhbHVlQWNjZXNzb3JdCiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0KICAgICAqIEByZXR1cm4ge2RjLmJ1YmJsZU1peGlufQogICAgICovCiAgICBfY2hhcnQucmFkaXVzVmFsdWVBY2Nlc3NvciA9IGZ1bmN0aW9uIChyYWRpdXNWYWx1ZUFjY2Vzc29yKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfclZhbHVlQWNjZXNzb3I7CiAgICAgICAgfQogICAgICAgIF9yVmFsdWVBY2Nlc3NvciA9IHJhZGl1c1ZhbHVlQWNjZXNzb3I7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgX2NoYXJ0LnJNaW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIG1pbiA9IGQzLm1pbihfY2hhcnQuZGF0YSgpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICByZXR1cm4gX2NoYXJ0LnJhZGl1c1ZhbHVlQWNjZXNzb3IoKShlKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbWluOwogICAgfTsKCiAgICBfY2hhcnQuck1heCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbWF4ID0gZDMubWF4KF9jaGFydC5kYXRhKCksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHJldHVybiBfY2hhcnQucmFkaXVzVmFsdWVBY2Nlc3NvcigpKGUpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBtYXg7CiAgICB9OwoKICAgIF9jaGFydC5idWJibGVSID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICB2YXIgdmFsdWUgPSBfY2hhcnQucmFkaXVzVmFsdWVBY2Nlc3NvcigpKGQpOwogICAgICAgIHZhciByID0gX2NoYXJ0LnIoKSh2YWx1ZSk7CiAgICAgICAgaWYgKGlzTmFOKHIpIHx8IHZhbHVlIDw9IDApIHsKICAgICAgICAgICAgciA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiByOwogICAgfTsKCiAgICB2YXIgbGFiZWxGdW5jdGlvbiA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIF9jaGFydC5sYWJlbCgpKGQpOwogICAgfTsKCiAgICB2YXIgc2hvdWxkTGFiZWwgPSBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiAoX2NoYXJ0LmJ1YmJsZVIoZCkgPiBfbWluUmFkaXVzV2l0aExhYmVsKTsKICAgIH07CgogICAgdmFyIGxhYmVsT3BhY2l0eSA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIHNob3VsZExhYmVsKGQpID8gMSA6IDA7CiAgICB9OwoKICAgIHZhciBsYWJlbFBvaW50ZXJFdmVudCA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIHNob3VsZExhYmVsKGQpID8gJ2FsbCcgOiAnbm9uZSc7CiAgICB9OwoKICAgIF9jaGFydC5fZG9SZW5kZXJMYWJlbCA9IGZ1bmN0aW9uIChidWJibGVHRW50ZXIpIHsKICAgICAgICBpZiAoX2NoYXJ0LnJlbmRlckxhYmVsKCkpIHsKICAgICAgICAgICAgdmFyIGxhYmVsID0gYnViYmxlR0VudGVyLnNlbGVjdCgndGV4dCcpOwoKICAgICAgICAgICAgaWYgKGxhYmVsLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgIGxhYmVsID0gYnViYmxlR0VudGVyLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2R5JywgJy4zZW0nKQogICAgICAgICAgICAgICAgICAgIC5vbignY2xpY2snLCBfY2hhcnQub25DbGljayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxhYmVsCiAgICAgICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIDApCiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRlci1ldmVudHMnLCBsYWJlbFBvaW50ZXJFdmVudCkKICAgICAgICAgICAgICAgIC50ZXh0KGxhYmVsRnVuY3Rpb24pOwogICAgICAgICAgICBkYy50cmFuc2l0aW9uKGxhYmVsLCBfY2hhcnQudHJhbnNpdGlvbkR1cmF0aW9uKCkpCiAgICAgICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIGxhYmVsT3BhY2l0eSk7CiAgICAgICAgfQogICAgfTsKCiAgICBfY2hhcnQuZG9VcGRhdGVMYWJlbHMgPSBmdW5jdGlvbiAoYnViYmxlR0VudGVyKSB7CiAgICAgICAgaWYgKF9jaGFydC5yZW5kZXJMYWJlbCgpKSB7CiAgICAgICAgICAgIHZhciBsYWJlbHMgPSBidWJibGVHRW50ZXIuc2VsZWN0QWxsKCd0ZXh0JykKICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsIGxhYmVsUG9pbnRlckV2ZW50KQogICAgICAgICAgICAgICAgLnRleHQobGFiZWxGdW5jdGlvbik7CiAgICAgICAgICAgIGRjLnRyYW5zaXRpb24obGFiZWxzLCBfY2hhcnQudHJhbnNpdGlvbkR1cmF0aW9uKCkpCiAgICAgICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIGxhYmVsT3BhY2l0eSk7CiAgICAgICAgfQogICAgfTsKCiAgICB2YXIgdGl0bGVGdW5jdGlvbiA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIF9jaGFydC50aXRsZSgpKGQpOwogICAgfTsKCiAgICBfY2hhcnQuX2RvUmVuZGVyVGl0bGVzID0gZnVuY3Rpb24gKGcpIHsKICAgICAgICBpZiAoX2NoYXJ0LnJlbmRlclRpdGxlKCkpIHsKICAgICAgICAgICAgdmFyIHRpdGxlID0gZy5zZWxlY3QoJ3RpdGxlJyk7CgogICAgICAgICAgICBpZiAodGl0bGUuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgZy5hcHBlbmQoJ3RpdGxlJykudGV4dCh0aXRsZUZ1bmN0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgX2NoYXJ0LmRvVXBkYXRlVGl0bGVzID0gZnVuY3Rpb24gKGcpIHsKICAgICAgICBpZiAoX2NoYXJ0LnJlbmRlclRpdGxlKCkpIHsKICAgICAgICAgICAgZy5zZWxlY3RBbGwoJ3RpdGxlJykudGV4dCh0aXRsZUZ1bmN0aW9uKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IG9yIHNldCB0aGUgbWluaW11bSByYWRpdXMuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHJhZGl1cyBzY2FsZSdzIHJhbmdlLgogICAgICogQG1ldGhvZCBtaW5SYWRpdXMKICAgICAqIEBtZW1iZXJvZiBkYy5idWJibGVNaXhpbgogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge051bWJlcn0gW3JhZGl1cz0xMF0KICAgICAqIEByZXR1cm4ge051bWJlcn0KICAgICAqIEByZXR1cm4ge2RjLmJ1YmJsZU1peGlufQogICAgICovCiAgICBfY2hhcnQubWluUmFkaXVzID0gZnVuY3Rpb24gKHJhZGl1cykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX2NoYXJ0Lk1JTl9SQURJVVM7CiAgICAgICAgfQogICAgICAgIF9jaGFydC5NSU5fUkFESVVTID0gcmFkaXVzOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IG9yIHNldCB0aGUgbWluaW11bSByYWRpdXMgZm9yIGxhYmVsIHJlbmRlcmluZy4gSWYgYSBidWJibGUncyByYWRpdXMgaXMgbGVzcyB0aGFuIHRoaXMgdmFsdWUKICAgICAqIHRoZW4gbm8gbGFiZWwgd2lsbCBiZSByZW5kZXJlZC4KICAgICAqIEBtZXRob2QgbWluUmFkaXVzV2l0aExhYmVsCiAgICAgKiBAbWVtYmVyb2YgZGMuYnViYmxlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtOdW1iZXJ9IFtyYWRpdXM9MTBdCiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9CiAgICAgKiBAcmV0dXJuIHtkYy5idWJibGVNaXhpbn0KICAgICAqLwoKICAgIF9jaGFydC5taW5SYWRpdXNXaXRoTGFiZWwgPSBmdW5jdGlvbiAocmFkaXVzKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfbWluUmFkaXVzV2l0aExhYmVsOwogICAgICAgIH0KICAgICAgICBfbWluUmFkaXVzV2l0aExhYmVsID0gcmFkaXVzOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IG9yIHNldCB0aGUgbWF4aW11bSByZWxhdGl2ZSBzaXplIG9mIGEgYnViYmxlIHRvIHRoZSBsZW5ndGggb2YgeCBheGlzLiBUaGlzIHZhbHVlIGlzIHVzZWZ1bAogICAgICogd2hlbiB0aGUgZGlmZmVyZW5jZSBpbiByYWRpdXMgYmV0d2VlbiBidWJibGVzIGlzIHRvbyBncmVhdC4KICAgICAqIEBtZXRob2QgbWF4QnViYmxlUmVsYXRpdmVTaXplCiAgICAgKiBAbWVtYmVyb2YgZGMuYnViYmxlTWl4aW4KICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtOdW1iZXJ9IFtyZWxhdGl2ZVNpemU9MC4zXQogICAgICogQHJldHVybiB7TnVtYmVyfQogICAgICogQHJldHVybiB7ZGMuYnViYmxlTWl4aW59CiAgICAgKi8KICAgIF9jaGFydC5tYXhCdWJibGVSZWxhdGl2ZVNpemUgPSBmdW5jdGlvbiAocmVsYXRpdmVTaXplKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfbWF4QnViYmxlUmVsYXRpdmVTaXplOwogICAgICAgIH0KICAgICAgICBfbWF4QnViYmxlUmVsYXRpdmVTaXplID0gcmVsYXRpdmVTaXplOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIF9jaGFydC5mYWRlRGVzZWxlY3RlZEFyZWEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKF9jaGFydC5oYXNGaWx0ZXIoKSkgewogICAgICAgICAgICBfY2hhcnQuc2VsZWN0QWxsKCdnLicgKyBfY2hhcnQuQlVCQkxFX05PREVfQ0xBU1MpLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIGlmIChfY2hhcnQuaXNTZWxlY3RlZE5vZGUoZCkpIHsKICAgICAgICAgICAgICAgICAgICBfY2hhcnQuaGlnaGxpZ2h0U2VsZWN0ZWQodGhpcyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIF9jaGFydC5mYWRlRGVzZWxlY3RlZCh0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2NoYXJ0LnNlbGVjdEFsbCgnZy4nICsgX2NoYXJ0LkJVQkJMRV9OT0RFX0NMQVNTKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF9jaGFydC5yZXNldEhpZ2hsaWdodCh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKCiAgICBfY2hhcnQuaXNTZWxlY3RlZE5vZGUgPSBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBfY2hhcnQuaGFzRmlsdGVyKGQua2V5KTsKICAgIH07CgogICAgX2NoYXJ0Lm9uQ2xpY2sgPSBmdW5jdGlvbiAoZCkgewogICAgICAgIHZhciBmaWx0ZXIgPSBkLmtleTsKICAgICAgICBkYy5ldmVudHMudHJpZ2dlcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9jaGFydC5maWx0ZXIoZmlsdGVyKTsKICAgICAgICAgICAgX2NoYXJ0LnJlZHJhd0dyb3VwKCk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIHJldHVybiBfY2hhcnQ7Cn07CgovKioKICogVGhlIHBpZSBjaGFydCBpbXBsZW1lbnRhdGlvbiBpcyB1c3VhbGx5IHVzZWQgdG8gdmlzdWFsaXplIGEgc21hbGwgY2F0ZWdvcmljYWwgZGlzdHJpYnV0aW9uLiAgVGhlIHBpZQogKiBjaGFydCB1c2VzIGtleUFjY2Vzc29yIHRvIGRldGVybWluZSB0aGUgc2xpY2VzLCBhbmQgdmFsdWVBY2Nlc3NvciB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgZWFjaAogKiBzbGljZSByZWxhdGl2ZSB0byB0aGUgc3VtIG9mIGFsbCB2YWx1ZXMuIFNsaWNlcyBhcmUgb3JkZXJlZCBieSB7QGxpbmsgZGMuYmFzZU1peGluI29yZGVyaW5nIG9yZGVyaW5nfQogKiB3aGljaCBkZWZhdWx0cyB0byBzb3J0aW5nIGJ5IGtleS4KICoKICogRXhhbXBsZXM6CiAqIC0ge0BsaW5rIGh0dHA6Ly9kYy1qcy5naXRodWIuY29tL2RjLmpzLyBOYXNkYXEgMTAwIEluZGV4fQogKiBAY2xhc3MgcGllQ2hhcnQKICogQG1lbWJlcm9mIGRjCiAqIEBtaXhlcyBkYy5jYXBNaXhpbgogKiBAbWl4ZXMgZGMuY29sb3JNaXhpbgogKiBAbWl4ZXMgZGMuYmFzZU1peGluCiAqIEBleGFtcGxlCiAqIC8vIGNyZWF0ZSBhIHBpZSBjaGFydCB1bmRlciAjY2hhcnQtY29udGFpbmVyMSBlbGVtZW50IHVzaW5nIHRoZSBkZWZhdWx0IGdsb2JhbCBjaGFydCBncm91cAogKiB2YXIgY2hhcnQxID0gZGMucGllQ2hhcnQoJyNjaGFydC1jb250YWluZXIxJyk7CiAqIC8vIGNyZWF0ZSBhIHBpZSBjaGFydCB1bmRlciAjY2hhcnQtY29udGFpbmVyMiBlbGVtZW50IHVzaW5nIGNoYXJ0IGdyb3VwIEEKICogdmFyIGNoYXJ0MiA9IGRjLnBpZUNoYXJ0KCcjY2hhcnQtY29udGFpbmVyMicsICdjaGFydEdyb3VwQScpOwogKiBAcGFyYW0ge1N0cmluZ3xub2RlfGQzLnNlbGVjdGlvbn0gcGFyZW50IC0gQW55IHZhbGlkCiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWJvc3RvY2svZDMvd2lraS9TZWxlY3Rpb25zI3NlbGVjdGluZy1lbGVtZW50cyBkMyBzaW5nbGUgc2VsZWN0b3J9IHNwZWNpZnlpbmcKICogYSBkb20gYmxvY2sgZWxlbWVudCBzdWNoIGFzIGEgZGl2OyBvciBhIGRvbSBlbGVtZW50IG9yIGQzIHNlbGVjdGlvbi4KICogQHBhcmFtIHtTdHJpbmd9IFtjaGFydEdyb3VwXSAtIFRoZSBuYW1lIG9mIHRoZSBjaGFydCBncm91cCB0aGlzIGNoYXJ0IGluc3RhbmNlIHNob3VsZCBiZSBwbGFjZWQgaW4uCiAqIEludGVyYWN0aW9uIHdpdGggYSBjaGFydCB3aWxsIG9ubHkgdHJpZ2dlciBldmVudHMgYW5kIHJlZHJhd3Mgd2l0aGluIHRoZSBjaGFydCdzIGdyb3VwLgogKiBAcmV0dXJuIHtkYy5waWVDaGFydH0KICovCmRjLnBpZUNoYXJ0ID0gZnVuY3Rpb24gKHBhcmVudCwgY2hhcnRHcm91cCkgewogICAgdmFyIERFRkFVTFRfTUlOX0FOR0xFX0ZPUl9MQUJFTCA9IDAuNTsKCiAgICB2YXIgX3NsaWNlQ3NzQ2xhc3MgPSAncGllLXNsaWNlJzsKICAgIHZhciBfbGFiZWxDc3NDbGFzcyA9ICdwaWUtbGFiZWwnOwogICAgdmFyIF9zbGljZUdyb3VwQ3NzQ2xhc3MgPSAncGllLXNsaWNlLWdyb3VwJzsKICAgIHZhciBfbGFiZWxHcm91cENzc0NsYXNzID0gJ3BpZS1sYWJlbC1ncm91cCc7CiAgICB2YXIgX2VtcHR5Q3NzQ2xhc3MgPSAnZW1wdHktY2hhcnQnOwogICAgdmFyIF9lbXB0eVRpdGxlID0gJ2VtcHR5JzsKCiAgICB2YXIgX3JhZGl1cywKICAgICAgICBfZ2l2ZW5SYWRpdXMsIC8vIHNwZWNpZmllZCByYWRpdXMsIGlmIGFueQogICAgICAgIF9pbm5lclJhZGl1cyA9IDAsCiAgICAgICAgX2V4dGVybmFsUmFkaXVzUGFkZGluZyA9IDA7CgogICAgdmFyIF9nOwogICAgdmFyIF9jeDsKICAgIHZhciBfY3k7CiAgICB2YXIgX21pbkFuZ2xlRm9yTGFiZWwgPSBERUZBVUxUX01JTl9BTkdMRV9GT1JfTEFCRUw7CiAgICB2YXIgX2V4dGVybmFsTGFiZWxSYWRpdXM7CiAgICB2YXIgX2RyYXdQYXRocyA9IGZhbHNlOwogICAgdmFyIF9jaGFydCA9IGRjLmNhcE1peGluKGRjLmNvbG9yTWl4aW4oZGMuYmFzZU1peGluKHt9KSkpOwoKICAgIF9jaGFydC5jb2xvckFjY2Vzc29yKF9jaGFydC5jYXBwZWRLZXlBY2Nlc3Nvcik7CgogICAgX2NoYXJ0LnRpdGxlKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIF9jaGFydC5jYXBwZWRLZXlBY2Nlc3NvcihkKSArICc6ICcgKyBfY2hhcnQuY2FwcGVkVmFsdWVBY2Nlc3NvcihkKTsKICAgIH0pOwoKICAgIC8qKgogICAgICogR2V0IG9yIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2xpY2VzIHRoZSBwaWUgY2hhcnQgd2lsbCBnZW5lcmF0ZS4gVGhlIHRvcCBzbGljZXMgYXJlIGRldGVybWluZWQgYnkKICAgICAqIHZhbHVlIGZyb20gaGlnaCB0byBsb3cuIE90aGVyIHNsaWNlcyBleGVlZGluZyB0aGUgY2FwIHdpbGwgYmUgcm9sbGVkIHVwIGludG8gb25lIHNpbmdsZSAqT3RoZXJzKiBzbGljZS4KICAgICAqIEBtZXRob2Qgc2xpY2VzQ2FwCiAgICAgKiBAbWVtYmVyb2YgZGMucGllQ2hhcnQKICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtOdW1iZXJ9IFtjYXBdCiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9CiAgICAgKiBAcmV0dXJuIHtkYy5waWVDaGFydH0KICAgICAqLwogICAgX2NoYXJ0LnNsaWNlc0NhcCA9IF9jaGFydC5jYXA7CgogICAgX2NoYXJ0LmxhYmVsKF9jaGFydC5jYXBwZWRLZXlBY2Nlc3Nvcik7CiAgICBfY2hhcnQucmVuZGVyTGFiZWwodHJ1ZSk7CgogICAgX2NoYXJ0LnRyYW5zaXRpb25EdXJhdGlvbigzNTApOwoKICAgIF9jaGFydC5fZG9SZW5kZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgX2NoYXJ0LnJlc2V0U3ZnKCk7CgogICAgICAgIF9nID0gX2NoYXJ0LnN2ZygpCiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgX2NoYXJ0LmN4KCkgKyAnLCcgKyBfY2hhcnQuY3koKSArICcpJyk7CgogICAgICAgIF9nLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgX3NsaWNlR3JvdXBDc3NDbGFzcyk7CiAgICAgICAgX2cuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCBfbGFiZWxHcm91cENzc0NsYXNzKTsKCiAgICAgICAgZHJhd0NoYXJ0KCk7CgogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGRyYXdDaGFydCAoKSB7CiAgICAgICAgLy8gc2V0IHJhZGl1cyBvbiBiYXNpcyBvZiBjaGFydCBkaW1lbnNpb24gaWYgbWlzc2luZwogICAgICAgIF9yYWRpdXMgPSBfZ2l2ZW5SYWRpdXMgPyBfZ2l2ZW5SYWRpdXMgOiBkMy5taW4oW19jaGFydC53aWR0aCgpLCBfY2hhcnQuaGVpZ2h0KCldKSAvIDI7CgogICAgICAgIHZhciBhcmMgPSBidWlsZEFyY3MoKTsKCiAgICAgICAgdmFyIHBpZSA9IHBpZUxheW91dCgpOwogICAgICAgIHZhciBwaWVEYXRhOwogICAgICAgIC8vIGlmIHdlIGhhdmUgZGF0YS4uLgogICAgICAgIGlmIChkMy5zdW0oX2NoYXJ0LmRhdGEoKSwgX2NoYXJ0LnZhbHVlQWNjZXNzb3IoKSkpIHsKICAgICAgICAgICAgcGllRGF0YSA9IHBpZShfY2hhcnQuZGF0YSgpKTsKICAgICAgICAgICAgX2cuY2xhc3NlZChfZW1wdHlDc3NDbGFzcywgZmFsc2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSdkIGJlIGdldHRpbmcgTmFOcywgc28gb3ZlcnJpZGUKICAgICAgICAgICAgLy8gbm90ZTogYWJ1c2Ugb3RoZXJzIGZvciBpdHMgaWdub3JpbmcgdGhlIHZhbHVlIGFjY2Vzc29yCiAgICAgICAgICAgIHBpZURhdGEgPSBwaWUoW3trZXk6IF9lbXB0eVRpdGxlLCB2YWx1ZTogMSwgb3RoZXJzOiBbX2VtcHR5VGl0bGVdfV0pOwogICAgICAgICAgICBfZy5jbGFzc2VkKF9lbXB0eUNzc0NsYXNzLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIGlmIChfZykgewogICAgICAgICAgICB2YXIgc2xpY2VzID0gX2cuc2VsZWN0KCdnLicgKyBfc2xpY2VHcm91cENzc0NsYXNzKQogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnZy4nICsgX3NsaWNlQ3NzQ2xhc3MpCiAgICAgICAgICAgICAgICAuZGF0YShwaWVEYXRhKTsKCiAgICAgICAgICAgIHZhciBsYWJlbHMgPSBfZy5zZWxlY3QoJ2cuJyArIF9sYWJlbEdyb3VwQ3NzQ2xhc3MpCiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCd0ZXh0LicgKyBfbGFiZWxDc3NDbGFzcykKICAgICAgICAgICAgICAgIC5kYXRhKHBpZURhdGEpOwoKICAgICAgICAgICAgY3JlYXRlRWxlbWVudHMoc2xpY2VzLCBsYWJlbHMsIGFyYywgcGllRGF0YSk7CgogICAgICAgICAgICB1cGRhdGVFbGVtZW50cyhwaWVEYXRhLCBhcmMpOwoKICAgICAgICAgICAgcmVtb3ZlRWxlbWVudHMoc2xpY2VzLCBsYWJlbHMpOwoKICAgICAgICAgICAgaGlnaGxpZ2h0RmlsdGVyKCk7CgogICAgICAgICAgICBkYy50cmFuc2l0aW9uKF9nLCBfY2hhcnQudHJhbnNpdGlvbkR1cmF0aW9uKCkpCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgX2NoYXJ0LmN4KCkgKyAnLCcgKyBfY2hhcnQuY3koKSArICcpJyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRzIChzbGljZXMsIGxhYmVscywgYXJjLCBwaWVEYXRhKSB7CiAgICAgICAgdmFyIHNsaWNlc0VudGVyID0gY3JlYXRlU2xpY2VOb2RlcyhzbGljZXMpOwoKICAgICAgICBjcmVhdGVTbGljZVBhdGgoc2xpY2VzRW50ZXIsIGFyYyk7CgogICAgICAgIGNyZWF0ZVRpdGxlcyhzbGljZXNFbnRlcik7CgogICAgICAgIGNyZWF0ZUxhYmVscyhsYWJlbHMsIHBpZURhdGEsIGFyYyk7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlU2xpY2VOb2RlcyAoc2xpY2VzKSB7CiAgICAgICAgdmFyIHNsaWNlc0VudGVyID0gc2xpY2VzCiAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAuYXR0cignY2xhc3MnLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9zbGljZUNzc0NsYXNzICsgJyBfJyArIGk7CiAgICAgICAgICAgIH0pOwogICAgICAgIHJldHVybiBzbGljZXNFbnRlcjsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVTbGljZVBhdGggKHNsaWNlc0VudGVyLCBhcmMpIHsKICAgICAgICB2YXIgc2xpY2VQYXRoID0gc2xpY2VzRW50ZXIuYXBwZW5kKCdwYXRoJykKICAgICAgICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsKQogICAgICAgICAgICAub24oJ2NsaWNrJywgb25DbGljaykKICAgICAgICAgICAgLmF0dHIoJ2QnLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNhZmVBcmMoZCwgaSwgYXJjKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIGRjLnRyYW5zaXRpb24oc2xpY2VQYXRoLCBfY2hhcnQudHJhbnNpdGlvbkR1cmF0aW9uKCksIGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICAgIHMuYXR0clR3ZWVuKCdkJywgdHdlZW5QaWUpOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZVRpdGxlcyAoc2xpY2VzRW50ZXIpIHsKICAgICAgICBpZiAoX2NoYXJ0LnJlbmRlclRpdGxlKCkpIHsKICAgICAgICAgICAgc2xpY2VzRW50ZXIuYXBwZW5kKCd0aXRsZScpLnRleHQoZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnQudGl0bGUoKShkLmRhdGEpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgX2NoYXJ0Ll9hcHBseUxhYmVsVGV4dCA9IGZ1bmN0aW9uIChsYWJlbHMpIHsKICAgICAgICBsYWJlbHMKICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZC5kYXRhOwogICAgICAgICAgICAgICAgaWYgKChzbGljZUhhc05vRGF0YShkYXRhKSB8fCBzbGljZVRvb1NtYWxsKGQpKSAmJiAhaXNTZWxlY3RlZFNsaWNlKGQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFydC5sYWJlbCgpKGQuZGF0YSk7CiAgICAgICAgICAgIH0pOwogICAgfTsKCiAgICBmdW5jdGlvbiBwb3NpdGlvbkxhYmVscyAobGFiZWxzLCBhcmMpIHsKICAgICAgICBfY2hhcnQuX2FwcGx5TGFiZWxUZXh0KGxhYmVscyk7CiAgICAgICAgZGMudHJhbnNpdGlvbihsYWJlbHMsIF9jaGFydC50cmFuc2l0aW9uRHVyYXRpb24oKSkKICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxQb3NpdGlvbihkLCBhcmMpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJyk7CiAgICB9CgogICAgZnVuY3Rpb24gaGlnaGxpZ2h0U2xpY2UgKGksIHdoZXRoZXIpIHsKICAgICAgICBfY2hhcnQuc2VsZWN0KCdnLnBpZS1zbGljZS5fJyArIGkpCiAgICAgICAgICAgIC5jbGFzc2VkKCdoaWdobGlnaHQnLCB3aGV0aGVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVMYWJlbHMgKGxhYmVscywgcGllRGF0YSwgYXJjKSB7CiAgICAgICAgaWYgKF9jaGFydC5yZW5kZXJMYWJlbCgpKSB7CiAgICAgICAgICAgIHZhciBsYWJlbHNFbnRlciA9IGxhYmVscwogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2xhc3NlcyA9IF9zbGljZUNzc0NsYXNzICsgJyAnICsgX2xhYmVsQ3NzQ2xhc3MgKyAnIF8nICsgaTsKICAgICAgICAgICAgICAgICAgICBpZiAoX2V4dGVybmFsTGFiZWxSYWRpdXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlcyArPSAnIGV4dGVybmFsJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzZXM7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCdjbGljaycsIG9uQ2xpY2spCiAgICAgICAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0U2xpY2UoaSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0U2xpY2UoaSwgZmFsc2UpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHBvc2l0aW9uTGFiZWxzKGxhYmVsc0VudGVyLCBhcmMpOwogICAgICAgICAgICBpZiAoX2V4dGVybmFsTGFiZWxSYWRpdXMgJiYgX2RyYXdQYXRocykgewogICAgICAgICAgICAgICAgdXBkYXRlTGFiZWxQYXRocyhwaWVEYXRhLCBhcmMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUxhYmVsUGF0aHMgKHBpZURhdGEsIGFyYykgewogICAgICAgIHZhciBwb2x5bGluZSA9IF9nLnNlbGVjdEFsbCgncG9seWxpbmUuJyArIF9zbGljZUNzc0NsYXNzKQogICAgICAgICAgICAgICAgLmRhdGEocGllRGF0YSk7CgogICAgICAgIHBvbHlsaW5lCiAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgncG9seWxpbmUnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3BpZS1wYXRoIF8nICsgaSArICcgJyArIF9zbGljZUNzc0NsYXNzOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5vbignY2xpY2snLCBvbkNsaWNrKQogICAgICAgICAgICAgICAgLm9uKCdtb3VzZW92ZXInLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodFNsaWNlKGksIHRydWUpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodFNsaWNlKGksIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICBwb2x5bGluZS5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgdmFyIGFyYzIgPSBkMy5zdmcuYXJjKCkKICAgICAgICAgICAgICAgIC5vdXRlclJhZGl1cyhfcmFkaXVzIC0gX2V4dGVybmFsUmFkaXVzUGFkZGluZyArIF9leHRlcm5hbExhYmVsUmFkaXVzKQogICAgICAgICAgICAgICAgLmlubmVyUmFkaXVzKF9yYWRpdXMgLSBfZXh0ZXJuYWxSYWRpdXNQYWRkaW5nKTsKICAgICAgICB2YXIgdHJhbnNpdGlvbiA9IGRjLnRyYW5zaXRpb24ocG9seWxpbmUsIF9jaGFydC50cmFuc2l0aW9uRHVyYXRpb24oKSk7CiAgICAgICAgLy8gdGhpcyBpcyBvbmUgcmFyZSBjYXNlIHdoZXJlIGQzLnNlbGVjdGlvbiBkaWZmZXJzIGZyb20gZDMudHJhbnNpdGlvbgogICAgICAgIGlmICh0cmFuc2l0aW9uLmF0dHJUd2VlbikgewogICAgICAgICAgICB0cmFuc2l0aW9uCiAgICAgICAgICAgICAgICAuYXR0clR3ZWVuKCdwb2ludHMnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnQgPSB0aGlzLl9jdXJyZW50IHx8IGQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGludGVycG9sYXRlID0gZDMuaW50ZXJwb2xhdGUodGhpcy5fY3VycmVudCwgZCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudCA9IGludGVycG9sYXRlKDApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZDIgPSBpbnRlcnBvbGF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFthcmMuY2VudHJvaWQoZDIpLCBhcmMyLmNlbnRyb2lkKGQyKV07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRyYW5zaXRpb24uYXR0cigncG9pbnRzJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbYXJjLmNlbnRyb2lkKGQpLCBhcmMyLmNlbnRyb2lkKGQpXTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRyYW5zaXRpb24uc3R5bGUoJ3Zpc2liaWxpdHknLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICByZXR1cm4gZC5lbmRBbmdsZSAtIGQuc3RhcnRBbmdsZSA8IDAuMDAwMSA/ICdoaWRkZW4nIDogJ3Zpc2libGUnOwogICAgICAgIH0pOwoKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50cyAocGllRGF0YSwgYXJjKSB7CiAgICAgICAgdXBkYXRlU2xpY2VQYXRocyhwaWVEYXRhLCBhcmMpOwogICAgICAgIHVwZGF0ZUxhYmVscyhwaWVEYXRhLCBhcmMpOwogICAgICAgIHVwZGF0ZVRpdGxlcyhwaWVEYXRhKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVTbGljZVBhdGhzIChwaWVEYXRhLCBhcmMpIHsKICAgICAgICB2YXIgc2xpY2VQYXRocyA9IF9nLnNlbGVjdEFsbCgnZy4nICsgX3NsaWNlQ3NzQ2xhc3MpCiAgICAgICAgICAgIC5kYXRhKHBpZURhdGEpCiAgICAgICAgICAgIC5zZWxlY3QoJ3BhdGgnKQogICAgICAgICAgICAuYXR0cignZCcsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2FmZUFyYyhkLCBpLCBhcmMpOwogICAgICAgICAgICB9KTsKICAgICAgICBkYy50cmFuc2l0aW9uKHNsaWNlUGF0aHMsIF9jaGFydC50cmFuc2l0aW9uRHVyYXRpb24oKSwKICAgICAgICAgICAgZnVuY3Rpb24gKHMpIHsKICAgICAgICAgICAgICAgIHMuYXR0clR3ZWVuKCdkJywgdHdlZW5QaWUpOwogICAgICAgICAgICB9KS5hdHRyKCdmaWxsJywgZmlsbCk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlTGFiZWxzIChwaWVEYXRhLCBhcmMpIHsKICAgICAgICBpZiAoX2NoYXJ0LnJlbmRlckxhYmVsKCkpIHsKICAgICAgICAgICAgdmFyIGxhYmVscyA9IF9nLnNlbGVjdEFsbCgndGV4dC4nICsgX2xhYmVsQ3NzQ2xhc3MpCiAgICAgICAgICAgICAgICAuZGF0YShwaWVEYXRhKTsKICAgICAgICAgICAgcG9zaXRpb25MYWJlbHMobGFiZWxzLCBhcmMpOwogICAgICAgICAgICBpZiAoX2V4dGVybmFsTGFiZWxSYWRpdXMgJiYgX2RyYXdQYXRocykgewogICAgICAgICAgICAgICAgdXBkYXRlTGFiZWxQYXRocyhwaWVEYXRhLCBhcmMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZVRpdGxlcyAocGllRGF0YSkgewogICAgICAgIGlmIChfY2hhcnQucmVuZGVyVGl0bGUoKSkgewogICAgICAgICAgICBfZy5zZWxlY3RBbGwoJ2cuJyArIF9zbGljZUNzc0NsYXNzKQogICAgICAgICAgICAgICAgLmRhdGEocGllRGF0YSkKICAgICAgICAgICAgICAgIC5zZWxlY3QoJ3RpdGxlJykKICAgICAgICAgICAgICAgIC50ZXh0KGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFydC50aXRsZSgpKGQuZGF0YSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudHMgKHNsaWNlcywgbGFiZWxzKSB7CiAgICAgICAgc2xpY2VzLmV4aXQoKS5yZW1vdmUoKTsKICAgICAgICBsYWJlbHMuZXhpdCgpLnJlbW92ZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhpZ2hsaWdodEZpbHRlciAoKSB7CiAgICAgICAgaWYgKF9jaGFydC5oYXNGaWx0ZXIoKSkgewogICAgICAgICAgICBfY2hhcnQuc2VsZWN0QWxsKCdnLicgKyBfc2xpY2VDc3NDbGFzcykuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRTbGljZShkKSkgewogICAgICAgICAgICAgICAgICAgIF9jaGFydC5oaWdobGlnaHRTZWxlY3RlZCh0aGlzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgX2NoYXJ0LmZhZGVEZXNlbGVjdGVkKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfY2hhcnQuc2VsZWN0QWxsKCdnLicgKyBfc2xpY2VDc3NDbGFzcykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfY2hhcnQucmVzZXRIaWdobGlnaHQodGhpcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEdldCBvciBzZXQgdGhlIGV4dGVybmFsIHJhZGl1cyBwYWRkaW5nIG9mIHRoZSBwaWUgY2hhcnQuIFRoaXMgd2lsbCBmb3JjZSB0aGUgcmFkaXVzIG9mIHRoZQogICAgICogcGllIGNoYXJ0IHRvIGJlY29tZSBzbWFsbGVyIG9yIGxhcmdlciBkZXBlbmRpbmcgb24gdGhlIHZhbHVlLgogICAgICogQG1ldGhvZCBleHRlcm5hbFJhZGl1c1BhZGRpbmcKICAgICAqIEBtZW1iZXJvZiBkYy5waWVDaGFydAogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2V4dGVybmFsUmFkaXVzUGFkZGluZz0wXQogICAgICogQHJldHVybiB7TnVtYmVyfQogICAgICogQHJldHVybiB7ZGMucGllQ2hhcnR9CiAgICAgKi8KICAgIF9jaGFydC5leHRlcm5hbFJhZGl1c1BhZGRpbmcgPSBmdW5jdGlvbiAoZXh0ZXJuYWxSYWRpdXNQYWRkaW5nKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfZXh0ZXJuYWxSYWRpdXNQYWRkaW5nOwogICAgICAgIH0KICAgICAgICBfZXh0ZXJuYWxSYWRpdXNQYWRkaW5nID0gZXh0ZXJuYWxSYWRpdXNQYWRkaW5nOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IG9yIHNldCB0aGUgaW5uZXIgcmFkaXVzIG9mIHRoZSBwaWUgY2hhcnQuIElmIHRoZSBpbm5lciByYWRpdXMgaXMgZ3JlYXRlciB0aGFuIDBweCB0aGVuIHRoZQogICAgICogcGllIGNoYXJ0IHdpbGwgYmUgcmVuZGVyZWQgYXMgYSBkb3VnaG51dCBjaGFydC4KICAgICAqIEBtZXRob2QgaW5uZXJSYWRpdXMKICAgICAqIEBtZW1iZXJvZiBkYy5waWVDaGFydAogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2lubmVyUmFkaXVzPTBdCiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9CiAgICAgKiBAcmV0dXJuIHtkYy5waWVDaGFydH0KICAgICAqLwogICAgX2NoYXJ0LmlubmVyUmFkaXVzID0gZnVuY3Rpb24gKGlubmVyUmFkaXVzKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfaW5uZXJSYWRpdXM7CiAgICAgICAgfQogICAgICAgIF9pbm5lclJhZGl1cyA9IGlubmVyUmFkaXVzOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IG9yIHNldCB0aGUgb3V0ZXIgcmFkaXVzLiBJZiB0aGUgcmFkaXVzIGlzIG5vdCBzZXQsIGl0IHdpbGwgYmUgaGFsZiBvZiB0aGUgbWluaW11bSBvZiB0aGUKICAgICAqIGNoYXJ0IHdpZHRoIGFuZCBoZWlnaHQuCiAgICAgKiBAbWV0aG9kIHJhZGl1cwogICAgICogQG1lbWJlcm9mIGRjLnBpZUNoYXJ0CiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmFkaXVzXQogICAgICogQHJldHVybiB7TnVtYmVyfQogICAgICogQHJldHVybiB7ZGMucGllQ2hhcnR9CiAgICAgKi8KICAgIF9jaGFydC5yYWRpdXMgPSBmdW5jdGlvbiAocmFkaXVzKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfZ2l2ZW5SYWRpdXM7CiAgICAgICAgfQogICAgICAgIF9naXZlblJhZGl1cyA9IHJhZGl1czsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIEdldCBvciBzZXQgY2VudGVyIHggY29vcmRpbmF0ZSBwb3NpdGlvbi4gRGVmYXVsdCBpcyBjZW50ZXIgb2Ygc3ZnLgogICAgICogQG1ldGhvZCBjeAogICAgICogQG1lbWJlcm9mIGRjLnBpZUNoYXJ0CiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbY3hdCiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9CiAgICAgKiBAcmV0dXJuIHtkYy5waWVDaGFydH0KICAgICAqLwogICAgX2NoYXJ0LmN4ID0gZnVuY3Rpb24gKGN4KSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiAoX2N4IHx8ICBfY2hhcnQud2lkdGgoKSAvIDIpOwogICAgICAgIH0KICAgICAgICBfY3ggPSBjeDsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfTsKCiAgICAvKioKICAgICAqIEdldCBvciBzZXQgY2VudGVyIHkgY29vcmRpbmF0ZSBwb3NpdGlvbi4gRGVmYXVsdCBpcyBjZW50ZXIgb2Ygc3ZnLgogICAgICogQG1ldGhvZCBjeQogICAgICogQG1lbWJlcm9mIGRjLnBpZUNoYXJ0CiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbY3ldCiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9CiAgICAgKiBAcmV0dXJuIHtkYy5waWVDaGFydH0KICAgICAqLwogICAgX2NoYXJ0LmN5ID0gZnVuY3Rpb24gKGN5KSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiAoX2N5IHx8ICBfY2hhcnQuaGVpZ2h0KCkgLyAyKTsKICAgICAgICB9CiAgICAgICAgX2N5ID0gY3k7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgZnVuY3Rpb24gYnVpbGRBcmNzICgpIHsKICAgICAgICByZXR1cm4gZDMuc3ZnLmFyYygpCiAgICAgICAgICAgIC5vdXRlclJhZGl1cyhfcmFkaXVzIC0gX2V4dGVybmFsUmFkaXVzUGFkZGluZykKICAgICAgICAgICAgLmlubmVyUmFkaXVzKF9pbm5lclJhZGl1cyk7CiAgICB9CgogICAgZnVuY3Rpb24gaXNTZWxlY3RlZFNsaWNlIChkKSB7CiAgICAgICAgcmV0dXJuIF9jaGFydC5oYXNGaWx0ZXIoX2NoYXJ0LmNhcHBlZEtleUFjY2Vzc29yKGQuZGF0YSkpOwogICAgfQoKICAgIF9jaGFydC5fZG9SZWRyYXcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZHJhd0NoYXJ0KCk7CiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXQgb3Igc2V0IHRoZSBtaW5pbWFsIHNsaWNlIGFuZ2xlIGZvciBsYWJlbCByZW5kZXJpbmcuIEFueSBzbGljZSB3aXRoIGEgc21hbGxlciBhbmdsZSB3aWxsIG5vdAogICAgICogZGlzcGxheSBhIHNsaWNlIGxhYmVsLgogICAgICogQG1ldGhvZCBtaW5BbmdsZUZvckxhYmVsCiAgICAgKiBAbWVtYmVyb2YgZGMucGllQ2hhcnQKICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtOdW1iZXJ9IFttaW5BbmdsZUZvckxhYmVsPTAuNV0KICAgICAqIEByZXR1cm4ge051bWJlcn0KICAgICAqIEByZXR1cm4ge2RjLnBpZUNoYXJ0fQogICAgICovCiAgICBfY2hhcnQubWluQW5nbGVGb3JMYWJlbCA9IGZ1bmN0aW9uIChtaW5BbmdsZUZvckxhYmVsKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBfbWluQW5nbGVGb3JMYWJlbDsKICAgICAgICB9CiAgICAgICAgX21pbkFuZ2xlRm9yTGFiZWwgPSBtaW5BbmdsZUZvckxhYmVsOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIGZ1bmN0aW9uIHBpZUxheW91dCAoKSB7CiAgICAgICAgcmV0dXJuIGQzLmxheW91dC5waWUoKS5zb3J0KG51bGwpLnZhbHVlKF9jaGFydC5jYXBwZWRWYWx1ZUFjY2Vzc29yKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzbGljZVRvb1NtYWxsIChkKSB7CiAgICAgICAgdmFyIGFuZ2xlID0gKGQuZW5kQW5nbGUgLSBkLnN0YXJ0QW5nbGUpOwogICAgICAgIHJldHVybiBpc05hTihhbmdsZSkgfHwgYW5nbGUgPCBfbWluQW5nbGVGb3JMYWJlbDsKICAgIH0KCiAgICBmdW5jdGlvbiBzbGljZUhhc05vRGF0YSAoZCkgewogICAgICAgIHJldHVybiBfY2hhcnQuY2FwcGVkVmFsdWVBY2Nlc3NvcihkKSA9PT0gMDsKICAgIH0KCiAgICBmdW5jdGlvbiB0d2VlblBpZSAoYikgewogICAgICAgIGIuaW5uZXJSYWRpdXMgPSBfaW5uZXJSYWRpdXM7CiAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLl9jdXJyZW50OwogICAgICAgIGlmIChpc09mZkNhbnZhcyhjdXJyZW50KSkgewogICAgICAgICAgICBjdXJyZW50ID0ge3N0YXJ0QW5nbGU6IDAsIGVuZEFuZ2xlOiAwfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBvbmx5IGludGVycG9sYXRlIHN0YXJ0QW5nbGUgJiBlbmRBbmdsZSwgbm90IHRoZSB3aG9sZSBkYXRhIG9iamVjdAogICAgICAgICAgICBjdXJyZW50ID0ge3N0YXJ0QW5nbGU6IGN1cnJlbnQuc3RhcnRBbmdsZSwgZW5kQW5nbGU6IGN1cnJlbnQuZW5kQW5nbGV9OwogICAgICAgIH0KICAgICAgICB2YXIgaSA9IGQzLmludGVycG9sYXRlKGN1cnJlbnQsIGIpOwogICAgICAgIHRoaXMuX2N1cnJlbnQgPSBpKDApOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICByZXR1cm4gc2FmZUFyYyhpKHQpLCAwLCBidWlsZEFyY3MoKSk7CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc09mZkNhbnZhcyAoY3VycmVudCkgewogICAgICAgIHJldHVybiAhY3VycmVudCB8fCBpc05hTihjdXJyZW50LnN0YXJ0QW5nbGUpIHx8IGlzTmFOKGN1cnJlbnQuZW5kQW5nbGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbGwgKGQsIGkpIHsKICAgICAgICByZXR1cm4gX2NoYXJ0LmdldENvbG9yKGQuZGF0YSwgaSk7CiAgICB9CgogICAgZnVuY3Rpb24gb25DbGljayAoZCwgaSkgewogICAgICAgIGlmIChfZy5hdHRyKCdjbGFzcycpICE9PSBfZW1wdHlDc3NDbGFzcykgewogICAgICAgICAgICBfY2hhcnQub25DbGljayhkLmRhdGEsIGkpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzYWZlQXJjIChkLCBpLCBhcmMpIHsKICAgICAgICB2YXIgcGF0aCA9IGFyYyhkLCBpKTsKICAgICAgICBpZiAocGF0aC5pbmRleE9mKCdOYU4nKSA+PSAwKSB7CiAgICAgICAgICAgIHBhdGggPSAnTTAsMCc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXRoOwogICAgfQoKICAgIC8qKgogICAgICogVGl0bGUgdG8gdXNlIGZvciB0aGUgb25seSBzbGljZSB3aGVuIHRoZXJlIGlzIG5vIGRhdGEuCiAgICAgKiBAbWV0aG9kIGVtcHR5VGl0bGUKICAgICAqIEBtZW1iZXJvZiBkYy5waWVDaGFydAogICAgICogQGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW3RpdGxlXQogICAgICogQHJldHVybiB7U3RyaW5nfQogICAgICogQHJldHVybiB7ZGMucGllQ2hhcnR9CiAgICAgKi8KICAgIF9jaGFydC5lbXB0eVRpdGxlID0gZnVuY3Rpb24gKHRpdGxlKSB7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIF9lbXB0eVRpdGxlOwogICAgICAgIH0KICAgICAgICBfZW1wdHlUaXRsZSA9IHRpdGxlOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIC8qKgogICAgICogUG9zaXRpb24gc2xpY2UgbGFiZWxzIG9mZnNldCBmcm9tIHRoZSBvdXRlciBlZGdlIG9mIHRoZSBjaGFydAogICAgICoKICAgICAqIFRoZSBnaXZlbiBhcmd1bWVudCBzZXRzIHRoZSByYWRpYWwgb2Zmc2V0LgogICAgICogQG1ldGhvZCBleHRlcm5hbExhYmVscwogICAgICogQG1lbWJlcm9mIGRjLnBpZUNoYXJ0CiAgICAgKiBAaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZXh0ZXJuYWxMYWJlbFJhZGl1c10KICAgICAqIEByZXR1cm4ge051bWJlcn0KICAgICAqIEByZXR1cm4ge2RjLnBpZUNoYXJ0fQogICAgICovCiAgICBfY2hhcnQuZXh0ZXJuYWxMYWJlbHMgPSBmdW5jdGlvbiAoZXh0ZXJuYWxMYWJlbFJhZGl1cykgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBfZXh0ZXJuYWxMYWJlbFJhZGl1czsKICAgICAgICB9IGVsc2UgaWYgKGV4dGVybmFsTGFiZWxSYWRpdXMpIHsKICAgICAgICAgICAgX2V4dGVybmFsTGFiZWxSYWRpdXMgPSBleHRlcm5hbExhYmVsUmFkaXVzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9leHRlcm5hbExhYmVsUmFkaXVzID0gdW5kZWZpbmVkOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIF9jaGFydDsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXQgb3Igc2V0IHdoZXRoZXIgdG8gZHJhdyBsaW5lcyBmcm9tIHBpZSBzbGljZXMgdG8gdGhlaXIgbGFiZWxzLgogICAgICoKICAgICAqIEBtZXRob2QgZHJhd1BhdGhzCiAgICAgKiBAbWVtYmVyb2YgZGMucGllQ2hhcnQKICAgICAqIEBpbnN0YW5jZQogICAgICogQHBhcmFtIHtCb29sZWFufSBbZHJhd1BhdGhzXQogICAgICogQHJldHVybiB7Qm9vbGVhbn0KICAgICAqIEByZXR1cm4ge2RjLnBpZUNoYXJ0fQogICAgICovCiAgICBfY2hhcnQuZHJhd1BhdGhzID0gZnVuY3Rpb24gKGRyYXdQYXRocykgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBfZHJhd1BhdGhzOwogICAgICAgIH0KICAgICAgICBfZHJhd1BhdGhzID0gZHJhd1BhdGhzOwogICAgICAgIHJldHVybiBfY2hhcnQ7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGxhYmVsUG9zaXRpb24gKGQsIGFyYykgewogICAgICAgIHZhciBjZW50cm9pZDsKICAgICAgICBpZiAoX2V4dGVybmFsTGFiZWxSYWRpdXMpIHsKICAgICAgICAgICAgY2VudHJvaWQgPSBkMy5zdmcuYXJjKCkKICAgICAgICAgICAgICAgIC5vdXRlclJhZGl1cyhfcmFkaXVzIC0gX2V4dGVybmFsUmFkaXVzUGFkZGluZyArIF9leHRlcm5hbExhYmVsUmFkaXVzKQogICAgICAgICAgICAgICAgLmlubmVyUmFkaXVzKF9yYWRpdXMgLSBfZXh0ZXJuYWxSYWRpdXNQYWRkaW5nICsgX2V4dGVybmFsTGFiZWxSYWRpdXMpCiAgICAgICAgICAgICAgICAuY2VudHJvaWQoZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2VudHJvaWQgPSBhcmMuY2VudHJvaWQoZCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc05hTihjZW50cm9pZFswXSkgfHwgaXNOYU4oY2VudHJvaWRbMV0pKSB7CiAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKDAsMCknOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBjZW50cm9pZCArICcpJzsKICAgICAgICB9CiAgICB9CgogICAgX2NoYXJ0LmxlZ2VuZGFibGVzID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBfY2hhcnQuZGF0YSgpLm1hcChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICB2YXIgbGVnZW5kYWJsZSA9IHtuYW1lOiBkLmtleSwgZGF0YTogZC52YWx1ZSwgb3RoZXJzOiBkLm90aGVycywgY2hhcnQ6IF9jaGFydH07CiAgICAgICAgICAgIGxlZ2VuZGFibGUuY29sb3IgPSBfY2hhcnQuZ2V0Q29sb3IoZCwgaSk7CiAgICAgICAgICAgIHJldHVybiBsZWdlbmRhYmxlOwogICAgICAgIH0pOwogICAgfTsKCiAgICBfY2hhcnQubGVnZW5kSGlnaGxpZ2h0ID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICBoaWdobGlnaHRTbGljZUZyb21MZWdlbmRhYmxlKGQsIHRydWUpOwogICAgfTsKCiAgICBfY2hhcnQubGVnZW5kUmVzZXQgPSBmdW5jdGlvbiAoZCkgewogICAgICAgIGhpZ2hsaWdodFNsaWNlRnJvbUxlZ2VuZGFibGUoZCwgZmFsc2UpOwogICAgfTsKCiAgICBfY2hhcnQubGVnZW5kVG9nZ2xlID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICBfY2hhcnQub25DbGljayh7a2V5OiBkLm5hbWUsIG90aGVyczogZC5vdGhlcnN9KTsKICAgIH07CgogICAgZnVuY3Rpb24gaGlnaGxpZ2h0U2xpY2VGcm9tTGVnZW5kYWJsZSAobGVnZW5kYWJsZSwgaGlnaGxpZ2h0ZWQpIHsKICAgICAgICBfY2hhcnQuc2VsZWN0QWxsKCdnLnBpZS1zbGljZScpLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgaWYgKGxlZ2VuZGFibGUubmFtZSA9PT0gZC5kYXRhLmtleSkgewogICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoJ2hpZ2hsaWdodCcsIGhpZ2hsaWdodGVkKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiBfY2hhcnQuYW5jaG9yKHBhcmVudCwgY2hhcnRHcm91cCk7Cn07CgovKioKICogQ29uY3JldGUgYmFyIGNoYXJ0L2hpc3RvZ3JhbSBpbXBsZW1lbnRhdGlvbi4KICoKICogRXhhbXBsZXM6CiAqIC0ge0BsaW5rIGh0dHA6Ly9kYy1qcy5naXRodWIuY29tL2RjLmpzLyBOYXNkYXEgMTAwIEluZGV4fQogKiAtIHtAbGluayBodHRwOi8vZGMtanMuZ2l0aHViLmNvbS9kYy5qcy9jcmltZS9pbmRleC5odG1sIENhbmFkaWFuIENpdHkgQ3JpbWUgU3RhdHN9CiAqIEBjbGFzcyBiYXJDaGFydAogKiBAbWVtYmVyb2YgZGMKICogQG1peGVzIGRjLnN0YWNrTWl4aW4KICogQG1peGVzIGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4KICogQGV4YW1wbGUKICogLy8gY3JlYXRlIGEgYmFyIGNoYXJ0IHVuZGVyICNjaGFydC1jb250YWluZXIxIGVsZW1lbnQgdXNpbmcgdGhlIGRlZmF1bHQgZ2xvYmFsIGNoYXJ0IGdyb3VwCiAqIHZhciBjaGFydDEgPSBkYy5iYXJDaGFydCgnI2NoYXJ0LWNvbnRhaW5lcjEnKTsKICogLy8gY3JlYXRlIGEgYmFyIGNoYXJ0IHVuZGVyICNjaGFydC1jb250YWluZXIyIGVsZW1lbnQgdXNpbmcgY2hhcnQgZ3JvdXAgQQogKiB2YXIgY2hhcnQyID0gZGMuYmFyQ2hhcnQoJyNjaGFydC1jb250YWluZXIyJywgJ2NoYXJ0R3JvdXBBJyk7CiAqIC8vIGNyZWF0ZSBhIHN1Yi1jaGFydCB1bmRlciBhIGNvbXBvc2l0ZSBwYXJlbnQgY2hhcnQKICogdmFyIGNoYXJ0MyA9IGRjLmJhckNoYXJ0KGNvbXBvc2l0ZUNoYXJ0KTsKICogQHBhcmFtIHtTdHJpbmd8bm9kZXxkMy5zZWxlY3Rpb258ZGMuY29tcG9zaXRlQ2hhcnR9IHBhcmVudCAtIEFueSB2YWxpZAogKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvU2VsZWN0aW9ucyNzZWxlY3RpbmctZWxlbWVudHMgZDMgc2luZ2xlIHNlbGVjdG9yfQogKiBzcGVjaWZ5aW5nIGEgZG9tIGJsb2NrIGVsZW1lbnQgc3VjaCBhcyBhIGRpdjsgb3IgYSBkb20gZWxlbWVudCBvciBkMyBzZWxlY3Rpb24uICBJZiB0aGUgYmFyCiAqIGNoYXJ0IGlzIGEgc3ViLWNoYXJ0IGluIGEge0BsaW5rIGRjLmNvbXBvc2l0ZUNoYXJ0IENvbXBvc2l0ZSBDaGFydH0gdGhlbiBwYXNzIGluIHRoZSBwYXJlbnQKICogY29tcG9zaXRlIGNoYXJ0IGluc3RhbmNlIGluc3RlYWQuCiAqIEBwYXJhbSB7U3RyaW5nfSBbY2hhcnRHcm91cF0gLSBUaGUgbmFtZSBvZiB0aGUgY2hhcnQgZ3JvdXAgdGhpcyBjaGFydCBpbnN0YW5jZSBzaG91bGQgYmUgcGxhY2VkIGluLgogKiBJbnRlcmFjdGlvbiB3aXRoIGEgY2hhcnQgd2lsbCBvbmx5IHRyaWdnZXIgZXZlbnRzIGFuZCByZWRyYXdzIHdpdGhpbiB0aGUgY2hhcnQncyBncm91cC4KICogQHJldHVybiB7ZGMuYmFyQ2hhcnR9CiAqLwpkYy5iYXJDaGFydCA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoYXJ0R3JvdXApIHsKICAgIHZhciBNSU5fQkFSX1dJRFRIID0gMTsKICAgIHZhciBERUZBVUxUX0dBUF9CRVRXRUVOX0JBUlMgPSAyOwogICAgdmFyIExBQkVMX1BBRERJTkcgPSAzOwoKICAgIHZhciBfY2hhcnQgPSBkYy5zdGFja01peGluKGRjLmNvb3JkaW5hdGVHcmlkTWl4aW4oe30pKTsKCiAgICB2YXIgX2dhcCA9IERFRkFVTFRfR0FQX0JFVFdFRU5fQkFSUzsKICAgIHZhciBfY2VudGVyQmFyID0gZmFsc2U7CiAgICB2YXIgX2Fsd2F5c1VzZVJvdW5kaW5nID0gZmFsc2U7CgogICAgdmFyIF9iYXJXaWR0aDsKCiAgICBkYy5vdmVycmlkZShfY2hhcnQsICdyZXNjYWxlJywgZnVuY3Rpb24gKCkgewogICAgICAgIF9jaGFydC5fcmVzY2FsZSgpOwogICAgICAgIF9iYXJXaWR0aCA9IHVuZGVmaW5lZDsKICAgICAgICByZXR1cm4gX2NoYXJ0OwogICAgfSk7CgogICAgZGMub3ZlcnJpZGUoX2NoYXJ0LCAncmVuZGVyJywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChfY2hhcnQucm91bmQoKSAmJiBfY2VudGVyQmFyICYmICFfYWx3YXlzVXNlUm91bmRpbmcpIHsKICAgICAgICAgICAgZGMubG9nZ2VyLndhcm4oJ0J5IGRlZmF1bHQsIGJydXNoIHJvdW5kaW5nIGlzIGRpc2FibGVkIGlmIGJhcnMgYXJlIGNlbnRlcmVkLiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgZGMuanMgYmFyIGNoYXJ0IEFQSSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLicpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIF9jaGFydC5fcmVuZGVyKCk7CiAgICB9KTsKCiAgICBfY2hhcnQubGFiZWwoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZGMudXRpbHMucHJpbnRTaW5nbGVWYWx1ZShkLnkwICsgZC55KTsKICAgIH0sIGZhbHNlKTsKCiAgICBfY2hhcnQucGxvdERhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxheWVycyA9IF9jaGFydC5jaGFydEJvZHlHKCkuc2VsZWN0QWxsKCdnLnN0YWNrJykKICAgICAgICAgICAgLmRhdGEoX2NoYXJ0LmRhdGEoKSk7CgogICAgICAgIGNhbGN1bGF0ZUJhcldpZHRoKCk7CgogICAgICAgIGxheWVycwogICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnc3RhY2sgJyArICdfJyArIGk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICB2YXIgbGFzdCA9IGxheWVycy5zaXplKCkgLSAxOwogICAgICAgIGxheWVycy5lYWNoKGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgICAgIHZhciBsYXllciA9IGQzLnNlbGVjdCh0aGlzKTsKCiAgICAgICAgICAgIHJlbmRlckJhcnMobGF5ZXIsIGksIGQpOwoKICAgICAgICAgICAgaWYgKF9jaGFydC5yZW5kZXJMYWJlbCgpICYmIGxhc3QgPT09IGkpIHsKICAgICAgICAgICAgICAgIHJlbmRlckxhYmVscyhsYXllciwgaSwgZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgZnVuY3Rpb24gYmFySGVpZ2h0IChkKSB7CiAgICAgICAgcmV0dXJuIGRjLnV0aWxzLnNhZmVOdW1iZXIoTWF0aC5hYnMoX2NoYXJ0LnkoKShkLnkgKyBkLnkwKSAtIF9jaGFydC55KCkoZC55MCkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJMYWJlbHMgKGxheWVyLCBsYXllckluZGV4LCBkKSB7CiAgICAgICAgdmFyIGxhYmVscyA9IGxheWVyLnNlbGVjdEFsbCgndGV4dC5iYXJMYWJlbCcpCiAgICAgICAgICAgIC5kYXRhKGQudmFsdWVzLCBkYy5wbHVjaygneCcpKTsKCiAgICAgICAgbGFiZWxzLmVudGVyKCkKICAgICAgICAgICAgLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdiYXJMYWJlbCcpCiAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTsKCiAgICAgICAgaWYgKF9jaGFydC5pc09yZGluYWwoKSkgewogICAgICAgICAgICBsYWJlbHMub24oJ2NsaWNrJywgX2NoYXJ0Lm9uQ2xpY2spOwogICAgICAgICAgICBsYWJlbHMuYXR0cignY3Vyc29yJywgJ3BvaW50ZXInKTsKICAgICAgICB9CgogICAgICAgIGRjLnRyYW5zaXRpb24obGFiZWxzLCBfY2hhcnQudHJhbnNpdGlvbkR1cmF0aW9uKCkpCiAgICAgICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHZhciB4ID0gX2NoYXJ0LngoKShkLngpOwogICAgICAgICAgICAgICAgaWYgKCFfY2VudGVyQmFyKSB7CiAgICAgICAgICAgICAgICAgICAgeCArPSBfYmFyV2lkdGggLyAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGRjLnV0aWxzLnNhZmVOdW1iZXIoeCk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5hdHRyKCd5JywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHZhciB5ID0gX2NoYXJ0LnkoKShkLnkgKyBkLnkwKTsKCiAgICAgICAgICAgICAgICBpZiAoZC55IDwgMCkgewogICAgICAgICAgICAgICAgICAgIHkgLT0gYmFySGVpZ2h0KGQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBkYy51dGlscy5zYWZlTnVtYmVyKHkgLSBMQUJFTF9QQURESU5HKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfY2hh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment