DIR : /home/kozerus/public_html/index_ol.html

/home/kozerus/public_html

<html lang="en">
	<head>
	<title>index_ol.html 20190201_1900 preview</title>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="chrome=1">
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">

<!--    
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" type="text/css"> 
	<link rel="stylesheet" href="../css/ol.css" type="text/css">
	<link rel="stylesheet" href="./resources/layout.css" type="text/css">
	-->

	<link rel="stylesheet" href="ol_bootstrap336min.css" type="text/css">
	<link rel="stylesheet" href="ol_ol.css" type="text/css">
	<link rel="stylesheet" href="ol_layout.css" type="text/css">

	<style id="style_ol_body" >
		body { padding-top: 70px; background-color: "darkslategrey" }
		input.search-query { color: #333; }
		.example {
			display: block;
			padding: 10px;
			background-color: #F5F5F5;
			background-color: darkslategrey;
			color: ivory;
			height: 140px;
			margin: 10px 0;
			overflow: auto;
			}
		.example p.description {
			font-size: smaller;
			margin: 5px 0;
			}
      .example:hover {
        background-color: #ddd;
      }

      ::-webkit-scrollbar {
        width: 8px;
      }

      ::-webkit-scrollbar-button {
        width: 0;
        height: 0;
        display: none;
      }

      ::-webkit-scrollbar-thumb {
        background-color: rgba(0, 0, 0, 0.2);
        -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.10),inset 0 -1px 0 rgba(0, 0, 0, 0.07);
      }

      ::-webkit-scrollbar-thumb:hover {
        background-color: rgba(0, 0, 0, 0.4);
      }

      ::-webkit-scrollbar-corner {
        background-color: transparent;
      }
    </style>
    <script type="text/javascript" src="/svc/ol/ht/Jugl.js"></script>
<!--    <script type="text/javascript" src="/svc/ol/ht/index.js"></script> -->
	<script type="text/javascript" src="index_ol.js"></script> -->

    <script type="text/javascript">
      var template, target;

      function listExamples(examples) {
        target.innerHTML = "";
        var node = template.process({
          context: {examples: examples},
          clone: true,
          parent: target
        });
        document.getElementById("count").innerHTML = "(" + examples.length + ")";
      }

      var timerId;
      function inputChange() {
        if (timerId) {
          window.clearTimeout(timerId);
        }
        var text = this.value;
        timerId = window.setTimeout(function() {
          filterList(text);
        }, 500);
      }

      function filterList(text) {
        var examples;
        if (text.length < 2) {
          examples = info.examples;
        } else {
          var words = text.split(/\W+/);
          var scores = {};
          for(var i=0; i<words.length; ++i) {
            var word = words[i].toLowerCase();
            var dict = info.index[word];
            var updateScores = function() {
              for(exIndex in dict) {
                var count = dict[exIndex];
                if(scores[exIndex]) {
                  if(scores[exIndex][word]) {
                    scores[exIndex][word] += count;
                  } else {
                    scores[exIndex][word] = count;
                  }
                } else {
                  scores[exIndex] = {};
                  scores[exIndex][word] = count;
                }
              }
            };
            if (dict) {
              updateScores();
            } else {
              var r;
              for (idx in info.index) {
                r = new RegExp(word);
                if (r.test(idx)) {
                  dict = info.index[idx];
                  updateScores();
                }
              }
            }
          }
          examples = [];
          for (var j in scores) {
            var ex = info.examples[j];
            ex.score = scores[j];
            examples.push(ex);
          }
          // sort examples by first by number of words matched, then
          // by word frequency
          examples.sort(function(a, b) {
            var cmp;
            var aWords = 0, bWords = 0;
            var aScore = 0, bScore = 0;
            for (var i in a.score) {
              aScore += a.score[i];
              aWords += 1;
            }
            for (var j in b.score) {
              bScore += b.score[j];
              bWords += 1;
            }
            if (aWords == bWords) {
              cmp = bScore - aScore;
            } else {
              cmp = bWords - aWords;
            }
            return cmp;
          });
        }
        listExamples(examples);
      }

      function parseQuery() {
        var params = {};
        var list = window.location.search.substring(1).split("&");
        for (var i = 0; i < list.length; ++i) {
          var pair = list[i].split("=");
          if (pair.length == 2) {
            params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
          }
        }
        if (params["q"]) {
          var input = document.getElementById("keywords");
          input.value = params["q"];
          inputChange.call(input);
        }
      }

      window.onload = function() {
        for (var i = 0; i < info.examples.length; ++i) {
          info.examples[i].link += window.location.search;
        }
        template = new jugl.Template("template");
        target = document.getElementById("examples");
        listExamples(info.examples);
        document.getElementById("keywords").onkeyup = inputChange;
        parseQuery();
      };

    </script>

    <title>OpenLayers Examples</title>
  </head>
  <body>

    <header class="navbar navbar-fixed-top" role="navigation">
      <div class="container">
        <div class="display-table pull-left">
          <a class="navbar-brand" href="./"><img src="/src/ol/ht/resources/logo-70x70.png">&nbsp;OpenLayers Examples</a>
          <form class="navbar-form" role="search">
            <input name="q" type="text" id="keywords" class="search-query" placeholder="Search" autofocus>
            <span id="count"></span>
          </form>
        </div>
        <!-- menu items that get hidden below 768px width -->
        <nav class='collapse navbar-collapse navbar-responsive-collapse'>
          <ul class="nav navbar-nav pull-right">
            <li><a href="svc/ol/doc">Docs</a></li>
            <li><a class="active" href="/svc/ol/ht/index.html">Examples</a></li>
            <li><a href="svc/ol/apidoc">API</a></li>
            <li><a href="https://github.com/openlayers/openlayers">Code</a></li>
          </ul>
        </nav>
      </div>
    </header>

    <div class="container-fluid">
      <div id="examples"></div>
      <div style="display: none;">
        <div id="template" class="row">
          <div class="col-md-4 col-sm-4" jugl:repeat="example examples">
            <a jugl:attributes="href example.link" class="example">
              <span class="mainlink">
                <strong><span jugl:replace="example.title">title</span></strong><br>
                <small jugl:content="'(' + example.example + ')'"></small>
              </span>
              <p class="description" jugl:content="example.shortdesc"></p>
            </a>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>
<style id="ol_bootstrap335min.css" src="data:/text/plain;base64,LyohCiAqIEJvb3RzdHJhcCB2My4zLjUgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKQogKiBDb3B5cmlnaHQgMjAxMS0yMDE1IFR3aXR0ZXIsIEluYy4KICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSkKICovLyohIG5vcm1hbGl6ZS5jc3MgdjMuMC4zIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL2h0bWx7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlfWJvZHl7bWFyZ2luOjB9YXJ0aWNsZSxhc2lkZSxkZXRhaWxzLGZpZ2NhcHRpb24sZmlndXJlLGZvb3RlcixoZWFkZXIsaGdyb3VwLG1haW4sbWVudSxuYXYsc2VjdGlvbixzdW1tYXJ5e2Rpc3BsYXk6YmxvY2t9YXVkaW8sY2FudmFzLHByb2dyZXNzLHZpZGVve2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfWF1ZGlvOm5vdChbY29udHJvbHNdKXtkaXNwbGF5Om5vbmU7aGVpZ2h0OjB9W2hpZGRlbl0sdGVtcGxhdGV7ZGlzcGxheTpub25lfWF7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH1hOmFjdGl2ZSxhOmhvdmVye291dGxpbmU6MH1hYmJyW3RpdGxlXXtib3JkZXItYm90dG9tOjFweCBkb3R0ZWR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6NzAwfWRmbntmb250LXN0eWxlOml0YWxpY31oMXttYXJnaW46LjY3ZW0gMDtmb250LXNpemU6MmVtfW1hcmt7Y29sb3I6IzAwMDtiYWNrZ3JvdW5kOiNmZjB9c21hbGx7Zm9udC1zaXplOjgwJX1zdWIsc3Vwe3Bvc2l0aW9uOnJlbGF0aXZlO2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1zdXB7dG9wOi0uNWVtfXN1Yntib3R0b206LS4yNWVtfWltZ3tib3JkZXI6MH1zdmc6bm90KDpyb290KXtvdmVyZmxvdzpoaWRkZW59ZmlndXJle21hcmdpbjoxZW0gNDBweH1ocntoZWlnaHQ6MDstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3h9cHJle292ZXJmbG93OmF1dG99Y29kZSxrYmQscHJlLHNhbXB7Zm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZTtmb250LXNpemU6MWVtfWJ1dHRvbixpbnB1dCxvcHRncm91cCxzZWxlY3QsdGV4dGFyZWF7bWFyZ2luOjA7Zm9udDppbmhlcml0O2NvbG9yOmluaGVyaXR9YnV0dG9ue292ZXJmbG93OnZpc2libGV9YnV0dG9uLHNlbGVjdHt0ZXh0LXRyYW5zZm9ybTpub25lfWJ1dHRvbixodG1sIGlucHV0W3R5cGU9YnV0dG9uXSxpbnB1dFt0eXBlPXJlc2V0XSxpbnB1dFt0eXBlPXN1Ym1pdF17LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbjtjdXJzb3I6cG9pbnRlcn1idXR0b25bZGlzYWJsZWRdLGh0bWwgaW5wdXRbZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixpbnB1dDo6LW1vei1mb2N1cy1pbm5lcntwYWRkaW5nOjA7Ym9yZGVyOjB9aW5wdXR7bGluZS1oZWlnaHQ6bm9ybWFsfWlucHV0W3R5cGU9Y2hlY2tib3hdLGlucHV0W3R5cGU9cmFkaW9dey13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjB9aW5wdXRbdHlwZT1udW1iZXJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLGlucHV0W3R5cGU9bnVtYmVyXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b31pbnB1dFt0eXBlPXNlYXJjaF17LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGR9aW5wdXRbdHlwZT1zZWFyY2hdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLGlucHV0W3R5cGU9c2VhcmNoXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX1maWVsZHNldHtwYWRkaW5nOi4zNWVtIC42MjVlbSAuNzVlbTttYXJnaW46MCAycHg7Ym9yZGVyOjFweCBzb2xpZCBzaWx2ZXJ9bGVnZW5ke3BhZGRpbmc6MDtib3JkZXI6MH10ZXh0YXJlYXtvdmVyZmxvdzphdXRvfW9wdGdyb3Vwe2ZvbnQtd2VpZ2h0OjcwMH10YWJsZXtib3JkZXItc3BhY2luZzowO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX10ZCx0aHtwYWRkaW5nOjB9LyohIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2g1YnAvaHRtbDUtYm9pbGVycGxhdGUvYmxvYi9tYXN0ZXIvc3JjL2Nzcy9tYWluLmNzcyAqL0BtZWRpYSBwcmludHsqLDphZnRlciw6YmVmb3Jle2NvbG9yOiMwMDAhaW1wb3J0YW50O3RleHQtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudH1hLGE6dmlzaXRlZHt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfWFbaHJlZl06YWZ0ZXJ7Y29udGVudDoiICgiIGF0dHIoaHJlZikgIikifWFiYnJbdGl0bGVdOmFmdGVye2NvbnRlbnQ6IiAoIiBhdHRyKHRpdGxlKSAiKSJ9YVtocmVmXj0iamF2YXNjcmlwdDoiXTphZnRlcixhW2hyZWZePSIjIl06YWZ0ZXJ7Y29udGVudDoiIn1ibG9ja3F1b3RlLHByZXtib3JkZXI6MXB4IHNvbGlkICM5OTk7cGFnZS1icmVhay1pbnNpZGU6YXZvaWR9dGhlYWR7ZGlzcGxheTp0YWJsZS1oZWFkZXItZ3JvdXB9aW1nLHRye3BhZ2UtYnJlYWstaW5zaWRlOmF2b2lkfWltZ3ttYXgtd2lkdGg6MTAwJSFpbXBvcnRhbnR9aDIsaDMscHtvcnBoYW5zOjM7d2lkb3dzOjN9aDIsaDN7cGFnZS1icmVhay1hZnRlcjphdm9pZH0ubmF2YmFye2Rpc3BsYXk6bm9uZX0uYnRuPi5jYXJldCwuZHJvcHVwPi5idG4+LmNhcmV0e2JvcmRlci10b3AtY29sb3I6IzAwMCFpbXBvcnRhbnR9LmxhYmVse2JvcmRlcjoxcHggc29saWQgIzAwMH0udGFibGV7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlIWltcG9ydGFudH0udGFibGUgdGQsLnRhYmxlIHRoe2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnR9LnRhYmxlLWJvcmRlcmVkIHRkLC50YWJsZS1ib3JkZXJlZCB0aHtib3JkZXI6MXB4IHNvbGlkICNkZGQhaW1wb3J0YW50fX1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OidHbHlwaGljb25zIEhhbGZsaW5ncyc7c3JjOnVybCguLi9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLmVvdCk7c3JjOnVybCguLi9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLmVvdD8jaWVmaXgpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSx1cmwoLi4vZm9udHMvZ2x5cGhpY29ucy1oYWxmbGluZ3MtcmVndWxhci53b2ZmMikgZm9ybWF0KCd3b2ZmMicpLHVybCguLi9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLndvZmYpIGZvcm1hdCgnd29mZicpLHVybCguLi9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLnR0ZikgZm9ybWF0KCd0cnVldHlwZScpLHVybCguLi9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLnN2ZyNnbHlwaGljb25zX2hhbGZsaW5nc3JlZ3VsYXIpIGZvcm1hdCgnc3ZnJyl9LmdseXBoaWNvbntwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MXB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtZmFtaWx5OidHbHlwaGljb25zIEhhbGZsaW5ncyc7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjE7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGV9LmdseXBoaWNvbi1hc3RlcmlzazpiZWZvcmV7Y29udGVudDoiXDJhIn0uZ2x5cGhpY29uLXBsdXM6YmVmb3Jle2NvbnRlbnQ6IlwyYiJ9LmdseXBoaWNvbi1ldXI6YmVmb3JlLC5nbHlwaGljb24tZXVybzpiZWZvcmV7Y29udGVudDoiXDIwYWMifS5nbHlwaGljb24tbWludXM6YmVmb3Jle2NvbnRlbnQ6IlwyMjEyIn0uZ2x5cGhpY29uLWNsb3VkOmJlZm9yZXtjb250ZW50OiJcMjYwMSJ9LmdseXBoaWNvbi1lbnZlbG9wZTpiZWZvcmV7Y29udGVudDoiXDI3MDkifS5nbHlwaGljb24tcGVuY2lsOmJlZm9yZXtjb250ZW50OiJcMjcwZiJ9LmdseXBoaWNvbi1nbGFzczpiZWZvcmV7Y29udGVudDoiXGUwMDEifS5nbHlwaGljb24tbXVzaWM6YmVmb3Jle2NvbnRlbnQ6IlxlMDAyIn0uZ2x5cGhpY29uLXNlYXJjaDpiZWZvcmV7Y29udGVudDoiXGUwMDMifS5nbHlwaGljb24taGVhcnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDA1In0uZ2x5cGhpY29uLXN0YXI6YmVmb3Jle2NvbnRlbnQ6IlxlMDA2In0uZ2x5cGhpY29uLXN0YXItZW1wdHk6YmVmb3Jle2NvbnRlbnQ6IlxlMDA3In0uZ2x5cGhpY29uLXVzZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMDA4In0uZ2x5cGhpY29uLWZpbG06YmVmb3Jle2NvbnRlbnQ6IlxlMDA5In0uZ2x5cGhpY29uLXRoLWxhcmdlOmJlZm9yZXtjb250ZW50OiJcZTAxMCJ9LmdseXBoaWNvbi10aDpiZWZvcmV7Y29udGVudDoiXGUwMTEifS5nbHlwaGljb24tdGgtbGlzdDpiZWZvcmV7Y29udGVudDoiXGUwMTIifS5nbHlwaGljb24tb2s6YmVmb3Jle2NvbnRlbnQ6IlxlMDEzIn0uZ2x5cGhpY29uLXJlbW92ZTpiZWZvcmV7Y29udGVudDoiXGUwMTQifS5nbHlwaGljb24tem9vbS1pbjpiZWZvcmV7Y29udGVudDoiXGUwMTUifS5nbHlwaGljb24tem9vbS1vdXQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDE2In0uZ2x5cGhpY29uLW9mZjpiZWZvcmV7Y29udGVudDoiXGUwMTcifS5nbHlwaGljb24tc2lnbmFsOmJlZm9yZXtjb250ZW50OiJcZTAxOCJ9LmdseXBoaWNvbi1jb2c6YmVmb3Jle2NvbnRlbnQ6IlxlMDE5In0uZ2x5cGhpY29uLXRyYXNoOmJlZm9yZXtjb250ZW50OiJcZTAyMCJ9LmdseXBoaWNvbi1ob21lOmJlZm9yZXtjb250ZW50OiJcZTAyMSJ9LmdseXBoaWNvbi1maWxlOmJlZm9yZXtjb250ZW50OiJcZTAyMiJ9LmdseXBoaWNvbi10aW1lOmJlZm9yZXtjb250ZW50OiJcZTAyMyJ9LmdseXBoaWNvbi1yb2FkOmJlZm9yZXtjb250ZW50OiJcZTAyNCJ9LmdseXBoaWNvbi1kb3dubG9hZC1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDI1In0uZ2x5cGhpY29uLWRvd25sb2FkOmJlZm9yZXtjb250ZW50OiJcZTAyNiJ9LmdseXBoaWNvbi11cGxvYWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDI3In0uZ2x5cGhpY29uLWluYm94OmJlZm9yZXtjb250ZW50OiJcZTAyOCJ9LmdseXBoaWNvbi1wbGF5LWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGUwMjkifS5nbHlwaGljb24tcmVwZWF0OmJlZm9yZXtjb250ZW50OiJcZTAzMCJ9LmdseXBoaWNvbi1yZWZyZXNoOmJlZm9yZXtjb250ZW50OiJcZTAzMSJ9LmdseXBoaWNvbi1saXN0LWFsdDpiZWZvcmV7Y29udGVudDoiXGUwMzIifS5nbHlwaGljb24tbG9jazpiZWZvcmV7Y29udGVudDoiXGUwMzMifS5nbHlwaGljb24tZmxhZzpiZWZvcmV7Y29udGVudDoiXGUwMzQifS5nbHlwaGljb24taGVhZHBob25lczpiZWZvcmV7Y29udGVudDoiXGUwMzUifS5nbHlwaGljb24tdm9sdW1lLW9mZjpiZWZvcmV7Y29udGVudDoiXGUwMzYifS5nbHlwaGljb24tdm9sdW1lLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxlMDM3In0uZ2x5cGhpY29uLXZvbHVtZS11cDpiZWZvcmV7Y29udGVudDoiXGUwMzgifS5nbHlwaGljb24tcXJjb2RlOmJlZm9yZXtjb250ZW50OiJcZTAzOSJ9LmdseXBoaWNvbi1iYXJjb2RlOmJlZm9yZXtjb250ZW50OiJcZTA0MCJ9LmdseXBoaWNvbi10YWc6YmVmb3Jle2NvbnRlbnQ6IlxlMDQxIn0uZ2x5cGhpY29uLXRhZ3M6YmVmb3Jle2NvbnRlbnQ6IlxlMDQyIn0uZ2x5cGhpY29uLWJvb2s6YmVmb3Jle2NvbnRlbnQ6IlxlMDQzIn0uZ2x5cGhpY29uLWJvb2ttYXJrOmJlZm9yZXtjb250ZW50OiJcZTA0NCJ9LmdseXBoaWNvbi1wcmludDpiZWZvcmV7Y29udGVudDoiXGUwNDUifS5nbHlwaGljb24tY2FtZXJhOmJlZm9yZXtjb250ZW50OiJcZTA0NiJ9LmdseXBoaWNvbi1mb250OmJlZm9yZXtjb250ZW50OiJcZTA0NyJ9LmdseXBoaWNvbi1ib2xkOmJlZm9yZXtjb250ZW50OiJcZTA0OCJ9LmdseXBoaWNvbi1pdGFsaWM6YmVmb3Jle2NvbnRlbnQ6IlxlMDQ5In0uZ2x5cGhpY29uLXRleHQtaGVpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTA1MCJ9LmdseXBoaWNvbi10ZXh0LXdpZHRoOmJlZm9yZXtjb250ZW50OiJcZTA1MSJ9LmdseXBoaWNvbi1hbGlnbi1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZTA1MiJ9LmdseXBoaWNvbi1hbGlnbi1jZW50ZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMDUzIn0uZ2x5cGhpY29uLWFsaWduLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTA1NCJ9LmdseXBoaWNvbi1hbGlnbi1qdXN0aWZ5OmJlZm9yZXtjb250ZW50OiJcZTA1NSJ9LmdseXBoaWNvbi1saXN0OmJlZm9yZXtjb250ZW50OiJcZTA1NiJ9LmdseXBoaWNvbi1pbmRlbnQtbGVmdDpiZWZvcmV7Y29udGVudDoiXGUwNTcifS5nbHlwaGljb24taW5kZW50LXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTA1OCJ9LmdseXBoaWNvbi1mYWNldGltZS12aWRlbzpiZWZvcmV7Y29udGVudDoiXGUwNTkifS5nbHlwaGljb24tcGljdHVyZTpiZWZvcmV7Y29udGVudDoiXGUwNjAifS5nbHlwaGljb24tbWFwLW1hcmtlcjpiZWZvcmV7Y29udGVudDoiXGUwNjIifS5nbHlwaGljb24tYWRqdXN0OmJlZm9yZXtjb250ZW50OiJcZTA2MyJ9LmdseXBoaWNvbi10aW50OmJlZm9yZXtjb250ZW50OiJcZTA2NCJ9LmdseXBoaWNvbi1lZGl0OmJlZm9yZXtjb250ZW50OiJcZTA2NSJ9LmdseXBoaWNvbi1zaGFyZTpiZWZvcmV7Y29udGVudDoiXGUwNjYifS5nbHlwaGljb24tY2hlY2s6YmVmb3Jle2NvbnRlbnQ6IlxlMDY3In0uZ2x5cGhpY29uLW1vdmU6YmVmb3Jle2NvbnRlbnQ6IlxlMDY4In0uZ2x5cGhpY29uLXN0ZXAtYmFja3dhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDY5In0uZ2x5cGhpY29uLWZhc3QtYmFja3dhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDcwIn0uZ2x5cGhpY29uLWJhY2t3YXJkOmJlZm9yZXtjb250ZW50OiJcZTA3MSJ9LmdseXBoaWNvbi1wbGF5OmJlZm9yZXtjb250ZW50OiJcZTA3MiJ9LmdseXBoaWNvbi1wYXVzZTpiZWZvcmV7Y29udGVudDoiXGUwNzMifS5nbHlwaGljb24tc3RvcDpiZWZvcmV7Y29udGVudDoiXGUwNzQifS5nbHlwaGljb24tZm9yd2FyZDpiZWZvcmV7Y29udGVudDoiXGUwNzUifS5nbHlwaGljb24tZmFzdC1mb3J3YXJkOmJlZm9yZXtjb250ZW50OiJcZTA3NiJ9LmdseXBoaWNvbi1zdGVwLWZvcndhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDc3In0uZ2x5cGhpY29uLWVqZWN0OmJlZm9yZXtjb250ZW50OiJcZTA3OCJ9LmdseXBoaWNvbi1jaGV2cm9uLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDc5In0uZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDgwIn0uZ2x5cGhpY29uLXBsdXMtc2lnbjpiZWZvcmV7Y29udGVudDoiXGUwODEifS5nbHlwaGljb24tbWludXMtc2lnbjpiZWZvcmV7Y29udGVudDoiXGUwODIifS5nbHlwaGljb24tcmVtb3ZlLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxlMDgzIn0uZ2x5cGhpY29uLW9rLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxlMDg0In0uZ2x5cGhpY29uLXF1ZXN0aW9uLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxlMDg1In0uZ2x5cGhpY29uLWluZm8tc2lnbjpiZWZvcmV7Y29udGVudDoiXGUwODYifS5nbHlwaGljb24tc2NyZWVuc2hvdDpiZWZvcmV7Y29udGVudDoiXGUwODcifS5nbHlwaGljb24tcmVtb3ZlLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGUwODgifS5nbHlwaGljb24tb2stY2lyY2xlOmJlZm9yZXtjb250ZW50OiJcZTA4OSJ9LmdseXBoaWNvbi1iYW4tY2lyY2xlOmJlZm9yZXtjb250ZW50OiJcZTA5MCJ9LmdseXBoaWNvbi1hcnJvdy1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZTA5MSJ9LmdseXBoaWNvbi1hcnJvdy1yaWdodDpiZWZvcmV7Y29udGVudDoiXGUwOTIifS5nbHlwaGljb24tYXJyb3ctdXA6YmVmb3Jle2NvbnRlbnQ6IlxlMDkzIn0uZ2x5cGhpY29uLWFycm93LWRvd246YmVmb3Jle2NvbnRlbnQ6IlxlMDk0In0uZ2x5cGhpY29uLXNoYXJlLWFsdDpiZWZvcmV7Y29udGVudDoiXGUwOTUifS5nbHlwaGljb24tcmVzaXplLWZ1bGw6YmVmb3Jle2NvbnRlbnQ6IlxlMDk2In0uZ2x5cGhpY29uLXJlc2l6ZS1zbWFsbDpiZWZvcmV7Y29udGVudDoiXGUwOTcifS5nbHlwaGljb24tZXhjbGFtYXRpb24tc2lnbjpiZWZvcmV7Y29udGVudDoiXGUxMDEifS5nbHlwaGljb24tZ2lmdDpiZWZvcmV7Y29udGVudDoiXGUxMDIifS5nbHlwaGljb24tbGVhZjpiZWZvcmV7Y29udGVudDoiXGUxMDMifS5nbHlwaGljb24tZmlyZTpiZWZvcmV7Y29udGVudDoiXGUxMDQifS5nbHlwaGljb24tZXllLW9wZW46YmVmb3Jle2NvbnRlbnQ6IlxlMTA1In0uZ2x5cGhpY29uLWV5ZS1jbG9zZTpiZWZvcmV7Y29udGVudDoiXGUxMDYifS5nbHlwaGljb24td2FybmluZy1zaWduOmJlZm9yZXtjb250ZW50OiJcZTEwNyJ9LmdseXBoaWNvbi1wbGFuZTpiZWZvcmV7Y29udGVudDoiXGUxMDgifS5nbHlwaGljb24tY2FsZW5kYXI6YmVmb3Jle2NvbnRlbnQ6IlxlMTA5In0uZ2x5cGhpY29uLXJhbmRvbTpiZWZvcmV7Y29udGVudDoiXGUxMTAifS5nbHlwaGljb24tY29tbWVudDpiZWZvcmV7Y29udGVudDoiXGUxMTEifS5nbHlwaGljb24tbWFnbmV0OmJlZm9yZXtjb250ZW50OiJcZTExMiJ9LmdseXBoaWNvbi1jaGV2cm9uLXVwOmJlZm9yZXtjb250ZW50OiJcZTExMyJ9LmdseXBoaWNvbi1jaGV2cm9uLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxlMTE0In0uZ2x5cGhpY29uLXJldHdlZXQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTE1In0uZ2x5cGhpY29uLXNob3BwaW5nLWNhcnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTE2In0uZ2x5cGhpY29uLWZvbGRlci1jbG9zZTpiZWZvcmV7Y29udGVudDoiXGUxMTcifS5nbHlwaGljb24tZm9sZGVyLW9wZW46YmVmb3Jle2NvbnRlbnQ6IlxlMTE4In0uZ2x5cGhpY29uLXJlc2l6ZS12ZXJ0aWNhbDpiZWZvcmV7Y29udGVudDoiXGUxMTkifS5nbHlwaGljb24tcmVzaXplLWhvcml6b250YWw6YmVmb3Jle2NvbnRlbnQ6IlxlMTIwIn0uZ2x5cGhpY29uLWhkZDpiZWZvcmV7Y29udGVudDoiXGUxMjEifS5nbHlwaGljb24tYnVsbGhvcm46YmVmb3Jle2NvbnRlbnQ6IlxlMTIyIn0uZ2x5cGhpY29uLWJlbGw6YmVmb3Jle2NvbnRlbnQ6IlxlMTIzIn0uZ2x5cGhpY29uLWNlcnRpZmljYXRlOmJlZm9yZXtjb250ZW50OiJcZTEyNCJ9LmdseXBoaWNvbi10aHVtYnMtdXA6YmVmb3Jle2NvbnRlbnQ6IlxlMTI1In0uZ2x5cGhpY29uLXRodW1icy1kb3duOmJlZm9yZXtjb250ZW50OiJcZTEyNiJ9LmdseXBoaWNvbi1oYW5kLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTEyNyJ9LmdseXBoaWNvbi1oYW5kLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTI4In0uZ2x5cGhpY29uLWhhbmQtdXA6YmVmb3Jle2NvbnRlbnQ6IlxlMTI5In0uZ2x5cGhpY29uLWhhbmQtZG93bjpiZWZvcmV7Y29udGVudDoiXGUxMzAifS5nbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTEzMSJ9LmdseXBoaWNvbi1jaXJjbGUtYXJyb3ctbGVmdDpiZWZvcmV7Y29udGVudDoiXGUxMzIifS5nbHlwaGljb24tY2lyY2xlLWFycm93LXVwOmJlZm9yZXtjb250ZW50OiJcZTEzMyJ9LmdseXBoaWNvbi1jaXJjbGUtYXJyb3ctZG93bjpiZWZvcmV7Y29udGVudDoiXGUxMzQifS5nbHlwaGljb24tZ2xvYmU6YmVmb3Jle2NvbnRlbnQ6IlxlMTM1In0uZ2x5cGhpY29uLXdyZW5jaDpiZWZvcmV7Y29udGVudDoiXGUxMzYifS5nbHlwaGljb24tdGFza3M6YmVmb3Jle2NvbnRlbnQ6IlxlMTM3In0uZ2x5cGhpY29uLWZpbHRlcjpiZWZvcmV7Y29udGVudDoiXGUxMzgifS5nbHlwaGljb24tYnJpZWZjYXNlOmJlZm9yZXtjb250ZW50OiJcZTEzOSJ9LmdseXBoaWNvbi1mdWxsc2NyZWVuOmJlZm9yZXtjb250ZW50OiJcZTE0MCJ9LmdseXBoaWNvbi1kYXNoYm9hcmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTQxIn0uZ2x5cGhpY29uLXBhcGVyY2xpcDpiZWZvcmV7Y29udGVudDoiXGUxNDIifS5nbHlwaGljb24taGVhcnQtZW1wdHk6YmVmb3Jle2NvbnRlbnQ6IlxlMTQzIn0uZ2x5cGhpY29uLWxpbms6YmVmb3Jle2NvbnRlbnQ6IlxlMTQ0In0uZ2x5cGhpY29uLXBob25lOmJlZm9yZXtjb250ZW50OiJcZTE0NSJ9LmdseXBoaWNvbi1wdXNocGluOmJlZm9yZXtjb250ZW50OiJcZTE0NiJ9LmdseXBoaWNvbi11c2Q6YmVmb3Jle2NvbnRlbnQ6IlxlMTQ4In0uZ2x5cGhpY29uLWdicDpiZWZvcmV7Y29udGVudDoiXGUxNDkifS5nbHlwaGljb24tc29ydDpiZWZvcmV7Y29udGVudDoiXGUxNTAifS5nbHlwaGljb24tc29ydC1ieS1hbHBoYWJldDpiZWZvcmV7Y29udGVudDoiXGUxNTEifS5nbHlwaGljb24tc29ydC1ieS1hbHBoYWJldC1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTUyIn0uZ2x5cGhpY29uLXNvcnQtYnktb3JkZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMTUzIn0uZ2x5cGhpY29uLXNvcnQtYnktb3JkZXItYWx0OmJlZm9yZXtjb250ZW50OiJcZTE1NCJ9LmdseXBoaWNvbi1zb3J0LWJ5LWF0dHJpYnV0ZXM6YmVmb3Jle2NvbnRlbnQ6IlxlMTU1In0uZ2x5cGhpY29uLXNvcnQtYnktYXR0cmlidXRlcy1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTU2In0uZ2x5cGhpY29uLXVuY2hlY2tlZDpiZWZvcmV7Y29udGVudDoiXGUxNTcifS5nbHlwaGljb24tZXhwYW5kOmJlZm9yZXtjb250ZW50OiJcZTE1OCJ9LmdseXBoaWNvbi1jb2xsYXBzZS1kb3duOmJlZm9yZXtjb250ZW50OiJcZTE1OSJ9LmdseXBoaWNvbi1jb2xsYXBzZS11cDpiZWZvcmV7Y29udGVudDoiXGUxNjAifS5nbHlwaGljb24tbG9nLWluOmJlZm9yZXtjb250ZW50OiJcZTE2MSJ9LmdseXBoaWNvbi1mbGFzaDpiZWZvcmV7Y29udGVudDoiXGUxNjIifS5nbHlwaGljb24tbG9nLW91dDpiZWZvcmV7Y29udGVudDoiXGUxNjMifS5nbHlwaGljb24tbmV3LXdpbmRvdzpiZWZvcmV7Y29udGVudDoiXGUxNjQifS5nbHlwaGljb24tcmVjb3JkOmJlZm9yZXtjb250ZW50OiJcZTE2NSJ9LmdseXBoaWNvbi1zYXZlOmJlZm9yZXtjb250ZW50OiJcZTE2NiJ9LmdseXBoaWNvbi1vcGVuOmJlZm9yZXtjb250ZW50OiJcZTE2NyJ9LmdseXBoaWNvbi1zYXZlZDpiZWZvcmV7Y29udGVudDoiXGUxNjgifS5nbHlwaGljb24taW1wb3J0OmJlZm9yZXtjb250ZW50OiJcZTE2OSJ9LmdseXBoaWNvbi1leHBvcnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTcwIn0uZ2x5cGhpY29uLXNlbmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTcxIn0uZ2x5cGhpY29uLWZsb3BweS1kaXNrOmJlZm9yZXtjb250ZW50OiJcZTE3MiJ9LmdseXBoaWNvbi1mbG9wcHktc2F2ZWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTczIn0uZ2x5cGhpY29uLWZsb3BweS1yZW1vdmU6YmVmb3Jle2NvbnRlbnQ6IlxlMTc0In0uZ2x5cGhpY29uLWZsb3BweS1zYXZlOmJlZm9yZXtjb250ZW50OiJcZTE3NSJ9LmdseXBoaWNvbi1mbG9wcHktb3BlbjpiZWZvcmV7Y29udGVudDoiXGUxNzYifS5nbHlwaGljb24tY3JlZGl0LWNhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTc3In0uZ2x5cGhpY29uLXRyYW5zZmVyOmJlZm9yZXtjb250ZW50OiJcZTE3OCJ9LmdseXBoaWNvbi1jdXRsZXJ5OmJlZm9yZXtjb250ZW50OiJcZTE3OSJ9LmdseXBoaWNvbi1oZWFkZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMTgwIn0uZ2x5cGhpY29uLWNvbXByZXNzZWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTgxIn0uZ2x5cGhpY29uLWVhcnBob25lOmJlZm9yZXtjb250ZW50OiJcZTE4MiJ9LmdseXBoaWNvbi1waG9uZS1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTgzIn0uZ2x5cGhpY29uLXRvd2VyOmJlZm9yZXtjb250ZW50OiJcZTE4NCJ9LmdseXBoaWNvbi1zdGF0czpiZWZvcmV7Y29udGVudDoiXGUxODUifS5nbHlwaGljb24tc2QtdmlkZW86YmVmb3Jle2NvbnRlbnQ6IlxlMTg2In0uZ2x5cGhpY29uLWhkLXZpZGVvOmJlZm9yZXtjb250ZW50OiJcZTE4NyJ9LmdseXBoaWNvbi1zdWJ0aXRsZXM6YmVmb3Jle2NvbnRlbnQ6IlxlMTg4In0uZ2x5cGhpY29uLXNvdW5kLXN0ZXJlbzpiZWZvcmV7Y29udGVudDoiXGUxODkifS5nbHlwaGljb24tc291bmQtZG9sYnk6YmVmb3Jle2NvbnRlbnQ6IlxlMTkwIn0uZ2x5cGhpY29uLXNvdW5kLTUtMTpiZWZvcmV7Y29udGVudDoiXGUxOTEifS5nbHlwaGljb24tc291bmQtNi0xOmJlZm9yZXtjb250ZW50OiJcZTE5MiJ9LmdseXBoaWNvbi1zb3VuZC03LTE6YmVmb3Jle2NvbnRlbnQ6IlxlMTkzIn0uZ2x5cGhpY29uLWNvcHlyaWdodC1tYXJrOmJlZm9yZXtjb250ZW50OiJcZTE5NCJ9LmdseXBoaWNvbi1yZWdpc3RyYXRpb24tbWFyazpiZWZvcmV7Y29udGVudDoiXGUxOTUifS5nbHlwaGljb24tY2xvdWQtZG93bmxvYWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTk3In0uZ2x5cGhpY29uLWNsb3VkLXVwbG9hZDpiZWZvcmV7Y29udGVudDoiXGUxOTgifS5nbHlwaGljb24tdHJlZS1jb25pZmVyOmJlZm9yZXtjb250ZW50OiJcZTE5OSJ9LmdseXBoaWNvbi10cmVlLWRlY2lkdW91czpiZWZvcmV7Y29udGVudDoiXGUyMDAifS5nbHlwaGljb24tY2Q6YmVmb3Jle2NvbnRlbnQ6IlxlMjAxIn0uZ2x5cGhpY29uLXNhdmUtZmlsZTpiZWZvcmV7Y29udGVudDoiXGUyMDIifS5nbHlwaGljb24tb3Blbi1maWxlOmJlZm9yZXtjb250ZW50OiJcZTIwMyJ9LmdseXBoaWNvbi1sZXZlbC11cDpiZWZvcmV7Y29udGVudDoiXGUyMDQifS5nbHlwaGljb24tY29weTpiZWZvcmV7Y29udGVudDoiXGUyMDUifS5nbHlwaGljb24tcGFzdGU6YmVmb3Jle2NvbnRlbnQ6IlxlMjA2In0uZ2x5cGhpY29uLWFsZXJ0OmJlZm9yZXtjb250ZW50OiJcZTIwOSJ9LmdseXBoaWNvbi1lcXVhbGl6ZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMjEwIn0uZ2x5cGhpY29uLWtpbmc6YmVmb3Jle2NvbnRlbnQ6IlxlMjExIn0uZ2x5cGhpY29uLXF1ZWVuOmJlZm9yZXtjb250ZW50OiJcZTIxMiJ9LmdseXBoaWNvbi1wYXduOmJlZm9yZXtjb250ZW50OiJcZTIxMyJ9LmdseXBoaWNvbi1iaXNob3A6YmVmb3Jle2NvbnRlbnQ6IlxlMjE0In0uZ2x5cGhpY29uLWtuaWdodDpiZWZvcmV7Y29udGVudDoiXGUyMTUifS5nbHlwaGljb24tYmFieS1mb3JtdWxhOmJlZm9yZXtjb250ZW50OiJcZTIxNiJ9LmdseXBoaWNvbi10ZW50OmJlZm9yZXtjb250ZW50OiJcMjZmYSJ9LmdseXBoaWNvbi1ibGFja2JvYXJkOmJlZm9yZXtjb250ZW50OiJcZTIxOCJ9LmdseXBoaWNvbi1iZWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMjE5In0uZ2x5cGhpY29uLWFwcGxlOmJlZm9yZXtjb250ZW50OiJcZjhmZiJ9LmdseXBoaWNvbi1lcmFzZTpiZWZvcmV7Y29udGVudDoiXGUyMjEifS5nbHlwaGljb24taG91cmdsYXNzOmJlZm9yZXtjb250ZW50OiJcMjMxYiJ9LmdseXBoaWNvbi1sYW1wOmJlZm9yZXtjb250ZW50OiJcZTIyMyJ9LmdseXBoaWNvbi1kdXBsaWNhdGU6YmVmb3Jle2NvbnRlbnQ6IlxlMjI0In0uZ2x5cGhpY29uLXBpZ2d5LWJhbms6YmVmb3Jle2NvbnRlbnQ6IlxlMjI1In0uZ2x5cGhpY29uLXNjaXNzb3JzOmJlZm9yZXtjb250ZW50OiJcZTIyNiJ9LmdseXBoaWNvbi1iaXRjb2luOmJlZm9yZXtjb250ZW50OiJcZTIyNyJ9LmdseXBoaWNvbi1idGM6YmVmb3Jle2NvbnRlbnQ6IlxlMjI3In0uZ2x5cGhpY29uLXhidDpiZWZvcmV7Y29udGVudDoiXGUyMjcifS5nbHlwaGljb24teWVuOmJlZm9yZXtjb250ZW50OiJcMDBhNSJ9LmdseXBoaWNvbi1qcHk6YmVmb3Jle2NvbnRlbnQ6IlwwMGE1In0uZ2x5cGhpY29uLXJ1YmxlOmJlZm9yZXtjb250ZW50OiJcMjBiZCJ9LmdseXBoaWNvbi1ydWI6YmVmb3Jle2NvbnRlbnQ6IlwyMGJkIn0uZ2x5cGhpY29uLXNjYWxlOmJlZm9yZXtjb250ZW50OiJcZTIzMCJ9LmdseXBoaWNvbi1pY2UtbG9sbHk6YmVmb3Jle2NvbnRlbnQ6IlxlMjMxIn0uZ2x5cGhpY29uLWljZS1sb2xseS10YXN0ZWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMjMyIn0uZ2x5cGhpY29uLWVkdWNhdGlvbjpiZWZvcmV7Y29udGVudDoiXGUyMzMifS5nbHlwaGljb24tb3B0aW9uLWhvcml6b250YWw6YmVmb3Jle2NvbnRlbnQ6IlxlMjM0In0uZ2x5cGhpY29uLW9wdGlvbi12ZXJ0aWNhbDpiZWZvcmV7Y29udGVudDoiXGUyMzUifS5nbHlwaGljb24tbWVudS1oYW1idXJnZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMjM2In0uZ2x5cGhpY29uLW1vZGFsLXdpbmRvdzpiZWZvcmV7Y29udGVudDoiXGUyMzcifS5nbHlwaGljb24tb2lsOmJlZm9yZXtjb250ZW50OiJcZTIzOCJ9LmdseXBoaWNvbi1ncmFpbjpiZWZvcmV7Y29udGVudDoiXGUyMzkifS5nbHlwaGljb24tc3VuZ2xhc3NlczpiZWZvcmV7Y29udGVudDoiXGUyNDAifS5nbHlwaGljb24tdGV4dC1zaXplOmJlZm9yZXtjb250ZW50OiJcZTI0MSJ9LmdseXBoaWNvbi10ZXh0LWNvbG9yOmJlZm9yZXtjb250ZW50OiJcZTI0MiJ9LmdseXBoaWNvbi10ZXh0LWJhY2tncm91bmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMjQzIn0uZ2x5cGhpY29uLW9iamVjdC1hbGlnbi10b3A6YmVmb3Jle2NvbnRlbnQ6IlxlMjQ0In0uZ2x5cGhpY29uLW9iamVjdC1hbGlnbi1ib3R0b206YmVmb3Jle2NvbnRlbnQ6IlxlMjQ1In0uZ2x5cGhpY29uLW9iamVjdC1hbGlnbi1ob3Jpem9udGFsOmJlZm9yZXtjb250ZW50OiJcZTI0NiJ9LmdseXBoaWNvbi1vYmplY3QtYWxpZ24tbGVmdDpiZWZvcmV7Y29udGVudDoiXGUyNDcifS5nbHlwaGljb24tb2JqZWN0LWFsaWduLXZlcnRpY2FsOmJlZm9yZXtjb250ZW50OiJcZTI0OCJ9LmdseXBoaWNvbi1vYmplY3QtYWxpZ24tcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMjQ5In0uZ2x5cGhpY29uLXRyaWFuZ2xlLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTI1MCJ9LmdseXBoaWNvbi10cmlhbmdsZS1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZTI1MSJ9LmdseXBoaWNvbi10cmlhbmdsZS1ib3R0b206YmVmb3Jle2NvbnRlbnQ6IlxlMjUyIn0uZ2x5cGhpY29uLXRyaWFuZ2xlLXRvcDpiZWZvcmV7Y29udGVudDoiXGUyNTMifS5nbHlwaGljb24tY29uc29sZTpiZWZvcmV7Y29udGVudDoiXGUyNTQifS5nbHlwaGljb24tc3VwZXJzY3JpcHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMjU1In0uZ2x5cGhpY29uLXN1YnNjcmlwdDpiZWZvcmV7Y29udGVudDoiXGUyNTYifS5nbHlwaGljb24tbWVudS1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZTI1NyJ9LmdseXBoaWNvbi1tZW51LXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTI1OCJ9LmdseXBoaWNvbi1tZW51LWRvd246YmVmb3Jle2NvbnRlbnQ6IlxlMjU5In0uZ2x5cGhpY29uLW1lbnUtdXA6YmVmb3Jle2NvbnRlbnQ6IlxlMjYwIn0qey13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveH06YWZ0ZXIsOmJlZm9yZXstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3h9aHRtbHtmb250LXNpemU6MTBweDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKX1ib2R5e2ZvbnQtZmFtaWx5OiJIZWx2ZXRpY2EgTmV1ZSIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2ZmZn1idXR0b24saW5wdXQsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7bGluZS1oZWlnaHQ6aW5oZXJpdH1he2NvbG9yOiMzMzdhYjc7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YTpmb2N1cyxhOmhvdmVye2NvbG9yOiMyMzUyN2M7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1hOmZvY3Vze291dGxpbmU6dGhpbiBkb3R0ZWQ7b3V0bGluZTo1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7b3V0bGluZS1vZmZzZXQ6LTJweH1maWd1cmV7bWFyZ2luOjB9aW1ne3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uY2Fyb3VzZWwtaW5uZXI+Lml0ZW0+YT5pbWcsLmNhcm91c2VsLWlubmVyPi5pdGVtPmltZywuaW1nLXJlc3BvbnNpdmUsLnRodW1ibmFpbCBhPmltZywudGh1bWJuYWlsPmltZ3tkaXNwbGF5OmJsb2NrO21heC13aWR0aDoxMDAlO2hlaWdodDphdXRvfS5pbWctcm91bmRlZHtib3JkZXItcmFkaXVzOjZweH0uaW1nLXRodW1ibmFpbHtkaXNwbGF5OmlubGluZS1ibG9jazttYXgtd2lkdGg6MTAwJTtoZWlnaHQ6YXV0bztwYWRkaW5nOjRweDtsaW5lLWhlaWdodDoxLjQyODU3MTQzO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuMnMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjphbGwgLjJzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246YWxsIC4ycyBlYXNlLWluLW91dH0uaW1nLWNpcmNsZXtib3JkZXItcmFkaXVzOjUwJX1ocnttYXJnaW4tdG9wOjIwcHg7bWFyZ2luLWJvdHRvbToyMHB4O2JvcmRlcjowO2JvcmRlci10b3A6MXB4IHNvbGlkICNlZWV9LnNyLW9ubHl7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7cGFkZGluZzowO21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtjbGlwOnJlY3QoMCwwLDAsMCk7Ym9yZGVyOjB9LnNyLW9ubHktZm9jdXNhYmxlOmFjdGl2ZSwuc3Itb25seS1mb2N1c2FibGU6Zm9jdXN7cG9zaXRpb246c3RhdGljO3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87bWFyZ2luOjA7b3ZlcmZsb3c6dmlzaWJsZTtjbGlwOmF1dG99W3JvbGU9YnV0dG9uXXtjdXJzb3I6cG9pbnRlcn0uaDEsLmgyLC5oMywuaDQsLmg1LC5oNixoMSxoMixoMyxoNCxoNSxoNntmb250LWZhbWlseTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMDtsaW5lLWhlaWdodDoxLjE7Y29sb3I6aW5oZXJpdH0uaDEgLnNtYWxsLC5oMSBzbWFsbCwuaDIgLnNtYWxsLC5oMiBzbWFsbCwuaDMgLnNtYWxsLC5oMyBzbWFsbCwuaDQgLnNtYWxsLC5oNCBzbWFsbCwuaDUgLnNtYWxsLC5oNSBzbWFsbCwuaDYgLnNtYWxsLC5oNiBzbWFsbCxoMSAuc21hbGwsaDEgc21hbGwsaDIgLnNtYWxsLGgyIHNtYWxsLGgzIC5zbWFsbCxoMyBzbWFsbCxoNCAuc21hbGwsaDQgc21hbGwsaDUgLnNtYWxsLGg1IHNtYWxsLGg2IC5zbWFsbCxoNiBzbWFsbHtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MTtjb2xvcjojNzc3fS5oMSwuaDIsLmgzLGgxLGgyLGgze21hcmdpbi10b3A6MjBweDttYXJnaW4tYm90dG9tOjEwcHh9LmgxIC5zbWFsbCwuaDEgc21hbGwsLmgyIC5zbWFsbCwuaDIgc21hbGwsLmgzIC5zbWFsbCwuaDMgc21hbGwsaDEgLnNtYWxsLGgxIHNtYWxsLGgyIC5zbWFsbCxoMiBzbWFsbCxoMyAuc21hbGwsaDMgc21hbGx7Zm9udC1zaXplOjY1JX0uaDQsLmg1LC5oNixoNCxoNSxoNnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS5oNCAuc21hbGwsLmg0IHNtYWxsLC5oNSAuc21hbGwsLmg1IHNtYWxsLC5oNiAuc21hbGwsLmg2IHNtYWxsLGg0IC5zbWFsbCxoNCBzbWFsbCxoNSAuc21hbGwsaDUgc21hbGwsaDYgLnNtYWxsLGg2IHNtYWxse2ZvbnQtc2l6ZTo3NSV9LmgxLGgxe2ZvbnQtc2l6ZTozNnB4fS5oMixoMntmb250LXNpemU6MzBweH0uaDMsaDN7Zm9udC1zaXplOjI0cHh9Lmg0LGg0e2ZvbnQtc2l6ZToxOHB4fS5oNSxoNXtmb250LXNpemU6MTRweH0uaDYsaDZ7Zm9udC1zaXplOjEycHh9cHttYXJnaW46MCAwIDEwcHh9LmxlYWR7bWFyZ2luLWJvdHRvbToyMHB4O2ZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OjMwMDtsaW5lLWhlaWdodDoxLjR9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5sZWFke2ZvbnQtc2l6ZToyMXB4fX0uc21hbGwsc21hbGx7Zm9udC1zaXplOjg1JX0ubWFyayxtYXJre3BhZGRpbmc6LjJlbTtiYWNrZ3JvdW5kLWNvbG9yOiNmY2Y4ZTN9LnRleHQtbGVmdHt0ZXh0LWFsaWduOmxlZnR9LnRleHQtcmlnaHR7dGV4dC1hbGlnbjpyaWdodH0udGV4dC1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9LnRleHQtanVzdGlmeXt0ZXh0LWFsaWduOmp1c3RpZnl9LnRleHQtbm93cmFwe3doaXRlLXNwYWNlOm5vd3JhcH0udGV4dC1sb3dlcmNhc2V7dGV4dC10cmFuc2Zvcm06bG93ZXJjYXNlfS50ZXh0LXVwcGVyY2FzZXt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9LnRleHQtY2FwaXRhbGl6ZXt0ZXh0LXRyYW5zZm9ybTpjYXBpdGFsaXplfS50ZXh0LW11dGVke2NvbG9yOiM3Nzd9LnRleHQtcHJpbWFyeXtjb2xvcjojMzM3YWI3fWEudGV4dC1wcmltYXJ5OmZvY3VzLGEudGV4dC1wcmltYXJ5OmhvdmVye2NvbG9yOiMyODYwOTB9LnRleHQtc3VjY2Vzc3tjb2xvcjojM2M3NjNkfWEudGV4dC1zdWNjZXNzOmZvY3VzLGEudGV4dC1zdWNjZXNzOmhvdmVye2NvbG9yOiMyYjU0MmN9LnRleHQtaW5mb3tjb2xvcjojMzE3MDhmfWEudGV4dC1pbmZvOmZvY3VzLGEudGV4dC1pbmZvOmhvdmVye2NvbG9yOiMyNDUyNjl9LnRleHQtd2FybmluZ3tjb2xvcjojOGE2ZDNifWEudGV4dC13YXJuaW5nOmZvY3VzLGEudGV4dC13YXJuaW5nOmhvdmVye2NvbG9yOiM2NjUxMmN9LnRleHQtZGFuZ2Vye2NvbG9yOiNhOTQ0NDJ9YS50ZXh0LWRhbmdlcjpmb2N1cyxhLnRleHQtZGFuZ2VyOmhvdmVye2NvbG9yOiM4NDM1MzR9LmJnLXByaW1hcnl7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzMzdhYjd9YS5iZy1wcmltYXJ5OmZvY3VzLGEuYmctcHJpbWFyeTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMyODYwOTB9LmJnLXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojZGZmMGQ4fWEuYmctc3VjY2Vzczpmb2N1cyxhLmJnLXN1Y2Nlc3M6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzFlMmIzfS5iZy1pbmZve2JhY2tncm91bmQtY29sb3I6I2Q5ZWRmN31hLmJnLWluZm86Zm9jdXMsYS5iZy1pbmZvOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2FmZDllZX0uYmctd2FybmluZ3tiYWNrZ3JvdW5kLWNvbG9yOiNmY2Y4ZTN9YS5iZy13YXJuaW5nOmZvY3VzLGEuYmctd2FybmluZzpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmN2VjYjV9LmJnLWRhbmdlcntiYWNrZ3JvdW5kLWNvbG9yOiNmMmRlZGV9YS5iZy1kYW5nZXI6Zm9jdXMsYS5iZy1kYW5nZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTRiOWI5fS5wYWdlLWhlYWRlcntwYWRkaW5nLWJvdHRvbTo5cHg7bWFyZ2luOjQwcHggMCAyMHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWV9b2wsdWx7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MTBweH1vbCBvbCxvbCB1bCx1bCBvbCx1bCB1bHttYXJnaW4tYm90dG9tOjB9Lmxpc3QtdW5zdHlsZWR7cGFkZGluZy1sZWZ0OjA7bGlzdC1zdHlsZTpub25lfS5saXN0LWlubGluZXtwYWRkaW5nLWxlZnQ6MDttYXJnaW4tbGVmdDotNXB4O2xpc3Qtc3R5bGU6bm9uZX0ubGlzdC1pbmxpbmU+bGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZy1yaWdodDo1cHg7cGFkZGluZy1sZWZ0OjVweH1kbHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToyMHB4fWRkLGR0e2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDN9ZHR7Zm9udC13ZWlnaHQ6NzAwfWRke21hcmdpbi1sZWZ0OjB9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5kbC1ob3Jpem9udGFsIGR0e2Zsb2F0OmxlZnQ7d2lkdGg6MTYwcHg7b3ZlcmZsb3c6aGlkZGVuO2NsZWFyOmxlZnQ7dGV4dC1hbGlnbjpyaWdodDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uZGwtaG9yaXpvbnRhbCBkZHttYXJnaW4tbGVmdDoxODBweH19YWJicltkYXRhLW9yaWdpbmFsLXRpdGxlXSxhYmJyW3RpdGxlXXtjdXJzb3I6aGVscDtib3JkZXItYm90dG9tOjFweCBkb3R0ZWQgIzc3N30uaW5pdGlhbGlzbXtmb250LXNpemU6OTAlO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX1ibG9ja3F1b3Rle3BhZGRpbmc6MTBweCAyMHB4O21hcmdpbjowIDAgMjBweDtmb250LXNpemU6MTcuNXB4O2JvcmRlci1sZWZ0OjVweCBzb2xpZCAjZWVlfWJsb2NrcXVvdGUgb2w6bGFzdC1jaGlsZCxibG9ja3F1b3RlIHA6bGFzdC1jaGlsZCxibG9ja3F1b3RlIHVsOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfWJsb2NrcXVvdGUgLnNtYWxsLGJsb2NrcXVvdGUgZm9vdGVyLGJsb2NrcXVvdGUgc21hbGx7ZGlzcGxheTpibG9jaztmb250LXNpemU6ODAlO2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7Y29sb3I6Izc3N31ibG9ja3F1b3RlIC5zbWFsbDpiZWZvcmUsYmxvY2txdW90ZSBmb290ZXI6YmVmb3JlLGJsb2NrcXVvdGUgc21hbGw6YmVmb3Jle2NvbnRlbnQ6J1wyMDE0IFwwMEEwJ30uYmxvY2txdW90ZS1yZXZlcnNlLGJsb2NrcXVvdGUucHVsbC1yaWdodHtwYWRkaW5nLXJpZ2h0OjE1cHg7cGFkZGluZy1sZWZ0OjA7dGV4dC1hbGlnbjpyaWdodDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkICNlZWU7Ym9yZGVyLWxlZnQ6MH0uYmxvY2txdW90ZS1yZXZlcnNlIC5zbWFsbDpiZWZvcmUsLmJsb2NrcXVvdGUtcmV2ZXJzZSBmb290ZXI6YmVmb3JlLC5ibG9ja3F1b3RlLXJldmVyc2Ugc21hbGw6YmVmb3JlLGJsb2NrcXVvdGUucHVsbC1yaWdodCAuc21hbGw6YmVmb3JlLGJsb2NrcXVvdGUucHVsbC1yaWdodCBmb290ZXI6YmVmb3JlLGJsb2NrcXVvdGUucHVsbC1yaWdodCBzbWFsbDpiZWZvcmV7Y29udGVudDonJ30uYmxvY2txdW90ZS1yZXZlcnNlIC5zbWFsbDphZnRlciwuYmxvY2txdW90ZS1yZXZlcnNlIGZvb3RlcjphZnRlciwuYmxvY2txdW90ZS1yZXZlcnNlIHNtYWxsOmFmdGVyLGJsb2NrcXVvdGUucHVsbC1yaWdodCAuc21hbGw6YWZ0ZXIsYmxvY2txdW90ZS5wdWxsLXJpZ2h0IGZvb3RlcjphZnRlcixibG9ja3F1b3RlLnB1bGwtcmlnaHQgc21hbGw6YWZ0ZXJ7Y29udGVudDonXDAwQTAgXDIwMTQnfWFkZHJlc3N7bWFyZ2luLWJvdHRvbToyMHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDN9Y29kZSxrYmQscHJlLHNhbXB7Zm9udC1mYW1pbHk6TWVubG8sTW9uYWNvLENvbnNvbGFzLCJDb3VyaWVyIE5ldyIsbW9ub3NwYWNlfWNvZGV7cGFkZGluZzoycHggNHB4O2ZvbnQtc2l6ZTo5MCU7Y29sb3I6I2M3MjU0ZTtiYWNrZ3JvdW5kLWNvbG9yOiNmOWYyZjQ7Ym9yZGVyLXJhZGl1czo0cHh9a2Jke3BhZGRpbmc6MnB4IDRweDtmb250LXNpemU6OTAlO2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzMzO2JvcmRlci1yYWRpdXM6M3B4Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIC0xcHggMCByZ2JhKDAsMCwwLC4yNSk7Ym94LXNoYWRvdzppbnNldCAwIC0xcHggMCByZ2JhKDAsMCwwLC4yNSl9a2JkIGtiZHtwYWRkaW5nOjA7Zm9udC1zaXplOjEwMCU7Zm9udC13ZWlnaHQ6NzAwOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX1wcmV7ZGlzcGxheTpibG9jaztwYWRkaW5nOjkuNXB4O21hcmdpbjowIDAgMTBweDtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxLjQyODU3MTQzO2NvbG9yOiMzMzM7d29yZC1icmVhazpicmVhay1hbGw7d29yZC13cmFwOmJyZWFrLXdvcmQ7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlcjoxcHggc29saWQgI2NjYztib3JkZXItcmFkaXVzOjRweH1wcmUgY29kZXtwYWRkaW5nOjA7Zm9udC1zaXplOmluaGVyaXQ7Y29sb3I6aW5oZXJpdDt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MH0ucHJlLXNjcm9sbGFibGV7bWF4LWhlaWdodDozNDBweDtvdmVyZmxvdy15OnNjcm9sbH0uY29udGFpbmVye3BhZGRpbmctcmlnaHQ6MTVweDtwYWRkaW5nLWxlZnQ6MTVweDttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tbGVmdDphdXRvfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuY29udGFpbmVye3dpZHRoOjc1MHB4fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCl7LmNvbnRhaW5lcnt3aWR0aDo5NzBweH19QG1lZGlhIChtaW4td2lkdGg6MTIwMHB4KXsuY29udGFpbmVye3dpZHRoOjExNzBweH19LmNvbnRhaW5lci1mbHVpZHtwYWRkaW5nLXJpZ2h0OjE1cHg7cGFkZGluZy1sZWZ0OjE1cHg7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6YXV0b30ucm93e21hcmdpbi1yaWdodDotMTVweDttYXJnaW4tbGVmdDotMTVweH0uY29sLWxnLTEsLmNvbC1sZy0xMCwuY29sLWxnLTExLC5jb2wtbGctMTIsLmNvbC1sZy0yLC5jb2wtbGctMywuY29sLWxnLTQsLmNvbC1sZy01LC5jb2wtbGctNiwuY29sLWxnLTcsLmNvbC1sZy04LC5jb2wtbGctOSwuY29sLW1kLTEsLmNvbC1tZC0xMCwuY29sLW1kLTExLC5jb2wtbWQtMTIsLmNvbC1tZC0yLC5jb2wtbWQtMywuY29sLW1kLTQsLmNvbC1tZC01LC5jb2wtbWQtNiwuY29sLW1kLTcsLmNvbC1tZC04LC5jb2wtbWQtOSwuY29sLXNtLTEsLmNvbC1zbS0xMCwuY29sLXNtLTExLC5jb2wtc20tMTIsLmNvbC1zbS0yLC5jb2wtc20tMywuY29sLXNtLTQsLmNvbC1zbS01LC5jb2wtc20tNiwuY29sLXNtLTcsLmNvbC1zbS04LC5jb2wtc20tOSwuY29sLXhzLTEsLmNvbC14cy0xMCwuY29sLXhzLTExLC5jb2wteHMtMTIsLmNvbC14cy0yLC5jb2wteHMtMywuY29sLXhzLTQsLmNvbC14cy01LC5jb2wteHMtNiwuY29sLXhzLTcsLmNvbC14cy04LC5jb2wteHMtOXtwb3NpdGlvbjpyZWxhdGl2ZTttaW4taGVpZ2h0OjFweDtwYWRkaW5nLXJpZ2h0OjE1cHg7cGFkZGluZy1sZWZ0OjE1cHh9LmNvbC14cy0xLC5jb2wteHMtMTAsLmNvbC14cy0xMSwuY29sLXhzLTEyLC5jb2wteHMtMiwuY29sLXhzLTMsLmNvbC14cy00LC5jb2wteHMtNSwuY29sLXhzLTYsLmNvbC14cy03LC5jb2wteHMtOCwuY29sLXhzLTl7ZmxvYXQ6bGVmdH0uY29sLXhzLTEye3dpZHRoOjEwMCV9LmNvbC14cy0xMXt3aWR0aDo5MS42NjY2NjY2NyV9LmNvbC14cy0xMHt3aWR0aDo4My4zMzMzMzMzMyV9LmNvbC14cy05e3dpZHRoOjc1JX0uY29sLXhzLTh7d2lkdGg6NjYuNjY2NjY2NjclfS5jb2wteHMtN3t3aWR0aDo1OC4zMzMzMzMzMyV9LmNvbC14cy02e3dpZHRoOjUwJX0uY29sLXhzLTV7d2lkdGg6NDEuNjY2NjY2NjclfS5jb2wteHMtNHt3aWR0aDozMy4zMzMzMzMzMyV9LmNvbC14cy0ze3dpZHRoOjI1JX0uY29sLXhzLTJ7d2lkdGg6MTYuNjY2NjY2NjclfS5jb2wteHMtMXt3aWR0aDo4LjMzMzMzMzMzJX0uY29sLXhzLXB1bGwtMTJ7cmlnaHQ6MTAwJX0uY29sLXhzLXB1bGwtMTF7cmlnaHQ6OTEuNjY2NjY2NjclfS5jb2wteHMtcHVsbC0xMHtyaWdodDo4My4zMzMzMzMzMyV9LmNvbC14cy1wdWxsLTl7cmlnaHQ6NzUlfS5jb2wteHMtcHVsbC04e3JpZ2h0OjY2LjY2NjY2NjY3JX0uY29sLXhzLXB1bGwtN3tyaWdodDo1OC4zMzMzMzMzMyV9LmNvbC14cy1wdWxsLTZ7cmlnaHQ6NTAlfS5jb2wteHMtcHVsbC01e3JpZ2h0OjQxLjY2NjY2NjY3JX0uY29sLXhzLXB1bGwtNHtyaWdodDozMy4zMzMzMzMzMyV9LmNvbC14cy1wdWxsLTN7cmlnaHQ6MjUlfS5jb2wteHMtcHVsbC0ye3JpZ2h0OjE2LjY2NjY2NjY3JX0uY29sLXhzLXB1bGwtMXtyaWdodDo4LjMzMzMzMzMzJX0uY29sLXhzLXB1bGwtMHtyaWdodDphdXRvfS5jb2wteHMtcHVzaC0xMntsZWZ0OjEwMCV9LmNvbC14cy1wdXNoLTExe2xlZnQ6OTEuNjY2NjY2NjclfS5jb2wteHMtcHVzaC0xMHtsZWZ0OjgzLjMzMzMzMzMzJX0uY29sLXhzLXB1c2gtOXtsZWZ0Ojc1JX0uY29sLXhzLXB1c2gtOHtsZWZ0OjY2LjY2NjY2NjY3JX0uY29sLXhzLXB1c2gtN3tsZWZ0OjU4LjMzMzMzMzMzJX0uY29sLXhzLXB1c2gtNntsZWZ0OjUwJX0uY29sLXhzLXB1c2gtNXtsZWZ0OjQxLjY2NjY2NjY3JX0uY29sLXhzLXB1c2gtNHtsZWZ0OjMzLjMzMzMzMzMzJX0uY29sLXhzLXB1c2gtM3tsZWZ0OjI1JX0uY29sLXhzLXB1c2gtMntsZWZ0OjE2LjY2NjY2NjY3JX0uY29sLXhzLXB1c2gtMXtsZWZ0OjguMzMzMzMzMzMlfS5jb2wteHMtcHVzaC0we2xlZnQ6YXV0b30uY29sLXhzLW9mZnNldC0xMnttYXJnaW4tbGVmdDoxMDAlfS5jb2wteHMtb2Zmc2V0LTExe21hcmdpbi1sZWZ0OjkxLjY2NjY2NjY3JX0uY29sLXhzLW9mZnNldC0xMHttYXJnaW4tbGVmdDo4My4zMzMzMzMzMyV9LmNvbC14cy1vZmZzZXQtOXttYXJnaW4tbGVmdDo3NSV9LmNvbC14cy1vZmZzZXQtOHttYXJnaW4tbGVmdDo2Ni42NjY2NjY2NyV9LmNvbC14cy1vZmZzZXQtN3ttYXJnaW4tbGVmdDo1OC4zMzMzMzMzMyV9LmNvbC14cy1vZmZzZXQtNnttYXJnaW4tbGVmdDo1MCV9LmNvbC14cy1vZmZzZXQtNXttYXJnaW4tbGVmdDo0MS42NjY2NjY2NyV9LmNvbC14cy1vZmZzZXQtNHttYXJnaW4tbGVmdDozMy4zMzMzMzMzMyV9LmNvbC14cy1vZmZzZXQtM3ttYXJnaW4tbGVmdDoyNSV9LmNvbC14cy1vZmZzZXQtMnttYXJnaW4tbGVmdDoxNi42NjY2NjY2NyV9LmNvbC14cy1vZmZzZXQtMXttYXJnaW4tbGVmdDo4LjMzMzMzMzMzJX0uY29sLXhzLW9mZnNldC0we21hcmdpbi1sZWZ0OjB9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5jb2wtc20tMSwuY29sLXNtLTEwLC5jb2wtc20tMTEsLmNvbC1zbS0xMiwuY29sLXNtLTIsLmNvbC1zbS0zLC5jb2wtc20tNCwuY29sLXNtLTUsLmNvbC1zbS02LC5jb2wtc20tNywuY29sLXNtLTgsLmNvbC1zbS05e2Zsb2F0OmxlZnR9LmNvbC1zbS0xMnt3aWR0aDoxMDAlfS5jb2wtc20tMTF7d2lkdGg6OTEuNjY2NjY2NjclfS5jb2wtc20tMTB7d2lkdGg6ODMuMzMzMzMzMzMlfS5jb2wtc20tOXt3aWR0aDo3NSV9LmNvbC1zbS04e3dpZHRoOjY2LjY2NjY2NjY3JX0uY29sLXNtLTd7d2lkdGg6NTguMzMzMzMzMzMlfS5jb2wtc20tNnt3aWR0aDo1MCV9LmNvbC1zbS01e3dpZHRoOjQxLjY2NjY2NjY3JX0uY29sLXNtLTR7d2lkdGg6MzMuMzMzMzMzMzMlfS5jb2wtc20tM3t3aWR0aDoyNSV9LmNvbC1zbS0ye3dpZHRoOjE2LjY2NjY2NjY3JX0uY29sLXNtLTF7d2lkdGg6OC4zMzMzMzMzMyV9LmNvbC1zbS1wdWxsLTEye3JpZ2h0OjEwMCV9LmNvbC1zbS1wdWxsLTExe3JpZ2h0OjkxLjY2NjY2NjY3JX0uY29sLXNtLXB1bGwtMTB7cmlnaHQ6ODMuMzMzMzMzMzMlfS5jb2wtc20tcHVsbC05e3JpZ2h0Ojc1JX0uY29sLXNtLXB1bGwtOHtyaWdodDo2Ni42NjY2NjY2NyV9LmNvbC1zbS1wdWxsLTd7cmlnaHQ6NTguMzMzMzMzMzMlfS5jb2wtc20tcHVsbC02e3JpZ2h0OjUwJX0uY29sLXNtLXB1bGwtNXtyaWdodDo0MS42NjY2NjY2NyV9LmNvbC1zbS1wdWxsLTR7cmlnaHQ6MzMuMzMzMzMzMzMlfS5jb2wtc20tcHVsbC0ze3JpZ2h0OjI1JX0uY29sLXNtLXB1bGwtMntyaWdodDoxNi42NjY2NjY2NyV9LmNvbC1zbS1wdWxsLTF7cmlnaHQ6OC4zMzMzMzMzMyV9LmNvbC1zbS1wdWxsLTB7cmlnaHQ6YXV0b30uY29sLXNtLXB1c2gtMTJ7bGVmdDoxMDAlfS5jb2wtc20tcHVzaC0xMXtsZWZ0OjkxLjY2NjY2NjY3JX0uY29sLXNtLXB1c2gtMTB7bGVmdDo4My4zMzMzMzMzMyV9LmNvbC1zbS1wdXNoLTl7bGVmdDo3NSV9LmNvbC1zbS1wdXNoLTh7bGVmdDo2Ni42NjY2NjY2NyV9LmNvbC1zbS1wdXNoLTd7bGVmdDo1OC4zMzMzMzMzMyV9LmNvbC1zbS1wdXNoLTZ7bGVmdDo1MCV9LmNvbC1zbS1wdXNoLTV7bGVmdDo0MS42NjY2NjY2NyV9LmNvbC1zbS1wdXNoLTR7bGVmdDozMy4zMzMzMzMzMyV9LmNvbC1zbS1wdXNoLTN7bGVmdDoyNSV9LmNvbC1zbS1wdXNoLTJ7bGVmdDoxNi42NjY2NjY2NyV9LmNvbC1zbS1wdXNoLTF7bGVmdDo4LjMzMzMzMzMzJX0uY29sLXNtLXB1c2gtMHtsZWZ0OmF1dG99LmNvbC1zbS1vZmZzZXQtMTJ7bWFyZ2luLWxlZnQ6MTAwJX0uY29sLXNtLW9mZnNldC0xMXttYXJnaW4tbGVmdDo5MS42NjY2NjY2NyV9LmNvbC1zbS1vZmZzZXQtMTB7bWFyZ2luLWxlZnQ6ODMuMzMzMzMzMzMlfS5jb2wtc20tb2Zmc2V0LTl7bWFyZ2luLWxlZnQ6NzUlfS5jb2wtc20tb2Zmc2V0LTh7bWFyZ2luLWxlZnQ6NjYuNjY2NjY2NjclfS5jb2wtc20tb2Zmc2V0LTd7bWFyZ2luLWxlZnQ6NTguMzMzMzMzMzMlfS5jb2wtc20tb2Zmc2V0LTZ7bWFyZ2luLWxlZnQ6NTAlfS5jb2wtc20tb2Zmc2V0LTV7bWFyZ2luLWxlZnQ6NDEuNjY2NjY2NjclfS5jb2wtc20tb2Zmc2V0LTR7bWFyZ2luLWxlZnQ6MzMuMzMzMzMzMzMlfS5jb2wtc20tb2Zmc2V0LTN7bWFyZ2luLWxlZnQ6MjUlfS5jb2wtc20tb2Zmc2V0LTJ7bWFyZ2luLWxlZnQ6MTYuNjY2NjY2NjclfS5jb2wtc20tb2Zmc2V0LTF7bWFyZ2luLWxlZnQ6OC4zMzMzMzMzMyV9LmNvbC1zbS1vZmZzZXQtMHttYXJnaW4tbGVmdDowfX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCl7LmNvbC1tZC0xLC5jb2wtbWQtMTAsLmNvbC1tZC0xMSwuY29sLW1kLTEyLC5jb2wtbWQtMiwuY29sLW1kLTMsLmNvbC1tZC00LC5jb2wtbWQtNSwuY29sLW1kLTYsLmNvbC1tZC03LC5jb2wtbWQtOCwuY29sLW1kLTl7ZmxvYXQ6bGVmdH0uY29sLW1kLTEye3dpZHRoOjEwMCV9LmNvbC1tZC0xMXt3aWR0aDo5MS42NjY2NjY2NyV9LmNvbC1tZC0xMHt3aWR0aDo4My4zMzMzMzMzMyV9LmNvbC1tZC05e3dpZHRoOjc1JX0uY29sLW1kLTh7d2lkdGg6NjYuNjY2NjY2NjclfS5jb2wtbWQtN3t3aWR0aDo1OC4zMzMzMzMzMyV9LmNvbC1tZC02e3dpZHRoOjUwJX0uY29sLW1kLTV7d2lkdGg6NDEuNjY2NjY2NjclfS5jb2wtbWQtNHt3aWR0aDozMy4zMzMzMzMzMyV9LmNvbC1tZC0ze3dpZHRoOjI1JX0uY29sLW1kLTJ7d2lkdGg6MTYuNjY2NjY2NjclfS5jb2wtbWQtMXt3aWR0aDo4LjMzMzMzMzMzJX0uY29sLW1kLXB1bGwtMTJ7cmlnaHQ6MTAwJX0uY29sLW1kLXB1bGwtMTF7cmlnaHQ6OTEuNjY2NjY2NjclfS5jb2wtbWQtcHVsbC0xMHtyaWdodDo4My4zMzMzMzMzMyV9LmNvbC1tZC1wdWxsLTl7cmlnaHQ6NzUlfS5jb2wtbWQtcHVsbC04e3JpZ2h0OjY2LjY2NjY2NjY3JX0uY29sLW1kLXB1bGwtN3tyaWdodDo1OC4zMzMzMzMzMyV9LmNvbC1tZC1wdWxsLTZ7cmlnaHQ6NTAlfS5jb2wtbWQtcHVsbC01e3JpZ2h0OjQxLjY2NjY2NjY3JX0uY29sLW1kLXB1bGwtNHtyaWdodDozMy4zMzMzMzMzMyV9LmNvbC1tZC1wdWxsLTN7cmlnaHQ6MjUlfS5jb2wtbWQtcHVsbC0ye3JpZ2h0OjE2LjY2NjY2NjY3JX0uY29sLW1kLXB1bGwtMXtyaWdodDo4LjMzMzMzMzMzJX0uY29sLW1kLXB1bGwtMHtyaWdodDphdXRvfS5jb2wtbWQtcHVzaC0xMntsZWZ0OjEwMCV9LmNvbC1tZC1wdXNoLTExe2xlZnQ6OTEuNjY2NjY2NjclfS5jb2wtbWQtcHVzaC0xMHtsZWZ0OjgzLjMzMzMzMzMzJX0uY29sLW1kLXB1c2gtOXtsZWZ0Ojc1JX0uY29sLW1kLXB1c2gtOHtsZWZ0OjY2LjY2NjY2NjY3JX0uY29sLW1kLXB1c2gtN3tsZWZ0OjU4LjMzMzMzMzMzJX0uY29sLW1kLXB1c2gtNntsZWZ0OjUwJX0uY29sLW1kLXB1c2gtNXtsZWZ0OjQxLjY2NjY2NjY3JX0uY29sLW1kLXB1c2gtNHtsZWZ0OjMzLjMzMzMzMzMzJX0uY29sLW1kLXB1c2gtM3tsZWZ0OjI1JX0uY29sLW1kLXB1c2gtMntsZWZ0OjE2LjY2NjY2NjY3JX0uY29sLW1kLXB1c2gtMXtsZWZ0OjguMzMzMzMzMzMlfS5jb2wtbWQtcHVzaC0we2xlZnQ6YXV0b30uY29sLW1kLW9mZnNldC0xMnttYXJnaW4tbGVmdDoxMDAlfS5jb2wtbWQtb2Zmc2V0LTExe21hcmdpbi1sZWZ0OjkxLjY2NjY2NjY3JX0uY29sLW1kLW9mZnNldC0xMHttYXJnaW4tbGVmdDo4My4zMzMzMzMzMyV9LmNvbC1tZC1vZmZzZXQtOXttYXJnaW4tbGVmdDo3NSV9LmNvbC1tZC1vZmZzZXQtOHttYXJnaW4tbGVmdDo2Ni42NjY2NjY2NyV9LmNvbC1tZC1vZmZzZXQtN3ttYXJnaW4tbGVmdDo1OC4zMzMzMzMzMyV9LmNvbC1tZC1vZmZzZXQtNnttYXJnaW4tbGVmdDo1MCV9LmNvbC1tZC1vZmZzZXQtNXttYXJnaW4tbGVmdDo0MS42NjY2NjY2NyV9LmNvbC1tZC1vZmZzZXQtNHttYXJnaW4tbGVmdDozMy4zMzMzMzMzMyV9LmNvbC1tZC1vZmZzZXQtM3ttYXJnaW4tbGVmdDoyNSV9LmNvbC1tZC1vZmZzZXQtMnttYXJnaW4tbGVmdDoxNi42NjY2NjY2NyV9LmNvbC1tZC1vZmZzZXQtMXttYXJnaW4tbGVmdDo4LjMzMzMzMzMzJX0uY29sLW1kLW9mZnNldC0we21hcmdpbi1sZWZ0OjB9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7LmNvbC1sZy0xLC5jb2wtbGctMTAsLmNvbC1sZy0xMSwuY29sLWxnLTEyLC5jb2wtbGctMiwuY29sLWxnLTMsLmNvbC1sZy00LC5jb2wtbGctNSwuY29sLWxnLTYsLmNvbC1sZy03LC5jb2wtbGctOCwuY29sLWxnLTl7ZmxvYXQ6bGVmdH0uY29sLWxnLTEye3dpZHRoOjEwMCV9LmNvbC1sZy0xMXt3aWR0aDo5MS42NjY2NjY2NyV9LmNvbC1sZy0xMHt3aWR0aDo4My4zMzMzMzMzMyV9LmNvbC1sZy05e3dpZHRoOjc1JX0uY29sLWxnLTh7d2lkdGg6NjYuNjY2NjY2NjclfS5jb2wtbGctN3t3aWR0aDo1OC4zMzMzMzMzMyV9LmNvbC1sZy02e3dpZHRoOjUwJX0uY29sLWxnLTV7d2lkdGg6NDEuNjY2NjY2NjclfS5jb2wtbGctNHt3aWR0aDozMy4zMzMzMzMzMyV9LmNvbC1sZy0ze3dpZHRoOjI1JX0uY29sLWxnLTJ7d2lkdGg6MTYuNjY2NjY2NjclfS5jb2wtbGctMXt3aWR0aDo4LjMzMzMzMzMzJX0uY29sLWxnLXB1bGwtMTJ7cmlnaHQ6MTAwJX0uY29sLWxnLXB1bGwtMTF7cmlnaHQ6OTEuNjY2NjY2NjclfS5jb2wtbGctcHVsbC0xMHtyaWdodDo4My4zMzMzMzMzMyV9LmNvbC1sZy1wdWxsLTl7cmlnaHQ6NzUlfS5jb2wtbGctcHVsbC04e3JpZ2h0OjY2LjY2NjY2NjY3JX0uY29sLWxnLXB1bGwtN3tyaWdodDo1OC4zMzMzMzMzMyV9LmNvbC1sZy1wdWxsLTZ7cmlnaHQ6NTAlfS5jb2wtbGctcHVsbC01e3JpZ2h0OjQxLjY2NjY2NjY3JX0uY29sLWxnLXB1bGwtNHtyaWdodDozMy4zMzMzMzMzMyV9LmNvbC1sZy1wdWxsLTN7cmlnaHQ6MjUlfS5jb2wtbGctcHVsbC0ye3JpZ2h0OjE2LjY2NjY2NjY3JX0uY29sLWxnLXB1bGwtMXtyaWdodDo4LjMzMzMzMzMzJX0uY29sLWxnLXB1bGwtMHtyaWdodDphdXRvfS5jb2wtbGctcHVzaC0xMntsZWZ0OjEwMCV9LmNvbC1sZy1wdXNoLTExe2xlZnQ6OTEuNjY2NjY2NjclfS5jb2wtbGctcHVzaC0xMHtsZWZ0OjgzLjMzMzMzMzMzJX0uY29sLWxnLXB1c2gtOXtsZWZ0Ojc1JX0uY29sLWxnLXB1c2gtOHtsZWZ0OjY2LjY2NjY2NjY3JX0uY29sLWxnLXB1c2gtN3tsZWZ0OjU4LjMzMzMzMzMzJX0uY29sLWxnLXB1c2gtNntsZWZ0OjUwJX0uY29sLWxnLXB1c2gtNXtsZWZ0OjQxLjY2NjY2NjY3JX0uY29sLWxnLXB1c2gtNHtsZWZ0OjMzLjMzMzMzMzMzJX0uY29sLWxnLXB1c2gtM3tsZWZ0OjI1JX0uY29sLWxnLXB1c2gtMntsZWZ0OjE2LjY2NjY2NjY3JX0uY29sLWxnLXB1c2gtMXtsZWZ0OjguMzMzMzMzMzMlfS5jb2wtbGctcHVzaC0we2xlZnQ6YXV0b30uY29sLWxnLW9mZnNldC0xMnttYXJnaW4tbGVmdDoxMDAlfS5jb2wtbGctb2Zmc2V0LTExe21hcmdpbi1sZWZ0OjkxLjY2NjY2NjY3JX0uY29sLWxnLW9mZnNldC0xMHttYXJnaW4tbGVmdDo4My4zMzMzMzMzMyV9LmNvbC1sZy1vZmZzZXQtOXttYXJnaW4tbGVmdDo3NSV9LmNvbC1sZy1vZmZzZXQtOHttYXJnaW4tbGVmdDo2Ni42NjY2NjY2NyV9LmNvbC1sZy1vZmZzZXQtN3ttYXJnaW4tbGVmdDo1OC4zMzMzMzMzMyV9LmNvbC1sZy1vZmZzZXQtNnttYXJnaW4tbGVmdDo1MCV9LmNvbC1sZy1vZmZzZXQtNXttYXJnaW4tbGVmdDo0MS42NjY2NjY2NyV9LmNvbC1sZy1vZmZzZXQtNHttYXJnaW4tbGVmdDozMy4zMzMzMzMzMyV9LmNvbC1sZy1vZmZzZXQtM3ttYXJnaW4tbGVmdDoyNSV9LmNvbC1sZy1vZmZzZXQtMnttYXJnaW4tbGVmdDoxNi42NjY2NjY2NyV9LmNvbC1sZy1vZmZzZXQtMXttYXJnaW4tbGVmdDo4LjMzMzMzMzMzJX0uY29sLWxnLW9mZnNldC0we21hcmdpbi1sZWZ0OjB9fXRhYmxle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Y2FwdGlvbntwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4O2NvbG9yOiM3Nzc7dGV4dC1hbGlnbjpsZWZ0fXRoe3RleHQtYWxpZ246bGVmdH0udGFibGV7d2lkdGg6MTAwJTttYXgtd2lkdGg6MTAwJTttYXJnaW4tYm90dG9tOjIwcHh9LnRhYmxlPnRib2R5PnRyPnRkLC50YWJsZT50Ym9keT50cj50aCwudGFibGU+dGZvb3Q+dHI+dGQsLnRhYmxlPnRmb290PnRyPnRoLC50YWJsZT50aGVhZD50cj50ZCwudGFibGU+dGhlYWQ+dHI+dGh7cGFkZGluZzo4cHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mzt2ZXJ0aWNhbC1hbGlnbjp0b3A7Ym9yZGVyLXRvcDoxcHggc29saWQgI2RkZH0udGFibGU+dGhlYWQ+dHI+dGh7dmVydGljYWwtYWxpZ246Ym90dG9tO2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNkZGR9LnRhYmxlPmNhcHRpb24rdGhlYWQ+dHI6Zmlyc3QtY2hpbGQ+dGQsLnRhYmxlPmNhcHRpb24rdGhlYWQ+dHI6Zmlyc3QtY2hpbGQ+dGgsLnRhYmxlPmNvbGdyb3VwK3RoZWFkPnRyOmZpcnN0LWNoaWxkPnRkLC50YWJsZT5jb2xncm91cCt0aGVhZD50cjpmaXJzdC1jaGlsZD50aCwudGFibGU+dGhlYWQ6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQ+dGQsLnRhYmxlPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkPnRoe2JvcmRlci10b3A6MH0udGFibGU+dGJvZHkrdGJvZHl7Ym9yZGVyLXRvcDoycHggc29saWQgI2RkZH0udGFibGUgLnRhYmxle2JhY2tncm91bmQtY29sb3I6I2ZmZn0udGFibGUtY29uZGVuc2VkPnRib2R5PnRyPnRkLC50YWJsZS1jb25kZW5zZWQ+dGJvZHk+dHI+dGgsLnRhYmxlLWNvbmRlbnNlZD50Zm9vdD50cj50ZCwudGFibGUtY29uZGVuc2VkPnRmb290PnRyPnRoLC50YWJsZS1jb25kZW5zZWQ+dGhlYWQ+dHI+dGQsLnRhYmxlLWNvbmRlbnNlZD50aGVhZD50cj50aHtwYWRkaW5nOjVweH0udGFibGUtYm9yZGVyZWR7Ym9yZGVyOjFweCBzb2xpZCAjZGRkfS50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50ZCwudGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGgsLnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRkLC50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50aCwudGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI+dGQsLnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRoe2JvcmRlcjoxcHggc29saWQgI2RkZH0udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI+dGQsLnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRoe2JvcmRlci1ib3R0b20td2lkdGg6MnB4fS50YWJsZS1zdHJpcGVkPnRib2R5PnRyOm50aC1vZi10eXBlKG9kZCl7YmFja2dyb3VuZC1jb2xvcjojZjlmOWY5fS50YWJsZS1ob3Zlcj50Ym9keT50cjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjV9dGFibGUgY29sW2NsYXNzKj1jb2wtXXtwb3NpdGlvbjpzdGF0aWM7ZGlzcGxheTp0YWJsZS1jb2x1bW47ZmxvYXQ6bm9uZX10YWJsZSB0ZFtjbGFzcyo9Y29sLV0sdGFibGUgdGhbY2xhc3MqPWNvbC1de3Bvc2l0aW9uOnN0YXRpYztkaXNwbGF5OnRhYmxlLWNlbGw7ZmxvYXQ6bm9uZX0udGFibGU+dGJvZHk+dHIuYWN0aXZlPnRkLC50YWJsZT50Ym9keT50ci5hY3RpdmU+dGgsLnRhYmxlPnRib2R5PnRyPnRkLmFjdGl2ZSwudGFibGU+dGJvZHk+dHI+dGguYWN0aXZlLC50YWJsZT50Zm9vdD50ci5hY3RpdmU+dGQsLnRhYmxlPnRmb290PnRyLmFjdGl2ZT50aCwudGFibGU+dGZvb3Q+dHI+dGQuYWN0aXZlLC50YWJsZT50Zm9vdD50cj50aC5hY3RpdmUsLnRhYmxlPnRoZWFkPnRyLmFjdGl2ZT50ZCwudGFibGU+dGhlYWQ+dHIuYWN0aXZlPnRoLC50YWJsZT50aGVhZD50cj50ZC5hY3RpdmUsLnRhYmxlPnRoZWFkPnRyPnRoLmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjV9LnRhYmxlLWhvdmVyPnRib2R5PnRyLmFjdGl2ZTpob3Zlcj50ZCwudGFibGUtaG92ZXI+dGJvZHk+dHIuYWN0aXZlOmhvdmVyPnRoLC50YWJsZS1ob3Zlcj50Ym9keT50cjpob3Zlcj4uYWN0aXZlLC50YWJsZS1ob3Zlcj50Ym9keT50cj50ZC5hY3RpdmU6aG92ZXIsLnRhYmxlLWhvdmVyPnRib2R5PnRyPnRoLmFjdGl2ZTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlOGU4ZTh9LnRhYmxlPnRib2R5PnRyLnN1Y2Nlc3M+dGQsLnRhYmxlPnRib2R5PnRyLnN1Y2Nlc3M+dGgsLnRhYmxlPnRib2R5PnRyPnRkLnN1Y2Nlc3MsLnRhYmxlPnRib2R5PnRyPnRoLnN1Y2Nlc3MsLnRhYmxlPnRmb290PnRyLnN1Y2Nlc3M+dGQsLnRhYmxlPnRmb290PnRyLnN1Y2Nlc3M+dGgsLnRhYmxlPnRmb290PnRyPnRkLnN1Y2Nlc3MsLnRhYmxlPnRmb290PnRyPnRoLnN1Y2Nlc3MsLnRhYmxlPnRoZWFkPnRyLnN1Y2Nlc3M+dGQsLnRhYmxlPnRoZWFkPnRyLnN1Y2Nlc3M+dGgsLnRhYmxlPnRoZWFkPnRyPnRkLnN1Y2Nlc3MsLnRhYmxlPnRoZWFkPnRyPnRoLnN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojZGZmMGQ4fS50YWJsZS1ob3Zlcj50Ym9keT50ci5zdWNjZXNzOmhvdmVyPnRkLC50YWJsZS1ob3Zlcj50Ym9keT50ci5zdWNjZXNzOmhvdmVyPnRoLC50YWJsZS1ob3Zlcj50Ym9keT50cjpob3Zlcj4uc3VjY2VzcywudGFibGUtaG92ZXI+dGJvZHk+dHI+dGQuc3VjY2Vzczpob3ZlciwudGFibGUtaG92ZXI+dGJvZHk+dHI+dGguc3VjY2Vzczpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNkMGU5YzZ9LnRhYmxlPnRib2R5PnRyLmluZm8+dGQsLnRhYmxlPnRib2R5PnRyLmluZm8+dGgsLnRhYmxlPnRib2R5PnRyPnRkLmluZm8sLnRhYmxlPnRib2R5PnRyPnRoLmluZm8sLnRhYmxlPnRmb290PnRyLmluZm8+dGQsLnRhYmxlPnRmb290PnRyLmluZm8+dGgsLnRhYmxlPnRmb290PnRyPnRkLmluZm8sLnRhYmxlPnRmb290PnRyPnRoLmluZm8sLnRhYmxlPnRoZWFkPnRyLmluZm8+dGQsLnRhYmxlPnRoZWFkPnRyLmluZm8+dGgsLnRhYmxlPnRoZWFkPnRyPnRkLmluZm8sLnRhYmxlPnRoZWFkPnRyPnRoLmluZm97YmFja2dyb3VuZC1jb2xvcjojZDllZGY3fS50YWJsZS1ob3Zlcj50Ym9keT50ci5pbmZvOmhvdmVyPnRkLC50YWJsZS1ob3Zlcj50Ym9keT50ci5pbmZvOmhvdmVyPnRoLC50YWJsZS1ob3Zlcj50Ym9keT50cjpob3Zlcj4uaW5mbywudGFibGUtaG92ZXI+dGJvZHk+dHI+dGQuaW5mbzpob3ZlciwudGFibGUtaG92ZXI+dGJvZHk+dHI+dGguaW5mbzpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjNGUzZjN9LnRhYmxlPnRib2R5PnRyLndhcm5pbmc+dGQsLnRhYmxlPnRib2R5PnRyLndhcm5pbmc+dGgsLnRhYmxlPnRib2R5PnRyPnRkLndhcm5pbmcsLnRhYmxlPnRib2R5PnRyPnRoLndhcm5pbmcsLnRhYmxlPnRmb290PnRyLndhcm5pbmc+dGQsLnRhYmxlPnRmb290PnRyLndhcm5pbmc+dGgsLnRhYmxlPnRmb290PnRyPnRkLndhcm5pbmcsLnRhYmxlPnRmb290PnRyPnRoLndhcm5pbmcsLnRhYmxlPnRoZWFkPnRyLndhcm5pbmc+dGQsLnRhYmxlPnRoZWFkPnRyLndhcm5pbmc+dGgsLnRhYmxlPnRoZWFkPnRyPnRkLndhcm5pbmcsLnRhYmxlPnRoZWFkPnRyPnRoLndhcm5pbmd7YmFja2dyb3VuZC1jb2xvcjojZmNmOGUzfS50YWJsZS1ob3Zlcj50Ym9keT50ci53YXJuaW5nOmhvdmVyPnRkLC50YWJsZS1ob3Zlcj50Ym9keT50ci53YXJuaW5nOmhvdmVyPnRoLC50YWJsZS1ob3Zlcj50Ym9keT50cjpob3Zlcj4ud2FybmluZywudGFibGUtaG92ZXI+dGJvZHk+dHI+dGQud2FybmluZzpob3ZlciwudGFibGUtaG92ZXI+dGJvZHk+dHI+dGgud2FybmluZzpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmYWYyY2N9LnRhYmxlPnRib2R5PnRyLmRhbmdlcj50ZCwudGFibGU+dGJvZHk+dHIuZGFuZ2VyPnRoLC50YWJsZT50Ym9keT50cj50ZC5kYW5nZXIsLnRhYmxlPnRib2R5PnRyPnRoLmRhbmdlciwudGFibGU+dGZvb3Q+dHIuZGFuZ2VyPnRkLC50YWJsZT50Zm9vdD50ci5kYW5nZXI+dGgsLnRhYmxlPnRmb290PnRyPnRkLmRhbmdlciwudGFibGU+dGZvb3Q+dHI+dGguZGFuZ2VyLC50YWJsZT50aGVhZD50ci5kYW5nZXI+dGQsLnRhYmxlPnRoZWFkPnRyLmRhbmdlcj50aCwudGFibGU+dGhlYWQ+dHI+dGQuZGFuZ2VyLC50YWJsZT50aGVhZD50cj50aC5kYW5nZXJ7YmFja2dyb3VuZC1jb2xvcjojZjJkZWRlfS50YWJsZS1ob3Zlcj50Ym9keT50ci5kYW5nZXI6aG92ZXI+dGQsLnRhYmxlLWhvdmVyPnRib2R5PnRyLmRhbmdlcjpob3Zlcj50aCwudGFibGUtaG92ZXI+dGJvZHk+dHI6aG92ZXI+LmRhbmdlciwudGFibGUtaG92ZXI+dGJvZHk+dHI+dGQuZGFuZ2VyOmhvdmVyLC50YWJsZS1ob3Zlcj50Ym9keT50cj50aC5kYW5nZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZWJjY2NjfS50YWJsZS1yZXNwb25zaXZle21pbi1oZWlnaHQ6LjAxJTtvdmVyZmxvdy14OmF1dG99QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnRhYmxlLXJlc3BvbnNpdmV7d2lkdGg6MTAwJTttYXJnaW4tYm90dG9tOjE1cHg7b3ZlcmZsb3cteTpoaWRkZW47LW1zLW92ZXJmbG93LXN0eWxlOi1tcy1hdXRvaGlkaW5nLXNjcm9sbGJhcjtib3JkZXI6MXB4IHNvbGlkICNkZGR9LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxle21hcmdpbi1ib3R0b206MH0udGFibGUtcmVzcG9uc2l2ZT4udGFibGU+dGJvZHk+dHI+dGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlPnRib2R5PnRyPnRoLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZT50Zm9vdD50cj50ZCwudGFibGUtcmVzcG9uc2l2ZT4udGFibGU+dGZvb3Q+dHI+dGgsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlPnRoZWFkPnRyPnRkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZT50aGVhZD50cj50aHt3aGl0ZS1zcGFjZTpub3dyYXB9LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVke2JvcmRlcjowfS50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50ZDpmaXJzdC1jaGlsZCwudGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGg6Zmlyc3QtY2hpbGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRkOmZpcnN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50aDpmaXJzdC1jaGlsZCwudGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI+dGQ6Zmlyc3QtY2hpbGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRoOmZpcnN0LWNoaWxke2JvcmRlci1sZWZ0OjB9LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRkOmxhc3QtY2hpbGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRoOmxhc3QtY2hpbGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRkOmxhc3QtY2hpbGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRoOmxhc3QtY2hpbGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRkOmxhc3QtY2hpbGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRoOmxhc3QtY2hpbGR7Ym9yZGVyLXJpZ2h0OjB9LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyOmxhc3QtY2hpbGQ+dGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyOmxhc3QtY2hpbGQ+dGgsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyOmxhc3QtY2hpbGQ+dGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyOmxhc3QtY2hpbGQ+dGh7Ym9yZGVyLWJvdHRvbTowfX1maWVsZHNldHttaW4td2lkdGg6MDtwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjB9bGVnZW5ke2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtwYWRkaW5nOjA7bWFyZ2luLWJvdHRvbToyMHB4O2ZvbnQtc2l6ZToyMXB4O2xpbmUtaGVpZ2h0OmluaGVyaXQ7Y29sb3I6IzMzMztib3JkZXI6MDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTVlNWU1fWxhYmVse2Rpc3BsYXk6aW5saW5lLWJsb2NrO21heC13aWR0aDoxMDAlO21hcmdpbi1ib3R0b206NXB4O2ZvbnQtd2VpZ2h0OjcwMH1pbnB1dFt0eXBlPXNlYXJjaF17LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fWlucHV0W3R5cGU9Y2hlY2tib3hdLGlucHV0W3R5cGU9cmFkaW9de21hcmdpbjo0cHggMCAwO21hcmdpbi10b3A6MXB4XDk7bGluZS1oZWlnaHQ6bm9ybWFsfWlucHV0W3R5cGU9ZmlsZV17ZGlzcGxheTpibG9ja31pbnB1dFt0eXBlPXJhbmdlXXtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9c2VsZWN0W211bHRpcGxlXSxzZWxlY3Rbc2l6ZV17aGVpZ2h0OmF1dG99aW5wdXRbdHlwZT1maWxlXTpmb2N1cyxpbnB1dFt0eXBlPWNoZWNrYm94XTpmb2N1cyxpbnB1dFt0eXBlPXJhZGlvXTpmb2N1c3tvdXRsaW5lOnRoaW4gZG90dGVkO291dGxpbmU6NXB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yO291dGxpbmUtb2Zmc2V0Oi0ycHh9b3V0cHV0e2Rpc3BsYXk6YmxvY2s7cGFkZGluZy10b3A6N3B4O2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7Y29sb3I6IzU1NX0uZm9ybS1jb250cm9se2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtoZWlnaHQ6MzRweDtwYWRkaW5nOjZweCAxMnB4O2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7Y29sb3I6IzU1NTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7YmFja2dyb3VuZC1pbWFnZTpub25lO2JvcmRlcjoxcHggc29saWQgI2NjYztib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KTstd2Via2l0LXRyYW5zaXRpb246Ym9yZGVyLWNvbG9yIGVhc2UtaW4tb3V0IC4xNXMsLXdlYmtpdC1ib3gtc2hhZG93IGVhc2UtaW4tb3V0IC4xNXM7LW8tdHJhbnNpdGlvbjpib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cyxib3gtc2hhZG93IGVhc2UtaW4tb3V0IC4xNXM7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cyxib3gtc2hhZG93IGVhc2UtaW4tb3V0IC4xNXN9LmZvcm0tY29udHJvbDpmb2N1c3tib3JkZXItY29sb3I6IzY2YWZlOTtvdXRsaW5lOjA7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpfS5mb3JtLWNvbnRyb2w6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6Izk5OTtvcGFjaXR5OjF9LmZvcm0tY29udHJvbDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6Izk5OX0uZm9ybS1jb250cm9sOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiM5OTl9LmZvcm0tY29udHJvbFtkaXNhYmxlZF0sLmZvcm0tY29udHJvbFtyZWFkb25seV0sZmllbGRzZXRbZGlzYWJsZWRdIC5mb3JtLWNvbnRyb2x7YmFja2dyb3VuZC1jb2xvcjojZWVlO29wYWNpdHk6MX0uZm9ybS1jb250cm9sW2Rpc2FibGVkXSxmaWVsZHNldFtkaXNhYmxlZF0gLmZvcm0tY29udHJvbHtjdXJzb3I6bm90LWFsbG93ZWR9dGV4dGFyZWEuZm9ybS1jb250cm9se2hlaWdodDphdXRvfWlucHV0W3R5cGU9c2VhcmNoXXstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX1AbWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjApe2lucHV0W3R5cGU9ZGF0ZV0uZm9ybS1jb250cm9sLGlucHV0W3R5cGU9dGltZV0uZm9ybS1jb250cm9sLGlucHV0W3R5cGU9ZGF0ZXRpbWUtbG9jYWxdLmZvcm0tY29udHJvbCxpbnB1dFt0eXBlPW1vbnRoXS5mb3JtLWNvbnRyb2x7bGluZS1oZWlnaHQ6MzRweH0uaW5wdXQtZ3JvdXAtc20gaW5wdXRbdHlwZT1kYXRlXSwuaW5wdXQtZ3JvdXAtc20gaW5wdXRbdHlwZT10aW1lXSwuaW5wdXQtZ3JvdXAtc20gaW5wdXRbdHlwZT1kYXRldGltZS1sb2NhbF0sLmlucHV0LWdyb3VwLXNtIGlucHV0W3R5cGU9bW9udGhdLGlucHV0W3R5cGU9ZGF0ZV0uaW5wdXQtc20saW5wdXRbdHlwZT10aW1lXS5pbnB1dC1zbSxpbnB1dFt0eXBlPWRhdGV0aW1lLWxvY2FsXS5pbnB1dC1zbSxpbnB1dFt0eXBlPW1vbnRoXS5pbnB1dC1zbXtsaW5lLWhlaWdodDozMHB4fS5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPWRhdGVdLC5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPXRpbWVdLC5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPWRhdGV0aW1lLWxvY2FsXSwuaW5wdXQtZ3JvdXAtbGcgaW5wdXRbdHlwZT1tb250aF0saW5wdXRbdHlwZT1kYXRlXS5pbnB1dC1sZyxpbnB1dFt0eXBlPXRpbWVdLmlucHV0LWxnLGlucHV0W3R5cGU9ZGF0ZXRpbWUtbG9jYWxdLmlucHV0LWxnLGlucHV0W3R5cGU9bW9udGhdLmlucHV0LWxne2xpbmUtaGVpZ2h0OjQ2cHh9fS5mb3JtLWdyb3Vwe21hcmdpbi1ib3R0b206MTVweH0uY2hlY2tib3gsLnJhZGlve3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxMHB4O21hcmdpbi1ib3R0b206MTBweH0uY2hlY2tib3ggbGFiZWwsLnJhZGlvIGxhYmVse21pbi1oZWlnaHQ6MjBweDtwYWRkaW5nLWxlZnQ6MjBweDttYXJnaW4tYm90dG9tOjA7Zm9udC13ZWlnaHQ6NDAwO2N1cnNvcjpwb2ludGVyfS5jaGVja2JveCBpbnB1dFt0eXBlPWNoZWNrYm94XSwuY2hlY2tib3gtaW5saW5lIGlucHV0W3R5cGU9Y2hlY2tib3hdLC5yYWRpbyBpbnB1dFt0eXBlPXJhZGlvXSwucmFkaW8taW5saW5lIGlucHV0W3R5cGU9cmFkaW9de3Bvc2l0aW9uOmFic29sdXRlO21hcmdpbi10b3A6NHB4XDk7bWFyZ2luLWxlZnQ6LTIwcHh9LmNoZWNrYm94Ky5jaGVja2JveCwucmFkaW8rLnJhZGlve21hcmdpbi10b3A6LTVweH0uY2hlY2tib3gtaW5saW5lLC5yYWRpby1pbmxpbmV7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZy1sZWZ0OjIwcHg7bWFyZ2luLWJvdHRvbTowO2ZvbnQtd2VpZ2h0OjQwMDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Y3Vyc29yOnBvaW50ZXJ9LmNoZWNrYm94LWlubGluZSsuY2hlY2tib3gtaW5saW5lLC5yYWRpby1pbmxpbmUrLnJhZGlvLWlubGluZXttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MTBweH1maWVsZHNldFtkaXNhYmxlZF0gaW5wdXRbdHlwZT1jaGVja2JveF0sZmllbGRzZXRbZGlzYWJsZWRdIGlucHV0W3R5cGU9cmFkaW9dLGlucHV0W3R5cGU9Y2hlY2tib3hdLmRpc2FibGVkLGlucHV0W3R5cGU9Y2hlY2tib3hdW2Rpc2FibGVkXSxpbnB1dFt0eXBlPXJhZGlvXS5kaXNhYmxlZCxpbnB1dFt0eXBlPXJhZGlvXVtkaXNhYmxlZF17Y3Vyc29yOm5vdC1hbGxvd2VkfS5jaGVja2JveC1pbmxpbmUuZGlzYWJsZWQsLnJhZGlvLWlubGluZS5kaXNhYmxlZCxmaWVsZHNldFtkaXNhYmxlZF0gLmNoZWNrYm94LWlubGluZSxmaWVsZHNldFtkaXNhYmxlZF0gLnJhZGlvLWlubGluZXtjdXJzb3I6bm90LWFsbG93ZWR9LmNoZWNrYm94LmRpc2FibGVkIGxhYmVsLC5yYWRpby5kaXNhYmxlZCBsYWJlbCxmaWVsZHNldFtkaXNhYmxlZF0gLmNoZWNrYm94IGxhYmVsLGZpZWxkc2V0W2Rpc2FibGVkXSAucmFkaW8gbGFiZWx7Y3Vyc29yOm5vdC1hbGxvd2VkfS5mb3JtLWNvbnRyb2wtc3RhdGlje21pbi1oZWlnaHQ6MzRweDtwYWRkaW5nLXRvcDo3cHg7cGFkZGluZy1ib3R0b206N3B4O21hcmdpbi1ib3R0b206MH0uZm9ybS1jb250cm9sLXN0YXRpYy5pbnB1dC1sZywuZm9ybS1jb250cm9sLXN0YXRpYy5pbnB1dC1zbXtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjB9LmlucHV0LXNte2hlaWdodDozMHB4O3BhZGRpbmc6NXB4IDEwcHg7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MS41O2JvcmRlci1yYWRpdXM6M3B4fXNlbGVjdC5pbnB1dC1zbXtoZWlnaHQ6MzBweDtsaW5lLWhlaWdodDozMHB4fXNlbGVjdFttdWx0aXBsZV0uaW5wdXQtc20sdGV4dGFyZWEuaW5wdXQtc217aGVpZ2h0OmF1dG99LmZvcm0tZ3JvdXAtc20gLmZvcm0tY29udHJvbHtoZWlnaHQ6MzBweDtwYWRkaW5nOjVweCAxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNTtib3JkZXItcmFkaXVzOjNweH0uZm9ybS1ncm91cC1zbSBzZWxlY3QuZm9ybS1jb250cm9se2hlaWdodDozMHB4O2xpbmUtaGVpZ2h0OjMwcHh9LmZvcm0tZ3JvdXAtc20gc2VsZWN0W211bHRpcGxlXS5mb3JtLWNvbnRyb2wsLmZvcm0tZ3JvdXAtc20gdGV4dGFyZWEuZm9ybS1jb250cm9se2hlaWdodDphdXRvfS5mb3JtLWdyb3VwLXNtIC5mb3JtLWNvbnRyb2wtc3RhdGlje2hlaWdodDozMHB4O21pbi1oZWlnaHQ6MzJweDtwYWRkaW5nOjZweCAxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNX0uaW5wdXQtbGd7aGVpZ2h0OjQ2cHg7cGFkZGluZzoxMHB4IDE2cHg7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MS4zMzMzMzMzO2JvcmRlci1yYWRpdXM6NnB4fXNlbGVjdC5pbnB1dC1sZ3toZWlnaHQ6NDZweDtsaW5lLWhlaWdodDo0NnB4fXNlbGVjdFttdWx0aXBsZV0uaW5wdXQtbGcsdGV4dGFyZWEuaW5wdXQtbGd7aGVpZ2h0OmF1dG99LmZvcm0tZ3JvdXAtbGcgLmZvcm0tY29udHJvbHtoZWlnaHQ6NDZweDtwYWRkaW5nOjEwcHggMTZweDtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoxLjMzMzMzMzM7Ym9yZGVyLXJhZGl1czo2cHh9LmZvcm0tZ3JvdXAtbGcgc2VsZWN0LmZvcm0tY29udHJvbHtoZWlnaHQ6NDZweDtsaW5lLWhlaWdodDo0NnB4fS5mb3JtLWdyb3VwLWxnIHNlbGVjdFttdWx0aXBsZV0uZm9ybS1jb250cm9sLC5mb3JtLWdyb3VwLWxnIHRleHRhcmVhLmZvcm0tY29udHJvbHtoZWlnaHQ6YXV0b30uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sLXN0YXRpY3toZWlnaHQ6NDZweDttaW4taGVpZ2h0OjM4cHg7cGFkZGluZzoxMXB4IDE2cHg7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MS4zMzMzMzMzfS5oYXMtZmVlZGJhY2t7cG9zaXRpb246cmVsYXRpdmV9Lmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9se3BhZGRpbmctcmlnaHQ6NDIuNXB4fS5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDt6LWluZGV4OjI7ZGlzcGxheTpibG9jazt3aWR0aDozNHB4O2hlaWdodDozNHB4O2xpbmUtaGVpZ2h0OjM0cHg7dGV4dC1hbGlnbjpjZW50ZXI7cG9pbnRlci1ldmVudHM6bm9uZX0uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sKy5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssLmlucHV0LWdyb3VwLWxnKy5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssLmlucHV0LWxnKy5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7d2lkdGg6NDZweDtoZWlnaHQ6NDZweDtsaW5lLWhlaWdodDo0NnB4fS5mb3JtLWdyb3VwLXNtIC5mb3JtLWNvbnRyb2wrLmZvcm0tY29udHJvbC1mZWVkYmFjaywuaW5wdXQtZ3JvdXAtc20rLmZvcm0tY29udHJvbC1mZWVkYmFjaywuaW5wdXQtc20rLmZvcm0tY29udHJvbC1mZWVkYmFja3t3aWR0aDozMHB4O2hlaWdodDozMHB4O2xpbmUtaGVpZ2h0OjMwcHh9Lmhhcy1zdWNjZXNzIC5jaGVja2JveCwuaGFzLXN1Y2Nlc3MgLmNoZWNrYm94LWlubGluZSwuaGFzLXN1Y2Nlc3MgLmNvbnRyb2wtbGFiZWwsLmhhcy1zdWNjZXNzIC5oZWxwLWJsb2NrLC5oYXMtc3VjY2VzcyAucmFkaW8sLmhhcy1zdWNjZXNzIC5yYWRpby1pbmxpbmUsLmhhcy1zdWNjZXNzLmNoZWNrYm94IGxhYmVsLC5oYXMtc3VjY2Vzcy5jaGVja2JveC1pbmxpbmUgbGFiZWwsLmhhcy1zdWNjZXNzLnJhZGlvIGxhYmVsLC5oYXMtc3VjY2Vzcy5yYWRpby1pbmxpbmUgbGFiZWx7Y29sb3I6IzNjNzYzZH0uaGFzLXN1Y2Nlc3MgLmZvcm0tY29udHJvbHtib3JkZXItY29sb3I6IzNjNzYzZDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KX0uaGFzLXN1Y2Nlc3MgLmZvcm0tY29udHJvbDpmb2N1c3tib3JkZXItY29sb3I6IzJiNTQyYzstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDZweCAjNjdiMTY4O2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDZweCAjNjdiMTY4fS5oYXMtc3VjY2VzcyAuaW5wdXQtZ3JvdXAtYWRkb257Y29sb3I6IzNjNzYzZDtiYWNrZ3JvdW5kLWNvbG9yOiNkZmYwZDg7Ym9yZGVyLWNvbG9yOiMzYzc2M2R9Lmhhcy1zdWNjZXNzIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7Y29sb3I6IzNjNzYzZH0uaGFzLXdhcm5pbmcgLmNoZWNrYm94LC5oYXMtd2FybmluZyAuY2hlY2tib3gtaW5saW5lLC5oYXMtd2FybmluZyAuY29udHJvbC1sYWJlbCwuaGFzLXdhcm5pbmcgLmhlbHAtYmxvY2ssLmhhcy13YXJuaW5nIC5yYWRpbywuaGFzLXdhcm5pbmcgLnJhZGlvLWlubGluZSwuaGFzLXdhcm5pbmcuY2hlY2tib3ggbGFiZWwsLmhhcy13YXJuaW5nLmNoZWNrYm94LWlubGluZSBsYWJlbCwuaGFzLXdhcm5pbmcucmFkaW8gbGFiZWwsLmhhcy13YXJuaW5nLnJhZGlvLWlubGluZSBsYWJlbHtjb2xvcjojOGE2ZDNifS5oYXMtd2FybmluZyAuZm9ybS1jb250cm9se2JvcmRlci1jb2xvcjojOGE2ZDNiOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpfS5oYXMtd2FybmluZyAuZm9ybS1jb250cm9sOmZvY3Vze2JvcmRlci1jb2xvcjojNjY1MTJjOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgNnB4ICNjMGExNmI7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgNnB4ICNjMGExNmJ9Lmhhcy13YXJuaW5nIC5pbnB1dC1ncm91cC1hZGRvbntjb2xvcjojOGE2ZDNiO2JhY2tncm91bmQtY29sb3I6I2ZjZjhlMztib3JkZXItY29sb3I6IzhhNmQzYn0uaGFzLXdhcm5pbmcgLmZvcm0tY29udHJvbC1mZWVkYmFja3tjb2xvcjojOGE2ZDNifS5oYXMtZXJyb3IgLmNoZWNrYm94LC5oYXMtZXJyb3IgLmNoZWNrYm94LWlubGluZSwuaGFzLWVycm9yIC5jb250cm9sLWxhYmVsLC5oYXMtZXJyb3IgLmhlbHAtYmxvY2ssLmhhcy1lcnJvciAucmFkaW8sLmhhcy1lcnJvciAucmFkaW8taW5saW5lLC5oYXMtZXJyb3IuY2hlY2tib3ggbGFiZWwsLmhhcy1lcnJvci5jaGVja2JveC1pbmxpbmUgbGFiZWwsLmhhcy1lcnJvci5yYWRpbyBsYWJlbCwuaGFzLWVycm9yLnJhZGlvLWlubGluZSBsYWJlbHtjb2xvcjojYTk0NDQyfS5oYXMtZXJyb3IgLmZvcm0tY29udHJvbHtib3JkZXItY29sb3I6I2E5NDQ0Mjstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KX0uaGFzLWVycm9yIC5mb3JtLWNvbnRyb2w6Zm9jdXN7Ym9yZGVyLWNvbG9yOiM4NDM1MzQ7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA2cHggI2NlODQ4Mztib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA2cHggI2NlODQ4M30uaGFzLWVycm9yIC5pbnB1dC1ncm91cC1hZGRvbntjb2xvcjojYTk0NDQyO2JhY2tncm91bmQtY29sb3I6I2YyZGVkZTtib3JkZXItY29sb3I6I2E5NDQ0Mn0uaGFzLWVycm9yIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7Y29sb3I6I2E5NDQ0Mn0uaGFzLWZlZWRiYWNrIGxhYmVsfi5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7dG9wOjI1cHh9Lmhhcy1mZWVkYmFjayBsYWJlbC5zci1vbmx5fi5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7dG9wOjB9LmhlbHAtYmxvY2t7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjVweDttYXJnaW4tYm90dG9tOjEwcHg7Y29sb3I6IzczNzM3M31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmZvcm0taW5saW5lIC5mb3JtLWdyb3Vwe2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZvcm0taW5saW5lIC5mb3JtLWNvbnRyb2x7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6YXV0bzt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZvcm0taW5saW5lIC5mb3JtLWNvbnRyb2wtc3RhdGlje2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5mb3JtLWlubGluZSAuaW5wdXQtZ3JvdXB7ZGlzcGxheTppbmxpbmUtdGFibGU7dmVydGljYWwtYWxpZ246bWlkZGxlfS5mb3JtLWlubGluZSAuaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbCwuZm9ybS1pbmxpbmUgLmlucHV0LWdyb3VwIC5pbnB1dC1ncm91cC1hZGRvbiwuZm9ybS1pbmxpbmUgLmlucHV0LWdyb3VwIC5pbnB1dC1ncm91cC1idG57d2lkdGg6YXV0b30uZm9ybS1pbmxpbmUgLmlucHV0LWdyb3VwPi5mb3JtLWNvbnRyb2x7d2lkdGg6MTAwJX0uZm9ybS1pbmxpbmUgLmNvbnRyb2wtbGFiZWx7bWFyZ2luLWJvdHRvbTowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZm9ybS1pbmxpbmUgLmNoZWNrYm94LC5mb3JtLWlubGluZSAucmFkaW97ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZvcm0taW5saW5lIC5jaGVja2JveCBsYWJlbCwuZm9ybS1pbmxpbmUgLnJhZGlvIGxhYmVse3BhZGRpbmctbGVmdDowfS5mb3JtLWlubGluZSAuY2hlY2tib3ggaW5wdXRbdHlwZT1jaGVja2JveF0sLmZvcm0taW5saW5lIC5yYWRpbyBpbnB1dFt0eXBlPXJhZGlvXXtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tbGVmdDowfS5mb3JtLWlubGluZSAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7dG9wOjB9fS5mb3JtLWhvcml6b250YWwgLmNoZWNrYm94LC5mb3JtLWhvcml6b250YWwgLmNoZWNrYm94LWlubGluZSwuZm9ybS1ob3Jpem9udGFsIC5yYWRpbywuZm9ybS1ob3Jpem9udGFsIC5yYWRpby1pbmxpbmV7cGFkZGluZy10b3A6N3B4O21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9LmZvcm0taG9yaXpvbnRhbCAuY2hlY2tib3gsLmZvcm0taG9yaXpvbnRhbCAucmFkaW97bWluLWhlaWdodDoyN3B4fS5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXB7bWFyZ2luLXJpZ2h0Oi0xNXB4O21hcmdpbi1sZWZ0Oi0xNXB4fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuZm9ybS1ob3Jpem9udGFsIC5jb250cm9sLWxhYmVse3BhZGRpbmctdG9wOjdweDttYXJnaW4tYm90dG9tOjA7dGV4dC1hbGlnbjpyaWdodH19LmZvcm0taG9yaXpvbnRhbCAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7cmlnaHQ6MTVweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cC1sZyAuY29udHJvbC1sYWJlbHtwYWRkaW5nLXRvcDoxNC4zM3B4O2ZvbnQtc2l6ZToxOHB4fX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cC1zbSAuY29udHJvbC1sYWJlbHtwYWRkaW5nLXRvcDo2cHg7Zm9udC1zaXplOjEycHh9fS5idG57ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzo2cHggMTJweDttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7dGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTstbXMtdG91Y2gtYWN0aW9uOm1hbmlwdWxhdGlvbjt0b3VjaC1hY3Rpb246bWFuaXB1bGF0aW9uO2N1cnNvcjpwb2ludGVyOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjRweH0uYnRuLmFjdGl2ZS5mb2N1cywuYnRuLmFjdGl2ZTpmb2N1cywuYnRuLmZvY3VzLC5idG46YWN0aXZlLmZvY3VzLC5idG46YWN0aXZlOmZvY3VzLC5idG46Zm9jdXN7b3V0bGluZTp0aGluIGRvdHRlZDtvdXRsaW5lOjVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtvdXRsaW5lLW9mZnNldDotMnB4fS5idG4uZm9jdXMsLmJ0bjpmb2N1cywuYnRuOmhvdmVye2NvbG9yOiMzMzM7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmJ0bi5hY3RpdmUsLmJ0bjphY3RpdmV7YmFja2dyb3VuZC1pbWFnZTpub25lO291dGxpbmU6MDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAzcHggNXB4IHJnYmEoMCwwLDAsLjEyNSk7Ym94LXNoYWRvdzppbnNldCAwIDNweCA1cHggcmdiYSgwLDAsMCwuMTI1KX0uYnRuLmRpc2FibGVkLC5idG5bZGlzYWJsZWRdLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRue2N1cnNvcjpub3QtYWxsb3dlZDtmaWx0ZXI6YWxwaGEob3BhY2l0eT02NSk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO29wYWNpdHk6LjY1fWEuYnRuLmRpc2FibGVkLGZpZWxkc2V0W2Rpc2FibGVkXSBhLmJ0bntwb2ludGVyLWV2ZW50czpub25lfS5idG4tZGVmYXVsdHtjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItY29sb3I6I2NjY30uYnRuLWRlZmF1bHQuZm9jdXMsLmJ0bi1kZWZhdWx0OmZvY3Vze2NvbG9yOiMzMzM7YmFja2dyb3VuZC1jb2xvcjojZTZlNmU2O2JvcmRlci1jb2xvcjojOGM4YzhjfS5idG4tZGVmYXVsdDpob3Zlcntjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2U2ZTZlNjtib3JkZXItY29sb3I6I2FkYWRhZH0uYnRuLWRlZmF1bHQuYWN0aXZlLC5idG4tZGVmYXVsdDphY3RpdmUsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tZGVmYXVsdHtjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2U2ZTZlNjtib3JkZXItY29sb3I6I2FkYWRhZH0uYnRuLWRlZmF1bHQuYWN0aXZlLmZvY3VzLC5idG4tZGVmYXVsdC5hY3RpdmU6Zm9jdXMsLmJ0bi1kZWZhdWx0LmFjdGl2ZTpob3ZlciwuYnRuLWRlZmF1bHQ6YWN0aXZlLmZvY3VzLC5idG4tZGVmYXVsdDphY3RpdmU6Zm9jdXMsLmJ0bi1kZWZhdWx0OmFjdGl2ZTpob3Zlciwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1kZWZhdWx0LmZvY3VzLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWRlZmF1bHQ6Zm9jdXMsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tZGVmYXVsdDpob3Zlcntjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2Q0ZDRkNDtib3JkZXItY29sb3I6IzhjOGM4Y30uYnRuLWRlZmF1bHQuYWN0aXZlLC5idG4tZGVmYXVsdDphY3RpdmUsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tZGVmYXVsdHtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmJ0bi1kZWZhdWx0LmRpc2FibGVkLC5idG4tZGVmYXVsdC5kaXNhYmxlZC5hY3RpdmUsLmJ0bi1kZWZhdWx0LmRpc2FibGVkLmZvY3VzLC5idG4tZGVmYXVsdC5kaXNhYmxlZDphY3RpdmUsLmJ0bi1kZWZhdWx0LmRpc2FibGVkOmZvY3VzLC5idG4tZGVmYXVsdC5kaXNhYmxlZDpob3ZlciwuYnRuLWRlZmF1bHRbZGlzYWJsZWRdLC5idG4tZGVmYXVsdFtkaXNhYmxlZF0uYWN0aXZlLC5idG4tZGVmYXVsdFtkaXNhYmxlZF0uZm9jdXMsLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXTphY3RpdmUsLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXTpmb2N1cywuYnRuLWRlZmF1bHRbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRlZmF1bHQsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGVmYXVsdC5hY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGVmYXVsdC5mb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kZWZhdWx0OmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kZWZhdWx0OmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRlZmF1bHQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1jb2xvcjojY2NjfS5idG4tZGVmYXVsdCAuYmFkZ2V7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzMzN9LmJ0bi1wcmltYXJ5e2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzM3YWI3O2JvcmRlci1jb2xvcjojMmU2ZGE0fS5idG4tcHJpbWFyeS5mb2N1cywuYnRuLXByaW1hcnk6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMyODYwOTA7Ym9yZGVyLWNvbG9yOiMxMjJiNDB9LmJ0bi1wcmltYXJ5OmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMjg2MDkwO2JvcmRlci1jb2xvcjojMjA0ZDc0fS5idG4tcHJpbWFyeS5hY3RpdmUsLmJ0bi1wcmltYXJ5OmFjdGl2ZSwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1wcmltYXJ5e2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMjg2MDkwO2JvcmRlci1jb2xvcjojMjA0ZDc0fS5idG4tcHJpbWFyeS5hY3RpdmUuZm9jdXMsLmJ0bi1wcmltYXJ5LmFjdGl2ZTpmb2N1cywuYnRuLXByaW1hcnkuYWN0aXZlOmhvdmVyLC5idG4tcHJpbWFyeTphY3RpdmUuZm9jdXMsLmJ0bi1wcmltYXJ5OmFjdGl2ZTpmb2N1cywuYnRuLXByaW1hcnk6YWN0aXZlOmhvdmVyLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLXByaW1hcnkuZm9jdXMsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tcHJpbWFyeTpmb2N1cywub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1wcmltYXJ5OmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMjA0ZDc0O2JvcmRlci1jb2xvcjojMTIyYjQwfS5idG4tcHJpbWFyeS5hY3RpdmUsLmJ0bi1wcmltYXJ5OmFjdGl2ZSwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1wcmltYXJ5e2JhY2tncm91bmQtaW1hZ2U6bm9uZX0uYnRuLXByaW1hcnkuZGlzYWJsZWQsLmJ0bi1wcmltYXJ5LmRpc2FibGVkLmFjdGl2ZSwuYnRuLXByaW1hcnkuZGlzYWJsZWQuZm9jdXMsLmJ0bi1wcmltYXJ5LmRpc2FibGVkOmFjdGl2ZSwuYnRuLXByaW1hcnkuZGlzYWJsZWQ6Zm9jdXMsLmJ0bi1wcmltYXJ5LmRpc2FibGVkOmhvdmVyLC5idG4tcHJpbWFyeVtkaXNhYmxlZF0sLmJ0bi1wcmltYXJ5W2Rpc2FibGVkXS5hY3RpdmUsLmJ0bi1wcmltYXJ5W2Rpc2FibGVkXS5mb2N1cywuYnRuLXByaW1hcnlbZGlzYWJsZWRdOmFjdGl2ZSwuYnRuLXByaW1hcnlbZGlzYWJsZWRdOmZvY3VzLC5idG4tcHJpbWFyeVtkaXNhYmxlZF06aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1wcmltYXJ5LmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1wcmltYXJ5LmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnk6YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnk6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMzMzdhYjc7Ym9yZGVyLWNvbG9yOiMyZTZkYTR9LmJ0bi1wcmltYXJ5IC5iYWRnZXtjb2xvcjojMzM3YWI3O2JhY2tncm91bmQtY29sb3I6I2ZmZn0uYnRuLXN1Y2Nlc3N7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM1Y2I4NWM7Ym9yZGVyLWNvbG9yOiM0Y2FlNGN9LmJ0bi1zdWNjZXNzLmZvY3VzLC5idG4tc3VjY2Vzczpmb2N1c3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzQ0OWQ0NDtib3JkZXItY29sb3I6IzI1NTYyNX0uYnRuLXN1Y2Nlc3M6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM0NDlkNDQ7Ym9yZGVyLWNvbG9yOiMzOTg0Mzl9LmJ0bi1zdWNjZXNzLmFjdGl2ZSwuYnRuLXN1Y2Nlc3M6YWN0aXZlLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLXN1Y2Nlc3N7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM0NDlkNDQ7Ym9yZGVyLWNvbG9yOiMzOTg0Mzl9LmJ0bi1zdWNjZXNzLmFjdGl2ZS5mb2N1cywuYnRuLXN1Y2Nlc3MuYWN0aXZlOmZvY3VzLC5idG4tc3VjY2Vzcy5hY3RpdmU6aG92ZXIsLmJ0bi1zdWNjZXNzOmFjdGl2ZS5mb2N1cywuYnRuLXN1Y2Nlc3M6YWN0aXZlOmZvY3VzLC5idG4tc3VjY2VzczphY3RpdmU6aG92ZXIsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tc3VjY2Vzcy5mb2N1cywub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1zdWNjZXNzOmZvY3VzLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLXN1Y2Nlc3M6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzOTg0Mzk7Ym9yZGVyLWNvbG9yOiMyNTU2MjV9LmJ0bi1zdWNjZXNzLmFjdGl2ZSwuYnRuLXN1Y2Nlc3M6YWN0aXZlLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLXN1Y2Nlc3N7YmFja2dyb3VuZC1pbWFnZTpub25lfS5idG4tc3VjY2Vzcy5kaXNhYmxlZCwuYnRuLXN1Y2Nlc3MuZGlzYWJsZWQuYWN0aXZlLC5idG4tc3VjY2Vzcy5kaXNhYmxlZC5mb2N1cywuYnRuLXN1Y2Nlc3MuZGlzYWJsZWQ6YWN0aXZlLC5idG4tc3VjY2Vzcy5kaXNhYmxlZDpmb2N1cywuYnRuLXN1Y2Nlc3MuZGlzYWJsZWQ6aG92ZXIsLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXSwuYnRuLXN1Y2Nlc3NbZGlzYWJsZWRdLmFjdGl2ZSwuYnRuLXN1Y2Nlc3NbZGlzYWJsZWRdLmZvY3VzLC5idG4tc3VjY2Vzc1tkaXNhYmxlZF06YWN0aXZlLC5idG4tc3VjY2Vzc1tkaXNhYmxlZF06Zm9jdXMsLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXTpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXN1Y2Nlc3MuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXN1Y2Nlc3MuZm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2VzczphY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2Vzczpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzVjYjg1Yztib3JkZXItY29sb3I6IzRjYWU0Y30uYnRuLXN1Y2Nlc3MgLmJhZGdle2NvbG9yOiM1Y2I4NWM7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5idG4taW5mb3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzViYzBkZTtib3JkZXItY29sb3I6IzQ2YjhkYX0uYnRuLWluZm8uZm9jdXMsLmJ0bi1pbmZvOmZvY3Vze2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzFiMGQ1O2JvcmRlci1jb2xvcjojMWI2ZDg1fS5idG4taW5mbzpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzMxYjBkNTtib3JkZXItY29sb3I6IzI2OWFiY30uYnRuLWluZm8uYWN0aXZlLC5idG4taW5mbzphY3RpdmUsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4taW5mb3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzMxYjBkNTtib3JkZXItY29sb3I6IzI2OWFiY30uYnRuLWluZm8uYWN0aXZlLmZvY3VzLC5idG4taW5mby5hY3RpdmU6Zm9jdXMsLmJ0bi1pbmZvLmFjdGl2ZTpob3ZlciwuYnRuLWluZm86YWN0aXZlLmZvY3VzLC5idG4taW5mbzphY3RpdmU6Zm9jdXMsLmJ0bi1pbmZvOmFjdGl2ZTpob3Zlciwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1pbmZvLmZvY3VzLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWluZm86Zm9jdXMsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4taW5mbzpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzI2OWFiYztib3JkZXItY29sb3I6IzFiNmQ4NX0uYnRuLWluZm8uYWN0aXZlLC5idG4taW5mbzphY3RpdmUsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4taW5mb3tiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmJ0bi1pbmZvLmRpc2FibGVkLC5idG4taW5mby5kaXNhYmxlZC5hY3RpdmUsLmJ0bi1pbmZvLmRpc2FibGVkLmZvY3VzLC5idG4taW5mby5kaXNhYmxlZDphY3RpdmUsLmJ0bi1pbmZvLmRpc2FibGVkOmZvY3VzLC5idG4taW5mby5kaXNhYmxlZDpob3ZlciwuYnRuLWluZm9bZGlzYWJsZWRdLC5idG4taW5mb1tkaXNhYmxlZF0uYWN0aXZlLC5idG4taW5mb1tkaXNhYmxlZF0uZm9jdXMsLmJ0bi1pbmZvW2Rpc2FibGVkXTphY3RpdmUsLmJ0bi1pbmZvW2Rpc2FibGVkXTpmb2N1cywuYnRuLWluZm9bZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm8sZmllbGRzZXRbZGlzYWJsZWRdIC5idG4taW5mby5hY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4taW5mby5mb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvOmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm86aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNWJjMGRlO2JvcmRlci1jb2xvcjojNDZiOGRhfS5idG4taW5mbyAuYmFkZ2V7Y29sb3I6IzViYzBkZTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmJ0bi13YXJuaW5ne2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojZjBhZDRlO2JvcmRlci1jb2xvcjojZWVhMjM2fS5idG4td2FybmluZy5mb2N1cywuYnRuLXdhcm5pbmc6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNlYzk3MWY7Ym9yZGVyLWNvbG9yOiM5ODVmMGR9LmJ0bi13YXJuaW5nOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojZWM5NzFmO2JvcmRlci1jb2xvcjojZDU4NTEyfS5idG4td2FybmluZy5hY3RpdmUsLmJ0bi13YXJuaW5nOmFjdGl2ZSwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi13YXJuaW5ne2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojZWM5NzFmO2JvcmRlci1jb2xvcjojZDU4NTEyfS5idG4td2FybmluZy5hY3RpdmUuZm9jdXMsLmJ0bi13YXJuaW5nLmFjdGl2ZTpmb2N1cywuYnRuLXdhcm5pbmcuYWN0aXZlOmhvdmVyLC5idG4td2FybmluZzphY3RpdmUuZm9jdXMsLmJ0bi13YXJuaW5nOmFjdGl2ZTpmb2N1cywuYnRuLXdhcm5pbmc6YWN0aXZlOmhvdmVyLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLXdhcm5pbmcuZm9jdXMsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4td2FybmluZzpmb2N1cywub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi13YXJuaW5nOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojZDU4NTEyO2JvcmRlci1jb2xvcjojOTg1ZjBkfS5idG4td2FybmluZy5hY3RpdmUsLmJ0bi13YXJuaW5nOmFjdGl2ZSwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi13YXJuaW5ne2JhY2tncm91bmQtaW1hZ2U6bm9uZX0uYnRuLXdhcm5pbmcuZGlzYWJsZWQsLmJ0bi13YXJuaW5nLmRpc2FibGVkLmFjdGl2ZSwuYnRuLXdhcm5pbmcuZGlzYWJsZWQuZm9jdXMsLmJ0bi13YXJuaW5nLmRpc2FibGVkOmFjdGl2ZSwuYnRuLXdhcm5pbmcuZGlzYWJsZWQ6Zm9jdXMsLmJ0bi13YXJuaW5nLmRpc2FibGVkOmhvdmVyLC5idG4td2FybmluZ1tkaXNhYmxlZF0sLmJ0bi13YXJuaW5nW2Rpc2FibGVkXS5hY3RpdmUsLmJ0bi13YXJuaW5nW2Rpc2FibGVkXS5mb2N1cywuYnRuLXdhcm5pbmdbZGlzYWJsZWRdOmFjdGl2ZSwuYnRuLXdhcm5pbmdbZGlzYWJsZWRdOmZvY3VzLC5idG4td2FybmluZ1tkaXNhYmxlZF06aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi13YXJuaW5nLmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi13YXJuaW5nLmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmc6YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmc6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZzpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmMGFkNGU7Ym9yZGVyLWNvbG9yOiNlZWEyMzZ9LmJ0bi13YXJuaW5nIC5iYWRnZXtjb2xvcjojZjBhZDRlO2JhY2tncm91bmQtY29sb3I6I2ZmZn0uYnRuLWRhbmdlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2Q5NTM0Zjtib3JkZXItY29sb3I6I2Q0M2YzYX0uYnRuLWRhbmdlci5mb2N1cywuYnRuLWRhbmdlcjpmb2N1c3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2M5MzAyYztib3JkZXItY29sb3I6Izc2MWMxOX0uYnRuLWRhbmdlcjpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2M5MzAyYztib3JkZXItY29sb3I6I2FjMjkyNX0uYnRuLWRhbmdlci5hY3RpdmUsLmJ0bi1kYW5nZXI6YWN0aXZlLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWRhbmdlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2M5MzAyYztib3JkZXItY29sb3I6I2FjMjkyNX0uYnRuLWRhbmdlci5hY3RpdmUuZm9jdXMsLmJ0bi1kYW5nZXIuYWN0aXZlOmZvY3VzLC5idG4tZGFuZ2VyLmFjdGl2ZTpob3ZlciwuYnRuLWRhbmdlcjphY3RpdmUuZm9jdXMsLmJ0bi1kYW5nZXI6YWN0aXZlOmZvY3VzLC5idG4tZGFuZ2VyOmFjdGl2ZTpob3Zlciwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1kYW5nZXIuZm9jdXMsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tZGFuZ2VyOmZvY3VzLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWRhbmdlcjpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2FjMjkyNTtib3JkZXItY29sb3I6Izc2MWMxOX0uYnRuLWRhbmdlci5hY3RpdmUsLmJ0bi1kYW5nZXI6YWN0aXZlLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWRhbmdlcntiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmJ0bi1kYW5nZXIuZGlzYWJsZWQsLmJ0bi1kYW5nZXIuZGlzYWJsZWQuYWN0aXZlLC5idG4tZGFuZ2VyLmRpc2FibGVkLmZvY3VzLC5idG4tZGFuZ2VyLmRpc2FibGVkOmFjdGl2ZSwuYnRuLWRhbmdlci5kaXNhYmxlZDpmb2N1cywuYnRuLWRhbmdlci5kaXNhYmxlZDpob3ZlciwuYnRuLWRhbmdlcltkaXNhYmxlZF0sLmJ0bi1kYW5nZXJbZGlzYWJsZWRdLmFjdGl2ZSwuYnRuLWRhbmdlcltkaXNhYmxlZF0uZm9jdXMsLmJ0bi1kYW5nZXJbZGlzYWJsZWRdOmFjdGl2ZSwuYnRuLWRhbmdlcltkaXNhYmxlZF06Zm9jdXMsLmJ0bi1kYW5nZXJbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcixmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXIuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlci5mb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXI6YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlcjpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZDk1MzRmO2JvcmRlci1jb2xvcjojZDQzZjNhfS5idG4tZGFuZ2VyIC5iYWRnZXtjb2xvcjojZDk1MzRmO2JhY2tncm91bmQtY29sb3I6I2ZmZn0uYnRuLWxpbmt7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiMzMzdhYjc7Ym9yZGVyLXJhZGl1czowfS5idG4tbGluaywuYnRuLWxpbmsuYWN0aXZlLC5idG4tbGluazphY3RpdmUsLmJ0bi1saW5rW2Rpc2FibGVkXSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1saW5re2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS5idG4tbGluaywuYnRuLWxpbms6YWN0aXZlLC5idG4tbGluazpmb2N1cywuYnRuLWxpbms6aG92ZXJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5idG4tbGluazpmb2N1cywuYnRuLWxpbms6aG92ZXJ7Y29sb3I6IzIzNTI3Yzt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmJ0bi1saW5rW2Rpc2FibGVkXTpmb2N1cywuYnRuLWxpbmtbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWxpbms6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tbGluazpob3Zlcntjb2xvcjojNzc3O3RleHQtZGVjb3JhdGlvbjpub25lfS5idG4tZ3JvdXAtbGc+LmJ0biwuYnRuLWxne3BhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjEuMzMzMzMzMztib3JkZXItcmFkaXVzOjZweH0uYnRuLWdyb3VwLXNtPi5idG4sLmJ0bi1zbXtwYWRkaW5nOjVweCAxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNTtib3JkZXItcmFkaXVzOjNweH0uYnRuLWdyb3VwLXhzPi5idG4sLmJ0bi14c3twYWRkaW5nOjFweCA1cHg7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MS41O2JvcmRlci1yYWRpdXM6M3B4fS5idG4tYmxvY2t7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlfS5idG4tYmxvY2srLmJ0bi1ibG9ja3ttYXJnaW4tdG9wOjVweH1pbnB1dFt0eXBlPWJ1dHRvbl0uYnRuLWJsb2NrLGlucHV0W3R5cGU9cmVzZXRdLmJ0bi1ibG9jayxpbnB1dFt0eXBlPXN1Ym1pdF0uYnRuLWJsb2Nre3dpZHRoOjEwMCV9LmZhZGV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4xNXMgbGluZWFyOy1vLXRyYW5zaXRpb246b3BhY2l0eSAuMTVzIGxpbmVhcjt0cmFuc2l0aW9uOm9wYWNpdHkgLjE1cyBsaW5lYXJ9LmZhZGUuaW57b3BhY2l0eToxfS5jb2xsYXBzZXtkaXNwbGF5Om5vbmV9LmNvbGxhcHNlLmlue2Rpc3BsYXk6YmxvY2t9dHIuY29sbGFwc2UuaW57ZGlzcGxheTp0YWJsZS1yb3d9dGJvZHkuY29sbGFwc2UuaW57ZGlzcGxheTp0YWJsZS1yb3ctZ3JvdXB9LmNvbGxhcHNpbmd7cG9zaXRpb246cmVsYXRpdmU7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVuOy13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZTstby10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2U7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOi4zNXM7LW8tdHJhbnNpdGlvbi1kdXJhdGlvbjouMzVzO3RyYW5zaXRpb24tZHVyYXRpb246LjM1czstd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6aGVpZ2h0LHZpc2liaWxpdHk7LW8tdHJhbnNpdGlvbi1wcm9wZXJ0eTpoZWlnaHQsdmlzaWJpbGl0eTt0cmFuc2l0aW9uLXByb3BlcnR5OmhlaWdodCx2aXNpYmlsaXR5fS5jYXJldHtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDowO2hlaWdodDowO21hcmdpbi1sZWZ0OjJweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Ym9yZGVyLXRvcDo0cHggZGFzaGVkO2JvcmRlci10b3A6NHB4IHNvbGlkXDk7Ym9yZGVyLXJpZ2h0OjRweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItbGVmdDo0cHggc29saWQgdHJhbnNwYXJlbnR9LmRyb3Bkb3duLC5kcm9wdXB7cG9zaXRpb246cmVsYXRpdmV9LmRyb3Bkb3duLXRvZ2dsZTpmb2N1c3tvdXRsaW5lOjB9LmRyb3Bkb3duLW1lbnV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjEwMCU7bGVmdDowO3otaW5kZXg6MTAwMDtkaXNwbGF5Om5vbmU7ZmxvYXQ6bGVmdDttaW4td2lkdGg6MTYwcHg7cGFkZGluZzo1cHggMDttYXJnaW46MnB4IDAgMDtmb250LXNpemU6MTRweDt0ZXh0LWFsaWduOmxlZnQ7bGlzdC1zdHlsZTpub25lO2JhY2tncm91bmQtY29sb3I6I2ZmZjstd2Via2l0LWJhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMTUpO2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzowIDZweCAxMnB4IHJnYmEoMCwwLDAsLjE3NSk7Ym94LXNoYWRvdzowIDZweCAxMnB4IHJnYmEoMCwwLDAsLjE3NSl9LmRyb3Bkb3duLW1lbnUucHVsbC1yaWdodHtyaWdodDowO2xlZnQ6YXV0b30uZHJvcGRvd24tbWVudSAuZGl2aWRlcntoZWlnaHQ6MXB4O21hcmdpbjo5cHggMDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZC1jb2xvcjojZTVlNWU1fS5kcm9wZG93bi1tZW51PmxpPmF7ZGlzcGxheTpibG9jaztwYWRkaW5nOjNweCAyMHB4O2NsZWFyOmJvdGg7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7Y29sb3I6IzMzMzt3aGl0ZS1zcGFjZTpub3dyYXB9LmRyb3Bkb3duLW1lbnU+bGk+YTpmb2N1cywuZHJvcGRvd24tbWVudT5saT5hOmhvdmVye2NvbG9yOiMyNjI2MjY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1fS5kcm9wZG93bi1tZW51Pi5hY3RpdmU+YSwuZHJvcGRvd24tbWVudT4uYWN0aXZlPmE6Zm9jdXMsLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hOmhvdmVye2NvbG9yOiNmZmY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojMzM3YWI3O291dGxpbmU6MH0uZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YSwuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YTpmb2N1cywuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YTpob3Zlcntjb2xvcjojNzc3fS5kcm9wZG93bi1tZW51Pi5kaXNhYmxlZD5hOmZvY3VzLC5kcm9wZG93bi1tZW51Pi5kaXNhYmxlZD5hOmhvdmVye3RleHQtZGVjb3JhdGlvbjpub25lO2N1cnNvcjpub3QtYWxsb3dlZDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JhY2tncm91bmQtaW1hZ2U6bm9uZTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KGVuYWJsZWQ9ZmFsc2UpfS5vcGVuPi5kcm9wZG93bi1tZW51e2Rpc3BsYXk6YmxvY2t9Lm9wZW4+YXtvdXRsaW5lOjB9LmRyb3Bkb3duLW1lbnUtcmlnaHR7cmlnaHQ6MDtsZWZ0OmF1dG99LmRyb3Bkb3duLW1lbnUtbGVmdHtyaWdodDphdXRvO2xlZnQ6MH0uZHJvcGRvd24taGVhZGVye2Rpc3BsYXk6YmxvY2s7cGFkZGluZzozcHggMjBweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjQyODU3MTQzO2NvbG9yOiM3Nzc7d2hpdGUtc3BhY2U6bm93cmFwfS5kcm9wZG93bi1iYWNrZHJvcHtwb3NpdGlvbjpmaXhlZDt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDt6LWluZGV4Ojk5MH0ucHVsbC1yaWdodD4uZHJvcGRvd24tbWVudXtyaWdodDowO2xlZnQ6YXV0b30uZHJvcHVwIC5jYXJldCwubmF2YmFyLWZpeGVkLWJvdHRvbSAuZHJvcGRvd24gLmNhcmV0e2NvbnRlbnQ6IiI7Ym9yZGVyLXRvcDowO2JvcmRlci1ib3R0b206NHB4IGRhc2hlZDtib3JkZXItYm90dG9tOjRweCBzb2xpZFw5fS5kcm9wdXAgLmRyb3Bkb3duLW1lbnUsLm5hdmJhci1maXhlZC1ib3R0b20gLmRyb3Bkb3duIC5kcm9wZG93bi1tZW51e3RvcDphdXRvO2JvdHRvbToxMDAlO21hcmdpbi1ib3R0b206MnB4fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLXJpZ2h0IC5kcm9wZG93bi1tZW51e3JpZ2h0OjA7bGVmdDphdXRvfS5uYXZiYXItcmlnaHQgLmRyb3Bkb3duLW1lbnUtbGVmdHtyaWdodDphdXRvO2xlZnQ6MH19LmJ0bi1ncm91cCwuYnRuLWdyb3VwLXZlcnRpY2Fse3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4sLmJ0bi1ncm91cD4uYnRue3Bvc2l0aW9uOnJlbGF0aXZlO2Zsb2F0OmxlZnR9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLmFjdGl2ZSwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG46YWN0aXZlLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bjpmb2N1cywuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG46aG92ZXIsLmJ0bi1ncm91cD4uYnRuLmFjdGl2ZSwuYnRuLWdyb3VwPi5idG46YWN0aXZlLC5idG4tZ3JvdXA+LmJ0bjpmb2N1cywuYnRuLWdyb3VwPi5idG46aG92ZXJ7ei1pbmRleDoyfS5idG4tZ3JvdXAgLmJ0bisuYnRuLC5idG4tZ3JvdXAgLmJ0bisuYnRuLWdyb3VwLC5idG4tZ3JvdXAgLmJ0bi1ncm91cCsuYnRuLC5idG4tZ3JvdXAgLmJ0bi1ncm91cCsuYnRuLWdyb3Vwe21hcmdpbi1sZWZ0Oi0xcHh9LmJ0bi10b29sYmFye21hcmdpbi1sZWZ0Oi01cHh9LmJ0bi10b29sYmFyIC5idG4sLmJ0bi10b29sYmFyIC5idG4tZ3JvdXAsLmJ0bi10b29sYmFyIC5pbnB1dC1ncm91cHtmbG9hdDpsZWZ0fS5idG4tdG9vbGJhcj4uYnRuLC5idG4tdG9vbGJhcj4uYnRuLWdyb3VwLC5idG4tdG9vbGJhcj4uaW5wdXQtZ3JvdXB7bWFyZ2luLWxlZnQ6NXB4fS5idG4tZ3JvdXA+LmJ0bjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKXtib3JkZXItcmFkaXVzOjB9LmJ0bi1ncm91cD4uYnRuOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjB9LmJ0bi1ncm91cD4uYnRuOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpe2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0uYnRuLWdyb3VwPi5idG46bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSwuYnRuLWdyb3VwPi5kcm9wZG93bi10b2dnbGU6bm90KDpmaXJzdC1jaGlsZCl7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0uYnRuLWdyb3VwPi5idG4tZ3JvdXB7ZmxvYXQ6bGVmdH0uYnRuLWdyb3VwPi5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKT4uYnRue2JvcmRlci1yYWRpdXM6MH0uYnRuLWdyb3VwPi5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKT4uYnRuOmxhc3QtY2hpbGQsLmJ0bi1ncm91cD4uYnRuLWdyb3VwOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCk+LmRyb3Bkb3duLXRvZ2dsZXtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LmJ0bi1ncm91cD4uYnRuLWdyb3VwOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCk+LmJ0bjpmaXJzdC1jaGlsZHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5idG4tZ3JvdXAgLmRyb3Bkb3duLXRvZ2dsZTphY3RpdmUsLmJ0bi1ncm91cC5vcGVuIC5kcm9wZG93bi10b2dnbGV7b3V0bGluZTowfS5idG4tZ3JvdXA+LmJ0bisuZHJvcGRvd24tdG9nZ2xle3BhZGRpbmctcmlnaHQ6OHB4O3BhZGRpbmctbGVmdDo4cHh9LmJ0bi1ncm91cD4uYnRuLWxnKy5kcm9wZG93bi10b2dnbGV7cGFkZGluZy1yaWdodDoxMnB4O3BhZGRpbmctbGVmdDoxMnB4fS5idG4tZ3JvdXAub3BlbiAuZHJvcGRvd24tdG9nZ2xley13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDNweCA1cHggcmdiYSgwLDAsMCwuMTI1KTtib3gtc2hhZG93Omluc2V0IDAgM3B4IDVweCByZ2JhKDAsMCwwLC4xMjUpfS5idG4tZ3JvdXAub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmJ0bi1saW5rey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0uYnRuIC5jYXJldHttYXJnaW4tbGVmdDowfS5idG4tbGcgLmNhcmV0e2JvcmRlci13aWR0aDo1cHggNXB4IDA7Ym9yZGVyLWJvdHRvbS13aWR0aDowfS5kcm9wdXAgLmJ0bi1sZyAuY2FyZXR7Ym9yZGVyLXdpZHRoOjAgNXB4IDVweH0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4sLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLWdyb3VwLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cD4uYnRue2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bm9uZTt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cD4uYnRue2Zsb2F0Om5vbmV9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuKy5idG4sLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuKy5idG4tZ3JvdXAsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLWdyb3VwKy5idG4sLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLWdyb3VwKy5idG4tZ3JvdXB7bWFyZ2luLXRvcDotMXB4O21hcmdpbi1sZWZ0OjB9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCl7Ym9yZGVyLXJhZGl1czowfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpe2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG46bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKXtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweH0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKT4uYnRue2JvcmRlci1yYWRpdXM6MH0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKT4uYnRuOmxhc3QtY2hpbGQsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLWdyb3VwOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCk+LmRyb3Bkb3duLXRvZ2dsZXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKT4uYnRuOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5idG4tZ3JvdXAtanVzdGlmaWVke2Rpc3BsYXk6dGFibGU7d2lkdGg6MTAwJTt0YWJsZS1sYXlvdXQ6Zml4ZWQ7Ym9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlfS5idG4tZ3JvdXAtanVzdGlmaWVkPi5idG4sLmJ0bi1ncm91cC1qdXN0aWZpZWQ+LmJ0bi1ncm91cHtkaXNwbGF5OnRhYmxlLWNlbGw7ZmxvYXQ6bm9uZTt3aWR0aDoxJX0uYnRuLWdyb3VwLWp1c3RpZmllZD4uYnRuLWdyb3VwIC5idG57d2lkdGg6MTAwJX0uYnRuLWdyb3VwLWp1c3RpZmllZD4uYnRuLWdyb3VwIC5kcm9wZG93bi1tZW51e2xlZnQ6YXV0b31bZGF0YS10b2dnbGU9YnV0dG9uc10+LmJ0biBpbnB1dFt0eXBlPWNoZWNrYm94XSxbZGF0YS10b2dnbGU9YnV0dG9uc10+LmJ0biBpbnB1dFt0eXBlPXJhZGlvXSxbZGF0YS10b2dnbGU9YnV0dG9uc10+LmJ0bi1ncm91cD4uYnRuIGlucHV0W3R5cGU9Y2hlY2tib3hdLFtkYXRhLXRvZ2dsZT1idXR0b25zXT4uYnRuLWdyb3VwPi5idG4gaW5wdXRbdHlwZT1yYWRpb117cG9zaXRpb246YWJzb2x1dGU7Y2xpcDpyZWN0KDAsMCwwLDApO3BvaW50ZXItZXZlbnRzOm5vbmV9LmlucHV0LWdyb3Vwe3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6dGFibGU7Ym9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlfS5pbnB1dC1ncm91cFtjbGFzcyo9Y29sLV17ZmxvYXQ6bm9uZTtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjB9LmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2x7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyO2Zsb2F0OmxlZnQ7d2lkdGg6MTAwJTttYXJnaW4tYm90dG9tOjB9LmlucHV0LWdyb3VwLWxnPi5mb3JtLWNvbnRyb2wsLmlucHV0LWdyb3VwLWxnPi5pbnB1dC1ncm91cC1hZGRvbiwuaW5wdXQtZ3JvdXAtbGc+LmlucHV0LWdyb3VwLWJ0bj4uYnRue2hlaWdodDo0NnB4O3BhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjEuMzMzMzMzMztib3JkZXItcmFkaXVzOjZweH1zZWxlY3QuaW5wdXQtZ3JvdXAtbGc+LmZvcm0tY29udHJvbCxzZWxlY3QuaW5wdXQtZ3JvdXAtbGc+LmlucHV0LWdyb3VwLWFkZG9uLHNlbGVjdC5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYnRuPi5idG57aGVpZ2h0OjQ2cHg7bGluZS1oZWlnaHQ6NDZweH1zZWxlY3RbbXVsdGlwbGVdLmlucHV0LWdyb3VwLWxnPi5mb3JtLWNvbnRyb2wsc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYWRkb24sc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYnRuPi5idG4sdGV4dGFyZWEuaW5wdXQtZ3JvdXAtbGc+LmZvcm0tY29udHJvbCx0ZXh0YXJlYS5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYWRkb24sdGV4dGFyZWEuaW5wdXQtZ3JvdXAtbGc+LmlucHV0LWdyb3VwLWJ0bj4uYnRue2hlaWdodDphdXRvfS5pbnB1dC1ncm91cC1zbT4uZm9ybS1jb250cm9sLC5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYWRkb24sLmlucHV0LWdyb3VwLXNtPi5pbnB1dC1ncm91cC1idG4+LmJ0bntoZWlnaHQ6MzBweDtwYWRkaW5nOjVweCAxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNTtib3JkZXItcmFkaXVzOjNweH1zZWxlY3QuaW5wdXQtZ3JvdXAtc20+LmZvcm0tY29udHJvbCxzZWxlY3QuaW5wdXQtZ3JvdXAtc20+LmlucHV0LWdyb3VwLWFkZG9uLHNlbGVjdC5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYnRuPi5idG57aGVpZ2h0OjMwcHg7bGluZS1oZWlnaHQ6MzBweH1zZWxlY3RbbXVsdGlwbGVdLmlucHV0LWdyb3VwLXNtPi5mb3JtLWNvbnRyb2wsc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYWRkb24sc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYnRuPi5idG4sdGV4dGFyZWEuaW5wdXQtZ3JvdXAtc20+LmZvcm0tY29udHJvbCx0ZXh0YXJlYS5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYWRkb24sdGV4dGFyZWEuaW5wdXQtZ3JvdXAtc20+LmlucHV0LWdyb3VwLWJ0bj4uYnRue2hlaWdodDphdXRvfS5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sLC5pbnB1dC1ncm91cC1hZGRvbiwuaW5wdXQtZ3JvdXAtYnRue2Rpc3BsYXk6dGFibGUtY2VsbH0uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbDpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpLC5pbnB1dC1ncm91cC1hZGRvbjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpLC5pbnB1dC1ncm91cC1idG46bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKXtib3JkZXItcmFkaXVzOjB9LmlucHV0LWdyb3VwLWFkZG9uLC5pbnB1dC1ncm91cC1idG57d2lkdGg6MSU7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uaW5wdXQtZ3JvdXAtYWRkb257cGFkZGluZzo2cHggMTJweDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MTtjb2xvcjojNTU1O3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6I2VlZTtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLXJhZGl1czo0cHh9LmlucHV0LWdyb3VwLWFkZG9uLmlucHV0LXNte3BhZGRpbmc6NXB4IDEwcHg7Zm9udC1zaXplOjEycHg7Ym9yZGVyLXJhZGl1czozcHh9LmlucHV0LWdyb3VwLWFkZG9uLmlucHV0LWxne3BhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxOHB4O2JvcmRlci1yYWRpdXM6NnB4fS5pbnB1dC1ncm91cC1hZGRvbiBpbnB1dFt0eXBlPWNoZWNrYm94XSwuaW5wdXQtZ3JvdXAtYWRkb24gaW5wdXRbdHlwZT1yYWRpb117bWFyZ2luLXRvcDowfS5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sOmZpcnN0LWNoaWxkLC5pbnB1dC1ncm91cC1hZGRvbjpmaXJzdC1jaGlsZCwuaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkPi5idG4sLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uYnRuLWdyb3VwPi5idG4sLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uZHJvcGRvd24tdG9nZ2xlLC5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZD4uYnRuLWdyb3VwOm5vdCg6bGFzdC1jaGlsZCk+LmJ0biwuaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQ+LmJ0bjpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKXtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LmlucHV0LWdyb3VwLWFkZG9uOmZpcnN0LWNoaWxke2JvcmRlci1yaWdodDowfS5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sOmxhc3QtY2hpbGQsLmlucHV0LWdyb3VwLWFkZG9uOmxhc3QtY2hpbGQsLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpPi5idG4sLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uYnRuOm5vdCg6Zmlyc3QtY2hpbGQpLC5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZD4uYnRuLC5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZD4uYnRuLWdyb3VwPi5idG4sLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkPi5kcm9wZG93bi10b2dnbGV7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0uaW5wdXQtZ3JvdXAtYWRkb246bGFzdC1jaGlsZHtib3JkZXItbGVmdDowfS5pbnB1dC1ncm91cC1idG57cG9zaXRpb246cmVsYXRpdmU7Zm9udC1zaXplOjA7d2hpdGUtc3BhY2U6bm93cmFwfS5pbnB1dC1ncm91cC1idG4+LmJ0bntwb3NpdGlvbjpyZWxhdGl2ZX0uaW5wdXQtZ3JvdXAtYnRuPi5idG4rLmJ0bnttYXJnaW4tbGVmdDotMXB4fS5pbnB1dC1ncm91cC1idG4+LmJ0bjphY3RpdmUsLmlucHV0LWdyb3VwLWJ0bj4uYnRuOmZvY3VzLC5pbnB1dC1ncm91cC1idG4+LmJ0bjpob3Zlcnt6LWluZGV4OjJ9LmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uYnRuLC5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQ+LmJ0bi1ncm91cHttYXJnaW4tcmlnaHQ6LTFweH0uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQ+LmJ0biwuaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQ+LmJ0bi1ncm91cHt6LWluZGV4OjI7bWFyZ2luLWxlZnQ6LTFweH0ubmF2e3BhZGRpbmctbGVmdDowO21hcmdpbi1ib3R0b206MDtsaXN0LXN0eWxlOm5vbmV9Lm5hdj5saXtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrfS5uYXY+bGk+YXtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MTBweCAxNXB4fS5uYXY+bGk+YTpmb2N1cywubmF2PmxpPmE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5uYXY+bGkuZGlzYWJsZWQ+YXtjb2xvcjojNzc3fS5uYXY+bGkuZGlzYWJsZWQ+YTpmb2N1cywubmF2PmxpLmRpc2FibGVkPmE6aG92ZXJ7Y29sb3I6Izc3Nzt0ZXh0LWRlY29yYXRpb246bm9uZTtjdXJzb3I6bm90LWFsbG93ZWQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2IC5vcGVuPmEsLm5hdiAub3Blbj5hOmZvY3VzLC5uYXYgLm9wZW4+YTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7Ym9yZGVyLWNvbG9yOiMzMzdhYjd9Lm5hdiAubmF2LWRpdmlkZXJ7aGVpZ2h0OjFweDttYXJnaW46OXB4IDA7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6I2U1ZTVlNX0ubmF2PmxpPmE+aW1ne21heC13aWR0aDpub25lfS5uYXYtdGFic3tib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkfS5uYXYtdGFicz5saXtmbG9hdDpsZWZ0O21hcmdpbi1ib3R0b206LTFweH0ubmF2LXRhYnM+bGk+YXttYXJnaW4tcmlnaHQ6MnB4O2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjRweCA0cHggMCAwfS5uYXYtdGFicz5saT5hOmhvdmVye2JvcmRlci1jb2xvcjojZWVlICNlZWUgI2RkZH0ubmF2LXRhYnM+bGkuYWN0aXZlPmEsLm5hdi10YWJzPmxpLmFjdGl2ZT5hOmZvY3VzLC5uYXYtdGFicz5saS5hY3RpdmU+YTpob3Zlcntjb2xvcjojNTU1O2N1cnNvcjpkZWZhdWx0O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLWJvdHRvbS1jb2xvcjp0cmFuc3BhcmVudH0ubmF2LXRhYnMubmF2LWp1c3RpZmllZHt3aWR0aDoxMDAlO2JvcmRlci1ib3R0b206MH0ubmF2LXRhYnMubmF2LWp1c3RpZmllZD5saXtmbG9hdDpub25lfS5uYXYtdGFicy5uYXYtanVzdGlmaWVkPmxpPmF7bWFyZ2luLWJvdHRvbTo1cHg7dGV4dC1hbGlnbjpjZW50ZXJ9Lm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+LmRyb3Bkb3duIC5kcm9wZG93bi1tZW51e3RvcDphdXRvO2xlZnQ6YXV0b31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+bGl7ZGlzcGxheTp0YWJsZS1jZWxsO3dpZHRoOjElfS5uYXYtdGFicy5uYXYtanVzdGlmaWVkPmxpPmF7bWFyZ2luLWJvdHRvbTowfX0ubmF2LXRhYnMubmF2LWp1c3RpZmllZD5saT5he21hcmdpbi1yaWdodDowO2JvcmRlci1yYWRpdXM6NHB4fS5uYXYtdGFicy5uYXYtanVzdGlmaWVkPi5hY3RpdmU+YSwubmF2LXRhYnMubmF2LWp1c3RpZmllZD4uYWN0aXZlPmE6Zm9jdXMsLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+LmFjdGl2ZT5hOmhvdmVye2JvcmRlcjoxcHggc29saWQgI2RkZH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+bGk+YXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkO2JvcmRlci1yYWRpdXM6NHB4IDRweCAwIDB9Lm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+LmFjdGl2ZT5hLC5uYXYtdGFicy5uYXYtanVzdGlmaWVkPi5hY3RpdmU+YTpmb2N1cywubmF2LXRhYnMubmF2LWp1c3RpZmllZD4uYWN0aXZlPmE6aG92ZXJ7Ym9yZGVyLWJvdHRvbS1jb2xvcjojZmZmfX0ubmF2LXBpbGxzPmxpe2Zsb2F0OmxlZnR9Lm5hdi1waWxscz5saT5he2JvcmRlci1yYWRpdXM6NHB4fS5uYXYtcGlsbHM+bGkrbGl7bWFyZ2luLWxlZnQ6MnB4fS5uYXYtcGlsbHM+bGkuYWN0aXZlPmEsLm5hdi1waWxscz5saS5hY3RpdmU+YTpmb2N1cywubmF2LXBpbGxzPmxpLmFjdGl2ZT5hOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzM3YWI3fS5uYXYtc3RhY2tlZD5saXtmbG9hdDpub25lfS5uYXYtc3RhY2tlZD5saStsaXttYXJnaW4tdG9wOjJweDttYXJnaW4tbGVmdDowfS5uYXYtanVzdGlmaWVke3dpZHRoOjEwMCV9Lm5hdi1qdXN0aWZpZWQ+bGl7ZmxvYXQ6bm9uZX0ubmF2LWp1c3RpZmllZD5saT5he21hcmdpbi1ib3R0b206NXB4O3RleHQtYWxpZ246Y2VudGVyfS5uYXYtanVzdGlmaWVkPi5kcm9wZG93biAuZHJvcGRvd24tbWVudXt0b3A6YXV0bztsZWZ0OmF1dG99QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXYtanVzdGlmaWVkPmxpe2Rpc3BsYXk6dGFibGUtY2VsbDt3aWR0aDoxJX0ubmF2LWp1c3RpZmllZD5saT5he21hcmdpbi1ib3R0b206MH19Lm5hdi10YWJzLWp1c3RpZmllZHtib3JkZXItYm90dG9tOjB9Lm5hdi10YWJzLWp1c3RpZmllZD5saT5he21hcmdpbi1yaWdodDowO2JvcmRlci1yYWRpdXM6NHB4fS5uYXYtdGFicy1qdXN0aWZpZWQ+LmFjdGl2ZT5hLC5uYXYtdGFicy1qdXN0aWZpZWQ+LmFjdGl2ZT5hOmZvY3VzLC5uYXYtdGFicy1qdXN0aWZpZWQ+LmFjdGl2ZT5hOmhvdmVye2JvcmRlcjoxcHggc29saWQgI2RkZH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdi10YWJzLWp1c3RpZmllZD5saT5he2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLXJhZGl1czo0cHggNHB4IDAgMH0ubmF2LXRhYnMtanVzdGlmaWVkPi5hY3RpdmU+YSwubmF2LXRhYnMtanVzdGlmaWVkPi5hY3RpdmU+YTpmb2N1cywubmF2LXRhYnMtanVzdGlmaWVkPi5hY3RpdmU+YTpob3Zlcntib3JkZXItYm90dG9tLWNvbG9yOiNmZmZ9fS50YWItY29udGVudD4udGFiLXBhbmV7ZGlzcGxheTpub25lfS50YWItY29udGVudD4uYWN0aXZle2Rpc3BsYXk6YmxvY2t9Lm5hdi10YWJzIC5kcm9wZG93bi1tZW51e21hcmdpbi10b3A6LTFweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0ubmF2YmFye3Bvc2l0aW9uOnJlbGF0aXZlO21pbi1oZWlnaHQ6NTBweDttYXJnaW4tYm90dG9tOjIwcHg7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhcntib3JkZXItcmFkaXVzOjRweH19QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItaGVhZGVye2Zsb2F0OmxlZnR9fS5uYXZiYXItY29sbGFwc2V7cGFkZGluZy1yaWdodDoxNXB4O3BhZGRpbmctbGVmdDoxNXB4O292ZXJmbG93LXg6dmlzaWJsZTstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDtib3JkZXItdG9wOjFweCBzb2xpZCB0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4xKTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm5hdmJhci1jb2xsYXBzZS5pbntvdmVyZmxvdy15OmF1dG99QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItY29sbGFwc2V7d2lkdGg6YXV0bztib3JkZXItdG9wOjA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS5uYXZiYXItY29sbGFwc2UuY29sbGFwc2V7ZGlzcGxheTpibG9jayFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8haW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjA7b3ZlcmZsb3c6dmlzaWJsZSFpbXBvcnRhbnR9Lm5hdmJhci1jb2xsYXBzZS5pbntvdmVyZmxvdy15OnZpc2libGV9Lm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWNvbGxhcHNlLC5uYXZiYXItc3RhdGljLXRvcCAubmF2YmFyLWNvbGxhcHNle3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MH19Lm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWNvbGxhcHNle21heC1oZWlnaHQ6MzQwcHh9QG1lZGlhIChtYXgtZGV2aWNlLXdpZHRoOjQ4MHB4KSBhbmQgKG9yaWVudGF0aW9uOmxhbmRzY2FwZSl7Lm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWNvbGxhcHNle21heC1oZWlnaHQ6MjAwcHh9fS5jb250YWluZXItZmx1aWQ+Lm5hdmJhci1jb2xsYXBzZSwuY29udGFpbmVyLWZsdWlkPi5uYXZiYXItaGVhZGVyLC5jb250YWluZXI+Lm5hdmJhci1jb2xsYXBzZSwuY29udGFpbmVyPi5uYXZiYXItaGVhZGVye21hcmdpbi1yaWdodDotMTVweDttYXJnaW4tbGVmdDotMTVweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmNvbnRhaW5lci1mbHVpZD4ubmF2YmFyLWNvbGxhcHNlLC5jb250YWluZXItZmx1aWQ+Lm5hdmJhci1oZWFkZXIsLmNvbnRhaW5lcj4ubmF2YmFyLWNvbGxhcHNlLC5jb250YWluZXI+Lm5hdmJhci1oZWFkZXJ7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MH19Lm5hdmJhci1zdGF0aWMtdG9we3otaW5kZXg6MTAwMDtib3JkZXItd2lkdGg6MCAwIDFweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhci1zdGF0aWMtdG9we2JvcmRlci1yYWRpdXM6MH19Lm5hdmJhci1maXhlZC1ib3R0b20sLm5hdmJhci1maXhlZC10b3B7cG9zaXRpb246Zml4ZWQ7cmlnaHQ6MDtsZWZ0OjA7ei1pbmRleDoxMDMwfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLWZpeGVkLWJvdHRvbSwubmF2YmFyLWZpeGVkLXRvcHtib3JkZXItcmFkaXVzOjB9fS5uYXZiYXItZml4ZWQtdG9we3RvcDowO2JvcmRlci13aWR0aDowIDAgMXB4fS5uYXZiYXItZml4ZWQtYm90dG9te2JvdHRvbTowO21hcmdpbi1ib3R0b206MDtib3JkZXItd2lkdGg6MXB4IDAgMH0ubmF2YmFyLWJyYW5ke2Zsb2F0OmxlZnQ7aGVpZ2h0OjUwcHg7cGFkZGluZzoxNXB4IDE1cHg7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MjBweH0ubmF2YmFyLWJyYW5kOmZvY3VzLC5uYXZiYXItYnJhbmQ6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Lm5hdmJhci1icmFuZD5pbWd7ZGlzcGxheTpibG9ja31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhcj4uY29udGFpbmVyIC5uYXZiYXItYnJhbmQsLm5hdmJhcj4uY29udGFpbmVyLWZsdWlkIC5uYXZiYXItYnJhbmR7bWFyZ2luLWxlZnQ6LTE1cHh9fS5uYXZiYXItdG9nZ2xle3Bvc2l0aW9uOnJlbGF0aXZlO2Zsb2F0OnJpZ2h0O3BhZGRpbmc6OXB4IDEwcHg7bWFyZ2luLXRvcDo4cHg7bWFyZ2luLXJpZ2h0OjE1cHg7bWFyZ2luLWJvdHRvbTo4cHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjRweH0ubmF2YmFyLXRvZ2dsZTpmb2N1c3tvdXRsaW5lOjB9Lm5hdmJhci10b2dnbGUgLmljb24tYmFye2Rpc3BsYXk6YmxvY2s7d2lkdGg6MjJweDtoZWlnaHQ6MnB4O2JvcmRlci1yYWRpdXM6MXB4fS5uYXZiYXItdG9nZ2xlIC5pY29uLWJhcisuaWNvbi1iYXJ7bWFyZ2luLXRvcDo0cHh9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItdG9nZ2xle2Rpc3BsYXk6bm9uZX19Lm5hdmJhci1uYXZ7bWFyZ2luOjcuNXB4IC0xNXB4fS5uYXZiYXItbmF2PmxpPmF7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O2xpbmUtaGVpZ2h0OjIwcHh9QG1lZGlhIChtYXgtd2lkdGg6NzY3cHgpey5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51e3Bvc2l0aW9uOnN0YXRpYztmbG9hdDpub25lO3dpZHRoOmF1dG87bWFyZ2luLXRvcDowO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1oZWFkZXIsLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+bGk+YXtwYWRkaW5nOjVweCAxNXB4IDVweCAyNXB4fS5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51PmxpPmF7bGluZS1oZWlnaHQ6MjBweH0ubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT5saT5hOmZvY3VzLC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51PmxpPmE6aG92ZXJ7YmFja2dyb3VuZC1pbWFnZTpub25lfX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhci1uYXZ7ZmxvYXQ6bGVmdDttYXJnaW46MH0ubmF2YmFyLW5hdj5saXtmbG9hdDpsZWZ0fS5uYXZiYXItbmF2PmxpPmF7cGFkZGluZy10b3A6MTVweDtwYWRkaW5nLWJvdHRvbToxNXB4fX0ubmF2YmFyLWZvcm17cGFkZGluZzoxMHB4IDE1cHg7bWFyZ2luLXRvcDo4cHg7bWFyZ2luLXJpZ2h0Oi0xNXB4O21hcmdpbi1ib3R0b206OHB4O21hcmdpbi1sZWZ0Oi0xNXB4O2JvcmRlci10b3A6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMSl9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItZm9ybSAuZm9ybS1ncm91cHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tYm90dG9tOjA7dmVydGljYWwtYWxpZ246bWlkZGxlfS5uYXZiYXItZm9ybSAuZm9ybS1jb250cm9se2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOmF1dG87dmVydGljYWwtYWxpZ246bWlkZGxlfS5uYXZiYXItZm9ybSAuZm9ybS1jb250cm9sLXN0YXRpY3tkaXNwbGF5OmlubGluZS1ibG9ja30ubmF2YmFyLWZvcm0gLmlucHV0LWdyb3Vwe2Rpc3BsYXk6aW5saW5lLXRhYmxlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubmF2YmFyLWZvcm0gLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2wsLm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cCAuaW5wdXQtZ3JvdXAtYWRkb24sLm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cCAuaW5wdXQtZ3JvdXAtYnRue3dpZHRoOmF1dG99Lm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cD4uZm9ybS1jb250cm9se3dpZHRoOjEwMCV9Lm5hdmJhci1mb3JtIC5jb250cm9sLWxhYmVse21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm5hdmJhci1mb3JtIC5jaGVja2JveCwubmF2YmFyLWZvcm0gLnJhZGlve2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7dmVydGljYWwtYWxpZ246bWlkZGxlfS5uYXZiYXItZm9ybSAuY2hlY2tib3ggbGFiZWwsLm5hdmJhci1mb3JtIC5yYWRpbyBsYWJlbHtwYWRkaW5nLWxlZnQ6MH0ubmF2YmFyLWZvcm0gLmNoZWNrYm94IGlucHV0W3R5cGU9Y2hlY2tib3hdLC5uYXZiYXItZm9ybSAucmFkaW8gaW5wdXRbdHlwZT1yYWRpb117cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLWxlZnQ6MH0ubmF2YmFyLWZvcm0gLmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9sLWZlZWRiYWNre3RvcDowfX1AbWVkaWEgKG1heC13aWR0aDo3NjdweCl7Lm5hdmJhci1mb3JtIC5mb3JtLWdyb3Vwe21hcmdpbi1ib3R0b206NXB4fS5uYXZiYXItZm9ybSAuZm9ybS1ncm91cDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH19QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItZm9ybXt3aWR0aDphdXRvO3BhZGRpbmctdG9wOjA7cGFkZGluZy1ib3R0b206MDttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDowO2JvcmRlcjowOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX19Lm5hdmJhci1uYXY+bGk+LmRyb3Bkb3duLW1lbnV7bWFyZ2luLXRvcDowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItbmF2PmxpPi5kcm9wZG93bi1tZW51e21hcmdpbi1ib3R0b206MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9Lm5hdmJhci1idG57bWFyZ2luLXRvcDo4cHg7bWFyZ2luLWJvdHRvbTo4cHh9Lm5hdmJhci1idG4uYnRuLXNte21hcmdpbi10b3A6MTBweDttYXJnaW4tYm90dG9tOjEwcHh9Lm5hdmJhci1idG4uYnRuLXhze21hcmdpbi10b3A6MTRweDttYXJnaW4tYm90dG9tOjE0cHh9Lm5hdmJhci10ZXh0e21hcmdpbi10b3A6MTVweDttYXJnaW4tYm90dG9tOjE1cHh9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItdGV4dHtmbG9hdDpsZWZ0O21hcmdpbi1yaWdodDoxNXB4O21hcmdpbi1sZWZ0OjE1cHh9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLWxlZnR7ZmxvYXQ6bGVmdCFpbXBvcnRhbnR9Lm5hdmJhci1yaWdodHtmbG9hdDpyaWdodCFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0Oi0xNXB4fS5uYXZiYXItcmlnaHR+Lm5hdmJhci1yaWdodHttYXJnaW4tcmlnaHQ6MH19Lm5hdmJhci1kZWZhdWx0e2JhY2tncm91bmQtY29sb3I6I2Y4ZjhmODtib3JkZXItY29sb3I6I2U3ZTdlN30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1icmFuZHtjb2xvcjojNzc3fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kOmhvdmVye2NvbG9yOiM1ZTVlNWU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10ZXh0e2NvbG9yOiM3Nzd9Lm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2PmxpPmF7Y29sb3I6Izc3N30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGk+YTpmb2N1cywubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGk+YTpob3Zlcntjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2Pi5hY3RpdmU+YSwubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+LmFjdGl2ZT5hOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4uYWN0aXZlPmE6aG92ZXJ7Y29sb3I6IzU1NTtiYWNrZ3JvdW5kLWNvbG9yOiNlN2U3ZTd9Lm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2Pi5kaXNhYmxlZD5hLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4uZGlzYWJsZWQ+YTpmb2N1cywubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+LmRpc2FibGVkPmE6aG92ZXJ7Y29sb3I6I2NjYztiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLXRvZ2dsZXtib3JkZXItY29sb3I6I2RkZH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGU6Zm9jdXMsLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItdG9nZ2xlOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2RkZH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGUgLmljb24tYmFye2JhY2tncm91bmQtY29sb3I6Izg4OH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1mb3Jte2JvcmRlci1jb2xvcjojZTdlN2U3fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4ub3Blbj5hLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4ub3Blbj5hOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4ub3Blbj5hOmhvdmVye2NvbG9yOiM1NTU7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+bGk+YXtjb2xvcjojNzc3fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT5saT5hOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT5saT5hOmhvdmVye2NvbG9yOiMzMzM7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uYWN0aXZlPmE6Zm9jdXMsLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5hY3RpdmU+YTpob3Zlcntjb2xvcjojNTU1O2JhY2tncm91bmQtY29sb3I6I2U3ZTdlN30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmEsLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5kaXNhYmxlZD5hOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YTpob3Zlcntjb2xvcjojY2NjO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWxpbmt7Y29sb3I6Izc3N30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1saW5rOmhvdmVye2NvbG9yOiMzMzN9Lm5hdmJhci1kZWZhdWx0IC5idG4tbGlua3tjb2xvcjojNzc3fS5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbms6Zm9jdXMsLm5hdmJhci1kZWZhdWx0IC5idG4tbGluazpob3Zlcntjb2xvcjojMzMzfS5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbmtbZGlzYWJsZWRdOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbmtbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAubmF2YmFyLWRlZmF1bHQgLmJ0bi1saW5rOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAubmF2YmFyLWRlZmF1bHQgLmJ0bi1saW5rOmhvdmVye2NvbG9yOiNjY2N9Lm5hdmJhci1pbnZlcnNle2JhY2tncm91bmQtY29sb3I6IzIyMjtib3JkZXItY29sb3I6IzA4MDgwOH0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1icmFuZHtjb2xvcjojOWQ5ZDlkfS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWJyYW5kOmZvY3VzLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWJyYW5kOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2YmFyLWludmVyc2UgLm5hdmJhci10ZXh0e2NvbG9yOiM5ZDlkOWR9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2PmxpPmF7Y29sb3I6IzlkOWQ5ZH0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+bGk+YTpmb2N1cywubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+bGk+YTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2Pi5hY3RpdmU+YSwubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+LmFjdGl2ZT5hOmZvY3VzLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4uYWN0aXZlPmE6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwODA4MDh9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2Pi5kaXNhYmxlZD5hLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4uZGlzYWJsZWQ+YTpmb2N1cywubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+LmRpc2FibGVkPmE6aG92ZXJ7Y29sb3I6IzQ0NDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXRvZ2dsZXtib3JkZXItY29sb3I6IzMzM30ubmF2YmFyLWludmVyc2UgLm5hdmJhci10b2dnbGU6Zm9jdXMsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdG9nZ2xlOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzMzM30ubmF2YmFyLWludmVyc2UgLm5hdmJhci10b2dnbGUgLmljb24tYmFye2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWludmVyc2UgLm5hdmJhci1mb3Jte2JvcmRlci1jb2xvcjojMTAxMDEwfS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4ub3Blbj5hLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4ub3Blbj5hOmZvY3VzLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4ub3Blbj5hOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDgwODA4fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmRyb3Bkb3duLWhlYWRlcntib3JkZXItY29sb3I6IzA4MDgwOH0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgLmRpdmlkZXJ7YmFja2dyb3VuZC1jb2xvcjojMDgwODA4fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT5saT5he2NvbG9yOiM5ZDlkOWR9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51PmxpPmE6Zm9jdXMsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51PmxpPmE6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uYWN0aXZlPmEsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5hY3RpdmU+YTpmb2N1cywubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDgwODA4fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YSwubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmE6Zm9jdXMsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5kaXNhYmxlZD5hOmhvdmVye2NvbG9yOiM0NDQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH19Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbGlua3tjb2xvcjojOWQ5ZDlkfS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWxpbms6aG92ZXJ7Y29sb3I6I2ZmZn0ubmF2YmFyLWludmVyc2UgLmJ0bi1saW5re2NvbG9yOiM5ZDlkOWR9Lm5hdmJhci1pbnZlcnNlIC5idG4tbGluazpmb2N1cywubmF2YmFyLWludmVyc2UgLmJ0bi1saW5rOmhvdmVye2NvbG9yOiNmZmZ9Lm5hdmJhci1pbnZlcnNlIC5idG4tbGlua1tkaXNhYmxlZF06Zm9jdXMsLm5hdmJhci1pbnZlcnNlIC5idG4tbGlua1tkaXNhYmxlZF06aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbms6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbms6aG92ZXJ7Y29sb3I6IzQ0NH0uYnJlYWRjcnVtYntwYWRkaW5nOjhweCAxNXB4O21hcmdpbi1ib3R0b206MjBweDtsaXN0LXN0eWxlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlci1yYWRpdXM6NHB4fS5icmVhZGNydW1iPmxpe2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5icmVhZGNydW1iPmxpK2xpOmJlZm9yZXtwYWRkaW5nOjAgNXB4O2NvbG9yOiNjY2M7Y29udGVudDoiL1wwMGEwIn0uYnJlYWRjcnVtYj4uYWN0aXZle2NvbG9yOiM3Nzd9LnBhZ2luYXRpb257ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZy1sZWZ0OjA7bWFyZ2luOjIwcHggMDtib3JkZXItcmFkaXVzOjRweH0ucGFnaW5hdGlvbj5saXtkaXNwbGF5OmlubGluZX0ucGFnaW5hdGlvbj5saT5hLC5wYWdpbmF0aW9uPmxpPnNwYW57cG9zaXRpb246cmVsYXRpdmU7ZmxvYXQ6bGVmdDtwYWRkaW5nOjZweCAxMnB4O21hcmdpbi1sZWZ0Oi0xcHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojMzM3YWI3O3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNkZGR9LnBhZ2luYXRpb24+bGk6Zmlyc3QtY2hpbGQ+YSwucGFnaW5hdGlvbj5saTpmaXJzdC1jaGlsZD5zcGFue21hcmdpbi1sZWZ0OjA7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHh9LnBhZ2luYXRpb24+bGk6bGFzdC1jaGlsZD5hLC5wYWdpbmF0aW9uPmxpOmxhc3QtY2hpbGQ+c3Bhbntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4fS5wYWdpbmF0aW9uPmxpPmE6Zm9jdXMsLnBhZ2luYXRpb24+bGk+YTpob3ZlciwucGFnaW5hdGlvbj5saT5zcGFuOmZvY3VzLC5wYWdpbmF0aW9uPmxpPnNwYW46aG92ZXJ7ei1pbmRleDozO2NvbG9yOiMyMzUyN2M7YmFja2dyb3VuZC1jb2xvcjojZWVlO2JvcmRlci1jb2xvcjojZGRkfS5wYWdpbmF0aW9uPi5hY3RpdmU+YSwucGFnaW5hdGlvbj4uYWN0aXZlPmE6Zm9jdXMsLnBhZ2luYXRpb24+LmFjdGl2ZT5hOmhvdmVyLC5wYWdpbmF0aW9uPi5hY3RpdmU+c3BhbiwucGFnaW5hdGlvbj4uYWN0aXZlPnNwYW46Zm9jdXMsLnBhZ2luYXRpb24+LmFjdGl2ZT5zcGFuOmhvdmVye3otaW5kZXg6Mjtjb2xvcjojZmZmO2N1cnNvcjpkZWZhdWx0O2JhY2tncm91bmQtY29sb3I6IzMzN2FiNztib3JkZXItY29sb3I6IzMzN2FiN30ucGFnaW5hdGlvbj4uZGlzYWJsZWQ+YSwucGFnaW5hdGlvbj4uZGlzYWJsZWQ+YTpmb2N1cywucGFnaW5hdGlvbj4uZGlzYWJsZWQ+YTpob3ZlciwucGFnaW5hdGlvbj4uZGlzYWJsZWQ+c3BhbiwucGFnaW5hdGlvbj4uZGlzYWJsZWQ+c3Bhbjpmb2N1cywucGFnaW5hdGlvbj4uZGlzYWJsZWQ+c3Bhbjpob3Zlcntjb2xvcjojNzc3O2N1cnNvcjpub3QtYWxsb3dlZDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyLWNvbG9yOiNkZGR9LnBhZ2luYXRpb24tbGc+bGk+YSwucGFnaW5hdGlvbi1sZz5saT5zcGFue3BhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjEuMzMzMzMzM30ucGFnaW5hdGlvbi1sZz5saTpmaXJzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLWxnPmxpOmZpcnN0LWNoaWxkPnNwYW57Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo2cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo2cHh9LnBhZ2luYXRpb24tbGc+bGk6bGFzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLWxnPmxpOmxhc3QtY2hpbGQ+c3Bhbntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo2cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NnB4fS5wYWdpbmF0aW9uLXNtPmxpPmEsLnBhZ2luYXRpb24tc20+bGk+c3BhbntwYWRkaW5nOjVweCAxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNX0ucGFnaW5hdGlvbi1zbT5saTpmaXJzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLXNtPmxpOmZpcnN0LWNoaWxkPnNwYW57Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czozcHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czozcHh9LnBhZ2luYXRpb24tc20+bGk6bGFzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLXNtPmxpOmxhc3QtY2hpbGQ+c3Bhbntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6M3B4fS5wYWdlcntwYWRkaW5nLWxlZnQ6MDttYXJnaW46MjBweCAwO3RleHQtYWxpZ246Y2VudGVyO2xpc3Qtc3R5bGU6bm9uZX0ucGFnZXIgbGl7ZGlzcGxheTppbmxpbmV9LnBhZ2VyIGxpPmEsLnBhZ2VyIGxpPnNwYW57ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzo1cHggMTRweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JvcmRlci1yYWRpdXM6MTVweH0ucGFnZXIgbGk+YTpmb2N1cywucGFnZXIgbGk+YTpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9LnBhZ2VyIC5uZXh0PmEsLnBhZ2VyIC5uZXh0PnNwYW57ZmxvYXQ6cmlnaHR9LnBhZ2VyIC5wcmV2aW91cz5hLC5wYWdlciAucHJldmlvdXM+c3BhbntmbG9hdDpsZWZ0fS5wYWdlciAuZGlzYWJsZWQ+YSwucGFnZXIgLmRpc2FibGVkPmE6Zm9jdXMsLnBhZ2VyIC5kaXNhYmxlZD5hOmhvdmVyLC5wYWdlciAuZGlzYWJsZWQ+c3Bhbntjb2xvcjojNzc3O2N1cnNvcjpub3QtYWxsb3dlZDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmxhYmVse2Rpc3BsYXk6aW5saW5lO3BhZGRpbmc6LjJlbSAuNmVtIC4zZW07Zm9udC1zaXplOjc1JTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTtib3JkZXItcmFkaXVzOi4yNWVtfWEubGFiZWw6Zm9jdXMsYS5sYWJlbDpob3Zlcntjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2N1cnNvcjpwb2ludGVyfS5sYWJlbDplbXB0eXtkaXNwbGF5Om5vbmV9LmJ0biAubGFiZWx7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0xcHh9LmxhYmVsLWRlZmF1bHR7YmFja2dyb3VuZC1jb2xvcjojNzc3fS5sYWJlbC1kZWZhdWx0W2hyZWZdOmZvY3VzLC5sYWJlbC1kZWZhdWx0W2hyZWZdOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzVlNWU1ZX0ubGFiZWwtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiMzMzdhYjd9LmxhYmVsLXByaW1hcnlbaHJlZl06Zm9jdXMsLmxhYmVsLXByaW1hcnlbaHJlZl06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMjg2MDkwfS5sYWJlbC1zdWNjZXNze2JhY2tncm91bmQtY29sb3I6IzVjYjg1Y30ubGFiZWwtc3VjY2Vzc1tocmVmXTpmb2N1cywubGFiZWwtc3VjY2Vzc1tocmVmXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM0NDlkNDR9LmxhYmVsLWluZm97YmFja2dyb3VuZC1jb2xvcjojNWJjMGRlfS5sYWJlbC1pbmZvW2hyZWZdOmZvY3VzLC5sYWJlbC1pbmZvW2hyZWZdOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzMxYjBkNX0ubGFiZWwtd2FybmluZ3tiYWNrZ3JvdW5kLWNvbG9yOiNmMGFkNGV9LmxhYmVsLXdhcm5pbmdbaHJlZl06Zm9jdXMsLmxhYmVsLXdhcm5pbmdbaHJlZl06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZWM5NzFmfS5sYWJlbC1kYW5nZXJ7YmFja2dyb3VuZC1jb2xvcjojZDk1MzRmfS5sYWJlbC1kYW5nZXJbaHJlZl06Zm9jdXMsLmxhYmVsLWRhbmdlcltocmVmXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjOTMwMmN9LmJhZGdle2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi13aWR0aDoxMHB4O3BhZGRpbmc6M3B4IDdweDtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7YmFja2dyb3VuZC1jb2xvcjojNzc3O2JvcmRlci1yYWRpdXM6MTBweH0uYmFkZ2U6ZW1wdHl7ZGlzcGxheTpub25lfS5idG4gLmJhZGdle3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDotMXB4fS5idG4tZ3JvdXAteHM+LmJ0biAuYmFkZ2UsLmJ0bi14cyAuYmFkZ2V7dG9wOjA7cGFkZGluZzoxcHggNXB4fWEuYmFkZ2U6Zm9jdXMsYS5iYWRnZTpob3Zlcntjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2N1cnNvcjpwb2ludGVyfS5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlPi5iYWRnZSwubmF2LXBpbGxzPi5hY3RpdmU+YT4uYmFkZ2V7Y29sb3I6IzMzN2FiNztiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lmxpc3QtZ3JvdXAtaXRlbT4uYmFkZ2V7ZmxvYXQ6cmlnaHR9Lmxpc3QtZ3JvdXAtaXRlbT4uYmFkZ2UrLmJhZGdle21hcmdpbi1yaWdodDo1cHh9Lm5hdi1waWxscz5saT5hPi5iYWRnZXttYXJnaW4tbGVmdDozcHh9Lmp1bWJvdHJvbntwYWRkaW5nLXRvcDozMHB4O3BhZGRpbmctYm90dG9tOjMwcHg7bWFyZ2luLWJvdHRvbTozMHB4O2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5qdW1ib3Ryb24gLmgxLC5qdW1ib3Ryb24gaDF7Y29sb3I6aW5oZXJpdH0uanVtYm90cm9uIHB7bWFyZ2luLWJvdHRvbToxNXB4O2ZvbnQtc2l6ZToyMXB4O2ZvbnQtd2VpZ2h0OjIwMH0uanVtYm90cm9uPmhye2JvcmRlci10b3AtY29sb3I6I2Q1ZDVkNX0uY29udGFpbmVyIC5qdW1ib3Ryb24sLmNvbnRhaW5lci1mbHVpZCAuanVtYm90cm9ue2JvcmRlci1yYWRpdXM6NnB4fS5qdW1ib3Ryb24gLmNvbnRhaW5lcnttYXgtd2lkdGg6MTAwJX1AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOjc2OHB4KXsuanVtYm90cm9ue3BhZGRpbmctdG9wOjQ4cHg7cGFkZGluZy1ib3R0b206NDhweH0uY29udGFpbmVyIC5qdW1ib3Ryb24sLmNvbnRhaW5lci1mbHVpZCAuanVtYm90cm9ue3BhZGRpbmctcmlnaHQ6NjBweDtwYWRkaW5nLWxlZnQ6NjBweH0uanVtYm90cm9uIC5oMSwuanVtYm90cm9uIGgxe2ZvbnQtc2l6ZTo2M3B4fX0udGh1bWJuYWlse2Rpc3BsYXk6YmxvY2s7cGFkZGluZzo0cHg7bWFyZ2luLWJvdHRvbToyMHB4O2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgI2RkZDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LXRyYW5zaXRpb246Ym9yZGVyIC4ycyBlYXNlLWluLW91dDstby10cmFuc2l0aW9uOmJvcmRlciAuMnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjpib3JkZXIgLjJzIGVhc2UtaW4tb3V0fS50aHVtYm5haWwgYT5pbWcsLnRodW1ibmFpbD5pbWd7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6YXV0b31hLnRodW1ibmFpbC5hY3RpdmUsYS50aHVtYm5haWw6Zm9jdXMsYS50aHVtYm5haWw6aG92ZXJ7Ym9yZGVyLWNvbG9yOiMzMzdhYjd9LnRodW1ibmFpbCAuY2FwdGlvbntwYWRkaW5nOjlweDtjb2xvcjojMzMzfS5hbGVydHtwYWRkaW5nOjE1cHg7bWFyZ2luLWJvdHRvbToyMHB4O2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czo0cHh9LmFsZXJ0IGg0e21hcmdpbi10b3A6MDtjb2xvcjppbmhlcml0fS5hbGVydCAuYWxlcnQtbGlua3tmb250LXdlaWdodDo3MDB9LmFsZXJ0PnAsLmFsZXJ0PnVse21hcmdpbi1ib3R0b206MH0uYWxlcnQ+cCtwe21hcmdpbi10b3A6NXB4fS5hbGVydC1kaXNtaXNzYWJsZSwuYWxlcnQtZGlzbWlzc2libGV7cGFkZGluZy1yaWdodDozNXB4fS5hbGVydC1kaXNtaXNzYWJsZSAuY2xvc2UsLmFsZXJ0LWRpc21pc3NpYmxlIC5jbG9zZXtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6LTJweDtyaWdodDotMjFweDtjb2xvcjppbmhlcml0fS5hbGVydC1zdWNjZXNze2NvbG9yOiMzYzc2M2Q7YmFja2dyb3VuZC1jb2xvcjojZGZmMGQ4O2JvcmRlci1jb2xvcjojZDZlOWM2fS5hbGVydC1zdWNjZXNzIGhye2JvcmRlci10b3AtY29sb3I6I2M5ZTJiM30uYWxlcnQtc3VjY2VzcyAuYWxlcnQtbGlua3tjb2xvcjojMmI1NDJjfS5hbGVydC1pbmZve2NvbG9yOiMzMTcwOGY7YmFja2dyb3VuZC1jb2xvcjojZDllZGY3O2JvcmRlci1jb2xvcjojYmNlOGYxfS5hbGVydC1pbmZvIGhye2JvcmRlci10b3AtY29sb3I6I2E2ZTFlY30uYWxlcnQtaW5mbyAuYWxlcnQtbGlua3tjb2xvcjojMjQ1MjY5fS5hbGVydC13YXJuaW5ne2NvbG9yOiM4YTZkM2I7YmFja2dyb3VuZC1jb2xvcjojZmNmOGUzO2JvcmRlci1jb2xvcjojZmFlYmNjfS5hbGVydC13YXJuaW5nIGhye2JvcmRlci10b3AtY29sb3I6I2Y3ZTFiNX0uYWxlcnQtd2FybmluZyAuYWxlcnQtbGlua3tjb2xvcjojNjY1MTJjfS5hbGVydC1kYW5nZXJ7Y29sb3I6I2E5NDQ0MjtiYWNrZ3JvdW5kLWNvbG9yOiNmMmRlZGU7Ym9yZGVyLWNvbG9yOiNlYmNjZDF9LmFsZXJ0LWRhbmdlciBocntib3JkZXItdG9wLWNvbG9yOiNlNGI5YzB9LmFsZXJ0LWRhbmdlciAuYWxlcnQtbGlua3tjb2xvcjojODQzNTM0fUAtd2Via2l0LWtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlc3tmcm9te2JhY2tncm91bmQtcG9zaXRpb246NDBweCAwfXRve2JhY2tncm91bmQtcG9zaXRpb246MCAwfX1ALW8ta2V5ZnJhbWVzIHByb2dyZXNzLWJhci1zdHJpcGVze2Zyb217YmFja2dyb3VuZC1wb3NpdGlvbjo0MHB4IDB9dG97YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9fUBrZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXN7ZnJvbXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjQwcHggMH10b3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMH19LnByb2dyZXNze2hlaWdodDoyMHB4O21hcmdpbi1ib3R0b206MjBweDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwuMSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwuMSl9LnByb2dyZXNzLWJhcntmbG9hdDpsZWZ0O3dpZHRoOjA7aGVpZ2h0OjEwMCU7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MjBweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IzMzN2FiNzstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwuMTUpO2JveC1zaGFkb3c6aW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwuMTUpOy13ZWJraXQtdHJhbnNpdGlvbjp3aWR0aCAuNnMgZWFzZTstby10cmFuc2l0aW9uOndpZHRoIC42cyBlYXNlO3RyYW5zaXRpb246d2lkdGggLjZzIGVhc2V9LnByb2dyZXNzLWJhci1zdHJpcGVkLC5wcm9ncmVzcy1zdHJpcGVkIC5wcm9ncmVzcy1iYXJ7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KTstd2Via2l0LWJhY2tncm91bmQtc2l6ZTo0MHB4IDQwcHg7YmFja2dyb3VuZC1zaXplOjQwcHggNDBweH0ucHJvZ3Jlc3MtYmFyLmFjdGl2ZSwucHJvZ3Jlc3MuYWN0aXZlIC5wcm9ncmVzcy1iYXJ7LXdlYmtpdC1hbmltYXRpb246cHJvZ3Jlc3MtYmFyLXN0cmlwZXMgMnMgbGluZWFyIGluZmluaXRlOy1vLWFuaW1hdGlvbjpwcm9ncmVzcy1iYXItc3RyaXBlcyAycyBsaW5lYXIgaW5maW5pdGU7YW5pbWF0aW9uOnByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZX0ucHJvZ3Jlc3MtYmFyLXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojNWNiODVjfS5wcm9ncmVzcy1zdHJpcGVkIC5wcm9ncmVzcy1iYXItc3VjY2Vzc3tiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpfS5wcm9ncmVzcy1iYXItaW5mb3tiYWNrZ3JvdW5kLWNvbG9yOiM1YmMwZGV9LnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhci1pbmZve2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCl9LnByb2dyZXNzLWJhci13YXJuaW5ne2JhY2tncm91bmQtY29sb3I6I2YwYWQ0ZX0ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLXdhcm5pbmd7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KX0ucHJvZ3Jlc3MtYmFyLWRhbmdlcntiYWNrZ3JvdW5kLWNvbG9yOiNkOTUzNGZ9LnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhci1kYW5nZXJ7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KX0ubWVkaWF7bWFyZ2luLXRvcDoxNXB4fS5tZWRpYTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9Lm1lZGlhLC5tZWRpYS1ib2R5e292ZXJmbG93OmhpZGRlbjt6b29tOjF9Lm1lZGlhLWJvZHl7d2lkdGg6MTAwMDBweH0ubWVkaWEtb2JqZWN0e2Rpc3BsYXk6YmxvY2t9Lm1lZGlhLW9iamVjdC5pbWctdGh1bWJuYWlse21heC13aWR0aDpub25lfS5tZWRpYS1yaWdodCwubWVkaWE+LnB1bGwtcmlnaHR7cGFkZGluZy1sZWZ0OjEwcHh9Lm1lZGlhLWxlZnQsLm1lZGlhPi5wdWxsLWxlZnR7cGFkZGluZy1yaWdodDoxMHB4fS5tZWRpYS1ib2R5LC5tZWRpYS1sZWZ0LC5tZWRpYS1yaWdodHtkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246dG9wfS5tZWRpYS1taWRkbGV7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tZWRpYS1ib3R0b217dmVydGljYWwtYWxpZ246Ym90dG9tfS5tZWRpYS1oZWFkaW5ne21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjVweH0ubWVkaWEtbGlzdHtwYWRkaW5nLWxlZnQ6MDtsaXN0LXN0eWxlOm5vbmV9Lmxpc3QtZ3JvdXB7cGFkZGluZy1sZWZ0OjA7bWFyZ2luLWJvdHRvbToyMHB4fS5saXN0LWdyb3VwLWl0ZW17cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztwYWRkaW5nOjEwcHggMTVweDttYXJnaW4tYm90dG9tOi0xcHg7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgI2RkZH0ubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweH0ubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweH1hLmxpc3QtZ3JvdXAtaXRlbSxidXR0b24ubGlzdC1ncm91cC1pdGVte2NvbG9yOiM1NTV9YS5saXN0LWdyb3VwLWl0ZW0gLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0gLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5ne2NvbG9yOiMzMzN9YS5saXN0LWdyb3VwLWl0ZW06Zm9jdXMsYS5saXN0LWdyb3VwLWl0ZW06aG92ZXIsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbTpmb2N1cyxidXR0b24ubGlzdC1ncm91cC1pdGVtOmhvdmVye2NvbG9yOiM1NTU7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1fWJ1dHRvbi5saXN0LWdyb3VwLWl0ZW17d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnR9Lmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZCwubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkOmZvY3VzLC5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQ6aG92ZXJ7Y29sb3I6Izc3NztjdXJzb3I6bm90LWFsbG93ZWQ7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLC5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQ6Zm9jdXMgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLC5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQ6aG92ZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5ne2NvbG9yOmluaGVyaXR9Lmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZCAubGlzdC1ncm91cC1pdGVtLXRleHQsLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZDpmb2N1cyAubGlzdC1ncm91cC1pdGVtLXRleHQsLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZDpob3ZlciAubGlzdC1ncm91cC1pdGVtLXRleHR7Y29sb3I6Izc3N30ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSwubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpmb2N1cywubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3Zlcnt6LWluZGV4OjI7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzMzdhYjc7Ym9yZGVyLWNvbG9yOiMzMzdhYjd9Lmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZz4uc21hbGwsLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nPnNtYWxsLC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZywubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpmb2N1cyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmc+LnNtYWxsLC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZz5zbWFsbCwubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3ZlciAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nPi5zbWFsbCwubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3ZlciAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmc+c21hbGx7Y29sb3I6aW5oZXJpdH0ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSAubGlzdC1ncm91cC1pdGVtLXRleHQsLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0LC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmhvdmVyIC5saXN0LWdyb3VwLWl0ZW0tdGV4dHtjb2xvcjojYzdkZGVmfS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzc3tjb2xvcjojM2M3NjNkO2JhY2tncm91bmQtY29sb3I6I2RmZjBkOH1hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzc3tjb2xvcjojM2M3NjNkfWEubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2VzcyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmd7Y29sb3I6aW5oZXJpdH1hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzOmZvY3VzLGEubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3M6aG92ZXIsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzOmZvY3VzLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzczpob3Zlcntjb2xvcjojM2M3NjNkO2JhY2tncm91bmQtY29sb3I6I2QwZTljNn1hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZSxhLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZTpmb2N1cyxhLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZTpob3ZlcixidXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MuYWN0aXZlLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzcy5hY3RpdmU6Zm9jdXMsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzNjNzYzZDtib3JkZXItY29sb3I6IzNjNzYzZH0ubGlzdC1ncm91cC1pdGVtLWluZm97Y29sb3I6IzMxNzA4ZjtiYWNrZ3JvdW5kLWNvbG9yOiNkOWVkZjd9YS5saXN0LWdyb3VwLWl0ZW0taW5mbyxidXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm97Y29sb3I6IzMxNzA4Zn1hLmxpc3QtZ3JvdXAtaXRlbS1pbmZvIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxidXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm8gLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5ne2NvbG9yOmluaGVyaXR9YS5saXN0LWdyb3VwLWl0ZW0taW5mbzpmb2N1cyxhLmxpc3QtZ3JvdXAtaXRlbS1pbmZvOmhvdmVyLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0taW5mbzpmb2N1cyxidXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm86aG92ZXJ7Y29sb3I6IzMxNzA4ZjtiYWNrZ3JvdW5kLWNvbG9yOiNjNGUzZjN9YS5saXN0LWdyb3VwLWl0ZW0taW5mby5hY3RpdmUsYS5saXN0LWdyb3VwLWl0ZW0taW5mby5hY3RpdmU6Zm9jdXMsYS5saXN0LWdyb3VwLWl0ZW0taW5mby5hY3RpdmU6aG92ZXIsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZvLmFjdGl2ZSxidXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlOmZvY3VzLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0taW5mby5hY3RpdmU6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzMTcwOGY7Ym9yZGVyLWNvbG9yOiMzMTcwOGZ9Lmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5ne2NvbG9yOiM4YTZkM2I7YmFja2dyb3VuZC1jb2xvcjojZmNmOGUzfWEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5ne2NvbG9yOiM4YTZkM2J9YS5saXN0LWdyb3VwLWl0ZW0td2FybmluZyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZ3tjb2xvcjppbmhlcml0fWEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmc6Zm9jdXMsYS5saXN0LWdyb3VwLWl0ZW0td2FybmluZzpob3ZlcixidXR0b24ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmc6Zm9jdXMsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nOmhvdmVye2NvbG9yOiM4YTZkM2I7YmFja2dyb3VuZC1jb2xvcjojZmFmMmNjfWEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcuYWN0aXZlLGEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcuYWN0aXZlOmZvY3VzLGEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcuYWN0aXZlOmhvdmVyLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZy5hY3RpdmUsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmFjdGl2ZTpmb2N1cyxidXR0b24ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcuYWN0aXZlOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojOGE2ZDNiO2JvcmRlci1jb2xvcjojOGE2ZDNifS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2Vye2NvbG9yOiNhOTQ0NDI7YmFja2dyb3VuZC1jb2xvcjojZjJkZWRlfWEubGlzdC1ncm91cC1pdGVtLWRhbmdlcixidXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlcntjb2xvcjojYTk0NDQyfWEubGlzdC1ncm91cC1pdGVtLWRhbmdlciAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5ne2NvbG9yOmluaGVyaXR9YS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyOmZvY3VzLGEubGlzdC1ncm91cC1pdGVtLWRhbmdlcjpob3ZlcixidXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlcjpmb2N1cyxidXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlcjpob3Zlcntjb2xvcjojYTk0NDQyO2JhY2tncm91bmQtY29sb3I6I2ViY2NjY31hLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIuYWN0aXZlLGEubGlzdC1ncm91cC1pdGVtLWRhbmdlci5hY3RpdmU6Zm9jdXMsYS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmFjdGl2ZTpob3ZlcixidXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlci5hY3RpdmUsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIuYWN0aXZlOmZvY3VzLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmFjdGl2ZTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2E5NDQ0Mjtib3JkZXItY29sb3I6I2E5NDQ0Mn0ubGlzdC1ncm91cC1pdGVtLWhlYWRpbmd7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206NXB4fS5saXN0LWdyb3VwLWl0ZW0tdGV4dHttYXJnaW4tYm90dG9tOjA7bGluZS1oZWlnaHQ6MS4zfS5wYW5lbHttYXJnaW4tYm90dG9tOjIwcHg7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSk7Ym94LXNoYWRvdzowIDFweCAxcHggcmdiYSgwLDAsMCwuMDUpfS5wYW5lbC1ib2R5e3BhZGRpbmc6MTVweH0ucGFuZWwtaGVhZGluZ3twYWRkaW5nOjEwcHggMTVweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjNweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHh9LnBhbmVsLWhlYWRpbmc+LmRyb3Bkb3duIC5kcm9wZG93bi10b2dnbGV7Y29sb3I6aW5oZXJpdH0ucGFuZWwtdGl0bGV7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDtmb250LXNpemU6MTZweDtjb2xvcjppbmhlcml0fS5wYW5lbC10aXRsZT4uc21hbGwsLnBhbmVsLXRpdGxlPi5zbWFsbD5hLC5wYW5lbC10aXRsZT5hLC5wYW5lbC10aXRsZT5zbWFsbCwucGFuZWwtdGl0bGU+c21hbGw+YXtjb2xvcjppbmhlcml0fS5wYW5lbC1mb290ZXJ7cGFkZGluZzoxMHB4IDE1cHg7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6M3B4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6M3B4fS5wYW5lbD4ubGlzdC1ncm91cCwucGFuZWw+LnBhbmVsLWNvbGxhcHNlPi5saXN0LWdyb3Vwe21hcmdpbi1ib3R0b206MH0ucGFuZWw+Lmxpc3QtZ3JvdXAgLmxpc3QtZ3JvdXAtaXRlbSwucGFuZWw+LnBhbmVsLWNvbGxhcHNlPi5saXN0LWdyb3VwIC5saXN0LWdyb3VwLWl0ZW17Ym9yZGVyLXdpZHRoOjFweCAwO2JvcmRlci1yYWRpdXM6MH0ucGFuZWw+Lmxpc3QtZ3JvdXA6Zmlyc3QtY2hpbGQgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCwucGFuZWw+LnBhbmVsLWNvbGxhcHNlPi5saXN0LWdyb3VwOmZpcnN0LWNoaWxkIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcDowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6M3B4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjNweH0ucGFuZWw+Lmxpc3QtZ3JvdXA6bGFzdC1jaGlsZCAubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGQsLnBhbmVsPi5wYW5lbC1jb2xsYXBzZT4ubGlzdC1ncm91cDpsYXN0LWNoaWxkIC5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZHtib3JkZXItYm90dG9tOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6M3B4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6M3B4fS5wYW5lbD4ucGFuZWwtaGVhZGluZysucGFuZWwtY29sbGFwc2U+Lmxpc3QtZ3JvdXAgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0ucGFuZWwtaGVhZGluZysubGlzdC1ncm91cCAubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxke2JvcmRlci10b3Atd2lkdGg6MH0ubGlzdC1ncm91cCsucGFuZWwtZm9vdGVye2JvcmRlci10b3Atd2lkdGg6MH0ucGFuZWw+LnBhbmVsLWNvbGxhcHNlPi50YWJsZSwucGFuZWw+LnRhYmxlLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGV7bWFyZ2luLWJvdHRvbTowfS5wYW5lbD4ucGFuZWwtY29sbGFwc2U+LnRhYmxlIGNhcHRpb24sLnBhbmVsPi50YWJsZSBjYXB0aW9uLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUgY2FwdGlvbntwYWRkaW5nLXJpZ2h0OjE1cHg7cGFkZGluZy1sZWZ0OjE1cHh9LnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkPi50YWJsZTpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6M3B4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjNweH0ucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQ+LnRhYmxlOmZpcnN0LWNoaWxkPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZD4udGFibGU6Zmlyc3QtY2hpbGQ+dGhlYWQ6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpmaXJzdC1jaGlsZD50Ym9keTpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmZpcnN0LWNoaWxkPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6M3B4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjNweH0ucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQ+LnRhYmxlOmZpcnN0LWNoaWxkPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZD4udGFibGU6Zmlyc3QtY2hpbGQ+dGJvZHk6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkPi50YWJsZTpmaXJzdC1jaGlsZD50aGVhZDpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQ+LnRhYmxlOmZpcnN0LWNoaWxkPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGU6Zmlyc3QtY2hpbGQ+dGJvZHk6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpmaXJzdC1jaGlsZD50Ym9keTpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmZpcnN0LWNoaWxkPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGU6Zmlyc3QtY2hpbGQ+dGhlYWQ6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czozcHh9LnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkPi50YWJsZTpmaXJzdC1jaGlsZD50Ym9keTpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZD4udGFibGU6Zmlyc3QtY2hpbGQ+dGJvZHk6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQ+LnRhYmxlOmZpcnN0LWNoaWxkPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkPi50YWJsZTpmaXJzdC1jaGlsZD50aGVhZDpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGU6Zmlyc3QtY2hpbGQ+dGJvZHk6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmZpcnN0LWNoaWxkPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpmaXJzdC1jaGlsZD50aGVhZDpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGU6Zmlyc3QtY2hpbGQ+dGhlYWQ6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHh9LnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpsYXN0LWNoaWxke2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjNweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjNweH0ucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZD4udGFibGU6bGFzdC1jaGlsZD50Ym9keTpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGU6bGFzdC1jaGlsZD50Ym9keTpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZHtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czozcHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czozcHh9LnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQ+dGJvZHk6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRib2R5Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZD4udGFibGU6bGFzdC1jaGlsZD50Zm9vdDpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGU6bGFzdC1jaGlsZD50Ym9keTpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpsYXN0LWNoaWxkPnRib2R5Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGU6bGFzdC1jaGlsZD50Zm9vdDpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czozcHh9LnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQ+dGJvZHk6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQ+dGJvZHk6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpsYXN0LWNoaWxkPnRib2R5Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGU6bGFzdC1jaGlsZD50Ym9keTpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0aDpsYXN0LWNoaWxke2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjNweH0ucGFuZWw+LnBhbmVsLWJvZHkrLnRhYmxlLC5wYW5lbD4ucGFuZWwtYm9keSsudGFibGUtcmVzcG9uc2l2ZSwucGFuZWw+LnRhYmxlKy5wYW5lbC1ib2R5LC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZSsucGFuZWwtYm9keXtib3JkZXItdG9wOjFweCBzb2xpZCAjZGRkfS5wYW5lbD4udGFibGU+dGJvZHk6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGQsLnBhbmVsPi50YWJsZT50Ym9keTpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0aHtib3JkZXItdG9wOjB9LnBhbmVsPi50YWJsZS1ib3JkZXJlZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVke2JvcmRlcjowfS5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGQ6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI+dGg6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRoOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGQ6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI+dGg6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRoOmZpcnN0LWNoaWxke2JvcmRlci1sZWZ0OjB9LnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50aDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI+dGQ6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50aDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI+dGQ6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRoOmxhc3QtY2hpbGR7Ym9yZGVyLXJpZ2h0OjB9LnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpmaXJzdC1jaGlsZD50ZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyOmZpcnN0LWNoaWxkPnRoLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI6Zmlyc3QtY2hpbGQ+dGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cjpmaXJzdC1jaGlsZD50aCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyOmZpcnN0LWNoaWxkPnRkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI6Zmlyc3QtY2hpbGQ+dGgsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cjpmaXJzdC1jaGlsZD50ZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyOmZpcnN0LWNoaWxkPnRoe2JvcmRlci1ib3R0b206MH0ucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyOmxhc3QtY2hpbGQ+dGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpsYXN0LWNoaWxkPnRoLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI6bGFzdC1jaGlsZD50ZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyOmxhc3QtY2hpbGQ+dGgsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpsYXN0LWNoaWxkPnRkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI6bGFzdC1jaGlsZD50aCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyOmxhc3QtY2hpbGQ+dGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cjpsYXN0LWNoaWxkPnRoe2JvcmRlci1ib3R0b206MH0ucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmV7bWFyZ2luLWJvdHRvbTowO2JvcmRlcjowfS5wYW5lbC1ncm91cHttYXJnaW4tYm90dG9tOjIwcHh9LnBhbmVsLWdyb3VwIC5wYW5lbHttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXJhZGl1czo0cHh9LnBhbmVsLWdyb3VwIC5wYW5lbCsucGFuZWx7bWFyZ2luLXRvcDo1cHh9LnBhbmVsLWdyb3VwIC5wYW5lbC1oZWFkaW5ne2JvcmRlci1ib3R0b206MH0ucGFuZWwtZ3JvdXAgLnBhbmVsLWhlYWRpbmcrLnBhbmVsLWNvbGxhcHNlPi5saXN0LWdyb3VwLC5wYW5lbC1ncm91cCAucGFuZWwtaGVhZGluZysucGFuZWwtY29sbGFwc2U+LnBhbmVsLWJvZHl7Ym9yZGVyLXRvcDoxcHggc29saWQgI2RkZH0ucGFuZWwtZ3JvdXAgLnBhbmVsLWZvb3Rlcntib3JkZXItdG9wOjB9LnBhbmVsLWdyb3VwIC5wYW5lbC1mb290ZXIrLnBhbmVsLWNvbGxhcHNlIC5wYW5lbC1ib2R5e2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGR9LnBhbmVsLWRlZmF1bHR7Ym9yZGVyLWNvbG9yOiNkZGR9LnBhbmVsLWRlZmF1bHQ+LnBhbmVsLWhlYWRpbmd7Y29sb3I6IzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7Ym9yZGVyLWNvbG9yOiNkZGR9LnBhbmVsLWRlZmF1bHQ+LnBhbmVsLWhlYWRpbmcrLnBhbmVsLWNvbGxhcHNlPi5wYW5lbC1ib2R5e2JvcmRlci10b3AtY29sb3I6I2RkZH0ucGFuZWwtZGVmYXVsdD4ucGFuZWwtaGVhZGluZyAuYmFkZ2V7Y29sb3I6I2Y1ZjVmNTtiYWNrZ3JvdW5kLWNvbG9yOiMzMzN9LnBhbmVsLWRlZmF1bHQ+LnBhbmVsLWZvb3RlcisucGFuZWwtY29sbGFwc2U+LnBhbmVsLWJvZHl7Ym9yZGVyLWJvdHRvbS1jb2xvcjojZGRkfS5wYW5lbC1wcmltYXJ5e2JvcmRlci1jb2xvcjojMzM3YWI3fS5wYW5lbC1wcmltYXJ5Pi5wYW5lbC1oZWFkaW5ne2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzM3YWI3O2JvcmRlci1jb2xvcjojMzM3YWI3fS5wYW5lbC1wcmltYXJ5Pi5wYW5lbC1oZWFkaW5nKy5wYW5lbC1jb2xsYXBzZT4ucGFuZWwtYm9keXtib3JkZXItdG9wLWNvbG9yOiMzMzdhYjd9LnBhbmVsLXByaW1hcnk+LnBhbmVsLWhlYWRpbmcgLmJhZGdle2NvbG9yOiMzMzdhYjc7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5wYW5lbC1wcmltYXJ5Pi5wYW5lbC1mb290ZXIrLnBhbmVsLWNvbGxhcHNlPi5wYW5lbC1ib2R5e2JvcmRlci1ib3R0b20tY29sb3I6IzMzN2FiN30ucGFuZWwtc3VjY2Vzc3tib3JkZXItY29sb3I6I2Q2ZTljNn0ucGFuZWwtc3VjY2Vzcz4ucGFuZWwtaGVhZGluZ3tjb2xvcjojM2M3NjNkO2JhY2tncm91bmQtY29sb3I6I2RmZjBkODtib3JkZXItY29sb3I6I2Q2ZTljNn0ucGFuZWwtc3VjY2Vzcz4ucGFuZWwtaGVhZGluZysucGFuZWwtY29sbGFwc2U+LnBhbmVsLWJvZHl7Ym9yZGVyLXRvcC1jb2xvcjojZDZlOWM2fS5wYW5lbC1zdWNjZXNzPi5wYW5lbC1oZWFkaW5nIC5iYWRnZXtjb2xvcjojZGZmMGQ4O2JhY2tncm91bmQtY29sb3I6IzNjNzYzZH0ucGFuZWwtc3VjY2Vzcz4ucGFuZWwtZm9vdGVyKy5wYW5lbC1jb2xsYXBzZT4ucGFuZWwtYm9keXtib3JkZXItYm90dG9tLWNvbG9yOiNkNmU5YzZ9LnBhbmVsLWluZm97Ym9yZGVyLWNvbG9yOiNiY2U4ZjF9LnBhbmVsLWluZm8+LnBhbmVsLWhlYWRpbmd7Y29sb3I6IzMxNzA4ZjtiYWNrZ3JvdW5kLWNvbG9yOiNkOWVkZjc7Ym9yZGVyLWNvbG9yOiNiY2U4ZjF9LnBhbmVsLWluZm8+LnBhbmVsLWhlYWRpbmcrLnBhbmVsLWNvbGxhcHNlPi5wYW5lbC1ib2R5e2JvcmRlci10b3AtY29sb3I6I2JjZThmMX0ucGFuZWwtaW5mbz4ucGFuZWwtaGVhZGluZyAuYmFkZ2V7Y29sb3I6I2Q5ZWRmNztiYWNrZ3JvdW5kLWNvbG9yOiMzMTcwOGZ9LnBhbmVsLWluZm8+LnBhbmVsLWZvb3RlcisucGFuZWwtY29sbGFwc2U+LnBhbmVsLWJvZHl7Ym9yZGVyLWJvdHRvbS1jb2xvcjojYmNlOGYxfS5wYW5lbC13YXJuaW5ne2JvcmRlci1jb2xvcjojZmFlYmNjfS5wYW5lbC13YXJuaW5nPi5wYW5lbC1oZWFkaW5ne2NvbG9yOiM4YTZkM2I7YmFja2dyb3VuZC1jb2xvcjojZmNmOGUzO2JvcmRlci1jb2xvcjojZmFlYmNjfS5wYW5lbC13YXJuaW5nPi5wYW5lbC1oZWFkaW5nKy5wYW5lbC1jb2xsYXBzZT4ucGFuZWwtYm9keXtib3JkZXItdG9wLWNvbG9yOiNmYWViY2N9LnBhbmVsLXdhcm5pbmc+LnBhbmVsLWhlYWRpbmcgLmJhZGdle2NvbG9yOiNmY2Y4ZTM7YmFja2dyb3VuZC1jb2xvcjojOGE2ZDNifS5wYW5lbC13YXJuaW5nPi5wYW5lbC1mb290ZXIrLnBhbmVsLWNvbGxhcHNlPi5wYW5lbC1ib2R5e2JvcmRlci1ib3R0b20tY29sb3I6I2ZhZWJjY30ucGFuZWwtZGFuZ2Vye2JvcmRlci1jb2xvcjojZWJjY2QxfS5wYW5lbC1kYW5nZXI+LnBhbmVsLWhlYWRpbmd7Y29sb3I6I2E5NDQ0MjtiYWNrZ3JvdW5kLWNvbG9yOiNmMmRlZGU7Ym9yZGVyLWNvbG9yOiNlYmNjZDF9LnBhbmVsLWRhbmdlcj4ucGFuZWwtaGVhZGluZysucGFuZWwtY29sbGFwc2U+LnBhbmVsLWJvZHl7Ym9yZGVyLXRvcC1jb2xvcjojZWJjY2QxfS5wYW5lbC1kYW5nZXI+LnBhbmVsLWhlYWRpbmcgLmJhZGdle2NvbG9yOiNmMmRlZGU7YmFja2dyb3VuZC1jb2xvcjojYTk0NDQyfS5wYW5lbC1kYW5nZXI+LnBhbmVsLWZvb3RlcisucGFuZWwtY29sbGFwc2U+LnBhbmVsLWJvZHl7Ym9yZGVyLWJvdHRvbS1jb2xvcjojZWJjY2QxfS5lbWJlZC1yZXNwb25zaXZle3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjA7cGFkZGluZzowO292ZXJmbG93OmhpZGRlbn0uZW1iZWQtcmVzcG9uc2l2ZSAuZW1iZWQtcmVzcG9uc2l2ZS1pdGVtLC5lbWJlZC1yZXNwb25zaXZlIGVtYmVkLC5lbWJlZC1yZXNwb25zaXZlIGlmcmFtZSwuZW1iZWQtcmVzcG9uc2l2ZSBvYmplY3QsLmVtYmVkLXJlc3BvbnNpdmUgdmlkZW97cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyOjB9LmVtYmVkLXJlc3BvbnNpdmUtMTZieTl7cGFkZGluZy1ib3R0b206NTYuMjUlfS5lbWJlZC1yZXNwb25zaXZlLTRieTN7cGFkZGluZy1ib3R0b206NzUlfS53ZWxse21pbi1oZWlnaHQ6MjBweDtwYWRkaW5nOjE5cHg7bWFyZ2luLWJvdHRvbToyMHB4O2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXI6MXB4IHNvbGlkICNlM2UzZTM7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDUpfS53ZWxsIGJsb2NrcXVvdGV7Ym9yZGVyLWNvbG9yOiNkZGQ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE1KX0ud2VsbC1sZ3twYWRkaW5nOjI0cHg7Ym9yZGVyLXJhZGl1czo2cHh9LndlbGwtc217cGFkZGluZzo5cHg7Ym9yZGVyLXJhZGl1czozcHh9LmNsb3Nle2Zsb2F0OnJpZ2h0O2ZvbnQtc2l6ZToyMXB4O2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO2NvbG9yOiMwMDA7dGV4dC1zaGFkb3c6MCAxcHggMCAjZmZmO2ZpbHRlcjphbHBoYShvcGFjaXR5PTIwKTtvcGFjaXR5Oi4yfS5jbG9zZTpmb2N1cywuY2xvc2U6aG92ZXJ7Y29sb3I6IzAwMDt0ZXh0LWRlY29yYXRpb246bm9uZTtjdXJzb3I6cG9pbnRlcjtmaWx0ZXI6YWxwaGEob3BhY2l0eT01MCk7b3BhY2l0eTouNX1idXR0b24uY2xvc2V7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7cGFkZGluZzowO2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6MCAwO2JvcmRlcjowfS5tb2RhbC1vcGVue292ZXJmbG93OmhpZGRlbn0ubW9kYWx7cG9zaXRpb246Zml4ZWQ7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7ei1pbmRleDoxMDUwO2Rpc3BsYXk6bm9uZTtvdmVyZmxvdzpoaWRkZW47LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7b3V0bGluZTowfS5tb2RhbC5mYWRlIC5tb2RhbC1kaWFsb2d7LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDstby10cmFuc2l0aW9uOi1vLXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjNzIGVhc2Utb3V0Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSgwLC0yNSUpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlKDAsLTI1JSk7LW8tdHJhbnNmb3JtOnRyYW5zbGF0ZSgwLC0yNSUpO3RyYW5zZm9ybTp0cmFuc2xhdGUoMCwtMjUlKX0ubW9kYWwuaW4gLm1vZGFsLWRpYWxvZ3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoMCwwKTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZSgwLDApOy1vLXRyYW5zZm9ybTp0cmFuc2xhdGUoMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlKDAsMCl9Lm1vZGFsLW9wZW4gLm1vZGFse292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0b30ubW9kYWwtZGlhbG9ne3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOmF1dG87bWFyZ2luOjEwcHh9Lm1vZGFsLWNvbnRlbnR7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZC1jb2xvcjojZmZmOy13ZWJraXQtYmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94O2JhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtib3JkZXI6MXB4IHNvbGlkICM5OTk7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTtib3JkZXItcmFkaXVzOjZweDtvdXRsaW5lOjA7LXdlYmtpdC1ib3gtc2hhZG93OjAgM3B4IDlweCByZ2JhKDAsMCwwLC41KTtib3gtc2hhZG93OjAgM3B4IDlweCByZ2JhKDAsMCwwLC41KX0ubW9kYWwtYmFja2Ryb3B7cG9zaXRpb246Zml4ZWQ7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7ei1pbmRleDoxMDQwO2JhY2tncm91bmQtY29sb3I6IzAwMH0ubW9kYWwtYmFja2Ryb3AuZmFkZXtmaWx0ZXI6YWxwaGEob3BhY2l0eT0wKTtvcGFjaXR5OjB9Lm1vZGFsLWJhY2tkcm9wLmlue2ZpbHRlcjphbHBoYShvcGFjaXR5PTUwKTtvcGFjaXR5Oi41fS5tb2RhbC1oZWFkZXJ7bWluLWhlaWdodDoxNi40M3B4O3BhZGRpbmc6MTVweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTVlNWU1fS5tb2RhbC1oZWFkZXIgLmNsb3Nle21hcmdpbi10b3A6LTJweH0ubW9kYWwtdGl0bGV7bWFyZ2luOjA7bGluZS1oZWlnaHQ6MS40Mjg1NzE0M30ubW9kYWwtYm9keXtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjE1cHh9Lm1vZGFsLWZvb3RlcntwYWRkaW5nOjE1cHg7dGV4dC1hbGlnbjpyaWdodDtib3JkZXItdG9wOjFweCBzb2xpZCAjZTVlNWU1fS5tb2RhbC1mb290ZXIgLmJ0bisuYnRue21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDo1cHh9Lm1vZGFsLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0bnttYXJnaW4tbGVmdDotMXB4fS5tb2RhbC1mb290ZXIgLmJ0bi1ibG9jaysuYnRuLWJsb2Nre21hcmdpbi1sZWZ0OjB9Lm1vZGFsLXNjcm9sbGJhci1tZWFzdXJle3Bvc2l0aW9uOmFic29sdXRlO3RvcDotOTk5OXB4O3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6c2Nyb2xsfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubW9kYWwtZGlhbG9ne3dpZHRoOjYwMHB4O21hcmdpbjozMHB4IGF1dG99Lm1vZGFsLWNvbnRlbnR7LXdlYmtpdC1ib3gtc2hhZG93OjAgNXB4IDE1cHggcmdiYSgwLDAsMCwuNSk7Ym94LXNoYWRvdzowIDVweCAxNXB4IHJnYmEoMCwwLDAsLjUpfS5tb2RhbC1zbXt3aWR0aDozMDBweH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpey5tb2RhbC1sZ3t3aWR0aDo5MDBweH19LnRvb2x0aXB7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDcwO2Rpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6IkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mzt0ZXh0LWFsaWduOmxlZnQ7dGV4dC1hbGlnbjpzdGFydDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXNoYWRvdzpub25lO3RleHQtdHJhbnNmb3JtOm5vbmU7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO3dvcmQtYnJlYWs6bm9ybWFsO3dvcmQtc3BhY2luZzpub3JtYWw7d29yZC13cmFwOm5vcm1hbDt3aGl0ZS1zcGFjZTpub3JtYWw7ZmlsdGVyOmFscGhhKG9wYWNpdHk9MCk7b3BhY2l0eTowO2xpbmUtYnJlYWs6YXV0b30udG9vbHRpcC5pbntmaWx0ZXI6YWxwaGEob3BhY2l0eT05MCk7b3BhY2l0eTouOX0udG9vbHRpcC50b3B7cGFkZGluZzo1cHggMDttYXJnaW4tdG9wOi0zcHh9LnRvb2x0aXAucmlnaHR7cGFkZGluZzowIDVweDttYXJnaW4tbGVmdDozcHh9LnRvb2x0aXAuYm90dG9te3BhZGRpbmc6NXB4IDA7bWFyZ2luLXRvcDozcHh9LnRvb2x0aXAubGVmdHtwYWRkaW5nOjAgNXB4O21hcmdpbi1sZWZ0Oi0zcHh9LnRvb2x0aXAtaW5uZXJ7bWF4LXdpZHRoOjIwMHB4O3BhZGRpbmc6M3B4IDhweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IzAwMDtib3JkZXItcmFkaXVzOjRweH0udG9vbHRpcC1hcnJvd3twb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDowO2hlaWdodDowO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItc3R5bGU6c29saWR9LnRvb2x0aXAudG9wIC50b29sdGlwLWFycm93e2JvdHRvbTowO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi01cHg7Ym9yZGVyLXdpZHRoOjVweCA1cHggMDtib3JkZXItdG9wLWNvbG9yOiMwMDB9LnRvb2x0aXAudG9wLWxlZnQgLnRvb2x0aXAtYXJyb3d7cmlnaHQ6NXB4O2JvdHRvbTowO21hcmdpbi1ib3R0b206LTVweDtib3JkZXItd2lkdGg6NXB4IDVweCAwO2JvcmRlci10b3AtY29sb3I6IzAwMH0udG9vbHRpcC50b3AtcmlnaHQgLnRvb2x0aXAtYXJyb3d7Ym90dG9tOjA7bGVmdDo1cHg7bWFyZ2luLWJvdHRvbTotNXB4O2JvcmRlci13aWR0aDo1cHggNXB4IDA7Ym9yZGVyLXRvcC1jb2xvcjojMDAwfS50b29sdGlwLnJpZ2h0IC50b29sdGlwLWFycm93e3RvcDo1MCU7bGVmdDowO21hcmdpbi10b3A6LTVweDtib3JkZXItd2lkdGg6NXB4IDVweCA1cHggMDtib3JkZXItcmlnaHQtY29sb3I6IzAwMH0udG9vbHRpcC5sZWZ0IC50b29sdGlwLWFycm93e3RvcDo1MCU7cmlnaHQ6MDttYXJnaW4tdG9wOi01cHg7Ym9yZGVyLXdpZHRoOjVweCAwIDVweCA1cHg7Ym9yZGVyLWxlZnQtY29sb3I6IzAwMH0udG9vbHRpcC5ib3R0b20gLnRvb2x0aXAtYXJyb3d7dG9wOjA7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LTVweDtib3JkZXItd2lkdGg6MCA1cHggNXB4O2JvcmRlci1ib3R0b20tY29sb3I6IzAwMH0udG9vbHRpcC5ib3R0b20tbGVmdCAudG9vbHRpcC1hcnJvd3t0b3A6MDtyaWdodDo1cHg7bWFyZ2luLXRvcDotNXB4O2JvcmRlci13aWR0aDowIDVweCA1cHg7Ym9yZGVyLWJvdHRvbS1jb2xvcjojMDAwfS50b29sdGlwLmJvdHRvbS1yaWdodCAudG9vbHRpcC1hcnJvd3t0b3A6MDtsZWZ0OjVweDttYXJnaW4tdG9wOi01cHg7Ym9yZGVyLXdpZHRoOjAgNXB4IDVweDtib3JkZXItYm90dG9tLWNvbG9yOiMwMDB9LnBvcG92ZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3otaW5kZXg6MTA2MDtkaXNwbGF5Om5vbmU7bWF4LXdpZHRoOjI3NnB4O3BhZGRpbmc6MXB4O2ZvbnQtZmFtaWx5OiJIZWx2ZXRpY2EgTmV1ZSIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7dGV4dC1hbGlnbjpsZWZ0O3RleHQtYWxpZ246c3RhcnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1zaGFkb3c6bm9uZTt0ZXh0LXRyYW5zZm9ybTpub25lO2xldHRlci1zcGFjaW5nOm5vcm1hbDt3b3JkLWJyZWFrOm5vcm1hbDt3b3JkLXNwYWNpbmc6bm9ybWFsO3dvcmQtd3JhcDpub3JtYWw7d2hpdGUtc3BhY2U6bm9ybWFsO2JhY2tncm91bmQtY29sb3I6I2ZmZjstd2Via2l0LWJhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMik7Ym9yZGVyLXJhZGl1czo2cHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgNXB4IDEwcHggcmdiYSgwLDAsMCwuMik7Ym94LXNoYWRvdzowIDVweCAxMHB4IHJnYmEoMCwwLDAsLjIpO2xpbmUtYnJlYWs6YXV0b30ucG9wb3Zlci50b3B7bWFyZ2luLXRvcDotMTBweH0ucG9wb3Zlci5yaWdodHttYXJnaW4tbGVmdDoxMHB4fS5wb3BvdmVyLmJvdHRvbXttYXJnaW4tdG9wOjEwcHh9LnBvcG92ZXIubGVmdHttYXJnaW4tbGVmdDotMTBweH0ucG9wb3Zlci10aXRsZXtwYWRkaW5nOjhweCAxNHB4O21hcmdpbjowO2ZvbnQtc2l6ZToxNHB4O2JhY2tncm91bmQtY29sb3I6I2Y3ZjdmNztib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2JvcmRlci1yYWRpdXM6NXB4IDVweCAwIDB9LnBvcG92ZXItY29udGVudHtwYWRkaW5nOjlweCAxNHB4fS5wb3BvdmVyPi5hcnJvdywucG9wb3Zlcj4uYXJyb3c6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jazt3aWR0aDowO2hlaWdodDowO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItc3R5bGU6c29saWR9LnBvcG92ZXI+LmFycm93e2JvcmRlci13aWR0aDoxMXB4fS5wb3BvdmVyPi5hcnJvdzphZnRlcntjb250ZW50OiIiO2JvcmRlci13aWR0aDoxMHB4fS5wb3BvdmVyLnRvcD4uYXJyb3d7Ym90dG9tOi0xMXB4O2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi0xMXB4O2JvcmRlci10b3AtY29sb3I6Izk5OTtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjI1KTtib3JkZXItYm90dG9tLXdpZHRoOjB9LnBvcG92ZXIudG9wPi5hcnJvdzphZnRlcntib3R0b206MXB4O21hcmdpbi1sZWZ0Oi0xMHB4O2NvbnRlbnQ6IiAiO2JvcmRlci10b3AtY29sb3I6I2ZmZjtib3JkZXItYm90dG9tLXdpZHRoOjB9LnBvcG92ZXIucmlnaHQ+LmFycm93e3RvcDo1MCU7bGVmdDotMTFweDttYXJnaW4tdG9wOi0xMXB4O2JvcmRlci1yaWdodC1jb2xvcjojOTk5O2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4yNSk7Ym9yZGVyLWxlZnQtd2lkdGg6MH0ucG9wb3Zlci5yaWdodD4uYXJyb3c6YWZ0ZXJ7Ym90dG9tOi0xMHB4O2xlZnQ6MXB4O2NvbnRlbnQ6IiAiO2JvcmRlci1yaWdodC1jb2xvcjojZmZmO2JvcmRlci1sZWZ0LXdpZHRoOjB9LnBvcG92ZXIuYm90dG9tPi5hcnJvd3t0b3A6LTExcHg7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LTExcHg7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1ib3R0b20tY29sb3I6Izk5OTtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjI1KX0ucG9wb3Zlci5ib3R0b20+LmFycm93OmFmdGVye3RvcDoxcHg7bWFyZ2luLWxlZnQ6LTEwcHg7Y29udGVudDoiICI7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1ib3R0b20tY29sb3I6I2ZmZn0ucG9wb3Zlci5sZWZ0Pi5hcnJvd3t0b3A6NTAlO3JpZ2h0Oi0xMXB4O21hcmdpbi10b3A6LTExcHg7Ym9yZGVyLXJpZ2h0LXdpZHRoOjA7Ym9yZGVyLWxlZnQtY29sb3I6Izk5OTtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9LnBvcG92ZXIubGVmdD4uYXJyb3c6YWZ0ZXJ7cmlnaHQ6MXB4O2JvdHRvbTotMTBweDtjb250ZW50OiIgIjtib3JkZXItcmlnaHQtd2lkdGg6MDtib3JkZXItbGVmdC1jb2xvcjojZmZmfS5jYXJvdXNlbHtwb3NpdGlvbjpyZWxhdGl2ZX0uY2Fyb3VzZWwtaW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW59LmNhcm91c2VsLWlubmVyPi5pdGVte3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6bm9uZTstd2Via2l0LXRyYW5zaXRpb246LjZzIGVhc2UtaW4tb3V0IGxlZnQ7LW8tdHJhbnNpdGlvbjouNnMgZWFzZS1pbi1vdXQgbGVmdDt0cmFuc2l0aW9uOi42cyBlYXNlLWluLW91dCBsZWZ0fS5jYXJvdXNlbC1pbm5lcj4uaXRlbT5hPmltZywuY2Fyb3VzZWwtaW5uZXI+Lml0ZW0+aW1ne2xpbmUtaGVpZ2h0OjF9QG1lZGlhIGFsbCBhbmQgKHRyYW5zZm9ybS0zZCksKC13ZWJraXQtdHJhbnNmb3JtLTNkKXsuY2Fyb3VzZWwtaW5uZXI+Lml0ZW17LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC42cyBlYXNlLWluLW91dDstby10cmFuc2l0aW9uOi1vLXRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0Oy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC1wZXJzcGVjdGl2ZToxMDAwcHg7cGVyc3BlY3RpdmU6MTAwMHB4fS5jYXJvdXNlbC1pbm5lcj4uaXRlbS5hY3RpdmUucmlnaHQsLmNhcm91c2VsLWlubmVyPi5pdGVtLm5leHR7bGVmdDowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApfS5jYXJvdXNlbC1pbm5lcj4uaXRlbS5hY3RpdmUubGVmdCwuY2Fyb3VzZWwtaW5uZXI+Lml0ZW0ucHJldntsZWZ0OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX0uY2Fyb3VzZWwtaW5uZXI+Lml0ZW0uYWN0aXZlLC5jYXJvdXNlbC1pbm5lcj4uaXRlbS5uZXh0LmxlZnQsLmNhcm91c2VsLWlubmVyPi5pdGVtLnByZXYucmlnaHR7bGVmdDowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfX0uY2Fyb3VzZWwtaW5uZXI+LmFjdGl2ZSwuY2Fyb3VzZWwtaW5uZXI+Lm5leHQsLmNhcm91c2VsLWlubmVyPi5wcmV2e2Rpc3BsYXk6YmxvY2t9LmNhcm91c2VsLWlubmVyPi5hY3RpdmV7bGVmdDowfS5jYXJvdXNlbC1pbm5lcj4ubmV4dCwuY2Fyb3VzZWwtaW5uZXI+LnByZXZ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7d2lkdGg6MTAwJX0uY2Fyb3VzZWwtaW5uZXI+Lm5leHR7bGVmdDoxMDAlfS5jYXJvdXNlbC1pbm5lcj4ucHJldntsZWZ0Oi0xMDAlfS5jYXJvdXNlbC1pbm5lcj4ubmV4dC5sZWZ0LC5jYXJvdXNlbC1pbm5lcj4ucHJldi5yaWdodHtsZWZ0OjB9LmNhcm91c2VsLWlubmVyPi5hY3RpdmUubGVmdHtsZWZ0Oi0xMDAlfS5jYXJvdXNlbC1pbm5lcj4uYWN0aXZlLnJpZ2h0e2xlZnQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7d2lkdGg6MTUlO2ZvbnQtc2l6ZToyMHB4O2NvbG9yOiNmZmY7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1zaGFkb3c6MCAxcHggMnB4IHJnYmEoMCwwLDAsLjYpO2ZpbHRlcjphbHBoYShvcGFjaXR5PTUwKTtvcGFjaXR5Oi41fS5jYXJvdXNlbC1jb250cm9sLmxlZnR7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LHJnYmEoMCwwLDAsLjUpIDAscmdiYSgwLDAsMCwuMDAwMSkgMTAwJSk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQobGVmdCxyZ2JhKDAsMCwwLC41KSAwLHJnYmEoMCwwLDAsLjAwMDEpIDEwMCUpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AscmlnaHQgdG9wLGZyb20ocmdiYSgwLDAsMCwuNSkpLHRvKHJnYmEoMCwwLDAsLjAwMDEpKSk7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQscmdiYSgwLDAsMCwuNSkgMCxyZ2JhKDAsMCwwLC4wMDAxKSAxMDAlKTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyM4MDAwMDAwMCcsIGVuZENvbG9yc3RyPScjMDAwMDAwMDAnLCBHcmFkaWVudFR5cGU9MSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LmNhcm91c2VsLWNvbnRyb2wucmlnaHR7cmlnaHQ6MDtsZWZ0OmF1dG87YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQobGVmdCxyZ2JhKDAsMCwwLC4wMDAxKSAwLHJnYmEoMCwwLDAsLjUpIDEwMCUpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AscmlnaHQgdG9wLGZyb20ocmdiYSgwLDAsMCwuMDAwMSkpLHRvKHJnYmEoMCwwLDAsLjUpKSk7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQscmdiYSgwLDAsMCwuMDAwMSkgMCxyZ2JhKDAsMCwwLC41KSAxMDAlKTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyMwMDAwMDAwMCcsIGVuZENvbG9yc3RyPScjODAwMDAwMDAnLCBHcmFkaWVudFR5cGU9MSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LmNhcm91c2VsLWNvbnRyb2w6Zm9jdXMsLmNhcm91c2VsLWNvbnRyb2w6aG92ZXJ7Y29sb3I6I2ZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtmaWx0ZXI6YWxwaGEob3BhY2l0eT05MCk7b3V0bGluZTowO29wYWNpdHk6Ljl9LmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0LC5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHQsLmNhcm91c2VsLWNvbnRyb2wgLmljb24tcHJldntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO3otaW5kZXg6NTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tdG9wOi0xMHB4fS5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LC5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXZ7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LTEwcHh9LmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0LC5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHR7cmlnaHQ6NTAlO21hcmdpbi1yaWdodDotMTBweH0uY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1uZXh0LC5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXZ7d2lkdGg6MjBweDtoZWlnaHQ6MjBweDtmb250LWZhbWlseTpzZXJpZjtsaW5lLWhlaWdodDoxfS5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXY6YmVmb3Jle2NvbnRlbnQ6J1wyMDM5J30uY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1uZXh0OmJlZm9yZXtjb250ZW50OidcMjAzYSd9LmNhcm91c2VsLWluZGljYXRvcnN7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjEwcHg7bGVmdDo1MCU7ei1pbmRleDoxNTt3aWR0aDo2MCU7cGFkZGluZy1sZWZ0OjA7bWFyZ2luLWxlZnQ6LTMwJTt0ZXh0LWFsaWduOmNlbnRlcjtsaXN0LXN0eWxlOm5vbmV9LmNhcm91c2VsLWluZGljYXRvcnMgbGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTBweDtoZWlnaHQ6MTBweDttYXJnaW46MXB4O3RleHQtaW5kZW50Oi05OTlweDtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDBcOTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMCk7Ym9yZGVyOjFweCBzb2xpZCAjZmZmO2JvcmRlci1yYWRpdXM6MTBweH0uY2Fyb3VzZWwtaW5kaWNhdG9ycyAuYWN0aXZle3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7bWFyZ2luOjA7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5jYXJvdXNlbC1jYXB0aW9ue3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjE1JTtib3R0b206MjBweDtsZWZ0OjE1JTt6LWluZGV4OjEwO3BhZGRpbmctdG9wOjIwcHg7cGFkZGluZy1ib3R0b206MjBweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3RleHQtc2hhZG93OjAgMXB4IDJweCByZ2JhKDAsMCwwLC42KX0uY2Fyb3VzZWwtY2FwdGlvbiAuYnRue3RleHQtc2hhZG93Om5vbmV9QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsLmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0LC5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHQsLmNhcm91c2VsLWNvbnRyb2wgLmljb24tcHJldnt3aWR0aDozMHB4O2hlaWdodDozMHB4O21hcmdpbi10b3A6LTE1cHg7Zm9udC1zaXplOjMwcHh9LmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsLmNhcm91c2VsLWNvbnRyb2wgLmljb24tcHJldnttYXJnaW4tbGVmdDotMTVweH0uY2Fyb3VzZWwtY29udHJvbCAuZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQsLmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dHttYXJnaW4tcmlnaHQ6LTE1cHh9LmNhcm91c2VsLWNhcHRpb257cmlnaHQ6MjAlO2xlZnQ6MjAlO3BhZGRpbmctYm90dG9tOjMwcHh9LmNhcm91c2VsLWluZGljYXRvcnN7Ym90dG9tOjIwcHh9fS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDphZnRlciwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA6YmVmb3JlLC5idG4tdG9vbGJhcjphZnRlciwuYnRuLXRvb2xiYXI6YmVmb3JlLC5jbGVhcmZpeDphZnRlciwuY2xlYXJmaXg6YmVmb3JlLC5jb250YWluZXItZmx1aWQ6YWZ0ZXIsLmNvbnRhaW5lci1mbHVpZDpiZWZvcmUsLmNvbnRhaW5lcjphZnRlciwuY29udGFpbmVyOmJlZm9yZSwuZGwtaG9yaXpvbnRhbCBkZDphZnRlciwuZGwtaG9yaXpvbnRhbCBkZDpiZWZvcmUsLmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cDphZnRlciwuZm9ybS1ob3Jpem9udGFsIC5mb3JtLWdyb3VwOmJlZm9yZSwubW9kYWwtZm9vdGVyOmFmdGVyLC5tb2RhbC1mb290ZXI6YmVmb3JlLC5uYXY6YWZ0ZXIsLm5hdjpiZWZvcmUsLm5hdmJhci1jb2xsYXBzZTphZnRlciwubmF2YmFyLWNvbGxhcHNlOmJlZm9yZSwubmF2YmFyLWhlYWRlcjphZnRlciwubmF2YmFyLWhlYWRlcjpiZWZvcmUsLm5hdmJhcjphZnRlciwubmF2YmFyOmJlZm9yZSwucGFnZXI6YWZ0ZXIsLnBhZ2VyOmJlZm9yZSwucGFuZWwtYm9keTphZnRlciwucGFuZWwtYm9keTpiZWZvcmUsLnJvdzphZnRlciwucm93OmJlZm9yZXtkaXNwbGF5OnRhYmxlO2NvbnRlbnQ6IiAifS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDphZnRlciwuYnRuLXRvb2xiYXI6YWZ0ZXIsLmNsZWFyZml4OmFmdGVyLC5jb250YWluZXItZmx1aWQ6YWZ0ZXIsLmNvbnRhaW5lcjphZnRlciwuZGwtaG9yaXpvbnRhbCBkZDphZnRlciwuZm9ybS1ob3Jpem9udGFsIC5mb3JtLWdyb3VwOmFmdGVyLC5tb2RhbC1mb290ZXI6YWZ0ZXIsLm5hdjphZnRlciwubmF2YmFyLWNvbGxhcHNlOmFmdGVyLC5uYXZiYXItaGVhZGVyOmFmdGVyLC5uYXZiYXI6YWZ0ZXIsLnBhZ2VyOmFmdGVyLC5wYW5lbC1ib2R5OmFmdGVyLC5yb3c6YWZ0ZXJ7Y2xlYXI6Ym90aH0uY2VudGVyLWJsb2Nre2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6YXV0b30ucHVsbC1yaWdodHtmbG9hdDpyaWdodCFpbXBvcnRhbnR9LnB1bGwtbGVmdHtmbG9hdDpsZWZ0IWltcG9ydGFudH0uaGlkZXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS5zaG93e2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fS5pbnZpc2libGV7dmlzaWJpbGl0eTpoaWRkZW59LnRleHQtaGlkZXtmb250OjAvMCBhO2NvbG9yOnRyYW5zcGFyZW50O3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MH0uaGlkZGVue2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LmFmZml4e3Bvc2l0aW9uOmZpeGVkfUAtbXMtdmlld3BvcnR7d2lkdGg6ZGV2aWNlLXdpZHRofS52aXNpYmxlLWxnLC52aXNpYmxlLW1kLC52aXNpYmxlLXNtLC52aXNpYmxlLXhze2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnZpc2libGUtbGctYmxvY2ssLnZpc2libGUtbGctaW5saW5lLC52aXNpYmxlLWxnLWlubGluZS1ibG9jaywudmlzaWJsZS1tZC1ibG9jaywudmlzaWJsZS1tZC1pbmxpbmUsLnZpc2libGUtbWQtaW5saW5lLWJsb2NrLC52aXNpYmxlLXNtLWJsb2NrLC52aXNpYmxlLXNtLWlubGluZSwudmlzaWJsZS1zbS1pbmxpbmUtYmxvY2ssLnZpc2libGUteHMtYmxvY2ssLnZpc2libGUteHMtaW5saW5lLC52aXNpYmxlLXhzLWlubGluZS1ibG9ja3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsudmlzaWJsZS14c3tkaXNwbGF5OmJsb2NrIWltcG9ydGFudH10YWJsZS52aXNpYmxlLXhze2Rpc3BsYXk6dGFibGUhaW1wb3J0YW50fXRyLnZpc2libGUteHN7ZGlzcGxheTp0YWJsZS1yb3chaW1wb3J0YW50fXRkLnZpc2libGUteHMsdGgudmlzaWJsZS14c3tkaXNwbGF5OnRhYmxlLWNlbGwhaW1wb3J0YW50fX1AbWVkaWEgKG1heC13aWR0aDo3NjdweCl7LnZpc2libGUteHMtYmxvY2t7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsudmlzaWJsZS14cy1pbmxpbmV7ZGlzcGxheTppbmxpbmUhaW1wb3J0YW50fX1AbWVkaWEgKG1heC13aWR0aDo3NjdweCl7LnZpc2libGUteHMtaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudmlzaWJsZS1zbXtkaXNwbGF5OmJsb2NrIWltcG9ydGFudH10YWJsZS52aXNpYmxlLXNte2Rpc3BsYXk6dGFibGUhaW1wb3J0YW50fXRyLnZpc2libGUtc217ZGlzcGxheTp0YWJsZS1yb3chaW1wb3J0YW50fXRkLnZpc2libGUtc20sdGgudmlzaWJsZS1zbXtkaXNwbGF5OnRhYmxlLWNlbGwhaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCkgYW5kIChtYXgtd2lkdGg6OTkxcHgpey52aXNpYmxlLXNtLWJsb2Nre2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCkgYW5kIChtYXgtd2lkdGg6OTkxcHgpey52aXNpYmxlLXNtLWlubGluZXtkaXNwbGF5OmlubGluZSFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KSBhbmQgKG1heC13aWR0aDo5OTFweCl7LnZpc2libGUtc20taW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpIGFuZCAobWF4LXdpZHRoOjExOTlweCl7LnZpc2libGUtbWR7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9dGFibGUudmlzaWJsZS1tZHtkaXNwbGF5OnRhYmxlIWltcG9ydGFudH10ci52aXNpYmxlLW1ke2Rpc3BsYXk6dGFibGUtcm93IWltcG9ydGFudH10ZC52aXNpYmxlLW1kLHRoLnZpc2libGUtbWR7ZGlzcGxheTp0YWJsZS1jZWxsIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpIGFuZCAobWF4LXdpZHRoOjExOTlweCl7LnZpc2libGUtbWQtYmxvY2t7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjk5MnB4KSBhbmQgKG1heC13aWR0aDoxMTk5cHgpey52aXNpYmxlLW1kLWlubGluZXtkaXNwbGF5OmlubGluZSFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjk5MnB4KSBhbmQgKG1heC13aWR0aDoxMTk5cHgpey52aXNpYmxlLW1kLWlubGluZS1ibG9ja3tkaXNwbGF5OmlubGluZS1ibG9jayFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7LnZpc2libGUtbGd7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9dGFibGUudmlzaWJsZS1sZ3tkaXNwbGF5OnRhYmxlIWltcG9ydGFudH10ci52aXNpYmxlLWxne2Rpc3BsYXk6dGFibGUtcm93IWltcG9ydGFudH10ZC52aXNpYmxlLWxnLHRoLnZpc2libGUtbGd7ZGlzcGxheTp0YWJsZS1jZWxsIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6MTIwMHB4KXsudmlzaWJsZS1sZy1ibG9ja3tkaXNwbGF5OmJsb2NrIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6MTIwMHB4KXsudmlzaWJsZS1sZy1pbmxpbmV7ZGlzcGxheTppbmxpbmUhaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDoxMjAwcHgpey52aXNpYmxlLWxnLWlubGluZS1ibG9ja3tkaXNwbGF5OmlubGluZS1ibG9jayFpbXBvcnRhbnR9fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsuaGlkZGVuLXhze2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KSBhbmQgKG1heC13aWR0aDo5OTFweCl7LmhpZGRlbi1zbXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCkgYW5kIChtYXgtd2lkdGg6MTE5OXB4KXsuaGlkZGVuLW1ke2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7LmhpZGRlbi1sZ3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX0udmlzaWJsZS1wcmludHtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fUBtZWRpYSBwcmludHsudmlzaWJsZS1wcmludHtkaXNwbGF5OmJsb2NrIWltcG9ydGFudH10YWJsZS52aXNpYmxlLXByaW50e2Rpc3BsYXk6dGFibGUhaW1wb3J0YW50fXRyLnZpc2libGUtcHJpbnR7ZGlzcGxheTp0YWJsZS1yb3chaW1wb3J0YW50fXRkLnZpc2libGUtcHJpbnQsdGgudmlzaWJsZS1wcmludHtkaXNwbGF5OnRhYmxlLWNlbGwhaW1wb3J0YW50fX0udmlzaWJsZS1wcmludC1ibG9ja3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fUBtZWRpYSBwcmludHsudmlzaWJsZS1wcmludC1ibG9ja3tkaXNwbGF5OmJsb2NrIWltcG9ydGFudH19LnZpc2libGUtcHJpbnQtaW5saW5le2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9QG1lZGlhIHByaW50ey52aXNpYmxlLXByaW50LWlubGluZXtkaXNwbGF5OmlubGluZSFpbXBvcnRhbnR9fS52aXNpYmxlLXByaW50LWlubGluZS1ibG9ja3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fUBtZWRpYSBwcmludHsudmlzaWJsZS1wcmludC1pbmxpbmUtYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2shaW1wb3J0YW50fX1AbWVkaWEgcHJpbnR7LmhpZGRlbi1wcmludHtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX0= "></style>
<style id=" ol_theme_index.css " src="data:/text/plain;base64,I21hcHtwb3NpdGlvbjpyZWxhdGl2ZTtoZWlnaHQ6MTIwcHh9I3RhZ2xpbmV7cGFkZGluZy1sZWZ0OjI1JTttYXJnaW4tYm90dG9tOjEwcHh9I3RhZ2xpbmUgcHtmb250LXNpemU6MTUwJTtmb250LXN0eWxlOml0YWxpY30jbmV3c3tjbGVhcjpib3RoO2JvcmRlcjoxcHggc29saWQgI2VlZTtiYWNrZ3JvdW5kLWNvbG9yOiNmOGY4Zjg7Ym9yZGVyLXJhZGl1czoycHg7cGFkZGluZzoxNXB4IDIwcHggNXB4O21hcmdpbjowIDE1cHg7d2lkdGg6OTUlfSNuZXdzIGgxe21hcmdpbjowfWltZy50aHVtYntmbG9hdDpyaWdodDttYXJnaW4tbGVmdDoxMHB4fS5vbC1vdmVybGF5Y29udGFpbmVyLXN0b3BldmVudHtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgMzAwbXMgZWFzZTstbW96LXRyYW5zaXRpb246b3BhY2l0eSAzMDBtcyBlYXNlOy1tcy10cmFuc2l0aW9uOm9wYWNpdHkgMzAwbXMgZWFzZTstby10cmFuc2l0aW9uOm9wYWNpdHkgMzAwbXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgMzAwbXMgZWFzZX0ub3ZlciAub2wtb3ZlcmxheWNvbnRhaW5lci1zdG9wZXZlbnR7b3BhY2l0eToxfXVsLnNwb25zb3Jze2JhY2tncm91bmQtY29sb3I6I2Y4ZjhmOH0="></style>

<style id=" ol_themesite.css " src="data:/text/plain;base64,Ym9keXtmb250LWZhbWlseTonUXVhdHRyb2NlbnRvIFNhbnMnLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHg7cGFkZGluZy10b3A6NTBweH0ubmF2YmFye2JhY2tncm91bmQtY29sb3I6IzFmNmI3NTtjb2xvcjp3aGl0ZTt0ZXh0LXNoYWRvdzoxcHggMXB4IDJweCByZ2JhKDAsMCwwLDAuMjUpfS5uYXZiYXItdG9nZ2xle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm5hdmJhci10b2dnbGUgLmljb24tYmFye2JhY2tncm91bmQtY29sb3I6d2hpdGV9Lm5hdmJhci1icmFuZHtjb2xvcjp3aGl0ZTtmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxNjAlO3BhZGRpbmc6OHB4IDA7bWF4LXdpZHRoOjI1MHB4fS5uYXZiYXItYnJhbmQgaW1ne2hlaWdodDozNXB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6NXB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5uYXZiYXItYnJhbmQ6aG92ZXIsLm5hdmJhci1icmFuZDpmb2N1c3tjb2xvcjojYWFlMWU5fS5uYXZiYXItbmF2PmxpPmF7Y29sb3I6d2hpdGV9Lm5hdj5saT5hOmhvdmVyLC5uYXY+bGk+YTpmb2N1cywubmF2PmxpPmEuYWN0aXZle2JhY2tncm91bmQtY29sb3I6IzI2ODU5MX0ubmF2YmFyLW5hdj5saT5hOmhvdmVyLC5uYXZiYXItbmF2PmxpPmE6Zm9jdXMsZm9vdGVyIGE6aG92ZXIsZm9vdGVyIGE6Zm9jdXN7Y29sb3I6d2hpdGV9OnRhcmdldDpiZWZvcmV7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO2hlaWdodDo1MHB4O21hcmdpbi10b3A6LTUwcHh9aDEsaDIsaDMsaDQsaDUsaDYsLmgxLC5oMiwuaDMsLmg0LC5oNSwuaDZ7Zm9udC1mYW1pbHk6J1F1YXR0cm9jZW50byBTYW5zJyxzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0OjcwMH1oMXttYXJnaW4tdG9wOjQwcHg7bWFyZ2luLWJvdHRvbTozMHB4fWgxLnRvcGlje2ZvbnQtc2l6ZToxMTAlO2NvbG9yOiNiYmI7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO21hcmdpbi10b3A6MzBweDttYXJnaW4tYm90dG9tOjB9YXtjb2xvcjojMDM4OTljO3RleHQtZGVjb3JhdGlvbjpub25lfWE6aG92ZXIsYTpmb2N1cyxmb290ZXIgYTpob3Zlcixmb290ZXIgYTpmb2N1c3tjb2xvcjojZmY3YTAwO3RleHQtZGVjb3JhdGlvbjpub25lfWEuYmlnLWxpbmt7cGFkZGluZzowIDEwcHg7bWFyZ2luOjVweCAwO2JvcmRlcjoxcHggc29saWQgI2ZmZjtib3JkZXItcmFkaXVzOjJweDtkaXNwbGF5OmJsb2NrO2NvbG9yOmluaGVyaXR9YS5iaWctbGluayBoM3ttYXJnaW4tdG9wOjEwcHg7Y29sb3I6IzFmNmI3NX1hLmJpZy1saW5rOmhvdmVyLGEuYmlnLWxpbms6Zm9jdXN7Ym9yZGVyLWNvbG9yOiNlZWU7Y29sb3I6IzAzODk5YztiYWNrZ3JvdW5kLWNvbG9yOiNmOGY4Zjh9YmxvY2txdW90ZS5wbGFpbntib3JkZXI6bm9uZX1mb290ZXJ7YmFja2dyb3VuZC1jb2xvcjojMWY2Yjc1O2NvbG9yOndoaXRlO21hcmdpbi10b3A6NDBweDtwYWRkaW5nOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXJ9Zm9vdGVyIGF7Y29sb3I6I2FhZTFlOX1wcmUgY29kZXtjb2xvcjojNjU3YjgzfXByZSAuY29tbWVudCxwcmUgLnRlbXBsYXRlX2NvbW1lbnQscHJlIC5kaWZmIC5oZWFkZXIscHJlIC5qYXZhZG9je2NvbG9yOiM5OTg7Zm9udC1zdHlsZTppdGFsaWN9cHJlIC5rZXl3b3JkLHByZSAuY3NzIC5ydWxlIC5rZXl3b3JkLHByZSAud2ludXRpbHMscHJlIC5qYXZhc2NyaXB0IC50aXRsZSxwcmUgLm5naW54IC50aXRsZSxwcmUgLnN1YnN0LHByZSAucmVxdWVzdCxwcmUgLnN0YXR1c3tjb2xvcjojMzMzO2ZvbnQtd2VpZ2h0OmJvbGR9cHJlIC5udW1iZXIscHJlIC5oZXhjb2xvcixwcmUgLnJ1YnkgLmNvbnN0YW50e2NvbG9yOiMwOTl9cHJlIC5zdHJpbmcscHJlIC50YWcgLnZhbHVlLHByZSAucGhwZG9jLHByZSAudGV4IC5mb3JtdWxhe2NvbG9yOiNkMTR9cHJlIC50aXRsZSxwcmUgLmlkLHByZSAuY29mZmVlc2NyaXB0IC5wYXJhbXMscHJlIC5zY3NzIC5wcmVwcm9jZXNzb3J7Y29sb3I6IzkwMDtmb250LXdlaWdodDpib2xkfXByZSAuamF2YXNjcmlwdCAudGl0bGUscHJlIC5saXNwIC50aXRsZSxwcmUgLmNsb2p1cmUgLnRpdGxlLHByZSAuc3Vic3R7Zm9udC13ZWlnaHQ6bm9ybWFsfXByZSAuY2xhc3MgLnRpdGxlLHByZSAuaGFza2VsbCAudHlwZSxwcmUgLnZoZGwgLmxpdGVyYWwscHJlIC50ZXggLmNvbW1hbmR7Y29sb3I6IzQ1ODtmb250LXdlaWdodDpib2xkfXByZSAudGFnLHByZSAudGFnIC50aXRsZSxwcmUgLnJ1bGVzIC5wcm9wZXJ0eSxwcmUgLmRqYW5nbyAudGFnIC5rZXl3b3Jke2NvbG9yOiMwMDAwODA7Zm9udC13ZWlnaHQ6bm9ybWFsfXByZSAuYXR0cmlidXRlLHByZSAudmFyaWFibGUscHJlIC5saXNwIC5ib2R5e2NvbG9yOiMwMDgwODB9cHJlIC5yZWdleHB7Y29sb3I6IzAwOTkyNn1wcmUgLmNsYXNze2NvbG9yOiM0NTg7Zm9udC13ZWlnaHQ6Ym9sZH1wcmUgLnN5bWJvbCxwcmUgLnJ1YnkgLnN5bWJvbCAuc3RyaW5nLHByZSAubGlzcCAua2V5d29yZCxwcmUgLnRleCAuc3BlY2lhbCxwcmUgLnByb21wdHtjb2xvcjojOTkwMDczfXByZSAuYnVpbHRfaW4scHJlIC5saXNwIC50aXRsZSxwcmUgLmNsb2p1cmUgLmJ1aWx0X2lue2NvbG9yOiMwMDg2YjN9cHJlIC5wcmVwcm9jZXNzb3IscHJlIC5waSxwcmUgLmRvY3R5cGUscHJlIC5zaGViYW5nLHByZSAuY2RhdGF7Y29sb3I6Izk5OTtmb250LXdlaWdodDpib2xkfXByZSAuZGVsZXRpb257YmFja2dyb3VuZDojZmRkfXByZSAuYWRkaXRpb257YmFja2dyb3VuZDojZGZkfXByZSAuZGlmZiAuY2hhbmdle2JhY2tncm91bmQ6IzAwODZiM31wcmUgLmNodW5re2NvbG9yOiNhYWF9"></style>

<style id=" ol_fontawesomemin.css " src="data:/text/plain;base64,LyohCiAqICBGb250IEF3ZXNvbWUgNC40LjAgYnkgQGRhdmVnYW5keSAtIGh0dHA6Ly9mb250YXdlc29tZS5pbyAtIEBmb250YXdlc29tZQogKiAgTGljZW5zZSAtIGh0dHA6Ly9mb250YXdlc29tZS5pby9saWNlbnNlIChGb250OiBTSUwgT0ZMIDEuMSwgQ1NTOiBNSVQgTGljZW5zZSkKICovQGZvbnQtZmFjZXtmb250LWZhbWlseTonRm9udEF3ZXNvbWUnO3NyYzp1cmwoJy4uL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQuZW90P3Y9NC40LjAnKTtzcmM6dXJsKCcuLi9mb250cy9mb250YXdlc29tZS13ZWJmb250LmVvdD8jaWVmaXgmdj00LjQuMCcpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSx1cmwoJy4uL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQud29mZjI/dj00LjQuMCcpIGZvcm1hdCgnd29mZjInKSx1cmwoJy4uL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQud29mZj92PTQuNC4wJykgZm9ybWF0KCd3b2ZmJyksdXJsKCcuLi9mb250cy9mb250YXdlc29tZS13ZWJmb250LnR0Zj92PTQuNC4wJykgZm9ybWF0KCd0cnVldHlwZScpLHVybCgnLi4vZm9udHMvZm9udGF3ZXNvbWUtd2ViZm9udC5zdmc/dj00LjQuMCNmb250YXdlc29tZXJlZ3VsYXInKSBmb3JtYXQoJ3N2ZycpO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbH0uZmF7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udDpub3JtYWwgbm9ybWFsIG5vcm1hbCAxNHB4LzEgRm9udEF3ZXNvbWU7Zm9udC1zaXplOmluaGVyaXQ7dGV4dC1yZW5kZXJpbmc6YXV0bzstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0uZmEtbGd7Zm9udC1zaXplOjEuMzMzMzMzMzNlbTtsaW5lLWhlaWdodDouNzVlbTt2ZXJ0aWNhbC1hbGlnbjotMTUlfS5mYS0yeHtmb250LXNpemU6MmVtfS5mYS0zeHtmb250LXNpemU6M2VtfS5mYS00eHtmb250LXNpemU6NGVtfS5mYS01eHtmb250LXNpemU6NWVtfS5mYS1md3t3aWR0aDoxLjI4NTcxNDI5ZW07dGV4dC1hbGlnbjpjZW50ZXJ9LmZhLXVse3BhZGRpbmctbGVmdDowO21hcmdpbi1sZWZ0OjIuMTQyODU3MTRlbTtsaXN0LXN0eWxlLXR5cGU6bm9uZX0uZmEtdWw+bGl7cG9zaXRpb246cmVsYXRpdmV9LmZhLWxpe3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTIuMTQyODU3MTRlbTt3aWR0aDoyLjE0Mjg1NzE0ZW07dG9wOi4xNDI4NTcxNGVtO3RleHQtYWxpZ246Y2VudGVyfS5mYS1saS5mYS1sZ3tsZWZ0Oi0xLjg1NzE0Mjg2ZW19LmZhLWJvcmRlcntwYWRkaW5nOi4yZW0gLjI1ZW0gLjE1ZW07Ym9yZGVyOnNvbGlkIC4wOGVtICNlZWU7Ym9yZGVyLXJhZGl1czouMWVtfS5mYS1wdWxsLWxlZnR7ZmxvYXQ6bGVmdH0uZmEtcHVsbC1yaWdodHtmbG9hdDpyaWdodH0uZmEuZmEtcHVsbC1sZWZ0e21hcmdpbi1yaWdodDouM2VtfS5mYS5mYS1wdWxsLXJpZ2h0e21hcmdpbi1sZWZ0Oi4zZW19LnB1bGwtcmlnaHR7ZmxvYXQ6cmlnaHR9LnB1bGwtbGVmdHtmbG9hdDpsZWZ0fS5mYS5wdWxsLWxlZnR7bWFyZ2luLXJpZ2h0Oi4zZW19LmZhLnB1bGwtcmlnaHR7bWFyZ2luLWxlZnQ6LjNlbX0uZmEtc3Bpbnstd2Via2l0LWFuaW1hdGlvbjpmYS1zcGluIDJzIGluZmluaXRlIGxpbmVhcjthbmltYXRpb246ZmEtc3BpbiAycyBpbmZpbml0ZSBsaW5lYXJ9LmZhLXB1bHNley13ZWJraXQtYW5pbWF0aW9uOmZhLXNwaW4gMXMgaW5maW5pdGUgc3RlcHMoOCk7YW5pbWF0aW9uOmZhLXNwaW4gMXMgaW5maW5pdGUgc3RlcHMoOCl9QC13ZWJraXQta2V5ZnJhbWVzIGZhLXNwaW57MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzU5ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM1OWRlZyl9fUBrZXlmcmFtZXMgZmEtc3BpbnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNTlkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzU5ZGVnKX19LmZhLXJvdGF0ZS05MHtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkJhc2ljSW1hZ2Uocm90YXRpb249MSk7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDkwZGVnKTstbXMtdHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9LmZhLXJvdGF0ZS0xODB7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTIpOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpOy1tcy10cmFuc2Zvcm06cm90YXRlKDE4MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfS5mYS1yb3RhdGUtMjcwe2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0zKTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMjcwZGVnKTstbXMtdHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMjcwZGVnKX0uZmEtZmxpcC1ob3Jpem9udGFse2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0wLCBtaXJyb3I9MSk7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLTEsIDEpOy1tcy10cmFuc2Zvcm06c2NhbGUoLTEsIDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwgMSl9LmZhLWZsaXAtdmVydGljYWx7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTIsIG1pcnJvcj0xKTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLCAtMSk7LW1zLXRyYW5zZm9ybTpzY2FsZSgxLCAtMSk7dHJhbnNmb3JtOnNjYWxlKDEsIC0xKX06cm9vdCAuZmEtcm90YXRlLTkwLDpyb290IC5mYS1yb3RhdGUtMTgwLDpyb290IC5mYS1yb3RhdGUtMjcwLDpyb290IC5mYS1mbGlwLWhvcml6b250YWwsOnJvb3QgLmZhLWZsaXAtdmVydGljYWx7ZmlsdGVyOm5vbmV9LmZhLXN0YWNre3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjJlbTtoZWlnaHQ6MmVtO2xpbmUtaGVpZ2h0OjJlbTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZhLXN0YWNrLTF4LC5mYS1zdGFjay0yeHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcn0uZmEtc3RhY2stMXh7bGluZS1oZWlnaHQ6aW5oZXJpdH0uZmEtc3RhY2stMnh7Zm9udC1zaXplOjJlbX0uZmEtaW52ZXJzZXtjb2xvcjojZmZmfS5mYS1nbGFzczpiZWZvcmV7Y29udGVudDoiXGYwMDAifS5mYS1tdXNpYzpiZWZvcmV7Y29udGVudDoiXGYwMDEifS5mYS1zZWFyY2g6YmVmb3Jle2NvbnRlbnQ6IlxmMDAyIn0uZmEtZW52ZWxvcGUtbzpiZWZvcmV7Y29udGVudDoiXGYwMDMifS5mYS1oZWFydDpiZWZvcmV7Y29udGVudDoiXGYwMDQifS5mYS1zdGFyOmJlZm9yZXtjb250ZW50OiJcZjAwNSJ9LmZhLXN0YXItbzpiZWZvcmV7Y29udGVudDoiXGYwMDYifS5mYS11c2VyOmJlZm9yZXtjb250ZW50OiJcZjAwNyJ9LmZhLWZpbG06YmVmb3Jle2NvbnRlbnQ6IlxmMDA4In0uZmEtdGgtbGFyZ2U6YmVmb3Jle2NvbnRlbnQ6IlxmMDA5In0uZmEtdGg6YmVmb3Jle2NvbnRlbnQ6IlxmMDBhIn0uZmEtdGgtbGlzdDpiZWZvcmV7Y29udGVudDoiXGYwMGIifS5mYS1jaGVjazpiZWZvcmV7Y29udGVudDoiXGYwMGMifS5mYS1yZW1vdmU6YmVmb3JlLC5mYS1jbG9zZTpiZWZvcmUsLmZhLXRpbWVzOmJlZm9yZXtjb250ZW50OiJcZjAwZCJ9LmZhLXNlYXJjaC1wbHVzOmJlZm9yZXtjb250ZW50OiJcZjAwZSJ9LmZhLXNlYXJjaC1taW51czpiZWZvcmV7Y29udGVudDoiXGYwMTAifS5mYS1wb3dlci1vZmY6YmVmb3Jle2NvbnRlbnQ6IlxmMDExIn0uZmEtc2lnbmFsOmJlZm9yZXtjb250ZW50OiJcZjAxMiJ9LmZhLWdlYXI6YmVmb3JlLC5mYS1jb2c6YmVmb3Jle2NvbnRlbnQ6IlxmMDEzIn0uZmEtdHJhc2gtbzpiZWZvcmV7Y29udGVudDoiXGYwMTQifS5mYS1ob21lOmJlZm9yZXtjb250ZW50OiJcZjAxNSJ9LmZhLWZpbGUtbzpiZWZvcmV7Y29udGVudDoiXGYwMTYifS5mYS1jbG9jay1vOmJlZm9yZXtjb250ZW50OiJcZjAxNyJ9LmZhLXJvYWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDE4In0uZmEtZG93bmxvYWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDE5In0uZmEtYXJyb3ctY2lyY2xlLW8tZG93bjpiZWZvcmV7Y29udGVudDoiXGYwMWEifS5mYS1hcnJvdy1jaXJjbGUtby11cDpiZWZvcmV7Y29udGVudDoiXGYwMWIifS5mYS1pbmJveDpiZWZvcmV7Y29udGVudDoiXGYwMWMifS5mYS1wbGF5LWNpcmNsZS1vOmJlZm9yZXtjb250ZW50OiJcZjAxZCJ9LmZhLXJvdGF0ZS1yaWdodDpiZWZvcmUsLmZhLXJlcGVhdDpiZWZvcmV7Y29udGVudDoiXGYwMWUifS5mYS1yZWZyZXNoOmJlZm9yZXtjb250ZW50OiJcZjAyMSJ9LmZhLWxpc3QtYWx0OmJlZm9yZXtjb250ZW50OiJcZjAyMiJ9LmZhLWxvY2s6YmVmb3Jle2NvbnRlbnQ6IlxmMDIzIn0uZmEtZmxhZzpiZWZvcmV7Y29udGVudDoiXGYwMjQifS5mYS1oZWFkcGhvbmVzOmJlZm9yZXtjb250ZW50OiJcZjAyNSJ9LmZhLXZvbHVtZS1vZmY6YmVmb3Jle2NvbnRlbnQ6IlxmMDI2In0uZmEtdm9sdW1lLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxmMDI3In0uZmEtdm9sdW1lLXVwOmJlZm9yZXtjb250ZW50OiJcZjAyOCJ9LmZhLXFyY29kZTpiZWZvcmV7Y29udGVudDoiXGYwMjkifS5mYS1iYXJjb2RlOmJlZm9yZXtjb250ZW50OiJcZjAyYSJ9LmZhLXRhZzpiZWZvcmV7Y29udGVudDoiXGYwMmIifS5mYS10YWdzOmJlZm9yZXtjb250ZW50OiJcZjAyYyJ9LmZhLWJvb2s6YmVmb3Jle2NvbnRlbnQ6IlxmMDJkIn0uZmEtYm9va21hcms6YmVmb3Jle2NvbnRlbnQ6IlxmMDJlIn0uZmEtcHJpbnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDJmIn0uZmEtY2FtZXJhOmJlZm9yZXtjb250ZW50OiJcZjAzMCJ9LmZhLWZvbnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDMxIn0uZmEtYm9sZDpiZWZvcmV7Y29udGVudDoiXGYwMzIifS5mYS1pdGFsaWM6YmVmb3Jle2NvbnRlbnQ6IlxmMDMzIn0uZmEtdGV4dC1oZWlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDM0In0uZmEtdGV4dC13aWR0aDpiZWZvcmV7Y29udGVudDoiXGYwMzUifS5mYS1hbGlnbi1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjAzNiJ9LmZhLWFsaWduLWNlbnRlcjpiZWZvcmV7Y29udGVudDoiXGYwMzcifS5mYS1hbGlnbi1yaWdodDpiZWZvcmV7Y29udGVudDoiXGYwMzgifS5mYS1hbGlnbi1qdXN0aWZ5OmJlZm9yZXtjb250ZW50OiJcZjAzOSJ9LmZhLWxpc3Q6YmVmb3Jle2NvbnRlbnQ6IlxmMDNhIn0uZmEtZGVkZW50OmJlZm9yZSwuZmEtb3V0ZGVudDpiZWZvcmV7Y29udGVudDoiXGYwM2IifS5mYS1pbmRlbnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDNjIn0uZmEtdmlkZW8tY2FtZXJhOmJlZm9yZXtjb250ZW50OiJcZjAzZCJ9LmZhLXBob3RvOmJlZm9yZSwuZmEtaW1hZ2U6YmVmb3JlLC5mYS1waWN0dXJlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMDNlIn0uZmEtcGVuY2lsOmJlZm9yZXtjb250ZW50OiJcZjA0MCJ9LmZhLW1hcC1tYXJrZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMDQxIn0uZmEtYWRqdXN0OmJlZm9yZXtjb250ZW50OiJcZjA0MiJ9LmZhLXRpbnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDQzIn0uZmEtZWRpdDpiZWZvcmUsLmZhLXBlbmNpbC1zcXVhcmUtbzpiZWZvcmV7Y29udGVudDoiXGYwNDQifS5mYS1zaGFyZS1zcXVhcmUtbzpiZWZvcmV7Y29udGVudDoiXGYwNDUifS5mYS1jaGVjay1zcXVhcmUtbzpiZWZvcmV7Y29udGVudDoiXGYwNDYifS5mYS1hcnJvd3M6YmVmb3Jle2NvbnRlbnQ6IlxmMDQ3In0uZmEtc3RlcC1iYWNrd2FyZDpiZWZvcmV7Y29udGVudDoiXGYwNDgifS5mYS1mYXN0LWJhY2t3YXJkOmJlZm9yZXtjb250ZW50OiJcZjA0OSJ9LmZhLWJhY2t3YXJkOmJlZm9yZXtjb250ZW50OiJcZjA0YSJ9LmZhLXBsYXk6YmVmb3Jle2NvbnRlbnQ6IlxmMDRiIn0uZmEtcGF1c2U6YmVmb3Jle2NvbnRlbnQ6IlxmMDRjIn0uZmEtc3RvcDpiZWZvcmV7Y29udGVudDoiXGYwNGQifS5mYS1mb3J3YXJkOmJlZm9yZXtjb250ZW50OiJcZjA0ZSJ9LmZhLWZhc3QtZm9yd2FyZDpiZWZvcmV7Y29udGVudDoiXGYwNTAifS5mYS1zdGVwLWZvcndhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDUxIn0uZmEtZWplY3Q6YmVmb3Jle2NvbnRlbnQ6IlxmMDUyIn0uZmEtY2hldnJvbi1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjA1MyJ9LmZhLWNoZXZyb24tcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDU0In0uZmEtcGx1cy1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMDU1In0uZmEtbWludXMtY2lyY2xlOmJlZm9yZXtjb250ZW50OiJcZjA1NiJ9LmZhLXRpbWVzLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYwNTcifS5mYS1jaGVjay1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMDU4In0uZmEtcXVlc3Rpb24tY2lyY2xlOmJlZm9yZXtjb250ZW50OiJcZjA1OSJ9LmZhLWluZm8tY2lyY2xlOmJlZm9yZXtjb250ZW50OiJcZjA1YSJ9LmZhLWNyb3NzaGFpcnM6YmVmb3Jle2NvbnRlbnQ6IlxmMDViIn0uZmEtdGltZXMtY2lyY2xlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMDVjIn0uZmEtY2hlY2stY2lyY2xlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMDVkIn0uZmEtYmFuOmJlZm9yZXtjb250ZW50OiJcZjA1ZSJ9LmZhLWFycm93LWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDYwIn0uZmEtYXJyb3ctcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDYxIn0uZmEtYXJyb3ctdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMDYyIn0uZmEtYXJyb3ctZG93bjpiZWZvcmV7Y29udGVudDoiXGYwNjMifS5mYS1tYWlsLWZvcndhcmQ6YmVmb3JlLC5mYS1zaGFyZTpiZWZvcmV7Y29udGVudDoiXGYwNjQifS5mYS1leHBhbmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDY1In0uZmEtY29tcHJlc3M6YmVmb3Jle2NvbnRlbnQ6IlxmMDY2In0uZmEtcGx1czpiZWZvcmV7Y29udGVudDoiXGYwNjcifS5mYS1taW51czpiZWZvcmV7Y29udGVudDoiXGYwNjgifS5mYS1hc3RlcmlzazpiZWZvcmV7Y29udGVudDoiXGYwNjkifS5mYS1leGNsYW1hdGlvbi1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMDZhIn0uZmEtZ2lmdDpiZWZvcmV7Y29udGVudDoiXGYwNmIifS5mYS1sZWFmOmJlZm9yZXtjb250ZW50OiJcZjA2YyJ9LmZhLWZpcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMDZkIn0uZmEtZXllOmJlZm9yZXtjb250ZW50OiJcZjA2ZSJ9LmZhLWV5ZS1zbGFzaDpiZWZvcmV7Y29udGVudDoiXGYwNzAifS5mYS13YXJuaW5nOmJlZm9yZSwuZmEtZXhjbGFtYXRpb24tdHJpYW5nbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMDcxIn0uZmEtcGxhbmU6YmVmb3Jle2NvbnRlbnQ6IlxmMDcyIn0uZmEtY2FsZW5kYXI6YmVmb3Jle2NvbnRlbnQ6IlxmMDczIn0uZmEtcmFuZG9tOmJlZm9yZXtjb250ZW50OiJcZjA3NCJ9LmZhLWNvbW1lbnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDc1In0uZmEtbWFnbmV0OmJlZm9yZXtjb250ZW50OiJcZjA3NiJ9LmZhLWNoZXZyb24tdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMDc3In0uZmEtY2hldnJvbi1kb3duOmJlZm9yZXtjb250ZW50OiJcZjA3OCJ9LmZhLXJldHdlZXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDc5In0uZmEtc2hvcHBpbmctY2FydDpiZWZvcmV7Y29udGVudDoiXGYwN2EifS5mYS1mb2xkZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMDdiIn0uZmEtZm9sZGVyLW9wZW46YmVmb3Jle2NvbnRlbnQ6IlxmMDdjIn0uZmEtYXJyb3dzLXY6YmVmb3Jle2NvbnRlbnQ6IlxmMDdkIn0uZmEtYXJyb3dzLWg6YmVmb3Jle2NvbnRlbnQ6IlxmMDdlIn0uZmEtYmFyLWNoYXJ0LW86YmVmb3JlLC5mYS1iYXItY2hhcnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDgwIn0uZmEtdHdpdHRlci1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMDgxIn0uZmEtZmFjZWJvb2stc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjA4MiJ9LmZhLWNhbWVyYS1yZXRybzpiZWZvcmV7Y29udGVudDoiXGYwODMifS5mYS1rZXk6YmVmb3Jle2NvbnRlbnQ6IlxmMDg0In0uZmEtZ2VhcnM6YmVmb3JlLC5mYS1jb2dzOmJlZm9yZXtjb250ZW50OiJcZjA4NSJ9LmZhLWNvbW1lbnRzOmJlZm9yZXtjb250ZW50OiJcZjA4NiJ9LmZhLXRodW1icy1vLXVwOmJlZm9yZXtjb250ZW50OiJcZjA4NyJ9LmZhLXRodW1icy1vLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxmMDg4In0uZmEtc3Rhci1oYWxmOmJlZm9yZXtjb250ZW50OiJcZjA4OSJ9LmZhLWhlYXJ0LW86YmVmb3Jle2NvbnRlbnQ6IlxmMDhhIn0uZmEtc2lnbi1vdXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDhiIn0uZmEtbGlua2VkaW4tc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjA4YyJ9LmZhLXRodW1iLXRhY2s6YmVmb3Jle2NvbnRlbnQ6IlxmMDhkIn0uZmEtZXh0ZXJuYWwtbGluazpiZWZvcmV7Y29udGVudDoiXGYwOGUifS5mYS1zaWduLWluOmJlZm9yZXtjb250ZW50OiJcZjA5MCJ9LmZhLXRyb3BoeTpiZWZvcmV7Y29udGVudDoiXGYwOTEifS5mYS1naXRodWItc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjA5MiJ9LmZhLXVwbG9hZDpiZWZvcmV7Y29udGVudDoiXGYwOTMifS5mYS1sZW1vbi1vOmJlZm9yZXtjb250ZW50OiJcZjA5NCJ9LmZhLXBob25lOmJlZm9yZXtjb250ZW50OiJcZjA5NSJ9LmZhLXNxdWFyZS1vOmJlZm9yZXtjb250ZW50OiJcZjA5NiJ9LmZhLWJvb2ttYXJrLW86YmVmb3Jle2NvbnRlbnQ6IlxmMDk3In0uZmEtcGhvbmUtc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjA5OCJ9LmZhLXR3aXR0ZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMDk5In0uZmEtZmFjZWJvb2stZjpiZWZvcmUsLmZhLWZhY2Vib29rOmJlZm9yZXtjb250ZW50OiJcZjA5YSJ9LmZhLWdpdGh1YjpiZWZvcmV7Y29udGVudDoiXGYwOWIifS5mYS11bmxvY2s6YmVmb3Jle2NvbnRlbnQ6IlxmMDljIn0uZmEtY3JlZGl0LWNhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDlkIn0uZmEtZmVlZDpiZWZvcmUsLmZhLXJzczpiZWZvcmV7Y29udGVudDoiXGYwOWUifS5mYS1oZGQtbzpiZWZvcmV7Y29udGVudDoiXGYwYTAifS5mYS1idWxsaG9ybjpiZWZvcmV7Y29udGVudDoiXGYwYTEifS5mYS1iZWxsOmJlZm9yZXtjb250ZW50OiJcZjBmMyJ9LmZhLWNlcnRpZmljYXRlOmJlZm9yZXtjb250ZW50OiJcZjBhMyJ9LmZhLWhhbmQtby1yaWdodDpiZWZvcmV7Y29udGVudDoiXGYwYTQifS5mYS1oYW5kLW8tbGVmdDpiZWZvcmV7Y29udGVudDoiXGYwYTUifS5mYS1oYW5kLW8tdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMGE2In0uZmEtaGFuZC1vLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxmMGE3In0uZmEtYXJyb3ctY2lyY2xlLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGE4In0uZmEtYXJyb3ctY2lyY2xlLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjBhOSJ9LmZhLWFycm93LWNpcmNsZS11cDpiZWZvcmV7Y29udGVudDoiXGYwYWEifS5mYS1hcnJvdy1jaXJjbGUtZG93bjpiZWZvcmV7Y29udGVudDoiXGYwYWIifS5mYS1nbG9iZTpiZWZvcmV7Y29udGVudDoiXGYwYWMifS5mYS13cmVuY2g6YmVmb3Jle2NvbnRlbnQ6IlxmMGFkIn0uZmEtdGFza3M6YmVmb3Jle2NvbnRlbnQ6IlxmMGFlIn0uZmEtZmlsdGVyOmJlZm9yZXtjb250ZW50OiJcZjBiMCJ9LmZhLWJyaWVmY2FzZTpiZWZvcmV7Y29udGVudDoiXGYwYjEifS5mYS1hcnJvd3MtYWx0OmJlZm9yZXtjb250ZW50OiJcZjBiMiJ9LmZhLWdyb3VwOmJlZm9yZSwuZmEtdXNlcnM6YmVmb3Jle2NvbnRlbnQ6IlxmMGMwIn0uZmEtY2hhaW46YmVmb3JlLC5mYS1saW5rOmJlZm9yZXtjb250ZW50OiJcZjBjMSJ9LmZhLWNsb3VkOmJlZm9yZXtjb250ZW50OiJcZjBjMiJ9LmZhLWZsYXNrOmJlZm9yZXtjb250ZW50OiJcZjBjMyJ9LmZhLWN1dDpiZWZvcmUsLmZhLXNjaXNzb3JzOmJlZm9yZXtjb250ZW50OiJcZjBjNCJ9LmZhLWNvcHk6YmVmb3JlLC5mYS1maWxlcy1vOmJlZm9yZXtjb250ZW50OiJcZjBjNSJ9LmZhLXBhcGVyY2xpcDpiZWZvcmV7Y29udGVudDoiXGYwYzYifS5mYS1zYXZlOmJlZm9yZSwuZmEtZmxvcHB5LW86YmVmb3Jle2NvbnRlbnQ6IlxmMGM3In0uZmEtc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjBjOCJ9LmZhLW5hdmljb246YmVmb3JlLC5mYS1yZW9yZGVyOmJlZm9yZSwuZmEtYmFyczpiZWZvcmV7Y29udGVudDoiXGYwYzkifS5mYS1saXN0LXVsOmJlZm9yZXtjb250ZW50OiJcZjBjYSJ9LmZhLWxpc3Qtb2w6YmVmb3Jle2NvbnRlbnQ6IlxmMGNiIn0uZmEtc3RyaWtldGhyb3VnaDpiZWZvcmV7Y29udGVudDoiXGYwY2MifS5mYS11bmRlcmxpbmU6YmVmb3Jle2NvbnRlbnQ6IlxmMGNkIn0uZmEtdGFibGU6YmVmb3Jle2NvbnRlbnQ6IlxmMGNlIn0uZmEtbWFnaWM6YmVmb3Jle2NvbnRlbnQ6IlxmMGQwIn0uZmEtdHJ1Y2s6YmVmb3Jle2NvbnRlbnQ6IlxmMGQxIn0uZmEtcGludGVyZXN0OmJlZm9yZXtjb250ZW50OiJcZjBkMiJ9LmZhLXBpbnRlcmVzdC1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMGQzIn0uZmEtZ29vZ2xlLXBsdXMtc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjBkNCJ9LmZhLWdvb2dsZS1wbHVzOmJlZm9yZXtjb250ZW50OiJcZjBkNSJ9LmZhLW1vbmV5OmJlZm9yZXtjb250ZW50OiJcZjBkNiJ9LmZhLWNhcmV0LWRvd246YmVmb3Jle2NvbnRlbnQ6IlxmMGQ3In0uZmEtY2FyZXQtdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMGQ4In0uZmEtY2FyZXQtbGVmdDpiZWZvcmV7Y29udGVudDoiXGYwZDkifS5mYS1jYXJldC1yaWdodDpiZWZvcmV7Y29udGVudDoiXGYwZGEifS5mYS1jb2x1bW5zOmJlZm9yZXtjb250ZW50OiJcZjBkYiJ9LmZhLXVuc29ydGVkOmJlZm9yZSwuZmEtc29ydDpiZWZvcmV7Y29udGVudDoiXGYwZGMifS5mYS1zb3J0LWRvd246YmVmb3JlLC5mYS1zb3J0LWRlc2M6YmVmb3Jle2NvbnRlbnQ6IlxmMGRkIn0uZmEtc29ydC11cDpiZWZvcmUsLmZhLXNvcnQtYXNjOmJlZm9yZXtjb250ZW50OiJcZjBkZSJ9LmZhLWVudmVsb3BlOmJlZm9yZXtjb250ZW50OiJcZjBlMCJ9LmZhLWxpbmtlZGluOmJlZm9yZXtjb250ZW50OiJcZjBlMSJ9LmZhLXJvdGF0ZS1sZWZ0OmJlZm9yZSwuZmEtdW5kbzpiZWZvcmV7Y29udGVudDoiXGYwZTIifS5mYS1sZWdhbDpiZWZvcmUsLmZhLWdhdmVsOmJlZm9yZXtjb250ZW50OiJcZjBlMyJ9LmZhLWRhc2hib2FyZDpiZWZvcmUsLmZhLXRhY2hvbWV0ZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMGU0In0uZmEtY29tbWVudC1vOmJlZm9yZXtjb250ZW50OiJcZjBlNSJ9LmZhLWNvbW1lbnRzLW86YmVmb3Jle2NvbnRlbnQ6IlxmMGU2In0uZmEtZmxhc2g6YmVmb3JlLC5mYS1ib2x0OmJlZm9yZXtjb250ZW50OiJcZjBlNyJ9LmZhLXNpdGVtYXA6YmVmb3Jle2NvbnRlbnQ6IlxmMGU4In0uZmEtdW1icmVsbGE6YmVmb3Jle2NvbnRlbnQ6IlxmMGU5In0uZmEtcGFzdGU6YmVmb3JlLC5mYS1jbGlwYm9hcmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGVhIn0uZmEtbGlnaHRidWxiLW86YmVmb3Jle2NvbnRlbnQ6IlxmMGViIn0uZmEtZXhjaGFuZ2U6YmVmb3Jle2NvbnRlbnQ6IlxmMGVjIn0uZmEtY2xvdWQtZG93bmxvYWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGVkIn0uZmEtY2xvdWQtdXBsb2FkOmJlZm9yZXtjb250ZW50OiJcZjBlZSJ9LmZhLXVzZXItbWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGYwIn0uZmEtc3RldGhvc2NvcGU6YmVmb3Jle2NvbnRlbnQ6IlxmMGYxIn0uZmEtc3VpdGNhc2U6YmVmb3Jle2NvbnRlbnQ6IlxmMGYyIn0uZmEtYmVsbC1vOmJlZm9yZXtjb250ZW50OiJcZjBhMiJ9LmZhLWNvZmZlZTpiZWZvcmV7Y29udGVudDoiXGYwZjQifS5mYS1jdXRsZXJ5OmJlZm9yZXtjb250ZW50OiJcZjBmNSJ9LmZhLWZpbGUtdGV4dC1vOmJlZm9yZXtjb250ZW50OiJcZjBmNiJ9LmZhLWJ1aWxkaW5nLW86YmVmb3Jle2NvbnRlbnQ6IlxmMGY3In0uZmEtaG9zcGl0YWwtbzpiZWZvcmV7Y29udGVudDoiXGYwZjgifS5mYS1hbWJ1bGFuY2U6YmVmb3Jle2NvbnRlbnQ6IlxmMGY5In0uZmEtbWVka2l0OmJlZm9yZXtjb250ZW50OiJcZjBmYSJ9LmZhLWZpZ2h0ZXItamV0OmJlZm9yZXtjb250ZW50OiJcZjBmYiJ9LmZhLWJlZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMGZjIn0uZmEtaC1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMGZkIn0uZmEtcGx1cy1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMGZlIn0uZmEtYW5nbGUtZG91YmxlLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTAwIn0uZmEtYW5nbGUtZG91YmxlLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjEwMSJ9LmZhLWFuZ2xlLWRvdWJsZS11cDpiZWZvcmV7Y29udGVudDoiXGYxMDIifS5mYS1hbmdsZS1kb3VibGUtZG93bjpiZWZvcmV7Y29udGVudDoiXGYxMDMifS5mYS1hbmdsZS1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjEwNCJ9LmZhLWFuZ2xlLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjEwNSJ9LmZhLWFuZ2xlLXVwOmJlZm9yZXtjb250ZW50OiJcZjEwNiJ9LmZhLWFuZ2xlLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxmMTA3In0uZmEtZGVza3RvcDpiZWZvcmV7Y29udGVudDoiXGYxMDgifS5mYS1sYXB0b3A6YmVmb3Jle2NvbnRlbnQ6IlxmMTA5In0uZmEtdGFibGV0OmJlZm9yZXtjb250ZW50OiJcZjEwYSJ9LmZhLW1vYmlsZS1waG9uZTpiZWZvcmUsLmZhLW1vYmlsZTpiZWZvcmV7Y29udGVudDoiXGYxMGIifS5mYS1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDoiXGYxMGMifS5mYS1xdW90ZS1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjEwZCJ9LmZhLXF1b3RlLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjEwZSJ9LmZhLXNwaW5uZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMTEwIn0uZmEtY2lyY2xlOmJlZm9yZXtjb250ZW50OiJcZjExMSJ9LmZhLW1haWwtcmVwbHk6YmVmb3JlLC5mYS1yZXBseTpiZWZvcmV7Y29udGVudDoiXGYxMTIifS5mYS1naXRodWItYWx0OmJlZm9yZXtjb250ZW50OiJcZjExMyJ9LmZhLWZvbGRlci1vOmJlZm9yZXtjb250ZW50OiJcZjExNCJ9LmZhLWZvbGRlci1vcGVuLW86YmVmb3Jle2NvbnRlbnQ6IlxmMTE1In0uZmEtc21pbGUtbzpiZWZvcmV7Y29udGVudDoiXGYxMTgifS5mYS1mcm93bi1vOmJlZm9yZXtjb250ZW50OiJcZjExOSJ9LmZhLW1laC1vOmJlZm9yZXtjb250ZW50OiJcZjExYSJ9LmZhLWdhbWVwYWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTFiIn0uZmEta2V5Ym9hcmQtbzpiZWZvcmV7Y29udGVudDoiXGYxMWMifS5mYS1mbGFnLW86YmVmb3Jle2NvbnRlbnQ6IlxmMTFkIn0uZmEtZmxhZy1jaGVja2VyZWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTFlIn0uZmEtdGVybWluYWw6YmVmb3Jle2NvbnRlbnQ6IlxmMTIwIn0uZmEtY29kZTpiZWZvcmV7Y29udGVudDoiXGYxMjEifS5mYS1tYWlsLXJlcGx5LWFsbDpiZWZvcmUsLmZhLXJlcGx5LWFsbDpiZWZvcmV7Y29udGVudDoiXGYxMjIifS5mYS1zdGFyLWhhbGYtZW1wdHk6YmVmb3JlLC5mYS1zdGFyLWhhbGYtZnVsbDpiZWZvcmUsLmZhLXN0YXItaGFsZi1vOmJlZm9yZXtjb250ZW50OiJcZjEyMyJ9LmZhLWxvY2F0aW9uLWFycm93OmJlZm9yZXtjb250ZW50OiJcZjEyNCJ9LmZhLWNyb3A6YmVmb3Jle2NvbnRlbnQ6IlxmMTI1In0uZmEtY29kZS1mb3JrOmJlZm9yZXtjb250ZW50OiJcZjEyNiJ9LmZhLXVubGluazpiZWZvcmUsLmZhLWNoYWluLWJyb2tlbjpiZWZvcmV7Y29udGVudDoiXGYxMjcifS5mYS1xdWVzdGlvbjpiZWZvcmV7Y29udGVudDoiXGYxMjgifS5mYS1pbmZvOmJlZm9yZXtjb250ZW50OiJcZjEyOSJ9LmZhLWV4Y2xhbWF0aW9uOmJlZm9yZXtjb250ZW50OiJcZjEyYSJ9LmZhLXN1cGVyc2NyaXB0OmJlZm9yZXtjb250ZW50OiJcZjEyYiJ9LmZhLXN1YnNjcmlwdDpiZWZvcmV7Y29udGVudDoiXGYxMmMifS5mYS1lcmFzZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMTJkIn0uZmEtcHV6emxlLXBpZWNlOmJlZm9yZXtjb250ZW50OiJcZjEyZSJ9LmZhLW1pY3JvcGhvbmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTMwIn0uZmEtbWljcm9waG9uZS1zbGFzaDpiZWZvcmV7Y29udGVudDoiXGYxMzEifS5mYS1zaGllbGQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTMyIn0uZmEtY2FsZW5kYXItbzpiZWZvcmV7Y29udGVudDoiXGYxMzMifS5mYS1maXJlLWV4dGluZ3Vpc2hlcjpiZWZvcmV7Y29udGVudDoiXGYxMzQifS5mYS1yb2NrZXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTM1In0uZmEtbWF4Y2RuOmJlZm9yZXtjb250ZW50OiJcZjEzNiJ9LmZhLWNoZXZyb24tY2lyY2xlLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTM3In0uZmEtY2hldnJvbi1jaXJjbGUtcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTM4In0uZmEtY2hldnJvbi1jaXJjbGUtdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMTM5In0uZmEtY2hldnJvbi1jaXJjbGUtZG93bjpiZWZvcmV7Y29udGVudDoiXGYxM2EifS5mYS1odG1sNTpiZWZvcmV7Y29udGVudDoiXGYxM2IifS5mYS1jc3MzOmJlZm9yZXtjb250ZW50OiJcZjEzYyJ9LmZhLWFuY2hvcjpiZWZvcmV7Y29udGVudDoiXGYxM2QifS5mYS11bmxvY2stYWx0OmJlZm9yZXtjb250ZW50OiJcZjEzZSJ9LmZhLWJ1bGxzZXllOmJlZm9yZXtjb250ZW50OiJcZjE0MCJ9LmZhLWVsbGlwc2lzLWg6YmVmb3Jle2NvbnRlbnQ6IlxmMTQxIn0uZmEtZWxsaXBzaXMtdjpiZWZvcmV7Y29udGVudDoiXGYxNDIifS5mYS1yc3Mtc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjE0MyJ9LmZhLXBsYXktY2lyY2xlOmJlZm9yZXtjb250ZW50OiJcZjE0NCJ9LmZhLXRpY2tldDpiZWZvcmV7Y29udGVudDoiXGYxNDUifS5mYS1taW51cy1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTQ2In0uZmEtbWludXMtc3F1YXJlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMTQ3In0uZmEtbGV2ZWwtdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMTQ4In0uZmEtbGV2ZWwtZG93bjpiZWZvcmV7Y29udGVudDoiXGYxNDkifS5mYS1jaGVjay1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTRhIn0uZmEtcGVuY2lsLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxNGIifS5mYS1leHRlcm5hbC1saW5rLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxNGMifS5mYS1zaGFyZS1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTRkIn0uZmEtY29tcGFzczpiZWZvcmV7Y29udGVudDoiXGYxNGUifS5mYS10b2dnbGUtZG93bjpiZWZvcmUsLmZhLWNhcmV0LXNxdWFyZS1vLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxmMTUwIn0uZmEtdG9nZ2xlLXVwOmJlZm9yZSwuZmEtY2FyZXQtc3F1YXJlLW8tdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMTUxIn0uZmEtdG9nZ2xlLXJpZ2h0OmJlZm9yZSwuZmEtY2FyZXQtc3F1YXJlLW8tcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTUyIn0uZmEtZXVybzpiZWZvcmUsLmZhLWV1cjpiZWZvcmV7Y29udGVudDoiXGYxNTMifS5mYS1nYnA6YmVmb3Jle2NvbnRlbnQ6IlxmMTU0In0uZmEtZG9sbGFyOmJlZm9yZSwuZmEtdXNkOmJlZm9yZXtjb250ZW50OiJcZjE1NSJ9LmZhLXJ1cGVlOmJlZm9yZSwuZmEtaW5yOmJlZm9yZXtjb250ZW50OiJcZjE1NiJ9LmZhLWNueTpiZWZvcmUsLmZhLXJtYjpiZWZvcmUsLmZhLXllbjpiZWZvcmUsLmZhLWpweTpiZWZvcmV7Y29udGVudDoiXGYxNTcifS5mYS1ydWJsZTpiZWZvcmUsLmZhLXJvdWJsZTpiZWZvcmUsLmZhLXJ1YjpiZWZvcmV7Y29udGVudDoiXGYxNTgifS5mYS13b246YmVmb3JlLC5mYS1rcnc6YmVmb3Jle2NvbnRlbnQ6IlxmMTU5In0uZmEtYml0Y29pbjpiZWZvcmUsLmZhLWJ0YzpiZWZvcmV7Y29udGVudDoiXGYxNWEifS5mYS1maWxlOmJlZm9yZXtjb250ZW50OiJcZjE1YiJ9LmZhLWZpbGUtdGV4dDpiZWZvcmV7Y29udGVudDoiXGYxNWMifS5mYS1zb3J0LWFscGhhLWFzYzpiZWZvcmV7Y29udGVudDoiXGYxNWQifS5mYS1zb3J0LWFscGhhLWRlc2M6YmVmb3Jle2NvbnRlbnQ6IlxmMTVlIn0uZmEtc29ydC1hbW91bnQtYXNjOmJlZm9yZXtjb250ZW50OiJcZjE2MCJ9LmZhLXNvcnQtYW1vdW50LWRlc2M6YmVmb3Jle2NvbnRlbnQ6IlxmMTYxIn0uZmEtc29ydC1udW1lcmljLWFzYzpiZWZvcmV7Y29udGVudDoiXGYxNjIifS5mYS1zb3J0LW51bWVyaWMtZGVzYzpiZWZvcmV7Y29udGVudDoiXGYxNjMifS5mYS10aHVtYnMtdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMTY0In0uZmEtdGh1bWJzLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxmMTY1In0uZmEteW91dHViZS1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTY2In0uZmEteW91dHViZTpiZWZvcmV7Y29udGVudDoiXGYxNjcifS5mYS14aW5nOmJlZm9yZXtjb250ZW50OiJcZjE2OCJ9LmZhLXhpbmctc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjE2OSJ9LmZhLXlvdXR1YmUtcGxheTpiZWZvcmV7Y29udGVudDoiXGYxNmEifS5mYS1kcm9wYm94OmJlZm9yZXtjb250ZW50OiJcZjE2YiJ9LmZhLXN0YWNrLW92ZXJmbG93OmJlZm9yZXtjb250ZW50OiJcZjE2YyJ9LmZhLWluc3RhZ3JhbTpiZWZvcmV7Y29udGVudDoiXGYxNmQifS5mYS1mbGlja3I6YmVmb3Jle2NvbnRlbnQ6IlxmMTZlIn0uZmEtYWRuOmJlZm9yZXtjb250ZW50OiJcZjE3MCJ9LmZhLWJpdGJ1Y2tldDpiZWZvcmV7Y29udGVudDoiXGYxNzEifS5mYS1iaXRidWNrZXQtc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjE3MiJ9LmZhLXR1bWJscjpiZWZvcmV7Y29udGVudDoiXGYxNzMifS5mYS10dW1ibHItc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjE3NCJ9LmZhLWxvbmctYXJyb3ctZG93bjpiZWZvcmV7Y29udGVudDoiXGYxNzUifS5mYS1sb25nLWFycm93LXVwOmJlZm9yZXtjb250ZW50OiJcZjE3NiJ9LmZhLWxvbmctYXJyb3ctbGVmdDpiZWZvcmV7Y29udGVudDoiXGYxNzcifS5mYS1sb25nLWFycm93LXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjE3OCJ9LmZhLWFwcGxlOmJlZm9yZXtjb250ZW50OiJcZjE3OSJ9LmZhLXdpbmRvd3M6YmVmb3Jle2NvbnRlbnQ6IlxmMTdhIn0uZmEtYW5kcm9pZDpiZWZvcmV7Y29udGVudDoiXGYxN2IifS5mYS1saW51eDpiZWZvcmV7Y29udGVudDoiXGYxN2MifS5mYS1kcmliYmJsZTpiZWZvcmV7Y29udGVudDoiXGYxN2QifS5mYS1za3lwZTpiZWZvcmV7Y29udGVudDoiXGYxN2UifS5mYS1mb3Vyc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjE4MCJ9LmZhLXRyZWxsbzpiZWZvcmV7Y29udGVudDoiXGYxODEifS5mYS1mZW1hbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMTgyIn0uZmEtbWFsZTpiZWZvcmV7Y29udGVudDoiXGYxODMifS5mYS1naXR0aXA6YmVmb3JlLC5mYS1ncmF0aXBheTpiZWZvcmV7Y29udGVudDoiXGYxODQifS5mYS1zdW4tbzpiZWZvcmV7Y29udGVudDoiXGYxODUifS5mYS1tb29uLW86YmVmb3Jle2NvbnRlbnQ6IlxmMTg2In0uZmEtYXJjaGl2ZTpiZWZvcmV7Y29udGVudDoiXGYxODcifS5mYS1idWc6YmVmb3Jle2NvbnRlbnQ6IlxmMTg4In0uZmEtdms6YmVmb3Jle2NvbnRlbnQ6IlxmMTg5In0uZmEtd2VpYm86YmVmb3Jle2NvbnRlbnQ6IlxmMThhIn0uZmEtcmVucmVuOmJlZm9yZXtjb250ZW50OiJcZjE4YiJ9LmZhLXBhZ2VsaW5lczpiZWZvcmV7Y29udGVudDoiXGYxOGMifS5mYS1zdGFjay1leGNoYW5nZTpiZWZvcmV7Y29udGVudDoiXGYxOGQifS5mYS1hcnJvdy1jaXJjbGUtby1yaWdodDpiZWZvcmV7Y29udGVudDoiXGYxOGUifS5mYS1hcnJvdy1jaXJjbGUtby1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjE5MCJ9LmZhLXRvZ2dsZS1sZWZ0OmJlZm9yZSwuZmEtY2FyZXQtc3F1YXJlLW8tbGVmdDpiZWZvcmV7Y29udGVudDoiXGYxOTEifS5mYS1kb3QtY2lyY2xlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMTkyIn0uZmEtd2hlZWxjaGFpcjpiZWZvcmV7Y29udGVudDoiXGYxOTMifS5mYS12aW1lby1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTk0In0uZmEtdHVya2lzaC1saXJhOmJlZm9yZSwuZmEtdHJ5OmJlZm9yZXtjb250ZW50OiJcZjE5NSJ9LmZhLXBsdXMtc3F1YXJlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMTk2In0uZmEtc3BhY2Utc2h1dHRsZTpiZWZvcmV7Y29udGVudDoiXGYxOTcifS5mYS1zbGFjazpiZWZvcmV7Y29udGVudDoiXGYxOTgifS5mYS1lbnZlbG9wZS1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTk5In0uZmEtd29yZHByZXNzOmJlZm9yZXtjb250ZW50OiJcZjE5YSJ9LmZhLW9wZW5pZDpiZWZvcmV7Y29udGVudDoiXGYxOWIifS5mYS1pbnN0aXR1dGlvbjpiZWZvcmUsLmZhLWJhbms6YmVmb3JlLC5mYS11bml2ZXJzaXR5OmJlZm9yZXtjb250ZW50OiJcZjE5YyJ9LmZhLW1vcnRhci1ib2FyZDpiZWZvcmUsLmZhLWdyYWR1YXRpb24tY2FwOmJlZm9yZXtjb250ZW50OiJcZjE5ZCJ9LmZhLXlhaG9vOmJlZm9yZXtjb250ZW50OiJcZjE5ZSJ9LmZhLWdvb2dsZTpiZWZvcmV7Y29udGVudDoiXGYxYTAifS5mYS1yZWRkaXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMWExIn0uZmEtcmVkZGl0LXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxYTIifS5mYS1zdHVtYmxldXBvbi1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMWEzIn0uZmEtc3R1bWJsZXVwb246YmVmb3Jle2NvbnRlbnQ6IlxmMWE0In0uZmEtZGVsaWNpb3VzOmJlZm9yZXtjb250ZW50OiJcZjFhNSJ9LmZhLWRpZ2c6YmVmb3Jle2NvbnRlbnQ6IlxmMWE2In0uZmEtcGllZC1waXBlcjpiZWZvcmV7Y29udGVudDoiXGYxYTcifS5mYS1waWVkLXBpcGVyLWFsdDpiZWZvcmV7Y29udGVudDoiXGYxYTgifS5mYS1kcnVwYWw6YmVmb3Jle2NvbnRlbnQ6IlxmMWE5In0uZmEtam9vbWxhOmJlZm9yZXtjb250ZW50OiJcZjFhYSJ9LmZhLWxhbmd1YWdlOmJlZm9yZXtjb250ZW50OiJcZjFhYiJ9LmZhLWZheDpiZWZvcmV7Y29udGVudDoiXGYxYWMifS5mYS1idWlsZGluZzpiZWZvcmV7Y29udGVudDoiXGYxYWQifS5mYS1jaGlsZDpiZWZvcmV7Y29udGVudDoiXGYxYWUifS5mYS1wYXc6YmVmb3Jle2NvbnRlbnQ6IlxmMWIwIn0uZmEtc3Bvb246YmVmb3Jle2NvbnRlbnQ6IlxmMWIxIn0uZmEtY3ViZTpiZWZvcmV7Y29udGVudDoiXGYxYjIifS5mYS1jdWJlczpiZWZvcmV7Y29udGVudDoiXGYxYjMifS5mYS1iZWhhbmNlOmJlZm9yZXtjb250ZW50OiJcZjFiNCJ9LmZhLWJlaGFuY2Utc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjFiNSJ9LmZhLXN0ZWFtOmJlZm9yZXtjb250ZW50OiJcZjFiNiJ9LmZhLXN0ZWFtLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxYjcifS5mYS1yZWN5Y2xlOmJlZm9yZXtjb250ZW50OiJcZjFiOCJ9LmZhLWF1dG9tb2JpbGU6YmVmb3JlLC5mYS1jYXI6YmVmb3Jle2NvbnRlbnQ6IlxmMWI5In0uZmEtY2FiOmJlZm9yZSwuZmEtdGF4aTpiZWZvcmV7Y29udGVudDoiXGYxYmEifS5mYS10cmVlOmJlZm9yZXtjb250ZW50OiJcZjFiYiJ9LmZhLXNwb3RpZnk6YmVmb3Jle2NvbnRlbnQ6IlxmMWJjIn0uZmEtZGV2aWFudGFydDpiZWZvcmV7Y29udGVudDoiXGYxYmQifS5mYS1zb3VuZGNsb3VkOmJlZm9yZXtjb250ZW50OiJcZjFiZSJ9LmZhLWRhdGFiYXNlOmJlZm9yZXtjb250ZW50OiJcZjFjMCJ9LmZhLWZpbGUtcGRmLW86YmVmb3Jle2NvbnRlbnQ6IlxmMWMxIn0uZmEtZmlsZS13b3JkLW86YmVmb3Jle2NvbnRlbnQ6IlxmMWMyIn0uZmEtZmlsZS1leGNlbC1vOmJlZm9yZXtjb250ZW50OiJcZjFjMyJ9LmZhLWZpbGUtcG93ZXJwb2ludC1vOmJlZm9yZXtjb250ZW50OiJcZjFjNCJ9LmZhLWZpbGUtcGhvdG8tbzpiZWZvcmUsLmZhLWZpbGUtcGljdHVyZS1vOmJlZm9yZSwuZmEtZmlsZS1pbWFnZS1vOmJlZm9yZXtjb250ZW50OiJcZjFjNSJ9LmZhLWZpbGUtemlwLW86YmVmb3JlLC5mYS1maWxlLWFyY2hpdmUtbzpiZWZvcmV7Y29udGVudDoiXGYxYzYifS5mYS1maWxlLXNvdW5kLW86YmVmb3JlLC5mYS1maWxlLWF1ZGlvLW86YmVmb3Jle2NvbnRlbnQ6IlxmMWM3In0uZmEtZmlsZS1tb3ZpZS1vOmJlZm9yZSwuZmEtZmlsZS12aWRlby1vOmJlZm9yZXtjb250ZW50OiJcZjFjOCJ9LmZhLWZpbGUtY29kZS1vOmJlZm9yZXtjb250ZW50OiJcZjFjOSJ9LmZhLXZpbmU6YmVmb3Jle2NvbnRlbnQ6IlxmMWNhIn0uZmEtY29kZXBlbjpiZWZvcmV7Y29udGVudDoiXGYxY2IifS5mYS1qc2ZpZGRsZTpiZWZvcmV7Y29udGVudDoiXGYxY2MifS5mYS1saWZlLWJvdXk6YmVmb3JlLC5mYS1saWZlLWJ1b3k6YmVmb3JlLC5mYS1saWZlLXNhdmVyOmJlZm9yZSwuZmEtc3VwcG9ydDpiZWZvcmUsLmZhLWxpZmUtcmluZzpiZWZvcmV7Y29udGVudDoiXGYxY2QifS5mYS1jaXJjbGUtby1ub3RjaDpiZWZvcmV7Y29udGVudDoiXGYxY2UifS5mYS1yYTpiZWZvcmUsLmZhLXJlYmVsOmJlZm9yZXtjb250ZW50OiJcZjFkMCJ9LmZhLWdlOmJlZm9yZSwuZmEtZW1waXJlOmJlZm9yZXtjb250ZW50OiJcZjFkMSJ9LmZhLWdpdC1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMWQyIn0uZmEtZ2l0OmJlZm9yZXtjb250ZW50OiJcZjFkMyJ9LmZhLXktY29tYmluYXRvci1zcXVhcmU6YmVmb3JlLC5mYS15Yy1zcXVhcmU6YmVmb3JlLC5mYS1oYWNrZXItbmV3czpiZWZvcmV7Y29udGVudDoiXGYxZDQifS5mYS10ZW5jZW50LXdlaWJvOmJlZm9yZXtjb250ZW50OiJcZjFkNSJ9LmZhLXFxOmJlZm9yZXtjb250ZW50OiJcZjFkNiJ9LmZhLXdlY2hhdDpiZWZvcmUsLmZhLXdlaXhpbjpiZWZvcmV7Y29udGVudDoiXGYxZDcifS5mYS1zZW5kOmJlZm9yZSwuZmEtcGFwZXItcGxhbmU6YmVmb3Jle2NvbnRlbnQ6IlxmMWQ4In0uZmEtc2VuZC1vOmJlZm9yZSwuZmEtcGFwZXItcGxhbmUtbzpiZWZvcmV7Y29udGVudDoiXGYxZDkifS5mYS1oaXN0b3J5OmJlZm9yZXtjb250ZW50OiJcZjFkYSJ9LmZhLWNpcmNsZS10aGluOmJlZm9yZXtjb250ZW50OiJcZjFkYiJ9LmZhLWhlYWRlcjpiZWZvcmV7Y29udGVudDoiXGYxZGMifS5mYS1wYXJhZ3JhcGg6YmVmb3Jle2NvbnRlbnQ6IlxmMWRkIn0uZmEtc2xpZGVyczpiZWZvcmV7Y29udGVudDoiXGYxZGUifS5mYS1zaGFyZS1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMWUwIn0uZmEtc2hhcmUtYWx0LXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxZTEifS5mYS1ib21iOmJlZm9yZXtjb250ZW50OiJcZjFlMiJ9LmZhLXNvY2Nlci1iYWxsLW86YmVmb3JlLC5mYS1mdXRib2wtbzpiZWZvcmV7Y29udGVudDoiXGYxZTMifS5mYS10dHk6YmVmb3Jle2NvbnRlbnQ6IlxmMWU0In0uZmEtYmlub2N1bGFyczpiZWZvcmV7Y29udGVudDoiXGYxZTUifS5mYS1wbHVnOmJlZm9yZXtjb250ZW50OiJcZjFlNiJ9LmZhLXNsaWRlc2hhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMWU3In0uZmEtdHdpdGNoOmJlZm9yZXtjb250ZW50OiJcZjFlOCJ9LmZhLXllbHA6YmVmb3Jle2NvbnRlbnQ6IlxmMWU5In0uZmEtbmV3c3BhcGVyLW86YmVmb3Jle2NvbnRlbnQ6IlxmMWVhIn0uZmEtd2lmaTpiZWZvcmV7Y29udGVudDoiXGYxZWIifS5mYS1jYWxjdWxhdG9yOmJlZm9yZXtjb250ZW50OiJcZjFlYyJ9LmZhLXBheXBhbDpiZWZvcmV7Y29udGVudDoiXGYxZWQifS5mYS1nb29nbGUtd2FsbGV0OmJlZm9yZXtjb250ZW50OiJcZjFlZSJ9LmZhLWNjLXZpc2E6YmVmb3Jle2NvbnRlbnQ6IlxmMWYwIn0uZmEtY2MtbWFzdGVyY2FyZDpiZWZvcmV7Y29udGVudDoiXGYxZjEifS5mYS1jYy1kaXNjb3ZlcjpiZWZvcmV7Y29udGVudDoiXGYxZjIifS5mYS1jYy1hbWV4OmJlZm9yZXtjb250ZW50OiJcZjFmMyJ9LmZhLWNjLXBheXBhbDpiZWZvcmV7Y29udGVudDoiXGYxZjQifS5mYS1jYy1zdHJpcGU6YmVmb3Jle2NvbnRlbnQ6IlxmMWY1In0uZmEtYmVsbC1zbGFzaDpiZWZvcmV7Y29udGVudDoiXGYxZjYifS5mYS1iZWxsLXNsYXNoLW86YmVmb3Jle2NvbnRlbnQ6IlxmMWY3In0uZmEtdHJhc2g6YmVmb3Jle2NvbnRlbnQ6IlxmMWY4In0uZmEtY29weXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjFmOSJ9LmZhLWF0OmJlZm9yZXtjb250ZW50OiJcZjFmYSJ9LmZhLWV5ZWRyb3BwZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMWZiIn0uZmEtcGFpbnQtYnJ1c2g6YmVmb3Jle2NvbnRlbnQ6IlxmMWZjIn0uZmEtYmlydGhkYXktY2FrZTpiZWZvcmV7Y29udGVudDoiXGYxZmQifS5mYS1hcmVhLWNoYXJ0OmJlZm9yZXtjb250ZW50OiJcZjFmZSJ9LmZhLXBpZS1jaGFydDpiZWZvcmV7Y29udGVudDoiXGYyMDAifS5mYS1saW5lLWNoYXJ0OmJlZm9yZXtjb250ZW50OiJcZjIwMSJ9LmZhLWxhc3RmbTpiZWZvcmV7Y29udGVudDoiXGYyMDIifS5mYS1sYXN0Zm0tc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjIwMyJ9LmZhLXRvZ2dsZS1vZmY6YmVmb3Jle2NvbnRlbnQ6IlxmMjA0In0uZmEtdG9nZ2xlLW9uOmJlZm9yZXtjb250ZW50OiJcZjIwNSJ9LmZhLWJpY3ljbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMjA2In0uZmEtYnVzOmJlZm9yZXtjb250ZW50OiJcZjIwNyJ9LmZhLWlveGhvc3Q6YmVmb3Jle2NvbnRlbnQ6IlxmMjA4In0uZmEtYW5nZWxsaXN0OmJlZm9yZXtjb250ZW50OiJcZjIwOSJ9LmZhLWNjOmJlZm9yZXtjb250ZW50OiJcZjIwYSJ9LmZhLXNoZWtlbDpiZWZvcmUsLmZhLXNoZXFlbDpiZWZvcmUsLmZhLWlsczpiZWZvcmV7Y29udGVudDoiXGYyMGIifS5mYS1tZWFucGF0aDpiZWZvcmV7Y29udGVudDoiXGYyMGMifS5mYS1idXlzZWxsYWRzOmJlZm9yZXtjb250ZW50OiJcZjIwZCJ9LmZhLWNvbm5lY3RkZXZlbG9wOmJlZm9yZXtjb250ZW50OiJcZjIwZSJ9LmZhLWRhc2hjdWJlOmJlZm9yZXtjb250ZW50OiJcZjIxMCJ9LmZhLWZvcnVtYmVlOmJlZm9yZXtjb250ZW50OiJcZjIxMSJ9LmZhLWxlYW5wdWI6YmVmb3Jle2NvbnRlbnQ6IlxmMjEyIn0uZmEtc2VsbHN5OmJlZm9yZXtjb250ZW50OiJcZjIxMyJ9LmZhLXNoaXJ0c2luYnVsazpiZWZvcmV7Y29udGVudDoiXGYyMTQifS5mYS1zaW1wbHlidWlsdDpiZWZvcmV7Y29udGVudDoiXGYyMTUifS5mYS1za3lhdGxhczpiZWZvcmV7Y29udGVudDoiXGYyMTYifS5mYS1jYXJ0LXBsdXM6YmVmb3Jle2NvbnRlbnQ6IlxmMjE3In0uZmEtY2FydC1hcnJvdy1kb3duOmJlZm9yZXtjb250ZW50OiJcZjIxOCJ9LmZhLWRpYW1vbmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMjE5In0uZmEtc2hpcDpiZWZvcmV7Y29udGVudDoiXGYyMWEifS5mYS11c2VyLXNlY3JldDpiZWZvcmV7Y29udGVudDoiXGYyMWIifS5mYS1tb3RvcmN5Y2xlOmJlZm9yZXtjb250ZW50OiJcZjIxYyJ9LmZhLXN0cmVldC12aWV3OmJlZm9yZXtjb250ZW50OiJcZjIxZCJ9LmZhLWhlYXJ0YmVhdDpiZWZvcmV7Y29udGVudDoiXGYyMWUifS5mYS12ZW51czpiZWZvcmV7Y29udGVudDoiXGYyMjEifS5mYS1tYXJzOmJlZm9yZXtjb250ZW50OiJcZjIyMiJ9LmZhLW1lcmN1cnk6YmVmb3Jle2NvbnRlbnQ6IlxmMjIzIn0uZmEtaW50ZXJzZXg6YmVmb3JlLC5mYS10cmFuc2dlbmRlcjpiZWZvcmV7Y29udGVudDoiXGYyMjQifS5mYS10cmFuc2dlbmRlci1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMjI1In0uZmEtdmVudXMtZG91YmxlOmJlZm9yZXtjb250ZW50OiJcZjIyNiJ9LmZhLW1hcnMtZG91YmxlOmJlZm9yZXtjb250ZW50OiJcZjIyNyJ9LmZhLXZlbnVzLW1hcnM6YmVmb3Jle2NvbnRlbnQ6IlxmMjI4In0uZmEtbWFycy1zdHJva2U6YmVmb3Jle2NvbnRlbnQ6IlxmMjI5In0uZmEtbWFycy1zdHJva2UtdjpiZWZvcmV7Y29udGVudDoiXGYyMmEifS5mYS1tYXJzLXN0cm9rZS1oOmJlZm9yZXtjb250ZW50OiJcZjIyYiJ9LmZhLW5ldXRlcjpiZWZvcmV7Y29udGVudDoiXGYyMmMifS5mYS1nZW5kZXJsZXNzOmJlZm9yZXtjb250ZW50OiJcZjIyZCJ9LmZhLWZhY2Vib29rLW9mZmljaWFsOmJlZm9yZXtjb250ZW50OiJcZjIzMCJ9LmZhLXBpbnRlcmVzdC1wOmJlZm9yZXtjb250ZW50OiJcZjIzMSJ9LmZhLXdoYXRzYXBwOmJlZm9yZXtjb250ZW50OiJcZjIzMiJ9LmZhLXNlcnZlcjpiZWZvcmV7Y29udGVudDoiXGYyMzMifS5mYS11c2VyLXBsdXM6YmVmb3Jle2NvbnRlbnQ6IlxmMjM0In0uZmEtdXNlci10aW1lczpiZWZvcmV7Y29udGVudDoiXGYyMzUifS5mYS1ob3RlbDpiZWZvcmUsLmZhLWJlZDpiZWZvcmV7Y29udGVudDoiXGYyMzYifS5mYS12aWFjb2luOmJlZm9yZXtjb250ZW50OiJcZjIzNyJ9LmZhLXRyYWluOmJlZm9yZXtjb250ZW50OiJcZjIzOCJ9LmZhLXN1YndheTpiZWZvcmV7Y29udGVudDoiXGYyMzkifS5mYS1tZWRpdW06YmVmb3Jle2NvbnRlbnQ6IlxmMjNhIn0uZmEteWM6YmVmb3JlLC5mYS15LWNvbWJpbmF0b3I6YmVmb3Jle2NvbnRlbnQ6IlxmMjNiIn0uZmEtb3B0aW4tbW9uc3RlcjpiZWZvcmV7Y29udGVudDoiXGYyM2MifS5mYS1vcGVuY2FydDpiZWZvcmV7Y29udGVudDoiXGYyM2QifS5mYS1leHBlZGl0ZWRzc2w6YmVmb3Jle2NvbnRlbnQ6IlxmMjNlIn0uZmEtYmF0dGVyeS00OmJlZm9yZSwuZmEtYmF0dGVyeS1mdWxsOmJlZm9yZXtjb250ZW50OiJcZjI0MCJ9LmZhLWJhdHRlcnktMzpiZWZvcmUsLmZhLWJhdHRlcnktdGhyZWUtcXVhcnRlcnM6YmVmb3Jle2NvbnRlbnQ6IlxmMjQxIn0uZmEtYmF0dGVyeS0yOmJlZm9yZSwuZmEtYmF0dGVyeS1oYWxmOmJlZm9yZXtjb250ZW50OiJcZjI0MiJ9LmZhLWJhdHRlcnktMTpiZWZvcmUsLmZhLWJhdHRlcnktcXVhcnRlcjpiZWZvcmV7Y29udGVudDoiXGYyNDMifS5mYS1iYXR0ZXJ5LTA6YmVmb3JlLC5mYS1iYXR0ZXJ5LWVtcHR5OmJlZm9yZXtjb250ZW50OiJcZjI0NCJ9LmZhLW1vdXNlLXBvaW50ZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMjQ1In0uZmEtaS1jdXJzb3I6YmVmb3Jle2NvbnRlbnQ6IlxmMjQ2In0uZmEtb2JqZWN0LWdyb3VwOmJlZm9yZXtjb250ZW50OiJcZjI0NyJ9LmZhLW9iamVjdC11bmdyb3VwOmJlZm9yZXtjb250ZW50OiJcZjI0OCJ9LmZhLXN0aWNreS1ub3RlOmJlZm9yZXtjb250ZW50OiJcZjI0OSJ9LmZhLXN0aWNreS1ub3RlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMjRhIn0uZmEtY2MtamNiOmJlZm9yZXtjb250ZW50OiJcZjI0YiJ9LmZhLWNjLWRpbmVycy1jbHViOmJlZm9yZXtjb250ZW50OiJcZjI0YyJ9LmZhLWNsb25lOmJlZm9yZXtjb250ZW50OiJcZjI0ZCJ9LmZhLWJhbGFuY2Utc2NhbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMjRlIn0uZmEtaG91cmdsYXNzLW86YmVmb3Jle2NvbnRlbnQ6IlxmMjUwIn0uZmEtaG91cmdsYXNzLTE6YmVmb3JlLC5mYS1ob3VyZ2xhc3Mtc3RhcnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMjUxIn0uZmEtaG91cmdsYXNzLTI6YmVmb3JlLC5mYS1ob3VyZ2xhc3MtaGFsZjpiZWZvcmV7Y29udGVudDoiXGYyNTIifS5mYS1ob3VyZ2xhc3MtMzpiZWZvcmUsLmZhLWhvdXJnbGFzcy1lbmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMjUzIn0uZmEtaG91cmdsYXNzOmJlZm9yZXtjb250ZW50OiJcZjI1NCJ9LmZhLWhhbmQtZ3JhYi1vOmJlZm9yZSwuZmEtaGFuZC1yb2NrLW86YmVmb3Jle2NvbnRlbnQ6IlxmMjU1In0uZmEtaGFuZC1zdG9wLW86YmVmb3JlLC5mYS1oYW5kLXBhcGVyLW86YmVmb3Jle2NvbnRlbnQ6IlxmMjU2In0uZmEtaGFuZC1zY2lzc29ycy1vOmJlZm9yZXtjb250ZW50OiJcZjI1NyJ9LmZhLWhhbmQtbGl6YXJkLW86YmVmb3Jle2NvbnRlbnQ6IlxmMjU4In0uZmEtaGFuZC1zcG9jay1vOmJlZm9yZXtjb250ZW50OiJcZjI1OSJ9LmZhLWhhbmQtcG9pbnRlci1vOmJlZm9yZXtjb250ZW50OiJcZjI1YSJ9LmZhLWhhbmQtcGVhY2UtbzpiZWZvcmV7Y29udGVudDoiXGYyNWIifS5mYS10cmFkZW1hcms6YmVmb3Jle2NvbnRlbnQ6IlxmMjVjIn0uZmEtcmVnaXN0ZXJlZDpiZWZvcmV7Y29udGVudDoiXGYyNWQifS5mYS1jcmVhdGl2ZS1jb21tb25zOmJlZm9yZXtjb250ZW50OiJcZjI1ZSJ9LmZhLWdnOmJlZm9yZXtjb250ZW50OiJcZjI2MCJ9LmZhLWdnLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYyNjEifS5mYS10cmlwYWR2aXNvcjpiZWZvcmV7Y29udGVudDoiXGYyNjIifS5mYS1vZG5va2xhc3NuaWtpOmJlZm9yZXtjb250ZW50OiJcZjI2MyJ9LmZhLW9kbm9rbGFzc25pa2ktc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjI2NCJ9LmZhLWdldC1wb2NrZXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMjY1In0uZmEtd2lraXBlZGlhLXc6YmVmb3Jle2NvbnRlbnQ6IlxmMjY2In0uZmEtc2FmYXJpOmJlZm9yZXtjb250ZW50OiJcZjI2NyJ9LmZhLWNocm9tZTpiZWZvcmV7Y29udGVudDoiXGYyNjgifS5mYS1maXJlZm94OmJlZm9yZXtjb250ZW50OiJcZjI2OSJ9LmZhLW9wZXJhOmJlZm9yZXtjb250ZW50OiJcZjI2YSJ9LmZhLWludGVybmV0LWV4cGxvcmVyOmJlZm9yZXtjb250ZW50OiJcZjI2YiJ9LmZhLXR2OmJlZm9yZSwuZmEtdGVsZXZpc2lvbjpiZWZvcmV7Y29udGVudDoiXGYyNmMifS5mYS1jb250YW86YmVmb3Jle2NvbnRlbnQ6IlxmMjZkIn0uZmEtNTAwcHg6YmVmb3Jle2NvbnRlbnQ6IlxmMjZlIn0uZmEtYW1hem9uOmJlZm9yZXtjb250ZW50OiJcZjI3MCJ9LmZhLWNhbGVuZGFyLXBsdXMtbzpiZWZvcmV7Y29udGVudDoiXGYyNzEifS5mYS1jYWxlbmRhci1taW51cy1vOmJlZm9yZXtjb250ZW50OiJcZjI3MiJ9LmZhLWNhbGVuZGFyLXRpbWVzLW86YmVmb3Jle2NvbnRlbnQ6IlxmMjczIn0uZmEtY2FsZW5kYXItY2hlY2stbzpiZWZvcmV7Y29udGVudDoiXGYyNzQifS5mYS1pbmR1c3RyeTpiZWZvcmV7Y29udGVudDoiXGYyNzUifS5mYS1tYXAtcGluOmJlZm9yZXtjb250ZW50OiJcZjI3NiJ9LmZhLW1hcC1zaWduczpiZWZvcmV7Y29udGVudDoiXGYyNzcifS5mYS1tYXAtbzpiZWZvcmV7Y29udGVudDoiXGYyNzgifS5mYS1tYXA6YmVmb3Jle2NvbnRlbnQ6IlxmMjc5In0uZmEtY29tbWVudGluZzpiZWZvcmV7Y29udGVudDoiXGYyN2EifS5mYS1jb21tZW50aW5nLW86YmVmb3Jle2NvbnRlbnQ6IlxmMjdiIn0uZmEtaG91eno6YmVmb3Jle2NvbnRlbnQ6IlxmMjdjIn0uZmEtdmltZW86YmVmb3Jle2NvbnRlbnQ6IlxmMjdkIn0uZmEtYmxhY2stdGllOmJlZm9yZXtjb250ZW50OiJcZjI3ZSJ9LmZhLWZvbnRpY29uczpiZWZvcmV7Y29udGVudDoiXGYyODAifQo="></style>

<script id=" ol_buiild30.js " src="data:/text/plain;base64,IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMub2w9ZSgpOnQub2w9ZSgpfSh3aW5kb3csZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gaShyKXtpZihlW3JdKXJldHVybiBlW3JdLmV4cG9ydHM7dmFyIG49ZVtyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbcl0uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsaSksbi5sPSEwLG4uZXhwb3J0c31yZXR1cm4gaS5tPXQsaS5jPWUsaS5kPWZ1bmN0aW9uKHQsZSxyKXtpLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxpLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0saS50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1pKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGkucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbiBpbiB0KWkuZChyLG4sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxuKSk7cmV0dXJuIHJ9LGkubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gaS5kKGUsImEiLGUpLGV9LGkubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0saS5wPSIiLGkoaS5zPTkpfShbZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9bix0LmV4cG9ydHMuZGVmYXVsdD1uO3ZhciByPWkoNSk7ZnVuY3Rpb24gbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG4pKXJldHVybiBuZXcgbih0LGUpO3RoaXMuX21heEVudHJpZXM9TWF0aC5tYXgoNCx0fHw5KSx0aGlzLl9taW5FbnRyaWVzPU1hdGgubWF4KDIsTWF0aC5jZWlsKC40KnRoaXMuX21heEVudHJpZXMpKSxlJiZ0aGlzLl9pbml0Rm9ybWF0KGUpLHRoaXMuY2xlYXIoKX1mdW5jdGlvbiBvKHQsZSxpKXtpZighaSlyZXR1cm4gZS5pbmRleE9mKHQpO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGkodCxlW3JdKSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBzKHQsZSl7YSh0LDAsdC5jaGlsZHJlbi5sZW5ndGgsZSx0KX1mdW5jdGlvbiBhKHQsZSxpLHIsbil7bnx8KG49eShudWxsKSksbi5taW5YPTEvMCxuLm1pblk9MS8wLG4ubWF4WD0tMS8wLG4ubWF4WT0tMS8wO2Zvcih2YXIgbyxzPWU7czxpO3MrKylvPXQuY2hpbGRyZW5bc10saChuLHQubGVhZj9yKG8pOm8pO3JldHVybiBufWZ1bmN0aW9uIGgodCxlKXtyZXR1cm4gdC5taW5YPU1hdGgubWluKHQubWluWCxlLm1pblgpLHQubWluWT1NYXRoLm1pbih0Lm1pblksZS5taW5ZKSx0Lm1heFg9TWF0aC5tYXgodC5tYXhYLGUubWF4WCksdC5tYXhZPU1hdGgubWF4KHQubWF4WSxlLm1heFkpLHR9ZnVuY3Rpb24gbCh0LGUpe3JldHVybiB0Lm1pblgtZS5taW5YfWZ1bmN0aW9uIHUodCxlKXtyZXR1cm4gdC5taW5ZLWUubWluWX1mdW5jdGlvbiBwKHQpe3JldHVybih0Lm1heFgtdC5taW5YKSoodC5tYXhZLXQubWluWSl9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gdC5tYXhYLXQubWluWCsodC5tYXhZLXQubWluWSl9ZnVuY3Rpb24gZCh0LGUpe3JldHVybihNYXRoLm1heChlLm1heFgsdC5tYXhYKS1NYXRoLm1pbihlLm1pblgsdC5taW5YKSkqKE1hdGgubWF4KGUubWF4WSx0Lm1heFkpLU1hdGgubWluKGUubWluWSx0Lm1pblkpKX1mdW5jdGlvbiBmKHQsZSl7dmFyIGk9TWF0aC5tYXgodC5taW5YLGUubWluWCkscj1NYXRoLm1heCh0Lm1pblksZS5taW5ZKSxuPU1hdGgubWluKHQubWF4WCxlLm1heFgpLG89TWF0aC5taW4odC5tYXhZLGUubWF4WSk7cmV0dXJuIE1hdGgubWF4KDAsbi1pKSpNYXRoLm1heCgwLG8tcil9ZnVuY3Rpb24gXyh0LGUpe3JldHVybiB0Lm1pblg8PWUubWluWCYmdC5taW5ZPD1lLm1pblkmJmUubWF4WDw9dC5tYXhYJiZlLm1heFk8PXQubWF4WX1mdW5jdGlvbiBnKHQsZSl7cmV0dXJuIGUubWluWDw9dC5tYXhYJiZlLm1pblk8PXQubWF4WSYmZS5tYXhYPj10Lm1pblgmJmUubWF4WT49dC5taW5ZfWZ1bmN0aW9uIHkodCl7cmV0dXJue2NoaWxkcmVuOnQsaGVpZ2h0OjEsbGVhZjohMCxtaW5YOjEvMCxtaW5ZOjEvMCxtYXhYOi0xLzAsbWF4WTotMS8wfX1mdW5jdGlvbiB2KHQsZSxpLG4sbyl7Zm9yKHZhciBzLGE9W2UsaV07YS5sZW5ndGg7KShpPWEucG9wKCkpLShlPWEucG9wKCkpPD1ufHwocz1lK01hdGguY2VpbCgoaS1lKS9uLzIpKm4scih0LHMsZSxpLG8pLGEucHVzaChlLHMscyxpKSl9bi5wcm90b3R5cGU9e2FsbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbGwodGhpcy5kYXRhLFtdKX0sc2VhcmNoOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGF0YSxpPVtdLHI9dGhpcy50b0JCb3g7aWYoIWcodCxlKSlyZXR1cm4gaTtmb3IodmFyIG4sbyxzLGEsaD1bXTtlOyl7Zm9yKG49MCxvPWUuY2hpbGRyZW4ubGVuZ3RoO248bztuKyspcz1lLmNoaWxkcmVuW25dLGcodCxhPWUubGVhZj9yKHMpOnMpJiYoZS5sZWFmP2kucHVzaChzKTpfKHQsYSk/dGhpcy5fYWxsKHMsaSk6aC5wdXNoKHMpKTtlPWgucG9wKCl9cmV0dXJuIGl9LGNvbGxpZGVzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGF0YSxpPXRoaXMudG9CQm94O2lmKCFnKHQsZSkpcmV0dXJuITE7Zm9yKHZhciByLG4sbyxzLGE9W107ZTspe2ZvcihyPTAsbj1lLmNoaWxkcmVuLmxlbmd0aDtyPG47cisrKWlmKG89ZS5jaGlsZHJlbltyXSxnKHQscz1lLmxlYWY/aShvKTpvKSl7aWYoZS5sZWFmfHxfKHQscykpcmV0dXJuITA7YS5wdXNoKG8pfWU9YS5wb3AoKX1yZXR1cm4hMX0sbG9hZDpmdW5jdGlvbih0KXtpZighdHx8IXQubGVuZ3RoKXJldHVybiB0aGlzO2lmKHQubGVuZ3RoPHRoaXMuX21pbkVudHJpZXMpe2Zvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpO2UrKyl0aGlzLmluc2VydCh0W2VdKTtyZXR1cm4gdGhpc312YXIgcj10aGlzLl9idWlsZCh0LnNsaWNlKCksMCx0Lmxlbmd0aC0xLDApO2lmKHRoaXMuZGF0YS5jaGlsZHJlbi5sZW5ndGgpaWYodGhpcy5kYXRhLmhlaWdodD09PXIuaGVpZ2h0KXRoaXMuX3NwbGl0Um9vdCh0aGlzLmRhdGEscik7ZWxzZXtpZih0aGlzLmRhdGEuaGVpZ2h0PHIuaGVpZ2h0KXt2YXIgbj10aGlzLmRhdGE7dGhpcy5kYXRhPXIscj1ufXRoaXMuX2luc2VydChyLHRoaXMuZGF0YS5oZWlnaHQtci5oZWlnaHQtMSwhMCl9ZWxzZSB0aGlzLmRhdGE9cjtyZXR1cm4gdGhpc30saW5zZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0aGlzLl9pbnNlcnQodCx0aGlzLmRhdGEuaGVpZ2h0LTEpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YT15KFtdKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gdGhpcztmb3IodmFyIGkscixuLHMsYT10aGlzLmRhdGEsaD10aGlzLnRvQkJveCh0KSxsPVtdLHU9W107YXx8bC5sZW5ndGg7KXtpZihhfHwoYT1sLnBvcCgpLHI9bFtsLmxlbmd0aC0xXSxpPXUucG9wKCkscz0hMCksYS5sZWFmJiYtMSE9PShuPW8odCxhLmNoaWxkcmVuLGUpKSlyZXR1cm4gYS5jaGlsZHJlbi5zcGxpY2UobiwxKSxsLnB1c2goYSksdGhpcy5fY29uZGVuc2UobCksdGhpcztzfHxhLmxlYWZ8fCFfKGEsaCk/cj8oaSsrLGE9ci5jaGlsZHJlbltpXSxzPSExKTphPW51bGw6KGwucHVzaChhKSx1LnB1c2goaSksaT0wLHI9YSxhPWEuY2hpbGRyZW5bMF0pfXJldHVybiB0aGlzfSx0b0JCb3g6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGNvbXBhcmVNaW5YOmwsY29tcGFyZU1pblk6dSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfSxmcm9tSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXRhPXQsdGhpc30sX2FsbDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1bXTt0Oyl0LmxlYWY/ZS5wdXNoLmFwcGx5KGUsdC5jaGlsZHJlbik6aS5wdXNoLmFwcGx5KGksdC5jaGlsZHJlbiksdD1pLnBvcCgpO3JldHVybiBlfSxfYnVpbGQ6ZnVuY3Rpb24odCxlLGkscil7dmFyIG4sbz1pLWUrMSxhPXRoaXMuX21heEVudHJpZXM7aWYobzw9YSlyZXR1cm4gcyhuPXkodC5zbGljZShlLGkrMSkpLHRoaXMudG9CQm94KSxuO3J8fChyPU1hdGguY2VpbChNYXRoLmxvZyhvKS9NYXRoLmxvZyhhKSksYT1NYXRoLmNlaWwoby9NYXRoLnBvdyhhLHItMSkpKSwobj15KFtdKSkubGVhZj0hMSxuLmhlaWdodD1yO3ZhciBoLGwsdSxwLGM9TWF0aC5jZWlsKG8vYSksZD1jKk1hdGguY2VpbChNYXRoLnNxcnQoYSkpO2Zvcih2KHQsZSxpLGQsdGhpcy5jb21wYXJlTWluWCksaD1lO2g8PWk7aCs9ZClmb3Iodih0LGgsdT1NYXRoLm1pbihoK2QtMSxpKSxjLHRoaXMuY29tcGFyZU1pblkpLGw9aDtsPD11O2wrPWMpcD1NYXRoLm1pbihsK2MtMSx1KSxuLmNoaWxkcmVuLnB1c2godGhpcy5fYnVpbGQodCxsLHAsci0xKSk7cmV0dXJuIHMobix0aGlzLnRvQkJveCksbn0sX2Nob29zZVN1YnRyZWU6ZnVuY3Rpb24odCxlLGkscil7Zm9yKHZhciBuLG8scyxhLGgsbCx1LGM7ci5wdXNoKGUpLCFlLmxlYWYmJnIubGVuZ3RoLTEhPT1pOyl7Zm9yKHU9Yz0xLzAsbj0wLG89ZS5jaGlsZHJlbi5sZW5ndGg7bjxvO24rKyloPXAocz1lLmNoaWxkcmVuW25dKSwobD1kKHQscyktaCk8Yz8oYz1sLHU9aDx1P2g6dSxhPXMpOmw9PT1jJiZoPHUmJih1PWgsYT1zKTtlPWF8fGUuY2hpbGRyZW5bMF19cmV0dXJuIGV9LF9pbnNlcnQ6ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMudG9CQm94LG49aT90OnIodCksbz1bXSxzPXRoaXMuX2Nob29zZVN1YnRyZWUobix0aGlzLmRhdGEsZSxvKTtmb3Iocy5jaGlsZHJlbi5wdXNoKHQpLGgocyxuKTtlPj0wJiZvW2VdLmNoaWxkcmVuLmxlbmd0aD50aGlzLl9tYXhFbnRyaWVzOyl0aGlzLl9zcGxpdChvLGUpLGUtLTt0aGlzLl9hZGp1c3RQYXJlbnRCQm94ZXMobixvLGUpfSxfc3BsaXQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10W2VdLHI9aS5jaGlsZHJlbi5sZW5ndGgsbj10aGlzLl9taW5FbnRyaWVzO3RoaXMuX2Nob29zZVNwbGl0QXhpcyhpLG4scik7dmFyIG89dGhpcy5fY2hvb3NlU3BsaXRJbmRleChpLG4sciksYT15KGkuY2hpbGRyZW4uc3BsaWNlKG8saS5jaGlsZHJlbi5sZW5ndGgtbykpO2EuaGVpZ2h0PWkuaGVpZ2h0LGEubGVhZj1pLmxlYWYscyhpLHRoaXMudG9CQm94KSxzKGEsdGhpcy50b0JCb3gpLGU/dFtlLTFdLmNoaWxkcmVuLnB1c2goYSk6dGhpcy5fc3BsaXRSb290KGksYSl9LF9zcGxpdFJvb3Q6ZnVuY3Rpb24odCxlKXt0aGlzLmRhdGE9eShbdCxlXSksdGhpcy5kYXRhLmhlaWdodD10LmhlaWdodCsxLHRoaXMuZGF0YS5sZWFmPSExLHModGhpcy5kYXRhLHRoaXMudG9CQm94KX0sX2Nob29zZVNwbGl0SW5kZXg6ZnVuY3Rpb24odCxlLGkpe3ZhciByLG4sbyxzLGgsbCx1LGM7Zm9yKGw9dT0xLzAscj1lO3I8PWktZTtyKyspcz1mKG49YSh0LDAscix0aGlzLnRvQkJveCksbz1hKHQscixpLHRoaXMudG9CQm94KSksaD1wKG4pK3AobyksczxsPyhsPXMsYz1yLHU9aDx1P2g6dSk6cz09PWwmJmg8dSYmKHU9aCxjPXIpO3JldHVybiBjfSxfY2hvb3NlU3BsaXRBeGlzOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10LmxlYWY/dGhpcy5jb21wYXJlTWluWDpsLG49dC5sZWFmP3RoaXMuY29tcGFyZU1pblk6dTt0aGlzLl9hbGxEaXN0TWFyZ2luKHQsZSxpLHIpPHRoaXMuX2FsbERpc3RNYXJnaW4odCxlLGksbikmJnQuY2hpbGRyZW4uc29ydChyKX0sX2FsbERpc3RNYXJnaW46ZnVuY3Rpb24odCxlLGkscil7dC5jaGlsZHJlbi5zb3J0KHIpO3ZhciBuLG8scz10aGlzLnRvQkJveCxsPWEodCwwLGUscyksdT1hKHQsaS1lLGkscykscD1jKGwpK2ModSk7Zm9yKG49ZTtuPGktZTtuKyspbz10LmNoaWxkcmVuW25dLGgobCx0LmxlYWY/cyhvKTpvKSxwKz1jKGwpO2ZvcihuPWktZS0xO24+PWU7bi0tKW89dC5jaGlsZHJlbltuXSxoKHUsdC5sZWFmP3Mobyk6bykscCs9Yyh1KTtyZXR1cm4gcH0sX2FkanVzdFBhcmVudEJCb3hlczpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciByPWk7cj49MDtyLS0paChlW3JdLHQpfSxfY29uZGVuc2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dC5sZW5ndGgtMTtpPj0wO2ktLSkwPT09dFtpXS5jaGlsZHJlbi5sZW5ndGg/aT4wPyhlPXRbaS0xXS5jaGlsZHJlbikuc3BsaWNlKGUuaW5kZXhPZih0W2ldKSwxKTp0aGlzLmNsZWFyKCk6cyh0W2ldLHRoaXMudG9CQm94KX0sX2luaXRGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9WyJyZXR1cm4gYSIsIiAtIGIiLCI7Il07dGhpcy5jb21wYXJlTWluWD1uZXcgRnVuY3Rpb24oImEiLCJiIixlLmpvaW4odFswXSkpLHRoaXMuY29tcGFyZU1pblk9bmV3IEZ1bmN0aW9uKCJhIiwiYiIsZS5qb2luKHRbMV0pKSx0aGlzLnRvQkJveD1uZXcgRnVuY3Rpb24oImEiLCJyZXR1cm4ge21pblg6IGEiK3RbMF0rIiwgbWluWTogYSIrdFsxXSsiLCBtYXhYOiBhIit0WzJdKyIsIG1heFk6IGEiK3RbM10rIn07Iil9fX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9bjt2YXIgcj1pKDYpO2Z1bmN0aW9uIG4odCl7dGhpcy5idWY9QXJyYXlCdWZmZXIuaXNWaWV3JiZBcnJheUJ1ZmZlci5pc1ZpZXcodCk/dDpuZXcgVWludDhBcnJheSh0fHwwKSx0aGlzLnBvcz0wLHRoaXMudHlwZT0wLHRoaXMubGVuZ3RoPXRoaXMuYnVmLmxlbmd0aH1uLlZhcmludD0wLG4uRml4ZWQ2ND0xLG4uQnl0ZXM9MixuLkZpeGVkMzI9NTtmdW5jdGlvbiBvKHQpe3JldHVybiB0LnR5cGU9PT1uLkJ5dGVzP3QucmVhZFZhcmludCgpK3QucG9zOnQucG9zKzF9ZnVuY3Rpb24gcyh0LGUsaSl7cmV0dXJuIGk/NDI5NDk2NzI5NiplKyh0Pj4+MCk6NDI5NDk2NzI5NiooZT4+PjApKyh0Pj4+MCl9ZnVuY3Rpb24gYSh0LGUsaSl7dmFyIHI9ZTw9MTYzODM/MTplPD0yMDk3MTUxPzI6ZTw9MjY4NDM1NDU1PzM6TWF0aC5jZWlsKE1hdGgubG9nKGUpLyg3Kk1hdGguTE4yKSk7aS5yZWFsbG9jKHIpO2Zvcih2YXIgbj1pLnBvcy0xO24+PXQ7bi0tKWkuYnVmW24rcl09aS5idWZbbl19ZnVuY3Rpb24gaCh0LGUpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWUud3JpdGVWYXJpbnQodFtpXSl9ZnVuY3Rpb24gbCh0LGUpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWUud3JpdGVTVmFyaW50KHRbaV0pfWZ1bmN0aW9uIHUodCxlKXtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyllLndyaXRlRmxvYXQodFtpXSl9ZnVuY3Rpb24gcCh0LGUpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWUud3JpdGVEb3VibGUodFtpXSl9ZnVuY3Rpb24gYyh0LGUpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWUud3JpdGVCb29sZWFuKHRbaV0pfWZ1bmN0aW9uIGQodCxlKXtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyllLndyaXRlRml4ZWQzMih0W2ldKX1mdW5jdGlvbiBmKHQsZSl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspZS53cml0ZVNGaXhlZDMyKHRbaV0pfWZ1bmN0aW9uIF8odCxlKXtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyllLndyaXRlRml4ZWQ2NCh0W2ldKX1mdW5jdGlvbiBnKHQsZSl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspZS53cml0ZVNGaXhlZDY0KHRbaV0pfWZ1bmN0aW9uIHkodCxlKXtyZXR1cm4odFtlXXx0W2UrMV08PDh8dFtlKzJdPDwxNikrMTY3NzcyMTYqdFtlKzNdfWZ1bmN0aW9uIHYodCxlLGkpe3RbaV09ZSx0W2krMV09ZT4+PjgsdFtpKzJdPWU+Pj4xNix0W2krM109ZT4+PjI0fWZ1bmN0aW9uIG0odCxlKXtyZXR1cm4odFtlXXx0W2UrMV08PDh8dFtlKzJdPDwxNikrKHRbZSszXTw8MjQpfW4ucHJvdG90eXBlPXtkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5idWY9bnVsbH0scmVhZEZpZWxkczpmdW5jdGlvbih0LGUsaSl7Zm9yKGk9aXx8dGhpcy5sZW5ndGg7dGhpcy5wb3M8aTspe3ZhciByPXRoaXMucmVhZFZhcmludCgpLG49cj4+MyxvPXRoaXMucG9zO3RoaXMudHlwZT03JnIsdChuLGUsdGhpcyksdGhpcy5wb3M9PT1vJiZ0aGlzLnNraXAocil9cmV0dXJuIGV9LHJlYWRNZXNzYWdlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVhZEZpZWxkcyh0LGUsdGhpcy5yZWFkVmFyaW50KCkrdGhpcy5wb3MpfSxyZWFkRml4ZWQzMjpmdW5jdGlvbigpe3ZhciB0PXkodGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkU0ZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD1tKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsdH0scmVhZEZpeGVkNjQ6ZnVuY3Rpb24oKXt2YXIgdD15KHRoaXMuYnVmLHRoaXMucG9zKSs0Mjk0OTY3Mjk2KnkodGhpcy5idWYsdGhpcy5wb3MrNCk7cmV0dXJuIHRoaXMucG9zKz04LHR9LHJlYWRTRml4ZWQ2NDpmdW5jdGlvbigpe3ZhciB0PXkodGhpcy5idWYsdGhpcy5wb3MpKzQyOTQ5NjcyOTYqbSh0aGlzLmJ1Zix0aGlzLnBvcys0KTtyZXR1cm4gdGhpcy5wb3MrPTgsdH0scmVhZEZsb2F0OmZ1bmN0aW9uKCl7dmFyIHQ9ci5yZWFkKHRoaXMuYnVmLHRoaXMucG9zLCEwLDIzLDQpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkRG91YmxlOmZ1bmN0aW9uKCl7dmFyIHQ9ci5yZWFkKHRoaXMuYnVmLHRoaXMucG9zLCEwLDUyLDgpO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkVmFyaW50OmZ1bmN0aW9uKHQpe3ZhciBlLGkscj10aGlzLmJ1ZjtyZXR1cm4gZT0xMjcmKGk9clt0aGlzLnBvcysrXSksaTwxMjg/ZTooZXw9KDEyNyYoaT1yW3RoaXMucG9zKytdKSk8PDcsaTwxMjg/ZTooZXw9KDEyNyYoaT1yW3RoaXMucG9zKytdKSk8PDE0LGk8MTI4P2U6KGV8PSgxMjcmKGk9clt0aGlzLnBvcysrXSkpPDwyMSxpPDEyOD9lOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcixuLG89aS5idWY7aWYobj1vW2kucG9zKytdLHI9KDExMiZuKT4+NCxuPDEyOClyZXR1cm4gcyh0LHIsZSk7aWYobj1vW2kucG9zKytdLHJ8PSgxMjcmbik8PDMsbjwxMjgpcmV0dXJuIHModCxyLGUpO2lmKG49b1tpLnBvcysrXSxyfD0oMTI3Jm4pPDwxMCxuPDEyOClyZXR1cm4gcyh0LHIsZSk7aWYobj1vW2kucG9zKytdLHJ8PSgxMjcmbik8PDE3LG48MTI4KXJldHVybiBzKHQscixlKTtpZihuPW9baS5wb3MrK10scnw9KDEyNyZuKTw8MjQsbjwxMjgpcmV0dXJuIHModCxyLGUpO2lmKG49b1tpLnBvcysrXSxyfD0oMSZuKTw8MzEsbjwxMjgpcmV0dXJuIHModCxyLGUpO3Rocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMiKX0oZXw9KDE1JihpPXJbdGhpcy5wb3NdKSk8PDI4LHQsdGhpcykpKSl9LHJlYWRWYXJpbnQ2NDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRWYXJpbnQoITApfSxyZWFkU1ZhcmludDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpO3JldHVybiB0JTI9PTE/KHQrMSkvLTI6dC8yfSxyZWFkQm9vbGVhbjpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKX0scmVhZFN0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9ZnVuY3Rpb24odCxlLGkpe3ZhciByPSIiLG49ZTtmb3IoO248aTspe3ZhciBvLHMsYSxoPXRbbl0sbD1udWxsLHU9aD4yMzk/NDpoPjIyMz8zOmg+MTkxPzI6MTtpZihuK3U+aSlicmVhazsxPT09dT9oPDEyOCYmKGw9aCk6Mj09PXU/MTI4PT0oMTkyJihvPXRbbisxXSkpJiYobD0oMzEmaCk8PDZ8NjMmbyk8PTEyNyYmKGw9bnVsbCk6Mz09PXU/KG89dFtuKzFdLHM9dFtuKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYoKGw9KDE1JmgpPDwxMnwoNjMmbyk8PDZ8NjMmcyk8PTIwNDd8fGw+PTU1Mjk2JiZsPD01NzM0MykmJihsPW51bGwpKTo0PT09dSYmKG89dFtuKzFdLHM9dFtuKzJdLGE9dFtuKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJigobD0oMTUmaCk8PDE4fCg2MyZvKTw8MTJ8KDYzJnMpPDw2fDYzJmEpPD02NTUzNXx8bD49MTExNDExMikmJihsPW51bGwpKSxudWxsPT09bD8obD02NTUzMyx1PTEpOmw+NjU1MzUmJihsLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGw+Pj4xMCYxMDIzfDU1Mjk2KSxsPTU2MzIwfDEwMjMmbCkscis9U3RyaW5nLmZyb21DaGFyQ29kZShsKSxuKz11fXJldHVybiByfSh0aGlzLmJ1Zix0aGlzLnBvcyx0KTtyZXR1cm4gdGhpcy5wb3M9dCxlfSxyZWFkQnl0ZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxlPXRoaXMuYnVmLnN1YmFycmF5KHRoaXMucG9zLHQpO3JldHVybiB0aGlzLnBvcz10LGV9LHJlYWRQYWNrZWRWYXJpbnQ6ZnVuY3Rpb24odCxlKXt2YXIgaT1vKHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGk7KXQucHVzaCh0aGlzLnJlYWRWYXJpbnQoZSkpO3JldHVybiB0fSxyZWFkUGFja2VkU1ZhcmludDpmdW5jdGlvbih0KXt2YXIgZT1vKHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO3JldHVybiB0fSxyZWFkUGFja2VkQm9vbGVhbjpmdW5jdGlvbih0KXt2YXIgZT1vKHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3JldHVybiB0fSxyZWFkUGFja2VkRmxvYXQ6ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkRmxvYXQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWREb3VibGU6ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO3JldHVybiB0fSxyZWFkUGFja2VkRml4ZWQzMjpmdW5jdGlvbih0KXt2YXIgZT1vKHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3JldHVybiB0fSxyZWFkUGFja2VkU0ZpeGVkMzI6ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRGaXhlZDY0OmZ1bmN0aW9uKHQpe3ZhciBlPW8odGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0KXt2YXIgZT1vKHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtyZXR1cm4gdH0sc2tpcDpmdW5jdGlvbih0KXt2YXIgZT03JnQ7aWYoZT09PW4uVmFyaW50KWZvcig7dGhpcy5idWZbdGhpcy5wb3MrK10+MTI3Oyk7ZWxzZSBpZihlPT09bi5CeXRlcyl0aGlzLnBvcz10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcztlbHNlIGlmKGU9PT1uLkZpeGVkMzIpdGhpcy5wb3MrPTQ7ZWxzZXtpZihlIT09bi5GaXhlZDY0KXRocm93IG5ldyBFcnJvcigiVW5pbXBsZW1lbnRlZCB0eXBlOiAiK2UpO3RoaXMucG9zKz04fX0sd3JpdGVUYWc6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8ZSl9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMubGVuZ3RofHwxNjtlPHRoaXMucG9zK3Q7KWUqPTI7aWYoZSE9PXRoaXMubGVuZ3RoKXt2YXIgaT1uZXcgVWludDhBcnJheShlKTtpLnNldCh0aGlzLmJ1ZiksdGhpcy5idWY9aSx0aGlzLmxlbmd0aD1lfX0sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMucG9zLHRoaXMucG9zPTAsdGhpcy5idWYuc3ViYXJyYXkoMCx0aGlzLmxlbmd0aCl9LHdyaXRlRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdih0aGlzLmJ1Zix0LHRoaXMucG9zKSx0aGlzLnBvcys9NH0sd3JpdGVTRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdih0aGlzLmJ1Zix0LHRoaXMucG9zKSx0aGlzLnBvcys9NH0sd3JpdGVGaXhlZDY0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg4KSx2KHRoaXMuYnVmLC0xJnQsdGhpcy5wb3MpLHYodGhpcy5idWYsTWF0aC5mbG9vcih0KigxLzQyOTQ5NjcyOTYpKSx0aGlzLnBvcys0KSx0aGlzLnBvcys9OH0sd3JpdGVTRml4ZWQ2NDpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoOCksdih0aGlzLmJ1ZiwtMSZ0LHRoaXMucG9zKSx2KHRoaXMuYnVmLE1hdGguZmxvb3IodCooMS80Mjk0OTY3Mjk2KSksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlVmFyaW50OmZ1bmN0aW9uKHQpeyh0PSt0fHwwKT4yNjg0MzU0NTV8fHQ8MD9mdW5jdGlvbih0LGUpe3ZhciBpLHI7dD49MD8oaT10JTQyOTQ5NjcyOTZ8MCxyPXQvNDI5NDk2NzI5NnwwKToocj1+KC10LzQyOTQ5NjcyOTYpLDQyOTQ5NjcyOTVeKGk9figtdCU0Mjk0OTY3Mjk2KSk/aT1pKzF8MDooaT0wLHI9cisxfDApKTtpZih0Pj0weDEwMDAwMDAwMDAwMDAwMDAwfHx0PC0weDEwMDAwMDAwMDAwMDAwMDAwKXRocm93IG5ldyBFcnJvcigiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXMiKTtlLnJlYWxsb2MoMTApLGZ1bmN0aW9uKHQsZSxpKXtpLmJ1ZltpLnBvcysrXT0xMjcmdHwxMjgsdD4+Pj03LGkuYnVmW2kucG9zKytdPTEyNyZ0fDEyOCx0Pj4+PTcsaS5idWZbaS5wb3MrK109MTI3JnR8MTI4LHQ+Pj49NyxpLmJ1ZltpLnBvcysrXT0xMjcmdHwxMjgsdD4+Pj03LGkuYnVmW2kucG9zXT0xMjcmdH0oaSwwLGUpLGZ1bmN0aW9uKHQsZSl7dmFyIGk9KDcmdCk8PDQ7aWYoZS5idWZbZS5wb3MrK118PWl8KCh0Pj4+PTMpPzEyODowKSwhdClyZXR1cm47aWYoZS5idWZbZS5wb3MrK109MTI3JnR8KCh0Pj4+PTcpPzEyODowKSwhdClyZXR1cm47aWYoZS5idWZbZS5wb3MrK109MTI3JnR8KCh0Pj4+PTcpPzEyODowKSwhdClyZXR1cm47aWYoZS5idWZbZS5wb3MrK109MTI3JnR8KCh0Pj4+PTcpPzEyODowKSwhdClyZXR1cm47aWYoZS5idWZbZS5wb3MrK109MTI3JnR8KCh0Pj4+PTcpPzEyODowKSwhdClyZXR1cm47ZS5idWZbZS5wb3MrK109MTI3JnR9KHIsZSl9KHQsdGhpcyk6KHRoaXMucmVhbGxvYyg0KSx0aGlzLmJ1Zlt0aGlzLnBvcysrXT0xMjcmdHwodD4xMjc/MTI4OjApLHQ8PTEyN3x8KHRoaXMuYnVmW3RoaXMucG9zKytdPTEyNyYodD4+Pj03KXwodD4xMjc/MTI4OjApLHQ8PTEyN3x8KHRoaXMuYnVmW3RoaXMucG9zKytdPTEyNyYodD4+Pj03KXwodD4xMjc/MTI4OjApLHQ8PTEyN3x8KHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj43JjEyNykpKSl9LHdyaXRlU1ZhcmludDpmdW5jdGlvbih0KXt0aGlzLndyaXRlVmFyaW50KHQ8MD8yKi10LTE6Mip0KX0sd3JpdGVCb29sZWFuOmZ1bmN0aW9uKHQpe3RoaXMud3JpdGVWYXJpbnQoQm9vbGVhbih0KSl9LHdyaXRlU3RyaW5nOmZ1bmN0aW9uKHQpe3Q9U3RyaW5nKHQpLHRoaXMucmVhbGxvYyg0KnQubGVuZ3RoKSx0aGlzLnBvcysrO3ZhciBlPXRoaXMucG9zO3RoaXMucG9zPWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIHIsbixvPTA7bzxlLmxlbmd0aDtvKyspe2lmKChyPWUuY2hhckNvZGVBdChvKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFuKXtyPjU2MzE5fHxvKzE9PT1lLmxlbmd0aD8odFtpKytdPTIzOSx0W2krK109MTkxLHRbaSsrXT0xODkpOm49cjtjb250aW51ZX1pZihyPDU2MzIwKXt0W2krK109MjM5LHRbaSsrXT0xOTEsdFtpKytdPTE4OSxuPXI7Y29udGludWV9cj1uLTU1Mjk2PDwxMHxyLTU2MzIwfDY1NTM2LG49bnVsbH1lbHNlIG4mJih0W2krK109MjM5LHRbaSsrXT0xOTEsdFtpKytdPTE4OSxuPW51bGwpO3I8MTI4P3RbaSsrXT1yOihyPDIwNDg/dFtpKytdPXI+PjZ8MTkyOihyPDY1NTM2P3RbaSsrXT1yPj4xMnwyMjQ6KHRbaSsrXT1yPj4xOHwyNDAsdFtpKytdPXI+PjEyJjYzfDEyOCksdFtpKytdPXI+PjYmNjN8MTI4KSx0W2krK109NjMmcnwxMjgpfXJldHVybiBpfSh0aGlzLmJ1Zix0LHRoaXMucG9zKTt2YXIgaT10aGlzLnBvcy1lO2k+PTEyOCYmYShlLGksdGhpcyksdGhpcy5wb3M9ZS0xLHRoaXMud3JpdGVWYXJpbnQoaSksdGhpcy5wb3MrPWl9LHdyaXRlRmxvYXQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDQpLHIud3JpdGUodGhpcy5idWYsdCx0aGlzLnBvcywhMCwyMyw0KSx0aGlzLnBvcys9NH0sd3JpdGVEb3VibGU6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHIud3JpdGUodGhpcy5idWYsdCx0aGlzLnBvcywhMCw1Miw4KSx0aGlzLnBvcys9OH0sd3JpdGVCeXRlczpmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGUpLHRoaXMucmVhbGxvYyhlKTtmb3IodmFyIGk9MDtpPGU7aSsrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbaV19LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGUpe3RoaXMucG9zKys7dmFyIGk9dGhpcy5wb3M7dChlLHRoaXMpO3ZhciByPXRoaXMucG9zLWk7cj49MTI4JiZhKGkscix0aGlzKSx0aGlzLnBvcz1pLTEsdGhpcy53cml0ZVZhcmludChyKSx0aGlzLnBvcys9cn0sd3JpdGVNZXNzYWdlOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLndyaXRlVGFnKHQsbi5CeXRlcyksdGhpcy53cml0ZVJhd01lc3NhZ2UoZSxpKX0sd3JpdGVQYWNrZWRWYXJpbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlTWVzc2FnZSh0LGgsZSl9LHdyaXRlUGFja2VkU1ZhcmludDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVNZXNzYWdlKHQsbCxlKX0sd3JpdGVQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZU1lc3NhZ2UodCxjLGUpfSx3cml0ZVBhY2tlZEZsb2F0OmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZU1lc3NhZ2UodCx1LGUpfSx3cml0ZVBhY2tlZERvdWJsZTpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVNZXNzYWdlKHQscCxlKX0sd3JpdGVQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZU1lc3NhZ2UodCxkLGUpfSx3cml0ZVBhY2tlZFNGaXhlZDMyOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZU1lc3NhZ2UodCxmLGUpfSx3cml0ZVBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlTWVzc2FnZSh0LF8sZSl9LHdyaXRlUGFja2VkU0ZpeGVkNjQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlTWVzc2FnZSh0LGcsZSl9LHdyaXRlQnl0ZXNGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxuLkJ5dGVzKSx0aGlzLndyaXRlQnl0ZXMoZSl9LHdyaXRlRml4ZWQzMkZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LG4uRml4ZWQzMiksdGhpcy53cml0ZUZpeGVkMzIoZSl9LHdyaXRlU0ZpeGVkMzJGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxuLkZpeGVkMzIpLHRoaXMud3JpdGVTRml4ZWQzMihlKX0sd3JpdGVGaXhlZDY0RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsbi5GaXhlZDY0KSx0aGlzLndyaXRlRml4ZWQ2NChlKX0sd3JpdGVTRml4ZWQ2NEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LG4uRml4ZWQ2NCksdGhpcy53cml0ZVNGaXhlZDY0KGUpfSx3cml0ZVZhcmludEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LG4uVmFyaW50KSx0aGlzLndyaXRlVmFyaW50KGUpfSx3cml0ZVNWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxuLlZhcmludCksdGhpcy53cml0ZVNWYXJpbnQoZSl9LHdyaXRlU3RyaW5nRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsbi5CeXRlcyksdGhpcy53cml0ZVN0cmluZyhlKX0sd3JpdGVGbG9hdEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LG4uRml4ZWQzMiksdGhpcy53cml0ZUZsb2F0KGUpfSx3cml0ZURvdWJsZUZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LG4uRml4ZWQ2NCksdGhpcy53cml0ZURvdWJsZShlKX0sd3JpdGVCb29sZWFuRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVmFyaW50RmllbGQodCxCb29sZWFuKGUpKX19fSxmdW5jdGlvbih0LGUsaSl7dmFyIHI9aSg3KTtlLlByb2Nlc3Nvcj1yfSwsLGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdCh0LGUsaSl7dmFyIHI9dFtlXTt0W2VdPXRbaV0sdFtpXT1yfWZ1bmN0aW9uIGUodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9cmV0dXJuIGZ1bmN0aW9uKGkscixuLG8scyl7IWZ1bmN0aW9uIGUoaSxyLG4sbyxzKXtmb3IoO28+bjspe2lmKG8tbj42MDApe3ZhciBhPW8tbisxLGg9ci1uKzEsbD1NYXRoLmxvZyhhKSx1PS41Kk1hdGguZXhwKDIqbC8zKSxwPS41Kk1hdGguc3FydChsKnUqKGEtdSkvYSkqKGgtYS8yPDA/LTE6MSksYz1NYXRoLm1heChuLE1hdGguZmxvb3Ioci1oKnUvYStwKSksZD1NYXRoLm1pbihvLE1hdGguZmxvb3IocisoYS1oKSp1L2ErcCkpO2UoaSxyLGMsZCxzKX12YXIgZj1pW3JdLF89bixnPW87Zm9yKHQoaSxuLHIpLHMoaVtvXSxmKT4wJiZ0KGksbixvKTtfPGc7KXtmb3IodChpLF8sZyksXysrLGctLTtzKGlbX10sZik8MDspXysrO2Zvcig7cyhpW2ddLGYpPjA7KWctLX0wPT09cyhpW25dLGYpP3QoaSxuLGcpOnQoaSwrK2csbyksZzw9ciYmKG49ZysxKSxyPD1nJiYobz1nLTEpfX0oaSxyLG58fDAsb3x8aS5sZW5ndGgtMSxzfHxlKX19KCl9LGZ1bmN0aW9uKHQsZSl7ZS5yZWFkPWZ1bmN0aW9uKHQsZSxpLHIsbil7dmFyIG8scyxhPTgqbi1yLTEsaD0oMTw8YSktMSxsPWg+PjEsdT0tNyxwPWk/bi0xOjAsYz1pPy0xOjEsZD10W2UrcF07Zm9yKHArPWMsbz1kJigxPDwtdSktMSxkPj49LXUsdSs9YTt1PjA7bz0yNTYqbyt0W2UrcF0scCs9Yyx1LT04KTtmb3Iocz1vJigxPDwtdSktMSxvPj49LXUsdSs9cjt1PjA7cz0yNTYqcyt0W2UrcF0scCs9Yyx1LT04KTtpZigwPT09bylvPTEtbDtlbHNle2lmKG89PT1oKXJldHVybiBzP05hTjoxLzAqKGQ/LTE6MSk7cys9TWF0aC5wb3coMixyKSxvLT1sfXJldHVybihkPy0xOjEpKnMqTWF0aC5wb3coMixvLXIpfSxlLndyaXRlPWZ1bmN0aW9uKHQsZSxpLHIsbixvKXt2YXIgcyxhLGgsbD04Km8tbi0xLHU9KDE8PGwpLTEscD11Pj4xLGM9MjM9PT1uP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxkPXI/MDpvLTEsZj1yPzE6LTEsXz1lPDB8fDA9PT1lJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KGE9aXNOYU4oZSk/MTowLHM9dSk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSooaD1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSxoKj0yKSwoZSs9cytwPj0xP2MvaDpjKk1hdGgucG93KDIsMS1wKSkqaD49MiYmKHMrKyxoLz0yKSxzK3A+PXU/KGE9MCxzPXUpOnMrcD49MT8oYT0oZSpoLTEpKk1hdGgucG93KDIsbikscys9cCk6KGE9ZSpNYXRoLnBvdygyLHAtMSkqTWF0aC5wb3coMixuKSxzPTApKTtuPj04O3RbaStkXT0yNTUmYSxkKz1mLGEvPTI1NixuLT04KTtmb3Iocz1zPDxufGEsbCs9bjtsPjA7dFtpK2RdPTI1NSZzLGQrPWYscy89MjU2LGwtPTgpO3RbaStkLWZdfD0xMjgqX319LGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pKDgpLm5ld0ltYWdlRGF0YTtmdW5jdGlvbiBuKHQpe3ZhciBlPSEwO3RyeXtuZXcgSW1hZ2VEYXRhKDEwLDEwKX1jYXRjaCh0KXtlPSExfWZ1bmN0aW9uIGkodCxpLHIpe3JldHVybiBlP25ldyBJbWFnZURhdGEodCxpLHIpOntkYXRhOnQsd2lkdGg6aSxoZWlnaHQ6cn19cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLG4sbz1lLmJ1ZmZlcnMscz1lLm1ldGEsYT1lLmltYWdlT3BzLGg9ZS53aWR0aCxsPWUuaGVpZ2h0LHU9by5sZW5ndGgscD1vWzBdLmJ5dGVMZW5ndGg7aWYoYSl7dmFyIGM9bmV3IEFycmF5KHUpO2ZvcihuPTA7bjx1OysrbiljW25dPWkobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG9bbl0pLGgsbCk7cj10KGMscykuZGF0YX1lbHNle3I9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHApO3ZhciBkPW5ldyBBcnJheSh1KSxmPW5ldyBBcnJheSh1KTtmb3Iobj0wO248dTsrK24pZFtuXT1uZXcgVWludDhDbGFtcGVkQXJyYXkob1tuXSksZltuXT1bMCwwLDAsMF07Zm9yKHZhciBfPTA7XzxwO18rPTQpe2Zvcih2YXIgZz0wO2c8dTsrK2cpe3ZhciB5PWRbZ107ZltnXVswXT15W19dLGZbZ11bMV09eVtfKzFdLGZbZ11bMl09eVtfKzJdLGZbZ11bM109eVtfKzNdfXZhciB2PXQoZixzKTtyW19dPXZbMF0scltfKzFdPXZbMV0scltfKzJdPXZbMl0scltfKzNdPXZbM119fXJldHVybiByLmJ1ZmZlcn19ZnVuY3Rpb24gbyh0LGUpe3ZhciBpPU9iamVjdC5rZXlzKHQubGlifHx7fSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiJ2YXIgIitlKyIgPSAiK3QubGliW2VdLnRvU3RyaW5nKCkrIjsifSkuY29uY2F0KFsidmFyIF9fbWluaW9uX18gPSAoIituLnRvU3RyaW5nKCkrIikoIix0Lm9wZXJhdGlvbi50b1N0cmluZygpLCIpOyIsJ3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIGZ1bmN0aW9uKGV2ZW50KSB7JywiICB2YXIgYnVmZmVyID0gX19taW5pb25fXyhldmVudC5kYXRhKTsiLCIgIHNlbGYucG9zdE1lc3NhZ2Uoe2J1ZmZlcjogYnVmZmVyLCBtZXRhOiBldmVudC5kYXRhLm1ldGF9LCBbYnVmZmVyXSk7IiwifSk7Il0pLHI9bmV3IEJsb2IoaSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pLG89VVJMLmNyZWF0ZU9iamVjdFVSTChyKSxzPW5ldyBXb3JrZXIobyk7cmV0dXJuIHMuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZSksc31mdW5jdGlvbiBzKHQpe3ZhciBlO3RoaXMuX2ltYWdlT3BzPSEhdC5pbWFnZU9wczt2YXIgaT1bXTtpZihlPTA9PT10LnRocmVhZHM/MDp0aGlzLl9pbWFnZU9wcz8xOnQudGhyZWFkc3x8MSlmb3IodmFyIHI9MDtyPGU7KytyKWlbcl09byh0LHRoaXMuX29uV29ya2VyTWVzc2FnZS5iaW5kKHRoaXMscikpO2Vsc2UgaVswXT1mdW5jdGlvbih0LGUpe3ZhciBpPW4odC5vcGVyYXRpb24pO3JldHVybntwb3N0TWVzc2FnZTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSh7ZGF0YTp7YnVmZmVyOmkodCksbWV0YTp0Lm1ldGF9fSl9LDApfX19KHQsdGhpcy5fb25Xb3JrZXJNZXNzYWdlLmJpbmQodGhpcywwKSk7dGhpcy5fd29ya2Vycz1pLHRoaXMuX3F1ZXVlPVtdLHRoaXMuX21heFF1ZXVlTGVuZ3RoPXQucXVldWV8fDEvMCx0aGlzLl9ydW5uaW5nPTAsdGhpcy5fZGF0YUxvb2t1cD17fSx0aGlzLl9qb2I9bnVsbH1zLnByb3RvdHlwZS5wcm9jZXNzPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9lbnF1ZXVlKHtpbnB1dHM6dCxtZXRhOmUsY2FsbGJhY2s6aX0pLHRoaXMuX2Rpc3BhdGNoKCl9LHMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcyl0aGlzW3RdPW51bGw7dGhpcy5fZGVzdHJveWVkPSEwfSxzLnByb3RvdHlwZS5fZW5xdWV1ZT1mdW5jdGlvbih0KXtmb3IodGhpcy5fcXVldWUucHVzaCh0KTt0aGlzLl9xdWV1ZS5sZW5ndGg+dGhpcy5fbWF4UXVldWVMZW5ndGg7KXRoaXMuX3F1ZXVlLnNoaWZ0KCkuY2FsbGJhY2sobnVsbCxudWxsKX0scy5wcm90b3R5cGUuX2Rpc3BhdGNoPWZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuX3J1bm5pbmcmJnRoaXMuX3F1ZXVlLmxlbmd0aD4wKXt2YXIgdD10aGlzLl9qb2I9dGhpcy5fcXVldWUuc2hpZnQoKSxlPXQuaW5wdXRzWzBdLndpZHRoLGk9dC5pbnB1dHNbMF0uaGVpZ2h0LHI9dC5pbnB1dHMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRhdGEuYnVmZmVyfSksbj10aGlzLl93b3JrZXJzLmxlbmd0aDtpZih0aGlzLl9ydW5uaW5nPW4sMT09PW4pdGhpcy5fd29ya2Vyc1swXS5wb3N0TWVzc2FnZSh7YnVmZmVyczpyLG1ldGE6dC5tZXRhLGltYWdlT3BzOnRoaXMuX2ltYWdlT3BzLHdpZHRoOmUsaGVpZ2h0Oml9LHIpO2Vsc2UgZm9yKHZhciBvPXQuaW5wdXRzWzBdLmRhdGEubGVuZ3RoLHM9NCpNYXRoLmNlaWwoby80L24pLGE9MDthPG47KythKXtmb3IodmFyIGg9YSpzLGw9W10sdT0wLHA9ci5sZW5ndGg7dTxwOysrdSlsLnB1c2goclthXS5zbGljZShoLGgrcykpO3RoaXMuX3dvcmtlcnNbYV0ucG9zdE1lc3NhZ2Uoe2J1ZmZlcnM6bCxtZXRhOnQubWV0YSxpbWFnZU9wczp0aGlzLl9pbWFnZU9wcyx3aWR0aDplLGhlaWdodDppfSxsKX19fSxzLnByb3RvdHlwZS5fb25Xb3JrZXJNZXNzYWdlPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZGVzdHJveWVkfHwodGhpcy5fZGF0YUxvb2t1cFt0XT1lLmRhdGEsLS10aGlzLl9ydW5uaW5nLDA9PT10aGlzLl9ydW5uaW5nJiZ0aGlzLl9yZXNvbHZlSm9iKCkpfSxzLnByb3RvdHlwZS5fcmVzb2x2ZUpvYj1mdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLl9qb2Isbj10aGlzLl93b3JrZXJzLmxlbmd0aDtpZigxPT09bil0PW5ldyBVaW50OENsYW1wZWRBcnJheSh0aGlzLl9kYXRhTG9va3VwWzBdLmJ1ZmZlciksZT10aGlzLl9kYXRhTG9va3VwWzBdLm1ldGE7ZWxzZXt2YXIgbz1pLmlucHV0c1swXS5kYXRhLmxlbmd0aDt0PW5ldyBVaW50OENsYW1wZWRBcnJheShvKSxlPW5ldyBBcnJheShvKTtmb3IodmFyIHM9NCpNYXRoLmNlaWwoby80L24pLGE9MDthPG47KythKXt2YXIgaD10aGlzLl9kYXRhTG9va3VwW2FdLmJ1ZmZlcixsPWEqczt0LnNldChuZXcgVWludDhDbGFtcGVkQXJyYXkoaCksbCksZVthXT10aGlzLl9kYXRhTG9va3VwW2FdLm1ldGF9fXRoaXMuX2pvYj1udWxsLHRoaXMuX2RhdGFMb29rdXA9e30saS5jYWxsYmFjayhudWxsLHIodCxpLmlucHV0c1swXS53aWR0aCxpLmlucHV0c1swXS5oZWlnaHQpLGUpLHRoaXMuX2Rpc3BhdGNoKCl9LHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUpe3ZhciBpPSEwO3RyeXtuZXcgSW1hZ2VEYXRhKDEwLDEwKX1jYXRjaCh0KXtpPSExfXZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7ZS5uZXdJbWFnZURhdGE9ZnVuY3Rpb24odCxlLG4pe2lmKGkpcmV0dXJuIG5ldyBJbWFnZURhdGEodCxlLG4pO3ZhciBvPXIuY3JlYXRlSW1hZ2VEYXRhKGUsbik7cmV0dXJuIG8uZGF0YS5zZXQodCksb319LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe3JldHVybiBmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiVW5pbXBsZW1lbnRlZCBhYnN0cmFjdCBtZXRob2QuIil9KCl9aS5yKGUpO3ZhciBuPTA7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdC5vbF91aWR8fCh0Lm9sX3VpZD1TdHJpbmcoKytuKSl9dmFyIHM9IjUuMy4wIixhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9IkFzc2VydGlvbiBmYWlsZWQuIFNlZSBodHRwczovL29wZW5sYXllcnMub3JnL2VuLyIrKCJsYXRlc3QiPT09cz9zOiJ2IitzLnNwbGl0KCItIilbMF0pKyIvZG9jL2Vycm9ycy8jIitlKyIgZm9yIGRldGFpbHMuIjt0LmNhbGwodGhpcyxpKSx0aGlzLmNvZGU9ZSx0aGlzLm5hbWU9IkFzc2VydGlvbkVycm9yIix0aGlzLm1lc3NhZ2U9aX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oRXJyb3IpLGg9e0FERDoiYWRkIixSRU1PVkU6InJlbW92ZSJ9LGw9InByb3BlcnR5Y2hhbmdlIix1PSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ246ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHM7aWYodm9pZCAwPT09dHx8bnVsbD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7Zm9yKHZhciByPU9iamVjdCh0KSxuPTEsbz1hcmd1bWVudHMubGVuZ3RoO248bzsrK24pe3ZhciBzPWlbbl07aWYodm9pZCAwIT09cyYmbnVsbCE9PXMpZm9yKHZhciBhIGluIHMpcy5oYXNPd25Qcm9wZXJ0eShhKSYmKHJbYV09c1thXSl9cmV0dXJuIHJ9O2Z1bmN0aW9uIHAodCl7Zm9yKHZhciBlIGluIHQpZGVsZXRlIHRbZV19ZnVuY3Rpb24gYyh0KXt2YXIgZT1bXTtmb3IodmFyIGkgaW4gdCllLnB1c2godFtpXSk7cmV0dXJuIGV9ZnVuY3Rpb24gZCh0KXt2YXIgZTtmb3IoZSBpbiB0KXJldHVybiExO3JldHVybiFlfWZ1bmN0aW9uIGYodCxlLGkscil7Zm9yKHZhciBuLG89MCxzPXQubGVuZ3RoO288czsrK28paWYoKG49dFtvXSkubGlzdGVuZXI9PT1lJiZuLmJpbmRUbz09PWkpcmV0dXJuIHImJihuLmRlbGV0ZUluZGV4PW8pLG59ZnVuY3Rpb24gXyh0LGUpe3ZhciBpPWcodCk7cmV0dXJuIGk/aVtlXTp2b2lkIDB9ZnVuY3Rpb24gZyh0LGUpe3ZhciBpPXQub2xfbG07cmV0dXJuIWkmJmUmJihpPXQub2xfbG09e30pLGl9ZnVuY3Rpb24geSh0LGUpe3ZhciBpPV8odCxlKTtpZihpKXtmb3IodmFyIHI9MCxuPWkubGVuZ3RoO3I8bjsrK3IpdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsaVtyXS5ib3VuZExpc3RlbmVyKSxwKGlbcl0pO2kubGVuZ3RoPTA7dmFyIG89Zyh0KTtvJiYoZGVsZXRlIG9bZV0sMD09PU9iamVjdC5rZXlzKG8pLmxlbmd0aCYmZnVuY3Rpb24odCl7ZGVsZXRlIHQub2xfbG19KHQpKX19ZnVuY3Rpb24gdih0LGUsaSxyLG4pe3ZhciBvPWcodCwhMCkscz1vW2VdO3N8fChzPW9bZV09W10pO3ZhciBhPWYocyxpLHIsITEpO3JldHVybiBhP258fChhLmNhbGxPbmNlPSExKTooYT17YmluZFRvOnIsY2FsbE9uY2U6ISFuLGxpc3RlbmVyOmksdGFyZ2V0OnQsdHlwZTplfSx0LmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbihlKXt2YXIgaT10Lmxpc3RlbmVyLHI9dC5iaW5kVG98fHQudGFyZ2V0O3JldHVybiB0LmNhbGxPbmNlJiZFKHQpLGkuY2FsbChyLGUpfTtyZXR1cm4gdC5ib3VuZExpc3RlbmVyPWUsZX0oYSkpLHMucHVzaChhKSksYX1mdW5jdGlvbiBtKHQsZSxpLHIpe3JldHVybiB2KHQsZSxpLHIsITApfWZ1bmN0aW9uIHgodCxlLGkscil7dmFyIG49Xyh0LGUpO2lmKG4pe3ZhciBvPWYobixpLHIsITApO28mJkUobyl9fWZ1bmN0aW9uIEUodCl7aWYodCYmdC50YXJnZXQpe3QudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodC50eXBlLHQuYm91bmRMaXN0ZW5lcik7dmFyIGU9Xyh0LnRhcmdldCx0LnR5cGUpO2lmKGUpe3ZhciBpPSJkZWxldGVJbmRleCJpbiB0P3QuZGVsZXRlSW5kZXg6ZS5pbmRleE9mKHQpOy0xIT09aSYmZS5zcGxpY2UoaSwxKSwwPT09ZS5sZW5ndGgmJnkodC50YXJnZXQsdC50eXBlKX1wKHQpfX1mdW5jdGlvbiBTKHQpe3ZhciBlPWcodCk7aWYoZSlmb3IodmFyIGkgaW4gZSl5KHQsaSl9dmFyIFQ9ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2VkXz0hMX07VC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZGlzcG9zZWRffHwodGhpcy5kaXNwb3NlZF89ITAsdGhpcy5kaXNwb3NlSW50ZXJuYWwoKSl9LFQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbD1mdW5jdGlvbigpe307dmFyIEM9VDtmdW5jdGlvbiBSKCl7cmV0dXJuITB9ZnVuY3Rpb24gdygpe3JldHVybiExfWZ1bmN0aW9uIEkoKXt9dmFyIEw9ZnVuY3Rpb24odCl7dGhpcy5wcm9wYWdhdGlvblN0b3BwZWQsdGhpcy50eXBlPXQsdGhpcy50YXJnZXQ9bnVsbH07ZnVuY3Rpb24gTyh0KXt0LnN0b3BQcm9wYWdhdGlvbigpfUwucHJvdG90eXBlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITB9LEwucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe3RoaXMucHJvcGFnYXRpb25TdG9wcGVkPSEwfTt2YXIgUD1MLGI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLnBlbmRpbmdSZW1vdmFsc189e30sdGhpcy5kaXNwYXRjaGluZ189e30sdGhpcy5saXN0ZW5lcnNfPXt9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5saXN0ZW5lcnNfW3RdO2l8fChpPXRoaXMubGlzdGVuZXJzX1t0XT1bXSksLTE9PT1pLmluZGV4T2YoZSkmJmkucHVzaChlKX0sZS5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudD1mdW5jdGlvbih0KXt2YXIgZT0ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFAodCk6dCxpPWUudHlwZTtlLnRhcmdldD10aGlzO3ZhciByLG49dGhpcy5saXN0ZW5lcnNfW2ldO2lmKG4pe2kgaW4gdGhpcy5kaXNwYXRjaGluZ198fCh0aGlzLmRpc3BhdGNoaW5nX1tpXT0wLHRoaXMucGVuZGluZ1JlbW92YWxzX1tpXT0wKSwrK3RoaXMuZGlzcGF0Y2hpbmdfW2ldO2Zvcih2YXIgbz0wLHM9bi5sZW5ndGg7bzxzOysrbylpZighMT09PW5bb10uY2FsbCh0aGlzLGUpfHxlLnByb3BhZ2F0aW9uU3RvcHBlZCl7cj0hMTticmVha31pZigtLXRoaXMuZGlzcGF0Y2hpbmdfW2ldLDA9PT10aGlzLmRpc3BhdGNoaW5nX1tpXSl7dmFyIGE9dGhpcy5wZW5kaW5nUmVtb3ZhbHNfW2ldO2ZvcihkZWxldGUgdGhpcy5wZW5kaW5nUmVtb3ZhbHNfW2ldO2EtLTspdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGksSSk7ZGVsZXRlIHRoaXMuZGlzcGF0Y2hpbmdfW2ldfXJldHVybiByfX0sZS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsPWZ1bmN0aW9uKCl7Uyh0aGlzKX0sZS5wcm90b3R5cGUuZ2V0TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxpc3RlbmVyc19bdF19LGUucHJvdG90eXBlLmhhc0xpc3RlbmVyPWZ1bmN0aW9uKHQpe3JldHVybiB0P3QgaW4gdGhpcy5saXN0ZW5lcnNfOk9iamVjdC5rZXlzKHRoaXMubGlzdGVuZXJzXykubGVuZ3RoPjB9LGUucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmxpc3RlbmVyc19bdF07aWYoaSl7dmFyIHI9aS5pbmRleE9mKGUpO3QgaW4gdGhpcy5wZW5kaW5nUmVtb3ZhbHNfPyhpW3JdPUksKyt0aGlzLnBlbmRpbmdSZW1vdmFsc19bdF0pOihpLnNwbGljZShyLDEpLDA9PT1pLmxlbmd0aCYmZGVsZXRlIHRoaXMubGlzdGVuZXJzX1t0XSl9fSxlfShDKSxNPXtDSEFOR0U6ImNoYW5nZSIsQ0xFQVI6ImNsZWFyIixDT05URVhUTUVOVToiY29udGV4dG1lbnUiLENMSUNLOiJjbGljayIsREJMQ0xJQ0s6ImRibGNsaWNrIixEUkFHRU5URVI6ImRyYWdlbnRlciIsRFJBR09WRVI6ImRyYWdvdmVyIixEUk9QOiJkcm9wIixFUlJPUjoiZXJyb3IiLEtFWURPV046ImtleWRvd24iLEtFWVBSRVNTOiJrZXlwcmVzcyIsTE9BRDoibG9hZCIsTU9VU0VET1dOOiJtb3VzZWRvd24iLE1PVVNFTU9WRToibW91c2Vtb3ZlIixNT1VTRU9VVDoibW91c2VvdXQiLE1PVVNFVVA6Im1vdXNldXAiLE1PVVNFV0hFRUw6Im1vdXNld2hlZWwiLE1TUE9JTlRFUkRPV046Ik1TUG9pbnRlckRvd24iLFJFU0laRToicmVzaXplIixUT1VDSFNUQVJUOiJ0b3VjaHN0YXJ0IixUT1VDSE1PVkU6InRvdWNobW92ZSIsVE9VQ0hFTkQ6InRvdWNoZW5kIixXSEVFTDoid2hlZWwifTt2YXIgRj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMucmV2aXNpb25fPTB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNoYW5nZWQ9ZnVuY3Rpb24oKXsrK3RoaXMucmV2aXNpb25fLHRoaXMuZGlzcGF0Y2hFdmVudChNLkNIQU5HRSl9LGUucHJvdG90eXBlLmdldFJldmlzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmV2aXNpb25ffSxlLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgaT10Lmxlbmd0aCxyPW5ldyBBcnJheShpKSxuPTA7bjxpOysrbilyW25dPXYodGhpcyx0W25dLGUpO3JldHVybiByfXJldHVybiB2KHRoaXMsdCxlKX0sZS5wcm90b3R5cGUub25jZT1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgaT10Lmxlbmd0aCxyPW5ldyBBcnJheShpKSxuPTA7bjxpOysrbilyW25dPW0odGhpcyx0W25dLGUpO3JldHVybiByfXJldHVybiBtKHRoaXMsdCxlKX0sZS5wcm90b3R5cGUudW49ZnVuY3Rpb24odCxlKXtpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgaT0wLHI9dC5sZW5ndGg7aTxyOysraSl4KHRoaXMsdFtpXSxlKTtlbHNlIHgodGhpcyx0LGUpfSxlfShiKSxBPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIpe3QuY2FsbCh0aGlzLGUpLHRoaXMua2V5PWksdGhpcy5vbGRWYWx1ZT1yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShQKSxOPXt9O2Z1bmN0aW9uIEcodCl7cmV0dXJuIE4uaGFzT3duUHJvcGVydHkodCk/Tlt0XTpOW3RdPSJjaGFuZ2U6Iit0fXZhciBEPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLG8odGhpcyksdGhpcy52YWx1ZXNfPXt9LHZvaWQgMCE9PWUmJnRoaXMuc2V0UHJvcGVydGllcyhlKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiB0aGlzLnZhbHVlc18uaGFzT3duUHJvcGVydHkodCkmJihlPXRoaXMudmFsdWVzX1t0XSksZX0sZS5wcm90b3R5cGUuZ2V0S2V5cz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlc18pfSxlLnByb3RvdHlwZS5nZXRQcm9wZXJ0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHUoe30sdGhpcy52YWx1ZXNfKX0sZS5wcm90b3R5cGUubm90aWZ5PWZ1bmN0aW9uKHQsZSl7dmFyIGk7aT1HKHQpLHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQShpLHQsZSkpLGk9bCx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEEoaSx0LGUpKX0sZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxpKXtpZihpKXRoaXMudmFsdWVzX1t0XT1lO2Vsc2V7dmFyIHI9dGhpcy52YWx1ZXNfW3RdO3RoaXMudmFsdWVzX1t0XT1lLHIhPT1lJiZ0aGlzLm5vdGlmeSh0LHIpfX0sZS5wcm90b3R5cGUuc2V0UHJvcGVydGllcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaSBpbiB0KXRoaXMuc2V0KGksdFtpXSxlKX0sZS5wcm90b3R5cGUudW5zZXQ9ZnVuY3Rpb24odCxlKXtpZih0IGluIHRoaXMudmFsdWVzXyl7dmFyIGk9dGhpcy52YWx1ZXNfW3RdO2RlbGV0ZSB0aGlzLnZhbHVlc19bdF0sZXx8dGhpcy5ub3RpZnkodCxpKX19LGV9KEYpLGs9Imxlbmd0aCIsaj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMsZSksdGhpcy5lbGVtZW50PWl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KFApLFU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkpe3QuY2FsbCh0aGlzKTt2YXIgcj1pfHx7fTtpZih0aGlzLnVuaXF1ZV89ISFyLnVuaXF1ZSx0aGlzLmFycmF5Xz1lfHxbXSx0aGlzLnVuaXF1ZV8pZm9yKHZhciBuPTAsbz10aGlzLmFycmF5Xy5sZW5ndGg7bjxvOysrbil0aGlzLmFzc2VydFVuaXF1ZV8odGhpcy5hcnJheV9bbl0sbik7dGhpcy51cGRhdGVMZW5ndGhfKCl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmdldExlbmd0aCgpPjA7KXRoaXMucG9wKCl9LGUucHJvdG90eXBlLmV4dGVuZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPXQubGVuZ3RoO2U8aTsrK2UpdGhpcy5wdXNoKHRbZV0pO3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmFycmF5XyxpPTAscj1lLmxlbmd0aDtpPHI7KytpKXQoZVtpXSxpLGUpfSxlLnByb3RvdHlwZS5nZXRBcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5X30sZS5wcm90b3R5cGUuaXRlbT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hcnJheV9bdF19LGUucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChrKX0sZS5wcm90b3R5cGUuaW5zZXJ0QXQ9ZnVuY3Rpb24odCxlKXt0aGlzLnVuaXF1ZV8mJnRoaXMuYXNzZXJ0VW5pcXVlXyhlKSx0aGlzLmFycmF5Xy5zcGxpY2UodCwwLGUpLHRoaXMudXBkYXRlTGVuZ3RoXygpLHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgaihoLkFERCxlKSl9LGUucHJvdG90eXBlLnBvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbW92ZUF0KHRoaXMuZ2V0TGVuZ3RoKCktMSl9LGUucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dGhpcy51bmlxdWVfJiZ0aGlzLmFzc2VydFVuaXF1ZV8odCk7dmFyIGU9dGhpcy5nZXRMZW5ndGgoKTtyZXR1cm4gdGhpcy5pbnNlcnRBdChlLHQpLHRoaXMuZ2V0TGVuZ3RoKCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5hcnJheV8saT0wLHI9ZS5sZW5ndGg7aTxyOysraSlpZihlW2ldPT09dClyZXR1cm4gdGhpcy5yZW1vdmVBdChpKX0sZS5wcm90b3R5cGUucmVtb3ZlQXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hcnJheV9bdF07cmV0dXJuIHRoaXMuYXJyYXlfLnNwbGljZSh0LDEpLHRoaXMudXBkYXRlTGVuZ3RoXygpLHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgaihoLlJFTU9WRSxlKSksZX0sZS5wcm90b3R5cGUuc2V0QXQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldExlbmd0aCgpO2lmKHQ8aSl7dGhpcy51bmlxdWVfJiZ0aGlzLmFzc2VydFVuaXF1ZV8oZSx0KTt2YXIgcj10aGlzLmFycmF5X1t0XTt0aGlzLmFycmF5X1t0XT1lLHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgaihoLlJFTU9WRSxyKSksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBqKGguQURELGUpKX1lbHNle2Zvcih2YXIgbj1pO248dDsrK24pdGhpcy5pbnNlcnRBdChuLHZvaWQgMCk7dGhpcy5pbnNlcnRBdCh0LGUpfX0sZS5wcm90b3R5cGUudXBkYXRlTGVuZ3RoXz1mdW5jdGlvbigpe3RoaXMuc2V0KGssdGhpcy5hcnJheV8ubGVuZ3RoKX0sZS5wcm90b3R5cGUuYXNzZXJ0VW5pcXVlXz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wLHI9dGhpcy5hcnJheV8ubGVuZ3RoO2k8cjsrK2kpaWYodGhpcy5hcnJheV9baV09PT10JiZpIT09ZSl0aHJvdyBuZXcgYSg1OCl9LGV9KEQpO2Z1bmN0aW9uIFkodCxlKXtpZighdCl0aHJvdyBuZXcgYShlKX12YXIgQj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2lmKHQuY2FsbCh0aGlzKSx0aGlzLmlkXz12b2lkIDAsdGhpcy5nZW9tZXRyeU5hbWVfPSJnZW9tZXRyeSIsdGhpcy5zdHlsZV89bnVsbCx0aGlzLnN0eWxlRnVuY3Rpb25fPXZvaWQgMCx0aGlzLmdlb21ldHJ5Q2hhbmdlS2V5Xz1udWxsLHYodGhpcyxHKHRoaXMuZ2VvbWV0cnlOYW1lXyksdGhpcy5oYW5kbGVHZW9tZXRyeUNoYW5nZWRfLHRoaXMpLGUpaWYoImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0U2ltcGxpZmllZEdlb21ldHJ5KXt2YXIgaT1lO3RoaXMuc2V0R2VvbWV0cnkoaSl9ZWxzZXt2YXIgcj1lO3RoaXMuc2V0UHJvcGVydGllcyhyKX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGUodGhpcy5nZXRQcm9wZXJ0aWVzKCkpO3Quc2V0R2VvbWV0cnlOYW1lKHRoaXMuZ2V0R2VvbWV0cnlOYW1lKCkpO3ZhciBpPXRoaXMuZ2V0R2VvbWV0cnkoKTtpJiZ0LnNldEdlb21ldHJ5KGkuY2xvbmUoKSk7dmFyIHI9dGhpcy5nZXRTdHlsZSgpO3JldHVybiByJiZ0LnNldFN0eWxlKHIpLHR9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KHRoaXMuZ2VvbWV0cnlOYW1lXyl9LGUucHJvdG90eXBlLmdldElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWRffSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeU5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZW9tZXRyeU5hbWVffSxlLnByb3RvdHlwZS5nZXRTdHlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0eWxlX30sZS5wcm90b3R5cGUuZ2V0U3R5bGVGdW5jdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0eWxlRnVuY3Rpb25ffSxlLnByb3RvdHlwZS5oYW5kbGVHZW9tZXRyeUNoYW5nZV89ZnVuY3Rpb24oKXt0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuaGFuZGxlR2VvbWV0cnlDaGFuZ2VkXz1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnlDaGFuZ2VLZXlfJiYoRSh0aGlzLmdlb21ldHJ5Q2hhbmdlS2V5XyksdGhpcy5nZW9tZXRyeUNoYW5nZUtleV89bnVsbCk7dmFyIHQ9dGhpcy5nZXRHZW9tZXRyeSgpO3QmJih0aGlzLmdlb21ldHJ5Q2hhbmdlS2V5Xz12KHQsTS5DSEFOR0UsdGhpcy5oYW5kbGVHZW9tZXRyeUNoYW5nZV8sdGhpcykpLHRoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5zZXRHZW9tZXRyeT1mdW5jdGlvbih0KXt0aGlzLnNldCh0aGlzLmdlb21ldHJ5TmFtZV8sdCl9LGUucHJvdG90eXBlLnNldFN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuc3R5bGVfPXQsdGhpcy5zdHlsZUZ1bmN0aW9uXz10P2Z1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiB0O3ZhciBlO2lmKEFycmF5LmlzQXJyYXkodCkpZT10O2Vsc2V7WSgiZnVuY3Rpb24iPT10eXBlb2YgdC5nZXRaSW5kZXgsNDEpO3ZhciBpPXQ7ZT1baV19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV9fSh0KTp2b2lkIDAsdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLnNldElkPWZ1bmN0aW9uKHQpe3RoaXMuaWRfPXQsdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLnNldEdlb21ldHJ5TmFtZT1mdW5jdGlvbih0KXt4KHRoaXMsRyh0aGlzLmdlb21ldHJ5TmFtZV8pLHRoaXMuaGFuZGxlR2VvbWV0cnlDaGFuZ2VkXyx0aGlzKSx0aGlzLmdlb21ldHJ5TmFtZV89dCx2KHRoaXMsRyh0aGlzLmdlb21ldHJ5TmFtZV8pLHRoaXMuaGFuZGxlR2VvbWV0cnlDaGFuZ2VkXyx0aGlzKSx0aGlzLmhhbmRsZUdlb21ldHJ5Q2hhbmdlZF8oKX0sZX0oRCk7ZnVuY3Rpb24gVih0LGUpe3JldHVybiB0PmU/MTp0PGU/LTE6MH1mdW5jdGlvbiBYKHQsZSl7cmV0dXJuIHQuaW5kZXhPZihlKT49MH1mdW5jdGlvbiB6KHQsZSxpKXt2YXIgcixuPXQubGVuZ3RoO2lmKHRbMF08PWUpcmV0dXJuIDA7aWYoZTw9dFtuLTFdKXJldHVybiBuLTE7aWYoaT4wKXtmb3Iocj0xO3I8bjsrK3IpaWYodFtyXTxlKXJldHVybiByLTF9ZWxzZSBpZihpPDApe2ZvcihyPTE7cjxuOysrcilpZih0W3JdPD1lKXJldHVybiByfWVsc2UgZm9yKHI9MTtyPG47KytyKXtpZih0W3JdPT1lKXJldHVybiByO2lmKHRbcl08ZSlyZXR1cm4gdFtyLTFdLWU8ZS10W3JdP3ItMTpyfXJldHVybiBuLTF9ZnVuY3Rpb24gVyh0LGUsaSl7Zm9yKDtlPGk7KXt2YXIgcj10W2VdO3RbZV09dFtpXSx0W2ldPXIsKytlLC0taX19ZnVuY3Rpb24gSyh0LGUpe2Zvcih2YXIgaT1BcnJheS5pc0FycmF5KGUpP2U6W2VdLHI9aS5sZW5ndGgsbj0wO248cjtuKyspdFt0Lmxlbmd0aF09aVtuXX1mdW5jdGlvbiBIKHQsZSl7Zm9yKHZhciBpLHI9dC5sZW5ndGg+Pj4wLG49MDtuPHI7bisrKWlmKGUoaT10W25dLG4sdCkpcmV0dXJuIGk7cmV0dXJuIG51bGx9ZnVuY3Rpb24gWih0LGUpe3ZhciBpPXQubGVuZ3RoO2lmKGkhPT1lLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHI9MDtyPGk7cisrKWlmKHRbcl0hPT1lW3JdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHEodCxlKXt2YXIgaSxyPXQubGVuZ3RoLG49QXJyYXkodC5sZW5ndGgpO2ZvcihpPTA7aTxyO2krKyluW2ldPXtpbmRleDppLHZhbHVlOnRbaV19O2ZvcihuLnNvcnQoZnVuY3Rpb24odCxpKXtyZXR1cm4gZSh0LnZhbHVlLGkudmFsdWUpfHx0LmluZGV4LWkuaW5kZXh9KSxpPTA7aTx0Lmxlbmd0aDtpKyspdFtpXT1uW2ldLnZhbHVlfWZ1bmN0aW9uIEoodCxlKXt2YXIgaTtyZXR1cm4hdC5ldmVyeShmdW5jdGlvbihyLG4pe3JldHVybiBpPW4sIWUocixuLHQpfSk/aTotMX12YXIgUT17Qk9UVE9NX0xFRlQ6ImJvdHRvbS1sZWZ0IixCT1RUT01fUklHSFQ6ImJvdHRvbS1yaWdodCIsVE9QX0xFRlQ6InRvcC1sZWZ0IixUT1BfUklHSFQ6InRvcC1yaWdodCJ9LCQ9e1VOS05PV046MCxJTlRFUlNFQ1RJTkc6MSxBQk9WRToyLFJJR0hUOjQsQkVMT1c6OCxMRUZUOjE2fTtmdW5jdGlvbiB0dCh0KXtmb3IodmFyIGU9aHQoKSxpPTAscj10Lmxlbmd0aDtpPHI7KytpKV90KGUsdFtpXSk7cmV0dXJuIGV9ZnVuY3Rpb24gZXQodCxlLGkpe3JldHVybiBpPyhpWzBdPXRbMF0tZSxpWzFdPXRbMV0tZSxpWzJdPXRbMl0rZSxpWzNdPXRbM10rZSxpKTpbdFswXS1lLHRbMV0tZSx0WzJdK2UsdFszXStlXX1mdW5jdGlvbiBpdCh0LGUpe3JldHVybiBlPyhlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbM10sZSk6dC5zbGljZSgpfWZ1bmN0aW9uIHJ0KHQsZSxpKXt2YXIgcixuO3JldHVybihyPWU8dFswXT90WzBdLWU6dFsyXTxlP2UtdFsyXTowKSpyKyhuPWk8dFsxXT90WzFdLWk6dFszXTxpP2ktdFszXTowKSpufWZ1bmN0aW9uIG50KHQsZSl7cmV0dXJuIHN0KHQsZVswXSxlWzFdKX1mdW5jdGlvbiBvdCh0LGUpe3JldHVybiB0WzBdPD1lWzBdJiZlWzJdPD10WzJdJiZ0WzFdPD1lWzFdJiZlWzNdPD10WzNdfWZ1bmN0aW9uIHN0KHQsZSxpKXtyZXR1cm4gdFswXTw9ZSYmZTw9dFsyXSYmdFsxXTw9aSYmaTw9dFszXX1mdW5jdGlvbiBhdCh0LGUpe3ZhciBpPXRbMF0scj10WzFdLG49dFsyXSxvPXRbM10scz1lWzBdLGE9ZVsxXSxoPSQuVU5LTk9XTjtyZXR1cm4gczxpP2h8PSQuTEVGVDpzPm4mJihofD0kLlJJR0hUKSxhPHI/aHw9JC5CRUxPVzphPm8mJihofD0kLkFCT1ZFKSxoPT09JC5VTktOT1dOJiYoaD0kLklOVEVSU0VDVElORyksaH1mdW5jdGlvbiBodCgpe3JldHVyblsxLzAsMS8wLC0xLzAsLTEvMF19ZnVuY3Rpb24gbHQodCxlLGkscixuKXtyZXR1cm4gbj8oblswXT10LG5bMV09ZSxuWzJdPWksblszXT1yLG4pOlt0LGUsaSxyXX1mdW5jdGlvbiB1dCh0KXtyZXR1cm4gbHQoMS8wLDEvMCwtMS8wLC0xLzAsdCl9ZnVuY3Rpb24gcHQodCxlKXt2YXIgaT10WzBdLHI9dFsxXTtyZXR1cm4gbHQoaSxyLGkscixlKX1mdW5jdGlvbiBjdCh0LGUsaSxyLG4pe3JldHVybiB5dCh1dChuKSx0LGUsaSxyKX1mdW5jdGlvbiBkdCh0LGUpe3JldHVybiB0WzBdPT1lWzBdJiZ0WzJdPT1lWzJdJiZ0WzFdPT1lWzFdJiZ0WzNdPT1lWzNdfWZ1bmN0aW9uIGZ0KHQsZSl7cmV0dXJuIGVbMF08dFswXSYmKHRbMF09ZVswXSksZVsyXT50WzJdJiYodFsyXT1lWzJdKSxlWzFdPHRbMV0mJih0WzFdPWVbMV0pLGVbM10+dFszXSYmKHRbM109ZVszXSksdH1mdW5jdGlvbiBfdCh0LGUpe2VbMF08dFswXSYmKHRbMF09ZVswXSksZVswXT50WzJdJiYodFsyXT1lWzBdKSxlWzFdPHRbMV0mJih0WzFdPWVbMV0pLGVbMV0+dFszXSYmKHRbM109ZVsxXSl9ZnVuY3Rpb24gZ3QodCxlKXtmb3IodmFyIGk9MCxyPWUubGVuZ3RoO2k8cjsrK2kpX3QodCxlW2ldKTtyZXR1cm4gdH1mdW5jdGlvbiB5dCh0LGUsaSxyLG4pe2Zvcig7aTxyO2krPW4pdnQodCxlW2ldLGVbaSsxXSk7cmV0dXJuIHR9ZnVuY3Rpb24gdnQodCxlLGkpe3RbMF09TWF0aC5taW4odFswXSxlKSx0WzFdPU1hdGgubWluKHRbMV0saSksdFsyXT1NYXRoLm1heCh0WzJdLGUpLHRbM109TWF0aC5tYXgodFszXSxpKX1mdW5jdGlvbiBtdCh0LGUsaSl7dmFyIHI7cmV0dXJuKHI9ZS5jYWxsKGksRXQodCkpKT9yOihyPWUuY2FsbChpLFN0KHQpKSk/cjoocj1lLmNhbGwoaSxMdCh0KSkpP3I6KHI9ZS5jYWxsKGksSXQodCkpKXx8ITF9ZnVuY3Rpb24geHQodCl7dmFyIGU9MDtyZXR1cm4gYnQodCl8fChlPU90KHQpKlJ0KHQpKSxlfWZ1bmN0aW9uIEV0KHQpe3JldHVyblt0WzBdLHRbMV1dfWZ1bmN0aW9uIFN0KHQpe3JldHVyblt0WzJdLHRbMV1dfWZ1bmN0aW9uIFR0KHQpe3JldHVyblsodFswXSt0WzJdKS8yLCh0WzFdK3RbM10pLzJdfWZ1bmN0aW9uIEN0KHQsZSxpLHIsbil7dmFyIG89ZSpyWzBdLzIscz1lKnJbMV0vMixhPU1hdGguY29zKGkpLGg9TWF0aC5zaW4oaSksbD1vKmEsdT1vKmgscD1zKmEsYz1zKmgsZD10WzBdLGY9dFsxXSxfPWQtbCtjLGc9ZC1sLWMseT1kK2wtYyx2PWQrbCtjLG09Zi11LXAseD1mLXUrcCxFPWYrdStwLFM9Zit1LXA7cmV0dXJuIGx0KE1hdGgubWluKF8sZyx5LHYpLE1hdGgubWluKG0seCxFLFMpLE1hdGgubWF4KF8sZyx5LHYpLE1hdGgubWF4KG0seCxFLFMpLG4pfWZ1bmN0aW9uIFJ0KHQpe3JldHVybiB0WzNdLXRbMV19ZnVuY3Rpb24gd3QodCxlLGkpe3ZhciByPWl8fFsxLzAsMS8wLC0xLzAsLTEvMF07cmV0dXJuIFB0KHQsZSk/KHRbMF0+ZVswXT9yWzBdPXRbMF06clswXT1lWzBdLHRbMV0+ZVsxXT9yWzFdPXRbMV06clsxXT1lWzFdLHRbMl08ZVsyXT9yWzJdPXRbMl06clsyXT1lWzJdLHRbM108ZVszXT9yWzNdPXRbM106clszXT1lWzNdKTp1dChyKSxyfWZ1bmN0aW9uIEl0KHQpe3JldHVyblt0WzBdLHRbM11dfWZ1bmN0aW9uIEx0KHQpe3JldHVyblt0WzJdLHRbM11dfWZ1bmN0aW9uIE90KHQpe3JldHVybiB0WzJdLXRbMF19ZnVuY3Rpb24gUHQodCxlKXtyZXR1cm4gdFswXTw9ZVsyXSYmdFsyXT49ZVswXSYmdFsxXTw9ZVszXSYmdFszXT49ZVsxXX1mdW5jdGlvbiBidCh0KXtyZXR1cm4gdFsyXTx0WzBdfHx0WzNdPHRbMV19ZnVuY3Rpb24gTXQodCxlKXt2YXIgaT0odFsyXS10WzBdKS8yKihlLTEpLHI9KHRbM10tdFsxXSkvMiooZS0xKTt0WzBdLT1pLHRbMl0rPWksdFsxXS09cix0WzNdKz1yfWZ1bmN0aW9uIEZ0KHQsZSxpKXt2YXIgcj1bdFswXSx0WzFdLHRbMF0sdFszXSx0WzJdLHRbMV0sdFsyXSx0WzNdXTtyZXR1cm4gZShyLHIsMiksZnVuY3Rpb24odCxlLGkpe3JldHVybiBsdChNYXRoLm1pbi5hcHBseShudWxsLHQpLE1hdGgubWluLmFwcGx5KG51bGwsZSksTWF0aC5tYXguYXBwbHkobnVsbCx0KSxNYXRoLm1heC5hcHBseShudWxsLGUpLGkpfShbclswXSxyWzJdLHJbNF0scls2XV0sW3JbMV0sclszXSxyWzVdLHJbN11dLGkpfXZhciBBdD17WFk6IlhZIixYWVo6IlhZWiIsWFlNOiJYWU0iLFhZWk06IlhZWk0ifSxOdD17UE9JTlQ6IlBvaW50IixMSU5FX1NUUklORzoiTGluZVN0cmluZyIsTElORUFSX1JJTkc6IkxpbmVhclJpbmciLFBPTFlHT046IlBvbHlnb24iLE1VTFRJX1BPSU5UOiJNdWx0aVBvaW50IixNVUxUSV9MSU5FX1NUUklORzoiTXVsdGlMaW5lU3RyaW5nIixNVUxUSV9QT0xZR09OOiJNdWx0aVBvbHlnb24iLEdFT01FVFJZX0NPTExFQ1RJT046Ikdlb21ldHJ5Q29sbGVjdGlvbiIsQ0lSQ0xFOiJDaXJjbGUifTtmdW5jdGlvbiBHdCh0LGUsaSxyLG4sbyl7Zm9yKHZhciBzPW98fFtdLGE9MCxoPWU7aDxpO2grPXIpe3ZhciBsPXRbaF0sdT10W2grMV07c1thKytdPW5bMF0qbCtuWzJdKnUrbls0XSxzW2ErK109blsxXSpsK25bM10qdStuWzVdfXJldHVybiBvJiZzLmxlbmd0aCE9YSYmKHMubGVuZ3RoPWEpLHN9ZnVuY3Rpb24gRHQodCxlLGkscixuLG8scyl7Zm9yKHZhciBhPXN8fFtdLGg9MCxsPWU7bDxpO2wrPXIpe2FbaCsrXT10W2xdK24sYVtoKytdPXRbbCsxXStvO2Zvcih2YXIgdT1sKzI7dTxsK3I7Kyt1KWFbaCsrXT10W3VdfXJldHVybiBzJiZhLmxlbmd0aCE9aCYmKGEubGVuZ3RoPWgpLGF9ZnVuY3Rpb24ga3QodCxlLGkpe3JldHVybiBNYXRoLm1pbihNYXRoLm1heCh0LGUpLGkpfXZhciBqdD0iY29zaCJpbiBNYXRoP01hdGguY29zaDpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLmV4cCh0KTtyZXR1cm4oZSsxL2UpLzJ9O2Z1bmN0aW9uIFV0KHQsZSxpLHIsbixvKXt2YXIgcz1uLWksYT1vLXI7aWYoMCE9PXN8fDAhPT1hKXt2YXIgaD0oKHQtaSkqcysoZS1yKSphKS8ocypzK2EqYSk7aD4xPyhpPW4scj1vKTpoPjAmJihpKz1zKmgscis9YSpoKX1yZXR1cm4gWXQodCxlLGkscil9ZnVuY3Rpb24gWXQodCxlLGkscil7dmFyIG49aS10LG89ci1lO3JldHVybiBuKm4rbypvfWZ1bmN0aW9uIEJ0KHQpe3JldHVybiAxODAqdC9NYXRoLlBJfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiB0Kk1hdGguUEkvMTgwfWZ1bmN0aW9uIFh0KHQsZSl7dmFyIGk9dCVlO3JldHVybiBpKmU8MD9pK2U6aX1mdW5jdGlvbiB6dCh0LGUsaSl7cmV0dXJuIHQraSooZS10KX0KLyoqCiAqIEBsaWNlbnNlCiAqIExhdGl0dWRlL2xvbmdpdHVkZSBzcGhlcmljYWwgZ2VvZGVzeSBmb3JtdWxhZSB0YWtlbiBmcm9tCiAqIGh0dHA6Ly93d3cubW92YWJsZS10eXBlLmNvLnVrL3NjcmlwdHMvbGF0bG9uZy5odG1sCiAqIExpY2Vuc2VkIHVuZGVyIENDLUJZLTMuMC4KICovdmFyIFd0PTYzNzEwMDguODtmdW5jdGlvbiBLdCh0LGUsaSl7dmFyIHI9aXx8V3Qsbj1WdCh0WzFdKSxvPVZ0KGVbMV0pLHM9KG8tbikvMixhPVZ0KGVbMF0tdFswXSkvMixoPU1hdGguc2luKHMpKk1hdGguc2luKHMpK01hdGguc2luKGEpKk1hdGguc2luKGEpKk1hdGguY29zKG4pKk1hdGguY29zKG8pO3JldHVybiAyKnIqTWF0aC5hdGFuMihNYXRoLnNxcnQoaCksTWF0aC5zcXJ0KDEtaCkpfWZ1bmN0aW9uIEh0KHQsZSl7Zm9yKHZhciBpPTAscj0wLG49dC5sZW5ndGg7cjxuLTE7KytyKWkrPUt0KHRbcl0sdFtyKzFdLGUpO3JldHVybiBpfWZ1bmN0aW9uIFp0KHQsZSl7Zm9yKHZhciBpPTAscj10Lmxlbmd0aCxuPXRbci0xXVswXSxvPXRbci0xXVsxXSxzPTA7czxyO3MrKyl7dmFyIGE9dFtzXVswXSxoPXRbc11bMV07aSs9VnQoYS1uKSooMitNYXRoLnNpbihWdChvKSkrTWF0aC5zaW4oVnQoaCkpKSxuPWEsbz1ofXJldHVybiBpKmUqZS8yfWZ1bmN0aW9uIHF0KHQsZSxpLHIpe3ZhciBuPXJ8fFd0LG89VnQodFsxXSkscz1WdCh0WzBdKSxhPWUvbixoPU1hdGguYXNpbihNYXRoLnNpbihvKSpNYXRoLmNvcyhhKStNYXRoLmNvcyhvKSpNYXRoLnNpbihhKSpNYXRoLmNvcyhpKSk7cmV0dXJuW0J0KHMrTWF0aC5hdGFuMihNYXRoLnNpbihpKSpNYXRoLnNpbihhKSpNYXRoLmNvcyhvKSxNYXRoLmNvcyhhKS1NYXRoLnNpbihvKSpNYXRoLnNpbihoKSkpLEJ0KGgpXX12YXIgSnQ9e0RFR1JFRVM6ImRlZ3JlZXMiLEZFRVQ6ImZ0IixNRVRFUlM6Im0iLFBJWEVMUzoicGl4ZWxzIixUSUxFX1BJWEVMUzoidGlsZS1waXhlbHMiLFVTRkVFVDoidXMtZnQifSxRdD17fTtRdFtKdC5ERUdSRUVTXT0yKk1hdGguUEkqNjM3MDk5Ny8zNjAsUXRbSnQuRkVFVF09LjMwNDgsUXRbSnQuTUVURVJTXT0xLFF0W0p0LlVTRkVFVF09MTIwMC8zOTM3O3ZhciAkdD1KdCx0ZT1mdW5jdGlvbih0KXt0aGlzLmNvZGVfPXQuY29kZSx0aGlzLnVuaXRzXz10LnVuaXRzLHRoaXMuZXh0ZW50Xz12b2lkIDAhPT10LmV4dGVudD90LmV4dGVudDpudWxsLHRoaXMud29ybGRFeHRlbnRfPXZvaWQgMCE9PXQud29ybGRFeHRlbnQ/dC53b3JsZEV4dGVudDpudWxsLHRoaXMuYXhpc09yaWVudGF0aW9uXz12b2lkIDAhPT10LmF4aXNPcmllbnRhdGlvbj90LmF4aXNPcmllbnRhdGlvbjoiZW51Iix0aGlzLmdsb2JhbF89dm9pZCAwIT09dC5nbG9iYWwmJnQuZ2xvYmFsLHRoaXMuY2FuV3JhcFhfPSEoIXRoaXMuZ2xvYmFsX3x8IXRoaXMuZXh0ZW50XyksdGhpcy5nZXRQb2ludFJlc29sdXRpb25GdW5jXz10LmdldFBvaW50UmVzb2x1dGlvbix0aGlzLmRlZmF1bHRUaWxlR3JpZF89bnVsbCx0aGlzLm1ldGVyc1BlclVuaXRfPXQubWV0ZXJzUGVyVW5pdH07dGUucHJvdG90eXBlLmNhbldyYXBYPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuV3JhcFhffSx0ZS5wcm90b3R5cGUuZ2V0Q29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvZGVffSx0ZS5wcm90b3R5cGUuZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXh0ZW50X30sdGUucHJvdG90eXBlLmdldFVuaXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pdHNffSx0ZS5wcm90b3R5cGUuZ2V0TWV0ZXJzUGVyVW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1ldGVyc1BlclVuaXRffHxRdFt0aGlzLnVuaXRzX119LHRlLnByb3RvdHlwZS5nZXRXb3JsZEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLndvcmxkRXh0ZW50X30sdGUucHJvdG90eXBlLmdldEF4aXNPcmllbnRhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF4aXNPcmllbnRhdGlvbl99LHRlLnByb3RvdHlwZS5pc0dsb2JhbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdsb2JhbF99LHRlLnByb3RvdHlwZS5zZXRHbG9iYWw9ZnVuY3Rpb24odCl7dGhpcy5nbG9iYWxfPXQsdGhpcy5jYW5XcmFwWF89ISghdHx8IXRoaXMuZXh0ZW50Xyl9LHRlLnByb3RvdHlwZS5nZXREZWZhdWx0VGlsZUdyaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWZhdWx0VGlsZUdyaWRffSx0ZS5wcm90b3R5cGUuc2V0RGVmYXVsdFRpbGVHcmlkPWZ1bmN0aW9uKHQpe3RoaXMuZGVmYXVsdFRpbGVHcmlkXz10fSx0ZS5wcm90b3R5cGUuc2V0RXh0ZW50PWZ1bmN0aW9uKHQpe3RoaXMuZXh0ZW50Xz10LHRoaXMuY2FuV3JhcFhfPSEoIXRoaXMuZ2xvYmFsX3x8IXQpfSx0ZS5wcm90b3R5cGUuc2V0V29ybGRFeHRlbnQ9ZnVuY3Rpb24odCl7dGhpcy53b3JsZEV4dGVudF89dH0sdGUucHJvdG90eXBlLnNldEdldFBvaW50UmVzb2x1dGlvbj1mdW5jdGlvbih0KXt0aGlzLmdldFBvaW50UmVzb2x1dGlvbkZ1bmNfPXR9LHRlLnByb3RvdHlwZS5nZXRQb2ludFJlc29sdXRpb25GdW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UG9pbnRSZXNvbHV0aW9uRnVuY199O3ZhciBlZT10ZSxpZT02Mzc4MTM3LHJlPU1hdGguUEkqaWUsbmU9Wy1yZSwtcmUscmUscmVdLG9lPVstMTgwLC04NSwxODAsODVdLHNlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMse2NvZGU6ZSx1bml0czokdC5NRVRFUlMsZXh0ZW50Om5lLGdsb2JhbDohMCx3b3JsZEV4dGVudDpvZSxnZXRQb2ludFJlc29sdXRpb246ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC9qdChlWzFdL2llKX19KX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oZWUpLGFlPVtuZXcgc2UoIkVQU0c6Mzg1NyIpLG5ldyBzZSgiRVBTRzoxMDIxMDAiKSxuZXcgc2UoIkVQU0c6MTAyMTEzIiksbmV3IHNlKCJFUFNHOjkwMDkxMyIpLG5ldyBzZSgidXJuOm9nYzpkZWY6Y3JzOkVQU0c6Ni4xODozOjM4NTciKSxuZXcgc2UoInVybjpvZ2M6ZGVmOmNyczpFUFNHOjozODU3IiksbmV3IHNlKCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbC9zcnMvZXBzZy54bWwjMzg1NyIpXTtmdW5jdGlvbiBoZSh0LGUsaSl7dmFyIHI9dC5sZW5ndGgsbj1pPjE/aToyLG89ZTt2b2lkIDA9PT1vJiYobz1uPjI/dC5zbGljZSgpOm5ldyBBcnJheShyKSk7Zm9yKHZhciBzPXJlLGE9MDthPHI7YSs9bil7b1thXT1zKnRbYV0vMTgwO3ZhciBoPWllKk1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkqKHRbYSsxXSs5MCkvMzYwKSk7aD5zP2g9czpoPC1zJiYoaD0tcyksb1thKzFdPWh9cmV0dXJuIG99ZnVuY3Rpb24gbGUodCxlLGkpe3ZhciByPXQubGVuZ3RoLG49aT4xP2k6MixvPWU7dm9pZCAwPT09byYmKG89bj4yP3Quc2xpY2UoKTpuZXcgQXJyYXkocikpO2Zvcih2YXIgcz0wO3M8cjtzKz1uKW9bc109MTgwKnRbc10vcmUsb1tzKzFdPTM2MCpNYXRoLmF0YW4oTWF0aC5leHAodFtzKzFdL2llKSkvTWF0aC5QSS05MDtyZXR1cm4gb312YXIgdWU9Wy0xODAsLTkwLDE4MCw5MF0scGU9NjM3ODEzNypNYXRoLlBJLzE4MCxjZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMse2NvZGU6ZSx1bml0czokdC5ERUdSRUVTLGV4dGVudDp1ZSxheGlzT3JpZW50YXRpb246aSxnbG9iYWw6ITAsbWV0ZXJzUGVyVW5pdDpwZSx3b3JsZEV4dGVudDp1ZX0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShlZSksZGU9W25ldyBjZSgiQ1JTOjg0IiksbmV3IGNlKCJFUFNHOjQzMjYiLCJuZXUiKSxuZXcgY2UoInVybjpvZ2M6ZGVmOmNyczpFUFNHOjo0MzI2IiwibmV1IiksbmV3IGNlKCJ1cm46b2djOmRlZjpjcnM6RVBTRzo2LjY6NDMyNiIsIm5ldSIpLG5ldyBjZSgidXJuOm9nYzpkZWY6Y3JzOk9HQzoxLjM6Q1JTODQiKSxuZXcgY2UoInVybjpvZ2M6ZGVmOmNyczpPR0M6Mjo4NCIpLG5ldyBjZSgiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwvc3JzL2Vwc2cueG1sIzQzMjYiLCJuZXUiKSxuZXcgY2UoInVybjp4LW9nYzpkZWY6Y3JzOkVQU0c6NDMyNiIsIm5ldSIpXSxmZT17fTt2YXIgX2U9e307ZnVuY3Rpb24gZ2UodCxlLGkpe3ZhciByPXQuZ2V0Q29kZSgpLG49ZS5nZXRDb2RlKCk7ciBpbiBfZXx8KF9lW3JdPXt9KSxfZVtyXVtuXT1pfWZ1bmN0aW9uIHllKHQsZSl7dmFyIGk7cmV0dXJuIHQgaW4gX2UmJmUgaW4gX2VbdF0mJihpPV9lW3RdW2VdKSxpfWZ1bmN0aW9uIHZlKHQsZSxpKXt2YXIgcjtpZih2b2lkIDAhPT1lKXtmb3IodmFyIG49MCxvPXQubGVuZ3RoO248bzsrK24pZVtuXT10W25dO3I9ZX1lbHNlIHI9dC5zbGljZSgpO3JldHVybiByfWZ1bmN0aW9uIG1lKHQsZSxpKXtpZih2b2lkIDAhPT1lJiZ0IT09ZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47KytyKWVbcl09dFtyXTt0PWV9cmV0dXJuIHR9ZnVuY3Rpb24geGUodCl7IWZ1bmN0aW9uKHQsZSl7ZmVbdF09ZX0odC5nZXRDb2RlKCksdCksZ2UodCx0LHZlKX1mdW5jdGlvbiBFZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZlW3RdfHxudWxsfSh0KTp0fHxudWxsfWZ1bmN0aW9uIFNlKHQsZSxpLHIpe3ZhciBuLG89KHQ9RWUodCkpLmdldFBvaW50UmVzb2x1dGlvbkZ1bmMoKTtpZihvKW49byhlLGkpO2Vsc2UgaWYodC5nZXRVbml0cygpPT0kdC5ERUdSRUVTJiYhcnx8cj09JHQuREVHUkVFUyluPWU7ZWxzZXt2YXIgcz1MZSh0LEVlKCJFUFNHOjQzMjYiKSksYT1baVswXS1lLzIsaVsxXSxpWzBdK2UvMixpWzFdLGlbMF0saVsxXS1lLzIsaVswXSxpWzFdK2UvMl07bj0oS3QoKGE9cyhhLGEsMikpLnNsaWNlKDAsMiksYS5zbGljZSgyLDQpKStLdChhLnNsaWNlKDQsNiksYS5zbGljZSg2LDgpKSkvMjt2YXIgaD1yP1F0W3JdOnQuZ2V0TWV0ZXJzUGVyVW5pdCgpO3ZvaWQgMCE9PWgmJihuLz1oKX1yZXR1cm4gbn1mdW5jdGlvbiBUZSh0KXshZnVuY3Rpb24odCl7dC5mb3JFYWNoKHhlKX0odCksdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuZm9yRWFjaChmdW5jdGlvbih0KXtlIT09dCYmZ2UoZSx0LHZlKX0pfSl9ZnVuY3Rpb24gQ2UodCxlKXtyZXR1cm4gdD8ic3RyaW5nIj09dHlwZW9mIHQ/RWUodCk6dDpFZShlKX1mdW5jdGlvbiBSZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxpLHIpe2Zvcih2YXIgbj1lLmxlbmd0aCxvPXZvaWQgMCE9PXI/cjoyLHM9dm9pZCAwIT09aT9pOm5ldyBBcnJheShuKSxhPTA7YTxuO2ErPW8pe3ZhciBoPXQoW2VbYV0sZVthKzFdXSk7c1thXT1oWzBdLHNbYSsxXT1oWzFdO2Zvcih2YXIgbD1vLTE7bD49MjstLWwpc1thK2xdPWVbYStsXX1yZXR1cm4gc319ZnVuY3Rpb24gd2UodCxlLGkscil7dmFyIG49RWUodCksbz1FZShlKTtnZShuLG8sUmUoaSkpLGdlKG8sbixSZShyKSl9ZnVuY3Rpb24gSWUodCxlKXtpZih0PT09ZSlyZXR1cm4hMDt2YXIgaT10LmdldFVuaXRzKCk9PT1lLmdldFVuaXRzKCk7cmV0dXJuIHQuZ2V0Q29kZSgpPT09ZS5nZXRDb2RlKCk/aTpMZSh0LGUpPT09dmUmJml9ZnVuY3Rpb24gTGUodCxlKXt2YXIgaT15ZSh0LmdldENvZGUoKSxlLmdldENvZGUoKSk7cmV0dXJuIGl8fChpPW1lKSxpfWZ1bmN0aW9uIE9lKHQsZSl7cmV0dXJuIExlKEVlKHQpLEVlKGUpKX1mdW5jdGlvbiBQZSh0LGUsaSl7cmV0dXJuIE9lKGUsaSkodCx2b2lkIDAsdC5sZW5ndGgpfWZ1bmN0aW9uIGJlKHQsZSxpKXtyZXR1cm4gRnQodCxPZShlLGkpKX1UZShhZSksVGUoZGUpLGZ1bmN0aW9uKHQsZSxpLHIpe3QuZm9yRWFjaChmdW5jdGlvbih0KXtlLmZvckVhY2goZnVuY3Rpb24oZSl7Z2UodCxlLGkpLGdlKGUsdCxyKX0pfSl9KGRlLGFlLGhlLGxlKTt2YXIgTWU9bmV3IEFycmF5KDYpO2Z1bmN0aW9uIEZlKHQpe3JldHVybiBOZSh0LDEsMCwwLDEsMCwwKX1mdW5jdGlvbiBBZSh0LGUpe3ZhciBpPXRbMF0scj10WzFdLG49dFsyXSxvPXRbM10scz10WzRdLGE9dFs1XSxoPWVbMF0sbD1lWzFdLHU9ZVsyXSxwPWVbM10sYz1lWzRdLGQ9ZVs1XTtyZXR1cm4gdFswXT1pKmgrbipsLHRbMV09cipoK28qbCx0WzJdPWkqdStuKnAsdFszXT1yKnUrbypwLHRbNF09aSpjK24qZCtzLHRbNV09cipjK28qZCthLHR9ZnVuY3Rpb24gTmUodCxlLGkscixuLG8scyl7cmV0dXJuIHRbMF09ZSx0WzFdPWksdFsyXT1yLHRbM109bix0WzRdPW8sdFs1XT1zLHR9ZnVuY3Rpb24gR2UodCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XSx0WzVdPWVbNV0sdH1mdW5jdGlvbiBEZSh0LGUpe3ZhciBpPWVbMF0scj1lWzFdO3JldHVybiBlWzBdPXRbMF0qaSt0WzJdKnIrdFs0XSxlWzFdPXRbMV0qaSt0WzNdKnIrdFs1XSxlfWZ1bmN0aW9uIGtlKHQsZSl7dmFyIGk9TWF0aC5jb3MoZSkscj1NYXRoLnNpbihlKTtyZXR1cm4gQWUodCxOZShNZSxpLHIsLXIsaSwwLDApKX1mdW5jdGlvbiBqZSh0LGUsaSl7cmV0dXJuIEFlKHQsTmUoTWUsZSwwLDAsaSwwLDApKX1mdW5jdGlvbiBVZSh0LGUsaSl7cmV0dXJuIEFlKHQsTmUoTWUsMSwwLDAsMSxlLGkpKX1mdW5jdGlvbiBZZSh0LGUsaSxyLG4sbyxzLGEpe3ZhciBoPU1hdGguc2luKG8pLGw9TWF0aC5jb3Mobyk7cmV0dXJuIHRbMF09cipsLHRbMV09bipoLHRbMl09LXIqaCx0WzNdPW4qbCx0WzRdPXMqcipsLWEqcipoK2UsdFs1XT1zKm4qaCthKm4qbCtpLHR9ZnVuY3Rpb24gQmUodCl7dmFyIGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF0qdFszXS10WzFdKnRbMl19KHQpO1koMCE9PWUsMzIpO3ZhciBpPXRbMF0scj10WzFdLG49dFsyXSxvPXRbM10scz10WzRdLGE9dFs1XTtyZXR1cm4gdFswXT1vL2UsdFsxXT0tci9lLHRbMl09LW4vZSx0WzNdPWkvZSx0WzRdPShuKmEtbypzKS9lLHRbNV09LShpKmEtcipzKS9lLHR9dmFyIFZlPVsxLDAsMCwxLDAsMF0sWGU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLmV4dGVudF89WzEvMCwxLzAsLTEvMCwtMS8wXSx0aGlzLmV4dGVudFJldmlzaW9uXz0tMSx0aGlzLnNpbXBsaWZpZWRHZW9tZXRyeUNhY2hlPXt9LHRoaXMuc2ltcGxpZmllZEdlb21ldHJ5TWF4TWluU3F1YXJlZFRvbGVyYW5jZT0wLHRoaXMuc2ltcGxpZmllZEdlb21ldHJ5UmV2aXNpb249MH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRYWT1mdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS5jb250YWluc1hZPWZ1bmN0aW9uKHQsZSl7cmV0dXJuITF9LGUucHJvdG90eXBlLmdldENsb3Nlc3RQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPWV8fFtOYU4sTmFOXTtyZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRYWSh0WzBdLHRbMV0saSwxLzApLGl9LGUucHJvdG90eXBlLmludGVyc2VjdHNDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbnRhaW5zWFkodFswXSx0WzFdKX0sZS5wcm90b3R5cGUuY29tcHV0ZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS5nZXRFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZXh0ZW50UmV2aXNpb25fIT10aGlzLmdldFJldmlzaW9uKCkmJih0aGlzLmV4dGVudF89dGhpcy5jb21wdXRlRXh0ZW50KHRoaXMuZXh0ZW50XyksdGhpcy5leHRlbnRSZXZpc2lvbl89dGhpcy5nZXRSZXZpc2lvbigpKSxmdW5jdGlvbih0LGUpe3JldHVybiBlPyhlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbM10sZSk6dH0odGhpcy5leHRlbnRfLHQpfSxlLnByb3RvdHlwZS5yb3RhdGU9ZnVuY3Rpb24odCxlKXtyKCl9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQsZSxpKXtyKCl9LGUucHJvdG90eXBlLnNpbXBsaWZ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldFNpbXBsaWZpZWRHZW9tZXRyeSh0KnQpfSxlLnByb3RvdHlwZS5nZXRTaW1wbGlmaWVkR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiByKCl9LGUucHJvdG90eXBlLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3IoKX0sZS5wcm90b3R5cGUuaW50ZXJzZWN0c0V4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24odCxlKXtyKCl9LGUucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbih0LGUpe3ZhciBpPUVlKHQpLHI9aS5nZXRVbml0cygpPT0kdC5USUxFX1BJWEVMUz9mdW5jdGlvbih0LHIsbil7dmFyIG89aS5nZXRFeHRlbnQoKSxzPWkuZ2V0V29ybGRFeHRlbnQoKSxhPVJ0KHMpL1J0KG8pO3JldHVybiBZZShWZSxzWzBdLHNbM10sYSwtYSwwLDAsMCksR3QodCwwLHQubGVuZ3RoLG4sVmUsciksT2UoaSxlKSh0LHIsbil9Ok9lKGksZSk7cmV0dXJuIHRoaXMuYXBwbHlUcmFuc2Zvcm0ociksdGhpc30sZX0oRCk7ZnVuY3Rpb24gemUodCl7dmFyIGU7cmV0dXJuIHQ9PUF0LlhZP2U9Mjp0PT1BdC5YWVp8fHQ9PUF0LlhZTT9lPTM6dD09QXQuWFlaTSYmKGU9NCksZX12YXIgV2U9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLmxheW91dD1BdC5YWSx0aGlzLnN0cmlkZT0yLHRoaXMuZmxhdENvb3JkaW5hdGVzPW51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNvbXB1dGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGN0KHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5mbGF0Q29vcmRpbmF0ZXMubGVuZ3RoLHRoaXMuc3RyaWRlLHQpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiByKCl9LGUucHJvdG90eXBlLmdldEZpcnN0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYXRDb29yZGluYXRlcy5zbGljZSgwLHRoaXMuc3RyaWRlKX0sZS5wcm90b3R5cGUuZ2V0RmxhdENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmxhdENvb3JkaW5hdGVzfSxlLnByb3RvdHlwZS5nZXRMYXN0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYXRDb29yZGluYXRlcy5zbGljZSh0aGlzLmZsYXRDb29yZGluYXRlcy5sZW5ndGgtdGhpcy5zdHJpZGUpfSxlLnByb3RvdHlwZS5nZXRMYXlvdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXlvdXR9LGUucHJvdG90eXBlLmdldFNpbXBsaWZpZWRHZW9tZXRyeT1mdW5jdGlvbih0KXtpZih0aGlzLnNpbXBsaWZpZWRHZW9tZXRyeVJldmlzaW9uIT10aGlzLmdldFJldmlzaW9uKCkmJihwKHRoaXMuc2ltcGxpZmllZEdlb21ldHJ5Q2FjaGUpLHRoaXMuc2ltcGxpZmllZEdlb21ldHJ5TWF4TWluU3F1YXJlZFRvbGVyYW5jZT0wLHRoaXMuc2ltcGxpZmllZEdlb21ldHJ5UmV2aXNpb249dGhpcy5nZXRSZXZpc2lvbigpKSx0PDB8fDAhPT10aGlzLnNpbXBsaWZpZWRHZW9tZXRyeU1heE1pblNxdWFyZWRUb2xlcmFuY2UmJnQ8PXRoaXMuc2ltcGxpZmllZEdlb21ldHJ5TWF4TWluU3F1YXJlZFRvbGVyYW5jZSlyZXR1cm4gdGhpczt2YXIgZT10LnRvU3RyaW5nKCk7aWYodGhpcy5zaW1wbGlmaWVkR2VvbWV0cnlDYWNoZS5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gdGhpcy5zaW1wbGlmaWVkR2VvbWV0cnlDYWNoZVtlXTt2YXIgaT10aGlzLmdldFNpbXBsaWZpZWRHZW9tZXRyeUludGVybmFsKHQpO3JldHVybiBpLmdldEZsYXRDb29yZGluYXRlcygpLmxlbmd0aDx0aGlzLmZsYXRDb29yZGluYXRlcy5sZW5ndGg/KHRoaXMuc2ltcGxpZmllZEdlb21ldHJ5Q2FjaGVbZV09aSxpKToodGhpcy5zaW1wbGlmaWVkR2VvbWV0cnlNYXhNaW5TcXVhcmVkVG9sZXJhbmNlPXQsdGhpcyl9LGUucHJvdG90eXBlLmdldFNpbXBsaWZpZWRHZW9tZXRyeUludGVybmFsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5nZXRTdHJpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJpZGV9LGUucHJvdG90eXBlLnNldEZsYXRDb29yZGluYXRlcz1mdW5jdGlvbih0LGUpe3RoaXMuc3RyaWRlPXplKHQpLHRoaXMubGF5b3V0PXQsdGhpcy5mbGF0Q29vcmRpbmF0ZXM9ZX0sZS5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlKXtyKCl9LGUucHJvdG90eXBlLnNldExheW91dD1mdW5jdGlvbih0LGUsaSl7dmFyIHI7aWYodClyPXplKHQpO2Vsc2V7Zm9yKHZhciBuPTA7bjxpOysrbil7aWYoMD09PWUubGVuZ3RoKXJldHVybiB0aGlzLmxheW91dD1BdC5YWSx2b2lkKHRoaXMuc3RyaWRlPTIpO2U9ZVswXX10PWZ1bmN0aW9uKHQpe3ZhciBlOzI9PXQ/ZT1BdC5YWTozPT10P2U9QXQuWFlaOjQ9PXQmJihlPUF0LlhZWk0pO3JldHVybiBlfShyPWUubGVuZ3RoKX10aGlzLmxheW91dD10LHRoaXMuc3RyaWRlPXJ9LGUucHJvdG90eXBlLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3RoaXMuZmxhdENvb3JkaW5hdGVzJiYodCh0aGlzLmZsYXRDb29yZGluYXRlcyx0aGlzLmZsYXRDb29yZGluYXRlcyx0aGlzLnN0cmlkZSksdGhpcy5jaGFuZ2VkKCkpfSxlLnByb3RvdHlwZS5yb3RhdGU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldEZsYXRDb29yZGluYXRlcygpO2lmKGkpe3ZhciByPXRoaXMuZ2V0U3RyaWRlKCk7IWZ1bmN0aW9uKHQsZSxpLHIsbixvLHMpe2Zvcih2YXIgYT1zfHxbXSxoPU1hdGguY29zKG4pLGw9TWF0aC5zaW4obiksdT1vWzBdLHA9b1sxXSxjPTAsZD1lO2Q8aTtkKz1yKXt2YXIgZj10W2RdLXUsXz10W2QrMV0tcDthW2MrK109dStmKmgtXypsLGFbYysrXT1wK2YqbCtfKmg7Zm9yKHZhciBnPWQrMjtnPGQrcjsrK2cpYVtjKytdPXRbZ119cyYmYS5sZW5ndGghPWMmJihhLmxlbmd0aD1jKX0oaSwwLGkubGVuZ3RoLHIsdCxlLGkpLHRoaXMuY2hhbmdlZCgpfX0sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCxlLGkpe3ZhciByPWU7dm9pZCAwPT09ciYmKHI9dCk7dmFyIG49aTtufHwobj1UdCh0aGlzLmdldEV4dGVudCgpKSk7dmFyIG89dGhpcy5nZXRGbGF0Q29vcmRpbmF0ZXMoKTtpZihvKXt2YXIgcz10aGlzLmdldFN0cmlkZSgpOyFmdW5jdGlvbih0LGUsaSxyLG4sbyxzLGEpe2Zvcih2YXIgaD1hfHxbXSxsPXNbMF0sdT1zWzFdLHA9MCxjPWU7YzxpO2MrPXIpe3ZhciBkPXRbY10tbCxmPXRbYysxXS11O2hbcCsrXT1sK24qZCxoW3ArK109dStvKmY7Zm9yKHZhciBfPWMrMjtfPGMrcjsrK18paFtwKytdPXRbX119YSYmaC5sZW5ndGghPXAmJihoLmxlbmd0aD1wKX0obywwLG8ubGVuZ3RoLHMsdCxyLG4sbyksdGhpcy5jaGFuZ2VkKCl9fSxlLnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldEZsYXRDb29yZGluYXRlcygpO2lmKGkpe3ZhciByPXRoaXMuZ2V0U3RyaWRlKCk7RHQoaSwwLGkubGVuZ3RoLHIsdCxlLGkpLHRoaXMuY2hhbmdlZCgpfX0sZX0oWGUpO2Z1bmN0aW9uIEtlKHQsZSxpLHIpe2Zvcih2YXIgbj0wLG89dFtpLXJdLHM9dFtpLXIrMV07ZTxpO2UrPXIpe3ZhciBhPXRbZV0saD10W2UrMV07bis9cyphLW8qaCxvPWEscz1ofXJldHVybiBuLzJ9ZnVuY3Rpb24gSGUodCxlLGkscil7Zm9yKHZhciBuPTAsbz0wLHM9aS5sZW5ndGg7bzxzOysrbyl7dmFyIGE9aVtvXTtuKz1LZSh0LGUsYSxyKSxlPWF9cmV0dXJuIG59ZnVuY3Rpb24gWmUodCxlLGkscixuLG8scyl7dmFyIGEsaD10W2VdLGw9dFtlKzFdLHU9dFtpXS1oLHA9dFtpKzFdLWw7aWYoMD09PXUmJjA9PT1wKWE9ZTtlbHNle3ZhciBjPSgobi1oKSp1KyhvLWwpKnApLyh1KnUrcCpwKTtpZihjPjEpYT1pO2Vsc2V7aWYoYz4wKXtmb3IodmFyIGQ9MDtkPHI7KytkKXNbZF09enQodFtlK2RdLHRbaStkXSxjKTtyZXR1cm4gdm9pZChzLmxlbmd0aD1yKX1hPWV9fWZvcih2YXIgZj0wO2Y8cjsrK2Ypc1tmXT10W2ErZl07cy5sZW5ndGg9cn1mdW5jdGlvbiBxZSh0LGUsaSxyLG4pe3ZhciBvPXRbZV0scz10W2UrMV07Zm9yKGUrPXI7ZTxpO2UrPXIpe3ZhciBhPXRbZV0saD10W2UrMV0sbD1ZdChvLHMsYSxoKTtsPm4mJihuPWwpLG89YSxzPWh9cmV0dXJuIG59ZnVuY3Rpb24gSmUodCxlLGkscixuKXtmb3IodmFyIG89MCxzPWkubGVuZ3RoO288czsrK28pe3ZhciBhPWlbb107bj1xZSh0LGUsYSxyLG4pLGU9YX1yZXR1cm4gbn1mdW5jdGlvbiBRZSh0LGUsaSxyLG4sbyxzLGEsaCxsLHUpe2lmKGU9PWkpcmV0dXJuIGw7dmFyIHAsYztpZigwPT09bil7aWYoKGM9WXQocyxhLHRbZV0sdFtlKzFdKSk8bCl7Zm9yKHA9MDtwPHI7KytwKWhbcF09dFtlK3BdO3JldHVybiBoLmxlbmd0aD1yLGN9cmV0dXJuIGx9Zm9yKHZhciBkPXV8fFtOYU4sTmFOXSxmPWUrcjtmPGk7KWlmKFplKHQsZi1yLGYscixzLGEsZCksKGM9WXQocyxhLGRbMF0sZFsxXSkpPGwpe2ZvcihsPWMscD0wO3A8cjsrK3ApaFtwXT1kW3BdO2gubGVuZ3RoPXIsZis9cn1lbHNlIGYrPXIqTWF0aC5tYXgoKE1hdGguc3FydChjKS1NYXRoLnNxcnQobCkpL258MCwxKTtpZihvJiYoWmUodCxpLXIsZSxyLHMsYSxkKSwoYz1ZdChzLGEsZFswXSxkWzFdKSk8bCkpe2ZvcihsPWMscD0wO3A8cjsrK3ApaFtwXT1kW3BdO2gubGVuZ3RoPXJ9cmV0dXJuIGx9ZnVuY3Rpb24gJGUodCxlLGkscixuLG8scyxhLGgsbCx1KXtmb3IodmFyIHA9dXx8W05hTixOYU5dLGM9MCxkPWkubGVuZ3RoO2M8ZDsrK2Mpe3ZhciBmPWlbY107bD1RZSh0LGUsZixyLG4sbyxzLGEsaCxsLHApLGU9Zn1yZXR1cm4gbH1mdW5jdGlvbiB0aSh0LGUsaSxyKXtmb3IodmFyIG49MCxvPWkubGVuZ3RoO248bzsrK24pdFtlKytdPWlbbl07cmV0dXJuIGV9ZnVuY3Rpb24gZWkodCxlLGkscil7Zm9yKHZhciBuPTAsbz1pLmxlbmd0aDtuPG87KytuKWZvcih2YXIgcz1pW25dLGE9MDthPHI7KythKXRbZSsrXT1zW2FdO3JldHVybiBlfWZ1bmN0aW9uIGlpKHQsZSxpLHIsbil7Zm9yKHZhciBvPW58fFtdLHM9MCxhPTAsaD1pLmxlbmd0aDthPGg7KythKXt2YXIgbD1laSh0LGUsaVthXSxyKTtvW3MrK109bCxlPWx9cmV0dXJuIG8ubGVuZ3RoPXMsb31mdW5jdGlvbiByaSh0LGUsaSxyLG4pe2Zvcih2YXIgbz12b2lkIDAhPT1uP246W10scz0wLGE9ZTthPGk7YSs9cilvW3MrK109dC5zbGljZShhLGErcik7cmV0dXJuIG8ubGVuZ3RoPXMsb31mdW5jdGlvbiBuaSh0LGUsaSxyLG4pe2Zvcih2YXIgbz12b2lkIDAhPT1uP246W10scz0wLGE9MCxoPWkubGVuZ3RoO2E8aDsrK2Epe3ZhciBsPWlbYV07b1tzKytdPXJpKHQsZSxsLHIsb1tzXSksZT1sfXJldHVybiBvLmxlbmd0aD1zLG99ZnVuY3Rpb24gb2kodCxlLGkscixuKXtmb3IodmFyIG89dm9pZCAwIT09bj9uOltdLHM9MCxhPTAsaD1pLmxlbmd0aDthPGg7KythKXt2YXIgbD1pW2FdO29bcysrXT1uaSh0LGUsbCxyLG9bc10pLGU9bFtsLmxlbmd0aC0xXX1yZXR1cm4gby5sZW5ndGg9cyxvfWZ1bmN0aW9uIHNpKHQsZSxpLHIsbixvLHMpe3ZhciBhPShpLWUpL3I7aWYoYTwzKXtmb3IoO2U8aTtlKz1yKW9bcysrXT10W2VdLG9bcysrXT10W2UrMV07cmV0dXJuIHN9dmFyIGg9bmV3IEFycmF5KGEpO2hbMF09MSxoW2EtMV09MTtmb3IodmFyIGw9W2UsaS1yXSx1PTA7bC5sZW5ndGg+MDspe2Zvcih2YXIgcD1sLnBvcCgpLGM9bC5wb3AoKSxkPTAsZj10W2NdLF89dFtjKzFdLGc9dFtwXSx5PXRbcCsxXSx2PWMrcjt2PHA7dis9cil7dmFyIG09VXQodFt2XSx0W3YrMV0sZixfLGcseSk7bT5kJiYodT12LGQ9bSl9ZD5uJiYoaFsodS1lKS9yXT0xLGMrcjx1JiZsLnB1c2goYyx1KSx1K3I8cCYmbC5wdXNoKHUscCkpfWZvcih2YXIgeD0wO3g8YTsrK3gpaFt4XSYmKG9bcysrXT10W2UreCpyXSxvW3MrK109dFtlK3gqcisxXSk7cmV0dXJuIHN9ZnVuY3Rpb24gYWkodCxlLGkscixuLG8scyxhKXtmb3IodmFyIGg9MCxsPWkubGVuZ3RoO2g8bDsrK2gpe3ZhciB1PWlbaF07cz1zaSh0LGUsdSxyLG4sbyxzKSxhLnB1c2gocyksZT11fXJldHVybiBzfWZ1bmN0aW9uIGhpKHQsZSl7cmV0dXJuIGUqTWF0aC5yb3VuZCh0L2UpfWZ1bmN0aW9uIGxpKHQsZSxpLHIsbixvLHMpe2lmKGU9PWkpcmV0dXJuIHM7dmFyIGEsaCxsPWhpKHRbZV0sbiksdT1oaSh0W2UrMV0sbik7ZSs9cixvW3MrK109bCxvW3MrK109dTtkb3tpZihhPWhpKHRbZV0sbiksaD1oaSh0W2UrMV0sbiksKGUrPXIpPT1pKXJldHVybiBvW3MrK109YSxvW3MrK109aCxzfXdoaWxlKGE9PWwmJmg9PXUpO2Zvcig7ZTxpOyl7dmFyIHA9aGkodFtlXSxuKSxjPWhpKHRbZSsxXSxuKTtpZihlKz1yLHAhPWF8fGMhPWgpe3ZhciBkPWEtbCxmPWgtdSxfPXAtbCxnPWMtdTtkKmc9PWYqXyYmKGQ8MCYmXzxkfHxkPT1ffHxkPjAmJl8+ZCkmJihmPDAmJmc8Znx8Zj09Z3x8Zj4wJiZnPmYpPyhhPXAsaD1jKToob1tzKytdPWEsb1tzKytdPWgsbD1hLHU9aCxhPXAsaD1jKX19cmV0dXJuIG9bcysrXT1hLG9bcysrXT1oLHN9ZnVuY3Rpb24gdWkodCxlLGkscixuLG8scyxhKXtmb3IodmFyIGg9MCxsPWkubGVuZ3RoO2g8bDsrK2gpe3ZhciB1PWlbaF07cz1saSh0LGUsdSxyLG4sbyxzKSxhLnB1c2gocyksZT11fXJldHVybiBzfXZhciBwaT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMpLHRoaXMubWF4RGVsdGFfPS0xLHRoaXMubWF4RGVsdGFSZXZpc2lvbl89LTEsdm9pZCAwPT09aXx8QXJyYXkuaXNBcnJheShlWzBdKT90aGlzLnNldENvb3JkaW5hdGVzKGUsaSk6dGhpcy5zZXRGbGF0Q29vcmRpbmF0ZXMoaSxlKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5mbGF0Q29vcmRpbmF0ZXMuc2xpY2UoKSx0aGlzLmxheW91dCl9LGUucHJvdG90eXBlLmNsb3Nlc3RQb2ludFhZPWZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybiByPHJ0KHRoaXMuZ2V0RXh0ZW50KCksdCxlKT9yOih0aGlzLm1heERlbHRhUmV2aXNpb25fIT10aGlzLmdldFJldmlzaW9uKCkmJih0aGlzLm1heERlbHRhXz1NYXRoLnNxcnQocWUodGhpcy5mbGF0Q29vcmRpbmF0ZXMsMCx0aGlzLmZsYXRDb29yZGluYXRlcy5sZW5ndGgsdGhpcy5zdHJpZGUsMCkpLHRoaXMubWF4RGVsdGFSZXZpc2lvbl89dGhpcy5nZXRSZXZpc2lvbigpKSxRZSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHRoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aCx0aGlzLnN0cmlkZSx0aGlzLm1heERlbHRhXywhMCx0LGUsaSxyKSl9LGUucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gS2UodGhpcy5mbGF0Q29vcmRpbmF0ZXMsMCx0aGlzLmZsYXRDb29yZGluYXRlcy5sZW5ndGgsdGhpcy5zdHJpZGUpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiByaSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHRoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aCx0aGlzLnN0cmlkZSl9LGUucHJvdG90eXBlLmdldFNpbXBsaWZpZWRHZW9tZXRyeUludGVybmFsPWZ1bmN0aW9uKHQpe3ZhciBpPVtdO3JldHVybiBpLmxlbmd0aD1zaSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHRoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aCx0aGlzLnN0cmlkZSx0LGksMCksbmV3IGUoaSxBdC5YWSl9LGUucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gTnQuTElORUFSX1JJTkd9LGUucHJvdG90eXBlLmludGVyc2VjdHNFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuITF9LGUucHJvdG90eXBlLnNldENvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRMYXlvdXQoZSx0LDEpLHRoaXMuZmxhdENvb3JkaW5hdGVzfHwodGhpcy5mbGF0Q29vcmRpbmF0ZXM9W10pLHRoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aD1laSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHQsdGhpcy5zdHJpZGUpLHRoaXMuY2hhbmdlZCgpfSxlfShXZSksY2k9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkpe3QuY2FsbCh0aGlzKSx0aGlzLnNldENvb3JkaW5hdGVzKGUsaSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMuZmxhdENvb3JkaW5hdGVzLnNsaWNlKCksdGhpcy5sYXlvdXQpfSxlLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRYWT1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbj10aGlzLmZsYXRDb29yZGluYXRlcyxvPVl0KHQsZSxuWzBdLG5bMV0pO2lmKG88cil7Zm9yKHZhciBzPXRoaXMuc3RyaWRlLGE9MDthPHM7KythKWlbYV09blthXTtyZXR1cm4gaS5sZW5ndGg9cyxvfXJldHVybiByfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYXRDb29yZGluYXRlcz90aGlzLmZsYXRDb29yZGluYXRlcy5zbGljZSgpOltdfSxlLnByb3RvdHlwZS5jb21wdXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBwdCh0aGlzLmZsYXRDb29yZGluYXRlcyx0KX0sZS5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiBOdC5QT0lOVH0sZS5wcm90b3R5cGUuaW50ZXJzZWN0c0V4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gc3QodCx0aGlzLmZsYXRDb29yZGluYXRlc1swXSx0aGlzLmZsYXRDb29yZGluYXRlc1sxXSl9LGUucHJvdG90eXBlLnNldENvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRMYXlvdXQoZSx0LDApLHRoaXMuZmxhdENvb3JkaW5hdGVzfHwodGhpcy5mbGF0Q29vcmRpbmF0ZXM9W10pLHRoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aD10aSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHQsdGhpcy5zdHJpZGUpLHRoaXMuY2hhbmdlZCgpfSxlfShXZSk7ZnVuY3Rpb24gZGkodCxlLGkscixuKXtyZXR1cm4hbXQobixmdW5jdGlvbihuKXtyZXR1cm4hZmkodCxlLGkscixuWzBdLG5bMV0pfSl9ZnVuY3Rpb24gZmkodCxlLGkscixuLG8pe2Zvcih2YXIgcz0wLGE9dFtpLXJdLGg9dFtpLXIrMV07ZTxpO2UrPXIpe3ZhciBsPXRbZV0sdT10W2UrMV07aDw9bz91Pm8mJihsLWEpKihvLWgpLShuLWEpKih1LWgpPjAmJnMrKzp1PD1vJiYobC1hKSooby1oKS0obi1hKSoodS1oKTwwJiZzLS0sYT1sLGg9dX1yZXR1cm4gMCE9PXN9ZnVuY3Rpb24gX2kodCxlLGkscixuLG8pe2lmKDA9PT1pLmxlbmd0aClyZXR1cm4hMTtpZighZmkodCxlLGlbMF0scixuLG8pKXJldHVybiExO2Zvcih2YXIgcz0xLGE9aS5sZW5ndGg7czxhOysrcylpZihmaSh0LGlbcy0xXSxpW3NdLHIsbixvKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBnaSh0LGUsaSxyLG4sbyxzKXtmb3IodmFyIGEsaCxsLHUscCxjLGQsZj1uW28rMV0sXz1bXSxnPTAseT1pLmxlbmd0aDtnPHk7KytnKXt2YXIgdj1pW2ddO2Zvcih1PXRbdi1yXSxjPXRbdi1yKzFdLGE9ZTthPHY7YSs9cilwPXRbYV0sZD10W2ErMV0sKGY8PWMmJmQ8PWZ8fGM8PWYmJmY8PWQpJiYobD0oZi1jKS8oZC1jKSoocC11KSt1LF8ucHVzaChsKSksdT1wLGM9ZH12YXIgbT1OYU4seD0tMS8wO2ZvcihfLnNvcnQoViksdT1fWzBdLGE9MSxoPV8ubGVuZ3RoO2E8aDsrK2Epe3A9X1thXTt2YXIgRT1NYXRoLmFicyhwLXUpO0U+eCYmX2kodCxlLGkscixsPSh1K3ApLzIsZikmJihtPWwseD1FKSx1PXB9cmV0dXJuIGlzTmFOKG0pJiYobT1uW29dKSxzPyhzLnB1c2gobSxmLHgpLHMpOlttLGYseF19ZnVuY3Rpb24geWkodCxlLGkscixuKXtmb3IodmFyIG89W10scz0wLGE9aS5sZW5ndGg7czxhOysrcyl7dmFyIGg9aVtzXTtvPWdpKHQsZSxoLHIsbiwyKnMsbyksZT1oW2gubGVuZ3RoLTFdfXJldHVybiBvfWZ1bmN0aW9uIHZpKHQsZSxpLHIsbixvKXtmb3IodmFyIHMsYT1bdFtlXSx0W2UrMV1dLGg9W107ZStyPGk7ZSs9cil7aWYoaFswXT10W2Urcl0saFsxXT10W2UrcisxXSxzPW4uY2FsbChvLGEsaCkpcmV0dXJuIHM7YVswXT1oWzBdLGFbMV09aFsxXX1yZXR1cm4hMX1mdW5jdGlvbiBtaSh0LGUsaSxyLG4pe3ZhciBvPXl0KFsxLzAsMS8wLC0xLzAsLTEvMF0sdCxlLGkscik7cmV0dXJuISFQdChuLG8pJiYoISFvdChuLG8pfHwob1swXT49blswXSYmb1syXTw9blsyXXx8KG9bMV0+PW5bMV0mJm9bM108PW5bM118fHZpKHQsZSxpLHIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24odCxlLGkpe3ZhciByPSExLG49YXQodCxlKSxvPWF0KHQsaSk7aWYobj09PSQuSU5URVJTRUNUSU5HfHxvPT09JC5JTlRFUlNFQ1RJTkcpcj0hMDtlbHNle3ZhciBzLGEsaD10WzBdLGw9dFsxXSx1PXRbMl0scD10WzNdLGM9ZVswXSxkPWVbMV0sZj1pWzBdLF89aVsxXSxnPShfLWQpLyhmLWMpO28mJC5BQk9WRSYmIShuJiQuQUJPVkUpJiYocj0ocz1mLShfLXApL2cpPj1oJiZzPD11KSxyfHwhKG8mJC5SSUdIVCl8fG4mJC5SSUdIVHx8KHI9KGE9Xy0oZi11KSpnKT49bCYmYTw9cCkscnx8IShvJiQuQkVMT1cpfHxuJiQuQkVMT1d8fChyPShzPWYtKF8tbCkvZyk+PWgmJnM8PXUpLHJ8fCEobyYkLkxFRlQpfHxuJiQuTEVGVHx8KHI9KGE9Xy0oZi1oKSpnKT49bCYmYTw9cCl9cmV0dXJuIHJ9KG4sdCxlKX0pKSkpfWZ1bmN0aW9uIHhpKHQsZSxpLHIsbil7aWYoIWZ1bmN0aW9uKHQsZSxpLHIsbil7cmV0dXJuISEobWkodCxlLGkscixuKXx8ZmkodCxlLGkscixuWzBdLG5bMV0pfHxmaSh0LGUsaSxyLG5bMF0sblszXSl8fGZpKHQsZSxpLHIsblsyXSxuWzFdKXx8ZmkodCxlLGkscixuWzJdLG5bM10pKX0odCxlLGlbMF0scixuKSlyZXR1cm4hMTtpZigxPT09aS5sZW5ndGgpcmV0dXJuITA7Zm9yKHZhciBvPTEscz1pLmxlbmd0aDtvPHM7KytvKWlmKGRpKHQsaVtvLTFdLGlbb10scixuKSYmIW1pKHQsaVtvLTFdLGlbb10scixuKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBFaSh0LGUsaSxyKXtmb3IoO2U8aS1yOyl7Zm9yKHZhciBuPTA7bjxyOysrbil7dmFyIG89dFtlK25dO3RbZStuXT10W2ktcituXSx0W2ktcituXT1vfWUrPXIsaS09cn19ZnVuY3Rpb24gU2kodCxlLGkscil7Zm9yKHZhciBuPTAsbz10W2ktcl0scz10W2ktcisxXTtlPGk7ZSs9cil7dmFyIGE9dFtlXSxoPXRbZSsxXTtuKz0oYS1vKSooaCtzKSxvPWEscz1ofXJldHVybiBuPjB9ZnVuY3Rpb24gVGkodCxlLGkscixuKXtmb3IodmFyIG89dm9pZCAwIT09biYmbixzPTAsYT1pLmxlbmd0aDtzPGE7KytzKXt2YXIgaD1pW3NdLGw9U2kodCxlLGgscik7aWYoMD09PXMpe2lmKG8mJmx8fCFvJiYhbClyZXR1cm4hMX1lbHNlIGlmKG8mJiFsfHwhbyYmbClyZXR1cm4hMTtlPWh9cmV0dXJuITB9ZnVuY3Rpb24gQ2kodCxlLGkscixuKXtmb3IodmFyIG89dm9pZCAwIT09biYmbixzPTAsYT1pLmxlbmd0aDtzPGE7KytzKXt2YXIgaD1pW3NdLGw9U2kodCxlLGgscik7KDA9PT1zP28mJmx8fCFvJiYhbDpvJiYhbHx8IW8mJmwpJiZFaSh0LGUsaCxyKSxlPWh9cmV0dXJuIGV9ZnVuY3Rpb24gUmkodCxlLGkscixuKXtmb3IodmFyIG89MCxzPWkubGVuZ3RoO288czsrK28pZT1DaSh0LGUsaVtvXSxyLG4pO3JldHVybiBlfXZhciB3aT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXt0LmNhbGwodGhpcyksdGhpcy5lbmRzXz1bXSx0aGlzLmZsYXRJbnRlcmlvclBvaW50UmV2aXNpb25fPS0xLHRoaXMuZmxhdEludGVyaW9yUG9pbnRfPW51bGwsdGhpcy5tYXhEZWx0YV89LTEsdGhpcy5tYXhEZWx0YVJldmlzaW9uXz0tMSx0aGlzLm9yaWVudGVkUmV2aXNpb25fPS0xLHRoaXMub3JpZW50ZWRGbGF0Q29vcmRpbmF0ZXNfPW51bGwsdm9pZCAwIT09aSYmcj8odGhpcy5zZXRGbGF0Q29vcmRpbmF0ZXMoaSxlKSx0aGlzLmVuZHNfPXIpOnRoaXMuc2V0Q29vcmRpbmF0ZXMoZSxpKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuYXBwZW5kTGluZWFyUmluZz1mdW5jdGlvbih0KXt0aGlzLmZsYXRDb29yZGluYXRlcz9LKHRoaXMuZmxhdENvb3JkaW5hdGVzLHQuZ2V0RmxhdENvb3JkaW5hdGVzKCkpOnRoaXMuZmxhdENvb3JkaW5hdGVzPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCkuc2xpY2UoKSx0aGlzLmVuZHNfLnB1c2godGhpcy5mbGF0Q29vcmRpbmF0ZXMubGVuZ3RoKSx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5mbGF0Q29vcmRpbmF0ZXMuc2xpY2UoKSx0aGlzLmxheW91dCx0aGlzLmVuZHNfLnNsaWNlKCkpfSxlLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRYWT1mdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gcjxydCh0aGlzLmdldEV4dGVudCgpLHQsZSk/cjoodGhpcy5tYXhEZWx0YVJldmlzaW9uXyE9dGhpcy5nZXRSZXZpc2lvbigpJiYodGhpcy5tYXhEZWx0YV89TWF0aC5zcXJ0KEplKHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5lbmRzXyx0aGlzLnN0cmlkZSwwKSksdGhpcy5tYXhEZWx0YVJldmlzaW9uXz10aGlzLmdldFJldmlzaW9uKCkpLCRlKHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5lbmRzXyx0aGlzLnN0cmlkZSx0aGlzLm1heERlbHRhXywhMCx0LGUsaSxyKSl9LGUucHJvdG90eXBlLmNvbnRhaW5zWFk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gX2kodGhpcy5nZXRPcmllbnRlZEZsYXRDb29yZGluYXRlcygpLDAsdGhpcy5lbmRzXyx0aGlzLnN0cmlkZSx0LGUpfSxlLnByb3RvdHlwZS5nZXRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIEhlKHRoaXMuZ2V0T3JpZW50ZWRGbGF0Q29vcmRpbmF0ZXMoKSwwLHRoaXMuZW5kc18sdGhpcy5zdHJpZGUpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gdm9pZCAwIT09dD9DaShlPXRoaXMuZ2V0T3JpZW50ZWRGbGF0Q29vcmRpbmF0ZXMoKS5zbGljZSgpLDAsdGhpcy5lbmRzXyx0aGlzLnN0cmlkZSx0KTplPXRoaXMuZmxhdENvb3JkaW5hdGVzLG5pKGUsMCx0aGlzLmVuZHNfLHRoaXMuc3RyaWRlKX0sZS5wcm90b3R5cGUuZ2V0RW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZHNffSxlLnByb3RvdHlwZS5nZXRGbGF0SW50ZXJpb3JQb2ludD1mdW5jdGlvbigpe2lmKHRoaXMuZmxhdEludGVyaW9yUG9pbnRSZXZpc2lvbl8hPXRoaXMuZ2V0UmV2aXNpb24oKSl7dmFyIHQ9VHQodGhpcy5nZXRFeHRlbnQoKSk7dGhpcy5mbGF0SW50ZXJpb3JQb2ludF89Z2kodGhpcy5nZXRPcmllbnRlZEZsYXRDb29yZGluYXRlcygpLDAsdGhpcy5lbmRzXyx0aGlzLnN0cmlkZSx0LDApLHRoaXMuZmxhdEludGVyaW9yUG9pbnRSZXZpc2lvbl89dGhpcy5nZXRSZXZpc2lvbigpfXJldHVybiB0aGlzLmZsYXRJbnRlcmlvclBvaW50X30sZS5wcm90b3R5cGUuZ2V0SW50ZXJpb3JQb2ludD1mdW5jdGlvbigpe3JldHVybiBuZXcgY2kodGhpcy5nZXRGbGF0SW50ZXJpb3JQb2ludCgpLEF0LlhZTSl9LGUucHJvdG90eXBlLmdldExpbmVhclJpbmdDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZHNfLmxlbmd0aH0sZS5wcm90b3R5cGUuZ2V0TGluZWFyUmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdDwwfHx0aGlzLmVuZHNfLmxlbmd0aDw9dD9udWxsOm5ldyBwaSh0aGlzLmZsYXRDb29yZGluYXRlcy5zbGljZSgwPT09dD8wOnRoaXMuZW5kc19bdC0xXSx0aGlzLmVuZHNfW3RdKSx0aGlzLmxheW91dCl9LGUucHJvdG90eXBlLmdldExpbmVhclJpbmdzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMubGF5b3V0LGU9dGhpcy5mbGF0Q29vcmRpbmF0ZXMsaT10aGlzLmVuZHNfLHI9W10sbj0wLG89MCxzPWkubGVuZ3RoO288czsrK28pe3ZhciBhPWlbb10saD1uZXcgcGkoZS5zbGljZShuLGEpLHQpO3IucHVzaChoKSxuPWF9cmV0dXJuIHJ9LGUucHJvdG90eXBlLmdldE9yaWVudGVkRmxhdENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7aWYodGhpcy5vcmllbnRlZFJldmlzaW9uXyE9dGhpcy5nZXRSZXZpc2lvbigpKXt2YXIgdD10aGlzLmZsYXRDb29yZGluYXRlcztUaSh0LDAsdGhpcy5lbmRzXyx0aGlzLnN0cmlkZSk/dGhpcy5vcmllbnRlZEZsYXRDb29yZGluYXRlc189dDoodGhpcy5vcmllbnRlZEZsYXRDb29yZGluYXRlc189dC5zbGljZSgpLHRoaXMub3JpZW50ZWRGbGF0Q29vcmRpbmF0ZXNfLmxlbmd0aD1DaSh0aGlzLm9yaWVudGVkRmxhdENvb3JkaW5hdGVzXywwLHRoaXMuZW5kc18sdGhpcy5zdHJpZGUpKSx0aGlzLm9yaWVudGVkUmV2aXNpb25fPXRoaXMuZ2V0UmV2aXNpb24oKX1yZXR1cm4gdGhpcy5vcmllbnRlZEZsYXRDb29yZGluYXRlc199LGUucHJvdG90eXBlLmdldFNpbXBsaWZpZWRHZW9tZXRyeUludGVybmFsPWZ1bmN0aW9uKHQpe3ZhciBpPVtdLHI9W107cmV0dXJuIGkubGVuZ3RoPXVpKHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5lbmRzXyx0aGlzLnN0cmlkZSxNYXRoLnNxcnQodCksaSwwLHIpLG5ldyBlKGksQXQuWFkscil9LGUucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gTnQuUE9MWUdPTn0sZS5wcm90b3R5cGUuaW50ZXJzZWN0c0V4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4geGkodGhpcy5nZXRPcmllbnRlZEZsYXRDb29yZGluYXRlcygpLDAsdGhpcy5lbmRzXyx0aGlzLnN0cmlkZSx0KX0sZS5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlKXt0aGlzLnNldExheW91dChlLHQsMiksdGhpcy5mbGF0Q29vcmRpbmF0ZXN8fCh0aGlzLmZsYXRDb29yZGluYXRlcz1bXSk7dmFyIGk9aWkodGhpcy5mbGF0Q29vcmRpbmF0ZXMsMCx0LHRoaXMuc3RyaWRlLHRoaXMuZW5kc18pO3RoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aD0wPT09aS5sZW5ndGg/MDppW2kubGVuZ3RoLTFdLHRoaXMuY2hhbmdlZCgpfSxlfShXZSksSWk9d2k7ZnVuY3Rpb24gTGkodCxlLGkscil7Zm9yKHZhciBuPWl8fDMyLG89W10scz0wO3M8bjsrK3MpSyhvLHF0KHQsZSwyKk1hdGguUEkqcy9uLHIpKTtyZXR1cm4gby5wdXNoKG9bMF0sb1sxXSksbmV3IHdpKG8sQXQuWFksW28ubGVuZ3RoXSl9ZnVuY3Rpb24gT2kodCl7dmFyIGU9dFswXSxpPXRbMV0scj10WzJdLG49dFszXSxvPVtlLGksZSxuLHIsbixyLGksZSxpXTtyZXR1cm4gbmV3IHdpKG8sQXQuWFksW28ubGVuZ3RoXSl9ZnVuY3Rpb24gUGkodCxlLGkpe2Zvcih2YXIgcj1lfHwzMixuPXQuZ2V0U3RyaWRlKCksbz10LmdldExheW91dCgpLHM9dC5nZXRDZW50ZXIoKSxhPW4qKHIrMSksaD1uZXcgQXJyYXkoYSksbD0wO2w8YTtsKz1uKXtoW2xdPTAsaFtsKzFdPTA7Zm9yKHZhciB1PTI7dTxuO3UrKyloW2wrdV09c1t1XX12YXIgcD1baC5sZW5ndGhdLGM9bmV3IHdpKGgsbyxwKTtyZXR1cm4gYmkoYyxzLHQuZ2V0UmFkaXVzKCksaSksY31mdW5jdGlvbiBiaSh0LGUsaSxyKXtmb3IodmFyIG49dC5nZXRGbGF0Q29vcmRpbmF0ZXMoKSxvPXQuZ2V0U3RyaWRlKCkscz1uLmxlbmd0aC9vLTEsYT1yfHwwLGg9MDtoPD1zOysraCl7dmFyIGw9aCpvLHU9YSsyKlh0KGgscykqTWF0aC5QSS9zO25bbF09ZVswXStpKk1hdGguY29zKHUpLG5bbCsxXT1lWzFdK2kqTWF0aC5zaW4odSl9dC5jaGFuZ2VkKCl9dmFyIE1pPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yP25hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKToiIixGaT0tMSE9PU1pLmluZGV4T2YoImZpcmVmb3giKSxBaT0tMSE9PU1pLmluZGV4T2YoInNhZmFyaSIpJiYtMT09TWkuaW5kZXhPZigiY2hyb20iKSxOaT0tMSE9PU1pLmluZGV4T2YoIndlYmtpdCIpJiYtMT09TWkuaW5kZXhPZigiZWRnZSIpLEdpPS0xIT09TWkuaW5kZXhPZigibWFjaW50b3NoIiksRGk9d2luZG93LmRldmljZVBpeGVsUmF0aW98fDEsa2k9ZnVuY3Rpb24oKXt2YXIgdD0hMTt0cnl7dD0hIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIikuc2V0TGluZURhc2h9Y2F0Y2godCl7fXJldHVybiB0fSgpLGppPSJnZW9sb2NhdGlvbiJpbiBuYXZpZ2F0b3IsVWk9Im9udG91Y2hzdGFydCJpbiB3aW5kb3csWWk9IlBvaW50ZXJFdmVudCJpbiB3aW5kb3csQmk9ISFuYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZCxWaT17QUNDVVJBQ1k6ImFjY3VyYWN5IixBQ0NVUkFDWV9HRU9NRVRSWToiYWNjdXJhY3lHZW9tZXRyeSIsQUxUSVRVREU6ImFsdGl0dWRlIixBTFRJVFVERV9BQ0NVUkFDWToiYWx0aXR1ZGVBY2N1cmFjeSIsSEVBRElORzoiaGVhZGluZyIsUE9TSVRJT046InBvc2l0aW9uIixQUk9KRUNUSU9OOiJwcm9qZWN0aW9uIixTUEVFRDoic3BlZWQiLFRSQUNLSU5HOiJ0cmFja2luZyIsVFJBQ0tJTkdfT1BUSU9OUzoidHJhY2tpbmdPcHRpb25zIn0sWGk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyxNLkVSUk9SKSx0aGlzLmNvZGU9ZS5jb2RlLHRoaXMubWVzc2FnZT1lLm1lc3NhZ2V9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KFApLHppPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpO3ZhciBpPWV8fHt9O3RoaXMucG9zaXRpb25fPW51bGwsdGhpcy50cmFuc2Zvcm1fPW1lLHRoaXMud2F0Y2hJZF89dm9pZCAwLHYodGhpcyxHKFZpLlBST0pFQ1RJT04pLHRoaXMuaGFuZGxlUHJvamVjdGlvbkNoYW5nZWRfLHRoaXMpLHYodGhpcyxHKFZpLlRSQUNLSU5HKSx0aGlzLmhhbmRsZVRyYWNraW5nQ2hhbmdlZF8sdGhpcyksdm9pZCAwIT09aS5wcm9qZWN0aW9uJiZ0aGlzLnNldFByb2plY3Rpb24oaS5wcm9qZWN0aW9uKSx2b2lkIDAhPT1pLnRyYWNraW5nT3B0aW9ucyYmdGhpcy5zZXRUcmFja2luZ09wdGlvbnMoaS50cmFja2luZ09wdGlvbnMpLHRoaXMuc2V0VHJhY2tpbmcodm9pZCAwIT09aS50cmFja2luZyYmaS50cmFja2luZyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbD1mdW5jdGlvbigpe3RoaXMuc2V0VHJhY2tpbmcoITEpLHQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5oYW5kbGVQcm9qZWN0aW9uQ2hhbmdlZF89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFByb2plY3Rpb24oKTt0JiYodGhpcy50cmFuc2Zvcm1fPUxlKEVlKCJFUFNHOjQzMjYiKSx0KSx0aGlzLnBvc2l0aW9uXyYmdGhpcy5zZXQoVmkuUE9TSVRJT04sdGhpcy50cmFuc2Zvcm1fKHRoaXMucG9zaXRpb25fKSkpfSxlLnByb3RvdHlwZS5oYW5kbGVUcmFja2luZ0NoYW5nZWRfPWZ1bmN0aW9uKCl7aWYoamkpe3ZhciB0PXRoaXMuZ2V0VHJhY2tpbmcoKTt0JiZ2b2lkIDA9PT10aGlzLndhdGNoSWRfP3RoaXMud2F0Y2hJZF89bmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24odGhpcy5wb3NpdGlvbkNoYW5nZV8uYmluZCh0aGlzKSx0aGlzLnBvc2l0aW9uRXJyb3JfLmJpbmQodGhpcyksdGhpcy5nZXRUcmFja2luZ09wdGlvbnMoKSk6dHx8dm9pZCAwPT09dGhpcy53YXRjaElkX3x8KG5hdmlnYXRvci5nZW9sb2NhdGlvbi5jbGVhcldhdGNoKHRoaXMud2F0Y2hJZF8pLHRoaXMud2F0Y2hJZF89dm9pZCAwKX19LGUucHJvdG90eXBlLnBvc2l0aW9uQ2hhbmdlXz1mdW5jdGlvbih0KXt2YXIgZT10LmNvb3Jkczt0aGlzLnNldChWaS5BQ0NVUkFDWSxlLmFjY3VyYWN5KSx0aGlzLnNldChWaS5BTFRJVFVERSxudWxsPT09ZS5hbHRpdHVkZT92b2lkIDA6ZS5hbHRpdHVkZSksdGhpcy5zZXQoVmkuQUxUSVRVREVfQUNDVVJBQ1ksbnVsbD09PWUuYWx0aXR1ZGVBY2N1cmFjeT92b2lkIDA6ZS5hbHRpdHVkZUFjY3VyYWN5KSx0aGlzLnNldChWaS5IRUFESU5HLG51bGw9PT1lLmhlYWRpbmc/dm9pZCAwOlZ0KGUuaGVhZGluZykpLHRoaXMucG9zaXRpb25fPyh0aGlzLnBvc2l0aW9uX1swXT1lLmxvbmdpdHVkZSx0aGlzLnBvc2l0aW9uX1sxXT1lLmxhdGl0dWRlKTp0aGlzLnBvc2l0aW9uXz1bZS5sb25naXR1ZGUsZS5sYXRpdHVkZV07dmFyIGk9dGhpcy50cmFuc2Zvcm1fKHRoaXMucG9zaXRpb25fKTt0aGlzLnNldChWaS5QT1NJVElPTixpKSx0aGlzLnNldChWaS5TUEVFRCxudWxsPT09ZS5zcGVlZD92b2lkIDA6ZS5zcGVlZCk7dmFyIHI9TGkodGhpcy5wb3NpdGlvbl8sZS5hY2N1cmFjeSk7ci5hcHBseVRyYW5zZm9ybSh0aGlzLnRyYW5zZm9ybV8pLHRoaXMuc2V0KFZpLkFDQ1VSQUNZX0dFT01FVFJZLHIpLHRoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5wb3NpdGlvbkVycm9yXz1mdW5jdGlvbih0KXt0aGlzLnNldFRyYWNraW5nKCExKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFhpKHQpKX0sZS5wcm90b3R5cGUuZ2V0QWNjdXJhY3k9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoVmkuQUNDVVJBQ1kpfSxlLnByb3RvdHlwZS5nZXRBY2N1cmFjeUdlb21ldHJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFZpLkFDQ1VSQUNZX0dFT01FVFJZKXx8bnVsbH0sZS5wcm90b3R5cGUuZ2V0QWx0aXR1ZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoVmkuQUxUSVRVREUpfSxlLnByb3RvdHlwZS5nZXRBbHRpdHVkZUFjY3VyYWN5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFZpLkFMVElUVURFX0FDQ1VSQUNZKX0sZS5wcm90b3R5cGUuZ2V0SGVhZGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChWaS5IRUFESU5HKX0sZS5wcm90b3R5cGUuZ2V0UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoVmkuUE9TSVRJT04pfSxlLnByb3RvdHlwZS5nZXRQcm9qZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFZpLlBST0pFQ1RJT04pfSxlLnByb3RvdHlwZS5nZXRTcGVlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChWaS5TUEVFRCl9LGUucHJvdG90eXBlLmdldFRyYWNraW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFZpLlRSQUNLSU5HKX0sZS5wcm90b3R5cGUuZ2V0VHJhY2tpbmdPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFZpLlRSQUNLSU5HX09QVElPTlMpfSxlLnByb3RvdHlwZS5zZXRQcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KFZpLlBST0pFQ1RJT04sRWUodCkpfSxlLnByb3RvdHlwZS5zZXRUcmFja2luZz1mdW5jdGlvbih0KXt0aGlzLnNldChWaS5UUkFDS0lORyx0KX0sZS5wcm90b3R5cGUuc2V0VHJhY2tpbmdPcHRpb25zPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KFZpLlRSQUNLSU5HX09QVElPTlMsdCl9LGV9KEQpO2Z1bmN0aW9uIFdpKHQsZSxpKXt2YXIgcj12b2lkIDAhPT1pP3QudG9GaXhlZChpKToiIit0LG49ci5pbmRleE9mKCIuIik7cmV0dXJuKG49LTE9PT1uP3IubGVuZ3RoOm4pPmU/cjpuZXcgQXJyYXkoMStlLW4pLmpvaW4oIjAiKStyfWZ1bmN0aW9uIEtpKHQsZSl7Zm9yKHZhciBpPSgiIit0KS5zcGxpdCgiLiIpLHI9KCIiK2UpLnNwbGl0KCIuIiksbj0wO248TWF0aC5tYXgoaS5sZW5ndGgsci5sZW5ndGgpO24rKyl7dmFyIG89cGFyc2VJbnQoaVtuXXx8IjAiLDEwKSxzPXBhcnNlSW50KHJbbl18fCIwIiwxMCk7aWYobz5zKXJldHVybiAxO2lmKHM+bylyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBIaSh0LGUpe3JldHVybiB0WzBdKz1lWzBdLHRbMV0rPWVbMV0sdH1mdW5jdGlvbiBaaSh0LGUpe3ZhciBpLHIsbj10WzBdLG89dFsxXSxzPWVbMF0sYT1lWzFdLGg9c1swXSxsPXNbMV0sdT1hWzBdLHA9YVsxXSxjPXUtaCxkPXAtbCxmPTA9PT1jJiYwPT09ZD8wOihjKihuLWgpK2QqKG8tbCkpLyhjKmMrZCpkfHwwKTtyZXR1cm4gZjw9MD8oaT1oLHI9bCk6Zj49MT8oaT11LHI9cCk6KGk9aCtmKmMscj1sK2YqZCksW2kscl19ZnVuY3Rpb24gcWkodCxlLGkpe3ZhciByPVh0KGUrMTgwLDM2MCktMTgwLG49TWF0aC5hYnMoMzYwMCpyKSxvPWl8fDAscz1NYXRoLnBvdygxMCxvKSxhPU1hdGguZmxvb3Iobi8zNjAwKSxoPU1hdGguZmxvb3IoKG4tMzYwMCphKS82MCksbD1uLTM2MDAqYS02MCpoO3JldHVybihsPU1hdGguY2VpbChsKnMpL3MpPj02MCYmKGw9MCxoKz0xKSxoPj02MCYmKGg9MCxhKz0xKSxhKyLCsCAiK1dpKGgsMikrIuKAsiAiK1dpKGwsMixvKSsi4oCzIisoMD09cj8iIjoiICIrdC5jaGFyQXQocjwwPzE6MCkpfWZ1bmN0aW9uIEppKHQsZSxpKXtyZXR1cm4gdD9lLnJlcGxhY2UoInt4fSIsdFswXS50b0ZpeGVkKGkpKS5yZXBsYWNlKCJ7eX0iLHRbMV0udG9GaXhlZChpKSk6IiJ9ZnVuY3Rpb24gUWkodCxlKXtmb3IodmFyIGk9ITAscj10Lmxlbmd0aC0xO3I+PTA7LS1yKWlmKHRbcl0hPWVbcl0pe2k9ITE7YnJlYWt9cmV0dXJuIGl9ZnVuY3Rpb24gJGkodCxlKXt2YXIgaT1NYXRoLmNvcyhlKSxyPU1hdGguc2luKGUpLG49dFswXSppLXRbMV0qcixvPXRbMV0qaSt0WzBdKnI7cmV0dXJuIHRbMF09bix0WzFdPW8sdH1mdW5jdGlvbiB0cih0LGUpe3JldHVybiB0WzBdKj1lLHRbMV0qPWUsdH1mdW5jdGlvbiBlcih0LGUpe3ZhciBpPXRbMF0tZVswXSxyPXRbMV0tZVsxXTtyZXR1cm4gaSppK3Iqcn1mdW5jdGlvbiBpcih0LGUpe3JldHVybiBNYXRoLnNxcnQoZXIodCxlKSl9ZnVuY3Rpb24gcnIodCxlKXtyZXR1cm4gZXIodCxaaSh0LGUpKX1mdW5jdGlvbiBucih0LGUpe3JldHVybiBKaSh0LCJ7eH0sIHt5fSIsZSl9ZnVuY3Rpb24gb3IodCxlLGkscixuLG8pe3ZhciBzPU5hTixhPU5hTixoPShpLWUpL3I7aWYoMT09PWgpcz10W2VdLGE9dFtlKzFdO2Vsc2UgaWYoMj09aClzPSgxLW4pKnRbZV0rbip0W2Urcl0sYT0oMS1uKSp0W2UrMV0rbip0W2UrcisxXTtlbHNlIGlmKDAhPT1oKXtmb3IodmFyIGw9dFtlXSx1PXRbZSsxXSxwPTAsYz1bMF0sZD1lK3I7ZDxpO2QrPXIpe3ZhciBmPXRbZF0sXz10W2QrMV07cCs9TWF0aC5zcXJ0KChmLWwpKihmLWwpKyhfLXUpKihfLXUpKSxjLnB1c2gocCksbD1mLHU9X312YXIgZz1uKnAseT1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciByLG4sbz1pfHxWLHM9MCxhPXQubGVuZ3RoLGg9ITE7czxhOykobj0rbyh0W3I9cysoYS1zPj4xKV0sZSkpPDA/cz1yKzE6KGE9cixoPSFuKTtyZXR1cm4gaD9zOn5zfShjLGcpO2lmKHk8MCl7dmFyIHY9KGctY1steS0yXSkvKGNbLXktMV0tY1steS0yXSksbT1lKygteS0yKSpyO3M9enQodFttXSx0W20rcl0sdiksYT16dCh0W20rMV0sdFttK3IrMV0sdil9ZWxzZSBzPXRbZSt5KnJdLGE9dFtlK3kqcisxXX1yZXR1cm4gbz8ob1swXT1zLG9bMV09YSxvKTpbcyxhXX1mdW5jdGlvbiBzcih0LGUsaSxyLG4sbyl7aWYoaT09ZSlyZXR1cm4gbnVsbDt2YXIgcztpZihuPHRbZStyLTFdKXJldHVybiBvPygocz10LnNsaWNlKGUsZStyKSlbci0xXT1uLHMpOm51bGw7aWYodFtpLTFdPG4pcmV0dXJuIG8/KChzPXQuc2xpY2UoaS1yLGkpKVtyLTFdPW4scyk6bnVsbDtpZihuPT10W2Urci0xXSlyZXR1cm4gdC5zbGljZShlLGUrcik7Zm9yKHZhciBhPWUvcixoPWkvcjthPGg7KXt2YXIgbD1hK2g+PjE7bjx0WyhsKzEpKnItMV0/aD1sOmE9bCsxfXZhciB1PXRbYSpyLTFdO2lmKG49PXUpcmV0dXJuIHQuc2xpY2UoKGEtMSkqciwoYS0xKSpyK3IpO3ZhciBwPShuLXUpLyh0WyhhKzEpKnItMV0tdSk7cz1bXTtmb3IodmFyIGM9MDtjPHItMTsrK2Mpcy5wdXNoKHp0KHRbKGEtMSkqcitjXSx0W2EqcitjXSxwKSk7cmV0dXJuIHMucHVzaChuKSxzfWZ1bmN0aW9uIGFyKHQsZSxpLHIpe2Zvcih2YXIgbj10W2VdLG89dFtlKzFdLHM9MCxhPWUrcjthPGk7YSs9cil7dmFyIGg9dFthXSxsPXRbYSsxXTtzKz1NYXRoLnNxcnQoKGgtbikqKGgtbikrKGwtbykqKGwtbykpLG49aCxvPWx9cmV0dXJuIHN9dmFyIGhyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcyksdGhpcy5mbGF0TWlkcG9pbnRfPW51bGwsdGhpcy5mbGF0TWlkcG9pbnRSZXZpc2lvbl89LTEsdGhpcy5tYXhEZWx0YV89LTEsdGhpcy5tYXhEZWx0YVJldmlzaW9uXz0tMSx2b2lkIDA9PT1pfHxBcnJheS5pc0FycmF5KGVbMF0pP3RoaXMuc2V0Q29vcmRpbmF0ZXMoZSxpKTp0aGlzLnNldEZsYXRDb29yZGluYXRlcyhpLGUpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5hcHBlbmRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3RoaXMuZmxhdENvb3JkaW5hdGVzP0sodGhpcy5mbGF0Q29vcmRpbmF0ZXMsdCk6dGhpcy5mbGF0Q29vcmRpbmF0ZXM9dC5zbGljZSgpLHRoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLmZsYXRDb29yZGluYXRlcy5zbGljZSgpLHRoaXMubGF5b3V0KX0sZS5wcm90b3R5cGUuY2xvc2VzdFBvaW50WFk9ZnVuY3Rpb24odCxlLGkscil7cmV0dXJuIHI8cnQodGhpcy5nZXRFeHRlbnQoKSx0LGUpP3I6KHRoaXMubWF4RGVsdGFSZXZpc2lvbl8hPXRoaXMuZ2V0UmV2aXNpb24oKSYmKHRoaXMubWF4RGVsdGFfPU1hdGguc3FydChxZSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHRoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aCx0aGlzLnN0cmlkZSwwKSksdGhpcy5tYXhEZWx0YVJldmlzaW9uXz10aGlzLmdldFJldmlzaW9uKCkpLFFlKHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5mbGF0Q29vcmRpbmF0ZXMubGVuZ3RoLHRoaXMuc3RyaWRlLHRoaXMubWF4RGVsdGFfLCExLHQsZSxpLHIpKX0sZS5wcm90b3R5cGUuZm9yRWFjaFNlZ21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHZpKHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5mbGF0Q29vcmRpbmF0ZXMubGVuZ3RoLHRoaXMuc3RyaWRlLHQpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlQXRNPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5sYXlvdXQhPUF0LlhZTSYmdGhpcy5sYXlvdXQhPUF0LlhZWk0pcmV0dXJuIG51bGw7dmFyIGk9dm9pZCAwIT09ZSYmZTtyZXR1cm4gc3IodGhpcy5mbGF0Q29vcmRpbmF0ZXMsMCx0aGlzLmZsYXRDb29yZGluYXRlcy5sZW5ndGgsdGhpcy5zdHJpZGUsdCxpKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gcmkodGhpcy5mbGF0Q29vcmRpbmF0ZXMsMCx0aGlzLmZsYXRDb29yZGluYXRlcy5sZW5ndGgsdGhpcy5zdHJpZGUpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlQXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gb3IodGhpcy5mbGF0Q29vcmRpbmF0ZXMsMCx0aGlzLmZsYXRDb29yZGluYXRlcy5sZW5ndGgsdGhpcy5zdHJpZGUsdCxlKX0sZS5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIGFyKHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5mbGF0Q29vcmRpbmF0ZXMubGVuZ3RoLHRoaXMuc3RyaWRlKX0sZS5wcm90b3R5cGUuZ2V0RmxhdE1pZHBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmxhdE1pZHBvaW50UmV2aXNpb25fIT10aGlzLmdldFJldmlzaW9uKCkmJih0aGlzLmZsYXRNaWRwb2ludF89dGhpcy5nZXRDb29yZGluYXRlQXQoLjUsdGhpcy5mbGF0TWlkcG9pbnRfKSx0aGlzLmZsYXRNaWRwb2ludFJldmlzaW9uXz10aGlzLmdldFJldmlzaW9uKCkpLHRoaXMuZmxhdE1pZHBvaW50X30sZS5wcm90b3R5cGUuZ2V0U2ltcGxpZmllZEdlb21ldHJ5SW50ZXJuYWw9ZnVuY3Rpb24odCl7dmFyIGk9W107cmV0dXJuIGkubGVuZ3RoPXNpKHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5mbGF0Q29vcmRpbmF0ZXMubGVuZ3RoLHRoaXMuc3RyaWRlLHQsaSwwKSxuZXcgZShpLEF0LlhZKX0sZS5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiBOdC5MSU5FX1NUUklOR30sZS5wcm90b3R5cGUuaW50ZXJzZWN0c0V4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gbWkodGhpcy5mbGF0Q29vcmRpbmF0ZXMsMCx0aGlzLmZsYXRDb29yZGluYXRlcy5sZW5ndGgsdGhpcy5zdHJpZGUsdCl9LGUucHJvdG90eXBlLnNldENvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRMYXlvdXQoZSx0LDEpLHRoaXMuZmxhdENvb3JkaW5hdGVzfHwodGhpcy5mbGF0Q29vcmRpbmF0ZXM9W10pLHRoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aD1laSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHQsdGhpcy5zdHJpZGUpLHRoaXMuY2hhbmdlZCgpfSxlfShXZSk7ZnVuY3Rpb24gbHIodCxlLGkpe2Zvcih2YXIgcixuLG8scyxhLGgsbD1bXSx1PXQoMCkscD10KDEpLGM9ZSh1KSxkPWUocCksZj1bcCx1XSxfPVtkLGNdLGc9WzEsMF0seT17fSx2PTFlNTstLXY+MCYmZy5sZW5ndGg+MDspbz1nLnBvcCgpLHU9Zi5wb3AoKSxjPV8ucG9wKCksKGg9by50b1N0cmluZygpKWluIHl8fChsLnB1c2goY1swXSxjWzFdKSx5W2hdPSEwKSxzPWcucG9wKCkscD1mLnBvcCgpLGQ9Xy5wb3AoKSxVdCgobj1lKHI9dChhPShvK3MpLzIpKSlbMF0sblsxXSxjWzBdLGNbMV0sZFswXSxkWzFdKTxpPyhsLnB1c2goZFswXSxkWzFdKSx5W2g9cy50b1N0cmluZygpXT0hMCk6KGcucHVzaChzLGEsYSxvKSxfLnB1c2goZCxuLG4sYyksZi5wdXNoKHAscixyLHUpKTtyZXR1cm4gbH12YXIgdXI9e1BPU1RDT01QT1NFOiJwb3N0Y29tcG9zZSIsUFJFQ09NUE9TRToicHJlY29tcG9zZSIsUkVOREVSOiJyZW5kZXIiLFJFTkRFUkNPTVBMRVRFOiJyZW5kZXJjb21wbGV0ZSJ9LHByPS9eIyhbYS1mMC05XXszfXxbYS1mMC05XXs0fSg/OlthLWYwLTldezJ9KXswLDJ9KSQvaSxjcj0vXihbYS16XSopJC9pO2Z1bmN0aW9uIGRyKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90OnlyKHQpfXZhciBmcj1mdW5jdGlvbigpe3ZhciB0PXt9LGU9MDtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIHI7aWYodC5oYXNPd25Qcm9wZXJ0eShpKSlyPXRbaV07ZWxzZXtpZihlPj0xMDI0KXt2YXIgbj0wO2Zvcih2YXIgbyBpbiB0KTA9PSgzJm4rKykmJihkZWxldGUgdFtvXSwtLWUpfXI9ZnVuY3Rpb24odCl7dmFyIGUsaSxyLG4sbztjci5leGVjKHQpJiYodD1mdW5jdGlvbih0KXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZihlLnN0eWxlLmNvbG9yPXQsIiIhPT1lLnN0eWxlLmNvbG9yKXtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBpPWdldENvbXB1dGVkU3R5bGUoZSkuY29sb3I7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksaX1yZXR1cm4iIn0odCkpO2lmKHByLmV4ZWModCkpe3ZhciBzLGE9dC5sZW5ndGgtMTtzPWE8PTQ/MToyO3ZhciBoPTQ9PT1hfHw4PT09YTtlPXBhcnNlSW50KHQuc3Vic3RyKDErMCpzLHMpLDE2KSxpPXBhcnNlSW50KHQuc3Vic3RyKDErMSpzLHMpLDE2KSxyPXBhcnNlSW50KHQuc3Vic3RyKDErMipzLHMpLDE2KSxuPWg/cGFyc2VJbnQodC5zdWJzdHIoMSszKnMscyksMTYpOjI1NSwxPT1zJiYoZT0oZTw8NCkrZSxpPShpPDw0KStpLHI9KHI8PDQpK3IsaCYmKG49KG48PDQpK24pKSxvPVtlLGkscixuLzI1NV19ZWxzZSAwPT10LmluZGV4T2YoInJnYmEoIik/Z3Iobz10LnNsaWNlKDUsLTEpLnNwbGl0KCIsIikubWFwKE51bWJlcikpOjA9PXQuaW5kZXhPZigicmdiKCIpPygobz10LnNsaWNlKDQsLTEpLnNwbGl0KCIsIikubWFwKE51bWJlcikpLnB1c2goMSksZ3IobykpOlkoITEsMTQpO3JldHVybiBvfShpKSx0W2ldPXIsKytlfXJldHVybiByfX0oKTtmdW5jdGlvbiBfcih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90OmZyKHQpfWZ1bmN0aW9uIGdyKHQpe3JldHVybiB0WzBdPWt0KHRbMF0rLjV8MCwwLDI1NSksdFsxXT1rdCh0WzFdKy41fDAsMCwyNTUpLHRbMl09a3QodFsyXSsuNXwwLDAsMjU1KSx0WzNdPWt0KHRbM10sMCwxKSx0fWZ1bmN0aW9uIHlyKHQpe3ZhciBlPXRbMF07ZSE9KDB8ZSkmJihlPWUrLjV8MCk7dmFyIGk9dFsxXTtpIT0oMHxpKSYmKGk9aSsuNXwwKTt2YXIgcj10WzJdO3JldHVybiByIT0oMHxyKSYmKHI9cisuNXwwKSwicmdiYSgiK2UrIiwiK2krIiwiK3IrIiwiKyh2b2lkIDA9PT10WzNdPzE6dFszXSkrIikifXZhciB2cj1mdW5jdGlvbih0KXt2YXIgZT10fHx7fTt0aGlzLmNvbG9yXz12b2lkIDAhPT1lLmNvbG9yP2UuY29sb3I6bnVsbCx0aGlzLmNoZWNrc3VtXz12b2lkIDB9O3ZyLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0Q29sb3IoKTtyZXR1cm4gbmV3IHZyKHtjb2xvcjpBcnJheS5pc0FycmF5KHQpP3Quc2xpY2UoKTp0fHx2b2lkIDB9KX0sdnIucHJvdG90eXBlLmdldENvbG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sb3JffSx2ci5wcm90b3R5cGUuc2V0Q29sb3I9ZnVuY3Rpb24odCl7dGhpcy5jb2xvcl89dCx0aGlzLmNoZWNrc3VtXz12b2lkIDB9LHZyLnByb3RvdHlwZS5nZXRDaGVja3N1bT1mdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMuY2hlY2tzdW1fKXt2YXIgdD10aGlzLmNvbG9yXzt0P0FycmF5LmlzQXJyYXkodCl8fCJzdHJpbmciPT10eXBlb2YgdD90aGlzLmNoZWNrc3VtXz0iZiIrZHIodCk6dGhpcy5jaGVja3N1bV89byh0aGlzLmNvbG9yXyk6dGhpcy5jaGVja3N1bV89ImYtIn1yZXR1cm4gdGhpcy5jaGVja3N1bV99O3ZhciBtcj12cix4cj1mdW5jdGlvbih0KXt2YXIgZT10fHx7fTt0aGlzLmNvbG9yXz12b2lkIDAhPT1lLmNvbG9yP2UuY29sb3I6bnVsbCx0aGlzLmxpbmVDYXBfPWUubGluZUNhcCx0aGlzLmxpbmVEYXNoXz12b2lkIDAhPT1lLmxpbmVEYXNoP2UubGluZURhc2g6bnVsbCx0aGlzLmxpbmVEYXNoT2Zmc2V0Xz1lLmxpbmVEYXNoT2Zmc2V0LHRoaXMubGluZUpvaW5fPWUubGluZUpvaW4sdGhpcy5taXRlckxpbWl0Xz1lLm1pdGVyTGltaXQsdGhpcy53aWR0aF89ZS53aWR0aCx0aGlzLmNoZWNrc3VtXz12b2lkIDB9O3hyLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0Q29sb3IoKTtyZXR1cm4gbmV3IHhyKHtjb2xvcjpBcnJheS5pc0FycmF5KHQpP3Quc2xpY2UoKTp0fHx2b2lkIDAsbGluZUNhcDp0aGlzLmdldExpbmVDYXAoKSxsaW5lRGFzaDp0aGlzLmdldExpbmVEYXNoKCk/dGhpcy5nZXRMaW5lRGFzaCgpLnNsaWNlKCk6dm9pZCAwLGxpbmVEYXNoT2Zmc2V0OnRoaXMuZ2V0TGluZURhc2hPZmZzZXQoKSxsaW5lSm9pbjp0aGlzLmdldExpbmVKb2luKCksbWl0ZXJMaW1pdDp0aGlzLmdldE1pdGVyTGltaXQoKSx3aWR0aDp0aGlzLmdldFdpZHRoKCl9KX0seHIucHJvdG90eXBlLmdldENvbG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sb3JffSx4ci5wcm90b3R5cGUuZ2V0TGluZUNhcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxpbmVDYXBffSx4ci5wcm90b3R5cGUuZ2V0TGluZURhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saW5lRGFzaF99LHhyLnByb3RvdHlwZS5nZXRMaW5lRGFzaE9mZnNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxpbmVEYXNoT2Zmc2V0X30seHIucHJvdG90eXBlLmdldExpbmVKb2luPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGluZUpvaW5ffSx4ci5wcm90b3R5cGUuZ2V0TWl0ZXJMaW1pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1pdGVyTGltaXRffSx4ci5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWR0aF99LHhyLnByb3RvdHlwZS5zZXRDb2xvcj1mdW5jdGlvbih0KXt0aGlzLmNvbG9yXz10LHRoaXMuY2hlY2tzdW1fPXZvaWQgMH0seHIucHJvdG90eXBlLnNldExpbmVDYXA9ZnVuY3Rpb24odCl7dGhpcy5saW5lQ2FwXz10LHRoaXMuY2hlY2tzdW1fPXZvaWQgMH0seHIucHJvdG90eXBlLnNldExpbmVEYXNoPWZ1bmN0aW9uKHQpe3RoaXMubGluZURhc2hfPXQsdGhpcy5jaGVja3N1bV89dm9pZCAwfSx4ci5wcm90b3R5cGUuc2V0TGluZURhc2hPZmZzZXQ9ZnVuY3Rpb24odCl7dGhpcy5saW5lRGFzaE9mZnNldF89dCx0aGlzLmNoZWNrc3VtXz12b2lkIDB9LHhyLnByb3RvdHlwZS5zZXRMaW5lSm9pbj1mdW5jdGlvbih0KXt0aGlzLmxpbmVKb2luXz10LHRoaXMuY2hlY2tzdW1fPXZvaWQgMH0seHIucHJvdG90eXBlLnNldE1pdGVyTGltaXQ9ZnVuY3Rpb24odCl7dGhpcy5taXRlckxpbWl0Xz10LHRoaXMuY2hlY2tzdW1fPXZvaWQgMH0seHIucHJvdG90eXBlLnNldFdpZHRoPWZ1bmN0aW9uKHQpe3RoaXMud2lkdGhfPXQsdGhpcy5jaGVja3N1bV89dm9pZCAwfSx4ci5wcm90b3R5cGUuZ2V0Q2hlY2tzdW09ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5jaGVja3N1bV8mJih0aGlzLmNoZWNrc3VtXz0icyIsdGhpcy5jb2xvcl8/InN0cmluZyI9PXR5cGVvZiB0aGlzLmNvbG9yXz90aGlzLmNoZWNrc3VtXys9dGhpcy5jb2xvcl86dGhpcy5jaGVja3N1bV8rPW8odGhpcy5jb2xvcl8pOnRoaXMuY2hlY2tzdW1fKz0iLSIsdGhpcy5jaGVja3N1bV8rPSIsIisodm9pZCAwIT09dGhpcy5saW5lQ2FwXz90aGlzLmxpbmVDYXBfLnRvU3RyaW5nKCk6Ii0iKSsiLCIrKHRoaXMubGluZURhc2hfP3RoaXMubGluZURhc2hfLnRvU3RyaW5nKCk6Ii0iKSsiLCIrKHZvaWQgMCE9PXRoaXMubGluZURhc2hPZmZzZXRfP3RoaXMubGluZURhc2hPZmZzZXRfOiItIikrIiwiKyh2b2lkIDAhPT10aGlzLmxpbmVKb2luXz90aGlzLmxpbmVKb2luXzoiLSIpKyIsIisodm9pZCAwIT09dGhpcy5taXRlckxpbWl0Xz90aGlzLm1pdGVyTGltaXRfLnRvU3RyaW5nKCk6Ii0iKSsiLCIrKHZvaWQgMCE9PXRoaXMud2lkdGhfP3RoaXMud2lkdGhfLnRvU3RyaW5nKCk6Ii0iKSksdGhpcy5jaGVja3N1bV99O3ZhciBFcj14cixTcj0icG9pbnQiLFRyPSJsaW5lIixDcj1mdW5jdGlvbih0KXt2YXIgZT10fHx7fTt0aGlzLmZvbnRfPWUuZm9udCx0aGlzLnJvdGF0aW9uXz1lLnJvdGF0aW9uLHRoaXMucm90YXRlV2l0aFZpZXdfPWUucm90YXRlV2l0aFZpZXcsdGhpcy5zY2FsZV89ZS5zY2FsZSx0aGlzLnRleHRfPWUudGV4dCx0aGlzLnRleHRBbGlnbl89ZS50ZXh0QWxpZ24sdGhpcy50ZXh0QmFzZWxpbmVfPWUudGV4dEJhc2VsaW5lLHRoaXMuZmlsbF89dm9pZCAwIT09ZS5maWxsP2UuZmlsbDpuZXcgbXIoe2NvbG9yOiIjMzMzIn0pLHRoaXMubWF4QW5nbGVfPXZvaWQgMCE9PWUubWF4QW5nbGU/ZS5tYXhBbmdsZTpNYXRoLlBJLzQsdGhpcy5wbGFjZW1lbnRfPXZvaWQgMCE9PWUucGxhY2VtZW50P2UucGxhY2VtZW50OlNyLHRoaXMub3ZlcmZsb3dfPSEhZS5vdmVyZmxvdyx0aGlzLnN0cm9rZV89dm9pZCAwIT09ZS5zdHJva2U/ZS5zdHJva2U6bnVsbCx0aGlzLm9mZnNldFhfPXZvaWQgMCE9PWUub2Zmc2V0WD9lLm9mZnNldFg6MCx0aGlzLm9mZnNldFlfPXZvaWQgMCE9PWUub2Zmc2V0WT9lLm9mZnNldFk6MCx0aGlzLmJhY2tncm91bmRGaWxsXz1lLmJhY2tncm91bmRGaWxsP2UuYmFja2dyb3VuZEZpbGw6bnVsbCx0aGlzLmJhY2tncm91bmRTdHJva2VfPWUuYmFja2dyb3VuZFN0cm9rZT9lLmJhY2tncm91bmRTdHJva2U6bnVsbCx0aGlzLnBhZGRpbmdfPXZvaWQgMD09PWUucGFkZGluZz9udWxsOmUucGFkZGluZ307Q3IucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBDcih7Zm9udDp0aGlzLmdldEZvbnQoKSxwbGFjZW1lbnQ6dGhpcy5nZXRQbGFjZW1lbnQoKSxtYXhBbmdsZTp0aGlzLmdldE1heEFuZ2xlKCksb3ZlcmZsb3c6dGhpcy5nZXRPdmVyZmxvdygpLHJvdGF0aW9uOnRoaXMuZ2V0Um90YXRpb24oKSxyb3RhdGVXaXRoVmlldzp0aGlzLmdldFJvdGF0ZVdpdGhWaWV3KCksc2NhbGU6dGhpcy5nZXRTY2FsZSgpLHRleHQ6dGhpcy5nZXRUZXh0KCksdGV4dEFsaWduOnRoaXMuZ2V0VGV4dEFsaWduKCksdGV4dEJhc2VsaW5lOnRoaXMuZ2V0VGV4dEJhc2VsaW5lKCksZmlsbDp0aGlzLmdldEZpbGwoKT90aGlzLmdldEZpbGwoKS5jbG9uZSgpOnZvaWQgMCxzdHJva2U6dGhpcy5nZXRTdHJva2UoKT90aGlzLmdldFN0cm9rZSgpLmNsb25lKCk6dm9pZCAwLG9mZnNldFg6dGhpcy5nZXRPZmZzZXRYKCksb2Zmc2V0WTp0aGlzLmdldE9mZnNldFkoKSxiYWNrZ3JvdW5kRmlsbDp0aGlzLmdldEJhY2tncm91bmRGaWxsKCk/dGhpcy5nZXRCYWNrZ3JvdW5kRmlsbCgpLmNsb25lKCk6dm9pZCAwLGJhY2tncm91bmRTdHJva2U6dGhpcy5nZXRCYWNrZ3JvdW5kU3Ryb2tlKCk/dGhpcy5nZXRCYWNrZ3JvdW5kU3Ryb2tlKCkuY2xvbmUoKTp2b2lkIDB9KX0sQ3IucHJvdG90eXBlLmdldE92ZXJmbG93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3ZlcmZsb3dffSxDci5wcm90b3R5cGUuZ2V0Rm9udD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZvbnRffSxDci5wcm90b3R5cGUuZ2V0TWF4QW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXhBbmdsZV99LENyLnByb3RvdHlwZS5nZXRQbGFjZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGFjZW1lbnRffSxDci5wcm90b3R5cGUuZ2V0T2Zmc2V0WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9mZnNldFhffSxDci5wcm90b3R5cGUuZ2V0T2Zmc2V0WT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9mZnNldFlffSxDci5wcm90b3R5cGUuZ2V0RmlsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGxffSxDci5wcm90b3R5cGUuZ2V0Um90YXRlV2l0aFZpZXc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3RhdGVXaXRoVmlld199LENyLnByb3RvdHlwZS5nZXRSb3RhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvdGF0aW9uX30sQ3IucHJvdG90eXBlLmdldFNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2NhbGVffSxDci5wcm90b3R5cGUuZ2V0U3Ryb2tlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3Ryb2tlX30sQ3IucHJvdG90eXBlLmdldFRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0X30sQ3IucHJvdG90eXBlLmdldFRleHRBbGlnbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHRBbGlnbl99LENyLnByb3RvdHlwZS5nZXRUZXh0QmFzZWxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0QmFzZWxpbmVffSxDci5wcm90b3R5cGUuZ2V0QmFja2dyb3VuZEZpbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYWNrZ3JvdW5kRmlsbF99LENyLnByb3RvdHlwZS5nZXRCYWNrZ3JvdW5kU3Ryb2tlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmFja2dyb3VuZFN0cm9rZV99LENyLnByb3RvdHlwZS5nZXRQYWRkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFkZGluZ199LENyLnByb3RvdHlwZS5zZXRPdmVyZmxvdz1mdW5jdGlvbih0KXt0aGlzLm92ZXJmbG93Xz10fSxDci5wcm90b3R5cGUuc2V0Rm9udD1mdW5jdGlvbih0KXt0aGlzLmZvbnRfPXR9LENyLnByb3RvdHlwZS5zZXRNYXhBbmdsZT1mdW5jdGlvbih0KXt0aGlzLm1heEFuZ2xlXz10fSxDci5wcm90b3R5cGUuc2V0T2Zmc2V0WD1mdW5jdGlvbih0KXt0aGlzLm9mZnNldFhfPXR9LENyLnByb3RvdHlwZS5zZXRPZmZzZXRZPWZ1bmN0aW9uKHQpe3RoaXMub2Zmc2V0WV89dH0sQ3IucHJvdG90eXBlLnNldFBsYWNlbWVudD1mdW5jdGlvbih0KXt0aGlzLnBsYWNlbWVudF89dH0sQ3IucHJvdG90eXBlLnNldEZpbGw9ZnVuY3Rpb24odCl7dGhpcy5maWxsXz10fSxDci5wcm90b3R5cGUuc2V0Um90YXRpb249ZnVuY3Rpb24odCl7dGhpcy5yb3RhdGlvbl89dH0sQ3IucHJvdG90eXBlLnNldFNjYWxlPWZ1bmN0aW9uKHQpe3RoaXMuc2NhbGVfPXR9LENyLnByb3RvdHlwZS5zZXRTdHJva2U9ZnVuY3Rpb24odCl7dGhpcy5zdHJva2VfPXR9LENyLnByb3RvdHlwZS5zZXRUZXh0PWZ1bmN0aW9uKHQpe3RoaXMudGV4dF89dH0sQ3IucHJvdG90eXBlLnNldFRleHRBbGlnbj1mdW5jdGlvbih0KXt0aGlzLnRleHRBbGlnbl89dH0sQ3IucHJvdG90eXBlLnNldFRleHRCYXNlbGluZT1mdW5jdGlvbih0KXt0aGlzLnRleHRCYXNlbGluZV89dH0sQ3IucHJvdG90eXBlLnNldEJhY2tncm91bmRGaWxsPWZ1bmN0aW9uKHQpe3RoaXMuYmFja2dyb3VuZEZpbGxfPXR9LENyLnByb3RvdHlwZS5zZXRCYWNrZ3JvdW5kU3Ryb2tlPWZ1bmN0aW9uKHQpe3RoaXMuYmFja2dyb3VuZFN0cm9rZV89dH0sQ3IucHJvdG90eXBlLnNldFBhZGRpbmc9ZnVuY3Rpb24odCl7dGhpcy5wYWRkaW5nXz10fTt2YXIgUnI9Q3Isd3I9bmV3IEVyKHtjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn0pLElyPVs5MCw0NSwzMCwyMCwxMCw1LDIsMSwuNSwuMiwuMSwuMDUsLjAxLC4wMDUsLjAwMiwuMDAxXSxMcj1mdW5jdGlvbih0KXt2YXIgZT10fHx7fTt0aGlzLm1hcF89bnVsbCx0aGlzLnBvc3Rjb21wb3NlTGlzdGVuZXJLZXlfPW51bGwsdGhpcy5wcm9qZWN0aW9uXz1udWxsLHRoaXMubWF4TGF0Xz0xLzAsdGhpcy5tYXhMb25fPTEvMCx0aGlzLm1pbkxhdF89LTEvMCx0aGlzLm1pbkxvbl89LTEvMCx0aGlzLm1heExhdFBfPTEvMCx0aGlzLm1heExvblBfPTEvMCx0aGlzLm1pbkxhdFBfPS0xLzAsdGhpcy5taW5Mb25QXz0tMS8wLHRoaXMudGFyZ2V0U2l6ZV89dm9pZCAwIT09ZS50YXJnZXRTaXplP2UudGFyZ2V0U2l6ZToxMDAsdGhpcy5tYXhMaW5lc189dm9pZCAwIT09ZS5tYXhMaW5lcz9lLm1heExpbmVzOjEwMCx0aGlzLm1lcmlkaWFuc189W10sdGhpcy5wYXJhbGxlbHNfPVtdLHRoaXMuc3Ryb2tlU3R5bGVfPXZvaWQgMCE9PWUuc3Ryb2tlU3R5bGU/ZS5zdHJva2VTdHlsZTp3cix0aGlzLmZyb21Mb25MYXRUcmFuc2Zvcm1fPXZvaWQgMCx0aGlzLnRvTG9uTGF0VHJhbnNmb3JtXz12b2lkIDAsdGhpcy5wcm9qZWN0aW9uQ2VudGVyTG9uTGF0Xz1udWxsLHRoaXMubWVyaWRpYW5zTGFiZWxzXz1udWxsLHRoaXMucGFyYWxsZWxzTGFiZWxzXz1udWxsLDE9PWUuc2hvd0xhYmVscyYmKHRoaXMubG9uTGFiZWxGb3JtYXR0ZXJfPXZvaWQgMD09ZS5sb25MYWJlbEZvcm1hdHRlcj9xaS5iaW5kKHRoaXMsIkVXIik6ZS5sb25MYWJlbEZvcm1hdHRlcix0aGlzLmxhdExhYmVsRm9ybWF0dGVyXz12b2lkIDA9PWUubGF0TGFiZWxGb3JtYXR0ZXI/cWkuYmluZCh0aGlzLCJOUyIpOmUubGF0TGFiZWxGb3JtYXR0ZXIsdGhpcy5sb25MYWJlbFBvc2l0aW9uXz12b2lkIDA9PWUubG9uTGFiZWxQb3NpdGlvbj8wOmUubG9uTGFiZWxQb3NpdGlvbix0aGlzLmxhdExhYmVsUG9zaXRpb25fPXZvaWQgMD09ZS5sYXRMYWJlbFBvc2l0aW9uPzE6ZS5sYXRMYWJlbFBvc2l0aW9uLHRoaXMubG9uTGFiZWxTdHlsZV89dm9pZCAwIT09ZS5sb25MYWJlbFN0eWxlP2UubG9uTGFiZWxTdHlsZTpuZXcgUnIoe2ZvbnQ6IjEycHggQ2FsaWJyaSxzYW5zLXNlcmlmIix0ZXh0QmFzZWxpbmU6ImJvdHRvbSIsZmlsbDpuZXcgbXIoe2NvbG9yOiJyZ2JhKDAsMCwwLDEpIn0pLHN0cm9rZTpuZXcgRXIoe2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDEpIix3aWR0aDozfSl9KSx0aGlzLmxhdExhYmVsU3R5bGVfPXZvaWQgMCE9PWUubGF0TGFiZWxTdHlsZT9lLmxhdExhYmVsU3R5bGU6bmV3IFJyKHtmb250OiIxMnB4IENhbGlicmksc2Fucy1zZXJpZiIsdGV4dEFsaWduOiJlbmQiLGZpbGw6bmV3IG1yKHtjb2xvcjoicmdiYSgwLDAsMCwxKSJ9KSxzdHJva2U6bmV3IEVyKHtjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwxKSIsd2lkdGg6M30pfSksdGhpcy5tZXJpZGlhbnNMYWJlbHNfPVtdLHRoaXMucGFyYWxsZWxzTGFiZWxzXz1bXSksdGhpcy5pbnRlcnZhbHNfPXZvaWQgMCE9PWUuaW50ZXJ2YWxzP2UuaW50ZXJ2YWxzOklyLHRoaXMuc2V0TWFwKHZvaWQgMCE9PWUubWFwP2UubWFwOm51bGwpfTtMci5wcm90b3R5cGUuYWRkTWVyaWRpYW5fPWZ1bmN0aW9uKHQsZSxpLHIsbixvKXt2YXIgcz10aGlzLmdldE1lcmlkaWFuXyh0LGUsaSxyLG8pO2lmKFB0KHMuZ2V0RXh0ZW50KCksbikpe2lmKHRoaXMubWVyaWRpYW5zTGFiZWxzXyl7dmFyIGE9dGhpcy5nZXRNZXJpZGlhblBvaW50XyhzLG4sbyk7dGhpcy5tZXJpZGlhbnNMYWJlbHNfW29dPXtnZW9tOmEsdGV4dDp0aGlzLmxvbkxhYmVsRm9ybWF0dGVyXyh0KX19dGhpcy5tZXJpZGlhbnNfW28rK109c31yZXR1cm4gb30sTHIucHJvdG90eXBlLmdldE1lcmlkaWFuUG9pbnRfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcixuPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCksbz1NYXRoLm1heChlWzFdLG5bMV0pLHM9TWF0aC5taW4oZVszXSxuW24ubGVuZ3RoLTFdKSxhPWt0KGVbMV0rTWF0aC5hYnMoZVsxXS1lWzNdKSp0aGlzLmxvbkxhYmVsUG9zaXRpb25fLG8scyksaD1bblswXSxhXTtyZXR1cm4gaSBpbiB0aGlzLm1lcmlkaWFuc0xhYmVsc18/KHI9dGhpcy5tZXJpZGlhbnNMYWJlbHNfW2ldLmdlb20pLnNldENvb3JkaW5hdGVzKGgpOnI9bmV3IGNpKGgpLHJ9LExyLnByb3RvdHlwZS5hZGRQYXJhbGxlbF89ZnVuY3Rpb24odCxlLGkscixuLG8pe3ZhciBzPXRoaXMuZ2V0UGFyYWxsZWxfKHQsZSxpLHIsbyk7aWYoUHQocy5nZXRFeHRlbnQoKSxuKSl7aWYodGhpcy5wYXJhbGxlbHNMYWJlbHNfKXt2YXIgYT10aGlzLmdldFBhcmFsbGVsUG9pbnRfKHMsbixvKTt0aGlzLnBhcmFsbGVsc0xhYmVsc19bb109e2dlb206YSx0ZXh0OnRoaXMubGF0TGFiZWxGb3JtYXR0ZXJfKHQpfX10aGlzLnBhcmFsbGVsc19bbysrXT1zfXJldHVybiBvfSxMci5wcm90b3R5cGUuZ2V0UGFyYWxsZWxQb2ludF89ZnVuY3Rpb24odCxlLGkpe3ZhciByLG49dC5nZXRGbGF0Q29vcmRpbmF0ZXMoKSxvPU1hdGgubWF4KGVbMF0sblswXSkscz1NYXRoLm1pbihlWzJdLG5bbi5sZW5ndGgtMl0pLGE9W2t0KGVbMF0rTWF0aC5hYnMoZVswXS1lWzJdKSp0aGlzLmxhdExhYmVsUG9zaXRpb25fLG8scyksblsxXV07cmV0dXJuIGkgaW4gdGhpcy5wYXJhbGxlbHNMYWJlbHNfPyhyPXRoaXMucGFyYWxsZWxzTGFiZWxzX1tpXS5nZW9tKS5zZXRDb29yZGluYXRlcyhhKTpyPW5ldyBjaShhKSxyfSxMci5wcm90b3R5cGUuY3JlYXRlR3JhdGljdWxlXz1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbj10aGlzLmdldEludGVydmFsXyhpKTtpZigtMT09bilyZXR1cm4gdGhpcy5tZXJpZGlhbnNfLmxlbmd0aD10aGlzLnBhcmFsbGVsc18ubGVuZ3RoPTAsdGhpcy5tZXJpZGlhbnNMYWJlbHNfJiYodGhpcy5tZXJpZGlhbnNMYWJlbHNfLmxlbmd0aD0wKSx2b2lkKHRoaXMucGFyYWxsZWxzTGFiZWxzXyYmKHRoaXMucGFyYWxsZWxzTGFiZWxzXy5sZW5ndGg9MCkpO3ZhciBvLHMsYSxoLGw9dGhpcy50b0xvbkxhdFRyYW5zZm9ybV8oZSksdT1sWzBdLHA9bFsxXSxjPXRoaXMubWF4TGluZXNfLGQ9W01hdGgubWF4KHRbMF0sdGhpcy5taW5Mb25QXyksTWF0aC5tYXgodFsxXSx0aGlzLm1pbkxhdFBfKSxNYXRoLm1pbih0WzJdLHRoaXMubWF4TG9uUF8pLE1hdGgubWluKHRbM10sdGhpcy5tYXhMYXRQXyldLGY9KGQ9YmUoZCx0aGlzLnByb2plY3Rpb25fLCJFUFNHOjQzMjYiKSlbM10sXz1kWzJdLGc9ZFsxXSx5PWRbMF07Zm9yKGg9a3QodT1NYXRoLmZsb29yKHUvbikqbix0aGlzLm1pbkxvbl8sdGhpcy5tYXhMb25fKSxzPXRoaXMuYWRkTWVyaWRpYW5fKGgsZyxmLHIsdCwwKSxvPTA7aCE9dGhpcy5taW5Mb25fJiZvKys8YzspaD1NYXRoLm1heChoLW4sdGhpcy5taW5Mb25fKSxzPXRoaXMuYWRkTWVyaWRpYW5fKGgsZyxmLHIsdCxzKTtmb3IoaD1rdCh1LHRoaXMubWluTG9uXyx0aGlzLm1heExvbl8pLG89MDtoIT10aGlzLm1heExvbl8mJm8rKzxjOyloPU1hdGgubWluKGgrbix0aGlzLm1heExvbl8pLHM9dGhpcy5hZGRNZXJpZGlhbl8oaCxnLGYscix0LHMpO2Zvcih0aGlzLm1lcmlkaWFuc18ubGVuZ3RoPXMsdGhpcy5tZXJpZGlhbnNMYWJlbHNfJiYodGhpcy5tZXJpZGlhbnNMYWJlbHNfLmxlbmd0aD1zKSxhPWt0KHA9TWF0aC5mbG9vcihwL24pKm4sdGhpcy5taW5MYXRfLHRoaXMubWF4TGF0Xykscz10aGlzLmFkZFBhcmFsbGVsXyhhLHksXyxyLHQsMCksbz0wO2EhPXRoaXMubWluTGF0XyYmbysrPGM7KWE9TWF0aC5tYXgoYS1uLHRoaXMubWluTGF0Xykscz10aGlzLmFkZFBhcmFsbGVsXyhhLHksXyxyLHQscyk7Zm9yKGE9a3QocCx0aGlzLm1pbkxhdF8sdGhpcy5tYXhMYXRfKSxvPTA7YSE9dGhpcy5tYXhMYXRfJiZvKys8YzspYT1NYXRoLm1pbihhK24sdGhpcy5tYXhMYXRfKSxzPXRoaXMuYWRkUGFyYWxsZWxfKGEseSxfLHIsdCxzKTt0aGlzLnBhcmFsbGVsc18ubGVuZ3RoPXMsdGhpcy5wYXJhbGxlbHNMYWJlbHNfJiYodGhpcy5wYXJhbGxlbHNMYWJlbHNfLmxlbmd0aD1zKX0sTHIucHJvdG90eXBlLmdldEludGVydmFsXz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5wcm9qZWN0aW9uQ2VudGVyTG9uTGF0X1swXSxpPXRoaXMucHJvamVjdGlvbkNlbnRlckxvbkxhdF9bMV0scj0tMSxuPU1hdGgucG93KHRoaXMudGFyZ2V0U2l6ZV8qdCwyKSxvPVtdLHM9W10sYT0wLGg9dGhpcy5pbnRlcnZhbHNfLmxlbmd0aDthPGg7KythKXt2YXIgbD10aGlzLmludGVydmFsc19bYV0vMjtpZihvWzBdPWUtbCxvWzFdPWktbCxzWzBdPWUrbCxzWzFdPWkrbCx0aGlzLmZyb21Mb25MYXRUcmFuc2Zvcm1fKG8sbyksdGhpcy5mcm9tTG9uTGF0VHJhbnNmb3JtXyhzLHMpLE1hdGgucG93KHNbMF0tb1swXSwyKStNYXRoLnBvdyhzWzFdLW9bMV0sMik8PW4pYnJlYWs7cj10aGlzLmludGVydmFsc19bYV19cmV0dXJuIHJ9LExyLnByb3RvdHlwZS5nZXRNYXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXBffSxMci5wcm90b3R5cGUuZ2V0TWVyaWRpYW5fPWZ1bmN0aW9uKHQsZSxpLHIsbil7dmFyIG89ZnVuY3Rpb24odCxlLGkscixuKXtyZXR1cm4gbHIoZnVuY3Rpb24ocil7cmV0dXJuW3QsZSsoaS1lKSpyXX0sT2UoRWUoIkVQU0c6NDMyNiIpLHIpLG4pfSh0LGUsaSx0aGlzLnByb2plY3Rpb25fLHIpLHM9dGhpcy5tZXJpZGlhbnNfW25dO3JldHVybiBzPyhzLnNldEZsYXRDb29yZGluYXRlcyhBdC5YWSxvKSxzLmNoYW5nZWQoKSk6cz10aGlzLm1lcmlkaWFuc19bbl09bmV3IGhyKG8sQXQuWFkpLHN9LExyLnByb3RvdHlwZS5nZXRNZXJpZGlhbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZXJpZGlhbnNffSxMci5wcm90b3R5cGUuZ2V0UGFyYWxsZWxfPWZ1bmN0aW9uKHQsZSxpLHIsbil7dmFyIG89ZnVuY3Rpb24odCxlLGkscixuKXtyZXR1cm4gbHIoZnVuY3Rpb24ocil7cmV0dXJuW2UrKGktZSkqcix0XX0sT2UoRWUoIkVQU0c6NDMyNiIpLHIpLG4pfSh0LGUsaSx0aGlzLnByb2plY3Rpb25fLHIpLHM9dGhpcy5wYXJhbGxlbHNfW25dO3JldHVybiBzPyhzLnNldEZsYXRDb29yZGluYXRlcyhBdC5YWSxvKSxzLmNoYW5nZWQoKSk6cz1uZXcgaHIobyxBdC5YWSksc30sTHIucHJvdG90eXBlLmdldFBhcmFsbGVscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmFsbGVsc199LExyLnByb3RvdHlwZS5oYW5kbGVQb3N0Q29tcG9zZV89ZnVuY3Rpb24odCl7dmFyIGUsaSxyLG4sbz10LnZlY3RvckNvbnRleHQscz10LmZyYW1lU3RhdGUsYT1zLmV4dGVudCxoPXMudmlld1N0YXRlLGw9aC5jZW50ZXIsdT1oLnByb2plY3Rpb24scD1oLnJlc29sdXRpb24sYz1zLnBpeGVsUmF0aW8sZD1wKnAvKDQqYypjKTtmb3IoKCF0aGlzLnByb2plY3Rpb25ffHwhSWUodGhpcy5wcm9qZWN0aW9uXyx1KSkmJnRoaXMudXBkYXRlUHJvamVjdGlvbkluZm9fKHUpLHRoaXMuY3JlYXRlR3JhdGljdWxlXyhhLGwscCxkKSxvLnNldEZpbGxTdHJva2VTdHlsZShudWxsLHRoaXMuc3Ryb2tlU3R5bGVfKSxlPTAsaT10aGlzLm1lcmlkaWFuc18ubGVuZ3RoO2U8aTsrK2Upcj10aGlzLm1lcmlkaWFuc19bZV0sby5kcmF3R2VvbWV0cnkocik7Zm9yKGU9MCxpPXRoaXMucGFyYWxsZWxzXy5sZW5ndGg7ZTxpOysrZSlyPXRoaXMucGFyYWxsZWxzX1tlXSxvLmRyYXdHZW9tZXRyeShyKTtpZih0aGlzLm1lcmlkaWFuc0xhYmVsc18pZm9yKGU9MCxpPXRoaXMubWVyaWRpYW5zTGFiZWxzXy5sZW5ndGg7ZTxpOysrZSluPXRoaXMubWVyaWRpYW5zTGFiZWxzX1tlXSx0aGlzLmxvbkxhYmVsU3R5bGVfLnNldFRleHQobi50ZXh0KSxvLnNldFRleHRTdHlsZSh0aGlzLmxvbkxhYmVsU3R5bGVfKSxvLmRyYXdHZW9tZXRyeShuLmdlb20pO2lmKHRoaXMucGFyYWxsZWxzTGFiZWxzXylmb3IoZT0wLGk9dGhpcy5wYXJhbGxlbHNMYWJlbHNfLmxlbmd0aDtlPGk7KytlKW49dGhpcy5wYXJhbGxlbHNMYWJlbHNfW2VdLHRoaXMubGF0TGFiZWxTdHlsZV8uc2V0VGV4dChuLnRleHQpLG8uc2V0VGV4dFN0eWxlKHRoaXMubGF0TGFiZWxTdHlsZV8pLG8uZHJhd0dlb21ldHJ5KG4uZ2VvbSl9LExyLnByb3RvdHlwZS51cGRhdGVQcm9qZWN0aW9uSW5mb189ZnVuY3Rpb24odCl7dmFyIGU9RWUoIkVQU0c6NDMyNiIpLGk9dC5nZXRXb3JsZEV4dGVudCgpLHI9YmUoaSxlLHQpO3RoaXMubWF4TGF0Xz1pWzNdLHRoaXMubWF4TG9uXz1pWzJdLHRoaXMubWluTGF0Xz1pWzFdLHRoaXMubWluTG9uXz1pWzBdLHRoaXMubWF4TGF0UF89clszXSx0aGlzLm1heExvblBfPXJbMl0sdGhpcy5taW5MYXRQXz1yWzFdLHRoaXMubWluTG9uUF89clswXSx0aGlzLmZyb21Mb25MYXRUcmFuc2Zvcm1fPU9lKGUsdCksdGhpcy50b0xvbkxhdFRyYW5zZm9ybV89T2UodCxlKSx0aGlzLnByb2plY3Rpb25DZW50ZXJMb25MYXRfPXRoaXMudG9Mb25MYXRUcmFuc2Zvcm1fKFR0KHQuZ2V0RXh0ZW50KCkpKSx0aGlzLnByb2plY3Rpb25fPXR9LExyLnByb3RvdHlwZS5zZXRNYXA9ZnVuY3Rpb24odCl7dGhpcy5tYXBfJiYoRSh0aGlzLnBvc3Rjb21wb3NlTGlzdGVuZXJLZXlfKSx0aGlzLnBvc3Rjb21wb3NlTGlzdGVuZXJLZXlfPW51bGwsdGhpcy5tYXBfLnJlbmRlcigpKSx0JiYodGhpcy5wb3N0Y29tcG9zZUxpc3RlbmVyS2V5Xz12KHQsdXIuUE9TVENPTVBPU0UsdGhpcy5oYW5kbGVQb3N0Q29tcG9zZV8sdGhpcyksdC5yZW5kZXIoKSksdGhpcy5tYXBfPXR9O3ZhciBPcj1McixQcj1mdW5jdGlvbih0LGUsaSl7dGhpcy5kZWNheV89dCx0aGlzLm1pblZlbG9jaXR5Xz1lLHRoaXMuZGVsYXlfPWksdGhpcy5wb2ludHNfPVtdLHRoaXMuYW5nbGVfPTAsdGhpcy5pbml0aWFsVmVsb2NpdHlfPTB9O1ByLnByb3RvdHlwZS5iZWdpbj1mdW5jdGlvbigpe3RoaXMucG9pbnRzXy5sZW5ndGg9MCx0aGlzLmFuZ2xlXz0wLHRoaXMuaW5pdGlhbFZlbG9jaXR5Xz0wfSxQci5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSl7dGhpcy5wb2ludHNfLnB1c2godCxlLERhdGUubm93KCkpfSxQci5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKCl7aWYodGhpcy5wb2ludHNfLmxlbmd0aDw2KXJldHVybiExO3ZhciB0PURhdGUubm93KCktdGhpcy5kZWxheV8sZT10aGlzLnBvaW50c18ubGVuZ3RoLTM7aWYodGhpcy5wb2ludHNfW2UrMl08dClyZXR1cm4hMTtmb3IodmFyIGk9ZS0zO2k+MCYmdGhpcy5wb2ludHNfW2krMl0+dDspaS09Mzt2YXIgcj10aGlzLnBvaW50c19bZSsyXS10aGlzLnBvaW50c19baSsyXTtpZihyPDFlMy82MClyZXR1cm4hMTt2YXIgbj10aGlzLnBvaW50c19bZV0tdGhpcy5wb2ludHNfW2ldLG89dGhpcy5wb2ludHNfW2UrMV0tdGhpcy5wb2ludHNfW2krMV07cmV0dXJuIHRoaXMuYW5nbGVfPU1hdGguYXRhbjIobyxuKSx0aGlzLmluaXRpYWxWZWxvY2l0eV89TWF0aC5zcXJ0KG4qbitvKm8pL3IsdGhpcy5pbml0aWFsVmVsb2NpdHlfPnRoaXMubWluVmVsb2NpdHlffSxQci5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5taW5WZWxvY2l0eV8tdGhpcy5pbml0aWFsVmVsb2NpdHlfKS90aGlzLmRlY2F5X30sUHIucHJvdG90eXBlLmdldEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYW5nbGVffTt2YXIgYnI9UHIsTXI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkscil7dC5jYWxsKHRoaXMsZSksdGhpcy5tYXA9aSx0aGlzLmZyYW1lU3RhdGU9dm9pZCAwIT09cj9yOm51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KFApLEZyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIsbixvKXt0LmNhbGwodGhpcyxlLGksbyksdGhpcy5vcmlnaW5hbEV2ZW50PXIsdGhpcy5waXhlbD1pLmdldEV2ZW50UGl4ZWwociksdGhpcy5jb29yZGluYXRlPWkuZ2V0Q29vcmRpbmF0ZUZyb21QaXhlbCh0aGlzLnBpeGVsKSx0aGlzLmRyYWdnaW5nPXZvaWQgMCE9PW4mJm59cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucHJldmVudERlZmF1bHQuY2FsbCh0aGlzKSx0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKX0sZS5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uLmNhbGwodGhpcyksdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfSxlfShNciksQXI9e1NJTkdMRUNMSUNLOiJzaW5nbGVjbGljayIsQ0xJQ0s6TS5DTElDSyxEQkxDTElDSzpNLkRCTENMSUNLLFBPSU5URVJEUkFHOiJwb2ludGVyZHJhZyIsUE9JTlRFUk1PVkU6InBvaW50ZXJtb3ZlIixQT0lOVEVSRE9XTjoicG9pbnRlcmRvd24iLFBPSU5URVJVUDoicG9pbnRlcnVwIixQT0lOVEVST1ZFUjoicG9pbnRlcm92ZXIiLFBPSU5URVJPVVQ6InBvaW50ZXJvdXQiLFBPSU5URVJFTlRFUjoicG9pbnRlcmVudGVyIixQT0lOVEVSTEVBVkU6InBvaW50ZXJsZWF2ZSIsUE9JTlRFUkNBTkNFTDoicG9pbnRlcmNhbmNlbCJ9LE5yPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIsbixvKXt0LmNhbGwodGhpcyxlLGksci5vcmlnaW5hbEV2ZW50LG4sbyksdGhpcy5wb2ludGVyRXZlbnQ9cn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oRnIpLEdyPXtQT0lOVEVSTU9WRToicG9pbnRlcm1vdmUiLFBPSU5URVJET1dOOiJwb2ludGVyZG93biIsUE9JTlRFUlVQOiJwb2ludGVydXAiLFBPSU5URVJPVkVSOiJwb2ludGVyb3ZlciIsUE9JTlRFUk9VVDoicG9pbnRlcm91dCIsUE9JTlRFUkVOVEVSOiJwb2ludGVyZW50ZXIiLFBPSU5URVJMRUFWRToicG9pbnRlcmxlYXZlIixQT0lOVEVSQ0FOQ0VMOiJwb2ludGVyY2FuY2VsIn0sRHI9ZnVuY3Rpb24odCxlKXt0aGlzLmRpc3BhdGNoZXI9dCx0aGlzLm1hcHBpbmdfPWV9O0RyLnByb3RvdHlwZS5nZXRFdmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5tYXBwaW5nXyl9LERyLnByb3RvdHlwZS5nZXRIYW5kbGVyRm9yRXZlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwcGluZ19bdF19O3ZhciBrcj1Ecixqcj0xLFVyPSJtb3VzZSI7ZnVuY3Rpb24gWXIodCl7aWYoIXRoaXMuaXNFdmVudFNpbXVsYXRlZEZyb21Ub3VjaF8odCkpe2pyLnRvU3RyaW5nKClpbiB0aGlzLnBvaW50ZXJNYXAmJnRoaXMuY2FuY2VsKHQpO3ZhciBlPVdyKHQsdGhpcy5kaXNwYXRjaGVyKTt0aGlzLnBvaW50ZXJNYXBbanIudG9TdHJpbmcoKV09dCx0aGlzLmRpc3BhdGNoZXIuZG93bihlLHQpfX1mdW5jdGlvbiBCcih0KXtpZighdGhpcy5pc0V2ZW50U2ltdWxhdGVkRnJvbVRvdWNoXyh0KSl7dmFyIGU9V3IodCx0aGlzLmRpc3BhdGNoZXIpO3RoaXMuZGlzcGF0Y2hlci5tb3ZlKGUsdCl9fWZ1bmN0aW9uIFZyKHQpe2lmKCF0aGlzLmlzRXZlbnRTaW11bGF0ZWRGcm9tVG91Y2hfKHQpKXt2YXIgZT10aGlzLnBvaW50ZXJNYXBbanIudG9TdHJpbmcoKV07aWYoZSYmZS5idXR0b249PT10LmJ1dHRvbil7dmFyIGk9V3IodCx0aGlzLmRpc3BhdGNoZXIpO3RoaXMuZGlzcGF0Y2hlci51cChpLHQpLHRoaXMuY2xlYW51cE1vdXNlKCl9fX1mdW5jdGlvbiBYcih0KXtpZighdGhpcy5pc0V2ZW50U2ltdWxhdGVkRnJvbVRvdWNoXyh0KSl7dmFyIGU9V3IodCx0aGlzLmRpc3BhdGNoZXIpO3RoaXMuZGlzcGF0Y2hlci5lbnRlck92ZXIoZSx0KX19ZnVuY3Rpb24genIodCl7aWYoIXRoaXMuaXNFdmVudFNpbXVsYXRlZEZyb21Ub3VjaF8odCkpe3ZhciBlPVdyKHQsdGhpcy5kaXNwYXRjaGVyKTt0aGlzLmRpc3BhdGNoZXIubGVhdmVPdXQoZSx0KX19ZnVuY3Rpb24gV3IodCxlKXt2YXIgaT1lLmNsb25lRXZlbnQodCx0KSxyPWkucHJldmVudERlZmF1bHQ7cmV0dXJuIGkucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0LnByZXZlbnREZWZhdWx0KCkscigpfSxpLnBvaW50ZXJJZD1qcixpLmlzUHJpbWFyeT0hMCxpLnBvaW50ZXJUeXBlPVVyLGl9dmFyIEtyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9e21vdXNlZG93bjpZcixtb3VzZW1vdmU6QnIsbW91c2V1cDpWcixtb3VzZW92ZXI6WHIsbW91c2VvdXQ6enJ9O3QuY2FsbCh0aGlzLGUsaSksdGhpcy5wb2ludGVyTWFwPWUucG9pbnRlck1hcCx0aGlzLmxhc3RUb3VjaGVzPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pc0V2ZW50U2ltdWxhdGVkRnJvbVRvdWNoXz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5sYXN0VG91Y2hlcyxpPXQuY2xpZW50WCxyPXQuY2xpZW50WSxuPTAsbz1lLmxlbmd0aCxzPXZvaWQgMDtuPG8mJihzPWVbbl0pO24rKyl7dmFyIGE9TWF0aC5hYnMoaS1zWzBdKSxoPU1hdGguYWJzKHItc1sxXSk7aWYoYTw9MjUmJmg8PTI1KXJldHVybiEwfXJldHVybiExfSxlLnByb3RvdHlwZS5jYW5jZWw9ZnVuY3Rpb24odCl7dmFyIGU9V3IodCx0aGlzLmRpc3BhdGNoZXIpO3RoaXMuZGlzcGF0Y2hlci5jYW5jZWwoZSx0KSx0aGlzLmNsZWFudXBNb3VzZSgpfSxlLnByb3RvdHlwZS5jbGVhbnVwTW91c2U9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wb2ludGVyTWFwW2pyLnRvU3RyaW5nKCldfSxlfShrciksSHI9WyIiLCJ1bmF2YWlsYWJsZSIsInRvdWNoIiwicGVuIiwibW91c2UiXTtmdW5jdGlvbiBacih0KXt0aGlzLnBvaW50ZXJNYXBbdC5wb2ludGVySWQudG9TdHJpbmcoKV09dDt2YXIgZT10aGlzLnByZXBhcmVFdmVudF8odCk7dGhpcy5kaXNwYXRjaGVyLmRvd24oZSx0KX1mdW5jdGlvbiBxcih0KXt2YXIgZT10aGlzLnByZXBhcmVFdmVudF8odCk7dGhpcy5kaXNwYXRjaGVyLm1vdmUoZSx0KX1mdW5jdGlvbiBKcih0KXt2YXIgZT10aGlzLnByZXBhcmVFdmVudF8odCk7dGhpcy5kaXNwYXRjaGVyLnVwKGUsdCksdGhpcy5jbGVhbnVwKHQucG9pbnRlcklkKX1mdW5jdGlvbiBRcih0KXt2YXIgZT10aGlzLnByZXBhcmVFdmVudF8odCk7dGhpcy5kaXNwYXRjaGVyLmxlYXZlT3V0KGUsdCl9ZnVuY3Rpb24gJHIodCl7dmFyIGU9dGhpcy5wcmVwYXJlRXZlbnRfKHQpO3RoaXMuZGlzcGF0Y2hlci5lbnRlck92ZXIoZSx0KX1mdW5jdGlvbiB0bih0KXt2YXIgZT10aGlzLnByZXBhcmVFdmVudF8odCk7dGhpcy5kaXNwYXRjaGVyLmNhbmNlbChlLHQpLHRoaXMuY2xlYW51cCh0LnBvaW50ZXJJZCl9ZnVuY3Rpb24gZW4odCl7dmFyIGU9dGhpcy5kaXNwYXRjaGVyLm1ha2VFdmVudCgibG9zdHBvaW50ZXJjYXB0dXJlIix0LHQpO3RoaXMuZGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGUpfWZ1bmN0aW9uIHJuKHQpe3ZhciBlPXRoaXMuZGlzcGF0Y2hlci5tYWtlRXZlbnQoImdvdHBvaW50ZXJjYXB0dXJlIix0LHQpO3RoaXMuZGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGUpfXZhciBubj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPXtNU1BvaW50ZXJEb3duOlpyLE1TUG9pbnRlck1vdmU6cXIsTVNQb2ludGVyVXA6SnIsTVNQb2ludGVyT3V0OlFyLE1TUG9pbnRlck92ZXI6JHIsTVNQb2ludGVyQ2FuY2VsOnRuLE1TR290UG9pbnRlckNhcHR1cmU6cm4sTVNMb3N0UG9pbnRlckNhcHR1cmU6ZW59O3QuY2FsbCh0aGlzLGUsaSksdGhpcy5wb2ludGVyTWFwPWUucG9pbnRlck1hcH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUucHJlcGFyZUV2ZW50Xz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiJudW1iZXIiPT10eXBlb2YgdC5wb2ludGVyVHlwZSYmKChlPXRoaXMuZGlzcGF0Y2hlci5jbG9uZUV2ZW50KHQsdCkpLnBvaW50ZXJUeXBlPUhyW3QucG9pbnRlclR5cGVdKSxlfSxlLnByb3RvdHlwZS5jbGVhbnVwPWZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLnBvaW50ZXJNYXBbdC50b1N0cmluZygpXX0sZX0oa3IpO2Z1bmN0aW9uIG9uKHQpe3RoaXMuZGlzcGF0Y2hlci5maXJlTmF0aXZlRXZlbnQodCl9ZnVuY3Rpb24gc24odCl7dGhpcy5kaXNwYXRjaGVyLmZpcmVOYXRpdmVFdmVudCh0KX1mdW5jdGlvbiBhbih0KXt0aGlzLmRpc3BhdGNoZXIuZmlyZU5hdGl2ZUV2ZW50KHQpfWZ1bmN0aW9uIGhuKHQpe3RoaXMuZGlzcGF0Y2hlci5maXJlTmF0aXZlRXZlbnQodCl9ZnVuY3Rpb24gbG4odCl7dGhpcy5kaXNwYXRjaGVyLmZpcmVOYXRpdmVFdmVudCh0KX1mdW5jdGlvbiB1bih0KXt0aGlzLmRpc3BhdGNoZXIuZmlyZU5hdGl2ZUV2ZW50KHQpfWZ1bmN0aW9uIHBuKHQpe3RoaXMuZGlzcGF0Y2hlci5maXJlTmF0aXZlRXZlbnQodCl9ZnVuY3Rpb24gY24odCl7dGhpcy5kaXNwYXRjaGVyLmZpcmVOYXRpdmVFdmVudCh0KX12YXIgZG49ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT17cG9pbnRlcmRvd246b24scG9pbnRlcm1vdmU6c24scG9pbnRlcnVwOmFuLHBvaW50ZXJvdXQ6aG4scG9pbnRlcm92ZXI6bG4scG9pbnRlcmNhbmNlbDp1bixnb3Rwb2ludGVyY2FwdHVyZTpjbixsb3N0cG9pbnRlcmNhcHR1cmU6cG59O3QuY2FsbCh0aGlzLGUsaSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KGtyKSxmbj0hMSxfbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXt0LmNhbGwodGhpcyxlKSx0aGlzLm9yaWdpbmFsRXZlbnQ9aTt2YXIgbj1yfHx7fTt0aGlzLmJ1dHRvbnM9ZnVuY3Rpb24odCl7dmFyIGU7aWYodC5idXR0b25zfHxmbillPXQuYnV0dG9ucztlbHNlIHN3aXRjaCh0LndoaWNoKXtjYXNlIDE6ZT0xO2JyZWFrO2Nhc2UgMjplPTQ7YnJlYWs7Y2FzZSAzOmU9MjticmVhaztkZWZhdWx0OmU9MH1yZXR1cm4gZX0obiksdGhpcy5wcmVzc3VyZT1mdW5jdGlvbih0LGUpe3ZhciBpPTA7aT10LnByZXNzdXJlP3QucHJlc3N1cmU6ZT8uNTowO3JldHVybiBpfShuLHRoaXMuYnV0dG9ucyksdGhpcy5idWJibGVzPSJidWJibGVzImluIG4mJm4uYnViYmxlcyx0aGlzLmNhbmNlbGFibGU9ImNhbmNlbGFibGUiaW4gbiYmbi5jYW5jZWxhYmxlLHRoaXMudmlldz0idmlldyJpbiBuP24udmlldzpudWxsLHRoaXMuZGV0YWlsPSJkZXRhaWwiaW4gbj9uLmRldGFpbDpudWxsLHRoaXMuc2NyZWVuWD0ic2NyZWVuWCJpbiBuP24uc2NyZWVuWDowLHRoaXMuc2NyZWVuWT0ic2NyZWVuWSJpbiBuP24uc2NyZWVuWTowLHRoaXMuY2xpZW50WD0iY2xpZW50WCJpbiBuP24uY2xpZW50WDowLHRoaXMuY2xpZW50WT0iY2xpZW50WSJpbiBuP24uY2xpZW50WTowLHRoaXMuY3RybEtleT0iY3RybEtleSJpbiBuJiZuLmN0cmxLZXksdGhpcy5hbHRLZXk9ImFsdEtleSJpbiBuJiZuLmFsdEtleSx0aGlzLnNoaWZ0S2V5PSJzaGlmdEtleSJpbiBuJiZuLnNoaWZ0S2V5LHRoaXMubWV0YUtleT0ibWV0YUtleSJpbiBuJiZuLm1ldGFLZXksdGhpcy5idXR0b249ImJ1dHRvbiJpbiBuP24uYnV0dG9uOjAsdGhpcy5yZWxhdGVkVGFyZ2V0PSJyZWxhdGVkVGFyZ2V0ImluIG4/bi5yZWxhdGVkVGFyZ2V0Om51bGwsdGhpcy5wb2ludGVySWQ9InBvaW50ZXJJZCJpbiBuP24ucG9pbnRlcklkOjAsdGhpcy53aWR0aD0id2lkdGgiaW4gbj9uLndpZHRoOjAsdGhpcy5oZWlnaHQ9ImhlaWdodCJpbiBuP24uaGVpZ2h0OjAsdGhpcy50aWx0WD0idGlsdFgiaW4gbj9uLnRpbHRYOjAsdGhpcy50aWx0WT0idGlsdFkiaW4gbj9uLnRpbHRZOjAsdGhpcy5wb2ludGVyVHlwZT0icG9pbnRlclR5cGUiaW4gbj9uLnBvaW50ZXJUeXBlOiIiLHRoaXMuaHdUaW1lc3RhbXA9Imh3VGltZXN0YW1wImluIG4/bi5od1RpbWVzdGFtcDowLHRoaXMuaXNQcmltYXJ5PSJpc1ByaW1hcnkiaW4gbiYmbi5pc1ByaW1hcnksaS5wcmV2ZW50RGVmYXVsdCYmKHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXtpLnByZXZlbnREZWZhdWx0KCl9KX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oUCk7IWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBNb3VzZUV2ZW50KCJjbGljayIse2J1dHRvbnM6MX0pO2ZuPTE9PT10LmJ1dHRvbnN9Y2F0Y2godCl7fX0oKTt2YXIgZ249X247ZnVuY3Rpb24geW4odCl7dGhpcy52YWN1dW1Ub3VjaGVzXyh0KSx0aGlzLnNldFByaW1hcnlUb3VjaF8odC5jaGFuZ2VkVG91Y2hlc1swXSksdGhpcy5kZWR1cFN5bnRoTW91c2VfKHQpLHRoaXMuY2xpY2tDb3VudF8rKyx0aGlzLnByb2Nlc3NUb3VjaGVzXyh0LHRoaXMub3ZlckRvd25fKX1mdW5jdGlvbiB2bih0KXt0aGlzLnByb2Nlc3NUb3VjaGVzXyh0LHRoaXMubW92ZU92ZXJPdXRfKX1mdW5jdGlvbiBtbih0KXt0aGlzLmRlZHVwU3ludGhNb3VzZV8odCksdGhpcy5wcm9jZXNzVG91Y2hlc18odCx0aGlzLnVwT3V0Xyl9ZnVuY3Rpb24geG4odCl7dGhpcy5wcm9jZXNzVG91Y2hlc18odCx0aGlzLmNhbmNlbE91dF8pfXZhciBFbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dmFyIHI9e3RvdWNoc3RhcnQ6eW4sdG91Y2htb3ZlOnZuLHRvdWNoZW5kOm1uLHRvdWNoY2FuY2VsOnhufTt0LmNhbGwodGhpcyxlLHIpLHRoaXMucG9pbnRlck1hcD1lLnBvaW50ZXJNYXAsdGhpcy5tb3VzZVNvdXJjZT1pLHRoaXMuZmlyc3RUb3VjaElkXz12b2lkIDAsdGhpcy5jbGlja0NvdW50Xz0wLHRoaXMucmVzZXRJZF8sdGhpcy5kZWR1cFRpbWVvdXRfPTI1MDB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzUHJpbWFyeVRvdWNoXz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maXJzdFRvdWNoSWRfPT09dC5pZGVudGlmaWVyfSxlLnByb3RvdHlwZS5zZXRQcmltYXJ5VG91Y2hfPWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdC5rZXlzKHRoaXMucG9pbnRlck1hcCkubGVuZ3RoOygwPT09ZXx8MT09PWUmJmpyLnRvU3RyaW5nKClpbiB0aGlzLnBvaW50ZXJNYXApJiYodGhpcy5maXJzdFRvdWNoSWRfPXQuaWRlbnRpZmllcix0aGlzLmNhbmNlbFJlc2V0Q2xpY2tDb3VudF8oKSl9LGUucHJvdG90eXBlLnJlbW92ZVByaW1hcnlQb2ludGVyXz1mdW5jdGlvbih0KXt0LmlzUHJpbWFyeSYmKHRoaXMuZmlyc3RUb3VjaElkXz12b2lkIDAsdGhpcy5yZXNldENsaWNrQ291bnRfKCkpfSxlLnByb3RvdHlwZS5yZXNldENsaWNrQ291bnRfPWZ1bmN0aW9uKCl7dGhpcy5yZXNldElkXz1zZXRUaW1lb3V0KHRoaXMucmVzZXRDbGlja0NvdW50SGFuZGxlcl8uYmluZCh0aGlzKSwyMDApfSxlLnByb3RvdHlwZS5yZXNldENsaWNrQ291bnRIYW5kbGVyXz1mdW5jdGlvbigpe3RoaXMuY2xpY2tDb3VudF89MCx0aGlzLnJlc2V0SWRfPXZvaWQgMH0sZS5wcm90b3R5cGUuY2FuY2VsUmVzZXRDbGlja0NvdW50Xz1mdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMucmVzZXRJZF8mJmNsZWFyVGltZW91dCh0aGlzLnJlc2V0SWRfKX0sZS5wcm90b3R5cGUudG91Y2hUb1BvaW50ZXJfPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5kaXNwYXRjaGVyLmNsb25lRXZlbnQodCxlKTtyZXR1cm4gaS5wb2ludGVySWQ9ZS5pZGVudGlmaWVyKzIsaS5idWJibGVzPSEwLGkuY2FuY2VsYWJsZT0hMCxpLmRldGFpbD10aGlzLmNsaWNrQ291bnRfLGkuYnV0dG9uPTAsaS5idXR0b25zPTEsaS53aWR0aD1lLnJhZGl1c1h8fDAsaS5oZWlnaHQ9ZS5yYWRpdXNZfHwwLGkucHJlc3N1cmU9ZS5mb3JjZXx8LjUsaS5pc1ByaW1hcnk9dGhpcy5pc1ByaW1hcnlUb3VjaF8oZSksaS5wb2ludGVyVHlwZT0idG91Y2giLGkuY2xpZW50WD1lLmNsaWVudFgsaS5jbGllbnRZPWUuY2xpZW50WSxpLnNjcmVlblg9ZS5zY3JlZW5YLGkuc2NyZWVuWT1lLnNjcmVlblksaX0sZS5wcm90b3R5cGUucHJvY2Vzc1RvdWNoZXNfPWZ1bmN0aW9uKHQsZSl7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodC5jaGFuZ2VkVG91Y2hlcykscj1pLmxlbmd0aDtmdW5jdGlvbiBuKCl7dC5wcmV2ZW50RGVmYXVsdCgpfWZvcih2YXIgbz0wO288cjsrK28pe3ZhciBzPXRoaXMudG91Y2hUb1BvaW50ZXJfKHQsaVtvXSk7cy5wcmV2ZW50RGVmYXVsdD1uLGUuY2FsbCh0aGlzLHQscyl9fSxlLnByb3RvdHlwZS5maW5kVG91Y2hfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXQubGVuZ3RoLHI9MDtyPGk7cisrKXtpZih0W3JdLmlkZW50aWZpZXI9PT1lKXJldHVybiEwfXJldHVybiExfSxlLnByb3RvdHlwZS52YWN1dW1Ub3VjaGVzXz1mdW5jdGlvbih0KXt2YXIgZT10LnRvdWNoZXMsaT1PYmplY3Qua2V5cyh0aGlzLnBvaW50ZXJNYXApLHI9aS5sZW5ndGg7aWYocj49ZS5sZW5ndGgpe2Zvcih2YXIgbj1bXSxvPTA7bzxyOysrbyl7dmFyIHM9TnVtYmVyKGlbb10pLGE9dGhpcy5wb2ludGVyTWFwW3NdO3M9PWpyfHx0aGlzLmZpbmRUb3VjaF8oZSxzLTIpfHxuLnB1c2goYS5vdXQpfWZvcih2YXIgaD0wO2g8bi5sZW5ndGg7KytoKXRoaXMuY2FuY2VsT3V0Xyh0LG5baF0pfX0sZS5wcm90b3R5cGUub3ZlckRvd25fPWZ1bmN0aW9uKHQsZSl7dGhpcy5wb2ludGVyTWFwW2UucG9pbnRlcklkXT17dGFyZ2V0OmUudGFyZ2V0LG91dDplLG91dFRhcmdldDplLnRhcmdldH0sdGhpcy5kaXNwYXRjaGVyLm92ZXIoZSx0KSx0aGlzLmRpc3BhdGNoZXIuZW50ZXIoZSx0KSx0aGlzLmRpc3BhdGNoZXIuZG93bihlLHQpfSxlLnByb3RvdHlwZS5tb3ZlT3Zlck91dF89ZnVuY3Rpb24odCxlKXt2YXIgaT1lLHI9dGhpcy5wb2ludGVyTWFwW2kucG9pbnRlcklkXTtpZihyKXt2YXIgbj1yLm91dCxvPXIub3V0VGFyZ2V0O3RoaXMuZGlzcGF0Y2hlci5tb3ZlKGksdCksbiYmbyE9PWkudGFyZ2V0JiYobi5yZWxhdGVkVGFyZ2V0PWkudGFyZ2V0LGkucmVsYXRlZFRhcmdldD1vLG4udGFyZ2V0PW8saS50YXJnZXQ/KHRoaXMuZGlzcGF0Y2hlci5sZWF2ZU91dChuLHQpLHRoaXMuZGlzcGF0Y2hlci5lbnRlck92ZXIoaSx0KSk6KGkudGFyZ2V0PW8saS5yZWxhdGVkVGFyZ2V0PW51bGwsdGhpcy5jYW5jZWxPdXRfKHQsaSkpKSxyLm91dD1pLHIub3V0VGFyZ2V0PWkudGFyZ2V0fX0sZS5wcm90b3R5cGUudXBPdXRfPWZ1bmN0aW9uKHQsZSl7dGhpcy5kaXNwYXRjaGVyLnVwKGUsdCksdGhpcy5kaXNwYXRjaGVyLm91dChlLHQpLHRoaXMuZGlzcGF0Y2hlci5sZWF2ZShlLHQpLHRoaXMuY2xlYW5VcFBvaW50ZXJfKGUpfSxlLnByb3RvdHlwZS5jYW5jZWxPdXRfPWZ1bmN0aW9uKHQsZSl7dGhpcy5kaXNwYXRjaGVyLmNhbmNlbChlLHQpLHRoaXMuZGlzcGF0Y2hlci5vdXQoZSx0KSx0aGlzLmRpc3BhdGNoZXIubGVhdmUoZSx0KSx0aGlzLmNsZWFuVXBQb2ludGVyXyhlKX0sZS5wcm90b3R5cGUuY2xlYW5VcFBvaW50ZXJfPWZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLnBvaW50ZXJNYXBbdC5wb2ludGVySWRdLHRoaXMucmVtb3ZlUHJpbWFyeVBvaW50ZXJfKHQpfSxlLnByb3RvdHlwZS5kZWR1cFN5bnRoTW91c2VfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubW91c2VTb3VyY2UubGFzdFRvdWNoZXMsaT10LmNoYW5nZWRUb3VjaGVzWzBdO2lmKHRoaXMuaXNQcmltYXJ5VG91Y2hfKGkpKXt2YXIgcj1baS5jbGllbnRYLGkuY2xpZW50WV07ZS5wdXNoKHIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXshZnVuY3Rpb24odCxlKXt2YXIgaT10LmluZGV4T2YoZSkscj1pPi0xO3ImJnQuc3BsaWNlKGksMSl9KGUscil9LHRoaXMuZGVkdXBUaW1lb3V0Xyl9fSxlfShrciksU249W1siYnViYmxlcyIsITFdLFsiY2FuY2VsYWJsZSIsITFdLFsidmlldyIsbnVsbF0sWyJkZXRhaWwiLG51bGxdLFsic2NyZWVuWCIsMF0sWyJzY3JlZW5ZIiwwXSxbImNsaWVudFgiLDBdLFsiY2xpZW50WSIsMF0sWyJjdHJsS2V5IiwhMV0sWyJhbHRLZXkiLCExXSxbInNoaWZ0S2V5IiwhMV0sWyJtZXRhS2V5IiwhMV0sWyJidXR0b24iLDBdLFsicmVsYXRlZFRhcmdldCIsbnVsbF0sWyJidXR0b25zIiwwXSxbInBvaW50ZXJJZCIsMF0sWyJ3aWR0aCIsMF0sWyJoZWlnaHQiLDBdLFsicHJlc3N1cmUiLDBdLFsidGlsdFgiLDBdLFsidGlsdFkiLDBdLFsicG9pbnRlclR5cGUiLCIiXSxbImh3VGltZXN0YW1wIiwwXSxbImlzUHJpbWFyeSIsITFdLFsidHlwZSIsIiJdLFsidGFyZ2V0IixudWxsXSxbImN1cnJlbnRUYXJnZXQiLG51bGxdLFsid2hpY2giLDBdXSxUbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLmVsZW1lbnRfPWUsdGhpcy5wb2ludGVyTWFwPXt9LHRoaXMuZXZlbnRNYXBfPXt9LHRoaXMuZXZlbnRTb3VyY2VMaXN0Xz1bXSx0aGlzLnJlZ2lzdGVyU291cmNlcygpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5yZWdpc3RlclNvdXJjZXM9ZnVuY3Rpb24oKXtpZihZaSl0aGlzLnJlZ2lzdGVyU291cmNlKCJuYXRpdmUiLG5ldyBkbih0aGlzKSk7ZWxzZSBpZihCaSl0aGlzLnJlZ2lzdGVyU291cmNlKCJtcyIsbmV3IG5uKHRoaXMpKTtlbHNle3ZhciB0PW5ldyBLcih0aGlzKTt0aGlzLnJlZ2lzdGVyU291cmNlKCJtb3VzZSIsdCksVWkmJnRoaXMucmVnaXN0ZXJTb3VyY2UoInRvdWNoIixuZXcgRW4odGhpcyx0KSl9dGhpcy5yZWdpc3Rlcl8oKX0sZS5wcm90b3R5cGUucmVnaXN0ZXJTb3VyY2U9ZnVuY3Rpb24odCxlKXt2YXIgaT1lLHI9aS5nZXRFdmVudHMoKTtyJiYoci5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPWkuZ2V0SGFuZGxlckZvckV2ZW50KHQpO2UmJih0aGlzLmV2ZW50TWFwX1t0XT1lLmJpbmQoaSkpfS5iaW5kKHRoaXMpKSx0aGlzLmV2ZW50U291cmNlTGlzdF8ucHVzaChpKSl9LGUucHJvdG90eXBlLnJlZ2lzdGVyXz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmV2ZW50U291cmNlTGlzdF8ubGVuZ3RoLGU9MDtlPHQ7ZSsrKXt2YXIgaT10aGlzLmV2ZW50U291cmNlTGlzdF9bZV07dGhpcy5hZGRFdmVudHNfKGkuZ2V0RXZlbnRzKCkpfX0sZS5wcm90b3R5cGUudW5yZWdpc3Rlcl89ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5ldmVudFNvdXJjZUxpc3RfLmxlbmd0aCxlPTA7ZTx0O2UrKyl7dmFyIGk9dGhpcy5ldmVudFNvdXJjZUxpc3RfW2VdO3RoaXMucmVtb3ZlRXZlbnRzXyhpLmdldEV2ZW50cygpKX19LGUucHJvdG90eXBlLmV2ZW50SGFuZGxlcl89ZnVuY3Rpb24odCl7dmFyIGU9dC50eXBlLGk9dGhpcy5ldmVudE1hcF9bZV07aSYmaSh0KX0sZS5wcm90b3R5cGUuYWRkRXZlbnRzXz1mdW5jdGlvbih0KXt0LmZvckVhY2goZnVuY3Rpb24odCl7dih0aGlzLmVsZW1lbnRfLHQsdGhpcy5ldmVudEhhbmRsZXJfLHRoaXMpfS5iaW5kKHRoaXMpKX0sZS5wcm90b3R5cGUucmVtb3ZlRXZlbnRzXz1mdW5jdGlvbih0KXt0LmZvckVhY2goZnVuY3Rpb24odCl7eCh0aGlzLmVsZW1lbnRfLHQsdGhpcy5ldmVudEhhbmRsZXJfLHRoaXMpfS5iaW5kKHRoaXMpKX0sZS5wcm90b3R5cGUuY2xvbmVFdmVudD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT17fSxyPTAsbj1Tbi5sZW5ndGg7cjxuO3IrKyl7dmFyIG89U25bcl1bMF07aVtvXT10W29dfHxlW29dfHxTbltyXVsxXX1yZXR1cm4gaX0sZS5wcm90b3R5cGUuZG93bj1mdW5jdGlvbih0LGUpe3RoaXMuZmlyZUV2ZW50KEdyLlBPSU5URVJET1dOLHQsZSl9LGUucHJvdG90eXBlLm1vdmU9ZnVuY3Rpb24odCxlKXt0aGlzLmZpcmVFdmVudChHci5QT0lOVEVSTU9WRSx0LGUpfSxlLnByb3RvdHlwZS51cD1mdW5jdGlvbih0LGUpe3RoaXMuZmlyZUV2ZW50KEdyLlBPSU5URVJVUCx0LGUpfSxlLnByb3RvdHlwZS5lbnRlcj1mdW5jdGlvbih0LGUpe3QuYnViYmxlcz0hMSx0aGlzLmZpcmVFdmVudChHci5QT0lOVEVSRU5URVIsdCxlKX0sZS5wcm90b3R5cGUubGVhdmU9ZnVuY3Rpb24odCxlKXt0LmJ1YmJsZXM9ITEsdGhpcy5maXJlRXZlbnQoR3IuUE9JTlRFUkxFQVZFLHQsZSl9LGUucHJvdG90eXBlLm92ZXI9ZnVuY3Rpb24odCxlKXt0LmJ1YmJsZXM9ITAsdGhpcy5maXJlRXZlbnQoR3IuUE9JTlRFUk9WRVIsdCxlKX0sZS5wcm90b3R5cGUub3V0PWZ1bmN0aW9uKHQsZSl7dC5idWJibGVzPSEwLHRoaXMuZmlyZUV2ZW50KEdyLlBPSU5URVJPVVQsdCxlKX0sZS5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQsZSl7dGhpcy5maXJlRXZlbnQoR3IuUE9JTlRFUkNBTkNFTCx0LGUpfSxlLnByb3RvdHlwZS5sZWF2ZU91dD1mdW5jdGlvbih0LGUpe3RoaXMub3V0KHQsZSksdGhpcy5jb250YWluc18odC50YXJnZXQsdC5yZWxhdGVkVGFyZ2V0KXx8dGhpcy5sZWF2ZSh0LGUpfSxlLnByb3RvdHlwZS5lbnRlck92ZXI9ZnVuY3Rpb24odCxlKXt0aGlzLm92ZXIodCxlKSx0aGlzLmNvbnRhaW5zXyh0LnRhcmdldCx0LnJlbGF0ZWRUYXJnZXQpfHx0aGlzLmVudGVyKHQsZSl9LGUucHJvdG90eXBlLmNvbnRhaW5zXz1mdW5jdGlvbih0LGUpe3JldHVybiEoIXR8fCFlKSYmdC5jb250YWlucyhlKX0sZS5wcm90b3R5cGUubWFrZUV2ZW50PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IGduKHQsaSxlKX0sZS5wcm90b3R5cGUuZmlyZUV2ZW50PWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLm1ha2VFdmVudCh0LGUsaSk7dGhpcy5kaXNwYXRjaEV2ZW50KHIpfSxlLnByb3RvdHlwZS5maXJlTmF0aXZlRXZlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tYWtlRXZlbnQodC50eXBlLHQsdCk7dGhpcy5kaXNwYXRjaEV2ZW50KGUpfSxlLnByb3RvdHlwZS53cmFwTW91c2VFdmVudD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1ha2VFdmVudCh0LFdyKGUsdGhpcyksZSl9LGUucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbD1mdW5jdGlvbigpe3RoaXMudW5yZWdpc3Rlcl8oKSx0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKX0sZX0oYiksQ249ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkpe3QuY2FsbCh0aGlzKSx0aGlzLm1hcF89ZSx0aGlzLmNsaWNrVGltZW91dElkXyx0aGlzLmRyYWdnaW5nXz0hMSx0aGlzLmRyYWdMaXN0ZW5lcktleXNfPVtdLHRoaXMubW92ZVRvbGVyYW5jZV89aT9pKkRpOkRpLHRoaXMuZG93bl89bnVsbDt2YXIgcj10aGlzLm1hcF8uZ2V0Vmlld3BvcnQoKTt0aGlzLmFjdGl2ZVBvaW50ZXJzXz0wLHRoaXMudHJhY2tlZFRvdWNoZXNfPXt9LHRoaXMucG9pbnRlckV2ZW50SGFuZGxlcl89bmV3IFRuKHIpLHRoaXMuZG9jdW1lbnRQb2ludGVyRXZlbnRIYW5kbGVyXz1udWxsLHRoaXMucG9pbnRlcmRvd25MaXN0ZW5lcktleV89dih0aGlzLnBvaW50ZXJFdmVudEhhbmRsZXJfLEdyLlBPSU5URVJET1dOLHRoaXMuaGFuZGxlUG9pbnRlckRvd25fLHRoaXMpLHRoaXMucmVsYXllZExpc3RlbmVyS2V5Xz12KHRoaXMucG9pbnRlckV2ZW50SGFuZGxlcl8sR3IuUE9JTlRFUk1PVkUsdGhpcy5yZWxheUV2ZW50Xyx0aGlzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZW11bGF0ZUNsaWNrXz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgTnIoQXIuQ0xJQ0ssdGhpcy5tYXBfLHQpO3RoaXMuZGlzcGF0Y2hFdmVudChlKSx2b2lkIDAhPT10aGlzLmNsaWNrVGltZW91dElkXz8oY2xlYXJUaW1lb3V0KHRoaXMuY2xpY2tUaW1lb3V0SWRfKSx0aGlzLmNsaWNrVGltZW91dElkXz12b2lkIDAsZT1uZXcgTnIoQXIuREJMQ0xJQ0ssdGhpcy5tYXBfLHQpLHRoaXMuZGlzcGF0Y2hFdmVudChlKSk6dGhpcy5jbGlja1RpbWVvdXRJZF89c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2xpY2tUaW1lb3V0SWRfPXZvaWQgMDt2YXIgZT1uZXcgTnIoQXIuU0lOR0xFQ0xJQ0ssdGhpcy5tYXBfLHQpO3RoaXMuZGlzcGF0Y2hFdmVudChlKX0uYmluZCh0aGlzKSwyNTApfSxlLnByb3RvdHlwZS51cGRhdGVBY3RpdmVQb2ludGVyc189ZnVuY3Rpb24odCl7dmFyIGU9dDtlLnR5cGU9PUFyLlBPSU5URVJVUHx8ZS50eXBlPT1Bci5QT0lOVEVSQ0FOQ0VMP2RlbGV0ZSB0aGlzLnRyYWNrZWRUb3VjaGVzX1tlLnBvaW50ZXJJZF06ZS50eXBlPT1Bci5QT0lOVEVSRE9XTiYmKHRoaXMudHJhY2tlZFRvdWNoZXNfW2UucG9pbnRlcklkXT0hMCksdGhpcy5hY3RpdmVQb2ludGVyc189T2JqZWN0LmtleXModGhpcy50cmFja2VkVG91Y2hlc18pLmxlbmd0aH0sZS5wcm90b3R5cGUuaGFuZGxlUG9pbnRlclVwXz1mdW5jdGlvbih0KXt0aGlzLnVwZGF0ZUFjdGl2ZVBvaW50ZXJzXyh0KTt2YXIgZT1uZXcgTnIoQXIuUE9JTlRFUlVQLHRoaXMubWFwXyx0KTt0aGlzLmRpc3BhdGNoRXZlbnQoZSksZS5wcm9wYWdhdGlvblN0b3BwZWR8fHRoaXMuZHJhZ2dpbmdffHwhdGhpcy5pc01vdXNlQWN0aW9uQnV0dG9uXyh0KXx8dGhpcy5lbXVsYXRlQ2xpY2tfKHRoaXMuZG93bl8pLDA9PT10aGlzLmFjdGl2ZVBvaW50ZXJzXyYmKHRoaXMuZHJhZ0xpc3RlbmVyS2V5c18uZm9yRWFjaChFKSx0aGlzLmRyYWdMaXN0ZW5lcktleXNfLmxlbmd0aD0wLHRoaXMuZHJhZ2dpbmdfPSExLHRoaXMuZG93bl89bnVsbCx0aGlzLmRvY3VtZW50UG9pbnRlckV2ZW50SGFuZGxlcl8uZGlzcG9zZSgpLHRoaXMuZG9jdW1lbnRQb2ludGVyRXZlbnRIYW5kbGVyXz1udWxsKX0sZS5wcm90b3R5cGUuaXNNb3VzZUFjdGlvbkJ1dHRvbl89ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10LmJ1dHRvbn0sZS5wcm90b3R5cGUuaGFuZGxlUG9pbnRlckRvd25fPWZ1bmN0aW9uKHQpe3RoaXMudXBkYXRlQWN0aXZlUG9pbnRlcnNfKHQpO3ZhciBlPW5ldyBOcihBci5QT0lOVEVSRE9XTix0aGlzLm1hcF8sdCk7dGhpcy5kaXNwYXRjaEV2ZW50KGUpLHRoaXMuZG93bl89dCwwPT09dGhpcy5kcmFnTGlzdGVuZXJLZXlzXy5sZW5ndGgmJih0aGlzLmRvY3VtZW50UG9pbnRlckV2ZW50SGFuZGxlcl89bmV3IFRuKGRvY3VtZW50KSx0aGlzLmRyYWdMaXN0ZW5lcktleXNfLnB1c2godih0aGlzLmRvY3VtZW50UG9pbnRlckV2ZW50SGFuZGxlcl8sQXIuUE9JTlRFUk1PVkUsdGhpcy5oYW5kbGVQb2ludGVyTW92ZV8sdGhpcyksdih0aGlzLmRvY3VtZW50UG9pbnRlckV2ZW50SGFuZGxlcl8sQXIuUE9JTlRFUlVQLHRoaXMuaGFuZGxlUG9pbnRlclVwXyx0aGlzKSx2KHRoaXMucG9pbnRlckV2ZW50SGFuZGxlcl8sQXIuUE9JTlRFUkNBTkNFTCx0aGlzLmhhbmRsZVBvaW50ZXJVcF8sdGhpcykpKX0sZS5wcm90b3R5cGUuaGFuZGxlUG9pbnRlck1vdmVfPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNNb3ZpbmdfKHQpKXt0aGlzLmRyYWdnaW5nXz0hMDt2YXIgZT1uZXcgTnIoQXIuUE9JTlRFUkRSQUcsdGhpcy5tYXBfLHQsdGhpcy5kcmFnZ2luZ18pO3RoaXMuZGlzcGF0Y2hFdmVudChlKX10LnByZXZlbnREZWZhdWx0KCl9LGUucHJvdG90eXBlLnJlbGF5RXZlbnRfPWZ1bmN0aW9uKHQpe3ZhciBlPSEoIXRoaXMuZG93bl98fCF0aGlzLmlzTW92aW5nXyh0KSk7dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBOcih0LnR5cGUsdGhpcy5tYXBfLHQsZSkpfSxlLnByb3RvdHlwZS5pc01vdmluZ189ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZHJhZ2dpbmdffHxNYXRoLmFicyh0LmNsaWVudFgtdGhpcy5kb3duXy5jbGllbnRYKT50aGlzLm1vdmVUb2xlcmFuY2VffHxNYXRoLmFicyh0LmNsaWVudFktdGhpcy5kb3duXy5jbGllbnRZKT50aGlzLm1vdmVUb2xlcmFuY2VffSxlLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWw9ZnVuY3Rpb24oKXt0aGlzLnJlbGF5ZWRMaXN0ZW5lcktleV8mJihFKHRoaXMucmVsYXllZExpc3RlbmVyS2V5XyksdGhpcy5yZWxheWVkTGlzdGVuZXJLZXlfPW51bGwpLHRoaXMucG9pbnRlcmRvd25MaXN0ZW5lcktleV8mJihFKHRoaXMucG9pbnRlcmRvd25MaXN0ZW5lcktleV8pLHRoaXMucG9pbnRlcmRvd25MaXN0ZW5lcktleV89bnVsbCksdGhpcy5kcmFnTGlzdGVuZXJLZXlzXy5mb3JFYWNoKEUpLHRoaXMuZHJhZ0xpc3RlbmVyS2V5c18ubGVuZ3RoPTAsdGhpcy5kb2N1bWVudFBvaW50ZXJFdmVudEhhbmRsZXJfJiYodGhpcy5kb2N1bWVudFBvaW50ZXJFdmVudEhhbmRsZXJfLmRpc3Bvc2UoKSx0aGlzLmRvY3VtZW50UG9pbnRlckV2ZW50SGFuZGxlcl89bnVsbCksdGhpcy5wb2ludGVyRXZlbnRIYW5kbGVyXyYmKHRoaXMucG9pbnRlckV2ZW50SGFuZGxlcl8uZGlzcG9zZSgpLHRoaXMucG9pbnRlckV2ZW50SGFuZGxlcl89bnVsbCksdC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyl9LGV9KGIpLFJuPSJwb3N0cmVuZGVyIix3bj0ibW92ZXN0YXJ0IixJbj0ibW92ZWVuZCIsTG49e0xBWUVSR1JPVVA6ImxheWVyZ3JvdXAiLFNJWkU6InNpemUiLFRBUkdFVDoidGFyZ2V0IixWSUVXOiJ2aWV3In0sT249e0lETEU6MCxMT0FESU5HOjEsTE9BREVEOjIsRVJST1I6MyxFTVBUWTo0LEFCT1JUOjV9LFBuPWZ1bmN0aW9uKHQsZSl7dGhpcy5wcmlvcml0eUZ1bmN0aW9uXz10LHRoaXMua2V5RnVuY3Rpb25fPWUsdGhpcy5lbGVtZW50c189W10sdGhpcy5wcmlvcml0aWVzXz1bXSx0aGlzLnF1ZXVlZEVsZW1lbnRzXz17fX07UG4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50c18ubGVuZ3RoPTAsdGhpcy5wcmlvcml0aWVzXy5sZW5ndGg9MCxwKHRoaXMucXVldWVkRWxlbWVudHNfKX0sUG4ucHJvdG90eXBlLmRlcXVldWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnRzXyxlPXRoaXMucHJpb3JpdGllc18saT10WzBdOzE9PXQubGVuZ3RoPyh0Lmxlbmd0aD0wLGUubGVuZ3RoPTApOih0WzBdPXQucG9wKCksZVswXT1lLnBvcCgpLHRoaXMuc2lmdFVwXygwKSk7dmFyIHI9dGhpcy5rZXlGdW5jdGlvbl8oaSk7cmV0dXJuIGRlbGV0ZSB0aGlzLnF1ZXVlZEVsZW1lbnRzX1tyXSxpfSxQbi5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbih0KXtZKCEodGhpcy5rZXlGdW5jdGlvbl8odClpbiB0aGlzLnF1ZXVlZEVsZW1lbnRzXyksMzEpO3ZhciBlPXRoaXMucHJpb3JpdHlGdW5jdGlvbl8odCk7cmV0dXJuIGUhPTEvMCYmKHRoaXMuZWxlbWVudHNfLnB1c2godCksdGhpcy5wcmlvcml0aWVzXy5wdXNoKGUpLHRoaXMucXVldWVkRWxlbWVudHNfW3RoaXMua2V5RnVuY3Rpb25fKHQpXT0hMCx0aGlzLnNpZnREb3duXygwLHRoaXMuZWxlbWVudHNfLmxlbmd0aC0xKSwhMCl9LFBuLnByb3RvdHlwZS5nZXRDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzXy5sZW5ndGh9LFBuLnByb3RvdHlwZS5nZXRMZWZ0Q2hpbGRJbmRleF89ZnVuY3Rpb24odCl7cmV0dXJuIDIqdCsxfSxQbi5wcm90b3R5cGUuZ2V0UmlnaHRDaGlsZEluZGV4Xz1mdW5jdGlvbih0KXtyZXR1cm4gMip0KzJ9LFBuLnByb3RvdHlwZS5nZXRQYXJlbnRJbmRleF89ZnVuY3Rpb24odCl7cmV0dXJuIHQtMT4+MX0sUG4ucHJvdG90eXBlLmhlYXBpZnlfPWZ1bmN0aW9uKCl7dmFyIHQ7Zm9yKHQ9KHRoaXMuZWxlbWVudHNfLmxlbmd0aD4+MSktMTt0Pj0wO3QtLSl0aGlzLnNpZnRVcF8odCl9LFBuLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmVsZW1lbnRzXy5sZW5ndGh9LFBuLnByb3RvdHlwZS5pc0tleVF1ZXVlZD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbiB0aGlzLnF1ZXVlZEVsZW1lbnRzX30sUG4ucHJvdG90eXBlLmlzUXVldWVkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzS2V5UXVldWVkKHRoaXMua2V5RnVuY3Rpb25fKHQpKX0sUG4ucHJvdG90eXBlLnNpZnRVcF89ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZWxlbWVudHNfLGk9dGhpcy5wcmlvcml0aWVzXyxyPWUubGVuZ3RoLG49ZVt0XSxvPWlbdF0scz10O3Q8cj4+MTspe3ZhciBhPXRoaXMuZ2V0TGVmdENoaWxkSW5kZXhfKHQpLGg9dGhpcy5nZXRSaWdodENoaWxkSW5kZXhfKHQpLGw9aDxyJiZpW2hdPGlbYV0/aDphO2VbdF09ZVtsXSxpW3RdPWlbbF0sdD1sfWVbdF09bixpW3RdPW8sdGhpcy5zaWZ0RG93bl8ocyx0KX0sUG4ucHJvdG90eXBlLnNpZnREb3duXz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLmVsZW1lbnRzXyxyPXRoaXMucHJpb3JpdGllc18sbj1pW2VdLG89cltlXTtlPnQ7KXt2YXIgcz10aGlzLmdldFBhcmVudEluZGV4XyhlKTtpZighKHJbc10+bykpYnJlYWs7aVtlXT1pW3NdLHJbZV09cltzXSxlPXN9aVtlXT1uLHJbZV09b30sUG4ucHJvdG90eXBlLnJlcHJpb3JpdGl6ZT1mdW5jdGlvbigpe3ZhciB0LGUsaSxyPXRoaXMucHJpb3JpdHlGdW5jdGlvbl8sbj10aGlzLmVsZW1lbnRzXyxvPXRoaXMucHJpb3JpdGllc18scz0wLGE9bi5sZW5ndGg7Zm9yKGU9MDtlPGE7KytlKShpPXIodD1uW2VdKSk9PTEvMD9kZWxldGUgdGhpcy5xdWV1ZWRFbGVtZW50c19bdGhpcy5rZXlGdW5jdGlvbl8odCldOihvW3NdPWksbltzKytdPXQpO24ubGVuZ3RoPXMsby5sZW5ndGg9cyx0aGlzLmhlYXBpZnlfKCl9O3ZhciBibj1QbixNbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMsZnVuY3Rpb24odCl7cmV0dXJuIGUuYXBwbHkobnVsbCx0KX0sZnVuY3Rpb24odCl7cmV0dXJuIHRbMF0uZ2V0S2V5KCl9KSx0aGlzLnRpbGVDaGFuZ2VDYWxsYmFja189aSx0aGlzLnRpbGVzTG9hZGluZ189MCx0aGlzLnRpbGVzTG9hZGluZ0tleXNfPXt9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5lbnF1ZXVlPWZ1bmN0aW9uKGUpe3ZhciBpPXQucHJvdG90eXBlLmVucXVldWUuY2FsbCh0aGlzLGUpO2kmJnYoZVswXSxNLkNIQU5HRSx0aGlzLmhhbmRsZVRpbGVDaGFuZ2UsdGhpcyk7cmV0dXJuIGl9LGUucHJvdG90eXBlLmdldFRpbGVzTG9hZGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbGVzTG9hZGluZ199LGUucHJvdG90eXBlLmhhbmRsZVRpbGVDaGFuZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQsaT1lLmdldFN0YXRlKCk7aWYoaT09PU9uLkxPQURFRHx8aT09PU9uLkVSUk9SfHxpPT09T24uRU1QVFl8fGk9PT1Pbi5BQk9SVCl7eChlLE0uQ0hBTkdFLHRoaXMuaGFuZGxlVGlsZUNoYW5nZSx0aGlzKTt2YXIgcj1lLmdldEtleSgpO3IgaW4gdGhpcy50aWxlc0xvYWRpbmdLZXlzXyYmKGRlbGV0ZSB0aGlzLnRpbGVzTG9hZGluZ0tleXNfW3JdLC0tdGhpcy50aWxlc0xvYWRpbmdfKSx0aGlzLnRpbGVDaGFuZ2VDYWxsYmFja18oKX19LGUucHJvdG90eXBlLmxvYWRNb3JlVGlsZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkscixuLG89MCxzPSExO3RoaXMudGlsZXNMb2FkaW5nXzx0JiZvPGUmJnRoaXMuZ2V0Q291bnQoKT4wOyluPShyPXRoaXMuZGVxdWV1ZSgpWzBdKS5nZXRLZXkoKSwoaT1yLmdldFN0YXRlKCkpPT09T24uQUJPUlQ/cz0hMDppIT09T24uSURMRXx8biBpbiB0aGlzLnRpbGVzTG9hZGluZ0tleXNffHwodGhpcy50aWxlc0xvYWRpbmdLZXlzX1tuXT0hMCwrK3RoaXMudGlsZXNMb2FkaW5nXywrK28sci5sb2FkKCkpOzA9PT1vJiZzJiZ0aGlzLnRpbGVDaGFuZ2VDYWxsYmFja18oKX0sZX0oYm4pLEZuPTQyLEFuPTI1NjtmdW5jdGlvbiBObih0KXtyZXR1cm4gdH1mdW5jdGlvbiBHbih0LGUpe3JldHVybiB2b2lkIDAhPT10PzA6dm9pZCAwfWZ1bmN0aW9uIERuKHQsZSl7cmV0dXJuIHZvaWQgMCE9PXQ/dCtlOnZvaWQgMH12YXIga249MCxqbj0xLFVuPSJjZW50ZXIiLFluPSJyZXNvbHV0aW9uIixCbj0icm90YXRpb24iO2Z1bmN0aW9uIFZuKHQpe3JldHVybiBNYXRoLnBvdyh0LDMpfWZ1bmN0aW9uIFhuKHQpe3JldHVybiAxLVZuKDEtdCl9ZnVuY3Rpb24gem4odCl7cmV0dXJuIDMqdCp0LTIqdCp0KnR9ZnVuY3Rpb24gV24odCl7cmV0dXJuIHR9dmFyIEtuPTA7ZnVuY3Rpb24gSG4odCxlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dChlKX0sMCl9ZnVuY3Rpb24gWm4odCl7cmV0dXJuISh0LnNvdXJjZUNlbnRlciYmdC50YXJnZXRDZW50ZXImJiFRaSh0LnNvdXJjZUNlbnRlcix0LnRhcmdldENlbnRlcikpJiYodC5zb3VyY2VSZXNvbHV0aW9uPT09dC50YXJnZXRSZXNvbHV0aW9uJiZ0LnNvdXJjZVJvdGF0aW9uPT09dC50YXJnZXRSb3RhdGlvbil9dmFyIHFuPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpO3ZhciBpPXUoe30sZSk7dGhpcy5oaW50c189WzAsMF0sdGhpcy5hbmltYXRpb25zXz1bXSx0aGlzLnVwZGF0ZUFuaW1hdGlvbktleV8sdGhpcy51cGRhdGVBbmltYXRpb25zXz10aGlzLnVwZGF0ZUFuaW1hdGlvbnNfLmJpbmQodGhpcyksdGhpcy5wcm9qZWN0aW9uXz1DZShpLnByb2plY3Rpb24sIkVQU0c6Mzg1NyIpLHRoaXMuYXBwbHlPcHRpb25zXyhpKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuYXBwbHlPcHRpb25zXz1mdW5jdGlvbih0KXt2YXIgZT17fTtlW1VuXT12b2lkIDAhPT10LmNlbnRlcj90LmNlbnRlcjpudWxsO3ZhciBpPWZ1bmN0aW9uKHQpe3ZhciBlLGkscixuPXZvaWQgMCE9PXQubWluWm9vbT90Lm1pblpvb206S24sbz12b2lkIDAhPT10Lm1heFpvb20/dC5tYXhab29tOjI4LHM9dm9pZCAwIT09dC56b29tRmFjdG9yP3Quem9vbUZhY3RvcjoyO2lmKHZvaWQgMCE9PXQucmVzb2x1dGlvbnMpe3ZhciBhPXQucmVzb2x1dGlvbnM7aT1hW25dLHI9dm9pZCAwIT09YVtvXT9hW29dOmFbYS5sZW5ndGgtMV0sZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxpLHIpe2lmKHZvaWQgMCE9PWUpe3ZhciBuPXoodCxlLHIpO249a3QobitpLDAsdC5sZW5ndGgtMSk7dmFyIG89TWF0aC5mbG9vcihuKTtpZihuIT1vJiZvPHQubGVuZ3RoLTEpe3ZhciBzPXRbb10vdFtvKzFdO3JldHVybiB0W29dL01hdGgucG93KHMsbi1vKX1yZXR1cm4gdFtvXX19fShhKX1lbHNle3ZhciBoPUNlKHQucHJvamVjdGlvbiwiRVBTRzozODU3IiksbD1oLmdldEV4dGVudCgpLHU9bD9NYXRoLm1heChPdChsKSxSdChsKSk6MzYwKlF0WyR0LkRFR1JFRVNdL2guZ2V0TWV0ZXJzUGVyVW5pdCgpLHA9dS9Bbi9NYXRoLnBvdygyLEtuKSxjPXAvTWF0aC5wb3coMiwyOC1Lbik7dm9pZCAwIT09KGk9dC5tYXhSZXNvbHV0aW9uKT9uPTA6aT1wL01hdGgucG93KHMsbiksdm9pZCAwPT09KHI9dC5taW5SZXNvbHV0aW9uKSYmKHI9dm9pZCAwIT09dC5tYXhab29tP3ZvaWQgMCE9PXQubWF4UmVzb2x1dGlvbj9pL01hdGgucG93KHMsbyk6cC9NYXRoLnBvdyhzLG8pOmMpLG89bitNYXRoLmZsb29yKE1hdGgubG9nKGkvcikvTWF0aC5sb2cocykpLHI9aS9NYXRoLnBvdyhzLG8tbiksZT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIGZ1bmN0aW9uKHIsbixvKXtpZih2b2lkIDAhPT1yKXt2YXIgcz0tby8yKy41LGE9TWF0aC5mbG9vcihNYXRoLmxvZyhlL3IpL01hdGgubG9nKHQpK3MpLGg9TWF0aC5tYXgoYStuLDApO3JldHVybiB2b2lkIDAhPT1pJiYoaD1NYXRoLm1pbihoLGkpKSxlL01hdGgucG93KHQsaCl9fX0ocyxpLG8tbil9cmV0dXJue2NvbnN0cmFpbnQ6ZSxtYXhSZXNvbHV0aW9uOmksbWluUmVzb2x1dGlvbjpyLG1pblpvb206bix6b29tRmFjdG9yOnN9fSh0KTt0aGlzLm1heFJlc29sdXRpb25fPWkubWF4UmVzb2x1dGlvbix0aGlzLm1pblJlc29sdXRpb25fPWkubWluUmVzb2x1dGlvbix0aGlzLnpvb21GYWN0b3JfPWkuem9vbUZhY3Rvcix0aGlzLnJlc29sdXRpb25zXz10LnJlc29sdXRpb25zLHRoaXMubWluWm9vbV89aS5taW5ab29tO3ZhciByPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10LmV4dGVudD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGU/W2t0KGVbMF0sdFswXSx0WzJdKSxrdChlWzFdLHRbMV0sdFszXSldOnZvaWQgMH19KHQuZXh0ZW50KTpObn0odCksbj1pLmNvbnN0cmFpbnQsbz1mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10LmVuYWJsZVJvdGF0aW9ufHx0LmVuYWJsZVJvdGF0aW9uKXt2YXIgZT10LmNvbnN0cmFpblJvdGF0aW9uO3JldHVybiB2b2lkIDA9PT1lfHwhMD09PWU/ZnVuY3Rpb24odCl7dmFyIGU9dHx8VnQoNSk7cmV0dXJuIGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHZvaWQgMCE9PXQ/TWF0aC5hYnModCtpKTw9ZT8wOnQraTp2b2lkIDB9fSgpOiExPT09ZT9EbjoibnVtYmVyIj09dHlwZW9mIGU/ZnVuY3Rpb24odCl7dmFyIGU9MipNYXRoLlBJL3Q7cmV0dXJuIGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHZvaWQgMCE9PXQ/dD1NYXRoLmZsb29yKCh0K2kpL2UrLjUpKmU6dm9pZCAwfX0oZSk6RG59cmV0dXJuIEdufSh0KTt0aGlzLmNvbnN0cmFpbnRzXz17Y2VudGVyOnIscmVzb2x1dGlvbjpuLHJvdGF0aW9uOm99LHZvaWQgMCE9PXQucmVzb2x1dGlvbj9lW1luXT10LnJlc29sdXRpb246dm9pZCAwIT09dC56b29tJiYoZVtZbl09dGhpcy5jb25zdHJhaW5SZXNvbHV0aW9uKHRoaXMubWF4UmVzb2x1dGlvbl8sdC56b29tLXRoaXMubWluWm9vbV8pLHRoaXMucmVzb2x1dGlvbnNfJiYoZVtZbl09a3QoTnVtYmVyKHRoaXMuZ2V0UmVzb2x1dGlvbigpfHxlW1luXSksdGhpcy5taW5SZXNvbHV0aW9uXyx0aGlzLm1heFJlc29sdXRpb25fKSkpLGVbQm5dPXZvaWQgMCE9PXQucm90YXRpb24/dC5yb3RhdGlvbjowLHRoaXMuc2V0UHJvcGVydGllcyhlKSx0aGlzLm9wdGlvbnNfPXR9LGUucHJvdG90eXBlLmdldFVwZGF0ZWRPcHRpb25zXz1mdW5jdGlvbih0KXt2YXIgZT11KHt9LHRoaXMub3B0aW9uc18pO3JldHVybiB2b2lkIDAhPT1lLnJlc29sdXRpb24/ZS5yZXNvbHV0aW9uPXRoaXMuZ2V0UmVzb2x1dGlvbigpOmUuem9vbT10aGlzLmdldFpvb20oKSxlLmNlbnRlcj10aGlzLmdldENlbnRlcigpLGUucm90YXRpb249dGhpcy5nZXRSb3RhdGlvbigpLHUoe30sZSx0KX0sZS5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbih0KXt2YXIgZSxpPWFyZ3VtZW50cyxyPWFyZ3VtZW50cy5sZW5ndGg7aWYocj4xJiYiZnVuY3Rpb24iPT10eXBlb2YgYXJndW1lbnRzW3ItMV0mJihlPWFyZ3VtZW50c1tyLTFdLC0tciksIXRoaXMuaXNEZWYoKSl7dmFyIG49YXJndW1lbnRzW3ItMV07cmV0dXJuIG4uY2VudGVyJiZ0aGlzLnNldENlbnRlcihuLmNlbnRlciksdm9pZCAwIT09bi56b29tJiZ0aGlzLnNldFpvb20obi56b29tKSx2b2lkIDAhPT1uLnJvdGF0aW9uJiZ0aGlzLnNldFJvdGF0aW9uKG4ucm90YXRpb24pLHZvaWQoZSYmSG4oZSwhMCkpfWZvcih2YXIgbz1EYXRlLm5vdygpLHM9dGhpcy5nZXRDZW50ZXIoKS5zbGljZSgpLGE9dGhpcy5nZXRSZXNvbHV0aW9uKCksaD10aGlzLmdldFJvdGF0aW9uKCksbD1bXSx1PTA7dTxyOysrdSl7dmFyIHA9aVt1XSxjPXtzdGFydDpvLGNvbXBsZXRlOiExLGFuY2hvcjpwLmFuY2hvcixkdXJhdGlvbjp2b2lkIDAhPT1wLmR1cmF0aW9uP3AuZHVyYXRpb246MWUzLGVhc2luZzpwLmVhc2luZ3x8em59O2lmKHAuY2VudGVyJiYoYy5zb3VyY2VDZW50ZXI9cyxjLnRhcmdldENlbnRlcj1wLmNlbnRlcixzPWMudGFyZ2V0Q2VudGVyKSx2b2lkIDAhPT1wLnpvb20/KGMuc291cmNlUmVzb2x1dGlvbj1hLGMudGFyZ2V0UmVzb2x1dGlvbj10aGlzLmNvbnN0cmFpblJlc29sdXRpb24odGhpcy5tYXhSZXNvbHV0aW9uXyxwLnpvb20tdGhpcy5taW5ab29tXywwKSxhPWMudGFyZ2V0UmVzb2x1dGlvbik6cC5yZXNvbHV0aW9uJiYoYy5zb3VyY2VSZXNvbHV0aW9uPWEsYy50YXJnZXRSZXNvbHV0aW9uPXAucmVzb2x1dGlvbixhPWMudGFyZ2V0UmVzb2x1dGlvbiksdm9pZCAwIT09cC5yb3RhdGlvbil7Yy5zb3VyY2VSb3RhdGlvbj1oO3ZhciBkPVh0KHAucm90YXRpb24taCtNYXRoLlBJLDIqTWF0aC5QSSktTWF0aC5QSTtjLnRhcmdldFJvdGF0aW9uPWgrZCxoPWMudGFyZ2V0Um90YXRpb259Yy5jYWxsYmFjaz1lLFpuKGMpP2MuY29tcGxldGU9ITA6bys9Yy5kdXJhdGlvbixsLnB1c2goYyl9dGhpcy5hbmltYXRpb25zXy5wdXNoKGwpLHRoaXMuc2V0SGludChrbiwxKSx0aGlzLnVwZGF0ZUFuaW1hdGlvbnNfKCl9LGUucHJvdG90eXBlLmdldEFuaW1hdGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpbnRzX1trbl0+MH0sZS5wcm90b3R5cGUuZ2V0SW50ZXJhY3Rpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaW50c19bam5dPjB9LGUucHJvdG90eXBlLmNhbmNlbEFuaW1hdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLnNldEhpbnQoa24sLXRoaXMuaGludHNfW2tuXSk7Zm9yKHZhciB0PTAsZT10aGlzLmFuaW1hdGlvbnNfLmxlbmd0aDt0PGU7Kyt0KXt2YXIgaT10aGlzLmFuaW1hdGlvbnNfW3RdO2lbMF0uY2FsbGJhY2smJkhuKGlbMF0uY2FsbGJhY2ssITEpfXRoaXMuYW5pbWF0aW9uc18ubGVuZ3RoPTB9LGUucHJvdG90eXBlLnVwZGF0ZUFuaW1hdGlvbnNfPWZ1bmN0aW9uKCl7aWYodm9pZCAwIT09dGhpcy51cGRhdGVBbmltYXRpb25LZXlfJiYoY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy51cGRhdGVBbmltYXRpb25LZXlfKSx0aGlzLnVwZGF0ZUFuaW1hdGlvbktleV89dm9pZCAwKSx0aGlzLmdldEFuaW1hdGluZygpKXtmb3IodmFyIHQ9RGF0ZS5ub3coKSxlPSExLGk9dGhpcy5hbmltYXRpb25zXy5sZW5ndGgtMTtpPj0wOy0taSl7Zm9yKHZhciByPXRoaXMuYW5pbWF0aW9uc19baV0sbj0hMCxvPTAscz1yLmxlbmd0aDtvPHM7KytvKXt2YXIgYT1yW29dO2lmKCFhLmNvbXBsZXRlKXt2YXIgaD10LWEuc3RhcnQsbD1hLmR1cmF0aW9uPjA/aC9hLmR1cmF0aW9uOjE7bD49MT8oYS5jb21wbGV0ZT0hMCxsPTEpOm49ITE7dmFyIHU9YS5lYXNpbmcobCk7aWYoYS5zb3VyY2VDZW50ZXIpe3ZhciBwPWEuc291cmNlQ2VudGVyWzBdLGM9YS5zb3VyY2VDZW50ZXJbMV0sZD1wK3UqKGEudGFyZ2V0Q2VudGVyWzBdLXApLGY9Yyt1KihhLnRhcmdldENlbnRlclsxXS1jKTt0aGlzLnNldChVbixbZCxmXSl9aWYoYS5zb3VyY2VSZXNvbHV0aW9uJiZhLnRhcmdldFJlc29sdXRpb24pe3ZhciBfPTE9PT11P2EudGFyZ2V0UmVzb2x1dGlvbjphLnNvdXJjZVJlc29sdXRpb24rdSooYS50YXJnZXRSZXNvbHV0aW9uLWEuc291cmNlUmVzb2x1dGlvbik7YS5hbmNob3ImJnRoaXMuc2V0KFVuLHRoaXMuY2FsY3VsYXRlQ2VudGVyWm9vbShfLGEuYW5jaG9yKSksdGhpcy5zZXQoWW4sXyl9aWYodm9pZCAwIT09YS5zb3VyY2VSb3RhdGlvbiYmdm9pZCAwIT09YS50YXJnZXRSb3RhdGlvbil7dmFyIGc9MT09PXU/WHQoYS50YXJnZXRSb3RhdGlvbitNYXRoLlBJLDIqTWF0aC5QSSktTWF0aC5QSTphLnNvdXJjZVJvdGF0aW9uK3UqKGEudGFyZ2V0Um90YXRpb24tYS5zb3VyY2VSb3RhdGlvbik7YS5hbmNob3ImJnRoaXMuc2V0KFVuLHRoaXMuY2FsY3VsYXRlQ2VudGVyUm90YXRlKGcsYS5hbmNob3IpKSx0aGlzLnNldChCbixnKX1pZihlPSEwLCFhLmNvbXBsZXRlKWJyZWFrfX1pZihuKXt0aGlzLmFuaW1hdGlvbnNfW2ldPW51bGwsdGhpcy5zZXRIaW50KGtuLC0xKTt2YXIgeT1yWzBdLmNhbGxiYWNrO3kmJkhuKHksITApfX10aGlzLmFuaW1hdGlvbnNfPXRoaXMuYW5pbWF0aW9uc18uZmlsdGVyKEJvb2xlYW4pLGUmJnZvaWQgMD09PXRoaXMudXBkYXRlQW5pbWF0aW9uS2V5XyYmKHRoaXMudXBkYXRlQW5pbWF0aW9uS2V5Xz1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy51cGRhdGVBbmltYXRpb25zXykpfX0sZS5wcm90b3R5cGUuY2FsY3VsYXRlQ2VudGVyUm90YXRlPWZ1bmN0aW9uKHQsZSl7dmFyIGkscj10aGlzLmdldENlbnRlcigpO3JldHVybiB2b2lkIDAhPT1yJiYoJGkoaT1bclswXS1lWzBdLHJbMV0tZVsxXV0sdC10aGlzLmdldFJvdGF0aW9uKCkpLEhpKGksZSkpLGl9LGUucHJvdG90eXBlLmNhbGN1bGF0ZUNlbnRlclpvb209ZnVuY3Rpb24odCxlKXt2YXIgaSxyPXRoaXMuZ2V0Q2VudGVyKCksbj10aGlzLmdldFJlc29sdXRpb24oKTt2b2lkIDAhPT1yJiZ2b2lkIDAhPT1uJiYoaT1bZVswXS10KihlWzBdLXJbMF0pL24sZVsxXS10KihlWzFdLXJbMV0pL25dKTtyZXR1cm4gaX0sZS5wcm90b3R5cGUuZ2V0U2l6ZUZyb21WaWV3cG9ydF89ZnVuY3Rpb24oKXt2YXIgdD1bMTAwLDEwMF0sZT0nLm9sLXZpZXdwb3J0W2RhdGEtdmlldz0iJytvKHRoaXMpKyciXScsaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpO2lmKGkpe3ZhciByPWdldENvbXB1dGVkU3R5bGUoaSk7dFswXT1wYXJzZUludChyLndpZHRoLDEwKSx0WzFdPXBhcnNlSW50KHIuaGVpZ2h0LDEwKX1yZXR1cm4gdH0sZS5wcm90b3R5cGUuY29uc3RyYWluQ2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbnN0cmFpbnRzXy5jZW50ZXIodCl9LGUucHJvdG90eXBlLmNvbnN0cmFpblJlc29sdXRpb249ZnVuY3Rpb24odCxlLGkpe3ZhciByPWV8fDAsbj1pfHwwO3JldHVybiB0aGlzLmNvbnN0cmFpbnRzXy5yZXNvbHV0aW9uKHQscixuKX0sZS5wcm90b3R5cGUuY29uc3RyYWluUm90YXRpb249ZnVuY3Rpb24odCxlKXt2YXIgaT1lfHwwO3JldHVybiB0aGlzLmNvbnN0cmFpbnRzXy5yb3RhdGlvbih0LGkpfSxlLnByb3RvdHlwZS5nZXRDZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoVW4pfSxlLnByb3RvdHlwZS5nZXRDb25zdHJhaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cmFpbnRzX30sZS5wcm90b3R5cGUuZ2V0SGludHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQ/KHRbMF09dGhpcy5oaW50c19bMF0sdFsxXT10aGlzLmhpbnRzX1sxXSx0KTp0aGlzLmhpbnRzXy5zbGljZSgpfSxlLnByb3RvdHlwZS5jYWxjdWxhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dHx8dGhpcy5nZXRTaXplRnJvbVZpZXdwb3J0XygpLGk9dGhpcy5nZXRDZW50ZXIoKTtZKGksMSk7dmFyIHI9dGhpcy5nZXRSZXNvbHV0aW9uKCk7WSh2b2lkIDAhPT1yLDIpO3ZhciBuPXRoaXMuZ2V0Um90YXRpb24oKTtyZXR1cm4gWSh2b2lkIDAhPT1uLDMpLEN0KGkscixuLGUpfSxlLnByb3RvdHlwZS5nZXRNYXhSZXNvbHV0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4UmVzb2x1dGlvbl99LGUucHJvdG90eXBlLmdldE1pblJlc29sdXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5taW5SZXNvbHV0aW9uX30sZS5wcm90b3R5cGUuZ2V0TWF4Wm9vbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFpvb21Gb3JSZXNvbHV0aW9uKHRoaXMubWluUmVzb2x1dGlvbl8pfSxlLnByb3RvdHlwZS5zZXRNYXhab29tPWZ1bmN0aW9uKHQpe3RoaXMuYXBwbHlPcHRpb25zXyh0aGlzLmdldFVwZGF0ZWRPcHRpb25zXyh7bWF4Wm9vbTp0fSkpfSxlLnByb3RvdHlwZS5nZXRNaW5ab29tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Wm9vbUZvclJlc29sdXRpb24odGhpcy5tYXhSZXNvbHV0aW9uXyl9LGUucHJvdG90eXBlLnNldE1pblpvb209ZnVuY3Rpb24odCl7dGhpcy5hcHBseU9wdGlvbnNfKHRoaXMuZ2V0VXBkYXRlZE9wdGlvbnNfKHttaW5ab29tOnR9KSl9LGUucHJvdG90eXBlLmdldFByb2plY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uX30sZS5wcm90b3R5cGUuZ2V0UmVzb2x1dGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChZbil9LGUucHJvdG90eXBlLmdldFJlc29sdXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzb2x1dGlvbnNffSxlLnByb3RvdHlwZS5nZXRSZXNvbHV0aW9uRm9yRXh0ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZXx8dGhpcy5nZXRTaXplRnJvbVZpZXdwb3J0XygpLHI9T3QodCkvaVswXSxuPVJ0KHQpL2lbMV07cmV0dXJuIE1hdGgubWF4KHIsbil9LGUucHJvdG90eXBlLmdldFJlc29sdXRpb25Gb3JWYWx1ZUZ1bmN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXR8fDIsaT10aGlzLm1heFJlc29sdXRpb25fLHI9dGhpcy5taW5SZXNvbHV0aW9uXyxuPU1hdGgubG9nKGkvcikvTWF0aC5sb2coZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpL01hdGgucG93KGUsdCpuKX19LGUucHJvdG90eXBlLmdldFJvdGF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KEJuKX0sZS5wcm90b3R5cGUuZ2V0VmFsdWVGb3JSZXNvbHV0aW9uRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9dHx8MixpPXRoaXMubWF4UmVzb2x1dGlvbl8scj10aGlzLm1pblJlc29sdXRpb25fLG49TWF0aC5sb2coaS9yKS9NYXRoLmxvZyhlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubG9nKGkvdCkvTWF0aC5sb2coZSkvbn19LGUucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0Q2VudGVyKCksaT10aGlzLmdldFByb2plY3Rpb24oKSxyPXRoaXMuZ2V0UmVzb2x1dGlvbigpLG49ci90LG89dGhpcy5nZXRSb3RhdGlvbigpO3JldHVybntjZW50ZXI6W01hdGgucm91bmQoZVswXS9uKSpuLE1hdGgucm91bmQoZVsxXS9uKSpuXSxwcm9qZWN0aW9uOnZvaWQgMCE9PWk/aTpudWxsLHJlc29sdXRpb246cixyb3RhdGlvbjpvLHpvb206dGhpcy5nZXRab29tKCl9fSxlLnByb3RvdHlwZS5nZXRab29tPWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldFJlc29sdXRpb24oKTtyZXR1cm4gdm9pZCAwIT09ZSYmKHQ9dGhpcy5nZXRab29tRm9yUmVzb2x1dGlvbihlKSksdH0sZS5wcm90b3R5cGUuZ2V0Wm9vbUZvclJlc29sdXRpb249ZnVuY3Rpb24odCl7dmFyIGUsaSxyPXRoaXMubWluWm9vbV98fDA7aWYodGhpcy5yZXNvbHV0aW9uc18pe3ZhciBuPXoodGhpcy5yZXNvbHV0aW9uc18sdCwxKTtyPW4sZT10aGlzLnJlc29sdXRpb25zX1tuXSxpPW49PXRoaXMucmVzb2x1dGlvbnNfLmxlbmd0aC0xPzI6ZS90aGlzLnJlc29sdXRpb25zX1tuKzFdfWVsc2UgZT10aGlzLm1heFJlc29sdXRpb25fLGk9dGhpcy56b29tRmFjdG9yXztyZXR1cm4gcitNYXRoLmxvZyhlL3QpL01hdGgubG9nKGkpfSxlLnByb3RvdHlwZS5nZXRSZXNvbHV0aW9uRm9yWm9vbT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb25zdHJhaW5SZXNvbHV0aW9uKHRoaXMubWF4UmVzb2x1dGlvbl8sdC10aGlzLm1pblpvb21fLDApfSxlLnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxyPWV8fHt9LG49ci5zaXplO258fChuPXRoaXMuZ2V0U2l6ZUZyb21WaWV3cG9ydF8oKSksWShBcnJheS5pc0FycmF5KHQpfHwiZnVuY3Rpb24iPT10eXBlb2YgdC5nZXRTaW1wbGlmaWVkR2VvbWV0cnksMjQpLEFycmF5LmlzQXJyYXkodCk/KFkoIWJ0KHQpLDI1KSxpPU9pKHQpKTp0LmdldFR5cGUoKT09PU50LkNJUkNMRT8oaT1PaSh0PXQuZ2V0RXh0ZW50KCkpKS5yb3RhdGUodGhpcy5nZXRSb3RhdGlvbigpLFR0KHQpKTppPXQ7dmFyIG8scz12b2lkIDAhPT1yLnBhZGRpbmc/ci5wYWRkaW5nOlswLDAsMCwwXSxhPXZvaWQgMD09PXIuY29uc3RyYWluUmVzb2x1dGlvbnx8ci5jb25zdHJhaW5SZXNvbHV0aW9uLGg9dm9pZCAwIT09ci5uZWFyZXN0JiZyLm5lYXJlc3Q7bz12b2lkIDAhPT1yLm1pblJlc29sdXRpb24/ci5taW5SZXNvbHV0aW9uOnZvaWQgMCE9PXIubWF4Wm9vbT90aGlzLmNvbnN0cmFpblJlc29sdXRpb24odGhpcy5tYXhSZXNvbHV0aW9uXyxyLm1heFpvb20tdGhpcy5taW5ab29tXywwKTowO2Zvcih2YXIgbD1pLmdldEZsYXRDb29yZGluYXRlcygpLHU9dGhpcy5nZXRSb3RhdGlvbigpLHA9TWF0aC5jb3MoLXUpLGM9TWF0aC5zaW4oLXUpLGQ9MS8wLGY9MS8wLF89LTEvMCxnPS0xLzAseT1pLmdldFN0cmlkZSgpLHY9MCxtPWwubGVuZ3RoO3Y8bTt2Kz15KXt2YXIgeD1sW3ZdKnAtbFt2KzFdKmMsRT1sW3ZdKmMrbFt2KzFdKnA7ZD1NYXRoLm1pbihkLHgpLGY9TWF0aC5taW4oZixFKSxfPU1hdGgubWF4KF8seCksZz1NYXRoLm1heChnLEUpfXZhciBTPXRoaXMuZ2V0UmVzb2x1dGlvbkZvckV4dGVudChbZCxmLF8sZ10sW25bMF0tc1sxXS1zWzNdLG5bMV0tc1swXS1zWzJdXSk7aWYoUz1pc05hTihTKT9vOk1hdGgubWF4KFMsbyksYSl7dmFyIFQ9dGhpcy5jb25zdHJhaW5SZXNvbHV0aW9uKFMsMCwwKTshaCYmVDxTJiYoVD10aGlzLmNvbnN0cmFpblJlc29sdXRpb24oVCwtMSwwKSksUz1UfWM9LWM7dmFyIEM9KGQrXykvMixSPShmK2cpLzIsdz1bKEMrPShzWzFdLXNbM10pLzIqUykqcC0oUis9KHNbMF0tc1syXSkvMipTKSpjLFIqcCtDKmNdLEw9ci5jYWxsYmFjaz9yLmNhbGxiYWNrOkk7dm9pZCAwIT09ci5kdXJhdGlvbj90aGlzLmFuaW1hdGUoe3Jlc29sdXRpb246UyxjZW50ZXI6dyxkdXJhdGlvbjpyLmR1cmF0aW9uLGVhc2luZzpyLmVhc2luZ30sTCk6KHRoaXMuc2V0UmVzb2x1dGlvbihTKSx0aGlzLnNldENlbnRlcih3KSxIbihMLCEwKSl9LGUucHJvdG90eXBlLmNlbnRlck9uPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLmdldFJvdGF0aW9uKCksbj1NYXRoLmNvcygtciksbz1NYXRoLnNpbigtcikscz10WzBdKm4tdFsxXSpvLGE9dFsxXSpuK3RbMF0qbyxoPXRoaXMuZ2V0UmVzb2x1dGlvbigpLGw9KHMrPShlWzBdLzItaVswXSkqaCkqbi0oYSs9KGlbMV0tZVsxXS8yKSpoKSoobz0tbyksdT1hKm4rcypvO3RoaXMuc2V0Q2VudGVyKFtsLHVdKX0sZS5wcm90b3R5cGUuaXNEZWY9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuZ2V0Q2VudGVyKCkmJnZvaWQgMCE9PXRoaXMuZ2V0UmVzb2x1dGlvbigpfSxlLnByb3RvdHlwZS5yb3RhdGU9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lKXt2YXIgaT10aGlzLmNhbGN1bGF0ZUNlbnRlclJvdGF0ZSh0LGUpO3RoaXMuc2V0Q2VudGVyKGkpfXRoaXMuc2V0Um90YXRpb24odCl9LGUucHJvdG90eXBlLnNldENlbnRlcj1mdW5jdGlvbih0KXt0aGlzLnNldChVbix0KSx0aGlzLmdldEFuaW1hdGluZygpJiZ0aGlzLmNhbmNlbEFuaW1hdGlvbnMoKX0sZS5wcm90b3R5cGUuc2V0SGludD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmhpbnRzX1t0XSs9ZSx0aGlzLmNoYW5nZWQoKSx0aGlzLmhpbnRzX1t0XX0sZS5wcm90b3R5cGUuc2V0UmVzb2x1dGlvbj1mdW5jdGlvbih0KXt0aGlzLnNldChZbix0KSx0aGlzLmdldEFuaW1hdGluZygpJiZ0aGlzLmNhbmNlbEFuaW1hdGlvbnMoKX0sZS5wcm90b3R5cGUuc2V0Um90YXRpb249ZnVuY3Rpb24odCl7dGhpcy5zZXQoQm4sdCksdGhpcy5nZXRBbmltYXRpbmcoKSYmdGhpcy5jYW5jZWxBbmltYXRpb25zKCl9LGUucHJvdG90eXBlLnNldFpvb209ZnVuY3Rpb24odCl7dGhpcy5zZXRSZXNvbHV0aW9uKHRoaXMuZ2V0UmVzb2x1dGlvbkZvclpvb20odCkpfSxlfShEKTtmdW5jdGlvbiBKbih0LGUpe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3JldHVybiB0JiYoaS53aWR0aD10KSxlJiYoaS5oZWlnaHQ9ZSksaS5nZXRDb250ZXh0KCIyZCIpfWZ1bmN0aW9uIFFuKHQsZSl7dmFyIGk9ZS5wYXJlbnROb2RlO2kmJmkucmVwbGFjZUNoaWxkKHQsZSl9ZnVuY3Rpb24gJG4odCl7cmV0dXJuIHQmJnQucGFyZW50Tm9kZT90LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCk6bnVsbH1mdW5jdGlvbiB0byh0KXtmb3IoO3QubGFzdENoaWxkOyl0LnJlbW92ZUNoaWxkKHQubGFzdENoaWxkKX12YXIgZW89e09QQUNJVFk6Im9wYWNpdHkiLFZJU0lCTEU6InZpc2libGUiLEVYVEVOVDoiZXh0ZW50IixaX0lOREVYOiJ6SW5kZXgiLE1BWF9SRVNPTFVUSU9OOiJtYXhSZXNvbHV0aW9uIixNSU5fUkVTT0xVVElPTjoibWluUmVzb2x1dGlvbiIsU09VUkNFOiJzb3VyY2UifSxpbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKTt2YXIgaT11KHt9LGUpO2lbZW8uT1BBQ0lUWV09dm9pZCAwIT09ZS5vcGFjaXR5P2Uub3BhY2l0eToxLGlbZW8uVklTSUJMRV09dm9pZCAwPT09ZS52aXNpYmxlfHxlLnZpc2libGUsaVtlby5aX0lOREVYXT1lLnpJbmRleCxpW2VvLk1BWF9SRVNPTFVUSU9OXT12b2lkIDAhPT1lLm1heFJlc29sdXRpb24/ZS5tYXhSZXNvbHV0aW9uOjEvMCxpW2VvLk1JTl9SRVNPTFVUSU9OXT12b2lkIDAhPT1lLm1pblJlc29sdXRpb24/ZS5taW5SZXNvbHV0aW9uOjAsdGhpcy5zZXRQcm9wZXJ0aWVzKGkpLHRoaXMuc3RhdGVfPW51bGwsdGhpcy50eXBlfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX0sZS5wcm90b3R5cGUuZ2V0TGF5ZXJTdGF0ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RhdGVffHx7bGF5ZXI6dGhpcyxtYW5hZ2VkOiEwfTtyZXR1cm4gdC5vcGFjaXR5PWt0KHRoaXMuZ2V0T3BhY2l0eSgpLDAsMSksdC5zb3VyY2VTdGF0ZT10aGlzLmdldFNvdXJjZVN0YXRlKCksdC52aXNpYmxlPXRoaXMuZ2V0VmlzaWJsZSgpLHQuZXh0ZW50PXRoaXMuZ2V0RXh0ZW50KCksdC56SW5kZXg9dGhpcy5nZXRaSW5kZXgoKXx8MCx0Lm1heFJlc29sdXRpb249dGhpcy5nZXRNYXhSZXNvbHV0aW9uKCksdC5taW5SZXNvbHV0aW9uPU1hdGgubWF4KHRoaXMuZ2V0TWluUmVzb2x1dGlvbigpLDApLHRoaXMuc3RhdGVfPXQsdH0sZS5wcm90b3R5cGUuZ2V0TGF5ZXJzQXJyYXk9ZnVuY3Rpb24odCl7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUuZ2V0TGF5ZXJTdGF0ZXNBcnJheT1mdW5jdGlvbih0KXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS5nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoZW8uRVhURU5UKX0sZS5wcm90b3R5cGUuZ2V0TWF4UmVzb2x1dGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChlby5NQVhfUkVTT0xVVElPTil9LGUucHJvdG90eXBlLmdldE1pblJlc29sdXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoZW8uTUlOX1JFU09MVVRJT04pfSxlLnByb3RvdHlwZS5nZXRPcGFjaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KGVvLk9QQUNJVFkpfSxlLnByb3RvdHlwZS5nZXRTb3VyY2VTdGF0ZT1mdW5jdGlvbigpe3JldHVybiByKCl9LGUucHJvdG90eXBlLmdldFZpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoZW8uVklTSUJMRSl9LGUucHJvdG90eXBlLmdldFpJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChlby5aX0lOREVYKX0sZS5wcm90b3R5cGUuc2V0RXh0ZW50PWZ1bmN0aW9uKHQpe3RoaXMuc2V0KGVvLkVYVEVOVCx0KX0sZS5wcm90b3R5cGUuc2V0TWF4UmVzb2x1dGlvbj1mdW5jdGlvbih0KXt0aGlzLnNldChlby5NQVhfUkVTT0xVVElPTix0KX0sZS5wcm90b3R5cGUuc2V0TWluUmVzb2x1dGlvbj1mdW5jdGlvbih0KXt0aGlzLnNldChlby5NSU5fUkVTT0xVVElPTix0KX0sZS5wcm90b3R5cGUuc2V0T3BhY2l0eT1mdW5jdGlvbih0KXt0aGlzLnNldChlby5PUEFDSVRZLHQpfSxlLnByb3RvdHlwZS5zZXRWaXNpYmxlPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KGVvLlZJU0lCTEUsdCl9LGUucHJvdG90eXBlLnNldFpJbmRleD1mdW5jdGlvbih0KXt0aGlzLnNldChlby5aX0lOREVYLHQpfSxlfShEKSxybz17VU5ERUZJTkVEOiJ1bmRlZmluZWQiLExPQURJTkc6ImxvYWRpbmciLFJFQURZOiJyZWFkeSIsRVJST1I6ImVycm9yIn0sbm89e0xBWUVSUzoibGF5ZXJzIn0sb289ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fSxyPXUoe30saSk7ZGVsZXRlIHIubGF5ZXJzO3ZhciBuPWkubGF5ZXJzO3QuY2FsbCh0aGlzLHIpLHRoaXMubGF5ZXJzTGlzdGVuZXJLZXlzXz1bXSx0aGlzLmxpc3RlbmVyS2V5c189e30sdih0aGlzLEcobm8uTEFZRVJTKSx0aGlzLmhhbmRsZUxheWVyc0NoYW5nZWRfLHRoaXMpLG4/QXJyYXkuaXNBcnJheShuKT9uPW5ldyBVKG4uc2xpY2UoKSx7dW5pcXVlOiEwfSk6WSgiZnVuY3Rpb24iPT10eXBlb2Ygbi5nZXRBcnJheSw0Myk6bj1uZXcgVSh2b2lkIDAse3VuaXF1ZTohMH0pLHRoaXMuc2V0TGF5ZXJzKG4pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5oYW5kbGVMYXllckNoYW5nZV89ZnVuY3Rpb24oKXt0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuaGFuZGxlTGF5ZXJzQ2hhbmdlZF89ZnVuY3Rpb24oKXt0aGlzLmxheWVyc0xpc3RlbmVyS2V5c18uZm9yRWFjaChFKSx0aGlzLmxheWVyc0xpc3RlbmVyS2V5c18ubGVuZ3RoPTA7dmFyIHQ9dGhpcy5nZXRMYXllcnMoKTtmb3IodmFyIGUgaW4gdGhpcy5sYXllcnNMaXN0ZW5lcktleXNfLnB1c2godih0LGguQURELHRoaXMuaGFuZGxlTGF5ZXJzQWRkXyx0aGlzKSx2KHQsaC5SRU1PVkUsdGhpcy5oYW5kbGVMYXllcnNSZW1vdmVfLHRoaXMpKSx0aGlzLmxpc3RlbmVyS2V5c18pdGhpcy5saXN0ZW5lcktleXNfW2VdLmZvckVhY2goRSk7cCh0aGlzLmxpc3RlbmVyS2V5c18pO2Zvcih2YXIgaT10LmdldEFycmF5KCkscj0wLG49aS5sZW5ndGg7cjxuO3IrKyl7dmFyIHM9aVtyXTt0aGlzLmxpc3RlbmVyS2V5c19bbyhzKV09W3YocyxsLHRoaXMuaGFuZGxlTGF5ZXJDaGFuZ2VfLHRoaXMpLHYocyxNLkNIQU5HRSx0aGlzLmhhbmRsZUxheWVyQ2hhbmdlXyx0aGlzKV19dGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmhhbmRsZUxheWVyc0FkZF89ZnVuY3Rpb24odCl7dmFyIGU9dC5lbGVtZW50O3RoaXMubGlzdGVuZXJLZXlzX1tvKGUpXT1bdihlLGwsdGhpcy5oYW5kbGVMYXllckNoYW5nZV8sdGhpcyksdihlLE0uQ0hBTkdFLHRoaXMuaGFuZGxlTGF5ZXJDaGFuZ2VfLHRoaXMpXSx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuaGFuZGxlTGF5ZXJzUmVtb3ZlXz1mdW5jdGlvbih0KXt2YXIgZT1vKHQuZWxlbWVudCk7dGhpcy5saXN0ZW5lcktleXNfW2VdLmZvckVhY2goRSksZGVsZXRlIHRoaXMubGlzdGVuZXJLZXlzX1tlXSx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuZ2V0TGF5ZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KG5vLkxBWUVSUyl9LGUucHJvdG90eXBlLnNldExheWVycz1mdW5jdGlvbih0KXt0aGlzLnNldChuby5MQVlFUlMsdCl9LGUucHJvdG90eXBlLmdldExheWVyc0FycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMCE9PXQ/dDpbXTtyZXR1cm4gdGhpcy5nZXRMYXllcnMoKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZ2V0TGF5ZXJzQXJyYXkoZSl9KSxlfSxlLnByb3RvdHlwZS5nZXRMYXllclN0YXRlc0FycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMCE9PXQ/dDpbXSxpPWUubGVuZ3RoO3RoaXMuZ2V0TGF5ZXJzKCkuZm9yRWFjaChmdW5jdGlvbih0KXt0LmdldExheWVyU3RhdGVzQXJyYXkoZSl9KTtmb3IodmFyIHI9dGhpcy5nZXRMYXllclN0YXRlKCksbj1pLG89ZS5sZW5ndGg7bjxvO24rKyl7dmFyIHM9ZVtuXTtzLm9wYWNpdHkqPXIub3BhY2l0eSxzLnZpc2libGU9cy52aXNpYmxlJiZyLnZpc2libGUscy5tYXhSZXNvbHV0aW9uPU1hdGgubWluKHMubWF4UmVzb2x1dGlvbixyLm1heFJlc29sdXRpb24pLHMubWluUmVzb2x1dGlvbj1NYXRoLm1heChzLm1pblJlc29sdXRpb24sci5taW5SZXNvbHV0aW9uKSx2b2lkIDAhPT1yLmV4dGVudCYmKHZvaWQgMCE9PXMuZXh0ZW50P3MuZXh0ZW50PXd0KHMuZXh0ZW50LHIuZXh0ZW50KTpzLmV4dGVudD1yLmV4dGVudCl9cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldFNvdXJjZVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHJvLlJFQURZfSxlfShpbyk7ZnVuY3Rpb24gc28odCxlLGkpe3JldHVybiB2b2lkIDA9PT1pJiYoaT1bMCwwXSksaVswXT10WzBdKzIqZSxpWzFdPXRbMV0rMiplLGl9ZnVuY3Rpb24gYW8odCxlLGkpe3JldHVybiB2b2lkIDA9PT1pJiYoaT1bMCwwXSksaVswXT10WzBdKmUrLjV8MCxpWzFdPXRbMV0qZSsuNXwwLGl9ZnVuY3Rpb24gaG8odCxlKXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90Oih2b2lkIDA9PT1lP2U9W3QsdF06ZVswXT1lWzFdPXQsZSl9dmFyIGxvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpO3ZhciBpPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGw7dm9pZCAwIT09dC5rZXlib2FyZEV2ZW50VGFyZ2V0JiYoZT0ic3RyaW5nIj09dHlwZW9mIHQua2V5Ym9hcmRFdmVudFRhcmdldD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0LmtleWJvYXJkRXZlbnRUYXJnZXQpOnQua2V5Ym9hcmRFdmVudFRhcmdldCk7dmFyIGkscixuLG89e30scz10LmxheWVycyYmImZ1bmN0aW9uIj09dHlwZW9mIHQubGF5ZXJzLmdldExheWVycz90LmxheWVyczpuZXcgb28oe2xheWVyczp0LmxheWVyc30pO29bTG4uTEFZRVJHUk9VUF09cyxvW0xuLlRBUkdFVF09dC50YXJnZXQsb1tMbi5WSUVXXT12b2lkIDAhPT10LnZpZXc/dC52aWV3Om5ldyBxbix2b2lkIDAhPT10LmNvbnRyb2xzJiYoQXJyYXkuaXNBcnJheSh0LmNvbnRyb2xzKT9pPW5ldyBVKHQuY29udHJvbHMuc2xpY2UoKSk6KFkoImZ1bmN0aW9uIj09dHlwZW9mIHQuY29udHJvbHMuZ2V0QXJyYXksNDcpLGk9dC5jb250cm9scykpO3ZvaWQgMCE9PXQuaW50ZXJhY3Rpb25zJiYoQXJyYXkuaXNBcnJheSh0LmludGVyYWN0aW9ucyk/cj1uZXcgVSh0LmludGVyYWN0aW9ucy5zbGljZSgpKTooWSgiZnVuY3Rpb24iPT10eXBlb2YgdC5pbnRlcmFjdGlvbnMuZ2V0QXJyYXksNDgpLHI9dC5pbnRlcmFjdGlvbnMpKTt2b2lkIDAhPT10Lm92ZXJsYXlzP0FycmF5LmlzQXJyYXkodC5vdmVybGF5cyk/bj1uZXcgVSh0Lm92ZXJsYXlzLnNsaWNlKCkpOihZKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lm92ZXJsYXlzLmdldEFycmF5LDQ5KSxuPXQub3ZlcmxheXMpOm49bmV3IFU7cmV0dXJue2NvbnRyb2xzOmksaW50ZXJhY3Rpb25zOnIsa2V5Ym9hcmRFdmVudFRhcmdldDplLG92ZXJsYXlzOm4sdmFsdWVzOm99fShlKTt0aGlzLm1heFRpbGVzTG9hZGluZ189dm9pZCAwIT09ZS5tYXhUaWxlc0xvYWRpbmc/ZS5tYXhUaWxlc0xvYWRpbmc6MTYsdGhpcy5sb2FkVGlsZXNXaGlsZUFuaW1hdGluZ189dm9pZCAwIT09ZS5sb2FkVGlsZXNXaGlsZUFuaW1hdGluZyYmZS5sb2FkVGlsZXNXaGlsZUFuaW1hdGluZyx0aGlzLmxvYWRUaWxlc1doaWxlSW50ZXJhY3RpbmdfPXZvaWQgMCE9PWUubG9hZFRpbGVzV2hpbGVJbnRlcmFjdGluZyYmZS5sb2FkVGlsZXNXaGlsZUludGVyYWN0aW5nLHRoaXMucGl4ZWxSYXRpb189dm9pZCAwIT09ZS5waXhlbFJhdGlvP2UucGl4ZWxSYXRpbzpEaSx0aGlzLmFuaW1hdGlvbkRlbGF5S2V5Xyx0aGlzLmFuaW1hdGlvbkRlbGF5Xz1mdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uRGVsYXlLZXlfPXZvaWQgMCx0aGlzLnJlbmRlckZyYW1lXy5jYWxsKHRoaXMsRGF0ZS5ub3coKSl9LmJpbmQodGhpcyksdGhpcy5jb29yZGluYXRlVG9QaXhlbFRyYW5zZm9ybV89WzEsMCwwLDEsMCwwXSx0aGlzLnBpeGVsVG9Db29yZGluYXRlVHJhbnNmb3JtXz1bMSwwLDAsMSwwLDBdLHRoaXMuZnJhbWVJbmRleF89MCx0aGlzLmZyYW1lU3RhdGVfPW51bGwsdGhpcy5wcmV2aW91c0V4dGVudF89bnVsbCx0aGlzLnZpZXdQcm9wZXJ0eUxpc3RlbmVyS2V5Xz1udWxsLHRoaXMudmlld0NoYW5nZUxpc3RlbmVyS2V5Xz1udWxsLHRoaXMubGF5ZXJHcm91cFByb3BlcnR5TGlzdGVuZXJLZXlzXz1udWxsLHRoaXMudmlld3BvcnRfPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudmlld3BvcnRfLmNsYXNzTmFtZT0ib2wtdmlld3BvcnQiKyhVaT8iIG9sLXRvdWNoIjoiIiksdGhpcy52aWV3cG9ydF8uc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLnZpZXdwb3J0Xy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIix0aGlzLnZpZXdwb3J0Xy5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy52aWV3cG9ydF8uc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLnZpZXdwb3J0Xy5zdHlsZS5tc1RvdWNoQWN0aW9uPSJub25lIix0aGlzLnZpZXdwb3J0Xy5zdHlsZS50b3VjaEFjdGlvbj0ibm9uZSIsdGhpcy5vdmVybGF5Q29udGFpbmVyXz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLm92ZXJsYXlDb250YWluZXJfLmNsYXNzTmFtZT0ib2wtb3ZlcmxheWNvbnRhaW5lciIsdGhpcy52aWV3cG9ydF8uYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5Q29udGFpbmVyXyksdGhpcy5vdmVybGF5Q29udGFpbmVyU3RvcEV2ZW50Xz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLm92ZXJsYXlDb250YWluZXJTdG9wRXZlbnRfLmNsYXNzTmFtZT0ib2wtb3ZlcmxheWNvbnRhaW5lci1zdG9wZXZlbnQiO2Zvcih2YXIgcj1bTS5DTElDSyxNLkRCTENMSUNLLE0uTU9VU0VET1dOLE0uVE9VQ0hTVEFSVCxNLk1TUE9JTlRFUkRPV04sQXIuUE9JTlRFUkRPV04sTS5NT1VTRVdIRUVMLE0uV0hFRUxdLG49MCxvPXIubGVuZ3RoO248bzsrK24pdih0aGlzLm92ZXJsYXlDb250YWluZXJTdG9wRXZlbnRfLHJbbl0sTyk7Zm9yKHZhciBzIGluIHRoaXMudmlld3BvcnRfLmFwcGVuZENoaWxkKHRoaXMub3ZlcmxheUNvbnRhaW5lclN0b3BFdmVudF8pLHRoaXMubWFwQnJvd3NlckV2ZW50SGFuZGxlcl89bmV3IENuKHRoaXMsZS5tb3ZlVG9sZXJhbmNlKSxBcil2KHRoaXMubWFwQnJvd3NlckV2ZW50SGFuZGxlcl8sQXJbc10sdGhpcy5oYW5kbGVNYXBCcm93c2VyRXZlbnQsdGhpcyk7dGhpcy5rZXlib2FyZEV2ZW50VGFyZ2V0Xz1pLmtleWJvYXJkRXZlbnRUYXJnZXQsdGhpcy5rZXlIYW5kbGVyS2V5c189bnVsbCx2KHRoaXMudmlld3BvcnRfLE0uQ09OVEVYVE1FTlUsdGhpcy5oYW5kbGVCcm93c2VyRXZlbnQsdGhpcyksdih0aGlzLnZpZXdwb3J0XyxNLldIRUVMLHRoaXMuaGFuZGxlQnJvd3NlckV2ZW50LHRoaXMpLHYodGhpcy52aWV3cG9ydF8sTS5NT1VTRVdIRUVMLHRoaXMuaGFuZGxlQnJvd3NlckV2ZW50LHRoaXMpLHRoaXMuY29udHJvbHM9aS5jb250cm9sc3x8bmV3IFUsdGhpcy5pbnRlcmFjdGlvbnM9aS5pbnRlcmFjdGlvbnN8fG5ldyBVLHRoaXMub3ZlcmxheXNfPWkub3ZlcmxheXMsdGhpcy5vdmVybGF5SWRJbmRleF89e30sdGhpcy5yZW5kZXJlcl89dGhpcy5jcmVhdGVSZW5kZXJlcigpLHRoaXMuaGFuZGxlUmVzaXplXyx0aGlzLmZvY3VzXz1udWxsLHRoaXMucG9zdFJlbmRlckZ1bmN0aW9uc189W10sdGhpcy50aWxlUXVldWVfPW5ldyBNbih0aGlzLmdldFRpbGVQcmlvcml0eS5iaW5kKHRoaXMpLHRoaXMuaGFuZGxlVGlsZUNoYW5nZV8uYmluZCh0aGlzKSksdGhpcy5za2lwcGVkRmVhdHVyZVVpZHNfPXt9LHYodGhpcyxHKExuLkxBWUVSR1JPVVApLHRoaXMuaGFuZGxlTGF5ZXJHcm91cENoYW5nZWRfLHRoaXMpLHYodGhpcyxHKExuLlZJRVcpLHRoaXMuaGFuZGxlVmlld0NoYW5nZWRfLHRoaXMpLHYodGhpcyxHKExuLlNJWkUpLHRoaXMuaGFuZGxlU2l6ZUNoYW5nZWRfLHRoaXMpLHYodGhpcyxHKExuLlRBUkdFVCksdGhpcy5oYW5kbGVUYXJnZXRDaGFuZ2VkXyx0aGlzKSx0aGlzLnNldFByb3BlcnRpZXMoaS52YWx1ZXMpLHRoaXMuY29udHJvbHMuZm9yRWFjaChmdW5jdGlvbih0KXt0LnNldE1hcCh0aGlzKX0uYmluZCh0aGlzKSksdih0aGlzLmNvbnRyb2xzLGguQURELGZ1bmN0aW9uKHQpe3QuZWxlbWVudC5zZXRNYXAodGhpcyl9LHRoaXMpLHYodGhpcy5jb250cm9scyxoLlJFTU9WRSxmdW5jdGlvbih0KXt0LmVsZW1lbnQuc2V0TWFwKG51bGwpfSx0aGlzKSx0aGlzLmludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc2V0TWFwKHRoaXMpfS5iaW5kKHRoaXMpKSx2KHRoaXMuaW50ZXJhY3Rpb25zLGguQURELGZ1bmN0aW9uKHQpe3QuZWxlbWVudC5zZXRNYXAodGhpcyl9LHRoaXMpLHYodGhpcy5pbnRlcmFjdGlvbnMsaC5SRU1PVkUsZnVuY3Rpb24odCl7dC5lbGVtZW50LnNldE1hcChudWxsKX0sdGhpcyksdGhpcy5vdmVybGF5c18uZm9yRWFjaCh0aGlzLmFkZE92ZXJsYXlJbnRlcm5hbF8uYmluZCh0aGlzKSksdih0aGlzLm92ZXJsYXlzXyxoLkFERCxmdW5jdGlvbih0KXt0aGlzLmFkZE92ZXJsYXlJbnRlcm5hbF8odC5lbGVtZW50KX0sdGhpcyksdih0aGlzLm92ZXJsYXlzXyxoLlJFTU9WRSxmdW5jdGlvbih0KXt2YXIgZT10LmVsZW1lbnQuZ2V0SWQoKTt2b2lkIDAhPT1lJiZkZWxldGUgdGhpcy5vdmVybGF5SWRJbmRleF9bZS50b1N0cmluZygpXSx0LmVsZW1lbnQuc2V0TWFwKG51bGwpfSx0aGlzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY3JlYXRlUmVuZGVyZXI9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlVzZSBhIG1hcCB0eXBlIHRoYXQgaGFzIGEgY3JlYXRlUmVuZGVyZXIgbWV0aG9kIil9LGUucHJvdG90eXBlLmFkZENvbnRyb2w9ZnVuY3Rpb24odCl7dGhpcy5nZXRDb250cm9scygpLnB1c2godCl9LGUucHJvdG90eXBlLmFkZEludGVyYWN0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuZ2V0SW50ZXJhY3Rpb25zKCkucHVzaCh0KX0sZS5wcm90b3R5cGUuYWRkTGF5ZXI9ZnVuY3Rpb24odCl7dGhpcy5nZXRMYXllckdyb3VwKCkuZ2V0TGF5ZXJzKCkucHVzaCh0KX0sZS5wcm90b3R5cGUuYWRkT3ZlcmxheT1mdW5jdGlvbih0KXt0aGlzLmdldE92ZXJsYXlzKCkucHVzaCh0KX0sZS5wcm90b3R5cGUuYWRkT3ZlcmxheUludGVybmFsXz1mdW5jdGlvbih0KXt2YXIgZT10LmdldElkKCk7dm9pZCAwIT09ZSYmKHRoaXMub3ZlcmxheUlkSW5kZXhfW2UudG9TdHJpbmcoKV09dCksdC5zZXRNYXAodGhpcyl9LGUucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbD1mdW5jdGlvbigpe3RoaXMubWFwQnJvd3NlckV2ZW50SGFuZGxlcl8uZGlzcG9zZSgpLHgodGhpcy52aWV3cG9ydF8sTS5DT05URVhUTUVOVSx0aGlzLmhhbmRsZUJyb3dzZXJFdmVudCx0aGlzKSx4KHRoaXMudmlld3BvcnRfLE0uV0hFRUwsdGhpcy5oYW5kbGVCcm93c2VyRXZlbnQsdGhpcykseCh0aGlzLnZpZXdwb3J0XyxNLk1PVVNFV0hFRUwsdGhpcy5oYW5kbGVCcm93c2VyRXZlbnQsdGhpcyksdm9pZCAwIT09dGhpcy5oYW5kbGVSZXNpemVfJiYocmVtb3ZlRXZlbnRMaXN0ZW5lcihNLlJFU0laRSx0aGlzLmhhbmRsZVJlc2l6ZV8sITEpLHRoaXMuaGFuZGxlUmVzaXplXz12b2lkIDApLHRoaXMuYW5pbWF0aW9uRGVsYXlLZXlfJiYoY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRpb25EZWxheUtleV8pLHRoaXMuYW5pbWF0aW9uRGVsYXlLZXlfPXZvaWQgMCksdGhpcy5zZXRUYXJnZXQobnVsbCksdC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLmZvckVhY2hGZWF0dXJlQXRQaXhlbD1mdW5jdGlvbih0LGUsaSl7aWYodGhpcy5mcmFtZVN0YXRlXyl7dmFyIHI9dGhpcy5nZXRDb29yZGluYXRlRnJvbVBpeGVsKHQpLG49dm9pZCAwIT09KGk9dm9pZCAwIT09aT9pOnt9KS5oaXRUb2xlcmFuY2U/aS5oaXRUb2xlcmFuY2UqdGhpcy5mcmFtZVN0YXRlXy5waXhlbFJhdGlvOjAsbz12b2lkIDAhPT1pLmxheWVyRmlsdGVyP2kubGF5ZXJGaWx0ZXI6UjtyZXR1cm4gdGhpcy5yZW5kZXJlcl8uZm9yRWFjaEZlYXR1cmVBdENvb3JkaW5hdGUocix0aGlzLmZyYW1lU3RhdGVfLG4sZSxudWxsLG8sbnVsbCl9fSxlLnByb3RvdHlwZS5nZXRGZWF0dXJlc0F0UGl4ZWw9ZnVuY3Rpb24odCxlKXt2YXIgaT1udWxsO3JldHVybiB0aGlzLmZvckVhY2hGZWF0dXJlQXRQaXhlbCh0LGZ1bmN0aW9uKHQpe2l8fChpPVtdKSxpLnB1c2godCl9LGUpLGl9LGUucHJvdG90eXBlLmZvckVhY2hMYXllckF0UGl4ZWw9ZnVuY3Rpb24odCxlLGkpe2lmKHRoaXMuZnJhbWVTdGF0ZV8pe3ZhciByPWl8fHt9LG49dm9pZCAwIT09ci5oaXRUb2xlcmFuY2U/aS5oaXRUb2xlcmFuY2UqdGhpcy5mcmFtZVN0YXRlXy5waXhlbFJhdGlvOjAsbz1yLmxheWVyRmlsdGVyfHxSO3JldHVybiB0aGlzLnJlbmRlcmVyXy5mb3JFYWNoTGF5ZXJBdFBpeGVsKHQsdGhpcy5mcmFtZVN0YXRlXyxuLGUsbnVsbCxvLG51bGwpfX0sZS5wcm90b3R5cGUuaGFzRmVhdHVyZUF0UGl4ZWw9ZnVuY3Rpb24odCxlKXtpZighdGhpcy5mcmFtZVN0YXRlXylyZXR1cm4hMTt2YXIgaT10aGlzLmdldENvb3JkaW5hdGVGcm9tUGl4ZWwodCkscj12b2lkIDAhPT0oZT12b2lkIDAhPT1lP2U6e30pLmxheWVyRmlsdGVyP2UubGF5ZXJGaWx0ZXI6UixuPXZvaWQgMCE9PWUuaGl0VG9sZXJhbmNlP2UuaGl0VG9sZXJhbmNlKnRoaXMuZnJhbWVTdGF0ZV8ucGl4ZWxSYXRpbzowO3JldHVybiB0aGlzLnJlbmRlcmVyXy5oYXNGZWF0dXJlQXRDb29yZGluYXRlKGksdGhpcy5mcmFtZVN0YXRlXyxuLHIsbnVsbCl9LGUucHJvdG90eXBlLmdldEV2ZW50Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRDb29yZGluYXRlRnJvbVBpeGVsKHRoaXMuZ2V0RXZlbnRQaXhlbCh0KSl9LGUucHJvdG90eXBlLmdldEV2ZW50UGl4ZWw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aWV3cG9ydF8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaT0iY2hhbmdlZFRvdWNoZXMiaW4gdD90LmNoYW5nZWRUb3VjaGVzWzBdOnQ7cmV0dXJuW2kuY2xpZW50WC1lLmxlZnQsaS5jbGllbnRZLWUudG9wXX0sZS5wcm90b3R5cGUuZ2V0VGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KExuLlRBUkdFVCl9LGUucHJvdG90eXBlLmdldFRhcmdldEVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRhcmdldCgpO3JldHVybiB2b2lkIDAhPT10PyJzdHJpbmciPT10eXBlb2YgdD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTp0Om51bGx9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVGcm9tUGl4ZWw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mcmFtZVN0YXRlXztyZXR1cm4gZT9EZShlLnBpeGVsVG9Db29yZGluYXRlVHJhbnNmb3JtLHQuc2xpY2UoKSk6bnVsbH0sZS5wcm90b3R5cGUuZ2V0Q29udHJvbHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250cm9sc30sZS5wcm90b3R5cGUuZ2V0T3ZlcmxheXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdmVybGF5c199LGUucHJvdG90eXBlLmdldE92ZXJsYXlCeUlkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3ZlcmxheUlkSW5kZXhfW3QudG9TdHJpbmcoKV07cmV0dXJuIHZvaWQgMCE9PWU/ZTpudWxsfSxlLnByb3RvdHlwZS5nZXRJbnRlcmFjdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnRlcmFjdGlvbnN9LGUucHJvdG90eXBlLmdldExheWVyR3JvdXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoTG4uTEFZRVJHUk9VUCl9LGUucHJvdG90eXBlLmdldExheWVycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldExheWVyR3JvdXAoKS5nZXRMYXllcnMoKX0sZS5wcm90b3R5cGUuZ2V0UGl4ZWxGcm9tQ29vcmRpbmF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZyYW1lU3RhdGVfO3JldHVybiBlP0RlKGUuY29vcmRpbmF0ZVRvUGl4ZWxUcmFuc2Zvcm0sdC5zbGljZSgwLDIpKTpudWxsfSxlLnByb3RvdHlwZS5nZXRSZW5kZXJlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyX30sZS5wcm90b3R5cGUuZ2V0U2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChMbi5TSVpFKX0sZS5wcm90b3R5cGUuZ2V0Vmlldz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChMbi5WSUVXKX0sZS5wcm90b3R5cGUuZ2V0Vmlld3BvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3cG9ydF99LGUucHJvdG90eXBlLmdldE92ZXJsYXlDb250YWluZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdmVybGF5Q29udGFpbmVyX30sZS5wcm90b3R5cGUuZ2V0T3ZlcmxheUNvbnRhaW5lclN0b3BFdmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm92ZXJsYXlDb250YWluZXJTdG9wRXZlbnRffSxlLnByb3RvdHlwZS5nZXRUaWxlUHJpb3JpdHk9ZnVuY3Rpb24odCxlLGkscil7dmFyIG49dGhpcy5mcmFtZVN0YXRlXztpZighKG4mJmUgaW4gbi53YW50ZWRUaWxlcykpcmV0dXJuIDEvMDtpZighbi53YW50ZWRUaWxlc1tlXVt0LmdldEtleSgpXSlyZXR1cm4gMS8wO3ZhciBvPWlbMF0tbi5mb2N1c1swXSxzPWlbMV0tbi5mb2N1c1sxXTtyZXR1cm4gNjU1MzYqTWF0aC5sb2cocikrTWF0aC5zcXJ0KG8qbytzKnMpL3J9LGUucHJvdG90eXBlLmhhbmRsZUJyb3dzZXJFdmVudD1mdW5jdGlvbih0LGUpe3ZhciBpPWV8fHQudHlwZSxyPW5ldyBGcihpLHRoaXMsdCk7dGhpcy5oYW5kbGVNYXBCcm93c2VyRXZlbnQocil9LGUucHJvdG90eXBlLmhhbmRsZU1hcEJyb3dzZXJFdmVudD1mdW5jdGlvbih0KXtpZih0aGlzLmZyYW1lU3RhdGVfKXt0aGlzLmZvY3VzXz10LmNvb3JkaW5hdGUsdC5mcmFtZVN0YXRlPXRoaXMuZnJhbWVTdGF0ZV87dmFyIGU9dGhpcy5nZXRJbnRlcmFjdGlvbnMoKS5nZXRBcnJheSgpO2lmKCExIT09dGhpcy5kaXNwYXRjaEV2ZW50KHQpKWZvcih2YXIgaT1lLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgcj1lW2ldO2lmKHIuZ2V0QWN0aXZlKCkpaWYoIXIuaGFuZGxlRXZlbnQodCkpYnJlYWt9fX0sZS5wcm90b3R5cGUuaGFuZGxlUG9zdFJlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZnJhbWVTdGF0ZV8sZT10aGlzLnRpbGVRdWV1ZV87aWYoIWUuaXNFbXB0eSgpKXt2YXIgaT10aGlzLm1heFRpbGVzTG9hZGluZ18scj1pO2lmKHQpe3ZhciBuPXQudmlld0hpbnRzO25ba25dJiYoaT10aGlzLmxvYWRUaWxlc1doaWxlQW5pbWF0aW5nXz84OjAscj0yKSxuW2puXSYmKGk9dGhpcy5sb2FkVGlsZXNXaGlsZUludGVyYWN0aW5nXz84OjAscj0yKX1lLmdldFRpbGVzTG9hZGluZygpPGkmJihlLnJlcHJpb3JpdGl6ZSgpLGUubG9hZE1vcmVUaWxlcyhpLHIpKX0hdHx8IXRoaXMuaGFzTGlzdGVuZXIodXIuUkVOREVSQ09NUExFVEUpfHx0LmFuaW1hdGV8fHRoaXMudGlsZVF1ZXVlXy5nZXRUaWxlc0xvYWRpbmcoKXx8ZnVuY3Rpb24gdChlKXtmb3IodmFyIGk9MCxyPWUubGVuZ3RoO2k8cjsrK2kpe3ZhciBuPWVbaV07aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4uZ2V0TGF5ZXJzKXJldHVybiB0KG4uZ2V0TGF5ZXJzKCkuZ2V0QXJyYXkoKSk7dmFyIG89bi5nZXRTb3VyY2UoKTtpZihvJiZvLmxvYWRpbmcpcmV0dXJuITB9cmV0dXJuITF9KHRoaXMuZ2V0TGF5ZXJzKCkuZ2V0QXJyYXkoKSl8fHRoaXMucmVuZGVyZXJfLmRpc3BhdGNoUmVuZGVyRXZlbnQodXIuUkVOREVSQ09NUExFVEUsdCk7Zm9yKHZhciBvPXRoaXMucG9zdFJlbmRlckZ1bmN0aW9uc18scz0wLGE9by5sZW5ndGg7czxhOysrcylvW3NdKHRoaXMsdCk7by5sZW5ndGg9MH0sZS5wcm90b3R5cGUuaGFuZGxlU2l6ZUNoYW5nZWRfPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIoKX0sZS5wcm90b3R5cGUuaGFuZGxlVGFyZ2V0Q2hhbmdlZF89ZnVuY3Rpb24oKXt2YXIgdDtpZih0aGlzLmdldFRhcmdldCgpJiYodD10aGlzLmdldFRhcmdldEVsZW1lbnQoKSksdGhpcy5rZXlIYW5kbGVyS2V5c18pe2Zvcih2YXIgZT0wLGk9dGhpcy5rZXlIYW5kbGVyS2V5c18ubGVuZ3RoO2U8aTsrK2UpRSh0aGlzLmtleUhhbmRsZXJLZXlzX1tlXSk7dGhpcy5rZXlIYW5kbGVyS2V5c189bnVsbH1pZih0KXt0LmFwcGVuZENoaWxkKHRoaXMudmlld3BvcnRfKTt2YXIgcj10aGlzLmtleWJvYXJkRXZlbnRUYXJnZXRfP3RoaXMua2V5Ym9hcmRFdmVudFRhcmdldF86dDt0aGlzLmtleUhhbmRsZXJLZXlzXz1bdihyLE0uS0VZRE9XTix0aGlzLmhhbmRsZUJyb3dzZXJFdmVudCx0aGlzKSx2KHIsTS5LRVlQUkVTUyx0aGlzLmhhbmRsZUJyb3dzZXJFdmVudCx0aGlzKV0sdGhpcy5oYW5kbGVSZXNpemVffHwodGhpcy5oYW5kbGVSZXNpemVfPXRoaXMudXBkYXRlU2l6ZS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXIoTS5SRVNJWkUsdGhpcy5oYW5kbGVSZXNpemVfLCExKSl9ZWxzZSB0aGlzLnJlbmRlcmVyXy5yZW1vdmVMYXllclJlbmRlcmVycygpLCRuKHRoaXMudmlld3BvcnRfKSx2b2lkIDAhPT10aGlzLmhhbmRsZVJlc2l6ZV8mJihyZW1vdmVFdmVudExpc3RlbmVyKE0uUkVTSVpFLHRoaXMuaGFuZGxlUmVzaXplXywhMSksdGhpcy5oYW5kbGVSZXNpemVfPXZvaWQgMCk7dGhpcy51cGRhdGVTaXplKCl9LGUucHJvdG90eXBlLmhhbmRsZVRpbGVDaGFuZ2VfPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIoKX0sZS5wcm90b3R5cGUuaGFuZGxlVmlld1Byb3BlcnR5Q2hhbmdlZF89ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcigpfSxlLnByb3RvdHlwZS5oYW5kbGVWaWV3Q2hhbmdlZF89ZnVuY3Rpb24oKXt0aGlzLnZpZXdQcm9wZXJ0eUxpc3RlbmVyS2V5XyYmKEUodGhpcy52aWV3UHJvcGVydHlMaXN0ZW5lcktleV8pLHRoaXMudmlld1Byb3BlcnR5TGlzdGVuZXJLZXlfPW51bGwpLHRoaXMudmlld0NoYW5nZUxpc3RlbmVyS2V5XyYmKEUodGhpcy52aWV3Q2hhbmdlTGlzdGVuZXJLZXlfKSx0aGlzLnZpZXdDaGFuZ2VMaXN0ZW5lcktleV89bnVsbCk7dmFyIHQ9dGhpcy5nZXRWaWV3KCk7dCYmKHRoaXMudmlld3BvcnRfLnNldEF0dHJpYnV0ZSgiZGF0YS12aWV3IixvKHQpKSx0aGlzLnZpZXdQcm9wZXJ0eUxpc3RlbmVyS2V5Xz12KHQsbCx0aGlzLmhhbmRsZVZpZXdQcm9wZXJ0eUNoYW5nZWRfLHRoaXMpLHRoaXMudmlld0NoYW5nZUxpc3RlbmVyS2V5Xz12KHQsTS5DSEFOR0UsdGhpcy5oYW5kbGVWaWV3UHJvcGVydHlDaGFuZ2VkXyx0aGlzKSksdGhpcy5yZW5kZXIoKX0sZS5wcm90b3R5cGUuaGFuZGxlTGF5ZXJHcm91cENoYW5nZWRfPWZ1bmN0aW9uKCl7dGhpcy5sYXllckdyb3VwUHJvcGVydHlMaXN0ZW5lcktleXNfJiYodGhpcy5sYXllckdyb3VwUHJvcGVydHlMaXN0ZW5lcktleXNfLmZvckVhY2goRSksdGhpcy5sYXllckdyb3VwUHJvcGVydHlMaXN0ZW5lcktleXNfPW51bGwpO3ZhciB0PXRoaXMuZ2V0TGF5ZXJHcm91cCgpO3QmJih0aGlzLmxheWVyR3JvdXBQcm9wZXJ0eUxpc3RlbmVyS2V5c189W3YodCxsLHRoaXMucmVuZGVyLHRoaXMpLHYodCxNLkNIQU5HRSx0aGlzLnJlbmRlcix0aGlzKV0pLHRoaXMucmVuZGVyKCl9LGUucHJvdG90eXBlLmlzUmVuZGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuZnJhbWVTdGF0ZV99LGUucHJvdG90eXBlLnJlbmRlclN5bmM9ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkRlbGF5S2V5XyYmY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRpb25EZWxheUtleV8pLHRoaXMuYW5pbWF0aW9uRGVsYXlfKCl9LGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZvaWQgMD09PXRoaXMuYW5pbWF0aW9uRGVsYXlLZXlfJiYodGhpcy5hbmltYXRpb25EZWxheUtleV89cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRGVsYXlfKSl9LGUucHJvdG90eXBlLnJlbW92ZUNvbnRyb2w9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0Q29udHJvbHMoKS5yZW1vdmUodCl9LGUucHJvdG90eXBlLnJlbW92ZUludGVyYWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldEludGVyYWN0aW9ucygpLnJlbW92ZSh0KX0sZS5wcm90b3R5cGUucmVtb3ZlTGF5ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0TGF5ZXJHcm91cCgpLmdldExheWVycygpLnJlbW92ZSh0KX0sZS5wcm90b3R5cGUucmVtb3ZlT3ZlcmxheT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRPdmVybGF5cygpLnJlbW92ZSh0KX0sZS5wcm90b3R5cGUucmVuZGVyRnJhbWVfPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcy5nZXRTaXplKCkscj10aGlzLmdldFZpZXcoKSxuPVsxLzAsMS8wLC0xLzAsLTEvMF0scz10aGlzLmZyYW1lU3RhdGVfLGE9bnVsbDtpZih2b2lkIDAhPT1pJiZmdW5jdGlvbih0KXtyZXR1cm4gdFswXT4wJiZ0WzFdPjB9KGkpJiZyJiZyLmlzRGVmKCkpe2Zvcih2YXIgaD1yLmdldEhpbnRzKHRoaXMuZnJhbWVTdGF0ZV8/dGhpcy5mcmFtZVN0YXRlXy52aWV3SGludHM6dm9pZCAwKSxsPXRoaXMuZ2V0TGF5ZXJHcm91cCgpLmdldExheWVyU3RhdGVzQXJyYXkoKSx1PXt9LHA9MCxjPWwubGVuZ3RoO3A8YzsrK3ApdVtvKGxbcF0ubGF5ZXIpXT1sW3BdO2U9ci5nZXRTdGF0ZSh0aGlzLnBpeGVsUmF0aW9fKSxhPXthbmltYXRlOiExLGNvb3JkaW5hdGVUb1BpeGVsVHJhbnNmb3JtOnRoaXMuY29vcmRpbmF0ZVRvUGl4ZWxUcmFuc2Zvcm1fLGV4dGVudDpuLGZvY3VzOnRoaXMuZm9jdXNfP3RoaXMuZm9jdXNfOmUuY2VudGVyLGluZGV4OnRoaXMuZnJhbWVJbmRleF8rKyxsYXllclN0YXRlczp1LGxheWVyU3RhdGVzQXJyYXk6bCxwaXhlbFJhdGlvOnRoaXMucGl4ZWxSYXRpb18scGl4ZWxUb0Nvb3JkaW5hdGVUcmFuc2Zvcm06dGhpcy5waXhlbFRvQ29vcmRpbmF0ZVRyYW5zZm9ybV8scG9zdFJlbmRlckZ1bmN0aW9uczpbXSxzaXplOmksc2tpcHBlZEZlYXR1cmVVaWRzOnRoaXMuc2tpcHBlZEZlYXR1cmVVaWRzXyx0aWxlUXVldWU6dGhpcy50aWxlUXVldWVfLHRpbWU6dCx1c2VkVGlsZXM6e30sdmlld1N0YXRlOmUsdmlld0hpbnRzOmgsd2FudGVkVGlsZXM6e319fWlmKGEmJihhLmV4dGVudD1DdChlLmNlbnRlcixlLnJlc29sdXRpb24sZS5yb3RhdGlvbixhLnNpemUsbikpLHRoaXMuZnJhbWVTdGF0ZV89YSx0aGlzLnJlbmRlcmVyXy5yZW5kZXJGcmFtZShhKSxhKXtpZihhLmFuaW1hdGUmJnRoaXMucmVuZGVyKCksQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5wb3N0UmVuZGVyRnVuY3Rpb25zXyxhLnBvc3RSZW5kZXJGdW5jdGlvbnMpLHMpKCF0aGlzLnByZXZpb3VzRXh0ZW50X3x8IWJ0KHRoaXMucHJldmlvdXNFeHRlbnRfKSYmIWR0KGEuZXh0ZW50LHRoaXMucHJldmlvdXNFeHRlbnRfKSkmJih0aGlzLmRpc3BhdGNoRXZlbnQobmV3IE1yKHduLHRoaXMscykpLHRoaXMucHJldmlvdXNFeHRlbnRfPXV0KHRoaXMucHJldmlvdXNFeHRlbnRfKSk7dGhpcy5wcmV2aW91c0V4dGVudF8mJiFhLnZpZXdIaW50c1trbl0mJiFhLnZpZXdIaW50c1tqbl0mJiFkdChhLmV4dGVudCx0aGlzLnByZXZpb3VzRXh0ZW50XykmJih0aGlzLmRpc3BhdGNoRXZlbnQobmV3IE1yKEluLHRoaXMsYSkpLGl0KGEuZXh0ZW50LHRoaXMucHJldmlvdXNFeHRlbnRfKSl9dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBNcihSbix0aGlzLGEpKSxzZXRUaW1lb3V0KHRoaXMuaGFuZGxlUG9zdFJlbmRlci5iaW5kKHRoaXMpLDApfSxlLnByb3RvdHlwZS5zZXRMYXllckdyb3VwPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KExuLkxBWUVSR1JPVVAsdCl9LGUucHJvdG90eXBlLnNldFNpemU9ZnVuY3Rpb24odCl7dGhpcy5zZXQoTG4uU0laRSx0KX0sZS5wcm90b3R5cGUuc2V0VGFyZ2V0PWZ1bmN0aW9uKHQpe3RoaXMuc2V0KExuLlRBUkdFVCx0KX0sZS5wcm90b3R5cGUuc2V0Vmlldz1mdW5jdGlvbih0KXt0aGlzLnNldChMbi5WSUVXLHQpfSxlLnByb3RvdHlwZS5za2lwRmVhdHVyZT1mdW5jdGlvbih0KXt0aGlzLnNraXBwZWRGZWF0dXJlVWlkc19bbyh0KV09ITAsdGhpcy5yZW5kZXIoKX0sZS5wcm90b3R5cGUudXBkYXRlU2l6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0VGFyZ2V0RWxlbWVudCgpO2lmKHQpe3ZhciBlPWdldENvbXB1dGVkU3R5bGUodCk7dGhpcy5zZXRTaXplKFt0Lm9mZnNldFdpZHRoLXBhcnNlRmxvYXQoZS5ib3JkZXJMZWZ0V2lkdGgpLXBhcnNlRmxvYXQoZS5wYWRkaW5nTGVmdCktcGFyc2VGbG9hdChlLnBhZGRpbmdSaWdodCktcGFyc2VGbG9hdChlLmJvcmRlclJpZ2h0V2lkdGgpLHQub2Zmc2V0SGVpZ2h0LXBhcnNlRmxvYXQoZS5ib3JkZXJUb3BXaWR0aCktcGFyc2VGbG9hdChlLnBhZGRpbmdUb3ApLXBhcnNlRmxvYXQoZS5wYWRkaW5nQm90dG9tKS1wYXJzZUZsb2F0KGUuYm9yZGVyQm90dG9tV2lkdGgpXSl9ZWxzZSB0aGlzLnNldFNpemUodm9pZCAwKX0sZS5wcm90b3R5cGUudW5za2lwRmVhdHVyZT1mdW5jdGlvbih0KXtkZWxldGUgdGhpcy5za2lwcGVkRmVhdHVyZVVpZHNfW28odCldLHRoaXMucmVuZGVyKCl9LGV9KEQpO3ZhciB1bz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLmVsZW1lbnQ9ZS5lbGVtZW50P2UuZWxlbWVudDpudWxsLHRoaXMudGFyZ2V0Xz1udWxsLHRoaXMubWFwXz1udWxsLHRoaXMubGlzdGVuZXJLZXlzPVtdLHRoaXMucmVuZGVyPWUucmVuZGVyP2UucmVuZGVyOkksZS50YXJnZXQmJnRoaXMuc2V0VGFyZ2V0KGUudGFyZ2V0KX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsPWZ1bmN0aW9uKCl7JG4odGhpcy5lbGVtZW50KSx0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuZ2V0TWFwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwX30sZS5wcm90b3R5cGUuc2V0TWFwPWZ1bmN0aW9uKHQpe3RoaXMubWFwXyYmJG4odGhpcy5lbGVtZW50KTtmb3IodmFyIGU9MCxpPXRoaXMubGlzdGVuZXJLZXlzLmxlbmd0aDtlPGk7KytlKUUodGhpcy5saXN0ZW5lcktleXNbZV0pOyh0aGlzLmxpc3RlbmVyS2V5cy5sZW5ndGg9MCx0aGlzLm1hcF89dCx0aGlzLm1hcF8pJiYoKHRoaXMudGFyZ2V0Xz90aGlzLnRhcmdldF86dC5nZXRPdmVybGF5Q29udGFpbmVyU3RvcEV2ZW50KCkpLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5yZW5kZXIhPT1JJiZ0aGlzLmxpc3RlbmVyS2V5cy5wdXNoKHYodCxSbix0aGlzLnJlbmRlcix0aGlzKSksdC5yZW5kZXIoKSl9LGUucHJvdG90eXBlLnNldFRhcmdldD1mdW5jdGlvbih0KXt0aGlzLnRhcmdldF89InN0cmluZyI9PXR5cGVvZiB0P2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpOnR9LGV9KEQpLHBvPSJvbC1oaWRkZW4iLGNvPSJvbC1zZWxlY3RhYmxlIixmbz0ib2wtdW5zZWxlY3RhYmxlIixfbz0ib2wtdW5zdXBwb3J0ZWQiLGdvPSJvbC1jb250cm9sIix5bz0ib2wtY29sbGFwc2VkIix2bz1mdW5jdGlvbigpe3ZhciB0LGU9e307cmV0dXJuIGZ1bmN0aW9uKGkpe2lmKHR8fCh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlKSwhKGkgaW4gZSkpe3QuZm9udD1pO3ZhciByPXQuZm9udEZhbWlseTtpZih0LmZvbnQ9IiIsIXIpcmV0dXJuIG51bGw7ZVtpXT1yLnNwbGl0KC8sXHM/Lyl9cmV0dXJuIGVbaV19fSgpO2Z1bmN0aW9uIG1vKHQsZSl7cmV0dXJuIHQudmlzaWJsZSYmZT49dC5taW5SZXNvbHV0aW9uJiZlPHQubWF4UmVzb2x1dGlvbn12YXIgeG89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT11KHt9LGUpO2RlbGV0ZSBpLnNvdXJjZSx0LmNhbGwodGhpcyxpKSx0aGlzLm1hcFByZWNvbXBvc2VLZXlfPW51bGwsdGhpcy5tYXBSZW5kZXJLZXlfPW51bGwsdGhpcy5zb3VyY2VDaGFuZ2VLZXlfPW51bGwsZS5tYXAmJnRoaXMuc2V0TWFwKGUubWFwKSx2KHRoaXMsRyhlby5TT1VSQ0UpLHRoaXMuaGFuZGxlU291cmNlUHJvcGVydHlDaGFuZ2VfLHRoaXMpO3ZhciByPWUuc291cmNlP2Uuc291cmNlOm51bGw7dGhpcy5zZXRTb3VyY2Uocil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldExheWVyc0FycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPXR8fFtdO3JldHVybiBlLnB1c2godGhpcyksZX0sZS5wcm90b3R5cGUuZ2V0TGF5ZXJTdGF0ZXNBcnJheT1mdW5jdGlvbih0KXt2YXIgZT10fHxbXTtyZXR1cm4gZS5wdXNoKHRoaXMuZ2V0TGF5ZXJTdGF0ZSgpKSxlfSxlLnByb3RvdHlwZS5nZXRTb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoZW8uU09VUkNFKXx8bnVsbH0sZS5wcm90b3R5cGUuZ2V0U291cmNlU3RhdGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFNvdXJjZSgpO3JldHVybiB0P3QuZ2V0U3RhdGUoKTpyby5VTkRFRklORUR9LGUucHJvdG90eXBlLmhhbmRsZVNvdXJjZUNoYW5nZV89ZnVuY3Rpb24oKXt0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuaGFuZGxlU291cmNlUHJvcGVydHlDaGFuZ2VfPWZ1bmN0aW9uKCl7dGhpcy5zb3VyY2VDaGFuZ2VLZXlfJiYoRSh0aGlzLnNvdXJjZUNoYW5nZUtleV8pLHRoaXMuc291cmNlQ2hhbmdlS2V5Xz1udWxsKTt2YXIgdD10aGlzLmdldFNvdXJjZSgpO3QmJih0aGlzLnNvdXJjZUNoYW5nZUtleV89dih0LE0uQ0hBTkdFLHRoaXMuaGFuZGxlU291cmNlQ2hhbmdlXyx0aGlzKSksdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLnNldE1hcD1mdW5jdGlvbih0KXt0aGlzLm1hcFByZWNvbXBvc2VLZXlfJiYoRSh0aGlzLm1hcFByZWNvbXBvc2VLZXlfKSx0aGlzLm1hcFByZWNvbXBvc2VLZXlfPW51bGwpLHR8fHRoaXMuY2hhbmdlZCgpLHRoaXMubWFwUmVuZGVyS2V5XyYmKEUodGhpcy5tYXBSZW5kZXJLZXlfKSx0aGlzLm1hcFJlbmRlcktleV89bnVsbCksdCYmKHRoaXMubWFwUHJlY29tcG9zZUtleV89dih0LHVyLlBSRUNPTVBPU0UsZnVuY3Rpb24odCl7dmFyIGU9dCxpPXRoaXMuZ2V0TGF5ZXJTdGF0ZSgpO2kubWFuYWdlZD0hMSx2b2lkIDA9PT10aGlzLmdldFpJbmRleCgpJiYoaS56SW5kZXg9MS8wKSxlLmZyYW1lU3RhdGUubGF5ZXJTdGF0ZXNBcnJheS5wdXNoKGkpLGUuZnJhbWVTdGF0ZS5sYXllclN0YXRlc1tvKHRoaXMpXT1pfSx0aGlzKSx0aGlzLm1hcFJlbmRlcktleV89dih0aGlzLE0uQ0hBTkdFLHQucmVuZGVyLHQpLHRoaXMuY2hhbmdlZCgpKX0sZS5wcm90b3R5cGUuc2V0U291cmNlPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KGVvLlNPVVJDRSx0KX0sZX0oaW8pO2Z1bmN0aW9uIEVvKHQpe3RoaXMudXBkYXRlRWxlbWVudF8odC5mcmFtZVN0YXRlKX12YXIgU289ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fTt0LmNhbGwodGhpcyx7ZWxlbWVudDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyZW5kZXI6aS5yZW5kZXJ8fEVvLHRhcmdldDppLnRhcmdldH0pLHRoaXMudWxFbGVtZW50Xz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpLHRoaXMuY29sbGFwc2VkXz12b2lkIDA9PT1pLmNvbGxhcHNlZHx8aS5jb2xsYXBzZWQsdGhpcy5vdmVycmlkZUNvbGxhcHNpYmxlXz12b2lkIDAhPT1pLmNvbGxhcHNpYmxlLHRoaXMuY29sbGFwc2libGVfPXZvaWQgMD09PWkuY29sbGFwc2libGV8fGkuY29sbGFwc2libGUsdGhpcy5jb2xsYXBzaWJsZV98fCh0aGlzLmNvbGxhcHNlZF89ITEpO3ZhciByPXZvaWQgMCE9PWkuY2xhc3NOYW1lP2kuY2xhc3NOYW1lOiJvbC1hdHRyaWJ1dGlvbiIsbj12b2lkIDAhPT1pLnRpcExhYmVsP2kudGlwTGFiZWw6IkF0dHJpYnV0aW9ucyIsbz12b2lkIDAhPT1pLmNvbGxhcHNlTGFiZWw/aS5jb2xsYXBzZUxhYmVsOiLCuyI7InN0cmluZyI9PXR5cGVvZiBvPyh0aGlzLmNvbGxhcHNlTGFiZWxfPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSx0aGlzLmNvbGxhcHNlTGFiZWxfLnRleHRDb250ZW50PW8pOnRoaXMuY29sbGFwc2VMYWJlbF89bzt2YXIgcz12b2lkIDAhPT1pLmxhYmVsP2kubGFiZWw6ImkiOyJzdHJpbmciPT10eXBlb2Ygcz8odGhpcy5sYWJlbF89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpLHRoaXMubGFiZWxfLnRleHRDb250ZW50PXMpOnRoaXMubGFiZWxfPXM7dmFyIGE9dGhpcy5jb2xsYXBzaWJsZV8mJiF0aGlzLmNvbGxhcHNlZF8/dGhpcy5jb2xsYXBzZUxhYmVsXzp0aGlzLmxhYmVsXyxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO2guc2V0QXR0cmlidXRlKCJ0eXBlIiwiYnV0dG9uIiksaC50aXRsZT1uLGguYXBwZW5kQ2hpbGQoYSksdihoLE0uQ0xJQ0ssdGhpcy5oYW5kbGVDbGlja18sdGhpcyk7dmFyIGw9cisiICIrZm8rIiAiK2dvKyh0aGlzLmNvbGxhcHNlZF8mJnRoaXMuY29sbGFwc2libGVfPyIgIit5bzoiIikrKHRoaXMuY29sbGFwc2libGVfPyIiOiIgb2wtdW5jb2xsYXBzaWJsZSIpLHU9dGhpcy5lbGVtZW50O3UuY2xhc3NOYW1lPWwsdS5hcHBlbmRDaGlsZCh0aGlzLnVsRWxlbWVudF8pLHUuYXBwZW5kQ2hpbGQoaCksdGhpcy5yZW5kZXJlZEF0dHJpYnV0aW9uc189W10sdGhpcy5yZW5kZXJlZFZpc2libGVfPSEwfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5jb2xsZWN0U291cmNlQXR0cmlidXRpb25zXz1mdW5jdGlvbih0KXtmb3IodmFyIGU9e30saT1bXSxyPXQubGF5ZXJTdGF0ZXNBcnJheSxuPXQudmlld1N0YXRlLnJlc29sdXRpb24sbz0wLHM9ci5sZW5ndGg7bzxzOysrbyl7dmFyIGE9cltvXTtpZihtbyhhLG4pKXt2YXIgaD1hLmxheWVyLmdldFNvdXJjZSgpO2lmKGgpe3ZhciBsPWguZ2V0QXR0cmlidXRpb25zKCk7aWYobCl7dmFyIHU9bCh0KTtpZih1KWlmKHRoaXMub3ZlcnJpZGVDb2xsYXBzaWJsZV98fCExIT09aC5nZXRBdHRyaWJ1dGlvbnNDb2xsYXBzaWJsZSgpfHx0aGlzLnNldENvbGxhcHNpYmxlKCExKSxBcnJheS5pc0FycmF5KHUpKWZvcih2YXIgcD0wLGM9dS5sZW5ndGg7cDxjOysrcCl1W3BdaW4gZXx8KGkucHVzaCh1W3BdKSxlW3VbcF1dPSEwKTtlbHNlIHUgaW4gZXx8KGkucHVzaCh1KSxlW3VdPSEwKX19fX1yZXR1cm4gaX0sZS5wcm90b3R5cGUudXBkYXRlRWxlbWVudF89ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dGhpcy5jb2xsZWN0U291cmNlQXR0cmlidXRpb25zXyh0KSxpPWUubGVuZ3RoPjA7aWYodGhpcy5yZW5kZXJlZFZpc2libGVfIT1pJiYodGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXk9aT8iIjoibm9uZSIsdGhpcy5yZW5kZXJlZFZpc2libGVfPWkpLCFaKGUsdGhpcy5yZW5kZXJlZEF0dHJpYnV0aW9uc18pKXt0byh0aGlzLnVsRWxlbWVudF8pO2Zvcih2YXIgcj0wLG49ZS5sZW5ndGg7cjxuOysrcil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTtvLmlubmVySFRNTD1lW3JdLHRoaXMudWxFbGVtZW50Xy5hcHBlbmRDaGlsZChvKX10aGlzLnJlbmRlcmVkQXR0cmlidXRpb25zXz1lfX1lbHNlIHRoaXMucmVuZGVyZWRWaXNpYmxlXyYmKHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLnJlbmRlcmVkVmlzaWJsZV89ITEpfSxlLnByb3RvdHlwZS5oYW5kbGVDbGlja189ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuaGFuZGxlVG9nZ2xlXygpfSxlLnByb3RvdHlwZS5oYW5kbGVUb2dnbGVfPWZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoeW8pLHRoaXMuY29sbGFwc2VkXz9Rbih0aGlzLmNvbGxhcHNlTGFiZWxfLHRoaXMubGFiZWxfKTpRbih0aGlzLmxhYmVsXyx0aGlzLmNvbGxhcHNlTGFiZWxfKSx0aGlzLmNvbGxhcHNlZF89IXRoaXMuY29sbGFwc2VkX30sZS5wcm90b3R5cGUuZ2V0Q29sbGFwc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xsYXBzaWJsZV99LGUucHJvdG90eXBlLnNldENvbGxhcHNpYmxlPWZ1bmN0aW9uKHQpe3RoaXMuY29sbGFwc2libGVfIT09dCYmKHRoaXMuY29sbGFwc2libGVfPXQsdGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoIm9sLXVuY29sbGFwc2libGUiKSwhdCYmdGhpcy5jb2xsYXBzZWRfJiZ0aGlzLmhhbmRsZVRvZ2dsZV8oKSl9LGUucHJvdG90eXBlLnNldENvbGxhcHNlZD1mdW5jdGlvbih0KXt0aGlzLmNvbGxhcHNpYmxlXyYmdGhpcy5jb2xsYXBzZWRfIT09dCYmdGhpcy5oYW5kbGVUb2dnbGVfKCl9LGUucHJvdG90eXBlLmdldENvbGxhcHNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbGxhcHNlZF99LGV9KHVvKTtmdW5jdGlvbiBUbyh0KXt2YXIgZT10LmZyYW1lU3RhdGU7aWYoZSl7dmFyIGk9ZS52aWV3U3RhdGUucm90YXRpb247aWYoaSE9dGhpcy5yb3RhdGlvbl8pe3ZhciByPSJyb3RhdGUoIitpKyJyYWQpIjtpZih0aGlzLmF1dG9IaWRlXyl7dmFyIG49dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhwbyk7bnx8MCE9PWk/biYmMCE9PWkmJnRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHBvKTp0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChwbyl9dGhpcy5sYWJlbF8uc3R5bGUubXNUcmFuc2Zvcm09cix0aGlzLmxhYmVsXy5zdHlsZS53ZWJraXRUcmFuc2Zvcm09cix0aGlzLmxhYmVsXy5zdHlsZS50cmFuc2Zvcm09cn10aGlzLnJvdGF0aW9uXz1pfX12YXIgQ289ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fTt0LmNhbGwodGhpcyx7ZWxlbWVudDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyZW5kZXI6aS5yZW5kZXJ8fFRvLHRhcmdldDppLnRhcmdldH0pO3ZhciByPXZvaWQgMCE9PWkuY2xhc3NOYW1lP2kuY2xhc3NOYW1lOiJvbC1yb3RhdGUiLG49dm9pZCAwIT09aS5sYWJlbD9pLmxhYmVsOiLih6ciO3RoaXMubGFiZWxfPW51bGwsInN0cmluZyI9PXR5cGVvZiBuPyh0aGlzLmxhYmVsXz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIiksdGhpcy5sYWJlbF8uY2xhc3NOYW1lPSJvbC1jb21wYXNzIix0aGlzLmxhYmVsXy50ZXh0Q29udGVudD1uKToodGhpcy5sYWJlbF89bix0aGlzLmxhYmVsXy5jbGFzc0xpc3QuYWRkKCJvbC1jb21wYXNzIikpO3ZhciBvPWkudGlwTGFiZWw/aS50aXBMYWJlbDoiUmVzZXQgcm90YXRpb24iLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7cy5jbGFzc05hbWU9cisiLXJlc2V0IixzLnNldEF0dHJpYnV0ZSgidHlwZSIsImJ1dHRvbiIpLHMudGl0bGU9byxzLmFwcGVuZENoaWxkKHRoaXMubGFiZWxfKSx2KHMsTS5DTElDSyx0aGlzLmhhbmRsZUNsaWNrXyx0aGlzKTt2YXIgYT1yKyIgIitmbysiICIrZ28saD10aGlzLmVsZW1lbnQ7aC5jbGFzc05hbWU9YSxoLmFwcGVuZENoaWxkKHMpLHRoaXMuY2FsbFJlc2V0Tm9ydGhfPWkucmVzZXROb3J0aD9pLnJlc2V0Tm9ydGg6dm9pZCAwLHRoaXMuZHVyYXRpb25fPXZvaWQgMCE9PWkuZHVyYXRpb24/aS5kdXJhdGlvbjoyNTAsdGhpcy5hdXRvSGlkZV89dm9pZCAwPT09aS5hdXRvSGlkZXx8aS5hdXRvSGlkZSx0aGlzLnJvdGF0aW9uXz12b2lkIDAsdGhpcy5hdXRvSGlkZV8mJnRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKHBvKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2tfPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx2b2lkIDAhPT10aGlzLmNhbGxSZXNldE5vcnRoXz90aGlzLmNhbGxSZXNldE5vcnRoXygpOnRoaXMucmVzZXROb3J0aF8oKX0sZS5wcm90b3R5cGUucmVzZXROb3J0aF89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldE1hcCgpLmdldFZpZXcoKTt0JiZ2b2lkIDAhPT10LmdldFJvdGF0aW9uKCkmJih0aGlzLmR1cmF0aW9uXz4wP3QuYW5pbWF0ZSh7cm90YXRpb246MCxkdXJhdGlvbjp0aGlzLmR1cmF0aW9uXyxlYXNpbmc6WG59KTp0LnNldFJvdGF0aW9uKDApKX0sZX0odW8pLFJvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e307dC5jYWxsKHRoaXMse2VsZW1lbnQ6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGFyZ2V0OmkudGFyZ2V0fSk7dmFyIHI9dm9pZCAwIT09aS5jbGFzc05hbWU/aS5jbGFzc05hbWU6Im9sLXpvb20iLG49dm9pZCAwIT09aS5kZWx0YT9pLmRlbHRhOjEsbz12b2lkIDAhPT1pLnpvb21JbkxhYmVsP2kuem9vbUluTGFiZWw6IisiLHM9dm9pZCAwIT09aS56b29tT3V0TGFiZWw/aS56b29tT3V0TGFiZWw6IuKIkiIsYT12b2lkIDAhPT1pLnpvb21JblRpcExhYmVsP2kuem9vbUluVGlwTGFiZWw6Ilpvb20gaW4iLGg9dm9pZCAwIT09aS56b29tT3V0VGlwTGFiZWw/aS56b29tT3V0VGlwTGFiZWw6Ilpvb20gb3V0IixsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO2wuY2xhc3NOYW1lPXIrIi1pbiIsbC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJidXR0b24iKSxsLnRpdGxlPWEsbC5hcHBlbmRDaGlsZCgic3RyaW5nIj09dHlwZW9mIG8/ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobyk6byksdihsLE0uQ0xJQ0ssdGhpcy5oYW5kbGVDbGlja18uYmluZCh0aGlzLG4pKTt2YXIgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTt1LmNsYXNzTmFtZT1yKyItb3V0Iix1LnNldEF0dHJpYnV0ZSgidHlwZSIsImJ1dHRvbiIpLHUudGl0bGU9aCx1LmFwcGVuZENoaWxkKCJzdHJpbmciPT10eXBlb2Ygcz9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzKTpzKSx2KHUsTS5DTElDSyx0aGlzLmhhbmRsZUNsaWNrXy5iaW5kKHRoaXMsLW4pKTt2YXIgcD1yKyIgIitmbysiICIrZ28sYz10aGlzLmVsZW1lbnQ7Yy5jbGFzc05hbWU9cCxjLmFwcGVuZENoaWxkKGwpLGMuYXBwZW5kQ2hpbGQodSksdGhpcy5kdXJhdGlvbl89dm9pZCAwIT09aS5kdXJhdGlvbj9pLmR1cmF0aW9uOjI1MH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2tfPWZ1bmN0aW9uKHQsZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuem9vbUJ5RGVsdGFfKHQpfSxlLnByb3RvdHlwZS56b29tQnlEZWx0YV89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRNYXAoKS5nZXRWaWV3KCk7aWYoZSl7dmFyIGk9ZS5nZXRSZXNvbHV0aW9uKCk7aWYoaSl7dmFyIHI9ZS5jb25zdHJhaW5SZXNvbHV0aW9uKGksdCk7dGhpcy5kdXJhdGlvbl8+MD8oZS5nZXRBbmltYXRpbmcoKSYmZS5jYW5jZWxBbmltYXRpb25zKCksZS5hbmltYXRlKHtyZXNvbHV0aW9uOnIsZHVyYXRpb246dGhpcy5kdXJhdGlvbl8sZWFzaW5nOlhufSkpOmUuc2V0UmVzb2x1dGlvbihyKX19fSxlfSh1byk7ZnVuY3Rpb24gd28odCl7dmFyIGU9dHx8e30saT1uZXcgVTtyZXR1cm4odm9pZCAwPT09ZS56b29tfHxlLnpvb20pJiZpLnB1c2gobmV3IFJvKGUuem9vbU9wdGlvbnMpKSwodm9pZCAwPT09ZS5yb3RhdGV8fGUucm90YXRlKSYmaS5wdXNoKG5ldyBDbyhlLnJvdGF0ZU9wdGlvbnMpKSwodm9pZCAwPT09ZS5hdHRyaWJ1dGlvbnx8ZS5hdHRyaWJ1dGlvbikmJmkucHVzaChuZXcgU28oZS5hdHRyaWJ1dGlvbk9wdGlvbnMpKSxpfXZhciBJbz17QUNUSVZFOiJhY3RpdmUifTtmdW5jdGlvbiBMbyh0LGUsaSxyKXtPbyh0LGU9dC5jb25zdHJhaW5Sb3RhdGlvbihlLDApLGkscil9ZnVuY3Rpb24gT28odCxlLGkscil7aWYodm9pZCAwIT09ZSl7dmFyIG49dC5nZXRSb3RhdGlvbigpLG89dC5nZXRDZW50ZXIoKTt2b2lkIDAhPT1uJiZvJiZyPjA/dC5hbmltYXRlKHtyb3RhdGlvbjplLGFuY2hvcjppLGR1cmF0aW9uOnIsZWFzaW5nOlhufSk6dC5yb3RhdGUoZSxpKX19ZnVuY3Rpb24gUG8odCxlLGkscixuKXtNbyh0LGU9dC5jb25zdHJhaW5SZXNvbHV0aW9uKGUsMCxuKSxpLHIpfWZ1bmN0aW9uIGJvKHQsZSxpLHIpe3ZhciBuPXQuZ2V0UmVzb2x1dGlvbigpLG89dC5jb25zdHJhaW5SZXNvbHV0aW9uKG4sZSwwKTtpZih2b2lkIDAhPT1vKXt2YXIgcz10LmdldFJlc29sdXRpb25zKCk7bz1rdChvLHQuZ2V0TWluUmVzb2x1dGlvbigpfHxzW3MubGVuZ3RoLTFdLHQuZ2V0TWF4UmVzb2x1dGlvbigpfHxzWzBdKX1pZihpJiZ2b2lkIDAhPT1vJiZvIT09bil7dmFyIGE9dC5nZXRDZW50ZXIoKSxoPXQuY2FsY3VsYXRlQ2VudGVyWm9vbShvLGkpO2g9dC5jb25zdHJhaW5DZW50ZXIoaCksaT1bKG8qYVswXS1uKmhbMF0pLyhvLW4pLChvKmFbMV0tbipoWzFdKS8oby1uKV19TW8odCxvLGkscil9ZnVuY3Rpb24gTW8odCxlLGkscil7aWYoZSl7dmFyIG49dC5nZXRSZXNvbHV0aW9uKCksbz10LmdldENlbnRlcigpO2lmKHZvaWQgMCE9PW4mJm8mJmUhPT1uJiZyKXQuYW5pbWF0ZSh7cmVzb2x1dGlvbjplLGFuY2hvcjppLGR1cmF0aW9uOnIsZWFzaW5nOlhufSk7ZWxzZXtpZihpKXt2YXIgcz10LmNhbGN1bGF0ZUNlbnRlclpvb20oZSxpKTt0LnNldENlbnRlcihzKX10LnNldFJlc29sdXRpb24oZSl9fX12YXIgRm89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyksZS5oYW5kbGVFdmVudCYmKHRoaXMuaGFuZGxlRXZlbnQ9ZS5oYW5kbGVFdmVudCksdGhpcy5tYXBfPW51bGwsdGhpcy5zZXRBY3RpdmUoITApfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRBY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoSW8uQUNUSVZFKX0sZS5wcm90b3R5cGUuZ2V0TWFwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwX30sZS5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuITB9LGUucHJvdG90eXBlLnNldEFjdGl2ZT1mdW5jdGlvbih0KXt0aGlzLnNldChJby5BQ1RJVkUsdCl9LGUucHJvdG90eXBlLnNldE1hcD1mdW5jdGlvbih0KXt0aGlzLm1hcF89dH0sZX0oRCk7ZnVuY3Rpb24gQW8odCl7dmFyIGU9ITE7aWYodC50eXBlPT1Bci5EQkxDTElDSyl7dmFyIGk9dC5vcmlnaW5hbEV2ZW50LHI9dC5tYXAsbj10LmNvb3JkaW5hdGUsbz1pLnNoaWZ0S2V5Py10aGlzLmRlbHRhXzp0aGlzLmRlbHRhXztibyhyLmdldFZpZXcoKSxvLG4sdGhpcy5kdXJhdGlvbl8pLHQucHJldmVudERlZmF1bHQoKSxlPSEwfXJldHVybiFlfXZhciBObz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLHtoYW5kbGVFdmVudDpBb30pO3ZhciBpPWV8fHt9O3RoaXMuZGVsdGFfPWkuZGVsdGE/aS5kZWx0YToxLHRoaXMuZHVyYXRpb25fPXZvaWQgMCE9PWkuZHVyYXRpb24/aS5kdXJhdGlvbjoyNTB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEZvKSxHbz1mdW5jdGlvbih0KXt2YXIgZT10Lm9yaWdpbmFsRXZlbnQ7cmV0dXJuIGUuYWx0S2V5JiYhKGUubWV0YUtleXx8ZS5jdHJsS2V5KSYmIWUuc2hpZnRLZXl9LERvPWZ1bmN0aW9uKHQpe3ZhciBlPXQub3JpZ2luYWxFdmVudDtyZXR1cm4gZS5hbHRLZXkmJiEoZS5tZXRhS2V5fHxlLmN0cmxLZXkpJiZlLnNoaWZ0S2V5fSxrbz1mdW5jdGlvbih0KXtyZXR1cm4gdC50YXJnZXQuZ2V0VGFyZ2V0RWxlbWVudCgpPT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudH0sam89UixVbz1mdW5jdGlvbih0KXt2YXIgZT10Lm9yaWdpbmFsRXZlbnQ7cmV0dXJuIDA9PWUuYnV0dG9uJiYhKE5pJiZHaSYmZS5jdHJsS2V5KX0sWW89dyxCbz1mdW5jdGlvbih0KXtyZXR1cm4icG9pbnRlcm1vdmUiPT10LnR5cGV9LFZvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGU9PUFyLlNJTkdMRUNMSUNLfSxYbz1mdW5jdGlvbih0KXt2YXIgZT10Lm9yaWdpbmFsRXZlbnQ7cmV0dXJuIWUuYWx0S2V5JiYhKGUubWV0YUtleXx8ZS5jdHJsS2V5KSYmIWUuc2hpZnRLZXl9LHpvPWZ1bmN0aW9uKHQpe3ZhciBlPXQub3JpZ2luYWxFdmVudDtyZXR1cm4hZS5hbHRLZXkmJiEoZS5tZXRhS2V5fHxlLmN0cmxLZXkpJiZlLnNoaWZ0S2V5fSxXbz1mdW5jdGlvbih0KXt2YXIgZT10Lm9yaWdpbmFsRXZlbnQudGFyZ2V0LnRhZ05hbWU7cmV0dXJuIklOUFVUIiE9PWUmJiJTRUxFQ1QiIT09ZSYmIlRFWFRBUkVBIiE9PWV9LEtvPWZ1bmN0aW9uKHQpe3ZhciBlPXQucG9pbnRlckV2ZW50O3JldHVybiBZKHZvaWQgMCE9PWUsNTYpLCJtb3VzZSI9PWUucG9pbnRlclR5cGV9LEhvPWZ1bmN0aW9uKHQpe3ZhciBlPXQucG9pbnRlckV2ZW50O3JldHVybiBZKHZvaWQgMCE9PWUsNTYpLGUuaXNQcmltYXJ5JiYwPT09ZS5idXR0b259O2Z1bmN0aW9uIFpvKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxpPTAscj0wLG49MDtuPGU7bisrKWkrPXRbbl0uY2xpZW50WCxyKz10W25dLmNsaWVudFk7cmV0dXJuW2kvZSxyL2VdfXZhciBxbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9O3QuY2FsbCh0aGlzLGkpLGkuaGFuZGxlRG93bkV2ZW50JiYodGhpcy5oYW5kbGVEb3duRXZlbnQ9aS5oYW5kbGVEb3duRXZlbnQpLGkuaGFuZGxlRHJhZ0V2ZW50JiYodGhpcy5oYW5kbGVEcmFnRXZlbnQ9aS5oYW5kbGVEcmFnRXZlbnQpLGkuaGFuZGxlTW92ZUV2ZW50JiYodGhpcy5oYW5kbGVNb3ZlRXZlbnQ9aS5oYW5kbGVNb3ZlRXZlbnQpLGkuaGFuZGxlVXBFdmVudCYmKHRoaXMuaGFuZGxlVXBFdmVudD1pLmhhbmRsZVVwRXZlbnQpLGkuc3RvcERvd24mJih0aGlzLnN0b3BEb3duPWkuc3RvcERvd24pLHRoaXMuaGFuZGxpbmdEb3duVXBTZXF1ZW5jZT0hMSx0aGlzLnRyYWNrZWRQb2ludGVyc189e30sdGhpcy50YXJnZXRQb2ludGVycz1bXX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaGFuZGxlRG93bkV2ZW50PWZ1bmN0aW9uKHQpe3JldHVybiExfSxlLnByb3RvdHlwZS5oYW5kbGVEcmFnRXZlbnQ9ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbih0KXtpZighdC5wb2ludGVyRXZlbnQpcmV0dXJuITA7dmFyIGU9ITE7aWYodGhpcy51cGRhdGVUcmFja2VkUG9pbnRlcnNfKHQpLHRoaXMuaGFuZGxpbmdEb3duVXBTZXF1ZW5jZSl7aWYodC50eXBlPT1Bci5QT0lOVEVSRFJBRyl0aGlzLmhhbmRsZURyYWdFdmVudCh0KTtlbHNlIGlmKHQudHlwZT09QXIuUE9JTlRFUlVQKXt2YXIgaT10aGlzLmhhbmRsZVVwRXZlbnQodCk7dGhpcy5oYW5kbGluZ0Rvd25VcFNlcXVlbmNlPWkmJnRoaXMudGFyZ2V0UG9pbnRlcnMubGVuZ3RoPjB9fWVsc2UgaWYodC50eXBlPT1Bci5QT0lOVEVSRE9XTil7dmFyIHI9dGhpcy5oYW5kbGVEb3duRXZlbnQodCk7ciYmdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuaGFuZGxpbmdEb3duVXBTZXF1ZW5jZT1yLGU9dGhpcy5zdG9wRG93bihyKX1lbHNlIHQudHlwZT09QXIuUE9JTlRFUk1PVkUmJnRoaXMuaGFuZGxlTW92ZUV2ZW50KHQpO3JldHVybiFlfSxlLnByb3RvdHlwZS5oYW5kbGVNb3ZlRXZlbnQ9ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5oYW5kbGVVcEV2ZW50PWZ1bmN0aW9uKHQpe3JldHVybiExfSxlLnByb3RvdHlwZS5zdG9wRG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZS5wcm90b3R5cGUudXBkYXRlVHJhY2tlZFBvaW50ZXJzXz1mdW5jdGlvbih0KXtpZihmdW5jdGlvbih0KXt2YXIgZT10LnR5cGU7cmV0dXJuIGU9PT1Bci5QT0lOVEVSRE9XTnx8ZT09PUFyLlBPSU5URVJEUkFHfHxlPT09QXIuUE9JTlRFUlVQfSh0KSl7dmFyIGU9dC5wb2ludGVyRXZlbnQsaT1lLnBvaW50ZXJJZC50b1N0cmluZygpO3QudHlwZT09QXIuUE9JTlRFUlVQP2RlbGV0ZSB0aGlzLnRyYWNrZWRQb2ludGVyc19baV06dC50eXBlPT1Bci5QT0lOVEVSRE9XTj90aGlzLnRyYWNrZWRQb2ludGVyc19baV09ZTppIGluIHRoaXMudHJhY2tlZFBvaW50ZXJzXyYmKHRoaXMudHJhY2tlZFBvaW50ZXJzX1tpXT1lKSx0aGlzLnRhcmdldFBvaW50ZXJzPWModGhpcy50cmFja2VkUG9pbnRlcnNfKX19LGV9KEZvKSxKbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLHtzdG9wRG93bjp3fSk7dmFyIGk9ZXx8e307dGhpcy5raW5ldGljXz1pLmtpbmV0aWMsdGhpcy5sYXN0Q2VudHJvaWQ9bnVsbCx0aGlzLmxhc3RQb2ludGVyc0NvdW50Xyx0aGlzLnBhbm5pbmdfPSExLHRoaXMuY29uZGl0aW9uXz1pLmNvbmRpdGlvbj9pLmNvbmRpdGlvbjpYbyx0aGlzLm5vS2luZXRpY189ITF9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmhhbmRsZURyYWdFdmVudD1mdW5jdGlvbih0KXt0aGlzLnBhbm5pbmdffHwodGhpcy5wYW5uaW5nXz0hMCx0aGlzLmdldE1hcCgpLmdldFZpZXcoKS5zZXRIaW50KGpuLDEpKTt2YXIgZT10aGlzLnRhcmdldFBvaW50ZXJzLGk9Wm8oZSk7aWYoZS5sZW5ndGg9PXRoaXMubGFzdFBvaW50ZXJzQ291bnRfKXtpZih0aGlzLmtpbmV0aWNfJiZ0aGlzLmtpbmV0aWNfLnVwZGF0ZShpWzBdLGlbMV0pLHRoaXMubGFzdENlbnRyb2lkKXt2YXIgcj10aGlzLmxhc3RDZW50cm9pZFswXS1pWzBdLG49aVsxXS10aGlzLmxhc3RDZW50cm9pZFsxXSxvPXQubWFwLmdldFZpZXcoKSxzPVtyLG5dO3RyKHMsby5nZXRSZXNvbHV0aW9uKCkpLCRpKHMsby5nZXRSb3RhdGlvbigpKSxIaShzLG8uZ2V0Q2VudGVyKCkpLHM9by5jb25zdHJhaW5DZW50ZXIocyksby5zZXRDZW50ZXIocyl9fWVsc2UgdGhpcy5raW5ldGljXyYmdGhpcy5raW5ldGljXy5iZWdpbigpO3RoaXMubGFzdENlbnRyb2lkPWksdGhpcy5sYXN0UG9pbnRlcnNDb3VudF89ZS5sZW5ndGh9LGUucHJvdG90eXBlLmhhbmRsZVVwRXZlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXAsaT1lLmdldFZpZXcoKTtpZigwPT09dGhpcy50YXJnZXRQb2ludGVycy5sZW5ndGgpe2lmKCF0aGlzLm5vS2luZXRpY18mJnRoaXMua2luZXRpY18mJnRoaXMua2luZXRpY18uZW5kKCkpe3ZhciByPXRoaXMua2luZXRpY18uZ2V0RGlzdGFuY2UoKSxuPXRoaXMua2luZXRpY18uZ2V0QW5nbGUoKSxvPWkuZ2V0Q2VudGVyKCkscz1lLmdldFBpeGVsRnJvbUNvb3JkaW5hdGUobyksYT1lLmdldENvb3JkaW5hdGVGcm9tUGl4ZWwoW3NbMF0tcipNYXRoLmNvcyhuKSxzWzFdLXIqTWF0aC5zaW4obildKTtpLmFuaW1hdGUoe2NlbnRlcjppLmNvbnN0cmFpbkNlbnRlcihhKSxkdXJhdGlvbjo1MDAsZWFzaW5nOlhufSl9cmV0dXJuIHRoaXMucGFubmluZ18mJih0aGlzLnBhbm5pbmdfPSExLGkuc2V0SGludChqbiwtMSkpLCExfXJldHVybiB0aGlzLmtpbmV0aWNfJiZ0aGlzLmtpbmV0aWNfLmJlZ2luKCksdGhpcy5sYXN0Q2VudHJvaWQ9bnVsbCwhMH0sZS5wcm90b3R5cGUuaGFuZGxlRG93bkV2ZW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMudGFyZ2V0UG9pbnRlcnMubGVuZ3RoPjAmJnRoaXMuY29uZGl0aW9uXyh0KSl7dmFyIGU9dC5tYXAuZ2V0VmlldygpO3JldHVybiB0aGlzLmxhc3RDZW50cm9pZD1udWxsLGUuZ2V0QW5pbWF0aW5nKCkmJmUuc2V0Q2VudGVyKHQuZnJhbWVTdGF0ZS52aWV3U3RhdGUuY2VudGVyKSx0aGlzLmtpbmV0aWNfJiZ0aGlzLmtpbmV0aWNfLmJlZ2luKCksdGhpcy5ub0tpbmV0aWNfPXRoaXMudGFyZ2V0UG9pbnRlcnMubGVuZ3RoPjEsITB9cmV0dXJuITF9LGV9KHFvKSxRbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9O3QuY2FsbCh0aGlzLHtzdG9wRG93bjp3fSksdGhpcy5jb25kaXRpb25fPWkuY29uZGl0aW9uP2kuY29uZGl0aW9uOkRvLHRoaXMubGFzdEFuZ2xlXz12b2lkIDAsdGhpcy5kdXJhdGlvbl89dm9pZCAwIT09aS5kdXJhdGlvbj9pLmR1cmF0aW9uOjI1MH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaGFuZGxlRHJhZ0V2ZW50PWZ1bmN0aW9uKHQpe2lmKEtvKHQpKXt2YXIgZT10Lm1hcCxpPWUuZ2V0VmlldygpO2lmKGkuZ2V0Q29uc3RyYWludHMoKS5yb3RhdGlvbiE9PUduKXt2YXIgcj1lLmdldFNpemUoKSxuPXQucGl4ZWwsbz1NYXRoLmF0YW4yKHJbMV0vMi1uWzFdLG5bMF0tclswXS8yKTtpZih2b2lkIDAhPT10aGlzLmxhc3RBbmdsZV8pe3ZhciBzPW8tdGhpcy5sYXN0QW5nbGVfO09vKGksaS5nZXRSb3RhdGlvbigpLXMpfXRoaXMubGFzdEFuZ2xlXz1vfX19LGUucHJvdG90eXBlLmhhbmRsZVVwRXZlbnQ9ZnVuY3Rpb24odCl7aWYoIUtvKHQpKXJldHVybiEwO3ZhciBlPXQubWFwLmdldFZpZXcoKTtyZXR1cm4gZS5zZXRIaW50KGpuLC0xKSxMbyhlLGUuZ2V0Um90YXRpb24oKSx2b2lkIDAsdGhpcy5kdXJhdGlvbl8pLCExfSxlLnByb3RvdHlwZS5oYW5kbGVEb3duRXZlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuISFLbyh0KSYmKCEoIVVvKHQpfHwhdGhpcy5jb25kaXRpb25fKHQpKSYmKHQubWFwLmdldFZpZXcoKS5zZXRIaW50KGpuLDEpLHRoaXMubGFzdEFuZ2xlXz12b2lkIDAsITApKX0sZX0ocW8pLCRvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLHRoaXMuZ2VvbWV0cnlfPW51bGwsdGhpcy5lbGVtZW50Xz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnRfLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5lbGVtZW50Xy5jbGFzc05hbWU9Im9sLWJveCAiK2UsdGhpcy5tYXBfPW51bGwsdGhpcy5zdGFydFBpeGVsXz1udWxsLHRoaXMuZW5kUGl4ZWxfPW51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbD1mdW5jdGlvbigpe3RoaXMuc2V0TWFwKG51bGwpfSxlLnByb3RvdHlwZS5yZW5kZXJfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdGFydFBpeGVsXyxlPXRoaXMuZW5kUGl4ZWxfLGk9dGhpcy5lbGVtZW50Xy5zdHlsZTtpLmxlZnQ9TWF0aC5taW4odFswXSxlWzBdKSsicHgiLGkudG9wPU1hdGgubWluKHRbMV0sZVsxXSkrInB4IixpLndpZHRoPU1hdGguYWJzKGVbMF0tdFswXSkrInB4IixpLmhlaWdodD1NYXRoLmFicyhlWzFdLXRbMV0pKyJweCJ9LGUucHJvdG90eXBlLnNldE1hcD1mdW5jdGlvbih0KXtpZih0aGlzLm1hcF8pe3RoaXMubWFwXy5nZXRPdmVybGF5Q29udGFpbmVyKCkucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50Xyk7dmFyIGU9dGhpcy5lbGVtZW50Xy5zdHlsZTtlLmxlZnQ9ZS50b3A9ZS53aWR0aD1lLmhlaWdodD0iaW5oZXJpdCJ9dGhpcy5tYXBfPXQsdGhpcy5tYXBfJiZ0aGlzLm1hcF8uZ2V0T3ZlcmxheUNvbnRhaW5lcigpLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudF8pfSxlLnByb3RvdHlwZS5zZXRQaXhlbHM9ZnVuY3Rpb24odCxlKXt0aGlzLnN0YXJ0UGl4ZWxfPXQsdGhpcy5lbmRQaXhlbF89ZSx0aGlzLmNyZWF0ZU9yVXBkYXRlR2VvbWV0cnkoKSx0aGlzLnJlbmRlcl8oKX0sZS5wcm90b3R5cGUuY3JlYXRlT3JVcGRhdGVHZW9tZXRyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RhcnRQaXhlbF8sZT10aGlzLmVuZFBpeGVsXyxpPVt0LFt0WzBdLGVbMV1dLGUsW2VbMF0sdFsxXV1dLm1hcCh0aGlzLm1hcF8uZ2V0Q29vcmRpbmF0ZUZyb21QaXhlbCx0aGlzLm1hcF8pO2lbNF09aVswXS5zbGljZSgpLHRoaXMuZ2VvbWV0cnlfP3RoaXMuZ2VvbWV0cnlfLnNldENvb3JkaW5hdGVzKFtpXSk6dGhpcy5nZW9tZXRyeV89bmV3IElpKFtpXSl9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2VvbWV0cnlffSxlfShDKSx0cz0iYm94c3RhcnQiLGVzPSJib3hkcmFnIixpcz0iYm94ZW5kIixycz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXt0LmNhbGwodGhpcyxlKSx0aGlzLmNvb3JkaW5hdGU9aSx0aGlzLm1hcEJyb3dzZXJFdmVudD1yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShQKSxucz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKTt2YXIgaT1lfHx7fTt0aGlzLmJveF89bmV3ICRvKGkuY2xhc3NOYW1lfHwib2wtZHJhZ2JveCIpLHRoaXMubWluQXJlYV89dm9pZCAwIT09aS5taW5BcmVhP2kubWluQXJlYTo2NCx0aGlzLm9uQm94RW5kXz1pLm9uQm94RW5kP2kub25Cb3hFbmQ6SSx0aGlzLnN0YXJ0UGl4ZWxfPW51bGwsdGhpcy5jb25kaXRpb25fPWkuY29uZGl0aW9uP2kuY29uZGl0aW9uOmpvLHRoaXMuYm94RW5kQ29uZGl0aW9uXz1pLmJveEVuZENvbmRpdGlvbj9pLmJveEVuZENvbmRpdGlvbjp0aGlzLmRlZmF1bHRCb3hFbmRDb25kaXRpb259cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmRlZmF1bHRCb3hFbmRDb25kaXRpb249ZnVuY3Rpb24odCxlLGkpe3ZhciByPWlbMF0tZVswXSxuPWlbMV0tZVsxXTtyZXR1cm4gcipyK24qbj49dGhpcy5taW5BcmVhX30sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ib3hfLmdldEdlb21ldHJ5KCl9LGUucHJvdG90eXBlLmhhbmRsZURyYWdFdmVudD1mdW5jdGlvbih0KXtLbyh0KSYmKHRoaXMuYm94Xy5zZXRQaXhlbHModGhpcy5zdGFydFBpeGVsXyx0LnBpeGVsKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHJzKGVzLHQuY29vcmRpbmF0ZSx0KSkpfSxlLnByb3RvdHlwZS5oYW5kbGVVcEV2ZW50PWZ1bmN0aW9uKHQpe3JldHVybiFLbyh0KXx8KHRoaXMuYm94Xy5zZXRNYXAobnVsbCksdGhpcy5ib3hFbmRDb25kaXRpb25fKHQsdGhpcy5zdGFydFBpeGVsXyx0LnBpeGVsKSYmKHRoaXMub25Cb3hFbmRfKHQpLHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgcnMoaXMsdC5jb29yZGluYXRlLHQpKSksITEpfSxlLnByb3RvdHlwZS5oYW5kbGVEb3duRXZlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuISFLbyh0KSYmKCEoIVVvKHQpfHwhdGhpcy5jb25kaXRpb25fKHQpKSYmKHRoaXMuc3RhcnRQaXhlbF89dC5waXhlbCx0aGlzLmJveF8uc2V0TWFwKHQubWFwKSx0aGlzLmJveF8uc2V0UGl4ZWxzKHRoaXMuc3RhcnRQaXhlbF8sdGhpcy5zdGFydFBpeGVsXyksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBycyh0cyx0LmNvb3JkaW5hdGUsdCkpLCEwKSl9LGV9KHFvKTtmdW5jdGlvbiBvcygpe3ZhciB0PXRoaXMuZ2V0TWFwKCksZT10LmdldFZpZXcoKSxpPXQuZ2V0U2l6ZSgpLHI9dGhpcy5nZXRHZW9tZXRyeSgpLmdldEV4dGVudCgpO2lmKHRoaXMub3V0Xyl7dmFyIG49ZS5jYWxjdWxhdGVFeHRlbnQoaSksbz1mdW5jdGlvbih0LGUpe3JldHVybiBndCh1dChlKSx0KX0oW3QuZ2V0UGl4ZWxGcm9tQ29vcmRpbmF0ZShFdChyKSksdC5nZXRQaXhlbEZyb21Db29yZGluYXRlKEx0KHIpKV0pO010KG4sMS9lLmdldFJlc29sdXRpb25Gb3JFeHRlbnQobyxpKSkscj1ufXZhciBzPWUuY29uc3RyYWluUmVzb2x1dGlvbihlLmdldFJlc29sdXRpb25Gb3JFeHRlbnQocixpKSksYT1UdChyKTthPWUuY29uc3RyYWluQ2VudGVyKGEpLGUuYW5pbWF0ZSh7cmVzb2x1dGlvbjpzLGNlbnRlcjphLGR1cmF0aW9uOnRoaXMuZHVyYXRpb25fLGVhc2luZzpYbn0pfXZhciBzcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9LHI9aS5jb25kaXRpb24/aS5jb25kaXRpb246em87dC5jYWxsKHRoaXMse2NvbmRpdGlvbjpyLGNsYXNzTmFtZTppLmNsYXNzTmFtZXx8Im9sLWRyYWd6b29tIixvbkJveEVuZDpvc30pLHRoaXMuZHVyYXRpb25fPXZvaWQgMCE9PWkuZHVyYXRpb24/aS5kdXJhdGlvbjoyMDAsdGhpcy5vdXRfPXZvaWQgMCE9PWkub3V0JiZpLm91dH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0obnMpLGFzPXtMRUZUOjM3LFVQOjM4LFJJR0hUOjM5LERPV046NDB9O2Z1bmN0aW9uIGhzKHQpe3ZhciBlPSExO2lmKHQudHlwZT09TS5LRVlET1dOKXt2YXIgaT10Lm9yaWdpbmFsRXZlbnQua2V5Q29kZTtpZih0aGlzLmNvbmRpdGlvbl8odCkmJihpPT1hcy5ET1dOfHxpPT1hcy5MRUZUfHxpPT1hcy5SSUdIVHx8aT09YXMuVVApKXt2YXIgcj10Lm1hcC5nZXRWaWV3KCksbj1yLmdldFJlc29sdXRpb24oKSp0aGlzLnBpeGVsRGVsdGFfLG89MCxzPTA7aT09YXMuRE9XTj9zPS1uOmk9PWFzLkxFRlQ/bz0tbjppPT1hcy5SSUdIVD9vPW46cz1uO3ZhciBhPVtvLHNdOyRpKGEsci5nZXRSb3RhdGlvbigpKSxmdW5jdGlvbih0LGUsaSl7dmFyIHI9dC5nZXRDZW50ZXIoKTtpZihyKXt2YXIgbj10LmNvbnN0cmFpbkNlbnRlcihbclswXStlWzBdLHJbMV0rZVsxXV0pO2k/dC5hbmltYXRlKHtkdXJhdGlvbjppLGVhc2luZzpXbixjZW50ZXI6bn0pOnQuc2V0Q2VudGVyKG4pfX0ocixhLHRoaXMuZHVyYXRpb25fKSx0LnByZXZlbnREZWZhdWx0KCksZT0hMH19cmV0dXJuIWV9dmFyIGxzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMse2hhbmRsZUV2ZW50OmhzfSk7dmFyIGk9ZXx8e307dGhpcy5kZWZhdWx0Q29uZGl0aW9uXz1mdW5jdGlvbih0KXtyZXR1cm4gWG8odCkmJldvKHQpfSx0aGlzLmNvbmRpdGlvbl89dm9pZCAwIT09aS5jb25kaXRpb24/aS5jb25kaXRpb246dGhpcy5kZWZhdWx0Q29uZGl0aW9uXyx0aGlzLmR1cmF0aW9uXz12b2lkIDAhPT1pLmR1cmF0aW9uP2kuZHVyYXRpb246MTAwLHRoaXMucGl4ZWxEZWx0YV89dm9pZCAwIT09aS5waXhlbERlbHRhP2kucGl4ZWxEZWx0YToxMjh9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEZvKTtmdW5jdGlvbiB1cyh0KXt2YXIgZT0hMTtpZih0LnR5cGU9PU0uS0VZRE9XTnx8dC50eXBlPT1NLktFWVBSRVNTKXt2YXIgaT10Lm9yaWdpbmFsRXZlbnQuY2hhckNvZGU7aWYodGhpcy5jb25kaXRpb25fKHQpJiYoaT09IisiLmNoYXJDb2RlQXQoMCl8fGk9PSItIi5jaGFyQ29kZUF0KDApKSl7dmFyIHI9dC5tYXAsbj1pPT0iKyIuY2hhckNvZGVBdCgwKT90aGlzLmRlbHRhXzotdGhpcy5kZWx0YV87Ym8oci5nZXRWaWV3KCksbix2b2lkIDAsdGhpcy5kdXJhdGlvbl8pLHQucHJldmVudERlZmF1bHQoKSxlPSEwfX1yZXR1cm4hZX12YXIgcHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyx7aGFuZGxlRXZlbnQ6dXN9KTt2YXIgaT1lfHx7fTt0aGlzLmNvbmRpdGlvbl89aS5jb25kaXRpb24/aS5jb25kaXRpb246V28sdGhpcy5kZWx0YV89aS5kZWx0YT9pLmRlbHRhOjEsdGhpcy5kdXJhdGlvbl89dm9pZCAwIT09aS5kdXJhdGlvbj9pLmR1cmF0aW9uOjEwMH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oRm8pLGNzPSJ0cmFja3BhZCIsZHM9IndoZWVsIixmcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9O3QuY2FsbCh0aGlzLGkpLHRoaXMuZGVsdGFfPTAsdGhpcy5kdXJhdGlvbl89dm9pZCAwIT09aS5kdXJhdGlvbj9pLmR1cmF0aW9uOjI1MCx0aGlzLnRpbWVvdXRfPXZvaWQgMCE9PWkudGltZW91dD9pLnRpbWVvdXQ6ODAsdGhpcy51c2VBbmNob3JfPXZvaWQgMD09PWkudXNlQW5jaG9yfHxpLnVzZUFuY2hvcix0aGlzLmNvbnN0cmFpblJlc29sdXRpb25fPWkuY29uc3RyYWluUmVzb2x1dGlvbnx8ITEsdGhpcy5jb25kaXRpb25fPWkuY29uZGl0aW9uP2kuY29uZGl0aW9uOmpvLHRoaXMubGFzdEFuY2hvcl89bnVsbCx0aGlzLnN0YXJ0VGltZV89dm9pZCAwLHRoaXMudGltZW91dElkXyx0aGlzLm1vZGVfPXZvaWQgMCx0aGlzLnRyYWNrcGFkRXZlbnRHYXBfPTQwMCx0aGlzLnRyYWNrcGFkVGltZW91dElkXyx0aGlzLnRyYWNrcGFkRGVsdGFQZXJab29tXz0zMDAsdGhpcy50cmFja3BhZFpvb21CdWZmZXJfPTEuNX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZGVjcmVtZW50SW50ZXJhY3RpbmdIaW50Xz1mdW5jdGlvbigpe3RoaXMudHJhY2twYWRUaW1lb3V0SWRfPXZvaWQgMCx0aGlzLmdldE1hcCgpLmdldFZpZXcoKS5zZXRIaW50KGpuLC0xKX0sZS5wcm90b3R5cGUuaGFuZGxlRXZlbnQ9ZnVuY3Rpb24odCl7aWYoIXRoaXMuY29uZGl0aW9uXyh0KSlyZXR1cm4hMDt2YXIgZT10LnR5cGU7aWYoZSE9PU0uV0hFRUwmJmUhPT1NLk1PVVNFV0hFRUwpcmV0dXJuITA7dC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBpLHI9dC5tYXAsbj10Lm9yaWdpbmFsRXZlbnQ7aWYodGhpcy51c2VBbmNob3JfJiYodGhpcy5sYXN0QW5jaG9yXz10LmNvb3JkaW5hdGUpLHQudHlwZT09TS5XSEVFTD8oaT1uLmRlbHRhWSxGaSYmbi5kZWx0YU1vZGU9PT1XaGVlbEV2ZW50LkRPTV9ERUxUQV9QSVhFTCYmKGkvPURpKSxuLmRlbHRhTW9kZT09PVdoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkUmJihpKj00MCkpOnQudHlwZT09TS5NT1VTRVdIRUVMJiYoaT0tbi53aGVlbERlbHRhWSxBaSYmKGkvPTMpKSwwPT09aSlyZXR1cm4hMTt2YXIgbz1EYXRlLm5vdygpO2lmKHZvaWQgMD09PXRoaXMuc3RhcnRUaW1lXyYmKHRoaXMuc3RhcnRUaW1lXz1vKSwoIXRoaXMubW9kZV98fG8tdGhpcy5zdGFydFRpbWVfPnRoaXMudHJhY2twYWRFdmVudEdhcF8pJiYodGhpcy5tb2RlXz1NYXRoLmFicyhpKTw0P2NzOmRzKSx0aGlzLm1vZGVfPT09Y3Mpe3ZhciBzPXIuZ2V0VmlldygpO3RoaXMudHJhY2twYWRUaW1lb3V0SWRfP2NsZWFyVGltZW91dCh0aGlzLnRyYWNrcGFkVGltZW91dElkXyk6cy5zZXRIaW50KGpuLDEpLHRoaXMudHJhY2twYWRUaW1lb3V0SWRfPXNldFRpbWVvdXQodGhpcy5kZWNyZW1lbnRJbnRlcmFjdGluZ0hpbnRfLmJpbmQodGhpcyksdGhpcy50cmFja3BhZEV2ZW50R2FwXyk7dmFyIGE9cy5nZXRSZXNvbHV0aW9uKCkqTWF0aC5wb3coMixpL3RoaXMudHJhY2twYWREZWx0YVBlclpvb21fKSxoPXMuZ2V0TWluUmVzb2x1dGlvbigpLGw9cy5nZXRNYXhSZXNvbHV0aW9uKCksdT0wO2lmKGE8aD8oYT1NYXRoLm1heChhLGgvdGhpcy50cmFja3BhZFpvb21CdWZmZXJfKSx1PTEpOmE+bCYmKGE9TWF0aC5taW4oYSxsKnRoaXMudHJhY2twYWRab29tQnVmZmVyXyksdT0tMSksdGhpcy5sYXN0QW5jaG9yXyl7dmFyIHA9cy5jYWxjdWxhdGVDZW50ZXJab29tKGEsdGhpcy5sYXN0QW5jaG9yXyk7cy5zZXRDZW50ZXIocy5jb25zdHJhaW5DZW50ZXIocCkpfXJldHVybiBzLnNldFJlc29sdXRpb24oYSksMD09PXUmJnRoaXMuY29uc3RyYWluUmVzb2x1dGlvbl8mJnMuYW5pbWF0ZSh7cmVzb2x1dGlvbjpzLmNvbnN0cmFpblJlc29sdXRpb24oYSxpPjA/LTE6MSksZWFzaW5nOlhuLGFuY2hvcjp0aGlzLmxhc3RBbmNob3JfLGR1cmF0aW9uOnRoaXMuZHVyYXRpb25ffSksdT4wP3MuYW5pbWF0ZSh7cmVzb2x1dGlvbjpoLGVhc2luZzpYbixhbmNob3I6dGhpcy5sYXN0QW5jaG9yXyxkdXJhdGlvbjo1MDB9KTp1PDAmJnMuYW5pbWF0ZSh7cmVzb2x1dGlvbjpsLGVhc2luZzpYbixhbmNob3I6dGhpcy5sYXN0QW5jaG9yXyxkdXJhdGlvbjo1MDB9KSx0aGlzLnN0YXJ0VGltZV89bywhMX10aGlzLmRlbHRhXys9aTt2YXIgYz1NYXRoLm1heCh0aGlzLnRpbWVvdXRfLShvLXRoaXMuc3RhcnRUaW1lXyksMCk7cmV0dXJuIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZF8pLHRoaXMudGltZW91dElkXz1zZXRUaW1lb3V0KHRoaXMuaGFuZGxlV2hlZWxab29tXy5iaW5kKHRoaXMsciksYyksITF9LGUucHJvdG90eXBlLmhhbmRsZVdoZWVsWm9vbV89ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRWaWV3KCk7ZS5nZXRBbmltYXRpbmcoKSYmZS5jYW5jZWxBbmltYXRpb25zKCk7Ym8oZSwta3QodGhpcy5kZWx0YV8sLTEsMSksdGhpcy5sYXN0QW5jaG9yXyx0aGlzLmR1cmF0aW9uXyksdGhpcy5tb2RlXz12b2lkIDAsdGhpcy5kZWx0YV89MCx0aGlzLmxhc3RBbmNob3JfPW51bGwsdGhpcy5zdGFydFRpbWVfPXZvaWQgMCx0aGlzLnRpbWVvdXRJZF89dm9pZCAwfSxlLnByb3RvdHlwZS5zZXRNb3VzZUFuY2hvcj1mdW5jdGlvbih0KXt0aGlzLnVzZUFuY2hvcl89dCx0fHwodGhpcy5sYXN0QW5jaG9yXz1udWxsKX0sZX0oRm8pLF9zPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e30scj1pO3Iuc3RvcERvd258fChyLnN0b3BEb3duPXcpLHQuY2FsbCh0aGlzLHIpLHRoaXMuYW5jaG9yXz1udWxsLHRoaXMubGFzdEFuZ2xlXz12b2lkIDAsdGhpcy5yb3RhdGluZ189ITEsdGhpcy5yb3RhdGlvbkRlbHRhXz0wLHRoaXMudGhyZXNob2xkXz12b2lkIDAhPT1pLnRocmVzaG9sZD9pLnRocmVzaG9sZDouMyx0aGlzLmR1cmF0aW9uXz12b2lkIDAhPT1pLmR1cmF0aW9uP2kuZHVyYXRpb246MjUwfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5oYW5kbGVEcmFnRXZlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9MCxpPXRoaXMudGFyZ2V0UG9pbnRlcnNbMF0scj10aGlzLnRhcmdldFBvaW50ZXJzWzFdLG49TWF0aC5hdGFuMihyLmNsaWVudFktaS5jbGllbnRZLHIuY2xpZW50WC1pLmNsaWVudFgpO2lmKHZvaWQgMCE9PXRoaXMubGFzdEFuZ2xlXyl7dmFyIG89bi10aGlzLmxhc3RBbmdsZV87dGhpcy5yb3RhdGlvbkRlbHRhXys9bywhdGhpcy5yb3RhdGluZ18mJk1hdGguYWJzKHRoaXMucm90YXRpb25EZWx0YV8pPnRoaXMudGhyZXNob2xkXyYmKHRoaXMucm90YXRpbmdfPSEwKSxlPW99dGhpcy5sYXN0QW5nbGVfPW47dmFyIHM9dC5tYXAsYT1zLmdldFZpZXcoKTtpZihhLmdldENvbnN0cmFpbnRzKCkucm90YXRpb24hPT1Hbil7dmFyIGg9cy5nZXRWaWV3cG9ydCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGw9Wm8odGhpcy50YXJnZXRQb2ludGVycyk7aWYobFswXS09aC5sZWZ0LGxbMV0tPWgudG9wLHRoaXMuYW5jaG9yXz1zLmdldENvb3JkaW5hdGVGcm9tUGl4ZWwobCksdGhpcy5yb3RhdGluZ18pe3ZhciB1PWEuZ2V0Um90YXRpb24oKTtzLnJlbmRlcigpLE9vKGEsdStlLHRoaXMuYW5jaG9yXyl9fX0sZS5wcm90b3R5cGUuaGFuZGxlVXBFdmVudD1mdW5jdGlvbih0KXtpZih0aGlzLnRhcmdldFBvaW50ZXJzLmxlbmd0aDwyKXt2YXIgZT10Lm1hcC5nZXRWaWV3KCk7aWYoZS5zZXRIaW50KGpuLC0xKSx0aGlzLnJvdGF0aW5nXylMbyhlLGUuZ2V0Um90YXRpb24oKSx0aGlzLmFuY2hvcl8sdGhpcy5kdXJhdGlvbl8pO3JldHVybiExfXJldHVybiEwfSxlLnByb3RvdHlwZS5oYW5kbGVEb3duRXZlbnQ9ZnVuY3Rpb24odCl7aWYodGhpcy50YXJnZXRQb2ludGVycy5sZW5ndGg+PTIpe3ZhciBlPXQubWFwO3JldHVybiB0aGlzLmFuY2hvcl89bnVsbCx0aGlzLmxhc3RBbmdsZV89dm9pZCAwLHRoaXMucm90YXRpbmdfPSExLHRoaXMucm90YXRpb25EZWx0YV89MCx0aGlzLmhhbmRsaW5nRG93blVwU2VxdWVuY2V8fGUuZ2V0VmlldygpLnNldEhpbnQoam4sMSksITB9cmV0dXJuITF9LGV9KHFvKSxncz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9LHI9aTtyLnN0b3BEb3dufHwoci5zdG9wRG93bj13KSx0LmNhbGwodGhpcyxyKSx0aGlzLmNvbnN0cmFpblJlc29sdXRpb25fPWkuY29uc3RyYWluUmVzb2x1dGlvbnx8ITEsdGhpcy5hbmNob3JfPW51bGwsdGhpcy5kdXJhdGlvbl89dm9pZCAwIT09aS5kdXJhdGlvbj9pLmR1cmF0aW9uOjQwMCx0aGlzLmxhc3REaXN0YW5jZV89dm9pZCAwLHRoaXMubGFzdFNjYWxlRGVsdGFfPTF9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmhhbmRsZURyYWdFdmVudD1mdW5jdGlvbih0KXt2YXIgZT0xLGk9dGhpcy50YXJnZXRQb2ludGVyc1swXSxyPXRoaXMudGFyZ2V0UG9pbnRlcnNbMV0sbj1pLmNsaWVudFgtci5jbGllbnRYLG89aS5jbGllbnRZLXIuY2xpZW50WSxzPU1hdGguc3FydChuKm4rbypvKTt2b2lkIDAhPT10aGlzLmxhc3REaXN0YW5jZV8mJihlPXRoaXMubGFzdERpc3RhbmNlXy9zKSx0aGlzLmxhc3REaXN0YW5jZV89czt2YXIgYT10Lm1hcCxoPWEuZ2V0VmlldygpLGw9aC5nZXRSZXNvbHV0aW9uKCksdT1oLmdldE1heFJlc29sdXRpb24oKSxwPWguZ2V0TWluUmVzb2x1dGlvbigpLGM9bCplO2M+dT8oZT11L2wsYz11KTpjPHAmJihlPXAvbCxjPXApLDEhPWUmJih0aGlzLmxhc3RTY2FsZURlbHRhXz1lKTt2YXIgZD1hLmdldFZpZXdwb3J0KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZj1abyh0aGlzLnRhcmdldFBvaW50ZXJzKTtmWzBdLT1kLmxlZnQsZlsxXS09ZC50b3AsdGhpcy5hbmNob3JfPWEuZ2V0Q29vcmRpbmF0ZUZyb21QaXhlbChmKSxhLnJlbmRlcigpLE1vKGgsYyx0aGlzLmFuY2hvcl8pfSxlLnByb3RvdHlwZS5oYW5kbGVVcEV2ZW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMudGFyZ2V0UG9pbnRlcnMubGVuZ3RoPDIpe3ZhciBlPXQubWFwLmdldFZpZXcoKTtlLnNldEhpbnQoam4sLTEpO3ZhciBpPWUuZ2V0UmVzb2x1dGlvbigpO2lmKHRoaXMuY29uc3RyYWluUmVzb2x1dGlvbl98fGk8ZS5nZXRNaW5SZXNvbHV0aW9uKCl8fGk+ZS5nZXRNYXhSZXNvbHV0aW9uKCkpe3ZhciByPXRoaXMubGFzdFNjYWxlRGVsdGFfLTE7UG8oZSxpLHRoaXMuYW5jaG9yXyx0aGlzLmR1cmF0aW9uXyxyKX1yZXR1cm4hMX1yZXR1cm4hMH0sZS5wcm90b3R5cGUuaGFuZGxlRG93bkV2ZW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMudGFyZ2V0UG9pbnRlcnMubGVuZ3RoPj0yKXt2YXIgZT10Lm1hcDtyZXR1cm4gdGhpcy5hbmNob3JfPW51bGwsdGhpcy5sYXN0RGlzdGFuY2VfPXZvaWQgMCx0aGlzLmxhc3RTY2FsZURlbHRhXz0xLHRoaXMuaGFuZGxpbmdEb3duVXBTZXF1ZW5jZXx8ZS5nZXRWaWV3KCkuc2V0SGludChqbiwxKSwhMH1yZXR1cm4hMX0sZX0ocW8pO2Z1bmN0aW9uIHlzKHQpe3ZhciBlPXR8fHt9LGk9bmV3IFUscj1uZXcgYnIoLS4wMDUsLjA1LDEwMCk7cmV0dXJuKHZvaWQgMD09PWUuYWx0U2hpZnREcmFnUm90YXRlfHxlLmFsdFNoaWZ0RHJhZ1JvdGF0ZSkmJmkucHVzaChuZXcgUW8pLCh2b2lkIDA9PT1lLmRvdWJsZUNsaWNrWm9vbXx8ZS5kb3VibGVDbGlja1pvb20pJiZpLnB1c2gobmV3IE5vKHtkZWx0YTplLnpvb21EZWx0YSxkdXJhdGlvbjplLnpvb21EdXJhdGlvbn0pKSwodm9pZCAwPT09ZS5kcmFnUGFufHxlLmRyYWdQYW4pJiZpLnB1c2gobmV3IEpvKHtjb25kaXRpb246ZS5vbkZvY3VzT25seT9rbzp2b2lkIDAsa2luZXRpYzpyfSkpLCh2b2lkIDA9PT1lLnBpbmNoUm90YXRlfHxlLnBpbmNoUm90YXRlKSYmaS5wdXNoKG5ldyBfcyksKHZvaWQgMD09PWUucGluY2hab29tfHxlLnBpbmNoWm9vbSkmJmkucHVzaChuZXcgZ3Moe2NvbnN0cmFpblJlc29sdXRpb246ZS5jb25zdHJhaW5SZXNvbHV0aW9uLGR1cmF0aW9uOmUuem9vbUR1cmF0aW9ufSkpLCh2b2lkIDA9PT1lLmtleWJvYXJkfHxlLmtleWJvYXJkKSYmKGkucHVzaChuZXcgbHMpLGkucHVzaChuZXcgcHMoe2RlbHRhOmUuem9vbURlbHRhLGR1cmF0aW9uOmUuem9vbUR1cmF0aW9ufSkpKSwodm9pZCAwPT09ZS5tb3VzZVdoZWVsWm9vbXx8ZS5tb3VzZVdoZWVsWm9vbSkmJmkucHVzaChuZXcgZnMoe2NvbmRpdGlvbjplLm9uRm9jdXNPbmx5P2tvOnZvaWQgMCxjb25zdHJhaW5SZXNvbHV0aW9uOmUuY29uc3RyYWluUmVzb2x1dGlvbixkdXJhdGlvbjplLnpvb21EdXJhdGlvbn0pKSwodm9pZCAwPT09ZS5zaGlmdERyYWdab29tfHxlLnNoaWZ0RHJhZ1pvb20pJiZpLnB1c2gobmV3IHNzKHtkdXJhdGlvbjplLnpvb21EdXJhdGlvbn0pKSxpfXZhciB2cz0uNSxtcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4pe3QuY2FsbCh0aGlzKSx0aGlzLmV4dGVudD1lLHRoaXMucGl4ZWxSYXRpb189cix0aGlzLnJlc29sdXRpb249aSx0aGlzLnN0YXRlPW59cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNoYW5nZWQ9ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoTS5DSEFOR0UpfSxlLnByb3RvdHlwZS5nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5leHRlbnR9LGUucHJvdG90eXBlLmdldEltYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUuZ2V0UGl4ZWxSYXRpbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBpeGVsUmF0aW9ffSxlLnByb3RvdHlwZS5nZXRSZXNvbHV0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzb2x1dGlvbn0sZS5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0ZX0sZS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3IoKX0sZX0oYikseHM9e0lETEU6MCxMT0FESU5HOjEsTE9BREVEOjIsRVJST1I6M30sRXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkscixuLG8pe3ZhciBzPXZvaWQgMCE9PW8/eHMuSURMRTp4cy5MT0FERUQ7dC5jYWxsKHRoaXMsZSxpLHIscyksdGhpcy5sb2FkZXJfPXZvaWQgMCE9PW8/bzpudWxsLHRoaXMuY2FudmFzXz1uLHRoaXMuZXJyb3JfPW51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldEVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JffSxlLnByb3RvdHlwZS5oYW5kbGVMb2FkXz1mdW5jdGlvbih0KXt0Pyh0aGlzLmVycm9yXz10LHRoaXMuc3RhdGU9eHMuRVJST1IpOnRoaXMuc3RhdGU9eHMuTE9BREVELHRoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT09eHMuSURMRSYmKHRoaXMuc3RhdGU9eHMuTE9BRElORyx0aGlzLmNoYW5nZWQoKSx0aGlzLmxvYWRlcl8odGhpcy5oYW5kbGVMb2FkXy5iaW5kKHRoaXMpKSl9LGUucHJvdG90eXBlLmdldEltYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzX30sZX0obXMpLFNzPXtJTUFHRToiSU1BR0UiLFRJTEU6IlRJTEUiLFZFQ1RPUl9USUxFOiJWRUNUT1JfVElMRSIsVkVDVE9SOiJWRUNUT1IifSxUcz17SU1BR0U6ImltYWdlIixWRUNUT1I6InZlY3RvciJ9LENzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIsbixvKXt0LmNhbGwodGhpcyxlKSx0aGlzLnZlY3RvckNvbnRleHQ9aSx0aGlzLmZyYW1lU3RhdGU9cix0aGlzLmNvbnRleHQ9bix0aGlzLmdsQ29udGV4dD1vfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShQKSxScz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLmhpZ2hXYXRlck1hcms9dm9pZCAwIT09ZT9lOjIwNDgsdGhpcy5jb3VudF89MCx0aGlzLmVudHJpZXNfPXt9LHRoaXMub2xkZXN0Xz1udWxsLHRoaXMubmV3ZXN0Xz1udWxsfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5jYW5FeHBpcmVDYWNoZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvdW50KCk+dGhpcy5oaWdoV2F0ZXJNYXJrfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY291bnRfPTAsdGhpcy5lbnRyaWVzXz17fSx0aGlzLm9sZGVzdF89bnVsbCx0aGlzLm5ld2VzdF89bnVsbCx0aGlzLmRpc3BhdGNoRXZlbnQoTS5DTEVBUil9LGUucHJvdG90eXBlLmNvbnRhaW5zS2V5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVudHJpZXNfLmhhc093blByb3BlcnR5KHQpfSxlLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMub2xkZXN0XztpOyl0LmNhbGwoZSxpLnZhbHVlXyxpLmtleV8sdGhpcyksaT1pLm5ld2VyfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lbnRyaWVzX1t0XTtyZXR1cm4gWSh2b2lkIDAhPT1lLDE1KSxlPT09dGhpcy5uZXdlc3RfP2UudmFsdWVfOihlPT09dGhpcy5vbGRlc3RfPyh0aGlzLm9sZGVzdF89dGhpcy5vbGRlc3RfLm5ld2VyLHRoaXMub2xkZXN0Xy5vbGRlcj1udWxsKTooZS5uZXdlci5vbGRlcj1lLm9sZGVyLGUub2xkZXIubmV3ZXI9ZS5uZXdlciksZS5uZXdlcj1udWxsLGUub2xkZXI9dGhpcy5uZXdlc3RfLHRoaXMubmV3ZXN0Xy5uZXdlcj1lLHRoaXMubmV3ZXN0Xz1lLGUudmFsdWVfKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZW50cmllc19bdF07cmV0dXJuIFkodm9pZCAwIT09ZSwxNSksZT09PXRoaXMubmV3ZXN0Xz8odGhpcy5uZXdlc3RfPWUub2xkZXIsdGhpcy5uZXdlc3RfJiYodGhpcy5uZXdlc3RfLm5ld2VyPW51bGwpKTplPT09dGhpcy5vbGRlc3RfPyh0aGlzLm9sZGVzdF89ZS5uZXdlcix0aGlzLm9sZGVzdF8mJih0aGlzLm9sZGVzdF8ub2xkZXI9bnVsbCkpOihlLm5ld2VyLm9sZGVyPWUub2xkZXIsZS5vbGRlci5uZXdlcj1lLm5ld2VyKSxkZWxldGUgdGhpcy5lbnRyaWVzX1t0XSwtLXRoaXMuY291bnRfLGUudmFsdWVffSxlLnByb3RvdHlwZS5nZXRDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvdW50X30sZS5wcm90b3R5cGUuZ2V0S2V5cz1mdW5jdGlvbigpe3ZhciB0LGU9bmV3IEFycmF5KHRoaXMuY291bnRfKSxpPTA7Zm9yKHQ9dGhpcy5uZXdlc3RfO3Q7dD10Lm9sZGVyKWVbaSsrXT10LmtleV87cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldFZhbHVlcz1mdW5jdGlvbigpe3ZhciB0LGU9bmV3IEFycmF5KHRoaXMuY291bnRfKSxpPTA7Zm9yKHQ9dGhpcy5uZXdlc3RfO3Q7dD10Lm9sZGVyKWVbaSsrXT10LnZhbHVlXztyZXR1cm4gZX0sZS5wcm90b3R5cGUucGVla0xhc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbGRlc3RfLnZhbHVlX30sZS5wcm90b3R5cGUucGVla0xhc3RLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbGRlc3RfLmtleV99LGUucHJvdG90eXBlLnBlZWtGaXJzdEtleT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5ld2VzdF8ua2V5X30sZS5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vbGRlc3RfO3JldHVybiBkZWxldGUgdGhpcy5lbnRyaWVzX1t0LmtleV9dLHQubmV3ZXImJih0Lm5ld2VyLm9sZGVyPW51bGwpLHRoaXMub2xkZXN0Xz10Lm5ld2VyLHRoaXMub2xkZXN0X3x8KHRoaXMubmV3ZXN0Xz1udWxsKSwtLXRoaXMuY291bnRfLHQudmFsdWVffSxlLnByb3RvdHlwZS5yZXBsYWNlPWZ1bmN0aW9uKHQsZSl7dGhpcy5nZXQodCksdGhpcy5lbnRyaWVzX1t0XS52YWx1ZV89ZX0sZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7WSghKHQgaW4gdGhpcy5lbnRyaWVzXyksMTYpO3ZhciBpPXtrZXlfOnQsbmV3ZXI6bnVsbCxvbGRlcjp0aGlzLm5ld2VzdF8sdmFsdWVfOmV9O3RoaXMubmV3ZXN0Xz90aGlzLm5ld2VzdF8ubmV3ZXI9aTp0aGlzLm9sZGVzdF89aSx0aGlzLm5ld2VzdF89aSx0aGlzLmVudHJpZXNfW3RdPWksKyt0aGlzLmNvdW50X30sZS5wcm90b3R5cGUuc2V0U2l6ZT1mdW5jdGlvbih0KXt0aGlzLmhpZ2hXYXRlck1hcms9dH0sZS5wcm90b3R5cGUucHJ1bmU9ZnVuY3Rpb24oKXtmb3IoO3RoaXMuY2FuRXhwaXJlQ2FjaGUoKTspdGhpcy5wb3AoKX0sZX0oYiksd3M9WzAsMCwwLDFdLElzPVtdLExzPVswLDAsMCwxXSxPcz1bMCwwLDAsMF0sUHM9bmV3IFJzLGJzPXt9LE1zPW51bGwsRnM9e30sQXM9ZnVuY3Rpb24oKXt2YXIgdCxlLGk9NjAscj1icyxuPSIzMnB4ICIsbz1bIm1vbm9zcGFjZSIsInNlcmlmIl0scz1vLmxlbmd0aCxhPSJ3bXl0emlsV01ZVFpJTEAjLyY/JCUxMO+AkyI7ZnVuY3Rpb24gaCh0KXtmb3IodmFyIGk9TnMoKSxyPTEwMDtyPD03MDA7cis9MzAwKXtmb3IodmFyIGg9cisiICIsbD0hMCx1PTA7dTxzOysrdSl7dmFyIHA9b1t1XTtpZihpLmZvbnQ9aCtuK3AsZT1pLm1lYXN1cmVUZXh0KGEpLndpZHRoLHQhPXApe2kuZm9udD1oK24rdCsiLCIrcDt2YXIgYz1pLm1lYXN1cmVUZXh0KGEpLndpZHRoO2w9bCYmYyE9ZX19aWYobClyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBsKCl7dmFyIGU9ITA7Zm9yKHZhciBuIGluIHIpcltuXTxpJiYoaChuKT8ocltuXT1pLHAoRnMpLE1zPW51bGwsUHMuY2xlYXIoKSk6KCsrcltuXSxlPSExKSk7ZSYmKGNsZWFySW50ZXJ2YWwodCksdD12b2lkIDApfXJldHVybiBmdW5jdGlvbihlKXt2YXIgbj12byhlKTtpZihuKWZvcih2YXIgbz0wLHM9bi5sZW5ndGg7bzxzOysrbyl7dmFyIGE9bltvXTthIGluIHJ8fChyW2FdPWksaChhKXx8KHJbYV09MCx2b2lkIDA9PT10JiYodD1zZXRJbnRlcnZhbChsLDMyKSkpKX19fSgpO2Z1bmN0aW9uIE5zKCl7cmV0dXJuIE1zfHwoTXM9Sm4oMSwxKSksTXN9dmFyIEdzPWZ1bmN0aW9uKCl7dmFyIHQsZT1GcztyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIHI9ZVtpXTtyZXR1cm4gdm9pZCAwPT1yJiYodHx8KCh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSkudGV4dENvbnRlbnQ9Ik0iLHQuc3R5bGUubWFyZ2luPXQuc3R5bGUucGFkZGluZz0iMCAhaW1wb3J0YW50Iix0LnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSAhaW1wb3J0YW50Iix0LnN0eWxlLmxlZnQ9Ii05OTk5OXB4ICFpbXBvcnRhbnQiKSx0LnN0eWxlLmZvbnQ9aSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpLHI9ZVtpXT10Lm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHQpKSxyfX0oKTtmdW5jdGlvbiBEcyh0LGUpe3ZhciBpPU5zKCk7cmV0dXJuIHQhPWkuZm9udCYmKGkuZm9udD10KSxpLm1lYXN1cmVUZXh0KGUpLndpZHRofWZ1bmN0aW9uIGtzKHQsZSxpLHIpezAhPT1lJiYodC50cmFuc2xhdGUoaSxyKSx0LnJvdGF0ZShlKSx0LnRyYW5zbGF0ZSgtaSwtcikpfXZhciBqcz1bMSwwLDAsMSwwLDBdO2Z1bmN0aW9uIFVzKHQsZSxpLHIsbixvLHMsYSxoLGwsdSl7dmFyIHA7MSE9aSYmKHA9dC5nbG9iYWxBbHBoYSx0Lmdsb2JhbEFscGhhPXAqaSksZSYmdC5zZXRUcmFuc2Zvcm0uYXBwbHkodCxlKSx0LmRyYXdJbWFnZShyLG4sbyxzLGEsaCxsLHMqdSxhKnUpLHAmJih0Lmdsb2JhbEFscGhhPXApLGUmJnQuc2V0VHJhbnNmb3JtLmFwcGx5KHQsanMpfWZ1bmN0aW9uIFlzKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3lyKHQpOnR9dmFyIEJzPWZ1bmN0aW9uKCl7fTtCcy5wcm90b3R5cGUuZHJhd0N1c3RvbT1mdW5jdGlvbih0LGUsaSl7fSxCcy5wcm90b3R5cGUuZHJhd0dlb21ldHJ5PWZ1bmN0aW9uKHQpe30sQnMucHJvdG90eXBlLnNldFN0eWxlPWZ1bmN0aW9uKHQpe30sQnMucHJvdG90eXBlLmRyYXdDaXJjbGU9ZnVuY3Rpb24odCxlKXt9LEJzLnByb3RvdHlwZS5kcmF3RmVhdHVyZT1mdW5jdGlvbih0LGUpe30sQnMucHJvdG90eXBlLmRyYXdHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCxlKXt9LEJzLnByb3RvdHlwZS5kcmF3TGluZVN0cmluZz1mdW5jdGlvbih0LGUpe30sQnMucHJvdG90eXBlLmRyYXdNdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24odCxlKXt9LEJzLnByb3RvdHlwZS5kcmF3TXVsdGlQb2ludD1mdW5jdGlvbih0LGUpe30sQnMucHJvdG90eXBlLmRyYXdNdWx0aVBvbHlnb249ZnVuY3Rpb24odCxlKXt9LEJzLnByb3RvdHlwZS5kcmF3UG9pbnQ9ZnVuY3Rpb24odCxlKXt9LEJzLnByb3RvdHlwZS5kcmF3UG9seWdvbj1mdW5jdGlvbih0LGUpe30sQnMucHJvdG90eXBlLmRyYXdUZXh0PWZ1bmN0aW9uKHQsZSl7fSxCcy5wcm90b3R5cGUuc2V0RmlsbFN0cm9rZVN0eWxlPWZ1bmN0aW9uKHQsZSl7fSxCcy5wcm90b3R5cGUuc2V0SW1hZ2VTdHlsZT1mdW5jdGlvbih0LGUpe30sQnMucHJvdG90eXBlLnNldFRleHRTdHlsZT1mdW5jdGlvbih0LGUpe307dmFyIFZzPUJzLFhzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIsbixvKXt0LmNhbGwodGhpcyksdGhpcy5jb250ZXh0Xz1lLHRoaXMucGl4ZWxSYXRpb189aSx0aGlzLmV4dGVudF89cix0aGlzLnRyYW5zZm9ybV89bix0aGlzLnZpZXdSb3RhdGlvbl89byx0aGlzLmNvbnRleHRGaWxsU3RhdGVfPW51bGwsdGhpcy5jb250ZXh0U3Ryb2tlU3RhdGVfPW51bGwsdGhpcy5jb250ZXh0VGV4dFN0YXRlXz1udWxsLHRoaXMuZmlsbFN0YXRlXz1udWxsLHRoaXMuc3Ryb2tlU3RhdGVfPW51bGwsdGhpcy5pbWFnZV89bnVsbCx0aGlzLmltYWdlQW5jaG9yWF89MCx0aGlzLmltYWdlQW5jaG9yWV89MCx0aGlzLmltYWdlSGVpZ2h0Xz0wLHRoaXMuaW1hZ2VPcGFjaXR5Xz0wLHRoaXMuaW1hZ2VPcmlnaW5YXz0wLHRoaXMuaW1hZ2VPcmlnaW5ZXz0wLHRoaXMuaW1hZ2VSb3RhdGVXaXRoVmlld189ITEsdGhpcy5pbWFnZVJvdGF0aW9uXz0wLHRoaXMuaW1hZ2VTY2FsZV89MCx0aGlzLmltYWdlV2lkdGhfPTAsdGhpcy50ZXh0Xz0iIix0aGlzLnRleHRPZmZzZXRYXz0wLHRoaXMudGV4dE9mZnNldFlfPTAsdGhpcy50ZXh0Um90YXRlV2l0aFZpZXdfPSExLHRoaXMudGV4dFJvdGF0aW9uXz0wLHRoaXMudGV4dFNjYWxlXz0wLHRoaXMudGV4dEZpbGxTdGF0ZV89bnVsbCx0aGlzLnRleHRTdHJva2VTdGF0ZV89bnVsbCx0aGlzLnRleHRTdGF0ZV89bnVsbCx0aGlzLnBpeGVsQ29vcmRpbmF0ZXNfPVtdLHRoaXMudG1wTG9jYWxUcmFuc2Zvcm1fPVsxLDAsMCwxLDAsMF19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmRyYXdJbWFnZXNfPWZ1bmN0aW9uKHQsZSxpLHIpe2lmKHRoaXMuaW1hZ2VfKXt2YXIgbj1HdCh0LGUsaSwyLHRoaXMudHJhbnNmb3JtXyx0aGlzLnBpeGVsQ29vcmRpbmF0ZXNfKSxvPXRoaXMuY29udGV4dF8scz10aGlzLnRtcExvY2FsVHJhbnNmb3JtXyxhPW8uZ2xvYmFsQWxwaGE7MSE9dGhpcy5pbWFnZU9wYWNpdHlfJiYoby5nbG9iYWxBbHBoYT1hKnRoaXMuaW1hZ2VPcGFjaXR5Xyk7dmFyIGg9dGhpcy5pbWFnZVJvdGF0aW9uXzt0aGlzLmltYWdlUm90YXRlV2l0aFZpZXdfJiYoaCs9dGhpcy52aWV3Um90YXRpb25fKTtmb3IodmFyIGw9MCx1PW4ubGVuZ3RoO2w8dTtsKz0yKXt2YXIgcD1uW2xdLXRoaXMuaW1hZ2VBbmNob3JYXyxjPW5bbCsxXS10aGlzLmltYWdlQW5jaG9yWV87aWYoMCE9PWh8fDEhPXRoaXMuaW1hZ2VTY2FsZV8pe3ZhciBkPXArdGhpcy5pbWFnZUFuY2hvclhfLGY9Yyt0aGlzLmltYWdlQW5jaG9yWV87WWUocyxkLGYsdGhpcy5pbWFnZVNjYWxlXyx0aGlzLmltYWdlU2NhbGVfLGgsLWQsLWYpLG8uc2V0VHJhbnNmb3JtLmFwcGx5KG8scyl9by5kcmF3SW1hZ2UodGhpcy5pbWFnZV8sdGhpcy5pbWFnZU9yaWdpblhfLHRoaXMuaW1hZ2VPcmlnaW5ZXyx0aGlzLmltYWdlV2lkdGhfLHRoaXMuaW1hZ2VIZWlnaHRfLHAsYyx0aGlzLmltYWdlV2lkdGhfLHRoaXMuaW1hZ2VIZWlnaHRfKX0wPT09aCYmMT09dGhpcy5pbWFnZVNjYWxlX3x8by5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLDEhPXRoaXMuaW1hZ2VPcGFjaXR5XyYmKG8uZ2xvYmFsQWxwaGE9YSl9fSxlLnByb3RvdHlwZS5kcmF3VGV4dF89ZnVuY3Rpb24odCxlLGkscil7aWYodGhpcy50ZXh0U3RhdGVfJiYiIiE9PXRoaXMudGV4dF8pe3RoaXMudGV4dEZpbGxTdGF0ZV8mJnRoaXMuc2V0Q29udGV4dEZpbGxTdGF0ZV8odGhpcy50ZXh0RmlsbFN0YXRlXyksdGhpcy50ZXh0U3Ryb2tlU3RhdGVfJiZ0aGlzLnNldENvbnRleHRTdHJva2VTdGF0ZV8odGhpcy50ZXh0U3Ryb2tlU3RhdGVfKSx0aGlzLnNldENvbnRleHRUZXh0U3RhdGVfKHRoaXMudGV4dFN0YXRlXyk7dmFyIG49R3QodCxlLGkscix0aGlzLnRyYW5zZm9ybV8sdGhpcy5waXhlbENvb3JkaW5hdGVzXyksbz10aGlzLmNvbnRleHRfLHM9dGhpcy50ZXh0Um90YXRpb25fO2Zvcih0aGlzLnRleHRSb3RhdGVXaXRoVmlld18mJihzKz10aGlzLnZpZXdSb3RhdGlvbl8pO2U8aTtlKz1yKXt2YXIgYT1uW2VdK3RoaXMudGV4dE9mZnNldFhfLGg9bltlKzFdK3RoaXMudGV4dE9mZnNldFlfO2lmKDAhPT1zfHwxIT10aGlzLnRleHRTY2FsZV8pe3ZhciBsPVllKHRoaXMudG1wTG9jYWxUcmFuc2Zvcm1fLGEsaCx0aGlzLnRleHRTY2FsZV8sdGhpcy50ZXh0U2NhbGVfLHMsLWEsLWgpO28uc2V0VHJhbnNmb3JtLmFwcGx5KG8sbCl9dGhpcy50ZXh0U3Ryb2tlU3RhdGVfJiZvLnN0cm9rZVRleHQodGhpcy50ZXh0XyxhLGgpLHRoaXMudGV4dEZpbGxTdGF0ZV8mJm8uZmlsbFRleHQodGhpcy50ZXh0XyxhLGgpfTA9PT1zJiYxPT10aGlzLnRleHRTY2FsZV98fG8uc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKX19LGUucHJvdG90eXBlLm1vdmVUb0xpbmVUb189ZnVuY3Rpb24odCxlLGkscixuKXt2YXIgbz10aGlzLmNvbnRleHRfLHM9R3QodCxlLGkscix0aGlzLnRyYW5zZm9ybV8sdGhpcy5waXhlbENvb3JkaW5hdGVzXyk7by5tb3ZlVG8oc1swXSxzWzFdKTt2YXIgYT1zLmxlbmd0aDtuJiYoYS09Mik7Zm9yKHZhciBoPTI7aDxhO2grPTIpby5saW5lVG8oc1toXSxzW2grMV0pO3JldHVybiBuJiZvLmNsb3NlUGF0aCgpLGl9LGUucHJvdG90eXBlLmRyYXdSaW5nc189ZnVuY3Rpb24odCxlLGkscil7Zm9yKHZhciBuPTAsbz1pLmxlbmd0aDtuPG87KytuKWU9dGhpcy5tb3ZlVG9MaW5lVG9fKHQsZSxpW25dLHIsITApO3JldHVybiBlfSxlLnByb3RvdHlwZS5kcmF3Q2lyY2xlPWZ1bmN0aW9uKHQpe2lmKFB0KHRoaXMuZXh0ZW50Xyx0LmdldEV4dGVudCgpKSl7aWYodGhpcy5maWxsU3RhdGVffHx0aGlzLnN0cm9rZVN0YXRlXyl7dGhpcy5maWxsU3RhdGVfJiZ0aGlzLnNldENvbnRleHRGaWxsU3RhdGVfKHRoaXMuZmlsbFN0YXRlXyksdGhpcy5zdHJva2VTdGF0ZV8mJnRoaXMuc2V0Q29udGV4dFN0cm9rZVN0YXRlXyh0aGlzLnN0cm9rZVN0YXRlXyk7dmFyIGU9ZnVuY3Rpb24odCxlLGkpe3ZhciByPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCk7aWYocil7dmFyIG49dC5nZXRTdHJpZGUoKTtyZXR1cm4gR3QociwwLHIubGVuZ3RoLG4sZSxpKX1yZXR1cm4gbnVsbH0odCx0aGlzLnRyYW5zZm9ybV8sdGhpcy5waXhlbENvb3JkaW5hdGVzXyksaT1lWzJdLWVbMF0scj1lWzNdLWVbMV0sbj1NYXRoLnNxcnQoaSppK3Iqciksbz10aGlzLmNvbnRleHRfO28uYmVnaW5QYXRoKCksby5hcmMoZVswXSxlWzFdLG4sMCwyKk1hdGguUEkpLHRoaXMuZmlsbFN0YXRlXyYmby5maWxsKCksdGhpcy5zdHJva2VTdGF0ZV8mJm8uc3Ryb2tlKCl9IiIhPT10aGlzLnRleHRfJiZ0aGlzLmRyYXdUZXh0Xyh0LmdldENlbnRlcigpLDAsMiwyKX19LGUucHJvdG90eXBlLnNldFN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuc2V0RmlsbFN0cm9rZVN0eWxlKHQuZ2V0RmlsbCgpLHQuZ2V0U3Ryb2tlKCkpLHRoaXMuc2V0SW1hZ2VTdHlsZSh0LmdldEltYWdlKCkpLHRoaXMuc2V0VGV4dFN0eWxlKHQuZ2V0VGV4dCgpKX0sZS5wcm90b3R5cGUuZHJhd0dlb21ldHJ5PWZ1bmN0aW9uKHQpe3N3aXRjaCh0LmdldFR5cGUoKSl7Y2FzZSBOdC5QT0lOVDp0aGlzLmRyYXdQb2ludCh0KTticmVhaztjYXNlIE50LkxJTkVfU1RSSU5HOnRoaXMuZHJhd0xpbmVTdHJpbmcodCk7YnJlYWs7Y2FzZSBOdC5QT0xZR09OOnRoaXMuZHJhd1BvbHlnb24odCk7YnJlYWs7Y2FzZSBOdC5NVUxUSV9QT0lOVDp0aGlzLmRyYXdNdWx0aVBvaW50KHQpO2JyZWFrO2Nhc2UgTnQuTVVMVElfTElORV9TVFJJTkc6dGhpcy5kcmF3TXVsdGlMaW5lU3RyaW5nKHQpO2JyZWFrO2Nhc2UgTnQuTVVMVElfUE9MWUdPTjp0aGlzLmRyYXdNdWx0aVBvbHlnb24odCk7YnJlYWs7Y2FzZSBOdC5HRU9NRVRSWV9DT0xMRUNUSU9OOnRoaXMuZHJhd0dlb21ldHJ5Q29sbGVjdGlvbih0KTticmVhaztjYXNlIE50LkNJUkNMRTp0aGlzLmRyYXdDaXJjbGUodCl9fSxlLnByb3RvdHlwZS5kcmF3RmVhdHVyZT1mdW5jdGlvbih0LGUpe3ZhciBpPWUuZ2V0R2VvbWV0cnlGdW5jdGlvbigpKHQpO2kmJlB0KHRoaXMuZXh0ZW50XyxpLmdldEV4dGVudCgpKSYmKHRoaXMuc2V0U3R5bGUoZSksdGhpcy5kcmF3R2VvbWV0cnkoaSkpfSxlLnByb3RvdHlwZS5kcmF3R2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LmdldEdlb21ldHJpZXNBcnJheSgpLGk9MCxyPWUubGVuZ3RoO2k8cjsrK2kpdGhpcy5kcmF3R2VvbWV0cnkoZVtpXSl9LGUucHJvdG90eXBlLmRyYXdQb2ludD1mdW5jdGlvbih0KXt2YXIgZT10LmdldEZsYXRDb29yZGluYXRlcygpLGk9dC5nZXRTdHJpZGUoKTt0aGlzLmltYWdlXyYmdGhpcy5kcmF3SW1hZ2VzXyhlLDAsZS5sZW5ndGgsaSksIiIhPT10aGlzLnRleHRfJiZ0aGlzLmRyYXdUZXh0XyhlLDAsZS5sZW5ndGgsaSl9LGUucHJvdG90eXBlLmRyYXdNdWx0aVBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCksaT10LmdldFN0cmlkZSgpO3RoaXMuaW1hZ2VfJiZ0aGlzLmRyYXdJbWFnZXNfKGUsMCxlLmxlbmd0aCxpKSwiIiE9PXRoaXMudGV4dF8mJnRoaXMuZHJhd1RleHRfKGUsMCxlLmxlbmd0aCxpKX0sZS5wcm90b3R5cGUuZHJhd0xpbmVTdHJpbmc9ZnVuY3Rpb24odCl7aWYoUHQodGhpcy5leHRlbnRfLHQuZ2V0RXh0ZW50KCkpKXtpZih0aGlzLnN0cm9rZVN0YXRlXyl7dGhpcy5zZXRDb250ZXh0U3Ryb2tlU3RhdGVfKHRoaXMuc3Ryb2tlU3RhdGVfKTt2YXIgZT10aGlzLmNvbnRleHRfLGk9dC5nZXRGbGF0Q29vcmRpbmF0ZXMoKTtlLmJlZ2luUGF0aCgpLHRoaXMubW92ZVRvTGluZVRvXyhpLDAsaS5sZW5ndGgsdC5nZXRTdHJpZGUoKSwhMSksZS5zdHJva2UoKX1pZigiIiE9PXRoaXMudGV4dF8pe3ZhciByPXQuZ2V0RmxhdE1pZHBvaW50KCk7dGhpcy5kcmF3VGV4dF8ociwwLDIsMil9fX0sZS5wcm90b3R5cGUuZHJhd011bHRpTGluZVN0cmluZz1mdW5jdGlvbih0KXt2YXIgZT10LmdldEV4dGVudCgpO2lmKFB0KHRoaXMuZXh0ZW50XyxlKSl7aWYodGhpcy5zdHJva2VTdGF0ZV8pe3RoaXMuc2V0Q29udGV4dFN0cm9rZVN0YXRlXyh0aGlzLnN0cm9rZVN0YXRlXyk7dmFyIGk9dGhpcy5jb250ZXh0XyxyPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCksbj0wLG89dC5nZXRFbmRzKCkscz10LmdldFN0cmlkZSgpO2kuYmVnaW5QYXRoKCk7Zm9yKHZhciBhPTAsaD1vLmxlbmd0aDthPGg7KythKW49dGhpcy5tb3ZlVG9MaW5lVG9fKHIsbixvW2FdLHMsITEpO2kuc3Ryb2tlKCl9aWYoIiIhPT10aGlzLnRleHRfKXt2YXIgbD10LmdldEZsYXRNaWRwb2ludHMoKTt0aGlzLmRyYXdUZXh0XyhsLDAsbC5sZW5ndGgsMil9fX0sZS5wcm90b3R5cGUuZHJhd1BvbHlnb249ZnVuY3Rpb24odCl7aWYoUHQodGhpcy5leHRlbnRfLHQuZ2V0RXh0ZW50KCkpKXtpZih0aGlzLnN0cm9rZVN0YXRlX3x8dGhpcy5maWxsU3RhdGVfKXt0aGlzLmZpbGxTdGF0ZV8mJnRoaXMuc2V0Q29udGV4dEZpbGxTdGF0ZV8odGhpcy5maWxsU3RhdGVfKSx0aGlzLnN0cm9rZVN0YXRlXyYmdGhpcy5zZXRDb250ZXh0U3Ryb2tlU3RhdGVfKHRoaXMuc3Ryb2tlU3RhdGVfKTt2YXIgZT10aGlzLmNvbnRleHRfO2UuYmVnaW5QYXRoKCksdGhpcy5kcmF3UmluZ3NfKHQuZ2V0T3JpZW50ZWRGbGF0Q29vcmRpbmF0ZXMoKSwwLHQuZ2V0RW5kcygpLHQuZ2V0U3RyaWRlKCkpLHRoaXMuZmlsbFN0YXRlXyYmZS5maWxsKCksdGhpcy5zdHJva2VTdGF0ZV8mJmUuc3Ryb2tlKCl9aWYoIiIhPT10aGlzLnRleHRfKXt2YXIgaT10LmdldEZsYXRJbnRlcmlvclBvaW50KCk7dGhpcy5kcmF3VGV4dF8oaSwwLDIsMil9fX0sZS5wcm90b3R5cGUuZHJhd011bHRpUG9seWdvbj1mdW5jdGlvbih0KXtpZihQdCh0aGlzLmV4dGVudF8sdC5nZXRFeHRlbnQoKSkpe2lmKHRoaXMuc3Ryb2tlU3RhdGVffHx0aGlzLmZpbGxTdGF0ZV8pe3RoaXMuZmlsbFN0YXRlXyYmdGhpcy5zZXRDb250ZXh0RmlsbFN0YXRlXyh0aGlzLmZpbGxTdGF0ZV8pLHRoaXMuc3Ryb2tlU3RhdGVfJiZ0aGlzLnNldENvbnRleHRTdHJva2VTdGF0ZV8odGhpcy5zdHJva2VTdGF0ZV8pO3ZhciBlPXRoaXMuY29udGV4dF8saT10LmdldE9yaWVudGVkRmxhdENvb3JkaW5hdGVzKCkscj0wLG49dC5nZXRFbmRzcygpLG89dC5nZXRTdHJpZGUoKTtlLmJlZ2luUGF0aCgpO2Zvcih2YXIgcz0wLGE9bi5sZW5ndGg7czxhOysrcyl7dmFyIGg9bltzXTtyPXRoaXMuZHJhd1JpbmdzXyhpLHIsaCxvKX10aGlzLmZpbGxTdGF0ZV8mJmUuZmlsbCgpLHRoaXMuc3Ryb2tlU3RhdGVfJiZlLnN0cm9rZSgpfWlmKCIiIT09dGhpcy50ZXh0Xyl7dmFyIGw9dC5nZXRGbGF0SW50ZXJpb3JQb2ludHMoKTt0aGlzLmRyYXdUZXh0XyhsLDAsbC5sZW5ndGgsMil9fX0sZS5wcm90b3R5cGUuc2V0Q29udGV4dEZpbGxTdGF0ZV89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb250ZXh0XyxpPXRoaXMuY29udGV4dEZpbGxTdGF0ZV87aT9pLmZpbGxTdHlsZSE9dC5maWxsU3R5bGUmJihpLmZpbGxTdHlsZT1lLmZpbGxTdHlsZT10LmZpbGxTdHlsZSk6KGUuZmlsbFN0eWxlPXQuZmlsbFN0eWxlLHRoaXMuY29udGV4dEZpbGxTdGF0ZV89e2ZpbGxTdHlsZTp0LmZpbGxTdHlsZX0pfSxlLnByb3RvdHlwZS5zZXRDb250ZXh0U3Ryb2tlU3RhdGVfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGV4dF8saT10aGlzLmNvbnRleHRTdHJva2VTdGF0ZV87aT8oaS5saW5lQ2FwIT10LmxpbmVDYXAmJihpLmxpbmVDYXA9ZS5saW5lQ2FwPXQubGluZUNhcCksa2kmJihaKGkubGluZURhc2gsdC5saW5lRGFzaCl8fGUuc2V0TGluZURhc2goaS5saW5lRGFzaD10LmxpbmVEYXNoKSxpLmxpbmVEYXNoT2Zmc2V0IT10LmxpbmVEYXNoT2Zmc2V0JiYoaS5saW5lRGFzaE9mZnNldD1lLmxpbmVEYXNoT2Zmc2V0PXQubGluZURhc2hPZmZzZXQpKSxpLmxpbmVKb2luIT10LmxpbmVKb2luJiYoaS5saW5lSm9pbj1lLmxpbmVKb2luPXQubGluZUpvaW4pLGkubGluZVdpZHRoIT10LmxpbmVXaWR0aCYmKGkubGluZVdpZHRoPWUubGluZVdpZHRoPXQubGluZVdpZHRoKSxpLm1pdGVyTGltaXQhPXQubWl0ZXJMaW1pdCYmKGkubWl0ZXJMaW1pdD1lLm1pdGVyTGltaXQ9dC5taXRlckxpbWl0KSxpLnN0cm9rZVN0eWxlIT10LnN0cm9rZVN0eWxlJiYoaS5zdHJva2VTdHlsZT1lLnN0cm9rZVN0eWxlPXQuc3Ryb2tlU3R5bGUpKTooZS5saW5lQ2FwPXQubGluZUNhcCxraSYmKGUuc2V0TGluZURhc2godC5saW5lRGFzaCksZS5saW5lRGFzaE9mZnNldD10LmxpbmVEYXNoT2Zmc2V0KSxlLmxpbmVKb2luPXQubGluZUpvaW4sZS5saW5lV2lkdGg9dC5saW5lV2lkdGgsZS5taXRlckxpbWl0PXQubWl0ZXJMaW1pdCxlLnN0cm9rZVN0eWxlPXQuc3Ryb2tlU3R5bGUsdGhpcy5jb250ZXh0U3Ryb2tlU3RhdGVfPXtsaW5lQ2FwOnQubGluZUNhcCxsaW5lRGFzaDp0LmxpbmVEYXNoLGxpbmVEYXNoT2Zmc2V0OnQubGluZURhc2hPZmZzZXQsbGluZUpvaW46dC5saW5lSm9pbixsaW5lV2lkdGg6dC5saW5lV2lkdGgsbWl0ZXJMaW1pdDp0Lm1pdGVyTGltaXQsc3Ryb2tlU3R5bGU6dC5zdHJva2VTdHlsZX0pfSxlLnByb3RvdHlwZS5zZXRDb250ZXh0VGV4dFN0YXRlXz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHRfLGk9dGhpcy5jb250ZXh0VGV4dFN0YXRlXyxyPXQudGV4dEFsaWduP3QudGV4dEFsaWduOiJjZW50ZXIiO2k/KGkuZm9udCE9dC5mb250JiYoaS5mb250PWUuZm9udD10LmZvbnQpLGkudGV4dEFsaWduIT1yJiYoaS50ZXh0QWxpZ249ZS50ZXh0QWxpZ249ciksaS50ZXh0QmFzZWxpbmUhPXQudGV4dEJhc2VsaW5lJiYoaS50ZXh0QmFzZWxpbmU9ZS50ZXh0QmFzZWxpbmU9dC50ZXh0QmFzZWxpbmUpKTooZS5mb250PXQuZm9udCxlLnRleHRBbGlnbj1yLGUudGV4dEJhc2VsaW5lPXQudGV4dEJhc2VsaW5lLHRoaXMuY29udGV4dFRleHRTdGF0ZV89e2ZvbnQ6dC5mb250LHRleHRBbGlnbjpyLHRleHRCYXNlbGluZTp0LnRleHRCYXNlbGluZX0pfSxlLnByb3RvdHlwZS5zZXRGaWxsU3Ryb2tlU3R5bGU9ZnVuY3Rpb24odCxlKXtpZih0KXt2YXIgaT10LmdldENvbG9yKCk7dGhpcy5maWxsU3RhdGVfPXtmaWxsU3R5bGU6WXMoaXx8d3MpfX1lbHNlIHRoaXMuZmlsbFN0YXRlXz1udWxsO2lmKGUpe3ZhciByPWUuZ2V0Q29sb3IoKSxuPWUuZ2V0TGluZUNhcCgpLG89ZS5nZXRMaW5lRGFzaCgpLHM9ZS5nZXRMaW5lRGFzaE9mZnNldCgpLGE9ZS5nZXRMaW5lSm9pbigpLGg9ZS5nZXRXaWR0aCgpLGw9ZS5nZXRNaXRlckxpbWl0KCk7dGhpcy5zdHJva2VTdGF0ZV89e2xpbmVDYXA6dm9pZCAwIT09bj9uOiJyb3VuZCIsbGluZURhc2g6b3x8SXMsbGluZURhc2hPZmZzZXQ6c3x8MCxsaW5lSm9pbjp2b2lkIDAhPT1hP2E6InJvdW5kIixsaW5lV2lkdGg6dGhpcy5waXhlbFJhdGlvXyoodm9pZCAwIT09aD9oOjEpLG1pdGVyTGltaXQ6dm9pZCAwIT09bD9sOjEwLHN0cm9rZVN0eWxlOllzKHJ8fExzKX19ZWxzZSB0aGlzLnN0cm9rZVN0YXRlXz1udWxsfSxlLnByb3RvdHlwZS5zZXRJbWFnZVN0eWxlPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPXQuZ2V0QW5jaG9yKCksaT10LmdldEltYWdlKDEpLHI9dC5nZXRPcmlnaW4oKSxuPXQuZ2V0U2l6ZSgpO3RoaXMuaW1hZ2VBbmNob3JYXz1lWzBdLHRoaXMuaW1hZ2VBbmNob3JZXz1lWzFdLHRoaXMuaW1hZ2VIZWlnaHRfPW5bMV0sdGhpcy5pbWFnZV89aSx0aGlzLmltYWdlT3BhY2l0eV89dC5nZXRPcGFjaXR5KCksdGhpcy5pbWFnZU9yaWdpblhfPXJbMF0sdGhpcy5pbWFnZU9yaWdpbllfPXJbMV0sdGhpcy5pbWFnZVJvdGF0ZVdpdGhWaWV3Xz10LmdldFJvdGF0ZVdpdGhWaWV3KCksdGhpcy5pbWFnZVJvdGF0aW9uXz10LmdldFJvdGF0aW9uKCksdGhpcy5pbWFnZVNjYWxlXz10LmdldFNjYWxlKCkqdGhpcy5waXhlbFJhdGlvXyx0aGlzLmltYWdlV2lkdGhfPW5bMF19ZWxzZSB0aGlzLmltYWdlXz1udWxsfSxlLnByb3RvdHlwZS5zZXRUZXh0U3R5bGU9ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dC5nZXRGaWxsKCk7aWYoZSl7dmFyIGk9ZS5nZXRDb2xvcigpO3RoaXMudGV4dEZpbGxTdGF0ZV89e2ZpbGxTdHlsZTpZcyhpfHx3cyl9fWVsc2UgdGhpcy50ZXh0RmlsbFN0YXRlXz1udWxsO3ZhciByPXQuZ2V0U3Ryb2tlKCk7aWYocil7dmFyIG49ci5nZXRDb2xvcigpLG89ci5nZXRMaW5lQ2FwKCkscz1yLmdldExpbmVEYXNoKCksYT1yLmdldExpbmVEYXNoT2Zmc2V0KCksaD1yLmdldExpbmVKb2luKCksbD1yLmdldFdpZHRoKCksdT1yLmdldE1pdGVyTGltaXQoKTt0aGlzLnRleHRTdHJva2VTdGF0ZV89e2xpbmVDYXA6dm9pZCAwIT09bz9vOiJyb3VuZCIsbGluZURhc2g6c3x8SXMsbGluZURhc2hPZmZzZXQ6YXx8MCxsaW5lSm9pbjp2b2lkIDAhPT1oP2g6InJvdW5kIixsaW5lV2lkdGg6dm9pZCAwIT09bD9sOjEsbWl0ZXJMaW1pdDp2b2lkIDAhPT11P3U6MTAsc3Ryb2tlU3R5bGU6WXMobnx8THMpfX1lbHNlIHRoaXMudGV4dFN0cm9rZVN0YXRlXz1udWxsO3ZhciBwPXQuZ2V0Rm9udCgpLGM9dC5nZXRPZmZzZXRYKCksZD10LmdldE9mZnNldFkoKSxmPXQuZ2V0Um90YXRlV2l0aFZpZXcoKSxfPXQuZ2V0Um90YXRpb24oKSxnPXQuZ2V0U2NhbGUoKSx5PXQuZ2V0VGV4dCgpLHY9dC5nZXRUZXh0QWxpZ24oKSxtPXQuZ2V0VGV4dEJhc2VsaW5lKCk7dGhpcy50ZXh0U3RhdGVfPXtmb250OnZvaWQgMCE9PXA/cDoiMTBweCBzYW5zLXNlcmlmIix0ZXh0QWxpZ246dm9pZCAwIT09dj92OiJjZW50ZXIiLHRleHRCYXNlbGluZTp2b2lkIDAhPT1tP206Im1pZGRsZSJ9LHRoaXMudGV4dF89dm9pZCAwIT09eT95OiIiLHRoaXMudGV4dE9mZnNldFhfPXZvaWQgMCE9PWM/dGhpcy5waXhlbFJhdGlvXypjOjAsdGhpcy50ZXh0T2Zmc2V0WV89dm9pZCAwIT09ZD90aGlzLnBpeGVsUmF0aW9fKmQ6MCx0aGlzLnRleHRSb3RhdGVXaXRoVmlld189dm9pZCAwIT09ZiYmZix0aGlzLnRleHRSb3RhdGlvbl89dm9pZCAwIT09Xz9fOjAsdGhpcy50ZXh0U2NhbGVfPXRoaXMucGl4ZWxSYXRpb18qKHZvaWQgMCE9PWc/ZzoxKX1lbHNlIHRoaXMudGV4dF89IiJ9LGV9KFZzKSx6cz1mdW5jdGlvbigpe3RoaXMuY2FjaGVfPXt9LHRoaXMuY2FjaGVTaXplXz0wLHRoaXMubWF4Q2FjaGVTaXplXz0zMn07ZnVuY3Rpb24gV3ModCxlLGkpe3JldHVybiBlKyI6Iit0KyI6IisoaT9kcihpKToibnVsbCIpfXpzLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY2FjaGVfPXt9LHRoaXMuY2FjaGVTaXplXz0wfSx6cy5wcm90b3R5cGUuZXhwaXJlPWZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZVNpemVfPnRoaXMubWF4Q2FjaGVTaXplXyl7dmFyIHQ9MDtmb3IodmFyIGUgaW4gdGhpcy5jYWNoZV8pe3ZhciBpPXRoaXMuY2FjaGVfW2VdOzAhPSgzJnQrKyl8fGkuaGFzTGlzdGVuZXIoKXx8KGRlbGV0ZSB0aGlzLmNhY2hlX1tlXSwtLXRoaXMuY2FjaGVTaXplXyl9fX0senMucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUsaSl7dmFyIHI9V3ModCxlLGkpO3JldHVybiByIGluIHRoaXMuY2FjaGVfP3RoaXMuY2FjaGVfW3JdOm51bGx9LHpzLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLGkscil7dmFyIG49V3ModCxlLGkpO3RoaXMuY2FjaGVfW25dPXIsKyt0aGlzLmNhY2hlU2l6ZV99LHpzLnByb3RvdHlwZS5zZXRTaXplPWZ1bmN0aW9uKHQpe3RoaXMubWF4Q2FjaGVTaXplXz10LHRoaXMuZXhwaXJlKCl9O3ZhciBLcz1uZXcgenM7ZnVuY3Rpb24gSHModCxlKXtLcy5leHBpcmUoKX1mdW5jdGlvbiBacyh0LGUpe3JldHVybiB0LnpJbmRleC1lLnpJbmRleH12YXIgcXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyksdGhpcy5tYXBfPWUsdGhpcy5sYXllclJlbmRlcmVyc189e30sdGhpcy5sYXllclJlbmRlcmVyTGlzdGVuZXJzXz17fSx0aGlzLmxheWVyUmVuZGVyZXJDb25zdHJ1Y3RvcnNfPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5kaXNwYXRjaFJlbmRlckV2ZW50PWZ1bmN0aW9uKHQsZSl7cigpfSxlLnByb3RvdHlwZS5yZWdpc3RlckxheWVyUmVuZGVyZXJzPWZ1bmN0aW9uKHQpe3RoaXMubGF5ZXJSZW5kZXJlckNvbnN0cnVjdG9yc18ucHVzaC5hcHBseSh0aGlzLmxheWVyUmVuZGVyZXJDb25zdHJ1Y3RvcnNfLHQpfSxlLnByb3RvdHlwZS5jYWxjdWxhdGVNYXRyaWNlczJEPWZ1bmN0aW9uKHQpe3ZhciBlPXQudmlld1N0YXRlLGk9dC5jb29yZGluYXRlVG9QaXhlbFRyYW5zZm9ybSxyPXQucGl4ZWxUb0Nvb3JkaW5hdGVUcmFuc2Zvcm07WWUoaSx0LnNpemVbMF0vMix0LnNpemVbMV0vMiwxL2UucmVzb2x1dGlvbiwtMS9lLnJlc29sdXRpb24sLWUucm90YXRpb24sLWUuY2VudGVyWzBdLC1lLmNlbnRlclsxXSksQmUoR2UocixpKSl9LGUucHJvdG90eXBlLnJlbW92ZUxheWVyUmVuZGVyZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMubGF5ZXJSZW5kZXJlcnNfKXRoaXMucmVtb3ZlTGF5ZXJSZW5kZXJlckJ5S2V5Xyh0KS5kaXNwb3NlKCl9LGUucHJvdG90eXBlLmZvckVhY2hGZWF0dXJlQXRDb29yZGluYXRlPWZ1bmN0aW9uKHQsZSxpLHIsbixzLGEpe3ZhciBoLGw9ZS52aWV3U3RhdGUsdT1sLnJlc29sdXRpb247ZnVuY3Rpb24gcCh0LGkpe3ZhciBzPWUubGF5ZXJTdGF0ZXNbbyhpKV0ubWFuYWdlZDtpZighKG8odClpbiBlLnNraXBwZWRGZWF0dXJlVWlkcyl8fHMpcmV0dXJuIHIuY2FsbChuLHQscz9pOm51bGwpfXZhciBjPWwucHJvamVjdGlvbixkPXQ7aWYoYy5jYW5XcmFwWCgpKXt2YXIgZj1jLmdldEV4dGVudCgpLF89T3QoZiksZz10WzBdO2lmKGc8ZlswXXx8Zz5mWzJdKWQ9W2crXypNYXRoLmNlaWwoKGZbMF0tZykvXyksdFsxXV19dmFyIHksdj1lLmxheWVyU3RhdGVzQXJyYXk7Zm9yKHk9di5sZW5ndGgtMTt5Pj0wOy0teSl7dmFyIG09dlt5XSx4PW0ubGF5ZXI7aWYobW8obSx1KSYmcy5jYWxsKGEseCkpe3ZhciBFPXRoaXMuZ2V0TGF5ZXJSZW5kZXJlcih4KSxTPXguZ2V0U291cmNlKCk7aWYoUyYmKGg9RS5mb3JFYWNoRmVhdHVyZUF0Q29vcmRpbmF0ZShTLmdldFdyYXBYKCk/ZDp0LGUsaSxwKSksaClyZXR1cm4gaH19fSxlLnByb3RvdHlwZS5mb3JFYWNoTGF5ZXJBdFBpeGVsPWZ1bmN0aW9uKHQsZSxpLG4sbyxzLGEpe3JldHVybiByKCl9LGUucHJvdG90eXBlLmhhc0ZlYXR1cmVBdENvb3JkaW5hdGU9ZnVuY3Rpb24odCxlLGkscixuKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5mb3JFYWNoRmVhdHVyZUF0Q29vcmRpbmF0ZSh0LGUsaSxSLHRoaXMscixuKX0sZS5wcm90b3R5cGUuZ2V0TGF5ZXJSZW5kZXJlcj1mdW5jdGlvbih0KXt2YXIgZT1vKHQpO2lmKGUgaW4gdGhpcy5sYXllclJlbmRlcmVyc18pcmV0dXJuIHRoaXMubGF5ZXJSZW5kZXJlcnNfW2VdO2Zvcih2YXIgaSxyPTAsbj10aGlzLmxheWVyUmVuZGVyZXJDb25zdHJ1Y3RvcnNfLmxlbmd0aDtyPG47KytyKXt2YXIgcz10aGlzLmxheWVyUmVuZGVyZXJDb25zdHJ1Y3RvcnNfW3JdO2lmKHMuaGFuZGxlcyh0KSl7aT1zLmNyZWF0ZSh0aGlzLHQpO2JyZWFrfX1pZighaSl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgcmVuZGVyZXIgZm9yIGxheWVyOiAiK3QuZ2V0VHlwZSgpKTtyZXR1cm4gdGhpcy5sYXllclJlbmRlcmVyc19bZV09aSx0aGlzLmxheWVyUmVuZGVyZXJMaXN0ZW5lcnNfW2VdPXYoaSxNLkNIQU5HRSx0aGlzLmhhbmRsZUxheWVyUmVuZGVyZXJDaGFuZ2VfLHRoaXMpLGl9LGUucHJvdG90eXBlLmdldExheWVyUmVuZGVyZXJCeUtleT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYXllclJlbmRlcmVyc19bdF19LGUucHJvdG90eXBlLmdldExheWVyUmVuZGVyZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJSZW5kZXJlcnNffSxlLnByb3RvdHlwZS5nZXRNYXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXBffSxlLnByb3RvdHlwZS5oYW5kbGVMYXllclJlbmRlcmVyQ2hhbmdlXz1mdW5jdGlvbigpe3RoaXMubWFwXy5yZW5kZXIoKX0sZS5wcm90b3R5cGUucmVtb3ZlTGF5ZXJSZW5kZXJlckJ5S2V5Xz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmxheWVyUmVuZGVyZXJzX1t0XTtyZXR1cm4gZGVsZXRlIHRoaXMubGF5ZXJSZW5kZXJlcnNfW3RdLEUodGhpcy5sYXllclJlbmRlcmVyTGlzdGVuZXJzX1t0XSksZGVsZXRlIHRoaXMubGF5ZXJSZW5kZXJlckxpc3RlbmVyc19bdF0sZX0sZS5wcm90b3R5cGUucmVtb3ZlVW51c2VkTGF5ZXJSZW5kZXJlcnNfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpIGluIHRoaXMubGF5ZXJSZW5kZXJlcnNfKWUmJmkgaW4gZS5sYXllclN0YXRlc3x8dGhpcy5yZW1vdmVMYXllclJlbmRlcmVyQnlLZXlfKGkpLmRpc3Bvc2UoKX0sZS5wcm90b3R5cGUucmVuZGVyRnJhbWU9ZnVuY3Rpb24odCl7cigpfSxlLnByb3RvdHlwZS5zY2hlZHVsZUV4cGlyZUljb25DYWNoZT1mdW5jdGlvbih0KXt0LnBvc3RSZW5kZXJGdW5jdGlvbnMucHVzaChIcyl9LGUucHJvdG90eXBlLnNjaGVkdWxlUmVtb3ZlVW51c2VkTGF5ZXJSZW5kZXJlcnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMubGF5ZXJSZW5kZXJlcnNfKWlmKCEoZSBpbiB0LmxheWVyU3RhdGVzKSlyZXR1cm4gdm9pZCB0LnBvc3RSZW5kZXJGdW5jdGlvbnMucHVzaCh0aGlzLnJlbW92ZVVudXNlZExheWVyUmVuZGVyZXJzXy5iaW5kKHRoaXMpKX0sZX0oQyksSnM9W10sUXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyxlKTt2YXIgaT1lLmdldFZpZXdwb3J0KCk7dGhpcy5jb250ZXh0Xz1KbigpLHRoaXMuY2FudmFzXz10aGlzLmNvbnRleHRfLmNhbnZhcyx0aGlzLmNhbnZhc18uc3R5bGUud2lkdGg9IjEwMCUiLHRoaXMuY2FudmFzXy5zdHlsZS5oZWlnaHQ9IjEwMCUiLHRoaXMuY2FudmFzXy5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5jYW52YXNfLmNsYXNzTmFtZT1mbyxpLmluc2VydEJlZm9yZSh0aGlzLmNhbnZhc18saS5jaGlsZE5vZGVzWzBdfHxudWxsKSx0aGlzLnJlbmRlcmVkVmlzaWJsZV89ITAsdGhpcy50cmFuc2Zvcm1fPVsxLDAsMCwxLDAsMF19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmRpc3BhdGNoUmVuZGVyRXZlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldE1hcCgpLHI9dGhpcy5jb250ZXh0XztpZihpLmhhc0xpc3RlbmVyKHQpKXt2YXIgbj1lLmV4dGVudCxvPWUucGl4ZWxSYXRpbyxzPWUudmlld1N0YXRlLnJvdGF0aW9uLGE9dGhpcy5nZXRUcmFuc2Zvcm0oZSksaD1uZXcgWHMocixvLG4sYSxzKSxsPW5ldyBDcyh0LGgsZSxyLG51bGwpO2kuZGlzcGF0Y2hFdmVudChsKX19LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybT1mdW5jdGlvbih0KXt2YXIgZT10LnZpZXdTdGF0ZSxpPXRoaXMuY2FudmFzXy53aWR0aC8yLHI9dGhpcy5jYW52YXNfLmhlaWdodC8yLG49dC5waXhlbFJhdGlvL2UucmVzb2x1dGlvbixvPS1uLHM9LWUucm90YXRpb24sYT0tZS5jZW50ZXJbMF0saD0tZS5jZW50ZXJbMV07cmV0dXJuIFllKHRoaXMudHJhbnNmb3JtXyxpLHIsbixvLHMsYSxoKX0sZS5wcm90b3R5cGUucmVuZGVyRnJhbWU9ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dGhpcy5jb250ZXh0XyxpPXQucGl4ZWxSYXRpbyxyPU1hdGgucm91bmQodC5zaXplWzBdKmkpLG49TWF0aC5yb3VuZCh0LnNpemVbMV0qaSk7dGhpcy5jYW52YXNfLndpZHRoIT1yfHx0aGlzLmNhbnZhc18uaGVpZ2h0IT1uPyh0aGlzLmNhbnZhc18ud2lkdGg9cix0aGlzLmNhbnZhc18uaGVpZ2h0PW4pOmUuY2xlYXJSZWN0KDAsMCxyLG4pO3ZhciBvPXQudmlld1N0YXRlLnJvdGF0aW9uO3RoaXMuY2FsY3VsYXRlTWF0cmljZXMyRCh0KSx0aGlzLmRpc3BhdGNoUmVuZGVyRXZlbnQodXIuUFJFQ09NUE9TRSx0KTt2YXIgcz10LmxheWVyU3RhdGVzQXJyYXk7cShzLFpzKSxvJiYoZS5zYXZlKCksa3MoZSxvLHIvMixuLzIpKTt2YXIgYSxoLGw9dC52aWV3U3RhdGUucmVzb2x1dGlvbjtmb3IoYT0wLGg9cy5sZW5ndGg7YTxoOysrYSl7dmFyIHU9c1thXSxwPXUubGF5ZXIsYz10aGlzLmdldExheWVyUmVuZGVyZXIocCk7bW8odSxsKSYmdS5zb3VyY2VTdGF0ZT09cm8uUkVBRFkmJihjLnByZXBhcmVGcmFtZSh0LHUpJiZjLmNvbXBvc2VGcmFtZSh0LHUsZSkpfW8mJmUucmVzdG9yZSgpLHRoaXMuZGlzcGF0Y2hSZW5kZXJFdmVudCh1ci5QT1NUQ09NUE9TRSx0KSx0aGlzLnJlbmRlcmVkVmlzaWJsZV98fCh0aGlzLmNhbnZhc18uc3R5bGUuZGlzcGxheT0iIix0aGlzLnJlbmRlcmVkVmlzaWJsZV89ITApLHRoaXMuc2NoZWR1bGVSZW1vdmVVbnVzZWRMYXllclJlbmRlcmVycyh0KSx0aGlzLnNjaGVkdWxlRXhwaXJlSWNvbkNhY2hlKHQpfWVsc2UgdGhpcy5yZW5kZXJlZFZpc2libGVfJiYodGhpcy5jYW52YXNfLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMucmVuZGVyZWRWaXNpYmxlXz0hMSl9LGUucHJvdG90eXBlLmZvckVhY2hMYXllckF0UGl4ZWw9ZnVuY3Rpb24odCxlLGkscixuLG8scyl7dmFyIGEsaCxsPWUudmlld1N0YXRlLnJlc29sdXRpb24sdT1lLmxheWVyU3RhdGVzQXJyYXkscD11Lmxlbmd0aCxjPURlKGUucGl4ZWxUb0Nvb3JkaW5hdGVUcmFuc2Zvcm0sdC5zbGljZSgpKTtmb3IoaD1wLTE7aD49MDstLWgpe3ZhciBkPXVbaF0sZj1kLmxheWVyO2lmKG1vKGQsbCkmJm8uY2FsbChzLGYpKWlmKGE9dGhpcy5nZXRMYXllclJlbmRlcmVyKGYpLmZvckVhY2hMYXllckF0Q29vcmRpbmF0ZShjLGUsaSxyLG4pKXJldHVybiBhfX0sZS5wcm90b3R5cGUucmVnaXN0ZXJMYXllclJlbmRlcmVycz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5yZWdpc3RlckxheWVyUmVuZGVyZXJzLmNhbGwodGhpcyxlKTtmb3IodmFyIGk9MCxyPWUubGVuZ3RoO2k8cjsrK2kpe3ZhciBuPWVbaV07WChKcyxuKXx8SnMucHVzaChuKX19LGV9KHFzKSwkcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLmxheWVyXz1lfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5jcmVhdGVMb2FkZWRUaWxlRmluZGVyPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gZnVuY3Rpb24ocixuKXtyZXR1cm4gdC5mb3JFYWNoTG9hZGVkVGlsZShlLHIsbixmdW5jdGlvbih0KXtpW3JdfHwoaVtyXT17fSksaVtyXVt0LnRpbGVDb29yZC50b1N0cmluZygpXT10fSl9fSxlLnByb3RvdHlwZS5mb3JFYWNoRmVhdHVyZUF0Q29vcmRpbmF0ZT1mdW5jdGlvbih0LGUsaSxyKXt9LGUucHJvdG90eXBlLmdldExheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJffSxlLnByb3RvdHlwZS5oYW5kbGVJbWFnZUNoYW5nZV89ZnVuY3Rpb24odCl7dC50YXJnZXQuZ2V0U3RhdGUoKT09PXhzLkxPQURFRCYmdGhpcy5yZW5kZXJJZlJlYWR5QW5kVmlzaWJsZSgpfSxlLnByb3RvdHlwZS5oYXNGZWF0dXJlQXRDb29yZGluYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuITF9LGUucHJvdG90eXBlLmxvYWRJbWFnZT1mdW5jdGlvbih0KXt2YXIgZT10LmdldFN0YXRlKCk7cmV0dXJuIGUhPXhzLkxPQURFRCYmZSE9eHMuRVJST1ImJnYodCxNLkNIQU5HRSx0aGlzLmhhbmRsZUltYWdlQ2hhbmdlXyx0aGlzKSxlPT14cy5JRExFJiYodC5sb2FkKCksZT10LmdldFN0YXRlKCkpLGU9PXhzLkxPQURFRH0sZS5wcm90b3R5cGUucmVuZGVySWZSZWFkeUFuZFZpc2libGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldExheWVyKCk7dC5nZXRWaXNpYmxlKCkmJnQuZ2V0U291cmNlU3RhdGUoKT09cm8uUkVBRFkmJnRoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5zY2hlZHVsZUV4cGlyZUNhY2hlPWZ1bmN0aW9uKHQsZSl7aWYoZS5jYW5FeHBpcmVDYWNoZSgpKXt2YXIgaT1mdW5jdGlvbih0LGUsaSl7dmFyIHI9byh0KTtyIGluIGkudXNlZFRpbGVzJiZ0LmV4cGlyZUNhY2hlKGkudmlld1N0YXRlLnByb2plY3Rpb24saS51c2VkVGlsZXNbcl0pfS5iaW5kKG51bGwsZSk7dC5wb3N0UmVuZGVyRnVuY3Rpb25zLnB1c2goaSl9fSxlLnByb3RvdHlwZS51cGRhdGVVc2VkVGlsZXM9ZnVuY3Rpb24odCxlLGkscil7dmFyIG49byhlKSxzPWkudG9TdHJpbmcoKTtuIGluIHQ/cyBpbiB0W25dP3Rbbl1bc10uZXh0ZW5kKHIpOnRbbl1bc109cjoodFtuXT17fSx0W25dW3NdPXIpfSxlLnByb3RvdHlwZS5tYW5hZ2VUaWxlUHlyYW1pZD1mdW5jdGlvbih0LGUsaSxyLG4scyxhLGgsbCx1KXt2YXIgcD1vKGUpO3AgaW4gdC53YW50ZWRUaWxlc3x8KHQud2FudGVkVGlsZXNbcF09e30pO3ZhciBjLGQsZixfLGcseSx2PXQud2FudGVkVGlsZXNbcF0sbT10LnRpbGVRdWV1ZTtmb3IoeT1pLmdldE1pblpvb20oKTt5PD1hOysreSlmb3IoZD1pLmdldFRpbGVSYW5nZUZvckV4dGVudEFuZFoocyx5LGQpLGY9aS5nZXRSZXNvbHV0aW9uKHkpLF89ZC5taW5YO188PWQubWF4WDsrK18pZm9yKGc9ZC5taW5ZO2c8PWQubWF4WTsrK2cpYS15PD1oPygoYz1lLmdldFRpbGUoeSxfLGcscixuKSkuZ2V0U3RhdGUoKT09T24uSURMRSYmKHZbYy5nZXRLZXkoKV09ITAsbS5pc0tleVF1ZXVlZChjLmdldEtleSgpKXx8bS5lbnF1ZXVlKFtjLHAsaS5nZXRUaWxlQ29vcmRDZW50ZXIoYy50aWxlQ29vcmQpLGZdKSksdm9pZCAwIT09bCYmbC5jYWxsKHUsYykpOmUudXNlVGlsZSh5LF8sZyxuKX0sZX0oRiksdGE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyxlKSx0aGlzLnJlbmRlcmVkUmVzb2x1dGlvbix0aGlzLnRyYW5zZm9ybV89WzEsMCwwLDEsMCwwXX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY2xpcD1mdW5jdGlvbih0LGUsaSl7dmFyIHI9ZS5waXhlbFJhdGlvLG49ZS5zaXplWzBdKnIsbz1lLnNpemVbMV0qcixzPWUudmlld1N0YXRlLnJvdGF0aW9uLGE9SXQoaSksaD1MdChpKSxsPVN0KGkpLHU9RXQoaSk7RGUoZS5jb29yZGluYXRlVG9QaXhlbFRyYW5zZm9ybSxhKSxEZShlLmNvb3JkaW5hdGVUb1BpeGVsVHJhbnNmb3JtLGgpLERlKGUuY29vcmRpbmF0ZVRvUGl4ZWxUcmFuc2Zvcm0sbCksRGUoZS5jb29yZGluYXRlVG9QaXhlbFRyYW5zZm9ybSx1KSx0LnNhdmUoKSxrcyh0LC1zLG4vMixvLzIpLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oYVswXSpyLGFbMV0qciksdC5saW5lVG8oaFswXSpyLGhbMV0qciksdC5saW5lVG8obFswXSpyLGxbMV0qciksdC5saW5lVG8odVswXSpyLHVbMV0qciksdC5jbGlwKCksa3ModCxzLG4vMixvLzIpfSxlLnByb3RvdHlwZS5kaXNwYXRjaENvbXBvc2VFdmVudF89ZnVuY3Rpb24odCxlLGkscil7dmFyIG49dGhpcy5nZXRMYXllcigpO2lmKG4uaGFzTGlzdGVuZXIodCkpe3ZhciBvPWkuc2l6ZVswXSppLnBpeGVsUmF0aW8scz1pLnNpemVbMV0qaS5waXhlbFJhdGlvLGE9aS52aWV3U3RhdGUucm90YXRpb247a3MoZSwtYSxvLzIscy8yKTt2YXIgaD12b2lkIDAhPT1yP3I6dGhpcy5nZXRUcmFuc2Zvcm0oaSwwKSxsPW5ldyBYcyhlLGkucGl4ZWxSYXRpbyxpLmV4dGVudCxoLGkudmlld1N0YXRlLnJvdGF0aW9uKSx1PW5ldyBDcyh0LGwsaSxlLG51bGwpO24uZGlzcGF0Y2hFdmVudCh1KSxrcyhlLGEsby8yLHMvMil9fSxlLnByb3RvdHlwZS5mb3JFYWNoTGF5ZXJBdENvb3JkaW5hdGU9ZnVuY3Rpb24odCxlLGkscixuKXtyZXR1cm4gdGhpcy5mb3JFYWNoRmVhdHVyZUF0Q29vcmRpbmF0ZSh0LGUsaSxSKT9yLmNhbGwobix0aGlzLmdldExheWVyKCksbnVsbCk6dm9pZCAwfSxlLnByb3RvdHlwZS5wb3N0Q29tcG9zZT1mdW5jdGlvbih0LGUsaSxyKXt0aGlzLmRpc3BhdGNoQ29tcG9zZUV2ZW50Xyh1ci5QT1NUQ09NUE9TRSx0LGUscil9LGUucHJvdG90eXBlLnByZUNvbXBvc2U9ZnVuY3Rpb24odCxlLGkpe3RoaXMuZGlzcGF0Y2hDb21wb3NlRXZlbnRfKHVyLlBSRUNPTVBPU0UsdCxlLGkpfSxlLnByb3RvdHlwZS5kaXNwYXRjaFJlbmRlckV2ZW50PWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmRpc3BhdGNoQ29tcG9zZUV2ZW50Xyh1ci5SRU5ERVIsdCxlLGkpfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm09ZnVuY3Rpb24odCxlKXt2YXIgaT10LnZpZXdTdGF0ZSxyPXQucGl4ZWxSYXRpbyxuPXIqdC5zaXplWzBdLzIsbz1yKnQuc2l6ZVsxXS8yLHM9ci9pLnJlc29sdXRpb24sYT0tcyxoPS1pLnJvdGF0aW9uLGw9LWkuY2VudGVyWzBdK2UsdT0taS5jZW50ZXJbMV07cmV0dXJuIFllKHRoaXMudHJhbnNmb3JtXyxuLG8scyxhLGgsbCx1KX0sZS5wcm90b3R5cGUuY29tcG9zZUZyYW1lPWZ1bmN0aW9uKHQsZSxpKXtyKCl9LGUucHJvdG90eXBlLnByZXBhcmVGcmFtZT1mdW5jdGlvbih0LGUpe3JldHVybiByKCl9LGV9KCRzKSxlYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLGUpLHRoaXMuY29vcmRpbmF0ZVRvQ2FudmFzUGl4ZWxUcmFuc2Zvcm09WzEsMCwwLDEsMCwwXSx0aGlzLmhpdENhbnZhc0NvbnRleHRfPW51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNvbXBvc2VGcmFtZT1mdW5jdGlvbih0LGUsaSl7dGhpcy5wcmVDb21wb3NlKGksdCk7dmFyIHI9dGhpcy5nZXRJbWFnZSgpO2lmKHIpe3ZhciBuPWUuZXh0ZW50LG89dm9pZCAwIT09biYmIW90KG4sdC5leHRlbnQpJiZQdChuLHQuZXh0ZW50KTtvJiZ0aGlzLmNsaXAoaSx0LG4pO3ZhciBzPXRoaXMuZ2V0SW1hZ2VUcmFuc2Zvcm0oKSxhPWkuZ2xvYmFsQWxwaGE7aS5nbG9iYWxBbHBoYT1lLm9wYWNpdHk7dmFyIGg9c1s0XSxsPXNbNV0sdT1yLndpZHRoKnNbMF0scD1yLmhlaWdodCpzWzNdO3U+PS41JiZwPj0uNSYmaS5kcmF3SW1hZ2UociwwLDAsK3Iud2lkdGgsK3IuaGVpZ2h0LE1hdGgucm91bmQoaCksTWF0aC5yb3VuZChsKSxNYXRoLnJvdW5kKHUpLE1hdGgucm91bmQocCkpLGkuZ2xvYmFsQWxwaGE9YSxvJiZpLnJlc3RvcmUoKX10aGlzLnBvc3RDb21wb3NlKGksdCxlKX0sZS5wcm90b3R5cGUuZ2V0SW1hZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS5nZXRJbWFnZVRyYW5zZm9ybT1mdW5jdGlvbigpe3JldHVybiByKCl9LGUucHJvdG90eXBlLmZvckVhY2hMYXllckF0Q29vcmRpbmF0ZT1mdW5jdGlvbih0LGUsaSxyLG4pe2lmKHRoaXMuZ2V0SW1hZ2UoKSl7dmFyIG89RGUodGhpcy5jb29yZGluYXRlVG9DYW52YXNQaXhlbFRyYW5zZm9ybSx0LnNsaWNlKCkpO3RyKG8sZS52aWV3U3RhdGUucmVzb2x1dGlvbi90aGlzLnJlbmRlcmVkUmVzb2x1dGlvbiksdGhpcy5oaXRDYW52YXNDb250ZXh0X3x8KHRoaXMuaGl0Q2FudmFzQ29udGV4dF89Sm4oMSwxKSksdGhpcy5oaXRDYW52YXNDb250ZXh0Xy5jbGVhclJlY3QoMCwwLDEsMSksdGhpcy5oaXRDYW52YXNDb250ZXh0Xy5kcmF3SW1hZ2UodGhpcy5nZXRJbWFnZSgpLG9bMF0sb1sxXSwxLDEsMCwwLDEsMSk7dmFyIHM9dGhpcy5oaXRDYW52YXNDb250ZXh0Xy5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YTtyZXR1cm4gc1szXT4wP3IuY2FsbChuLHRoaXMuZ2V0TGF5ZXIoKSxzKTp2b2lkIDB9fSxlfSh0YSksaWE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShpKXtpZih0LmNhbGwodGhpcyxpKSx0aGlzLmltYWdlXz1udWxsLHRoaXMuaW1hZ2VUcmFuc2Zvcm1fPVsxLDAsMCwxLDAsMF0sdGhpcy5za2lwcGVkRmVhdHVyZXNfPVtdLHRoaXMudmVjdG9yUmVuZGVyZXJfPW51bGwsaS5nZXRUeXBlKCk9PT1Tcy5WRUNUT1IpZm9yKHZhciByPTAsbj1Kcy5sZW5ndGg7cjxuOysrcil7dmFyIG89SnNbcl07aWYobyE9PWUmJm8uaGFuZGxlcyhpKSl7dGhpcy52ZWN0b3JSZW5kZXJlcl89bmV3IG8oaSk7YnJlYWt9fX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsPWZ1bmN0aW9uKCl7dGhpcy52ZWN0b3JSZW5kZXJlcl8mJnRoaXMudmVjdG9yUmVuZGVyZXJfLmRpc3Bvc2UoKSx0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuZ2V0SW1hZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbWFnZV8/dGhpcy5pbWFnZV8uZ2V0SW1hZ2UoKTpudWxsfSxlLnByb3RvdHlwZS5nZXRJbWFnZVRyYW5zZm9ybT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmltYWdlVHJhbnNmb3JtX30sZS5wcm90b3R5cGUucHJlcGFyZUZyYW1lPWZ1bmN0aW9uKHQsZSl7dmFyIGkscj10LnBpeGVsUmF0aW8sbj10LnNpemUsbz10LnZpZXdTdGF0ZSxzPW8uY2VudGVyLGE9by5yZXNvbHV0aW9uLGg9dGhpcy5nZXRMYXllcigpLmdldFNvdXJjZSgpLGw9dC52aWV3SGludHMscD10aGlzLnZlY3RvclJlbmRlcmVyXyxjPXQuZXh0ZW50O2lmKHB8fHZvaWQgMD09PWUuZXh0ZW50fHwoYz13dChjLGUuZXh0ZW50KSksIWxba25dJiYhbFtqbl0mJiFidChjKSl7dmFyIGQ9by5wcm9qZWN0aW9uLGY9dGhpcy5za2lwcGVkRmVhdHVyZXNfO2lmKHApe3ZhciBfPXAuY29udGV4dCxnPXUoe30sdCx7c2l6ZTpbT3QoYykvYSxSdChjKS9hXSx2aWV3U3RhdGU6dSh7fSx0LnZpZXdTdGF0ZSx7cm90YXRpb246MH0pfSkseT1PYmplY3Qua2V5cyhnLnNraXBwZWRGZWF0dXJlVWlkcykuc29ydCgpO2k9bmV3IEVzKGMsYSxyLF8uY2FudmFzLGZ1bmN0aW9uKHQpeyFwLnByZXBhcmVGcmFtZShnLGUpfHwhcC5yZXBsYXlHcm91cENoYW5nZWQmJlooZix5KXx8KF8uY2FudmFzLndpZHRoPWcuc2l6ZVswXSpyLF8uY2FudmFzLmhlaWdodD1nLnNpemVbMV0qcixwLmNvbXBvc2UoXyxnLGUpLGY9eSx0KCkpfSl9ZWxzZSBpPWguZ2V0SW1hZ2UoYyxhLHIsZCk7aSYmdGhpcy5sb2FkSW1hZ2UoaSkmJih0aGlzLmltYWdlXz1pLHRoaXMuc2tpcHBlZEZlYXR1cmVzXz1mKX1pZih0aGlzLmltYWdlXyl7dmFyIHY9KGk9dGhpcy5pbWFnZV8pLmdldEV4dGVudCgpLG09aS5nZXRSZXNvbHV0aW9uKCkseD1pLmdldFBpeGVsUmF0aW8oKSxFPXIqbS8oYSp4KSxTPVllKHRoaXMuaW1hZ2VUcmFuc2Zvcm1fLHIqblswXS8yLHIqblsxXS8yLEUsRSwwLHgqKHZbMF0tc1swXSkvbSx4KihzWzFdLXZbM10pL20pO1llKHRoaXMuY29vcmRpbmF0ZVRvQ2FudmFzUGl4ZWxUcmFuc2Zvcm0scipuWzBdLzItU1s0XSxyKm5bMV0vMi1TWzVdLHIvYSwtci9hLDAsLXNbMF0sLXNbMV0pLHRoaXMucmVuZGVyZWRSZXNvbHV0aW9uPW0qci94fXJldHVybiEhdGhpcy5pbWFnZV99LGUucHJvdG90eXBlLmZvckVhY2hGZWF0dXJlQXRDb29yZGluYXRlPWZ1bmN0aW9uKGUsaSxyLG4pe3JldHVybiB0aGlzLnZlY3RvclJlbmRlcmVyXz90aGlzLnZlY3RvclJlbmRlcmVyXy5mb3JFYWNoRmVhdHVyZUF0Q29vcmRpbmF0ZShlLGkscixuKTp0LnByb3RvdHlwZS5mb3JFYWNoRmVhdHVyZUF0Q29vcmRpbmF0ZS5jYWxsKHRoaXMsZSxpLHIsbil9LGV9KGVhKTtpYS5oYW5kbGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFR5cGUoKT09PVNzLklNQUdFfHx0LmdldFR5cGUoKT09PVNzLlZFQ1RPUiYmdC5nZXRSZW5kZXJNb2RlKCk9PT1Ucy5JTUFHRX0saWEuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpYShlKX07dmFyIHJhPWlhLG5hPWZ1bmN0aW9uKHQsZSxpLHIpe3RoaXMubWluWD10LHRoaXMubWF4WD1lLHRoaXMubWluWT1pLHRoaXMubWF4WT1yfTtmdW5jdGlvbiBvYSh0LGUsaSxyLG4pe3JldHVybiB2b2lkIDAhPT1uPyhuLm1pblg9dCxuLm1heFg9ZSxuLm1pblk9aSxuLm1heFk9cixuKTpuZXcgbmEodCxlLGkscil9bmEucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbnRhaW5zWFkodFsxXSx0WzJdKX0sbmEucHJvdG90eXBlLmNvbnRhaW5zVGlsZVJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1pblg8PXQubWluWCYmdC5tYXhYPD10aGlzLm1heFgmJnRoaXMubWluWTw9dC5taW5ZJiZ0Lm1heFk8PXRoaXMubWF4WX0sbmEucHJvdG90eXBlLmNvbnRhaW5zWFk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5taW5YPD10JiZ0PD10aGlzLm1heFgmJnRoaXMubWluWTw9ZSYmZTw9dGhpcy5tYXhZfSxuYS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1pblg9PXQubWluWCYmdGhpcy5taW5ZPT10Lm1pblkmJnRoaXMubWF4WD09dC5tYXhYJiZ0aGlzLm1heFk9PXQubWF4WX0sbmEucHJvdG90eXBlLmV4dGVuZD1mdW5jdGlvbih0KXt0Lm1pblg8dGhpcy5taW5YJiYodGhpcy5taW5YPXQubWluWCksdC5tYXhYPnRoaXMubWF4WCYmKHRoaXMubWF4WD10Lm1heFgpLHQubWluWTx0aGlzLm1pblkmJih0aGlzLm1pblk9dC5taW5ZKSx0Lm1heFk+dGhpcy5tYXhZJiYodGhpcy5tYXhZPXQubWF4WSl9LG5hLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXhZLXRoaXMubWluWSsxfSxuYS5wcm90b3R5cGUuZ2V0U2l6ZT1mdW5jdGlvbigpe3JldHVyblt0aGlzLmdldFdpZHRoKCksdGhpcy5nZXRIZWlnaHQoKV19LG5hLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1heFgtdGhpcy5taW5YKzF9LG5hLnByb3RvdHlwZS5pbnRlcnNlY3RzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1pblg8PXQubWF4WCYmdGhpcy5tYXhYPj10Lm1pblgmJnRoaXMubWluWTw9dC5tYXhZJiZ0aGlzLm1heFk+PXQubWluWX07dmFyIHNhPW5hLGFhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcyxlKSx0aGlzLmNvbnRleHQ9aT9udWxsOkpuKCksdGhpcy5vdmVyc2FtcGxpbmdfLHRoaXMucmVuZGVyZWRFeHRlbnRfPW51bGwsdGhpcy5yZW5kZXJlZFJldmlzaW9uLHRoaXMucmVuZGVyZWRUaWxlcz1bXSx0aGlzLm5ld1RpbGVzXz0hMSx0aGlzLnRtcEV4dGVudD1bMS8wLDEvMCwtMS8wLC0xLzBdLHRoaXMudG1wVGlsZVJhbmdlXz1uZXcgc2EoMCwwLDAsMCksdGhpcy5pbWFnZVRyYW5zZm9ybV89WzEsMCwwLDEsMCwwXSx0aGlzLnpEaXJlY3Rpb249MH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaXNEcmF3YWJsZVRpbGVfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0TGF5ZXIoKSxpPXQuZ2V0U3RhdGUoKSxyPWUuZ2V0VXNlSW50ZXJpbVRpbGVzT25FcnJvcigpO3JldHVybiBpPT1Pbi5MT0FERUR8fGk9PU9uLkVNUFRZfHxpPT1Pbi5FUlJPUiYmIXJ9LGUucHJvdG90eXBlLmdldFRpbGU9ZnVuY3Rpb24odCxlLGkscixuKXt2YXIgbz10aGlzLmdldExheWVyKCkscz1vLmdldFNvdXJjZSgpLmdldFRpbGUodCxlLGkscixuKTtyZXR1cm4gcy5nZXRTdGF0ZSgpPT1Pbi5FUlJPUiYmKG8uZ2V0VXNlSW50ZXJpbVRpbGVzT25FcnJvcigpP28uZ2V0UHJlbG9hZCgpPjAmJih0aGlzLm5ld1RpbGVzXz0hMCk6cy5zZXRTdGF0ZShPbi5MT0FERUQpKSx0aGlzLmlzRHJhd2FibGVUaWxlXyhzKXx8KHM9cy5nZXRJbnRlcmltVGlsZSgpKSxzfSxlLnByb3RvdHlwZS5wcmVwYXJlRnJhbWU9ZnVuY3Rpb24odCxlKXt2YXIgaT10LnBpeGVsUmF0aW8scj10LnNpemUsbj10LnZpZXdTdGF0ZSxzPW4ucHJvamVjdGlvbixhPW4ucmVzb2x1dGlvbixoPW4uY2VudGVyLGw9dGhpcy5nZXRMYXllcigpLHU9bC5nZXRTb3VyY2UoKSxwPXUuZ2V0UmV2aXNpb24oKSxjPXUuZ2V0VGlsZUdyaWRGb3JQcm9qZWN0aW9uKHMpLGQ9Yy5nZXRaRm9yUmVzb2x1dGlvbihhLHRoaXMuekRpcmVjdGlvbiksZj1jLmdldFJlc29sdXRpb24oZCksXz1NYXRoLnJvdW5kKGEvZil8fDEsZz10LmV4dGVudDtpZih2b2lkIDAhPT1lLmV4dGVudCYmKGc9d3QoZyxlLmV4dGVudCkpLGJ0KGcpKXJldHVybiExO3ZhciB5PWMuZ2V0VGlsZVJhbmdlRm9yRXh0ZW50QW5kWihnLGQpLHY9Yy5nZXRUaWxlUmFuZ2VFeHRlbnQoZCx5KSxtPXUuZ2V0VGlsZVBpeGVsUmF0aW8oaSkseD17fTt4W2RdPXt9O3ZhciBFLFMsVCxDPXRoaXMuY3JlYXRlTG9hZGVkVGlsZUZpbmRlcih1LHMseCksUj10LnZpZXdIaW50cyx3PVJba25dfHxSW2puXSxJPXRoaXMudG1wRXh0ZW50LEw9dGhpcy50bXBUaWxlUmFuZ2VfO2Zvcih0aGlzLm5ld1RpbGVzXz0hMSxTPXkubWluWDtTPD15Lm1heFg7KytTKWZvcihUPXkubWluWTtUPD15Lm1heFk7KytUKWlmKCEoRGF0ZS5ub3coKS10LnRpbWU+MTYmJncpKXtpZihFPXRoaXMuZ2V0VGlsZShkLFMsVCxpLHMpLHRoaXMuaXNEcmF3YWJsZVRpbGVfKEUpKXt2YXIgTz1vKHRoaXMpO2lmKEUuZ2V0U3RhdGUoKT09T24uTE9BREVEKXt4W2RdW0UudGlsZUNvb3JkLnRvU3RyaW5nKCldPUU7dmFyIFA9RS5pblRyYW5zaXRpb24oTyk7dGhpcy5uZXdUaWxlc198fCFQJiYtMSE9PXRoaXMucmVuZGVyZWRUaWxlcy5pbmRleE9mKEUpfHwodGhpcy5uZXdUaWxlc189ITApfWlmKDE9PT1FLmdldEFscGhhKE8sdC50aW1lKSljb250aW51ZX12YXIgYj1jLmdldFRpbGVDb29yZENoaWxkVGlsZVJhbmdlKEUudGlsZUNvb3JkLEwsSSksTT0hMTtiJiYoTT1DKGQrMSxiKSksTXx8Yy5mb3JFYWNoVGlsZUNvb3JkUGFyZW50VGlsZVJhbmdlKEUudGlsZUNvb3JkLEMsbnVsbCxMLEkpfXZhciBGPWYqaS9tKl87aWYoISh0aGlzLnJlbmRlcmVkUmVzb2x1dGlvbiYmRGF0ZS5ub3coKS10LnRpbWU+MTYmJncpJiYodGhpcy5uZXdUaWxlc198fCF0aGlzLnJlbmRlcmVkRXh0ZW50X3x8IW90KHRoaXMucmVuZGVyZWRFeHRlbnRfLGcpfHx0aGlzLnJlbmRlcmVkUmV2aXNpb24hPXB8fF8hPXRoaXMub3ZlcnNhbXBsaW5nX3x8IXcmJkYhPXRoaXMucmVuZGVyZWRSZXNvbHV0aW9uKSl7dmFyIEE9dGhpcy5jb250ZXh0O2lmKEEpe3ZhciBOPXUuZ2V0VGlsZVBpeGVsU2l6ZShkLGkscyksRz1NYXRoLnJvdW5kKHkuZ2V0V2lkdGgoKSpOWzBdL18pLEQ9TWF0aC5yb3VuZCh5LmdldEhlaWdodCgpKk5bMV0vXyksaz1BLmNhbnZhcztrLndpZHRoIT1HfHxrLmhlaWdodCE9RD8odGhpcy5vdmVyc2FtcGxpbmdfPV8say53aWR0aD1HLGsuaGVpZ2h0PUQpOih0aGlzLnJlbmRlcmVkRXh0ZW50XyYmIWR0KHYsdGhpcy5yZW5kZXJlZEV4dGVudF8pJiZBLmNsZWFyUmVjdCgwLDAsRyxEKSxfPXRoaXMub3ZlcnNhbXBsaW5nXyl9dGhpcy5yZW5kZXJlZFRpbGVzLmxlbmd0aD0wO3ZhciBqLFUsWSxCLFYsWCx6LFcsSyxILFo9T2JqZWN0LmtleXMoeCkubWFwKE51bWJlcik7Zm9yKFouc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZD8xOmU9PT1kPy0xOnQ+ZT8xOnQ8ZT8tMTowfSksQj0wLFY9Wi5sZW5ndGg7QjxWOysrQilmb3IodmFyIHEgaW4gWT1aW0JdLFU9dS5nZXRUaWxlUGl4ZWxTaXplKFksaSxzKSxqPWMuZ2V0UmVzb2x1dGlvbihZKS9mLHo9bSp1LmdldEd1dHRlckZvclByb2plY3Rpb24ocyksVz14W1ldKUU9V1txXSxTPSgoWD1jLmdldFRpbGVDb29yZEV4dGVudChFLmdldFRpbGVDb29yZCgpLEkpKVswXS12WzBdKS9mKm0vXyxUPSh2WzNdLVhbM10pL2YqbS9fLEs9VVswXSpqL18sSD1VWzFdKmovXyx0aGlzLmRyYXdUaWxlSW1hZ2UoRSx0LGUsUyxULEssSCx6LGQ9PT1ZKSx0aGlzLnJlbmRlcmVkVGlsZXMucHVzaChFKTt0aGlzLnJlbmRlcmVkUmV2aXNpb249cCx0aGlzLnJlbmRlcmVkUmVzb2x1dGlvbj1mKmkvbSpfLHRoaXMucmVuZGVyZWRFeHRlbnRfPXZ9dmFyIEo9dGhpcy5yZW5kZXJlZFJlc29sdXRpb24vYSxRPVllKHRoaXMuaW1hZ2VUcmFuc2Zvcm1fLGkqclswXS8yLGkqclsxXS8yLEosSiwwLCh0aGlzLnJlbmRlcmVkRXh0ZW50X1swXS1oWzBdKS90aGlzLnJlbmRlcmVkUmVzb2x1dGlvbippLChoWzFdLXRoaXMucmVuZGVyZWRFeHRlbnRfWzNdKS90aGlzLnJlbmRlcmVkUmVzb2x1dGlvbippKTtyZXR1cm4gWWUodGhpcy5jb29yZGluYXRlVG9DYW52YXNQaXhlbFRyYW5zZm9ybSxpKnJbMF0vMi1RWzRdLGkqclsxXS8yLVFbNV0saS9hLC1pL2EsMCwtaFswXSwtaFsxXSksdGhpcy51cGRhdGVVc2VkVGlsZXModC51c2VkVGlsZXMsdSxkLHkpLHRoaXMubWFuYWdlVGlsZVB5cmFtaWQodCx1LGMsaSxzLGcsZCxsLmdldFByZWxvYWQoKSksdGhpcy5zY2hlZHVsZUV4cGlyZUNhY2hlKHQsdSksdGhpcy5yZW5kZXJlZFRpbGVzLmxlbmd0aD4wfSxlLnByb3RvdHlwZS5kcmF3VGlsZUltYWdlPWZ1bmN0aW9uKHQsZSxpLHIsbixzLGEsaCxsKXt2YXIgdT10aGlzLmdldFRpbGVJbWFnZSh0KTtpZih1KXt2YXIgcD1vKHRoaXMpLGM9bD90LmdldEFscGhhKHAsZS50aW1lKToxLGQ9dGhpcy5nZXRMYXllcigpLmdldFNvdXJjZSgpOzEhPT1jfHxkLmdldE9wYXF1ZShlLnZpZXdTdGF0ZS5wcm9qZWN0aW9uKXx8dGhpcy5jb250ZXh0LmNsZWFyUmVjdChyLG4scyxhKTt2YXIgZj1jIT09dGhpcy5jb250ZXh0Lmdsb2JhbEFscGhhO2YmJih0aGlzLmNvbnRleHQuc2F2ZSgpLHRoaXMuY29udGV4dC5nbG9iYWxBbHBoYT1jKSx0aGlzLmNvbnRleHQuZHJhd0ltYWdlKHUsaCxoLHUud2lkdGgtMipoLHUuaGVpZ2h0LTIqaCxyLG4scyxhKSxmJiZ0aGlzLmNvbnRleHQucmVzdG9yZSgpLDEhPT1jP2UuYW5pbWF0ZT0hMDpsJiZ0LmVuZFRyYW5zaXRpb24ocCl9fSxlLnByb3RvdHlwZS5nZXRJbWFnZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtyZXR1cm4gdD90LmNhbnZhczpudWxsfSxlLnByb3RvdHlwZS5nZXRJbWFnZVRyYW5zZm9ybT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmltYWdlVHJhbnNmb3JtX30sZS5wcm90b3R5cGUuZ2V0VGlsZUltYWdlPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEltYWdlKCl9LGV9KGVhKTthYS5oYW5kbGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFR5cGUoKT09PVNzLlRJTEV9LGFhLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgYWEoZSl9LGFhLnByb3RvdHlwZS5nZXRMYXllcjt2YXIgaGE9YWEsbGE9aSgwKSx1YT1pLm4obGEpLHBhPWZ1bmN0aW9uKCl7fTtwYS5wcm90b3R5cGUuZ2V0UmVwbGF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoKX0scGEucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gcigpfSxwYS5wcm90b3R5cGUuYWRkRGVjbHV0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiByKCl9O3ZhciBjYT1wYSxkYT17Q0lSQ0xFOiJDaXJjbGUiLERFRkFVTFQ6IkRlZmF1bHQiLElNQUdFOiJJbWFnZSIsTElORV9TVFJJTkc6IkxpbmVTdHJpbmciLFBPTFlHT046IlBvbHlnb24iLFRFWFQ6IlRleHQifTtmdW5jdGlvbiBmYSh0LGUsaSxyLG4sbyxzLGEpe2Zvcih2YXIgaCxsLHUscD1bXSxjPXRbZV0+dFtpLXJdLGQ9bi5sZW5ndGgsZj10W2VdLF89dFtlKzFdLGc9dFtlKz1yXSx5PXRbZSsxXSx2PTAsbT1NYXRoLnNxcnQoTWF0aC5wb3coZy1mLDIpK01hdGgucG93KHktXywyKSkseD0iIixFPTAsUz0wO1M8ZDsrK1Mpe2w9Yz9kLVMtMTpTO3ZhciBUPW4uY2hhckF0KGwpLEM9byh4PWM/VCt4OngrVCktRTtFKz1DO2Zvcih2YXIgUj1zK0MvMjtlPGktciYmdittPFI7KWY9ZyxfPXksZz10W2UrPXJdLHk9dFtlKzFdLHYrPW0sbT1NYXRoLnNxcnQoTWF0aC5wb3coZy1mLDIpK01hdGgucG93KHktXywyKSk7dmFyIHc9Ui12LEk9TWF0aC5hdGFuMih5LV8sZy1mKTtpZihjJiYoSSs9ST4wPy1NYXRoLlBJOk1hdGguUEkpLHZvaWQgMCE9PXUpe3ZhciBMPUktdTtpZihMKz1MPk1hdGguUEk/LTIqTWF0aC5QSTpMPC1NYXRoLlBJPzIqTWF0aC5QSTowLE1hdGguYWJzKEwpPmEpcmV0dXJuIG51bGx9dmFyIE89dy9tLFA9enQoZixnLE8pLGI9enQoXyx5LE8pO3U9PUk/KGMmJihoWzBdPVAsaFsxXT1iLGhbMl09Qy8yKSxoWzRdPXgpOihFPUMsaD1bUCxiLEMvMixJLHg9VF0sYz9wLnVuc2hpZnQoaCk6cC5wdXNoKGgpLHU9SSkscys9Q31yZXR1cm4gcH12YXIgX2E9e0JFR0lOX0dFT01FVFJZOjAsQkVHSU5fUEFUSDoxLENJUkNMRToyLENMT1NFX1BBVEg6MyxDVVNUT006NCxEUkFXX0NIQVJTOjUsRFJBV19JTUFHRTo2LEVORF9HRU9NRVRSWTo3LEZJTEw6OCxNT1ZFX1RPX0xJTkVfVE86OSxTRVRfRklMTF9TVFlMRToxMCxTRVRfU1RST0tFX1NUWUxFOjExLFNUUk9LRToxMn0sZ2E9W19hLkZJTExdLHlhPVtfYS5TVFJPS0VdLHZhPVtfYS5CRUdJTl9QQVRIXSxtYT1bX2EuQ0xPU0VfUEFUSF0seGE9X2EsRWE9W2RhLlBPTFlHT04sZGEuQ0lSQ0xFLGRhLkxJTkVfU1RSSU5HLGRhLklNQUdFLGRhLlRFWFQsZGEuREVGQVVMVF0sU2E9e2xlZnQ6MCxlbmQ6MCxjZW50ZXI6LjUscmlnaHQ6MSxzdGFydDoxLHRvcDowLG1pZGRsZTouNSxoYW5naW5nOi4yLGFscGhhYmV0aWM6LjgsaWRlb2dyYXBoaWM6LjgsYm90dG9tOjF9LFRhPVsxLzAsMS8wLC0xLzAsLTEvMF0sQ2E9WzEsMCwwLDEsMCwwXSxSYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4sbyxzKXt0LmNhbGwodGhpcyksdGhpcy5kZWNsdXR0ZXJUcmVlPXMsdGhpcy50b2xlcmFuY2U9ZSx0aGlzLm1heEV4dGVudD1pLHRoaXMub3ZlcmxhcHM9byx0aGlzLnBpeGVsUmF0aW89bix0aGlzLm1heExpbmVXaWR0aD0wLHRoaXMucmVzb2x1dGlvbj1yLHRoaXMuYWxpZ25GaWxsXyx0aGlzLmJlZ2luR2VvbWV0cnlJbnN0cnVjdGlvbjFfPW51bGwsdGhpcy5iZWdpbkdlb21ldHJ5SW5zdHJ1Y3Rpb24yXz1udWxsLHRoaXMuYnVmZmVyZWRNYXhFeHRlbnRfPW51bGwsdGhpcy5pbnN0cnVjdGlvbnM9W10sdGhpcy5jb29yZGluYXRlcz1bXSx0aGlzLmNvb3JkaW5hdGVDYWNoZV89e30sdGhpcy5yZW5kZXJlZFRyYW5zZm9ybV89WzEsMCwwLDEsMCwwXSx0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucz1bXSx0aGlzLnBpeGVsQ29vcmRpbmF0ZXNfPW51bGwsdGhpcy5zdGF0ZT17fSx0aGlzLnZpZXdSb3RhdGlvbl89MH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUucmVwbGF5VGV4dEJhY2tncm91bmRfPWZ1bmN0aW9uKHQsZSxpLHIsbixvLHMpe3QuYmVnaW5QYXRoKCksdC5tb3ZlVG8uYXBwbHkodCxlKSx0LmxpbmVUby5hcHBseSh0LGkpLHQubGluZVRvLmFwcGx5KHQsciksdC5saW5lVG8uYXBwbHkodCxuKSx0LmxpbmVUby5hcHBseSh0LGUpLG8mJih0aGlzLmFsaWduRmlsbF89b1syXSx0aGlzLmZpbGxfKHQpKSxzJiYodGhpcy5zZXRTdHJva2VTdHlsZV8odCxzKSx0LnN0cm9rZSgpKX0sZS5wcm90b3R5cGUucmVwbGF5SW1hZ2VfPWZ1bmN0aW9uKHQsZSxpLHIsbixvLHMsYSxoLGwsdSxwLGMsZCxmLF8sZyx5KXt2YXIgdj1nfHx5O2UtPW4qPWMsaS09byo9Yzt2YXIgbSx4LEUsUyxUPWYrbD5yLndpZHRoP3Iud2lkdGgtbDpmLEM9YSt1PnIuaGVpZ2h0P3IuaGVpZ2h0LXU6YSxSPV9bM10rVCpjK19bMV0sdz1fWzBdK0MqYytfWzJdLEk9ZS1fWzNdLEw9aS1fWzBdOyh2fHwwIT09cCkmJihtPVtJLExdLHg9W0krUixMXSxFPVtJK1IsTCt3XSxTPVtJLEwrd10pO3ZhciBPPW51bGw7aWYoMCE9PXApe3ZhciBQPWUrbixiPWkrbztPPVllKENhLFAsYiwxLDEscCwtUCwtYiksdXQoVGEpLF90KFRhLERlKENhLG0pKSxfdChUYSxEZShDYSx4KSksX3QoVGEsRGUoQ2EsRSkpLF90KFRhLERlKENhLFMpKX1lbHNlIGx0KEksTCxJK1IsTCt3LFRhKTt2YXIgTT10LmNhbnZhcyxGPXk/eVsyXSpjLzI6MCxBPVRhWzBdLUY8PU0ud2lkdGgmJlRhWzJdK0Y+PTAmJlRhWzFdLUY8PU0uaGVpZ2h0JiZUYVszXStGPj0wO2lmKGQmJihlPU1hdGgucm91bmQoZSksaT1NYXRoLnJvdW5kKGkpKSxzKXtpZighQSYmMT09c1s0XSlyZXR1cm47ZnQocyxUYSk7dmFyIE49QT9bdCxPP08uc2xpY2UoMCk6bnVsbCxoLHIsbCx1LFQsQyxlLGksY106bnVsbDtOJiZ2JiZOLnB1c2goZyx5LG0seCxFLFMpLHMucHVzaChOKX1lbHNlIEEmJih2JiZ0aGlzLnJlcGxheVRleHRCYWNrZ3JvdW5kXyh0LG0seCxFLFMsZyx5KSxVcyh0LE8saCxyLGwsdSxULEMsZSxpLGMpKX0sZS5wcm90b3R5cGUuYXBwbHlQaXhlbFJhdGlvPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucGl4ZWxSYXRpbztyZXR1cm4gMT09ZT90OnQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0KmV9KX0sZS5wcm90b3R5cGUuYXBwZW5kRmxhdENvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSxpLHIsbixvKXt2YXIgcz10aGlzLmNvb3JkaW5hdGVzLmxlbmd0aCxhPXRoaXMuZ2V0QnVmZmVyZWRNYXhFeHRlbnQoKTtvJiYoZSs9cik7dmFyIGgsbCx1LHA9W3RbZV0sdFtlKzFdXSxjPVtOYU4sTmFOXSxkPSEwO2ZvcihoPWUrcjtoPGk7aCs9ciljWzBdPXRbaF0sY1sxXT10W2grMV0sKHU9YXQoYSxjKSkhPT1sPyhkJiYodGhpcy5jb29yZGluYXRlc1tzKytdPXBbMF0sdGhpcy5jb29yZGluYXRlc1tzKytdPXBbMV0pLHRoaXMuY29vcmRpbmF0ZXNbcysrXT1jWzBdLHRoaXMuY29vcmRpbmF0ZXNbcysrXT1jWzFdLGQ9ITEpOnU9PT0kLklOVEVSU0VDVElORz8odGhpcy5jb29yZGluYXRlc1tzKytdPWNbMF0sdGhpcy5jb29yZGluYXRlc1tzKytdPWNbMV0sZD0hMSk6ZD0hMCxwWzBdPWNbMF0scFsxXT1jWzFdLGw9dTtyZXR1cm4obiYmZHx8aD09PWUrcikmJih0aGlzLmNvb3JkaW5hdGVzW3MrK109cFswXSx0aGlzLmNvb3JkaW5hdGVzW3MrK109cFsxXSksc30sZS5wcm90b3R5cGUuZHJhd0N1c3RvbUNvb3JkaW5hdGVzXz1mdW5jdGlvbih0LGUsaSxyLG4pe2Zvcih2YXIgbz0wLHM9aS5sZW5ndGg7bzxzOysrbyl7dmFyIGE9aVtvXSxoPXRoaXMuYXBwZW5kRmxhdENvb3JkaW5hdGVzKHQsZSxhLHIsITEsITEpO24ucHVzaChoKSxlPWF9cmV0dXJuIGV9LGUucHJvdG90eXBlLmRyYXdDdXN0b209ZnVuY3Rpb24odCxlLGkpe3RoaXMuYmVnaW5HZW9tZXRyeSh0LGUpO3ZhciByLG4sbyxzLGEsaD10LmdldFR5cGUoKSxsPXQuZ2V0U3RyaWRlKCksdT10aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDtpZihoPT1OdC5NVUxUSV9QT0xZR09OKXtyPSh0PXQpLmdldE9yaWVudGVkRmxhdENvb3JkaW5hdGVzKCkscz1bXTt2YXIgcD10LmdldEVuZHNzKCk7YT0wO2Zvcih2YXIgYz0wLGQ9cC5sZW5ndGg7YzxkOysrYyl7dmFyIGY9W107YT10aGlzLmRyYXdDdXN0b21Db29yZGluYXRlc18ocixhLHBbY10sbCxmKSxzLnB1c2goZil9dGhpcy5pbnN0cnVjdGlvbnMucHVzaChbeGEuQ1VTVE9NLHUscyx0LGksb2ldKX1lbHNlIGg9PU50LlBPTFlHT058fGg9PU50Lk1VTFRJX0xJTkVfU1RSSU5HPyhvPVtdLHI9aD09TnQuUE9MWUdPTj90LmdldE9yaWVudGVkRmxhdENvb3JkaW5hdGVzKCk6dC5nZXRGbGF0Q29vcmRpbmF0ZXMoKSxhPXRoaXMuZHJhd0N1c3RvbUNvb3JkaW5hdGVzXyhyLDAsdC5nZXRFbmRzKCksbCxvKSx0aGlzLmluc3RydWN0aW9ucy5wdXNoKFt4YS5DVVNUT00sdSxvLHQsaSxuaV0pKTpoPT1OdC5MSU5FX1NUUklOR3x8aD09TnQuTVVMVElfUE9JTlQ/KHI9dC5nZXRGbGF0Q29vcmRpbmF0ZXMoKSxuPXRoaXMuYXBwZW5kRmxhdENvb3JkaW5hdGVzKHIsMCxyLmxlbmd0aCxsLCExLCExKSx0aGlzLmluc3RydWN0aW9ucy5wdXNoKFt4YS5DVVNUT00sdSxuLHQsaSxyaV0pKTpoPT1OdC5QT0lOVCYmKHI9dC5nZXRGbGF0Q29vcmRpbmF0ZXMoKSx0aGlzLmNvb3JkaW5hdGVzLnB1c2goclswXSxyWzFdKSxuPXRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoLHRoaXMuaW5zdHJ1Y3Rpb25zLnB1c2goW3hhLkNVU1RPTSx1LG4sdCxpXSkpO3RoaXMuZW5kR2VvbWV0cnkodCxlKX0sZS5wcm90b3R5cGUuYmVnaW5HZW9tZXRyeT1mdW5jdGlvbih0LGUpe3RoaXMuYmVnaW5HZW9tZXRyeUluc3RydWN0aW9uMV89W3hhLkJFR0lOX0dFT01FVFJZLGUsMF0sdGhpcy5pbnN0cnVjdGlvbnMucHVzaCh0aGlzLmJlZ2luR2VvbWV0cnlJbnN0cnVjdGlvbjFfKSx0aGlzLmJlZ2luR2VvbWV0cnlJbnN0cnVjdGlvbjJfPVt4YS5CRUdJTl9HRU9NRVRSWSxlLDBdLHRoaXMuaGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zLnB1c2godGhpcy5iZWdpbkdlb21ldHJ5SW5zdHJ1Y3Rpb24yXyl9LGUucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuZmlsbF89ZnVuY3Rpb24odCl7aWYodGhpcy5hbGlnbkZpbGxfKXt2YXIgZT1EZSh0aGlzLnJlbmRlcmVkVHJhbnNmb3JtXyxbMCwwXSksaT01MTIqdGhpcy5waXhlbFJhdGlvO3QudHJhbnNsYXRlKGVbMF0laSxlWzFdJWkpLHQucm90YXRlKHRoaXMudmlld1JvdGF0aW9uXyl9dC5maWxsKCksdGhpcy5hbGlnbkZpbGxfJiZ0LnNldFRyYW5zZm9ybS5hcHBseSh0LGpzKX0sZS5wcm90b3R5cGUuc2V0U3Ryb2tlU3R5bGVfPWZ1bmN0aW9uKHQsZSl7dC5zdHJva2VTdHlsZT1lWzFdLHQubGluZVdpZHRoPWVbMl0sdC5saW5lQ2FwPWVbM10sdC5saW5lSm9pbj1lWzRdLHQubWl0ZXJMaW1pdD1lWzVdLGtpJiYodC5saW5lRGFzaE9mZnNldD1lWzddLHQuc2V0TGluZURhc2goZVs2XSkpfSxlLnByb3RvdHlwZS5yZW5kZXJEZWNsdXR0ZXJfPWZ1bmN0aW9uKHQsZSl7aWYodCYmdC5sZW5ndGg+NSl7dmFyIGk9dFs0XTtpZigxPT1pfHxpPT10Lmxlbmd0aC01KXt2YXIgcj17bWluWDp0WzBdLG1pblk6dFsxXSxtYXhYOnRbMl0sbWF4WTp0WzNdLHZhbHVlOmV9O2lmKCF0aGlzLmRlY2x1dHRlclRyZWUuY29sbGlkZXMocikpe3RoaXMuZGVjbHV0dGVyVHJlZS5pbnNlcnQocik7Zm9yKHZhciBuPTUsbz10Lmxlbmd0aDtuPG87KytuKXt2YXIgcz10W25dO3MmJihzLmxlbmd0aD4xMSYmdGhpcy5yZXBsYXlUZXh0QmFja2dyb3VuZF8oc1swXSxzWzEzXSxzWzE0XSxzWzE1XSxzWzE2XSxzWzExXSxzWzEyXSksVXMuYXBwbHkodm9pZCAwLHMpKX19dC5sZW5ndGg9NSx1dCh0KX19fSxlLnByb3RvdHlwZS5yZXBsYXlfPWZ1bmN0aW9uKHQsZSxpLHIsbixzLGEpe3ZhciBoO3RoaXMucGl4ZWxDb29yZGluYXRlc18mJlooZSx0aGlzLnJlbmRlcmVkVHJhbnNmb3JtXyk/aD10aGlzLnBpeGVsQ29vcmRpbmF0ZXNfOih0aGlzLnBpeGVsQ29vcmRpbmF0ZXNffHwodGhpcy5waXhlbENvb3JkaW5hdGVzXz1bXSksaD1HdCh0aGlzLmNvb3JkaW5hdGVzLDAsdGhpcy5jb29yZGluYXRlcy5sZW5ndGgsMixlLHRoaXMucGl4ZWxDb29yZGluYXRlc18pLEdlKHRoaXMucmVuZGVyZWRUcmFuc2Zvcm1fLGUpKTtmb3IodmFyIGwsdSxwLGMsZixfLGcseSx2LG0seCxFLFM9IWQoaSksVD0wLEM9ci5sZW5ndGgsUj0wLHc9MCxJPTAsTD1udWxsLE89bnVsbCxQPXRoaXMuY29vcmRpbmF0ZUNhY2hlXyxiPXRoaXMudmlld1JvdGF0aW9uXyxNPXtjb250ZXh0OnQscGl4ZWxSYXRpbzp0aGlzLnBpeGVsUmF0aW8scmVzb2x1dGlvbjp0aGlzLnJlc29sdXRpb24scm90YXRpb246Yn0sRj10aGlzLmluc3RydWN0aW9ucyE9cnx8dGhpcy5vdmVybGFwcz8wOjIwMDtUPEM7KXt2YXIgQT1yW1RdO3N3aXRjaChBWzBdKXtjYXNlIHhhLkJFR0lOX0dFT01FVFJZOm09QVsxXSxTJiZpW28obSldfHwhbS5nZXRHZW9tZXRyeSgpP1Q9QVsyXTp2b2lkIDA9PT1hfHxQdChhLG0uZ2V0R2VvbWV0cnkoKS5nZXRFeHRlbnQoKSk/KytUOlQ9QVsyXSsxO2JyZWFrO2Nhc2UgeGEuQkVHSU5fUEFUSDp3PkYmJih0aGlzLmZpbGxfKHQpLHc9MCksST5GJiYodC5zdHJva2UoKSxJPTApLHd8fEl8fCh0LmJlZ2luUGF0aCgpLGM9Zj1OYU4pLCsrVDticmVhaztjYXNlIHhhLkNJUkNMRTp2YXIgTj1oW1I9QVsxXV0sRz1oW1IrMV0sRD1oW1IrMl0tTixrPWhbUiszXS1HLGo9TWF0aC5zcXJ0KEQqRCtrKmspO3QubW92ZVRvKE4raixHKSx0LmFyYyhOLEcsaiwwLDIqTWF0aC5QSSwhMCksKytUO2JyZWFrO2Nhc2UgeGEuQ0xPU0VfUEFUSDp0LmNsb3NlUGF0aCgpLCsrVDticmVhaztjYXNlIHhhLkNVU1RPTTpSPUFbMV0sbD1BWzJdO3ZhciBVPUFbM10sWT1BWzRdLEI9Nj09QS5sZW5ndGg/QVs1XTp2b2lkIDA7TS5nZW9tZXRyeT1VLE0uZmVhdHVyZT1tLFQgaW4gUHx8KFBbVF09W10pO3ZhciBWPVBbVF07Qj9CKGgsUixsLDIsVik6KFZbMF09aFtSXSxWWzFdPWhbUisxXSxWLmxlbmd0aD0yKSxZKFYsTSksKytUO2JyZWFrO2Nhc2UgeGEuRFJBV19JTUFHRTpSPUFbMV0sbD1BWzJdLHY9QVszXSx1PUFbNF0scD1BWzVdLHk9cz9udWxsOkFbNl07dmFyIFg9QVs3XSx6PUFbOF0sVz1BWzldLEs9QVsxMF0sSD1BWzExXSxxPUFbMTJdLEo9QVsxM10sUT1BWzE0XSwkPXZvaWQgMCx0dD12b2lkIDAsZXQ9dm9pZCAwO2ZvcihBLmxlbmd0aD4xNj8oJD1BWzE1XSx0dD1BWzE2XSxldD1BWzE3XSk6KCQ9T3MsdHQ9ZXQ9ITEpLEgmJihxKz1iKTtSPGw7Uis9Mil0aGlzLnJlcGxheUltYWdlXyh0LGhbUl0saFtSKzFdLHYsdSxwLHksWCx6LFcsSyxxLEosbixRLCQsdHQ/TDpudWxsLGV0P086bnVsbCk7dGhpcy5yZW5kZXJEZWNsdXR0ZXJfKHksbSksKytUO2JyZWFrO2Nhc2UgeGEuRFJBV19DSEFSUzp2YXIgaXQ9QVsxXSxydD1BWzJdLG50PUFbM107eT1zP251bGw6QVs0XTt2YXIgb3Q9QVs1XSxzdD1BWzZdLGF0PUFbN10saHQ9QVs4XSxsdD1BWzldLHV0PUFbMTBdLHB0PUFbMTFdLGN0PUFbMTJdLGR0PUFbMTNdLGZ0PUFbMTRdLF90PWFyKGgsaXQscnQsMiksZ3Q9aHQoY3QpO2lmKG90fHxndDw9X3Qpe3ZhciB5dD10aGlzLHZ0PXl0LnRleHRTdGF0ZXNbZHRdLnRleHRBbGlnbixtdD1mYShoLGl0LHJ0LDIsY3QsaHQsKF90LWd0KSpTYVt2dF0sYXQpO2lmKG10KXt2YXIgeHQ9dm9pZCAwLEV0PXZvaWQgMCxTdD12b2lkIDAsVHQ9dm9pZCAwLEN0PXZvaWQgMDtpZih1dClmb3IoeHQ9MCxFdD1tdC5sZW5ndGg7eHQ8RXQ7Kyt4dClTdD0oQ3Q9bXRbeHRdKVs0XSxUdD15dC5nZXRJbWFnZShTdCxkdCwiIix1dCksdT1DdFsyXStwdCxwPW50KlR0LmhlaWdodCsyKiguNS1udCkqcHQtbHQsdGhpcy5yZXBsYXlJbWFnZV8odCxDdFswXSxDdFsxXSxUdCx1LHAseSxUdC5oZWlnaHQsMSwwLDAsQ3RbM10sZnQsITEsVHQud2lkdGgsT3MsbnVsbCxudWxsKTtpZihzdClmb3IoeHQ9MCxFdD1tdC5sZW5ndGg7eHQ8RXQ7Kyt4dClTdD0oQ3Q9bXRbeHRdKVs0XSxUdD15dC5nZXRJbWFnZShTdCxkdCxzdCwiIiksdT1DdFsyXSxwPW50KlR0LmhlaWdodC1sdCx0aGlzLnJlcGxheUltYWdlXyh0LEN0WzBdLEN0WzFdLFR0LHUscCx5LFR0LmhlaWdodCwxLDAsMCxDdFszXSxmdCwhMSxUdC53aWR0aCxPcyxudWxsLG51bGwpfX10aGlzLnJlbmRlckRlY2x1dHRlcl8oeSxtKSwrK1Q7YnJlYWs7Y2FzZSB4YS5FTkRfR0VPTUVUUlk6aWYodm9pZCAwIT09cyl7dmFyIFJ0PXMobT1BWzFdKTtpZihSdClyZXR1cm4gUnR9KytUO2JyZWFrO2Nhc2UgeGEuRklMTDpGP3crKzp0aGlzLmZpbGxfKHQpLCsrVDticmVhaztjYXNlIHhhLk1PVkVfVE9fTElORV9UTzpmb3IoUj1BWzFdLGw9QVsyXSx4PWhbUl0sZz0oRT1oW1IrMV0pKy41fDAsKF89eCsuNXwwKT09PWMmJmc9PT1mfHwodC5tb3ZlVG8oeCxFKSxjPV8sZj1nKSxSKz0yO1I8bDtSKz0yKV89KHg9aFtSXSkrLjV8MCxnPShFPWhbUisxXSkrLjV8MCxSIT1sLTImJl89PT1jJiZnPT09Znx8KHQubGluZVRvKHgsRSksYz1fLGY9Zyk7KytUO2JyZWFrO2Nhc2UgeGEuU0VUX0ZJTExfU1RZTEU6TD1BLHRoaXMuYWxpZ25GaWxsXz1BWzJdLHcmJih0aGlzLmZpbGxfKHQpLHc9MCxJJiYodC5zdHJva2UoKSxJPTApKSx0LmZpbGxTdHlsZT1BWzFdLCsrVDticmVhaztjYXNlIHhhLlNFVF9TVFJPS0VfU1RZTEU6Tz1BLEkmJih0LnN0cm9rZSgpLEk9MCksdGhpcy5zZXRTdHJva2VTdHlsZV8odCxBKSwrK1Q7YnJlYWs7Y2FzZSB4YS5TVFJPS0U6Rj9JKys6dC5zdHJva2UoKSwrK1Q7YnJlYWs7ZGVmYXVsdDorK1R9fXcmJnRoaXMuZmlsbF8odCksSSYmdC5zdHJva2UoKX0sZS5wcm90b3R5cGUucmVwbGF5PWZ1bmN0aW9uKHQsZSxpLHIsbil7dGhpcy52aWV3Um90YXRpb25fPWksdGhpcy5yZXBsYXlfKHQsZSxyLHRoaXMuaW5zdHJ1Y3Rpb25zLG4sdm9pZCAwLHZvaWQgMCl9LGUucHJvdG90eXBlLnJlcGxheUhpdERldGVjdGlvbj1mdW5jdGlvbih0LGUsaSxyLG4sbyl7cmV0dXJuIHRoaXMudmlld1JvdGF0aW9uXz1pLHRoaXMucmVwbGF5Xyh0LGUscix0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucywhMCxuLG8pfSxlLnByb3RvdHlwZS5yZXZlcnNlSGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zPWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucztlLnJldmVyc2UoKTt2YXIgaSxyLG49ZS5sZW5ndGgsbz0tMTtmb3IodD0wO3Q8bjsrK3QpKHI9KGk9ZVt0XSlbMF0pPT14YS5FTkRfR0VPTUVUUlk/bz10OnI9PXhhLkJFR0lOX0dFT01FVFJZJiYoaVsyXT10LFcodGhpcy5oaXREZXRlY3Rpb25JbnN0cnVjdGlvbnMsbyx0KSxvPS0xKX0sZS5wcm90b3R5cGUuc2V0RmlsbFN0cm9rZVN0eWxlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zdGF0ZTtpZih0KXt2YXIgcj10LmdldENvbG9yKCk7aS5maWxsU3R5bGU9WXMocnx8d3MpfWVsc2UgaS5maWxsU3R5bGU9dm9pZCAwO2lmKGUpe3ZhciBuPWUuZ2V0Q29sb3IoKTtpLnN0cm9rZVN0eWxlPVlzKG58fExzKTt2YXIgbz1lLmdldExpbmVDYXAoKTtpLmxpbmVDYXA9dm9pZCAwIT09bz9vOiJyb3VuZCI7dmFyIHM9ZS5nZXRMaW5lRGFzaCgpO2kubGluZURhc2g9cz9zLnNsaWNlKCk6SXM7dmFyIGE9ZS5nZXRMaW5lRGFzaE9mZnNldCgpO2kubGluZURhc2hPZmZzZXQ9YXx8MDt2YXIgaD1lLmdldExpbmVKb2luKCk7aS5saW5lSm9pbj12b2lkIDAhPT1oP2g6InJvdW5kIjt2YXIgbD1lLmdldFdpZHRoKCk7aS5saW5lV2lkdGg9dm9pZCAwIT09bD9sOjE7dmFyIHU9ZS5nZXRNaXRlckxpbWl0KCk7aS5taXRlckxpbWl0PXZvaWQgMCE9PXU/dToxMCxpLmxpbmVXaWR0aD50aGlzLm1heExpbmVXaWR0aCYmKHRoaXMubWF4TGluZVdpZHRoPWkubGluZVdpZHRoLHRoaXMuYnVmZmVyZWRNYXhFeHRlbnRfPW51bGwpfWVsc2UgaS5zdHJva2VTdHlsZT12b2lkIDAsaS5saW5lQ2FwPXZvaWQgMCxpLmxpbmVEYXNoPW51bGwsaS5saW5lRGFzaE9mZnNldD12b2lkIDAsaS5saW5lSm9pbj12b2lkIDAsaS5saW5lV2lkdGg9dm9pZCAwLGkubWl0ZXJMaW1pdD12b2lkIDB9LGUucHJvdG90eXBlLmNyZWF0ZUZpbGw9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmZpbGxTdHlsZSxyPVt4YS5TRVRfRklMTF9TVFlMRSxpXTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGkmJnIucHVzaCghMCkscn0sZS5wcm90b3R5cGUuYXBwbHlTdHJva2U9ZnVuY3Rpb24odCl7dGhpcy5pbnN0cnVjdGlvbnMucHVzaCh0aGlzLmNyZWF0ZVN0cm9rZSh0KSl9LGUucHJvdG90eXBlLmNyZWF0ZVN0cm9rZT1mdW5jdGlvbih0KXtyZXR1cm5beGEuU0VUX1NUUk9LRV9TVFlMRSx0LnN0cm9rZVN0eWxlLHQubGluZVdpZHRoKnRoaXMucGl4ZWxSYXRpbyx0LmxpbmVDYXAsdC5saW5lSm9pbix0Lm1pdGVyTGltaXQsdGhpcy5hcHBseVBpeGVsUmF0aW8odC5saW5lRGFzaCksdC5saW5lRGFzaE9mZnNldCp0aGlzLnBpeGVsUmF0aW9dfSxlLnByb3RvdHlwZS51cGRhdGVGaWxsU3R5bGU9ZnVuY3Rpb24odCxlLGkpe3ZhciByPXQuZmlsbFN0eWxlOyJzdHJpbmciPT10eXBlb2YgciYmdC5jdXJyZW50RmlsbFN0eWxlPT1yfHwodm9pZCAwIT09ciYmdGhpcy5pbnN0cnVjdGlvbnMucHVzaChlLmNhbGwodGhpcyx0LGkpKSx0LmN1cnJlbnRGaWxsU3R5bGU9cil9LGUucHJvdG90eXBlLnVwZGF0ZVN0cm9rZVN0eWxlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5zdHJva2VTdHlsZSxyPXQubGluZUNhcCxuPXQubGluZURhc2gsbz10LmxpbmVEYXNoT2Zmc2V0LHM9dC5saW5lSm9pbixhPXQubGluZVdpZHRoLGg9dC5taXRlckxpbWl0Oyh0LmN1cnJlbnRTdHJva2VTdHlsZSE9aXx8dC5jdXJyZW50TGluZUNhcCE9cnx8biE9dC5jdXJyZW50TGluZURhc2gmJiFaKHQuY3VycmVudExpbmVEYXNoLG4pfHx0LmN1cnJlbnRMaW5lRGFzaE9mZnNldCE9b3x8dC5jdXJyZW50TGluZUpvaW4hPXN8fHQuY3VycmVudExpbmVXaWR0aCE9YXx8dC5jdXJyZW50TWl0ZXJMaW1pdCE9aCkmJih2b2lkIDAhPT1pJiZlLmNhbGwodGhpcyx0KSx0LmN1cnJlbnRTdHJva2VTdHlsZT1pLHQuY3VycmVudExpbmVDYXA9cix0LmN1cnJlbnRMaW5lRGFzaD1uLHQuY3VycmVudExpbmVEYXNoT2Zmc2V0PW8sdC5jdXJyZW50TGluZUpvaW49cyx0LmN1cnJlbnRMaW5lV2lkdGg9YSx0LmN1cnJlbnRNaXRlckxpbWl0PWgpfSxlLnByb3RvdHlwZS5lbmRHZW9tZXRyeT1mdW5jdGlvbih0LGUpe3RoaXMuYmVnaW5HZW9tZXRyeUluc3RydWN0aW9uMV9bMl09dGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoLHRoaXMuYmVnaW5HZW9tZXRyeUluc3RydWN0aW9uMV89bnVsbCx0aGlzLmJlZ2luR2VvbWV0cnlJbnN0cnVjdGlvbjJfWzJdPXRoaXMuaGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zLmxlbmd0aCx0aGlzLmJlZ2luR2VvbWV0cnlJbnN0cnVjdGlvbjJfPW51bGw7dmFyIGk9W3hhLkVORF9HRU9NRVRSWSxlXTt0aGlzLmluc3RydWN0aW9ucy5wdXNoKGkpLHRoaXMuaGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zLnB1c2goaSl9LGUucHJvdG90eXBlLmdldEJ1ZmZlcmVkTWF4RXh0ZW50PWZ1bmN0aW9uKCl7aWYoIXRoaXMuYnVmZmVyZWRNYXhFeHRlbnRfJiYodGhpcy5idWZmZXJlZE1heEV4dGVudF89aXQodGhpcy5tYXhFeHRlbnQpLHRoaXMubWF4TGluZVdpZHRoPjApKXt2YXIgdD10aGlzLnJlc29sdXRpb24qKHRoaXMubWF4TGluZVdpZHRoKzEpLzI7ZXQodGhpcy5idWZmZXJlZE1heEV4dGVudF8sdCx0aGlzLmJ1ZmZlcmVkTWF4RXh0ZW50Xyl9cmV0dXJuIHRoaXMuYnVmZmVyZWRNYXhFeHRlbnRffSxlfShWcyksd2E9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkscixuLG8scyl7dC5jYWxsKHRoaXMsZSxpLHIsbixvLHMpLHRoaXMuZGVjbHV0dGVyR3JvdXBfPW51bGwsdGhpcy5oaXREZXRlY3Rpb25JbWFnZV89bnVsbCx0aGlzLmltYWdlXz1udWxsLHRoaXMuYW5jaG9yWF89dm9pZCAwLHRoaXMuYW5jaG9yWV89dm9pZCAwLHRoaXMuaGVpZ2h0Xz12b2lkIDAsdGhpcy5vcGFjaXR5Xz12b2lkIDAsdGhpcy5vcmlnaW5YXz12b2lkIDAsdGhpcy5vcmlnaW5ZXz12b2lkIDAsdGhpcy5yb3RhdGVXaXRoVmlld189dm9pZCAwLHRoaXMucm90YXRpb25fPXZvaWQgMCx0aGlzLnNjYWxlXz12b2lkIDAsdGhpcy53aWR0aF89dm9pZCAwfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5kcmF3Q29vcmRpbmF0ZXNfPWZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybiB0aGlzLmFwcGVuZEZsYXRDb29yZGluYXRlcyh0LGUsaSxyLCExLCExKX0sZS5wcm90b3R5cGUuZHJhd1BvaW50PWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5pbWFnZV8pe3RoaXMuYmVnaW5HZW9tZXRyeSh0LGUpO3ZhciBpPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCkscj10LmdldFN0cmlkZSgpLG49dGhpcy5jb29yZGluYXRlcy5sZW5ndGgsbz10aGlzLmRyYXdDb29yZGluYXRlc18oaSwwLGkubGVuZ3RoLHIpO3RoaXMuaW5zdHJ1Y3Rpb25zLnB1c2goW3hhLkRSQVdfSU1BR0UsbixvLHRoaXMuaW1hZ2VfLHRoaXMuYW5jaG9yWF8sdGhpcy5hbmNob3JZXyx0aGlzLmRlY2x1dHRlckdyb3VwXyx0aGlzLmhlaWdodF8sdGhpcy5vcGFjaXR5Xyx0aGlzLm9yaWdpblhfLHRoaXMub3JpZ2luWV8sdGhpcy5yb3RhdGVXaXRoVmlld18sdGhpcy5yb3RhdGlvbl8sdGhpcy5zY2FsZV8qdGhpcy5waXhlbFJhdGlvLHRoaXMud2lkdGhfXSksdGhpcy5oaXREZXRlY3Rpb25JbnN0cnVjdGlvbnMucHVzaChbeGEuRFJBV19JTUFHRSxuLG8sdGhpcy5oaXREZXRlY3Rpb25JbWFnZV8sdGhpcy5hbmNob3JYXyx0aGlzLmFuY2hvcllfLHRoaXMuZGVjbHV0dGVyR3JvdXBfLHRoaXMuaGVpZ2h0Xyx0aGlzLm9wYWNpdHlfLHRoaXMub3JpZ2luWF8sdGhpcy5vcmlnaW5ZXyx0aGlzLnJvdGF0ZVdpdGhWaWV3Xyx0aGlzLnJvdGF0aW9uXyx0aGlzLnNjYWxlXyx0aGlzLndpZHRoX10pLHRoaXMuZW5kR2VvbWV0cnkodCxlKX19LGUucHJvdG90eXBlLmRyYXdNdWx0aVBvaW50PWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5pbWFnZV8pe3RoaXMuYmVnaW5HZW9tZXRyeSh0LGUpO3ZhciBpPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCkscj10LmdldFN0cmlkZSgpLG49dGhpcy5jb29yZGluYXRlcy5sZW5ndGgsbz10aGlzLmRyYXdDb29yZGluYXRlc18oaSwwLGkubGVuZ3RoLHIpO3RoaXMuaW5zdHJ1Y3Rpb25zLnB1c2goW3hhLkRSQVdfSU1BR0UsbixvLHRoaXMuaW1hZ2VfLHRoaXMuYW5jaG9yWF8sdGhpcy5hbmNob3JZXyx0aGlzLmRlY2x1dHRlckdyb3VwXyx0aGlzLmhlaWdodF8sdGhpcy5vcGFjaXR5Xyx0aGlzLm9yaWdpblhfLHRoaXMub3JpZ2luWV8sdGhpcy5yb3RhdGVXaXRoVmlld18sdGhpcy5yb3RhdGlvbl8sdGhpcy5zY2FsZV8qdGhpcy5waXhlbFJhdGlvLHRoaXMud2lkdGhfXSksdGhpcy5oaXREZXRlY3Rpb25JbnN0cnVjdGlvbnMucHVzaChbeGEuRFJBV19JTUFHRSxuLG8sdGhpcy5oaXREZXRlY3Rpb25JbWFnZV8sdGhpcy5hbmNob3JYXyx0aGlzLmFuY2hvcllfLHRoaXMuZGVjbHV0dGVyR3JvdXBfLHRoaXMuaGVpZ2h0Xyx0aGlzLm9wYWNpdHlfLHRoaXMub3JpZ2luWF8sdGhpcy5vcmlnaW5ZXyx0aGlzLnJvdGF0ZVdpdGhWaWV3Xyx0aGlzLnJvdGF0aW9uXyx0aGlzLnNjYWxlXyx0aGlzLndpZHRoX10pLHRoaXMuZW5kR2VvbWV0cnkodCxlKX19LGUucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe3RoaXMucmV2ZXJzZUhpdERldGVjdGlvbkluc3RydWN0aW9ucygpLHRoaXMuYW5jaG9yWF89dm9pZCAwLHRoaXMuYW5jaG9yWV89dm9pZCAwLHRoaXMuaGl0RGV0ZWN0aW9uSW1hZ2VfPW51bGwsdGhpcy5pbWFnZV89bnVsbCx0aGlzLmhlaWdodF89dm9pZCAwLHRoaXMuc2NhbGVfPXZvaWQgMCx0aGlzLm9wYWNpdHlfPXZvaWQgMCx0aGlzLm9yaWdpblhfPXZvaWQgMCx0aGlzLm9yaWdpbllfPXZvaWQgMCx0aGlzLnJvdGF0ZVdpdGhWaWV3Xz12b2lkIDAsdGhpcy5yb3RhdGlvbl89dm9pZCAwLHRoaXMud2lkdGhfPXZvaWQgMH0sZS5wcm90b3R5cGUuc2V0SW1hZ2VTdHlsZT1mdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0QW5jaG9yKCkscj10LmdldFNpemUoKSxuPXQuZ2V0SGl0RGV0ZWN0aW9uSW1hZ2UoMSksbz10LmdldEltYWdlKDEpLHM9dC5nZXRPcmlnaW4oKTt0aGlzLmFuY2hvclhfPWlbMF0sdGhpcy5hbmNob3JZXz1pWzFdLHRoaXMuZGVjbHV0dGVyR3JvdXBfPWUsdGhpcy5oaXREZXRlY3Rpb25JbWFnZV89bix0aGlzLmltYWdlXz1vLHRoaXMuaGVpZ2h0Xz1yWzFdLHRoaXMub3BhY2l0eV89dC5nZXRPcGFjaXR5KCksdGhpcy5vcmlnaW5YXz1zWzBdLHRoaXMub3JpZ2luWV89c1sxXSx0aGlzLnJvdGF0ZVdpdGhWaWV3Xz10LmdldFJvdGF0ZVdpdGhWaWV3KCksdGhpcy5yb3RhdGlvbl89dC5nZXRSb3RhdGlvbigpLHRoaXMuc2NhbGVfPXQuZ2V0U2NhbGUoKSx0aGlzLndpZHRoXz1yWzBdfSxlfShSYSksSWE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkscixuLG8scyl7dC5jYWxsKHRoaXMsZSxpLHIsbixvLHMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5kcmF3RmxhdENvb3JkaW5hdGVzXz1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbj10aGlzLmNvb3JkaW5hdGVzLmxlbmd0aCxvPXRoaXMuYXBwZW5kRmxhdENvb3JkaW5hdGVzKHQsZSxpLHIsITEsITEpLHM9W3hhLk1PVkVfVE9fTElORV9UTyxuLG9dO3JldHVybiB0aGlzLmluc3RydWN0aW9ucy5wdXNoKHMpLHRoaXMuaGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zLnB1c2gocyksaX0sZS5wcm90b3R5cGUuZHJhd0xpbmVTdHJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnN0YXRlLHI9aS5zdHJva2VTdHlsZSxuPWkubGluZVdpZHRoO2lmKHZvaWQgMCE9PXImJnZvaWQgMCE9PW4pe3RoaXMudXBkYXRlU3Ryb2tlU3R5bGUoaSx0aGlzLmFwcGx5U3Ryb2tlKSx0aGlzLmJlZ2luR2VvbWV0cnkodCxlKSx0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKFt4YS5TRVRfU1RST0tFX1NUWUxFLGkuc3Ryb2tlU3R5bGUsaS5saW5lV2lkdGgsaS5saW5lQ2FwLGkubGluZUpvaW4saS5taXRlckxpbWl0LGkubGluZURhc2gsaS5saW5lRGFzaE9mZnNldF0sdmEpO3ZhciBvPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCkscz10LmdldFN0cmlkZSgpO3RoaXMuZHJhd0ZsYXRDb29yZGluYXRlc18obywwLG8ubGVuZ3RoLHMpLHRoaXMuaGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zLnB1c2goeWEpLHRoaXMuZW5kR2VvbWV0cnkodCxlKX19LGUucHJvdG90eXBlLmRyYXdNdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnN0YXRlLHI9aS5zdHJva2VTdHlsZSxuPWkubGluZVdpZHRoO2lmKHZvaWQgMCE9PXImJnZvaWQgMCE9PW4pe3RoaXMudXBkYXRlU3Ryb2tlU3R5bGUoaSx0aGlzLmFwcGx5U3Ryb2tlKSx0aGlzLmJlZ2luR2VvbWV0cnkodCxlKSx0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKFt4YS5TRVRfU1RST0tFX1NUWUxFLGkuc3Ryb2tlU3R5bGUsaS5saW5lV2lkdGgsaS5saW5lQ2FwLGkubGluZUpvaW4saS5taXRlckxpbWl0LGkubGluZURhc2gsaS5saW5lRGFzaE9mZnNldF0sdmEpO2Zvcih2YXIgbz10LmdldEVuZHMoKSxzPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCksYT10LmdldFN0cmlkZSgpLGg9MCxsPTAsdT1vLmxlbmd0aDtsPHU7KytsKWg9dGhpcy5kcmF3RmxhdENvb3JkaW5hdGVzXyhzLGgsb1tsXSxhKTt0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKHlhKSx0aGlzLmVuZEdlb21ldHJ5KHQsZSl9fSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN0YXRlO3ZvaWQgMCE9dC5sYXN0U3Ryb2tlJiZ0Lmxhc3RTdHJva2UhPXRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoJiZ0aGlzLmluc3RydWN0aW9ucy5wdXNoKHlhKSx0aGlzLnJldmVyc2VIaXREZXRlY3Rpb25JbnN0cnVjdGlvbnMoKSx0aGlzLnN0YXRlPW51bGx9LGUucHJvdG90eXBlLmFwcGx5U3Ryb2tlPWZ1bmN0aW9uKGUpe3ZvaWQgMCE9ZS5sYXN0U3Ryb2tlJiZlLmxhc3RTdHJva2UhPXRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoJiYodGhpcy5pbnN0cnVjdGlvbnMucHVzaCh5YSksZS5sYXN0U3Ryb2tlPXRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoKSxlLmxhc3RTdHJva2U9MCx0LnByb3RvdHlwZS5hcHBseVN0cm9rZS5jYWxsKHRoaXMsZSksdGhpcy5pbnN0cnVjdGlvbnMucHVzaCh2YSl9LGV9KFJhKSxMYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4sbyxzKXt0LmNhbGwodGhpcyxlLGkscixuLG8scyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmRyYXdGbGF0Q29vcmRpbmF0ZXNzXz1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbj10aGlzLnN0YXRlLG89dm9pZCAwIT09bi5maWxsU3R5bGUscz12b2lkIDAhPW4uc3Ryb2tlU3R5bGUsYT1pLmxlbmd0aDt0aGlzLmluc3RydWN0aW9ucy5wdXNoKHZhKSx0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKHZhKTtmb3IodmFyIGg9MDtoPGE7KytoKXt2YXIgbD1pW2hdLHU9dGhpcy5jb29yZGluYXRlcy5sZW5ndGgscD10aGlzLmFwcGVuZEZsYXRDb29yZGluYXRlcyh0LGUsbCxyLCEwLCFzKSxjPVt4YS5NT1ZFX1RPX0xJTkVfVE8sdSxwXTt0aGlzLmluc3RydWN0aW9ucy5wdXNoKGMpLHRoaXMuaGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zLnB1c2goYykscyYmKHRoaXMuaW5zdHJ1Y3Rpb25zLnB1c2gobWEpLHRoaXMuaGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zLnB1c2gobWEpKSxlPWx9cmV0dXJuIG8mJih0aGlzLmluc3RydWN0aW9ucy5wdXNoKGdhKSx0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKGdhKSkscyYmKHRoaXMuaW5zdHJ1Y3Rpb25zLnB1c2goeWEpLHRoaXMuaGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zLnB1c2goeWEpKSxlfSxlLnByb3RvdHlwZS5kcmF3Q2lyY2xlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zdGF0ZSxyPWkuZmlsbFN0eWxlLG49aS5zdHJva2VTdHlsZTtpZih2b2lkIDAhPT1yfHx2b2lkIDAhPT1uKXt0aGlzLnNldEZpbGxTdHJva2VTdHlsZXNfKHQpLHRoaXMuYmVnaW5HZW9tZXRyeSh0LGUpLHZvaWQgMCE9PWkuZmlsbFN0eWxlJiZ0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKFt4YS5TRVRfRklMTF9TVFlMRSxkcih3cyldKSx2b2lkIDAhPT1pLnN0cm9rZVN0eWxlJiZ0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKFt4YS5TRVRfU1RST0tFX1NUWUxFLGkuc3Ryb2tlU3R5bGUsaS5saW5lV2lkdGgsaS5saW5lQ2FwLGkubGluZUpvaW4saS5taXRlckxpbWl0LGkubGluZURhc2gsaS5saW5lRGFzaE9mZnNldF0pO3ZhciBvPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCkscz10LmdldFN0cmlkZSgpLGE9dGhpcy5jb29yZGluYXRlcy5sZW5ndGg7dGhpcy5hcHBlbmRGbGF0Q29vcmRpbmF0ZXMobywwLG8ubGVuZ3RoLHMsITEsITEpO3ZhciBoPVt4YS5DSVJDTEUsYV07dGhpcy5pbnN0cnVjdGlvbnMucHVzaCh2YSxoKSx0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKHZhLGgpLHRoaXMuaGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zLnB1c2goZ2EpLHZvaWQgMCE9PWkuZmlsbFN0eWxlJiZ0aGlzLmluc3RydWN0aW9ucy5wdXNoKGdhKSx2b2lkIDAhPT1pLnN0cm9rZVN0eWxlJiYodGhpcy5pbnN0cnVjdGlvbnMucHVzaCh5YSksdGhpcy5oaXREZXRlY3Rpb25JbnN0cnVjdGlvbnMucHVzaCh5YSkpLHRoaXMuZW5kR2VvbWV0cnkodCxlKX19LGUucHJvdG90eXBlLmRyYXdQb2x5Z29uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zdGF0ZSxyPWkuZmlsbFN0eWxlLG49aS5zdHJva2VTdHlsZTtpZih2b2lkIDAhPT1yfHx2b2lkIDAhPT1uKXt0aGlzLnNldEZpbGxTdHJva2VTdHlsZXNfKHQpLHRoaXMuYmVnaW5HZW9tZXRyeSh0LGUpLHZvaWQgMCE9PWkuZmlsbFN0eWxlJiZ0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKFt4YS5TRVRfRklMTF9TVFlMRSxkcih3cyldKSx2b2lkIDAhPT1pLnN0cm9rZVN0eWxlJiZ0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKFt4YS5TRVRfU1RST0tFX1NUWUxFLGkuc3Ryb2tlU3R5bGUsaS5saW5lV2lkdGgsaS5saW5lQ2FwLGkubGluZUpvaW4saS5taXRlckxpbWl0LGkubGluZURhc2gsaS5saW5lRGFzaE9mZnNldF0pO3ZhciBvPXQuZ2V0RW5kcygpLHM9dC5nZXRPcmllbnRlZEZsYXRDb29yZGluYXRlcygpLGE9dC5nZXRTdHJpZGUoKTt0aGlzLmRyYXdGbGF0Q29vcmRpbmF0ZXNzXyhzLDAsbyxhKSx0aGlzLmVuZEdlb21ldHJ5KHQsZSl9fSxlLnByb3RvdHlwZS5kcmF3TXVsdGlQb2x5Z29uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zdGF0ZSxyPWkuZmlsbFN0eWxlLG49aS5zdHJva2VTdHlsZTtpZih2b2lkIDAhPT1yfHx2b2lkIDAhPT1uKXt0aGlzLnNldEZpbGxTdHJva2VTdHlsZXNfKHQpLHRoaXMuYmVnaW5HZW9tZXRyeSh0LGUpLHZvaWQgMCE9PWkuZmlsbFN0eWxlJiZ0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKFt4YS5TRVRfRklMTF9TVFlMRSxkcih3cyldKSx2b2lkIDAhPT1pLnN0cm9rZVN0eWxlJiZ0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKFt4YS5TRVRfU1RST0tFX1NUWUxFLGkuc3Ryb2tlU3R5bGUsaS5saW5lV2lkdGgsaS5saW5lQ2FwLGkubGluZUpvaW4saS5taXRlckxpbWl0LGkubGluZURhc2gsaS5saW5lRGFzaE9mZnNldF0pO2Zvcih2YXIgbz10LmdldEVuZHNzKCkscz10LmdldE9yaWVudGVkRmxhdENvb3JkaW5hdGVzKCksYT10LmdldFN0cmlkZSgpLGg9MCxsPTAsdT1vLmxlbmd0aDtsPHU7KytsKWg9dGhpcy5kcmF3RmxhdENvb3JkaW5hdGVzc18ocyxoLG9bbF0sYSk7dGhpcy5lbmRHZW9tZXRyeSh0LGUpfX0sZS5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5yZXZlcnNlSGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zKCksdGhpcy5zdGF0ZT1udWxsO3ZhciB0PXRoaXMudG9sZXJhbmNlO2lmKDAhPT10KWZvcih2YXIgZT10aGlzLmNvb3JkaW5hdGVzLGk9MCxyPWUubGVuZ3RoO2k8cjsrK2kpZVtpXT1oaShlW2ldLHQpfSxlLnByb3RvdHlwZS5zZXRGaWxsU3Ryb2tlU3R5bGVzXz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnN0YXRlO3ZvaWQgMCE9PWUuZmlsbFN0eWxlJiZ0aGlzLnVwZGF0ZUZpbGxTdHlsZShlLHRoaXMuY3JlYXRlRmlsbCx0KSx2b2lkIDAhPT1lLnN0cm9rZVN0eWxlJiZ0aGlzLnVwZGF0ZVN0cm9rZVN0eWxlKGUsdGhpcy5hcHBseVN0cm9rZSl9LGV9KFJhKTtmdW5jdGlvbiBPYSh0LGUsaSxyLG4pe3ZhciBvLHMsYSxoLGwsdSxwLGMsZCxmPWksXz1pLGc9MCx5PTAsdj1pO2ZvcihvPWk7bzxyO28rPW4pe3ZhciBtPWVbb10seD1lW28rMV07dm9pZCAwIT09aCYmKGM9bS1oLGQ9eC1sLGE9TWF0aC5zcXJ0KGMqYytkKmQpLHZvaWQgMCE9PXUmJih5Kz1zLE1hdGguYWNvcygodSpjK3AqZCkvKHMqYSkpPnQmJih5PmcmJihnPXksZj12LF89bykseT0wLHY9by1uKSkscz1hLHU9YyxwPWQpLGg9bSxsPXh9cmV0dXJuKHkrPWEpPmc/W3Ysb106W2YsX119dmFyIFBhPXtDaXJjbGU6TGEsRGVmYXVsdDpSYSxJbWFnZTp3YSxMaW5lU3RyaW5nOklhLFBvbHlnb246TGEsVGV4dDpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4sbyxzKXt0LmNhbGwodGhpcyxlLGkscixuLG8scyksdGhpcy5kZWNsdXR0ZXJHcm91cF8sdGhpcy5sYWJlbHNfPW51bGwsdGhpcy50ZXh0Xz0iIix0aGlzLnRleHRPZmZzZXRYXz0wLHRoaXMudGV4dE9mZnNldFlfPTAsdGhpcy50ZXh0Um90YXRlV2l0aFZpZXdfPXZvaWQgMCx0aGlzLnRleHRSb3RhdGlvbl89MCx0aGlzLnRleHRGaWxsU3RhdGVfPW51bGwsdGhpcy5maWxsU3RhdGVzPXt9LHRoaXMudGV4dFN0cm9rZVN0YXRlXz1udWxsLHRoaXMuc3Ryb2tlU3RhdGVzPXt9LHRoaXMudGV4dFN0YXRlXz17fSx0aGlzLnRleHRTdGF0ZXM9e30sdGhpcy50ZXh0S2V5Xz0iIix0aGlzLmZpbGxLZXlfPSIiLHRoaXMuc3Ryb2tlS2V5Xz0iIix0aGlzLndpZHRoc189e30sUHMucHJ1bmUoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZHJhd1RleHQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnRleHRGaWxsU3RhdGVfLHI9dGhpcy50ZXh0U3Ryb2tlU3RhdGVfLG49dGhpcy50ZXh0U3RhdGVfO2lmKCIiIT09dGhpcy50ZXh0XyYmbiYmKGl8fHIpKXt2YXIgbyxzLGE9dGhpcy5jb29yZGluYXRlcy5sZW5ndGgsaD10LmdldFR5cGUoKSxsPW51bGwsdT0yLHA9MjtpZihuLnBsYWNlbWVudD09PVRyKXtpZighUHQodGhpcy5nZXRCdWZmZXJlZE1heEV4dGVudCgpLHQuZ2V0RXh0ZW50KCkpKXJldHVybjt2YXIgYztpZihsPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCkscD10LmdldFN0cmlkZSgpLGg9PU50LkxJTkVfU1RSSU5HKWM9W2wubGVuZ3RoXTtlbHNlIGlmKGg9PU50Lk1VTFRJX0xJTkVfU1RSSU5HKWM9dC5nZXRFbmRzKCk7ZWxzZSBpZihoPT1OdC5QT0xZR09OKWM9dC5nZXRFbmRzKCkuc2xpY2UoMCwxKTtlbHNlIGlmKGg9PU50Lk1VTFRJX1BPTFlHT04pe3ZhciBkPXQuZ2V0RW5kc3MoKTtmb3IoYz1bXSxvPTAscz1kLmxlbmd0aDtvPHM7KytvKWMucHVzaChkW29dWzBdKX10aGlzLmJlZ2luR2VvbWV0cnkodCxlKTtmb3IodmFyIGYsXz1uLnRleHRBbGlnbixnPTAseT0wLHY9Yy5sZW5ndGg7eTx2OysreSl7aWYodm9pZCAwPT1fKXt2YXIgbT1PYShuLm1heEFuZ2xlLGwsZyxjW3ldLHApO2c9bVswXSxmPW1bMV19ZWxzZSBmPWNbeV07Zm9yKG89ZztvPGY7bys9cCl0aGlzLmNvb3JkaW5hdGVzLnB1c2gobFtvXSxsW28rMV0pO3U9dGhpcy5jb29yZGluYXRlcy5sZW5ndGgsZz1jW3ldLHRoaXMuZHJhd0NoYXJzXyhhLHUsdGhpcy5kZWNsdXR0ZXJHcm91cF8pLGE9dX10aGlzLmVuZEdlb21ldHJ5KHQsZSl9ZWxzZXt2YXIgeD10aGlzLmdldEltYWdlKHRoaXMudGV4dF8sdGhpcy50ZXh0S2V5Xyx0aGlzLmZpbGxLZXlfLHRoaXMuc3Ryb2tlS2V5XyksRT14LndpZHRoL3RoaXMucGl4ZWxSYXRpbztzd2l0Y2goaCl7Y2FzZSBOdC5QT0lOVDpjYXNlIE50Lk1VTFRJX1BPSU5UOnU9KGw9dC5nZXRGbGF0Q29vcmRpbmF0ZXMoKSkubGVuZ3RoO2JyZWFrO2Nhc2UgTnQuTElORV9TVFJJTkc6bD10LmdldEZsYXRNaWRwb2ludCgpO2JyZWFrO2Nhc2UgTnQuQ0lSQ0xFOmw9dC5nZXRDZW50ZXIoKTticmVhaztjYXNlIE50Lk1VTFRJX0xJTkVfU1RSSU5HOnU9KGw9dC5nZXRGbGF0TWlkcG9pbnRzKCkpLmxlbmd0aDticmVhaztjYXNlIE50LlBPTFlHT046aWYobD10LmdldEZsYXRJbnRlcmlvclBvaW50KCksIW4ub3ZlcmZsb3cmJmxbMl0vdGhpcy5yZXNvbHV0aW9uPEUpcmV0dXJuO3A9MzticmVhaztjYXNlIE50Lk1VTFRJX1BPTFlHT046dmFyIFM9dC5nZXRGbGF0SW50ZXJpb3JQb2ludHMoKTtmb3IobD1bXSxvPTAscz1TLmxlbmd0aDtvPHM7bys9Mykobi5vdmVyZmxvd3x8U1tvKzJdL3RoaXMucmVzb2x1dGlvbj49RSkmJmwucHVzaChTW29dLFNbbysxXSk7aWYoMD09KHU9bC5sZW5ndGgpKXJldHVybn11PXRoaXMuYXBwZW5kRmxhdENvb3JkaW5hdGVzKGwsMCx1LHAsITEsITEpLChuLmJhY2tncm91bmRGaWxsfHxuLmJhY2tncm91bmRTdHJva2UpJiYodGhpcy5zZXRGaWxsU3Ryb2tlU3R5bGUobi5iYWNrZ3JvdW5kRmlsbCxuLmJhY2tncm91bmRTdHJva2UpLG4uYmFja2dyb3VuZEZpbGwmJih0aGlzLnVwZGF0ZUZpbGxTdHlsZSh0aGlzLnN0YXRlLHRoaXMuY3JlYXRlRmlsbCx0KSx0aGlzLmhpdERldGVjdGlvbkluc3RydWN0aW9ucy5wdXNoKHRoaXMuY3JlYXRlRmlsbCh0aGlzLnN0YXRlLHQpKSksbi5iYWNrZ3JvdW5kU3Ryb2tlJiYodGhpcy51cGRhdGVTdHJva2VTdHlsZSh0aGlzLnN0YXRlLHRoaXMuYXBwbHlTdHJva2UpLHRoaXMuaGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zLnB1c2godGhpcy5jcmVhdGVTdHJva2UodGhpcy5zdGF0ZSkpKSksdGhpcy5iZWdpbkdlb21ldHJ5KHQsZSksdGhpcy5kcmF3VGV4dEltYWdlXyh4LGEsdSksdGhpcy5lbmRHZW9tZXRyeSh0LGUpfX19LGUucHJvdG90eXBlLmdldEltYWdlPWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuLG89citlK3QraSt0aGlzLnBpeGVsUmF0aW87aWYoIVBzLmNvbnRhaW5zS2V5KG8pKXt2YXIgcz1yP3RoaXMuc3Ryb2tlU3RhdGVzW3JdfHx0aGlzLnRleHRTdHJva2VTdGF0ZV86bnVsbCxhPWk/dGhpcy5maWxsU3RhdGVzW2ldfHx0aGlzLnRleHRGaWxsU3RhdGVfOm51bGwsaD10aGlzLnRleHRTdGF0ZXNbZV18fHRoaXMudGV4dFN0YXRlXyxsPXRoaXMucGl4ZWxSYXRpbyx1PWguc2NhbGUqbCxwPVNhW2gudGV4dEFsaWdufHwiY2VudGVyIl0sYz1yJiZzLmxpbmVXaWR0aD9zLmxpbmVXaWR0aDowLGQ9dC5zcGxpdCgiXG4iKSxmPWQubGVuZ3RoLF89W10sZz1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciByPWUubGVuZ3RoLG49MCxvPTA7bzxyOysrbyl7dmFyIHM9RHModCxlW29dKTtuPU1hdGgubWF4KG4scyksaS5wdXNoKHMpfXJldHVybiBufShoLmZvbnQsZCxfKSx5PUdzKGguZm9udCksdj15KmYsbT1nK2MseD1KbihNYXRoLmNlaWwobSp1KSxNYXRoLmNlaWwoKHYrYykqdSkpO249eC5jYW52YXMsUHMuc2V0KG8sbiksMSE9dSYmeC5zY2FsZSh1LHUpLHguZm9udD1oLmZvbnQsciYmKHguc3Ryb2tlU3R5bGU9cy5zdHJva2VTdHlsZSx4LmxpbmVXaWR0aD1jLHgubGluZUNhcD1zLmxpbmVDYXAseC5saW5lSm9pbj1zLmxpbmVKb2luLHgubWl0ZXJMaW1pdD1zLm1pdGVyTGltaXQsa2kmJnMubGluZURhc2gubGVuZ3RoJiYoeC5zZXRMaW5lRGFzaChzLmxpbmVEYXNoKSx4LmxpbmVEYXNoT2Zmc2V0PXMubGluZURhc2hPZmZzZXQpKSxpJiYoeC5maWxsU3R5bGU9YS5maWxsU3R5bGUpLHgudGV4dEJhc2VsaW5lPSJtaWRkbGUiLHgudGV4dEFsaWduPSJjZW50ZXIiO3ZhciBFLFM9LjUtcCxUPXAqbi53aWR0aC91K1MqYztpZihyKWZvcihFPTA7RTxmOysrRSl4LnN0cm9rZVRleHQoZFtFXSxUK1MqX1tFXSwuNSooYyt5KStFKnkpO2lmKGkpZm9yKEU9MDtFPGY7KytFKXguZmlsbFRleHQoZFtFXSxUK1MqX1tFXSwuNSooYyt5KStFKnkpfXJldHVybiBQcy5nZXQobyl9LGUucHJvdG90eXBlLmRyYXdUZXh0SW1hZ2VfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLnRleHRTdGF0ZV8sbj10aGlzLnRleHRTdHJva2VTdGF0ZV8sbz10aGlzLnBpeGVsUmF0aW8scz1TYVtyLnRleHRBbGlnbnx8ImNlbnRlciJdLGE9U2Fbci50ZXh0QmFzZWxpbmVdLGg9biYmbi5saW5lV2lkdGg/bi5saW5lV2lkdGg6MCxsPXMqdC53aWR0aC9vKzIqKC41LXMpKmgsdT1hKnQuaGVpZ2h0L28rMiooLjUtYSkqaDt0aGlzLmluc3RydWN0aW9ucy5wdXNoKFt4YS5EUkFXX0lNQUdFLGUsaSx0LChsLXRoaXMudGV4dE9mZnNldFhfKSpvLCh1LXRoaXMudGV4dE9mZnNldFlfKSpvLHRoaXMuZGVjbHV0dGVyR3JvdXBfLHQuaGVpZ2h0LDEsMCwwLHRoaXMudGV4dFJvdGF0ZVdpdGhWaWV3Xyx0aGlzLnRleHRSb3RhdGlvbl8sMSx0LndpZHRoLHIucGFkZGluZz09T3M/T3M6ci5wYWRkaW5nLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdCpvfSksISFyLmJhY2tncm91bmRGaWxsLCEhci5iYWNrZ3JvdW5kU3Ryb2tlXSksdGhpcy5oaXREZXRlY3Rpb25JbnN0cnVjdGlvbnMucHVzaChbeGEuRFJBV19JTUFHRSxlLGksdCwobC10aGlzLnRleHRPZmZzZXRYXykqbywodS10aGlzLnRleHRPZmZzZXRZXykqbyx0aGlzLmRlY2x1dHRlckdyb3VwXyx0LmhlaWdodCwxLDAsMCx0aGlzLnRleHRSb3RhdGVXaXRoVmlld18sdGhpcy50ZXh0Um90YXRpb25fLDEvbyx0LndpZHRoLHIucGFkZGluZywhIXIuYmFja2dyb3VuZEZpbGwsISFyLmJhY2tncm91bmRTdHJva2VdKX0sZS5wcm90b3R5cGUuZHJhd0NoYXJzXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcy50ZXh0U3Ryb2tlU3RhdGVfLG49dGhpcy50ZXh0U3RhdGVfLG89dGhpcy50ZXh0RmlsbFN0YXRlXyxzPXRoaXMuc3Ryb2tlS2V5XztyJiYocyBpbiB0aGlzLnN0cm9rZVN0YXRlc3x8KHRoaXMuc3Ryb2tlU3RhdGVzW3NdPXtzdHJva2VTdHlsZTpyLnN0cm9rZVN0eWxlLGxpbmVDYXA6ci5saW5lQ2FwLGxpbmVEYXNoT2Zmc2V0OnIubGluZURhc2hPZmZzZXQsbGluZVdpZHRoOnIubGluZVdpZHRoLGxpbmVKb2luOnIubGluZUpvaW4sbWl0ZXJMaW1pdDpyLm1pdGVyTGltaXQsbGluZURhc2g6ci5saW5lRGFzaH0pKTt2YXIgYT10aGlzLnRleHRLZXlfO3RoaXMudGV4dEtleV8gaW4gdGhpcy50ZXh0U3RhdGVzfHwodGhpcy50ZXh0U3RhdGVzW3RoaXMudGV4dEtleV9dPXtmb250Om4uZm9udCx0ZXh0QWxpZ246bi50ZXh0QWxpZ258fCJjZW50ZXIiLHNjYWxlOm4uc2NhbGV9KTt2YXIgaD10aGlzLmZpbGxLZXlfO28mJihoIGluIHRoaXMuZmlsbFN0YXRlc3x8KHRoaXMuZmlsbFN0YXRlc1toXT17ZmlsbFN0eWxlOm8uZmlsbFN0eWxlfSkpO3ZhciBsPXRoaXMucGl4ZWxSYXRpbyx1PVNhW24udGV4dEJhc2VsaW5lXSxwPXRoaXMudGV4dE9mZnNldFlfKmwsYz10aGlzLnRleHRfLGQ9bi5mb250LGY9bi5zY2FsZSxfPXI/ci5saW5lV2lkdGgqZi8yOjAsZz10aGlzLndpZHRoc19bZF07Z3x8KHRoaXMud2lkdGhzX1tkXT1nPXt9KSx0aGlzLmluc3RydWN0aW9ucy5wdXNoKFt4YS5EUkFXX0NIQVJTLHQsZSx1LGksbi5vdmVyZmxvdyxoLG4ubWF4QW5nbGUsZnVuY3Rpb24odCl7dmFyIGU9Z1t0XTtyZXR1cm4gZXx8KGU9Z1t0XT1EcyhkLHQpKSxlKmYqbH0scCxzLF8qbCxjLGEsMV0pLHRoaXMuaGl0RGV0ZWN0aW9uSW5zdHJ1Y3Rpb25zLnB1c2goW3hhLkRSQVdfQ0hBUlMsdCxlLHUsaSxuLm92ZXJmbG93LGgsbi5tYXhBbmdsZSxmdW5jdGlvbih0KXt2YXIgZT1nW3RdO3JldHVybiBlfHwoZT1nW3RdPURzKGQsdCkpLGUqZn0scCxzLF8sYyxhLDEvbF0pfSxlLnByb3RvdHlwZS5zZXRUZXh0U3R5bGU9ZnVuY3Rpb24odCxlKXt2YXIgaSxyLG47aWYodCl7dGhpcy5kZWNsdXR0ZXJHcm91cF89ZTt2YXIgcz10LmdldEZpbGwoKTtzPygocj10aGlzLnRleHRGaWxsU3RhdGVfKXx8KHI9dGhpcy50ZXh0RmlsbFN0YXRlXz17fSksci5maWxsU3R5bGU9WXMocy5nZXRDb2xvcigpfHx3cykpOnI9dGhpcy50ZXh0RmlsbFN0YXRlXz1udWxsO3ZhciBhPXQuZ2V0U3Ryb2tlKCk7aWYoYSl7KG49dGhpcy50ZXh0U3Ryb2tlU3RhdGVfKXx8KG49dGhpcy50ZXh0U3Ryb2tlU3RhdGVfPXt9KTt2YXIgaD1hLmdldExpbmVEYXNoKCksbD1hLmdldExpbmVEYXNoT2Zmc2V0KCksdT1hLmdldFdpZHRoKCkscD1hLmdldE1pdGVyTGltaXQoKTtuLmxpbmVDYXA9YS5nZXRMaW5lQ2FwKCl8fCJyb3VuZCIsbi5saW5lRGFzaD1oP2guc2xpY2UoKTpJcyxuLmxpbmVEYXNoT2Zmc2V0PXZvaWQgMD09PWw/MDpsLG4ubGluZUpvaW49YS5nZXRMaW5lSm9pbigpfHwicm91bmQiLG4ubGluZVdpZHRoPXZvaWQgMD09PXU/MTp1LG4ubWl0ZXJMaW1pdD12b2lkIDA9PT1wPzEwOnAsbi5zdHJva2VTdHlsZT1ZcyhhLmdldENvbG9yKCl8fExzKX1lbHNlIG49dGhpcy50ZXh0U3Ryb2tlU3RhdGVfPW51bGw7aT10aGlzLnRleHRTdGF0ZV87dmFyIGM9dC5nZXRGb250KCl8fCIxMHB4IHNhbnMtc2VyaWYiO0FzKGMpO3ZhciBkPXQuZ2V0U2NhbGUoKTtpLm92ZXJmbG93PXQuZ2V0T3ZlcmZsb3coKSxpLmZvbnQ9YyxpLm1heEFuZ2xlPXQuZ2V0TWF4QW5nbGUoKSxpLnBsYWNlbWVudD10LmdldFBsYWNlbWVudCgpLGkudGV4dEFsaWduPXQuZ2V0VGV4dEFsaWduKCksaS50ZXh0QmFzZWxpbmU9dC5nZXRUZXh0QmFzZWxpbmUoKXx8Im1pZGRsZSIsaS5iYWNrZ3JvdW5kRmlsbD10LmdldEJhY2tncm91bmRGaWxsKCksaS5iYWNrZ3JvdW5kU3Ryb2tlPXQuZ2V0QmFja2dyb3VuZFN0cm9rZSgpLGkucGFkZGluZz10LmdldFBhZGRpbmcoKXx8T3MsaS5zY2FsZT12b2lkIDA9PT1kPzE6ZDt2YXIgZj10LmdldE9mZnNldFgoKSxfPXQuZ2V0T2Zmc2V0WSgpLGc9dC5nZXRSb3RhdGVXaXRoVmlldygpLHk9dC5nZXRSb3RhdGlvbigpO3RoaXMudGV4dF89dC5nZXRUZXh0KCl8fCIiLHRoaXMudGV4dE9mZnNldFhfPXZvaWQgMD09PWY/MDpmLHRoaXMudGV4dE9mZnNldFlfPXZvaWQgMD09PV8/MDpfLHRoaXMudGV4dFJvdGF0ZVdpdGhWaWV3Xz12b2lkIDAhPT1nJiZnLHRoaXMudGV4dFJvdGF0aW9uXz12b2lkIDA9PT15PzA6eSx0aGlzLnN0cm9rZUtleV89bj8oInN0cmluZyI9PXR5cGVvZiBuLnN0cm9rZVN0eWxlP24uc3Ryb2tlU3R5bGU6byhuLnN0cm9rZVN0eWxlKSkrbi5saW5lQ2FwK24ubGluZURhc2hPZmZzZXQrInwiK24ubGluZVdpZHRoK24ubGluZUpvaW4rbi5taXRlckxpbWl0KyJbIituLmxpbmVEYXNoLmpvaW4oKSsiXSI6IiIsdGhpcy50ZXh0S2V5Xz1pLmZvbnQraS5zY2FsZSsoaS50ZXh0QWxpZ258fCI/IiksdGhpcy5maWxsS2V5Xz1yPyJzdHJpbmciPT10eXBlb2Ygci5maWxsU3R5bGU/ci5maWxsU3R5bGU6InwiK28oci5maWxsU3R5bGUpOiIifWVsc2UgdGhpcy50ZXh0Xz0iIn0sZX0oUmEpfSxiYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4sbyxzLGEpe3QuY2FsbCh0aGlzKSx0aGlzLmRlY2x1dHRlclRyZWVfPXMsdGhpcy5kZWNsdXR0ZXJHcm91cF89bnVsbCx0aGlzLnRvbGVyYW5jZV89ZSx0aGlzLm1heEV4dGVudF89aSx0aGlzLm92ZXJsYXBzXz1vLHRoaXMucGl4ZWxSYXRpb189bix0aGlzLnJlc29sdXRpb25fPXIsdGhpcy5yZW5kZXJCdWZmZXJfPWEsdGhpcy5yZXBsYXlzQnlaSW5kZXhfPXt9LHRoaXMuaGl0RGV0ZWN0aW9uQ29udGV4dF89Sm4oMSwxKSx0aGlzLmhpdERldGVjdGlvblRyYW5zZm9ybV89WzEsMCwwLDEsMCwwXX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuYWRkRGVjbHV0dGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGw7cmV0dXJuIHRoaXMuZGVjbHV0dGVyVHJlZV8mJih0PyhlPXRoaXMuZGVjbHV0dGVyR3JvdXBfKVs0XSsrOihlPXRoaXMuZGVjbHV0dGVyR3JvdXBfPVsxLzAsMS8wLC0xLzAsLTEvMF0pLnB1c2goMSkpLGV9LGUucHJvdG90eXBlLmNsaXA9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldENsaXBDb29yZHMoZSk7dC5iZWdpblBhdGgoKSx0Lm1vdmVUbyhpWzBdLGlbMV0pLHQubGluZVRvKGlbMl0saVszXSksdC5saW5lVG8oaVs0XSxpWzVdKSx0LmxpbmVUbyhpWzZdLGlbN10pLHQuY2xpcCgpfSxlLnByb3RvdHlwZS5oYXNSZXBsYXlzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzLnJlcGxheXNCeVpJbmRleF8pZm9yKHZhciBpPXRoaXMucmVwbGF5c0J5WkluZGV4X1tlXSxyPTAsbj10Lmxlbmd0aDtyPG47KytyKWlmKHRbcl1pbiBpKXJldHVybiEwO3JldHVybiExfSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5yZXBsYXlzQnlaSW5kZXhfKXt2YXIgZT10aGlzLnJlcGxheXNCeVpJbmRleF9bdF07Zm9yKHZhciBpIGluIGUpZVtpXS5maW5pc2goKX19LGUucHJvdG90eXBlLmZvckVhY2hGZWF0dXJlQXRDb29yZGluYXRlPWZ1bmN0aW9uKHQsZSxpLHIsbixvLHMpe3ZhciBhLGg9Mioocj1NYXRoLnJvdW5kKHIpKSsxLGw9WWUodGhpcy5oaXREZXRlY3Rpb25UcmFuc2Zvcm1fLHIrLjUscisuNSwxL2UsLTEvZSwtaSwtdFswXSwtdFsxXSksdT10aGlzLmhpdERldGVjdGlvbkNvbnRleHRfO3UuY2FudmFzLndpZHRoIT09aHx8dS5jYW52YXMuaGVpZ2h0IT09aD8odS5jYW52YXMud2lkdGg9aCx1LmNhbnZhcy5oZWlnaHQ9aCk6dS5jbGVhclJlY3QoMCwwLGgsaCksdm9pZCAwIT09dGhpcy5yZW5kZXJCdWZmZXJfJiYoX3QoYT1bMS8wLDEvMCwtMS8wLC0xLzBdLHQpLGV0KGEsZSoodGhpcy5yZW5kZXJCdWZmZXJfK3IpLGEpKTt2YXIgcCxjLGQ9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09TWFbdF0pcmV0dXJuIE1hW3RdO2Zvcih2YXIgZT0yKnQrMSxpPW5ldyBBcnJheShlKSxyPTA7cjxlO3IrKylpW3JdPW5ldyBBcnJheShlKTt2YXIgbj10LG89MCxzPTA7Zm9yKDtuPj1vOylGYShpLHQrbix0K28pLEZhKGksdCtvLHQrbiksRmEoaSx0LW8sdCtuKSxGYShpLHQtbix0K28pLEZhKGksdC1uLHQtbyksRmEoaSx0LW8sdC1uKSxGYShpLHQrbyx0LW4pLEZhKGksdCtuLHQtbyksMiooKHMrPTErMiorK28pLW4pKzE+MCYmKHMrPTEtMioobi09MSkpO3JldHVybiBNYVt0XT1pLGl9KHIpO2Z1bmN0aW9uIGYodCl7Zm9yKHZhciBlPXUuZ2V0SW1hZ2VEYXRhKDAsMCxoLGgpLmRhdGEsaT0wO2k8aDtpKyspZm9yKHZhciByPTA7cjxoO3IrKylpZihkW2ldW3JdJiZlWzQqKHIqaCtpKSszXT4wKXt2YXIgbj12b2lkIDA7cmV0dXJuKCFwfHxjIT1kYS5JTUFHRSYmYyE9ZGEuVEVYVHx8LTEhPT1wLmluZGV4T2YodCkpJiYobj1vKHQpKSxufHx2b2lkIHUuY2xlYXJSZWN0KDAsMCxoLGgpfX10aGlzLmRlY2x1dHRlclRyZWVfJiYocD10aGlzLmRlY2x1dHRlclRyZWVfLmFsbCgpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pKTt2YXIgXyxnLHksdixtLHg9T2JqZWN0LmtleXModGhpcy5yZXBsYXlzQnlaSW5kZXhfKS5tYXAoTnVtYmVyKTtmb3IoeC5zb3J0KFYpLF89eC5sZW5ndGgtMTtfPj0wOy0tXyl7dmFyIEU9eFtfXS50b1N0cmluZygpO2Zvcih5PXRoaXMucmVwbGF5c0J5WkluZGV4X1tFXSxnPUVhLmxlbmd0aC0xO2c+PTA7LS1nKWlmKHZvaWQgMCE9PSh2PXlbYz1FYVtnXV0pKWlmKCFzfHxjIT1kYS5JTUFHRSYmYyE9ZGEuVEVYVCl7aWYobT12LnJlcGxheUhpdERldGVjdGlvbih1LGwsaSxuLGYsYSkpcmV0dXJuIG19ZWxzZXt2YXIgUz1zW0VdO1M/Uy5wdXNoKHYsbC5zbGljZSgwKSk6c1tFXT1bdixsLnNsaWNlKDApXX19fSxlLnByb3RvdHlwZS5nZXRDbGlwQ29vcmRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWF4RXh0ZW50XyxpPWVbMF0scj1lWzFdLG49ZVsyXSxvPWVbM10scz1baSxyLGksbyxuLG8sbixyXTtyZXR1cm4gR3QocywwLDgsMix0LHMpLHN9LGUucHJvdG90eXBlLmdldFJlcGxheT1mdW5jdGlvbih0LGUpe3ZhciBpPXZvaWQgMCE9PXQ/dC50b1N0cmluZygpOiIwIixyPXRoaXMucmVwbGF5c0J5WkluZGV4X1tpXTt2b2lkIDA9PT1yJiYocj17fSx0aGlzLnJlcGxheXNCeVpJbmRleF9baV09cik7dmFyIG49cltlXTt2b2lkIDA9PT1uJiYobj1uZXcoMCxQYVtlXSkodGhpcy50b2xlcmFuY2VfLHRoaXMubWF4RXh0ZW50Xyx0aGlzLnJlc29sdXRpb25fLHRoaXMucGl4ZWxSYXRpb18sdGhpcy5vdmVybGFwc18sdGhpcy5kZWNsdXR0ZXJUcmVlXykscltlXT1uKTtyZXR1cm4gbn0sZS5wcm90b3R5cGUuZ2V0UmVwbGF5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcGxheXNCeVpJbmRleF99LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gZCh0aGlzLnJlcGxheXNCeVpJbmRleF8pfSxlLnByb3RvdHlwZS5yZXBsYXk9ZnVuY3Rpb24odCxlLGkscixuLG8scyl7dmFyIGE9T2JqZWN0LmtleXModGhpcy5yZXBsYXlzQnlaSW5kZXhfKS5tYXAoTnVtYmVyKTthLnNvcnQoViksdC5zYXZlKCksdGhpcy5jbGlwKHQsZSk7dmFyIGgsbCx1LHAsYyxkLGY9b3x8RWE7Zm9yKGg9MCxsPWEubGVuZ3RoO2g8bDsrK2gpe3ZhciBfPWFbaF0udG9TdHJpbmcoKTtmb3IoYz10aGlzLnJlcGxheXNCeVpJbmRleF9bX10sdT0wLHA9Zi5sZW5ndGg7dTxwOysrdSl7dmFyIGc9Zlt1XTtpZihkPWNbZ10sdm9pZCAwIT09ZClpZighc3x8ZyE9ZGEuSU1BR0UmJmchPWRhLlRFWFQpZC5yZXBsYXkodCxlLGkscixuKTtlbHNle3ZhciB5PXNbX107eT95LnB1c2goZCxlLnNsaWNlKDApKTpzW19dPVtkLGUuc2xpY2UoMCldfX19dC5yZXN0b3JlKCl9LGV9KGNhKSxNYT17MDpbWyEwXV19O2Z1bmN0aW9uIEZhKHQsZSxpKXt2YXIgcixuPU1hdGguZmxvb3IodC5sZW5ndGgvMik7aWYoZT49bilmb3Iocj1uO3I8ZTtyKyspdFtyXVtpXT0hMDtlbHNlIGlmKGU8bilmb3Iocj1lKzE7cjxuO3IrKyl0W3JdW2ldPSEwfXZhciBBYT1iYSxOYT0uNSxHYT17UG9pbnQ6ZnVuY3Rpb24odCxlLGkscil7dmFyIG49aS5nZXRJbWFnZSgpO2lmKG4pe2lmKG4uZ2V0SW1hZ2VTdGF0ZSgpIT14cy5MT0FERUQpcmV0dXJuO3ZhciBvPXQuZ2V0UmVwbGF5KGkuZ2V0WkluZGV4KCksZGEuSU1BR0UpO28uc2V0SW1hZ2VTdHlsZShuLHQuYWRkRGVjbHV0dGVyKCExKSksby5kcmF3UG9pbnQoZSxyKX12YXIgcz1pLmdldFRleHQoKTtpZihzKXt2YXIgYT10LmdldFJlcGxheShpLmdldFpJbmRleCgpLGRhLlRFWFQpO2Euc2V0VGV4dFN0eWxlKHMsdC5hZGREZWNsdXR0ZXIoISFuKSksYS5kcmF3VGV4dChlLHIpfX0sTGluZVN0cmluZzpmdW5jdGlvbih0LGUsaSxyKXt2YXIgbj1pLmdldFN0cm9rZSgpO2lmKG4pe3ZhciBvPXQuZ2V0UmVwbGF5KGkuZ2V0WkluZGV4KCksZGEuTElORV9TVFJJTkcpO28uc2V0RmlsbFN0cm9rZVN0eWxlKG51bGwsbiksby5kcmF3TGluZVN0cmluZyhlLHIpfXZhciBzPWkuZ2V0VGV4dCgpO2lmKHMpe3ZhciBhPXQuZ2V0UmVwbGF5KGkuZ2V0WkluZGV4KCksZGEuVEVYVCk7YS5zZXRUZXh0U3R5bGUocyx0LmFkZERlY2x1dHRlcighMSkpLGEuZHJhd1RleHQoZSxyKX19LFBvbHlnb246ZnVuY3Rpb24odCxlLGkscil7dmFyIG49aS5nZXRGaWxsKCksbz1pLmdldFN0cm9rZSgpO2lmKG58fG8pe3ZhciBzPXQuZ2V0UmVwbGF5KGkuZ2V0WkluZGV4KCksZGEuUE9MWUdPTik7cy5zZXRGaWxsU3Ryb2tlU3R5bGUobixvKSxzLmRyYXdQb2x5Z29uKGUscil9dmFyIGE9aS5nZXRUZXh0KCk7aWYoYSl7dmFyIGg9dC5nZXRSZXBsYXkoaS5nZXRaSW5kZXgoKSxkYS5URVhUKTtoLnNldFRleHRTdHlsZShhLHQuYWRkRGVjbHV0dGVyKCExKSksaC5kcmF3VGV4dChlLHIpfX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LGUsaSxyKXt2YXIgbj1pLmdldEltYWdlKCk7aWYobil7aWYobi5nZXRJbWFnZVN0YXRlKCkhPXhzLkxPQURFRClyZXR1cm47dmFyIG89dC5nZXRSZXBsYXkoaS5nZXRaSW5kZXgoKSxkYS5JTUFHRSk7by5zZXRJbWFnZVN0eWxlKG4sdC5hZGREZWNsdXR0ZXIoITEpKSxvLmRyYXdNdWx0aVBvaW50KGUscil9dmFyIHM9aS5nZXRUZXh0KCk7aWYocyl7dmFyIGE9dC5nZXRSZXBsYXkoaS5nZXRaSW5kZXgoKSxkYS5URVhUKTthLnNldFRleHRTdHlsZShzLHQuYWRkRGVjbHV0dGVyKCEhbikpLGEuZHJhd1RleHQoZSxyKX19LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LGUsaSxyKXt2YXIgbj1pLmdldFN0cm9rZSgpO2lmKG4pe3ZhciBvPXQuZ2V0UmVwbGF5KGkuZ2V0WkluZGV4KCksZGEuTElORV9TVFJJTkcpO28uc2V0RmlsbFN0cm9rZVN0eWxlKG51bGwsbiksby5kcmF3TXVsdGlMaW5lU3RyaW5nKGUscil9dmFyIHM9aS5nZXRUZXh0KCk7aWYocyl7dmFyIGE9dC5nZXRSZXBsYXkoaS5nZXRaSW5kZXgoKSxkYS5URVhUKTthLnNldFRleHRTdHlsZShzLHQuYWRkRGVjbHV0dGVyKCExKSksYS5kcmF3VGV4dChlLHIpfX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuPWkuZ2V0RmlsbCgpLG89aS5nZXRTdHJva2UoKTtpZihvfHxuKXt2YXIgcz10LmdldFJlcGxheShpLmdldFpJbmRleCgpLGRhLlBPTFlHT04pO3Muc2V0RmlsbFN0cm9rZVN0eWxlKG4sbykscy5kcmF3TXVsdGlQb2x5Z29uKGUscil9dmFyIGE9aS5nZXRUZXh0KCk7aWYoYSl7dmFyIGg9dC5nZXRSZXBsYXkoaS5nZXRaSW5kZXgoKSxkYS5URVhUKTtoLnNldFRleHRTdHlsZShhLHQuYWRkRGVjbHV0dGVyKCExKSksaC5kcmF3VGV4dChlLHIpfX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuLG8scz1lLmdldEdlb21ldHJpZXNBcnJheSgpO2ZvcihuPTAsbz1zLmxlbmd0aDtuPG87KytuKXt2YXIgYT1HYVtzW25dLmdldFR5cGUoKV07YSh0LHNbbl0saSxyKX19LENpcmNsZTpmdW5jdGlvbih0LGUsaSxyKXt2YXIgbj1pLmdldEZpbGwoKSxvPWkuZ2V0U3Ryb2tlKCk7aWYobnx8byl7dmFyIHM9dC5nZXRSZXBsYXkoaS5nZXRaSW5kZXgoKSxkYS5DSVJDTEUpO3Muc2V0RmlsbFN0cm9rZVN0eWxlKG4sbykscy5kcmF3Q2lyY2xlKGUscil9dmFyIGE9aS5nZXRUZXh0KCk7aWYoYSl7dmFyIGg9dC5nZXRSZXBsYXkoaS5nZXRaSW5kZXgoKSxkYS5URVhUKTtoLnNldFRleHRTdHlsZShhLHQuYWRkRGVjbHV0dGVyKCExKSksaC5kcmF3VGV4dChlLHIpfX19O2Z1bmN0aW9uIERhKHQsZSl7cmV0dXJuIHBhcnNlSW50KG8odCksMTApLXBhcnNlSW50KG8oZSksMTApfWZ1bmN0aW9uIGthKHQsZSl7dmFyIGk9amEodCxlKTtyZXR1cm4gaSppfWZ1bmN0aW9uIGphKHQsZSl7cmV0dXJuIE5hKnQvZX1mdW5jdGlvbiBVYSh0LGUsaSxyLG4sbyl7dmFyIHM9ITEsYT1pLmdldEltYWdlKCk7aWYoYSl7dmFyIGg9YS5nZXRJbWFnZVN0YXRlKCk7aD09eHMuTE9BREVEfHxoPT14cy5FUlJPUj9hLnVubGlzdGVuSW1hZ2VDaGFuZ2UobixvKTooaD09eHMuSURMRSYmYS5sb2FkKCksaD1hLmdldEltYWdlU3RhdGUoKSxhLmxpc3RlbkltYWdlQ2hhbmdlKG4sbykscz0hMCl9cmV0dXJuIGZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuPWkuZ2V0R2VvbWV0cnlGdW5jdGlvbigpKGUpO2lmKCFuKXJldHVybjt2YXIgbz1uLmdldFNpbXBsaWZpZWRHZW9tZXRyeShyKTtpZihpLmdldFJlbmRlcmVyKCkpIWZ1bmN0aW9uIHQoZSxpLHIsbil7aWYoaS5nZXRUeXBlKCk9PU50LkdFT01FVFJZX0NPTExFQ1RJT04pe2Zvcih2YXIgbz1pLmdldEdlb21ldHJpZXMoKSxzPTAsYT1vLmxlbmd0aDtzPGE7KytzKXQoZSxvW3NdLHIsbik7cmV0dXJufXZhciBoPWUuZ2V0UmVwbGF5KHIuZ2V0WkluZGV4KCksZGEuREVGQVVMVCk7aC5kcmF3Q3VzdG9tKGksbixyLmdldFJlbmRlcmVyKCkpfSh0LG8saSxlKTtlbHNle3ZhciBzPUdhW28uZ2V0VHlwZSgpXTtzKHQsbyxpLGUpfX0odCxlLGksciksc312YXIgWWE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyxlKSx0aGlzLmRlY2x1dHRlclRyZWVfPWUuZ2V0RGVjbHV0dGVyKCk/dWEoKSg5LHZvaWQgMCk6bnVsbCx0aGlzLmRpcnR5Xz0hMSx0aGlzLnJlbmRlcmVkUmV2aXNpb25fPS0xLHRoaXMucmVuZGVyZWRSZXNvbHV0aW9uXz1OYU4sdGhpcy5yZW5kZXJlZEV4dGVudF89WzEvMCwxLzAsLTEvMCwtMS8wXSx0aGlzLnJlbmRlcmVkUmVuZGVyT3JkZXJfPW51bGwsdGhpcy5yZXBsYXlHcm91cF89bnVsbCx0aGlzLnJlcGxheUdyb3VwQ2hhbmdlZD0hMCx0aGlzLmNvbnRleHQ9Sm4oKSx2KFBzLE0uQ0xFQVIsdGhpcy5oYW5kbGVGb250c0NoYW5nZWRfLHRoaXMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWw9ZnVuY3Rpb24oKXt4KFBzLE0uQ0xFQVIsdGhpcy5oYW5kbGVGb250c0NoYW5nZWRfLHRoaXMpLHQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5jb21wb3NlPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1lLmV4dGVudCxuPWUucGl4ZWxSYXRpbyxvPWkubWFuYWdlZD9lLnNraXBwZWRGZWF0dXJlVWlkczp7fSxzPWUudmlld1N0YXRlLGE9cy5wcm9qZWN0aW9uLGg9cy5yb3RhdGlvbixsPWEuZ2V0RXh0ZW50KCksdT10aGlzLmdldExheWVyKCkuZ2V0U291cmNlKCkscD10aGlzLmdldFRyYW5zZm9ybShlLDApLGM9aS5leHRlbnQsZD12b2lkIDAhPT1jO2QmJnRoaXMuY2xpcCh0LGUsYyk7dmFyIGY9dGhpcy5yZXBsYXlHcm91cF87aWYoZiYmIWYuaXNFbXB0eSgpKXt0aGlzLmRlY2x1dHRlclRyZWVfJiZ0aGlzLmRlY2x1dHRlclRyZWVfLmNsZWFyKCk7dmFyIF8sZz10aGlzLmdldExheWVyKCkseT0wLHY9MCxtPTEhPT1pLm9wYWNpdHkseD1nLmhhc0xpc3RlbmVyKHVyLlJFTkRFUik7aWYobXx8eCl7dmFyIEU9dC5jYW52YXMud2lkdGgsUz10LmNhbnZhcy5oZWlnaHQ7aWYoaCl7dmFyIFQ9TWF0aC5yb3VuZChNYXRoLnNxcnQoRSpFK1MqUykpO3k9KFQtRSkvMix2PShULVMpLzIsRT1TPVR9dGhpcy5jb250ZXh0LmNhbnZhcy53aWR0aD1FLHRoaXMuY29udGV4dC5jYW52YXMuaGVpZ2h0PVMsXz10aGlzLmNvbnRleHR9ZWxzZSBfPXQ7dmFyIEM9Xy5nbG9iYWxBbHBoYTttfHwoXy5nbG9iYWxBbHBoYT1pLm9wYWNpdHkpLF8hPXQmJl8udHJhbnNsYXRlKHksdik7dmFyIFI9ZS52aWV3SGludHMsdz0hKFJba25dfHxSW2puXSksST1lLnNpemVbMF0qbixMPWUuc2l6ZVsxXSpuO2lmKGtzKF8sLWgsSS8yLEwvMiksZi5yZXBsYXkoXyxwLGgsbyx3KSx1LmdldFdyYXBYKCkmJmEuY2FuV3JhcFgoKSYmIW90KGwscikpe2Zvcih2YXIgTyxQPXJbMF0sYj1PdChsKSxNPTA7UDxsWzBdOylPPWIqLS1NLHA9dGhpcy5nZXRUcmFuc2Zvcm0oZSxPKSxmLnJlcGxheShfLHAsaCxvLHcpLFArPWI7Zm9yKE09MCxQPXJbMl07UD5sWzJdOylPPWIqKytNLHA9dGhpcy5nZXRUcmFuc2Zvcm0oZSxPKSxmLnJlcGxheShfLHAsaCxvLHcpLFAtPWJ9aWYoa3MoXyxoLEkvMixMLzIpLHgmJnRoaXMuZGlzcGF0Y2hSZW5kZXJFdmVudChfLGUscCksXyE9dCl7aWYobSl7dmFyIEY9dC5nbG9iYWxBbHBoYTt0Lmdsb2JhbEFscGhhPWkub3BhY2l0eSx0LmRyYXdJbWFnZShfLmNhbnZhcywteSwtdiksdC5nbG9iYWxBbHBoYT1GfWVsc2UgdC5kcmF3SW1hZ2UoXy5jYW52YXMsLXksLXYpO18udHJhbnNsYXRlKC15LC12KX1tfHwoXy5nbG9iYWxBbHBoYT1DKX1kJiZ0LnJlc3RvcmUoKX0sZS5wcm90b3R5cGUuY29tcG9zZUZyYW1lPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLmdldFRyYW5zZm9ybSh0LDApO3RoaXMucHJlQ29tcG9zZShpLHQsciksdGhpcy5jb21wb3NlKGksdCxlKSx0aGlzLnBvc3RDb21wb3NlKGksdCxlLHIpfSxlLnByb3RvdHlwZS5mb3JFYWNoRmVhdHVyZUF0Q29vcmRpbmF0ZT1mdW5jdGlvbih0LGUsaSxyLG4pe2lmKHRoaXMucmVwbGF5R3JvdXBfKXt2YXIgcz1lLnZpZXdTdGF0ZS5yZXNvbHV0aW9uLGE9ZS52aWV3U3RhdGUucm90YXRpb24saD10aGlzLmdldExheWVyKCksbD17fTtyZXR1cm4gdGhpcy5yZXBsYXlHcm91cF8uZm9yRWFjaEZlYXR1cmVBdENvb3JkaW5hdGUodCxzLGEsaSx7fSxmdW5jdGlvbih0KXt2YXIgZT1vKHQpO2lmKCEoZSBpbiBsKSlyZXR1cm4gbFtlXT0hMCxyLmNhbGwobix0LGgpfSxudWxsKX19LGUucHJvdG90eXBlLmhhbmRsZUZvbnRzQ2hhbmdlZF89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRMYXllcigpO2UuZ2V0VmlzaWJsZSgpJiZ0aGlzLnJlcGxheUdyb3VwXyYmZS5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmhhbmRsZVN0eWxlSW1hZ2VDaGFuZ2VfPWZ1bmN0aW9uKHQpe3RoaXMucmVuZGVySWZSZWFkeUFuZFZpc2libGUoKX0sZS5wcm90b3R5cGUucHJlcGFyZUZyYW1lPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRMYXllcigpLHI9aS5nZXRTb3VyY2UoKSxuPXQudmlld0hpbnRzW2tuXSxvPXQudmlld0hpbnRzW2puXSxzPWkuZ2V0VXBkYXRlV2hpbGVBbmltYXRpbmcoKSxhPWkuZ2V0VXBkYXRlV2hpbGVJbnRlcmFjdGluZygpO2lmKCF0aGlzLmRpcnR5XyYmIXMmJm58fCFhJiZvKXJldHVybiEwO3ZhciBoPXQuZXh0ZW50LGw9dC52aWV3U3RhdGUsdT1sLnByb2plY3Rpb24scD1sLnJlc29sdXRpb24sYz10LnBpeGVsUmF0aW8sZD1pLmdldFJldmlzaW9uKCksZj1pLmdldFJlbmRlckJ1ZmZlcigpLF89aS5nZXRSZW5kZXJPcmRlcigpO3ZvaWQgMD09PV8mJihfPURhKTt2YXIgZz1ldChoLGYqcCkseT1sLnByb2plY3Rpb24uZ2V0RXh0ZW50KCk7aWYoci5nZXRXcmFwWCgpJiZsLnByb2plY3Rpb24uY2FuV3JhcFgoKSYmIW90KHksdC5leHRlbnQpKXt2YXIgdj1PdCh5KSxtPU1hdGgubWF4KE90KGcpLzIsdik7Z1swXT15WzBdLW0sZ1syXT15WzJdK219aWYoIXRoaXMuZGlydHlfJiZ0aGlzLnJlbmRlcmVkUmVzb2x1dGlvbl89PXAmJnRoaXMucmVuZGVyZWRSZXZpc2lvbl89PWQmJnRoaXMucmVuZGVyZWRSZW5kZXJPcmRlcl89PV8mJm90KHRoaXMucmVuZGVyZWRFeHRlbnRfLGcpKXJldHVybiB0aGlzLnJlcGxheUdyb3VwQ2hhbmdlZD0hMSwhMDt0aGlzLnJlcGxheUdyb3VwXz1udWxsLHRoaXMuZGlydHlfPSExO3ZhciB4PW5ldyBBYShqYShwLGMpLGcscCxjLHIuZ2V0T3ZlcmxhcHMoKSx0aGlzLmRlY2x1dHRlclRyZWVfLGkuZ2V0UmVuZGVyQnVmZmVyKCkpO3IubG9hZEZlYXR1cmVzKGcscCx1KTt2YXIgRT1mdW5jdGlvbih0KXt2YXIgZSxyPXQuZ2V0U3R5bGVGdW5jdGlvbigpfHxpLmdldFN0eWxlRnVuY3Rpb24oKTtpZihyJiYoZT1yKHQscCkpLGUpe3ZhciBuPXRoaXMucmVuZGVyRmVhdHVyZSh0LHAsYyxlLHgpO3RoaXMuZGlydHlfPXRoaXMuZGlydHlffHxufX0uYmluZCh0aGlzKTtpZihfKXt2YXIgUz1bXTtyLmZvckVhY2hGZWF0dXJlSW5FeHRlbnQoZyxmdW5jdGlvbih0KXtTLnB1c2godCl9KSxTLnNvcnQoXyk7Zm9yKHZhciBUPTAsQz1TLmxlbmd0aDtUPEM7KytUKUUoU1tUXSl9ZWxzZSByLmZvckVhY2hGZWF0dXJlSW5FeHRlbnQoZyxFKTtyZXR1cm4geC5maW5pc2goKSx0aGlzLnJlbmRlcmVkUmVzb2x1dGlvbl89cCx0aGlzLnJlbmRlcmVkUmV2aXNpb25fPWQsdGhpcy5yZW5kZXJlZFJlbmRlck9yZGVyXz1fLHRoaXMucmVuZGVyZWRFeHRlbnRfPWcsdGhpcy5yZXBsYXlHcm91cF89eCx0aGlzLnJlcGxheUdyb3VwQ2hhbmdlZD0hMCwhMH0sZS5wcm90b3R5cGUucmVuZGVyRmVhdHVyZT1mdW5jdGlvbih0LGUsaSxyLG4pe2lmKCFyKXJldHVybiExO3ZhciBvPSExO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBzPTAsYT1yLmxlbmd0aDtzPGE7KytzKW89VWEobix0LHJbc10sa2EoZSxpKSx0aGlzLmhhbmRsZVN0eWxlSW1hZ2VDaGFuZ2VfLHRoaXMpfHxvO2Vsc2Ugbz1VYShuLHQscixrYShlLGkpLHRoaXMuaGFuZGxlU3R5bGVJbWFnZUNoYW5nZV8sdGhpcyk7cmV0dXJuIG99LGV9KHRhKTtZYS5oYW5kbGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFR5cGUoKT09PVNzLlZFQ1RPUn0sWWEuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBZYShlKX07dmFyIEJhPVlhLFZhPXtJTUFHRToiaW1hZ2UiLEhZQlJJRDoiaHlicmlkIixWRUNUT1I6InZlY3RvciJ9LFhhPXtpbWFnZTpbZGEuUE9MWUdPTixkYS5DSVJDTEUsZGEuTElORV9TVFJJTkcsZGEuSU1BR0UsZGEuVEVYVF0saHlicmlkOltkYS5QT0xZR09OLGRhLkxJTkVfU1RSSU5HXX0semE9e2ltYWdlOltkYS5ERUZBVUxUXSxoeWJyaWQ6W2RhLklNQUdFLGRhLlRFWFQsZGEuREVGQVVMVF0sdmVjdG9yOkVhfSxXYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLGUsITApLHRoaXMuZGVjbHV0dGVyVHJlZV89ZS5nZXREZWNsdXR0ZXIoKT91YSgpKDksdm9pZCAwKTpudWxsLHRoaXMuZGlydHlfPSExLHRoaXMucmVuZGVyZWRMYXllclJldmlzaW9uXyx0aGlzLnRtcFRyYW5zZm9ybV89WzEsMCwwLDEsMCwwXTt2YXIgaT1lLmdldFJlbmRlck1vZGUoKTt0aGlzLnpEaXJlY3Rpb249aT09PVZhLlZFQ1RPUj8xOjAsaSE9PVZhLlZFQ1RPUiYmKHRoaXMuY29udGV4dD1KbigpKSx2KFBzLE0uQ0xFQVIsdGhpcy5oYW5kbGVGb250c0NoYW5nZWRfLHRoaXMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWw9ZnVuY3Rpb24oKXt4KFBzLE0uQ0xFQVIsdGhpcy5oYW5kbGVGb250c0NoYW5nZWRfLHRoaXMpLHQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5nZXRUaWxlPWZ1bmN0aW9uKGUsaSxyLG4sbyl7dmFyIHM9dC5wcm90b3R5cGUuZ2V0VGlsZS5jYWxsKHRoaXMsZSxpLHIsbixvKTtyZXR1cm4gcy5nZXRTdGF0ZSgpPT09T24uTE9BREVEJiYodGhpcy5jcmVhdGVSZXBsYXlHcm91cF8ocyxuLG8pLHRoaXMuY29udGV4dCYmdGhpcy5yZW5kZXJUaWxlSW1hZ2VfKHMsbixvKSksc30sZS5wcm90b3R5cGUuZ2V0VGlsZUltYWdlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0TGF5ZXIoKTtyZXR1cm4gdC5nZXRJbWFnZShlKX0sZS5wcm90b3R5cGUucHJlcGFyZUZyYW1lPWZ1bmN0aW9uKGUsaSl7dmFyIHI9dGhpcy5nZXRMYXllcigpLmdldFJldmlzaW9uKCk7cmV0dXJuIHRoaXMucmVuZGVyZWRMYXllclJldmlzaW9uXyE9ciYmKHRoaXMucmVuZGVyZWRUaWxlcy5sZW5ndGg9MCksdGhpcy5yZW5kZXJlZExheWVyUmV2aXNpb25fPXIsdC5wcm90b3R5cGUucHJlcGFyZUZyYW1lLmNhbGwodGhpcyxlLGkpfSxlLnByb3RvdHlwZS5jcmVhdGVSZXBsYXlHcm91cF89ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMsbj10aGlzLmdldExheWVyKCksbz1uLmdldFJldmlzaW9uKCkscz1uLmdldFJlbmRlck9yZGVyKCl8fG51bGwsYT10LmdldFJlcGxheVN0YXRlKG4pO2lmKGEuZGlydHl8fGEucmVuZGVyZWRSZXZpc2lvbiE9b3x8YS5yZW5kZXJlZFJlbmRlck9yZGVyIT1zKXtmb3IodmFyIGg9bi5nZXRTb3VyY2UoKSxsPWguZ2V0VGlsZUdyaWQoKSx1PWguZ2V0VGlsZUdyaWRGb3JQcm9qZWN0aW9uKGkpLmdldFJlc29sdXRpb24odC50aWxlQ29vcmRbMF0pLHA9dC5leHRlbnQsYz1mdW5jdGlvbihvLGMpe3ZhciBkPXQuZ2V0VGlsZSh0LnRpbGVLZXlzW29dKTtpZihkLmdldFN0YXRlKCk9PU9uLkxPQURFRCl7dmFyIGY9ZC50aWxlQ29vcmQsXz1sLmdldFRpbGVDb29yZEV4dGVudChmKSxnPXd0KHAsXykseT1kdChfLGcpP251bGw6ZXQoZyxuLmdldFJlbmRlckJ1ZmZlcigpKnUsci50bXBFeHRlbnQpLHY9ZC5nZXRQcm9qZWN0aW9uKCksbT0hMTtJZShpLHYpfHwobT0hMCxkLnNldFByb2plY3Rpb24oaSkpLGEuZGlydHk9ITE7dmFyIHg9bmV3IEFhKDAsZyx1LGUsaC5nZXRPdmVybGFwcygpLHIuZGVjbHV0dGVyVHJlZV8sbi5nZXRSZW5kZXJCdWZmZXIoKSksRT1rYSh1LGUpLFM9ZnVuY3Rpb24odCl7dmFyIGUsaT10LmdldFN0eWxlRnVuY3Rpb24oKXx8bi5nZXRTdHlsZUZ1bmN0aW9uKCk7aWYoaSYmKGU9aSh0LHUpKSxlKXt2YXIgcj10aGlzLnJlbmRlckZlYXR1cmUodCxFLGUseCk7dGhpcy5kaXJ0eV89dGhpcy5kaXJ0eV98fHIsYS5kaXJ0eT1hLmRpcnR5fHxyfX0sVD1kLmdldEZlYXR1cmVzKCk7cyYmcyE9PWEucmVuZGVyZWRSZW5kZXJPcmRlciYmVC5zb3J0KHMpO2Zvcih2YXIgQz0wLFI9VC5sZW5ndGg7QzxSOysrQyl7dmFyIHc9VFtDXTttJiYodi5nZXRVbml0cygpPT0kdC5USUxFX1BJWEVMUyYmKHYuc2V0V29ybGRFeHRlbnQoXyksdi5zZXRFeHRlbnQoZC5nZXRFeHRlbnQoKSkpLHcuZ2V0R2VvbWV0cnkoKS50cmFuc2Zvcm0odixpKSkseSYmIVB0KHksdy5nZXRHZW9tZXRyeSgpLmdldEV4dGVudCgpKXx8Uy5jYWxsKHIsdyl9eC5maW5pc2goKSxkLnNldFJlcGxheUdyb3VwKG4sdC50aWxlQ29vcmQudG9TdHJpbmcoKSx4KX19LGQ9MCxmPXQudGlsZUtleXMubGVuZ3RoO2Q8ZjsrK2QpYyhkKTthLnJlbmRlcmVkUmV2aXNpb249byxhLnJlbmRlcmVkUmVuZGVyT3JkZXI9c319LGUucHJvdG90eXBlLmZvckVhY2hGZWF0dXJlQXRDb29yZGluYXRlPWZ1bmN0aW9uKHQsZSxpLHIsbil7dmFyIHM9ZS52aWV3U3RhdGUucmVzb2x1dGlvbixhPWUudmlld1N0YXRlLnJvdGF0aW9uO2k9dm9pZCAwPT1pPzA6aTt2YXIgaCxsLHUscCxjPXRoaXMuZ2V0TGF5ZXIoKSxkPXt9LGY9dGhpcy5yZW5kZXJlZFRpbGVzO2Zvcih1PTAscD1mLmxlbmd0aDt1PHA7Kyt1KXt2YXIgXz1mW3VdO2lmKG50KGg9ZXQoXy5leHRlbnQsaSpzLGgpLHQpKWZvcih2YXIgZz0wLHk9Xy50aWxlS2V5cy5sZW5ndGg7Zzx5OysrZyl7dmFyIHY9Xy5nZXRUaWxlKF8udGlsZUtleXNbZ10pO2lmKHYuZ2V0U3RhdGUoKT09T24uTE9BREVEKXt2YXIgbT12LmdldFJlcGxheUdyb3VwKGMsXy50aWxlQ29vcmQudG9TdHJpbmcoKSk7bD1sfHxtLmZvckVhY2hGZWF0dXJlQXRDb29yZGluYXRlKHQscyxhLGkse30sZnVuY3Rpb24odCl7dmFyIGU9byh0KTtpZighKGUgaW4gZCkpcmV0dXJuIGRbZV09ITAsci5jYWxsKG4sdCxjKX0sbnVsbCl9fX1yZXR1cm4gbH0sZS5wcm90b3R5cGUuZ2V0UmVwbGF5VHJhbnNmb3JtXz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0TGF5ZXIoKS5nZXRTb3VyY2UoKS5nZXRUaWxlR3JpZCgpLHI9dC50aWxlQ29vcmQsbj1pLmdldFJlc29sdXRpb24oclswXSksbz1lLnZpZXdTdGF0ZSxzPWUucGl4ZWxSYXRpbyxhPW8ucmVzb2x1dGlvbi9zLGg9aS5nZXRUaWxlQ29vcmRFeHRlbnQocix0aGlzLnRtcEV4dGVudCksbD1vLmNlbnRlcix1PUl0KGgpLHA9ZS5zaXplLGM9TWF0aC5yb3VuZChzKnBbMF0vMiksZD1NYXRoLnJvdW5kKHMqcFsxXS8yKTtyZXR1cm4gWWUodGhpcy50bXBUcmFuc2Zvcm1fLGMsZCxuL2Esbi9hLG8ucm90YXRpb24sKHVbMF0tbFswXSkvbiwobFsxXS11WzFdKS9uKX0sZS5wcm90b3R5cGUuaGFuZGxlRm9udHNDaGFuZ2VkXz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldExheWVyKCk7ZS5nZXRWaXNpYmxlKCkmJnZvaWQgMCE9PXRoaXMucmVuZGVyZWRMYXllclJldmlzaW9uXyYmZS5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmhhbmRsZVN0eWxlSW1hZ2VDaGFuZ2VfPWZ1bmN0aW9uKHQpe3RoaXMucmVuZGVySWZSZWFkeUFuZFZpc2libGUoKX0sZS5wcm90b3R5cGUucG9zdENvbXBvc2U9ZnVuY3Rpb24oZSxpLHIpe3ZhciBuPXRoaXMuZ2V0TGF5ZXIoKSxvPW4uZ2V0UmVuZGVyTW9kZSgpO2lmKG8hPVZhLklNQUdFKXt2YXIgcyxhLGg9bi5nZXREZWNsdXR0ZXIoKT97fTpudWxsLGw9bi5nZXRTb3VyY2UoKSx1PXphW29dLHA9aS5waXhlbFJhdGlvLGM9aS52aWV3U3RhdGUucm90YXRpb24sZD1pLnNpemU7YyYma3MoZSwtYyxzPU1hdGgucm91bmQocCpkWzBdLzIpLGE9TWF0aC5yb3VuZChwKmRbMV0vMikpLGgmJnRoaXMuZGVjbHV0dGVyVHJlZV8uY2xlYXIoKTtmb3IodmFyIGY9aS52aWV3SGludHMsXz0hKGZba25dfHxmW2puXSksZz10aGlzLnJlbmRlcmVkVGlsZXMseT1sLmdldFRpbGVHcmlkRm9yUHJvamVjdGlvbihpLnZpZXdTdGF0ZS5wcm9qZWN0aW9uKSx2PVtdLG09W10seD1nLmxlbmd0aC0xO3g+PTA7LS14KXt2YXIgRT1nW3hdO2lmKEUuZ2V0U3RhdGUoKSE9T24uQUJPUlQpZm9yKHZhciBTPUUudGlsZUNvb3JkLFQ9eS5nZXRUaWxlQ29vcmRFeHRlbnQoUyx0aGlzLnRtcEV4dGVudClbMF0tRS5leHRlbnRbMF0sQz12b2lkIDAsUj0wLHc9RS50aWxlS2V5cy5sZW5ndGg7Ujx3OysrUil7dmFyIEk9RS5nZXRUaWxlKEUudGlsZUtleXNbUl0pO2lmKEkuZ2V0U3RhdGUoKT09T24uTE9BREVEKXt2YXIgTD1JLmdldFJlcGxheUdyb3VwKG4sUy50b1N0cmluZygpKTtpZihMJiZMLmhhc1JlcGxheXModSkpe0N8fChDPXRoaXMuZ2V0VHJhbnNmb3JtKGksVCkpO3ZhciBPPUkudGlsZUNvb3JkWzBdLFA9TC5nZXRDbGlwQ29vcmRzKEMpO2Uuc2F2ZSgpLGUuZ2xvYmFsQWxwaGE9ci5vcGFjaXR5O2Zvcih2YXIgYj0wLE09di5sZW5ndGg7YjxNOysrYil7dmFyIEY9dltiXTtPPG1bYl0mJihlLmJlZ2luUGF0aCgpLGUubW92ZVRvKFBbMF0sUFsxXSksZS5saW5lVG8oUFsyXSxQWzNdKSxlLmxpbmVUbyhQWzRdLFBbNV0pLGUubGluZVRvKFBbNl0sUFs3XSksZS5tb3ZlVG8oRls2XSxGWzddKSxlLmxpbmVUbyhGWzRdLEZbNV0pLGUubGluZVRvKEZbMl0sRlszXSksZS5saW5lVG8oRlswXSxGWzFdKSxlLmNsaXAoKSl9TC5yZXBsYXkoZSxDLGMse30sXyx1LGgpLGUucmVzdG9yZSgpLHYucHVzaChQKSxtLnB1c2goTyl9fX19aCYmZnVuY3Rpb24odCxlLGkscil7Zm9yKHZhciBuPU9iamVjdC5rZXlzKHQpLm1hcChOdW1iZXIpLnNvcnQoViksbz17fSxzPTAsYT1uLmxlbmd0aDtzPGE7KytzKWZvcih2YXIgaD10W25bc10udG9TdHJpbmcoKV0sbD0wLHU9aC5sZW5ndGg7bDx1Oyl7dmFyIHA9aFtsKytdLGM9aFtsKytdO3AucmVwbGF5KGUsYyxpLG8scil9fShoLGUsYyxfKSxjJiZrcyhlLGMscyxhKX10LnByb3RvdHlwZS5wb3N0Q29tcG9zZS5jYWxsKHRoaXMsZSxpLHIpfSxlLnByb3RvdHlwZS5yZW5kZXJGZWF0dXJlPWZ1bmN0aW9uKHQsZSxpLHIpe2lmKCFpKXJldHVybiExO3ZhciBuPSExO2lmKEFycmF5LmlzQXJyYXkoaSkpZm9yKHZhciBvPTAscz1pLmxlbmd0aDtvPHM7KytvKW49VWEocix0LGlbb10sZSx0aGlzLmhhbmRsZVN0eWxlSW1hZ2VDaGFuZ2VfLHRoaXMpfHxuO2Vsc2Ugbj1VYShyLHQsaSxlLHRoaXMuaGFuZGxlU3R5bGVJbWFnZUNoYW5nZV8sdGhpcyk7cmV0dXJuIG59LGUucHJvdG90eXBlLnJlbmRlclRpbGVJbWFnZV89ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMuZ2V0TGF5ZXIoKSxuPXQuZ2V0UmVwbGF5U3RhdGUociksbz1yLmdldFJldmlzaW9uKCkscz1YYVtyLmdldFJlbmRlck1vZGUoKV07aWYocyYmbi5yZW5kZXJlZFRpbGVSZXZpc2lvbiE9PW8pe24ucmVuZGVyZWRUaWxlUmV2aXNpb249bzt2YXIgYT10LndyYXBwZWRUaWxlQ29vcmQsaD1hWzBdLGw9ci5nZXRTb3VyY2UoKSx1PWwuZ2V0VGlsZUdyaWRGb3JQcm9qZWN0aW9uKGkpLHA9dS5nZXRSZXNvbHV0aW9uKGgpLGM9dC5nZXRDb250ZXh0KHIpLGQ9bC5nZXRUaWxlUGl4ZWxTaXplKGgsZSxpKTtjLmNhbnZhcy53aWR0aD1kWzBdLGMuY2FudmFzLmhlaWdodD1kWzFdO2Zvcih2YXIgZj11LmdldFRpbGVDb29yZEV4dGVudChhLHRoaXMudG1wRXh0ZW50KSxfPTAsZz10LnRpbGVLZXlzLmxlbmd0aDtfPGc7KytfKXt2YXIgeT10LmdldFRpbGUodC50aWxlS2V5c1tfXSk7aWYoeS5nZXRTdGF0ZSgpPT1Pbi5MT0FERUQpe3ZhciB2PWUvcCxtPUZlKHRoaXMudG1wVHJhbnNmb3JtXyk7amUobSx2LC12KSxVZShtLC1mWzBdLC1mWzNdKSx5LmdldFJlcGxheUdyb3VwKHIsdC50aWxlQ29vcmQudG9TdHJpbmcoKSkucmVwbGF5KGMsbSwwLHt9LCEwLHMpfX19fSxlfShoYSk7V2EuaGFuZGxlcz1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRUeXBlKCk9PT1Tcy5WRUNUT1JfVElMRX0sV2EuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBXYShlKX07dmFyIEthPVdhLEhhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7KGU9dSh7fSxlKSkuY29udHJvbHN8fChlLmNvbnRyb2xzPXdvKCkpLGUuaW50ZXJhY3Rpb25zfHwoZS5pbnRlcmFjdGlvbnM9eXMoKSksdC5jYWxsKHRoaXMsZSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNyZWF0ZVJlbmRlcmVyPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFFzKHRoaXMpO3JldHVybiB0LnJlZ2lzdGVyTGF5ZXJSZW5kZXJlcnMoW3JhLGhhLEJhLEthXSksdH0sZX0obG8pLFphPXtCT1RUT01fTEVGVDoiYm90dG9tLWxlZnQiLEJPVFRPTV9DRU5URVI6ImJvdHRvbS1jZW50ZXIiLEJPVFRPTV9SSUdIVDoiYm90dG9tLXJpZ2h0IixDRU5URVJfTEVGVDoiY2VudGVyLWxlZnQiLENFTlRFUl9DRU5URVI6ImNlbnRlci1jZW50ZXIiLENFTlRFUl9SSUdIVDoiY2VudGVyLXJpZ2h0IixUT1BfTEVGVDoidG9wLWxlZnQiLFRPUF9DRU5URVI6InRvcC1jZW50ZXIiLFRPUF9SSUdIVDoidG9wLXJpZ2h0In0scWE9e0VMRU1FTlQ6ImVsZW1lbnQiLE1BUDoibWFwIixPRkZTRVQ6Im9mZnNldCIsUE9TSVRJT046InBvc2l0aW9uIixQT1NJVElPTklORzoicG9zaXRpb25pbmcifSxKYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLm9wdGlvbnM9ZSx0aGlzLmlkPWUuaWQsdGhpcy5pbnNlcnRGaXJzdD12b2lkIDA9PT1lLmluc2VydEZpcnN0fHxlLmluc2VydEZpcnN0LHRoaXMuc3RvcEV2ZW50PXZvaWQgMD09PWUuc3RvcEV2ZW50fHxlLnN0b3BFdmVudCx0aGlzLmVsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT12b2lkIDAhPT1lLmNsYXNzTmFtZT9lLmNsYXNzTmFtZToib2wtb3ZlcmxheS1jb250YWluZXIgIitjbyx0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmF1dG9QYW49dm9pZCAwIT09ZS5hdXRvUGFuJiZlLmF1dG9QYW4sdGhpcy5hdXRvUGFuQW5pbWF0aW9uPWUuYXV0b1BhbkFuaW1hdGlvbnx8e30sdGhpcy5hdXRvUGFuTWFyZ2luPXZvaWQgMCE9PWUuYXV0b1Bhbk1hcmdpbj9lLmF1dG9QYW5NYXJnaW46MjAsdGhpcy5yZW5kZXJlZD17Ym90dG9tXzoiIixsZWZ0XzoiIixyaWdodF86IiIsdG9wXzoiIix2aXNpYmxlOiEwfSx0aGlzLm1hcFBvc3RyZW5kZXJMaXN0ZW5lcktleT1udWxsLHYodGhpcyxHKHFhLkVMRU1FTlQpLHRoaXMuaGFuZGxlRWxlbWVudENoYW5nZWQsdGhpcyksdih0aGlzLEcocWEuTUFQKSx0aGlzLmhhbmRsZU1hcENoYW5nZWQsdGhpcyksdih0aGlzLEcocWEuT0ZGU0VUKSx0aGlzLmhhbmRsZU9mZnNldENoYW5nZWQsdGhpcyksdih0aGlzLEcocWEuUE9TSVRJT04pLHRoaXMuaGFuZGxlUG9zaXRpb25DaGFuZ2VkLHRoaXMpLHYodGhpcyxHKHFhLlBPU0lUSU9OSU5HKSx0aGlzLmhhbmRsZVBvc2l0aW9uaW5nQ2hhbmdlZCx0aGlzKSx2b2lkIDAhPT1lLmVsZW1lbnQmJnRoaXMuc2V0RWxlbWVudChlLmVsZW1lbnQpLHRoaXMuc2V0T2Zmc2V0KHZvaWQgMCE9PWUub2Zmc2V0P2Uub2Zmc2V0OlswLDBdKSx0aGlzLnNldFBvc2l0aW9uaW5nKHZvaWQgMCE9PWUucG9zaXRpb25pbmc/ZS5wb3NpdGlvbmluZzpaYS5UT1BfTEVGVCksdm9pZCAwIT09ZS5wb3NpdGlvbiYmdGhpcy5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChxYS5FTEVNRU5UKX0sZS5wcm90b3R5cGUuZ2V0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZS5wcm90b3R5cGUuZ2V0TWFwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KHFhLk1BUCl9LGUucHJvdG90eXBlLmdldE9mZnNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChxYS5PRkZTRVQpfSxlLnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChxYS5QT1NJVElPTil9LGUucHJvdG90eXBlLmdldFBvc2l0aW9uaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KHFhLlBPU0lUSU9OSU5HKX0sZS5wcm90b3R5cGUuaGFuZGxlRWxlbWVudENoYW5nZWQ9ZnVuY3Rpb24oKXt0byh0aGlzLmVsZW1lbnQpO3ZhciB0PXRoaXMuZ2V0RWxlbWVudCgpO3QmJnRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0KX0sZS5wcm90b3R5cGUuaGFuZGxlTWFwQ2hhbmdlZD1mdW5jdGlvbigpe3RoaXMubWFwUG9zdHJlbmRlckxpc3RlbmVyS2V5JiYoJG4odGhpcy5lbGVtZW50KSxFKHRoaXMubWFwUG9zdHJlbmRlckxpc3RlbmVyS2V5KSx0aGlzLm1hcFBvc3RyZW5kZXJMaXN0ZW5lcktleT1udWxsKTt2YXIgdD10aGlzLmdldE1hcCgpO2lmKHQpe3RoaXMubWFwUG9zdHJlbmRlckxpc3RlbmVyS2V5PXYodCxSbix0aGlzLnJlbmRlcix0aGlzKSx0aGlzLnVwZGF0ZVBpeGVsUG9zaXRpb24oKTt2YXIgZT10aGlzLnN0b3BFdmVudD90LmdldE92ZXJsYXlDb250YWluZXJTdG9wRXZlbnQoKTp0LmdldE92ZXJsYXlDb250YWluZXIoKTt0aGlzLmluc2VydEZpcnN0P2UuaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCxlLmNoaWxkTm9kZXNbMF18fG51bGwpOmUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KX19LGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMudXBkYXRlUGl4ZWxQb3NpdGlvbigpfSxlLnByb3RvdHlwZS5oYW5kbGVPZmZzZXRDaGFuZ2VkPWZ1bmN0aW9uKCl7dGhpcy51cGRhdGVQaXhlbFBvc2l0aW9uKCl9LGUucHJvdG90eXBlLmhhbmRsZVBvc2l0aW9uQ2hhbmdlZD1mdW5jdGlvbigpe3RoaXMudXBkYXRlUGl4ZWxQb3NpdGlvbigpLHRoaXMuZ2V0KHFhLlBPU0lUSU9OKSYmdGhpcy5hdXRvUGFuJiZ0aGlzLnBhbkludG9WaWV3KCl9LGUucHJvdG90eXBlLmhhbmRsZVBvc2l0aW9uaW5nQ2hhbmdlZD1mdW5jdGlvbigpe3RoaXMudXBkYXRlUGl4ZWxQb3NpdGlvbigpfSxlLnByb3RvdHlwZS5zZXRFbGVtZW50PWZ1bmN0aW9uKHQpe3RoaXMuc2V0KHFhLkVMRU1FTlQsdCl9LGUucHJvdG90eXBlLnNldE1hcD1mdW5jdGlvbih0KXt0aGlzLnNldChxYS5NQVAsdCl9LGUucHJvdG90eXBlLnNldE9mZnNldD1mdW5jdGlvbih0KXt0aGlzLnNldChxYS5PRkZTRVQsdCl9LGUucHJvdG90eXBlLnNldFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KHFhLlBPU0lUSU9OLHQpfSxlLnByb3RvdHlwZS5wYW5JbnRvVmlldz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0TWFwKCk7aWYodCYmdC5nZXRUYXJnZXRFbGVtZW50KCkpe3ZhciBlPXRoaXMuZ2V0UmVjdCh0LmdldFRhcmdldEVsZW1lbnQoKSx0LmdldFNpemUoKSksaT10aGlzLmdldEVsZW1lbnQoKSxyPXRoaXMuZ2V0UmVjdChpLFtmdW5jdGlvbih0KXt2YXIgZT10Lm9mZnNldFdpZHRoLGk9Z2V0Q29tcHV0ZWRTdHlsZSh0KTtyZXR1cm4gZSs9cGFyc2VJbnQoaS5tYXJnaW5MZWZ0LDEwKStwYXJzZUludChpLm1hcmdpblJpZ2h0LDEwKX0oaSksZnVuY3Rpb24odCl7dmFyIGU9dC5vZmZzZXRIZWlnaHQsaT1nZXRDb21wdXRlZFN0eWxlKHQpO3JldHVybiBlKz1wYXJzZUludChpLm1hcmdpblRvcCwxMCkrcGFyc2VJbnQoaS5tYXJnaW5Cb3R0b20sMTApfShpKV0pLG49dGhpcy5hdXRvUGFuTWFyZ2luO2lmKCFvdChlLHIpKXt2YXIgbz1yWzBdLWVbMF0scz1lWzJdLXJbMl0sYT1yWzFdLWVbMV0saD1lWzNdLXJbM10sbD1bMCwwXTtpZihvPDA/bFswXT1vLW46czwwJiYobFswXT1NYXRoLmFicyhzKStuKSxhPDA/bFsxXT1hLW46aDwwJiYobFsxXT1NYXRoLmFicyhoKStuKSwwIT09bFswXXx8MCE9PWxbMV0pe3ZhciB1PXQuZ2V0VmlldygpLmdldENlbnRlcigpLHA9dC5nZXRQaXhlbEZyb21Db29yZGluYXRlKHUpLGM9W3BbMF0rbFswXSxwWzFdK2xbMV1dO3QuZ2V0VmlldygpLmFuaW1hdGUoe2NlbnRlcjp0LmdldENvb3JkaW5hdGVGcm9tUGl4ZWwoYyksZHVyYXRpb246dGhpcy5hdXRvUGFuQW5pbWF0aW9uLmR1cmF0aW9uLGVhc2luZzp0aGlzLmF1dG9QYW5BbmltYXRpb24uZWFzaW5nfSl9fX19LGUucHJvdG90eXBlLmdldFJlY3Q9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9aS5sZWZ0K3dpbmRvdy5wYWdlWE9mZnNldCxuPWkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDtyZXR1cm5bcixuLHIrZVswXSxuK2VbMV1dfSxlLnByb3RvdHlwZS5zZXRQb3NpdGlvbmluZz1mdW5jdGlvbih0KXt0aGlzLnNldChxYS5QT1NJVElPTklORyx0KX0sZS5wcm90b3R5cGUuc2V0VmlzaWJsZT1mdW5jdGlvbih0KXt0aGlzLnJlbmRlcmVkLnZpc2libGUhPT10JiYodGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXk9dD8iIjoibm9uZSIsdGhpcy5yZW5kZXJlZC52aXNpYmxlPXQpfSxlLnByb3RvdHlwZS51cGRhdGVQaXhlbFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRNYXAoKSxlPXRoaXMuZ2V0UG9zaXRpb24oKTtpZih0JiZ0LmlzUmVuZGVyZWQoKSYmZSl7dmFyIGk9dC5nZXRQaXhlbEZyb21Db29yZGluYXRlKGUpLHI9dC5nZXRTaXplKCk7dGhpcy51cGRhdGVSZW5kZXJlZFBvc2l0aW9uKGkscil9ZWxzZSB0aGlzLnNldFZpc2libGUoITEpfSxlLnByb3RvdHlwZS51cGRhdGVSZW5kZXJlZFBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5lbGVtZW50LnN0eWxlLHI9dGhpcy5nZXRPZmZzZXQoKSxuPXRoaXMuZ2V0UG9zaXRpb25pbmcoKTt0aGlzLnNldFZpc2libGUoITApO3ZhciBvPXJbMF0scz1yWzFdO2lmKG49PVphLkJPVFRPTV9SSUdIVHx8bj09WmEuQ0VOVEVSX1JJR0hUfHxuPT1aYS5UT1BfUklHSFQpeyIiIT09dGhpcy5yZW5kZXJlZC5sZWZ0XyYmKHRoaXMucmVuZGVyZWQubGVmdF89aS5sZWZ0PSIiKTt2YXIgYT1NYXRoLnJvdW5kKGVbMF0tdFswXS1vKSsicHgiO3RoaXMucmVuZGVyZWQucmlnaHRfIT1hJiYodGhpcy5yZW5kZXJlZC5yaWdodF89aS5yaWdodD1hKX1lbHNleyIiIT09dGhpcy5yZW5kZXJlZC5yaWdodF8mJih0aGlzLnJlbmRlcmVkLnJpZ2h0Xz1pLnJpZ2h0PSIiKSxuIT1aYS5CT1RUT01fQ0VOVEVSJiZuIT1aYS5DRU5URVJfQ0VOVEVSJiZuIT1aYS5UT1BfQ0VOVEVSfHwoby09dGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoLzIpO3ZhciBoPU1hdGgucm91bmQodFswXStvKSsicHgiO3RoaXMucmVuZGVyZWQubGVmdF8hPWgmJih0aGlzLnJlbmRlcmVkLmxlZnRfPWkubGVmdD1oKX1pZihuPT1aYS5CT1RUT01fTEVGVHx8bj09WmEuQk9UVE9NX0NFTlRFUnx8bj09WmEuQk9UVE9NX1JJR0hUKXsiIiE9PXRoaXMucmVuZGVyZWQudG9wXyYmKHRoaXMucmVuZGVyZWQudG9wXz1pLnRvcD0iIik7dmFyIGw9TWF0aC5yb3VuZChlWzFdLXRbMV0tcykrInB4Ijt0aGlzLnJlbmRlcmVkLmJvdHRvbV8hPWwmJih0aGlzLnJlbmRlcmVkLmJvdHRvbV89aS5ib3R0b209bCl9ZWxzZXsiIiE9PXRoaXMucmVuZGVyZWQuYm90dG9tXyYmKHRoaXMucmVuZGVyZWQuYm90dG9tXz1pLmJvdHRvbT0iIiksbiE9WmEuQ0VOVEVSX0xFRlQmJm4hPVphLkNFTlRFUl9DRU5URVImJm4hPVphLkNFTlRFUl9SSUdIVHx8KHMtPXRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQvMik7dmFyIHU9TWF0aC5yb3VuZCh0WzFdK3MpKyJweCI7dGhpcy5yZW5kZXJlZC50b3BfIT11JiYodGhpcy5yZW5kZXJlZC50b3BfPWkudG9wPXUpfX0sZS5wcm90b3R5cGUuZ2V0T3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnN9LGV9KEQpLFFhPTk3MjksJGE9MTAyNDIsdGg9MTAyNDMsZWg9MzU1MyxpaD1bImV4cGVyaW1lbnRhbC13ZWJnbCIsIndlYmdsIiwid2Via2l0LTNkIiwibW96LXdlYmdsIl07ZnVuY3Rpb24gcmgodCxlKXtmb3IodmFyIGk9aWgubGVuZ3RoLHI9MDtyPGk7KytyKXRyeXt2YXIgbj10LmdldENvbnRleHQoaWhbcl0sZSk7aWYobilyZXR1cm4gbn1jYXRjaCh0KXt9cmV0dXJuIG51bGx9dmFyIG5oLG9oO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYiV2ViR0xSZW5kZXJpbmdDb250ZXh0ImluIHdpbmRvdyl0cnl7dmFyIHNoPXJoKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLHtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiEwfSk7c2gmJighMCxuaD1zaC5nZXRQYXJhbWV0ZXIoc2guTUFYX1RFWFRVUkVfU0laRSksb2g9c2guZ2V0U3VwcG9ydGVkRXh0ZW5zaW9ucygpKX1jYXRjaCh0KXt9dmFyIGFoPWZ1bmN0aW9uKHQpe3RoaXMuc291cmNlXz10fTthaC5wcm90b3R5cGUuaXNBbmltYXRlZD1mdW5jdGlvbigpe3JldHVybiExfSxhaC5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiByKCl9LGFoLnByb3RvdHlwZS5nZXRTb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb3VyY2VffTt2YXIgaGg9YWgsbGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyxlKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiAzNTYzMn0sZX0oaGgpLHVoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMsZSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gMzU2MzN9LGV9KGhoKSxwaD1uZXcgbGgoInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xudmFyeWluZyB2ZWMyIHZfY2VudGVyO1xudmFyeWluZyB2ZWMyIHZfb2Zmc2V0O1xudmFyeWluZyBmbG9hdCB2X2hhbGZXaWR0aDtcbnZhcnlpbmcgZmxvYXQgdl9waXhlbFJhdGlvO1xuXG5cblxudW5pZm9ybSBmbG9hdCB1X29wYWNpdHk7XG51bmlmb3JtIHZlYzQgdV9maWxsQ29sb3I7XG51bmlmb3JtIHZlYzQgdV9zdHJva2VDb2xvcjtcbnVuaWZvcm0gdmVjMiB1X3NpemU7XG5cbnZvaWQgbWFpbih2b2lkKSB7XG4gIHZlYzIgd2luZG93Q2VudGVyID0gdmVjMigodl9jZW50ZXIueCArIDEuMCkgLyAyLjAgKiB1X3NpemUueCAqIHZfcGl4ZWxSYXRpbyxcbiAgICAgICh2X2NlbnRlci55ICsgMS4wKSAvIDIuMCAqIHVfc2l6ZS55ICogdl9waXhlbFJhdGlvKTtcbiAgdmVjMiB3aW5kb3dPZmZzZXQgPSB2ZWMyKCh2X29mZnNldC54ICsgMS4wKSAvIDIuMCAqIHVfc2l6ZS54ICogdl9waXhlbFJhdGlvLFxuICAgICAgKHZfb2Zmc2V0LnkgKyAxLjApIC8gMi4wICogdV9zaXplLnkgKiB2X3BpeGVsUmF0aW8pO1xuICBmbG9hdCByYWRpdXMgPSBsZW5ndGgod2luZG93Q2VudGVyIC0gd2luZG93T2Zmc2V0KTtcbiAgZmxvYXQgZGlzdCA9IGxlbmd0aCh3aW5kb3dDZW50ZXIgLSBnbF9GcmFnQ29vcmQueHkpO1xuICBpZiAoZGlzdCA+IHJhZGl1cyArIHZfaGFsZldpZHRoKSB7XG4gICAgaWYgKHVfc3Ryb2tlQ29sb3IuYSA9PSAwLjApIHtcbiAgICAgIGdsX0ZyYWdDb2xvciA9IHVfZmlsbENvbG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbF9GcmFnQ29sb3IgPSB1X3N0cm9rZUNvbG9yO1xuICAgIH1cbiAgICBnbF9GcmFnQ29sb3IuYSA9IGdsX0ZyYWdDb2xvci5hIC0gKGRpc3QgLSAocmFkaXVzICsgdl9oYWxmV2lkdGgpKTtcbiAgfSBlbHNlIGlmICh1X2ZpbGxDb2xvci5hID09IDAuMCkge1xuICAgIC8vIEhvb3JheSwgbm8gZmlsbCwganVzdCBzdHJva2UuIFdlIGNhbiB1c2UgcmVhbCBhbnRpYWxpYXNpbmcuXG4gICAgZ2xfRnJhZ0NvbG9yID0gdV9zdHJva2VDb2xvcjtcbiAgICBpZiAoZGlzdCA8IHJhZGl1cyAtIHZfaGFsZldpZHRoKSB7XG4gICAgICBnbF9GcmFnQ29sb3IuYSA9IGdsX0ZyYWdDb2xvci5hIC0gKHJhZGl1cyAtIHZfaGFsZldpZHRoIC0gZGlzdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGdsX0ZyYWdDb2xvciA9IHVfZmlsbENvbG9yO1xuICAgIGZsb2F0IHN0cm9rZURpc3QgPSByYWRpdXMgLSB2X2hhbGZXaWR0aDtcbiAgICBmbG9hdCBhbnRpYWxpYXMgPSAyLjAgKiB2X3BpeGVsUmF0aW87XG4gICAgaWYgKGRpc3QgPiBzdHJva2VEaXN0KSB7XG4gICAgICBnbF9GcmFnQ29sb3IgPSB1X3N0cm9rZUNvbG9yO1xuICAgIH0gZWxzZSBpZiAoZGlzdCA+PSBzdHJva2VEaXN0IC0gYW50aWFsaWFzKSB7XG4gICAgICBmbG9hdCBzdGVwID0gc21vb3Roc3RlcChzdHJva2VEaXN0IC0gYW50aWFsaWFzLCBzdHJva2VEaXN0LCBkaXN0KTtcbiAgICAgIGdsX0ZyYWdDb2xvciA9IG1peCh1X2ZpbGxDb2xvciwgdV9zdHJva2VDb2xvciwgc3RlcCk7XG4gICAgfVxuICB9XG4gIGdsX0ZyYWdDb2xvci5hID0gZ2xfRnJhZ0NvbG9yLmEgKiB1X29wYWNpdHk7XG4gIGlmIChnbF9GcmFnQ29sb3IuYSA8PSAwLjApIHtcbiAgICBkaXNjYXJkO1xuICB9XG59XG4iKSxjaD1uZXcgdWgoInZhcnlpbmcgdmVjMiB2X2NlbnRlcjtcbnZhcnlpbmcgdmVjMiB2X29mZnNldDtcbnZhcnlpbmcgZmxvYXQgdl9oYWxmV2lkdGg7XG52YXJ5aW5nIGZsb2F0IHZfcGl4ZWxSYXRpbztcblxuXG5hdHRyaWJ1dGUgdmVjMiBhX3Bvc2l0aW9uO1xuYXR0cmlidXRlIGZsb2F0IGFfaW5zdHJ1Y3Rpb247XG5hdHRyaWJ1dGUgZmxvYXQgYV9yYWRpdXM7XG5cbnVuaWZvcm0gbWF0NCB1X3Byb2plY3Rpb25NYXRyaXg7XG51bmlmb3JtIG1hdDQgdV9vZmZzZXRTY2FsZU1hdHJpeDtcbnVuaWZvcm0gbWF0NCB1X29mZnNldFJvdGF0ZU1hdHJpeDtcbnVuaWZvcm0gZmxvYXQgdV9saW5lV2lkdGg7XG51bmlmb3JtIGZsb2F0IHVfcGl4ZWxSYXRpbztcblxudm9pZCBtYWluKHZvaWQpIHtcbiAgbWF0NCBvZmZzZXRNYXRyaXggPSB1X29mZnNldFNjYWxlTWF0cml4ICogdV9vZmZzZXRSb3RhdGVNYXRyaXg7XG4gIHZfY2VudGVyID0gdmVjNCh1X3Byb2plY3Rpb25NYXRyaXggKiB2ZWM0KGFfcG9zaXRpb24sIDAuMCwgMS4wKSkueHk7XG4gIHZfcGl4ZWxSYXRpbyA9IHVfcGl4ZWxSYXRpbztcbiAgZmxvYXQgbGluZVdpZHRoID0gdV9saW5lV2lkdGggKiB1X3BpeGVsUmF0aW87XG4gIHZfaGFsZldpZHRoID0gbGluZVdpZHRoIC8gMi4wO1xuICBpZiAobGluZVdpZHRoID09IDAuMCkge1xuICAgIGxpbmVXaWR0aCA9IDIuMCAqIHVfcGl4ZWxSYXRpbztcbiAgfVxuICB2ZWMyIG9mZnNldDtcbiAgLy8gUmFkaXVzIHdpdGggYW5pdGFsaWFzaW5nIChyb3VnaGx5KS5cbiAgZmxvYXQgcmFkaXVzID0gYV9yYWRpdXMgKyAzLjAgKiB1X3BpeGVsUmF0aW87XG4gIC8vIFVudGlsIHdlIGdldCBnbF9WZXJ0ZXhJRCBpbiBXZWJHTCwgd2Ugc3RvcmUgYW4gaW5zdHJ1Y3Rpb24uXG4gIGlmIChhX2luc3RydWN0aW9uID09IDAuMCkge1xuICAgIC8vIE9mZnNldHRpbmcgdGhlIGVkZ2VzIG9mIHRoZSB0cmlhbmdsZSBieSBsaW5lV2lkdGggLyAyIGlzIG5lY2Vzc2FyeSwgaG93ZXZlclxuICAgIC8vIHdlIHNob3VsZCBhbHNvIGxlYXZlIHNvbWUgc3BhY2UgZm9yIHRoZSBhbnRpYWxpYXNpbmcsIHRodXMgd2Ugb2Zmc2V0IGJ5IGxpbmVXaWR0aC5cbiAgICBvZmZzZXQgPSB2ZWMyKC0xLjAsIDEuMCk7XG4gIH0gZWxzZSBpZiAoYV9pbnN0cnVjdGlvbiA9PSAxLjApIHtcbiAgICBvZmZzZXQgPSB2ZWMyKC0xLjAsIC0xLjApO1xuICB9IGVsc2UgaWYgKGFfaW5zdHJ1Y3Rpb24gPT0gMi4wKSB7XG4gICAgb2Zmc2V0ID0gdmVjMigxLjAsIC0xLjApO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHZlYzIoMS4wLCAxLjApO1xuICB9XG5cbiAgZ2xfUG9zaXRpb24gPSB1X3Byb2plY3Rpb25NYXRyaXggKiB2ZWM0KGFfcG9zaXRpb24gKyBvZmZzZXQgKiByYWRpdXMsIDAuMCwgMS4wKSArXG4gICAgICBvZmZzZXRNYXRyaXggKiB2ZWM0KG9mZnNldCAqIGxpbmVXaWR0aCwgMC4wLCAwLjApO1xuICB2X29mZnNldCA9IHZlYzQodV9wcm9qZWN0aW9uTWF0cml4ICogdmVjNChhX3Bvc2l0aW9uLnggKyBhX3JhZGl1cywgYV9wb3NpdGlvbi55LFxuICAgICAgMC4wLCAxLjApKS54eTtcblxuICBpZiAoZGlzdGFuY2Uodl9jZW50ZXIsIHZfb2Zmc2V0KSA+IDIwMDAwLjApIHtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQodl9jZW50ZXIsIDAuMCwgMS4wKTtcbiAgfVxufVxuXG5cbiIpLGRoPWZ1bmN0aW9uKHQsZSl7dGhpcy51X3Byb2plY3Rpb25NYXRyaXg9dC5nZXRVbmlmb3JtTG9jYXRpb24oZSwidV9wcm9qZWN0aW9uTWF0cml4IiksdGhpcy51X29mZnNldFNjYWxlTWF0cml4PXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfb2Zmc2V0U2NhbGVNYXRyaXgiKSx0aGlzLnVfb2Zmc2V0Um90YXRlTWF0cml4PXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfb2Zmc2V0Um90YXRlTWF0cml4IiksdGhpcy51X2xpbmVXaWR0aD10LmdldFVuaWZvcm1Mb2NhdGlvbihlLCJ1X2xpbmVXaWR0aCIpLHRoaXMudV9waXhlbFJhdGlvPXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfcGl4ZWxSYXRpbyIpLHRoaXMudV9vcGFjaXR5PXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfb3BhY2l0eSIpLHRoaXMudV9maWxsQ29sb3I9dC5nZXRVbmlmb3JtTG9jYXRpb24oZSwidV9maWxsQ29sb3IiKSx0aGlzLnVfc3Ryb2tlQ29sb3I9dC5nZXRVbmlmb3JtTG9jYXRpb24oZSwidV9zdHJva2VDb2xvciIpLHRoaXMudV9zaXplPXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfc2l6ZSIpLHRoaXMuYV9wb3NpdGlvbj10LmdldEF0dHJpYkxvY2F0aW9uKGUsImFfcG9zaXRpb24iKSx0aGlzLmFfaW5zdHJ1Y3Rpb249dC5nZXRBdHRyaWJMb2NhdGlvbihlLCJhX2luc3RydWN0aW9uIiksdGhpcy5hX3JhZGl1cz10LmdldEF0dHJpYkxvY2F0aW9uKGUsImFfcmFkaXVzIil9O2Z1bmN0aW9uIGZoKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFs0XT1lWzJdLHRbNV09ZVszXSx0WzEyXT1lWzRdLHRbMTNdPWVbNV0sdH12YXIgX2g9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkpe3QuY2FsbCh0aGlzKSx0aGlzLnRvbGVyYW5jZT1lLHRoaXMubWF4RXh0ZW50PWksdGhpcy5vcmlnaW49VHQoaSksdGhpcy5wcm9qZWN0aW9uTWF0cml4Xz1bMSwwLDAsMSwwLDBdLHRoaXMub2Zmc2V0Um90YXRlTWF0cml4Xz1bMSwwLDAsMSwwLDBdLHRoaXMub2Zmc2V0U2NhbGVNYXRyaXhfPVsxLDAsMCwxLDAsMF0sdGhpcy50bXBNYXQ0Xz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0sdGhpcy5pbmRpY2VzPVtdLHRoaXMuaW5kaWNlc0J1ZmZlcj1udWxsLHRoaXMuc3RhcnRJbmRpY2VzPVtdLHRoaXMuc3RhcnRJbmRpY2VzRmVhdHVyZT1bXSx0aGlzLnZlcnRpY2VzPVtdLHRoaXMudmVydGljZXNCdWZmZXI9bnVsbCx0aGlzLmxpbmVTdHJpbmdSZXBsYXk9dm9pZCAwfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXREZWxldGVSZXNvdXJjZXNGdW5jdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24odCl7cigpfSxlLnByb3RvdHlwZS5zZXRVcFByb2dyYW09ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUuc2h1dERvd25Qcm9ncmFtPWZ1bmN0aW9uKHQsZSl7cigpfSxlLnByb3RvdHlwZS5kcmF3UmVwbGF5PWZ1bmN0aW9uKHQsZSxpLG4pe3IoKX0sZS5wcm90b3R5cGUuZHJhd0hpdERldGVjdGlvblJlcGxheU9uZUJ5T25lPWZ1bmN0aW9uKHQsZSxpLG4sbyl7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUuZHJhd0hpdERldGVjdGlvblJlcGxheT1mdW5jdGlvbih0LGUsaSxyLG4sbyl7cmV0dXJuIG4/dGhpcy5kcmF3SGl0RGV0ZWN0aW9uUmVwbGF5T25lQnlPbmUodCxlLGkscixvKTp0aGlzLmRyYXdIaXREZXRlY3Rpb25SZXBsYXlBbGwodCxlLGkscil9LGUucHJvdG90eXBlLmRyYXdIaXREZXRlY3Rpb25SZXBsYXlBbGw9ZnVuY3Rpb24odCxlLGkscil7dC5jbGVhcih0LkNPTE9SX0JVRkZFUl9CSVR8dC5ERVBUSF9CVUZGRVJfQklUKSx0aGlzLmRyYXdSZXBsYXkodCxlLGksITApO3ZhciBuPXIobnVsbCk7cmV0dXJuIG58fHZvaWQgMH0sZS5wcm90b3R5cGUucmVwbGF5PWZ1bmN0aW9uKHQsZSxpLHIsbixvLHMsYSxoLGwsdSl7dmFyIHAsYyxkLGYsXyxnLHksdixtPXQuZ2V0R0woKTt0aGlzLmxpbmVTdHJpbmdSZXBsYXkmJihwPW0uaXNFbmFibGVkKG0uU1RFTkNJTF9URVNUKSxjPW0uZ2V0UGFyYW1ldGVyKG0uU1RFTkNJTF9GVU5DKSxkPW0uZ2V0UGFyYW1ldGVyKG0uU1RFTkNJTF9WQUxVRV9NQVNLKSxmPW0uZ2V0UGFyYW1ldGVyKG0uU1RFTkNJTF9SRUYpLF89bS5nZXRQYXJhbWV0ZXIobS5TVEVOQ0lMX1dSSVRFTUFTSyksZz1tLmdldFBhcmFtZXRlcihtLlNURU5DSUxfRkFJTCkseT1tLmdldFBhcmFtZXRlcihtLlNURU5DSUxfUEFTU19ERVBUSF9QQVNTKSx2PW0uZ2V0UGFyYW1ldGVyKG0uU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwpLG0uZW5hYmxlKG0uU1RFTkNJTF9URVNUKSxtLmNsZWFyKG0uU1RFTkNJTF9CVUZGRVJfQklUKSxtLnN0ZW5jaWxNYXNrKDI1NSksbS5zdGVuY2lsRnVuYyhtLkFMV0FZUywxLDI1NSksbS5zdGVuY2lsT3AobS5LRUVQLG0uS0VFUCxtLlJFUExBQ0UpLHRoaXMubGluZVN0cmluZ1JlcGxheS5yZXBsYXkodCxlLGkscixuLG8scyxhLGgsbCx1KSxtLnN0ZW5jaWxNYXNrKDApLG0uc3RlbmNpbEZ1bmMobS5OT1RFUVVBTCwxLDI1NSkpLHQuYmluZEJ1ZmZlcigzNDk2Mix0aGlzLnZlcnRpY2VzQnVmZmVyKSx0LmJpbmRCdWZmZXIoMzQ5NjMsdGhpcy5pbmRpY2VzQnVmZmVyKTt2YXIgeD10aGlzLnNldFVwUHJvZ3JhbShtLHQsbixvKSxFPUZlKHRoaXMucHJvamVjdGlvbk1hdHJpeF8pO2plKEUsMi8oaSpuWzBdKSwyLyhpKm5bMV0pKSxrZShFLC1yKSxVZShFLC0oZVswXS10aGlzLm9yaWdpblswXSksLShlWzFdLXRoaXMub3JpZ2luWzFdKSk7dmFyIFM9RmUodGhpcy5vZmZzZXRTY2FsZU1hdHJpeF8pO2plKFMsMi9uWzBdLDIvblsxXSk7dmFyIFQsQz1GZSh0aGlzLm9mZnNldFJvdGF0ZU1hdHJpeF8pO3JldHVybiAwIT09ciYma2UoQywtciksbS51bmlmb3JtTWF0cml4NGZ2KHgudV9wcm9qZWN0aW9uTWF0cml4LCExLGZoKHRoaXMudG1wTWF0NF8sRSkpLG0udW5pZm9ybU1hdHJpeDRmdih4LnVfb2Zmc2V0U2NhbGVNYXRyaXgsITEsZmgodGhpcy50bXBNYXQ0XyxTKSksbS51bmlmb3JtTWF0cml4NGZ2KHgudV9vZmZzZXRSb3RhdGVNYXRyaXgsITEsZmgodGhpcy50bXBNYXQ0XyxDKSksbS51bmlmb3JtMWYoeC51X29wYWNpdHkscyksdm9pZCAwPT09aD90aGlzLmRyYXdSZXBsYXkobSx0LGEsITEpOlQ9dGhpcy5kcmF3SGl0RGV0ZWN0aW9uUmVwbGF5KG0sdCxhLGgsbCx1KSx0aGlzLnNodXREb3duUHJvZ3JhbShtLHgpLHRoaXMubGluZVN0cmluZ1JlcGxheSYmKHB8fG0uZGlzYWJsZShtLlNURU5DSUxfVEVTVCksbS5jbGVhcihtLlNURU5DSUxfQlVGRkVSX0JJVCksbS5zdGVuY2lsRnVuYyhjLGYsZCksbS5zdGVuY2lsTWFzayhfKSxtLnN0ZW5jaWxPcChnLHYseSkpLFR9LGUucHJvdG90eXBlLmRyYXdFbGVtZW50cz1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbj1lLmhhc09FU0VsZW1lbnRJbmRleFVpbnQ/NTEyNTo1MTIzLG89ci1pLHM9aSooZS5oYXNPRVNFbGVtZW50SW5kZXhVaW50PzQ6Mik7dC5kcmF3RWxlbWVudHMoNCxvLG4scyl9LGV9KFZzKSxnaD1bMCwwLDAsMV0seWg9W10sdmg9WzAsMCwwLDFdLG1oPU51bWJlci5FUFNJTE9OfHwyLjIyMDQ0NjA0OTI1MDMxM2UtMTYseGg9ZnVuY3Rpb24odCxlLGkscixuLG8pe3ZhciBzPShpLXQpKihvLWUpLShuLXQpKihyLWUpO3JldHVybiBzPD1taCYmcz49LW1oP3ZvaWQgMDpzPjB9LEVoPTM1MDQ0LFNoPWZ1bmN0aW9uKHQsZSl7dGhpcy5hcnJfPXZvaWQgMCE9PXQ/dDpbXSx0aGlzLnVzYWdlXz12b2lkIDAhPT1lP2U6RWh9O1NoLnByb3RvdHlwZS5nZXRBcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycl99LFNoLnByb3RvdHlwZS5nZXRVc2FnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVzYWdlX307dmFyIFRoPVNoLENoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcyxlLGkpLHRoaXMuZGVmYXVsdExvY2F0aW9uc189bnVsbCx0aGlzLnN0eWxlc189W10sdGhpcy5zdHlsZUluZGljZXNfPVtdLHRoaXMucmFkaXVzXz0wLHRoaXMuc3RhdGVfPXtmaWxsQ29sb3I6bnVsbCxzdHJva2VDb2xvcjpudWxsLGxpbmVEYXNoOm51bGwsbGluZURhc2hPZmZzZXQ6dm9pZCAwLGxpbmVXaWR0aDp2b2lkIDAsY2hhbmdlZDohMX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmRyYXdDb29yZGluYXRlc189ZnVuY3Rpb24odCxlLGkscil7dmFyIG4sbyxzPXRoaXMudmVydGljZXMubGVuZ3RoLGE9dGhpcy5pbmRpY2VzLmxlbmd0aCxoPXMvNDtmb3Iobj1lLG89aTtuPG87bis9cil0aGlzLnZlcnRpY2VzW3MrK109dFtuXSx0aGlzLnZlcnRpY2VzW3MrK109dFtuKzFdLHRoaXMudmVydGljZXNbcysrXT0wLHRoaXMudmVydGljZXNbcysrXT10aGlzLnJhZGl1c18sdGhpcy52ZXJ0aWNlc1tzKytdPXRbbl0sdGhpcy52ZXJ0aWNlc1tzKytdPXRbbisxXSx0aGlzLnZlcnRpY2VzW3MrK109MSx0aGlzLnZlcnRpY2VzW3MrK109dGhpcy5yYWRpdXNfLHRoaXMudmVydGljZXNbcysrXT10W25dLHRoaXMudmVydGljZXNbcysrXT10W24rMV0sdGhpcy52ZXJ0aWNlc1tzKytdPTIsdGhpcy52ZXJ0aWNlc1tzKytdPXRoaXMucmFkaXVzXyx0aGlzLnZlcnRpY2VzW3MrK109dFtuXSx0aGlzLnZlcnRpY2VzW3MrK109dFtuKzFdLHRoaXMudmVydGljZXNbcysrXT0zLHRoaXMudmVydGljZXNbcysrXT10aGlzLnJhZGl1c18sdGhpcy5pbmRpY2VzW2ErK109aCx0aGlzLmluZGljZXNbYSsrXT1oKzEsdGhpcy5pbmRpY2VzW2ErK109aCsyLHRoaXMuaW5kaWNlc1thKytdPWgrMix0aGlzLmluZGljZXNbYSsrXT1oKzMsdGhpcy5pbmRpY2VzW2ErK109aCxoKz00fSxlLnByb3RvdHlwZS5kcmF3Q2lyY2xlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXRSYWRpdXMoKSxyPXQuZ2V0U3RyaWRlKCk7aWYoaSl7dGhpcy5zdGFydEluZGljZXMucHVzaCh0aGlzLmluZGljZXMubGVuZ3RoKSx0aGlzLnN0YXJ0SW5kaWNlc0ZlYXR1cmUucHVzaChlKSx0aGlzLnN0YXRlXy5jaGFuZ2VkJiYodGhpcy5zdHlsZUluZGljZXNfLnB1c2godGhpcy5pbmRpY2VzLmxlbmd0aCksdGhpcy5zdGF0ZV8uY2hhbmdlZD0hMSksdGhpcy5yYWRpdXNfPWk7dmFyIG49dC5nZXRGbGF0Q29vcmRpbmF0ZXMoKTtuPUR0KG4sMCwyLHIsLXRoaXMub3JpZ2luWzBdLC10aGlzLm9yaWdpblsxXSksdGhpcy5kcmF3Q29vcmRpbmF0ZXNfKG4sMCwyLHIpfWVsc2UgaWYodGhpcy5zdGF0ZV8uY2hhbmdlZCYmKHRoaXMuc3R5bGVzXy5wb3AoKSx0aGlzLnN0eWxlc18ubGVuZ3RoKSl7dmFyIG89dGhpcy5zdHlsZXNfW3RoaXMuc3R5bGVzXy5sZW5ndGgtMV07dGhpcy5zdGF0ZV8uZmlsbENvbG9yPW9bMF0sdGhpcy5zdGF0ZV8uc3Ryb2tlQ29sb3I9b1sxXSx0aGlzLnN0YXRlXy5saW5lV2lkdGg9b1syXSx0aGlzLnN0YXRlXy5jaGFuZ2VkPSExfX0sZS5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKHQpe3RoaXMudmVydGljZXNCdWZmZXI9bmV3IFRoKHRoaXMudmVydGljZXMpLHRoaXMuaW5kaWNlc0J1ZmZlcj1uZXcgVGgodGhpcy5pbmRpY2VzKSx0aGlzLnN0YXJ0SW5kaWNlcy5wdXNoKHRoaXMuaW5kaWNlcy5sZW5ndGgpLDA9PT10aGlzLnN0eWxlSW5kaWNlc18ubGVuZ3RoJiZ0aGlzLnN0eWxlc18ubGVuZ3RoPjAmJih0aGlzLnN0eWxlc189W10pLHRoaXMudmVydGljZXM9bnVsbCx0aGlzLmluZGljZXM9bnVsbH0sZS5wcm90b3R5cGUuZ2V0RGVsZXRlUmVzb3VyY2VzRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52ZXJ0aWNlc0J1ZmZlcixpPXRoaXMuaW5kaWNlc0J1ZmZlcjtyZXR1cm4gZnVuY3Rpb24oKXt0LmRlbGV0ZUJ1ZmZlcihlKSx0LmRlbGV0ZUJ1ZmZlcihpKX19LGUucHJvdG90eXBlLnNldFVwUHJvZ3JhbT1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbixvPWUuZ2V0UHJvZ3JhbShwaCxjaCk7cmV0dXJuIHRoaXMuZGVmYXVsdExvY2F0aW9uc18/bj10aGlzLmRlZmF1bHRMb2NhdGlvbnNfOihuPW5ldyBkaCh0LG8pLHRoaXMuZGVmYXVsdExvY2F0aW9uc189biksZS51c2VQcm9ncmFtKG8pLHQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobi5hX3Bvc2l0aW9uKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIobi5hX3Bvc2l0aW9uLDIsNTEyNiwhMSwxNiwwKSx0LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG4uYV9pbnN0cnVjdGlvbiksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG4uYV9pbnN0cnVjdGlvbiwxLDUxMjYsITEsMTYsOCksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShuLmFfcmFkaXVzKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIobi5hX3JhZGl1cywxLDUxMjYsITEsMTYsMTIpLHQudW5pZm9ybTJmdihuLnVfc2l6ZSxpKSx0LnVuaWZvcm0xZihuLnVfcGl4ZWxSYXRpbyxyKSxufSxlLnByb3RvdHlwZS5zaHV0RG93blByb2dyYW09ZnVuY3Rpb24odCxlKXt0LmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShlLmFfcG9zaXRpb24pLHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUuYV9pbnN0cnVjdGlvbiksdC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZS5hX3JhZGl1cyl9LGUucHJvdG90eXBlLmRyYXdSZXBsYXk9ZnVuY3Rpb24odCxlLGkscil7dmFyIG4sbyxzLGE7aWYoZChpKSlmb3Iocz10aGlzLnN0YXJ0SW5kaWNlc1t0aGlzLnN0YXJ0SW5kaWNlcy5sZW5ndGgtMV0sbj10aGlzLnN0eWxlSW5kaWNlc18ubGVuZ3RoLTE7bj49MDstLW4pbz10aGlzLnN0eWxlSW5kaWNlc19bbl0sYT10aGlzLnN0eWxlc19bbl0sdGhpcy5zZXRGaWxsU3R5bGVfKHQsYVswXSksdGhpcy5zZXRTdHJva2VTdHlsZV8odCxhWzFdLGFbMl0pLHRoaXMuZHJhd0VsZW1lbnRzKHQsZSxvLHMpLHM9bztlbHNlIHRoaXMuZHJhd1JlcGxheVNraXBwaW5nXyh0LGUsaSl9LGUucHJvdG90eXBlLmRyYXdIaXREZXRlY3Rpb25SZXBsYXlPbmVCeU9uZT1mdW5jdGlvbih0LGUsaSxyLG4pe3ZhciBzLGEsaCxsLHUscCxjO2ZvcihjPXRoaXMuc3RhcnRJbmRpY2VzLmxlbmd0aC0yLGg9dGhpcy5zdGFydEluZGljZXNbYysxXSxzPXRoaXMuc3R5bGVJbmRpY2VzXy5sZW5ndGgtMTtzPj0wOy0tcylmb3IobD10aGlzLnN0eWxlc19bc10sdGhpcy5zZXRGaWxsU3R5bGVfKHQsbFswXSksdGhpcy5zZXRTdHJva2VTdHlsZV8odCxsWzFdLGxbMl0pLHU9dGhpcy5zdHlsZUluZGljZXNfW3NdO2M+PTAmJnRoaXMuc3RhcnRJbmRpY2VzW2NdPj11Oyl7aWYoYT10aGlzLnN0YXJ0SW5kaWNlc1tjXSx2b2lkIDA9PT1pW28ocD10aGlzLnN0YXJ0SW5kaWNlc0ZlYXR1cmVbY10pXSYmcC5nZXRHZW9tZXRyeSgpJiYodm9pZCAwPT09bnx8UHQobixwLmdldEdlb21ldHJ5KCkuZ2V0RXh0ZW50KCkpKSl7dC5jbGVhcih0LkNPTE9SX0JVRkZFUl9CSVR8dC5ERVBUSF9CVUZGRVJfQklUKSx0aGlzLmRyYXdFbGVtZW50cyh0LGUsYSxoKTt2YXIgZD1yKHApO2lmKGQpcmV0dXJuIGR9Yy0tLGg9YX19LGUucHJvdG90eXBlLmRyYXdSZXBsYXlTa2lwcGluZ189ZnVuY3Rpb24odCxlLGkpe3ZhciByLG4scyxhLGgsbCx1O2ZvcihsPXRoaXMuc3RhcnRJbmRpY2VzLmxlbmd0aC0yLHM9bj10aGlzLnN0YXJ0SW5kaWNlc1tsKzFdLHI9dGhpcy5zdHlsZUluZGljZXNfLmxlbmd0aC0xO3I+PTA7LS1yKXtmb3IoYT10aGlzLnN0eWxlc19bcl0sdGhpcy5zZXRGaWxsU3R5bGVfKHQsYVswXSksdGhpcy5zZXRTdHJva2VTdHlsZV8odCxhWzFdLGFbMl0pLGg9dGhpcy5zdHlsZUluZGljZXNfW3JdO2w+PTAmJnRoaXMuc3RhcnRJbmRpY2VzW2xdPj1oOyl1PXRoaXMuc3RhcnRJbmRpY2VzW2xdLGlbbyh0aGlzLnN0YXJ0SW5kaWNlc0ZlYXR1cmVbbF0pXSYmKG4hPT1zJiZ0aGlzLmRyYXdFbGVtZW50cyh0LGUsbixzKSxzPXUpLGwtLSxuPXU7biE9PXMmJnRoaXMuZHJhd0VsZW1lbnRzKHQsZSxuLHMpLG49cz1ofX0sZS5wcm90b3R5cGUuc2V0RmlsbFN0eWxlXz1mdW5jdGlvbih0LGUpe3QudW5pZm9ybTRmdih0aGlzLmRlZmF1bHRMb2NhdGlvbnNfLnVfZmlsbENvbG9yLGUpfSxlLnByb3RvdHlwZS5zZXRTdHJva2VTdHlsZV89ZnVuY3Rpb24odCxlLGkpe3QudW5pZm9ybTRmdih0aGlzLmRlZmF1bHRMb2NhdGlvbnNfLnVfc3Ryb2tlQ29sb3IsZSksdC51bmlmb3JtMWYodGhpcy5kZWZhdWx0TG9jYXRpb25zXy51X2xpbmVXaWR0aCxpKX0sZS5wcm90b3R5cGUuc2V0RmlsbFN0cm9rZVN0eWxlPWZ1bmN0aW9uKHQsZSl7dmFyIGkscjtpZihlKXt2YXIgbj1lLmdldExpbmVEYXNoKCk7dGhpcy5zdGF0ZV8ubGluZURhc2g9bnx8eWg7dmFyIG89ZS5nZXRMaW5lRGFzaE9mZnNldCgpO3RoaXMuc3RhdGVfLmxpbmVEYXNoT2Zmc2V0PW98fDAsaT0oaT1lLmdldENvbG9yKCkpaW5zdGFuY2VvZiBDYW52YXNHcmFkaWVudHx8aSBpbnN0YW5jZW9mIENhbnZhc1BhdHRlcm4/dmg6X3IoaSkubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIDMhPWU/dC8yNTU6dH0pfHx2aCxyPXZvaWQgMCE9PShyPWUuZ2V0V2lkdGgoKSk/cjoxfWVsc2UgaT1bMCwwLDAsMF0scj0wO3ZhciBzPXQ/dC5nZXRDb2xvcigpOlswLDAsMCwwXTtzPXMgaW5zdGFuY2VvZiBDYW52YXNHcmFkaWVudHx8cyBpbnN0YW5jZW9mIENhbnZhc1BhdHRlcm4/Z2g6X3IocykubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIDMhPWU/dC8yNTU6dH0pfHxnaCx0aGlzLnN0YXRlXy5zdHJva2VDb2xvciYmWih0aGlzLnN0YXRlXy5zdHJva2VDb2xvcixpKSYmdGhpcy5zdGF0ZV8uZmlsbENvbG9yJiZaKHRoaXMuc3RhdGVfLmZpbGxDb2xvcixzKSYmdGhpcy5zdGF0ZV8ubGluZVdpZHRoPT09cnx8KHRoaXMuc3RhdGVfLmNoYW5nZWQ9ITAsdGhpcy5zdGF0ZV8uZmlsbENvbG9yPXMsdGhpcy5zdGF0ZV8uc3Ryb2tlQ29sb3I9aSx0aGlzLnN0YXRlXy5saW5lV2lkdGg9cix0aGlzLnN0eWxlc18ucHVzaChbcyxpLHJdKSl9LGV9KF9oKSxSaD1uZXcgbGgoInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xudmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7XG52YXJ5aW5nIGZsb2F0IHZfb3BhY2l0eTtcblxudW5pZm9ybSBmbG9hdCB1X29wYWNpdHk7XG51bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO1xuXG52b2lkIG1haW4odm9pZCkge1xuICB2ZWM0IHRleENvbG9yID0gdGV4dHVyZTJEKHVfaW1hZ2UsIHZfdGV4Q29vcmQpO1xuICBnbF9GcmFnQ29sb3IucmdiID0gdGV4Q29sb3IucmdiO1xuICBmbG9hdCBhbHBoYSA9IHRleENvbG9yLmEgKiB2X29wYWNpdHkgKiB1X29wYWNpdHk7XG4gIGlmIChhbHBoYSA9PSAwLjApIHtcbiAgICBkaXNjYXJkO1xuICB9XG4gIGdsX0ZyYWdDb2xvci5hID0gYWxwaGE7XG59XG4iKSx3aD1uZXcgdWgoInZhcnlpbmcgdmVjMiB2X3RleENvb3JkO1xudmFyeWluZyBmbG9hdCB2X29wYWNpdHk7XG5cbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjMiBhX3RleENvb3JkO1xuYXR0cmlidXRlIHZlYzIgYV9vZmZzZXRzO1xuYXR0cmlidXRlIGZsb2F0IGFfb3BhY2l0eTtcbmF0dHJpYnV0ZSBmbG9hdCBhX3JvdGF0ZVdpdGhWaWV3O1xuXG51bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uTWF0cml4O1xudW5pZm9ybSBtYXQ0IHVfb2Zmc2V0U2NhbGVNYXRyaXg7XG51bmlmb3JtIG1hdDQgdV9vZmZzZXRSb3RhdGVNYXRyaXg7XG5cbnZvaWQgbWFpbih2b2lkKSB7XG4gIG1hdDQgb2Zmc2V0TWF0cml4ID0gdV9vZmZzZXRTY2FsZU1hdHJpeDtcbiAgaWYgKGFfcm90YXRlV2l0aFZpZXcgPT0gMS4wKSB7XG4gICAgb2Zmc2V0TWF0cml4ID0gdV9vZmZzZXRTY2FsZU1hdHJpeCAqIHVfb2Zmc2V0Um90YXRlTWF0cml4O1xuICB9XG4gIHZlYzQgb2Zmc2V0cyA9IG9mZnNldE1hdHJpeCAqIHZlYzQoYV9vZmZzZXRzLCAwLjAsIDAuMCk7XG4gIGdsX1Bvc2l0aW9uID0gdV9wcm9qZWN0aW9uTWF0cml4ICogdmVjNChhX3Bvc2l0aW9uLCAwLjAsIDEuMCkgKyBvZmZzZXRzO1xuICB2X3RleENvb3JkID0gYV90ZXhDb29yZDtcbiAgdl9vcGFjaXR5ID0gYV9vcGFjaXR5O1xufVxuXG5cbiIpLEloPWZ1bmN0aW9uKHQsZSl7dGhpcy51X3Byb2plY3Rpb25NYXRyaXg9dC5nZXRVbmlmb3JtTG9jYXRpb24oZSwidV9wcm9qZWN0aW9uTWF0cml4IiksdGhpcy51X29mZnNldFNjYWxlTWF0cml4PXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfb2Zmc2V0U2NhbGVNYXRyaXgiKSx0aGlzLnVfb2Zmc2V0Um90YXRlTWF0cml4PXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfb2Zmc2V0Um90YXRlTWF0cml4IiksdGhpcy51X29wYWNpdHk9dC5nZXRVbmlmb3JtTG9jYXRpb24oZSwidV9vcGFjaXR5IiksdGhpcy51X2ltYWdlPXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfaW1hZ2UiKSx0aGlzLmFfcG9zaXRpb249dC5nZXRBdHRyaWJMb2NhdGlvbihlLCJhX3Bvc2l0aW9uIiksdGhpcy5hX3RleENvb3JkPXQuZ2V0QXR0cmliTG9jYXRpb24oZSwiYV90ZXhDb29yZCIpLHRoaXMuYV9vZmZzZXRzPXQuZ2V0QXR0cmliTG9jYXRpb24oZSwiYV9vZmZzZXRzIiksdGhpcy5hX29wYWNpdHk9dC5nZXRBdHRyaWJMb2NhdGlvbihlLCJhX29wYWNpdHkiKSx0aGlzLmFfcm90YXRlV2l0aFZpZXc9dC5nZXRBdHRyaWJMb2NhdGlvbihlLCJhX3JvdGF0ZVdpdGhWaWV3Iil9LExoPXtMT1NUOiJ3ZWJnbGNvbnRleHRsb3N0IixSRVNUT1JFRDoid2ViZ2xjb250ZXh0cmVzdG9yZWQifTtmdW5jdGlvbiBPaCh0LGUsaSl7dmFyIHI9dC5jcmVhdGVUZXh0dXJlKCk7cmV0dXJuIHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELHIpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01BR19GSUxURVIsdC5MSU5FQVIpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01JTl9GSUxURVIsdC5MSU5FQVIpLHZvaWQgMCE9PWUmJnQudGV4UGFyYW1ldGVyaShlaCwkYSxlKSx2b2lkIDAhPT1pJiZ0LnRleFBhcmFtZXRlcmkoZWgsdGgsaSkscn1mdW5jdGlvbiBQaCh0LGUsaSxyLG4pe3ZhciBvPU9oKHQscixuKTtyZXR1cm4gdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuUkdCQSxlLGksMCx0LlJHQkEsdC5VTlNJR05FRF9CWVRFLG51bGwpLG99ZnVuY3Rpb24gYmgodCxlLGkscil7dmFyIG49T2godCxpLHIpO3JldHVybiB0LnRleEltYWdlMkQodC5URVhUVVJFXzJELDAsdC5SR0JBLHQuUkdCQSx0LlVOU0lHTkVEX0JZVEUsZSksbn12YXIgTWg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkpe3QuY2FsbCh0aGlzKSx0aGlzLmNhbnZhc189ZSx0aGlzLmdsXz1pLHRoaXMuYnVmZmVyQ2FjaGVfPXt9LHRoaXMuc2hhZGVyQ2FjaGVfPXt9LHRoaXMucHJvZ3JhbUNhY2hlXz17fSx0aGlzLmN1cnJlbnRQcm9ncmFtXz1udWxsLHRoaXMuaGl0RGV0ZWN0aW9uRnJhbWVidWZmZXJfPW51bGwsdGhpcy5oaXREZXRlY3Rpb25UZXh0dXJlXz1udWxsLHRoaXMuaGl0RGV0ZWN0aW9uUmVuZGVyYnVmZmVyXz1udWxsLHRoaXMuaGFzT0VTRWxlbWVudEluZGV4VWludD1YKG9oLCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksdGhpcy5oYXNPRVNFbGVtZW50SW5kZXhVaW50JiZpLmdldEV4dGVuc2lvbigiT0VTX2VsZW1lbnRfaW5kZXhfdWludCIpLHYodGhpcy5jYW52YXNfLExoLkxPU1QsdGhpcy5oYW5kbGVXZWJHTENvbnRleHRMb3N0LHRoaXMpLHYodGhpcy5jYW52YXNfLExoLlJFU1RPUkVELHRoaXMuaGFuZGxlV2ViR0xDb250ZXh0UmVzdG9yZWQsdGhpcyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmJpbmRCdWZmZXI9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldEdMKCkscj1lLmdldEFycmF5KCksbj1vKGUpO2lmKG4gaW4gdGhpcy5idWZmZXJDYWNoZV8pe3ZhciBzPXRoaXMuYnVmZmVyQ2FjaGVfW25dO2kuYmluZEJ1ZmZlcih0LHMuYnVmZmVyKX1lbHNle3ZhciBhLGg9aS5jcmVhdGVCdWZmZXIoKTtpLmJpbmRCdWZmZXIodCxoKSwzNDk2Mj09dD9hPW5ldyBGbG9hdDMyQXJyYXkocik6MzQ5NjM9PXQmJihhPXRoaXMuaGFzT0VTRWxlbWVudEluZGV4VWludD9uZXcgVWludDMyQXJyYXkocik6bmV3IFVpbnQxNkFycmF5KHIpKSxpLmJ1ZmZlckRhdGEodCxhLGUuZ2V0VXNhZ2UoKSksdGhpcy5idWZmZXJDYWNoZV9bbl09e2J1ZjplLGJ1ZmZlcjpofX19LGUucHJvdG90eXBlLmRlbGV0ZUJ1ZmZlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEdMKCksaT1vKHQpLHI9dGhpcy5idWZmZXJDYWNoZV9baV07ZS5pc0NvbnRleHRMb3N0KCl8fGUuZGVsZXRlQnVmZmVyKHIuYnVmZmVyKSxkZWxldGUgdGhpcy5idWZmZXJDYWNoZV9baV19LGUucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbD1mdW5jdGlvbigpe1ModGhpcy5jYW52YXNfKTt2YXIgdD10aGlzLmdldEdMKCk7aWYoIXQuaXNDb250ZXh0TG9zdCgpKXtmb3IodmFyIGUgaW4gdGhpcy5idWZmZXJDYWNoZV8pdC5kZWxldGVCdWZmZXIodGhpcy5idWZmZXJDYWNoZV9bZV0uYnVmZmVyKTtmb3IodmFyIGkgaW4gdGhpcy5wcm9ncmFtQ2FjaGVfKXQuZGVsZXRlUHJvZ3JhbSh0aGlzLnByb2dyYW1DYWNoZV9baV0pO2Zvcih2YXIgciBpbiB0aGlzLnNoYWRlckNhY2hlXyl0LmRlbGV0ZVNoYWRlcih0aGlzLnNoYWRlckNhY2hlX1tyXSk7dC5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmhpdERldGVjdGlvbkZyYW1lYnVmZmVyXyksdC5kZWxldGVSZW5kZXJidWZmZXIodGhpcy5oaXREZXRlY3Rpb25SZW5kZXJidWZmZXJfKSx0LmRlbGV0ZVRleHR1cmUodGhpcy5oaXREZXRlY3Rpb25UZXh0dXJlXyl9fSxlLnByb3RvdHlwZS5nZXRDYW52YXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXNffSxlLnByb3RvdHlwZS5nZXRHTD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdsX30sZS5wcm90b3R5cGUuZ2V0SGl0RGV0ZWN0aW9uRnJhbWVidWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaXREZXRlY3Rpb25GcmFtZWJ1ZmZlcl98fHRoaXMuaW5pdEhpdERldGVjdGlvbkZyYW1lYnVmZmVyXygpLHRoaXMuaGl0RGV0ZWN0aW9uRnJhbWVidWZmZXJffSxlLnByb3RvdHlwZS5nZXRTaGFkZXI9ZnVuY3Rpb24odCl7dmFyIGU9byh0KTtpZihlIGluIHRoaXMuc2hhZGVyQ2FjaGVfKXJldHVybiB0aGlzLnNoYWRlckNhY2hlX1tlXTt2YXIgaT10aGlzLmdldEdMKCkscj1pLmNyZWF0ZVNoYWRlcih0LmdldFR5cGUoKSk7cmV0dXJuIGkuc2hhZGVyU291cmNlKHIsdC5nZXRTb3VyY2UoKSksaS5jb21waWxlU2hhZGVyKHIpLHRoaXMuc2hhZGVyQ2FjaGVfW2VdPXIscn0sZS5wcm90b3R5cGUuZ2V0UHJvZ3JhbT1mdW5jdGlvbih0LGUpe3ZhciBpPW8odCkrIi8iK28oZSk7aWYoaSBpbiB0aGlzLnByb2dyYW1DYWNoZV8pcmV0dXJuIHRoaXMucHJvZ3JhbUNhY2hlX1tpXTt2YXIgcj10aGlzLmdldEdMKCksbj1yLmNyZWF0ZVByb2dyYW0oKTtyZXR1cm4gci5hdHRhY2hTaGFkZXIobix0aGlzLmdldFNoYWRlcih0KSksci5hdHRhY2hTaGFkZXIobix0aGlzLmdldFNoYWRlcihlKSksci5saW5rUHJvZ3JhbShuKSx0aGlzLnByb2dyYW1DYWNoZV9baV09bixufSxlLnByb3RvdHlwZS5oYW5kbGVXZWJHTENvbnRleHRMb3N0PWZ1bmN0aW9uKCl7cCh0aGlzLmJ1ZmZlckNhY2hlXykscCh0aGlzLnNoYWRlckNhY2hlXykscCh0aGlzLnByb2dyYW1DYWNoZV8pLHRoaXMuY3VycmVudFByb2dyYW1fPW51bGwsdGhpcy5oaXREZXRlY3Rpb25GcmFtZWJ1ZmZlcl89bnVsbCx0aGlzLmhpdERldGVjdGlvblRleHR1cmVfPW51bGwsdGhpcy5oaXREZXRlY3Rpb25SZW5kZXJidWZmZXJfPW51bGx9LGUucHJvdG90eXBlLmhhbmRsZVdlYkdMQ29udGV4dFJlc3RvcmVkPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5pbml0SGl0RGV0ZWN0aW9uRnJhbWVidWZmZXJfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nbF8sZT10LmNyZWF0ZUZyYW1lYnVmZmVyKCk7dC5iaW5kRnJhbWVidWZmZXIodC5GUkFNRUJVRkZFUixlKTt2YXIgaT1QaCh0LDEsMSkscj10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO3QuYmluZFJlbmRlcmJ1ZmZlcih0LlJFTkRFUkJVRkZFUixyKSx0LnJlbmRlcmJ1ZmZlclN0b3JhZ2UodC5SRU5ERVJCVUZGRVIsdC5ERVBUSF9DT01QT05FTlQxNiwxLDEpLHQuZnJhbWVidWZmZXJUZXh0dXJlMkQodC5GUkFNRUJVRkZFUix0LkNPTE9SX0FUVEFDSE1FTlQwLHQuVEVYVFVSRV8yRCxpLDApLHQuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodC5GUkFNRUJVRkZFUix0LkRFUFRIX0FUVEFDSE1FTlQsdC5SRU5ERVJCVUZGRVIsciksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsbnVsbCksdC5iaW5kUmVuZGVyYnVmZmVyKHQuUkVOREVSQlVGRkVSLG51bGwpLHQuYmluZEZyYW1lYnVmZmVyKHQuRlJBTUVCVUZGRVIsbnVsbCksdGhpcy5oaXREZXRlY3Rpb25GcmFtZWJ1ZmZlcl89ZSx0aGlzLmhpdERldGVjdGlvblRleHR1cmVfPWksdGhpcy5oaXREZXRlY3Rpb25SZW5kZXJidWZmZXJfPXJ9LGUucHJvdG90eXBlLnVzZVByb2dyYW09ZnVuY3Rpb24odCl7cmV0dXJuIHQhPXRoaXMuY3VycmVudFByb2dyYW1fJiYodGhpcy5nZXRHTCgpLnVzZVByb2dyYW0odCksdGhpcy5jdXJyZW50UHJvZ3JhbV89dCwhMCl9LGV9KEMpLEZoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcyxlLGkpLHRoaXMuYW5jaG9yWD12b2lkIDAsdGhpcy5hbmNob3JZPXZvaWQgMCx0aGlzLmdyb3VwSW5kaWNlcz1bXSx0aGlzLmhpdERldGVjdGlvbkdyb3VwSW5kaWNlcz1bXSx0aGlzLmhlaWdodD12b2lkIDAsdGhpcy5pbWFnZUhlaWdodD12b2lkIDAsdGhpcy5pbWFnZVdpZHRoPXZvaWQgMCx0aGlzLmRlZmF1bHRMb2NhdGlvbnM9bnVsbCx0aGlzLm9wYWNpdHk9dm9pZCAwLHRoaXMub3JpZ2luWD12b2lkIDAsdGhpcy5vcmlnaW5ZPXZvaWQgMCx0aGlzLnJvdGF0ZVdpdGhWaWV3PXZvaWQgMCx0aGlzLnJvdGF0aW9uPXZvaWQgMCx0aGlzLnNjYWxlPXZvaWQgMCx0aGlzLndpZHRoPXZvaWQgMH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0RGVsZXRlUmVzb3VyY2VzRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52ZXJ0aWNlc0J1ZmZlcixpPXRoaXMuaW5kaWNlc0J1ZmZlcixyPXRoaXMuZ2V0VGV4dHVyZXMoITApLG49dC5nZXRHTCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvLHM7aWYoIW4uaXNDb250ZXh0TG9zdCgpKWZvcihvPTAscz1yLmxlbmd0aDtvPHM7KytvKW4uZGVsZXRlVGV4dHVyZShyW29dKTt0LmRlbGV0ZUJ1ZmZlcihlKSx0LmRlbGV0ZUJ1ZmZlcihpKX19LGUucHJvdG90eXBlLmRyYXdDb29yZGluYXRlcz1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbixvLHMsYSxoLGwsdT10aGlzLmFuY2hvclgscD10aGlzLmFuY2hvclksYz10aGlzLmhlaWdodCxkPXRoaXMuaW1hZ2VIZWlnaHQsZj10aGlzLmltYWdlV2lkdGgsXz10aGlzLm9wYWNpdHksZz10aGlzLm9yaWdpblgseT10aGlzLm9yaWdpblksdj10aGlzLnJvdGF0ZVdpdGhWaWV3PzE6MCxtPS10aGlzLnJvdGF0aW9uLHg9dGhpcy5zY2FsZSxFPXRoaXMud2lkdGgsUz1NYXRoLmNvcyhtKSxUPU1hdGguc2luKG0pLEM9dGhpcy5pbmRpY2VzLmxlbmd0aCxSPXRoaXMudmVydGljZXMubGVuZ3RoO2ZvcihuPWU7bjxpO24rPXIpaD10W25dLXRoaXMub3JpZ2luWzBdLGw9dFtuKzFdLXRoaXMub3JpZ2luWzFdLG89Ui84LHM9LXgqdSxhPS14KihjLXApLHRoaXMudmVydGljZXNbUisrXT1oLHRoaXMudmVydGljZXNbUisrXT1sLHRoaXMudmVydGljZXNbUisrXT1zKlMtYSpULHRoaXMudmVydGljZXNbUisrXT1zKlQrYSpTLHRoaXMudmVydGljZXNbUisrXT1nL2YsdGhpcy52ZXJ0aWNlc1tSKytdPSh5K2MpL2QsdGhpcy52ZXJ0aWNlc1tSKytdPV8sdGhpcy52ZXJ0aWNlc1tSKytdPXYscz14KihFLXUpLGE9LXgqKGMtcCksdGhpcy52ZXJ0aWNlc1tSKytdPWgsdGhpcy52ZXJ0aWNlc1tSKytdPWwsdGhpcy52ZXJ0aWNlc1tSKytdPXMqUy1hKlQsdGhpcy52ZXJ0aWNlc1tSKytdPXMqVCthKlMsdGhpcy52ZXJ0aWNlc1tSKytdPShnK0UpL2YsdGhpcy52ZXJ0aWNlc1tSKytdPSh5K2MpL2QsdGhpcy52ZXJ0aWNlc1tSKytdPV8sdGhpcy52ZXJ0aWNlc1tSKytdPXYscz14KihFLXUpLGE9eCpwLHRoaXMudmVydGljZXNbUisrXT1oLHRoaXMudmVydGljZXNbUisrXT1sLHRoaXMudmVydGljZXNbUisrXT1zKlMtYSpULHRoaXMudmVydGljZXNbUisrXT1zKlQrYSpTLHRoaXMudmVydGljZXNbUisrXT0oZytFKS9mLHRoaXMudmVydGljZXNbUisrXT15L2QsdGhpcy52ZXJ0aWNlc1tSKytdPV8sdGhpcy52ZXJ0aWNlc1tSKytdPXYscz0teCp1LGE9eCpwLHRoaXMudmVydGljZXNbUisrXT1oLHRoaXMudmVydGljZXNbUisrXT1sLHRoaXMudmVydGljZXNbUisrXT1zKlMtYSpULHRoaXMudmVydGljZXNbUisrXT1zKlQrYSpTLHRoaXMudmVydGljZXNbUisrXT1nL2YsdGhpcy52ZXJ0aWNlc1tSKytdPXkvZCx0aGlzLnZlcnRpY2VzW1IrK109Xyx0aGlzLnZlcnRpY2VzW1IrK109dix0aGlzLmluZGljZXNbQysrXT1vLHRoaXMuaW5kaWNlc1tDKytdPW8rMSx0aGlzLmluZGljZXNbQysrXT1vKzIsdGhpcy5pbmRpY2VzW0MrK109byx0aGlzLmluZGljZXNbQysrXT1vKzIsdGhpcy5pbmRpY2VzW0MrK109byszO3JldHVybiBSfSxlLnByb3RvdHlwZS5jcmVhdGVUZXh0dXJlcz1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbixzLGEsaCxsPWUubGVuZ3RoO2ZvcihoPTA7aDxsOysraCkoYT1vKHM9ZVtoXSkpaW4gaT9uPWlbYV06KG49YmgocixzLDMzMDcxLDMzMDcxKSxpW2FdPW4pLHRbaF09bn0sZS5wcm90b3R5cGUuc2V0VXBQcm9ncmFtPWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuLG89ZS5nZXRQcm9ncmFtKFJoLHdoKTtyZXR1cm4gdGhpcy5kZWZhdWx0TG9jYXRpb25zP249dGhpcy5kZWZhdWx0TG9jYXRpb25zOihuPW5ldyBJaCh0LG8pLHRoaXMuZGVmYXVsdExvY2F0aW9ucz1uKSxlLnVzZVByb2dyYW0obyksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShuLmFfcG9zaXRpb24pLHQudmVydGV4QXR0cmliUG9pbnRlcihuLmFfcG9zaXRpb24sMiw1MTI2LCExLDMyLDApLHQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobi5hX29mZnNldHMpLHQudmVydGV4QXR0cmliUG9pbnRlcihuLmFfb2Zmc2V0cywyLDUxMjYsITEsMzIsOCksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShuLmFfdGV4Q29vcmQpLHQudmVydGV4QXR0cmliUG9pbnRlcihuLmFfdGV4Q29vcmQsMiw1MTI2LCExLDMyLDE2KSx0LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG4uYV9vcGFjaXR5KSx0LnZlcnRleEF0dHJpYlBvaW50ZXIobi5hX29wYWNpdHksMSw1MTI2LCExLDMyLDI0KSx0LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG4uYV9yb3RhdGVXaXRoVmlldyksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG4uYV9yb3RhdGVXaXRoVmlldywxLDUxMjYsITEsMzIsMjgpLG59LGUucHJvdG90eXBlLnNodXREb3duUHJvZ3JhbT1mdW5jdGlvbih0LGUpe3QuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUuYV9wb3NpdGlvbiksdC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZS5hX29mZnNldHMpLHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUuYV90ZXhDb29yZCksdC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZS5hX29wYWNpdHkpLHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUuYV9yb3RhdGVXaXRoVmlldyl9LGUucHJvdG90eXBlLmRyYXdSZXBsYXk9ZnVuY3Rpb24odCxlLGkscil7dmFyIG4sbyxzLGE9cj90aGlzLmdldEhpdERldGVjdGlvblRleHR1cmVzKCk6dGhpcy5nZXRUZXh0dXJlcygpLGg9cj90aGlzLmhpdERldGVjdGlvbkdyb3VwSW5kaWNlczp0aGlzLmdyb3VwSW5kaWNlcztpZihkKGkpKWZvcihuPTAsbz1hLmxlbmd0aCxzPTA7bjxvOysrbil7dC5iaW5kVGV4dHVyZShlaCxhW25dKTt2YXIgbD1oW25dO3RoaXMuZHJhd0VsZW1lbnRzKHQsZSxzLGwpLHM9bH1lbHNlIHRoaXMuZHJhd1JlcGxheVNraXBwaW5nKHQsZSxpLGEsaCl9LGUucHJvdG90eXBlLmRyYXdSZXBsYXlTa2lwcGluZz1mdW5jdGlvbih0LGUsaSxyLG4pe3ZhciBzLGEsaD0wO2ZvcihzPTAsYT1yLmxlbmd0aDtzPGE7KytzKXt0LmJpbmRUZXh0dXJlKGVoLHJbc10pO2Zvcih2YXIgbD1zPjA/bltzLTFdOjAsdT1uW3NdLHA9bCxjPWw7aDx0aGlzLnN0YXJ0SW5kaWNlcy5sZW5ndGgmJnRoaXMuc3RhcnRJbmRpY2VzW2hdPD11Oyl7dm9pZCAwIT09aVtvKHRoaXMuc3RhcnRJbmRpY2VzRmVhdHVyZVtoXSldPyhwIT09YyYmdGhpcy5kcmF3RWxlbWVudHModCxlLHAsYyksYz1wPWg9PT10aGlzLnN0YXJ0SW5kaWNlcy5sZW5ndGgtMT91OnRoaXMuc3RhcnRJbmRpY2VzW2grMV0pOmM9aD09PXRoaXMuc3RhcnRJbmRpY2VzLmxlbmd0aC0xP3U6dGhpcy5zdGFydEluZGljZXNbaCsxXSxoKyt9cCE9PWMmJnRoaXMuZHJhd0VsZW1lbnRzKHQsZSxwLGMpfX0sZS5wcm90b3R5cGUuZHJhd0hpdERldGVjdGlvblJlcGxheU9uZUJ5T25lPWZ1bmN0aW9uKHQsZSxpLHIsbil7dmFyIHMsYSxoLGwsdSxwPXRoaXMuc3RhcnRJbmRpY2VzLmxlbmd0aC0xLGM9dGhpcy5nZXRIaXREZXRlY3Rpb25UZXh0dXJlcygpO2ZvcihzPWMubGVuZ3RoLTE7cz49MDstLXMpZm9yKHQuYmluZFRleHR1cmUoZWgsY1tzXSksYT1zPjA/dGhpcy5oaXREZXRlY3Rpb25Hcm91cEluZGljZXNbcy0xXTowLGw9dGhpcy5oaXREZXRlY3Rpb25Hcm91cEluZGljZXNbc107cD49MCYmdGhpcy5zdGFydEluZGljZXNbcF0+PWE7KXtpZihoPXRoaXMuc3RhcnRJbmRpY2VzW3BdLHZvaWQgMD09PWlbbyh1PXRoaXMuc3RhcnRJbmRpY2VzRmVhdHVyZVtwXSldJiZ1LmdldEdlb21ldHJ5KCkmJih2b2lkIDA9PT1ufHxQdChuLHUuZ2V0R2VvbWV0cnkoKS5nZXRFeHRlbnQoKSkpKXt0LmNsZWFyKHQuQ09MT1JfQlVGRkVSX0JJVHx0LkRFUFRIX0JVRkZFUl9CSVQpLHRoaXMuZHJhd0VsZW1lbnRzKHQsZSxoLGwpO3ZhciBkPXIodSk7aWYoZClyZXR1cm4gZH1sPWgscC0tfX0sZS5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKHQpe3RoaXMuYW5jaG9yWD12b2lkIDAsdGhpcy5hbmNob3JZPXZvaWQgMCx0aGlzLmhlaWdodD12b2lkIDAsdGhpcy5pbWFnZUhlaWdodD12b2lkIDAsdGhpcy5pbWFnZVdpZHRoPXZvaWQgMCx0aGlzLmluZGljZXM9bnVsbCx0aGlzLm9wYWNpdHk9dm9pZCAwLHRoaXMub3JpZ2luWD12b2lkIDAsdGhpcy5vcmlnaW5ZPXZvaWQgMCx0aGlzLnJvdGF0ZVdpdGhWaWV3PXZvaWQgMCx0aGlzLnJvdGF0aW9uPXZvaWQgMCx0aGlzLnNjYWxlPXZvaWQgMCx0aGlzLnZlcnRpY2VzPW51bGwsdGhpcy53aWR0aD12b2lkIDB9LGUucHJvdG90eXBlLmdldFRleHR1cmVzPWZ1bmN0aW9uKHQpe3JldHVybiByKCl9LGUucHJvdG90eXBlLmdldEhpdERldGVjdGlvblRleHR1cmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHIoKX0sZX0oX2gpLEFoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcyxlLGkpLHRoaXMuaW1hZ2VzXz1bXSx0aGlzLmhpdERldGVjdGlvbkltYWdlc189W10sdGhpcy50ZXh0dXJlc189W10sdGhpcy5oaXREZXRlY3Rpb25UZXh0dXJlc189W119cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmRyYXdNdWx0aVBvaW50PWZ1bmN0aW9uKHQsZSl7dGhpcy5zdGFydEluZGljZXMucHVzaCh0aGlzLmluZGljZXMubGVuZ3RoKSx0aGlzLnN0YXJ0SW5kaWNlc0ZlYXR1cmUucHVzaChlKTt2YXIgaT10LmdldEZsYXRDb29yZGluYXRlcygpLHI9dC5nZXRTdHJpZGUoKTt0aGlzLmRyYXdDb29yZGluYXRlcyhpLDAsaS5sZW5ndGgscil9LGUucHJvdG90eXBlLmRyYXdQb2ludD1mdW5jdGlvbih0LGUpe3RoaXMuc3RhcnRJbmRpY2VzLnB1c2godGhpcy5pbmRpY2VzLmxlbmd0aCksdGhpcy5zdGFydEluZGljZXNGZWF0dXJlLnB1c2goZSk7dmFyIGk9dC5nZXRGbGF0Q29vcmRpbmF0ZXMoKSxyPXQuZ2V0U3RyaWRlKCk7dGhpcy5kcmF3Q29vcmRpbmF0ZXMoaSwwLGkubGVuZ3RoLHIpfSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7dmFyIGk9ZS5nZXRHTCgpO3RoaXMuZ3JvdXBJbmRpY2VzLnB1c2godGhpcy5pbmRpY2VzLmxlbmd0aCksdGhpcy5oaXREZXRlY3Rpb25Hcm91cEluZGljZXMucHVzaCh0aGlzLmluZGljZXMubGVuZ3RoKSx0aGlzLnZlcnRpY2VzQnVmZmVyPW5ldyBUaCh0aGlzLnZlcnRpY2VzKTt2YXIgcj10aGlzLmluZGljZXM7dGhpcy5pbmRpY2VzQnVmZmVyPW5ldyBUaChyKTt2YXIgbj17fTt0aGlzLmNyZWF0ZVRleHR1cmVzKHRoaXMudGV4dHVyZXNfLHRoaXMuaW1hZ2VzXyxuLGkpLHRoaXMuY3JlYXRlVGV4dHVyZXModGhpcy5oaXREZXRlY3Rpb25UZXh0dXJlc18sdGhpcy5oaXREZXRlY3Rpb25JbWFnZXNfLG4saSksdGhpcy5pbWFnZXNfPW51bGwsdGhpcy5oaXREZXRlY3Rpb25JbWFnZXNfPW51bGwsdC5wcm90b3R5cGUuZmluaXNoLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuc2V0SW1hZ2VTdHlsZT1mdW5jdGlvbih0KXt2YXIgZT10LmdldEFuY2hvcigpLGk9dC5nZXRJbWFnZSgxKSxyPXQuZ2V0SW1hZ2VTaXplKCksbj10LmdldEhpdERldGVjdGlvbkltYWdlKDEpLHM9dC5nZXRPcGFjaXR5KCksYT10LmdldE9yaWdpbigpLGg9dC5nZXRSb3RhdGVXaXRoVmlldygpLGw9dC5nZXRSb3RhdGlvbigpLHU9dC5nZXRTaXplKCkscD10LmdldFNjYWxlKCk7MD09PXRoaXMuaW1hZ2VzXy5sZW5ndGg/dGhpcy5pbWFnZXNfLnB1c2goaSk6byh0aGlzLmltYWdlc19bdGhpcy5pbWFnZXNfLmxlbmd0aC0xXSkhPW8oaSkmJih0aGlzLmdyb3VwSW5kaWNlcy5wdXNoKHRoaXMuaW5kaWNlcy5sZW5ndGgpLHRoaXMuaW1hZ2VzXy5wdXNoKGkpKSwwPT09dGhpcy5oaXREZXRlY3Rpb25JbWFnZXNfLmxlbmd0aD90aGlzLmhpdERldGVjdGlvbkltYWdlc18ucHVzaChuKTpvKHRoaXMuaGl0RGV0ZWN0aW9uSW1hZ2VzX1t0aGlzLmhpdERldGVjdGlvbkltYWdlc18ubGVuZ3RoLTFdKSE9byhuKSYmKHRoaXMuaGl0RGV0ZWN0aW9uR3JvdXBJbmRpY2VzLnB1c2godGhpcy5pbmRpY2VzLmxlbmd0aCksdGhpcy5oaXREZXRlY3Rpb25JbWFnZXNfLnB1c2gobikpLHRoaXMuYW5jaG9yWD1lWzBdLHRoaXMuYW5jaG9yWT1lWzFdLHRoaXMuaGVpZ2h0PXVbMV0sdGhpcy5pbWFnZUhlaWdodD1yWzFdLHRoaXMuaW1hZ2VXaWR0aD1yWzBdLHRoaXMub3BhY2l0eT1zLHRoaXMub3JpZ2luWD1hWzBdLHRoaXMub3JpZ2luWT1hWzFdLHRoaXMucm90YXRpb249bCx0aGlzLnJvdGF0ZVdpdGhWaWV3PWgsdGhpcy5zY2FsZT1wLHRoaXMud2lkdGg9dVswXX0sZS5wcm90b3R5cGUuZ2V0VGV4dHVyZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dGhpcy50ZXh0dXJlc18uY29uY2F0KHRoaXMuaGl0RGV0ZWN0aW9uVGV4dHVyZXNfKTp0aGlzLnRleHR1cmVzX30sZS5wcm90b3R5cGUuZ2V0SGl0RGV0ZWN0aW9uVGV4dHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaXREZXRlY3Rpb25UZXh0dXJlc199LGV9KEZoKTtmdW5jdGlvbiBOaCh0LGUsaSxyKXt2YXIgbj1pLXI7cmV0dXJuIHRbZV09PT10W25dJiZ0W2UrMV09PT10W24rMV0mJihpLWUpL3I+MyYmISFLZSh0LGUsaSxyKX12YXIgR2g9bmV3IGxoKCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbnZhcnlpbmcgZmxvYXQgdl9yb3VuZDtcbnZhcnlpbmcgdmVjMiB2X3JvdW5kVmVydGV4O1xudmFyeWluZyBmbG9hdCB2X2hhbGZXaWR0aDtcblxuXG5cbnVuaWZvcm0gZmxvYXQgdV9vcGFjaXR5O1xudW5pZm9ybSB2ZWM0IHVfY29sb3I7XG51bmlmb3JtIHZlYzIgdV9zaXplO1xudW5pZm9ybSBmbG9hdCB1X3BpeGVsUmF0aW87XG5cbnZvaWQgbWFpbih2b2lkKSB7XG4gIGlmICh2X3JvdW5kID4gMC4wKSB7XG4gICAgdmVjMiB3aW5kb3dDb29yZHMgPSB2ZWMyKCh2X3JvdW5kVmVydGV4LnggKyAxLjApIC8gMi4wICogdV9zaXplLnggKiB1X3BpeGVsUmF0aW8sXG4gICAgICAgICh2X3JvdW5kVmVydGV4LnkgKyAxLjApIC8gMi4wICogdV9zaXplLnkgKiB1X3BpeGVsUmF0aW8pO1xuICAgIGlmIChsZW5ndGgod2luZG93Q29vcmRzIC0gZ2xfRnJhZ0Nvb3JkLnh5KSA+IHZfaGFsZldpZHRoICogdV9waXhlbFJhdGlvKSB7XG4gICAgICBkaXNjYXJkO1xuICAgIH1cbiAgfVxuICBnbF9GcmFnQ29sb3IgPSB1X2NvbG9yO1xuICBmbG9hdCBhbHBoYSA9IHVfY29sb3IuYSAqIHVfb3BhY2l0eTtcbiAgaWYgKGFscGhhID09IDAuMCkge1xuICAgIGRpc2NhcmQ7XG4gIH1cbiAgZ2xfRnJhZ0NvbG9yLmEgPSBhbHBoYTtcbn1cbiIpLERoPW5ldyB1aCgidmFyeWluZyBmbG9hdCB2X3JvdW5kO1xudmFyeWluZyB2ZWMyIHZfcm91bmRWZXJ0ZXg7XG52YXJ5aW5nIGZsb2F0IHZfaGFsZldpZHRoO1xuXG5cbmF0dHJpYnV0ZSB2ZWMyIGFfbGFzdFBvcztcbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjMiBhX25leHRQb3M7XG5hdHRyaWJ1dGUgZmxvYXQgYV9kaXJlY3Rpb247XG5cbnVuaWZvcm0gbWF0NCB1X3Byb2plY3Rpb25NYXRyaXg7XG51bmlmb3JtIG1hdDQgdV9vZmZzZXRTY2FsZU1hdHJpeDtcbnVuaWZvcm0gbWF0NCB1X29mZnNldFJvdGF0ZU1hdHJpeDtcbnVuaWZvcm0gZmxvYXQgdV9saW5lV2lkdGg7XG51bmlmb3JtIGZsb2F0IHVfbWl0ZXJMaW1pdDtcblxuYm9vbCBuZWFybHlFcXVhbHMoaW4gZmxvYXQgdmFsdWUsIGluIGZsb2F0IHJlZikge1xuICBmbG9hdCBlcHNpbG9uID0gMC4wMDAwMDAwMDAwMDE7XG4gIHJldHVybiB2YWx1ZSA+PSByZWYgLSBlcHNpbG9uICYmIHZhbHVlIDw9IHJlZiArIGVwc2lsb247XG59XG5cbnZvaWQgYWxvbmdOb3JtYWwob3V0IHZlYzIgb2Zmc2V0LCBpbiB2ZWMyIG5leHRQLCBpbiBmbG9hdCB0dXJuRGlyLCBpbiBmbG9hdCBkaXJlY3Rpb24pIHtcbiAgdmVjMiBkaXJWZWN0ID0gbmV4dFAgLSBhX3Bvc2l0aW9uO1xuICB2ZWMyIG5vcm1hbCA9IG5vcm1hbGl6ZSh2ZWMyKC10dXJuRGlyICogZGlyVmVjdC55LCB0dXJuRGlyICogZGlyVmVjdC54KSk7XG4gIG9mZnNldCA9IHVfbGluZVdpZHRoIC8gMi4wICogbm9ybWFsICogZGlyZWN0aW9uO1xufVxuXG52b2lkIG1pdGVyVXAob3V0IHZlYzIgb2Zmc2V0LCBvdXQgZmxvYXQgcm91bmQsIGluIGJvb2wgaXNSb3VuZCwgaW4gZmxvYXQgZGlyZWN0aW9uKSB7XG4gIGZsb2F0IGhhbGZXaWR0aCA9IHVfbGluZVdpZHRoIC8gMi4wO1xuICB2ZWMyIHRhbmdlbnQgPSBub3JtYWxpemUobm9ybWFsaXplKGFfbmV4dFBvcyAtIGFfcG9zaXRpb24pICsgbm9ybWFsaXplKGFfcG9zaXRpb24gLSBhX2xhc3RQb3MpKTtcbiAgdmVjMiBub3JtYWwgPSB2ZWMyKC10YW5nZW50LnksIHRhbmdlbnQueCk7XG4gIHZlYzIgZGlyVmVjdCA9IGFfbmV4dFBvcyAtIGFfcG9zaXRpb247XG4gIHZlYzIgdG1wTm9ybWFsID0gbm9ybWFsaXplKHZlYzIoLWRpclZlY3QueSwgZGlyVmVjdC54KSk7XG4gIGZsb2F0IG1pdGVyTGVuZ3RoID0gYWJzKGhhbGZXaWR0aCAvIGRvdChub3JtYWwsIHRtcE5vcm1hbCkpO1xuICBvZmZzZXQgPSBub3JtYWwgKiBkaXJlY3Rpb24gKiBtaXRlckxlbmd0aDtcbiAgcm91bmQgPSAwLjA7XG4gIGlmIChpc1JvdW5kKSB7XG4gICAgcm91bmQgPSAxLjA7XG4gIH0gZWxzZSBpZiAobWl0ZXJMZW5ndGggPiB1X21pdGVyTGltaXQgKyB1X2xpbmVXaWR0aCkge1xuICAgIG9mZnNldCA9IGhhbGZXaWR0aCAqIHRtcE5vcm1hbCAqIGRpcmVjdGlvbjtcbiAgfVxufVxuXG5ib29sIG1pdGVyRG93bihvdXQgdmVjMiBvZmZzZXQsIGluIHZlYzQgcHJvalBvcywgaW4gbWF0NCBvZmZzZXRNYXRyaXgsIGluIGZsb2F0IGRpcmVjdGlvbikge1xuICBib29sIGRlZ2VuZXJhdGUgPSBmYWxzZTtcbiAgdmVjMiB0YW5nZW50ID0gbm9ybWFsaXplKG5vcm1hbGl6ZShhX25leHRQb3MgLSBhX3Bvc2l0aW9uKSArIG5vcm1hbGl6ZShhX3Bvc2l0aW9uIC0gYV9sYXN0UG9zKSk7XG4gIHZlYzIgbm9ybWFsID0gdmVjMigtdGFuZ2VudC55LCB0YW5nZW50LngpO1xuICB2ZWMyIGRpclZlY3QgPSBhX2xhc3RQb3MgLSBhX3Bvc2l0aW9uO1xuICB2ZWMyIHRtcE5vcm1hbCA9IG5vcm1hbGl6ZSh2ZWMyKC1kaXJWZWN0LnksIGRpclZlY3QueCkpO1xuICB2ZWMyIGxvbmdPZmZzZXQsIHNob3J0T2Zmc2V0LCBsb25nVmVydGV4O1xuICB2ZWM0IHNob3J0UHJvalZlcnRleDtcbiAgZmxvYXQgaGFsZldpZHRoID0gdV9saW5lV2lkdGggLyAyLjA7XG4gIGlmIChsZW5ndGgoYV9uZXh0UG9zIC0gYV9wb3NpdGlvbikgPiBsZW5ndGgoYV9sYXN0UG9zIC0gYV9wb3NpdGlvbikpIHtcbiAgICBsb25nT2Zmc2V0ID0gdG1wTm9ybWFsICogZGlyZWN0aW9uICogaGFsZldpZHRoO1xuICAgIHNob3J0T2Zmc2V0ID0gbm9ybWFsaXplKHZlYzIoZGlyVmVjdC55LCAtZGlyVmVjdC54KSkgKiBkaXJlY3Rpb24gKiBoYWxmV2lkdGg7XG4gICAgbG9uZ1ZlcnRleCA9IGFfbmV4dFBvcztcbiAgICBzaG9ydFByb2pWZXJ0ZXggPSB1X3Byb2plY3Rpb25NYXRyaXggKiB2ZWM0KGFfbGFzdFBvcywgMC4wLCAxLjApO1xuICB9IGVsc2Uge1xuICAgIHNob3J0T2Zmc2V0ID0gdG1wTm9ybWFsICogZGlyZWN0aW9uICogaGFsZldpZHRoO1xuICAgIGxvbmdPZmZzZXQgPSBub3JtYWxpemUodmVjMihkaXJWZWN0LnksIC1kaXJWZWN0LngpKSAqIGRpcmVjdGlvbiAqIGhhbGZXaWR0aDtcbiAgICBsb25nVmVydGV4ID0gYV9sYXN0UG9zO1xuICAgIHNob3J0UHJvalZlcnRleCA9IHVfcHJvamVjdGlvbk1hdHJpeCAqIHZlYzQoYV9uZXh0UG9zLCAwLjAsIDEuMCk7XG4gIH1cbiAgLy9JbnRlcnNlY3Rpb24gYWxnb3JpdGhtIGJhc2VkIG9uIHRoZW9yeSBieSBQYXVsIEJvdXJrZSAoaHR0cDovL3BhdWxib3Vya2UubmV0L2dlb21ldHJ5L3BvaW50bGluZXBsYW5lLykuXG4gIHZlYzQgcDEgPSB1X3Byb2plY3Rpb25NYXRyaXggKiB2ZWM0KGxvbmdWZXJ0ZXgsIDAuMCwgMS4wKSArIG9mZnNldE1hdHJpeCAqIHZlYzQobG9uZ09mZnNldCwgMC4wLCAwLjApO1xuICB2ZWM0IHAyID0gcHJvalBvcyArIG9mZnNldE1hdHJpeCAqIHZlYzQobG9uZ09mZnNldCwgMC4wLCAwLjApO1xuICB2ZWM0IHAzID0gc2hvcnRQcm9qVmVydGV4ICsgb2Zmc2V0TWF0cml4ICogdmVjNCgtc2hvcnRPZmZzZXQsIDAuMCwgMC4wKTtcbiAgdmVjNCBwNCA9IHNob3J0UHJvalZlcnRleCArIG9mZnNldE1hdHJpeCAqIHZlYzQoc2hvcnRPZmZzZXQsIDAuMCwgMC4wKTtcbiAgZmxvYXQgZGVub20gPSAocDQueSAtIHAzLnkpICogKHAyLnggLSBwMS54KSAtIChwNC54IC0gcDMueCkgKiAocDIueSAtIHAxLnkpO1xuICBmbG9hdCBmaXJzdFUgPSAoKHA0LnggLSBwMy54KSAqIChwMS55IC0gcDMueSkgLSAocDQueSAtIHAzLnkpICogKHAxLnggLSBwMy54KSkgLyBkZW5vbTtcbiAgZmxvYXQgc2Vjb25kVSA9ICgocDIueCAtIHAxLngpICogKHAxLnkgLSBwMy55KSAtIChwMi55IC0gcDEueSkgKiAocDEueCAtIHAzLngpKSAvIGRlbm9tO1xuICBmbG9hdCBlcHNpbG9uID0gMC4wMDAwMDAwMDAwMDE7XG4gIGlmIChmaXJzdFUgPiBlcHNpbG9uICYmIGZpcnN0VSA8IDEuMCAtIGVwc2lsb24gJiYgc2Vjb25kVSA+IGVwc2lsb24gJiYgc2Vjb25kVSA8IDEuMCAtIGVwc2lsb24pIHtcbiAgICBzaG9ydFByb2pWZXJ0ZXgueCA9IHAxLnggKyBmaXJzdFUgKiAocDIueCAtIHAxLngpO1xuICAgIHNob3J0UHJvalZlcnRleC55ID0gcDEueSArIGZpcnN0VSAqIChwMi55IC0gcDEueSk7XG4gICAgb2Zmc2V0ID0gc2hvcnRQcm9qVmVydGV4Lnh5O1xuICAgIGRlZ2VuZXJhdGUgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIGZsb2F0IG1pdGVyTGVuZ3RoID0gYWJzKGhhbGZXaWR0aCAvIGRvdChub3JtYWwsIHRtcE5vcm1hbCkpO1xuICAgIG9mZnNldCA9IG5vcm1hbCAqIGRpcmVjdGlvbiAqIG1pdGVyTGVuZ3RoO1xuICB9XG4gIHJldHVybiBkZWdlbmVyYXRlO1xufVxuXG52b2lkIHNxdWFyZUNhcChvdXQgdmVjMiBvZmZzZXQsIG91dCBmbG9hdCByb3VuZCwgaW4gYm9vbCBpc1JvdW5kLCBpbiB2ZWMyIG5leHRQLFxuICAgIGluIGZsb2F0IHR1cm5EaXIsIGluIGZsb2F0IGRpcmVjdGlvbikge1xuICByb3VuZCA9IDAuMDtcbiAgdmVjMiBkaXJWZWN0ID0gYV9wb3NpdGlvbiAtIG5leHRQO1xuICB2ZWMyIGZpcnN0Tm9ybWFsID0gbm9ybWFsaXplKGRpclZlY3QpO1xuICB2ZWMyIHNlY29uZE5vcm1hbCA9IHZlYzIodHVybkRpciAqIGZpcnN0Tm9ybWFsLnkgKiBkaXJlY3Rpb24sIC10dXJuRGlyICogZmlyc3ROb3JtYWwueCAqIGRpcmVjdGlvbik7XG4gIHZlYzIgaHlwb3RlbnVzZSA9IG5vcm1hbGl6ZShmaXJzdE5vcm1hbCAtIHNlY29uZE5vcm1hbCk7XG4gIHZlYzIgbm9ybWFsID0gdmVjMih0dXJuRGlyICogaHlwb3RlbnVzZS55ICogZGlyZWN0aW9uLCAtdHVybkRpciAqIGh5cG90ZW51c2UueCAqIGRpcmVjdGlvbik7XG4gIGZsb2F0IGxlbmd0aCA9IHNxcnQodl9oYWxmV2lkdGggKiB2X2hhbGZXaWR0aCAqIDIuMCk7XG4gIG9mZnNldCA9IG5vcm1hbCAqIGxlbmd0aDtcbiAgaWYgKGlzUm91bmQpIHtcbiAgICByb3VuZCA9IDEuMDtcbiAgfVxufVxuXG52b2lkIG1haW4odm9pZCkge1xuICBib29sIGRlZ2VuZXJhdGUgPSBmYWxzZTtcbiAgZmxvYXQgZGlyZWN0aW9uID0gZmxvYXQoc2lnbihhX2RpcmVjdGlvbikpO1xuICBtYXQ0IG9mZnNldE1hdHJpeCA9IHVfb2Zmc2V0U2NhbGVNYXRyaXggKiB1X29mZnNldFJvdGF0ZU1hdHJpeDtcbiAgdmVjMiBvZmZzZXQ7XG4gIHZlYzQgcHJvalBvcyA9IHVfcHJvamVjdGlvbk1hdHJpeCAqIHZlYzQoYV9wb3NpdGlvbiwgMC4wLCAxLjApO1xuICBib29sIHJvdW5kID0gbmVhcmx5RXF1YWxzKG1vZChhX2RpcmVjdGlvbiwgMi4wKSwgMC4wKTtcblxuICB2X3JvdW5kID0gMC4wO1xuICB2X2hhbGZXaWR0aCA9IHVfbGluZVdpZHRoIC8gMi4wO1xuICB2X3JvdW5kVmVydGV4ID0gcHJvalBvcy54eTtcblxuICBpZiAobmVhcmx5RXF1YWxzKG1vZChhX2RpcmVjdGlvbiwgMy4wKSwgMC4wKSB8fCBuZWFybHlFcXVhbHMobW9kKGFfZGlyZWN0aW9uLCAxNy4wKSwgMC4wKSkge1xuICAgIGFsb25nTm9ybWFsKG9mZnNldCwgYV9uZXh0UG9zLCAxLjAsIGRpcmVjdGlvbik7XG4gIH0gZWxzZSBpZiAobmVhcmx5RXF1YWxzKG1vZChhX2RpcmVjdGlvbiwgNS4wKSwgMC4wKSB8fCBuZWFybHlFcXVhbHMobW9kKGFfZGlyZWN0aW9uLCAxMy4wKSwgMC4wKSkge1xuICAgIGFsb25nTm9ybWFsKG9mZnNldCwgYV9sYXN0UG9zLCAtMS4wLCBkaXJlY3Rpb24pO1xuICB9IGVsc2UgaWYgKG5lYXJseUVxdWFscyhtb2QoYV9kaXJlY3Rpb24sIDIzLjApLCAwLjApKSB7XG4gICAgbWl0ZXJVcChvZmZzZXQsIHZfcm91bmQsIHJvdW5kLCBkaXJlY3Rpb24pO1xuICB9IGVsc2UgaWYgKG5lYXJseUVxdWFscyhtb2QoYV9kaXJlY3Rpb24sIDE5LjApLCAwLjApKSB7XG4gICAgZGVnZW5lcmF0ZSA9IG1pdGVyRG93bihvZmZzZXQsIHByb2pQb3MsIG9mZnNldE1hdHJpeCwgZGlyZWN0aW9uKTtcbiAgfSBlbHNlIGlmIChuZWFybHlFcXVhbHMobW9kKGFfZGlyZWN0aW9uLCA3LjApLCAwLjApKSB7XG4gICAgc3F1YXJlQ2FwKG9mZnNldCwgdl9yb3VuZCwgcm91bmQsIGFfbmV4dFBvcywgMS4wLCBkaXJlY3Rpb24pO1xuICB9IGVsc2UgaWYgKG5lYXJseUVxdWFscyhtb2QoYV9kaXJlY3Rpb24sIDExLjApLCAwLjApKSB7XG4gICAgc3F1YXJlQ2FwKG9mZnNldCwgdl9yb3VuZCwgcm91bmQsIGFfbGFzdFBvcywgLTEuMCwgZGlyZWN0aW9uKTtcbiAgfVxuICBpZiAoIWRlZ2VuZXJhdGUpIHtcbiAgICB2ZWM0IG9mZnNldHMgPSBvZmZzZXRNYXRyaXggKiB2ZWM0KG9mZnNldCwgMC4wLCAwLjApO1xuICAgIGdsX1Bvc2l0aW9uID0gcHJvalBvcyArIG9mZnNldHM7XG4gIH0gZWxzZSB7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG9mZnNldCwgMC4wLCAxLjApO1xuICB9XG59XG5cblxuIiksa2g9ZnVuY3Rpb24odCxlKXt0aGlzLnVfcHJvamVjdGlvbk1hdHJpeD10LmdldFVuaWZvcm1Mb2NhdGlvbihlLCJ1X3Byb2plY3Rpb25NYXRyaXgiKSx0aGlzLnVfb2Zmc2V0U2NhbGVNYXRyaXg9dC5nZXRVbmlmb3JtTG9jYXRpb24oZSwidV9vZmZzZXRTY2FsZU1hdHJpeCIpLHRoaXMudV9vZmZzZXRSb3RhdGVNYXRyaXg9dC5nZXRVbmlmb3JtTG9jYXRpb24oZSwidV9vZmZzZXRSb3RhdGVNYXRyaXgiKSx0aGlzLnVfbGluZVdpZHRoPXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfbGluZVdpZHRoIiksdGhpcy51X21pdGVyTGltaXQ9dC5nZXRVbmlmb3JtTG9jYXRpb24oZSwidV9taXRlckxpbWl0IiksdGhpcy51X29wYWNpdHk9dC5nZXRVbmlmb3JtTG9jYXRpb24oZSwidV9vcGFjaXR5IiksdGhpcy51X2NvbG9yPXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfY29sb3IiKSx0aGlzLnVfc2l6ZT10LmdldFVuaWZvcm1Mb2NhdGlvbihlLCJ1X3NpemUiKSx0aGlzLnVfcGl4ZWxSYXRpbz10LmdldFVuaWZvcm1Mb2NhdGlvbihlLCJ1X3BpeGVsUmF0aW8iKSx0aGlzLmFfbGFzdFBvcz10LmdldEF0dHJpYkxvY2F0aW9uKGUsImFfbGFzdFBvcyIpLHRoaXMuYV9wb3NpdGlvbj10LmdldEF0dHJpYkxvY2F0aW9uKGUsImFfcG9zaXRpb24iKSx0aGlzLmFfbmV4dFBvcz10LmdldEF0dHJpYkxvY2F0aW9uKGUsImFfbmV4dFBvcyIpLHRoaXMuYV9kaXJlY3Rpb249dC5nZXRBdHRyaWJMb2NhdGlvbihlLCJhX2RpcmVjdGlvbiIpfSxqaD0zLFVoPTUsWWg9NyxCaD0xMSxWaD0xMyxYaD0xNyx6aD0xOSxXaD0yMyxLaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMsZSxpKSx0aGlzLmRlZmF1bHRMb2NhdGlvbnNfPW51bGwsdGhpcy5zdHlsZXNfPVtdLHRoaXMuc3R5bGVJbmRpY2VzXz1bXSx0aGlzLnN0YXRlXz17c3Ryb2tlQ29sb3I6bnVsbCxsaW5lQ2FwOnZvaWQgMCxsaW5lRGFzaDpudWxsLGxpbmVEYXNoT2Zmc2V0OnZvaWQgMCxsaW5lSm9pbjp2b2lkIDAsbGluZVdpZHRoOnZvaWQgMCxtaXRlckxpbWl0OnZvaWQgMCxjaGFuZ2VkOiExfX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZHJhd0Nvb3JkaW5hdGVzXz1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbixvLHMsYSxoLGwsdSxwLGM9dGhpcy52ZXJ0aWNlcy5sZW5ndGgsZD10aGlzLmluZGljZXMubGVuZ3RoLGY9ImJldmVsIj09PXRoaXMuc3RhdGVfLmxpbmVKb2luPzA6Im1pdGVyIj09PXRoaXMuc3RhdGVfLmxpbmVKb2luPzE6MixfPSJidXR0Ij09PXRoaXMuc3RhdGVfLmxpbmVDYXA/MDoic3F1YXJlIj09PXRoaXMuc3RhdGVfLmxpbmVDYXA/MToyLGc9TmgodCxlLGkscikseT1kLHY9MTtmb3Iobj1lLG89aTtuPG87bis9cil7aWYoaD1jLzcsbD11LHU9cHx8W3Rbbl0sdFtuKzFdXSxuPT09ZSl7aWYocD1bdFtuK3JdLHRbbityKzFdXSxpLWU9PTIqciYmWih1LHApKWJyZWFrO2lmKCFnKXtfJiYoYz10aGlzLmFkZFZlcnRpY2VzXyhbMCwwXSx1LHAsdipZaCpfLGMpLGM9dGhpcy5hZGRWZXJ0aWNlc18oWzAsMF0sdSxwLC12KlloKl8sYyksdGhpcy5pbmRpY2VzW2QrK109aCsyLHRoaXMuaW5kaWNlc1tkKytdPWgsdGhpcy5pbmRpY2VzW2QrK109aCsxLHRoaXMuaW5kaWNlc1tkKytdPWgrMSx0aGlzLmluZGljZXNbZCsrXT1oKzMsdGhpcy5pbmRpY2VzW2QrK109aCsyKSxjPXRoaXMuYWRkVmVydGljZXNfKFswLDBdLHUscCx2KmpoKihffHwxKSxjKSx5PShjPXRoaXMuYWRkVmVydGljZXNfKFswLDBdLHUscCwtdipqaCooX3x8MSksYykpLzctMTtjb250aW51ZX1sPVt0W2ktMipyXSx0W2ktMipyKzFdXSxzPXB9ZWxzZXtpZihuPT09aS1yKXtpZihnKXtwPXM7YnJlYWt9bD1sfHxbMCwwXSxjPXRoaXMuYWRkVmVydGljZXNfKGwsdSxbMCwwXSx2KlVoKihffHwxKSxjKSxjPXRoaXMuYWRkVmVydGljZXNfKGwsdSxbMCwwXSwtdipVaCooX3x8MSksYyksdGhpcy5pbmRpY2VzW2QrK109aCx0aGlzLmluZGljZXNbZCsrXT15LTEsdGhpcy5pbmRpY2VzW2QrK109eSx0aGlzLmluZGljZXNbZCsrXT15LHRoaXMuaW5kaWNlc1tkKytdPWgrMSx0aGlzLmluZGljZXNbZCsrXT1oLF8mJihjPXRoaXMuYWRkVmVydGljZXNfKGwsdSxbMCwwXSx2KkJoKl8sYyksYz10aGlzLmFkZFZlcnRpY2VzXyhsLHUsWzAsMF0sLXYqQmgqXyxjKSx0aGlzLmluZGljZXNbZCsrXT1oKzIsdGhpcy5pbmRpY2VzW2QrK109aCx0aGlzLmluZGljZXNbZCsrXT1oKzEsdGhpcy5pbmRpY2VzW2QrK109aCsxLHRoaXMuaW5kaWNlc1tkKytdPWgrMyx0aGlzLmluZGljZXNbZCsrXT1oKzIpO2JyZWFrfXA9W3RbbityXSx0W24rcisxXV19YT14aChsWzBdLGxbMV0sdVswXSx1WzFdLHBbMF0scFsxXSk/LTE6MSxjPXRoaXMuYWRkVmVydGljZXNfKGwsdSxwLGEqVmgqKGZ8fDEpLGMpLGM9dGhpcy5hZGRWZXJ0aWNlc18obCx1LHAsYSpYaCooZnx8MSksYyksYz10aGlzLmFkZFZlcnRpY2VzXyhsLHUscCwtYSp6aCooZnx8MSksYyksbj5lJiYodGhpcy5pbmRpY2VzW2QrK109aCx0aGlzLmluZGljZXNbZCsrXT15LTEsdGhpcy5pbmRpY2VzW2QrK109eSx0aGlzLmluZGljZXNbZCsrXT1oKzIsdGhpcy5pbmRpY2VzW2QrK109aCx0aGlzLmluZGljZXNbZCsrXT12KmE+MD95OnktMSksdGhpcy5pbmRpY2VzW2QrK109aCx0aGlzLmluZGljZXNbZCsrXT1oKzIsdGhpcy5pbmRpY2VzW2QrK109aCsxLHk9aCsyLHY9YSxmJiYoYz10aGlzLmFkZFZlcnRpY2VzXyhsLHUscCxhKldoKmYsYyksdGhpcy5pbmRpY2VzW2QrK109aCsxLHRoaXMuaW5kaWNlc1tkKytdPWgrMyx0aGlzLmluZGljZXNbZCsrXT1oKX1nJiYoaD1ofHxjLzcsYT1TaShbbFswXSxsWzFdLHVbMF0sdVsxXSxwWzBdLHBbMV1dLDAsNiwyKT8xOi0xLGM9dGhpcy5hZGRWZXJ0aWNlc18obCx1LHAsYSpWaCooZnx8MSksYyksYz10aGlzLmFkZFZlcnRpY2VzXyhsLHUscCwtYSp6aCooZnx8MSksYyksdGhpcy5pbmRpY2VzW2QrK109aCx0aGlzLmluZGljZXNbZCsrXT15LTEsdGhpcy5pbmRpY2VzW2QrK109eSx0aGlzLmluZGljZXNbZCsrXT1oKzEsdGhpcy5pbmRpY2VzW2QrK109aCx0aGlzLmluZGljZXNbZCsrXT12KmE+MD95OnktMSl9LGUucHJvdG90eXBlLmFkZFZlcnRpY2VzXz1mdW5jdGlvbih0LGUsaSxyLG4pe3JldHVybiB0aGlzLnZlcnRpY2VzW24rK109dFswXSx0aGlzLnZlcnRpY2VzW24rK109dFsxXSx0aGlzLnZlcnRpY2VzW24rK109ZVswXSx0aGlzLnZlcnRpY2VzW24rK109ZVsxXSx0aGlzLnZlcnRpY2VzW24rK109aVswXSx0aGlzLnZlcnRpY2VzW24rK109aVsxXSx0aGlzLnZlcnRpY2VzW24rK109cixufSxlLnByb3RvdHlwZS5pc1ZhbGlkXz1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbj1pLWU7cmV0dXJuIShuPDIqcikmJihuIT09MipyfHwhWihbdFtlXSx0W2UrMV1dLFt0W2Urcl0sdFtlK3IrMV1dKSl9LGUucHJvdG90eXBlLmRyYXdMaW5lU3RyaW5nPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXRGbGF0Q29vcmRpbmF0ZXMoKSxyPXQuZ2V0U3RyaWRlKCk7dGhpcy5pc1ZhbGlkXyhpLDAsaS5sZW5ndGgscikmJihpPUR0KGksMCxpLmxlbmd0aCxyLC10aGlzLm9yaWdpblswXSwtdGhpcy5vcmlnaW5bMV0pLHRoaXMuc3RhdGVfLmNoYW5nZWQmJih0aGlzLnN0eWxlSW5kaWNlc18ucHVzaCh0aGlzLmluZGljZXMubGVuZ3RoKSx0aGlzLnN0YXRlXy5jaGFuZ2VkPSExKSx0aGlzLnN0YXJ0SW5kaWNlcy5wdXNoKHRoaXMuaW5kaWNlcy5sZW5ndGgpLHRoaXMuc3RhcnRJbmRpY2VzRmVhdHVyZS5wdXNoKGUpLHRoaXMuZHJhd0Nvb3JkaW5hdGVzXyhpLDAsaS5sZW5ndGgscikpfSxlLnByb3RvdHlwZS5kcmF3TXVsdGlMaW5lU3RyaW5nPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5pbmRpY2VzLmxlbmd0aCxyPXQuZ2V0RW5kcygpO3IudW5zaGlmdCgwKTt2YXIgbixvLHM9dC5nZXRGbGF0Q29vcmRpbmF0ZXMoKSxhPXQuZ2V0U3RyaWRlKCk7aWYoci5sZW5ndGg+MSlmb3Iobj0xLG89ci5sZW5ndGg7bjxvOysrbilpZih0aGlzLmlzVmFsaWRfKHMscltuLTFdLHJbbl0sYSkpe3ZhciBoPUR0KHMscltuLTFdLHJbbl0sYSwtdGhpcy5vcmlnaW5bMF0sLXRoaXMub3JpZ2luWzFdKTt0aGlzLmRyYXdDb29yZGluYXRlc18oaCwwLGgubGVuZ3RoLGEpfXRoaXMuaW5kaWNlcy5sZW5ndGg+aSYmKHRoaXMuc3RhcnRJbmRpY2VzLnB1c2goaSksdGhpcy5zdGFydEluZGljZXNGZWF0dXJlLnB1c2goZSksdGhpcy5zdGF0ZV8uY2hhbmdlZCYmKHRoaXMuc3R5bGVJbmRpY2VzXy5wdXNoKGkpLHRoaXMuc3RhdGVfLmNoYW5nZWQ9ITEpKX0sZS5wcm90b3R5cGUuZHJhd1BvbHlnb25Db29yZGluYXRlcz1mdW5jdGlvbih0LGUsaSl7dmFyIHIsbjtpZihOaCh0LDAsdC5sZW5ndGgsaSl8fCh0LnB1c2godFswXSksdC5wdXNoKHRbMV0pKSx0aGlzLmRyYXdDb29yZGluYXRlc18odCwwLHQubGVuZ3RoLGkpLGUubGVuZ3RoKWZvcihyPTAsbj1lLmxlbmd0aDtyPG47KytyKU5oKGVbcl0sMCxlW3JdLmxlbmd0aCxpKXx8KGVbcl0ucHVzaChlW3JdWzBdKSxlW3JdLnB1c2goZVtyXVsxXSkpLHRoaXMuZHJhd0Nvb3JkaW5hdGVzXyhlW3JdLDAsZVtyXS5sZW5ndGgsaSl9LGUucHJvdG90eXBlLnNldFBvbHlnb25TdHlsZT1mdW5jdGlvbih0LGUpe3ZhciBpPXZvaWQgMD09PWU/dGhpcy5pbmRpY2VzLmxlbmd0aDplO3RoaXMuc3RhcnRJbmRpY2VzLnB1c2goaSksdGhpcy5zdGFydEluZGljZXNGZWF0dXJlLnB1c2godCksdGhpcy5zdGF0ZV8uY2hhbmdlZCYmKHRoaXMuc3R5bGVJbmRpY2VzXy5wdXNoKGkpLHRoaXMuc3RhdGVfLmNoYW5nZWQ9ITEpfSxlLnByb3RvdHlwZS5nZXRDdXJyZW50SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbmRpY2VzLmxlbmd0aH0sZS5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKHQpe3RoaXMudmVydGljZXNCdWZmZXI9bmV3IFRoKHRoaXMudmVydGljZXMpLHRoaXMuaW5kaWNlc0J1ZmZlcj1uZXcgVGgodGhpcy5pbmRpY2VzKSx0aGlzLnN0YXJ0SW5kaWNlcy5wdXNoKHRoaXMuaW5kaWNlcy5sZW5ndGgpLDA9PT10aGlzLnN0eWxlSW5kaWNlc18ubGVuZ3RoJiZ0aGlzLnN0eWxlc18ubGVuZ3RoPjAmJih0aGlzLnN0eWxlc189W10pLHRoaXMudmVydGljZXM9bnVsbCx0aGlzLmluZGljZXM9bnVsbH0sZS5wcm90b3R5cGUuZ2V0RGVsZXRlUmVzb3VyY2VzRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52ZXJ0aWNlc0J1ZmZlcixpPXRoaXMuaW5kaWNlc0J1ZmZlcjtyZXR1cm4gZnVuY3Rpb24oKXt0LmRlbGV0ZUJ1ZmZlcihlKSx0LmRlbGV0ZUJ1ZmZlcihpKX19LGUucHJvdG90eXBlLnNldFVwUHJvZ3JhbT1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbixvPWUuZ2V0UHJvZ3JhbShHaCxEaCk7cmV0dXJuIHRoaXMuZGVmYXVsdExvY2F0aW9uc18/bj10aGlzLmRlZmF1bHRMb2NhdGlvbnNfOihuPW5ldyBraCh0LG8pLHRoaXMuZGVmYXVsdExvY2F0aW9uc189biksZS51c2VQcm9ncmFtKG8pLHQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobi5hX2xhc3RQb3MpLHQudmVydGV4QXR0cmliUG9pbnRlcihuLmFfbGFzdFBvcywyLDUxMjYsITEsMjgsMCksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShuLmFfcG9zaXRpb24pLHQudmVydGV4QXR0cmliUG9pbnRlcihuLmFfcG9zaXRpb24sMiw1MTI2LCExLDI4LDgpLHQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobi5hX25leHRQb3MpLHQudmVydGV4QXR0cmliUG9pbnRlcihuLmFfbmV4dFBvcywyLDUxMjYsITEsMjgsMTYpLHQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobi5hX2RpcmVjdGlvbiksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG4uYV9kaXJlY3Rpb24sMSw1MTI2LCExLDI4LDI0KSx0LnVuaWZvcm0yZnYobi51X3NpemUsaSksdC51bmlmb3JtMWYobi51X3BpeGVsUmF0aW8sciksbn0sZS5wcm90b3R5cGUuc2h1dERvd25Qcm9ncmFtPWZ1bmN0aW9uKHQsZSl7dC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZS5hX2xhc3RQb3MpLHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUuYV9wb3NpdGlvbiksdC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZS5hX25leHRQb3MpLHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUuYV9kaXJlY3Rpb24pfSxlLnByb3RvdHlwZS5kcmF3UmVwbGF5PWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuLG8scyxhLGg9dC5nZXRQYXJhbWV0ZXIodC5ERVBUSF9GVU5DKSxsPXQuZ2V0UGFyYW1ldGVyKHQuREVQVEhfV1JJVEVNQVNLKTtpZihyfHwodC5lbmFibGUodC5ERVBUSF9URVNUKSx0LmRlcHRoTWFzayghMCksdC5kZXB0aEZ1bmModC5OT1RFUVVBTCkpLGQoaSkpZm9yKHM9dGhpcy5zdGFydEluZGljZXNbdGhpcy5zdGFydEluZGljZXMubGVuZ3RoLTFdLG49dGhpcy5zdHlsZUluZGljZXNfLmxlbmd0aC0xO24+PTA7LS1uKW89dGhpcy5zdHlsZUluZGljZXNfW25dLGE9dGhpcy5zdHlsZXNfW25dLHRoaXMuc2V0U3Ryb2tlU3R5bGVfKHQsYVswXSxhWzFdLGFbMl0pLHRoaXMuZHJhd0VsZW1lbnRzKHQsZSxvLHMpLHQuY2xlYXIodC5ERVBUSF9CVUZGRVJfQklUKSxzPW87ZWxzZSB0aGlzLmRyYXdSZXBsYXlTa2lwcGluZ18odCxlLGkpO3J8fCh0LmRpc2FibGUodC5ERVBUSF9URVNUKSx0LmNsZWFyKHQuREVQVEhfQlVGRkVSX0JJVCksdC5kZXB0aE1hc2sobCksdC5kZXB0aEZ1bmMoaCkpfSxlLnByb3RvdHlwZS5kcmF3UmVwbGF5U2tpcHBpbmdfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcixuLHMsYSxoLGwsdTtmb3IobD10aGlzLnN0YXJ0SW5kaWNlcy5sZW5ndGgtMixzPW49dGhpcy5zdGFydEluZGljZXNbbCsxXSxyPXRoaXMuc3R5bGVJbmRpY2VzXy5sZW5ndGgtMTtyPj0wOy0tcil7Zm9yKGE9dGhpcy5zdHlsZXNfW3JdLHRoaXMuc2V0U3Ryb2tlU3R5bGVfKHQsYVswXSxhWzFdLGFbMl0pLGg9dGhpcy5zdHlsZUluZGljZXNfW3JdO2w+PTAmJnRoaXMuc3RhcnRJbmRpY2VzW2xdPj1oOyl1PXRoaXMuc3RhcnRJbmRpY2VzW2xdLGlbbyh0aGlzLnN0YXJ0SW5kaWNlc0ZlYXR1cmVbbF0pXSYmKG4hPT1zJiYodGhpcy5kcmF3RWxlbWVudHModCxlLG4scyksdC5jbGVhcih0LkRFUFRIX0JVRkZFUl9CSVQpKSxzPXUpLGwtLSxuPXU7biE9PXMmJih0aGlzLmRyYXdFbGVtZW50cyh0LGUsbixzKSx0LmNsZWFyKHQuREVQVEhfQlVGRkVSX0JJVCkpLG49cz1ofX0sZS5wcm90b3R5cGUuZHJhd0hpdERldGVjdGlvblJlcGxheU9uZUJ5T25lPWZ1bmN0aW9uKHQsZSxpLHIsbil7dmFyIHMsYSxoLGwsdSxwLGM7Zm9yKGM9dGhpcy5zdGFydEluZGljZXMubGVuZ3RoLTIsaD10aGlzLnN0YXJ0SW5kaWNlc1tjKzFdLHM9dGhpcy5zdHlsZUluZGljZXNfLmxlbmd0aC0xO3M+PTA7LS1zKWZvcihsPXRoaXMuc3R5bGVzX1tzXSx0aGlzLnNldFN0cm9rZVN0eWxlXyh0LGxbMF0sbFsxXSxsWzJdKSx1PXRoaXMuc3R5bGVJbmRpY2VzX1tzXTtjPj0wJiZ0aGlzLnN0YXJ0SW5kaWNlc1tjXT49dTspe2lmKGE9dGhpcy5zdGFydEluZGljZXNbY10sdm9pZCAwPT09aVtvKHA9dGhpcy5zdGFydEluZGljZXNGZWF0dXJlW2NdKV0mJnAuZ2V0R2VvbWV0cnkoKSYmKHZvaWQgMD09PW58fFB0KG4scC5nZXRHZW9tZXRyeSgpLmdldEV4dGVudCgpKSkpe3QuY2xlYXIodC5DT0xPUl9CVUZGRVJfQklUfHQuREVQVEhfQlVGRkVSX0JJVCksdGhpcy5kcmF3RWxlbWVudHModCxlLGEsaCk7dmFyIGQ9cihwKTtpZihkKXJldHVybiBkfWMtLSxoPWF9fSxlLnByb3RvdHlwZS5zZXRTdHJva2VTdHlsZV89ZnVuY3Rpb24odCxlLGkscil7dC51bmlmb3JtNGZ2KHRoaXMuZGVmYXVsdExvY2F0aW9uc18udV9jb2xvcixlKSx0LnVuaWZvcm0xZih0aGlzLmRlZmF1bHRMb2NhdGlvbnNfLnVfbGluZVdpZHRoLGkpLHQudW5pZm9ybTFmKHRoaXMuZGVmYXVsdExvY2F0aW9uc18udV9taXRlckxpbWl0LHIpfSxlLnByb3RvdHlwZS5zZXRGaWxsU3Ryb2tlU3R5bGU9ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmdldExpbmVDYXAoKTt0aGlzLnN0YXRlXy5saW5lQ2FwPXZvaWQgMCE9PWk/aToicm91bmQiO3ZhciByPWUuZ2V0TGluZURhc2goKTt0aGlzLnN0YXRlXy5saW5lRGFzaD1yfHx5aDt2YXIgbj1lLmdldExpbmVEYXNoT2Zmc2V0KCk7dGhpcy5zdGF0ZV8ubGluZURhc2hPZmZzZXQ9bnx8MDt2YXIgbz1lLmdldExpbmVKb2luKCk7dGhpcy5zdGF0ZV8ubGluZUpvaW49dm9pZCAwIT09bz9vOiJyb3VuZCI7dmFyIHM9ZS5nZXRDb2xvcigpO3M9cyBpbnN0YW5jZW9mIENhbnZhc0dyYWRpZW50fHxzIGluc3RhbmNlb2YgQ2FudmFzUGF0dGVybj92aDpfcihzKS5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm4gMyE9ZT90LzI1NTp0fSl8fHZoO3ZhciBhPWUuZ2V0V2lkdGgoKTthPXZvaWQgMCE9PWE/YToxO3ZhciBoPWUuZ2V0TWl0ZXJMaW1pdCgpO2g9dm9pZCAwIT09aD9oOjEwLHRoaXMuc3RhdGVfLnN0cm9rZUNvbG9yJiZaKHRoaXMuc3RhdGVfLnN0cm9rZUNvbG9yLHMpJiZ0aGlzLnN0YXRlXy5saW5lV2lkdGg9PT1hJiZ0aGlzLnN0YXRlXy5taXRlckxpbWl0PT09aHx8KHRoaXMuc3RhdGVfLmNoYW5nZWQ9ITAsdGhpcy5zdGF0ZV8uc3Ryb2tlQ29sb3I9cyx0aGlzLnN0YXRlXy5saW5lV2lkdGg9YSx0aGlzLnN0YXRlXy5taXRlckxpbWl0PWgsdGhpcy5zdHlsZXNfLnB1c2goW3MsYSxoXSkpfSxlfShfaCksSGg9bmV3IGxoKCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxuXG5cbnVuaWZvcm0gdmVjNCB1X2NvbG9yO1xudW5pZm9ybSBmbG9hdCB1X29wYWNpdHk7XG5cbnZvaWQgbWFpbih2b2lkKSB7XG4gIGdsX0ZyYWdDb2xvciA9IHVfY29sb3I7XG4gIGZsb2F0IGFscGhhID0gdV9jb2xvci5hICogdV9vcGFjaXR5O1xuICBpZiAoYWxwaGEgPT0gMC4wKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBnbF9GcmFnQ29sb3IuYSA9IGFscGhhO1xufVxuIiksWmg9bmV3IHVoKCJcblxuYXR0cmlidXRlIHZlYzIgYV9wb3NpdGlvbjtcblxudW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbk1hdHJpeDtcbnVuaWZvcm0gbWF0NCB1X29mZnNldFNjYWxlTWF0cml4O1xudW5pZm9ybSBtYXQ0IHVfb2Zmc2V0Um90YXRlTWF0cml4O1xuXG52b2lkIG1haW4odm9pZCkge1xuICBnbF9Qb3NpdGlvbiA9IHVfcHJvamVjdGlvbk1hdHJpeCAqIHZlYzQoYV9wb3NpdGlvbiwgMC4wLCAxLjApO1xufVxuXG5cbiIpLHFoPWZ1bmN0aW9uKHQsZSl7dGhpcy51X3Byb2plY3Rpb25NYXRyaXg9dC5nZXRVbmlmb3JtTG9jYXRpb24oZSwidV9wcm9qZWN0aW9uTWF0cml4IiksdGhpcy51X29mZnNldFNjYWxlTWF0cml4PXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfb2Zmc2V0U2NhbGVNYXRyaXgiKSx0aGlzLnVfb2Zmc2V0Um90YXRlTWF0cml4PXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfb2Zmc2V0Um90YXRlTWF0cml4IiksdGhpcy51X2NvbG9yPXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfY29sb3IiKSx0aGlzLnVfb3BhY2l0eT10LmdldFVuaWZvcm1Mb2NhdGlvbihlLCJ1X29wYWNpdHkiKSx0aGlzLmFfcG9zaXRpb249dC5nZXRBdHRyaWJMb2NhdGlvbihlLCJhX3Bvc2l0aW9uIil9LEpoPWZ1bmN0aW9uKHQpe3RoaXMuZmlyc3RfLHRoaXMubGFzdF8sdGhpcy5oZWFkXyx0aGlzLmNpcmN1bGFyXz12b2lkIDA9PT10fHx0LHRoaXMubGVuZ3RoXz0wfTtKaC5wcm90b3R5cGUuaW5zZXJ0SXRlbT1mdW5jdGlvbih0KXt2YXIgZT17cHJldjp2b2lkIDAsbmV4dDp2b2lkIDAsZGF0YTp0fSxpPXRoaXMuaGVhZF87aWYoaSl7dmFyIHI9aS5uZXh0O2UucHJldj1pLGUubmV4dD1yLGkubmV4dD1lLHImJihyLnByZXY9ZSksaT09PXRoaXMubGFzdF8mJih0aGlzLmxhc3RfPWUpfWVsc2UgdGhpcy5maXJzdF89ZSx0aGlzLmxhc3RfPWUsdGhpcy5jaXJjdWxhcl8mJihlLm5leHQ9ZSxlLnByZXY9ZSk7dGhpcy5oZWFkXz1lLHRoaXMubGVuZ3RoXysrfSxKaC5wcm90b3R5cGUucmVtb3ZlSXRlbT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaGVhZF87aWYodCl7dmFyIGU9dC5uZXh0LGk9dC5wcmV2O2UmJihlLnByZXY9aSksaSYmKGkubmV4dD1lKSx0aGlzLmhlYWRfPWV8fGksdGhpcy5maXJzdF89PT10aGlzLmxhc3RfPyh0aGlzLmhlYWRfPXZvaWQgMCx0aGlzLmZpcnN0Xz12b2lkIDAsdGhpcy5sYXN0Xz12b2lkIDApOnRoaXMuZmlyc3RfPT09dD90aGlzLmZpcnN0Xz10aGlzLmhlYWRfOnRoaXMubGFzdF89PT10JiYodGhpcy5sYXN0Xz1pP3RoaXMuaGVhZF8ucHJldjp0aGlzLmhlYWRfKSx0aGlzLmxlbmd0aF8tLX19LEpoLnByb3RvdHlwZS5maXJzdEl0ZW09ZnVuY3Rpb24oKXtpZih0aGlzLmhlYWRfPXRoaXMuZmlyc3RfLHRoaXMuaGVhZF8pcmV0dXJuIHRoaXMuaGVhZF8uZGF0YX0sSmgucHJvdG90eXBlLmxhc3RJdGVtPWZ1bmN0aW9uKCl7aWYodGhpcy5oZWFkXz10aGlzLmxhc3RfLHRoaXMuaGVhZF8pcmV0dXJuIHRoaXMuaGVhZF8uZGF0YX0sSmgucHJvdG90eXBlLm5leHRJdGVtPWZ1bmN0aW9uKCl7aWYodGhpcy5oZWFkXyYmdGhpcy5oZWFkXy5uZXh0KXJldHVybiB0aGlzLmhlYWRfPXRoaXMuaGVhZF8ubmV4dCx0aGlzLmhlYWRfLmRhdGF9LEpoLnByb3RvdHlwZS5nZXROZXh0SXRlbT1mdW5jdGlvbigpe2lmKHRoaXMuaGVhZF8mJnRoaXMuaGVhZF8ubmV4dClyZXR1cm4gdGhpcy5oZWFkXy5uZXh0LmRhdGF9LEpoLnByb3RvdHlwZS5wcmV2SXRlbT1mdW5jdGlvbigpe2lmKHRoaXMuaGVhZF8mJnRoaXMuaGVhZF8ucHJldilyZXR1cm4gdGhpcy5oZWFkXz10aGlzLmhlYWRfLnByZXYsdGhpcy5oZWFkXy5kYXRhfSxKaC5wcm90b3R5cGUuZ2V0UHJldkl0ZW09ZnVuY3Rpb24oKXtpZih0aGlzLmhlYWRfJiZ0aGlzLmhlYWRfLnByZXYpcmV0dXJuIHRoaXMuaGVhZF8ucHJldi5kYXRhfSxKaC5wcm90b3R5cGUuZ2V0Q3Vyckl0ZW09ZnVuY3Rpb24oKXtpZih0aGlzLmhlYWRfKXJldHVybiB0aGlzLmhlYWRfLmRhdGF9LEpoLnByb3RvdHlwZS5zZXRGaXJzdEl0ZW09ZnVuY3Rpb24oKXt0aGlzLmNpcmN1bGFyXyYmdGhpcy5oZWFkXyYmKHRoaXMuZmlyc3RfPXRoaXMuaGVhZF8sdGhpcy5sYXN0Xz10aGlzLmhlYWRfLnByZXYpfSxKaC5wcm90b3R5cGUuY29uY2F0PWZ1bmN0aW9uKHQpe2lmKHQuaGVhZF8pe2lmKHRoaXMuaGVhZF8pe3ZhciBlPXRoaXMuaGVhZF8ubmV4dDt0aGlzLmhlYWRfLm5leHQ9dC5maXJzdF8sdC5maXJzdF8ucHJldj10aGlzLmhlYWRfLGUucHJldj10Lmxhc3RfLHQubGFzdF8ubmV4dD1lLHRoaXMubGVuZ3RoXys9dC5sZW5ndGhffWVsc2UgdGhpcy5oZWFkXz10LmhlYWRfLHRoaXMuZmlyc3RfPXQuZmlyc3RfLHRoaXMubGFzdF89dC5sYXN0Xyx0aGlzLmxlbmd0aF89dC5sZW5ndGhfO3QuaGVhZF89dm9pZCAwLHQuZmlyc3RfPXZvaWQgMCx0Lmxhc3RfPXZvaWQgMCx0Lmxlbmd0aF89MH19LEpoLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGhffTt2YXIgUWg9SmgsJGg9ZnVuY3Rpb24odCl7dGhpcy5yYnVzaF89dWEoKSh0LHZvaWQgMCksdGhpcy5pdGVtc189e319OyRoLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT17bWluWDp0WzBdLG1pblk6dFsxXSxtYXhYOnRbMl0sbWF4WTp0WzNdLHZhbHVlOmV9O3RoaXMucmJ1c2hfLmluc2VydChpKSx0aGlzLml0ZW1zX1tvKGUpXT1pfSwkaC5wcm90b3R5cGUubG9hZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1uZXcgQXJyYXkoZS5sZW5ndGgpLHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe3ZhciBzPXRbcl0sYT1lW3JdLGg9e21pblg6c1swXSxtaW5ZOnNbMV0sbWF4WDpzWzJdLG1heFk6c1szXSx2YWx1ZTphfTtpW3JdPWgsdGhpcy5pdGVtc19bbyhhKV09aH10aGlzLnJidXNoXy5sb2FkKGkpfSwkaC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCksaT10aGlzLml0ZW1zX1tlXTtyZXR1cm4gZGVsZXRlIHRoaXMuaXRlbXNfW2VdLG51bGwhPT10aGlzLnJidXNoXy5yZW1vdmUoaSl9LCRoLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLml0ZW1zX1tvKGUpXTtkdChbaS5taW5YLGkubWluWSxpLm1heFgsaS5tYXhZXSx0KXx8KHRoaXMucmVtb3ZlKGUpLHRoaXMuaW5zZXJ0KHQsZSkpfSwkaC5wcm90b3R5cGUuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmJ1c2hfLmFsbCgpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pfSwkaC5wcm90b3R5cGUuZ2V0SW5FeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9e21pblg6dFswXSxtaW5ZOnRbMV0sbWF4WDp0WzJdLG1heFk6dFszXX07cmV0dXJuIHRoaXMucmJ1c2hfLnNlYXJjaChlKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWV9KX0sJGgucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5mb3JFYWNoXyh0aGlzLmdldEFsbCgpLHQsZSl9LCRoLnByb3RvdHlwZS5mb3JFYWNoSW5FeHRlbnQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmZvckVhY2hfKHRoaXMuZ2V0SW5FeHRlbnQodCksZSxpKX0sJGgucHJvdG90eXBlLmZvckVhY2hfPWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIHIsbj0wLG89dC5sZW5ndGg7bjxvO24rKylpZihyPWUuY2FsbChpLHRbbl0pKXJldHVybiByO3JldHVybiByfSwkaC5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiBkKHRoaXMuaXRlbXNfKX0sJGgucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5yYnVzaF8uY2xlYXIoKSx0aGlzLml0ZW1zXz17fX0sJGgucHJvdG90eXBlLmdldEV4dGVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnJidXNoXy50b0pTT04oKTtyZXR1cm4gbHQoZS5taW5YLGUubWluWSxlLm1heFgsZS5tYXhZLHQpfSwkaC5wcm90b3R5cGUuY29uY2F0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzLnJidXNoXy5sb2FkKHQucmJ1c2hfLmFsbCgpKSx0Lml0ZW1zXyl0aGlzLml0ZW1zX1tlXT10Lml0ZW1zX1tlXX07dmFyIHRsPSRoLGVsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcyxlLGkpLHRoaXMubGluZVN0cmluZ1JlcGxheT1uZXcgS2goZSxpKSx0aGlzLmRlZmF1bHRMb2NhdGlvbnNfPW51bGwsdGhpcy5zdHlsZXNfPVtdLHRoaXMuc3R5bGVJbmRpY2VzXz1bXSx0aGlzLnN0YXRlXz17ZmlsbENvbG9yOm51bGwsY2hhbmdlZDohMX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmRyYXdDb29yZGluYXRlc189ZnVuY3Rpb24odCxlLGkpe3ZhciByPW5ldyBRaCxuPW5ldyB0bDt0aGlzLnByb2Nlc3NGbGF0Q29vcmRpbmF0ZXNfKHQsaSxyLG4sITApO3ZhciBvPXRoaXMuZ2V0TWF4Q29vcmRzXyhyKTtpZihlLmxlbmd0aCl7dmFyIHMsYSxoPVtdO2ZvcihzPTAsYT1lLmxlbmd0aDtzPGE7KytzKXt2YXIgbD17bGlzdDpuZXcgUWgsbWF4Q29vcmRzOnZvaWQgMCxydHJlZTpuZXcgdGx9O2gucHVzaChsKSx0aGlzLnByb2Nlc3NGbGF0Q29vcmRpbmF0ZXNfKGVbc10saSxsLmxpc3QsbC5ydHJlZSwhMSksdGhpcy5jbGFzc2lmeVBvaW50c18obC5saXN0LGwucnRyZWUsITApLGwubWF4Q29vcmRzPXRoaXMuZ2V0TWF4Q29vcmRzXyhsLmxpc3QpfWZvcihoLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5tYXhDb29yZHNbMF09PT10Lm1heENvb3Jkc1swXT90Lm1heENvb3Jkc1sxXS1lLm1heENvb3Jkc1sxXTplLm1heENvb3Jkc1swXS10Lm1heENvb3Jkc1swXX0pLHM9MDtzPGgubGVuZ3RoOysrcyl7dmFyIHU9aFtzXS5saXN0LHA9dS5maXJzdEl0ZW0oKSxjPXAsZD12b2lkIDA7ZG97aWYodGhpcy5nZXRJbnRlcnNlY3Rpb25zXyhjLG4pLmxlbmd0aCl7ZD0hMDticmVha31jPXUubmV4dEl0ZW0oKX13aGlsZShwIT09Yyk7ZHx8dGhpcy5icmlkZ2VIb2xlXyh1LGhbc10ubWF4Q29vcmRzWzBdLHIsb1swXSxuKSYmKG4uY29uY2F0KGhbc10ucnRyZWUpLHRoaXMuY2xhc3NpZnlQb2ludHNfKHIsbiwhMSkpfX1lbHNlIHRoaXMuY2xhc3NpZnlQb2ludHNfKHIsbiwhMSk7dGhpcy50cmlhbmd1bGF0ZV8ocixuKX0sZS5wcm90b3R5cGUucHJvY2Vzc0ZsYXRDb29yZGluYXRlc189ZnVuY3Rpb24odCxlLGkscixuKXt2YXIgbyxzLGEsaCxsLHU9U2kodCwwLHQubGVuZ3RoLGUpLHA9dGhpcy52ZXJ0aWNlcy5sZW5ndGgvMixjPVtdLGQ9W107aWYobj09PXUpe2ZvcihoPWE9dGhpcy5jcmVhdGVQb2ludF8odFswXSx0WzFdLHArKyksbz1lLHM9dC5sZW5ndGg7bzxzO28rPWUpbD10aGlzLmNyZWF0ZVBvaW50Xyh0W29dLHRbbysxXSxwKyspLGQucHVzaCh0aGlzLmluc2VydEl0ZW1fKGgsbCxpKSksYy5wdXNoKFtNYXRoLm1pbihoLngsbC54KSxNYXRoLm1pbihoLnksbC55KSxNYXRoLm1heChoLngsbC54KSxNYXRoLm1heChoLnksbC55KV0pLGg9bDtkLnB1c2godGhpcy5pbnNlcnRJdGVtXyhsLGEsaSkpLGMucHVzaChbTWF0aC5taW4oaC54LGwueCksTWF0aC5taW4oaC55LGwueSksTWF0aC5tYXgoaC54LGwueCksTWF0aC5tYXgoaC55LGwueSldKX1lbHNle3ZhciBmPXQubGVuZ3RoLWU7Zm9yKGg9YT10aGlzLmNyZWF0ZVBvaW50Xyh0W2ZdLHRbZisxXSxwKyspLG89Zi1lLHM9MDtvPj1zO28tPWUpbD10aGlzLmNyZWF0ZVBvaW50Xyh0W29dLHRbbysxXSxwKyspLGQucHVzaCh0aGlzLmluc2VydEl0ZW1fKGgsbCxpKSksYy5wdXNoKFtNYXRoLm1pbihoLngsbC54KSxNYXRoLm1pbihoLnksbC55KSxNYXRoLm1heChoLngsbC54KSxNYXRoLm1heChoLnksbC55KV0pLGg9bDtkLnB1c2godGhpcy5pbnNlcnRJdGVtXyhsLGEsaSkpLGMucHVzaChbTWF0aC5taW4oaC54LGwueCksTWF0aC5taW4oaC55LGwueSksTWF0aC5tYXgoaC54LGwueCksTWF0aC5tYXgoaC55LGwueSldKX1yLmxvYWQoYyxkKX0sZS5wcm90b3R5cGUuZ2V0TWF4Q29vcmRzXz1mdW5jdGlvbih0KXt2YXIgZT10LmZpcnN0SXRlbSgpLGk9ZSxyPVtpLnAwLngsaS5wMC55XTtkb3soaT10Lm5leHRJdGVtKCkpLnAwLng+clswXSYmKHI9W2kucDAueCxpLnAwLnldKX13aGlsZShpIT09ZSk7cmV0dXJuIHJ9LGUucHJvdG90eXBlLmNsYXNzaWZ5UG9pbnRzXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9dC5maXJzdEl0ZW0oKSxuPXIsbz10Lm5leHRJdGVtKCkscz0hMTtkb3t2YXIgYT1pP3hoKG8ucDEueCxvLnAxLnksbi5wMS54LG4ucDEueSxuLnAwLngsbi5wMC55KTp4aChuLnAwLngsbi5wMC55LG4ucDEueCxuLnAxLnksby5wMS54LG8ucDEueSk7dm9pZCAwPT09YT8odGhpcy5yZW1vdmVJdGVtXyhuLG8sdCxlKSxzPSEwLG89PT1yJiYocj10LmdldE5leHRJdGVtKCkpLG89bix0LnByZXZJdGVtKCkpOm4ucDEucmVmbGV4IT09YSYmKG4ucDEucmVmbGV4PWEscz0hMCksbj1vLG89dC5uZXh0SXRlbSgpfXdoaWxlKG4hPT1yKTtyZXR1cm4gc30sZS5wcm90b3R5cGUuYnJpZGdlSG9sZV89ZnVuY3Rpb24odCxlLGkscixuKXtmb3IodmFyIG89dC5maXJzdEl0ZW0oKTtvLnAxLnghPT1lOylvPXQubmV4dEl0ZW0oKTt2YXIgcyxhLGgsbCx1PW8ucDEscD17eDpyLHk6dS55LGk6LTF9LGM9MS8wLGQ9dGhpcy5nZXRJbnRlcnNlY3Rpb25zXyh7cDA6dSxwMTpwfSxuLCEwKTtmb3Iocz0wLGE9ZC5sZW5ndGg7czxhOysrcyl7dmFyIGY9ZFtzXSxfPXRoaXMuY2FsY3VsYXRlSW50ZXJzZWN0aW9uXyh1LHAsZi5wMCxmLnAxLCEwKSxnPU1hdGguYWJzKHUueC1fWzBdKTtnPGMmJnZvaWQgMCE9PXhoKHUueCx1LnksZi5wMC54LGYucDAueSxmLnAxLngsZi5wMS55KSYmKGM9ZyxsPXt4Ol9bMF0seTpfWzFdLGk6LTF9LG89Zil9aWYoYz09PTEvMClyZXR1cm4hMTtpZihoPW8ucDEsYz4wKXt2YXIgeT10aGlzLmdldFBvaW50c0luVHJpYW5nbGVfKHUsbCxvLnAxLG4pO2lmKHkubGVuZ3RoKXt2YXIgdj0xLzA7Zm9yKHM9MCxhPXkubGVuZ3RoO3M8YTsrK3Mpe3ZhciBtPXlbc10seD1NYXRoLmF0YW4yKHUueS1tLnkscC54LW0ueCk7KHg8dnx8eD09PXYmJm0ueDxoLngpJiYodj14LGg9bSl9fX1mb3Iobz1pLmZpcnN0SXRlbSgpO28ucDEueCE9PWgueHx8by5wMS55IT09aC55OylvPWkubmV4dEl0ZW0oKTt2YXIgRT17eDp1LngseTp1LnksaTp1LmkscmVmbGV4OnZvaWQgMH0sUz17eDpvLnAxLngseTpvLnAxLnksaTpvLnAxLmkscmVmbGV4OnZvaWQgMH07cmV0dXJuIHQuZ2V0TmV4dEl0ZW0oKS5wMD1FLHRoaXMuaW5zZXJ0SXRlbV8odSxvLnAxLHQsbiksdGhpcy5pbnNlcnRJdGVtXyhTLEUsdCxuKSxvLnAxPVMsdC5zZXRGaXJzdEl0ZW0oKSxpLmNvbmNhdCh0KSwhMH0sZS5wcm90b3R5cGUudHJpYW5ndWxhdGVfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPSExLHI9dGhpcy5pc1NpbXBsZV8odCxlKTt0LmdldExlbmd0aCgpPjM7KWlmKHIpe2lmKCF0aGlzLmNsaXBFYXJzXyh0LGUscixpKSYmIXRoaXMuY2xhc3NpZnlQb2ludHNfKHQsZSxpKSYmIXRoaXMucmVzb2x2ZVNlbGZJbnRlcnNlY3Rpb25zXyh0LGUsITApKWJyZWFrfWVsc2UgaWYoIXRoaXMuY2xpcEVhcnNfKHQsZSxyLGkpJiYhdGhpcy5jbGFzc2lmeVBvaW50c18odCxlLGkpJiYhdGhpcy5yZXNvbHZlU2VsZkludGVyc2VjdGlvbnNfKHQsZSkpe2lmKCEocj10aGlzLmlzU2ltcGxlXyh0LGUpKSl7dGhpcy5zcGxpdFBvbHlnb25fKHQsZSk7YnJlYWt9aT0hdGhpcy5pc0Nsb2Nrd2lzZV8odCksdGhpcy5jbGFzc2lmeVBvaW50c18odCxlLGkpfWlmKDM9PT10LmdldExlbmd0aCgpKXt2YXIgbj10aGlzLmluZGljZXMubGVuZ3RoO3RoaXMuaW5kaWNlc1tuKytdPXQuZ2V0UHJldkl0ZW0oKS5wMC5pLHRoaXMuaW5kaWNlc1tuKytdPXQuZ2V0Q3Vyckl0ZW0oKS5wMC5pLHRoaXMuaW5kaWNlc1tuKytdPXQuZ2V0TmV4dEl0ZW0oKS5wMC5pfX0sZS5wcm90b3R5cGUuY2xpcEVhcnNfPWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuLG8scyxhPXRoaXMuaW5kaWNlcy5sZW5ndGgsaD10LmZpcnN0SXRlbSgpLGw9dC5nZXRQcmV2SXRlbSgpLHU9aCxwPXQubmV4dEl0ZW0oKSxjPXQuZ2V0TmV4dEl0ZW0oKSxkPSExO2Rve2lmKG49dS5wMCxvPXUucDEscz1wLnAxLCExPT09by5yZWZsZXgpe3ZhciBmPXZvaWQgMDtmPWk/MD09PXRoaXMuZ2V0UG9pbnRzSW5UcmlhbmdsZV8obixvLHMsZSwhMCkubGVuZ3RoOnI/dGhpcy5kaWFnb25hbElzSW5zaWRlXyhjLnAxLHMsbyxuLGwucDApOnRoaXMuZGlhZ29uYWxJc0luc2lkZV8obC5wMCxuLG8scyxjLnAxKSwoaXx8MD09PXRoaXMuZ2V0SW50ZXJzZWN0aW9uc18oe3AwOm4scDE6c30sZSkubGVuZ3RoKSYmZiYmKGl8fCExPT09bi5yZWZsZXh8fCExPT09cy5yZWZsZXh8fFNpKFtsLnAwLngsbC5wMC55LG4ueCxuLnksby54LG8ueSxzLngscy55LGMucDEueCxjLnAxLnldLDAsMTAsMik9PT0hcikmJih0aGlzLmluZGljZXNbYSsrXT1uLmksdGhpcy5pbmRpY2VzW2ErK109by5pLHRoaXMuaW5kaWNlc1thKytdPXMuaSx0aGlzLnJlbW92ZUl0ZW1fKHUscCx0LGUpLHA9PT1oJiYoaD1jKSxkPSEwKX1sPXQuZ2V0UHJldkl0ZW0oKSx1PXQuZ2V0Q3Vyckl0ZW0oKSxwPXQubmV4dEl0ZW0oKSxjPXQuZ2V0TmV4dEl0ZW0oKX13aGlsZSh1IT09aCYmdC5nZXRMZW5ndGgoKT4zKTtyZXR1cm4gZH0sZS5wcm90b3R5cGUucmVzb2x2ZVNlbGZJbnRlcnNlY3Rpb25zXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9dC5maXJzdEl0ZW0oKTt0Lm5leHRJdGVtKCk7dmFyIG49cixvPXQubmV4dEl0ZW0oKSxzPSExO2Rve3ZhciBhPXRoaXMuY2FsY3VsYXRlSW50ZXJzZWN0aW9uXyhuLnAwLG4ucDEsby5wMCxvLnAxLGkpO2lmKGEpe3ZhciBoPSExLGw9dGhpcy52ZXJ0aWNlcy5sZW5ndGgsdT10aGlzLmluZGljZXMubGVuZ3RoLHA9bC8yLGM9dC5wcmV2SXRlbSgpO3QucmVtb3ZlSXRlbSgpLGUucmVtb3ZlKGMpLGg9Yz09PXI7dmFyIGQ9dm9pZCAwO2lmKGk/KGFbMF09PT1uLnAwLngmJmFbMV09PT1uLnAwLnk/KHQucHJldkl0ZW0oKSxkPW4ucDAsby5wMD1kLGUucmVtb3ZlKG4pLGg9aHx8bj09PXIpOihkPW8ucDEsbi5wMT1kLGUucmVtb3ZlKG8pLGg9aHx8bz09PXIpLHQucmVtb3ZlSXRlbSgpKTooZD10aGlzLmNyZWF0ZVBvaW50XyhhWzBdLGFbMV0scCksbi5wMT1kLG8ucDA9ZCxlLnVwZGF0ZShbTWF0aC5taW4obi5wMC54LG4ucDEueCksTWF0aC5taW4obi5wMC55LG4ucDEueSksTWF0aC5tYXgobi5wMC54LG4ucDEueCksTWF0aC5tYXgobi5wMC55LG4ucDEueSldLG4pLGUudXBkYXRlKFtNYXRoLm1pbihvLnAwLngsby5wMS54KSxNYXRoLm1pbihvLnAwLnksby5wMS55KSxNYXRoLm1heChvLnAwLngsby5wMS54KSxNYXRoLm1heChvLnAwLnksby5wMS55KV0sbykpLHRoaXMuaW5kaWNlc1t1KytdPWMucDAuaSx0aGlzLmluZGljZXNbdSsrXT1jLnAxLmksdGhpcy5pbmRpY2VzW3UrK109ZC5pLHM9ITAsaClicmVha31uPXQuZ2V0UHJldkl0ZW0oKSxvPXQubmV4dEl0ZW0oKX13aGlsZShuIT09cik7cmV0dXJuIHN9LGUucHJvdG90eXBlLmlzU2ltcGxlXz1mdW5jdGlvbih0LGUpe3ZhciBpPXQuZmlyc3RJdGVtKCkscj1pO2Rve2lmKHRoaXMuZ2V0SW50ZXJzZWN0aW9uc18ocixlKS5sZW5ndGgpcmV0dXJuITE7cj10Lm5leHRJdGVtKCl9d2hpbGUociE9PWkpO3JldHVybiEwfSxlLnByb3RvdHlwZS5pc0Nsb2Nrd2lzZV89ZnVuY3Rpb24odCl7dmFyIGU9Mip0LmdldExlbmd0aCgpLGk9bmV3IEFycmF5KGUpLHI9dC5maXJzdEl0ZW0oKSxuPXIsbz0wO2Rve2lbbysrXT1uLnAwLngsaVtvKytdPW4ucDAueSxuPXQubmV4dEl0ZW0oKX13aGlsZShuIT09cik7cmV0dXJuIFNpKGksMCxlLDIpfSxlLnByb3RvdHlwZS5zcGxpdFBvbHlnb25fPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5maXJzdEl0ZW0oKSxyPWk7ZG97dmFyIG49dGhpcy5nZXRJbnRlcnNlY3Rpb25zXyhyLGUpO2lmKG4ubGVuZ3RoKXt2YXIgbz1uWzBdLHM9dGhpcy52ZXJ0aWNlcy5sZW5ndGgvMixhPXRoaXMuY2FsY3VsYXRlSW50ZXJzZWN0aW9uXyhyLnAwLHIucDEsby5wMCxvLnAxKSxoPXRoaXMuY3JlYXRlUG9pbnRfKGFbMF0sYVsxXSxzKSxsPW5ldyBRaCx1PW5ldyB0bDt0aGlzLmluc2VydEl0ZW1fKGgsci5wMSxsLHUpLHIucDE9aCxlLnVwZGF0ZShbTWF0aC5taW4oci5wMC54LGgueCksTWF0aC5taW4oci5wMC55LGgueSksTWF0aC5tYXgoci5wMC54LGgueCksTWF0aC5tYXgoci5wMC55LGgueSldLHIpO2Zvcih2YXIgcD10Lm5leHRJdGVtKCk7cCE9PW87KXRoaXMuaW5zZXJ0SXRlbV8ocC5wMCxwLnAxLGwsdSksZS5yZW1vdmUocCksdC5yZW1vdmVJdGVtKCkscD10LmdldEN1cnJJdGVtKCk7dGhpcy5pbnNlcnRJdGVtXyhvLnAwLGgsbCx1KSxvLnAwPWgsZS51cGRhdGUoW01hdGgubWluKG8ucDEueCxoLngpLE1hdGgubWluKG8ucDEueSxoLnkpLE1hdGgubWF4KG8ucDEueCxoLngpLE1hdGgubWF4KG8ucDEueSxoLnkpXSxvKSx0aGlzLmNsYXNzaWZ5UG9pbnRzXyh0LGUsITEpLHRoaXMudHJpYW5ndWxhdGVfKHQsZSksdGhpcy5jbGFzc2lmeVBvaW50c18obCx1LCExKSx0aGlzLnRyaWFuZ3VsYXRlXyhsLHUpO2JyZWFrfXI9dC5uZXh0SXRlbSgpfXdoaWxlKHIhPT1pKX0sZS5wcm90b3R5cGUuY3JlYXRlUG9pbnRfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLnZlcnRpY2VzLmxlbmd0aDtyZXR1cm4gdGhpcy52ZXJ0aWNlc1tyKytdPXQsdGhpcy52ZXJ0aWNlc1tyKytdPWUse3g6dCx5OmUsaTppLHJlZmxleDp2b2lkIDB9fSxlLnByb3RvdHlwZS5pbnNlcnRJdGVtXz1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbj17cDA6dCxwMTplfTtyZXR1cm4gaS5pbnNlcnRJdGVtKG4pLHImJnIuaW5zZXJ0KFtNYXRoLm1pbih0LngsZS54KSxNYXRoLm1pbih0LnksZS55KSxNYXRoLm1heCh0LngsZS54KSxNYXRoLm1heCh0LnksZS55KV0sbiksbn0sZS5wcm90b3R5cGUucmVtb3ZlSXRlbV89ZnVuY3Rpb24odCxlLGkscil7aS5nZXRDdXJySXRlbSgpPT09ZSYmKGkucmVtb3ZlSXRlbSgpLHQucDE9ZS5wMSxyLnJlbW92ZShlKSxyLnVwZGF0ZShbTWF0aC5taW4odC5wMC54LHQucDEueCksTWF0aC5taW4odC5wMC55LHQucDEueSksTWF0aC5tYXgodC5wMC54LHQucDEueCksTWF0aC5tYXgodC5wMC55LHQucDEueSldLHQpKX0sZS5wcm90b3R5cGUuZ2V0UG9pbnRzSW5UcmlhbmdsZV89ZnVuY3Rpb24odCxlLGkscixuKXtmb3IodmFyIG89W10scz1yLmdldEluRXh0ZW50KFtNYXRoLm1pbih0LngsZS54LGkueCksTWF0aC5taW4odC55LGUueSxpLnkpLE1hdGgubWF4KHQueCxlLngsaS54KSxNYXRoLm1heCh0LnksZS55LGkueSldKSxhPTAsaD1zLmxlbmd0aDthPGg7KythKWZvcih2YXIgbCBpbiBzW2FdKXt2YXIgdT1zW2FdW2xdOyJvYmplY3QiIT10eXBlb2YgdXx8biYmIXUucmVmbGV4fHx1Lng9PT10LngmJnUueT09PXQueXx8dS54PT09ZS54JiZ1Lnk9PT1lLnl8fHUueD09PWkueCYmdS55PT09aS55fHwtMSE9PW8uaW5kZXhPZih1KXx8IWZpKFt0LngsdC55LGUueCxlLnksaS54LGkueV0sMCw2LDIsdS54LHUueSl8fG8ucHVzaCh1KX1yZXR1cm4gb30sZS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9uc189ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgcj10LnAwLG49dC5wMSxvPWUuZ2V0SW5FeHRlbnQoW01hdGgubWluKHIueCxuLngpLE1hdGgubWluKHIueSxuLnkpLE1hdGgubWF4KHIueCxuLngpLE1hdGgubWF4KHIueSxuLnkpXSkscz1bXSxhPTAsaD1vLmxlbmd0aDthPGg7KythKXt2YXIgbD1vW2FdO3QhPT1sJiYoaXx8bC5wMCE9PW58fGwucDEhPT1yKSYmdGhpcy5jYWxjdWxhdGVJbnRlcnNlY3Rpb25fKHIsbixsLnAwLGwucDEsaSkmJnMucHVzaChsKX1yZXR1cm4gc30sZS5wcm90b3R5cGUuY2FsY3VsYXRlSW50ZXJzZWN0aW9uXz1mdW5jdGlvbih0LGUsaSxyLG4pe3ZhciBvPShyLnktaS55KSooZS54LXQueCktKHIueC1pLngpKihlLnktdC55KTtpZigwIT09byl7dmFyIHM9KChyLngtaS54KSoodC55LWkueSktKHIueS1pLnkpKih0LngtaS54KSkvbyxhPSgoZS54LXQueCkqKHQueS1pLnkpLShlLnktdC55KSoodC54LWkueCkpL287aWYoIW4mJnM+bWgmJnM8MS1taCYmYT5taCYmYTwxLW1ofHxuJiZzPj0wJiZzPD0xJiZhPj0wJiZhPD0xKXJldHVyblt0LngrcyooZS54LXQueCksdC55K3MqKGUueS10LnkpXX19LGUucHJvdG90eXBlLmRpYWdvbmFsSXNJbnNpZGVfPWZ1bmN0aW9uKHQsZSxpLHIsbil7aWYodm9pZCAwPT09ZS5yZWZsZXh8fHZvaWQgMD09PXIucmVmbGV4KXJldHVybiExO3ZhciBvPShpLngtci54KSooZS55LXIueSk+KGkueS1yLnkpKihlLngtci54KSxzPShuLngtci54KSooZS55LXIueSk8KG4ueS1yLnkpKihlLngtci54KSxhPSh0LngtZS54KSooci55LWUueSk+KHQueS1lLnkpKihyLngtZS54KSxoPShpLngtZS54KSooci55LWUueSk8KGkueS1lLnkpKihyLngtZS54KSxsPXIucmVmbGV4P3N8fG86cyYmbyx1PWUucmVmbGV4P2h8fGE6aCYmYTtyZXR1cm4gbCYmdX0sZS5wcm90b3R5cGUuZHJhd011bHRpUG9seWdvbj1mdW5jdGlvbih0LGUpe3ZhciBpLHIsbixvLHM9dC5nZXRFbmRzcygpLGE9dC5nZXRTdHJpZGUoKSxoPXRoaXMuaW5kaWNlcy5sZW5ndGgsbD10aGlzLmxpbmVTdHJpbmdSZXBsYXkuZ2V0Q3VycmVudEluZGV4KCksdT10LmdldEZsYXRDb29yZGluYXRlcygpLHA9MDtmb3IoaT0wLHI9cy5sZW5ndGg7aTxyOysraSl7dmFyIGM9c1tpXTtpZihjLmxlbmd0aD4wKXt2YXIgZD1EdCh1LHAsY1swXSxhLC10aGlzLm9yaWdpblswXSwtdGhpcy5vcmlnaW5bMV0pO2lmKGQubGVuZ3RoKXt2YXIgZj1bXSxfPXZvaWQgMDtmb3Iobj0xLG89Yy5sZW5ndGg7bjxvOysrbiljW25dIT09Y1tuLTFdJiYoXz1EdCh1LGNbbi0xXSxjW25dLGEsLXRoaXMub3JpZ2luWzBdLC10aGlzLm9yaWdpblsxXSksZi5wdXNoKF8pKTt0aGlzLmxpbmVTdHJpbmdSZXBsYXkuZHJhd1BvbHlnb25Db29yZGluYXRlcyhkLGYsYSksdGhpcy5kcmF3Q29vcmRpbmF0ZXNfKGQsZixhKX19cD1jW2MubGVuZ3RoLTFdfXRoaXMuaW5kaWNlcy5sZW5ndGg+aCYmKHRoaXMuc3RhcnRJbmRpY2VzLnB1c2goaCksdGhpcy5zdGFydEluZGljZXNGZWF0dXJlLnB1c2goZSksdGhpcy5zdGF0ZV8uY2hhbmdlZCYmKHRoaXMuc3R5bGVJbmRpY2VzXy5wdXNoKGgpLHRoaXMuc3RhdGVfLmNoYW5nZWQ9ITEpKSx0aGlzLmxpbmVTdHJpbmdSZXBsYXkuZ2V0Q3VycmVudEluZGV4KCk+bCYmdGhpcy5saW5lU3RyaW5nUmVwbGF5LnNldFBvbHlnb25TdHlsZShlLGwpfSxlLnByb3RvdHlwZS5kcmF3UG9seWdvbj1mdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0RW5kcygpLHI9dC5nZXRTdHJpZGUoKTtpZihpLmxlbmd0aD4wKXt2YXIgbj10LmdldEZsYXRDb29yZGluYXRlcygpLm1hcChOdW1iZXIpLG89RHQobiwwLGlbMF0sciwtdGhpcy5vcmlnaW5bMF0sLXRoaXMub3JpZ2luWzFdKTtpZihvLmxlbmd0aCl7dmFyIHMsYSxoLGw9W107Zm9yKHM9MSxhPWkubGVuZ3RoO3M8YTsrK3MpaVtzXSE9PWlbcy0xXSYmKGg9RHQobixpW3MtMV0saVtzXSxyLC10aGlzLm9yaWdpblswXSwtdGhpcy5vcmlnaW5bMV0pLGwucHVzaChoKSk7dGhpcy5zdGFydEluZGljZXMucHVzaCh0aGlzLmluZGljZXMubGVuZ3RoKSx0aGlzLnN0YXJ0SW5kaWNlc0ZlYXR1cmUucHVzaChlKSx0aGlzLnN0YXRlXy5jaGFuZ2VkJiYodGhpcy5zdHlsZUluZGljZXNfLnB1c2godGhpcy5pbmRpY2VzLmxlbmd0aCksdGhpcy5zdGF0ZV8uY2hhbmdlZD0hMSksdGhpcy5saW5lU3RyaW5nUmVwbGF5LnNldFBvbHlnb25TdHlsZShlKSx0aGlzLmxpbmVTdHJpbmdSZXBsYXkuZHJhd1BvbHlnb25Db29yZGluYXRlcyhvLGwsciksdGhpcy5kcmF3Q29vcmRpbmF0ZXNfKG8sbCxyKX19fSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24odCl7dGhpcy52ZXJ0aWNlc0J1ZmZlcj1uZXcgVGgodGhpcy52ZXJ0aWNlcyksdGhpcy5pbmRpY2VzQnVmZmVyPW5ldyBUaCh0aGlzLmluZGljZXMpLHRoaXMuc3RhcnRJbmRpY2VzLnB1c2godGhpcy5pbmRpY2VzLmxlbmd0aCksdGhpcy5saW5lU3RyaW5nUmVwbGF5LmZpbmlzaCh0KSwwPT09dGhpcy5zdHlsZUluZGljZXNfLmxlbmd0aCYmdGhpcy5zdHlsZXNfLmxlbmd0aD4wJiYodGhpcy5zdHlsZXNfPVtdKSx0aGlzLnZlcnRpY2VzPW51bGwsdGhpcy5pbmRpY2VzPW51bGx9LGUucHJvdG90eXBlLmdldERlbGV0ZVJlc291cmNlc0Z1bmN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmVydGljZXNCdWZmZXIsaT10aGlzLmluZGljZXNCdWZmZXIscj10aGlzLmxpbmVTdHJpbmdSZXBsYXkuZ2V0RGVsZXRlUmVzb3VyY2VzRnVuY3Rpb24odCk7cmV0dXJuIGZ1bmN0aW9uKCl7dC5kZWxldGVCdWZmZXIoZSksdC5kZWxldGVCdWZmZXIoaSkscigpfX0sZS5wcm90b3R5cGUuc2V0VXBQcm9ncmFtPWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuLG89ZS5nZXRQcm9ncmFtKEhoLFpoKTtyZXR1cm4gdGhpcy5kZWZhdWx0TG9jYXRpb25zXz9uPXRoaXMuZGVmYXVsdExvY2F0aW9uc186KG49bmV3IHFoKHQsbyksdGhpcy5kZWZhdWx0TG9jYXRpb25zXz1uKSxlLnVzZVByb2dyYW0obyksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShuLmFfcG9zaXRpb24pLHQudmVydGV4QXR0cmliUG9pbnRlcihuLmFfcG9zaXRpb24sMiw1MTI2LCExLDgsMCksbn0sZS5wcm90b3R5cGUuc2h1dERvd25Qcm9ncmFtPWZ1bmN0aW9uKHQsZSl7dC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZS5hX3Bvc2l0aW9uKX0sZS5wcm90b3R5cGUuZHJhd1JlcGxheT1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbixvLHMsYSxoPXQuZ2V0UGFyYW1ldGVyKHQuREVQVEhfRlVOQyksbD10LmdldFBhcmFtZXRlcih0LkRFUFRIX1dSSVRFTUFTSyk7aWYocnx8KHQuZW5hYmxlKHQuREVQVEhfVEVTVCksdC5kZXB0aE1hc2soITApLHQuZGVwdGhGdW5jKHQuTk9URVFVQUwpKSxkKGkpKWZvcihzPXRoaXMuc3RhcnRJbmRpY2VzW3RoaXMuc3RhcnRJbmRpY2VzLmxlbmd0aC0xXSxuPXRoaXMuc3R5bGVJbmRpY2VzXy5sZW5ndGgtMTtuPj0wOy0tbilvPXRoaXMuc3R5bGVJbmRpY2VzX1tuXSxhPXRoaXMuc3R5bGVzX1tuXSx0aGlzLnNldEZpbGxTdHlsZV8odCxhKSx0aGlzLmRyYXdFbGVtZW50cyh0LGUsbyxzKSxzPW87ZWxzZSB0aGlzLmRyYXdSZXBsYXlTa2lwcGluZ18odCxlLGkpO3J8fCh0LmRpc2FibGUodC5ERVBUSF9URVNUKSx0LmNsZWFyKHQuREVQVEhfQlVGRkVSX0JJVCksdC5kZXB0aE1hc2sobCksdC5kZXB0aEZ1bmMoaCkpfSxlLnByb3RvdHlwZS5kcmF3SGl0RGV0ZWN0aW9uUmVwbGF5T25lQnlPbmU9ZnVuY3Rpb24odCxlLGkscixuKXt2YXIgcyxhLGgsbCx1LHAsYztmb3IoYz10aGlzLnN0YXJ0SW5kaWNlcy5sZW5ndGgtMixoPXRoaXMuc3RhcnRJbmRpY2VzW2MrMV0scz10aGlzLnN0eWxlSW5kaWNlc18ubGVuZ3RoLTE7cz49MDstLXMpZm9yKGw9dGhpcy5zdHlsZXNfW3NdLHRoaXMuc2V0RmlsbFN0eWxlXyh0LGwpLHU9dGhpcy5zdHlsZUluZGljZXNfW3NdO2M+PTAmJnRoaXMuc3RhcnRJbmRpY2VzW2NdPj11Oyl7aWYoYT10aGlzLnN0YXJ0SW5kaWNlc1tjXSx2b2lkIDA9PT1pW28ocD10aGlzLnN0YXJ0SW5kaWNlc0ZlYXR1cmVbY10pXSYmcC5nZXRHZW9tZXRyeSgpJiYodm9pZCAwPT09bnx8UHQobixwLmdldEdlb21ldHJ5KCkuZ2V0RXh0ZW50KCkpKSl7dC5jbGVhcih0LkNPTE9SX0JVRkZFUl9CSVR8dC5ERVBUSF9CVUZGRVJfQklUKSx0aGlzLmRyYXdFbGVtZW50cyh0LGUsYSxoKTt2YXIgZD1yKHApO2lmKGQpcmV0dXJuIGR9Yy0tLGg9YX19LGUucHJvdG90eXBlLmRyYXdSZXBsYXlTa2lwcGluZ189ZnVuY3Rpb24odCxlLGkpe3ZhciByLG4scyxhLGgsbCx1O2ZvcihsPXRoaXMuc3RhcnRJbmRpY2VzLmxlbmd0aC0yLHM9bj10aGlzLnN0YXJ0SW5kaWNlc1tsKzFdLHI9dGhpcy5zdHlsZUluZGljZXNfLmxlbmd0aC0xO3I+PTA7LS1yKXtmb3IoYT10aGlzLnN0eWxlc19bcl0sdGhpcy5zZXRGaWxsU3R5bGVfKHQsYSksaD10aGlzLnN0eWxlSW5kaWNlc19bcl07bD49MCYmdGhpcy5zdGFydEluZGljZXNbbF0+PWg7KXU9dGhpcy5zdGFydEluZGljZXNbbF0saVtvKHRoaXMuc3RhcnRJbmRpY2VzRmVhdHVyZVtsXSldJiYobiE9PXMmJih0aGlzLmRyYXdFbGVtZW50cyh0LGUsbixzKSx0LmNsZWFyKHQuREVQVEhfQlVGRkVSX0JJVCkpLHM9dSksbC0tLG49dTtuIT09cyYmKHRoaXMuZHJhd0VsZW1lbnRzKHQsZSxuLHMpLHQuY2xlYXIodC5ERVBUSF9CVUZGRVJfQklUKSksbj1zPWh9fSxlLnByb3RvdHlwZS5zZXRGaWxsU3R5bGVfPWZ1bmN0aW9uKHQsZSl7dC51bmlmb3JtNGZ2KHRoaXMuZGVmYXVsdExvY2F0aW9uc18udV9jb2xvcixlKX0sZS5wcm90b3R5cGUuc2V0RmlsbFN0cm9rZVN0eWxlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dD90LmdldENvbG9yKCk6WzAsMCwwLDBdO2lmKGk9aSBpbnN0YW5jZW9mIENhbnZhc0dyYWRpZW50fHxpIGluc3RhbmNlb2YgQ2FudmFzUGF0dGVybj9naDpfcihpKS5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm4gMyE9ZT90LzI1NTp0fSl8fGdoLHRoaXMuc3RhdGVfLmZpbGxDb2xvciYmWihpLHRoaXMuc3RhdGVfLmZpbGxDb2xvcil8fCh0aGlzLnN0YXRlXy5maWxsQ29sb3I9aSx0aGlzLnN0YXRlXy5jaGFuZ2VkPSEwLHRoaXMuc3R5bGVzXy5wdXNoKGkpKSxlKXRoaXMubGluZVN0cmluZ1JlcGxheS5zZXRGaWxsU3Ryb2tlU3R5bGUobnVsbCxlKTtlbHNle3ZhciByPW5ldyBFcih7Y29sb3I6WzAsMCwwLDBdLHdpZHRoOjB9KTt0aGlzLmxpbmVTdHJpbmdSZXBsYXkuc2V0RmlsbFN0cm9rZVN0eWxlKG51bGwscil9fSxlfShfaCksaWw9ZnVuY3Rpb24odCxlKXt0aGlzLnNwYWNlXz1lLHRoaXMuZW1wdHlCbG9ja3NfPVt7eDowLHk6MCx3aWR0aDp0LGhlaWdodDp0fV0sdGhpcy5lbnRyaWVzXz17fSx0aGlzLmNvbnRleHRfPUpuKHQsdCksdGhpcy5jYW52YXNfPXRoaXMuY29udGV4dF8uY2FudmFzfTtpbC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVudHJpZXNfW3RdfHxudWxsfSxpbC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSxpLHIsbil7Zm9yKHZhciBvPTAscz10aGlzLmVtcHR5QmxvY2tzXy5sZW5ndGg7bzxzOysrbyl7dmFyIGE9dGhpcy5lbXB0eUJsb2Nrc19bb107aWYoYS53aWR0aD49ZSt0aGlzLnNwYWNlXyYmYS5oZWlnaHQ+PWkrdGhpcy5zcGFjZV8pe3ZhciBoPXtvZmZzZXRYOmEueCt0aGlzLnNwYWNlXyxvZmZzZXRZOmEueSt0aGlzLnNwYWNlXyxpbWFnZTp0aGlzLmNhbnZhc199O3JldHVybiB0aGlzLmVudHJpZXNfW3RdPWgsci5jYWxsKG4sdGhpcy5jb250ZXh0XyxhLngrdGhpcy5zcGFjZV8sYS55K3RoaXMuc3BhY2VfKSx0aGlzLnNwbGl0XyhvLGEsZSt0aGlzLnNwYWNlXyxpK3RoaXMuc3BhY2VfKSxofX1yZXR1cm4gbnVsbH0saWwucHJvdG90eXBlLnNwbGl0Xz1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbixvO2Uud2lkdGgtaT5lLmhlaWdodC1yPyhuPXt4OmUueCtpLHk6ZS55LHdpZHRoOmUud2lkdGgtaSxoZWlnaHQ6ZS5oZWlnaHR9LG89e3g6ZS54LHk6ZS55K3Isd2lkdGg6aSxoZWlnaHQ6ZS5oZWlnaHQtcn0sdGhpcy51cGRhdGVCbG9ja3NfKHQsbixvKSk6KG49e3g6ZS54K2kseTplLnksd2lkdGg6ZS53aWR0aC1pLGhlaWdodDpyfSxvPXt4OmUueCx5OmUueStyLHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LXJ9LHRoaXMudXBkYXRlQmxvY2tzXyh0LG4sbykpfSxpbC5wcm90b3R5cGUudXBkYXRlQmxvY2tzXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9W3QsMV07ZS53aWR0aD4wJiZlLmhlaWdodD4wJiZyLnB1c2goZSksaS53aWR0aD4wJiZpLmhlaWdodD4wJiZyLnB1c2goaSksdGhpcy5lbXB0eUJsb2Nrc18uc3BsaWNlLmFwcGx5KHRoaXMuZW1wdHlCbG9ja3NfLHIpfTt2YXIgcmw9aWwsbmw9ZnVuY3Rpb24odCl7dmFyIGU9dHx8e307dGhpcy5jdXJyZW50U2l6ZV89dm9pZCAwIT09ZS5pbml0aWFsU2l6ZT9lLmluaXRpYWxTaXplOjI1Nix0aGlzLm1heFNpemVfPXZvaWQgMCE9PWUubWF4U2l6ZT9lLm1heFNpemU6dm9pZCAwIT09bmg/bmg6MjA0OCx0aGlzLnNwYWNlXz12b2lkIDAhPT1lLnNwYWNlP2Uuc3BhY2U6MSx0aGlzLmF0bGFzZXNfPVtuZXcgcmwodGhpcy5jdXJyZW50U2l6ZV8sdGhpcy5zcGFjZV8pXSx0aGlzLmN1cnJlbnRIaXRTaXplXz10aGlzLmN1cnJlbnRTaXplXyx0aGlzLmhpdEF0bGFzZXNfPVtuZXcgcmwodGhpcy5jdXJyZW50SGl0U2l6ZV8sdGhpcy5zcGFjZV8pXX07bmwucHJvdG90eXBlLmdldEluZm89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRJbmZvXyh0aGlzLmF0bGFzZXNfLHQpO2lmKCFlKXJldHVybiBudWxsO3ZhciBpPXRoaXMuZ2V0SW5mb18odGhpcy5oaXRBdGxhc2VzXyx0KTtyZXR1cm4gdGhpcy5tZXJnZUluZm9zXyhlLGkpfSxubC5wcm90b3R5cGUuZ2V0SW5mb189ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpe3ZhciBuPXRbaV0uZ2V0KGUpO2lmKG4pcmV0dXJuIG59cmV0dXJuIG51bGx9LG5sLnByb3RvdHlwZS5tZXJnZUluZm9zXz1mdW5jdGlvbih0LGUpe3JldHVybntvZmZzZXRYOnQub2Zmc2V0WCxvZmZzZXRZOnQub2Zmc2V0WSxpbWFnZTp0LmltYWdlLGhpdEltYWdlOmUuaW1hZ2V9fSxubC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSxpLHIsbixvKXtpZihlK3RoaXMuc3BhY2VfPnRoaXMubWF4U2l6ZV98fGkrdGhpcy5zcGFjZV8+dGhpcy5tYXhTaXplXylyZXR1cm4gbnVsbDt2YXIgcz10aGlzLmFkZF8oITEsdCxlLGkscixvKTtpZighcylyZXR1cm4gbnVsbDt2YXIgYT12b2lkIDAhPT1uP246SSxoPXRoaXMuYWRkXyghMCx0LGUsaSxhLG8pO3JldHVybiB0aGlzLm1lcmdlSW5mb3NfKHMsaCl9LG5sLnByb3RvdHlwZS5hZGRfPWZ1bmN0aW9uKHQsZSxpLHIsbixvKXt2YXIgcyxhLGgsbCx1PXQ/dGhpcy5oaXRBdGxhc2VzXzp0aGlzLmF0bGFzZXNfO2ZvcihoPTAsbD11Lmxlbmd0aDtoPGw7KytoKXtpZihhPShzPXVbaF0pLmFkZChlLGkscixuLG8pKXJldHVybiBhO2lmKCFhJiZoPT09bC0xKXt2YXIgcD12b2lkIDA7dD8ocD1NYXRoLm1pbigyKnRoaXMuY3VycmVudEhpdFNpemVfLHRoaXMubWF4U2l6ZV8pLHRoaXMuY3VycmVudEhpdFNpemVfPXApOihwPU1hdGgubWluKDIqdGhpcy5jdXJyZW50U2l6ZV8sdGhpcy5tYXhTaXplXyksdGhpcy5jdXJyZW50U2l6ZV89cCkscz1uZXcgcmwocCx0aGlzLnNwYWNlXyksdS5wdXNoKHMpLCsrbH19cmV0dXJuIG51bGx9O3ZhciBvbD1ubCxzbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMsZSxpKSx0aGlzLmltYWdlc189W10sdGhpcy50ZXh0dXJlc189W10sdGhpcy5tZWFzdXJlQ2FudmFzXz1KbigwLDApLmNhbnZhcyx0aGlzLnN0YXRlXz17c3Ryb2tlQ29sb3I6bnVsbCxsaW5lQ2FwOnZvaWQgMCxsaW5lRGFzaDpudWxsLGxpbmVEYXNoT2Zmc2V0OnZvaWQgMCxsaW5lSm9pbjp2b2lkIDAsbGluZVdpZHRoOjAsbWl0ZXJMaW1pdDp2b2lkIDAsZmlsbENvbG9yOm51bGwsZm9udDp2b2lkIDAsc2NhbGU6dm9pZCAwfSx0aGlzLnRleHRfPSIiLHRoaXMudGV4dEFsaWduXz12b2lkIDAsdGhpcy50ZXh0QmFzZWxpbmVfPXZvaWQgMCx0aGlzLm9mZnNldFhfPXZvaWQgMCx0aGlzLm9mZnNldFlfPXZvaWQgMCx0aGlzLmF0bGFzZXNfPXt9LHRoaXMuY3VyckF0bGFzXz12b2lkIDAsdGhpcy5zY2FsZT0xLHRoaXMub3BhY2l0eT0xfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5kcmF3VGV4dD1mdW5jdGlvbih0LGUpe2lmKHRoaXMudGV4dF8pe3ZhciBpPW51bGwscj0yLG49Mjtzd2l0Y2godC5nZXRUeXBlKCkpe2Nhc2UgTnQuUE9JTlQ6Y2FzZSBOdC5NVUxUSV9QT0lOVDpyPShpPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCkpLmxlbmd0aCxuPXQuZ2V0U3RyaWRlKCk7YnJlYWs7Y2FzZSBOdC5DSVJDTEU6aT10LmdldENlbnRlcigpO2JyZWFrO2Nhc2UgTnQuTElORV9TVFJJTkc6aT10LmdldEZsYXRNaWRwb2ludCgpO2JyZWFrO2Nhc2UgTnQuTVVMVElfTElORV9TVFJJTkc6cj0oaT10LmdldEZsYXRNaWRwb2ludHMoKSkubGVuZ3RoO2JyZWFrO2Nhc2UgTnQuUE9MWUdPTjppPXQuZ2V0RmxhdEludGVyaW9yUG9pbnQoKTticmVhaztjYXNlIE50Lk1VTFRJX1BPTFlHT046cj0oaT10LmdldEZsYXRJbnRlcmlvclBvaW50cygpKS5sZW5ndGh9dGhpcy5zdGFydEluZGljZXMucHVzaCh0aGlzLmluZGljZXMubGVuZ3RoKSx0aGlzLnN0YXJ0SW5kaWNlc0ZlYXR1cmUucHVzaChlKTt2YXIgcyxhLGgsbCx1LHAsYyxkLGY9dGhpcy5jdXJyQXRsYXNfLF89dGhpcy50ZXh0Xy5zcGxpdCgiXG4iKSxnPXRoaXMuZ2V0VGV4dFNpemVfKF8pLHk9TWF0aC5yb3VuZChnWzBdKnRoaXMudGV4dEFsaWduXy10aGlzLm9mZnNldFhfKSx2PU1hdGgucm91bmQoZ1sxXSp0aGlzLnRleHRCYXNlbGluZV8tdGhpcy5vZmZzZXRZXyksbT10aGlzLnN0YXRlXy5saW5lV2lkdGgvMip0aGlzLnN0YXRlXy5zY2FsZTtmb3Iocz0wLGE9Xy5sZW5ndGg7czxhOysrcylmb3IodT0wLHA9Zi5oZWlnaHQqcyxoPTAsbD0oYz1fW3NdLnNwbGl0KCIiKSkubGVuZ3RoO2g8bDsrK2gpe2lmKGQ9Zi5hdGxhcy5nZXRJbmZvKGNbaF0pKXt2YXIgeD1kLmltYWdlO2lmKHRoaXMuYW5jaG9yWD15LXUsdGhpcy5hbmNob3JZPXYtcCx0aGlzLm9yaWdpblg9MD09PWg/ZC5vZmZzZXRYLW06ZC5vZmZzZXRYLHRoaXMub3JpZ2luWT1kLm9mZnNldFksdGhpcy5oZWlnaHQ9Zi5oZWlnaHQsdGhpcy53aWR0aD0wPT09aHx8aD09PWMubGVuZ3RoLTE/Zi53aWR0aFtjW2hdXSttOmYud2lkdGhbY1toXV0sdGhpcy5pbWFnZUhlaWdodD14LmhlaWdodCx0aGlzLmltYWdlV2lkdGg9eC53aWR0aCwwPT09dGhpcy5pbWFnZXNfLmxlbmd0aCl0aGlzLmltYWdlc18ucHVzaCh4KTtlbHNlIG8odGhpcy5pbWFnZXNfW3RoaXMuaW1hZ2VzXy5sZW5ndGgtMV0pIT1vKHgpJiYodGhpcy5ncm91cEluZGljZXMucHVzaCh0aGlzLmluZGljZXMubGVuZ3RoKSx0aGlzLmltYWdlc18ucHVzaCh4KSk7dGhpcy5kcmF3VGV4dF8oaSwwLHIsbil9dSs9dGhpcy53aWR0aH19fSxlLnByb3RvdHlwZS5nZXRUZXh0U2l6ZV89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPXRoaXMuY3VyckF0bGFzXyxyPXQubGVuZ3RoKmkuaGVpZ2h0O3JldHVyblt0Lm1hcChmdW5jdGlvbih0KXtmb3IodmFyIHI9MCxuPTAsbz10Lmxlbmd0aDtuPG87KytuKXt2YXIgcz10W25dO2kud2lkdGhbc118fGUuYWRkQ2hhclRvQXRsYXNfKHMpLHIrPWkud2lkdGhbc10/aS53aWR0aFtzXTowfXJldHVybiByfSkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsZSl9KSxyXX0sZS5wcm90b3R5cGUuZHJhd1RleHRfPWZ1bmN0aW9uKHQsZSxpLHIpe2Zvcih2YXIgbj1lLG89aTtuPG87bis9cil0aGlzLmRyYXdDb29yZGluYXRlcyh0LGUsaSxyKX0sZS5wcm90b3R5cGUuYWRkQ2hhclRvQXRsYXNfPWZ1bmN0aW9uKHQpe2lmKDE9PT10Lmxlbmd0aCl7dmFyIGU9dGhpcy5jdXJyQXRsYXNfLGk9dGhpcy5zdGF0ZV8scj10aGlzLm1lYXN1cmVDYW52YXNfLmdldENvbnRleHQoIjJkIik7ci5mb250PWkuZm9udDt2YXIgbj1NYXRoLmNlaWwoci5tZWFzdXJlVGV4dCh0KS53aWR0aCppLnNjYWxlKTtlLmF0bGFzLmFkZCh0LG4sZS5oZWlnaHQsZnVuY3Rpb24oZSxyLG4pe2UuZm9udD1pLmZvbnQsZS5maWxsU3R5bGU9aS5maWxsQ29sb3IsZS5zdHJva2VTdHlsZT1pLnN0cm9rZUNvbG9yLGUubGluZVdpZHRoPWkubGluZVdpZHRoLGUubGluZUNhcD1pLmxpbmVDYXAsZS5saW5lSm9pbj1pLmxpbmVKb2luLGUubWl0ZXJMaW1pdD1pLm1pdGVyTGltaXQsZS50ZXh0QWxpZ249ImxlZnQiLGUudGV4dEJhc2VsaW5lPSJ0b3AiLGtpJiZpLmxpbmVEYXNoJiYoZS5zZXRMaW5lRGFzaChpLmxpbmVEYXNoKSxlLmxpbmVEYXNoT2Zmc2V0PWkubGluZURhc2hPZmZzZXQpLDEhPT1pLnNjYWxlJiZlLnNldFRyYW5zZm9ybShpLnNjYWxlLDAsMCxpLnNjYWxlLDAsMCksaS5zdHJva2VDb2xvciYmZS5zdHJva2VUZXh0KHQscixuKSxpLmZpbGxDb2xvciYmZS5maWxsVGV4dCh0LHIsbil9KSYmKGUud2lkdGhbdF09bil9fSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7dmFyIGk9ZS5nZXRHTCgpO3RoaXMuZ3JvdXBJbmRpY2VzLnB1c2godGhpcy5pbmRpY2VzLmxlbmd0aCksdGhpcy5oaXREZXRlY3Rpb25Hcm91cEluZGljZXM9dGhpcy5ncm91cEluZGljZXMsdGhpcy52ZXJ0aWNlc0J1ZmZlcj1uZXcgVGgodGhpcy52ZXJ0aWNlcyksdGhpcy5pbmRpY2VzQnVmZmVyPW5ldyBUaCh0aGlzLmluZGljZXMpO3RoaXMuY3JlYXRlVGV4dHVyZXModGhpcy50ZXh0dXJlc18sdGhpcy5pbWFnZXNfLHt9LGkpLHRoaXMuc3RhdGVfPXtzdHJva2VDb2xvcjpudWxsLGxpbmVDYXA6dm9pZCAwLGxpbmVEYXNoOm51bGwsbGluZURhc2hPZmZzZXQ6dm9pZCAwLGxpbmVKb2luOnZvaWQgMCxsaW5lV2lkdGg6MCxtaXRlckxpbWl0OnZvaWQgMCxmaWxsQ29sb3I6bnVsbCxmb250OnZvaWQgMCxzY2FsZTp2b2lkIDB9LHRoaXMudGV4dF89IiIsdGhpcy50ZXh0QWxpZ25fPXZvaWQgMCx0aGlzLnRleHRCYXNlbGluZV89dm9pZCAwLHRoaXMub2Zmc2V0WF89dm9pZCAwLHRoaXMub2Zmc2V0WV89dm9pZCAwLHRoaXMuaW1hZ2VzXz1udWxsLHRoaXMuYXRsYXNlc189e30sdGhpcy5jdXJyQXRsYXNfPXZvaWQgMCx0LnByb3RvdHlwZS5maW5pc2guY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5zZXRUZXh0U3R5bGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zdGF0ZV8saT10LmdldEZpbGwoKSxyPXQuZ2V0U3Ryb2tlKCk7aWYodCYmdC5nZXRUZXh0KCkmJihpfHxyKSl7aWYoaSl7dmFyIG49aS5nZXRDb2xvcigpO2UuZmlsbENvbG9yPVlzKG58fGdoKX1lbHNlIGUuZmlsbENvbG9yPW51bGw7aWYocil7dmFyIG89ci5nZXRDb2xvcigpO2Uuc3Ryb2tlQ29sb3I9WXMob3x8dmgpLGUubGluZVdpZHRoPXIuZ2V0V2lkdGgoKXx8MSxlLmxpbmVDYXA9ci5nZXRMaW5lQ2FwKCl8fCJyb3VuZCIsZS5saW5lRGFzaE9mZnNldD1yLmdldExpbmVEYXNoT2Zmc2V0KCl8fDAsZS5saW5lSm9pbj1yLmdldExpbmVKb2luKCl8fCJyb3VuZCIsZS5taXRlckxpbWl0PXIuZ2V0TWl0ZXJMaW1pdCgpfHwxMDt2YXIgcz1yLmdldExpbmVEYXNoKCk7ZS5saW5lRGFzaD1zP3Muc2xpY2UoKTp5aH1lbHNlIGUuc3Ryb2tlQ29sb3I9bnVsbCxlLmxpbmVXaWR0aD0wO2UuZm9udD10LmdldEZvbnQoKXx8IjEwcHggc2Fucy1zZXJpZiIsZS5zY2FsZT10LmdldFNjYWxlKCl8fDEsdGhpcy50ZXh0Xz10LmdldFRleHQoKTt2YXIgYT1TYVt0LmdldFRleHRBbGlnbigpXSxoPVNhW3QuZ2V0VGV4dEJhc2VsaW5lKCldO3RoaXMudGV4dEFsaWduXz12b2lkIDA9PT1hPy41OmEsdGhpcy50ZXh0QmFzZWxpbmVfPXZvaWQgMD09PWg/LjU6aCx0aGlzLm9mZnNldFhfPXQuZ2V0T2Zmc2V0WCgpfHwwLHRoaXMub2Zmc2V0WV89dC5nZXRPZmZzZXRZKCl8fDAsdGhpcy5yb3RhdGVXaXRoVmlldz0hIXQuZ2V0Um90YXRlV2l0aFZpZXcoKSx0aGlzLnJvdGF0aW9uPXQuZ2V0Um90YXRpb24oKXx8MCx0aGlzLmN1cnJBdGxhc189dGhpcy5nZXRBdGxhc18oZSl9ZWxzZSB0aGlzLnRleHRfPSIifSxlLnByb3RvdHlwZS5nZXRBdGxhc189ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciBpIGluIHQpKHRbaV18fDA9PT10W2ldKSYmKEFycmF5LmlzQXJyYXkodFtpXSk/ZT1lLmNvbmNhdCh0W2ldKTplLnB1c2godFtpXSkpO3ZhciByPXRoaXMuY2FsY3VsYXRlSGFzaF8oZSk7aWYoIXRoaXMuYXRsYXNlc19bcl0pe3ZhciBuPXRoaXMubWVhc3VyZUNhbnZhc18uZ2V0Q29udGV4dCgiMmQiKTtuLmZvbnQ9dC5mb250O3ZhciBvPU1hdGguY2VpbCgoMS41Km4ubWVhc3VyZVRleHQoIk0iKS53aWR0aCt0LmxpbmVXaWR0aC8yKSp0LnNjYWxlKTt0aGlzLmF0bGFzZXNfW3JdPXthdGxhczpuZXcgb2woe3NwYWNlOnQubGluZVdpZHRoKzF9KSx3aWR0aDp7fSxoZWlnaHQ6b319cmV0dXJuIHRoaXMuYXRsYXNlc19bcl19LGUucHJvdG90eXBlLmNhbGN1bGF0ZUhhc2hfPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0iIixpPTAscj10Lmxlbmd0aDtpPHI7KytpKWUrPXRbaV07cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldFRleHR1cmVzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRleHR1cmVzX30sZS5wcm90b3R5cGUuZ2V0SGl0RGV0ZWN0aW9uVGV4dHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0dXJlc199LGV9KEZoKSxhbD1bMSwxXSxobD17Q2lyY2xlOkNoLEltYWdlOkFoLExpbmVTdHJpbmc6S2gsUG9seWdvbjplbCxUZXh0OnNsfSxsbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXt0LmNhbGwodGhpcyksdGhpcy5tYXhFeHRlbnRfPWksdGhpcy50b2xlcmFuY2VfPWUsdGhpcy5yZW5kZXJCdWZmZXJfPXIsdGhpcy5yZXBsYXlzQnlaSW5kZXhfPXt9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5hZGREZWNsdXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldERlbGV0ZVJlc291cmNlc0Z1bmN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlLGk9W107Zm9yKGUgaW4gdGhpcy5yZXBsYXlzQnlaSW5kZXhfKXt2YXIgcj10aGlzLnJlcGxheXNCeVpJbmRleF9bZV07Zm9yKHZhciBuIGluIHIpaS5wdXNoKHJbbl0uZ2V0RGVsZXRlUmVzb3VyY2VzRnVuY3Rpb24odCkpfXJldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgdCxlPWFyZ3VtZW50cyxyPWkubGVuZ3RoLG49MDtuPHI7bisrKXQ9aVtuXS5hcHBseSh0aGlzLGUpO3JldHVybiB0fX0sZS5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlIGluIHRoaXMucmVwbGF5c0J5WkluZGV4Xyl7dmFyIGk9dGhpcy5yZXBsYXlzQnlaSW5kZXhfW2VdO2Zvcih2YXIgciBpbiBpKWlbcl0uZmluaXNoKHQpfX0sZS5wcm90b3R5cGUuZ2V0UmVwbGF5PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dm9pZCAwIT09dD90LnRvU3RyaW5nKCk6IjAiLHI9dGhpcy5yZXBsYXlzQnlaSW5kZXhfW2ldO3ZvaWQgMD09PXImJihyPXt9LHRoaXMucmVwbGF5c0J5WkluZGV4X1tpXT1yKTt2YXIgbj1yW2VdO3ZvaWQgMD09PW4mJihuPW5ldygwLGhsW2VdKSh0aGlzLnRvbGVyYW5jZV8sdGhpcy5tYXhFeHRlbnRfKSxyW2VdPW4pO3JldHVybiBufSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIGQodGhpcy5yZXBsYXlzQnlaSW5kZXhfKX0sZS5wcm90b3R5cGUucmVwbGF5PWZ1bmN0aW9uKHQsZSxpLHIsbixvLHMsYSl7dmFyIGgsbCx1LHAsYyxkLGY9T2JqZWN0LmtleXModGhpcy5yZXBsYXlzQnlaSW5kZXhfKS5tYXAoTnVtYmVyKTtmb3IoZi5zb3J0KFYpLGg9MCxsPWYubGVuZ3RoO2g8bDsrK2gpZm9yKGM9dGhpcy5yZXBsYXlzQnlaSW5kZXhfW2ZbaF0udG9TdHJpbmcoKV0sdT0wLHA9RWEubGVuZ3RoO3U8cDsrK3UpZD1jW0VhW3VdXSx2b2lkIDAhPT1kJiZkLnJlcGxheSh0LGUsaSxyLG4sbyxzLGEsdm9pZCAwLCExKX0sZS5wcm90b3R5cGUucmVwbGF5SGl0RGV0ZWN0aW9uXz1mdW5jdGlvbih0LGUsaSxyLG4sbyxzLGEsaCxsLHUpe3ZhciBwLGMsZCxmLF8sZyx5PU9iamVjdC5rZXlzKHRoaXMucmVwbGF5c0J5WkluZGV4XykubWFwKE51bWJlcik7Zm9yKHkuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBlLXR9KSxwPTAsYz15Lmxlbmd0aDtwPGM7KytwKWZvcihmPXRoaXMucmVwbGF5c0J5WkluZGV4X1t5W3BdLnRvU3RyaW5nKCldLGQ9RWEubGVuZ3RoLTE7ZD49MDstLWQpaWYodm9pZCAwIT09KF89ZltFYVtkXV0pJiYoZz1fLnJlcGxheSh0LGUsaSxyLG4sbyxzLGEsaCxsLHUpKSlyZXR1cm4gZ30sZS5wcm90b3R5cGUuZm9yRWFjaEZlYXR1cmVBdENvb3JkaW5hdGU9ZnVuY3Rpb24odCxlLGkscixuLG8scyxhLGgsbCl7dmFyIHUscD1lLmdldEdMKCk7cmV0dXJuIHAuYmluZEZyYW1lYnVmZmVyKHAuRlJBTUVCVUZGRVIsZS5nZXRIaXREZXRlY3Rpb25GcmFtZWJ1ZmZlcigpKSx2b2lkIDAhPT10aGlzLnJlbmRlckJ1ZmZlcl8mJih1PWV0KHB0KHQpLHIqdGhpcy5yZW5kZXJCdWZmZXJfKSksdGhpcy5yZXBsYXlIaXREZXRlY3Rpb25fKGUsdCxyLG4sYWwscyxhLGgsZnVuY3Rpb24odCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkoNCk7aWYocC5yZWFkUGl4ZWxzKDAsMCwxLDEscC5SR0JBLHAuVU5TSUdORURfQllURSxlKSxlWzNdPjApe3ZhciBpPWwodCk7aWYoaSlyZXR1cm4gaX19LCEwLHUpfSxlLnByb3RvdHlwZS5oYXNGZWF0dXJlQXRDb29yZGluYXRlPWZ1bmN0aW9uKHQsZSxpLHIsbixvLHMsYSxoKXt2YXIgbD1lLmdldEdMKCk7cmV0dXJuIGwuYmluZEZyYW1lYnVmZmVyKGwuRlJBTUVCVUZGRVIsZS5nZXRIaXREZXRlY3Rpb25GcmFtZWJ1ZmZlcigpKSx2b2lkIDAhPT10aGlzLnJlcGxheUhpdERldGVjdGlvbl8oZSx0LHIsbixhbCxzLGEsaCxmdW5jdGlvbih0KXt2YXIgZT1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gbC5yZWFkUGl4ZWxzKDAsMCwxLDEsbC5SR0JBLGwuVU5TSUdORURfQllURSxlKSxlWzNdPjB9LCExKX0sZX0oY2EpLHVsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIsbixvLHMsYSl7dC5jYWxsKHRoaXMpLHRoaXMuY29udGV4dF89ZSx0aGlzLmNlbnRlcl89aSx0aGlzLmV4dGVudF89cyx0aGlzLnBpeGVsUmF0aW9fPWEsdGhpcy5zaXplXz1vLHRoaXMucm90YXRpb25fPW4sdGhpcy5yZXNvbHV0aW9uXz1yLHRoaXMuaW1hZ2VTdHlsZV89bnVsbCx0aGlzLmZpbGxTdHlsZV89bnVsbCx0aGlzLnN0cm9rZVN0eWxlXz1udWxsLHRoaXMudGV4dFN0eWxlXz1udWxsfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5kcmF3VGV4dF89ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmNvbnRleHRfLHI9dC5nZXRSZXBsYXkoMCxkYS5URVhUKTtyLnNldFRleHRTdHlsZSh0aGlzLnRleHRTdHlsZV8pLHIuZHJhd1RleHQoZSxudWxsKSxyLmZpbmlzaChpKTtyLnJlcGxheSh0aGlzLmNvbnRleHRfLHRoaXMuY2VudGVyXyx0aGlzLnJlc29sdXRpb25fLHRoaXMucm90YXRpb25fLHRoaXMuc2l6ZV8sdGhpcy5waXhlbFJhdGlvXywxLHt9LHZvaWQgMCwhMSksci5nZXREZWxldGVSZXNvdXJjZXNGdW5jdGlvbihpKSgpfSxlLnByb3RvdHlwZS5zZXRTdHlsZT1mdW5jdGlvbih0KXt0aGlzLnNldEZpbGxTdHJva2VTdHlsZSh0LmdldEZpbGwoKSx0LmdldFN0cm9rZSgpKSx0aGlzLnNldEltYWdlU3R5bGUodC5nZXRJbWFnZSgpKSx0aGlzLnNldFRleHRTdHlsZSh0LmdldFRleHQoKSl9LGUucHJvdG90eXBlLmRyYXdHZW9tZXRyeT1mdW5jdGlvbih0KXtzd2l0Y2godC5nZXRUeXBlKCkpe2Nhc2UgTnQuUE9JTlQ6dGhpcy5kcmF3UG9pbnQodCxudWxsKTticmVhaztjYXNlIE50LkxJTkVfU1RSSU5HOnRoaXMuZHJhd0xpbmVTdHJpbmcodCxudWxsKTticmVhaztjYXNlIE50LlBPTFlHT046dGhpcy5kcmF3UG9seWdvbih0LG51bGwpO2JyZWFrO2Nhc2UgTnQuTVVMVElfUE9JTlQ6dGhpcy5kcmF3TXVsdGlQb2ludCh0LG51bGwpO2JyZWFrO2Nhc2UgTnQuTVVMVElfTElORV9TVFJJTkc6dGhpcy5kcmF3TXVsdGlMaW5lU3RyaW5nKHQsbnVsbCk7YnJlYWs7Y2FzZSBOdC5NVUxUSV9QT0xZR09OOnRoaXMuZHJhd011bHRpUG9seWdvbih0LG51bGwpO2JyZWFrO2Nhc2UgTnQuR0VPTUVUUllfQ09MTEVDVElPTjp0aGlzLmRyYXdHZW9tZXRyeUNvbGxlY3Rpb24odCxudWxsKTticmVhaztjYXNlIE50LkNJUkNMRTp0aGlzLmRyYXdDaXJjbGUodCxudWxsKX19LGUucHJvdG90eXBlLmRyYXdGZWF0dXJlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5nZXRHZW9tZXRyeUZ1bmN0aW9uKCkodCk7aSYmUHQodGhpcy5leHRlbnRfLGkuZ2V0RXh0ZW50KCkpJiYodGhpcy5zZXRTdHlsZShlKSx0aGlzLmRyYXdHZW9tZXRyeShpKSl9LGUucHJvdG90eXBlLmRyYXdHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCxlKXt2YXIgaSxyLG49dC5nZXRHZW9tZXRyaWVzQXJyYXkoKTtmb3IoaT0wLHI9bi5sZW5ndGg7aTxyOysraSl0aGlzLmRyYXdHZW9tZXRyeShuW2ldKX0sZS5wcm90b3R5cGUuZHJhd1BvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5jb250ZXh0XyxyPW5ldyBsbCgxLHRoaXMuZXh0ZW50Xyksbj1yLmdldFJlcGxheSgwLGRhLklNQUdFKTtuLnNldEltYWdlU3R5bGUodGhpcy5pbWFnZVN0eWxlXyksbi5kcmF3UG9pbnQodCxlKSxuLmZpbmlzaChpKTtuLnJlcGxheSh0aGlzLmNvbnRleHRfLHRoaXMuY2VudGVyXyx0aGlzLnJlc29sdXRpb25fLHRoaXMucm90YXRpb25fLHRoaXMuc2l6ZV8sdGhpcy5waXhlbFJhdGlvXywxLHt9LHZvaWQgMCwhMSksbi5nZXREZWxldGVSZXNvdXJjZXNGdW5jdGlvbihpKSgpLHRoaXMudGV4dFN0eWxlXyYmdGhpcy5kcmF3VGV4dF8ocix0KX0sZS5wcm90b3R5cGUuZHJhd011bHRpUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmNvbnRleHRfLHI9bmV3IGxsKDEsdGhpcy5leHRlbnRfKSxuPXIuZ2V0UmVwbGF5KDAsZGEuSU1BR0UpO24uc2V0SW1hZ2VTdHlsZSh0aGlzLmltYWdlU3R5bGVfKSxuLmRyYXdNdWx0aVBvaW50KHQsZSksbi5maW5pc2goaSk7bi5yZXBsYXkodGhpcy5jb250ZXh0Xyx0aGlzLmNlbnRlcl8sdGhpcy5yZXNvbHV0aW9uXyx0aGlzLnJvdGF0aW9uXyx0aGlzLnNpemVfLHRoaXMucGl4ZWxSYXRpb18sMSx7fSx2b2lkIDAsITEpLG4uZ2V0RGVsZXRlUmVzb3VyY2VzRnVuY3Rpb24oaSkoKSx0aGlzLnRleHRTdHlsZV8mJnRoaXMuZHJhd1RleHRfKHIsdCl9LGUucHJvdG90eXBlLmRyYXdMaW5lU3RyaW5nPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5jb250ZXh0XyxyPW5ldyBsbCgxLHRoaXMuZXh0ZW50Xyksbj1yLmdldFJlcGxheSgwLGRhLkxJTkVfU1RSSU5HKTtuLnNldEZpbGxTdHJva2VTdHlsZShudWxsLHRoaXMuc3Ryb2tlU3R5bGVfKSxuLmRyYXdMaW5lU3RyaW5nKHQsZSksbi5maW5pc2goaSk7bi5yZXBsYXkodGhpcy5jb250ZXh0Xyx0aGlzLmNlbnRlcl8sdGhpcy5yZXNvbHV0aW9uXyx0aGlzLnJvdGF0aW9uXyx0aGlzLnNpemVfLHRoaXMucGl4ZWxSYXRpb18sMSx7fSx2b2lkIDAsITEpLG4uZ2V0RGVsZXRlUmVzb3VyY2VzRnVuY3Rpb24oaSkoKSx0aGlzLnRleHRTdHlsZV8mJnRoaXMuZHJhd1RleHRfKHIsdCl9LGUucHJvdG90eXBlLmRyYXdNdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmNvbnRleHRfLHI9bmV3IGxsKDEsdGhpcy5leHRlbnRfKSxuPXIuZ2V0UmVwbGF5KDAsZGEuTElORV9TVFJJTkcpO24uc2V0RmlsbFN0cm9rZVN0eWxlKG51bGwsdGhpcy5zdHJva2VTdHlsZV8pLG4uZHJhd011bHRpTGluZVN0cmluZyh0LGUpLG4uZmluaXNoKGkpO24ucmVwbGF5KHRoaXMuY29udGV4dF8sdGhpcy5jZW50ZXJfLHRoaXMucmVzb2x1dGlvbl8sdGhpcy5yb3RhdGlvbl8sdGhpcy5zaXplXyx0aGlzLnBpeGVsUmF0aW9fLDEse30sdm9pZCAwLCExKSxuLmdldERlbGV0ZVJlc291cmNlc0Z1bmN0aW9uKGkpKCksdGhpcy50ZXh0U3R5bGVfJiZ0aGlzLmRyYXdUZXh0XyhyLHQpfSxlLnByb3RvdHlwZS5kcmF3UG9seWdvbj1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuY29udGV4dF8scj1uZXcgbGwoMSx0aGlzLmV4dGVudF8pLG49ci5nZXRSZXBsYXkoMCxkYS5QT0xZR09OKTtuLnNldEZpbGxTdHJva2VTdHlsZSh0aGlzLmZpbGxTdHlsZV8sdGhpcy5zdHJva2VTdHlsZV8pLG4uZHJhd1BvbHlnb24odCxlKSxuLmZpbmlzaChpKTtuLnJlcGxheSh0aGlzLmNvbnRleHRfLHRoaXMuY2VudGVyXyx0aGlzLnJlc29sdXRpb25fLHRoaXMucm90YXRpb25fLHRoaXMuc2l6ZV8sdGhpcy5waXhlbFJhdGlvXywxLHt9LHZvaWQgMCwhMSksbi5nZXREZWxldGVSZXNvdXJjZXNGdW5jdGlvbihpKSgpLHRoaXMudGV4dFN0eWxlXyYmdGhpcy5kcmF3VGV4dF8ocix0KX0sZS5wcm90b3R5cGUuZHJhd011bHRpUG9seWdvbj1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuY29udGV4dF8scj1uZXcgbGwoMSx0aGlzLmV4dGVudF8pLG49ci5nZXRSZXBsYXkoMCxkYS5QT0xZR09OKTtuLnNldEZpbGxTdHJva2VTdHlsZSh0aGlzLmZpbGxTdHlsZV8sdGhpcy5zdHJva2VTdHlsZV8pLG4uZHJhd011bHRpUG9seWdvbih0LGUpLG4uZmluaXNoKGkpO24ucmVwbGF5KHRoaXMuY29udGV4dF8sdGhpcy5jZW50ZXJfLHRoaXMucmVzb2x1dGlvbl8sdGhpcy5yb3RhdGlvbl8sdGhpcy5zaXplXyx0aGlzLnBpeGVsUmF0aW9fLDEse30sdm9pZCAwLCExKSxuLmdldERlbGV0ZVJlc291cmNlc0Z1bmN0aW9uKGkpKCksdGhpcy50ZXh0U3R5bGVfJiZ0aGlzLmRyYXdUZXh0XyhyLHQpfSxlLnByb3RvdHlwZS5kcmF3Q2lyY2xlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5jb250ZXh0XyxyPW5ldyBsbCgxLHRoaXMuZXh0ZW50Xyksbj1yLmdldFJlcGxheSgwLGRhLkNJUkNMRSk7bi5zZXRGaWxsU3Ryb2tlU3R5bGUodGhpcy5maWxsU3R5bGVfLHRoaXMuc3Ryb2tlU3R5bGVfKSxuLmRyYXdDaXJjbGUodCxlKSxuLmZpbmlzaChpKTtuLnJlcGxheSh0aGlzLmNvbnRleHRfLHRoaXMuY2VudGVyXyx0aGlzLnJlc29sdXRpb25fLHRoaXMucm90YXRpb25fLHRoaXMuc2l6ZV8sdGhpcy5waXhlbFJhdGlvXywxLHt9LHZvaWQgMCwhMSksbi5nZXREZWxldGVSZXNvdXJjZXNGdW5jdGlvbihpKSgpLHRoaXMudGV4dFN0eWxlXyYmdGhpcy5kcmF3VGV4dF8ocix0KX0sZS5wcm90b3R5cGUuc2V0SW1hZ2VTdHlsZT1mdW5jdGlvbih0KXt0aGlzLmltYWdlU3R5bGVfPXR9LGUucHJvdG90eXBlLnNldEZpbGxTdHJva2VTdHlsZT1mdW5jdGlvbih0LGUpe3RoaXMuZmlsbFN0eWxlXz10LHRoaXMuc3Ryb2tlU3R5bGVfPWV9LGUucHJvdG90eXBlLnNldFRleHRTdHlsZT1mdW5jdGlvbih0KXt0aGlzLnRleHRTdHlsZV89dH0sZX0oVnMpLHBsPW5ldyBsaCgicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG52YXJ5aW5nIHZlYzIgdl90ZXhDb29yZDtcblxuXG51bmlmb3JtIGZsb2F0IHVfb3BhY2l0eTtcbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcblxudm9pZCBtYWluKHZvaWQpIHtcbiAgdmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCh1X3RleHR1cmUsIHZfdGV4Q29vcmQpO1xuICBnbF9GcmFnQ29sb3IucmdiID0gdGV4Q29sb3IucmdiO1xuICBnbF9GcmFnQ29sb3IuYSA9IHRleENvbG9yLmEgKiB1X29wYWNpdHk7XG59XG4iKSxjbD1uZXcgdWgoInZhcnlpbmcgdmVjMiB2X3RleENvb3JkO1xuXG5cbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjMiBhX3RleENvb3JkO1xuXG51bmlmb3JtIG1hdDQgdV90ZXhDb29yZE1hdHJpeDtcbnVuaWZvcm0gbWF0NCB1X3Byb2plY3Rpb25NYXRyaXg7XG5cbnZvaWQgbWFpbih2b2lkKSB7XG4gIGdsX1Bvc2l0aW9uID0gdV9wcm9qZWN0aW9uTWF0cml4ICogdmVjNChhX3Bvc2l0aW9uLCAwLiwgMS4pO1xuICB2X3RleENvb3JkID0gKHVfdGV4Q29vcmRNYXRyaXggKiB2ZWM0KGFfdGV4Q29vcmQsIDAuLCAxLikpLnN0O1xufVxuXG5cbiIpLGRsPWZ1bmN0aW9uKHQsZSl7dGhpcy51X3RleENvb3JkTWF0cml4PXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsInVfdGV4Q29vcmRNYXRyaXgiKSx0aGlzLnVfcHJvamVjdGlvbk1hdHJpeD10LmdldFVuaWZvcm1Mb2NhdGlvbihlLCJ1X3Byb2plY3Rpb25NYXRyaXgiKSx0aGlzLnVfb3BhY2l0eT10LmdldFVuaWZvcm1Mb2NhdGlvbihlLCJ1X29wYWNpdHkiKSx0aGlzLnVfdGV4dHVyZT10LmdldFVuaWZvcm1Mb2NhdGlvbihlLCJ1X3RleHR1cmUiKSx0aGlzLmFfcG9zaXRpb249dC5nZXRBdHRyaWJMb2NhdGlvbihlLCJhX3Bvc2l0aW9uIiksdGhpcy5hX3RleENvb3JkPXQuZ2V0QXR0cmliTG9jYXRpb24oZSwiYV90ZXhDb29yZCIpfSxmbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMsaSksdGhpcy5tYXBSZW5kZXJlcj1lLHRoaXMuYXJyYXlCdWZmZXJfPW5ldyBUaChbLTEsLTEsMCwwLDEsLTEsMSwwLC0xLDEsMCwxLDEsMSwxLDFdKSx0aGlzLnRleHR1cmU9bnVsbCx0aGlzLmZyYW1lYnVmZmVyPW51bGwsdGhpcy5mcmFtZWJ1ZmZlckRpbWVuc2lvbj12b2lkIDAsdGhpcy50ZXhDb29yZE1hdHJpeD1bMSwwLDAsMSwwLDBdLHRoaXMucHJvamVjdGlvbk1hdHJpeD1bMSwwLDAsMSwwLDBdLHRoaXMudG1wTWF0NF89WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLHRoaXMuZGVmYXVsdExvY2F0aW9uc189bnVsbH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuYmluZEZyYW1lYnVmZmVyPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5tYXBSZW5kZXJlci5nZXRHTCgpO2lmKHZvaWQgMD09PXRoaXMuZnJhbWVidWZmZXJEaW1lbnNpb258fHRoaXMuZnJhbWVidWZmZXJEaW1lbnNpb24hPWUpe3ZhciByPWZ1bmN0aW9uKHQsZSxpKXt0LmlzQ29udGV4dExvc3QoKXx8KHQuZGVsZXRlRnJhbWVidWZmZXIoZSksdC5kZWxldGVUZXh0dXJlKGkpKX0uYmluZChudWxsLGksdGhpcy5mcmFtZWJ1ZmZlcix0aGlzLnRleHR1cmUpO3QucG9zdFJlbmRlckZ1bmN0aW9ucy5wdXNoKHIpO3ZhciBuPVBoKGksZSxlKSxvPWkuY3JlYXRlRnJhbWVidWZmZXIoKTtpLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxvKSxpLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDY0LGVoLG4sMCksdGhpcy50ZXh0dXJlPW4sdGhpcy5mcmFtZWJ1ZmZlcj1vLHRoaXMuZnJhbWVidWZmZXJEaW1lbnNpb249ZX1lbHNlIGkuYmluZEZyYW1lYnVmZmVyKDM2MTYwLHRoaXMuZnJhbWVidWZmZXIpfSxlLnByb3RvdHlwZS5jb21wb3NlRnJhbWU9ZnVuY3Rpb24odCxlLGkpe3RoaXMuZGlzcGF0Y2hDb21wb3NlRXZlbnRfKHVyLlBSRUNPTVBPU0UsaSx0KSxpLmJpbmRCdWZmZXIoMzQ5NjIsdGhpcy5hcnJheUJ1ZmZlcl8pO3ZhciByLG49aS5nZXRHTCgpLG89aS5nZXRQcm9ncmFtKHBsLGNsKTt0aGlzLmRlZmF1bHRMb2NhdGlvbnNfP3I9dGhpcy5kZWZhdWx0TG9jYXRpb25zXzoocj1uZXcgZGwobixvKSx0aGlzLmRlZmF1bHRMb2NhdGlvbnNfPXIpLGkudXNlUHJvZ3JhbShvKSYmKG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoci5hX3Bvc2l0aW9uKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoci5hX3Bvc2l0aW9uLDIsNTEyNiwhMSwxNiwwKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHIuYV90ZXhDb29yZCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKHIuYV90ZXhDb29yZCwyLDUxMjYsITEsMTYsOCksbi51bmlmb3JtMWkoci51X3RleHR1cmUsMCkpLG4udW5pZm9ybU1hdHJpeDRmdihyLnVfdGV4Q29vcmRNYXRyaXgsITEsZmgodGhpcy50bXBNYXQ0Xyx0aGlzLmdldFRleENvb3JkTWF0cml4KCkpKSxuLnVuaWZvcm1NYXRyaXg0ZnYoci51X3Byb2plY3Rpb25NYXRyaXgsITEsZmgodGhpcy50bXBNYXQ0Xyx0aGlzLmdldFByb2plY3Rpb25NYXRyaXgoKSkpLG4udW5pZm9ybTFmKHIudV9vcGFjaXR5LGUub3BhY2l0eSksbi5iaW5kVGV4dHVyZShlaCx0aGlzLmdldFRleHR1cmUoKSksbi5kcmF3QXJyYXlzKDUsMCw0KSx0aGlzLmRpc3BhdGNoQ29tcG9zZUV2ZW50Xyh1ci5QT1NUQ09NUE9TRSxpLHQpfSxlLnByb3RvdHlwZS5kaXNwYXRjaENvbXBvc2VFdmVudF89ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMuZ2V0TGF5ZXIoKTtpZihyLmhhc0xpc3RlbmVyKHQpKXt2YXIgbj1pLnZpZXdTdGF0ZSxvPW4ucmVzb2x1dGlvbixzPWkucGl4ZWxSYXRpbyxhPWkuZXh0ZW50LGg9bi5jZW50ZXIsbD1uLnJvdGF0aW9uLHU9aS5zaXplLHA9bmV3IHVsKGUsaCxvLGwsdSxhLHMpLGM9bmV3IENzKHQscCxpLG51bGwsZSk7ci5kaXNwYXRjaEV2ZW50KGMpfX0sZS5wcm90b3R5cGUuZ2V0VGV4Q29vcmRNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXhDb29yZE1hdHJpeH0sZS5wcm90b3R5cGUuZ2V0VGV4dHVyZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHR1cmV9LGUucHJvdG90eXBlLmdldFByb2plY3Rpb25NYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uTWF0cml4fSxlLnByb3RvdHlwZS5oYW5kbGVXZWJHTENvbnRleHRMb3N0PWZ1bmN0aW9uKCl7dGhpcy50ZXh0dXJlPW51bGwsdGhpcy5mcmFtZWJ1ZmZlcj1udWxsLHRoaXMuZnJhbWVidWZmZXJEaW1lbnNpb249dm9pZCAwfSxlLnByb3RvdHlwZS5wcmVwYXJlRnJhbWU9ZnVuY3Rpb24odCxlLGkpe3JldHVybiByKCl9LGUucHJvdG90eXBlLmZvckVhY2hMYXllckF0UGl4ZWw9ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIHIoKX0sZX0oJHMpLF9sPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcyxlLGkpLHRoaXMuaW1hZ2VfPW51bGwsdGhpcy5oaXRDYW52YXNDb250ZXh0Xz1udWxsLHRoaXMuaGl0VHJhbnNmb3JtYXRpb25NYXRyaXhfPW51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNyZWF0ZVRleHR1cmVfPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0SW1hZ2UoKTtyZXR1cm4gYmgodGhpcy5tYXBSZW5kZXJlci5nZXRHTCgpLGUsMzMwNzEsMzMwNzEpfSxlLnByb3RvdHlwZS5wcmVwYXJlRnJhbWU9ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMubWFwUmVuZGVyZXIuZ2V0R0woKSxuPXQucGl4ZWxSYXRpbyxvPXQudmlld1N0YXRlLHM9by5jZW50ZXIsYT1vLnJlc29sdXRpb24saD1vLnJvdGF0aW9uLGw9dGhpcy5pbWFnZV8sdT10aGlzLnRleHR1cmUscD10aGlzLmdldExheWVyKCkuZ2V0U291cmNlKCksYz10LnZpZXdIaW50cyxkPXQuZXh0ZW50O2lmKHZvaWQgMCE9PWUuZXh0ZW50JiYoZD13dChkLGUuZXh0ZW50KSksIWNba25dJiYhY1tqbl0mJiFidChkKSl7dmFyIGY9by5wcm9qZWN0aW9uLF89cC5nZXRJbWFnZShkLGEsbixmKTtpZihfKWlmKHRoaXMubG9hZEltYWdlKF8pJiYobD1fLHU9dGhpcy5jcmVhdGVUZXh0dXJlXyhfKSx0aGlzLnRleHR1cmUpKXt2YXIgZz1mdW5jdGlvbih0LGUpe3QuaXNDb250ZXh0TG9zdCgpfHx0LmRlbGV0ZVRleHR1cmUoZSl9LmJpbmQobnVsbCxyLHRoaXMudGV4dHVyZSk7dC5wb3N0UmVuZGVyRnVuY3Rpb25zLnB1c2goZyl9fWlmKGwpe3ZhciB5PXRoaXMubWFwUmVuZGVyZXIuZ2V0Q29udGV4dCgpLmdldENhbnZhcygpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeF8oeS53aWR0aCx5LmhlaWdodCxuLHMsYSxoLGwuZ2V0RXh0ZW50KCkpLHRoaXMuaGl0VHJhbnNmb3JtYXRpb25NYXRyaXhfPW51bGw7dmFyIHY9dGhpcy50ZXhDb29yZE1hdHJpeDtGZSh2KSxqZSh2LDEsLTEpLFVlKHYsMCwtMSksdGhpcy5pbWFnZV89bCx0aGlzLnRleHR1cmU9dX1yZXR1cm4hIWx9LGUucHJvdG90eXBlLnVwZGF0ZVByb2plY3Rpb25NYXRyaXhfPWZ1bmN0aW9uKHQsZSxpLHIsbixvLHMpe3ZhciBhPXQqbixoPWUqbixsPXRoaXMucHJvamVjdGlvbk1hdHJpeDtGZShsKSxqZShsLDIqaS9hLDIqaS9oKSxrZShsLC1vKSxVZShsLHNbMF0tclswXSxzWzFdLXJbMV0pLGplKGwsKHNbMl0tc1swXSkvMiwoc1szXS1zWzFdKS8yKSxVZShsLDEsMSl9LGUucHJvdG90eXBlLmZvckVhY2hMYXllckF0UGl4ZWw9ZnVuY3Rpb24odCxlLGkscil7aWYodGhpcy5pbWFnZV8mJnRoaXMuaW1hZ2VfLmdldEltYWdlKCkpe3ZhciBuPVt0aGlzLmltYWdlXy5nZXRJbWFnZSgpLndpZHRoLHRoaXMuaW1hZ2VfLmdldEltYWdlKCkuaGVpZ2h0XTt0aGlzLmhpdFRyYW5zZm9ybWF0aW9uTWF0cml4X3x8KHRoaXMuaGl0VHJhbnNmb3JtYXRpb25NYXRyaXhfPXRoaXMuZ2V0SGl0VHJhbnNmb3JtYXRpb25NYXRyaXhfKGUuc2l6ZSxuKSk7dmFyIG89RGUodGhpcy5oaXRUcmFuc2Zvcm1hdGlvbk1hdHJpeF8sdC5zbGljZSgpKTtpZighKG9bMF08MHx8b1swXT5uWzBdfHxvWzFdPDB8fG9bMV0+blsxXSkpe3RoaXMuaGl0Q2FudmFzQ29udGV4dF98fCh0aGlzLmhpdENhbnZhc0NvbnRleHRfPUpuKDEsMSkpLHRoaXMuaGl0Q2FudmFzQ29udGV4dF8uY2xlYXJSZWN0KDAsMCwxLDEpLHRoaXMuaGl0Q2FudmFzQ29udGV4dF8uZHJhd0ltYWdlKHRoaXMuaW1hZ2VfLmdldEltYWdlKCksb1swXSxvWzFdLDEsMSwwLDAsMSwxKTt2YXIgcz10aGlzLmhpdENhbnZhc0NvbnRleHRfLmdldEltYWdlRGF0YSgwLDAsMSwxKS5kYXRhO3JldHVybiBzWzNdPjA/aS5jYWxsKHIsdGhpcy5nZXRMYXllcigpLHMpOnZvaWQgMH19fSxlLnByb3RvdHlwZS5nZXRIaXRUcmFuc2Zvcm1hdGlvbk1hdHJpeF89ZnVuY3Rpb24odCxlKXt2YXIgaT1bMSwwLDAsMSwwLDBdO1VlKGksLTEsLTEpLGplKGksMi90WzBdLDIvdFsxXSksVWUoaSwwLHRbMV0pLGplKGksMSwtMSk7dmFyIHI9QmUodGhpcy5wcm9qZWN0aW9uTWF0cml4LnNsaWNlKCkpLG49WzEsMCwwLDEsMCwwXTtyZXR1cm4gVWUobiwwLGVbMV0pLGplKG4sMSwtMSksamUobixlWzBdLzIsZVsxXS8yKSxVZShuLDEsMSksQWUobixyKSxBZShuLGkpLG59LGV9KGZsKTtfbC5oYW5kbGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFR5cGUoKT09PVNzLklNQUdFfSxfbC5jcmVhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IF9sKHQsZSl9O3ZhciBnbD1fbCx5bD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLGUpO3ZhciBpPWUuZ2V0Vmlld3BvcnQoKTt0aGlzLmNhbnZhc189ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksdGhpcy5jYW52YXNfLnN0eWxlLndpZHRoPSIxMDAlIix0aGlzLmNhbnZhc18uc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLmNhbnZhc18uc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuY2FudmFzXy5jbGFzc05hbWU9Zm8saS5pbnNlcnRCZWZvcmUodGhpcy5jYW52YXNfLGkuY2hpbGROb2Rlc1swXXx8bnVsbCksdGhpcy5jbGlwVGlsZUNhbnZhc1dpZHRoXz0wLHRoaXMuY2xpcFRpbGVDYW52YXNIZWlnaHRfPTAsdGhpcy5jbGlwVGlsZUNvbnRleHRfPUpuKCksdGhpcy5yZW5kZXJlZFZpc2libGVfPSEwLHRoaXMuZ2xfPXJoKHRoaXMuY2FudmFzXyx7YW50aWFsaWFzOiEwLGRlcHRoOiEwLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6ITAscHJlc2VydmVEcmF3aW5nQnVmZmVyOiExLHN0ZW5jaWw6ITB9KSx0aGlzLmNvbnRleHRfPW5ldyBNaCh0aGlzLmNhbnZhc18sdGhpcy5nbF8pLHYodGhpcy5jYW52YXNfLExoLkxPU1QsdGhpcy5oYW5kbGVXZWJHTENvbnRleHRMb3N0LHRoaXMpLHYodGhpcy5jYW52YXNfLExoLlJFU1RPUkVELHRoaXMuaGFuZGxlV2ViR0xDb250ZXh0UmVzdG9yZWQsdGhpcyksdGhpcy50ZXh0dXJlQ2FjaGVfPW5ldyBScyx0aGlzLmZvY3VzXz1udWxsLHRoaXMudGlsZVRleHR1cmVRdWV1ZV89bmV3IGJuKGZ1bmN0aW9uKHQpe3ZhciBlPXRbMV0saT10WzJdLHI9ZVswXS10aGlzLmZvY3VzX1swXSxuPWVbMV0tdGhpcy5mb2N1c19bMV07cmV0dXJuIDY1NTM2Kk1hdGgubG9nKGkpK01hdGguc3FydChyKnIrbipuKS9pfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdLmdldEtleSgpfSksdGhpcy5sb2FkTmV4dFRpbGVUZXh0dXJlXz1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLnRpbGVUZXh0dXJlUXVldWVfLmlzRW1wdHkoKSl7dGhpcy50aWxlVGV4dHVyZVF1ZXVlXy5yZXByaW9yaXRpemUoKTt2YXIgaT10aGlzLnRpbGVUZXh0dXJlUXVldWVfLmRlcXVldWUoKSxyPWlbMF0sbj1pWzNdLG89aVs0XTt0aGlzLmJpbmRUaWxlVGV4dHVyZShyLG4sbyxRYSxRYSl9cmV0dXJuITF9LmJpbmQodGhpcyksdGhpcy50ZXh0dXJlQ2FjaGVGcmFtZU1hcmtlckNvdW50Xz0wLHRoaXMuaW5pdGlhbGl6ZUdMXygpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5iaW5kVGlsZVRleHR1cmU9ZnVuY3Rpb24odCxlLGkscixuKXt2YXIgbz10aGlzLmdldEdMKCkscz10LmdldEtleSgpO2lmKHRoaXMudGV4dHVyZUNhY2hlXy5jb250YWluc0tleShzKSl7dmFyIGE9dGhpcy50ZXh0dXJlQ2FjaGVfLmdldChzKTtvLmJpbmRUZXh0dXJlKGVoLGEudGV4dHVyZSksYS5tYWdGaWx0ZXIhPXImJihvLnRleFBhcmFtZXRlcmkoZWgsMTAyNDAsciksYS5tYWdGaWx0ZXI9ciksYS5taW5GaWx0ZXIhPW4mJihvLnRleFBhcmFtZXRlcmkoZWgsMTAyNDEsbiksYS5taW5GaWx0ZXI9bil9ZWxzZXt2YXIgaD1vLmNyZWF0ZVRleHR1cmUoKSxsPXQ7aWYoby5iaW5kVGV4dHVyZShlaCxoKSxpPjApe3ZhciB1PXRoaXMuY2xpcFRpbGVDb250ZXh0Xy5jYW52YXMscD10aGlzLmNsaXBUaWxlQ29udGV4dF87dGhpcy5jbGlwVGlsZUNhbnZhc1dpZHRoXyE9PWVbMF18fHRoaXMuY2xpcFRpbGVDYW52YXNIZWlnaHRfIT09ZVsxXT8odS53aWR0aD1lWzBdLHUuaGVpZ2h0PWVbMV0sdGhpcy5jbGlwVGlsZUNhbnZhc1dpZHRoXz1lWzBdLHRoaXMuY2xpcFRpbGVDYW52YXNIZWlnaHRfPWVbMV0pOnAuY2xlYXJSZWN0KDAsMCxlWzBdLGVbMV0pLHAuZHJhd0ltYWdlKGwuZ2V0SW1hZ2UoKSxpLGksZVswXSxlWzFdLDAsMCxlWzBdLGVbMV0pLG8udGV4SW1hZ2UyRChlaCwwLDY0MDgsNjQwOCw1MTIxLHUpfWVsc2Ugby50ZXhJbWFnZTJEKGVoLDAsNjQwOCw2NDA4LDUxMjEsbC5nZXRJbWFnZSgpKTtvLnRleFBhcmFtZXRlcmkoZWgsMTAyNDAsciksby50ZXhQYXJhbWV0ZXJpKGVoLDEwMjQxLG4pLG8udGV4UGFyYW1ldGVyaShlaCwkYSwzMzA3MSksby50ZXhQYXJhbWV0ZXJpKGVoLHRoLDMzMDcxKSx0aGlzLnRleHR1cmVDYWNoZV8uc2V0KHMse3RleHR1cmU6aCxtYWdGaWx0ZXI6cixtaW5GaWx0ZXI6bn0pfX0sZS5wcm90b3R5cGUuZGlzcGF0Y2hSZW5kZXJFdmVudD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0TWFwKCk7aWYoaS5oYXNMaXN0ZW5lcih0KSl7dmFyIHI9dGhpcy5jb250ZXh0XyxuPWUuZXh0ZW50LG89ZS5zaXplLHM9ZS52aWV3U3RhdGUsYT1lLnBpeGVsUmF0aW8saD1zLnJlc29sdXRpb24sbD1zLmNlbnRlcix1PXMucm90YXRpb24scD1uZXcgdWwocixsLGgsdSxvLG4sYSksYz1uZXcgQ3ModCxwLGUsbnVsbCxyKTtpLmRpc3BhdGNoRXZlbnQoYyl9fSxlLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWw9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEdMKCk7ZS5pc0NvbnRleHRMb3N0KCl8fHRoaXMudGV4dHVyZUNhY2hlXy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QmJmUuZGVsZXRlVGV4dHVyZSh0LnRleHR1cmUpfSksdGhpcy5jb250ZXh0Xy5kaXNwb3NlKCksdC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLmV4cGlyZUNhY2hlXz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaSxyPXRoaXMuZ2V0R0woKTt0aGlzLnRleHR1cmVDYWNoZV8uZ2V0Q291bnQoKS10aGlzLnRleHR1cmVDYWNoZUZyYW1lTWFya2VyQ291bnRfPjEwMjQ7KXtpZihpPXRoaXMudGV4dHVyZUNhY2hlXy5wZWVrTGFzdCgpKXIuZGVsZXRlVGV4dHVyZShpLnRleHR1cmUpO2Vsc2V7aWYoK3RoaXMudGV4dHVyZUNhY2hlXy5wZWVrTGFzdEtleSgpPT1lLmluZGV4KWJyZWFrOy0tdGhpcy50ZXh0dXJlQ2FjaGVGcmFtZU1hcmtlckNvdW50X310aGlzLnRleHR1cmVDYWNoZV8ucG9wKCl9fSxlLnByb3RvdHlwZS5nZXRDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dF99LGUucHJvdG90eXBlLmdldEdMPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2xffSxlLnByb3RvdHlwZS5nZXRUaWxlVGV4dHVyZVF1ZXVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGlsZVRleHR1cmVRdWV1ZV99LGUucHJvdG90eXBlLmhhbmRsZVdlYkdMQ29udGV4dExvc3Q9ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMudGV4dHVyZUNhY2hlXy5jbGVhcigpLHRoaXMudGV4dHVyZUNhY2hlRnJhbWVNYXJrZXJDb3VudF89MDt2YXIgZT10aGlzLmdldExheWVyUmVuZGVyZXJzKCk7Zm9yKHZhciBpIGluIGUpe2VbaV0uaGFuZGxlV2ViR0xDb250ZXh0TG9zdCgpfX0sZS5wcm90b3R5cGUuaGFuZGxlV2ViR0xDb250ZXh0UmVzdG9yZWQ9ZnVuY3Rpb24oKXt0aGlzLmluaXRpYWxpemVHTF8oKSx0aGlzLmdldE1hcCgpLnJlbmRlcigpfSxlLnByb3RvdHlwZS5pbml0aWFsaXplR0xfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nbF87dC5hY3RpdmVUZXh0dXJlKDMzOTg0KSx0LmJsZW5kRnVuY1NlcGFyYXRlKDc3MCw3NzEsMSw3NzEpLHQuZGlzYWJsZSgyODg0KSx0LmRpc2FibGUoMjkyOSksdC5kaXNhYmxlKDMwODkpLHQuZGlzYWJsZSgyOTYwKX0sZS5wcm90b3R5cGUuaXNUaWxlVGV4dHVyZUxvYWRlZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50ZXh0dXJlQ2FjaGVfLmNvbnRhaW5zS2V5KHQuZ2V0S2V5KCkpfSxlLnByb3RvdHlwZS5yZW5kZXJGcmFtZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldENvbnRleHQoKSxpPXRoaXMuZ2V0R0woKTtpZihpLmlzQ29udGV4dExvc3QoKSlyZXR1cm4hMTtpZighdClyZXR1cm4gdGhpcy5yZW5kZXJlZFZpc2libGVfJiYodGhpcy5jYW52YXNfLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMucmVuZGVyZWRWaXNpYmxlXz0hMSksITE7dGhpcy5mb2N1c189dC5mb2N1cyx0aGlzLnRleHR1cmVDYWNoZV8uc2V0KCgtdC5pbmRleCkudG9TdHJpbmcoKSxudWxsKSwrK3RoaXMudGV4dHVyZUNhY2hlRnJhbWVNYXJrZXJDb3VudF8sdGhpcy5kaXNwYXRjaFJlbmRlckV2ZW50KHVyLlBSRUNPTVBPU0UsdCk7dmFyIHI9W10sbj10LmxheWVyU3RhdGVzQXJyYXk7cShuLFpzKTt2YXIgbyxzLGE9dC52aWV3U3RhdGUucmVzb2x1dGlvbjtmb3Iobz0wLHM9bi5sZW5ndGg7bzxzOysrbyl7dmFyIGg9bltvXTtpZihtbyhoLGEpJiZoLnNvdXJjZVN0YXRlPT1yby5SRUFEWSl0aGlzLmdldExheWVyUmVuZGVyZXIoaC5sYXllcikucHJlcGFyZUZyYW1lKHQsaCxlKSYmci5wdXNoKGgpfXZhciBsPXQuc2l6ZVswXSp0LnBpeGVsUmF0aW8sdT10LnNpemVbMV0qdC5waXhlbFJhdGlvO2Zvcih0aGlzLmNhbnZhc18ud2lkdGg9PWwmJnRoaXMuY2FudmFzXy5oZWlnaHQ9PXV8fCh0aGlzLmNhbnZhc18ud2lkdGg9bCx0aGlzLmNhbnZhc18uaGVpZ2h0PXUpLGkuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpLGkuY2xlYXJDb2xvcigwLDAsMCwwKSxpLmNsZWFyKDE2Mzg0KSxpLmVuYWJsZSgzMDQyKSxpLnZpZXdwb3J0KDAsMCx0aGlzLmNhbnZhc18ud2lkdGgsdGhpcy5jYW52YXNfLmhlaWdodCksbz0wLHM9ci5sZW5ndGg7bzxzOysrbyl7dmFyIHA9cltvXTt0aGlzLmdldExheWVyUmVuZGVyZXIocC5sYXllcikuY29tcG9zZUZyYW1lKHQscCxlKX10aGlzLnJlbmRlcmVkVmlzaWJsZV98fCh0aGlzLmNhbnZhc18uc3R5bGUuZGlzcGxheT0iIix0aGlzLnJlbmRlcmVkVmlzaWJsZV89ITApLHRoaXMuY2FsY3VsYXRlTWF0cmljZXMyRCh0KSx0aGlzLnRleHR1cmVDYWNoZV8uZ2V0Q291bnQoKS10aGlzLnRleHR1cmVDYWNoZUZyYW1lTWFya2VyQ291bnRfPjEwMjQmJnQucG9zdFJlbmRlckZ1bmN0aW9ucy5wdXNoKHRoaXMuZXhwaXJlQ2FjaGVfLmJpbmQodGhpcykpLHRoaXMudGlsZVRleHR1cmVRdWV1ZV8uaXNFbXB0eSgpfHwodC5wb3N0UmVuZGVyRnVuY3Rpb25zLnB1c2godGhpcy5sb2FkTmV4dFRpbGVUZXh0dXJlXyksdC5hbmltYXRlPSEwKSx0aGlzLmRpc3BhdGNoUmVuZGVyRXZlbnQodXIuUE9TVENPTVBPU0UsdCksdGhpcy5zY2hlZHVsZVJlbW92ZVVudXNlZExheWVyUmVuZGVyZXJzKHQpLHRoaXMuc2NoZWR1bGVFeHBpcmVJY29uQ2FjaGUodCl9LGUucHJvdG90eXBlLmZvckVhY2hGZWF0dXJlQXRDb29yZGluYXRlPWZ1bmN0aW9uKHQsZSxpLHIsbixvLHMpe3ZhciBhO2lmKHRoaXMuZ2V0R0woKS5pc0NvbnRleHRMb3N0KCkpcmV0dXJuITE7dmFyIGgsbD1lLnZpZXdTdGF0ZSx1PWUubGF5ZXJTdGF0ZXNBcnJheTtmb3IoaD11Lmxlbmd0aC0xO2g+PTA7LS1oKXt2YXIgcD11W2hdLGM9cC5sYXllcjtpZihtbyhwLGwucmVzb2x1dGlvbikmJm8uY2FsbChzLGMpKWlmKGE9dGhpcy5nZXRMYXllclJlbmRlcmVyKGMpLmZvckVhY2hGZWF0dXJlQXRDb29yZGluYXRlKHQsZSxpLHIpKXJldHVybiBhfX0sZS5wcm90b3R5cGUuaGFzRmVhdHVyZUF0Q29vcmRpbmF0ZT1mdW5jdGlvbih0LGUsaSxyLG4pe3ZhciBvPSExO2lmKHRoaXMuZ2V0R0woKS5pc0NvbnRleHRMb3N0KCkpcmV0dXJuITE7dmFyIHMsYT1lLnZpZXdTdGF0ZSxoPWUubGF5ZXJTdGF0ZXNBcnJheTtmb3Iocz1oLmxlbmd0aC0xO3M+PTA7LS1zKXt2YXIgbD1oW3NdLHU9bC5sYXllcjtpZihtbyhsLGEucmVzb2x1dGlvbikmJnIuY2FsbChuLHUpKWlmKG89dGhpcy5nZXRMYXllclJlbmRlcmVyKHUpLmhhc0ZlYXR1cmVBdENvb3JkaW5hdGUodCxlKSlyZXR1cm4hMH1yZXR1cm4gb30sZS5wcm90b3R5cGUuZm9yRWFjaExheWVyQXRQaXhlbD1mdW5jdGlvbih0LGUsaSxyLG4sbyxzKXtpZih0aGlzLmdldEdMKCkuaXNDb250ZXh0TG9zdCgpKXJldHVybiExO3ZhciBhLGgsbD1lLnZpZXdTdGF0ZSx1PWUubGF5ZXJTdGF0ZXNBcnJheTtmb3IoaD11Lmxlbmd0aC0xO2g+PTA7LS1oKXt2YXIgcD11W2hdLGM9cC5sYXllcjtpZihtbyhwLGwucmVzb2x1dGlvbikmJm8uY2FsbChuLGMpKWlmKGE9dGhpcy5nZXRMYXllclJlbmRlcmVyKGMpLmZvckVhY2hMYXllckF0UGl4ZWwodCxlLHIsbikpcmV0dXJuIGF9fSxlfShxcyksdmw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkscil7dC5jYWxsKHRoaXMpO3ZhciBuPXJ8fHt9O3RoaXMudGlsZUNvb3JkPWUsdGhpcy5zdGF0ZT1pLHRoaXMuaW50ZXJpbVRpbGU9bnVsbCx0aGlzLmtleT0iIix0aGlzLnRyYW5zaXRpb25fPXZvaWQgMD09PW4udHJhbnNpdGlvbj8yNTA6bi50cmFuc2l0aW9uLHRoaXMudHJhbnNpdGlvblN0YXJ0c189e319cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNoYW5nZWQ9ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoTS5DSEFOR0UpfSxlLnByb3RvdHlwZS5nZXRLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rZXkrIi8iK3RoaXMudGlsZUNvb3JkfSxlLnByb3RvdHlwZS5nZXRJbnRlcmltVGlsZT1mdW5jdGlvbigpe2lmKCF0aGlzLmludGVyaW1UaWxlKXJldHVybiB0aGlzO3ZhciB0PXRoaXMuaW50ZXJpbVRpbGU7ZG97aWYodC5nZXRTdGF0ZSgpPT1Pbi5MT0FERUQpcmV0dXJuIHQ7dD10LmludGVyaW1UaWxlfXdoaWxlKHQpO3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5yZWZyZXNoSW50ZXJpbUNoYWluPWZ1bmN0aW9uKCl7aWYodGhpcy5pbnRlcmltVGlsZSl7dmFyIHQ9dGhpcy5pbnRlcmltVGlsZSxlPXRoaXM7ZG97aWYodC5nZXRTdGF0ZSgpPT1Pbi5MT0FERUQpe3QuaW50ZXJpbVRpbGU9bnVsbDticmVha310LmdldFN0YXRlKCk9PU9uLkxPQURJTkc/ZT10OnQuZ2V0U3RhdGUoKT09T24uSURMRT9lLmludGVyaW1UaWxlPXQuaW50ZXJpbVRpbGU6ZT10LHQ9ZS5pbnRlcmltVGlsZX13aGlsZSh0KX19LGUucHJvdG90eXBlLmdldFRpbGVDb29yZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbGVDb29yZH0sZS5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0ZX0sZS5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24odCl7dGhpcy5zdGF0ZT10LHRoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5nZXRBbHBoYT1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLnRyYW5zaXRpb25fKXJldHVybiAxO3ZhciBpPXRoaXMudHJhbnNpdGlvblN0YXJ0c19bdF07aWYoaSl7aWYoLTE9PT1pKXJldHVybiAxfWVsc2UgaT1lLHRoaXMudHJhbnNpdGlvblN0YXJ0c19bdF09aTt2YXIgcj1lLWkrMWUzLzYwO3JldHVybiByPj10aGlzLnRyYW5zaXRpb25fPzE6Vm4oci90aGlzLnRyYW5zaXRpb25fKX0sZS5wcm90b3R5cGUuaW5UcmFuc2l0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiEhdGhpcy50cmFuc2l0aW9uXyYmLTEhPT10aGlzLnRyYW5zaXRpb25TdGFydHNfW3RdfSxlLnByb3RvdHlwZS5lbmRUcmFuc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMudHJhbnNpdGlvbl8mJih0aGlzLnRyYW5zaXRpb25TdGFydHNfW3RdPS0xKX0sZX0oYik7ZnVuY3Rpb24gbWwoKXt2YXIgdD1KbigxLDEpO3JldHVybiB0LmZpbGxTdHlsZT0icmdiYSgwLDAsMCwwKSIsdC5maWxsUmVjdCgwLDAsMSwxKSx0LmNhbnZhc312YXIgeGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkscixuLG8scyl7dC5jYWxsKHRoaXMsZSxpLHMpLHRoaXMuY3Jvc3NPcmlnaW5fPW4sdGhpcy5zcmNfPXIsdGhpcy5pbWFnZV89bmV3IEltYWdlLG51bGwhPT1uJiYodGhpcy5pbWFnZV8uY3Jvc3NPcmlnaW49biksdGhpcy5pbWFnZUxpc3RlbmVyS2V5c189bnVsbCx0aGlzLnRpbGVMb2FkRnVuY3Rpb25fPW99cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbD1mdW5jdGlvbigpe3RoaXMuc3RhdGU9PU9uLkxPQURJTkcmJih0aGlzLnVubGlzdGVuSW1hZ2VfKCksdGhpcy5pbWFnZV89bWwoKSksdGhpcy5pbnRlcmltVGlsZSYmdGhpcy5pbnRlcmltVGlsZS5kaXNwb3NlKCksdGhpcy5zdGF0ZT1Pbi5BQk9SVCx0aGlzLmNoYW5nZWQoKSx0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuZ2V0SW1hZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbWFnZV99LGUucHJvdG90eXBlLmdldEtleT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNyY199LGUucHJvdG90eXBlLmhhbmRsZUltYWdlRXJyb3JfPWZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1Pbi5FUlJPUix0aGlzLnVubGlzdGVuSW1hZ2VfKCksdGhpcy5pbWFnZV89bWwoKSx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuaGFuZGxlSW1hZ2VMb2FkXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaW1hZ2VfO3QubmF0dXJhbFdpZHRoJiZ0Lm5hdHVyYWxIZWlnaHQ/dGhpcy5zdGF0ZT1Pbi5MT0FERUQ6dGhpcy5zdGF0ZT1Pbi5FTVBUWSx0aGlzLnVubGlzdGVuSW1hZ2VfKCksdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt0aGlzLnN0YXRlPT1Pbi5FUlJPUiYmKHRoaXMuc3RhdGU9T24uSURMRSx0aGlzLmltYWdlXz1uZXcgSW1hZ2UsbnVsbCE9PXRoaXMuY3Jvc3NPcmlnaW5fJiYodGhpcy5pbWFnZV8uY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbl8pKSx0aGlzLnN0YXRlPT1Pbi5JRExFJiYodGhpcy5zdGF0ZT1Pbi5MT0FESU5HLHRoaXMuY2hhbmdlZCgpLHRoaXMuaW1hZ2VMaXN0ZW5lcktleXNfPVttKHRoaXMuaW1hZ2VfLE0uRVJST1IsdGhpcy5oYW5kbGVJbWFnZUVycm9yXyx0aGlzKSxtKHRoaXMuaW1hZ2VfLE0uTE9BRCx0aGlzLmhhbmRsZUltYWdlTG9hZF8sdGhpcyldLHRoaXMudGlsZUxvYWRGdW5jdGlvbl8odGhpcyx0aGlzLnNyY18pKX0sZS5wcm90b3R5cGUudW5saXN0ZW5JbWFnZV89ZnVuY3Rpb24oKXt0aGlzLmltYWdlTGlzdGVuZXJLZXlzXy5mb3JFYWNoKEUpLHRoaXMuaW1hZ2VMaXN0ZW5lcktleXNfPW51bGx9LGV9KHZsKTtmdW5jdGlvbiBFbCh0LGUsaSxyKXtyZXR1cm4gdm9pZCAwIT09cj8oclswXT10LHJbMV09ZSxyWzJdPWkscik6W3QsZSxpXX1mdW5jdGlvbiBTbCh0LGUsaSl7cmV0dXJuIHQrIi8iK2UrIi8iK2l9ZnVuY3Rpb24gVGwodCl7cmV0dXJuIFNsKHRbMF0sdFsxXSx0WzJdKX1mdW5jdGlvbiBDbCh0KXtyZXR1cm4odFsxXTw8dFswXSkrdFsyXX12YXIgUmw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyxlKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZXhwaXJlQ2FjaGU9ZnVuY3Rpb24odCl7Zm9yKDt0aGlzLmNhbkV4cGlyZUNhY2hlKCk7KXt2YXIgZT10aGlzLnBlZWtMYXN0KCksaT1lLnRpbGVDb29yZFswXS50b1N0cmluZygpO2lmKGkgaW4gdCYmdFtpXS5jb250YWlucyhlLnRpbGVDb29yZCkpYnJlYWs7dGhpcy5wb3AoKS5kaXNwb3NlKCl9fSxlLnByb3RvdHlwZS5wcnVuZUV4Y2VwdE5ld2VzdFo9ZnVuY3Rpb24oKXtpZigwIT09dGhpcy5nZXRDb3VudCgpKXt2YXIgdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5zcGxpdCgiLyIpLm1hcChOdW1iZXIpfSh0aGlzLnBlZWtGaXJzdEtleSgpKVswXTt0aGlzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS50aWxlQ29vcmRbMF0hPT10JiYodGhpcy5yZW1vdmUoVGwoZS50aWxlQ29vcmQpKSxlLmRpc3Bvc2UoKSl9LHRoaXMpfX0sZX0oUnMpO2Z1bmN0aW9uIHdsKHQpe3JldHVybiB0P0FycmF5LmlzQXJyYXkodCk/ZnVuY3Rpb24oZSl7cmV0dXJuIHR9OiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oZSl7cmV0dXJuW3RdfTpudWxsfXZhciBJbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLnByb2plY3Rpb25fPUVlKGUucHJvamVjdGlvbiksdGhpcy5hdHRyaWJ1dGlvbnNfPXdsKGUuYXR0cmlidXRpb25zKSx0aGlzLmF0dHJpYnV0aW9uc0NvbGxhcHNpYmxlXz12b2lkIDA9PT1lLmF0dHJpYnV0aW9uc0NvbGxhcHNpYmxlfHxlLmF0dHJpYnV0aW9uc0NvbGxhcHNpYmxlLHRoaXMubG9hZGluZz0hMSx0aGlzLnN0YXRlXz12b2lkIDAhPT1lLnN0YXRlP2Uuc3RhdGU6cm8uUkVBRFksdGhpcy53cmFwWF89dm9pZCAwIT09ZS53cmFwWCYmZS53cmFwWH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0QXR0cmlidXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXR0cmlidXRpb25zX30sZS5wcm90b3R5cGUuZ2V0QXR0cmlidXRpb25zQ29sbGFwc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGlvbnNDb2xsYXBzaWJsZV99LGUucHJvdG90eXBlLmdldFByb2plY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uX30sZS5wcm90b3R5cGUuZ2V0UmVzb2x1dGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlX30sZS5wcm90b3R5cGUuZ2V0V3JhcFg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53cmFwWF99LGUucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oKXt0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuc2V0QXR0cmlidXRpb25zPWZ1bmN0aW9uKHQpe3RoaXMuYXR0cmlidXRpb25zXz13bCh0KSx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24odCl7dGhpcy5zdGF0ZV89dCx0aGlzLmNoYW5nZWQoKX0sZX0oRCksTGw9WzAsMCwwXSxPbD1mdW5jdGlvbih0KXt2YXIgZTtpZih0aGlzLm1pblpvb209dm9pZCAwIT09dC5taW5ab29tP3QubWluWm9vbTowLHRoaXMucmVzb2x1dGlvbnNfPXQucmVzb2x1dGlvbnMsWShmdW5jdGlvbih0LGUsaSl7dmFyIHI9ZXx8VjtyZXR1cm4gdC5ldmVyeShmdW5jdGlvbihlLG4pe2lmKDA9PT1uKXJldHVybiEwO3ZhciBvPXIodFtuLTFdLGUpO3JldHVybiEobz4wfHxpJiYwPT09byl9KX0odGhpcy5yZXNvbHV0aW9uc18sZnVuY3Rpb24odCxlKXtyZXR1cm4gZS10fSwhMCksMTcpLCF0Lm9yaWdpbnMpZm9yKHZhciBpPTAscj10aGlzLnJlc29sdXRpb25zXy5sZW5ndGgtMTtpPHI7KytpKWlmKGUpe2lmKHRoaXMucmVzb2x1dGlvbnNfW2ldL3RoaXMucmVzb2x1dGlvbnNfW2krMV0hPT1lKXtlPXZvaWQgMDticmVha319ZWxzZSBlPXRoaXMucmVzb2x1dGlvbnNfW2ldL3RoaXMucmVzb2x1dGlvbnNfW2krMV07dGhpcy56b29tRmFjdG9yXz1lLHRoaXMubWF4Wm9vbT10aGlzLnJlc29sdXRpb25zXy5sZW5ndGgtMSx0aGlzLm9yaWdpbl89dm9pZCAwIT09dC5vcmlnaW4/dC5vcmlnaW46bnVsbCx0aGlzLm9yaWdpbnNfPW51bGwsdm9pZCAwIT09dC5vcmlnaW5zJiYodGhpcy5vcmlnaW5zXz10Lm9yaWdpbnMsWSh0aGlzLm9yaWdpbnNfLmxlbmd0aD09dGhpcy5yZXNvbHV0aW9uc18ubGVuZ3RoLDIwKSk7dmFyIG49dC5leHRlbnQ7dm9pZCAwPT09bnx8dGhpcy5vcmlnaW5ffHx0aGlzLm9yaWdpbnNffHwodGhpcy5vcmlnaW5fPUl0KG4pKSxZKCF0aGlzLm9yaWdpbl8mJnRoaXMub3JpZ2luc198fHRoaXMub3JpZ2luXyYmIXRoaXMub3JpZ2luc18sMTgpLHRoaXMudGlsZVNpemVzXz1udWxsLHZvaWQgMCE9PXQudGlsZVNpemVzJiYodGhpcy50aWxlU2l6ZXNfPXQudGlsZVNpemVzLFkodGhpcy50aWxlU2l6ZXNfLmxlbmd0aD09dGhpcy5yZXNvbHV0aW9uc18ubGVuZ3RoLDE5KSksdGhpcy50aWxlU2l6ZV89dm9pZCAwIT09dC50aWxlU2l6ZT90LnRpbGVTaXplOnRoaXMudGlsZVNpemVzXz9udWxsOkFuLFkoIXRoaXMudGlsZVNpemVfJiZ0aGlzLnRpbGVTaXplc198fHRoaXMudGlsZVNpemVfJiYhdGhpcy50aWxlU2l6ZXNfLDIyKSx0aGlzLmV4dGVudF89dm9pZCAwIT09bj9uOm51bGwsdGhpcy5mdWxsVGlsZVJhbmdlc189bnVsbCx0aGlzLnRtcFNpemVfPVswLDBdLHZvaWQgMCE9PXQuc2l6ZXM/dGhpcy5mdWxsVGlsZVJhbmdlc189dC5zaXplcy5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHNhKE1hdGgubWluKDAsdFswXSksTWF0aC5tYXgodFswXS0xLC0xKSxNYXRoLm1pbigwLHRbMV0pLE1hdGgubWF4KHRbMV0tMSwtMSkpfSx0aGlzKTpuJiZ0aGlzLmNhbGN1bGF0ZVRpbGVSYW5nZXNfKG4pfTtPbC5wcm90b3R5cGUuZm9yRWFjaFRpbGVDb29yZD1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciByPXRoaXMuZ2V0VGlsZVJhbmdlRm9yRXh0ZW50QW5kWih0LGUpLG49ci5taW5YLG89ci5tYXhYO248PW87KytuKWZvcih2YXIgcz1yLm1pblksYT1yLm1heFk7czw9YTsrK3MpaShbZSxuLHNdKX0sT2wucHJvdG90eXBlLmZvckVhY2hUaWxlQ29vcmRQYXJlbnRUaWxlUmFuZ2U9ZnVuY3Rpb24odCxlLGkscixuKXt2YXIgbyxzLGEsaD1udWxsLGw9dFswXS0xO2ZvcigyPT09dGhpcy56b29tRmFjdG9yXz8ocz10WzFdLGE9dFsyXSk6aD10aGlzLmdldFRpbGVDb29yZEV4dGVudCh0LG4pO2w+PXRoaXMubWluWm9vbTspe2lmKG89Mj09PXRoaXMuem9vbUZhY3Rvcl8/b2Eocz1NYXRoLmZsb29yKHMvMikscyxhPU1hdGguZmxvb3IoYS8yKSxhLHIpOnRoaXMuZ2V0VGlsZVJhbmdlRm9yRXh0ZW50QW5kWihoLGwsciksZS5jYWxsKGksbCxvKSlyZXR1cm4hMDstLWx9cmV0dXJuITF9LE9sLnByb3RvdHlwZS5nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5leHRlbnRffSxPbC5wcm90b3R5cGUuZ2V0TWF4Wm9vbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1heFpvb219LE9sLnByb3RvdHlwZS5nZXRNaW5ab29tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWluWm9vbX0sT2wucHJvdG90eXBlLmdldE9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcmlnaW5fP3RoaXMub3JpZ2luXzp0aGlzLm9yaWdpbnNfW3RdfSxPbC5wcm90b3R5cGUuZ2V0UmVzb2x1dGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXNvbHV0aW9uc19bdF19LE9sLnByb3RvdHlwZS5nZXRSZXNvbHV0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlc29sdXRpb25zX30sT2wucHJvdG90eXBlLmdldFRpbGVDb29yZENoaWxkVGlsZVJhbmdlPWZ1bmN0aW9uKHQsZSxpKXtpZih0WzBdPHRoaXMubWF4Wm9vbSl7aWYoMj09PXRoaXMuem9vbUZhY3Rvcl8pe3ZhciByPTIqdFsxXSxuPTIqdFsyXTtyZXR1cm4gb2EocixyKzEsbixuKzEsZSl9dmFyIG89dGhpcy5nZXRUaWxlQ29vcmRFeHRlbnQodCxpKTtyZXR1cm4gdGhpcy5nZXRUaWxlUmFuZ2VGb3JFeHRlbnRBbmRaKG8sdFswXSsxLGUpfXJldHVybiBudWxsfSxPbC5wcm90b3R5cGUuZ2V0VGlsZVJhbmdlRXh0ZW50PWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLmdldE9yaWdpbih0KSxuPXRoaXMuZ2V0UmVzb2x1dGlvbih0KSxvPWhvKHRoaXMuZ2V0VGlsZVNpemUodCksdGhpcy50bXBTaXplXykscz1yWzBdK2UubWluWCpvWzBdKm4sYT1yWzBdKyhlLm1heFgrMSkqb1swXSpuO3JldHVybiBsdChzLHJbMV0rZS5taW5ZKm9bMV0qbixhLHJbMV0rKGUubWF4WSsxKSpvWzFdKm4saSl9LE9sLnByb3RvdHlwZS5nZXRUaWxlUmFuZ2VGb3JFeHRlbnRBbmRaPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1MbDt0aGlzLmdldFRpbGVDb29yZEZvclhZQW5kWl8odFswXSx0WzFdLGUsITEscik7dmFyIG49clsxXSxvPXJbMl07cmV0dXJuIHRoaXMuZ2V0VGlsZUNvb3JkRm9yWFlBbmRaXyh0WzJdLHRbM10sZSwhMCxyKSxvYShuLHJbMV0sbyxyWzJdLGkpfSxPbC5wcm90b3R5cGUuZ2V0VGlsZUNvb3JkQ2VudGVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0T3JpZ2luKHRbMF0pLGk9dGhpcy5nZXRSZXNvbHV0aW9uKHRbMF0pLHI9aG8odGhpcy5nZXRUaWxlU2l6ZSh0WzBdKSx0aGlzLnRtcFNpemVfKTtyZXR1cm5bZVswXSsodFsxXSsuNSkqclswXSppLGVbMV0rKHRbMl0rLjUpKnJbMV0qaV19LE9sLnByb3RvdHlwZS5nZXRUaWxlQ29vcmRFeHRlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldE9yaWdpbih0WzBdKSxyPXRoaXMuZ2V0UmVzb2x1dGlvbih0WzBdKSxuPWhvKHRoaXMuZ2V0VGlsZVNpemUodFswXSksdGhpcy50bXBTaXplXyksbz1pWzBdK3RbMV0qblswXSpyLHM9aVsxXSt0WzJdKm5bMV0qcjtyZXR1cm4gbHQobyxzLG8rblswXSpyLHMrblsxXSpyLGUpfSxPbC5wcm90b3R5cGUuZ2V0VGlsZUNvb3JkRm9yQ29vcmRBbmRSZXNvbHV0aW9uPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5nZXRUaWxlQ29vcmRGb3JYWUFuZFJlc29sdXRpb25fKHRbMF0sdFsxXSxlLCExLGkpfSxPbC5wcm90b3R5cGUuZ2V0VGlsZUNvb3JkRm9yWFlBbmRSZXNvbHV0aW9uXz1mdW5jdGlvbih0LGUsaSxyLG4pe3ZhciBvPXRoaXMuZ2V0WkZvclJlc29sdXRpb24oaSkscz1pL3RoaXMuZ2V0UmVzb2x1dGlvbihvKSxhPXRoaXMuZ2V0T3JpZ2luKG8pLGg9aG8odGhpcy5nZXRUaWxlU2l6ZShvKSx0aGlzLnRtcFNpemVfKSxsPXI/LjU6MCx1PXI/MDouNSxwPU1hdGguZmxvb3IoKHQtYVswXSkvaStsKSxjPU1hdGguZmxvb3IoKGUtYVsxXSkvaSt1KSxkPXMqcC9oWzBdLGY9cypjL2hbMV07cmV0dXJuIHI/KGQ9TWF0aC5jZWlsKGQpLTEsZj1NYXRoLmNlaWwoZiktMSk6KGQ9TWF0aC5mbG9vcihkKSxmPU1hdGguZmxvb3IoZikpLEVsKG8sZCxmLG4pfSxPbC5wcm90b3R5cGUuZ2V0VGlsZUNvb3JkRm9yWFlBbmRaXz1mdW5jdGlvbih0LGUsaSxyLG4pe3ZhciBvPXRoaXMuZ2V0T3JpZ2luKGkpLHM9dGhpcy5nZXRSZXNvbHV0aW9uKGkpLGE9aG8odGhpcy5nZXRUaWxlU2l6ZShpKSx0aGlzLnRtcFNpemVfKSxoPXI/LjU6MCxsPXI/MDouNSx1PU1hdGguZmxvb3IoKHQtb1swXSkvcytoKSxwPU1hdGguZmxvb3IoKGUtb1sxXSkvcytsKSxjPXUvYVswXSxkPXAvYVsxXTtyZXR1cm4gcj8oYz1NYXRoLmNlaWwoYyktMSxkPU1hdGguY2VpbChkKS0xKTooYz1NYXRoLmZsb29yKGMpLGQ9TWF0aC5mbG9vcihkKSksRWwoaSxjLGQsbil9LE9sLnByb3RvdHlwZS5nZXRUaWxlQ29vcmRGb3JDb29yZEFuZFo9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmdldFRpbGVDb29yZEZvclhZQW5kWl8odFswXSx0WzFdLGUsITEsaSl9LE9sLnByb3RvdHlwZS5nZXRUaWxlQ29vcmRSZXNvbHV0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlc29sdXRpb25zX1t0WzBdXX0sT2wucHJvdG90eXBlLmdldFRpbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbGVTaXplXz90aGlzLnRpbGVTaXplXzp0aGlzLnRpbGVTaXplc19bdF19LE9sLnByb3RvdHlwZS5nZXRGdWxsVGlsZVJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZ1bGxUaWxlUmFuZ2VzXz90aGlzLmZ1bGxUaWxlUmFuZ2VzX1t0XTpudWxsfSxPbC5wcm90b3R5cGUuZ2V0WkZvclJlc29sdXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4ga3Qoeih0aGlzLnJlc29sdXRpb25zXyx0LGV8fDApLHRoaXMubWluWm9vbSx0aGlzLm1heFpvb20pfSxPbC5wcm90b3R5cGUuY2FsY3VsYXRlVGlsZVJhbmdlc189ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMucmVzb2x1dGlvbnNfLmxlbmd0aCxpPW5ldyBBcnJheShlKSxyPXRoaXMubWluWm9vbTtyPGU7KytyKWlbcl09dGhpcy5nZXRUaWxlUmFuZ2VGb3JFeHRlbnRBbmRaKHQscik7dGhpcy5mdWxsVGlsZVJhbmdlc189aX07dmFyIFBsPU9sO2Z1bmN0aW9uIGJsKHQpe3ZhciBlPXQuZ2V0RGVmYXVsdFRpbGVHcmlkKCk7cmV0dXJuIGV8fChlPU5sKHQpLHQuc2V0RGVmYXVsdFRpbGVHcmlkKGUpKSxlfWZ1bmN0aW9uIE1sKHQsZSxpLHIpe3ZhciBuPXZvaWQgMCE9PXI/cjpRLlRPUF9MRUZULG89QWwodCxlLGkpO3JldHVybiBuZXcgUGwoe2V4dGVudDp0LG9yaWdpbjpmdW5jdGlvbih0LGUpe3ZhciBpO3JldHVybiBlPT09US5CT1RUT01fTEVGVD9pPUV0KHQpOmU9PT1RLkJPVFRPTV9SSUdIVD9pPVN0KHQpOmU9PT1RLlRPUF9MRUZUP2k9SXQodCk6ZT09PVEuVE9QX1JJR0hUP2k9THQodCk6WSghMSwxMyksaX0odCxuKSxyZXNvbHV0aW9uczpvLHRpbGVTaXplOml9KX1mdW5jdGlvbiBGbCh0KXt2YXIgZT10fHx7fSxpPWUuZXh0ZW50fHxFZSgiRVBTRzozODU3IikuZ2V0RXh0ZW50KCkscj17ZXh0ZW50OmksbWluWm9vbTplLm1pblpvb20sdGlsZVNpemU6ZS50aWxlU2l6ZSxyZXNvbHV0aW9uczpBbChpLGUubWF4Wm9vbSxlLnRpbGVTaXplKX07cmV0dXJuIG5ldyBQbChyKX1mdW5jdGlvbiBBbCh0LGUsaSl7Zm9yKHZhciByPXZvaWQgMCE9PWU/ZTpGbixuPVJ0KHQpLG89T3QodCkscz1obyh2b2lkIDAhPT1pP2k6QW4pLGE9TWF0aC5tYXgoby9zWzBdLG4vc1sxXSksaD1yKzEsbD1uZXcgQXJyYXkoaCksdT0wO3U8aDsrK3UpbFt1XT1hL01hdGgucG93KDIsdSk7cmV0dXJuIGx9ZnVuY3Rpb24gTmwodCxlLGkscil7cmV0dXJuIE1sKEdsKHQpLGUsaSxyKX1mdW5jdGlvbiBHbCh0KXt2YXIgZT0odD1FZSh0KSkuZ2V0RXh0ZW50KCk7aWYoIWUpe3ZhciBpPTE4MCpRdFskdC5ERUdSRUVTXS90LmdldE1ldGVyc1BlclVuaXQoKTtlPWx0KC1pLC1pLGksaSl9cmV0dXJuIGV9dmFyIERsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMse2F0dHJpYnV0aW9uczplLmF0dHJpYnV0aW9ucyxhdHRyaWJ1dGlvbnNDb2xsYXBzaWJsZTplLmF0dHJpYnV0aW9uc0NvbGxhcHNpYmxlLHByb2plY3Rpb246ZS5wcm9qZWN0aW9uLHN0YXRlOmUuc3RhdGUsd3JhcFg6ZS53cmFwWH0pLHRoaXMub3BhcXVlXz12b2lkIDAhPT1lLm9wYXF1ZSYmZS5vcGFxdWUsdGhpcy50aWxlUGl4ZWxSYXRpb189dm9pZCAwIT09ZS50aWxlUGl4ZWxSYXRpbz9lLnRpbGVQaXhlbFJhdGlvOjEsdGhpcy50aWxlR3JpZD12b2lkIDAhPT1lLnRpbGVHcmlkP2UudGlsZUdyaWQ6bnVsbCx0aGlzLnRpbGVDYWNoZT1uZXcgUmwoZS5jYWNoZVNpemUpLHRoaXMudG1wU2l6ZT1bMCwwXSx0aGlzLmtleV89ZS5rZXl8fCIiLHRoaXMudGlsZU9wdGlvbnM9e3RyYW5zaXRpb246ZS50cmFuc2l0aW9ufX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY2FuRXhwaXJlQ2FjaGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aWxlQ2FjaGUuY2FuRXhwaXJlQ2FjaGUoKX0sZS5wcm90b3R5cGUuZXhwaXJlQ2FjaGU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldFRpbGVDYWNoZUZvclByb2plY3Rpb24odCk7aSYmaS5leHBpcmVDYWNoZShlKX0sZS5wcm90b3R5cGUuZm9yRWFjaExvYWRlZFRpbGU9ZnVuY3Rpb24odCxlLGkscil7dmFyIG49dGhpcy5nZXRUaWxlQ2FjaGVGb3JQcm9qZWN0aW9uKHQpO2lmKCFuKXJldHVybiExO2Zvcih2YXIgbyxzLGEsaD0hMCxsPWkubWluWDtsPD1pLm1heFg7KytsKWZvcih2YXIgdT1pLm1pblk7dTw9aS5tYXhZOysrdSlzPVNsKGUsbCx1KSxhPSExLG4uY29udGFpbnNLZXkocykmJihhPShvPW4uZ2V0KHMpKS5nZXRTdGF0ZSgpPT09T24uTE9BREVEKSYmKGE9ITEhPT1yKG8pKSxhfHwoaD0hMSk7cmV0dXJuIGh9LGUucHJvdG90eXBlLmdldEd1dHRlckZvclByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIDB9LGUucHJvdG90eXBlLmdldEtleT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmtleV99LGUucHJvdG90eXBlLnNldEtleT1mdW5jdGlvbih0KXt0aGlzLmtleV8hPT10JiYodGhpcy5rZXlfPXQsdGhpcy5jaGFuZ2VkKCkpfSxlLnByb3RvdHlwZS5nZXRPcGFxdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3BhcXVlX30sZS5wcm90b3R5cGUuZ2V0UmVzb2x1dGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aWxlR3JpZC5nZXRSZXNvbHV0aW9ucygpfSxlLnByb3RvdHlwZS5nZXRUaWxlPWZ1bmN0aW9uKHQsZSxpLG4sbyl7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUuZ2V0VGlsZUdyaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aWxlR3JpZH0sZS5wcm90b3R5cGUuZ2V0VGlsZUdyaWRGb3JQcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbGVHcmlkP3RoaXMudGlsZUdyaWQ6YmwodCl9LGUucHJvdG90eXBlLmdldFRpbGVDYWNoZUZvclByb2plY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRQcm9qZWN0aW9uKCk7cmV0dXJuIGUmJiFJZShlLHQpP251bGw6dGhpcy50aWxlQ2FjaGV9LGUucHJvdG90eXBlLmdldFRpbGVQaXhlbFJhdGlvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbGVQaXhlbFJhdGlvX30sZS5wcm90b3R5cGUuZ2V0VGlsZVBpeGVsU2l6ZT1mdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcy5nZXRUaWxlR3JpZEZvclByb2plY3Rpb24oaSksbj10aGlzLmdldFRpbGVQaXhlbFJhdGlvKGUpLG89aG8oci5nZXRUaWxlU2l6ZSh0KSx0aGlzLnRtcFNpemUpO3JldHVybiAxPT1uP286YW8obyxuLHRoaXMudG1wU2l6ZSl9LGUucHJvdG90eXBlLmdldFRpbGVDb29yZEZvclRpbGVVcmxGdW5jdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBpPXZvaWQgMCE9PWU/ZTp0aGlzLmdldFByb2plY3Rpb24oKSxyPXRoaXMuZ2V0VGlsZUdyaWRGb3JQcm9qZWN0aW9uKGkpO3JldHVybiB0aGlzLmdldFdyYXBYKCkmJmkuaXNHbG9iYWwoKSYmKHQ9ZnVuY3Rpb24odCxlLGkpe3ZhciByPWVbMF0sbj10LmdldFRpbGVDb29yZENlbnRlcihlKSxvPUdsKGkpO2lmKG50KG8sbikpcmV0dXJuIGU7dmFyIHM9T3QobyksYT1NYXRoLmNlaWwoKG9bMF0tblswXSkvcyk7cmV0dXJuIG5bMF0rPXMqYSx0LmdldFRpbGVDb29yZEZvckNvb3JkQW5kWihuLHIpfShyLHQsaSkpLGZ1bmN0aW9uKHQsZSl7dmFyIGk9dFswXSxyPXRbMV0sbj10WzJdO2lmKGUuZ2V0TWluWm9vbSgpPml8fGk+ZS5nZXRNYXhab29tKCkpcmV0dXJuITE7dmFyIG8scz1lLmdldEV4dGVudCgpO3JldHVybiEobz1zP2UuZ2V0VGlsZVJhbmdlRm9yRXh0ZW50QW5kWihzLGkpOmUuZ2V0RnVsbFRpbGVSYW5nZShpKSl8fG8uY29udGFpbnNYWShyLG4pfSh0LHIpP3Q6bnVsbH0sZS5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbigpe3RoaXMudGlsZUNhY2hlLmNsZWFyKCksdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLnVzZVRpbGU9ZnVuY3Rpb24odCxlLGkscil7fSxlfShJbCksa2w9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkpe3QuY2FsbCh0aGlzLGUpLHRoaXMudGlsZT1pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShQKSxqbD1EbCxVbD1uZXcgbGgoInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xudmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7XG5cblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xuXG52b2lkIG1haW4odm9pZCkge1xuICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodV90ZXh0dXJlLCB2X3RleENvb3JkKTtcbn1cbiIpLFlsPW5ldyB1aCgidmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7XG5cblxuYXR0cmlidXRlIHZlYzIgYV9wb3NpdGlvbjtcbmF0dHJpYnV0ZSB2ZWMyIGFfdGV4Q29vcmQ7XG51bmlmb3JtIHZlYzQgdV90aWxlT2Zmc2V0O1xuXG52b2lkIG1haW4odm9pZCkge1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbiAqIHVfdGlsZU9mZnNldC54eSArIHVfdGlsZU9mZnNldC56dywgMC4sIDEuKTtcbiAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7XG59XG5cblxuIiksQmw9ZnVuY3Rpb24odCxlKXt0aGlzLnVfdGlsZU9mZnNldD10LmdldFVuaWZvcm1Mb2NhdGlvbihlLCJ1X3RpbGVPZmZzZXQiKSx0aGlzLnVfdGV4dHVyZT10LmdldFVuaWZvcm1Mb2NhdGlvbihlLCJ1X3RleHR1cmUiKSx0aGlzLmFfcG9zaXRpb249dC5nZXRBdHRyaWJMb2NhdGlvbihlLCJhX3Bvc2l0aW9uIiksdGhpcy5hX3RleENvb3JkPXQuZ2V0QXR0cmliTG9jYXRpb24oZSwiYV90ZXhDb29yZCIpfSxWbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMsZSxpKSx0aGlzLmZyYWdtZW50U2hhZGVyXz1VbCx0aGlzLnZlcnRleFNoYWRlcl89WWwsdGhpcy5sb2NhdGlvbnNfPW51bGwsdGhpcy5yZW5kZXJBcnJheUJ1ZmZlcl89bmV3IFRoKFswLDAsMCwxLDEsMCwxLDEsMCwxLDAsMCwxLDEsMSwwXSksdGhpcy5yZW5kZXJlZFRpbGVSYW5nZV89bnVsbCx0aGlzLnJlbmRlcmVkRnJhbWVidWZmZXJFeHRlbnRfPW51bGwsdGhpcy5yZW5kZXJlZFJldmlzaW9uXz0tMSx0aGlzLnRtcFNpemVfPVswLDBdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWw9ZnVuY3Rpb24oKXt0aGlzLm1hcFJlbmRlcmVyLmdldENvbnRleHQoKS5kZWxldGVCdWZmZXIodGhpcy5yZW5kZXJBcnJheUJ1ZmZlcl8pLHQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5jcmVhdGVMb2FkZWRUaWxlRmluZGVyPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLm1hcFJlbmRlcmVyO3JldHVybiBmdW5jdGlvbihuLG8pe3JldHVybiB0LmZvckVhY2hMb2FkZWRUaWxlKGUsbixvLGZ1bmN0aW9uKHQpe3ZhciBlPXIuaXNUaWxlVGV4dHVyZUxvYWRlZCh0KTtyZXR1cm4gZSYmKGlbbl18fChpW25dPXt9KSxpW25dW3QudGlsZUNvb3JkLnRvU3RyaW5nKCldPXQpLGV9KX19LGUucHJvdG90eXBlLmhhbmRsZVdlYkdMQ29udGV4dExvc3Q9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5oYW5kbGVXZWJHTENvbnRleHRMb3N0LmNhbGwodGhpcyksdGhpcy5sb2NhdGlvbnNfPW51bGx9LGUucHJvdG90eXBlLnByZXBhcmVGcmFtZT1mdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcy5tYXBSZW5kZXJlcixuPWkuZ2V0R0woKSxvPXQudmlld1N0YXRlLHM9by5wcm9qZWN0aW9uLGE9dGhpcy5nZXRMYXllcigpLGg9YS5nZXRTb3VyY2UoKTtpZighKGggaW5zdGFuY2VvZiBqbCkpcmV0dXJuITA7dmFyIGwsdT1oLmdldFRpbGVHcmlkRm9yUHJvamVjdGlvbihzKSxwPXUuZ2V0WkZvclJlc29sdXRpb24oby5yZXNvbHV0aW9uKSxjPXUuZ2V0UmVzb2x1dGlvbihwKSxkPWguZ2V0VGlsZVBpeGVsU2l6ZShwLHQucGl4ZWxSYXRpbyxzKSxmPWRbMF0vaG8odS5nZXRUaWxlU2l6ZShwKSx0aGlzLnRtcFNpemVfKVswXSxfPWMvZixnPWguZ2V0VGlsZVBpeGVsUmF0aW8oZikqaC5nZXRHdXR0ZXJGb3JQcm9qZWN0aW9uKHMpLHk9by5jZW50ZXIsdj10LmV4dGVudCxtPXUuZ2V0VGlsZVJhbmdlRm9yRXh0ZW50QW5kWih2LHApO2lmKHRoaXMucmVuZGVyZWRUaWxlUmFuZ2VfJiZ0aGlzLnJlbmRlcmVkVGlsZVJhbmdlXy5lcXVhbHMobSkmJnRoaXMucmVuZGVyZWRSZXZpc2lvbl89PWguZ2V0UmV2aXNpb24oKSlsPXRoaXMucmVuZGVyZWRGcmFtZWJ1ZmZlckV4dGVudF87ZWxzZXt2YXIgeD1tLmdldFNpemUoKSxFPWZ1bmN0aW9uKHQpe3JldHVybiBZKDA8dCwyOSksTWF0aC5wb3coMixNYXRoLmNlaWwoTWF0aC5sb2codCkvTWF0aC5MTjIpKX0oTWF0aC5tYXgoeFswXSpkWzBdLHhbMV0qZFsxXSkpLFM9XypFLFQ9dS5nZXRPcmlnaW4ocCksQz1UWzBdK20ubWluWCpkWzBdKl8sUj1UWzFdK20ubWluWSpkWzFdKl87bD1bQyxSLEMrUyxSK1NdLHRoaXMuYmluZEZyYW1lYnVmZmVyKHQsRSksbi52aWV3cG9ydCgwLDAsRSxFKSxuLmNsZWFyQ29sb3IoMCwwLDAsMCksbi5jbGVhcigxNjM4NCksbi5kaXNhYmxlKDMwNDIpO3ZhciB3PWkuZ2V0UHJvZ3JhbSh0aGlzLmZyYWdtZW50U2hhZGVyXyx0aGlzLnZlcnRleFNoYWRlcl8pO2kudXNlUHJvZ3JhbSh3KSx0aGlzLmxvY2F0aW9uc198fCh0aGlzLmxvY2F0aW9uc189bmV3IEJsKG4sdykpLGkuYmluZEJ1ZmZlcigzNDk2Mix0aGlzLnJlbmRlckFycmF5QnVmZmVyXyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLmxvY2F0aW9uc18uYV9wb3NpdGlvbiksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMubG9jYXRpb25zXy5hX3Bvc2l0aW9uLDIsNTEyNiwhMSwxNiwwKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRoaXMubG9jYXRpb25zXy5hX3RleENvb3JkKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5sb2NhdGlvbnNfLmFfdGV4Q29vcmQsMiw1MTI2LCExLDE2LDgpLG4udW5pZm9ybTFpKHRoaXMubG9jYXRpb25zXy51X3RleHR1cmUsMCk7dmFyIEk9e307SVtwXT17fTt2YXIgTCxPLFAsYixNLEYsQT10aGlzLmNyZWF0ZUxvYWRlZFRpbGVGaW5kZXIoaCxzLEkpLE49YS5nZXRVc2VJbnRlcmltVGlsZXNPbkVycm9yKCksRz0hMCxEPVsxLzAsMS8wLC0xLzAsLTEvMF0saz1uZXcgc2EoMCwwLDAsMCk7Zm9yKGI9bS5taW5YO2I8PW0ubWF4WDsrK2IpZm9yKE09bS5taW5ZO008PW0ubWF4WTsrK00paWYoTz1oLmdldFRpbGUocCxiLE0sZixzKSx2b2lkIDA9PT1lLmV4dGVudHx8UHQoRj11LmdldFRpbGVDb29yZEV4dGVudChPLnRpbGVDb29yZCxEKSxlLmV4dGVudCkpe2lmKChQPU8uZ2V0U3RhdGUoKSk9PU9uLkxPQURFRHx8UD09T24uRU1QVFl8fFA9PU9uLkVSUk9SJiYhTnx8KE89Ty5nZXRJbnRlcmltVGlsZSgpKSwoUD1PLmdldFN0YXRlKCkpPT1Pbi5MT0FERUQpe2lmKHIuaXNUaWxlVGV4dHVyZUxvYWRlZChPKSl7SVtwXVtPLnRpbGVDb29yZC50b1N0cmluZygpXT1PO2NvbnRpbnVlfX1lbHNlIGlmKFA9PU9uLkVNUFRZfHxQPT1Pbi5FUlJPUiYmIU4pY29udGludWU7Rz0hMSx1LmZvckVhY2hUaWxlQ29vcmRQYXJlbnRUaWxlUmFuZ2UoTy50aWxlQ29vcmQsQSxudWxsLGssRCl8fChMPXUuZ2V0VGlsZUNvb3JkQ2hpbGRUaWxlUmFuZ2UoTy50aWxlQ29vcmQsayxEKSkmJkEocCsxLEwpfXZhciBqPU9iamVjdC5rZXlzKEkpLm1hcChOdW1iZXIpO2ouc29ydChWKTtmb3IodmFyIFU9bmV3IEZsb2F0MzJBcnJheSg0KSxCPTAsWD1qLmxlbmd0aDtCPFg7KytCKXt2YXIgej1JW2pbQl1dO2Zvcih2YXIgVyBpbiB6KShPPXpbV10paW5zdGFuY2VvZiB4bCYmKEY9dS5nZXRUaWxlQ29vcmRFeHRlbnQoTy50aWxlQ29vcmQsRCksVVswXT0yKihGWzJdLUZbMF0pL1MsVVsxXT0yKihGWzNdLUZbMV0pL1MsVVsyXT0yKihGWzBdLWxbMF0pL1MtMSxVWzNdPTIqKEZbMV0tbFsxXSkvUy0xLG4udW5pZm9ybTRmdih0aGlzLmxvY2F0aW9uc18udV90aWxlT2Zmc2V0LFUpLHIuYmluZFRpbGVUZXh0dXJlKE8sZCxnKmYsUWEsUWEpLG4uZHJhd0FycmF5cyg1LDAsNCkpfUc/KHRoaXMucmVuZGVyZWRUaWxlUmFuZ2VfPW0sdGhpcy5yZW5kZXJlZEZyYW1lYnVmZmVyRXh0ZW50Xz1sLHRoaXMucmVuZGVyZWRSZXZpc2lvbl89aC5nZXRSZXZpc2lvbigpKToodGhpcy5yZW5kZXJlZFRpbGVSYW5nZV89bnVsbCx0aGlzLnJlbmRlcmVkRnJhbWVidWZmZXJFeHRlbnRfPW51bGwsdGhpcy5yZW5kZXJlZFJldmlzaW9uXz0tMSx0LmFuaW1hdGU9ITApfXRoaXMudXBkYXRlVXNlZFRpbGVzKHQudXNlZFRpbGVzLGgscCxtKTt2YXIgSz1yLmdldFRpbGVUZXh0dXJlUXVldWUoKTt0aGlzLm1hbmFnZVRpbGVQeXJhbWlkKHQsaCx1LGYscyx2LHAsYS5nZXRQcmVsb2FkKCksZnVuY3Rpb24odCl7dC5nZXRTdGF0ZSgpIT1Pbi5MT0FERUR8fHIuaXNUaWxlVGV4dHVyZUxvYWRlZCh0KXx8Sy5pc0tleVF1ZXVlZCh0LmdldEtleSgpKXx8Sy5lbnF1ZXVlKFt0LHUuZ2V0VGlsZUNvb3JkQ2VudGVyKHQudGlsZUNvb3JkKSx1LmdldFJlc29sdXRpb24odC50aWxlQ29vcmRbMF0pLGQsZypmXSl9LHRoaXMpLHRoaXMuc2NoZWR1bGVFeHBpcmVDYWNoZSh0LGgpO3ZhciBIPXRoaXMudGV4Q29vcmRNYXRyaXg7cmV0dXJuIEZlKEgpLFVlKEgsKE1hdGgucm91bmQoeVswXS9jKSpjLWxbMF0pLyhsWzJdLWxbMF0pLChNYXRoLnJvdW5kKHlbMV0vYykqYy1sWzFdKS8obFszXS1sWzFdKSksMCE9PW8ucm90YXRpb24mJmtlKEgsby5yb3RhdGlvbiksamUoSCx0LnNpemVbMF0qby5yZXNvbHV0aW9uLyhsWzJdLWxbMF0pLHQuc2l6ZVsxXSpvLnJlc29sdXRpb24vKGxbM10tbFsxXSkpLFVlKEgsLS41LC0uNSksITB9LGUucHJvdG90eXBlLmZvckVhY2hMYXllckF0UGl4ZWw9ZnVuY3Rpb24odCxlLGkscil7aWYodGhpcy5mcmFtZWJ1ZmZlcil7dmFyIG49W3RbMF0vZS5zaXplWzBdLChlLnNpemVbMV0tdFsxXSkvZS5zaXplWzFdXSxvPURlKHRoaXMudGV4Q29vcmRNYXRyaXgsbi5zbGljZSgpKSxzPVtvWzBdKnRoaXMuZnJhbWVidWZmZXJEaW1lbnNpb24sb1sxXSp0aGlzLmZyYW1lYnVmZmVyRGltZW5zaW9uXSxhPXRoaXMubWFwUmVuZGVyZXIuZ2V0Q29udGV4dCgpLmdldEdMKCk7YS5iaW5kRnJhbWVidWZmZXIoYS5GUkFNRUJVRkZFUix0aGlzLmZyYW1lYnVmZmVyKTt2YXIgaD1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gYS5yZWFkUGl4ZWxzKHNbMF0sc1sxXSwxLDEsYS5SR0JBLGEuVU5TSUdORURfQllURSxoKSxoWzNdPjA/aS5jYWxsKHIsdGhpcy5nZXRMYXllcigpLGgpOnZvaWQgMH19LGV9KGZsKTtWbC5oYW5kbGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFR5cGUoKT09PVNzLlRJTEV9LFZsLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgVmwodCxlKX07dmFyIFhsPVZsLHpsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcyxlLGkpLHRoaXMuZGlydHlfPSExLHRoaXMucmVuZGVyZWRSZXZpc2lvbl89LTEsdGhpcy5yZW5kZXJlZFJlc29sdXRpb25fPU5hTix0aGlzLnJlbmRlcmVkRXh0ZW50Xz1bMS8wLDEvMCwtMS8wLC0xLzBdLHRoaXMucmVuZGVyZWRSZW5kZXJPcmRlcl89bnVsbCx0aGlzLnJlcGxheUdyb3VwXz1udWxsLHRoaXMubGF5ZXJTdGF0ZV89bnVsbH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY29tcG9zZUZyYW1lPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmxheWVyU3RhdGVfPWU7dmFyIHI9dC52aWV3U3RhdGUsbj10aGlzLnJlcGxheUdyb3VwXyxvPXQuc2l6ZSxzPXQucGl4ZWxSYXRpbyxhPXRoaXMubWFwUmVuZGVyZXIuZ2V0R0woKTtuJiYhbi5pc0VtcHR5KCkmJihhLmVuYWJsZShhLlNDSVNTT1JfVEVTVCksYS5zY2lzc29yKDAsMCxvWzBdKnMsb1sxXSpzKSxuLnJlcGxheShpLHIuY2VudGVyLHIucmVzb2x1dGlvbixyLnJvdGF0aW9uLG8scyxlLm9wYWNpdHksZS5tYW5hZ2VkP3Quc2tpcHBlZEZlYXR1cmVVaWRzOnt9KSxhLmRpc2FibGUoYS5TQ0lTU09SX1RFU1QpKX0sZS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZXBsYXlHcm91cF87aWYoZSl7dmFyIGk9dGhpcy5tYXBSZW5kZXJlci5nZXRDb250ZXh0KCk7ZS5nZXREZWxldGVSZXNvdXJjZXNGdW5jdGlvbihpKSgpLHRoaXMucmVwbGF5R3JvdXBfPW51bGx9dC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLmZvckVhY2hGZWF0dXJlQXRDb29yZGluYXRlPWZ1bmN0aW9uKHQsZSxpLHIsbil7aWYodGhpcy5yZXBsYXlHcm91cF8mJnRoaXMubGF5ZXJTdGF0ZV8pe3ZhciBzPXRoaXMubWFwUmVuZGVyZXIuZ2V0Q29udGV4dCgpLGE9ZS52aWV3U3RhdGUsaD10aGlzLmdldExheWVyKCksbD10aGlzLmxheWVyU3RhdGVfLHU9e307cmV0dXJuIHRoaXMucmVwbGF5R3JvdXBfLmZvckVhY2hGZWF0dXJlQXRDb29yZGluYXRlKHQscyxhLmNlbnRlcixhLnJlc29sdXRpb24sYS5yb3RhdGlvbixlLnNpemUsZS5waXhlbFJhdGlvLGwub3BhY2l0eSx7fSxmdW5jdGlvbih0KXt2YXIgZT1vKHQpO2lmKCEoZSBpbiB1KSlyZXR1cm4gdVtlXT0hMCxyLmNhbGwobix0LGgpfSl9fSxlLnByb3RvdHlwZS5oYXNGZWF0dXJlQXRDb29yZGluYXRlPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5yZXBsYXlHcm91cF8mJnRoaXMubGF5ZXJTdGF0ZV8pe3ZhciBpPXRoaXMubWFwUmVuZGVyZXIuZ2V0Q29udGV4dCgpLHI9ZS52aWV3U3RhdGUsbj10aGlzLmxheWVyU3RhdGVfO3JldHVybiB0aGlzLnJlcGxheUdyb3VwXy5oYXNGZWF0dXJlQXRDb29yZGluYXRlKHQsaSxyLmNlbnRlcixyLnJlc29sdXRpb24sci5yb3RhdGlvbixlLnNpemUsZS5waXhlbFJhdGlvLG4ub3BhY2l0eSxlLnNraXBwZWRGZWF0dXJlVWlkcyl9cmV0dXJuITF9LGUucHJvdG90eXBlLmZvckVhY2hMYXllckF0UGl4ZWw9ZnVuY3Rpb24odCxlLGkscil7dmFyIG49RGUoZS5waXhlbFRvQ29vcmRpbmF0ZVRyYW5zZm9ybSx0LnNsaWNlKCkpO3JldHVybiB0aGlzLmhhc0ZlYXR1cmVBdENvb3JkaW5hdGUobixlKT9pLmNhbGwocix0aGlzLmdldExheWVyKCksbnVsbCk6dm9pZCAwfSxlLnByb3RvdHlwZS5oYW5kbGVTdHlsZUltYWdlQ2hhbmdlXz1mdW5jdGlvbih0KXt0aGlzLnJlbmRlcklmUmVhZHlBbmRWaXNpYmxlKCl9LGUucHJvdG90eXBlLnByZXBhcmVGcmFtZT1mdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcy5nZXRMYXllcigpLG49ci5nZXRTb3VyY2UoKSxvPXQudmlld0hpbnRzW2tuXSxzPXQudmlld0hpbnRzW2puXSxhPXIuZ2V0VXBkYXRlV2hpbGVBbmltYXRpbmcoKSxoPXIuZ2V0VXBkYXRlV2hpbGVJbnRlcmFjdGluZygpO2lmKCF0aGlzLmRpcnR5XyYmIWEmJm98fCFoJiZzKXJldHVybiEwO3ZhciBsPXQuZXh0ZW50LHU9dC52aWV3U3RhdGUscD11LnByb2plY3Rpb24sYz11LnJlc29sdXRpb24sZD10LnBpeGVsUmF0aW8sZj1yLmdldFJldmlzaW9uKCksXz1yLmdldFJlbmRlckJ1ZmZlcigpLGc9ci5nZXRSZW5kZXJPcmRlcigpO3ZvaWQgMD09PWcmJihnPURhKTt2YXIgeT1ldChsLF8qYyk7aWYoIXRoaXMuZGlydHlfJiZ0aGlzLnJlbmRlcmVkUmVzb2x1dGlvbl89PWMmJnRoaXMucmVuZGVyZWRSZXZpc2lvbl89PWYmJnRoaXMucmVuZGVyZWRSZW5kZXJPcmRlcl89PWcmJm90KHRoaXMucmVuZGVyZWRFeHRlbnRfLHkpKXJldHVybiEwO3RoaXMucmVwbGF5R3JvdXBfJiZ0LnBvc3RSZW5kZXJGdW5jdGlvbnMucHVzaCh0aGlzLnJlcGxheUdyb3VwXy5nZXREZWxldGVSZXNvdXJjZXNGdW5jdGlvbihpKSksdGhpcy5kaXJ0eV89ITE7dmFyIHY9bmV3IGxsKGphKGMsZCkseSxyLmdldFJlbmRlckJ1ZmZlcigpKTtuLmxvYWRGZWF0dXJlcyh5LGMscCk7dmFyIG09ZnVuY3Rpb24odCl7dmFyIGUsaT10LmdldFN0eWxlRnVuY3Rpb24oKXx8ci5nZXRTdHlsZUZ1bmN0aW9uKCk7aWYoaSYmKGU9aSh0LGMpKSxlKXt2YXIgbj10aGlzLnJlbmRlckZlYXR1cmUodCxjLGQsZSx2KTt0aGlzLmRpcnR5Xz10aGlzLmRpcnR5X3x8bn19LmJpbmQodGhpcyk7aWYoZyl7dmFyIHg9W107bi5mb3JFYWNoRmVhdHVyZUluRXh0ZW50KHksZnVuY3Rpb24odCl7eC5wdXNoKHQpfSkseC5zb3J0KGcpLHguZm9yRWFjaChtLmJpbmQodGhpcykpfWVsc2Ugbi5mb3JFYWNoRmVhdHVyZUluRXh0ZW50KHksbSk7cmV0dXJuIHYuZmluaXNoKGkpLHRoaXMucmVuZGVyZWRSZXNvbHV0aW9uXz1jLHRoaXMucmVuZGVyZWRSZXZpc2lvbl89Zix0aGlzLnJlbmRlcmVkUmVuZGVyT3JkZXJfPWcsdGhpcy5yZW5kZXJlZEV4dGVudF89eSx0aGlzLnJlcGxheUdyb3VwXz12LCEwfSxlLnByb3RvdHlwZS5yZW5kZXJGZWF0dXJlPWZ1bmN0aW9uKHQsZSxpLHIsbil7aWYoIXIpcmV0dXJuITE7dmFyIG89ITE7aWYoQXJyYXkuaXNBcnJheShyKSlmb3IodmFyIHM9ci5sZW5ndGgtMTtzPj0wOy0tcylvPVVhKG4sdCxyW3NdLGthKGUsaSksdGhpcy5oYW5kbGVTdHlsZUltYWdlQ2hhbmdlXyx0aGlzKXx8bztlbHNlIG89VWEobix0LHIsa2EoZSxpKSx0aGlzLmhhbmRsZVN0eWxlSW1hZ2VDaGFuZ2VfLHRoaXMpfHxvO3JldHVybiBvfSxlfShmbCk7emwuaGFuZGxlcz1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRUeXBlKCk9PT1Tcy5WRUNUT1J9LHpsLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgemwodCxlKX07dmFyIFdsPXpsLEtsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7KGU9dSh7fSxlKSkuY29udHJvbHN8fChlLmNvbnRyb2xzPXdvKCkpLGUuaW50ZXJhY3Rpb25zfHwoZS5pbnRlcmFjdGlvbnM9eXMoKSksdC5jYWxsKHRoaXMsZSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNyZWF0ZVJlbmRlcmVyPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHlsKHRoaXMpO3JldHVybiB0LnJlZ2lzdGVyTGF5ZXJSZW5kZXJlcnMoW2dsLFhsLFdsXSksdH0sZX0obG8pLEhsPXtBUlJBWV9CVUZGRVI6ImFycmF5YnVmZmVyIixKU09OOiJqc29uIixURVhUOiJ0ZXh0IixYTUw6InhtbCJ9O2Z1bmN0aW9uIFpsKHQsZSxpLHIpe3JldHVybiBmdW5jdGlvbihuLG8scyl7dmFyIGE9bmV3IFhNTEh0dHBSZXF1ZXN0O2Eub3BlbigiR0VUIiwiZnVuY3Rpb24iPT10eXBlb2YgdD90KG4sbyxzKTp0LCEwKSxlLmdldFR5cGUoKT09SGwuQVJSQVlfQlVGRkVSJiYoYS5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIiksYS5vbmxvYWQ9ZnVuY3Rpb24odCl7aWYoIWEuc3RhdHVzfHxhLnN0YXR1cz49MjAwJiZhLnN0YXR1czwzMDApe3ZhciBuLG89ZS5nZXRUeXBlKCk7bz09SGwuSlNPTnx8bz09SGwuVEVYVD9uPWEucmVzcG9uc2VUZXh0Om89PUhsLlhNTD8obj1hLnJlc3BvbnNlWE1MKXx8KG49KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwiYXBwbGljYXRpb24veG1sIikpOm89PUhsLkFSUkFZX0JVRkZFUiYmKG49YS5yZXNwb25zZSksbj9pLmNhbGwodGhpcyxlLnJlYWRGZWF0dXJlcyhuLHtmZWF0dXJlUHJvamVjdGlvbjpzfSksZS5yZWFkUHJvamVjdGlvbihuKSxlLmdldExhc3RFeHRlbnQoKSk6ci5jYWxsKHRoaXMpfWVsc2Ugci5jYWxsKHRoaXMpfS5iaW5kKHRoaXMpLGEub25lcnJvcj1mdW5jdGlvbigpe3IuY2FsbCh0aGlzKX0uYmluZCh0aGlzKSxhLnNlbmQoKX19ZnVuY3Rpb24gcWwodCxlKXtyZXR1cm4gWmwodCxlLGZ1bmN0aW9uKHQsZSl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuYWRkRmVhdHVyZXMmJnRoaXMuYWRkRmVhdHVyZXModCl9LEkpfWZ1bmN0aW9uIEpsKHQsZSl7cmV0dXJuW1stMS8wLC0xLzAsMS8wLDEvMF1dfXZhciBRbD1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgiIiwiIixudWxsKSwkbD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiO2Z1bmN0aW9uIHR1KHQsZSl7cmV0dXJuIFFsLmNyZWF0ZUVsZW1lbnROUyh0LGUpfWZ1bmN0aW9uIGV1KHQsZSl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxpLHIpe2lmKGUubm9kZVR5cGU9PU5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFfHxlLm5vZGVUeXBlPT1Ob2RlLlRFWFRfTk9ERSlpP3IucHVzaChTdHJpbmcoZS5ub2RlVmFsdWUpLnJlcGxhY2UoLyhcclxufFxyfFxuKS9nLCIiKSk6ci5wdXNoKGUubm9kZVZhbHVlKTtlbHNle3ZhciBuO2ZvcihuPWUuZmlyc3RDaGlsZDtuO249bi5uZXh0U2libGluZyl0KG4saSxyKX1yZXR1cm4gcn0odCxlLFtdKS5qb2luKCIiKX1mdW5jdGlvbiBpdSh0KXtyZXR1cm4iZG9jdW1lbnRFbGVtZW50ImluIHR9ZnVuY3Rpb24gcnUodCl7cmV0dXJuKG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0LCJhcHBsaWNhdGlvbi94bWwiKX1mdW5jdGlvbiBudSh0LGUpe3JldHVybiBmdW5jdGlvbihpLHIpe3ZhciBuPXQuY2FsbCh2b2lkIDAhPT1lP2U6dGhpcyxpLHIpO3ZvaWQgMCE9PW4mJksocltyLmxlbmd0aC0xXSxuKX19ZnVuY3Rpb24gb3UodCxlKXtyZXR1cm4gZnVuY3Rpb24oaSxyKXt2YXIgbj10LmNhbGwodm9pZCAwIT09ZT9lOnRoaXMsaSxyKTt2b2lkIDAhPT1uJiZyW3IubGVuZ3RoLTFdLnB1c2gobil9fWZ1bmN0aW9uIHN1KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKGkscil7dmFyIG49dC5jYWxsKHZvaWQgMCE9PWU/ZTp0aGlzLGkscik7dm9pZCAwIT09biYmKHJbci5sZW5ndGgtMV09bil9fWZ1bmN0aW9uIGF1KHQsZSxpKXtyZXR1cm4gZnVuY3Rpb24ocixuKXt2YXIgbz10LmNhbGwodm9pZCAwIT09aT9pOnRoaXMscixuKTtpZih2b2lkIDAhPT1vKXt2YXIgcz1uW24ubGVuZ3RoLTFdLGE9dm9pZCAwIT09ZT9lOnIubG9jYWxOYW1lOyhhIGluIHM/c1thXTpzW2FdPVtdKS5wdXNoKG8pfX19ZnVuY3Rpb24gaHUodCxlLGkpe3JldHVybiBmdW5jdGlvbihyLG4pe3ZhciBvPXQuY2FsbCh2b2lkIDAhPT1pP2k6dGhpcyxyLG4pO3ZvaWQgMCE9PW8mJihuW24ubGVuZ3RoLTFdW3ZvaWQgMCE9PWU/ZTpyLmxvY2FsTmFtZV09byl9fWZ1bmN0aW9uIGx1KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKGkscixuKXt0LmNhbGwodm9pZCAwIT09ZT9lOnRoaXMsaSxyLG4pLG5bbi5sZW5ndGgtMV0ubm9kZS5hcHBlbmRDaGlsZChpKX19ZnVuY3Rpb24gdXUodCxlKXt2YXIgaSxyO3JldHVybiBmdW5jdGlvbihlLG4sbyl7aWYodm9pZCAwPT09aSl7aT17fTt2YXIgcz17fTtzW2UubG9jYWxOYW1lXT10LGlbZS5uYW1lc3BhY2VVUkldPXMscj1wdShlLmxvY2FsTmFtZSl9eXUoaSxyLG4sbyl9fWZ1bmN0aW9uIHB1KHQsZSl7dmFyIGk9dDtyZXR1cm4gZnVuY3Rpb24odCxyLG4pe3ZhciBvPXJbci5sZW5ndGgtMV0ubm9kZSxzPWk7cmV0dXJuIHZvaWQgMD09PXMmJihzPW4pLHR1KHZvaWQgMCE9PWU/ZTpvLm5hbWVzcGFjZVVSSSxzKX19dmFyIGN1PXB1KCk7ZnVuY3Rpb24gZHUodCxlKXtmb3IodmFyIGk9ZS5sZW5ndGgscj1uZXcgQXJyYXkoaSksbj0wO248aTsrK24pcltuXT10W2Vbbl1dO3JldHVybiByfWZ1bmN0aW9uIGZ1KHQsZSxpKXt2YXIgcixuLG89dm9pZCAwIT09aT9pOnt9O2ZvcihyPTAsbj10Lmxlbmd0aDtyPG47KytyKW9bdFtyXV09ZTtyZXR1cm4gb31mdW5jdGlvbiBfdSh0LGUsaSxyKXt2YXIgbjtmb3Iobj1lLmZpcnN0RWxlbWVudENoaWxkO247bj1uLm5leHRFbGVtZW50U2libGluZyl7dmFyIG89dFtuLm5hbWVzcGFjZVVSSV07aWYodm9pZCAwIT09byl7dmFyIHM9b1tuLmxvY2FsTmFtZV07dm9pZCAwIT09cyYmcy5jYWxsKHIsbixpKX19fWZ1bmN0aW9uIGd1KHQsZSxpLHIsbil7cmV0dXJuIHIucHVzaCh0KSxfdShlLGkscixuKSxyLnBvcCgpfWZ1bmN0aW9uIHl1KHQsZSxpLHIsbixvKXtmb3IodmFyIHMsYSxoPSh2b2lkIDAhPT1uP246aSkubGVuZ3RoLGw9MDtsPGg7KytsKXZvaWQgMCE9PShzPWlbbF0pJiZ2b2lkIDAhPT0oYT1lLmNhbGwodm9pZCAwIT09bz9vOnRoaXMscyxyLHZvaWQgMCE9PW4/bltsXTp2b2lkIDApKSYmdFthLm5hbWVzcGFjZVVSSV1bYS5sb2NhbE5hbWVdLmNhbGwobyxhLHMscil9ZnVuY3Rpb24gdnUodCxlLGkscixuLG8scyl7cmV0dXJuIG4ucHVzaCh0KSx5dShlLGkscixuLG8scyksbi5wb3AoKX12YXIgbXU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyx7ZXh0ZW50OmUuZXh0ZW50LG9yaWdpbjplLm9yaWdpbixvcmlnaW5zOmUub3JpZ2lucyxyZXNvbHV0aW9uczplLnJlc29sdXRpb25zLHRpbGVTaXplOmUudGlsZVNpemUsdGlsZVNpemVzOmUudGlsZVNpemVzLHNpemVzOmUuc2l6ZXN9KSx0aGlzLm1hdHJpeElkc189ZS5tYXRyaXhJZHN9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldE1hdHJpeElkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hdHJpeElkc19bdF19LGUucHJvdG90eXBlLmdldE1hdHJpeElkcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdHJpeElkc199LGV9KFBsKSx4dT1tdTtmdW5jdGlvbiBFdSh0LGUsaSl7dmFyIHI9W10sbj1bXSxvPVtdLHM9W10sYT1bXSxoPXZvaWQgMCE9PWk/aTpbXSxsPXQuU3VwcG9ydGVkQ1JTLHU9RWUobC5yZXBsYWNlKC91cm46b2djOmRlZjpjcnM6KFx3Kyk6KC4qOik/KFx3KykkLywiJDE6JDMiKSl8fEVlKGwpLHA9dS5nZXRNZXRlcnNQZXJVbml0KCksYz0ibmUiPT11LmdldEF4aXNPcmllbnRhdGlvbigpLnN1YnN0cigwLDIpO3JldHVybiB0LlRpbGVNYXRyaXguc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBlLlNjYWxlRGVub21pbmF0b3ItdC5TY2FsZURlbm9taW5hdG9yfSksdC5UaWxlTWF0cml4LmZvckVhY2goZnVuY3Rpb24oZSl7aWYoIShoLmxlbmd0aD4wKXx8SChoLGZ1bmN0aW9uKGkpe3JldHVybiBlLklkZW50aWZpZXI9PWkuVGlsZU1hdHJpeHx8LTE9PT1lLklkZW50aWZpZXIuaW5kZXhPZigiOiIpJiZ0LklkZW50aWZpZXIrIjoiK2UuSWRlbnRpZmllcj09PWkuVGlsZU1hdHJpeH0pKXtuLnB1c2goZS5JZGVudGlmaWVyKTt2YXIgaT0yOGUtNSplLlNjYWxlRGVub21pbmF0b3IvcCxsPWUuVGlsZVdpZHRoLHU9ZS5UaWxlSGVpZ2h0O2M/by5wdXNoKFtlLlRvcExlZnRDb3JuZXJbMV0sZS5Ub3BMZWZ0Q29ybmVyWzBdXSk6by5wdXNoKGUuVG9wTGVmdENvcm5lciksci5wdXNoKGkpLHMucHVzaChsPT11P2w6W2wsdV0pLGEucHVzaChbZS5NYXRyaXhXaWR0aCwtZS5NYXRyaXhIZWlnaHRdKX19KSxuZXcgbXUoe2V4dGVudDplLG9yaWdpbnM6byxyZXNvbHV0aW9uczpyLG1hdHJpeElkczpuLHRpbGVTaXplczpzLHNpemVzOmF9KX12YXIgU3U9ZnVuY3Rpb24odCl7dGhpcy5vcGFjaXR5Xz10Lm9wYWNpdHksdGhpcy5yb3RhdGVXaXRoVmlld189dC5yb3RhdGVXaXRoVmlldyx0aGlzLnJvdGF0aW9uXz10LnJvdGF0aW9uLHRoaXMuc2NhbGVfPXQuc2NhbGV9O1N1LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgU3Uoe29wYWNpdHk6dGhpcy5nZXRPcGFjaXR5KCksc2NhbGU6dGhpcy5nZXRTY2FsZSgpLHJvdGF0aW9uOnRoaXMuZ2V0Um90YXRpb24oKSxyb3RhdGVXaXRoVmlldzp0aGlzLmdldFJvdGF0ZVdpdGhWaWV3KCl9KX0sU3UucHJvdG90eXBlLmdldE9wYWNpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcGFjaXR5X30sU3UucHJvdG90eXBlLmdldFJvdGF0ZVdpdGhWaWV3PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm90YXRlV2l0aFZpZXdffSxTdS5wcm90b3R5cGUuZ2V0Um90YXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3RhdGlvbl99LFN1LnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNjYWxlX30sU3UucHJvdG90eXBlLmdldFNuYXBUb1BpeGVsPWZ1bmN0aW9uKCl7cmV0dXJuITF9LFN1LnByb3RvdHlwZS5nZXRBbmNob3I9ZnVuY3Rpb24oKXtyZXR1cm4gcigpfSxTdS5wcm90b3R5cGUuZ2V0SW1hZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIHIoKX0sU3UucHJvdG90eXBlLmdldEhpdERldGVjdGlvbkltYWdlPWZ1bmN0aW9uKHQpe3JldHVybiByKCl9LFN1LnByb3RvdHlwZS5nZXRJbWFnZVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHIoKX0sU3UucHJvdG90eXBlLmdldEltYWdlU2l6ZT1mdW5jdGlvbigpe3JldHVybiByKCl9LFN1LnByb3RvdHlwZS5nZXRIaXREZXRlY3Rpb25JbWFnZVNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gcigpfSxTdS5wcm90b3R5cGUuZ2V0T3JpZ2luPWZ1bmN0aW9uKCl7cmV0dXJuIHIoKX0sU3UucHJvdG90eXBlLmdldFNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gcigpfSxTdS5wcm90b3R5cGUuc2V0T3BhY2l0eT1mdW5jdGlvbih0KXt0aGlzLm9wYWNpdHlfPXR9LFN1LnByb3RvdHlwZS5zZXRSb3RhdGVXaXRoVmlldz1mdW5jdGlvbih0KXt0aGlzLnJvdGF0ZVdpdGhWaWV3Xz10fSxTdS5wcm90b3R5cGUuc2V0Um90YXRpb249ZnVuY3Rpb24odCl7dGhpcy5yb3RhdGlvbl89dH0sU3UucHJvdG90eXBlLnNldFNjYWxlPWZ1bmN0aW9uKHQpe3RoaXMuc2NhbGVfPXR9LFN1LnByb3RvdHlwZS5zZXRTbmFwVG9QaXhlbD1mdW5jdGlvbih0KXt9LFN1LnByb3RvdHlwZS5saXN0ZW5JbWFnZUNoYW5nZT1mdW5jdGlvbih0LGUpe3JldHVybiByKCl9LFN1LnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7cigpfSxTdS5wcm90b3R5cGUudW5saXN0ZW5JbWFnZUNoYW5nZT1mdW5jdGlvbih0LGUpe3IoKX07dmFyIFR1PVN1LEN1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9dm9pZCAwIT09ZS5yb3RhdGVXaXRoVmlldyYmZS5yb3RhdGVXaXRoVmlldzt0LmNhbGwodGhpcyx7b3BhY2l0eToxLHJvdGF0ZVdpdGhWaWV3Omkscm90YXRpb246dm9pZCAwIT09ZS5yb3RhdGlvbj9lLnJvdGF0aW9uOjAsc2NhbGU6MX0pLHRoaXMuY2hlY2tzdW1zXz1udWxsLHRoaXMuY2FudmFzXz1udWxsLHRoaXMuaGl0RGV0ZWN0aW9uQ2FudmFzXz1udWxsLHRoaXMuZmlsbF89dm9pZCAwIT09ZS5maWxsP2UuZmlsbDpudWxsLHRoaXMub3JpZ2luXz1bMCwwXSx0aGlzLnBvaW50c189ZS5wb2ludHMsdGhpcy5yYWRpdXNfPXZvaWQgMCE9PWUucmFkaXVzP2UucmFkaXVzOmUucmFkaXVzMSx0aGlzLnJhZGl1czJfPWUucmFkaXVzMix0aGlzLmFuZ2xlXz12b2lkIDAhPT1lLmFuZ2xlP2UuYW5nbGU6MCx0aGlzLnN0cm9rZV89dm9pZCAwIT09ZS5zdHJva2U/ZS5zdHJva2U6bnVsbCx0aGlzLmFuY2hvcl89bnVsbCx0aGlzLnNpemVfPW51bGwsdGhpcy5pbWFnZVNpemVfPW51bGwsdGhpcy5oaXREZXRlY3Rpb25JbWFnZVNpemVfPW51bGwsdGhpcy5hdGxhc01hbmFnZXJfPWUuYXRsYXNNYW5hZ2VyLHRoaXMucmVuZGVyXyh0aGlzLmF0bGFzTWFuYWdlcl8pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBlKHtmaWxsOnRoaXMuZ2V0RmlsbCgpP3RoaXMuZ2V0RmlsbCgpLmNsb25lKCk6dm9pZCAwLHBvaW50czp0aGlzLmdldFBvaW50cygpLHJhZGl1czp0aGlzLmdldFJhZGl1cygpLHJhZGl1czI6dGhpcy5nZXRSYWRpdXMyKCksYW5nbGU6dGhpcy5nZXRBbmdsZSgpLHN0cm9rZTp0aGlzLmdldFN0cm9rZSgpP3RoaXMuZ2V0U3Ryb2tlKCkuY2xvbmUoKTp2b2lkIDAscm90YXRpb246dGhpcy5nZXRSb3RhdGlvbigpLHJvdGF0ZVdpdGhWaWV3OnRoaXMuZ2V0Um90YXRlV2l0aFZpZXcoKSxhdGxhc01hbmFnZXI6dGhpcy5hdGxhc01hbmFnZXJffSk7cmV0dXJuIHQuc2V0T3BhY2l0eSh0aGlzLmdldE9wYWNpdHkoKSksdC5zZXRTY2FsZSh0aGlzLmdldFNjYWxlKCkpLHR9LGUucHJvdG90eXBlLmdldEFuY2hvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFuY2hvcl99LGUucHJvdG90eXBlLmdldEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYW5nbGVffSxlLnByb3RvdHlwZS5nZXRGaWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbF99LGUucHJvdG90eXBlLmdldEhpdERldGVjdGlvbkltYWdlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmhpdERldGVjdGlvbkNhbnZhc199LGUucHJvdG90eXBlLmdldEltYWdlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNhbnZhc199LGUucHJvdG90eXBlLmdldEltYWdlU2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmltYWdlU2l6ZV99LGUucHJvdG90eXBlLmdldEhpdERldGVjdGlvbkltYWdlU2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpdERldGVjdGlvbkltYWdlU2l6ZV99LGUucHJvdG90eXBlLmdldEltYWdlU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4geHMuTE9BREVEfSxlLnByb3RvdHlwZS5nZXRPcmlnaW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcmlnaW5ffSxlLnByb3RvdHlwZS5nZXRQb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb2ludHNffSxlLnByb3RvdHlwZS5nZXRSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYWRpdXNffSxlLnByb3RvdHlwZS5nZXRSYWRpdXMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFkaXVzMl99LGUucHJvdG90eXBlLmdldFNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaXplX30sZS5wcm90b3R5cGUuZ2V0U3Ryb2tlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3Ryb2tlX30sZS5wcm90b3R5cGUubGlzdGVuSW1hZ2VDaGFuZ2U9ZnVuY3Rpb24odCxlKXt9LGUucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLnVubGlzdGVuSW1hZ2VDaGFuZ2U9ZnVuY3Rpb24odCxlKXt9LGUucHJvdG90eXBlLnJlbmRlcl89ZnVuY3Rpb24odCl7dmFyIGUsaSxyPSIiLG49IiIsbz0wLHM9bnVsbCxhPTAsaD0wO3RoaXMuc3Ryb2tlXyYmKG51bGw9PT0oaT10aGlzLnN0cm9rZV8uZ2V0Q29sb3IoKSkmJihpPUxzKSxpPVlzKGkpLHZvaWQgMD09PShoPXRoaXMuc3Ryb2tlXy5nZXRXaWR0aCgpKSYmKGg9MSkscz10aGlzLnN0cm9rZV8uZ2V0TGluZURhc2goKSxhPXRoaXMuc3Ryb2tlXy5nZXRMaW5lRGFzaE9mZnNldCgpLGtpfHwocz1udWxsLGE9MCksdm9pZCAwPT09KG49dGhpcy5zdHJva2VfLmdldExpbmVKb2luKCkpJiYobj0icm91bmQiKSx2b2lkIDA9PT0ocj10aGlzLnN0cm9rZV8uZ2V0TGluZUNhcCgpKSYmKHI9InJvdW5kIiksdm9pZCAwPT09KG89dGhpcy5zdHJva2VfLmdldE1pdGVyTGltaXQoKSkmJihvPTEwKSk7dmFyIGw9MioodGhpcy5yYWRpdXNfK2gpKzEsdT17c3Ryb2tlU3R5bGU6aSxzdHJva2VXaWR0aDpoLHNpemU6bCxsaW5lQ2FwOnIsbGluZURhc2g6cyxsaW5lRGFzaE9mZnNldDphLGxpbmVKb2luOm4sbWl0ZXJMaW1pdDpvfTtpZih2b2lkIDA9PT10KXt2YXIgcD1KbihsLGwpO3RoaXMuY2FudmFzXz1wLmNhbnZhcyxlPWw9dGhpcy5jYW52YXNfLndpZHRoLHRoaXMuZHJhd18odSxwLDAsMCksdGhpcy5jcmVhdGVIaXREZXRlY3Rpb25DYW52YXNfKHUpfWVsc2V7bD1NYXRoLnJvdW5kKGwpO3ZhciBjLGQ9IXRoaXMuZmlsbF87ZCYmKGM9dGhpcy5kcmF3SGl0RGV0ZWN0aW9uQ2FudmFzXy5iaW5kKHRoaXMsdSkpO3ZhciBmPXRoaXMuZ2V0Q2hlY2tzdW0oKSxfPXQuYWRkKGYsbCxsLHRoaXMuZHJhd18uYmluZCh0aGlzLHUpLGMpO3RoaXMuY2FudmFzXz1fLmltYWdlLHRoaXMub3JpZ2luXz1bXy5vZmZzZXRYLF8ub2Zmc2V0WV0sZT1fLmltYWdlLndpZHRoLGQ/KHRoaXMuaGl0RGV0ZWN0aW9uQ2FudmFzXz1fLmhpdEltYWdlLHRoaXMuaGl0RGV0ZWN0aW9uSW1hZ2VTaXplXz1bXy5oaXRJbWFnZS53aWR0aCxfLmhpdEltYWdlLmhlaWdodF0pOih0aGlzLmhpdERldGVjdGlvbkNhbnZhc189dGhpcy5jYW52YXNfLHRoaXMuaGl0RGV0ZWN0aW9uSW1hZ2VTaXplXz1bZSxlXSl9dGhpcy5hbmNob3JfPVtsLzIsbC8yXSx0aGlzLnNpemVfPVtsLGxdLHRoaXMuaW1hZ2VTaXplXz1bZSxlXX0sZS5wcm90b3R5cGUuZHJhd189ZnVuY3Rpb24odCxlLGkscil7dmFyIG4sbyxzO2Uuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxlLnRyYW5zbGF0ZShpLHIpLGUuYmVnaW5QYXRoKCk7dmFyIGE9dGhpcy5wb2ludHNfO2lmKGE9PT0xLzApZS5hcmModC5zaXplLzIsdC5zaXplLzIsdGhpcy5yYWRpdXNfLDAsMipNYXRoLlBJLCEwKTtlbHNle3ZhciBoPXZvaWQgMCE9PXRoaXMucmFkaXVzMl8/dGhpcy5yYWRpdXMyXzp0aGlzLnJhZGl1c187Zm9yKGghPT10aGlzLnJhZGl1c18mJihhKj0yKSxuPTA7bjw9YTtuKyspbz0yKm4qTWF0aC5QSS9hLU1hdGguUEkvMit0aGlzLmFuZ2xlXyxzPW4lMj09MD90aGlzLnJhZGl1c186aCxlLmxpbmVUbyh0LnNpemUvMitzKk1hdGguY29zKG8pLHQuc2l6ZS8yK3MqTWF0aC5zaW4obykpfWlmKHRoaXMuZmlsbF8pe3ZhciBsPXRoaXMuZmlsbF8uZ2V0Q29sb3IoKTtudWxsPT09bCYmKGw9d3MpLGUuZmlsbFN0eWxlPVlzKGwpLGUuZmlsbCgpfXRoaXMuc3Ryb2tlXyYmKGUuc3Ryb2tlU3R5bGU9dC5zdHJva2VTdHlsZSxlLmxpbmVXaWR0aD10LnN0cm9rZVdpZHRoLHQubGluZURhc2gmJihlLnNldExpbmVEYXNoKHQubGluZURhc2gpLGUubGluZURhc2hPZmZzZXQ9dC5saW5lRGFzaE9mZnNldCksZS5saW5lQ2FwPXQubGluZUNhcCxlLmxpbmVKb2luPXQubGluZUpvaW4sZS5taXRlckxpbWl0PXQubWl0ZXJMaW1pdCxlLnN0cm9rZSgpKSxlLmNsb3NlUGF0aCgpfSxlLnByb3RvdHlwZS5jcmVhdGVIaXREZXRlY3Rpb25DYW52YXNfPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaGl0RGV0ZWN0aW9uSW1hZ2VTaXplXz1bdC5zaXplLHQuc2l6ZV0sdGhpcy5maWxsXyl0aGlzLmhpdERldGVjdGlvbkNhbnZhc189dGhpcy5jYW52YXNfO2Vsc2V7dmFyIGU9Sm4odC5zaXplLHQuc2l6ZSk7dGhpcy5oaXREZXRlY3Rpb25DYW52YXNfPWUuY2FudmFzLHRoaXMuZHJhd0hpdERldGVjdGlvbkNhbnZhc18odCxlLDAsMCl9fSxlLnByb3RvdHlwZS5kcmF3SGl0RGV0ZWN0aW9uQ2FudmFzXz1mdW5jdGlvbih0LGUsaSxyKXtlLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksZS50cmFuc2xhdGUoaSxyKSxlLmJlZ2luUGF0aCgpO3ZhciBuPXRoaXMucG9pbnRzXztpZihuPT09MS8wKWUuYXJjKHQuc2l6ZS8yLHQuc2l6ZS8yLHRoaXMucmFkaXVzXywwLDIqTWF0aC5QSSwhMCk7ZWxzZXt2YXIgbyxzLGEsaD12b2lkIDAhPT10aGlzLnJhZGl1czJfP3RoaXMucmFkaXVzMl86dGhpcy5yYWRpdXNfO2ZvcihoIT09dGhpcy5yYWRpdXNfJiYobio9Miksbz0wO288PW47bysrKWE9MipvKk1hdGguUEkvbi1NYXRoLlBJLzIrdGhpcy5hbmdsZV8scz1vJTI9PTA/dGhpcy5yYWRpdXNfOmgsZS5saW5lVG8odC5zaXplLzIrcypNYXRoLmNvcyhhKSx0LnNpemUvMitzKk1hdGguc2luKGEpKX1lLmZpbGxTdHlsZT1kcih3cyksZS5maWxsKCksdGhpcy5zdHJva2VfJiYoZS5zdHJva2VTdHlsZT10LnN0cm9rZVN0eWxlLGUubGluZVdpZHRoPXQuc3Ryb2tlV2lkdGgsdC5saW5lRGFzaCYmKGUuc2V0TGluZURhc2godC5saW5lRGFzaCksZS5saW5lRGFzaE9mZnNldD10LmxpbmVEYXNoT2Zmc2V0KSxlLnN0cm9rZSgpKSxlLmNsb3NlUGF0aCgpfSxlLnByb3RvdHlwZS5nZXRDaGVja3N1bT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3Ryb2tlXz90aGlzLnN0cm9rZV8uZ2V0Q2hlY2tzdW0oKToiLSIsZT10aGlzLmZpbGxfP3RoaXMuZmlsbF8uZ2V0Q2hlY2tzdW0oKToiLSI7aWYoIXRoaXMuY2hlY2tzdW1zX3x8dCE9dGhpcy5jaGVja3N1bXNfWzFdfHxlIT10aGlzLmNoZWNrc3Vtc19bMl18fHRoaXMucmFkaXVzXyE9dGhpcy5jaGVja3N1bXNfWzNdfHx0aGlzLnJhZGl1czJfIT10aGlzLmNoZWNrc3Vtc19bNF18fHRoaXMuYW5nbGVfIT10aGlzLmNoZWNrc3Vtc19bNV18fHRoaXMucG9pbnRzXyE9dGhpcy5jaGVja3N1bXNfWzZdKXt2YXIgaT0iciIrdCtlKyh2b2lkIDAhPT10aGlzLnJhZGl1c18/dGhpcy5yYWRpdXNfLnRvU3RyaW5nKCk6Ii0iKSsodm9pZCAwIT09dGhpcy5yYWRpdXMyXz90aGlzLnJhZGl1czJfLnRvU3RyaW5nKCk6Ii0iKSsodm9pZCAwIT09dGhpcy5hbmdsZV8/dGhpcy5hbmdsZV8udG9TdHJpbmcoKToiLSIpKyh2b2lkIDAhPT10aGlzLnBvaW50c18/dGhpcy5wb2ludHNfLnRvU3RyaW5nKCk6Ii0iKTt0aGlzLmNoZWNrc3Vtc189W2ksdCxlLHRoaXMucmFkaXVzXyx0aGlzLnJhZGl1czJfLHRoaXMuYW5nbGVfLHRoaXMucG9pbnRzX119cmV0dXJuIHRoaXMuY2hlY2tzdW1zX1swXX0sZX0oVHUpLFJ1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e307dC5jYWxsKHRoaXMse3BvaW50czoxLzAsZmlsbDppLmZpbGwscmFkaXVzOmkucmFkaXVzLHN0cm9rZTppLnN0cm9rZSxhdGxhc01hbmFnZXI6aS5hdGxhc01hbmFnZXJ9KX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgZSh7ZmlsbDp0aGlzLmdldEZpbGwoKT90aGlzLmdldEZpbGwoKS5jbG9uZSgpOnZvaWQgMCxzdHJva2U6dGhpcy5nZXRTdHJva2UoKT90aGlzLmdldFN0cm9rZSgpLmNsb25lKCk6dm9pZCAwLHJhZGl1czp0aGlzLmdldFJhZGl1cygpLGF0bGFzTWFuYWdlcjp0aGlzLmF0bGFzTWFuYWdlcl99KTtyZXR1cm4gdC5zZXRPcGFjaXR5KHRoaXMuZ2V0T3BhY2l0eSgpKSx0LnNldFNjYWxlKHRoaXMuZ2V0U2NhbGUoKSksdH0sZS5wcm90b3R5cGUuc2V0UmFkaXVzPWZ1bmN0aW9uKHQpe3RoaXMucmFkaXVzXz10LHRoaXMucmVuZGVyXyh0aGlzLmF0bGFzTWFuYWdlcl8pfSxlfShDdSksd3U9e0ZSQUNUSU9OOiJmcmFjdGlvbiIsUElYRUxTOiJwaXhlbHMifSxJdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4sbyxzKXt0LmNhbGwodGhpcyksdGhpcy5oaXREZXRlY3Rpb25JbWFnZV89bnVsbCx0aGlzLmltYWdlXz1lfHxuZXcgSW1hZ2UsbnVsbCE9PW4mJih0aGlzLmltYWdlXy5jcm9zc09yaWdpbj1uKSx0aGlzLmNhbnZhc189cz9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTpudWxsLHRoaXMuY29sb3JfPXMsdGhpcy5pbWFnZUxpc3RlbmVyS2V5c189bnVsbCx0aGlzLmltYWdlU3RhdGVfPW8sdGhpcy5zaXplXz1yLHRoaXMuc3JjXz1pLHRoaXMudGFpbnRlZF99cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzVGFpbnRlZF89ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzLnRhaW50ZWRfJiZ0aGlzLmltYWdlU3RhdGVfPT09eHMuTE9BREVEKXt0aGlzLnRhaW50ZWRfPSExO3ZhciB0PUpuKDEsMSk7dHJ5e3QuZHJhd0ltYWdlKHRoaXMuaW1hZ2VfLDAsMCksdC5nZXRJbWFnZURhdGEoMCwwLDEsMSl9Y2F0Y2godCl7dGhpcy50YWludGVkXz0hMH19cmV0dXJuITA9PT10aGlzLnRhaW50ZWRffSxlLnByb3RvdHlwZS5kaXNwYXRjaENoYW5nZUV2ZW50Xz1mdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudChNLkNIQU5HRSl9LGUucHJvdG90eXBlLmhhbmRsZUltYWdlRXJyb3JfPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZVN0YXRlXz14cy5FUlJPUix0aGlzLnVubGlzdGVuSW1hZ2VfKCksdGhpcy5kaXNwYXRjaENoYW5nZUV2ZW50XygpfSxlLnByb3RvdHlwZS5oYW5kbGVJbWFnZUxvYWRfPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZVN0YXRlXz14cy5MT0FERUQsdGhpcy5zaXplXyYmKHRoaXMuaW1hZ2VfLndpZHRoPXRoaXMuc2l6ZV9bMF0sdGhpcy5pbWFnZV8uaGVpZ2h0PXRoaXMuc2l6ZV9bMV0pLHRoaXMuc2l6ZV89W3RoaXMuaW1hZ2VfLndpZHRoLHRoaXMuaW1hZ2VfLmhlaWdodF0sdGhpcy51bmxpc3RlbkltYWdlXygpLHRoaXMucmVwbGFjZUNvbG9yXygpLHRoaXMuZGlzcGF0Y2hDaGFuZ2VFdmVudF8oKX0sZS5wcm90b3R5cGUuZ2V0SW1hZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2FudmFzXz90aGlzLmNhbnZhc186dGhpcy5pbWFnZV99LGUucHJvdG90eXBlLmdldEltYWdlU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbWFnZVN0YXRlX30sZS5wcm90b3R5cGUuZ2V0SGl0RGV0ZWN0aW9uSW1hZ2U9ZnVuY3Rpb24odCl7aWYoIXRoaXMuaGl0RGV0ZWN0aW9uSW1hZ2VfKWlmKHRoaXMuaXNUYWludGVkXygpKXt2YXIgZT10aGlzLnNpemVfWzBdLGk9dGhpcy5zaXplX1sxXSxyPUpuKGUsaSk7ci5maWxsUmVjdCgwLDAsZSxpKSx0aGlzLmhpdERldGVjdGlvbkltYWdlXz1yLmNhbnZhc31lbHNlIHRoaXMuaGl0RGV0ZWN0aW9uSW1hZ2VfPXRoaXMuaW1hZ2VfO3JldHVybiB0aGlzLmhpdERldGVjdGlvbkltYWdlX30sZS5wcm90b3R5cGUuZ2V0U2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNpemVffSxlLnByb3RvdHlwZS5nZXRTcmM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zcmNffSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7aWYodGhpcy5pbWFnZVN0YXRlXz09eHMuSURMRSl7dGhpcy5pbWFnZVN0YXRlXz14cy5MT0FESU5HLHRoaXMuaW1hZ2VMaXN0ZW5lcktleXNfPVttKHRoaXMuaW1hZ2VfLE0uRVJST1IsdGhpcy5oYW5kbGVJbWFnZUVycm9yXyx0aGlzKSxtKHRoaXMuaW1hZ2VfLE0uTE9BRCx0aGlzLmhhbmRsZUltYWdlTG9hZF8sdGhpcyldO3RyeXt0aGlzLmltYWdlXy5zcmM9dGhpcy5zcmNffWNhdGNoKHQpe3RoaXMuaGFuZGxlSW1hZ2VFcnJvcl8oKX19fSxlLnByb3RvdHlwZS5yZXBsYWNlQ29sb3JfPWZ1bmN0aW9uKCl7aWYodGhpcy5jb2xvcl8mJiF0aGlzLmlzVGFpbnRlZF8oKSl7dGhpcy5jYW52YXNfLndpZHRoPXRoaXMuaW1hZ2VfLndpZHRoLHRoaXMuY2FudmFzXy5oZWlnaHQ9dGhpcy5pbWFnZV8uaGVpZ2h0O3ZhciB0PXRoaXMuY2FudmFzXy5nZXRDb250ZXh0KCIyZCIpO3QuZHJhd0ltYWdlKHRoaXMuaW1hZ2VfLDAsMCk7Zm9yKHZhciBlPXQuZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLmltYWdlXy53aWR0aCx0aGlzLmltYWdlXy5oZWlnaHQpLGk9ZS5kYXRhLHI9dGhpcy5jb2xvcl9bMF0vMjU1LG49dGhpcy5jb2xvcl9bMV0vMjU1LG89dGhpcy5jb2xvcl9bMl0vMjU1LHM9MCxhPWkubGVuZ3RoO3M8YTtzKz00KWlbc10qPXIsaVtzKzFdKj1uLGlbcysyXSo9bzt0LnB1dEltYWdlRGF0YShlLDAsMCl9fSxlLnByb3RvdHlwZS51bmxpc3RlbkltYWdlXz1mdW5jdGlvbigpe3RoaXMuaW1hZ2VMaXN0ZW5lcktleXNfLmZvckVhY2goRSksdGhpcy5pbWFnZUxpc3RlbmVyS2V5c189bnVsbH0sZX0oYik7dmFyIEx1PXtCT1RUT01fTEVGVDoiYm90dG9tLWxlZnQiLEJPVFRPTV9SSUdIVDoiYm90dG9tLXJpZ2h0IixUT1BfTEVGVDoidG9wLWxlZnQiLFRPUF9SSUdIVDoidG9wLXJpZ2h0In0sT3U9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fSxyPXZvaWQgMCE9PWkub3BhY2l0eT9pLm9wYWNpdHk6MSxuPXZvaWQgMCE9PWkucm90YXRpb24/aS5yb3RhdGlvbjowLHM9dm9pZCAwIT09aS5zY2FsZT9pLnNjYWxlOjEsYT12b2lkIDAhPT1pLnJvdGF0ZVdpdGhWaWV3JiZpLnJvdGF0ZVdpdGhWaWV3O3QuY2FsbCh0aGlzLHtvcGFjaXR5OnIscm90YXRpb246bixzY2FsZTpzLHJvdGF0ZVdpdGhWaWV3OmF9KSx0aGlzLmFuY2hvcl89dm9pZCAwIT09aS5hbmNob3I/aS5hbmNob3I6Wy41LC41XSx0aGlzLm5vcm1hbGl6ZWRBbmNob3JfPW51bGwsdGhpcy5hbmNob3JPcmlnaW5fPXZvaWQgMCE9PWkuYW5jaG9yT3JpZ2luP2kuYW5jaG9yT3JpZ2luOkx1LlRPUF9MRUZULHRoaXMuYW5jaG9yWFVuaXRzXz12b2lkIDAhPT1pLmFuY2hvclhVbml0cz9pLmFuY2hvclhVbml0czp3dS5GUkFDVElPTix0aGlzLmFuY2hvcllVbml0c189dm9pZCAwIT09aS5hbmNob3JZVW5pdHM/aS5hbmNob3JZVW5pdHM6d3UuRlJBQ1RJT04sdGhpcy5jcm9zc09yaWdpbl89dm9pZCAwIT09aS5jcm9zc09yaWdpbj9pLmNyb3NzT3JpZ2luOm51bGw7dmFyIGg9dm9pZCAwIT09aS5pbWc/aS5pbWc6bnVsbCxsPXZvaWQgMCE9PWkuaW1nU2l6ZT9pLmltZ1NpemU6bnVsbCx1PWkuc3JjO1koISh2b2lkIDAhPT11JiZoKSw0KSxZKCFofHxoJiZsLDUpLHZvaWQgMCE9PXUmJjAhPT11Lmxlbmd0aHx8IWh8fCh1PWguc3JjfHxvKGgpKSxZKHZvaWQgMCE9PXUmJnUubGVuZ3RoPjAsNik7dmFyIHA9dm9pZCAwIT09aS5zcmM/eHMuSURMRTp4cy5MT0FERUQ7dGhpcy5jb2xvcl89dm9pZCAwIT09aS5jb2xvcj9fcihpLmNvbG9yKTpudWxsLHRoaXMuaWNvbkltYWdlXz1mdW5jdGlvbih0LGUsaSxyLG4sbyl7dmFyIHM9S3MuZ2V0KGUscixvKTtyZXR1cm4gc3x8KHM9bmV3IEl1KHQsZSxpLHIsbixvKSxLcy5zZXQoZSxyLG8scykpLHN9KGgsdSxsLHRoaXMuY3Jvc3NPcmlnaW5fLHAsdGhpcy5jb2xvcl8pLHRoaXMub2Zmc2V0Xz12b2lkIDAhPT1pLm9mZnNldD9pLm9mZnNldDpbMCwwXSx0aGlzLm9mZnNldE9yaWdpbl89dm9pZCAwIT09aS5vZmZzZXRPcmlnaW4/aS5vZmZzZXRPcmlnaW46THUuVE9QX0xFRlQsdGhpcy5vcmlnaW5fPW51bGwsdGhpcy5zaXplXz12b2lkIDAhPT1pLnNpemU/aS5zaXplOm51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHthbmNob3I6dGhpcy5hbmNob3JfLnNsaWNlKCksYW5jaG9yT3JpZ2luOnRoaXMuYW5jaG9yT3JpZ2luXyxhbmNob3JYVW5pdHM6dGhpcy5hbmNob3JYVW5pdHNfLGFuY2hvcllVbml0czp0aGlzLmFuY2hvcllVbml0c18sY3Jvc3NPcmlnaW46dGhpcy5jcm9zc09yaWdpbl8sY29sb3I6dGhpcy5jb2xvcl8mJnRoaXMuY29sb3JfLnNsaWNlP3RoaXMuY29sb3JfLnNsaWNlKCk6dGhpcy5jb2xvcl98fHZvaWQgMCxzcmM6dGhpcy5nZXRTcmMoKSxvZmZzZXQ6dGhpcy5vZmZzZXRfLnNsaWNlKCksb2Zmc2V0T3JpZ2luOnRoaXMub2Zmc2V0T3JpZ2luXyxzaXplOm51bGwhPT10aGlzLnNpemVfP3RoaXMuc2l6ZV8uc2xpY2UoKTp2b2lkIDAsb3BhY2l0eTp0aGlzLmdldE9wYWNpdHkoKSxzY2FsZTp0aGlzLmdldFNjYWxlKCkscm90YXRpb246dGhpcy5nZXRSb3RhdGlvbigpLHJvdGF0ZVdpdGhWaWV3OnRoaXMuZ2V0Um90YXRlV2l0aFZpZXcoKX0pfSxlLnByb3RvdHlwZS5nZXRBbmNob3I9ZnVuY3Rpb24oKXtpZih0aGlzLm5vcm1hbGl6ZWRBbmNob3JfKXJldHVybiB0aGlzLm5vcm1hbGl6ZWRBbmNob3JfO3ZhciB0PXRoaXMuYW5jaG9yXyxlPXRoaXMuZ2V0U2l6ZSgpO2lmKHRoaXMuYW5jaG9yWFVuaXRzXz09d3UuRlJBQ1RJT058fHRoaXMuYW5jaG9yWVVuaXRzXz09d3UuRlJBQ1RJT04pe2lmKCFlKXJldHVybiBudWxsO3Q9dGhpcy5hbmNob3JfLnNsaWNlKCksdGhpcy5hbmNob3JYVW5pdHNfPT13dS5GUkFDVElPTiYmKHRbMF0qPWVbMF0pLHRoaXMuYW5jaG9yWVVuaXRzXz09d3UuRlJBQ1RJT04mJih0WzFdKj1lWzFdKX1pZih0aGlzLmFuY2hvck9yaWdpbl8hPUx1LlRPUF9MRUZUKXtpZighZSlyZXR1cm4gbnVsbDt0PT09dGhpcy5hbmNob3JfJiYodD10aGlzLmFuY2hvcl8uc2xpY2UoKSksdGhpcy5hbmNob3JPcmlnaW5fIT1MdS5UT1BfUklHSFQmJnRoaXMuYW5jaG9yT3JpZ2luXyE9THUuQk9UVE9NX1JJR0hUfHwodFswXT0tdFswXStlWzBdKSx0aGlzLmFuY2hvck9yaWdpbl8hPUx1LkJPVFRPTV9MRUZUJiZ0aGlzLmFuY2hvck9yaWdpbl8hPUx1LkJPVFRPTV9SSUdIVHx8KHRbMV09LXRbMV0rZVsxXSl9cmV0dXJuIHRoaXMubm9ybWFsaXplZEFuY2hvcl89dCx0aGlzLm5vcm1hbGl6ZWRBbmNob3JffSxlLnByb3RvdHlwZS5zZXRBbmNob3I9ZnVuY3Rpb24odCl7dGhpcy5hbmNob3JfPXQsdGhpcy5ub3JtYWxpemVkQW5jaG9yXz1udWxsfSxlLnByb3RvdHlwZS5nZXRDb2xvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbG9yX30sZS5wcm90b3R5cGUuZ2V0SW1hZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaWNvbkltYWdlXy5nZXRJbWFnZSh0KX0sZS5wcm90b3R5cGUuZ2V0SW1hZ2VTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWNvbkltYWdlXy5nZXRTaXplKCl9LGUucHJvdG90eXBlLmdldEhpdERldGVjdGlvbkltYWdlU2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEltYWdlU2l6ZSgpfSxlLnByb3RvdHlwZS5nZXRJbWFnZVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWNvbkltYWdlXy5nZXRJbWFnZVN0YXRlKCl9LGUucHJvdG90eXBlLmdldEhpdERldGVjdGlvbkltYWdlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmljb25JbWFnZV8uZ2V0SGl0RGV0ZWN0aW9uSW1hZ2UodCl9LGUucHJvdG90eXBlLmdldE9yaWdpbj1mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luXylyZXR1cm4gdGhpcy5vcmlnaW5fO3ZhciB0PXRoaXMub2Zmc2V0XztpZih0aGlzLm9mZnNldE9yaWdpbl8hPUx1LlRPUF9MRUZUKXt2YXIgZT10aGlzLmdldFNpemUoKSxpPXRoaXMuaWNvbkltYWdlXy5nZXRTaXplKCk7aWYoIWV8fCFpKXJldHVybiBudWxsO3Q9dC5zbGljZSgpLHRoaXMub2Zmc2V0T3JpZ2luXyE9THUuVE9QX1JJR0hUJiZ0aGlzLm9mZnNldE9yaWdpbl8hPUx1LkJPVFRPTV9SSUdIVHx8KHRbMF09aVswXS1lWzBdLXRbMF0pLHRoaXMub2Zmc2V0T3JpZ2luXyE9THUuQk9UVE9NX0xFRlQmJnRoaXMub2Zmc2V0T3JpZ2luXyE9THUuQk9UVE9NX1JJR0hUfHwodFsxXT1pWzFdLWVbMV0tdFsxXSl9cmV0dXJuIHRoaXMub3JpZ2luXz10LHRoaXMub3JpZ2luX30sZS5wcm90b3R5cGUuZ2V0U3JjPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWNvbkltYWdlXy5nZXRTcmMoKX0sZS5wcm90b3R5cGUuZ2V0U2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNpemVfP3RoaXMuc2l6ZV86dGhpcy5pY29uSW1hZ2VfLmdldFNpemUoKX0sZS5wcm90b3R5cGUubGlzdGVuSW1hZ2VDaGFuZ2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdih0aGlzLmljb25JbWFnZV8sTS5DSEFOR0UsdCxlKX0sZS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3RoaXMuaWNvbkltYWdlXy5sb2FkKCl9LGUucHJvdG90eXBlLnVubGlzdGVuSW1hZ2VDaGFuZ2U9ZnVuY3Rpb24odCxlKXt4KHRoaXMuaWNvbkltYWdlXyxNLkNIQU5HRSx0LGUpfSxlfShUdSksUHU9ZnVuY3Rpb24odCl7dmFyIGU9dHx8e307dGhpcy5nZW9tZXRyeV89bnVsbCx0aGlzLmdlb21ldHJ5RnVuY3Rpb25fPUF1LHZvaWQgMCE9PWUuZ2VvbWV0cnkmJnRoaXMuc2V0R2VvbWV0cnkoZS5nZW9tZXRyeSksdGhpcy5maWxsXz12b2lkIDAhPT1lLmZpbGw/ZS5maWxsOm51bGwsdGhpcy5pbWFnZV89dm9pZCAwIT09ZS5pbWFnZT9lLmltYWdlOm51bGwsdGhpcy5yZW5kZXJlcl89dm9pZCAwIT09ZS5yZW5kZXJlcj9lLnJlbmRlcmVyOm51bGwsdGhpcy5zdHJva2VfPXZvaWQgMCE9PWUuc3Ryb2tlP2Uuc3Ryb2tlOm51bGwsdGhpcy50ZXh0Xz12b2lkIDAhPT1lLnRleHQ/ZS50ZXh0Om51bGwsdGhpcy56SW5kZXhfPWUuekluZGV4fTtQdS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEdlb21ldHJ5KCk7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmKHQ9dC5jbG9uZSgpKSxuZXcgUHUoe2dlb21ldHJ5OnQsZmlsbDp0aGlzLmdldEZpbGwoKT90aGlzLmdldEZpbGwoKS5jbG9uZSgpOnZvaWQgMCxpbWFnZTp0aGlzLmdldEltYWdlKCk/dGhpcy5nZXRJbWFnZSgpLmNsb25lKCk6dm9pZCAwLHN0cm9rZTp0aGlzLmdldFN0cm9rZSgpP3RoaXMuZ2V0U3Ryb2tlKCkuY2xvbmUoKTp2b2lkIDAsdGV4dDp0aGlzLmdldFRleHQoKT90aGlzLmdldFRleHQoKS5jbG9uZSgpOnZvaWQgMCx6SW5kZXg6dGhpcy5nZXRaSW5kZXgoKX0pfSxQdS5wcm90b3R5cGUuZ2V0UmVuZGVyZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlcl99LFB1LnByb3RvdHlwZS5zZXRSZW5kZXJlcj1mdW5jdGlvbih0KXt0aGlzLnJlbmRlcmVyXz10fSxQdS5wcm90b3R5cGUuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZW9tZXRyeV99LFB1LnByb3RvdHlwZS5nZXRHZW9tZXRyeUZ1bmN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGdW5jdGlvbl99LFB1LnByb3RvdHlwZS5nZXRGaWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbF99LFB1LnByb3RvdHlwZS5zZXRGaWxsPWZ1bmN0aW9uKHQpe3RoaXMuZmlsbF89dH0sUHUucHJvdG90eXBlLmdldEltYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW1hZ2VffSxQdS5wcm90b3R5cGUuc2V0SW1hZ2U9ZnVuY3Rpb24odCl7dGhpcy5pbWFnZV89dH0sUHUucHJvdG90eXBlLmdldFN0cm9rZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cm9rZV99LFB1LnByb3RvdHlwZS5zZXRTdHJva2U9ZnVuY3Rpb24odCl7dGhpcy5zdHJva2VfPXR9LFB1LnByb3RvdHlwZS5nZXRUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dF99LFB1LnByb3RvdHlwZS5zZXRUZXh0PWZ1bmN0aW9uKHQpe3RoaXMudGV4dF89dH0sUHUucHJvdG90eXBlLmdldFpJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnpJbmRleF99LFB1LnByb3RvdHlwZS5zZXRHZW9tZXRyeT1mdW5jdGlvbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLmdlb21ldHJ5RnVuY3Rpb25fPXQ6InN0cmluZyI9PXR5cGVvZiB0P3RoaXMuZ2VvbWV0cnlGdW5jdGlvbl89ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KHQpfTp0P3ZvaWQgMCE9PXQmJih0aGlzLmdlb21ldHJ5RnVuY3Rpb25fPWZ1bmN0aW9uKCl7cmV0dXJuIHR9KTp0aGlzLmdlb21ldHJ5RnVuY3Rpb25fPUF1LHRoaXMuZ2VvbWV0cnlfPXR9LFB1LnByb3RvdHlwZS5zZXRaSW5kZXg9ZnVuY3Rpb24odCl7dGhpcy56SW5kZXhfPXR9O3ZhciBidT1udWxsO2Z1bmN0aW9uIE11KHQsZSl7aWYoIWJ1KXt2YXIgaT1uZXcgbXIoe2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkifSkscj1uZXcgRXIoe2NvbG9yOiIjMzM5OUNDIix3aWR0aDoxLjI1fSk7YnU9W25ldyBQdSh7aW1hZ2U6bmV3IFJ1KHtmaWxsOmksc3Ryb2tlOnIscmFkaXVzOjV9KSxmaWxsOmksc3Ryb2tlOnJ9KV19cmV0dXJuIGJ1fWZ1bmN0aW9uIEZ1KCl7dmFyIHQ9e30sZT1bMjU1LDI1NSwyNTUsMV0saT1bMCwxNTMsMjU1LDFdO3JldHVybiB0W050LlBPTFlHT05dPVtuZXcgUHUoe2ZpbGw6bmV3IG1yKHtjb2xvcjpbMjU1LDI1NSwyNTUsLjVdfSl9KV0sdFtOdC5NVUxUSV9QT0xZR09OXT10W050LlBPTFlHT05dLHRbTnQuTElORV9TVFJJTkddPVtuZXcgUHUoe3N0cm9rZTpuZXcgRXIoe2NvbG9yOmUsd2lkdGg6NX0pfSksbmV3IFB1KHtzdHJva2U6bmV3IEVyKHtjb2xvcjppLHdpZHRoOjN9KX0pXSx0W050Lk1VTFRJX0xJTkVfU1RSSU5HXT10W050LkxJTkVfU1RSSU5HXSx0W050LkNJUkNMRV09dFtOdC5QT0xZR09OXS5jb25jYXQodFtOdC5MSU5FX1NUUklOR10pLHRbTnQuUE9JTlRdPVtuZXcgUHUoe2ltYWdlOm5ldyBSdSh7cmFkaXVzOjYsZmlsbDpuZXcgbXIoe2NvbG9yOml9KSxzdHJva2U6bmV3IEVyKHtjb2xvcjplLHdpZHRoOjEuNX0pfSksekluZGV4OjEvMH0pXSx0W050Lk1VTFRJX1BPSU5UXT10W050LlBPSU5UXSx0W050LkdFT01FVFJZX0NPTExFQ1RJT05dPXRbTnQuUE9MWUdPTl0uY29uY2F0KHRbTnQuTElORV9TVFJJTkddLHRbTnQuUE9JTlRdKSx0fWZ1bmN0aW9uIEF1KHQpe3JldHVybiB0LmdldEdlb21ldHJ5KCl9dmFyIE51PVB1O2Z1bmN0aW9uIEd1KHQsZSl7dmFyIGk9L1x7elx9L2cscj0vXHt4XH0vZyxuPS9ce3lcfS9nLG89L1x7LXlcfS9nO3JldHVybiBmdW5jdGlvbihzLGEsaCl7cmV0dXJuIHM/dC5yZXBsYWNlKGksc1swXS50b1N0cmluZygpKS5yZXBsYWNlKHIsc1sxXS50b1N0cmluZygpKS5yZXBsYWNlKG4sZnVuY3Rpb24oKXtyZXR1cm4oLXNbMl0tMSkudG9TdHJpbmcoKX0pLnJlcGxhY2UobyxmdW5jdGlvbigpe3ZhciB0PXNbMF0saT1lLmdldEZ1bGxUaWxlUmFuZ2UodCk7cmV0dXJuIFkoaSw1NSksKGkuZ2V0SGVpZ2h0KCkrc1syXSkudG9TdHJpbmcoKX0pOnZvaWQgMH19ZnVuY3Rpb24gRHUodCxlKXtmb3IodmFyIGk9dC5sZW5ndGgscj1uZXcgQXJyYXkoaSksbj0wO248aTsrK24pcltuXT1HdSh0W25dLGUpO3JldHVybiBrdShyKX1mdW5jdGlvbiBrdSh0KXtyZXR1cm4gMT09PXQubGVuZ3RoP3RbMF06ZnVuY3Rpb24oZSxpLHIpe2lmKGUpe3ZhciBuPVh0KENsKGUpLHQubGVuZ3RoKTtyZXR1cm4gdFtuXShlLGkscil9fX1mdW5jdGlvbiBqdSh0LGUsaSl7fWZ1bmN0aW9uIFV1KHQpe3ZhciBlPVtdLGk9L1x7KFthLXpdKS0oW2Etel0pXH0vLmV4ZWModCk7aWYoaSl7dmFyIHIsbj1pWzFdLmNoYXJDb2RlQXQoMCksbz1pWzJdLmNoYXJDb2RlQXQoMCk7Zm9yKHI9bjtyPD1vOysrcillLnB1c2godC5yZXBsYWNlKGlbMF0sU3RyaW5nLmZyb21DaGFyQ29kZShyKSkpO3JldHVybiBlfWlmKGk9aT0vXHsoXGQrKS0oXGQrKVx9Ly5leGVjKHQpKXtmb3IodmFyIHM9cGFyc2VJbnQoaVsyXSwxMCksYT1wYXJzZUludChpWzFdLDEwKTthPD1zO2ErKyllLnB1c2godC5yZXBsYWNlKGlbMF0sYS50b1N0cmluZygpKSk7cmV0dXJuIGV9cmV0dXJuIGUucHVzaCh0KSxlfWZ1bmN0aW9uIFl1KHQsZSxpLHIpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLHM9Im9sY18iK28oZSk7ZnVuY3Rpb24gYSgpe2RlbGV0ZSB3aW5kb3dbc10sbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pfW4uYXN5bmM9ITAsbi5zcmM9dCsoLTE9PXQuaW5kZXhPZigiPyIpPyI/IjoiJiIpKyhyfHwiY2FsbGJhY2siKSsiPSIrczt2YXIgaD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YSgpLGkmJmkoKX0sMWU0KTt3aW5kb3dbc109ZnVuY3Rpb24odCl7Y2xlYXJUaW1lb3V0KGgpLGEoKSxlKHQpfSxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKG4pfWZ1bmN0aW9uIEJ1KHQsZSxpLHIpe3ZhciBuPVBlKGksZSx0KSxvPVNlKGUscixpKSxzPWUuZ2V0TWV0ZXJzUGVyVW5pdCgpO3ZvaWQgMCE9PXMmJihvKj1zKTt2YXIgYT10LmdldE1ldGVyc1BlclVuaXQoKTt2b2lkIDAhPT1hJiYoby89YSk7dmFyIGg9dC5nZXRFeHRlbnQoKTtpZighaHx8bnQoaCxuKSl7dmFyIGw9U2UodCxvLG4pL287aXNGaW5pdGUobCkmJmw+MCYmKG8vPWwpfXJldHVybiBvfWZ1bmN0aW9uIFZ1KHQsZSxpLHIpe3ZhciBuPWktdCxvPXItZSxzPU1hdGguc3FydChuKm4rbypvKTtyZXR1cm5bTWF0aC5yb3VuZChpK24vcyksTWF0aC5yb3VuZChyK28vcyldfWZ1bmN0aW9uIFh1KHQsZSxpLHIsbixvLHMsYSxoLGwsdSl7dmFyIHA9Sm4oTWF0aC5yb3VuZChpKnQpLE1hdGgucm91bmQoaSplKSk7aWYoMD09PWgubGVuZ3RoKXJldHVybiBwLmNhbnZhcztwLnNjYWxlKGksaSk7dmFyIGM9WzEvMCwxLzAsLTEvMCwtMS8wXTtoLmZvckVhY2goZnVuY3Rpb24odCxlLGkpe2Z0KGMsdC5leHRlbnQpfSk7dmFyIGQ9T3QoYyksZj1SdChjKSxfPUpuKE1hdGgucm91bmQoaSpkL3IpLE1hdGgucm91bmQoaSpmL3IpKSxnPWkvcjtoLmZvckVhY2goZnVuY3Rpb24odCxlLGkpe3ZhciByPXQuZXh0ZW50WzBdLWNbMF0sbj0tKHQuZXh0ZW50WzNdLWNbM10pLG89T3QodC5leHRlbnQpLHM9UnQodC5leHRlbnQpO18uZHJhd0ltYWdlKHQuaW1hZ2UsbCxsLHQuaW1hZ2Uud2lkdGgtMipsLHQuaW1hZ2UuaGVpZ2h0LTIqbCxyKmcsbipnLG8qZyxzKmcpfSk7dmFyIHk9SXQocyk7cmV0dXJuIGEuZ2V0VHJpYW5nbGVzKCkuZm9yRWFjaChmdW5jdGlvbih0LGUsbil7dmFyIHM9dC5zb3VyY2UsYT10LnRhcmdldCxoPXNbMF1bMF0sbD1zWzBdWzFdLHU9c1sxXVswXSxkPXNbMV1bMV0sZj1zWzJdWzBdLGc9c1syXVsxXSx2PShhWzBdWzBdLXlbMF0pL28sbT0tKGFbMF1bMV0teVsxXSkvbyx4PShhWzFdWzBdLXlbMF0pL28sRT0tKGFbMV1bMV0teVsxXSkvbyxTPShhWzJdWzBdLXlbMF0pL28sVD0tKGFbMl1bMV0teVsxXSkvbyxDPWgsUj1sO2g9MCxsPTA7dmFyIHc9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLGk9MDtpPGU7aSsrKXtmb3IodmFyIHI9aSxuPU1hdGguYWJzKHRbaV1baV0pLG89aSsxO288ZTtvKyspe3ZhciBzPU1hdGguYWJzKHRbb11baV0pO3M+biYmKG49cyxyPW8pfWlmKDA9PT1uKXJldHVybiBudWxsO3ZhciBhPXRbcl07dFtyXT10W2ldLHRbaV09YTtmb3IodmFyIGg9aSsxO2g8ZTtoKyspZm9yKHZhciBsPS10W2hdW2ldL3RbaV1baV0sdT1pO3U8ZSsxO3UrKylpPT11P3RbaF1bdV09MDp0W2hdW3VdKz1sKnRbaV1bdV19Zm9yKHZhciBwPW5ldyBBcnJheShlKSxjPWUtMTtjPj0wO2MtLSl7cFtjXT10W2NdW2VdL3RbY11bY107Zm9yKHZhciBkPWMtMTtkPj0wO2QtLSl0W2RdW2VdLT10W2RdW2NdKnBbY119cmV0dXJuIHB9KFtbdS09QyxkLT1SLDAsMCx4LXZdLFtmLT1DLGctPVIsMCwwLFMtdl0sWzAsMCx1LGQsRS1tXSxbMCwwLGYsZyxULW1dXSk7aWYodyl7cC5zYXZlKCkscC5iZWdpblBhdGgoKTt2YXIgST0odit4K1MpLzMsTD0obStFK1QpLzMsTz1WdShJLEwsdixtKSxQPVZ1KEksTCx4LEUpLGI9VnUoSSxMLFMsVCk7cC5tb3ZlVG8oUFswXSxQWzFdKSxwLmxpbmVUbyhPWzBdLE9bMV0pLHAubGluZVRvKGJbMF0sYlsxXSkscC5jbGlwKCkscC50cmFuc2Zvcm0od1swXSx3WzJdLHdbMV0sd1szXSx2LG0pLHAudHJhbnNsYXRlKGNbMF0tQyxjWzNdLVIpLHAuc2NhbGUoci9pLC1yL2kpLHAuZHJhd0ltYWdlKF8uY2FudmFzLDAsMCkscC5yZXN0b3JlKCl9fSksdSYmKHAuc2F2ZSgpLHAuc3Ryb2tlU3R5bGU9ImJsYWNrIixwLmxpbmVXaWR0aD0xLGEuZ2V0VHJpYW5nbGVzKCkuZm9yRWFjaChmdW5jdGlvbih0LGUsaSl7dmFyIHI9dC50YXJnZXQsbj0oclswXVswXS15WzBdKS9vLHM9LShyWzBdWzFdLXlbMV0pL28sYT0oclsxXVswXS15WzBdKS9vLGg9LShyWzFdWzFdLXlbMV0pL28sbD0oclsyXVswXS15WzBdKS9vLHU9LShyWzJdWzFdLXlbMV0pL287cC5iZWdpblBhdGgoKSxwLm1vdmVUbyhhLGgpLHAubGluZVRvKG4scykscC5saW5lVG8obCx1KSxwLmNsb3NlUGF0aCgpLHAuc3Ryb2tlKCl9KSxwLnJlc3RvcmUoKSkscC5jYW52YXN9dmFyIHp1PWZ1bmN0aW9uKHQsZSxpLHIsbil7dGhpcy5zb3VyY2VQcm9qXz10LHRoaXMudGFyZ2V0UHJval89ZTt2YXIgbz17fSxzPU9lKHRoaXMudGFyZ2V0UHJval8sdGhpcy5zb3VyY2VQcm9qXyk7dGhpcy50cmFuc2Zvcm1JbnZfPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0rIi8iK3RbMV07cmV0dXJuIG9bZV18fChvW2VdPXModCkpLG9bZV19LHRoaXMubWF4U291cmNlRXh0ZW50Xz1yLHRoaXMuZXJyb3JUaHJlc2hvbGRTcXVhcmVkXz1uKm4sdGhpcy50cmlhbmdsZXNfPVtdLHRoaXMud3JhcHNYSW5Tb3VyY2VfPSExLHRoaXMuY2FuV3JhcFhJblNvdXJjZV89dGhpcy5zb3VyY2VQcm9qXy5jYW5XcmFwWCgpJiYhIXImJiEhdGhpcy5zb3VyY2VQcm9qXy5nZXRFeHRlbnQoKSYmT3Qocik9PU90KHRoaXMuc291cmNlUHJval8uZ2V0RXh0ZW50KCkpLHRoaXMuc291cmNlV29ybGRXaWR0aF89dGhpcy5zb3VyY2VQcm9qXy5nZXRFeHRlbnQoKT9PdCh0aGlzLnNvdXJjZVByb2pfLmdldEV4dGVudCgpKTpudWxsLHRoaXMudGFyZ2V0V29ybGRXaWR0aF89dGhpcy50YXJnZXRQcm9qXy5nZXRFeHRlbnQoKT9PdCh0aGlzLnRhcmdldFByb2pfLmdldEV4dGVudCgpKTpudWxsO3ZhciBhPUl0KGkpLGg9THQoaSksbD1TdChpKSx1PUV0KGkpLHA9dGhpcy50cmFuc2Zvcm1JbnZfKGEpLGM9dGhpcy50cmFuc2Zvcm1JbnZfKGgpLGQ9dGhpcy50cmFuc2Zvcm1JbnZfKGwpLGY9dGhpcy50cmFuc2Zvcm1JbnZfKHUpO2lmKHRoaXMuYWRkUXVhZF8oYSxoLGwsdSxwLGMsZCxmLDEwKSx0aGlzLndyYXBzWEluU291cmNlXyl7dmFyIF89MS8wO3RoaXMudHJpYW5nbGVzXy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSxpKXtfPU1hdGgubWluKF8sdC5zb3VyY2VbMF1bMF0sdC5zb3VyY2VbMV1bMF0sdC5zb3VyY2VbMl1bMF0pfSksdGhpcy50cmlhbmdsZXNfLmZvckVhY2goZnVuY3Rpb24odCl7aWYoTWF0aC5tYXgodC5zb3VyY2VbMF1bMF0sdC5zb3VyY2VbMV1bMF0sdC5zb3VyY2VbMl1bMF0pLV8+dGhpcy5zb3VyY2VXb3JsZFdpZHRoXy8yKXt2YXIgZT1bW3Quc291cmNlWzBdWzBdLHQuc291cmNlWzBdWzFdXSxbdC5zb3VyY2VbMV1bMF0sdC5zb3VyY2VbMV1bMV1dLFt0LnNvdXJjZVsyXVswXSx0LnNvdXJjZVsyXVsxXV1dO2VbMF1bMF0tXz50aGlzLnNvdXJjZVdvcmxkV2lkdGhfLzImJihlWzBdWzBdLT10aGlzLnNvdXJjZVdvcmxkV2lkdGhfKSxlWzFdWzBdLV8+dGhpcy5zb3VyY2VXb3JsZFdpZHRoXy8yJiYoZVsxXVswXS09dGhpcy5zb3VyY2VXb3JsZFdpZHRoXyksZVsyXVswXS1fPnRoaXMuc291cmNlV29ybGRXaWR0aF8vMiYmKGVbMl1bMF0tPXRoaXMuc291cmNlV29ybGRXaWR0aF8pO3ZhciBpPU1hdGgubWluKGVbMF1bMF0sZVsxXVswXSxlWzJdWzBdKTtNYXRoLm1heChlWzBdWzBdLGVbMV1bMF0sZVsyXVswXSktaTx0aGlzLnNvdXJjZVdvcmxkV2lkdGhfLzImJih0LnNvdXJjZT1lKX19LmJpbmQodGhpcykpfW89e319O3p1LnByb3RvdHlwZS5hZGRUcmlhbmdsZV89ZnVuY3Rpb24odCxlLGkscixuLG8pe3RoaXMudHJpYW5nbGVzXy5wdXNoKHtzb3VyY2U6W3IsbixvXSx0YXJnZXQ6W3QsZSxpXX0pfSx6dS5wcm90b3R5cGUuYWRkUXVhZF89ZnVuY3Rpb24odCxlLGkscixuLG8scyxhLGgpe3ZhciBsPXR0KFtuLG8scyxhXSksdT10aGlzLnNvdXJjZVdvcmxkV2lkdGhfP090KGwpL3RoaXMuc291cmNlV29ybGRXaWR0aF86bnVsbCxwPXRoaXMuc291cmNlV29ybGRXaWR0aF8sYz10aGlzLnNvdXJjZVByb2pfLmNhbldyYXBYKCkmJnU+LjUmJnU8MSxkPSExO2lmKGg+MCl7aWYodGhpcy50YXJnZXRQcm9qXy5pc0dsb2JhbCgpJiZ0aGlzLnRhcmdldFdvcmxkV2lkdGhfKWQ9T3QodHQoW3QsZSxpLHJdKSkvdGhpcy50YXJnZXRXb3JsZFdpZHRoXz4uMjV8fGQ7IWMmJnRoaXMuc291cmNlUHJval8uaXNHbG9iYWwoKSYmdSYmKGQ9dT4uMjV8fGQpfWlmKGR8fCF0aGlzLm1heFNvdXJjZUV4dGVudF98fFB0KGwsdGhpcy5tYXhTb3VyY2VFeHRlbnRfKSl7aWYoIShkfHxpc0Zpbml0ZShuWzBdKSYmaXNGaW5pdGUoblsxXSkmJmlzRmluaXRlKG9bMF0pJiZpc0Zpbml0ZShvWzFdKSYmaXNGaW5pdGUoc1swXSkmJmlzRmluaXRlKHNbMV0pJiZpc0Zpbml0ZShhWzBdKSYmaXNGaW5pdGUoYVsxXSkpKXtpZighKGg+MCkpcmV0dXJuO2Q9ITB9aWYoaD4wKXtpZighZCl7dmFyIGYsXz1bKHRbMF0raVswXSkvMiwodFsxXStpWzFdKS8yXSxnPXRoaXMudHJhbnNmb3JtSW52XyhfKTtpZihjKWY9KFh0KG5bMF0scCkrWHQoc1swXSxwKSkvMi1YdChnWzBdLHApO2Vsc2UgZj0oblswXStzWzBdKS8yLWdbMF07dmFyIHk9KG5bMV0rc1sxXSkvMi1nWzFdO2Q9ZipmK3kqeT50aGlzLmVycm9yVGhyZXNob2xkU3F1YXJlZF99aWYoZCl7aWYoTWF0aC5hYnModFswXS1pWzBdKTw9TWF0aC5hYnModFsxXS1pWzFdKSl7dmFyIHY9WyhlWzBdK2lbMF0pLzIsKGVbMV0raVsxXSkvMl0sbT10aGlzLnRyYW5zZm9ybUludl8odikseD1bKHJbMF0rdFswXSkvMiwoclsxXSt0WzFdKS8yXSxFPXRoaXMudHJhbnNmb3JtSW52Xyh4KTt0aGlzLmFkZFF1YWRfKHQsZSx2LHgsbixvLG0sRSxoLTEpLHRoaXMuYWRkUXVhZF8oeCx2LGkscixFLG0scyxhLGgtMSl9ZWxzZXt2YXIgUz1bKHRbMF0rZVswXSkvMiwodFsxXStlWzFdKS8yXSxUPXRoaXMudHJhbnNmb3JtSW52XyhTKSxDPVsoaVswXStyWzBdKS8yLChpWzFdK3JbMV0pLzJdLFI9dGhpcy50cmFuc2Zvcm1JbnZfKEMpO3RoaXMuYWRkUXVhZF8odCxTLEMscixuLFQsUixhLGgtMSksdGhpcy5hZGRRdWFkXyhTLGUsaSxDLFQsbyxzLFIsaC0xKX1yZXR1cm59fWlmKGMpe2lmKCF0aGlzLmNhbldyYXBYSW5Tb3VyY2VfKXJldHVybjt0aGlzLndyYXBzWEluU291cmNlXz0hMH10aGlzLmFkZFRyaWFuZ2xlXyh0LGkscixuLHMsYSksdGhpcy5hZGRUcmlhbmdsZV8odCxlLGksbixvLHMpfX0senUucHJvdG90eXBlLmNhbGN1bGF0ZVNvdXJjZUV4dGVudD1mdW5jdGlvbigpe3ZhciB0PVsxLzAsMS8wLC0xLzAsLTEvMF07cmV0dXJuIHRoaXMudHJpYW5nbGVzXy5mb3JFYWNoKGZ1bmN0aW9uKGUsaSxyKXt2YXIgbj1lLnNvdXJjZTtfdCh0LG5bMF0pLF90KHQsblsxXSksX3QodCxuWzJdKX0pLHR9LHp1LnByb3RvdHlwZS5nZXRUcmlhbmdsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmlhbmdsZXNffTt2YXIgV3U9enUsS3U9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkscixuLG8scyxhLGgsbCx1LHApe3QuY2FsbCh0aGlzLG8sT24uSURMRSksdGhpcy5yZW5kZXJFZGdlc189dm9pZCAwIT09cCYmcCx0aGlzLnBpeGVsUmF0aW9fPWEsdGhpcy5ndXR0ZXJfPWgsdGhpcy5jYW52YXNfPW51bGwsdGhpcy5zb3VyY2VUaWxlR3JpZF89aSx0aGlzLnRhcmdldFRpbGVHcmlkXz1uLHRoaXMud3JhcHBlZFRpbGVDb29yZF89c3x8byx0aGlzLnNvdXJjZVRpbGVzXz1bXSx0aGlzLnNvdXJjZXNMaXN0ZW5lcktleXNfPW51bGwsdGhpcy5zb3VyY2VaXz0wO3ZhciBjPW4uZ2V0VGlsZUNvb3JkRXh0ZW50KHRoaXMud3JhcHBlZFRpbGVDb29yZF8pLGQ9dGhpcy50YXJnZXRUaWxlR3JpZF8uZ2V0RXh0ZW50KCksZj10aGlzLnNvdXJjZVRpbGVHcmlkXy5nZXRFeHRlbnQoKSxfPWQ/d3QoYyxkKTpjO2lmKDAhPT14dChfKSl7dmFyIGc9ZS5nZXRFeHRlbnQoKTtnJiYoZj1mP3d0KGYsZyk6Zyk7dmFyIHk9bi5nZXRSZXNvbHV0aW9uKHRoaXMud3JhcHBlZFRpbGVDb29yZF9bMF0pLHY9QnUoZSxyLFR0KF8pLHkpO2lmKCFpc0Zpbml0ZSh2KXx8djw9MCl0aGlzLnN0YXRlPU9uLkVNUFRZO2Vsc2V7dmFyIG09dm9pZCAwIT09dT91OnZzO2lmKHRoaXMudHJpYW5ndWxhdGlvbl89bmV3IFd1KGUscixfLGYsdiptKSwwIT09dGhpcy50cmlhbmd1bGF0aW9uXy5nZXRUcmlhbmdsZXMoKS5sZW5ndGgpe3RoaXMuc291cmNlWl89aS5nZXRaRm9yUmVzb2x1dGlvbih2KTt2YXIgeD10aGlzLnRyaWFuZ3VsYXRpb25fLmNhbGN1bGF0ZVNvdXJjZUV4dGVudCgpO2lmKGYmJihlLmNhbldyYXBYKCk/KHhbMV09a3QoeFsxXSxmWzFdLGZbM10pLHhbM109a3QoeFszXSxmWzFdLGZbM10pKTp4PXd0KHgsZikpLHh0KHgpKXtmb3IodmFyIEU9aS5nZXRUaWxlUmFuZ2VGb3JFeHRlbnRBbmRaKHgsdGhpcy5zb3VyY2VaXyksUz1FLm1pblg7Uzw9RS5tYXhYO1MrKylmb3IodmFyIFQ9RS5taW5ZO1Q8PUUubWF4WTtUKyspe3ZhciBDPWwodGhpcy5zb3VyY2VaXyxTLFQsYSk7QyYmdGhpcy5zb3VyY2VUaWxlc18ucHVzaChDKX0wPT09dGhpcy5zb3VyY2VUaWxlc18ubGVuZ3RoJiYodGhpcy5zdGF0ZT1Pbi5FTVBUWSl9ZWxzZSB0aGlzLnN0YXRlPU9uLkVNUFRZfWVsc2UgdGhpcy5zdGF0ZT1Pbi5FTVBUWX19ZWxzZSB0aGlzLnN0YXRlPU9uLkVNUFRZfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWw9ZnVuY3Rpb24oKXt0aGlzLnN0YXRlPT1Pbi5MT0FESU5HJiZ0aGlzLnVubGlzdGVuU291cmNlc18oKSx0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuZ2V0SW1hZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXNffSxlLnByb3RvdHlwZS5yZXByb2plY3RfPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5zb3VyY2VUaWxlc18uZm9yRWFjaChmdW5jdGlvbihlLGkscil7ZSYmZS5nZXRTdGF0ZSgpPT1Pbi5MT0FERUQmJnQucHVzaCh7ZXh0ZW50OnRoaXMuc291cmNlVGlsZUdyaWRfLmdldFRpbGVDb29yZEV4dGVudChlLnRpbGVDb29yZCksaW1hZ2U6ZS5nZXRJbWFnZSgpfSl9LmJpbmQodGhpcykpLHRoaXMuc291cmNlVGlsZXNfLmxlbmd0aD0wLDA9PT10Lmxlbmd0aCl0aGlzLnN0YXRlPU9uLkVSUk9SO2Vsc2V7dmFyIGU9dGhpcy53cmFwcGVkVGlsZUNvb3JkX1swXSxpPXRoaXMudGFyZ2V0VGlsZUdyaWRfLmdldFRpbGVTaXplKGUpLHI9Im51bWJlciI9PXR5cGVvZiBpP2k6aVswXSxuPSJudW1iZXIiPT10eXBlb2YgaT9pOmlbMV0sbz10aGlzLnRhcmdldFRpbGVHcmlkXy5nZXRSZXNvbHV0aW9uKGUpLHM9dGhpcy5zb3VyY2VUaWxlR3JpZF8uZ2V0UmVzb2x1dGlvbih0aGlzLnNvdXJjZVpfKSxhPXRoaXMudGFyZ2V0VGlsZUdyaWRfLmdldFRpbGVDb29yZEV4dGVudCh0aGlzLndyYXBwZWRUaWxlQ29vcmRfKTt0aGlzLmNhbnZhc189WHUocixuLHRoaXMucGl4ZWxSYXRpb18scyx0aGlzLnNvdXJjZVRpbGVHcmlkXy5nZXRFeHRlbnQoKSxvLGEsdGhpcy50cmlhbmd1bGF0aW9uXyx0LHRoaXMuZ3V0dGVyXyx0aGlzLnJlbmRlckVkZ2VzXyksdGhpcy5zdGF0ZT1Pbi5MT0FERUR9dGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnN0YXRlPT1Pbi5JRExFKXt0aGlzLnN0YXRlPU9uLkxPQURJTkcsdGhpcy5jaGFuZ2VkKCk7dmFyIHQ9MDt0aGlzLnNvdXJjZXNMaXN0ZW5lcktleXNfPVtdLHRoaXMuc291cmNlVGlsZXNfLmZvckVhY2goZnVuY3Rpb24oZSxpLHIpe3ZhciBuPWUuZ2V0U3RhdGUoKTtpZihuPT1Pbi5JRExFfHxuPT1Pbi5MT0FESU5HKXt0Kys7dmFyIG89dihlLE0uQ0hBTkdFLGZ1bmN0aW9uKGkpe3ZhciByPWUuZ2V0U3RhdGUoKTtyIT1Pbi5MT0FERUQmJnIhPU9uLkVSUk9SJiZyIT1Pbi5FTVBUWXx8KEUobyksMD09PS0tdCYmKHRoaXMudW5saXN0ZW5Tb3VyY2VzXygpLHRoaXMucmVwcm9qZWN0XygpKSl9LHRoaXMpO3RoaXMuc291cmNlc0xpc3RlbmVyS2V5c18ucHVzaChvKX19LmJpbmQodGhpcykpLHRoaXMuc291cmNlVGlsZXNfLmZvckVhY2goZnVuY3Rpb24odCxlLGkpe3QuZ2V0U3RhdGUoKT09T24uSURMRSYmdC5sb2FkKCl9KSwwPT09dCYmc2V0VGltZW91dCh0aGlzLnJlcHJvamVjdF8uYmluZCh0aGlzKSwwKX19LGUucHJvdG90eXBlLnVubGlzdGVuU291cmNlc189ZnVuY3Rpb24oKXt0aGlzLnNvdXJjZXNMaXN0ZW5lcktleXNfLmZvckVhY2goRSksdGhpcy5zb3VyY2VzTGlzdGVuZXJLZXlzXz1udWxsfSxlfSh2bCksSHU9InRpbGVsb2Fkc3RhcnQiLFp1PSJ0aWxlbG9hZGVuZCIscXU9InRpbGVsb2FkZXJyb3IiLEp1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMse2F0dHJpYnV0aW9uczplLmF0dHJpYnV0aW9ucyxjYWNoZVNpemU6ZS5jYWNoZVNpemUsb3BhcXVlOmUub3BhcXVlLHByb2plY3Rpb246ZS5wcm9qZWN0aW9uLHN0YXRlOmUuc3RhdGUsdGlsZUdyaWQ6ZS50aWxlR3JpZCx0aWxlUGl4ZWxSYXRpbzplLnRpbGVQaXhlbFJhdGlvLHdyYXBYOmUud3JhcFgsdHJhbnNpdGlvbjplLnRyYW5zaXRpb24sa2V5OmUua2V5LGF0dHJpYnV0aW9uc0NvbGxhcHNpYmxlOmUuYXR0cmlidXRpb25zQ29sbGFwc2libGV9KSx0aGlzLmdlbmVyYXRlVGlsZVVybEZ1bmN0aW9uXz0hZS50aWxlVXJsRnVuY3Rpb24sdGhpcy50aWxlTG9hZEZ1bmN0aW9uPWUudGlsZUxvYWRGdW5jdGlvbix0aGlzLnRpbGVVcmxGdW5jdGlvbj1lLnRpbGVVcmxGdW5jdGlvbj9lLnRpbGVVcmxGdW5jdGlvbi5iaW5kKHRoaXMpOmp1LHRoaXMudXJscz1udWxsLGUudXJscz90aGlzLnNldFVybHMoZS51cmxzKTplLnVybCYmdGhpcy5zZXRVcmwoZS51cmwpLGUudGlsZVVybEZ1bmN0aW9uJiZ0aGlzLnNldFRpbGVVcmxGdW5jdGlvbihlLnRpbGVVcmxGdW5jdGlvbix0aGlzLmtleV8pLHRoaXMudGlsZUxvYWRpbmdLZXlzXz17fX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0VGlsZUxvYWRGdW5jdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbGVMb2FkRnVuY3Rpb259LGUucHJvdG90eXBlLmdldFRpbGVVcmxGdW5jdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbGVVcmxGdW5jdGlvbn0sZS5wcm90b3R5cGUuZ2V0VXJscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVybHN9LGUucHJvdG90eXBlLmhhbmRsZVRpbGVDaGFuZ2U9ZnVuY3Rpb24odCl7dmFyIGUsaT10LnRhcmdldCxyPW8oaSksbj1pLmdldFN0YXRlKCk7bj09T24uTE9BRElORz8odGhpcy50aWxlTG9hZGluZ0tleXNfW3JdPSEwLGU9SHUpOnIgaW4gdGhpcy50aWxlTG9hZGluZ0tleXNfJiYoZGVsZXRlIHRoaXMudGlsZUxvYWRpbmdLZXlzX1tyXSxlPW49PU9uLkVSUk9SP3F1Om49PU9uLkxPQURFRHx8bj09T24uQUJPUlQ/WnU6dm9pZCAwKSx2b2lkIDAhPWUmJnRoaXMuZGlzcGF0Y2hFdmVudChuZXcga2woZSxpKSl9LGUucHJvdG90eXBlLnNldFRpbGVMb2FkRnVuY3Rpb249ZnVuY3Rpb24odCl7dGhpcy50aWxlQ2FjaGUuY2xlYXIoKSx0aGlzLnRpbGVMb2FkRnVuY3Rpb249dCx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuc2V0VGlsZVVybEZ1bmN0aW9uPWZ1bmN0aW9uKHQsZSl7dGhpcy50aWxlVXJsRnVuY3Rpb249dCx0aGlzLnRpbGVDYWNoZS5wcnVuZUV4Y2VwdE5ld2VzdFooKSx2b2lkIDAhPT1lP3RoaXMuc2V0S2V5KGUpOnRoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5zZXRVcmw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy51cmxzPVV1KHQpO3RoaXMuc2V0VXJscyhlKX0sZS5wcm90b3R5cGUuc2V0VXJscz1mdW5jdGlvbih0KXt0aGlzLnVybHM9dDt2YXIgZT10LmpvaW4oIlxuIik7dGhpcy5nZW5lcmF0ZVRpbGVVcmxGdW5jdGlvbl8/dGhpcy5zZXRUaWxlVXJsRnVuY3Rpb24oRHUodCx0aGlzLnRpbGVHcmlkKSxlKTp0aGlzLnNldEtleShlKX0sZS5wcm90b3R5cGUudXNlVGlsZT1mdW5jdGlvbih0LGUsaSl7dmFyIHI9U2wodCxlLGkpO3RoaXMudGlsZUNhY2hlLmNvbnRhaW5zS2V5KHIpJiZ0aGlzLnRpbGVDYWNoZS5nZXQocil9LGV9KGpsKTtmdW5jdGlvbiBRdSh0LGUpe3QuZ2V0SW1hZ2UoKS5zcmM9ZX12YXIgJHU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyx7YXR0cmlidXRpb25zOmUuYXR0cmlidXRpb25zLGNhY2hlU2l6ZTplLmNhY2hlU2l6ZSxvcGFxdWU6ZS5vcGFxdWUscHJvamVjdGlvbjplLnByb2plY3Rpb24sc3RhdGU6ZS5zdGF0ZSx0aWxlR3JpZDplLnRpbGVHcmlkLHRpbGVMb2FkRnVuY3Rpb246ZS50aWxlTG9hZEZ1bmN0aW9uP2UudGlsZUxvYWRGdW5jdGlvbjpRdSx0aWxlUGl4ZWxSYXRpbzplLnRpbGVQaXhlbFJhdGlvLHRpbGVVcmxGdW5jdGlvbjplLnRpbGVVcmxGdW5jdGlvbix1cmw6ZS51cmwsdXJsczplLnVybHMsd3JhcFg6ZS53cmFwWCx0cmFuc2l0aW9uOmUudHJhbnNpdGlvbixrZXk6ZS5rZXksYXR0cmlidXRpb25zQ29sbGFwc2libGU6ZS5hdHRyaWJ1dGlvbnNDb2xsYXBzaWJsZX0pLHRoaXMuY3Jvc3NPcmlnaW49dm9pZCAwIT09ZS5jcm9zc09yaWdpbj9lLmNyb3NzT3JpZ2luOm51bGwsdGhpcy50aWxlQ2xhc3M9dm9pZCAwIT09ZS50aWxlQ2xhc3M/ZS50aWxlQ2xhc3M6eGwsdGhpcy50aWxlQ2FjaGVGb3JQcm9qZWN0aW9uPXt9LHRoaXMudGlsZUdyaWRGb3JQcm9qZWN0aW9uPXt9LHRoaXMucmVwcm9qZWN0aW9uRXJyb3JUaHJlc2hvbGRfPWUucmVwcm9qZWN0aW9uRXJyb3JUaHJlc2hvbGQsdGhpcy5yZW5kZXJSZXByb2plY3Rpb25FZGdlc189ITF9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNhbkV4cGlyZUNhY2hlPWZ1bmN0aW9uKCl7aWYodGhpcy50aWxlQ2FjaGUuY2FuRXhwaXJlQ2FjaGUoKSlyZXR1cm4hMDtmb3IodmFyIHQgaW4gdGhpcy50aWxlQ2FjaGVGb3JQcm9qZWN0aW9uKWlmKHRoaXMudGlsZUNhY2hlRm9yUHJvamVjdGlvblt0XS5jYW5FeHBpcmVDYWNoZSgpKXJldHVybiEwO3JldHVybiExfSxlLnByb3RvdHlwZS5leHBpcmVDYWNoZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0VGlsZUNhY2hlRm9yUHJvamVjdGlvbih0KTtmb3IodmFyIHIgaW4gdGhpcy50aWxlQ2FjaGUuZXhwaXJlQ2FjaGUodGhpcy50aWxlQ2FjaGU9PWk/ZTp7fSksdGhpcy50aWxlQ2FjaGVGb3JQcm9qZWN0aW9uKXt2YXIgbj10aGlzLnRpbGVDYWNoZUZvclByb2plY3Rpb25bcl07bi5leHBpcmVDYWNoZShuPT1pP2U6e30pfX0sZS5wcm90b3R5cGUuZ2V0R3V0dGVyRm9yUHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRQcm9qZWN0aW9uKCkmJnQmJiFJZSh0aGlzLmdldFByb2plY3Rpb24oKSx0KT8wOnRoaXMuZ2V0R3V0dGVyKCl9LGUucHJvdG90eXBlLmdldEd1dHRlcj1mdW5jdGlvbigpe3JldHVybiAwfSxlLnByb3RvdHlwZS5nZXRPcGFxdWU9ZnVuY3Rpb24oZSl7cmV0dXJuISh0aGlzLmdldFByb2plY3Rpb24oKSYmZSYmIUllKHRoaXMuZ2V0UHJvamVjdGlvbigpLGUpKSYmdC5wcm90b3R5cGUuZ2V0T3BhcXVlLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuZ2V0VGlsZUdyaWRGb3JQcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UHJvamVjdGlvbigpO2lmKCF0aGlzLnRpbGVHcmlkfHxlJiYhSWUoZSx0KSl7dmFyIGk9byh0KTtyZXR1cm4gaSBpbiB0aGlzLnRpbGVHcmlkRm9yUHJvamVjdGlvbnx8KHRoaXMudGlsZUdyaWRGb3JQcm9qZWN0aW9uW2ldPWJsKHQpKSx0aGlzLnRpbGVHcmlkRm9yUHJvamVjdGlvbltpXX1yZXR1cm4gdGhpcy50aWxlR3JpZH0sZS5wcm90b3R5cGUuZ2V0VGlsZUNhY2hlRm9yUHJvamVjdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFByb2plY3Rpb24oKTtpZighZXx8SWUoZSx0KSlyZXR1cm4gdGhpcy50aWxlQ2FjaGU7dmFyIGk9byh0KTtyZXR1cm4gaSBpbiB0aGlzLnRpbGVDYWNoZUZvclByb2plY3Rpb258fCh0aGlzLnRpbGVDYWNoZUZvclByb2plY3Rpb25baV09bmV3IFJsKHRoaXMudGlsZUNhY2hlLmhpZ2hXYXRlck1hcmspKSx0aGlzLnRpbGVDYWNoZUZvclByb2plY3Rpb25baV19LGUucHJvdG90eXBlLmNyZWF0ZVRpbGVfPWZ1bmN0aW9uKHQsZSxpLHIsbixvKXt2YXIgcz1bdCxlLGldLGE9dGhpcy5nZXRUaWxlQ29vcmRGb3JUaWxlVXJsRnVuY3Rpb24ocyxuKSxoPWE/dGhpcy50aWxlVXJsRnVuY3Rpb24oYSxyLG4pOnZvaWQgMCxsPW5ldyB0aGlzLnRpbGVDbGFzcyhzLHZvaWQgMCE9PWg/T24uSURMRTpPbi5FTVBUWSx2b2lkIDAhPT1oP2g6IiIsdGhpcy5jcm9zc09yaWdpbix0aGlzLnRpbGVMb2FkRnVuY3Rpb24sdGhpcy50aWxlT3B0aW9ucyk7cmV0dXJuIGwua2V5PW8sdihsLE0uQ0hBTkdFLHRoaXMuaGFuZGxlVGlsZUNoYW5nZSx0aGlzKSxsfSxlLnByb3RvdHlwZS5nZXRUaWxlPWZ1bmN0aW9uKHQsZSxpLHIsbil7dmFyIG89dGhpcy5nZXRQcm9qZWN0aW9uKCk7aWYobyYmbiYmIUllKG8sbikpe3ZhciBzLGE9dGhpcy5nZXRUaWxlQ2FjaGVGb3JQcm9qZWN0aW9uKG4pLGg9W3QsZSxpXSxsPVRsKGgpO2EuY29udGFpbnNLZXkobCkmJihzPWEuZ2V0KGwpKTt2YXIgdT10aGlzLmdldEtleSgpO2lmKHMmJnMua2V5PT11KXJldHVybiBzO3ZhciBwPXRoaXMuZ2V0VGlsZUdyaWRGb3JQcm9qZWN0aW9uKG8pLGM9dGhpcy5nZXRUaWxlR3JpZEZvclByb2plY3Rpb24obiksZD10aGlzLmdldFRpbGVDb29yZEZvclRpbGVVcmxGdW5jdGlvbihoLG4pLGY9bmV3IEt1KG8scCxuLGMsaCxkLHRoaXMuZ2V0VGlsZVBpeGVsUmF0aW8ociksdGhpcy5nZXRHdXR0ZXIoKSxmdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gdGhpcy5nZXRUaWxlSW50ZXJuYWwodCxlLGkscixvKX0uYmluZCh0aGlzKSx0aGlzLnJlcHJvamVjdGlvbkVycm9yVGhyZXNob2xkXyx0aGlzLnJlbmRlclJlcHJvamVjdGlvbkVkZ2VzXyk7cmV0dXJuIGYua2V5PXUscz8oZi5pbnRlcmltVGlsZT1zLGYucmVmcmVzaEludGVyaW1DaGFpbigpLGEucmVwbGFjZShsLGYpKTphLnNldChsLGYpLGZ9cmV0dXJuIHRoaXMuZ2V0VGlsZUludGVybmFsKHQsZSxpLHIsb3x8bil9LGUucHJvdG90eXBlLmdldFRpbGVJbnRlcm5hbD1mdW5jdGlvbih0LGUsaSxyLG4pe3ZhciBvPW51bGwscz1TbCh0LGUsaSksYT10aGlzLmdldEtleSgpO2lmKHRoaXMudGlsZUNhY2hlLmNvbnRhaW5zS2V5KHMpKXtpZigobz10aGlzLnRpbGVDYWNoZS5nZXQocykpLmtleSE9YSl7dmFyIGg9bztvPXRoaXMuY3JlYXRlVGlsZV8odCxlLGkscixuLGEpLGguZ2V0U3RhdGUoKT09T24uSURMRT9vLmludGVyaW1UaWxlPWguaW50ZXJpbVRpbGU6by5pbnRlcmltVGlsZT1oLG8ucmVmcmVzaEludGVyaW1DaGFpbigpLHRoaXMudGlsZUNhY2hlLnJlcGxhY2UocyxvKX19ZWxzZSBvPXRoaXMuY3JlYXRlVGlsZV8odCxlLGkscixuLGEpLHRoaXMudGlsZUNhY2hlLnNldChzLG8pO3JldHVybiBvfSxlLnByb3RvdHlwZS5zZXRSZW5kZXJSZXByb2plY3Rpb25FZGdlcz1mdW5jdGlvbih0KXtpZih0aGlzLnJlbmRlclJlcHJvamVjdGlvbkVkZ2VzXyE9dCl7Zm9yKHZhciBlIGluIHRoaXMucmVuZGVyUmVwcm9qZWN0aW9uRWRnZXNfPXQsdGhpcy50aWxlQ2FjaGVGb3JQcm9qZWN0aW9uKXRoaXMudGlsZUNhY2hlRm9yUHJvamVjdGlvbltlXS5jbGVhcigpO3RoaXMuY2hhbmdlZCgpfX0sZS5wcm90b3R5cGUuc2V0VGlsZUdyaWRGb3JQcm9qZWN0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9RWUodCk7aWYoaSl7dmFyIHI9byhpKTtyIGluIHRoaXMudGlsZUdyaWRGb3JQcm9qZWN0aW9ufHwodGhpcy50aWxlR3JpZEZvclByb2plY3Rpb25bcl09ZSl9fSxlfShKdSksdHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT12b2lkIDAhPT1lLmhpZHBpJiZlLmhpZHBpO3QuY2FsbCh0aGlzLHtjYWNoZVNpemU6ZS5jYWNoZVNpemUsY3Jvc3NPcmlnaW46ImFub255bW91cyIsb3BhcXVlOiEwLHByb2plY3Rpb246RWUoIkVQU0c6Mzg1NyIpLHJlcHJvamVjdGlvbkVycm9yVGhyZXNob2xkOmUucmVwcm9qZWN0aW9uRXJyb3JUaHJlc2hvbGQsc3RhdGU6cm8uTE9BRElORyx0aWxlTG9hZEZ1bmN0aW9uOmUudGlsZUxvYWRGdW5jdGlvbix0aWxlUGl4ZWxSYXRpbzppPzI6MSx3cmFwWDp2b2lkIDA9PT1lLndyYXBYfHxlLndyYXBYLHRyYW5zaXRpb246ZS50cmFuc2l0aW9ufSksdGhpcy5oaWRwaV89aSx0aGlzLmN1bHR1cmVfPXZvaWQgMCE9PWUuY3VsdHVyZT9lLmN1bHR1cmU6ImVuLXVzIix0aGlzLm1heFpvb21fPXZvaWQgMCE9PWUubWF4Wm9vbT9lLm1heFpvb206LTEsdGhpcy5hcGlLZXlfPWUua2V5LHRoaXMuaW1hZ2VyeVNldF89ZS5pbWFnZXJ5U2V0LFl1KCJodHRwczovL2Rldi52aXJ0dWFsZWFydGgubmV0L1JFU1QvdjEvSW1hZ2VyeS9NZXRhZGF0YS8iK3RoaXMuaW1hZ2VyeVNldF8rIj91cmlTY2hlbWU9aHR0cHMmaW5jbHVkZT1JbWFnZXJ5UHJvdmlkZXJzJmtleT0iK3RoaXMuYXBpS2V5XysiJmM9Iit0aGlzLmN1bHR1cmVfLHRoaXMuaGFuZGxlSW1hZ2VyeU1ldGFkYXRhUmVzcG9uc2UuYmluZCh0aGlzKSx2b2lkIDAsImpzb25wIil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldEFwaUtleT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFwaUtleV99LGUucHJvdG90eXBlLmdldEltYWdlcnlTZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbWFnZXJ5U2V0X30sZS5wcm90b3R5cGUuaGFuZGxlSW1hZ2VyeU1ldGFkYXRhUmVzcG9uc2U9ZnVuY3Rpb24odCl7aWYoMjAwPT10LnN0YXR1c0NvZGUmJiJPSyI9PXQuc3RhdHVzRGVzY3JpcHRpb24mJiJWYWxpZENyZWRlbnRpYWxzIj09dC5hdXRoZW50aWNhdGlvblJlc3VsdENvZGUmJjE9PXQucmVzb3VyY2VTZXRzLmxlbmd0aCYmMT09dC5yZXNvdXJjZVNldHNbMF0ucmVzb3VyY2VzLmxlbmd0aCl7dmFyIGU9dC5yZXNvdXJjZVNldHNbMF0ucmVzb3VyY2VzWzBdLGk9LTE9PXRoaXMubWF4Wm9vbV8/ZS56b29tTWF4OnRoaXMubWF4Wm9vbV8scj1HbCh0aGlzLmdldFByb2plY3Rpb24oKSksbj10aGlzLmhpZHBpXz8yOjEsbz1lLmltYWdlV2lkdGg9PWUuaW1hZ2VIZWlnaHQ/ZS5pbWFnZVdpZHRoL246W2UuaW1hZ2VXaWR0aC9uLGUuaW1hZ2VIZWlnaHQvbl0scz1GbCh7ZXh0ZW50OnIsbWluWm9vbTplLnpvb21NaW4sbWF4Wm9vbTppLHRpbGVTaXplOm99KTt0aGlzLnRpbGVHcmlkPXM7dmFyIGE9dGhpcy5jdWx0dXJlXyxoPXRoaXMuaGlkcGlfO2lmKHRoaXMudGlsZVVybEZ1bmN0aW9uPWt1KGUuaW1hZ2VVcmxTdWJkb21haW5zLm1hcChmdW5jdGlvbih0KXt2YXIgaT1bMCwwLDBdLHI9ZS5pbWFnZVVybC5yZXBsYWNlKCJ7c3ViZG9tYWlufSIsdCkucmVwbGFjZSgie2N1bHR1cmV9IixhKTtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe2lmKHQpe0VsKHRbMF0sdFsxXSwtdFsyXS0xLGkpO3ZhciBvPXI7cmV0dXJuIGgmJihvKz0iJmRwaT1kMSZkZXZpY2U9bW9iaWxlIiksby5yZXBsYWNlKCJ7cXVhZGtleX0iLGZ1bmN0aW9uKHQpe3ZhciBlLGkscj10WzBdLG49bmV3IEFycmF5KHIpLG89MTw8ci0xO2ZvcihlPTA7ZTxyOysrZSlpPTQ4LHRbMV0mbyYmKGkrPTEpLHRbMl0mbyYmKGkrPTIpLG5bZV09U3RyaW5nLmZyb21DaGFyQ29kZShpKSxvPj49MTtyZXR1cm4gbi5qb2luKCIiKX0oaSkpfX19KSksZS5pbWFnZXJ5UHJvdmlkZXJzKXt2YXIgbD1MZShFZSgiRVBTRzo0MzI2IiksdGhpcy5nZXRQcm9qZWN0aW9uKCkpO3RoaXMuc2V0QXR0cmlidXRpb25zKGZ1bmN0aW9uKHQpe3ZhciBpPVtdLHI9dC52aWV3U3RhdGUsbj10aGlzLmdldFRpbGVHcmlkKCkuZ2V0VGlsZUNvb3JkRm9yQ29vcmRBbmRSZXNvbHV0aW9uKHIuY2VudGVyLHIucmVzb2x1dGlvbilbMF07cmV0dXJuIGUuaW1hZ2VyeVByb3ZpZGVycy5tYXAoZnVuY3Rpb24oZSl7Zm9yKHZhciByPSExLG89ZS5jb3ZlcmFnZUFyZWFzLHM9MCxhPW8ubGVuZ3RoO3M8YTsrK3Mpe3ZhciBoPW9bc107aWYobj49aC56b29tTWluJiZuPD1oLnpvb21NYXgpe3ZhciB1PWguYmJveDtpZihQdChGdChbdVsxXSx1WzBdLHVbM10sdVsyXV0sbCksdC5leHRlbnQpKXtyPSEwO2JyZWFrfX19ciYmaS5wdXNoKGUuYXR0cmlidXRpb24pfSksaS5wdXNoKCc8YSBjbGFzcz0ib2wtYXR0cmlidXRpb24tYmluZy10b3MiIGhyZWY9Imh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vbWFwcy9wcm9kdWN0L3Rlcm1zLmh0bWwiPlRlcm1zIG9mIFVzZTwvYT4nKSxpfS5iaW5kKHRoaXMpKX10aGlzLnNldFN0YXRlKHJvLlJFQURZKX1lbHNlIHRoaXMuc2V0U3RhdGUocm8uRVJST1IpfSxlfSgkdSksZXA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fSxyPXZvaWQgMCE9PWkucHJvamVjdGlvbj9pLnByb2plY3Rpb246IkVQU0c6Mzg1NyIsbj12b2lkIDAhPT1pLnRpbGVHcmlkP2kudGlsZUdyaWQ6Rmwoe2V4dGVudDpHbChyKSxtYXhab29tOmkubWF4Wm9vbSxtaW5ab29tOmkubWluWm9vbSx0aWxlU2l6ZTppLnRpbGVTaXplfSk7dC5jYWxsKHRoaXMse2F0dHJpYnV0aW9uczppLmF0dHJpYnV0aW9ucyxjYWNoZVNpemU6aS5jYWNoZVNpemUsY3Jvc3NPcmlnaW46aS5jcm9zc09yaWdpbixvcGFxdWU6aS5vcGFxdWUscHJvamVjdGlvbjpyLHJlcHJvamVjdGlvbkVycm9yVGhyZXNob2xkOmkucmVwcm9qZWN0aW9uRXJyb3JUaHJlc2hvbGQsdGlsZUdyaWQ6bix0aWxlTG9hZEZ1bmN0aW9uOmkudGlsZUxvYWRGdW5jdGlvbix0aWxlUGl4ZWxSYXRpbzppLnRpbGVQaXhlbFJhdGlvLHRpbGVVcmxGdW5jdGlvbjppLnRpbGVVcmxGdW5jdGlvbix1cmw6aS51cmwsdXJsczppLnVybHMsd3JhcFg6dm9pZCAwPT09aS53cmFwWHx8aS53cmFwWCx0cmFuc2l0aW9uOmkudHJhbnNpdGlvbixhdHRyaWJ1dGlvbnNDb2xsYXBzaWJsZTppLmF0dHJpYnV0aW9uc0NvbGxhcHNpYmxlfSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KCR1KSxpcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLHthdHRyaWJ1dGlvbnM6ZS5hdHRyaWJ1dGlvbnMsY2FjaGVTaXplOmUuY2FjaGVTaXplLGNyb3NzT3JpZ2luOmUuY3Jvc3NPcmlnaW4sbWF4Wm9vbTp2b2lkIDAhPT1lLm1heFpvb20/ZS5tYXhab29tOjE4LG1pblpvb206ZS5taW5ab29tLHByb2plY3Rpb246ZS5wcm9qZWN0aW9uLHdyYXBYOmUud3JhcFh9KSx0aGlzLmFjY291bnRfPWUuYWNjb3VudCx0aGlzLm1hcElkXz1lLm1hcHx8IiIsdGhpcy5jb25maWdfPWUuY29uZmlnfHx7fSx0aGlzLnRlbXBsYXRlQ2FjaGVfPXt9LHRoaXMuaW5pdGlhbGl6ZU1hcF8oKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uZmlnX30sZS5wcm90b3R5cGUudXBkYXRlQ29uZmlnPWZ1bmN0aW9uKHQpe3UodGhpcy5jb25maWdfLHQpLHRoaXMuaW5pdGlhbGl6ZU1hcF8oKX0sZS5wcm90b3R5cGUuc2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3RoaXMuY29uZmlnXz10fHx7fSx0aGlzLmluaXRpYWxpemVNYXBfKCl9LGUucHJvdG90eXBlLmluaXRpYWxpemVNYXBfPWZ1bmN0aW9uKCl7dmFyIHQ9SlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWdfKTtpZih0aGlzLnRlbXBsYXRlQ2FjaGVfW3RdKXRoaXMuYXBwbHlUZW1wbGF0ZV8odGhpcy50ZW1wbGF0ZUNhY2hlX1t0XSk7ZWxzZXt2YXIgZT0iaHR0cHM6Ly8iK3RoaXMuYWNjb3VudF8rIi5jYXJ0by5jb20vYXBpL3YxL21hcCI7dGhpcy5tYXBJZF8mJihlKz0iL25hbWVkLyIrdGhpcy5tYXBJZF8pO3ZhciBpPW5ldyBYTUxIdHRwUmVxdWVzdDtpLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHRoaXMuaGFuZGxlSW5pdFJlc3BvbnNlXy5iaW5kKHRoaXMsdCkpLGkuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuaGFuZGxlSW5pdEVycm9yXy5iaW5kKHRoaXMpKSxpLm9wZW4oIlBPU1QiLGUpLGkuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24vanNvbiIpLGkuc2VuZChKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZ18pKX19LGUucHJvdG90eXBlLmhhbmRsZUluaXRSZXNwb25zZV89ZnVuY3Rpb24odCxlKXt2YXIgaT1lLnRhcmdldDtpZighaS5zdGF0dXN8fGkuc3RhdHVzPj0yMDAmJmkuc3RhdHVzPDMwMCl7dmFyIHI7dHJ5e3I9SlNPTi5wYXJzZShpLnJlc3BvbnNlVGV4dCl9Y2F0Y2godCl7cmV0dXJuIHZvaWQgdGhpcy5zZXRTdGF0ZShyby5FUlJPUil9dGhpcy5hcHBseVRlbXBsYXRlXyhyKSx0aGlzLnRlbXBsYXRlQ2FjaGVfW3RdPXIsdGhpcy5zZXRTdGF0ZShyby5SRUFEWSl9ZWxzZSB0aGlzLnNldFN0YXRlKHJvLkVSUk9SKX0sZS5wcm90b3R5cGUuaGFuZGxlSW5pdEVycm9yXz1mdW5jdGlvbih0KXt0aGlzLnNldFN0YXRlKHJvLkVSUk9SKX0sZS5wcm90b3R5cGUuYXBwbHlUZW1wbGF0ZV89ZnVuY3Rpb24odCl7dmFyIGU9Imh0dHBzOi8vIit0LmNkbl91cmwuaHR0cHMrIi8iK3RoaXMuYWNjb3VudF8rIi9hcGkvdjEvbWFwLyIrdC5sYXllcmdyb3VwaWQrIi97en0ve3h9L3t5fS5wbmciO3RoaXMuc2V0VXJsKGUpfSxlfShlcCkscnA9e0FEREZFQVRVUkU6ImFkZGZlYXR1cmUiLENIQU5HRUZFQVRVUkU6ImNoYW5nZWZlYXR1cmUiLENMRUFSOiJjbGVhciIsUkVNT1ZFRkVBVFVSRToicmVtb3ZlZmVhdHVyZSJ9LG5wPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcyxlKSx0aGlzLmZlYXR1cmU9aX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oUCksb3A9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fTt0LmNhbGwodGhpcyx7YXR0cmlidXRpb25zOmkuYXR0cmlidXRpb25zLHByb2plY3Rpb246dm9pZCAwLHN0YXRlOnJvLlJFQURZLHdyYXBYOnZvaWQgMD09PWkud3JhcFh8fGkud3JhcFh9KSx0aGlzLmxvYWRlcl89SSx0aGlzLmZvcm1hdF89aS5mb3JtYXQsdGhpcy5vdmVybGFwc189dm9pZCAwPT1pLm92ZXJsYXBzfHxpLm92ZXJsYXBzLHRoaXMudXJsXz1pLnVybCx2b2lkIDAhPT1pLmxvYWRlcj90aGlzLmxvYWRlcl89aS5sb2FkZXI6dm9pZCAwIT09dGhpcy51cmxfJiYoWSh0aGlzLmZvcm1hdF8sNyksdGhpcy5sb2FkZXJfPXFsKHRoaXMudXJsXyx0aGlzLmZvcm1hdF8pKSx0aGlzLnN0cmF0ZWd5Xz12b2lkIDAhPT1pLnN0cmF0ZWd5P2kuc3RyYXRlZ3k6Smw7dmFyIHIsbixvPXZvaWQgMD09PWkudXNlU3BhdGlhbEluZGV4fHxpLnVzZVNwYXRpYWxJbmRleDt0aGlzLmZlYXR1cmVzUnRyZWVfPW8/bmV3IHRsOm51bGwsdGhpcy5sb2FkZWRFeHRlbnRzUnRyZWVfPW5ldyB0bCx0aGlzLm51bGxHZW9tZXRyeUZlYXR1cmVzXz17fSx0aGlzLmlkSW5kZXhfPXt9LHRoaXMudW5kZWZJZEluZGV4Xz17fSx0aGlzLmZlYXR1cmVDaGFuZ2VLZXlzXz17fSx0aGlzLmZlYXR1cmVzQ29sbGVjdGlvbl89bnVsbCxBcnJheS5pc0FycmF5KGkuZmVhdHVyZXMpP249aS5mZWF0dXJlczppLmZlYXR1cmVzJiYobj0ocj1pLmZlYXR1cmVzKS5nZXRBcnJheSgpKSxvfHx2b2lkIDAhPT1yfHwocj1uZXcgVShuKSksdm9pZCAwIT09biYmdGhpcy5hZGRGZWF0dXJlc0ludGVybmFsKG4pLHZvaWQgMCE9PXImJnRoaXMuYmluZEZlYXR1cmVzQ29sbGVjdGlvbl8ocil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmFkZEZlYXR1cmU9ZnVuY3Rpb24odCl7dGhpcy5hZGRGZWF0dXJlSW50ZXJuYWwodCksdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmFkZEZlYXR1cmVJbnRlcm5hbD1mdW5jdGlvbih0KXt2YXIgZT1vKHQpO2lmKHRoaXMuYWRkVG9JbmRleF8oZSx0KSl7dGhpcy5zZXR1cENoYW5nZUV2ZW50c18oZSx0KTt2YXIgaT10LmdldEdlb21ldHJ5KCk7aWYoaSl7dmFyIHI9aS5nZXRFeHRlbnQoKTt0aGlzLmZlYXR1cmVzUnRyZWVfJiZ0aGlzLmZlYXR1cmVzUnRyZWVfLmluc2VydChyLHQpfWVsc2UgdGhpcy5udWxsR2VvbWV0cnlGZWF0dXJlc19bZV09dDt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IG5wKHJwLkFEREZFQVRVUkUsdCkpfX0sZS5wcm90b3R5cGUuc2V0dXBDaGFuZ2VFdmVudHNfPWZ1bmN0aW9uKHQsZSl7dGhpcy5mZWF0dXJlQ2hhbmdlS2V5c19bdF09W3YoZSxNLkNIQU5HRSx0aGlzLmhhbmRsZUZlYXR1cmVDaGFuZ2VfLHRoaXMpLHYoZSxsLHRoaXMuaGFuZGxlRmVhdHVyZUNoYW5nZV8sdGhpcyldfSxlLnByb3RvdHlwZS5hZGRUb0luZGV4Xz1mdW5jdGlvbih0LGUpe3ZhciBpPSEwLHI9ZS5nZXRJZCgpO3JldHVybiB2b2lkIDAhPT1yP3IudG9TdHJpbmcoKWluIHRoaXMuaWRJbmRleF8/aT0hMTp0aGlzLmlkSW5kZXhfW3IudG9TdHJpbmcoKV09ZTooWSghKHQgaW4gdGhpcy51bmRlZklkSW5kZXhfKSwzMCksdGhpcy51bmRlZklkSW5kZXhfW3RdPWUpLGl9LGUucHJvdG90eXBlLmFkZEZlYXR1cmVzPWZ1bmN0aW9uKHQpe3RoaXMuYWRkRmVhdHVyZXNJbnRlcm5hbCh0KSx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuYWRkRmVhdHVyZXNJbnRlcm5hbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT1bXSxyPVtdLG49MCxzPXQubGVuZ3RoO248cztuKyspe3ZhciBhPXRbbl0saD1vKGEpO3RoaXMuYWRkVG9JbmRleF8oaCxhKSYmaS5wdXNoKGEpfWZvcih2YXIgbD0wLHU9aS5sZW5ndGg7bDx1O2wrKyl7dmFyIHA9aVtsXSxjPW8ocCk7dGhpcy5zZXR1cENoYW5nZUV2ZW50c18oYyxwKTt2YXIgZD1wLmdldEdlb21ldHJ5KCk7aWYoZCl7dmFyIGY9ZC5nZXRFeHRlbnQoKTtlLnB1c2goZiksci5wdXNoKHApfWVsc2UgdGhpcy5udWxsR2VvbWV0cnlGZWF0dXJlc19bY109cH10aGlzLmZlYXR1cmVzUnRyZWVfJiZ0aGlzLmZlYXR1cmVzUnRyZWVfLmxvYWQoZSxyKTtmb3IodmFyIF89MCxnPWkubGVuZ3RoO188ZztfKyspdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBucChycC5BRERGRUFUVVJFLGlbX10pKX0sZS5wcm90b3R5cGUuYmluZEZlYXR1cmVzQ29sbGVjdGlvbl89ZnVuY3Rpb24odCl7dmFyIGU9ITE7dih0aGlzLHJwLkFEREZFQVRVUkUsZnVuY3Rpb24oaSl7ZXx8KGU9ITAsdC5wdXNoKGkuZmVhdHVyZSksZT0hMSl9KSx2KHRoaXMscnAuUkVNT1ZFRkVBVFVSRSxmdW5jdGlvbihpKXtlfHwoZT0hMCx0LnJlbW92ZShpLmZlYXR1cmUpLGU9ITEpfSksdih0LGguQURELGZ1bmN0aW9uKHQpe2V8fChlPSEwLHRoaXMuYWRkRmVhdHVyZSh0LmVsZW1lbnQpLGU9ITEpfSx0aGlzKSx2KHQsaC5SRU1PVkUsZnVuY3Rpb24odCl7ZXx8KGU9ITAsdGhpcy5yZW1vdmVGZWF0dXJlKHQuZWxlbWVudCksZT0hMSl9LHRoaXMpLHRoaXMuZmVhdHVyZXNDb2xsZWN0aW9uXz10fSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbih0KXtpZih0KXtmb3IodmFyIGUgaW4gdGhpcy5mZWF0dXJlQ2hhbmdlS2V5c18pe3RoaXMuZmVhdHVyZUNoYW5nZUtleXNfW2VdLmZvckVhY2goRSl9dGhpcy5mZWF0dXJlc0NvbGxlY3Rpb25ffHwodGhpcy5mZWF0dXJlQ2hhbmdlS2V5c189e30sdGhpcy5pZEluZGV4Xz17fSx0aGlzLnVuZGVmSWRJbmRleF89e30pfWVsc2UgaWYodGhpcy5mZWF0dXJlc1J0cmVlXylmb3IodmFyIGkgaW4gdGhpcy5mZWF0dXJlc1J0cmVlXy5mb3JFYWNoKHRoaXMucmVtb3ZlRmVhdHVyZUludGVybmFsLHRoaXMpLHRoaXMubnVsbEdlb21ldHJ5RmVhdHVyZXNfKXRoaXMucmVtb3ZlRmVhdHVyZUludGVybmFsKHRoaXMubnVsbEdlb21ldHJ5RmVhdHVyZXNfW2ldKTt0aGlzLmZlYXR1cmVzQ29sbGVjdGlvbl8mJnRoaXMuZmVhdHVyZXNDb2xsZWN0aW9uXy5jbGVhcigpLHRoaXMuZmVhdHVyZXNSdHJlZV8mJnRoaXMuZmVhdHVyZXNSdHJlZV8uY2xlYXIoKSx0aGlzLmxvYWRlZEV4dGVudHNSdHJlZV8uY2xlYXIoKSx0aGlzLm51bGxHZW9tZXRyeUZlYXR1cmVzXz17fTt2YXIgcj1uZXcgbnAocnAuQ0xFQVIpO3RoaXMuZGlzcGF0Y2hFdmVudChyKSx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuZm9yRWFjaEZlYXR1cmU9ZnVuY3Rpb24odCl7aWYodGhpcy5mZWF0dXJlc1J0cmVlXylyZXR1cm4gdGhpcy5mZWF0dXJlc1J0cmVlXy5mb3JFYWNoKHQpO3RoaXMuZmVhdHVyZXNDb2xsZWN0aW9uXyYmdGhpcy5mZWF0dXJlc0NvbGxlY3Rpb25fLmZvckVhY2godCl9LGUucHJvdG90eXBlLmZvckVhY2hGZWF0dXJlQXRDb29yZGluYXRlRGlyZWN0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9W3RbMF0sdFsxXSx0WzBdLHRbMV1dO3JldHVybiB0aGlzLmZvckVhY2hGZWF0dXJlSW5FeHRlbnQoaSxmdW5jdGlvbihpKXtyZXR1cm4gaS5nZXRHZW9tZXRyeSgpLmludGVyc2VjdHNDb29yZGluYXRlKHQpP2UoaSk6dm9pZCAwfSl9LGUucHJvdG90eXBlLmZvckVhY2hGZWF0dXJlSW5FeHRlbnQ9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmZlYXR1cmVzUnRyZWVfKXJldHVybiB0aGlzLmZlYXR1cmVzUnRyZWVfLmZvckVhY2hJbkV4dGVudCh0LGUpO3RoaXMuZmVhdHVyZXNDb2xsZWN0aW9uXyYmdGhpcy5mZWF0dXJlc0NvbGxlY3Rpb25fLmZvckVhY2goZSl9LGUucHJvdG90eXBlLmZvckVhY2hGZWF0dXJlSW50ZXJzZWN0aW5nRXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZm9yRWFjaEZlYXR1cmVJbkV4dGVudCh0LGZ1bmN0aW9uKGkpe2lmKGkuZ2V0R2VvbWV0cnkoKS5pbnRlcnNlY3RzRXh0ZW50KHQpKXt2YXIgcj1lKGkpO2lmKHIpcmV0dXJuIHJ9fSl9LGUucHJvdG90eXBlLmdldEZlYXR1cmVzQ29sbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZlYXR1cmVzQ29sbGVjdGlvbl99LGUucHJvdG90eXBlLmdldEZlYXR1cmVzPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMuZmVhdHVyZXNDb2xsZWN0aW9uXz90PXRoaXMuZmVhdHVyZXNDb2xsZWN0aW9uXy5nZXRBcnJheSgpOnRoaXMuZmVhdHVyZXNSdHJlZV8mJih0PXRoaXMuZmVhdHVyZXNSdHJlZV8uZ2V0QWxsKCksZCh0aGlzLm51bGxHZW9tZXRyeUZlYXR1cmVzXyl8fEsodCxjKHRoaXMubnVsbEdlb21ldHJ5RmVhdHVyZXNfKSkpLHR9LGUucHJvdG90eXBlLmdldEZlYXR1cmVzQXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0aGlzLmZvckVhY2hGZWF0dXJlQXRDb29yZGluYXRlRGlyZWN0KHQsZnVuY3Rpb24odCl7ZS5wdXNoKHQpfSksZX0sZS5wcm90b3R5cGUuZ2V0RmVhdHVyZXNJbkV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mZWF0dXJlc1J0cmVlXy5nZXRJbkV4dGVudCh0KX0sZS5wcm90b3R5cGUuZ2V0Q2xvc2VzdEZlYXR1cmVUb0Nvb3JkaW5hdGU9ZnVuY3Rpb24odCxlKXt2YXIgaT10WzBdLHI9dFsxXSxuPW51bGwsbz1bTmFOLE5hTl0scz0xLzAsYT1bLTEvMCwtMS8wLDEvMCwxLzBdLGg9ZXx8UjtyZXR1cm4gdGhpcy5mZWF0dXJlc1J0cmVlXy5mb3JFYWNoSW5FeHRlbnQoYSxmdW5jdGlvbih0KXtpZihoKHQpKXt2YXIgZT10LmdldEdlb21ldHJ5KCksbD1zO2lmKChzPWUuY2xvc2VzdFBvaW50WFkoaSxyLG8scykpPGwpe249dDt2YXIgdT1NYXRoLnNxcnQocyk7YVswXT1pLXUsYVsxXT1yLXUsYVsyXT1pK3UsYVszXT1yK3V9fX0pLG59LGUucHJvdG90eXBlLmdldEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mZWF0dXJlc1J0cmVlXy5nZXRFeHRlbnQodCl9LGUucHJvdG90eXBlLmdldEZlYXR1cmVCeUlkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaWRJbmRleF9bdC50b1N0cmluZygpXTtyZXR1cm4gdm9pZCAwIT09ZT9lOm51bGx9LGUucHJvdG90eXBlLmdldEZvcm1hdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZvcm1hdF99LGUucHJvdG90eXBlLmdldE92ZXJsYXBzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3ZlcmxhcHNffSxlLnByb3RvdHlwZS5nZXRVcmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cmxffSxlLnByb3RvdHlwZS5oYW5kbGVGZWF0dXJlQ2hhbmdlXz1mdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldCxpPW8oZSkscj1lLmdldEdlb21ldHJ5KCk7aWYocil7dmFyIG49ci5nZXRFeHRlbnQoKTtpIGluIHRoaXMubnVsbEdlb21ldHJ5RmVhdHVyZXNfPyhkZWxldGUgdGhpcy5udWxsR2VvbWV0cnlGZWF0dXJlc19baV0sdGhpcy5mZWF0dXJlc1J0cmVlXyYmdGhpcy5mZWF0dXJlc1J0cmVlXy5pbnNlcnQobixlKSk6dGhpcy5mZWF0dXJlc1J0cmVlXyYmdGhpcy5mZWF0dXJlc1J0cmVlXy51cGRhdGUobixlKX1lbHNlIGkgaW4gdGhpcy5udWxsR2VvbWV0cnlGZWF0dXJlc198fCh0aGlzLmZlYXR1cmVzUnRyZWVfJiZ0aGlzLmZlYXR1cmVzUnRyZWVfLnJlbW92ZShlKSx0aGlzLm51bGxHZW9tZXRyeUZlYXR1cmVzX1tpXT1lKTt2YXIgcz1lLmdldElkKCk7aWYodm9pZCAwIT09cyl7dmFyIGE9cy50b1N0cmluZygpO2kgaW4gdGhpcy51bmRlZklkSW5kZXhfPyhkZWxldGUgdGhpcy51bmRlZklkSW5kZXhfW2ldLHRoaXMuaWRJbmRleF9bYV09ZSk6dGhpcy5pZEluZGV4X1thXSE9PWUmJih0aGlzLnJlbW92ZUZyb21JZEluZGV4XyhlKSx0aGlzLmlkSW5kZXhfW2FdPWUpfWVsc2UgaSBpbiB0aGlzLnVuZGVmSWRJbmRleF98fCh0aGlzLnJlbW92ZUZyb21JZEluZGV4XyhlKSx0aGlzLnVuZGVmSWRJbmRleF9baV09ZSk7dGhpcy5jaGFuZ2VkKCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBucChycC5DSEFOR0VGRUFUVVJFLGUpKX0sZS5wcm90b3R5cGUuaGFzRmVhdHVyZT1mdW5jdGlvbih0KXt2YXIgZT10LmdldElkKCk7cmV0dXJuIHZvaWQgMCE9PWU/ZSBpbiB0aGlzLmlkSW5kZXhfOm8odClpbiB0aGlzLnVuZGVmSWRJbmRleF99LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mZWF0dXJlc1J0cmVlXy5pc0VtcHR5KCkmJmQodGhpcy5udWxsR2VvbWV0cnlGZWF0dXJlc18pfSxlLnByb3RvdHlwZS5sb2FkRmVhdHVyZXM9ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMsbj10aGlzLmxvYWRlZEV4dGVudHNSdHJlZV8sbz10aGlzLnN0cmF0ZWd5Xyh0LGUpO3RoaXMubG9hZGluZz0hMTtmb3IodmFyIHM9ZnVuY3Rpb24odCxzKXt2YXIgYT1vW3RdO24uZm9yRWFjaEluRXh0ZW50KGEsZnVuY3Rpb24odCl7cmV0dXJuIG90KHQuZXh0ZW50LGEpfSl8fChyLmxvYWRlcl8uY2FsbChyLGEsZSxpKSxuLmluc2VydChhLHtleHRlbnQ6YS5zbGljZSgpfSksci5sb2FkaW5nPXIubG9hZGVyXyE9PUkpfSxhPTAsaD1vLmxlbmd0aDthPGg7KythKXMoYSl9LGUucHJvdG90eXBlLnJlbW92ZUxvYWRlZEV4dGVudD1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMubG9hZGVkRXh0ZW50c1J0cmVlXztpLmZvckVhY2hJbkV4dGVudCh0LGZ1bmN0aW9uKGkpe2lmKGR0KGkuZXh0ZW50LHQpKXJldHVybiBlPWksITB9KSxlJiZpLnJlbW92ZShlKX0sZS5wcm90b3R5cGUucmVtb3ZlRmVhdHVyZT1mdW5jdGlvbih0KXt2YXIgZT1vKHQpO2UgaW4gdGhpcy5udWxsR2VvbWV0cnlGZWF0dXJlc18/ZGVsZXRlIHRoaXMubnVsbEdlb21ldHJ5RmVhdHVyZXNfW2VdOnRoaXMuZmVhdHVyZXNSdHJlZV8mJnRoaXMuZmVhdHVyZXNSdHJlZV8ucmVtb3ZlKHQpLHRoaXMucmVtb3ZlRmVhdHVyZUludGVybmFsKHQpLHRoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5yZW1vdmVGZWF0dXJlSW50ZXJuYWw9ZnVuY3Rpb24odCl7dmFyIGU9byh0KTt0aGlzLmZlYXR1cmVDaGFuZ2VLZXlzX1tlXS5mb3JFYWNoKEUpLGRlbGV0ZSB0aGlzLmZlYXR1cmVDaGFuZ2VLZXlzX1tlXTt2YXIgaT10LmdldElkKCk7dm9pZCAwIT09aT9kZWxldGUgdGhpcy5pZEluZGV4X1tpLnRvU3RyaW5nKCldOmRlbGV0ZSB0aGlzLnVuZGVmSWRJbmRleF9bZV0sdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBucChycC5SRU1PVkVGRUFUVVJFLHQpKX0sZS5wcm90b3R5cGUucmVtb3ZlRnJvbUlkSW5kZXhfPWZ1bmN0aW9uKHQpe3ZhciBlPSExO2Zvcih2YXIgaSBpbiB0aGlzLmlkSW5kZXhfKWlmKHRoaXMuaWRJbmRleF9baV09PT10KXtkZWxldGUgdGhpcy5pZEluZGV4X1tpXSxlPSEwO2JyZWFrfXJldHVybiBlfSxlLnByb3RvdHlwZS5zZXRMb2FkZXI9ZnVuY3Rpb24odCl7dGhpcy5sb2FkZXJfPXR9LGV9KElsKSxzcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLHthdHRyaWJ1dGlvbnM6ZS5hdHRyaWJ1dGlvbnMsd3JhcFg6ZS53cmFwWH0pLHRoaXMucmVzb2x1dGlvbj12b2lkIDAsdGhpcy5kaXN0YW5jZT12b2lkIDAhPT1lLmRpc3RhbmNlP2UuZGlzdGFuY2U6MjAsdGhpcy5mZWF0dXJlcz1bXSx0aGlzLmdlb21ldHJ5RnVuY3Rpb249ZS5nZW9tZXRyeUZ1bmN0aW9ufHxmdW5jdGlvbih0KXt2YXIgZT10LmdldEdlb21ldHJ5KCk7cmV0dXJuIFkoZS5nZXRUeXBlKCk9PU50LlBPSU5ULDEwKSxlfSx0aGlzLnNvdXJjZT1lLnNvdXJjZSx2KHRoaXMuc291cmNlLE0uQ0hBTkdFLHRoaXMucmVmcmVzaCx0aGlzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXN0YW5jZX0sZS5wcm90b3R5cGUuZ2V0U291cmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc291cmNlfSxlLnByb3RvdHlwZS5sb2FkRmVhdHVyZXM9ZnVuY3Rpb24odCxlLGkpe3RoaXMuc291cmNlLmxvYWRGZWF0dXJlcyh0LGUsaSksZSE9PXRoaXMucmVzb2x1dGlvbiYmKHRoaXMuY2xlYXIoKSx0aGlzLnJlc29sdXRpb249ZSx0aGlzLmNsdXN0ZXIoKSx0aGlzLmFkZEZlYXR1cmVzKHRoaXMuZmVhdHVyZXMpKX0sZS5wcm90b3R5cGUuc2V0RGlzdGFuY2U9ZnVuY3Rpb24odCl7dGhpcy5kaXN0YW5jZT10LHRoaXMucmVmcmVzaCgpfSxlLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcigpLHRoaXMuY2x1c3RlcigpLHRoaXMuYWRkRmVhdHVyZXModGhpcy5mZWF0dXJlcyksdC5wcm90b3R5cGUucmVmcmVzaC5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5jbHVzdGVyPWZ1bmN0aW9uKCl7aWYodm9pZCAwIT09dGhpcy5yZXNvbHV0aW9uKXt0aGlzLmZlYXR1cmVzLmxlbmd0aD0wO2Zvcih2YXIgdD1bMS8wLDEvMCwtMS8wLC0xLzBdLGU9dGhpcy5kaXN0YW5jZSp0aGlzLnJlc29sdXRpb24saT10aGlzLnNvdXJjZS5nZXRGZWF0dXJlcygpLHI9e30sbj0wLHM9aS5sZW5ndGg7bjxzO24rKyl7dmFyIGE9aVtuXTtpZighKG8oYSlpbiByKSl7dmFyIGg9dGhpcy5nZW9tZXRyeUZ1bmN0aW9uKGEpO2lmKGgpe3B0KGguZ2V0Q29vcmRpbmF0ZXMoKSx0KSxldCh0LGUsdCk7dmFyIGw9dGhpcy5zb3VyY2UuZ2V0RmVhdHVyZXNJbkV4dGVudCh0KTtsPWwuZmlsdGVyKGZ1bmN0aW9uKHQpe3ZhciBlPW8odCk7cmV0dXJuIShlIGluIHIpJiYocltlXT0hMCwhMCl9KSx0aGlzLmZlYXR1cmVzLnB1c2godGhpcy5jcmVhdGVDbHVzdGVyKGwpKX19fX19LGUucHJvdG90eXBlLmNyZWF0ZUNsdXN0ZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVswLDBdLGk9dC5sZW5ndGgtMTtpPj0wOy0taSl7dmFyIHI9dGhpcy5nZW9tZXRyeUZ1bmN0aW9uKHRbaV0pO3I/SGkoZSxyLmdldENvb3JkaW5hdGVzKCkpOnQuc3BsaWNlKGksMSl9dHIoZSwxL3QubGVuZ3RoKTt2YXIgbj1uZXcgQihuZXcgY2koZSkpO3JldHVybiBuLnNldCgiZmVhdHVyZXMiLHQpLG59LGV9KG9wKSxhcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4sbyxzKXt2YXIgYT1lLmdldEV4dGVudCgpLGg9aS5nZXRFeHRlbnQoKSxsPWg/d3QocixoKTpyLHU9QnUoZSxpLFR0KGwpLG4pLHA9bmV3IFd1KGUsaSxsLGEsdSp2cyksYz1zKHAuY2FsY3VsYXRlU291cmNlRXh0ZW50KCksdSxvKSxkPXhzLkxPQURFRDtjJiYoZD14cy5JRExFKTt2YXIgZj1jP2MuZ2V0UGl4ZWxSYXRpbygpOjE7dC5jYWxsKHRoaXMscixuLGYsZCksdGhpcy50YXJnZXRQcm9qXz1pLHRoaXMubWF4U291cmNlRXh0ZW50Xz1hLHRoaXMudHJpYW5ndWxhdGlvbl89cCx0aGlzLnRhcmdldFJlc29sdXRpb25fPW4sdGhpcy50YXJnZXRFeHRlbnRfPXIsdGhpcy5zb3VyY2VJbWFnZV89Yyx0aGlzLnNvdXJjZVBpeGVsUmF0aW9fPWYsdGhpcy5jYW52YXNfPW51bGwsdGhpcy5zb3VyY2VMaXN0ZW5lcktleV89bnVsbH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsPWZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT09eHMuTE9BRElORyYmdGhpcy51bmxpc3RlblNvdXJjZV8oKSx0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuZ2V0SW1hZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXNffSxlLnByb3RvdHlwZS5nZXRQcm9qZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFyZ2V0UHJval99LGUucHJvdG90eXBlLnJlcHJvamVjdF89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNvdXJjZUltYWdlXy5nZXRTdGF0ZSgpO2lmKHQ9PXhzLkxPQURFRCl7dmFyIGU9T3QodGhpcy50YXJnZXRFeHRlbnRfKS90aGlzLnRhcmdldFJlc29sdXRpb25fLGk9UnQodGhpcy50YXJnZXRFeHRlbnRfKS90aGlzLnRhcmdldFJlc29sdXRpb25fO3RoaXMuY2FudmFzXz1YdShlLGksdGhpcy5zb3VyY2VQaXhlbFJhdGlvXyx0aGlzLnNvdXJjZUltYWdlXy5nZXRSZXNvbHV0aW9uKCksdGhpcy5tYXhTb3VyY2VFeHRlbnRfLHRoaXMudGFyZ2V0UmVzb2x1dGlvbl8sdGhpcy50YXJnZXRFeHRlbnRfLHRoaXMudHJpYW5ndWxhdGlvbl8sW3tleHRlbnQ6dGhpcy5zb3VyY2VJbWFnZV8uZ2V0RXh0ZW50KCksaW1hZ2U6dGhpcy5zb3VyY2VJbWFnZV8uZ2V0SW1hZ2UoKX1dLDApfXRoaXMuc3RhdGU9dCx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe2lmKHRoaXMuc3RhdGU9PXhzLklETEUpe3RoaXMuc3RhdGU9eHMuTE9BRElORyx0aGlzLmNoYW5nZWQoKTt2YXIgdD10aGlzLnNvdXJjZUltYWdlXy5nZXRTdGF0ZSgpO3Q9PXhzLkxPQURFRHx8dD09eHMuRVJST1I/dGhpcy5yZXByb2plY3RfKCk6KHRoaXMuc291cmNlTGlzdGVuZXJLZXlfPXYodGhpcy5zb3VyY2VJbWFnZV8sTS5DSEFOR0UsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zb3VyY2VJbWFnZV8uZ2V0U3RhdGUoKTtlIT14cy5MT0FERUQmJmUhPXhzLkVSUk9SfHwodGhpcy51bmxpc3RlblNvdXJjZV8oKSx0aGlzLnJlcHJvamVjdF8oKSl9LHRoaXMpLHRoaXMuc291cmNlSW1hZ2VfLmxvYWQoKSl9fSxlLnByb3RvdHlwZS51bmxpc3RlblNvdXJjZV89ZnVuY3Rpb24oKXtFKHRoaXMuc291cmNlTGlzdGVuZXJLZXlfKSx0aGlzLnNvdXJjZUxpc3RlbmVyS2V5Xz1udWxsfSxlfShtcyksaHA9ImltYWdlbG9hZHN0YXJ0IixscD0iaW1hZ2Vsb2FkZW5kIix1cD0iaW1hZ2Vsb2FkZXJyb3IiLHBwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcyxlKSx0aGlzLmltYWdlPWl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KFApO2Z1bmN0aW9uIGNwKHQsZSl7dC5nZXRJbWFnZSgpLnNyYz1lfXZhciBkcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLHthdHRyaWJ1dGlvbnM6ZS5hdHRyaWJ1dGlvbnMscHJvamVjdGlvbjplLnByb2plY3Rpb24sc3RhdGU6ZS5zdGF0ZX0pLHRoaXMucmVzb2x1dGlvbnNfPXZvaWQgMCE9PWUucmVzb2x1dGlvbnM/ZS5yZXNvbHV0aW9uczpudWxsLHRoaXMucmVwcm9qZWN0ZWRJbWFnZV89bnVsbCx0aGlzLnJlcHJvamVjdGVkUmV2aXNpb25fPTB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldFJlc29sdXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzb2x1dGlvbnNffSxlLnByb3RvdHlwZS5maW5kTmVhcmVzdFJlc29sdXRpb249ZnVuY3Rpb24odCl7aWYodGhpcy5yZXNvbHV0aW9uc18pe3ZhciBlPXoodGhpcy5yZXNvbHV0aW9uc18sdCwwKTt0PXRoaXMucmVzb2x1dGlvbnNfW2VdfXJldHVybiB0fSxlLnByb3RvdHlwZS5nZXRJbWFnZT1mdW5jdGlvbih0LGUsaSxyKXt2YXIgbj10aGlzLmdldFByb2plY3Rpb24oKTtpZihuJiZyJiYhSWUobixyKSl7aWYodGhpcy5yZXByb2plY3RlZEltYWdlXyl7aWYodGhpcy5yZXByb2plY3RlZFJldmlzaW9uXz09dGhpcy5nZXRSZXZpc2lvbigpJiZJZSh0aGlzLnJlcHJvamVjdGVkSW1hZ2VfLmdldFByb2plY3Rpb24oKSxyKSYmdGhpcy5yZXByb2plY3RlZEltYWdlXy5nZXRSZXNvbHV0aW9uKCk9PWUmJmR0KHRoaXMucmVwcm9qZWN0ZWRJbWFnZV8uZ2V0RXh0ZW50KCksdCkpcmV0dXJuIHRoaXMucmVwcm9qZWN0ZWRJbWFnZV87dGhpcy5yZXByb2plY3RlZEltYWdlXy5kaXNwb3NlKCksdGhpcy5yZXByb2plY3RlZEltYWdlXz1udWxsfXJldHVybiB0aGlzLnJlcHJvamVjdGVkSW1hZ2VfPW5ldyBhcChuLHIsdCxlLGksZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmdldEltYWdlSW50ZXJuYWwodCxlLGksbil9LmJpbmQodGhpcykpLHRoaXMucmVwcm9qZWN0ZWRSZXZpc2lvbl89dGhpcy5nZXRSZXZpc2lvbigpLHRoaXMucmVwcm9qZWN0ZWRJbWFnZV99cmV0dXJuIG4mJihyPW4pLHRoaXMuZ2V0SW1hZ2VJbnRlcm5hbCh0LGUsaSxyKX0sZS5wcm90b3R5cGUuZ2V0SW1hZ2VJbnRlcm5hbD1mdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS5oYW5kbGVJbWFnZUNoYW5nZT1mdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtzd2l0Y2goZS5nZXRTdGF0ZSgpKXtjYXNlIHhzLkxPQURJTkc6dGhpcy5sb2FkaW5nPSEwLHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgcHAoaHAsZSkpO2JyZWFrO2Nhc2UgeHMuTE9BREVEOnRoaXMubG9hZGluZz0hMSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHBwKGxwLGUpKTticmVhaztjYXNlIHhzLkVSUk9SOnRoaXMubG9hZGluZz0hMSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHBwKHVwLGUpKX19LGV9KElsKSxmcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4sbyxzKXt0LmNhbGwodGhpcyxlLGkscix4cy5JRExFKSx0aGlzLnNyY189bix0aGlzLmltYWdlXz1uZXcgSW1hZ2UsbnVsbCE9PW8mJih0aGlzLmltYWdlXy5jcm9zc09yaWdpbj1vKSx0aGlzLmltYWdlTGlzdGVuZXJLZXlzXz1udWxsLHRoaXMuc3RhdGU9eHMuSURMRSx0aGlzLmltYWdlTG9hZEZ1bmN0aW9uXz1zfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRJbWFnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmltYWdlX30sZS5wcm90b3R5cGUuaGFuZGxlSW1hZ2VFcnJvcl89ZnVuY3Rpb24oKXt0aGlzLnN0YXRlPXhzLkVSUk9SLHRoaXMudW5saXN0ZW5JbWFnZV8oKSx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuaGFuZGxlSW1hZ2VMb2FkXz1mdW5jdGlvbigpe3ZvaWQgMD09PXRoaXMucmVzb2x1dGlvbiYmKHRoaXMucmVzb2x1dGlvbj1SdCh0aGlzLmV4dGVudCkvdGhpcy5pbWFnZV8uaGVpZ2h0KSx0aGlzLnN0YXRlPXhzLkxPQURFRCx0aGlzLnVubGlzdGVuSW1hZ2VfKCksdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt0aGlzLnN0YXRlIT14cy5JRExFJiZ0aGlzLnN0YXRlIT14cy5FUlJPUnx8KHRoaXMuc3RhdGU9eHMuTE9BRElORyx0aGlzLmNoYW5nZWQoKSx0aGlzLmltYWdlTGlzdGVuZXJLZXlzXz1bbSh0aGlzLmltYWdlXyxNLkVSUk9SLHRoaXMuaGFuZGxlSW1hZ2VFcnJvcl8sdGhpcyksbSh0aGlzLmltYWdlXyxNLkxPQUQsdGhpcy5oYW5kbGVJbWFnZUxvYWRfLHRoaXMpXSx0aGlzLmltYWdlTG9hZEZ1bmN0aW9uXyh0aGlzLHRoaXMuc3JjXykpfSxlLnByb3RvdHlwZS5zZXRJbWFnZT1mdW5jdGlvbih0KXt0aGlzLmltYWdlXz10fSxlLnByb3RvdHlwZS51bmxpc3RlbkltYWdlXz1mdW5jdGlvbigpe3RoaXMuaW1hZ2VMaXN0ZW5lcktleXNfLmZvckVhY2goRSksdGhpcy5pbWFnZUxpc3RlbmVyS2V5c189bnVsbH0sZX0obXMpO2Z1bmN0aW9uIF9wKHQsZSl7dmFyIGk9W107T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXtudWxsIT09ZVt0XSYmdm9pZCAwIT09ZVt0XSYmaS5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW3RdKSl9KTt2YXIgcj1pLmpvaW4oIiYiKTtyZXR1cm4odD0tMT09PSh0PXQucmVwbGFjZSgvWz8mXSQvLCIiKSkuaW5kZXhPZigiPyIpP3QrIj8iOnQrIiYiKStyfXZhciBncD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9O3QuY2FsbCh0aGlzLHthdHRyaWJ1dGlvbnM6aS5hdHRyaWJ1dGlvbnMscHJvamVjdGlvbjppLnByb2plY3Rpb24scmVzb2x1dGlvbnM6aS5yZXNvbHV0aW9uc30pLHRoaXMuY3Jvc3NPcmlnaW5fPXZvaWQgMCE9PWkuY3Jvc3NPcmlnaW4/aS5jcm9zc09yaWdpbjpudWxsLHRoaXMuaGlkcGlfPXZvaWQgMD09PWkuaGlkcGl8fGkuaGlkcGksdGhpcy51cmxfPWkudXJsLHRoaXMuaW1hZ2VMb2FkRnVuY3Rpb25fPXZvaWQgMCE9PWkuaW1hZ2VMb2FkRnVuY3Rpb24/aS5pbWFnZUxvYWRGdW5jdGlvbjpjcCx0aGlzLnBhcmFtc189aS5wYXJhbXN8fHt9LHRoaXMuaW1hZ2VfPW51bGwsdGhpcy5pbWFnZVNpemVfPVswLDBdLHRoaXMucmVuZGVyZWRSZXZpc2lvbl89MCx0aGlzLnJhdGlvXz12b2lkIDAhPT1pLnJhdGlvP2kucmF0aW86MS41fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRQYXJhbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJhbXNffSxlLnByb3RvdHlwZS5nZXRJbWFnZUludGVybmFsPWZ1bmN0aW9uKHQsZSxpLHIpe2lmKHZvaWQgMD09PXRoaXMudXJsXylyZXR1cm4gbnVsbDtlPXRoaXMuZmluZE5lYXJlc3RSZXNvbHV0aW9uKGUpLGk9dGhpcy5oaWRwaV8/aToxO3ZhciBuPXRoaXMuaW1hZ2VfO2lmKG4mJnRoaXMucmVuZGVyZWRSZXZpc2lvbl89PXRoaXMuZ2V0UmV2aXNpb24oKSYmbi5nZXRSZXNvbHV0aW9uKCk9PWUmJm4uZ2V0UGl4ZWxSYXRpbygpPT1pJiZvdChuLmdldEV4dGVudCgpLHQpKXJldHVybiBuO3ZhciBvPXtGOiJpbWFnZSIsRk9STUFUOiJQTkczMiIsVFJBTlNQQVJFTlQ6ITB9O3Uobyx0aGlzLnBhcmFtc18pO3ZhciBzPSgodD10LnNsaWNlKCkpWzBdK3RbMl0pLzIsYT0odFsxXSt0WzNdKS8yO2lmKDEhPXRoaXMucmF0aW9fKXt2YXIgaD10aGlzLnJhdGlvXypPdCh0KS8yLGw9dGhpcy5yYXRpb18qUnQodCkvMjt0WzBdPXMtaCx0WzFdPWEtbCx0WzJdPXMraCx0WzNdPWErbH12YXIgcD1lL2ksYz1NYXRoLmNlaWwoT3QodCkvcCksZD1NYXRoLmNlaWwoUnQodCkvcCk7dFswXT1zLXAqYy8yLHRbMl09cytwKmMvMix0WzFdPWEtcCpkLzIsdFszXT1hK3AqZC8yLHRoaXMuaW1hZ2VTaXplX1swXT1jLHRoaXMuaW1hZ2VTaXplX1sxXT1kO3ZhciBmPXRoaXMuZ2V0UmVxdWVzdFVybF8odCx0aGlzLmltYWdlU2l6ZV8saSxyLG8pO3JldHVybiB0aGlzLmltYWdlXz1uZXcgZnAodCxlLGksZix0aGlzLmNyb3NzT3JpZ2luXyx0aGlzLmltYWdlTG9hZEZ1bmN0aW9uXyksdGhpcy5yZW5kZXJlZFJldmlzaW9uXz10aGlzLmdldFJldmlzaW9uKCksdih0aGlzLmltYWdlXyxNLkNIQU5HRSx0aGlzLmhhbmRsZUltYWdlQ2hhbmdlLHRoaXMpLHRoaXMuaW1hZ2VffSxlLnByb3RvdHlwZS5nZXRJbWFnZUxvYWRGdW5jdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmltYWdlTG9hZEZ1bmN0aW9uX30sZS5wcm90b3R5cGUuZ2V0UmVxdWVzdFVybF89ZnVuY3Rpb24odCxlLGkscixuKXt2YXIgbz1yLmdldENvZGUoKS5zcGxpdCgiOiIpLnBvcCgpO24uU0laRT1lWzBdKyIsIitlWzFdLG4uQkJPWD10LmpvaW4oIiwiKSxuLkJCT1hTUj1vLG4uSU1BR0VTUj1vLG4uRFBJPU1hdGgucm91bmQoOTAqaSk7dmFyIHM9dGhpcy51cmxfLGE9cy5yZXBsYWNlKC9NYXBTZXJ2ZXJcLz8kLywiTWFwU2VydmVyL2V4cG9ydCIpLnJlcGxhY2UoL0ltYWdlU2VydmVyXC8/JC8sIkltYWdlU2VydmVyL2V4cG9ydEltYWdlIik7cmV0dXJuIGE9PXMmJlkoITEsNTApLF9wKGEsbil9LGUucHJvdG90eXBlLmdldFVybD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVybF99LGUucHJvdG90eXBlLnNldEltYWdlTG9hZEZ1bmN0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaW1hZ2VfPW51bGwsdGhpcy5pbWFnZUxvYWRGdW5jdGlvbl89dCx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuc2V0VXJsPWZ1bmN0aW9uKHQpe3QhPXRoaXMudXJsXyYmKHRoaXMudXJsXz10LHRoaXMuaW1hZ2VfPW51bGwsdGhpcy5jaGFuZ2VkKCkpfSxlLnByb3RvdHlwZS51cGRhdGVQYXJhbXM9ZnVuY3Rpb24odCl7dSh0aGlzLnBhcmFtc18sdCksdGhpcy5pbWFnZV89bnVsbCx0aGlzLmNoYW5nZWQoKX0sZX0oZHApLHlwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e307dC5jYWxsKHRoaXMse2F0dHJpYnV0aW9uczppLmF0dHJpYnV0aW9ucyxwcm9qZWN0aW9uOmkucHJvamVjdGlvbixyZXNvbHV0aW9uczppLnJlc29sdXRpb25zLHN0YXRlOmkuc3RhdGV9KSx0aGlzLmNhbnZhc0Z1bmN0aW9uXz1pLmNhbnZhc0Z1bmN0aW9uLHRoaXMuY2FudmFzXz1udWxsLHRoaXMucmVuZGVyZWRSZXZpc2lvbl89MCx0aGlzLnJhdGlvXz12b2lkIDAhPT1pLnJhdGlvP2kucmF0aW86MS41fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRJbWFnZUludGVybmFsPWZ1bmN0aW9uKHQsZSxpLHIpe2U9dGhpcy5maW5kTmVhcmVzdFJlc29sdXRpb24oZSk7dmFyIG49dGhpcy5jYW52YXNfO2lmKG4mJnRoaXMucmVuZGVyZWRSZXZpc2lvbl89PXRoaXMuZ2V0UmV2aXNpb24oKSYmbi5nZXRSZXNvbHV0aW9uKCk9PWUmJm4uZ2V0UGl4ZWxSYXRpbygpPT1pJiZvdChuLmdldEV4dGVudCgpLHQpKXJldHVybiBuO010KHQ9dC5zbGljZSgpLHRoaXMucmF0aW9fKTt2YXIgbz1bT3QodCkvZSppLFJ0KHQpL2UqaV0scz10aGlzLmNhbnZhc0Z1bmN0aW9uXy5jYWxsKHRoaXMsdCxlLGksbyxyKTtyZXR1cm4gcyYmKG49bmV3IEVzKHQsZSxpLHMpKSx0aGlzLmNhbnZhc189bix0aGlzLnJlbmRlcmVkUmV2aXNpb25fPXRoaXMuZ2V0UmV2aXNpb24oKSxufSxlfShkcCk7dmFyIHZwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMse3Byb2plY3Rpb246ZS5wcm9qZWN0aW9uLHJlc29sdXRpb25zOmUucmVzb2x1dGlvbnN9KSx0aGlzLmNyb3NzT3JpZ2luXz12b2lkIDAhPT1lLmNyb3NzT3JpZ2luP2UuY3Jvc3NPcmlnaW46bnVsbCx0aGlzLmRpc3BsYXlEcGlfPXZvaWQgMCE9PWUuZGlzcGxheURwaT9lLmRpc3BsYXlEcGk6OTYsdGhpcy5wYXJhbXNfPWUucGFyYW1zfHx7fSx0aGlzLnVybF89ZS51cmwsdGhpcy5pbWFnZUxvYWRGdW5jdGlvbl89dm9pZCAwIT09ZS5pbWFnZUxvYWRGdW5jdGlvbj9lLmltYWdlTG9hZEZ1bmN0aW9uOmNwLHRoaXMuaGlkcGlfPXZvaWQgMD09PWUuaGlkcGl8fGUuaGlkcGksdGhpcy5tZXRlcnNQZXJVbml0Xz12b2lkIDAhPT1lLm1ldGVyc1BlclVuaXQ/ZS5tZXRlcnNQZXJVbml0OjEsdGhpcy5yYXRpb189dm9pZCAwIT09ZS5yYXRpbz9lLnJhdGlvOjEsdGhpcy51c2VPdmVybGF5Xz12b2lkIDAhPT1lLnVzZU92ZXJsYXkmJmUudXNlT3ZlcmxheSx0aGlzLmltYWdlXz1udWxsLHRoaXMucmVuZGVyZWRSZXZpc2lvbl89MH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0UGFyYW1zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyYW1zX30sZS5wcm90b3R5cGUuZ2V0SW1hZ2VJbnRlcm5hbD1mdW5jdGlvbih0LGUsaSxyKXtlPXRoaXMuZmluZE5lYXJlc3RSZXNvbHV0aW9uKGUpLGk9dGhpcy5oaWRwaV8/aToxO3ZhciBuPXRoaXMuaW1hZ2VfO2lmKG4mJnRoaXMucmVuZGVyZWRSZXZpc2lvbl89PXRoaXMuZ2V0UmV2aXNpb24oKSYmbi5nZXRSZXNvbHV0aW9uKCk9PWUmJm4uZ2V0UGl4ZWxSYXRpbygpPT1pJiZvdChuLmdldEV4dGVudCgpLHQpKXJldHVybiBuOzEhPXRoaXMucmF0aW9fJiZNdCh0PXQuc2xpY2UoKSx0aGlzLnJhdGlvXyk7dmFyIG89W090KHQpL2UqaSxSdCh0KS9lKmldO2lmKHZvaWQgMCE9PXRoaXMudXJsXyl7dmFyIHM9dGhpcy5nZXRVcmwodGhpcy51cmxfLHRoaXMucGFyYW1zXyx0LG8scik7dihuPW5ldyBmcCh0LGUsaSxzLHRoaXMuY3Jvc3NPcmlnaW5fLHRoaXMuaW1hZ2VMb2FkRnVuY3Rpb25fKSxNLkNIQU5HRSx0aGlzLmhhbmRsZUltYWdlQ2hhbmdlLHRoaXMpfWVsc2Ugbj1udWxsO3JldHVybiB0aGlzLmltYWdlXz1uLHRoaXMucmVuZGVyZWRSZXZpc2lvbl89dGhpcy5nZXRSZXZpc2lvbigpLG59LGUucHJvdG90eXBlLmdldEltYWdlTG9hZEZ1bmN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW1hZ2VMb2FkRnVuY3Rpb25ffSxlLnByb3RvdHlwZS51cGRhdGVQYXJhbXM9ZnVuY3Rpb24odCl7dSh0aGlzLnBhcmFtc18sdCksdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmdldFVybD1mdW5jdGlvbih0LGUsaSxyLG4pe3ZhciBvPWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuPU90KHQpLG89UnQodCkscz1lWzBdLGE9ZVsxXSxoPS4wMjU0L3I7cmV0dXJuIGEqbj5zKm8/bippLyhzKmgpOm8qaS8oYSpoKX0oaSxyLHRoaXMubWV0ZXJzUGVyVW5pdF8sdGhpcy5kaXNwbGF5RHBpXykscz1UdChpKSxhPXtPUEVSQVRJT046dGhpcy51c2VPdmVybGF5Xz8iR0VURFlOQU1JQ01BUE9WRVJMQVlJTUFHRSI6IkdFVE1BUElNQUdFIixWRVJTSU9OOiIyLjAuMCIsTE9DQUxFOiJlbiIsQ0xJRU5UQUdFTlQ6Im9sL3NvdXJjZS9JbWFnZU1hcEd1aWRlIHNvdXJjZSIsQ0xJUDoiMSIsU0VURElTUExBWURQSTp0aGlzLmRpc3BsYXlEcGlfLFNFVERJU1BMQVlXSURUSDpNYXRoLnJvdW5kKHJbMF0pLFNFVERJU1BMQVlIRUlHSFQ6TWF0aC5yb3VuZChyWzFdKSxTRVRWSUVXU0NBTEU6byxTRVRWSUVXQ0VOVEVSWDpzWzBdLFNFVFZJRVdDRU5URVJZOnNbMV19O3JldHVybiB1KGEsZSksX3AodCxhKX0sZS5wcm90b3R5cGUuc2V0SW1hZ2VMb2FkRnVuY3Rpb249ZnVuY3Rpb24odCl7dGhpcy5pbWFnZV89bnVsbCx0aGlzLmltYWdlTG9hZEZ1bmN0aW9uXz10LHRoaXMuY2hhbmdlZCgpfSxlfShkcCksbXA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT12b2lkIDAhPT1lLmNyb3NzT3JpZ2luP2UuY3Jvc3NPcmlnaW46bnVsbCxyPXZvaWQgMCE9PWUuaW1hZ2VMb2FkRnVuY3Rpb24/ZS5pbWFnZUxvYWRGdW5jdGlvbjpjcDt0LmNhbGwodGhpcyx7YXR0cmlidXRpb25zOmUuYXR0cmlidXRpb25zLHByb2plY3Rpb246RWUoZS5wcm9qZWN0aW9uKX0pLHRoaXMudXJsXz1lLnVybCx0aGlzLmltYWdlRXh0ZW50Xz1lLmltYWdlRXh0ZW50LHRoaXMuaW1hZ2VfPW5ldyBmcCh0aGlzLmltYWdlRXh0ZW50Xyx2b2lkIDAsMSx0aGlzLnVybF8saSxyKSx0aGlzLmltYWdlU2l6ZV89ZS5pbWFnZVNpemU/ZS5pbWFnZVNpemU6bnVsbCx2KHRoaXMuaW1hZ2VfLE0uQ0hBTkdFLHRoaXMuaGFuZGxlSW1hZ2VDaGFuZ2UsdGhpcyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldEltYWdlRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW1hZ2VFeHRlbnRffSxlLnByb3RvdHlwZS5nZXRJbWFnZUludGVybmFsPWZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybiBQdCh0LHRoaXMuaW1hZ2VfLmdldEV4dGVudCgpKT90aGlzLmltYWdlXzpudWxsfSxlLnByb3RvdHlwZS5nZXRVcmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cmxffSxlLnByb3RvdHlwZS5oYW5kbGVJbWFnZUNoYW5nZT1mdW5jdGlvbihlKXtpZih0aGlzLmltYWdlXy5nZXRTdGF0ZSgpPT14cy5MT0FERUQpe3ZhciBpLHIsbj10aGlzLmltYWdlXy5nZXRFeHRlbnQoKSxvPXRoaXMuaW1hZ2VfLmdldEltYWdlKCk7dGhpcy5pbWFnZVNpemVfPyhpPXRoaXMuaW1hZ2VTaXplX1swXSxyPXRoaXMuaW1hZ2VTaXplX1sxXSk6KGk9by53aWR0aCxyPW8uaGVpZ2h0KTt2YXIgcz1SdChuKS9yLGE9TWF0aC5jZWlsKE90KG4pL3MpO2lmKGEhPWkpe3ZhciBoPUpuKGEsciksbD1oLmNhbnZhcztoLmRyYXdJbWFnZShvLDAsMCxpLHIsMCwwLGwud2lkdGgsbC5oZWlnaHQpLHRoaXMuaW1hZ2VfLnNldEltYWdlKGwpfX10LnByb3RvdHlwZS5oYW5kbGVJbWFnZUNoYW5nZS5jYWxsKHRoaXMsZSl9LGV9KGRwKSx4cD0iMS4zLjAiLEVwPSJjYXJtZW50YXNlcnZlciIsU3A9Imdlb3NlcnZlciIsVHA9Im1hcHNlcnZlciIsQ3A9InFnaXMiLFJwPVsxMDEsMTAxXSx3cD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9O3QuY2FsbCh0aGlzLHthdHRyaWJ1dGlvbnM6aS5hdHRyaWJ1dGlvbnMscHJvamVjdGlvbjppLnByb2plY3Rpb24scmVzb2x1dGlvbnM6aS5yZXNvbHV0aW9uc30pLHRoaXMuY3Jvc3NPcmlnaW5fPXZvaWQgMCE9PWkuY3Jvc3NPcmlnaW4/aS5jcm9zc09yaWdpbjpudWxsLHRoaXMudXJsXz1pLnVybCx0aGlzLmltYWdlTG9hZEZ1bmN0aW9uXz12b2lkIDAhPT1pLmltYWdlTG9hZEZ1bmN0aW9uP2kuaW1hZ2VMb2FkRnVuY3Rpb246Y3AsdGhpcy5wYXJhbXNfPWkucGFyYW1zfHx7fSx0aGlzLnYxM189ITAsdGhpcy51cGRhdGVWMTNfKCksdGhpcy5zZXJ2ZXJUeXBlXz1pLnNlcnZlclR5cGUsdGhpcy5oaWRwaV89dm9pZCAwPT09aS5oaWRwaXx8aS5oaWRwaSx0aGlzLmltYWdlXz1udWxsLHRoaXMuaW1hZ2VTaXplXz1bMCwwXSx0aGlzLnJlbmRlcmVkUmV2aXNpb25fPTAsdGhpcy5yYXRpb189dm9pZCAwIT09aS5yYXRpbz9pLnJhdGlvOjEuNX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0R2V0RmVhdHVyZUluZm9Vcmw9ZnVuY3Rpb24odCxlLGkscil7aWYodm9pZCAwIT09dGhpcy51cmxfKXt2YXIgbj1FZShpKSxvPXRoaXMuZ2V0UHJvamVjdGlvbigpO28mJm8hPT1uJiYoZT1CdShvLG4sdCxlKSx0PVBlKHQsbixvKSk7dmFyIHM9Q3QodCxlLDAsUnApLGE9e1NFUlZJQ0U6IldNUyIsVkVSU0lPTjp4cCxSRVFVRVNUOiJHZXRGZWF0dXJlSW5mbyIsRk9STUFUOiJpbWFnZS9wbmciLFRSQU5TUEFSRU5UOiEwLFFVRVJZX0xBWUVSUzp0aGlzLnBhcmFtc18uTEFZRVJTfTt1KGEsdGhpcy5wYXJhbXNfLHIpO3ZhciBoPU1hdGguZmxvb3IoKHRbMF0tc1swXSkvZSksbD1NYXRoLmZsb29yKChzWzNdLXRbMV0pL2UpO3JldHVybiBhW3RoaXMudjEzXz8iSSI6IlgiXT1oLGFbdGhpcy52MTNfPyJKIjoiWSJdPWwsdGhpcy5nZXRSZXF1ZXN0VXJsXyhzLFJwLDEsb3x8bixhKX19LGUucHJvdG90eXBlLmdldFBhcmFtcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmFtc199LGUucHJvdG90eXBlLmdldEltYWdlSW50ZXJuYWw9ZnVuY3Rpb24odCxlLGkscil7aWYodm9pZCAwPT09dGhpcy51cmxfKXJldHVybiBudWxsO2U9dGhpcy5maW5kTmVhcmVzdFJlc29sdXRpb24oZSksMT09aXx8dGhpcy5oaWRwaV8mJnZvaWQgMCE9PXRoaXMuc2VydmVyVHlwZV98fChpPTEpO3ZhciBuPWUvaSxvPVR0KHQpLHM9Q3QobyxuLDAsW01hdGguY2VpbChPdCh0KS9uKSxNYXRoLmNlaWwoUnQodCkvbildKSxhPUN0KG8sbiwwLFtNYXRoLmNlaWwodGhpcy5yYXRpb18qT3QodCkvbiksTWF0aC5jZWlsKHRoaXMucmF0aW9fKlJ0KHQpL24pXSksaD10aGlzLmltYWdlXztpZihoJiZ0aGlzLnJlbmRlcmVkUmV2aXNpb25fPT10aGlzLmdldFJldmlzaW9uKCkmJmguZ2V0UmVzb2x1dGlvbigpPT1lJiZoLmdldFBpeGVsUmF0aW8oKT09aSYmb3QoaC5nZXRFeHRlbnQoKSxzKSlyZXR1cm4gaDt2YXIgbD17U0VSVklDRToiV01TIixWRVJTSU9OOnhwLFJFUVVFU1Q6IkdldE1hcCIsRk9STUFUOiJpbWFnZS9wbmciLFRSQU5TUEFSRU5UOiEwfTt1KGwsdGhpcy5wYXJhbXNfKSx0aGlzLmltYWdlU2l6ZV9bMF09TWF0aC5yb3VuZChPdChhKS9uKSx0aGlzLmltYWdlU2l6ZV9bMV09TWF0aC5yb3VuZChSdChhKS9uKTt2YXIgcD10aGlzLmdldFJlcXVlc3RVcmxfKGEsdGhpcy5pbWFnZVNpemVfLGkscixsKTtyZXR1cm4gdGhpcy5pbWFnZV89bmV3IGZwKGEsZSxpLHAsdGhpcy5jcm9zc09yaWdpbl8sdGhpcy5pbWFnZUxvYWRGdW5jdGlvbl8pLHRoaXMucmVuZGVyZWRSZXZpc2lvbl89dGhpcy5nZXRSZXZpc2lvbigpLHYodGhpcy5pbWFnZV8sTS5DSEFOR0UsdGhpcy5oYW5kbGVJbWFnZUNoYW5nZSx0aGlzKSx0aGlzLmltYWdlX30sZS5wcm90b3R5cGUuZ2V0SW1hZ2VMb2FkRnVuY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbWFnZUxvYWRGdW5jdGlvbl99LGUucHJvdG90eXBlLmdldFJlcXVlc3RVcmxfPWZ1bmN0aW9uKHQsZSxpLHIsbil7aWYoWSh2b2lkIDAhPT10aGlzLnVybF8sOSksblt0aGlzLnYxM18/IkNSUyI6IlNSUyJdPXIuZ2V0Q29kZSgpLCJTVFlMRVMiaW4gdGhpcy5wYXJhbXNffHwobi5TVFlMRVM9IiIpLDEhPWkpc3dpdGNoKHRoaXMuc2VydmVyVHlwZV8pe2Nhc2UgU3A6dmFyIG89OTAqaSsuNXwwOyJGT1JNQVRfT1BUSU9OUyJpbiBuP24uRk9STUFUX09QVElPTlMrPSI7ZHBpOiIrbzpuLkZPUk1BVF9PUFRJT05TPSJkcGk6IitvO2JyZWFrO2Nhc2UgVHA6bi5NQVBfUkVTT0xVVElPTj05MCppO2JyZWFrO2Nhc2UgRXA6Y2FzZSBDcDpuLkRQST05MCppO2JyZWFrO2RlZmF1bHQ6WSghMSw4KX1uLldJRFRIPWVbMF0sbi5IRUlHSFQ9ZVsxXTt2YXIgcyxhPXIuZ2V0QXhpc09yaWVudGF0aW9uKCk7cmV0dXJuIHM9dGhpcy52MTNfJiYibmUiPT1hLnN1YnN0cigwLDIpP1t0WzFdLHRbMF0sdFszXSx0WzJdXTp0LG4uQkJPWD1zLmpvaW4oIiwiKSxfcCh0aGlzLnVybF8sbil9LGUucHJvdG90eXBlLmdldFVybD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVybF99LGUucHJvdG90eXBlLnNldEltYWdlTG9hZEZ1bmN0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaW1hZ2VfPW51bGwsdGhpcy5pbWFnZUxvYWRGdW5jdGlvbl89dCx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuc2V0VXJsPWZ1bmN0aW9uKHQpe3QhPXRoaXMudXJsXyYmKHRoaXMudXJsXz10LHRoaXMuaW1hZ2VfPW51bGwsdGhpcy5jaGFuZ2VkKCkpfSxlLnByb3RvdHlwZS51cGRhdGVQYXJhbXM9ZnVuY3Rpb24odCl7dSh0aGlzLnBhcmFtc18sdCksdGhpcy51cGRhdGVWMTNfKCksdGhpcy5pbWFnZV89bnVsbCx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUudXBkYXRlVjEzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMucGFyYW1zXy5WRVJTSU9OfHx4cDt0aGlzLnYxM189S2kodCwiMS4zIik+PTB9LGV9KGRwKSxJcD0nJiMxNjk7IDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzLicsTHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaSxyPWV8fHt9O2k9dm9pZCAwIT09ci5hdHRyaWJ1dGlvbnM/ci5hdHRyaWJ1dGlvbnM6W0lwXTt2YXIgbj12b2lkIDAhPT1yLmNyb3NzT3JpZ2luP3IuY3Jvc3NPcmlnaW46ImFub255bW91cyIsbz12b2lkIDAhPT1yLnVybD9yLnVybDoiaHR0cHM6Ly97YS1jfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZyI7dC5jYWxsKHRoaXMse2F0dHJpYnV0aW9uczppLGNhY2hlU2l6ZTpyLmNhY2hlU2l6ZSxjcm9zc09yaWdpbjpuLG9wYXF1ZTp2b2lkIDA9PT1yLm9wYXF1ZXx8ci5vcGFxdWUsbWF4Wm9vbTp2b2lkIDAhPT1yLm1heFpvb20/ci5tYXhab29tOjE5LHJlcHJvamVjdGlvbkVycm9yVGhyZXNob2xkOnIucmVwcm9qZWN0aW9uRXJyb3JUaHJlc2hvbGQsdGlsZUxvYWRGdW5jdGlvbjpyLnRpbGVMb2FkRnVuY3Rpb24sdXJsOm8sd3JhcFg6ci53cmFwWCxhdHRyaWJ1dGlvbnNDb2xsYXBzaWJsZTohMX0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShlcCksT3A9aSgyKSxQcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9O3QuY2FsbCh0aGlzLGkpLHRoaXMudHlwZT1Tcy5JTUFHRX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oeG8pO1BwLnByb3RvdHlwZS5nZXRTb3VyY2U7dmFyIGJwPVBwLE1wPSJwcmVsb2FkIixGcD0idXNlSW50ZXJpbVRpbGVzT25FcnJvciIsQXA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fSxyPXUoe30saSk7ZGVsZXRlIHIucHJlbG9hZCxkZWxldGUgci51c2VJbnRlcmltVGlsZXNPbkVycm9yLHQuY2FsbCh0aGlzLHIpLHRoaXMuc2V0UHJlbG9hZCh2b2lkIDAhPT1pLnByZWxvYWQ/aS5wcmVsb2FkOjApLHRoaXMuc2V0VXNlSW50ZXJpbVRpbGVzT25FcnJvcih2b2lkIDA9PT1pLnVzZUludGVyaW1UaWxlc09uRXJyb3J8fGkudXNlSW50ZXJpbVRpbGVzT25FcnJvciksdGhpcy50eXBlPVNzLlRJTEV9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldFByZWxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoTXApfSxlLnByb3RvdHlwZS5zZXRQcmVsb2FkPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KE1wLHQpfSxlLnByb3RvdHlwZS5nZXRVc2VJbnRlcmltVGlsZXNPbkVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KEZwKX0sZS5wcm90b3R5cGUuc2V0VXNlSW50ZXJpbVRpbGVzT25FcnJvcj1mdW5jdGlvbih0KXt0aGlzLnNldChGcCx0KX0sZX0oeG8pO0FwLnByb3RvdHlwZS5nZXRTb3VyY2U7dmFyIE5wPUFwLEdwPSJiZWZvcmVvcGVyYXRpb25zIixEcD0iYWZ0ZXJvcGVyYXRpb25zIixrcD17UElYRUw6InBpeGVsIixJTUFHRToiaW1hZ2UifSxqcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXt0LmNhbGwodGhpcyxlKSx0aGlzLmV4dGVudD1pLmV4dGVudCx0aGlzLnJlc29sdXRpb249aS52aWV3U3RhdGUucmVzb2x1dGlvbi9pLnBpeGVsUmF0aW8sdGhpcy5kYXRhPXJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KFApLFVwPW51bGw7ZnVuY3Rpb24gWXAodCxlLGkpe2lmKCF0LnByZXBhcmVGcmFtZShlLGkpKXJldHVybiBudWxsO3ZhciByPWUuc2l6ZVswXSxuPWUuc2l6ZVsxXTtpZihVcCl7dmFyIG89VXAuY2FudmFzO28ud2lkdGghPT1yfHxvLmhlaWdodCE9PW4/VXA9Sm4ocixuKTpVcC5jbGVhclJlY3QoMCwwLHIsbil9ZWxzZSBVcD1KbihyLG4pO3JldHVybiB0LmNvbXBvc2VGcmFtZShlLGksVXApLFVwLmdldEltYWdlRGF0YSgwLDAscixuKX1mdW5jdGlvbiBCcCh0KXt2YXIgZT10LGk9dCxyPXQsbj1udWxsO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldFRpbGU/bj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgTnAoe3NvdXJjZTp0fSk7cmV0dXJuIG5ldyBoYShlKX0oZSk6ImZ1bmN0aW9uIj09dHlwZW9mIGkuZ2V0SW1hZ2U/bj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgYnAoe3NvdXJjZTp0fSk7cmV0dXJuIG5ldyByYShlKX0oaSk6ci5nZXRUeXBlKCk9PT1Tcy5USUxFP249bmV3IGhhKHIpOnIuZ2V0VHlwZSgpIT1Tcy5JTUFHRSYmci5nZXRUeXBlKCkhPVNzLlZFQ1RPUnx8KG49bmV3IHJhKHIpKSxufXZhciBWcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLHtwcm9qZWN0aW9uOm51bGx9KSx0aGlzLndvcmtlcl89bnVsbCx0aGlzLm9wZXJhdGlvblR5cGVfPXZvaWQgMCE9PWUub3BlcmF0aW9uVHlwZT9lLm9wZXJhdGlvblR5cGU6a3AuUElYRUwsdGhpcy50aHJlYWRzXz12b2lkIDAhPT1lLnRocmVhZHM/ZS50aHJlYWRzOjEsdGhpcy5yZW5kZXJlcnNfPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxpPW5ldyBBcnJheShlKSxyPTA7cjxlOysrcilpW3JdPUJwKHRbcl0pO3JldHVybiBpfShlLnNvdXJjZXMpO2Zvcih2YXIgaT0wLHI9dGhpcy5yZW5kZXJlcnNfLmxlbmd0aDtpPHI7KytpKXYodGhpcy5yZW5kZXJlcnNfW2ldLE0uQ0hBTkdFLHRoaXMuY2hhbmdlZCx0aGlzKTt0aGlzLnRpbGVRdWV1ZV89bmV3IE1uKGZ1bmN0aW9uKCl7cmV0dXJuIDF9LHRoaXMuY2hhbmdlZC5iaW5kKHRoaXMpKTtmb3IodmFyIG49ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldExheWVyKCkuZ2V0TGF5ZXJTdGF0ZSgpfSl9KHRoaXMucmVuZGVyZXJzXykscz17fSxhPTAsaD1uLmxlbmd0aDthPGg7KythKXNbbyhuW2FdLmxheWVyKV09blthXTt0aGlzLnJlcXVlc3RlZEZyYW1lU3RhdGVfLHRoaXMucmVuZGVyZWRJbWFnZUNhbnZhc189bnVsbCx0aGlzLnJlbmRlcmVkUmV2aXNpb25fLHRoaXMuZnJhbWVTdGF0ZV89e2FuaW1hdGU6ITEsY29vcmRpbmF0ZVRvUGl4ZWxUcmFuc2Zvcm06WzEsMCwwLDEsMCwwXSxleHRlbnQ6bnVsbCxmb2N1czpudWxsLGluZGV4OjAsbGF5ZXJTdGF0ZXM6cyxsYXllclN0YXRlc0FycmF5Om4scGl4ZWxSYXRpbzoxLHBpeGVsVG9Db29yZGluYXRlVHJhbnNmb3JtOlsxLDAsMCwxLDAsMF0scG9zdFJlbmRlckZ1bmN0aW9uczpbXSxzaXplOlswLDBdLHNraXBwZWRGZWF0dXJlVWlkczp7fSx0aWxlUXVldWU6dGhpcy50aWxlUXVldWVfLHRpbWU6RGF0ZS5ub3coKSx1c2VkVGlsZXM6e30sdmlld1N0YXRlOntyb3RhdGlvbjowfSx2aWV3SGludHM6W10sd2FudGVkVGlsZXM6e319LHZvaWQgMCE9PWUub3BlcmF0aW9uJiZ0aGlzLnNldE9wZXJhdGlvbihlLm9wZXJhdGlvbixlLmxpYil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnNldE9wZXJhdGlvbj1mdW5jdGlvbih0LGUpe3RoaXMud29ya2VyXz1uZXcgT3AuUHJvY2Vzc29yKHtvcGVyYXRpb246dCxpbWFnZU9wczp0aGlzLm9wZXJhdGlvblR5cGVfPT09a3AuSU1BR0UscXVldWU6MSxsaWI6ZSx0aHJlYWRzOnRoaXMudGhyZWFkc199KSx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUudXBkYXRlRnJhbWVTdGF0ZV89ZnVuY3Rpb24odCxlLGkpe3ZhciByPXUoe30sdGhpcy5mcmFtZVN0YXRlXyk7ci52aWV3U3RhdGU9dSh7fSxyLnZpZXdTdGF0ZSk7dmFyIG49VHQodCk7ci5leHRlbnQ9dC5zbGljZSgpLHIuZm9jdXM9bixyLnNpemVbMF09TWF0aC5yb3VuZChPdCh0KS9lKSxyLnNpemVbMV09TWF0aC5yb3VuZChSdCh0KS9lKSxyLnRpbWU9RGF0ZS5ub3coKSxyLmFuaW1hdGU9ITE7dmFyIG89ci52aWV3U3RhdGU7cmV0dXJuIG8uY2VudGVyPW4sby5wcm9qZWN0aW9uPWksby5yZXNvbHV0aW9uPWUscn0sZS5wcm90b3R5cGUuYWxsU291cmNlc1JlYWR5Xz1mdW5jdGlvbigpe2Zvcih2YXIgdD0hMCxlPTAsaT10aGlzLnJlbmRlcmVyc18ubGVuZ3RoO2U8aTsrK2UpaWYodGhpcy5yZW5kZXJlcnNfW2VdLmdldExheWVyKCkuZ2V0U291cmNlKCkuZ2V0U3RhdGUoKSE9PXJvLlJFQURZKXt0PSExO2JyZWFrfXJldHVybiB0fSxlLnByb3RvdHlwZS5nZXRJbWFnZT1mdW5jdGlvbih0LGUsaSxyKXtpZighdGhpcy5hbGxTb3VyY2VzUmVhZHlfKCkpcmV0dXJuIG51bGw7dmFyIG49dGhpcy51cGRhdGVGcmFtZVN0YXRlXyh0LGUscik7aWYodGhpcy5yZXF1ZXN0ZWRGcmFtZVN0YXRlXz1uLHRoaXMucmVuZGVyZWRJbWFnZUNhbnZhc18pe3ZhciBvPXRoaXMucmVuZGVyZWRJbWFnZUNhbnZhc18uZ2V0UmVzb2x1dGlvbigpLHM9dGhpcy5yZW5kZXJlZEltYWdlQ2FudmFzXy5nZXRFeHRlbnQoKTtlPT09byYmZHQodCxzKXx8KHRoaXMucmVuZGVyZWRJbWFnZUNhbnZhc189bnVsbCl9cmV0dXJuIHRoaXMucmVuZGVyZWRJbWFnZUNhbnZhc18mJnRoaXMuZ2V0UmV2aXNpb24oKT09PXRoaXMucmVuZGVyZWRSZXZpc2lvbl98fHRoaXMucHJvY2Vzc1NvdXJjZXNfKCksbi50aWxlUXVldWUubG9hZE1vcmVUaWxlcygxNiwxNiksbi5hbmltYXRlJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5jaGFuZ2VkLmJpbmQodGhpcykpLHRoaXMucmVuZGVyZWRJbWFnZUNhbnZhc199LGUucHJvdG90eXBlLnByb2Nlc3NTb3VyY2VzXz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlcXVlc3RlZEZyYW1lU3RhdGVfLGU9dGhpcy5yZW5kZXJlcnNfLmxlbmd0aCxpPW5ldyBBcnJheShlKSxyPTA7cjxlOysrcil7dmFyIG49WXAodGhpcy5yZW5kZXJlcnNfW3JdLHQsdC5sYXllclN0YXRlc0FycmF5W3JdKTtpZighbilyZXR1cm47aVtyXT1ufXZhciBvPXt9O3RoaXMuZGlzcGF0Y2hFdmVudChuZXcganAoR3AsdCxvKSksdGhpcy53b3JrZXJfLnByb2Nlc3MoaSxvLHRoaXMub25Xb3JrZXJDb21wbGV0ZV8uYmluZCh0aGlzLHQpKX0sZS5wcm90b3R5cGUub25Xb3JrZXJDb21wbGV0ZV89ZnVuY3Rpb24odCxlLGkscil7aWYoIWUmJmkpe3ZhciBuPXQuZXh0ZW50LG89dC52aWV3U3RhdGUucmVzb2x1dGlvbjtpZihvPT09dGhpcy5yZXF1ZXN0ZWRGcmFtZVN0YXRlXy52aWV3U3RhdGUucmVzb2x1dGlvbiYmZHQobix0aGlzLnJlcXVlc3RlZEZyYW1lU3RhdGVfLmV4dGVudCkpe3ZhciBzO2lmKHRoaXMucmVuZGVyZWRJbWFnZUNhbnZhc18pcz10aGlzLnJlbmRlcmVkSW1hZ2VDYW52YXNfLmdldEltYWdlKCkuZ2V0Q29udGV4dCgiMmQiKTtlbHNlIHM9Sm4oTWF0aC5yb3VuZChPdChuKS9vKSxNYXRoLnJvdW5kKFJ0KG4pL28pKSx0aGlzLnJlbmRlcmVkSW1hZ2VDYW52YXNfPW5ldyBFcyhuLG8sMSxzLmNhbnZhcyk7cy5wdXRJbWFnZURhdGEoaSwwLDApLHRoaXMuY2hhbmdlZCgpLHRoaXMucmVuZGVyZWRSZXZpc2lvbl89dGhpcy5nZXRSZXZpc2lvbigpLHRoaXMuZGlzcGF0Y2hFdmVudChuZXcganAoRHAsdCxyKSl9fX0sZS5wcm90b3R5cGUuZ2V0SW1hZ2VJbnRlcm5hbD1mdW5jdGlvbigpe3JldHVybiBudWxsfSxlfShkcCksWHA9WydNYXAgdGlsZXMgYnkgPGEgaHJlZj0iaHR0cHM6Ly9zdGFtZW4uY29tLyI+U3RhbWVuIERlc2lnbjwvYT4sIHVuZGVyIDxhIGhyZWY9Imh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvIj5DQyBCWSAzLjA8L2E+LicsSXBdLHpwPXt0ZXJyYWluOntleHRlbnNpb246ImpwZyIsb3BhcXVlOiEwfSwidGVycmFpbi1iYWNrZ3JvdW5kIjp7ZXh0ZW5zaW9uOiJqcGciLG9wYXF1ZTohMH0sInRlcnJhaW4tbGFiZWxzIjp7ZXh0ZW5zaW9uOiJwbmciLG9wYXF1ZTohMX0sInRlcnJhaW4tbGluZXMiOntleHRlbnNpb246InBuZyIsb3BhcXVlOiExfSwidG9uZXItYmFja2dyb3VuZCI6e2V4dGVuc2lvbjoicG5nIixvcGFxdWU6ITB9LHRvbmVyOntleHRlbnNpb246InBuZyIsb3BhcXVlOiEwfSwidG9uZXItaHlicmlkIjp7ZXh0ZW5zaW9uOiJwbmciLG9wYXF1ZTohMX0sInRvbmVyLWxhYmVscyI6e2V4dGVuc2lvbjoicG5nIixvcGFxdWU6ITF9LCJ0b25lci1saW5lcyI6e2V4dGVuc2lvbjoicG5nIixvcGFxdWU6ITF9LCJ0b25lci1saXRlIjp7ZXh0ZW5zaW9uOiJwbmciLG9wYXF1ZTohMH0sd2F0ZXJjb2xvcjp7ZXh0ZW5zaW9uOiJqcGciLG9wYXF1ZTohMH19LFdwPXt0ZXJyYWluOnttaW5ab29tOjQsbWF4Wm9vbToxOH0sdG9uZXI6e21pblpvb206MCxtYXhab29tOjIwfSx3YXRlcmNvbG9yOnttaW5ab29tOjEsbWF4Wm9vbToxNn19LEtwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZS5sYXllci5pbmRleE9mKCItIikscj0tMT09aT9lLmxheWVyOmUubGF5ZXIuc2xpY2UoMCxpKSxuPVdwW3JdLG89enBbZS5sYXllcl0scz12b2lkIDAhPT1lLnVybD9lLnVybDoiaHR0cHM6Ly9zdGFtZW4tdGlsZXMte2EtZH0uYS5zc2wuZmFzdGx5Lm5ldC8iK2UubGF5ZXIrIi97en0ve3h9L3t5fS4iK28uZXh0ZW5zaW9uO3QuY2FsbCh0aGlzLHthdHRyaWJ1dGlvbnM6WHAsY2FjaGVTaXplOmUuY2FjaGVTaXplLGNyb3NzT3JpZ2luOiJhbm9ueW1vdXMiLG1heFpvb206dm9pZCAwIT1lLm1heFpvb20/ZS5tYXhab29tOm4ubWF4Wm9vbSxtaW5ab29tOnZvaWQgMCE9ZS5taW5ab29tP2UubWluWm9vbTpuLm1pblpvb20sb3BhcXVlOm8ub3BhcXVlLHJlcHJvamVjdGlvbkVycm9yVGhyZXNob2xkOmUucmVwcm9qZWN0aW9uRXJyb3JUaHJlc2hvbGQsdGlsZUxvYWRGdW5jdGlvbjplLnRpbGVMb2FkRnVuY3Rpb24sdXJsOnMsd3JhcFg6ZS53cmFwWH0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShlcCk7ZnVuY3Rpb24gSHAodCxlLGkpe3ZhciByPXRoaXMuZ2V0VGlsZUdyaWQoKTtpZihyfHwocj10aGlzLmdldFRpbGVHcmlkRm9yUHJvamVjdGlvbihpKSksIShyLmdldFJlc29sdXRpb25zKCkubGVuZ3RoPD10WzBdKSl7dmFyIG49ci5nZXRUaWxlQ29vcmRFeHRlbnQodCx0aGlzLnRtcEV4dGVudF8pLG89aG8oci5nZXRUaWxlU2l6ZSh0WzBdKSx0aGlzLnRtcFNpemUpOzEhPWUmJihvPWFvKG8sZSx0aGlzLnRtcFNpemUpKTt2YXIgcz17RjoiaW1hZ2UiLEZPUk1BVDoiUE5HMzIiLFRSQU5TUEFSRU5UOiEwfTtyZXR1cm4gdShzLHRoaXMucGFyYW1zXyksdGhpcy5nZXRSZXF1ZXN0VXJsXyh0LG8sbixlLGkscyl9fXZhciBacD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9O3QuY2FsbCh0aGlzLHthdHRyaWJ1dGlvbnM6aS5hdHRyaWJ1dGlvbnMsY2FjaGVTaXplOmkuY2FjaGVTaXplLGNyb3NzT3JpZ2luOmkuY3Jvc3NPcmlnaW4scHJvamVjdGlvbjppLnByb2plY3Rpb24scmVwcm9qZWN0aW9uRXJyb3JUaHJlc2hvbGQ6aS5yZXByb2plY3Rpb25FcnJvclRocmVzaG9sZCx0aWxlR3JpZDppLnRpbGVHcmlkLHRpbGVMb2FkRnVuY3Rpb246aS50aWxlTG9hZEZ1bmN0aW9uLHRpbGVVcmxGdW5jdGlvbjpIcCx1cmw6aS51cmwsdXJsczppLnVybHMsd3JhcFg6dm9pZCAwPT09aS53cmFwWHx8aS53cmFwWCx0cmFuc2l0aW9uOmkudHJhbnNpdGlvbn0pLHRoaXMucGFyYW1zXz1pLnBhcmFtc3x8e30sdGhpcy50bXBFeHRlbnRfPVsxLzAsMS8wLC0xLzAsLTEvMF0sdGhpcy5zZXRLZXkodGhpcy5nZXRLZXlGb3JQYXJhbXNfKCkpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRLZXlGb3JQYXJhbXNfPWZ1bmN0aW9uKCl7dmFyIHQ9MCxlPVtdO2Zvcih2YXIgaSBpbiB0aGlzLnBhcmFtc18pZVt0KytdPWkrIi0iK3RoaXMucGFyYW1zX1tpXTtyZXR1cm4gZS5qb2luKCIvIil9LGUucHJvdG90eXBlLmdldFBhcmFtcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmFtc199LGUucHJvdG90eXBlLmdldFJlcXVlc3RVcmxfPWZ1bmN0aW9uKHQsZSxpLHIsbixvKXt2YXIgcz10aGlzLnVybHM7aWYocyl7dmFyIGEsaD1uLmdldENvZGUoKS5zcGxpdCgiOiIpLnBvcCgpO2lmKG8uU0laRT1lWzBdKyIsIitlWzFdLG8uQkJPWD1pLmpvaW4oIiwiKSxvLkJCT1hTUj1oLG8uSU1BR0VTUj1oLG8uRFBJPU1hdGgucm91bmQoby5EUEk/by5EUEkqcjo5MCpyKSwxPT1zLmxlbmd0aClhPXNbMF07ZWxzZSBhPXNbWHQoQ2wodCkscy5sZW5ndGgpXTtyZXR1cm4gX3AoYS5yZXBsYWNlKC9NYXBTZXJ2ZXJcLz8kLywiTWFwU2VydmVyL2V4cG9ydCIpLnJlcGxhY2UoL0ltYWdlU2VydmVyXC8/JC8sIkltYWdlU2VydmVyL2V4cG9ydEltYWdlIiksbyl9fSxlLnByb3RvdHlwZS5nZXRUaWxlUGl4ZWxSYXRpbz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZS5wcm90b3R5cGUudXBkYXRlUGFyYW1zPWZ1bmN0aW9uKHQpe3UodGhpcy5wYXJhbXNfLHQpLHRoaXMuc2V0S2V5KHRoaXMuZ2V0S2V5Rm9yUGFyYW1zXygpKX0sZX0oJHUpLHFwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIpe3QuY2FsbCh0aGlzLGUsT24uTE9BREVEKSx0aGlzLnRpbGVTaXplXz1pLHRoaXMudGV4dF89cix0aGlzLmNhbnZhc189bnVsbH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0SW1hZ2U9ZnVuY3Rpb24oKXtpZih0aGlzLmNhbnZhc18pcmV0dXJuIHRoaXMuY2FudmFzXzt2YXIgdD10aGlzLnRpbGVTaXplXyxlPUpuKHRbMF0sdFsxXSk7cmV0dXJuIGUuc3Ryb2tlU3R5bGU9ImJsYWNrIixlLnN0cm9rZVJlY3QoLjUsLjUsdFswXSsuNSx0WzFdKy41KSxlLmZpbGxTdHlsZT0iYmxhY2siLGUudGV4dEFsaWduPSJjZW50ZXIiLGUudGV4dEJhc2VsaW5lPSJtaWRkbGUiLGUuZm9udD0iMjRweCBzYW5zLXNlcmlmIixlLmZpbGxUZXh0KHRoaXMudGV4dF8sdFswXS8yLHRbMV0vMiksdGhpcy5jYW52YXNfPWUuY2FudmFzLGUuY2FudmFzfSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7fSxlfSh2bCksSnA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyx7b3BhcXVlOiExLHByb2plY3Rpb246ZS5wcm9qZWN0aW9uLHRpbGVHcmlkOmUudGlsZUdyaWQsd3JhcFg6dm9pZCAwPT09ZS53cmFwWHx8ZS53cmFwWH0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRUaWxlPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1TbCh0LGUsaSk7aWYodGhpcy50aWxlQ2FjaGUuY29udGFpbnNLZXkocikpcmV0dXJuIHRoaXMudGlsZUNhY2hlLmdldChyKTt2YXIgbj1obyh0aGlzLnRpbGVHcmlkLmdldFRpbGVTaXplKHQpKSxvPVt0LGUsaV0scz10aGlzLmdldFRpbGVDb29yZEZvclRpbGVVcmxGdW5jdGlvbihvKSxhPXM/dGhpcy5nZXRUaWxlQ29vcmRGb3JUaWxlVXJsRnVuY3Rpb24ocykudG9TdHJpbmcoKToiIixoPW5ldyBxcChvLG4sYSk7cmV0dXJuIHRoaXMudGlsZUNhY2hlLnNldChyLGgpLGh9LGV9KGpsKSxRcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2lmKHQuY2FsbCh0aGlzLHthdHRyaWJ1dGlvbnM6ZS5hdHRyaWJ1dGlvbnMsY2FjaGVTaXplOmUuY2FjaGVTaXplLGNyb3NzT3JpZ2luOmUuY3Jvc3NPcmlnaW4scHJvamVjdGlvbjpFZSgiRVBTRzozODU3IikscmVwcm9qZWN0aW9uRXJyb3JUaHJlc2hvbGQ6ZS5yZXByb2plY3Rpb25FcnJvclRocmVzaG9sZCxzdGF0ZTpyby5MT0FESU5HLHRpbGVMb2FkRnVuY3Rpb246ZS50aWxlTG9hZEZ1bmN0aW9uLHdyYXBYOnZvaWQgMD09PWUud3JhcFh8fGUud3JhcFgsdHJhbnNpdGlvbjplLnRyYW5zaXRpb259KSx0aGlzLnRpbGVKU09OXz1udWxsLGUudXJsKWlmKGUuanNvbnApWXUoZS51cmwsdGhpcy5oYW5kbGVUaWxlSlNPTlJlc3BvbnNlLmJpbmQodGhpcyksdGhpcy5oYW5kbGVUaWxlSlNPTkVycm9yLmJpbmQodGhpcykpO2Vsc2V7dmFyIGk9bmV3IFhNTEh0dHBSZXF1ZXN0O2kuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsdGhpcy5vblhIUkxvYWRfLmJpbmQodGhpcykpLGkuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMub25YSFJFcnJvcl8uYmluZCh0aGlzKSksaS5vcGVuKCJHRVQiLGUudXJsKSxpLnNlbmQoKX1lbHNlIGUudGlsZUpTT04/dGhpcy5oYW5kbGVUaWxlSlNPTlJlc3BvbnNlKGUudGlsZUpTT04pOlkoITEsNTEpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5vblhIUkxvYWRfPWZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0O2lmKCFlLnN0YXR1c3x8ZS5zdGF0dXM+PTIwMCYmZS5zdGF0dXM8MzAwKXt2YXIgaTt0cnl7aT1KU09OLnBhcnNlKGUucmVzcG9uc2VUZXh0KX1jYXRjaCh0KXtyZXR1cm4gdm9pZCB0aGlzLmhhbmRsZVRpbGVKU09ORXJyb3IoKX10aGlzLmhhbmRsZVRpbGVKU09OUmVzcG9uc2UoaSl9ZWxzZSB0aGlzLmhhbmRsZVRpbGVKU09ORXJyb3IoKX0sZS5wcm90b3R5cGUub25YSFJFcnJvcl89ZnVuY3Rpb24odCl7dGhpcy5oYW5kbGVUaWxlSlNPTkVycm9yKCl9LGUucHJvdG90eXBlLmdldFRpbGVKU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGlsZUpTT05ffSxlLnByb3RvdHlwZS5oYW5kbGVUaWxlSlNPTlJlc3BvbnNlPWZ1bmN0aW9uKHQpe3ZhciBlLGk9RWUoIkVQU0c6NDMyNiIpLHI9dGhpcy5nZXRQcm9qZWN0aW9uKCk7aWYodm9pZCAwIT09dC5ib3VuZHMpe3ZhciBuPUxlKGkscik7ZT1GdCh0LmJvdW5kcyxuKX12YXIgbz10Lm1pbnpvb218fDAscz10Lm1heHpvb218fDIyLGE9Rmwoe2V4dGVudDpHbChyKSxtYXhab29tOnMsbWluWm9vbTpvfSk7aWYodGhpcy50aWxlR3JpZD1hLHRoaXMudGlsZVVybEZ1bmN0aW9uPUR1KHQudGlsZXMsYSksdm9pZCAwIT09dC5hdHRyaWJ1dGlvbiYmIXRoaXMuZ2V0QXR0cmlidXRpb25zKCkpe3ZhciBoPXZvaWQgMCE9PWU/ZTppLmdldEV4dGVudCgpO3RoaXMuc2V0QXR0cmlidXRpb25zKGZ1bmN0aW9uKGUpe3JldHVybiBQdChoLGUuZXh0ZW50KT9bdC5hdHRyaWJ1dGlvbl06bnVsbH0pfXRoaXMudGlsZUpTT05fPXQsdGhpcy5zZXRTdGF0ZShyby5SRUFEWSl9LGUucHJvdG90eXBlLmhhbmRsZVRpbGVKU09ORXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnNldFN0YXRlKHJvLkVSUk9SKX0sZX0oJHUpO2Z1bmN0aW9uICRwKHQsZSxpKXt2YXIgcj10aGlzLmdldFRpbGVHcmlkKCk7aWYocnx8KHI9dGhpcy5nZXRUaWxlR3JpZEZvclByb2plY3Rpb24oaSkpLCEoci5nZXRSZXNvbHV0aW9ucygpLmxlbmd0aDw9dFswXSkpezE9PWV8fHRoaXMuaGlkcGlfJiZ2b2lkIDAhPT10aGlzLnNlcnZlclR5cGVffHwoZT0xKTt2YXIgbj1yLmdldFJlc29sdXRpb24odFswXSksbz1yLmdldFRpbGVDb29yZEV4dGVudCh0LHRoaXMudG1wRXh0ZW50Xykscz1obyhyLmdldFRpbGVTaXplKHRbMF0pLHRoaXMudG1wU2l6ZSksYT10aGlzLmd1dHRlcl87MCE9PWEmJihzPXNvKHMsYSx0aGlzLnRtcFNpemUpLG89ZXQobyxuKmEsbykpLDEhPWUmJihzPWFvKHMsZSx0aGlzLnRtcFNpemUpKTt2YXIgaD17U0VSVklDRToiV01TIixWRVJTSU9OOnhwLFJFUVVFU1Q6IkdldE1hcCIsRk9STUFUOiJpbWFnZS9wbmciLFRSQU5TUEFSRU5UOiEwfTtyZXR1cm4gdShoLHRoaXMucGFyYW1zXyksdGhpcy5nZXRSZXF1ZXN0VXJsXyh0LHMsbyxlLGksaCl9fXZhciB0Yz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9LHI9aS5wYXJhbXN8fHt9LG49ISgiVFJBTlNQQVJFTlQiaW4gcil8fHIuVFJBTlNQQVJFTlQ7dC5jYWxsKHRoaXMse2F0dHJpYnV0aW9uczppLmF0dHJpYnV0aW9ucyxjYWNoZVNpemU6aS5jYWNoZVNpemUsY3Jvc3NPcmlnaW46aS5jcm9zc09yaWdpbixvcGFxdWU6IW4scHJvamVjdGlvbjppLnByb2plY3Rpb24scmVwcm9qZWN0aW9uRXJyb3JUaHJlc2hvbGQ6aS5yZXByb2plY3Rpb25FcnJvclRocmVzaG9sZCx0aWxlQ2xhc3M6aS50aWxlQ2xhc3MsdGlsZUdyaWQ6aS50aWxlR3JpZCx0aWxlTG9hZEZ1bmN0aW9uOmkudGlsZUxvYWRGdW5jdGlvbix0aWxlVXJsRnVuY3Rpb246JHAsdXJsOmkudXJsLHVybHM6aS51cmxzLHdyYXBYOnZvaWQgMD09PWkud3JhcFh8fGkud3JhcFgsdHJhbnNpdGlvbjppLnRyYW5zaXRpb259KSx0aGlzLmd1dHRlcl89dm9pZCAwIT09aS5ndXR0ZXI/aS5ndXR0ZXI6MCx0aGlzLnBhcmFtc189cix0aGlzLnYxM189ITAsdGhpcy5zZXJ2ZXJUeXBlXz1pLnNlcnZlclR5cGUsdGhpcy5oaWRwaV89dm9pZCAwPT09aS5oaWRwaXx8aS5oaWRwaSx0aGlzLnRtcEV4dGVudF89WzEvMCwxLzAsLTEvMCwtMS8wXSx0aGlzLnVwZGF0ZVYxM18oKSx0aGlzLnNldEtleSh0aGlzLmdldEtleUZvclBhcmFtc18oKSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldEdldEZlYXR1cmVJbmZvVXJsPWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuPUVlKGkpLG89dGhpcy5nZXRQcm9qZWN0aW9uKCkscz10aGlzLmdldFRpbGVHcmlkKCk7c3x8KHM9dGhpcy5nZXRUaWxlR3JpZEZvclByb2plY3Rpb24obikpO3ZhciBhPXMuZ2V0VGlsZUNvb3JkRm9yQ29vcmRBbmRSZXNvbHV0aW9uKHQsZSk7aWYoIShzLmdldFJlc29sdXRpb25zKCkubGVuZ3RoPD1hWzBdKSl7dmFyIGg9cy5nZXRSZXNvbHV0aW9uKGFbMF0pLGw9cy5nZXRUaWxlQ29vcmRFeHRlbnQoYSx0aGlzLnRtcEV4dGVudF8pLHA9aG8ocy5nZXRUaWxlU2l6ZShhWzBdKSx0aGlzLnRtcFNpemUpLGM9dGhpcy5ndXR0ZXJfOzAhPT1jJiYocD1zbyhwLGMsdGhpcy50bXBTaXplKSxsPWV0KGwsaCpjLGwpKSxvJiZvIT09biYmKGg9QnUobyxuLHQsaCksbD1iZShsLG4sbyksdD1QZSh0LG4sbykpO3ZhciBkPXtTRVJWSUNFOiJXTVMiLFZFUlNJT046eHAsUkVRVUVTVDoiR2V0RmVhdHVyZUluZm8iLEZPUk1BVDoiaW1hZ2UvcG5nIixUUkFOU1BBUkVOVDohMCxRVUVSWV9MQVlFUlM6dGhpcy5wYXJhbXNfLkxBWUVSU307dShkLHRoaXMucGFyYW1zXyxyKTt2YXIgZj1NYXRoLmZsb29yKCh0WzBdLWxbMF0pL2gpLF89TWF0aC5mbG9vcigobFszXS10WzFdKS9oKTtyZXR1cm4gZFt0aGlzLnYxM18/IkkiOiJYIl09ZixkW3RoaXMudjEzXz8iSiI6IlkiXT1fLHRoaXMuZ2V0UmVxdWVzdFVybF8oYSxwLGwsMSxvfHxuLGQpfX0sZS5wcm90b3R5cGUuZ2V0R3V0dGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3V0dGVyX30sZS5wcm90b3R5cGUuZ2V0UGFyYW1zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyYW1zX30sZS5wcm90b3R5cGUuZ2V0UmVxdWVzdFVybF89ZnVuY3Rpb24odCxlLGkscixuLG8pe3ZhciBzPXRoaXMudXJscztpZihzKXtpZihvLldJRFRIPWVbMF0sby5IRUlHSFQ9ZVsxXSxvW3RoaXMudjEzXz8iQ1JTIjoiU1JTIl09bi5nZXRDb2RlKCksIlNUWUxFUyJpbiB0aGlzLnBhcmFtc198fChvLlNUWUxFUz0iIiksMSE9cilzd2l0Y2godGhpcy5zZXJ2ZXJUeXBlXyl7Y2FzZSBTcDp2YXIgYT05MCpyKy41fDA7IkZPUk1BVF9PUFRJT05TImluIG8/by5GT1JNQVRfT1BUSU9OUys9IjtkcGk6IithOm8uRk9STUFUX09QVElPTlM9ImRwaToiK2E7YnJlYWs7Y2FzZSBUcDpvLk1BUF9SRVNPTFVUSU9OPTkwKnI7YnJlYWs7Y2FzZSBFcDpjYXNlIENwOm8uRFBJPTkwKnI7YnJlYWs7ZGVmYXVsdDpZKCExLDUyKX12YXIgaCxsLHU9bi5nZXRBeGlzT3JpZW50YXRpb24oKSxwPWk7aWYodGhpcy52MTNfJiYibmUiPT11LnN1YnN0cigwLDIpKWg9aVswXSxwWzBdPWlbMV0scFsxXT1oLGg9aVsyXSxwWzJdPWlbM10scFszXT1oO2lmKG8uQkJPWD1wLmpvaW4oIiwiKSwxPT1zLmxlbmd0aClsPXNbMF07ZWxzZSBsPXNbWHQoQ2wodCkscy5sZW5ndGgpXTtyZXR1cm4gX3AobCxvKX19LGUucHJvdG90eXBlLmdldFRpbGVQaXhlbFJhdGlvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmhpZHBpXyYmdm9pZCAwIT09dGhpcy5zZXJ2ZXJUeXBlXz90OjF9LGUucHJvdG90eXBlLmdldEtleUZvclBhcmFtc189ZnVuY3Rpb24oKXt2YXIgdD0wLGU9W107Zm9yKHZhciBpIGluIHRoaXMucGFyYW1zXyllW3QrK109aSsiLSIrdGhpcy5wYXJhbXNfW2ldO3JldHVybiBlLmpvaW4oIi8iKX0sZS5wcm90b3R5cGUudXBkYXRlUGFyYW1zPWZ1bmN0aW9uKHQpe3UodGhpcy5wYXJhbXNfLHQpLHRoaXMudXBkYXRlVjEzXygpLHRoaXMuc2V0S2V5KHRoaXMuZ2V0S2V5Rm9yUGFyYW1zXygpKX0sZS5wcm90b3R5cGUudXBkYXRlVjEzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMucGFyYW1zXy5WRVJTSU9OfHx4cDt0aGlzLnYxM189S2kodCwiMS4zIik+PTB9LGV9KCR1KSxlYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4sbyxzKXt0LmNhbGwodGhpcyxlLGkpLHRoaXMuc3JjXz1yLHRoaXMuZXh0ZW50Xz1uLHRoaXMucHJlZW1wdGl2ZV89byx0aGlzLmdyaWRfPW51bGwsdGhpcy5rZXlzXz1udWxsLHRoaXMuZGF0YV89bnVsbCx0aGlzLmpzb25wXz1zfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRJbWFnZT1mdW5jdGlvbigpe3JldHVybiBudWxsfSxlLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmdyaWRffHwhdGhpcy5rZXlzXylyZXR1cm4gbnVsbDt2YXIgZT0odFswXS10aGlzLmV4dGVudF9bMF0pLyh0aGlzLmV4dGVudF9bMl0tdGhpcy5leHRlbnRfWzBdKSxpPSh0WzFdLXRoaXMuZXh0ZW50X1sxXSkvKHRoaXMuZXh0ZW50X1szXS10aGlzLmV4dGVudF9bMV0pLHI9dGhpcy5ncmlkX1tNYXRoLmZsb29yKCgxLWkpKnRoaXMuZ3JpZF8ubGVuZ3RoKV07aWYoInN0cmluZyIhPXR5cGVvZiByKXJldHVybiBudWxsO3ZhciBuPXIuY2hhckNvZGVBdChNYXRoLmZsb29yKGUqci5sZW5ndGgpKTtuPj05MyYmbi0tLG4+PTM1JiZuLS07dmFyIG89bnVsbDtpZigobi09MzIpaW4gdGhpcy5rZXlzXyl7dmFyIHM9dGhpcy5rZXlzX1tuXTtvPXRoaXMuZGF0YV8mJnMgaW4gdGhpcy5kYXRhXz90aGlzLmRhdGFfW3NdOnN9cmV0dXJuIG99LGUucHJvdG90eXBlLmZvckRhdGFBdENvb3JkaW5hdGU9ZnVuY3Rpb24odCxlLGkscil7dGhpcy5zdGF0ZT09T24uSURMRSYmITA9PT1yPyhtKHRoaXMsTS5DSEFOR0UsZnVuY3Rpb24ocil7ZS5jYWxsKGksdGhpcy5nZXREYXRhKHQpKX0sdGhpcyksdGhpcy5sb2FkSW50ZXJuYWxfKCkpOiEwPT09cj9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5jYWxsKGksdGhpcy5nZXREYXRhKHQpKX0uYmluZCh0aGlzKSwwKTplLmNhbGwoaSx0aGlzLmdldERhdGEodCkpfSxlLnByb3RvdHlwZS5nZXRLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zcmNffSxlLnByb3RvdHlwZS5oYW5kbGVFcnJvcl89ZnVuY3Rpb24oKXt0aGlzLnN0YXRlPU9uLkVSUk9SLHRoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5oYW5kbGVMb2FkXz1mdW5jdGlvbih0KXt0aGlzLmdyaWRfPXQuZ3JpZCx0aGlzLmtleXNfPXQua2V5cyx0aGlzLmRhdGFfPXQuZGF0YSx0aGlzLnN0YXRlPU9uLkVNUFRZLHRoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5sb2FkSW50ZXJuYWxfPWZ1bmN0aW9uKCl7aWYodGhpcy5zdGF0ZT09T24uSURMRSlpZih0aGlzLnN0YXRlPU9uLkxPQURJTkcsdGhpcy5qc29ucF8pWXUodGhpcy5zcmNfLHRoaXMuaGFuZGxlTG9hZF8uYmluZCh0aGlzKSx0aGlzLmhhbmRsZUVycm9yXy5iaW5kKHRoaXMpKTtlbHNle3ZhciB0PW5ldyBYTUxIdHRwUmVxdWVzdDt0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHRoaXMub25YSFJMb2FkXy5iaW5kKHRoaXMpKSx0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLm9uWEhSRXJyb3JfLmJpbmQodGhpcykpLHQub3BlbigiR0VUIix0aGlzLnNyY18pLHQuc2VuZCgpfX0sZS5wcm90b3R5cGUub25YSFJMb2FkXz1mdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtpZighZS5zdGF0dXN8fGUuc3RhdHVzPj0yMDAmJmUuc3RhdHVzPDMwMCl7dmFyIGk7dHJ5e2k9SlNPTi5wYXJzZShlLnJlc3BvbnNlVGV4dCl9Y2F0Y2godCl7cmV0dXJuIHZvaWQgdGhpcy5oYW5kbGVFcnJvcl8oKX10aGlzLmhhbmRsZUxvYWRfKGkpfWVsc2UgdGhpcy5oYW5kbGVFcnJvcl8oKX0sZS5wcm90b3R5cGUub25YSFJFcnJvcl89ZnVuY3Rpb24odCl7dGhpcy5oYW5kbGVFcnJvcl8oKX0sZS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3RoaXMucHJlZW1wdGl2ZV8mJnRoaXMubG9hZEludGVybmFsXygpfSxlfSh2bCksaWM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtpZih0LmNhbGwodGhpcyx7cHJvamVjdGlvbjpFZSgiRVBTRzozODU3Iiksc3RhdGU6cm8uTE9BRElOR30pLHRoaXMucHJlZW1wdGl2ZV89dm9pZCAwPT09ZS5wcmVlbXB0aXZlfHxlLnByZWVtcHRpdmUsdGhpcy50aWxlVXJsRnVuY3Rpb25fPWp1LHRoaXMudGVtcGxhdGVfPXZvaWQgMCx0aGlzLmpzb25wXz1lLmpzb25wfHwhMSxlLnVybClpZih0aGlzLmpzb25wXylZdShlLnVybCx0aGlzLmhhbmRsZVRpbGVKU09OUmVzcG9uc2UuYmluZCh0aGlzKSx0aGlzLmhhbmRsZVRpbGVKU09ORXJyb3IuYmluZCh0aGlzKSk7ZWxzZXt2YXIgaT1uZXcgWE1MSHR0cFJlcXVlc3Q7aS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix0aGlzLm9uWEhSTG9hZF8uYmluZCh0aGlzKSksaS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5vblhIUkVycm9yXy5iaW5kKHRoaXMpKSxpLm9wZW4oIkdFVCIsZS51cmwpLGkuc2VuZCgpfWVsc2UgZS50aWxlSlNPTj90aGlzLmhhbmRsZVRpbGVKU09OUmVzcG9uc2UoZS50aWxlSlNPTik6WSghMSw1MSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLm9uWEhSTG9hZF89ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQ7aWYoIWUuc3RhdHVzfHxlLnN0YXR1cz49MjAwJiZlLnN0YXR1czwzMDApe3ZhciBpO3RyeXtpPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKHQpe3JldHVybiB2b2lkIHRoaXMuaGFuZGxlVGlsZUpTT05FcnJvcigpfXRoaXMuaGFuZGxlVGlsZUpTT05SZXNwb25zZShpKX1lbHNlIHRoaXMuaGFuZGxlVGlsZUpTT05FcnJvcigpfSxlLnByb3RvdHlwZS5vblhIUkVycm9yXz1mdW5jdGlvbih0KXt0aGlzLmhhbmRsZVRpbGVKU09ORXJyb3IoKX0sZS5wcm90b3R5cGUuZ2V0VGVtcGxhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZW1wbGF0ZV99LGUucHJvdG90eXBlLmZvckRhdGFBdENvb3JkaW5hdGVBbmRSZXNvbHV0aW9uPWZ1bmN0aW9uKHQsZSxpLHIpe2lmKHRoaXMudGlsZUdyaWQpe3ZhciBuPXRoaXMudGlsZUdyaWQuZ2V0VGlsZUNvb3JkRm9yQ29vcmRBbmRSZXNvbHV0aW9uKHQsZSk7dGhpcy5nZXRUaWxlKG5bMF0sblsxXSxuWzJdLDEsdGhpcy5nZXRQcm9qZWN0aW9uKCkpLmZvckRhdGFBdENvb3JkaW5hdGUodCxpLG51bGwscil9ZWxzZSEwPT09cj9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aShudWxsKX0sMCk6aShudWxsKX0sZS5wcm90b3R5cGUuaGFuZGxlVGlsZUpTT05FcnJvcj1mdW5jdGlvbigpe3RoaXMuc2V0U3RhdGUocm8uRVJST1IpfSxlLnByb3RvdHlwZS5oYW5kbGVUaWxlSlNPTlJlc3BvbnNlPWZ1bmN0aW9uKHQpe3ZhciBlLGk9RWUoIkVQU0c6NDMyNiIpLHI9dGhpcy5nZXRQcm9qZWN0aW9uKCk7aWYodm9pZCAwIT09dC5ib3VuZHMpe3ZhciBuPUxlKGkscik7ZT1GdCh0LmJvdW5kcyxuKX12YXIgbz10Lm1pbnpvb218fDAscz10Lm1heHpvb218fDIyLGE9Rmwoe2V4dGVudDpHbChyKSxtYXhab29tOnMsbWluWm9vbTpvfSk7dGhpcy50aWxlR3JpZD1hLHRoaXMudGVtcGxhdGVfPXQudGVtcGxhdGU7dmFyIGg9dC5ncmlkcztpZihoKXtpZih0aGlzLnRpbGVVcmxGdW5jdGlvbl89RHUoaCxhKSx2b2lkIDAhPT10LmF0dHJpYnV0aW9uKXt2YXIgbD12b2lkIDAhPT1lP2U6aS5nZXRFeHRlbnQoKTt0aGlzLnNldEF0dHJpYnV0aW9ucyhmdW5jdGlvbihlKXtyZXR1cm4gUHQobCxlLmV4dGVudCk/W3QuYXR0cmlidXRpb25dOm51bGx9KX10aGlzLnNldFN0YXRlKHJvLlJFQURZKX1lbHNlIHRoaXMuc2V0U3RhdGUocm8uRVJST1IpfSxlLnByb3RvdHlwZS5nZXRUaWxlPWZ1bmN0aW9uKHQsZSxpLHIsbil7dmFyIG89U2wodCxlLGkpO2lmKHRoaXMudGlsZUNhY2hlLmNvbnRhaW5zS2V5KG8pKXJldHVybiB0aGlzLnRpbGVDYWNoZS5nZXQobyk7dmFyIHM9W3QsZSxpXSxhPXRoaXMuZ2V0VGlsZUNvb3JkRm9yVGlsZVVybEZ1bmN0aW9uKHMsbiksaD10aGlzLnRpbGVVcmxGdW5jdGlvbl8oYSxyLG4pLGw9bmV3IGVjKHMsdm9pZCAwIT09aD9Pbi5JRExFOk9uLkVNUFRZLHZvaWQgMCE9PWg/aDoiIix0aGlzLnRpbGVHcmlkLmdldFRpbGVDb29yZEV4dGVudChzKSx0aGlzLnByZWVtcHRpdmVfLHRoaXMuanNvbnBfKTtyZXR1cm4gdGhpcy50aWxlQ2FjaGUuc2V0KG8sbCksbH0sZS5wcm90b3R5cGUudXNlVGlsZT1mdW5jdGlvbih0LGUsaSl7dmFyIHI9U2wodCxlLGkpO3RoaXMudGlsZUNhY2hlLmNvbnRhaW5zS2V5KHIpJiZ0aGlzLnRpbGVDYWNoZS5nZXQocil9LGV9KGpsKSxyYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGkscixuLG8scyxhLGgsbCx1LHAsYyxkLGYsXyxnKXtpZih0LmNhbGwodGhpcyxpLHIse3RyYW5zaXRpb246MH0pLHRoaXMuY29udGV4dF89e30sdGhpcy5sb2FkZXJfLHRoaXMucmVwbGF5U3RhdGVfPXt9LHRoaXMuc291cmNlVGlsZXNfPXAsdGhpcy50aWxlS2V5cz1bXSx0aGlzLmV4dGVudD1udWxsLHRoaXMuc291cmNlUmV2aXNpb25fPW4sdGhpcy53cmFwcGVkVGlsZUNvb3JkPWEsdGhpcy5sb2FkTGlzdGVuZXJLZXlzXz1bXSx0aGlzLnNvdXJjZVRpbGVMaXN0ZW5lcktleXNfPVtdLGEpe3ZhciB5PXRoaXMuZXh0ZW50PXUuZ2V0VGlsZUNvb3JkRXh0ZW50KGEpLG09dS5nZXRSZXNvbHV0aW9uKGcpLHg9bC5nZXRaRm9yUmVzb2x1dGlvbihtKSxFPWchPWlbMF0sUz0wO2lmKGwuZm9yRWFjaFRpbGVDb29yZCh5LHgsZnVuY3Rpb24odCl7dmFyIGU9d3QoeSxsLmdldFRpbGVDb29yZEV4dGVudCh0KSksaT1sLmdldEV4dGVudCgpO2lmKGkmJihlPXd0KGUsaSxlKSksT3QoZSkvbT49LjUmJlJ0KGUpL20+PS41KXsrK1M7dmFyIHI9dC50b1N0cmluZygpLG49cFtyXTtpZighbiYmIUUpe3ZhciBhPWgodCxjLGQpO249cFtyXT1uZXcgZih0LHZvaWQgMD09YT9Pbi5FTVBUWTpPbi5JRExFLHZvaWQgMD09YT8iIjphLG8scyksdGhpcy5zb3VyY2VUaWxlTGlzdGVuZXJLZXlzXy5wdXNoKHYobixNLkNIQU5HRSxfKSl9IW58fEUmJm4uZ2V0U3RhdGUoKSE9T24uTE9BREVEfHwobi5jb25zdW1lcnMrKyx0aGlzLnRpbGVLZXlzLnB1c2gocikpfX0uYmluZCh0aGlzKSksRSYmUz09dGhpcy50aWxlS2V5cy5sZW5ndGgmJnRoaXMuZmluaXNoTG9hZGluZ18oKSxnPD1pWzBdJiZ0aGlzLnN0YXRlIT1Pbi5MT0FERUQpZm9yKDtnPnUuZ2V0TWluWm9vbSgpOyl7dmFyIFQ9bmV3IGUoaSxyLG4sbyxzLGEsaCxsLHUscCxjLGQsZixJLC0tZyk7aWYoVC5zdGF0ZT09T24uTE9BREVEKXt0aGlzLmludGVyaW1UaWxlPVQ7YnJlYWt9fX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbD1mdW5jdGlvbigpe3RoaXMuc3RhdGU9T24uQUJPUlQsdGhpcy5jaGFuZ2VkKCksdGhpcy5pbnRlcmltVGlsZSYmdGhpcy5pbnRlcmltVGlsZS5kaXNwb3NlKCk7Zm9yKHZhciBlPTAsaT10aGlzLnRpbGVLZXlzLmxlbmd0aDtlPGk7KytlKXt2YXIgcj10aGlzLnRpbGVLZXlzW2VdLG49dGhpcy5nZXRUaWxlKHIpO24uY29uc3VtZXJzLS0sMD09bi5jb25zdW1lcnMmJihkZWxldGUgdGhpcy5zb3VyY2VUaWxlc19bcl0sbi5kaXNwb3NlKCkpfXRoaXMudGlsZUtleXMubGVuZ3RoPTAsdGhpcy5zb3VyY2VUaWxlc189bnVsbCx0aGlzLmxvYWRMaXN0ZW5lcktleXNfLmZvckVhY2goRSksdGhpcy5sb2FkTGlzdGVuZXJLZXlzXy5sZW5ndGg9MCx0aGlzLnNvdXJjZVRpbGVMaXN0ZW5lcktleXNfLmZvckVhY2goRSksdGhpcy5zb3VyY2VUaWxlTGlzdGVuZXJLZXlzXy5sZW5ndGg9MCx0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuZ2V0Q29udGV4dD1mdW5jdGlvbih0KXt2YXIgZT1vKHQpO3JldHVybiBlIGluIHRoaXMuY29udGV4dF98fCh0aGlzLmNvbnRleHRfW2VdPUpuKCkpLHRoaXMuY29udGV4dF9bZV19LGUucHJvdG90eXBlLmdldEltYWdlPWZ1bmN0aW9uKHQpe3JldHVybi0xPT10aGlzLmdldFJlcGxheVN0YXRlKHQpLnJlbmRlcmVkVGlsZVJldmlzaW9uP251bGw6dGhpcy5nZXRDb250ZXh0KHQpLmNhbnZhc30sZS5wcm90b3R5cGUuZ2V0UmVwbGF5U3RhdGU9ZnVuY3Rpb24odCl7dmFyIGU9byh0KTtyZXR1cm4gZSBpbiB0aGlzLnJlcGxheVN0YXRlX3x8KHRoaXMucmVwbGF5U3RhdGVfW2VdPXtkaXJ0eTohMSxyZW5kZXJlZFJlbmRlck9yZGVyOm51bGwscmVuZGVyZWRSZXZpc2lvbjotMSxyZW5kZXJlZFRpbGVSZXZpc2lvbjotMX0pLHRoaXMucmVwbGF5U3RhdGVfW2VdfSxlLnByb3RvdHlwZS5nZXRLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aWxlS2V5cy5qb2luKCIvIikrIi0iK3RoaXMuc291cmNlUmV2aXNpb25ffSxlLnByb3RvdHlwZS5nZXRUaWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNvdXJjZVRpbGVzX1t0XX0sZS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciB0PTAsZT17fTt0aGlzLnN0YXRlPT1Pbi5JRExFJiZ0aGlzLnNldFN0YXRlKE9uLkxPQURJTkcpLHRoaXMuc3RhdGU9PU9uLkxPQURJTkcmJnRoaXMudGlsZUtleXMuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgcj10aGlzLmdldFRpbGUoaSk7aWYoci5zdGF0ZT09T24uSURMRSYmKHIuc2V0TG9hZGVyKHRoaXMubG9hZGVyXyksci5sb2FkKCkpLHIuc3RhdGU9PU9uLkxPQURJTkcpe3ZhciBuPXYocixNLkNIQU5HRSxmdW5jdGlvbihpKXt2YXIgbj1yLmdldFN0YXRlKCk7aWYobj09T24uTE9BREVEfHxuPT1Pbi5FUlJPUil7dmFyIHM9byhyKTtuPT1Pbi5FUlJPUj9lW3NdPSEwOigtLXQsZGVsZXRlIGVbc10pLHQtT2JqZWN0LmtleXMoZSkubGVuZ3RoPT0wJiZ0aGlzLmZpbmlzaExvYWRpbmdfKCl9fS5iaW5kKHRoaXMpKTt0aGlzLmxvYWRMaXN0ZW5lcktleXNfLnB1c2gobiksKyt0fX0uYmluZCh0aGlzKSksdC1PYmplY3Qua2V5cyhlKS5sZW5ndGg9PTAmJnNldFRpbWVvdXQodGhpcy5maW5pc2hMb2FkaW5nXy5iaW5kKHRoaXMpLDApfSxlLnByb3RvdHlwZS5maW5pc2hMb2FkaW5nXz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnRpbGVLZXlzLmxlbmd0aCxlPTAsaT10LTE7aT49MDstLWkpe3ZhciByPXRoaXMuZ2V0VGlsZSh0aGlzLnRpbGVLZXlzW2ldKS5nZXRTdGF0ZSgpO3IhPU9uLkxPQURFRCYmLS10LHI9PU9uLkVNUFRZJiYrK2V9dD09dGhpcy50aWxlS2V5cy5sZW5ndGg/KHRoaXMubG9hZExpc3RlbmVyS2V5c18uZm9yRWFjaChFKSx0aGlzLmxvYWRMaXN0ZW5lcktleXNfLmxlbmd0aD0wLHRoaXMuc2V0U3RhdGUoT24uTE9BREVEKSk6dGhpcy5zZXRTdGF0ZShlPT10aGlzLnRpbGVLZXlzLmxlbmd0aD9Pbi5FTVBUWTpPbi5FUlJPUil9LGV9KHZsKTtmdW5jdGlvbiBuYyh0LGUpe3ZhciBpPVpsKGUsdC5nZXRGb3JtYXQoKSx0Lm9uTG9hZC5iaW5kKHQpLHQub25FcnJvci5iaW5kKHQpKTt0LnNldExvYWRlcihpKX12YXIgb2M9WzAsMCw0MDk2LDQwOTZdLHNjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIsbixvLHMpe3QuY2FsbCh0aGlzLGUsaSxzKSx0aGlzLmNvbnN1bWVycz0wLHRoaXMuZXh0ZW50Xz1udWxsLHRoaXMuZm9ybWF0Xz1uLHRoaXMuZmVhdHVyZXNfPW51bGwsdGhpcy5sb2FkZXJfLHRoaXMucHJvamVjdGlvbl89bnVsbCx0aGlzLnJlcGxheUdyb3Vwc189e30sdGhpcy50aWxlTG9hZEZ1bmN0aW9uXz1vLHRoaXMudXJsXz1yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWw9ZnVuY3Rpb24oKXt0aGlzLmZlYXR1cmVzXz1udWxsLHRoaXMucmVwbGF5R3JvdXBzXz17fSx0aGlzLnN0YXRlPU9uLkFCT1JULHRoaXMuY2hhbmdlZCgpLHQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5leHRlbnRffHxvY30sZS5wcm90b3R5cGUuZ2V0Rm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm9ybWF0X30sZS5wcm90b3R5cGUuZ2V0RmVhdHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mZWF0dXJlc199LGUucHJvdG90eXBlLmdldEtleT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVybF99LGUucHJvdG90eXBlLmdldFByb2plY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uX30sZS5wcm90b3R5cGUuZ2V0UmVwbGF5R3JvdXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZXBsYXlHcm91cHNfW28odCkrIiwiK2VdfSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT09T24uSURMRSYmKHRoaXMuc2V0U3RhdGUoT24uTE9BRElORyksdGhpcy50aWxlTG9hZEZ1bmN0aW9uXyh0aGlzLHRoaXMudXJsXyksdGhpcy5sb2FkZXJfKG51bGwsTmFOLG51bGwpKX0sZS5wcm90b3R5cGUub25Mb2FkPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLnNldFByb2plY3Rpb24oZSksdGhpcy5zZXRGZWF0dXJlcyh0KSx0aGlzLnNldEV4dGVudChpKX0sZS5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbigpe3RoaXMuc2V0U3RhdGUoT24uRVJST1IpfSxlLnByb3RvdHlwZS5zZXRFeHRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5leHRlbnRfPXR9LGUucHJvdG90eXBlLnNldEZlYXR1cmVzPWZ1bmN0aW9uKHQpe3RoaXMuZmVhdHVyZXNfPXQsdGhpcy5zZXRTdGF0ZShPbi5MT0FERUQpfSxlLnByb3RvdHlwZS5zZXRQcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3RoaXMucHJvamVjdGlvbl89dH0sZS5wcm90b3R5cGUuc2V0UmVwbGF5R3JvdXA9ZnVuY3Rpb24odCxlLGkpe3RoaXMucmVwbGF5R3JvdXBzX1tvKHQpKyIsIitlXT1pfSxlLnByb3RvdHlwZS5zZXRMb2FkZXI9ZnVuY3Rpb24odCl7dGhpcy5sb2FkZXJfPXR9LGV9KHZsKSxhYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWUucHJvamVjdGlvbnx8IkVQU0c6Mzg1NyIscj1lLmV4dGVudHx8R2woaSksbj1lLnRpbGVHcmlkfHxGbCh7ZXh0ZW50OnIsbWF4Wm9vbTplLm1heFpvb218fDIyLG1pblpvb206ZS5taW5ab29tLHRpbGVTaXplOmUudGlsZVNpemV8fDUxMn0pO3QuY2FsbCh0aGlzLHthdHRyaWJ1dGlvbnM6ZS5hdHRyaWJ1dGlvbnMsY2FjaGVTaXplOnZvaWQgMCE9PWUuY2FjaGVTaXplP2UuY2FjaGVTaXplOjEyOCxvcGFxdWU6ITEscHJvamVjdGlvbjppLHN0YXRlOmUuc3RhdGUsdGlsZUdyaWQ6bix0aWxlTG9hZEZ1bmN0aW9uOmUudGlsZUxvYWRGdW5jdGlvbj9lLnRpbGVMb2FkRnVuY3Rpb246bmMsdGlsZVVybEZ1bmN0aW9uOmUudGlsZVVybEZ1bmN0aW9uLHVybDplLnVybCx1cmxzOmUudXJscyx3cmFwWDp2b2lkIDA9PT1lLndyYXBYfHxlLndyYXBYLHRyYW5zaXRpb246ZS50cmFuc2l0aW9ufSksdGhpcy5mb3JtYXRfPWUuZm9ybWF0P2UuZm9ybWF0Om51bGwsdGhpcy5zb3VyY2VUaWxlc189e30sdGhpcy5vdmVybGFwc189dm9pZCAwPT1lLm92ZXJsYXBzfHxlLm92ZXJsYXBzLHRoaXMudGlsZUNsYXNzPWUudGlsZUNsYXNzP2UudGlsZUNsYXNzOnNjLHRoaXMudGlsZUdyaWRzXz17fX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0T3ZlcmxhcHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdmVybGFwc199LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy50aWxlQ2FjaGUuY2xlYXIoKSx0aGlzLnNvdXJjZVRpbGVzXz17fX0sZS5wcm90b3R5cGUuZ2V0VGlsZT1mdW5jdGlvbih0LGUsaSxyLG4pe3ZhciBvPVNsKHQsZSxpKTtpZih0aGlzLnRpbGVDYWNoZS5jb250YWluc0tleShvKSlyZXR1cm4gdGhpcy50aWxlQ2FjaGUuZ2V0KG8pO3ZhciBzPVt0LGUsaV0sYT10aGlzLmdldFRpbGVDb29yZEZvclRpbGVVcmxGdW5jdGlvbihzLG4pLGg9bmV3IHJjKHMsbnVsbCE9PWE/T24uSURMRTpPbi5FTVBUWSx0aGlzLmdldFJldmlzaW9uKCksdGhpcy5mb3JtYXRfLHRoaXMudGlsZUxvYWRGdW5jdGlvbixhLHRoaXMudGlsZVVybEZ1bmN0aW9uLHRoaXMudGlsZUdyaWQsdGhpcy5nZXRUaWxlR3JpZEZvclByb2plY3Rpb24obiksdGhpcy5zb3VyY2VUaWxlc18scixuLHRoaXMudGlsZUNsYXNzLHRoaXMuaGFuZGxlVGlsZUNoYW5nZS5iaW5kKHRoaXMpLHNbMF0pO3JldHVybiB0aGlzLnRpbGVDYWNoZS5zZXQobyxoKSxofSxlLnByb3RvdHlwZS5nZXRUaWxlR3JpZEZvclByb2plY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRDb2RlKCksaT10aGlzLnRpbGVHcmlkc19bZV07aWYoIWkpe3ZhciByPXRoaXMudGlsZUdyaWQ7aT10aGlzLnRpbGVHcmlkc19bZV09TmwodCx2b2lkIDAscj9yLmdldFRpbGVTaXplKHIuZ2V0TWluWm9vbSgpKTp2b2lkIDApfXJldHVybiBpfSxlLnByb3RvdHlwZS5nZXRUaWxlUGl4ZWxSYXRpbz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0VGlsZVBpeGVsU2l6ZT1mdW5jdGlvbih0LGUsaSl7dmFyIHI9aG8odGhpcy5nZXRUaWxlR3JpZEZvclByb2plY3Rpb24oaSkuZ2V0VGlsZVNpemUodCksdGhpcy50bXBTaXplKTtyZXR1cm5bTWF0aC5yb3VuZChyWzBdKmUpLE1hdGgucm91bmQoclsxXSplKV19LGV9KEp1KSxoYz17S1ZQOiJLVlAiLFJFU1Q6IlJFU1QifSxsYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPXZvaWQgMCE9PWUucmVxdWVzdEVuY29kaW5nP2UucmVxdWVzdEVuY29kaW5nOmhjLktWUCxyPWUudGlsZUdyaWQsbj1lLnVybHM7dm9pZCAwPT09biYmdm9pZCAwIT09ZS51cmwmJihuPVV1KGUudXJsKSksdC5jYWxsKHRoaXMse2F0dHJpYnV0aW9uczplLmF0dHJpYnV0aW9ucyxjYWNoZVNpemU6ZS5jYWNoZVNpemUsY3Jvc3NPcmlnaW46ZS5jcm9zc09yaWdpbixwcm9qZWN0aW9uOmUucHJvamVjdGlvbixyZXByb2plY3Rpb25FcnJvclRocmVzaG9sZDplLnJlcHJvamVjdGlvbkVycm9yVGhyZXNob2xkLHRpbGVDbGFzczplLnRpbGVDbGFzcyx0aWxlR3JpZDpyLHRpbGVMb2FkRnVuY3Rpb246ZS50aWxlTG9hZEZ1bmN0aW9uLHRpbGVQaXhlbFJhdGlvOmUudGlsZVBpeGVsUmF0aW8sdGlsZVVybEZ1bmN0aW9uOmp1LHVybHM6bix3cmFwWDp2b2lkIDAhPT1lLndyYXBYJiZlLndyYXBYLHRyYW5zaXRpb246ZS50cmFuc2l0aW9ufSksdGhpcy52ZXJzaW9uXz12b2lkIDAhPT1lLnZlcnNpb24/ZS52ZXJzaW9uOiIxLjAuMCIsdGhpcy5mb3JtYXRfPXZvaWQgMCE9PWUuZm9ybWF0P2UuZm9ybWF0OiJpbWFnZS9qcGVnIix0aGlzLmRpbWVuc2lvbnNfPXZvaWQgMCE9PWUuZGltZW5zaW9ucz9lLmRpbWVuc2lvbnM6e30sdGhpcy5sYXllcl89ZS5sYXllcix0aGlzLm1hdHJpeFNldF89ZS5tYXRyaXhTZXQsdGhpcy5zdHlsZV89ZS5zdHlsZSx0aGlzLnJlcXVlc3RFbmNvZGluZ189aSx0aGlzLnNldEtleSh0aGlzLmdldEtleUZvckRpbWVuc2lvbnNfKCkpLG4mJm4ubGVuZ3RoPjAmJih0aGlzLnRpbGVVcmxGdW5jdGlvbj1rdShuLm1hcCh1Yy5iaW5kKHRoaXMpKSkpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5zZXRVcmxzPWZ1bmN0aW9uKHQpe3RoaXMudXJscz10O3ZhciBlPXQuam9pbigiXG4iKTt0aGlzLnNldFRpbGVVcmxGdW5jdGlvbihrdSh0Lm1hcCh1Yy5iaW5kKHRoaXMpKSksZSl9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaW1lbnNpb25zX30sZS5wcm90b3R5cGUuZ2V0Rm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm9ybWF0X30sZS5wcm90b3R5cGUuZ2V0TGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllcl99LGUucHJvdG90eXBlLmdldE1hdHJpeFNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdHJpeFNldF99LGUucHJvdG90eXBlLmdldFJlcXVlc3RFbmNvZGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcXVlc3RFbmNvZGluZ199LGUucHJvdG90eXBlLmdldFN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3R5bGVffSxlLnByb3RvdHlwZS5nZXRWZXJzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmVyc2lvbl99LGUucHJvdG90eXBlLmdldEtleUZvckRpbWVuc2lvbnNfPWZ1bmN0aW9uKCl7dmFyIHQ9MCxlPVtdO2Zvcih2YXIgaSBpbiB0aGlzLmRpbWVuc2lvbnNfKWVbdCsrXT1pKyItIit0aGlzLmRpbWVuc2lvbnNfW2ldO3JldHVybiBlLmpvaW4oIi8iKX0sZS5wcm90b3R5cGUudXBkYXRlRGltZW5zaW9ucz1mdW5jdGlvbih0KXt1KHRoaXMuZGltZW5zaW9uc18sdCksdGhpcy5zZXRLZXkodGhpcy5nZXRLZXlGb3JEaW1lbnNpb25zXygpKX0sZX0oJHUpO2Z1bmN0aW9uIHVjKHQpe3ZhciBlPXRoaXMucmVxdWVzdEVuY29kaW5nXyxpPXtsYXllcjp0aGlzLmxheWVyXyxzdHlsZTp0aGlzLnN0eWxlXyx0aWxlbWF0cml4c2V0OnRoaXMubWF0cml4U2V0X307ZT09aGMuS1ZQJiZ1KGkse1NlcnZpY2U6IldNVFMiLFJlcXVlc3Q6IkdldFRpbGUiLFZlcnNpb246dGhpcy52ZXJzaW9uXyxGb3JtYXQ6dGhpcy5mb3JtYXRffSksdD1lPT1oYy5LVlA/X3AodCxpKTp0LnJlcGxhY2UoL1x7KFx3Kz8pXH0vZyxmdW5jdGlvbih0LGUpe3JldHVybiBlLnRvTG93ZXJDYXNlKClpbiBpP2lbZS50b0xvd2VyQ2FzZSgpXTp0fSk7dmFyIHI9dGhpcy50aWxlR3JpZCxuPXRoaXMuZGltZW5zaW9uc187cmV0dXJuIGZ1bmN0aW9uKGksbyxzKXtpZihpKXt2YXIgYT17VGlsZU1hdHJpeDpyLmdldE1hdHJpeElkKGlbMF0pLFRpbGVDb2w6aVsxXSxUaWxlUm93Oi1pWzJdLTF9O3UoYSxuKTt2YXIgaD10O3JldHVybiBoPWU9PWhjLktWUD9fcChoLGEpOmgucmVwbGFjZSgvXHsoXHcrPylcfS9nLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFbZV19KX19fXZhciBwYz17REVGQVVMVDoiZGVmYXVsdCIsVFJVTkNBVEVEOiJ0cnVuY2F0ZWQifSxjYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4sbyxzLGEpe3QuY2FsbCh0aGlzLGkscixuLG8scyxhKSx0aGlzLnpvb21pZnlJbWFnZV89bnVsbCx0aGlzLnRpbGVTaXplXz1obyhlLmdldFRpbGVTaXplKGlbMF0pKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0SW1hZ2U9ZnVuY3Rpb24oKXtpZih0aGlzLnpvb21pZnlJbWFnZV8pcmV0dXJuIHRoaXMuem9vbWlmeUltYWdlXzt2YXIgZT10LnByb3RvdHlwZS5nZXRJbWFnZS5jYWxsKHRoaXMpO2lmKHRoaXMuc3RhdGU9PU9uLkxPQURFRCl7dmFyIGk9dGhpcy50aWxlU2l6ZV87aWYoZS53aWR0aD09aVswXSYmZS5oZWlnaHQ9PWlbMV0pcmV0dXJuIHRoaXMuem9vbWlmeUltYWdlXz1lLGU7dmFyIHI9Sm4oaVswXSxpWzFdKTtyZXR1cm4gci5kcmF3SW1hZ2UoZSwwLDApLHRoaXMuem9vbWlmeUltYWdlXz1yLmNhbnZhcyxyLmNhbnZhc31yZXR1cm4gZX0sZX0oeGwpLGRjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e30scj1pLnNpemUsbj12b2lkIDAhPT1pLnRpZXJTaXplQ2FsY3VsYXRpb24/aS50aWVyU2l6ZUNhbGN1bGF0aW9uOnBjLkRFRkFVTFQsbz1yWzBdLHM9clsxXSxhPWkuZXh0ZW50fHxbMCwtclsxXSxyWzBdLDBdLGg9W10sbD1pLnRpbGVTaXplfHxBbix1PWw7c3dpdGNoKG4pe2Nhc2UgcGMuREVGQVVMVDpmb3IoO28+dXx8cz51OyloLnB1c2goW01hdGguY2VpbChvL3UpLE1hdGguY2VpbChzL3UpXSksdSs9dTticmVhaztjYXNlIHBjLlRSVU5DQVRFRDpmb3IodmFyIHA9byxjPXM7cD51fHxjPnU7KWgucHVzaChbTWF0aC5jZWlsKHAvdSksTWF0aC5jZWlsKGMvdSldKSxwPj49MSxjPj49MTticmVhaztkZWZhdWx0OlkoITEsNTMpfWgucHVzaChbMSwxXSksaC5yZXZlcnNlKCk7Zm9yKHZhciBkPVsxXSxmPVswXSxfPTEsZz1oLmxlbmd0aDtfPGc7XysrKWQucHVzaCgxPDxfKSxmLnB1c2goaFtfLTFdWzBdKmhbXy0xXVsxXStmW18tMV0pO2QucmV2ZXJzZSgpO3ZhciB5PW5ldyBQbCh7dGlsZVNpemU6bCxleHRlbnQ6YSxvcmlnaW46SXQoYSkscmVzb2x1dGlvbnM6ZH0pLHY9aS51cmw7diYmLTE9PXYuaW5kZXhPZigie1RpbGVHcm91cH0iKSYmLTE9PXYuaW5kZXhPZigie3RpbGVJbmRleH0iKSYmKHYrPSJ7VGlsZUdyb3VwfS97en0te3h9LXt5fS5qcGciKTt2YXIgbT1rdShVdSh2KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsaSxyKXtpZihlKXt2YXIgbj1lWzBdLG89ZVsxXSxzPS1lWzJdLTEsYT1vK3MqaFtuXVswXSxsPXkuZ2V0VGlsZVNpemUobiksdT1BcnJheS5pc0FycmF5KGwpP2xbMF06bCxwPXt6Om4seDpvLHk6cyx0aWxlSW5kZXg6YSxUaWxlR3JvdXA6IlRpbGVHcm91cCIrKChhK2Zbbl0pL3V8MCl9O3JldHVybiB0LnJlcGxhY2UoL1x7KFx3Kz8pXH0vZyxmdW5jdGlvbih0LGUpe3JldHVybiBwW2VdfSl9fX0pKSx4PWNjLmJpbmQobnVsbCx5KTt0LmNhbGwodGhpcyx7YXR0cmlidXRpb25zOmkuYXR0cmlidXRpb25zLGNhY2hlU2l6ZTppLmNhY2hlU2l6ZSxjcm9zc09yaWdpbjppLmNyb3NzT3JpZ2luLHByb2plY3Rpb246aS5wcm9qZWN0aW9uLHJlcHJvamVjdGlvbkVycm9yVGhyZXNob2xkOmkucmVwcm9qZWN0aW9uRXJyb3JUaHJlc2hvbGQsdGlsZUNsYXNzOngsdGlsZUdyaWQ6eSx0aWxlVXJsRnVuY3Rpb246bSx0cmFuc2l0aW9uOmkudHJhbnNpdGlvbn0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfSgkdSk7dmFyIGZjPSJyZW5kZXJPcmRlciIsX2M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fSxyPXUoe30saSk7ZGVsZXRlIHIuc3R5bGUsZGVsZXRlIHIucmVuZGVyQnVmZmVyLGRlbGV0ZSByLnVwZGF0ZVdoaWxlQW5pbWF0aW5nLGRlbGV0ZSByLnVwZGF0ZVdoaWxlSW50ZXJhY3RpbmcsdC5jYWxsKHRoaXMsciksdGhpcy5kZWNsdXR0ZXJfPXZvaWQgMCE9PWkuZGVjbHV0dGVyJiZpLmRlY2x1dHRlcix0aGlzLnJlbmRlckJ1ZmZlcl89dm9pZCAwIT09aS5yZW5kZXJCdWZmZXI/aS5yZW5kZXJCdWZmZXI6MTAwLHRoaXMuc3R5bGVfPW51bGwsdGhpcy5zdHlsZUZ1bmN0aW9uXz12b2lkIDAsdGhpcy5zZXRTdHlsZShpLnN0eWxlKSx0aGlzLnVwZGF0ZVdoaWxlQW5pbWF0aW5nXz12b2lkIDAhPT1pLnVwZGF0ZVdoaWxlQW5pbWF0aW5nJiZpLnVwZGF0ZVdoaWxlQW5pbWF0aW5nLHRoaXMudXBkYXRlV2hpbGVJbnRlcmFjdGluZ189dm9pZCAwIT09aS51cGRhdGVXaGlsZUludGVyYWN0aW5nJiZpLnVwZGF0ZVdoaWxlSW50ZXJhY3RpbmcsdGhpcy5yZW5kZXJNb2RlXz1pLnJlbmRlck1vZGV8fFRzLlZFQ1RPUix0aGlzLnR5cGU9U3MuVkVDVE9SfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXREZWNsdXR0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNsdXR0ZXJffSxlLnByb3RvdHlwZS5zZXREZWNsdXR0ZXI9ZnVuY3Rpb24odCl7dGhpcy5kZWNsdXR0ZXJfPXR9LGUucHJvdG90eXBlLmdldFJlbmRlckJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlckJ1ZmZlcl99LGUucHJvdG90eXBlLmdldFJlbmRlck9yZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KGZjKX0sZS5wcm90b3R5cGUuZ2V0U3R5bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHlsZV99LGUucHJvdG90eXBlLmdldFN0eWxlRnVuY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHlsZUZ1bmN0aW9uX30sZS5wcm90b3R5cGUuZ2V0VXBkYXRlV2hpbGVBbmltYXRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cGRhdGVXaGlsZUFuaW1hdGluZ199LGUucHJvdG90eXBlLmdldFVwZGF0ZVdoaWxlSW50ZXJhY3Rpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cGRhdGVXaGlsZUludGVyYWN0aW5nX30sZS5wcm90b3R5cGUuc2V0UmVuZGVyT3JkZXI9ZnVuY3Rpb24odCl7dGhpcy5zZXQoZmMsdCl9LGUucHJvdG90eXBlLnNldFN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuc3R5bGVfPXZvaWQgMCE9PXQ/dDpNdSx0aGlzLnN0eWxlRnVuY3Rpb25fPW51bGw9PT10P3ZvaWQgMDpmdW5jdGlvbih0KXt2YXIgZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCllPXQ7ZWxzZXt2YXIgaTtBcnJheS5pc0FycmF5KHQpP2k9dDooWSgiZnVuY3Rpb24iPT10eXBlb2YgdC5nZXRaSW5kZXgsNDEpLGk9W3RdKSxlPWZ1bmN0aW9uKCl7cmV0dXJuIGl9fXJldHVybiBlfSh0aGlzLnN0eWxlXyksdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmdldFJlbmRlck1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJNb2RlX30sZX0oeG8pO19jLnByb3RvdHlwZS5nZXRTb3VyY2U7dmFyIGdjPV9jLHljPXtCTFVSOiJibHVyIixHUkFESUVOVDoiZ3JhZGllbnQiLFJBRElVUzoicmFkaXVzIn0sdmM9WyIjMDBmIiwiIzBmZiIsIiMwZjAiLCIjZmYwIiwiI2YwMCJdO3ZhciBtYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9LHI9dSh7fSxpKTtkZWxldGUgci5ncmFkaWVudCxkZWxldGUgci5yYWRpdXMsZGVsZXRlIHIuYmx1cixkZWxldGUgci5zaGFkb3csZGVsZXRlIHIud2VpZ2h0LHQuY2FsbCh0aGlzLHIpLHRoaXMuZ3JhZGllbnRfPW51bGwsdGhpcy5zaGFkb3dfPXZvaWQgMCE9PWkuc2hhZG93P2kuc2hhZG93OjI1MCx0aGlzLmNpcmNsZUltYWdlXz12b2lkIDAsdGhpcy5zdHlsZUNhY2hlXz1udWxsLHYodGhpcyxHKHljLkdSQURJRU5UKSx0aGlzLmhhbmRsZUdyYWRpZW50Q2hhbmdlZF8sdGhpcyksdGhpcy5zZXRHcmFkaWVudChpLmdyYWRpZW50P2kuZ3JhZGllbnQ6dmMpLHRoaXMuc2V0Qmx1cih2b2lkIDAhPT1pLmJsdXI/aS5ibHVyOjE1KSx0aGlzLnNldFJhZGl1cyh2b2lkIDAhPT1pLnJhZGl1cz9pLnJhZGl1czo4KSx2KHRoaXMsRyh5Yy5CTFVSKSx0aGlzLmhhbmRsZVN0eWxlQ2hhbmdlZF8sdGhpcyksdih0aGlzLEcoeWMuUkFESVVTKSx0aGlzLmhhbmRsZVN0eWxlQ2hhbmdlZF8sdGhpcyksdGhpcy5oYW5kbGVTdHlsZUNoYW5nZWRfKCk7dmFyIG4sbz1pLndlaWdodD9pLndlaWdodDoid2VpZ2h0IjtuPSJzdHJpbmciPT10eXBlb2Ygbz9mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQobyl9Om8sdGhpcy5zZXRTdHlsZShmdW5jdGlvbih0LGUpe3ZhciBpPW4odCkscj12b2lkIDAhPT1pP2t0KGksMCwxKToxLG89MjU1KnJ8MCxzPXRoaXMuc3R5bGVDYWNoZV9bb107cmV0dXJuIHN8fChzPVtuZXcgTnUoe2ltYWdlOm5ldyBPdSh7b3BhY2l0eTpyLHNyYzp0aGlzLmNpcmNsZUltYWdlX30pfSldLHRoaXMuc3R5bGVDYWNoZV9bb109cyksc30uYmluZCh0aGlzKSksdGhpcy5zZXRSZW5kZXJPcmRlcihudWxsKSx2KHRoaXMsdXIuUkVOREVSLHRoaXMuaGFuZGxlUmVuZGVyXyx0aGlzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY3JlYXRlQ2lyY2xlXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0UmFkaXVzKCksZT10aGlzLmdldEJsdXIoKSxpPXQrZSsxLHI9MippLG49Sm4ocixyKTtuLnNoYWRvd09mZnNldFg9bi5zaGFkb3dPZmZzZXRZPXRoaXMuc2hhZG93XyxuLnNoYWRvd0JsdXI9ZSxuLnNoYWRvd0NvbG9yPSIjMDAwIixuLmJlZ2luUGF0aCgpO3ZhciBvPWktdGhpcy5zaGFkb3dfO3JldHVybiBuLmFyYyhvLG8sdCwwLDIqTWF0aC5QSSwhMCksbi5maWxsKCksbi5jYW52YXMudG9EYXRhVVJMKCl9LGUucHJvdG90eXBlLmdldEJsdXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoeWMuQkxVUil9LGUucHJvdG90eXBlLmdldEdyYWRpZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KHljLkdSQURJRU5UKX0sZS5wcm90b3R5cGUuZ2V0UmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KHljLlJBRElVUyl9LGUucHJvdG90eXBlLmhhbmRsZUdyYWRpZW50Q2hhbmdlZF89ZnVuY3Rpb24oKXt0aGlzLmdyYWRpZW50Xz1mdW5jdGlvbih0KXtmb3IodmFyIGU9Sm4oMSwyNTYpLGk9ZS5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLDAsMSwyNTYpLHI9MS8odC5sZW5ndGgtMSksbj0wLG89dC5sZW5ndGg7bjxvOysrbilpLmFkZENvbG9yU3RvcChuKnIsdFtuXSk7cmV0dXJuIGUuZmlsbFN0eWxlPWksZS5maWxsUmVjdCgwLDAsMSwyNTYpLGUuZ2V0SW1hZ2VEYXRhKDAsMCwxLDI1NikuZGF0YX0odGhpcy5nZXRHcmFkaWVudCgpKX0sZS5wcm90b3R5cGUuaGFuZGxlU3R5bGVDaGFuZ2VkXz1mdW5jdGlvbigpe3RoaXMuY2lyY2xlSW1hZ2VfPXRoaXMuY3JlYXRlQ2lyY2xlXygpLHRoaXMuc3R5bGVDYWNoZV89bmV3IEFycmF5KDI1NiksdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmhhbmRsZVJlbmRlcl89ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuY29udGV4dCxpPWUuY2FudmFzLHI9ZS5nZXRJbWFnZURhdGEoMCwwLGkud2lkdGgsaS5oZWlnaHQpLG49ci5kYXRhLG89MCxzPW4ubGVuZ3RoO288cztvKz00KXt2YXIgYT00Km5bbyszXTthJiYobltvXT10aGlzLmdyYWRpZW50X1thXSxuW28rMV09dGhpcy5ncmFkaWVudF9bYSsxXSxuW28rMl09dGhpcy5ncmFkaWVudF9bYSsyXSl9ZS5wdXRJbWFnZURhdGEociwwLDApfSxlLnByb3RvdHlwZS5zZXRCbHVyPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KHljLkJMVVIsdCl9LGUucHJvdG90eXBlLnNldEdyYWRpZW50PWZ1bmN0aW9uKHQpe3RoaXMuc2V0KHljLkdSQURJRU5ULHQpfSxlLnByb3RvdHlwZS5zZXRSYWRpdXM9ZnVuY3Rpb24odCl7dGhpcy5zZXQoeWMuUkFESVVTLHQpfSxlfShnYykseGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fSxyPWkucmVuZGVyTW9kZXx8VmEuSFlCUklEO1kodm9pZCAwPT1yfHxyPT1WYS5JTUFHRXx8cj09VmEuSFlCUklEfHxyPT1WYS5WRUNUT1IsMjgpLGkuZGVjbHV0dGVyJiZyPT1WYS5JTUFHRSYmKHI9VmEuSFlCUklEKSxpLnJlbmRlck1vZGU9cjt2YXIgbj11KHt9LGkpO2RlbGV0ZSBuLnByZWxvYWQsZGVsZXRlIG4udXNlSW50ZXJpbVRpbGVzT25FcnJvcix0LmNhbGwodGhpcyxuKSx0aGlzLnNldFByZWxvYWQoaS5wcmVsb2FkP2kucHJlbG9hZDowKSx0aGlzLnNldFVzZUludGVyaW1UaWxlc09uRXJyb3Iodm9pZCAwPT09aS51c2VJbnRlcmltVGlsZXNPbkVycm9yfHxpLnVzZUludGVyaW1UaWxlc09uRXJyb3IpLHRoaXMudHlwZT1Tcy5WRUNUT1JfVElMRX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0UHJlbG9hZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChNcCl9LGUucHJvdG90eXBlLmdldFVzZUludGVyaW1UaWxlc09uRXJyb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoRnApfSxlLnByb3RvdHlwZS5zZXRQcmVsb2FkPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KE1wLHQpfSxlLnByb3RvdHlwZS5zZXRVc2VJbnRlcmltVGlsZXNPbkVycm9yPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KEZwLHQpfSxlfShnYyk7eGMucHJvdG90eXBlLmdldFNvdXJjZTt2YXIgRWM9eGMsU2M9ImFkZGZlYXR1cmVzIixUYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4pe3QuY2FsbCh0aGlzLGUpLHRoaXMuZmVhdHVyZXM9cix0aGlzLmZpbGU9aSx0aGlzLnByb2plY3Rpb249bn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oUCk7ZnVuY3Rpb24gQ2ModCl7Zm9yKHZhciBlPXQuZGF0YVRyYW5zZmVyLmZpbGVzLGk9MCxyPWUubGVuZ3RoO2k8cjsrK2kpe3ZhciBuPWUuaXRlbShpKSxvPW5ldyBGaWxlUmVhZGVyO28uYWRkRXZlbnRMaXN0ZW5lcihNLkxPQUQsdGhpcy5oYW5kbGVSZXN1bHRfLmJpbmQodGhpcyxuKSksby5yZWFkQXNUZXh0KG4pfX1mdW5jdGlvbiBSYyh0KXt0LnN0b3BQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKSx0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PSJjb3B5In12YXIgd2M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fTt0LmNhbGwodGhpcyx7aGFuZGxlRXZlbnQ6Un0pLHRoaXMuZm9ybWF0Q29uc3RydWN0b3JzXz1pLmZvcm1hdENvbnN0cnVjdG9ycz9pLmZvcm1hdENvbnN0cnVjdG9yczpbXSx0aGlzLnByb2plY3Rpb25fPWkucHJvamVjdGlvbj9FZShpLnByb2plY3Rpb24pOm51bGwsdGhpcy5kcm9wTGlzdGVuS2V5c189bnVsbCx0aGlzLnNvdXJjZV89aS5zb3VyY2V8fG51bGwsdGhpcy50YXJnZXQ9aS50YXJnZXQ/aS50YXJnZXQ6bnVsbH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaGFuZGxlUmVzdWx0Xz1mdW5jdGlvbih0LGUpe3ZhciBpPWUudGFyZ2V0LnJlc3VsdCxyPXRoaXMuZ2V0TWFwKCksbj10aGlzLnByb2plY3Rpb25fO258fChuPXIuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKSk7Zm9yKHZhciBvPXRoaXMuZm9ybWF0Q29uc3RydWN0b3JzXyxzPVtdLGE9MCxoPW8ubGVuZ3RoO2E8aDsrK2Epe3ZhciBsPW5ldyBvW2FdO2lmKChzPXRoaXMudHJ5UmVhZEZlYXR1cmVzXyhsLGkse2ZlYXR1cmVQcm9qZWN0aW9uOm59KSkmJnMubGVuZ3RoPjApYnJlYWt9dGhpcy5zb3VyY2VfJiYodGhpcy5zb3VyY2VfLmNsZWFyKCksdGhpcy5zb3VyY2VfLmFkZEZlYXR1cmVzKHMpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFRjKFNjLHQscyxuKSl9LGUucHJvdG90eXBlLnJlZ2lzdGVyTGlzdGVuZXJzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0TWFwKCk7aWYodCl7dmFyIGU9dGhpcy50YXJnZXQ/dGhpcy50YXJnZXQ6dC5nZXRWaWV3cG9ydCgpO3RoaXMuZHJvcExpc3RlbktleXNfPVt2KGUsTS5EUk9QLENjLHRoaXMpLHYoZSxNLkRSQUdFTlRFUixSYyx0aGlzKSx2KGUsTS5EUkFHT1ZFUixSYyx0aGlzKSx2KGUsTS5EUk9QLFJjLHRoaXMpXX19LGUucHJvdG90eXBlLnNldEFjdGl2ZT1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5zZXRBY3RpdmUuY2FsbCh0aGlzLGUpLGU/dGhpcy5yZWdpc3Rlckxpc3RlbmVyc18oKTp0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnNfKCl9LGUucHJvdG90eXBlLnNldE1hcD1mdW5jdGlvbihlKXt0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnNfKCksdC5wcm90b3R5cGUuc2V0TWFwLmNhbGwodGhpcyxlKSx0aGlzLmdldEFjdGl2ZSgpJiZ0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzXygpfSxlLnByb3RvdHlwZS50cnlSZWFkRmVhdHVyZXNfPWZ1bmN0aW9uKHQsZSxpKXt0cnl7cmV0dXJuIHQucmVhZEZlYXR1cmVzKGUsaSl9Y2F0Y2godCl7cmV0dXJuIG51bGx9fSxlLnByb3RvdHlwZS51bnJlZ2lzdGVyTGlzdGVuZXJzXz1mdW5jdGlvbigpe3RoaXMuZHJvcExpc3RlbktleXNfJiYodGhpcy5kcm9wTGlzdGVuS2V5c18uZm9yRWFjaChFKSx0aGlzLmRyb3BMaXN0ZW5LZXlzXz1udWxsKX0sZX0oRm8pLEljPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e307dC5jYWxsKHRoaXMsaSksdGhpcy5jb25kaXRpb25fPWkuY29uZGl0aW9uP2kuY29uZGl0aW9uOnpvLHRoaXMubGFzdEFuZ2xlXz12b2lkIDAsdGhpcy5sYXN0TWFnbml0dWRlXz12b2lkIDAsdGhpcy5sYXN0U2NhbGVEZWx0YV89MCx0aGlzLmR1cmF0aW9uXz12b2lkIDAhPT1pLmR1cmF0aW9uP2kuZHVyYXRpb246NDAwfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5oYW5kbGVEcmFnRXZlbnQ9ZnVuY3Rpb24odCl7aWYoS28odCkpe3ZhciBlPXQubWFwLGk9ZS5nZXRTaXplKCkscj10LnBpeGVsLG49clswXS1pWzBdLzIsbz1pWzFdLzItclsxXSxzPU1hdGguYXRhbjIobyxuKSxhPU1hdGguc3FydChuKm4rbypvKSxoPWUuZ2V0VmlldygpO2lmKGguZ2V0Q29uc3RyYWludHMoKS5yb3RhdGlvbiE9PUduJiZ2b2lkIDAhPT10aGlzLmxhc3RBbmdsZV8pe3ZhciBsPXMtdGhpcy5sYXN0QW5nbGVfO09vKGgsaC5nZXRSb3RhdGlvbigpLWwpfWlmKHRoaXMubGFzdEFuZ2xlXz1zLHZvaWQgMCE9PXRoaXMubGFzdE1hZ25pdHVkZV8pTW8oaCx0aGlzLmxhc3RNYWduaXR1ZGVfKihoLmdldFJlc29sdXRpb24oKS9hKSk7dm9pZCAwIT09dGhpcy5sYXN0TWFnbml0dWRlXyYmKHRoaXMubGFzdFNjYWxlRGVsdGFfPXRoaXMubGFzdE1hZ25pdHVkZV8vYSksdGhpcy5sYXN0TWFnbml0dWRlXz1hfX0sZS5wcm90b3R5cGUuaGFuZGxlVXBFdmVudD1mdW5jdGlvbih0KXtpZighS28odCkpcmV0dXJuITA7dmFyIGU9dC5tYXAuZ2V0VmlldygpO2Uuc2V0SGludChqbiwtMSk7dmFyIGk9dGhpcy5sYXN0U2NhbGVEZWx0YV8tMTtyZXR1cm4gTG8oZSxlLmdldFJvdGF0aW9uKCkpLFBvKGUsZS5nZXRSZXNvbHV0aW9uKCksdm9pZCAwLHRoaXMuZHVyYXRpb25fLGkpLHRoaXMubGFzdFNjYWxlRGVsdGFfPTAsITF9LGUucHJvdG90eXBlLmhhbmRsZURvd25FdmVudD1mdW5jdGlvbih0KXtyZXR1cm4hIUtvKHQpJiYoISF0aGlzLmNvbmRpdGlvbl8odCkmJih0Lm1hcC5nZXRWaWV3KCkuc2V0SGludChqbiwxKSx0aGlzLmxhc3RBbmdsZV89dm9pZCAwLHRoaXMubGFzdE1hZ25pdHVkZV89dm9pZCAwLCEwKSl9LGV9KHFvKSxMYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXtpZih0LmNhbGwodGhpcyksdm9pZCAwIT09ciYmdm9pZCAwPT09aSl0aGlzLnNldEZsYXRDb29yZGluYXRlcyhyLGUpO2Vsc2V7dmFyIG49aXx8MDt0aGlzLnNldENlbnRlckFuZFJhZGl1cyhlLG4scil9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLmZsYXRDb29yZGluYXRlcy5zbGljZSgpLHZvaWQgMCx0aGlzLmxheW91dCl9LGUucHJvdG90eXBlLmNsb3Nlc3RQb2ludFhZPWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuPXRoaXMuZmxhdENvb3JkaW5hdGVzLG89dC1uWzBdLHM9ZS1uWzFdLGE9bypvK3MqcztpZihhPHIpe2lmKDA9PT1hKWZvcih2YXIgaD0wO2g8dGhpcy5zdHJpZGU7KytoKWlbaF09bltoXTtlbHNle3ZhciBsPXRoaXMuZ2V0UmFkaXVzKCkvTWF0aC5zcXJ0KGEpO2lbMF09blswXStsKm8saVsxXT1uWzFdK2wqcztmb3IodmFyIHU9Mjt1PHRoaXMuc3RyaWRlOysrdSlpW3VdPW5bdV19cmV0dXJuIGkubGVuZ3RoPXRoaXMuc3RyaWRlLGF9cmV0dXJuIHJ9LGUucHJvdG90eXBlLmNvbnRhaW5zWFk9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmZsYXRDb29yZGluYXRlcyxyPXQtaVswXSxuPWUtaVsxXTtyZXR1cm4gcipyK24qbjw9dGhpcy5nZXRSYWRpdXNTcXVhcmVkXygpfSxlLnByb3RvdHlwZS5nZXRDZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mbGF0Q29vcmRpbmF0ZXMuc2xpY2UoMCx0aGlzLnN0cmlkZSl9LGUucHJvdG90eXBlLmNvbXB1dGVFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mbGF0Q29vcmRpbmF0ZXMsaT1lW3RoaXMuc3RyaWRlXS1lWzBdO3JldHVybiBsdChlWzBdLWksZVsxXS1pLGVbMF0raSxlWzFdK2ksdCl9LGUucHJvdG90eXBlLmdldFJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy5nZXRSYWRpdXNTcXVhcmVkXygpKX0sZS5wcm90b3R5cGUuZ2V0UmFkaXVzU3F1YXJlZF89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmZsYXRDb29yZGluYXRlc1t0aGlzLnN0cmlkZV0tdGhpcy5mbGF0Q29vcmRpbmF0ZXNbMF0sZT10aGlzLmZsYXRDb29yZGluYXRlc1t0aGlzLnN0cmlkZSsxXS10aGlzLmZsYXRDb29yZGluYXRlc1sxXTtyZXR1cm4gdCp0K2UqZX0sZS5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiBOdC5DSVJDTEV9LGUucHJvdG90eXBlLmludGVyc2VjdHNFeHRlbnQ9ZnVuY3Rpb24odCl7aWYoUHQodCx0aGlzLmdldEV4dGVudCgpKSl7dmFyIGU9dGhpcy5nZXRDZW50ZXIoKTtyZXR1cm4gdFswXTw9ZVswXSYmdFsyXT49ZVswXXx8KHRbMV08PWVbMV0mJnRbM10+PWVbMV18fG10KHQsdGhpcy5pbnRlcnNlY3RzQ29vcmRpbmF0ZSx0aGlzKSl9cmV0dXJuITF9LGUucHJvdG90eXBlLnNldENlbnRlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnN0cmlkZSxpPXRoaXMuZmxhdENvb3JkaW5hdGVzW2VdLXRoaXMuZmxhdENvb3JkaW5hdGVzWzBdLHI9dC5zbGljZSgpO3JbZV09clswXStpO2Zvcih2YXIgbj0xO248ZTsrK24pcltlK25dPXRbbl07dGhpcy5zZXRGbGF0Q29vcmRpbmF0ZXModGhpcy5sYXlvdXQsciksdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLnNldENlbnRlckFuZFJhZGl1cz1mdW5jdGlvbih0LGUsaSl7dGhpcy5zZXRMYXlvdXQoaSx0LDApLHRoaXMuZmxhdENvb3JkaW5hdGVzfHwodGhpcy5mbGF0Q29vcmRpbmF0ZXM9W10pO3ZhciByPXRoaXMuZmxhdENvb3JkaW5hdGVzLG49dGkociwwLHQsdGhpcy5zdHJpZGUpO3JbbisrXT1yWzBdK2U7Zm9yKHZhciBvPTEscz10aGlzLnN0cmlkZTtvPHM7KytvKXJbbisrXT1yW29dO3IubGVuZ3RoPW4sdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLnNldENvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7fSxlLnByb3RvdHlwZS5zZXRSYWRpdXM9ZnVuY3Rpb24odCl7dGhpcy5mbGF0Q29vcmRpbmF0ZXNbdGhpcy5zdHJpZGVdPXRoaXMuZmxhdENvb3JkaW5hdGVzWzBdK3QsdGhpcy5jaGFuZ2VkKCl9LGV9KFdlKTtMYy5wcm90b3R5cGUudHJhbnNmb3JtO3ZhciBPYz1MYyxQYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXtpZih0LmNhbGwodGhpcyksdGhpcy5lbmRzXz1bXSx0aGlzLm1heERlbHRhXz0tMSx0aGlzLm1heERlbHRhUmV2aXNpb25fPS0xLEFycmF5LmlzQXJyYXkoZVswXSkpdGhpcy5zZXRDb29yZGluYXRlcyhlLGkpO2Vsc2UgaWYodm9pZCAwIT09aSYmcil0aGlzLnNldEZsYXRDb29yZGluYXRlcyhpLGUpLHRoaXMuZW5kc189cjtlbHNle2Zvcih2YXIgbj10aGlzLmdldExheW91dCgpLG89ZSxzPVtdLGE9W10saD0wLGw9by5sZW5ndGg7aDxsOysraCl7dmFyIHU9b1toXTswPT09aCYmKG49dS5nZXRMYXlvdXQoKSksSyhzLHUuZ2V0RmxhdENvb3JkaW5hdGVzKCkpLGEucHVzaChzLmxlbmd0aCl9dGhpcy5zZXRGbGF0Q29vcmRpbmF0ZXMobixzKSx0aGlzLmVuZHNfPWF9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5hcHBlbmRMaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe3RoaXMuZmxhdENvb3JkaW5hdGVzP0sodGhpcy5mbGF0Q29vcmRpbmF0ZXMsdC5nZXRGbGF0Q29vcmRpbmF0ZXMoKS5zbGljZSgpKTp0aGlzLmZsYXRDb29yZGluYXRlcz10LmdldEZsYXRDb29yZGluYXRlcygpLnNsaWNlKCksdGhpcy5lbmRzXy5wdXNoKHRoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aCksdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMuZmxhdENvb3JkaW5hdGVzLnNsaWNlKCksdGhpcy5sYXlvdXQsdGhpcy5lbmRzXy5zbGljZSgpKX0sZS5wcm90b3R5cGUuY2xvc2VzdFBvaW50WFk9ZnVuY3Rpb24odCxlLGkscil7cmV0dXJuIHI8cnQodGhpcy5nZXRFeHRlbnQoKSx0LGUpP3I6KHRoaXMubWF4RGVsdGFSZXZpc2lvbl8hPXRoaXMuZ2V0UmV2aXNpb24oKSYmKHRoaXMubWF4RGVsdGFfPU1hdGguc3FydChKZSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHRoaXMuZW5kc18sdGhpcy5zdHJpZGUsMCkpLHRoaXMubWF4RGVsdGFSZXZpc2lvbl89dGhpcy5nZXRSZXZpc2lvbigpKSwkZSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHRoaXMuZW5kc18sdGhpcy5zdHJpZGUsdGhpcy5tYXhEZWx0YV8sITEsdCxlLGkscikpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlQXRNPWZ1bmN0aW9uKHQsZSxpKXtpZih0aGlzLmxheW91dCE9QXQuWFlNJiZ0aGlzLmxheW91dCE9QXQuWFlaTXx8MD09PXRoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgcj12b2lkIDAhPT1lJiZlLG49dm9pZCAwIT09aSYmaTtyZXR1cm4gZnVuY3Rpb24odCxlLGkscixuLG8scyl7aWYocylyZXR1cm4gc3IodCxlLGlbaS5sZW5ndGgtMV0scixuLG8pO3ZhciBhO2lmKG48dFtyLTFdKXJldHVybiBvPygoYT10LnNsaWNlKDAscikpW3ItMV09bixhKTpudWxsO2lmKHRbdC5sZW5ndGgtMV08bilyZXR1cm4gbz8oKGE9dC5zbGljZSh0Lmxlbmd0aC1yKSlbci0xXT1uLGEpOm51bGw7Zm9yKHZhciBoPTAsbD1pLmxlbmd0aDtoPGw7KytoKXt2YXIgdT1pW2hdO2lmKGUhPXUpe2lmKG48dFtlK3ItMV0pcmV0dXJuIG51bGw7aWYobjw9dFt1LTFdKXJldHVybiBzcih0LGUsdSxyLG4sITEpO2U9dX19cmV0dXJuIG51bGx9KHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5lbmRzXyx0aGlzLnN0cmlkZSx0LHIsbil9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG5pKHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5lbmRzXyx0aGlzLnN0cmlkZSl9LGUucHJvdG90eXBlLmdldEVuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmRzX30sZS5wcm90b3R5cGUuZ2V0TGluZVN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdDwwfHx0aGlzLmVuZHNfLmxlbmd0aDw9dD9udWxsOm5ldyBocih0aGlzLmZsYXRDb29yZGluYXRlcy5zbGljZSgwPT09dD8wOnRoaXMuZW5kc19bdC0xXSx0aGlzLmVuZHNfW3RdKSx0aGlzLmxheW91dCl9LGUucHJvdG90eXBlLmdldExpbmVTdHJpbmdzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZmxhdENvb3JkaW5hdGVzLGU9dGhpcy5lbmRzXyxpPXRoaXMubGF5b3V0LHI9W10sbj0wLG89MCxzPWUubGVuZ3RoO288czsrK28pe3ZhciBhPWVbb10saD1uZXcgaHIodC5zbGljZShuLGEpLGkpO3IucHVzaChoKSxuPWF9cmV0dXJuIHJ9LGUucHJvdG90eXBlLmdldEZsYXRNaWRwb2ludHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT10aGlzLmZsYXRDb29yZGluYXRlcyxpPTAscj10aGlzLmVuZHNfLG49dGhpcy5zdHJpZGUsbz0wLHM9ci5sZW5ndGg7bzxzOysrbyl7dmFyIGE9cltvXTtLKHQsb3IoZSxpLGEsbiwuNSkpLGk9YX1yZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0U2ltcGxpZmllZEdlb21ldHJ5SW50ZXJuYWw9ZnVuY3Rpb24odCl7dmFyIGk9W10scj1bXTtyZXR1cm4gaS5sZW5ndGg9YWkodGhpcy5mbGF0Q29vcmRpbmF0ZXMsMCx0aGlzLmVuZHNfLHRoaXMuc3RyaWRlLHQsaSwwLHIpLG5ldyBlKGksQXQuWFkscil9LGUucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gTnQuTVVMVElfTElORV9TVFJJTkd9LGUucHJvdG90eXBlLmludGVyc2VjdHNFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxpLHIsbil7Zm9yKHZhciBvPTAscz1pLmxlbmd0aDtvPHM7KytvKXtpZihtaSh0LGUsaVtvXSxyLG4pKXJldHVybiEwO2U9aVtvXX1yZXR1cm4hMX0odGhpcy5mbGF0Q29vcmRpbmF0ZXMsMCx0aGlzLmVuZHNfLHRoaXMuc3RyaWRlLHQpfSxlLnByb3RvdHlwZS5zZXRDb29yZGluYXRlcz1mdW5jdGlvbih0LGUpe3RoaXMuc2V0TGF5b3V0KGUsdCwyKSx0aGlzLmZsYXRDb29yZGluYXRlc3x8KHRoaXMuZmxhdENvb3JkaW5hdGVzPVtdKTt2YXIgaT1paSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHQsdGhpcy5zdHJpZGUsdGhpcy5lbmRzXyk7dGhpcy5mbGF0Q29vcmRpbmF0ZXMubGVuZ3RoPTA9PT1pLmxlbmd0aD8wOmlbaS5sZW5ndGgtMV0sdGhpcy5jaGFuZ2VkKCl9LGV9KFdlKSxiYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMpLGkmJiFBcnJheS5pc0FycmF5KGVbMF0pP3RoaXMuc2V0RmxhdENvb3JkaW5hdGVzKGksZSk6dGhpcy5zZXRDb29yZGluYXRlcyhlLGkpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5hcHBlbmRQb2ludD1mdW5jdGlvbih0KXt0aGlzLmZsYXRDb29yZGluYXRlcz9LKHRoaXMuZmxhdENvb3JkaW5hdGVzLHQuZ2V0RmxhdENvb3JkaW5hdGVzKCkpOnRoaXMuZmxhdENvb3JkaW5hdGVzPXQuZ2V0RmxhdENvb3JkaW5hdGVzKCkuc2xpY2UoKSx0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5mbGF0Q29vcmRpbmF0ZXMuc2xpY2UoKSx0aGlzLmxheW91dCl9LGUucHJvdG90eXBlLmNsb3Nlc3RQb2ludFhZPWZ1bmN0aW9uKHQsZSxpLHIpe2lmKHI8cnQodGhpcy5nZXRFeHRlbnQoKSx0LGUpKXJldHVybiByO2Zvcih2YXIgbj10aGlzLmZsYXRDb29yZGluYXRlcyxvPXRoaXMuc3RyaWRlLHM9MCxhPW4ubGVuZ3RoO3M8YTtzKz1vKXt2YXIgaD1ZdCh0LGUsbltzXSxuW3MrMV0pO2lmKGg8cil7cj1oO2Zvcih2YXIgbD0wO2w8bzsrK2wpaVtsXT1uW3MrbF07aS5sZW5ndGg9b319cmV0dXJuIHJ9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHJpKHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5mbGF0Q29vcmRpbmF0ZXMubGVuZ3RoLHRoaXMuc3RyaWRlKX0sZS5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mbGF0Q29vcmRpbmF0ZXM/dGhpcy5mbGF0Q29vcmRpbmF0ZXMubGVuZ3RoL3RoaXMuc3RyaWRlOjA7cmV0dXJuIHQ8MHx8ZTw9dD9udWxsOm5ldyBjaSh0aGlzLmZsYXRDb29yZGluYXRlcy5zbGljZSh0KnRoaXMuc3RyaWRlLCh0KzEpKnRoaXMuc3RyaWRlKSx0aGlzLmxheW91dCl9LGUucHJvdG90eXBlLmdldFBvaW50cz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmZsYXRDb29yZGluYXRlcyxlPXRoaXMubGF5b3V0LGk9dGhpcy5zdHJpZGUscj1bXSxuPTAsbz10Lmxlbmd0aDtuPG87bis9aSl7dmFyIHM9bmV3IGNpKHQuc2xpY2UobixuK2kpLGUpO3IucHVzaChzKX1yZXR1cm4gcn0sZS5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiBOdC5NVUxUSV9QT0lOVH0sZS5wcm90b3R5cGUuaW50ZXJzZWN0c0V4dGVudD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5mbGF0Q29vcmRpbmF0ZXMsaT10aGlzLnN0cmlkZSxyPTAsbj1lLmxlbmd0aDtyPG47cis9aSl7aWYoc3QodCxlW3JdLGVbcisxXSkpcmV0dXJuITB9cmV0dXJuITF9LGUucHJvdG90eXBlLnNldENvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRMYXlvdXQoZSx0LDEpLHRoaXMuZmxhdENvb3JkaW5hdGVzfHwodGhpcy5mbGF0Q29vcmRpbmF0ZXM9W10pLHRoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aD1laSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHQsdGhpcy5zdHJpZGUpLHRoaXMuY2hhbmdlZCgpfSxlfShXZSk7ZnVuY3Rpb24gTWModCxlLGkscil7Zm9yKHZhciBuPVtdLG89WzEvMCwxLzAsLTEvMCwtMS8wXSxzPTAsYT1pLmxlbmd0aDtzPGE7KytzKXt2YXIgaD1pW3NdO289Y3QodCxlLGhbMF0sciksbi5wdXNoKChvWzBdK29bMl0pLzIsKG9bMV0rb1szXSkvMiksZT1oW2gubGVuZ3RoLTFdfXJldHVybiBufXZhciBGYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXtpZih0LmNhbGwodGhpcyksdGhpcy5lbmRzc189W10sdGhpcy5mbGF0SW50ZXJpb3JQb2ludHNSZXZpc2lvbl89LTEsdGhpcy5mbGF0SW50ZXJpb3JQb2ludHNfPW51bGwsdGhpcy5tYXhEZWx0YV89LTEsdGhpcy5tYXhEZWx0YVJldmlzaW9uXz0tMSx0aGlzLm9yaWVudGVkUmV2aXNpb25fPS0xLHRoaXMub3JpZW50ZWRGbGF0Q29vcmRpbmF0ZXNfPW51bGwsIXImJiFBcnJheS5pc0FycmF5KGVbMF0pKXtmb3IodmFyIG49dGhpcy5nZXRMYXlvdXQoKSxvPWUscz1bXSxhPVtdLGg9MCxsPW8ubGVuZ3RoO2g8bDsrK2gpe3ZhciB1PW9baF07MD09PWgmJihuPXUuZ2V0TGF5b3V0KCkpO2Zvcih2YXIgcD1zLmxlbmd0aCxjPXUuZ2V0RW5kcygpLGQ9MCxmPWMubGVuZ3RoO2Q8ZjsrK2QpY1tkXSs9cDtLKHMsdS5nZXRGbGF0Q29vcmRpbmF0ZXMoKSksYS5wdXNoKGMpfWk9bixlPXMscj1hfXZvaWQgMCE9PWkmJnI/KHRoaXMuc2V0RmxhdENvb3JkaW5hdGVzKGksZSksdGhpcy5lbmRzc189cik6dGhpcy5zZXRDb29yZGluYXRlcyhlLGkpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5hcHBlbmRQb2x5Z29uPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKHRoaXMuZmxhdENvb3JkaW5hdGVzKXt2YXIgaT10aGlzLmZsYXRDb29yZGluYXRlcy5sZW5ndGg7Syh0aGlzLmZsYXRDb29yZGluYXRlcyx0LmdldEZsYXRDb29yZGluYXRlcygpKTtmb3IodmFyIHI9MCxuPShlPXQuZ2V0RW5kcygpLnNsaWNlKCkpLmxlbmd0aDtyPG47KytyKWVbcl0rPWl9ZWxzZSB0aGlzLmZsYXRDb29yZGluYXRlcz10LmdldEZsYXRDb29yZGluYXRlcygpLnNsaWNlKCksZT10LmdldEVuZHMoKS5zbGljZSgpLHRoaXMuZW5kc3NfLnB1c2goKTt0aGlzLmVuZHNzXy5wdXNoKGUpLHRoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmVuZHNzXy5sZW5ndGgsaT1uZXcgQXJyYXkodCkscj0wO3I8dDsrK3IpaVtyXT10aGlzLmVuZHNzX1tyXS5zbGljZSgpO3JldHVybiBuZXcgZSh0aGlzLmZsYXRDb29yZGluYXRlcy5zbGljZSgpLHRoaXMubGF5b3V0LGkpfSxlLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRYWT1mdW5jdGlvbih0LGUsaSxyKXtyZXR1cm4gcjxydCh0aGlzLmdldEV4dGVudCgpLHQsZSk/cjoodGhpcy5tYXhEZWx0YVJldmlzaW9uXyE9dGhpcy5nZXRSZXZpc2lvbigpJiYodGhpcy5tYXhEZWx0YV89TWF0aC5zcXJ0KGZ1bmN0aW9uKHQsZSxpLHIsbil7Zm9yKHZhciBvPTAscz1pLmxlbmd0aDtvPHM7KytvKXt2YXIgYT1pW29dO249SmUodCxlLGEscixuKSxlPWFbYS5sZW5ndGgtMV19cmV0dXJuIG59KHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdGhpcy5lbmRzc18sdGhpcy5zdHJpZGUsMCkpLHRoaXMubWF4RGVsdGFSZXZpc2lvbl89dGhpcy5nZXRSZXZpc2lvbigpKSxmdW5jdGlvbih0LGUsaSxyLG4sbyxzLGEsaCxsLHUpe2Zvcih2YXIgcD11fHxbTmFOLE5hTl0sYz0wLGQ9aS5sZW5ndGg7YzxkOysrYyl7dmFyIGY9aVtjXTtsPSRlKHQsZSxmLHIsbixvLHMsYSxoLGwscCksZT1mW2YubGVuZ3RoLTFdfXJldHVybiBsfSh0aGlzLmdldE9yaWVudGVkRmxhdENvb3JkaW5hdGVzKCksMCx0aGlzLmVuZHNzXyx0aGlzLnN0cmlkZSx0aGlzLm1heERlbHRhXywhMCx0LGUsaSxyKSl9LGUucHJvdG90eXBlLmNvbnRhaW5zWFk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24odCxlLGkscixuLG8pe2lmKDA9PT1pLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHM9MCxhPWkubGVuZ3RoO3M8YTsrK3Mpe3ZhciBoPWlbc107aWYoX2kodCxlLGgscixuLG8pKXJldHVybiEwO2U9aFtoLmxlbmd0aC0xXX1yZXR1cm4hMX0odGhpcy5nZXRPcmllbnRlZEZsYXRDb29yZGluYXRlcygpLDAsdGhpcy5lbmRzc18sdGhpcy5zdHJpZGUsdCxlKX0sZS5wcm90b3R5cGUuZ2V0QXJlYT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0LGUsaSxyKXtmb3IodmFyIG49MCxvPTAscz1pLmxlbmd0aDtvPHM7KytvKXt2YXIgYT1pW29dO24rPUhlKHQsZSxhLHIpLGU9YVthLmxlbmd0aC0xXX1yZXR1cm4gbn0odGhpcy5nZXRPcmllbnRlZEZsYXRDb29yZGluYXRlcygpLDAsdGhpcy5lbmRzc18sdGhpcy5zdHJpZGUpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gdm9pZCAwIT09dD9SaShlPXRoaXMuZ2V0T3JpZW50ZWRGbGF0Q29vcmRpbmF0ZXMoKS5zbGljZSgpLDAsdGhpcy5lbmRzc18sdGhpcy5zdHJpZGUsdCk6ZT10aGlzLmZsYXRDb29yZGluYXRlcyxvaShlLDAsdGhpcy5lbmRzc18sdGhpcy5zdHJpZGUpfSxlLnByb3RvdHlwZS5nZXRFbmRzcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZHNzX30sZS5wcm90b3R5cGUuZ2V0RmxhdEludGVyaW9yUG9pbnRzPWZ1bmN0aW9uKCl7aWYodGhpcy5mbGF0SW50ZXJpb3JQb2ludHNSZXZpc2lvbl8hPXRoaXMuZ2V0UmV2aXNpb24oKSl7dmFyIHQ9TWModGhpcy5mbGF0Q29vcmRpbmF0ZXMsMCx0aGlzLmVuZHNzXyx0aGlzLnN0cmlkZSk7dGhpcy5mbGF0SW50ZXJpb3JQb2ludHNfPXlpKHRoaXMuZ2V0T3JpZW50ZWRGbGF0Q29vcmRpbmF0ZXMoKSwwLHRoaXMuZW5kc3NfLHRoaXMuc3RyaWRlLHQpLHRoaXMuZmxhdEludGVyaW9yUG9pbnRzUmV2aXNpb25fPXRoaXMuZ2V0UmV2aXNpb24oKX1yZXR1cm4gdGhpcy5mbGF0SW50ZXJpb3JQb2ludHNffSxlLnByb3RvdHlwZS5nZXRJbnRlcmlvclBvaW50cz1mdW5jdGlvbigpe3JldHVybiBuZXcgYmModGhpcy5nZXRGbGF0SW50ZXJpb3JQb2ludHMoKS5zbGljZSgpLEF0LlhZTSl9LGUucHJvdG90eXBlLmdldE9yaWVudGVkRmxhdENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7aWYodGhpcy5vcmllbnRlZFJldmlzaW9uXyE9dGhpcy5nZXRSZXZpc2lvbigpKXt2YXIgdD10aGlzLmZsYXRDb29yZGluYXRlczshZnVuY3Rpb24odCxlLGkscixuKXtmb3IodmFyIG89MCxzPWkubGVuZ3RoO288czsrK28paWYoIVRpKHQsZSxpW29dLHIsbikpcmV0dXJuITE7cmV0dXJuITB9KHQsMCx0aGlzLmVuZHNzXyx0aGlzLnN0cmlkZSk/KHRoaXMub3JpZW50ZWRGbGF0Q29vcmRpbmF0ZXNfPXQuc2xpY2UoKSx0aGlzLm9yaWVudGVkRmxhdENvb3JkaW5hdGVzXy5sZW5ndGg9UmkodGhpcy5vcmllbnRlZEZsYXRDb29yZGluYXRlc18sMCx0aGlzLmVuZHNzXyx0aGlzLnN0cmlkZSkpOnRoaXMub3JpZW50ZWRGbGF0Q29vcmRpbmF0ZXNfPXQsdGhpcy5vcmllbnRlZFJldmlzaW9uXz10aGlzLmdldFJldmlzaW9uKCl9cmV0dXJuIHRoaXMub3JpZW50ZWRGbGF0Q29vcmRpbmF0ZXNffSxlLnByb3RvdHlwZS5nZXRTaW1wbGlmaWVkR2VvbWV0cnlJbnRlcm5hbD1mdW5jdGlvbih0KXt2YXIgaT1bXSxyPVtdO3JldHVybiBpLmxlbmd0aD1mdW5jdGlvbih0LGUsaSxyLG4sbyxzLGEpe2Zvcih2YXIgaD0wLGw9aS5sZW5ndGg7aDxsOysraCl7dmFyIHU9aVtoXSxwPVtdO3M9dWkodCxlLHUscixuLG8scyxwKSxhLnB1c2gocCksZT11W3UubGVuZ3RoLTFdfXJldHVybiBzfSh0aGlzLmZsYXRDb29yZGluYXRlcywwLHRoaXMuZW5kc3NfLHRoaXMuc3RyaWRlLE1hdGguc3FydCh0KSxpLDAsciksbmV3IGUoaSxBdC5YWSxyKX0sZS5wcm90b3R5cGUuZ2V0UG9seWdvbj1mdW5jdGlvbih0KXtpZih0PDB8fHRoaXMuZW5kc3NfLmxlbmd0aDw9dClyZXR1cm4gbnVsbDt2YXIgZTtpZigwPT09dCllPTA7ZWxzZXt2YXIgaT10aGlzLmVuZHNzX1t0LTFdO2U9aVtpLmxlbmd0aC0xXX12YXIgcj10aGlzLmVuZHNzX1t0XS5zbGljZSgpLG49cltyLmxlbmd0aC0xXTtpZigwIT09ZSlmb3IodmFyIG89MCxzPXIubGVuZ3RoO288czsrK28pcltvXS09ZTtyZXR1cm4gbmV3IElpKHRoaXMuZmxhdENvb3JkaW5hdGVzLnNsaWNlKGUsbiksdGhpcy5sYXlvdXQscil9LGUucHJvdG90eXBlLmdldFBvbHlnb25zPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMubGF5b3V0LGU9dGhpcy5mbGF0Q29vcmRpbmF0ZXMsaT10aGlzLmVuZHNzXyxyPVtdLG49MCxvPTAscz1pLmxlbmd0aDtvPHM7KytvKXt2YXIgYT1pW29dLnNsaWNlKCksaD1hW2EubGVuZ3RoLTFdO2lmKDAhPT1uKWZvcih2YXIgbD0wLHU9YS5sZW5ndGg7bDx1OysrbClhW2xdLT1uO3ZhciBwPW5ldyBJaShlLnNsaWNlKG4saCksdCxhKTtyLnB1c2gocCksbj1ofXJldHVybiByfSxlLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIE50Lk1VTFRJX1BPTFlHT059LGUucHJvdG90eXBlLmludGVyc2VjdHNFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxpLHIsbil7Zm9yKHZhciBvPTAscz1pLmxlbmd0aDtvPHM7KytvKXt2YXIgYT1pW29dO2lmKHhpKHQsZSxhLHIsbikpcmV0dXJuITA7ZT1hW2EubGVuZ3RoLTFdfXJldHVybiExfSh0aGlzLmdldE9yaWVudGVkRmxhdENvb3JkaW5hdGVzKCksMCx0aGlzLmVuZHNzXyx0aGlzLnN0cmlkZSx0KX0sZS5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlKXt0aGlzLnNldExheW91dChlLHQsMyksdGhpcy5mbGF0Q29vcmRpbmF0ZXN8fCh0aGlzLmZsYXRDb29yZGluYXRlcz1bXSk7dmFyIGk9ZnVuY3Rpb24odCxlLGkscixuKXtmb3IodmFyIG89bnx8W10scz0wLGE9MCxoPWkubGVuZ3RoO2E8aDsrK2Epe3ZhciBsPWlpKHQsZSxpW2FdLHIsb1tzXSk7b1tzKytdPWwsZT1sW2wubGVuZ3RoLTFdfXJldHVybiBvLmxlbmd0aD1zLG99KHRoaXMuZmxhdENvb3JkaW5hdGVzLDAsdCx0aGlzLnN0cmlkZSx0aGlzLmVuZHNzXyk7aWYoMD09PWkubGVuZ3RoKXRoaXMuZmxhdENvb3JkaW5hdGVzLmxlbmd0aD0wO2Vsc2V7dmFyIHI9aVtpLmxlbmd0aC0xXTt0aGlzLmZsYXRDb29yZGluYXRlcy5sZW5ndGg9MD09PXIubGVuZ3RoPzA6cltyLmxlbmd0aC0xXX10aGlzLmNoYW5nZWQoKX0sZX0oV2UpLEFjPXtQT0lOVDoiUG9pbnQiLExJTkVfU1RSSU5HOiJMaW5lU3RyaW5nIixQT0xZR09OOiJQb2x5Z29uIixDSVJDTEU6IkNpcmNsZSJ9LE5jPSJkcmF3c3RhcnQiLEdjPSJkcmF3ZW5kIixEYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMsZSksdGhpcy5mZWF0dXJlPWl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KFApO3ZhciBrYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWU7aS5zdG9wRG93bnx8KGkuc3RvcERvd249dyksdC5jYWxsKHRoaXMsaSksdGhpcy5zaG91bGRIYW5kbGVfPSExLHRoaXMuZG93blB4Xz1udWxsLHRoaXMuZG93blRpbWVvdXRfLHRoaXMubGFzdERyYWdUaW1lXyx0aGlzLmZyZWVoYW5kXz0hMSx0aGlzLnNvdXJjZV89ZS5zb3VyY2U/ZS5zb3VyY2U6bnVsbCx0aGlzLmZlYXR1cmVzXz1lLmZlYXR1cmVzP2UuZmVhdHVyZXM6bnVsbCx0aGlzLnNuYXBUb2xlcmFuY2VfPWUuc25hcFRvbGVyYW5jZT9lLnNuYXBUb2xlcmFuY2U6MTIsdGhpcy50eXBlXz1lLnR5cGUsdGhpcy5tb2RlXz1mdW5jdGlvbih0KXt2YXIgZTt0PT09TnQuUE9JTlR8fHQ9PT1OdC5NVUxUSV9QT0lOVD9lPUFjLlBPSU5UOnQ9PT1OdC5MSU5FX1NUUklOR3x8dD09PU50Lk1VTFRJX0xJTkVfU1RSSU5HP2U9QWMuTElORV9TVFJJTkc6dD09PU50LlBPTFlHT058fHQ9PT1OdC5NVUxUSV9QT0xZR09OP2U9QWMuUE9MWUdPTjp0PT09TnQuQ0lSQ0xFJiYoZT1BYy5DSVJDTEUpO3JldHVybiBlfSh0aGlzLnR5cGVfKSx0aGlzLnN0b3BDbGlja189ISFlLnN0b3BDbGljayx0aGlzLm1pblBvaW50c189ZS5taW5Qb2ludHM/ZS5taW5Qb2ludHM6dGhpcy5tb2RlXz09PUFjLlBPTFlHT04/MzoyLHRoaXMubWF4UG9pbnRzXz1lLm1heFBvaW50cz9lLm1heFBvaW50czoxLzAsdGhpcy5maW5pc2hDb25kaXRpb25fPWUuZmluaXNoQ29uZGl0aW9uP2UuZmluaXNoQ29uZGl0aW9uOlI7dmFyIHI9ZS5nZW9tZXRyeUZ1bmN0aW9uO2lmKCFyKWlmKHRoaXMudHlwZV89PT1OdC5DSVJDTEUpcj1mdW5jdGlvbih0LGUpe3ZhciBpPWV8fG5ldyBPYyhbTmFOLE5hTl0pLHI9ZXIodFswXSx0WzFdKTtyZXR1cm4gaS5zZXRDZW50ZXJBbmRSYWRpdXModFswXSxNYXRoLnNxcnQocikpLGl9O2Vsc2V7dmFyIG4sbz10aGlzLm1vZGVfO289PT1BYy5QT0lOVD9uPWNpOm89PT1BYy5MSU5FX1NUUklORz9uPWhyOm89PT1BYy5QT0xZR09OJiYobj1JaSkscj1mdW5jdGlvbih0LGUpe3ZhciBpPWU7cmV0dXJuIGk/bz09PUFjLlBPTFlHT04/dFswXS5sZW5ndGg/aS5zZXRDb29yZGluYXRlcyhbdFswXS5jb25jYXQoW3RbMF1bMF1dKV0pOmkuc2V0Q29vcmRpbmF0ZXMoW10pOmkuc2V0Q29vcmRpbmF0ZXModCk6aT1uZXcgbih0KSxpfX10aGlzLmdlb21ldHJ5RnVuY3Rpb25fPXIsdGhpcy5kcmFnVmVydGV4RGVsYXlfPXZvaWQgMCE9PWUuZHJhZ1ZlcnRleERlbGF5P2UuZHJhZ1ZlcnRleERlbGF5OjUwMCx0aGlzLmZpbmlzaENvb3JkaW5hdGVfPW51bGwsdGhpcy5za2V0Y2hGZWF0dXJlXz1udWxsLHRoaXMuc2tldGNoUG9pbnRfPW51bGwsdGhpcy5za2V0Y2hDb29yZHNfPW51bGwsdGhpcy5za2V0Y2hMaW5lXz1udWxsLHRoaXMuc2tldGNoTGluZUNvb3Jkc189bnVsbCx0aGlzLnNxdWFyZWRDbGlja1RvbGVyYW5jZV89ZS5jbGlja1RvbGVyYW5jZT9lLmNsaWNrVG9sZXJhbmNlKmUuY2xpY2tUb2xlcmFuY2U6MzYsdGhpcy5vdmVybGF5Xz1uZXcgZ2Moe3NvdXJjZTpuZXcgb3Aoe3VzZVNwYXRpYWxJbmRleDohMSx3cmFwWDohIWUud3JhcFgmJmUud3JhcFh9KSxzdHlsZTplLnN0eWxlP2Uuc3R5bGU6ZnVuY3Rpb24oKXt2YXIgdD1GdSgpO3JldHVybiBmdW5jdGlvbihlLGkpe3JldHVybiB0W2UuZ2V0R2VvbWV0cnkoKS5nZXRUeXBlKCldfX0oKSx1cGRhdGVXaGlsZUludGVyYWN0aW5nOiEwfSksdGhpcy5nZW9tZXRyeU5hbWVfPWUuZ2VvbWV0cnlOYW1lLHRoaXMuY29uZGl0aW9uXz1lLmNvbmRpdGlvbj9lLmNvbmRpdGlvbjpYbyx0aGlzLmZyZWVoYW5kQ29uZGl0aW9uXyxlLmZyZWVoYW5kP3RoaXMuZnJlZWhhbmRDb25kaXRpb25fPWpvOnRoaXMuZnJlZWhhbmRDb25kaXRpb25fPWUuZnJlZWhhbmRDb25kaXRpb24/ZS5mcmVlaGFuZENvbmRpdGlvbjp6byx2KHRoaXMsRyhJby5BQ1RJVkUpLHRoaXMudXBkYXRlU3RhdGVfLHRoaXMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5zZXRNYXA9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuc2V0TWFwLmNhbGwodGhpcyxlKSx0aGlzLnVwZGF0ZVN0YXRlXygpfSxlLnByb3RvdHlwZS5nZXRPdmVybGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3ZlcmxheV99LGUucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGUpe2Uub3JpZ2luYWxFdmVudC50eXBlPT09TS5DT05URVhUTUVOVSYmZS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuZnJlZWhhbmRfPXRoaXMubW9kZV8hPT1BYy5QT0lOVCYmdGhpcy5mcmVlaGFuZENvbmRpdGlvbl8oZSk7dmFyIGk9ZS50eXBlPT09QXIuUE9JTlRFUk1PVkUscj0hMDshdGhpcy5mcmVlaGFuZF8mJnRoaXMubGFzdERyYWdUaW1lXyYmZS50eXBlPT09QXIuUE9JTlRFUkRSQUcmJihEYXRlLm5vdygpLXRoaXMubGFzdERyYWdUaW1lXz49dGhpcy5kcmFnVmVydGV4RGVsYXlfPyh0aGlzLmRvd25QeF89ZS5waXhlbCx0aGlzLnNob3VsZEhhbmRsZV89IXRoaXMuZnJlZWhhbmRfLGk9ITApOnRoaXMubGFzdERyYWdUaW1lXz12b2lkIDAsdGhpcy5zaG91bGRIYW5kbGVfJiZ2b2lkIDAhPT10aGlzLmRvd25UaW1lb3V0XyYmKGNsZWFyVGltZW91dCh0aGlzLmRvd25UaW1lb3V0XyksdGhpcy5kb3duVGltZW91dF89dm9pZCAwKSk7cmV0dXJuIHRoaXMuZnJlZWhhbmRfJiZlLnR5cGU9PT1Bci5QT0lOVEVSRFJBRyYmbnVsbCE9PXRoaXMuc2tldGNoRmVhdHVyZV8/KHRoaXMuYWRkVG9EcmF3aW5nXyhlKSxyPSExKTp0aGlzLmZyZWVoYW5kXyYmZS50eXBlPT09QXIuUE9JTlRFUkRPV04/cj0hMTppPyhyPWUudHlwZT09PUFyLlBPSU5URVJNT1ZFKSYmdGhpcy5mcmVlaGFuZF8/cj10aGlzLmhhbmRsZVBvaW50ZXJNb3ZlXyhlKTooZS5wb2ludGVyRXZlbnQucG9pbnRlclR5cGU9PVVyfHxlLnR5cGU9PT1Bci5QT0lOVEVSRFJBRyYmdm9pZCAwPT09dGhpcy5kb3duVGltZW91dF8pJiZ0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlXyhlKTplLnR5cGU9PT1Bci5EQkxDTElDSyYmKHI9ITEpLHQucHJvdG90eXBlLmhhbmRsZUV2ZW50LmNhbGwodGhpcyxlKSYmcn0sZS5wcm90b3R5cGUuaGFuZGxlRG93bkV2ZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNob3VsZEhhbmRsZV89IXRoaXMuZnJlZWhhbmRfLHRoaXMuZnJlZWhhbmRfPyh0aGlzLmRvd25QeF89dC5waXhlbCx0aGlzLmZpbmlzaENvb3JkaW5hdGVffHx0aGlzLnN0YXJ0RHJhd2luZ18odCksITApOiEhdGhpcy5jb25kaXRpb25fKHQpJiYodGhpcy5sYXN0RHJhZ1RpbWVfPURhdGUubm93KCksdGhpcy5kb3duVGltZW91dF89c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGFuZGxlUG9pbnRlck1vdmVfKG5ldyBOcihBci5QT0lOVEVSTU9WRSx0Lm1hcCx0LnBvaW50ZXJFdmVudCwhMSx0LmZyYW1lU3RhdGUpKX0uYmluZCh0aGlzKSx0aGlzLmRyYWdWZXJ0ZXhEZWxheV8pLHRoaXMuZG93blB4Xz10LnBpeGVsLCEwKX0sZS5wcm90b3R5cGUuaGFuZGxlVXBFdmVudD1mdW5jdGlvbih0KXt2YXIgZT0hMDt0aGlzLmRvd25UaW1lb3V0XyYmKGNsZWFyVGltZW91dCh0aGlzLmRvd25UaW1lb3V0XyksdGhpcy5kb3duVGltZW91dF89dm9pZCAwKSx0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlXyh0KTt2YXIgaT10aGlzLm1vZGVfPT09QWMuQ0lSQ0xFO3JldHVybiB0aGlzLnNob3VsZEhhbmRsZV8/KHRoaXMuZmluaXNoQ29vcmRpbmF0ZV8/dGhpcy5mcmVlaGFuZF98fGk/dGhpcy5maW5pc2hEcmF3aW5nKCk6dGhpcy5hdEZpbmlzaF8odCk/dGhpcy5maW5pc2hDb25kaXRpb25fKHQpJiZ0aGlzLmZpbmlzaERyYXdpbmcoKTp0aGlzLmFkZFRvRHJhd2luZ18odCk6KHRoaXMuc3RhcnREcmF3aW5nXyh0KSx0aGlzLm1vZGVfPT09QWMuUE9JTlQmJnRoaXMuZmluaXNoRHJhd2luZygpKSxlPSExKTp0aGlzLmZyZWVoYW5kXyYmKHRoaXMuZmluaXNoQ29vcmRpbmF0ZV89bnVsbCx0aGlzLmFib3J0RHJhd2luZ18oKSksIWUmJnRoaXMuc3RvcENsaWNrXyYmdC5zdG9wUHJvcGFnYXRpb24oKSxlfSxlLnByb3RvdHlwZS5oYW5kbGVQb2ludGVyTW92ZV89ZnVuY3Rpb24odCl7aWYodGhpcy5kb3duUHhfJiYoIXRoaXMuZnJlZWhhbmRfJiZ0aGlzLnNob3VsZEhhbmRsZV98fHRoaXMuZnJlZWhhbmRfJiYhdGhpcy5zaG91bGRIYW5kbGVfKSl7dmFyIGU9dGhpcy5kb3duUHhfLGk9dC5waXhlbCxyPWVbMF0taVswXSxuPWVbMV0taVsxXSxvPXIqcituKm47aWYodGhpcy5zaG91bGRIYW5kbGVfPXRoaXMuZnJlZWhhbmRfP28+dGhpcy5zcXVhcmVkQ2xpY2tUb2xlcmFuY2VfOm88PXRoaXMuc3F1YXJlZENsaWNrVG9sZXJhbmNlXywhdGhpcy5zaG91bGRIYW5kbGVfKXJldHVybiEwfXJldHVybiB0aGlzLmZpbmlzaENvb3JkaW5hdGVfP3RoaXMubW9kaWZ5RHJhd2luZ18odCk6dGhpcy5jcmVhdGVPclVwZGF0ZVNrZXRjaFBvaW50Xyh0KSwhMH0sZS5wcm90b3R5cGUuYXRGaW5pc2hfPWZ1bmN0aW9uKHQpe3ZhciBlPSExO2lmKHRoaXMuc2tldGNoRmVhdHVyZV8pe3ZhciBpPSExLHI9W3RoaXMuZmluaXNoQ29vcmRpbmF0ZV9dO2lmKHRoaXMubW9kZV89PT1BYy5MSU5FX1NUUklORylpPXRoaXMuc2tldGNoQ29vcmRzXy5sZW5ndGg+dGhpcy5taW5Qb2ludHNfO2Vsc2UgaWYodGhpcy5tb2RlXz09PUFjLlBPTFlHT04pe3ZhciBuPXRoaXMuc2tldGNoQ29vcmRzXztpPW5bMF0ubGVuZ3RoPnRoaXMubWluUG9pbnRzXyxyPVtuWzBdWzBdLG5bMF1bblswXS5sZW5ndGgtMl1dfWlmKGkpZm9yKHZhciBvPXQubWFwLHM9MCxhPXIubGVuZ3RoO3M8YTtzKyspe3ZhciBoPXJbc10sbD1vLmdldFBpeGVsRnJvbUNvb3JkaW5hdGUoaCksdT10LnBpeGVsLHA9dVswXS1sWzBdLGM9dVsxXS1sWzFdLGQ9dGhpcy5mcmVlaGFuZF8/MTp0aGlzLnNuYXBUb2xlcmFuY2VfO2lmKGU9TWF0aC5zcXJ0KHAqcCtjKmMpPD1kKXt0aGlzLmZpbmlzaENvb3JkaW5hdGVfPWg7YnJlYWt9fX1yZXR1cm4gZX0sZS5wcm90b3R5cGUuY3JlYXRlT3JVcGRhdGVTa2V0Y2hQb2ludF89ZnVuY3Rpb24odCl7dmFyIGU9dC5jb29yZGluYXRlLnNsaWNlKCk7dGhpcy5za2V0Y2hQb2ludF8/dGhpcy5za2V0Y2hQb2ludF8uZ2V0R2VvbWV0cnkoKS5zZXRDb29yZGluYXRlcyhlKToodGhpcy5za2V0Y2hQb2ludF89bmV3IEIobmV3IGNpKGUpKSx0aGlzLnVwZGF0ZVNrZXRjaEZlYXR1cmVzXygpKX0sZS5wcm90b3R5cGUuc3RhcnREcmF3aW5nXz1mdW5jdGlvbih0KXt2YXIgZT10LmNvb3JkaW5hdGU7dGhpcy5maW5pc2hDb29yZGluYXRlXz1lLHRoaXMubW9kZV89PT1BYy5QT0lOVD90aGlzLnNrZXRjaENvb3Jkc189ZS5zbGljZSgpOnRoaXMubW9kZV89PT1BYy5QT0xZR09OPyh0aGlzLnNrZXRjaENvb3Jkc189W1tlLnNsaWNlKCksZS5zbGljZSgpXV0sdGhpcy5za2V0Y2hMaW5lQ29vcmRzXz10aGlzLnNrZXRjaENvb3Jkc19bMF0pOnRoaXMuc2tldGNoQ29vcmRzXz1bZS5zbGljZSgpLGUuc2xpY2UoKV0sdGhpcy5za2V0Y2hMaW5lQ29vcmRzXyYmKHRoaXMuc2tldGNoTGluZV89bmV3IEIobmV3IGhyKHRoaXMuc2tldGNoTGluZUNvb3Jkc18pKSk7dmFyIGk9dGhpcy5nZW9tZXRyeUZ1bmN0aW9uXyh0aGlzLnNrZXRjaENvb3Jkc18pO3RoaXMuc2tldGNoRmVhdHVyZV89bmV3IEIsdGhpcy5nZW9tZXRyeU5hbWVfJiZ0aGlzLnNrZXRjaEZlYXR1cmVfLnNldEdlb21ldHJ5TmFtZSh0aGlzLmdlb21ldHJ5TmFtZV8pLHRoaXMuc2tldGNoRmVhdHVyZV8uc2V0R2VvbWV0cnkoaSksdGhpcy51cGRhdGVTa2V0Y2hGZWF0dXJlc18oKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IERjKE5jLHRoaXMuc2tldGNoRmVhdHVyZV8pKX0sZS5wcm90b3R5cGUubW9kaWZ5RHJhd2luZ189ZnVuY3Rpb24odCl7dmFyIGUsaSxyLG49dC5jb29yZGluYXRlLG89dGhpcy5za2V0Y2hGZWF0dXJlXy5nZXRHZW9tZXRyeSgpOyh0aGlzLm1vZGVfPT09QWMuUE9JTlQ/aT10aGlzLnNrZXRjaENvb3Jkc186dGhpcy5tb2RlXz09PUFjLlBPTFlHT04/KGk9KGU9dGhpcy5za2V0Y2hDb29yZHNfWzBdKVtlLmxlbmd0aC0xXSx0aGlzLmF0RmluaXNoXyh0KSYmKG49dGhpcy5maW5pc2hDb29yZGluYXRlXy5zbGljZSgpKSk6aT0oZT10aGlzLnNrZXRjaENvb3Jkc18pW2UubGVuZ3RoLTFdLGlbMF09blswXSxpWzFdPW5bMV0sdGhpcy5nZW9tZXRyeUZ1bmN0aW9uXyh0aGlzLnNrZXRjaENvb3Jkc18sbyksdGhpcy5za2V0Y2hQb2ludF8pJiZ0aGlzLnNrZXRjaFBvaW50Xy5nZXRHZW9tZXRyeSgpLnNldENvb3JkaW5hdGVzKG4pO2lmKG8uZ2V0VHlwZSgpPT1OdC5QT0xZR09OJiZ0aGlzLm1vZGVfIT09QWMuUE9MWUdPTil7dGhpcy5za2V0Y2hMaW5lX3x8KHRoaXMuc2tldGNoTGluZV89bmV3IEIpO3ZhciBzPW8uZ2V0TGluZWFyUmluZygwKTsocj10aGlzLnNrZXRjaExpbmVfLmdldEdlb21ldHJ5KCkpPyhyLnNldEZsYXRDb29yZGluYXRlcyhzLmdldExheW91dCgpLHMuZ2V0RmxhdENvb3JkaW5hdGVzKCkpLHIuY2hhbmdlZCgpKToocj1uZXcgaHIocy5nZXRGbGF0Q29vcmRpbmF0ZXMoKSxzLmdldExheW91dCgpKSx0aGlzLnNrZXRjaExpbmVfLnNldEdlb21ldHJ5KHIpKX1lbHNlIHRoaXMuc2tldGNoTGluZUNvb3Jkc18mJihyPXRoaXMuc2tldGNoTGluZV8uZ2V0R2VvbWV0cnkoKSkuc2V0Q29vcmRpbmF0ZXModGhpcy5za2V0Y2hMaW5lQ29vcmRzXyk7dGhpcy51cGRhdGVTa2V0Y2hGZWF0dXJlc18oKX0sZS5wcm90b3R5cGUuYWRkVG9EcmF3aW5nXz1mdW5jdGlvbih0KXt2YXIgZSxpLHI9dC5jb29yZGluYXRlLG49dGhpcy5za2V0Y2hGZWF0dXJlXy5nZXRHZW9tZXRyeSgpO3RoaXMubW9kZV89PT1BYy5MSU5FX1NUUklORz8odGhpcy5maW5pc2hDb29yZGluYXRlXz1yLnNsaWNlKCksKGk9dGhpcy5za2V0Y2hDb29yZHNfKS5sZW5ndGg+PXRoaXMubWF4UG9pbnRzXyYmKHRoaXMuZnJlZWhhbmRfP2kucG9wKCk6ZT0hMCksaS5wdXNoKHIuc2xpY2UoKSksdGhpcy5nZW9tZXRyeUZ1bmN0aW9uXyhpLG4pKTp0aGlzLm1vZGVfPT09QWMuUE9MWUdPTiYmKChpPXRoaXMuc2tldGNoQ29vcmRzX1swXSkubGVuZ3RoPj10aGlzLm1heFBvaW50c18mJih0aGlzLmZyZWVoYW5kXz9pLnBvcCgpOmU9ITApLGkucHVzaChyLnNsaWNlKCkpLGUmJih0aGlzLmZpbmlzaENvb3JkaW5hdGVfPWlbMF0pLHRoaXMuZ2VvbWV0cnlGdW5jdGlvbl8odGhpcy5za2V0Y2hDb29yZHNfLG4pKSx0aGlzLnVwZGF0ZVNrZXRjaEZlYXR1cmVzXygpLGUmJnRoaXMuZmluaXNoRHJhd2luZygpfSxlLnByb3RvdHlwZS5yZW1vdmVMYXN0UG9pbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLnNrZXRjaEZlYXR1cmVfKXt2YXIgdCxlPXRoaXMuc2tldGNoRmVhdHVyZV8uZ2V0R2VvbWV0cnkoKTt0aGlzLm1vZGVfPT09QWMuTElORV9TVFJJTkc/KCh0PXRoaXMuc2tldGNoQ29vcmRzXykuc3BsaWNlKC0yLDEpLHRoaXMuZ2VvbWV0cnlGdW5jdGlvbl8odCxlKSx0Lmxlbmd0aD49MiYmKHRoaXMuZmluaXNoQ29vcmRpbmF0ZV89dFt0Lmxlbmd0aC0yXS5zbGljZSgpKSk6dGhpcy5tb2RlXz09PUFjLlBPTFlHT04mJigodD10aGlzLnNrZXRjaENvb3Jkc19bMF0pLnNwbGljZSgtMiwxKSx0aGlzLnNrZXRjaExpbmVfLmdldEdlb21ldHJ5KCkuc2V0Q29vcmRpbmF0ZXModCksdGhpcy5nZW9tZXRyeUZ1bmN0aW9uXyh0aGlzLnNrZXRjaENvb3Jkc18sZSkpLDA9PT10Lmxlbmd0aCYmKHRoaXMuZmluaXNoQ29vcmRpbmF0ZV89bnVsbCksdGhpcy51cGRhdGVTa2V0Y2hGZWF0dXJlc18oKX19LGUucHJvdG90eXBlLmZpbmlzaERyYXdpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFib3J0RHJhd2luZ18oKTtpZih0KXt2YXIgZT10aGlzLnNrZXRjaENvb3Jkc18saT10LmdldEdlb21ldHJ5KCk7dGhpcy5tb2RlXz09PUFjLkxJTkVfU1RSSU5HPyhlLnBvcCgpLHRoaXMuZ2VvbWV0cnlGdW5jdGlvbl8oZSxpKSk6dGhpcy5tb2RlXz09PUFjLlBPTFlHT04mJihlWzBdLnBvcCgpLHRoaXMuZ2VvbWV0cnlGdW5jdGlvbl8oZSxpKSxlPWkuZ2V0Q29vcmRpbmF0ZXMoKSksdGhpcy50eXBlXz09PU50Lk1VTFRJX1BPSU5UP3Quc2V0R2VvbWV0cnkobmV3IGJjKFtlXSkpOnRoaXMudHlwZV89PT1OdC5NVUxUSV9MSU5FX1NUUklORz90LnNldEdlb21ldHJ5KG5ldyBQYyhbZV0pKTp0aGlzLnR5cGVfPT09TnQuTVVMVElfUE9MWUdPTiYmdC5zZXRHZW9tZXRyeShuZXcgRmMoW2VdKSksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBEYyhHYyx0KSksdGhpcy5mZWF0dXJlc18mJnRoaXMuZmVhdHVyZXNfLnB1c2godCksdGhpcy5zb3VyY2VfJiZ0aGlzLnNvdXJjZV8uYWRkRmVhdHVyZSh0KX19LGUucHJvdG90eXBlLmFib3J0RHJhd2luZ189ZnVuY3Rpb24oKXt0aGlzLmZpbmlzaENvb3JkaW5hdGVfPW51bGw7dmFyIHQ9dGhpcy5za2V0Y2hGZWF0dXJlXztyZXR1cm4gdCYmKHRoaXMuc2tldGNoRmVhdHVyZV89bnVsbCx0aGlzLnNrZXRjaFBvaW50Xz1udWxsLHRoaXMuc2tldGNoTGluZV89bnVsbCx0aGlzLm92ZXJsYXlfLmdldFNvdXJjZSgpLmNsZWFyKCEwKSksdH0sZS5wcm90b3R5cGUuZXh0ZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0R2VvbWV0cnkoKTt0aGlzLnNrZXRjaEZlYXR1cmVfPXQsdGhpcy5za2V0Y2hDb29yZHNfPWUuZ2V0Q29vcmRpbmF0ZXMoKTt2YXIgaT10aGlzLnNrZXRjaENvb3Jkc19bdGhpcy5za2V0Y2hDb29yZHNfLmxlbmd0aC0xXTt0aGlzLmZpbmlzaENvb3JkaW5hdGVfPWkuc2xpY2UoKSx0aGlzLnNrZXRjaENvb3Jkc18ucHVzaChpLnNsaWNlKCkpLHRoaXMudXBkYXRlU2tldGNoRmVhdHVyZXNfKCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBEYyhOYyx0aGlzLnNrZXRjaEZlYXR1cmVfKSl9LGUucHJvdG90eXBlLnVwZGF0ZVNrZXRjaEZlYXR1cmVzXz1mdW5jdGlvbigpe3ZhciB0PVtdO3RoaXMuc2tldGNoRmVhdHVyZV8mJnQucHVzaCh0aGlzLnNrZXRjaEZlYXR1cmVfKSx0aGlzLnNrZXRjaExpbmVfJiZ0LnB1c2godGhpcy5za2V0Y2hMaW5lXyksdGhpcy5za2V0Y2hQb2ludF8mJnQucHVzaCh0aGlzLnNrZXRjaFBvaW50Xyk7dmFyIGU9dGhpcy5vdmVybGF5Xy5nZXRTb3VyY2UoKTtlLmNsZWFyKCEwKSxlLmFkZEZlYXR1cmVzKHQpfSxlLnByb3RvdHlwZS51cGRhdGVTdGF0ZV89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldE1hcCgpLGU9dGhpcy5nZXRBY3RpdmUoKTt0JiZlfHx0aGlzLmFib3J0RHJhd2luZ18oKSx0aGlzLm92ZXJsYXlfLnNldE1hcChlP3Q6bnVsbCl9LGV9KHFvKSxqYz17RVhURU5UQ0hBTkdFRDoiZXh0ZW50Y2hhbmdlZCJ9LFVjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMsamMuRVhURU5UQ0hBTkdFRCksdGhpcy5leHRlbnQ9ZX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oUCk7ZnVuY3Rpb24gWWModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0dChbdCxlXSl9fWZ1bmN0aW9uIEJjKHQsZSl7cmV0dXJuIHRbMF09PWVbMF0/ZnVuY3Rpb24oaSl7cmV0dXJuIHR0KFt0LFtpWzBdLGVbMV1dXSl9OnRbMV09PWVbMV0/ZnVuY3Rpb24oaSl7cmV0dXJuIHR0KFt0LFtlWzBdLGlbMV1dXSl9Om51bGx9dmFyIFZjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e307dC5jYWxsKHRoaXMsaSksdGhpcy5leHRlbnRfPW51bGwsdGhpcy5wb2ludGVySGFuZGxlcl89bnVsbCx0aGlzLnBpeGVsVG9sZXJhbmNlXz12b2lkIDAhPT1pLnBpeGVsVG9sZXJhbmNlP2kucGl4ZWxUb2xlcmFuY2U6MTAsdGhpcy5zbmFwcGVkVG9WZXJ0ZXhfPSExLHRoaXMuZXh0ZW50RmVhdHVyZV89bnVsbCx0aGlzLnZlcnRleEZlYXR1cmVfPW51bGwsZXx8KGU9e30pLHRoaXMuZXh0ZW50T3ZlcmxheV89bmV3IGdjKHtzb3VyY2U6bmV3IG9wKHt1c2VTcGF0aWFsSW5kZXg6ITEsd3JhcFg6ISFlLndyYXBYfSksc3R5bGU6ZS5ib3hTdHlsZT9lLmJveFN0eWxlOmZ1bmN0aW9uKCl7dmFyIHQ9RnUoKTtyZXR1cm4gZnVuY3Rpb24oZSxpKXtyZXR1cm4gdFtOdC5QT0xZR09OXX19KCksdXBkYXRlV2hpbGVBbmltYXRpbmc6ITAsdXBkYXRlV2hpbGVJbnRlcmFjdGluZzohMH0pLHRoaXMudmVydGV4T3ZlcmxheV89bmV3IGdjKHtzb3VyY2U6bmV3IG9wKHt1c2VTcGF0aWFsSW5kZXg6ITEsd3JhcFg6ISFlLndyYXBYfSksc3R5bGU6ZS5wb2ludGVyU3R5bGU/ZS5wb2ludGVyU3R5bGU6ZnVuY3Rpb24oKXt2YXIgdD1GdSgpO3JldHVybiBmdW5jdGlvbihlLGkpe3JldHVybiB0W050LlBPSU5UXX19KCksdXBkYXRlV2hpbGVBbmltYXRpbmc6ITAsdXBkYXRlV2hpbGVJbnRlcmFjdGluZzohMH0pLGUuZXh0ZW50JiZ0aGlzLnNldEV4dGVudChlLmV4dGVudCl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnNuYXBUb1ZlcnRleF89ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmdldENvb3JkaW5hdGVGcm9tUGl4ZWwodCkscj10aGlzLmdldEV4dGVudCgpO2lmKHIpe3ZhciBuPWZ1bmN0aW9uKHQpe3JldHVybltbW3RbMF0sdFsxXV0sW3RbMF0sdFszXV1dLFtbdFswXSx0WzNdXSxbdFsyXSx0WzNdXV0sW1t0WzJdLHRbM11dLFt0WzJdLHRbMV1dXSxbW3RbMl0sdFsxXV0sW3RbMF0sdFsxXV1dXX0ocik7bi5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHJyKGksdCktcnIoaSxlKX0pO3ZhciBvPW5bMF0scz1aaShpLG8pLGE9ZS5nZXRQaXhlbEZyb21Db29yZGluYXRlKHMpO2lmKGlyKHQsYSk8PXRoaXMucGl4ZWxUb2xlcmFuY2VfKXt2YXIgaD1lLmdldFBpeGVsRnJvbUNvb3JkaW5hdGUob1swXSksbD1lLmdldFBpeGVsRnJvbUNvb3JkaW5hdGUob1sxXSksdT1lcihhLGgpLHA9ZXIoYSxsKSxjPU1hdGguc3FydChNYXRoLm1pbih1LHApKTtyZXR1cm4gdGhpcy5zbmFwcGVkVG9WZXJ0ZXhfPWM8PXRoaXMucGl4ZWxUb2xlcmFuY2VfLHRoaXMuc25hcHBlZFRvVmVydGV4XyYmKHM9dT5wP29bMV06b1swXSksc319cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLmhhbmRsZVBvaW50ZXJNb3ZlXz1mdW5jdGlvbih0KXt2YXIgZT10LnBpeGVsLGk9dC5tYXAscj10aGlzLnNuYXBUb1ZlcnRleF8oZSxpKTtyfHwocj1pLmdldENvb3JkaW5hdGVGcm9tUGl4ZWwoZSkpLHRoaXMuY3JlYXRlT3JVcGRhdGVQb2ludGVyRmVhdHVyZV8ocil9LGUucHJvdG90eXBlLmNyZWF0ZU9yVXBkYXRlRXh0ZW50RmVhdHVyZV89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5leHRlbnRGZWF0dXJlXztyZXR1cm4gZT90P2Uuc2V0R2VvbWV0cnkoT2kodCkpOmUuc2V0R2VvbWV0cnkodm9pZCAwKTooZT1uZXcgQih0P09pKHQpOnt9KSx0aGlzLmV4dGVudEZlYXR1cmVfPWUsdGhpcy5leHRlbnRPdmVybGF5Xy5nZXRTb3VyY2UoKS5hZGRGZWF0dXJlKGUpKSxlfSxlLnByb3RvdHlwZS5jcmVhdGVPclVwZGF0ZVBvaW50ZXJGZWF0dXJlXz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnZlcnRleEZlYXR1cmVfO2U/ZS5nZXRHZW9tZXRyeSgpLnNldENvb3JkaW5hdGVzKHQpOihlPW5ldyBCKG5ldyBjaSh0KSksdGhpcy52ZXJ0ZXhGZWF0dXJlXz1lLHRoaXMudmVydGV4T3ZlcmxheV8uZ2V0U291cmNlKCkuYWRkRmVhdHVyZShlKSk7cmV0dXJuIGV9LGUucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGUpe3JldHVybiFlLnBvaW50ZXJFdmVudHx8KGUudHlwZSE9QXIuUE9JTlRFUk1PVkV8fHRoaXMuaGFuZGxpbmdEb3duVXBTZXF1ZW5jZXx8dGhpcy5oYW5kbGVQb2ludGVyTW92ZV8oZSksdC5wcm90b3R5cGUuaGFuZGxlRXZlbnQuY2FsbCh0aGlzLGUpLCExKX0sZS5wcm90b3R5cGUuaGFuZGxlRG93bkV2ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXQucGl4ZWwsaT10Lm1hcCxyPXRoaXMuZ2V0RXh0ZW50KCksbj10aGlzLnNuYXBUb1ZlcnRleF8oZSxpKSxvPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGwsaT1udWxsO3JldHVybiB0WzBdPT1yWzBdP2U9clsyXTp0WzBdPT1yWzJdJiYoZT1yWzBdKSx0WzFdPT1yWzFdP2k9clszXTp0WzFdPT1yWzNdJiYoaT1yWzFdKSxudWxsIT09ZSYmbnVsbCE9PWk/W2UsaV06bnVsbH07aWYobiYmcil7dmFyIHM9blswXT09clswXXx8blswXT09clsyXT9uWzBdOm51bGwsYT1uWzFdPT1yWzFdfHxuWzFdPT1yWzNdP25bMV06bnVsbDtudWxsIT09cyYmbnVsbCE9PWE/dGhpcy5wb2ludGVySGFuZGxlcl89WWMobyhuKSk6bnVsbCE9PXM/dGhpcy5wb2ludGVySGFuZGxlcl89QmMobyhbcyxyWzFdXSksbyhbcyxyWzNdXSkpOm51bGwhPT1hJiYodGhpcy5wb2ludGVySGFuZGxlcl89QmMobyhbclswXSxhXSksbyhbclsyXSxhXSkpKX1lbHNlIG49aS5nZXRDb29yZGluYXRlRnJvbVBpeGVsKGUpLHRoaXMuc2V0RXh0ZW50KFtuWzBdLG5bMV0sblswXSxuWzFdXSksdGhpcy5wb2ludGVySGFuZGxlcl89WWMobik7cmV0dXJuITB9LGUucHJvdG90eXBlLmhhbmRsZURyYWdFdmVudD1mdW5jdGlvbih0KXtpZih0aGlzLnBvaW50ZXJIYW5kbGVyXyl7dmFyIGU9dC5jb29yZGluYXRlO3RoaXMuc2V0RXh0ZW50KHRoaXMucG9pbnRlckhhbmRsZXJfKGUpKSx0aGlzLmNyZWF0ZU9yVXBkYXRlUG9pbnRlckZlYXR1cmVfKGUpfXJldHVybiEwfSxlLnByb3RvdHlwZS5oYW5kbGVVcEV2ZW50PWZ1bmN0aW9uKHQpe3RoaXMucG9pbnRlckhhbmRsZXJfPW51bGw7dmFyIGU9dGhpcy5nZXRFeHRlbnQoKTtyZXR1cm4gZSYmMCE9PXh0KGUpfHx0aGlzLnNldEV4dGVudChudWxsKSwhMX0sZS5wcm90b3R5cGUuc2V0TWFwPWZ1bmN0aW9uKGUpe3RoaXMuZXh0ZW50T3ZlcmxheV8uc2V0TWFwKGUpLHRoaXMudmVydGV4T3ZlcmxheV8uc2V0TWFwKGUpLHQucHJvdG90eXBlLnNldE1hcC5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLmdldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmV4dGVudF99LGUucHJvdG90eXBlLnNldEV4dGVudD1mdW5jdGlvbih0KXt0aGlzLmV4dGVudF89dHx8bnVsbCx0aGlzLmNyZWF0ZU9yVXBkYXRlRXh0ZW50RmVhdHVyZV8odCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBVYyh0aGlzLmV4dGVudF8pKX0sZX0ocW8pLFhjPTEsemM9Im1vZGlmeXN0YXJ0IixXYz0ibW9kaWZ5ZW5kIixLYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXt0LmNhbGwodGhpcyxlKSx0aGlzLmZlYXR1cmVzPWksdGhpcy5tYXBCcm93c2VyRXZlbnQ9cn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oUCk7ZnVuY3Rpb24gSGModCxlKXtyZXR1cm4gdC5pbmRleC1lLmluZGV4fWZ1bmN0aW9uIFpjKHQsZSl7dmFyIGk9ZS5nZW9tZXRyeTtpZihpLmdldFR5cGUoKT09PU50LkNJUkNMRSl7dmFyIHI9aTtpZihlLmluZGV4PT09WGMpe3ZhciBuPWVyKHIuZ2V0Q2VudGVyKCksdCksbz1NYXRoLnNxcnQobiktci5nZXRSYWRpdXMoKTtyZXR1cm4gbypvfX1yZXR1cm4gcnIodCxlLnNlZ21lbnQpfWZ1bmN0aW9uIHFjKHQsZSl7dmFyIGk9ZS5nZW9tZXRyeTtyZXR1cm4gaS5nZXRUeXBlKCk9PT1OdC5DSVJDTEUmJmUuaW5kZXg9PT1YYz9pLmdldENsb3Nlc3RQb2ludCh0KTpaaSh0LGUuc2VnbWVudCl9dmFyIEpjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk7aWYodC5jYWxsKHRoaXMsZSksdGhpcy5jb25kaXRpb25fPWUuY29uZGl0aW9uP2UuY29uZGl0aW9uOkhvLHRoaXMuZGVmYXVsdERlbGV0ZUNvbmRpdGlvbl89ZnVuY3Rpb24odCl7cmV0dXJuIEdvKHQpJiZWbyh0KX0sdGhpcy5kZWxldGVDb25kaXRpb25fPWUuZGVsZXRlQ29uZGl0aW9uP2UuZGVsZXRlQ29uZGl0aW9uOnRoaXMuZGVmYXVsdERlbGV0ZUNvbmRpdGlvbl8sdGhpcy5pbnNlcnRWZXJ0ZXhDb25kaXRpb25fPWUuaW5zZXJ0VmVydGV4Q29uZGl0aW9uP2UuaW5zZXJ0VmVydGV4Q29uZGl0aW9uOmpvLHRoaXMudmVydGV4RmVhdHVyZV89bnVsbCx0aGlzLnZlcnRleFNlZ21lbnRzXz1udWxsLHRoaXMubGFzdFBpeGVsXz1bMCwwXSx0aGlzLmlnbm9yZU5leHRTaW5nbGVDbGlja189ITEsdGhpcy5tb2RpZmllZF89ITEsdGhpcy5yQnVzaF89bmV3IHRsLHRoaXMucGl4ZWxUb2xlcmFuY2VfPXZvaWQgMCE9PWUucGl4ZWxUb2xlcmFuY2U/ZS5waXhlbFRvbGVyYW5jZToxMCx0aGlzLnNuYXBwZWRUb1ZlcnRleF89ITEsdGhpcy5jaGFuZ2luZ0ZlYXR1cmVfPSExLHRoaXMuZHJhZ1NlZ21lbnRzXz1bXSx0aGlzLm92ZXJsYXlfPW5ldyBnYyh7c291cmNlOm5ldyBvcCh7dXNlU3BhdGlhbEluZGV4OiExLHdyYXBYOiEhZS53cmFwWH0pLHN0eWxlOmUuc3R5bGU/ZS5zdHlsZTpmdW5jdGlvbigpe3ZhciB0PUZ1KCk7cmV0dXJuIGZ1bmN0aW9uKGUsaSl7cmV0dXJuIHRbTnQuUE9JTlRdfX0oKSx1cGRhdGVXaGlsZUFuaW1hdGluZzohMCx1cGRhdGVXaGlsZUludGVyYWN0aW5nOiEwfSksdGhpcy5TRUdNRU5UX1dSSVRFUlNfPXtQb2ludDp0aGlzLndyaXRlUG9pbnRHZW9tZXRyeV8sTGluZVN0cmluZzp0aGlzLndyaXRlTGluZVN0cmluZ0dlb21ldHJ5XyxMaW5lYXJSaW5nOnRoaXMud3JpdGVMaW5lU3RyaW5nR2VvbWV0cnlfLFBvbHlnb246dGhpcy53cml0ZVBvbHlnb25HZW9tZXRyeV8sTXVsdGlQb2ludDp0aGlzLndyaXRlTXVsdGlQb2ludEdlb21ldHJ5XyxNdWx0aUxpbmVTdHJpbmc6dGhpcy53cml0ZU11bHRpTGluZVN0cmluZ0dlb21ldHJ5XyxNdWx0aVBvbHlnb246dGhpcy53cml0ZU11bHRpUG9seWdvbkdlb21ldHJ5XyxDaXJjbGU6dGhpcy53cml0ZUNpcmNsZUdlb21ldHJ5XyxHZW9tZXRyeUNvbGxlY3Rpb246dGhpcy53cml0ZUdlb21ldHJ5Q29sbGVjdGlvbkdlb21ldHJ5X30sdGhpcy5zb3VyY2VfPW51bGwsZS5zb3VyY2U/KHRoaXMuc291cmNlXz1lLnNvdXJjZSxpPW5ldyBVKHRoaXMuc291cmNlXy5nZXRGZWF0dXJlcygpKSx2KHRoaXMuc291cmNlXyxycC5BRERGRUFUVVJFLHRoaXMuaGFuZGxlU291cmNlQWRkXyx0aGlzKSx2KHRoaXMuc291cmNlXyxycC5SRU1PVkVGRUFUVVJFLHRoaXMuaGFuZGxlU291cmNlUmVtb3ZlXyx0aGlzKSk6aT1lLmZlYXR1cmVzLCFpKXRocm93IG5ldyBFcnJvcigiVGhlIG1vZGlmeSBpbnRlcmFjdGlvbiByZXF1aXJlcyBmZWF0dXJlcyBvciBhIHNvdXJjZSIpO3RoaXMuZmVhdHVyZXNfPWksdGhpcy5mZWF0dXJlc18uZm9yRWFjaCh0aGlzLmFkZEZlYXR1cmVfLmJpbmQodGhpcykpLHYodGhpcy5mZWF0dXJlc18saC5BREQsdGhpcy5oYW5kbGVGZWF0dXJlQWRkXyx0aGlzKSx2KHRoaXMuZmVhdHVyZXNfLGguUkVNT1ZFLHRoaXMuaGFuZGxlRmVhdHVyZVJlbW92ZV8sdGhpcyksdGhpcy5sYXN0UG9pbnRlckV2ZW50Xz1udWxsfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5hZGRGZWF0dXJlXz1mdW5jdGlvbih0KXt2YXIgZT10LmdldEdlb21ldHJ5KCk7ZSYmZS5nZXRUeXBlKClpbiB0aGlzLlNFR01FTlRfV1JJVEVSU18mJnRoaXMuU0VHTUVOVF9XUklURVJTX1tlLmdldFR5cGUoKV0uY2FsbCh0aGlzLHQsZSk7dmFyIGk9dGhpcy5nZXRNYXAoKTtpJiZpLmlzUmVuZGVyZWQoKSYmdGhpcy5nZXRBY3RpdmUoKSYmdGhpcy5oYW5kbGVQb2ludGVyQXRQaXhlbF8odGhpcy5sYXN0UGl4ZWxfLGkpLHYodCxNLkNIQU5HRSx0aGlzLmhhbmRsZUZlYXR1cmVDaGFuZ2VfLHRoaXMpfSxlLnByb3RvdHlwZS53aWxsTW9kaWZ5RmVhdHVyZXNfPWZ1bmN0aW9uKHQpe3RoaXMubW9kaWZpZWRffHwodGhpcy5tb2RpZmllZF89ITAsdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBLYyh6Yyx0aGlzLmZlYXR1cmVzXyx0KSkpfSxlLnByb3RvdHlwZS5yZW1vdmVGZWF0dXJlXz1mdW5jdGlvbih0KXt0aGlzLnJlbW92ZUZlYXR1cmVTZWdtZW50RGF0YV8odCksdGhpcy52ZXJ0ZXhGZWF0dXJlXyYmMD09PXRoaXMuZmVhdHVyZXNfLmdldExlbmd0aCgpJiYodGhpcy5vdmVybGF5Xy5nZXRTb3VyY2UoKS5yZW1vdmVGZWF0dXJlKHRoaXMudmVydGV4RmVhdHVyZV8pLHRoaXMudmVydGV4RmVhdHVyZV89bnVsbCkseCh0LE0uQ0hBTkdFLHRoaXMuaGFuZGxlRmVhdHVyZUNoYW5nZV8sdGhpcyl9LGUucHJvdG90eXBlLnJlbW92ZUZlYXR1cmVTZWdtZW50RGF0YV89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yQnVzaF8saT1bXTtlLmZvckVhY2goZnVuY3Rpb24oZSl7dD09PWUuZmVhdHVyZSYmaS5wdXNoKGUpfSk7Zm9yKHZhciByPWkubGVuZ3RoLTE7cj49MDstLXIpZS5yZW1vdmUoaVtyXSl9LGUucHJvdG90eXBlLnNldEFjdGl2ZT1mdW5jdGlvbihlKXt0aGlzLnZlcnRleEZlYXR1cmVfJiYhZSYmKHRoaXMub3ZlcmxheV8uZ2V0U291cmNlKCkucmVtb3ZlRmVhdHVyZSh0aGlzLnZlcnRleEZlYXR1cmVfKSx0aGlzLnZlcnRleEZlYXR1cmVfPW51bGwpLHQucHJvdG90eXBlLnNldEFjdGl2ZS5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLnNldE1hcD1mdW5jdGlvbihlKXt0aGlzLm92ZXJsYXlfLnNldE1hcChlKSx0LnByb3RvdHlwZS5zZXRNYXAuY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5nZXRPdmVybGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3ZlcmxheV99LGUucHJvdG90eXBlLmhhbmRsZVNvdXJjZUFkZF89ZnVuY3Rpb24odCl7dC5mZWF0dXJlJiZ0aGlzLmZlYXR1cmVzXy5wdXNoKHQuZmVhdHVyZSl9LGUucHJvdG90eXBlLmhhbmRsZVNvdXJjZVJlbW92ZV89ZnVuY3Rpb24odCl7dC5mZWF0dXJlJiZ0aGlzLmZlYXR1cmVzXy5yZW1vdmUodC5mZWF0dXJlKX0sZS5wcm90b3R5cGUuaGFuZGxlRmVhdHVyZUFkZF89ZnVuY3Rpb24odCl7dGhpcy5hZGRGZWF0dXJlXyh0LmVsZW1lbnQpfSxlLnByb3RvdHlwZS5oYW5kbGVGZWF0dXJlQ2hhbmdlXz1mdW5jdGlvbih0KXtpZighdGhpcy5jaGFuZ2luZ0ZlYXR1cmVfKXt2YXIgZT10LnRhcmdldDt0aGlzLnJlbW92ZUZlYXR1cmVfKGUpLHRoaXMuYWRkRmVhdHVyZV8oZSl9fSxlLnByb3RvdHlwZS5oYW5kbGVGZWF0dXJlUmVtb3ZlXz1mdW5jdGlvbih0KXt2YXIgZT10LmVsZW1lbnQ7dGhpcy5yZW1vdmVGZWF0dXJlXyhlKX0sZS5wcm90b3R5cGUud3JpdGVQb2ludEdlb21ldHJ5Xz1mdW5jdGlvbih0LGUpe3ZhciBpPWUuZ2V0Q29vcmRpbmF0ZXMoKSxyPXtmZWF0dXJlOnQsZ2VvbWV0cnk6ZSxzZWdtZW50OltpLGldfTt0aGlzLnJCdXNoXy5pbnNlcnQoZS5nZXRFeHRlbnQoKSxyKX0sZS5wcm90b3R5cGUud3JpdGVNdWx0aVBvaW50R2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUuZ2V0Q29vcmRpbmF0ZXMoKSxyPTAsbj1pLmxlbmd0aDtyPG47KytyKXt2YXIgbz1pW3JdLHM9e2ZlYXR1cmU6dCxnZW9tZXRyeTplLGRlcHRoOltyXSxpbmRleDpyLHNlZ21lbnQ6W28sb119O3RoaXMuckJ1c2hfLmluc2VydChlLmdldEV4dGVudCgpLHMpfX0sZS5wcm90b3R5cGUud3JpdGVMaW5lU3RyaW5nR2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUuZ2V0Q29vcmRpbmF0ZXMoKSxyPTAsbj1pLmxlbmd0aC0xO3I8bjsrK3Ipe3ZhciBvPWkuc2xpY2UocixyKzIpLHM9e2ZlYXR1cmU6dCxnZW9tZXRyeTplLGluZGV4OnIsc2VnbWVudDpvfTt0aGlzLnJCdXNoXy5pbnNlcnQodHQobykscyl9fSxlLnByb3RvdHlwZS53cml0ZU11bHRpTGluZVN0cmluZ0dlb21ldHJ5Xz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1lLmdldENvb3JkaW5hdGVzKCkscj0wLG49aS5sZW5ndGg7cjxuOysrcilmb3IodmFyIG89aVtyXSxzPTAsYT1vLmxlbmd0aC0xO3M8YTsrK3Mpe3ZhciBoPW8uc2xpY2UocyxzKzIpLGw9e2ZlYXR1cmU6dCxnZW9tZXRyeTplLGRlcHRoOltyXSxpbmRleDpzLHNlZ21lbnQ6aH07dGhpcy5yQnVzaF8uaW5zZXJ0KHR0KGgpLGwpfX0sZS5wcm90b3R5cGUud3JpdGVQb2x5Z29uR2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUuZ2V0Q29vcmRpbmF0ZXMoKSxyPTAsbj1pLmxlbmd0aDtyPG47KytyKWZvcih2YXIgbz1pW3JdLHM9MCxhPW8ubGVuZ3RoLTE7czxhOysrcyl7dmFyIGg9by5zbGljZShzLHMrMiksbD17ZmVhdHVyZTp0LGdlb21ldHJ5OmUsZGVwdGg6W3JdLGluZGV4OnMsc2VnbWVudDpofTt0aGlzLnJCdXNoXy5pbnNlcnQodHQoaCksbCl9fSxlLnByb3RvdHlwZS53cml0ZU11bHRpUG9seWdvbkdlb21ldHJ5Xz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1lLmdldENvb3JkaW5hdGVzKCkscj0wLG49aS5sZW5ndGg7cjxuOysrcilmb3IodmFyIG89aVtyXSxzPTAsYT1vLmxlbmd0aDtzPGE7KytzKWZvcih2YXIgaD1vW3NdLGw9MCx1PWgubGVuZ3RoLTE7bDx1OysrbCl7dmFyIHA9aC5zbGljZShsLGwrMiksYz17ZmVhdHVyZTp0LGdlb21ldHJ5OmUsZGVwdGg6W3Mscl0saW5kZXg6bCxzZWdtZW50OnB9O3RoaXMuckJ1c2hfLmluc2VydCh0dChwKSxjKX19LGUucHJvdG90eXBlLndyaXRlQ2lyY2xlR2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5nZXRDZW50ZXIoKSxyPXtmZWF0dXJlOnQsZ2VvbWV0cnk6ZSxpbmRleDowLHNlZ21lbnQ6W2ksaV19LG49e2ZlYXR1cmU6dCxnZW9tZXRyeTplLGluZGV4OlhjLHNlZ21lbnQ6W2ksaV19LG89W3Isbl07ci5mZWF0dXJlU2VnbWVudHM9bi5mZWF0dXJlU2VnbWVudHM9byx0aGlzLnJCdXNoXy5pbnNlcnQocHQoaSksciksdGhpcy5yQnVzaF8uaW5zZXJ0KGUuZ2V0RXh0ZW50KCksbil9LGUucHJvdG90eXBlLndyaXRlR2VvbWV0cnlDb2xsZWN0aW9uR2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUuZ2V0R2VvbWV0cmllc0FycmF5KCkscj0wO3I8aS5sZW5ndGg7KytyKXRoaXMuU0VHTUVOVF9XUklURVJTX1tpW3JdLmdldFR5cGUoKV0uY2FsbCh0aGlzLHQsaVtyXSl9LGUucHJvdG90eXBlLmNyZWF0ZU9yVXBkYXRlVmVydGV4RmVhdHVyZV89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52ZXJ0ZXhGZWF0dXJlXztlP2UuZ2V0R2VvbWV0cnkoKS5zZXRDb29yZGluYXRlcyh0KTooZT1uZXcgQihuZXcgY2kodCkpLHRoaXMudmVydGV4RmVhdHVyZV89ZSx0aGlzLm92ZXJsYXlfLmdldFNvdXJjZSgpLmFkZEZlYXR1cmUoZSkpO3JldHVybiBlfSxlLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbihlKXtyZXR1cm4hZS5wb2ludGVyRXZlbnR8fCh0aGlzLmxhc3RQb2ludGVyRXZlbnRfPWUsZS5tYXAuZ2V0VmlldygpLmdldEludGVyYWN0aW5nKCl8fGUudHlwZSE9QXIuUE9JTlRFUk1PVkV8fHRoaXMuaGFuZGxpbmdEb3duVXBTZXF1ZW5jZXx8dGhpcy5oYW5kbGVQb2ludGVyTW92ZV8oZSksdGhpcy52ZXJ0ZXhGZWF0dXJlXyYmdGhpcy5kZWxldGVDb25kaXRpb25fKGUpJiYoaT0hKGUudHlwZSE9QXIuU0lOR0xFQ0xJQ0t8fCF0aGlzLmlnbm9yZU5leHRTaW5nbGVDbGlja18pfHx0aGlzLnJlbW92ZVBvaW50KCkpLGUudHlwZT09QXIuU0lOR0xFQ0xJQ0smJih0aGlzLmlnbm9yZU5leHRTaW5nbGVDbGlja189ITEpLHQucHJvdG90eXBlLmhhbmRsZUV2ZW50LmNhbGwodGhpcyxlKSYmIWkpO3ZhciBpfSxlLnByb3RvdHlwZS5oYW5kbGVEcmFnRXZlbnQ9ZnVuY3Rpb24odCl7dGhpcy5pZ25vcmVOZXh0U2luZ2xlQ2xpY2tfPSExLHRoaXMud2lsbE1vZGlmeUZlYXR1cmVzXyh0KTtmb3IodmFyIGU9dC5jb29yZGluYXRlLGk9MCxyPXRoaXMuZHJhZ1NlZ21lbnRzXy5sZW5ndGg7aTxyOysraSl7Zm9yKHZhciBuPXRoaXMuZHJhZ1NlZ21lbnRzX1tpXSxvPW5bMF0scz1vLmRlcHRoLGE9by5nZW9tZXRyeSxoPXZvaWQgMCxsPW8uc2VnbWVudCx1PW5bMV07ZS5sZW5ndGg8YS5nZXRTdHJpZGUoKTspZS5wdXNoKGxbdV1bZS5sZW5ndGhdKTtzd2l0Y2goYS5nZXRUeXBlKCkpe2Nhc2UgTnQuUE9JTlQ6aD1lLGxbMF09bFsxXT1lO2JyZWFrO2Nhc2UgTnQuTVVMVElfUE9JTlQ6KGg9YS5nZXRDb29yZGluYXRlcygpKVtvLmluZGV4XT1lLGxbMF09bFsxXT1lO2JyZWFrO2Nhc2UgTnQuTElORV9TVFJJTkc6KGg9YS5nZXRDb29yZGluYXRlcygpKVtvLmluZGV4K3VdPWUsbFt1XT1lO2JyZWFrO2Nhc2UgTnQuTVVMVElfTElORV9TVFJJTkc6Y2FzZSBOdC5QT0xZR09OOihoPWEuZ2V0Q29vcmRpbmF0ZXMoKSlbc1swXV1bby5pbmRleCt1XT1lLGxbdV09ZTticmVhaztjYXNlIE50Lk1VTFRJX1BPTFlHT046KGg9YS5nZXRDb29yZGluYXRlcygpKVtzWzFdXVtzWzBdXVtvLmluZGV4K3VdPWUsbFt1XT1lO2JyZWFrO2Nhc2UgTnQuQ0lSQ0xFOmxbMF09bFsxXT1lLDA9PT1vLmluZGV4Pyh0aGlzLmNoYW5naW5nRmVhdHVyZV89ITAsYS5zZXRDZW50ZXIoZSksdGhpcy5jaGFuZ2luZ0ZlYXR1cmVfPSExKToodGhpcy5jaGFuZ2luZ0ZlYXR1cmVfPSEwLGEuc2V0UmFkaXVzKGlyKGEuZ2V0Q2VudGVyKCksZSkpLHRoaXMuY2hhbmdpbmdGZWF0dXJlXz0hMSl9aCYmdGhpcy5zZXRHZW9tZXRyeUNvb3JkaW5hdGVzXyhhLGgpfXRoaXMuY3JlYXRlT3JVcGRhdGVWZXJ0ZXhGZWF0dXJlXyhlKX0sZS5wcm90b3R5cGUuaGFuZGxlRG93bkV2ZW50PWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmNvbmRpdGlvbl8odCkpcmV0dXJuITE7dGhpcy5oYW5kbGVQb2ludGVyQXRQaXhlbF8odC5waXhlbCx0Lm1hcCk7dmFyIGU9dC5tYXAuZ2V0Q29vcmRpbmF0ZUZyb21QaXhlbCh0LnBpeGVsKTt0aGlzLmRyYWdTZWdtZW50c18ubGVuZ3RoPTAsdGhpcy5tb2RpZmllZF89ITE7dmFyIGk9dGhpcy52ZXJ0ZXhGZWF0dXJlXztpZihpKXt2YXIgcj1bXSxuPWkuZ2V0R2VvbWV0cnkoKS5nZXRDb29yZGluYXRlcygpLHM9dHQoW25dKSxhPXRoaXMuckJ1c2hfLmdldEluRXh0ZW50KHMpLGg9e307YS5zb3J0KEhjKTtmb3IodmFyIGw9MCx1PWEubGVuZ3RoO2w8dTsrK2wpe3ZhciBwPWFbbF0sYz1wLnNlZ21lbnQsZD1vKHAuZmVhdHVyZSksZj1wLmRlcHRoO2lmKGYmJihkKz0iLSIrZi5qb2luKCItIikpLGhbZF18fChoW2RdPW5ldyBBcnJheSgyKSkscC5nZW9tZXRyeS5nZXRUeXBlKCk9PT1OdC5DSVJDTEUmJnAuaW5kZXg9PT1YYylRaShxYyhlLHApLG4pJiYhaFtkXVswXSYmKHRoaXMuZHJhZ1NlZ21lbnRzXy5wdXNoKFtwLDBdKSxoW2RdWzBdPXApO2Vsc2UgaWYoUWkoY1swXSxuKSYmIWhbZF1bMF0pdGhpcy5kcmFnU2VnbWVudHNfLnB1c2goW3AsMF0pLGhbZF1bMF09cDtlbHNlIGlmKFFpKGNbMV0sbikmJiFoW2RdWzFdKXtpZigocC5nZW9tZXRyeS5nZXRUeXBlKCk9PT1OdC5MSU5FX1NUUklOR3x8cC5nZW9tZXRyeS5nZXRUeXBlKCk9PT1OdC5NVUxUSV9MSU5FX1NUUklORykmJmhbZF1bMF0mJjA9PT1oW2RdWzBdLmluZGV4KWNvbnRpbnVlO3RoaXMuZHJhZ1NlZ21lbnRzXy5wdXNoKFtwLDFdKSxoW2RdWzFdPXB9ZWxzZSB0aGlzLmluc2VydFZlcnRleENvbmRpdGlvbl8odCkmJm8oYylpbiB0aGlzLnZlcnRleFNlZ21lbnRzXyYmIWhbZF1bMF0mJiFoW2RdWzFdJiZyLnB1c2goW3Asbl0pfXIubGVuZ3RoJiZ0aGlzLndpbGxNb2RpZnlGZWF0dXJlc18odCk7Zm9yKHZhciBfPXIubGVuZ3RoLTE7Xz49MDstLV8pdGhpcy5pbnNlcnRWZXJ0ZXhfLmFwcGx5KHRoaXMscltfXSl9cmV0dXJuISF0aGlzLnZlcnRleEZlYXR1cmVffSxlLnByb3RvdHlwZS5oYW5kbGVVcEV2ZW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmRyYWdTZWdtZW50c18ubGVuZ3RoLTE7ZT49MDstLWUpe3ZhciBpPXRoaXMuZHJhZ1NlZ21lbnRzX1tlXVswXSxyPWkuZ2VvbWV0cnk7aWYoci5nZXRUeXBlKCk9PT1OdC5DSVJDTEUpe3ZhciBuPXIuZ2V0Q2VudGVyKCksbz1pLmZlYXR1cmVTZWdtZW50c1swXSxzPWkuZmVhdHVyZVNlZ21lbnRzWzFdO28uc2VnbWVudFswXT1vLnNlZ21lbnRbMV09bixzLnNlZ21lbnRbMF09cy5zZWdtZW50WzFdPW4sdGhpcy5yQnVzaF8udXBkYXRlKHB0KG4pLG8pLHRoaXMuckJ1c2hfLnVwZGF0ZShyLmdldEV4dGVudCgpLHMpfWVsc2UgdGhpcy5yQnVzaF8udXBkYXRlKHR0KGkuc2VnbWVudCksaSl9cmV0dXJuIHRoaXMubW9kaWZpZWRfJiYodGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBLYyhXYyx0aGlzLmZlYXR1cmVzXyx0KSksdGhpcy5tb2RpZmllZF89ITEpLCExfSxlLnByb3RvdHlwZS5oYW5kbGVQb2ludGVyTW92ZV89ZnVuY3Rpb24odCl7dGhpcy5sYXN0UGl4ZWxfPXQucGl4ZWwsdGhpcy5oYW5kbGVQb2ludGVyQXRQaXhlbF8odC5waXhlbCx0Lm1hcCl9LGUucHJvdG90eXBlLmhhbmRsZVBvaW50ZXJBdFBpeGVsXz1mdW5jdGlvbih0LGUpe3ZhciBpPWUuZ2V0Q29vcmRpbmF0ZUZyb21QaXhlbCh0KSxyPWV0KHB0KGkpLGUuZ2V0VmlldygpLmdldFJlc29sdXRpb24oKSp0aGlzLnBpeGVsVG9sZXJhbmNlXyksbj10aGlzLnJCdXNoXy5nZXRJbkV4dGVudChyKTtpZihuLmxlbmd0aD4wKXtuLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gWmMoaSx0KS1aYyhpLGUpfSk7dmFyIHM9blswXSxhPXMuc2VnbWVudCxoPXFjKGkscyksbD1lLmdldFBpeGVsRnJvbUNvb3JkaW5hdGUoaCksdT1pcih0LGwpO2lmKHU8PXRoaXMucGl4ZWxUb2xlcmFuY2VfKXt2YXIgcD17fTtpZihzLmdlb21ldHJ5LmdldFR5cGUoKT09PU50LkNJUkNMRSYmcy5pbmRleD09PVhjKXRoaXMuc25hcHBlZFRvVmVydGV4Xz0hMCx0aGlzLmNyZWF0ZU9yVXBkYXRlVmVydGV4RmVhdHVyZV8oaCk7ZWxzZXt2YXIgYz1lLmdldFBpeGVsRnJvbUNvb3JkaW5hdGUoYVswXSksZD1lLmdldFBpeGVsRnJvbUNvb3JkaW5hdGUoYVsxXSksZj1lcihsLGMpLF89ZXIobCxkKTt1PU1hdGguc3FydChNYXRoLm1pbihmLF8pKSx0aGlzLnNuYXBwZWRUb1ZlcnRleF89dTw9dGhpcy5waXhlbFRvbGVyYW5jZV8sdGhpcy5zbmFwcGVkVG9WZXJ0ZXhfJiYoaD1mPl8/YVsxXTphWzBdKSx0aGlzLmNyZWF0ZU9yVXBkYXRlVmVydGV4RmVhdHVyZV8oaCk7Zm9yKHZhciBnPTEseT1uLmxlbmd0aDtnPHk7KytnKXt2YXIgdj1uW2ddLnNlZ21lbnQ7aWYoIShRaShhWzBdLHZbMF0pJiZRaShhWzFdLHZbMV0pfHxRaShhWzBdLHZbMV0pJiZRaShhWzFdLHZbMF0pKSlicmVhaztwW28odildPSEwfX1yZXR1cm4gcFtvKGEpXT0hMCx2b2lkKHRoaXMudmVydGV4U2VnbWVudHNfPXApfX10aGlzLnZlcnRleEZlYXR1cmVfJiYodGhpcy5vdmVybGF5Xy5nZXRTb3VyY2UoKS5yZW1vdmVGZWF0dXJlKHRoaXMudmVydGV4RmVhdHVyZV8pLHRoaXMudmVydGV4RmVhdHVyZV89bnVsbCl9LGUucHJvdG90eXBlLmluc2VydFZlcnRleF89ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkscj10LnNlZ21lbnQsbj10LmZlYXR1cmUsbz10Lmdlb21ldHJ5LHM9dC5kZXB0aCxhPXQuaW5kZXg7ZS5sZW5ndGg8by5nZXRTdHJpZGUoKTspZS5wdXNoKDApO3N3aXRjaChvLmdldFR5cGUoKSl7Y2FzZSBOdC5NVUxUSV9MSU5FX1NUUklORzpjYXNlIE50LlBPTFlHT046KGk9by5nZXRDb29yZGluYXRlcygpKVtzWzBdXS5zcGxpY2UoYSsxLDAsZSk7YnJlYWs7Y2FzZSBOdC5NVUxUSV9QT0xZR09OOihpPW8uZ2V0Q29vcmRpbmF0ZXMoKSlbc1sxXV1bc1swXV0uc3BsaWNlKGErMSwwLGUpO2JyZWFrO2Nhc2UgTnQuTElORV9TVFJJTkc6KGk9by5nZXRDb29yZGluYXRlcygpKS5zcGxpY2UoYSsxLDAsZSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dGhpcy5zZXRHZW9tZXRyeUNvb3JkaW5hdGVzXyhvLGkpO3ZhciBoPXRoaXMuckJ1c2hfO2gucmVtb3ZlKHQpLHRoaXMudXBkYXRlU2VnbWVudEluZGljZXNfKG8sYSxzLDEpO3ZhciBsPXtzZWdtZW50OltyWzBdLGVdLGZlYXR1cmU6bixnZW9tZXRyeTpvLGRlcHRoOnMsaW5kZXg6YX07aC5pbnNlcnQodHQobC5zZWdtZW50KSxsKSx0aGlzLmRyYWdTZWdtZW50c18ucHVzaChbbCwxXSk7dmFyIHU9e3NlZ21lbnQ6W2UsclsxXV0sZmVhdHVyZTpuLGdlb21ldHJ5Om8sZGVwdGg6cyxpbmRleDphKzF9O2guaW5zZXJ0KHR0KHUuc2VnbWVudCksdSksdGhpcy5kcmFnU2VnbWVudHNfLnB1c2goW3UsMF0pLHRoaXMuaWdub3JlTmV4dFNpbmdsZUNsaWNrXz0hMH0sZS5wcm90b3R5cGUucmVtb3ZlUG9pbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmxhc3RQb2ludGVyRXZlbnRfJiZ0aGlzLmxhc3RQb2ludGVyRXZlbnRfLnR5cGUhPUFyLlBPSU5URVJEUkFHKXt2YXIgdD10aGlzLmxhc3RQb2ludGVyRXZlbnRfO3JldHVybiB0aGlzLndpbGxNb2RpZnlGZWF0dXJlc18odCksdGhpcy5yZW1vdmVWZXJ0ZXhfKCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBLYyhXYyx0aGlzLmZlYXR1cmVzXyx0KSksdGhpcy5tb2RpZmllZF89ITEsITB9cmV0dXJuITF9LGUucHJvdG90eXBlLnJlbW92ZVZlcnRleF89ZnVuY3Rpb24oKXt2YXIgdCxlLGkscixuLHMsYSxoLGwsdSxwLGM9dGhpcy5kcmFnU2VnbWVudHNfLGQ9e30sZj0hMTtmb3Iobj1jLmxlbmd0aC0xO24+PTA7LS1uKXA9bygodT0oaT1jW25dKVswXSkuZmVhdHVyZSksdS5kZXB0aCYmKHArPSItIit1LmRlcHRoLmpvaW4oIi0iKSkscCBpbiBkfHwoZFtwXT17fSksMD09PWlbMV0/KGRbcF0ucmlnaHQ9dSxkW3BdLmluZGV4PXUuaW5kZXgpOjE9PWlbMV0mJihkW3BdLmxlZnQ9dSxkW3BdLmluZGV4PXUuaW5kZXgrMSk7Zm9yKHAgaW4gZCl7c3dpdGNoKGw9ZFtwXS5yaWdodCxhPWRbcF0ubGVmdCxoPShzPWRbcF0uaW5kZXgpLTEsdT12b2lkIDAhPT1hP2E6bCxoPDAmJihoPTApLHQ9ZT0ocj11Lmdlb21ldHJ5KS5nZXRDb29yZGluYXRlcygpLGY9ITEsci5nZXRUeXBlKCkpe2Nhc2UgTnQuTVVMVElfTElORV9TVFJJTkc6ZVt1LmRlcHRoWzBdXS5sZW5ndGg+MiYmKGVbdS5kZXB0aFswXV0uc3BsaWNlKHMsMSksZj0hMCk7YnJlYWs7Y2FzZSBOdC5MSU5FX1NUUklORzplLmxlbmd0aD4yJiYoZS5zcGxpY2UocywxKSxmPSEwKTticmVhaztjYXNlIE50Lk1VTFRJX1BPTFlHT046dD10W3UuZGVwdGhbMV1dO2Nhc2UgTnQuUE9MWUdPTjoodD10W3UuZGVwdGhbMF1dKS5sZW5ndGg+NCYmKHM9PXQubGVuZ3RoLTEmJihzPTApLHQuc3BsaWNlKHMsMSksZj0hMCwwPT09cyYmKHQucG9wKCksdC5wdXNoKHRbMF0pLGg9dC5sZW5ndGgtMSkpfWlmKGYpe3RoaXMuc2V0R2VvbWV0cnlDb29yZGluYXRlc18ocixlKTt2YXIgXz1bXTtpZih2b2lkIDAhPT1hJiYodGhpcy5yQnVzaF8ucmVtb3ZlKGEpLF8ucHVzaChhLnNlZ21lbnRbMF0pKSx2b2lkIDAhPT1sJiYodGhpcy5yQnVzaF8ucmVtb3ZlKGwpLF8ucHVzaChsLnNlZ21lbnRbMV0pKSx2b2lkIDAhPT1hJiZ2b2lkIDAhPT1sKXt2YXIgZz17ZGVwdGg6dS5kZXB0aCxmZWF0dXJlOnUuZmVhdHVyZSxnZW9tZXRyeTp1Lmdlb21ldHJ5LGluZGV4Omgsc2VnbWVudDpffTt0aGlzLnJCdXNoXy5pbnNlcnQodHQoZy5zZWdtZW50KSxnKX10aGlzLnVwZGF0ZVNlZ21lbnRJbmRpY2VzXyhyLHMsdS5kZXB0aCwtMSksdGhpcy52ZXJ0ZXhGZWF0dXJlXyYmKHRoaXMub3ZlcmxheV8uZ2V0U291cmNlKCkucmVtb3ZlRmVhdHVyZSh0aGlzLnZlcnRleEZlYXR1cmVfKSx0aGlzLnZlcnRleEZlYXR1cmVfPW51bGwpLGMubGVuZ3RoPTB9fXJldHVybiBmfSxlLnByb3RvdHlwZS5zZXRHZW9tZXRyeUNvb3JkaW5hdGVzXz1mdW5jdGlvbih0LGUpe3RoaXMuY2hhbmdpbmdGZWF0dXJlXz0hMCx0LnNldENvb3JkaW5hdGVzKGUpLHRoaXMuY2hhbmdpbmdGZWF0dXJlXz0hMX0sZS5wcm90b3R5cGUudXBkYXRlU2VnbWVudEluZGljZXNfPWZ1bmN0aW9uKHQsZSxpLHIpe3RoaXMuckJ1c2hfLmZvckVhY2hJbkV4dGVudCh0LmdldEV4dGVudCgpLGZ1bmN0aW9uKG4pe24uZ2VvbWV0cnk9PT10JiYodm9pZCAwPT09aXx8dm9pZCAwPT09bi5kZXB0aHx8WihuLmRlcHRoLGkpKSYmbi5pbmRleD5lJiYobi5pbmRleCs9cil9KX0sZX0ocW8pLFFjPXtTRUxFQ1Q6InNlbGVjdCJ9LCRjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIsbil7dC5jYWxsKHRoaXMsZSksdGhpcy5zZWxlY3RlZD1pLHRoaXMuZGVzZWxlY3RlZD1yLHRoaXMubWFwQnJvd3NlckV2ZW50PW59cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KFApO2Z1bmN0aW9uIHRkKHQpe2lmKCF0aGlzLmNvbmRpdGlvbl8odCkpcmV0dXJuITA7dmFyIGU9dGhpcy5hZGRDb25kaXRpb25fKHQpLGk9dGhpcy5yZW1vdmVDb25kaXRpb25fKHQpLHI9dGhpcy50b2dnbGVDb25kaXRpb25fKHQpLG49IWUmJiFpJiYhcixvPXQubWFwLHM9dGhpcy5nZXRGZWF0dXJlcygpLGE9W10saD1bXTtpZihuKXtwKHRoaXMuZmVhdHVyZUxheWVyQXNzb2NpYXRpb25fKSxvLmZvckVhY2hGZWF0dXJlQXRQaXhlbCh0LnBpeGVsLGZ1bmN0aW9uKHQsZSl7aWYodGhpcy5maWx0ZXJfKHQsZSkpcmV0dXJuIGgucHVzaCh0KSx0aGlzLmFkZEZlYXR1cmVMYXllckFzc29jaWF0aW9uXyh0LGUpLCF0aGlzLm11bHRpX30uYmluZCh0aGlzKSx7bGF5ZXJGaWx0ZXI6dGhpcy5sYXllckZpbHRlcl8saGl0VG9sZXJhbmNlOnRoaXMuaGl0VG9sZXJhbmNlX30pO2Zvcih2YXIgbD1zLmdldExlbmd0aCgpLTE7bD49MDstLWwpe3ZhciB1PXMuaXRlbShsKSxjPWguaW5kZXhPZih1KTtjPi0xP2guc3BsaWNlKGMsMSk6KHMucmVtb3ZlKHUpLGEucHVzaCh1KSl9MCE9PWgubGVuZ3RoJiZzLmV4dGVuZChoKX1lbHNle28uZm9yRWFjaEZlYXR1cmVBdFBpeGVsKHQucGl4ZWwsZnVuY3Rpb24odCxuKXtpZih0aGlzLmZpbHRlcl8odCxuKSlyZXR1cm4hZSYmIXJ8fFgocy5nZXRBcnJheSgpLHQpPyhpfHxyKSYmWChzLmdldEFycmF5KCksdCkmJihhLnB1c2godCksdGhpcy5yZW1vdmVGZWF0dXJlTGF5ZXJBc3NvY2lhdGlvbl8odCkpOihoLnB1c2godCksdGhpcy5hZGRGZWF0dXJlTGF5ZXJBc3NvY2lhdGlvbl8odCxuKSksIXRoaXMubXVsdGlffS5iaW5kKHRoaXMpLHtsYXllckZpbHRlcjp0aGlzLmxheWVyRmlsdGVyXyxoaXRUb2xlcmFuY2U6dGhpcy5oaXRUb2xlcmFuY2VffSk7Zm9yKHZhciBkPWEubGVuZ3RoLTE7ZD49MDstLWQpcy5yZW1vdmUoYVtkXSk7cy5leHRlbmQoaCl9cmV0dXJuKGgubGVuZ3RoPjB8fGEubGVuZ3RoPjApJiZ0aGlzLmRpc3BhdGNoRXZlbnQobmV3ICRjKFFjLlNFTEVDVCxoLGEsdCkpLEJvKHQpfXZhciBlZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLHtoYW5kbGVFdmVudDp0ZH0pO3ZhciBpPWV8fHt9O3RoaXMuY29uZGl0aW9uXz1pLmNvbmRpdGlvbj9pLmNvbmRpdGlvbjpWbyx0aGlzLmFkZENvbmRpdGlvbl89aS5hZGRDb25kaXRpb24/aS5hZGRDb25kaXRpb246WW8sdGhpcy5yZW1vdmVDb25kaXRpb25fPWkucmVtb3ZlQ29uZGl0aW9uP2kucmVtb3ZlQ29uZGl0aW9uOllvLHRoaXMudG9nZ2xlQ29uZGl0aW9uXz1pLnRvZ2dsZUNvbmRpdGlvbj9pLnRvZ2dsZUNvbmRpdGlvbjp6byx0aGlzLm11bHRpXz0hIWkubXVsdGkmJmkubXVsdGksdGhpcy5maWx0ZXJfPWkuZmlsdGVyP2kuZmlsdGVyOlIsdGhpcy5oaXRUb2xlcmFuY2VfPWkuaGl0VG9sZXJhbmNlP2kuaGl0VG9sZXJhbmNlOjA7dmFyIHIsbj1uZXcgZ2Moe3NvdXJjZTpuZXcgb3Aoe3VzZVNwYXRpYWxJbmRleDohMSxmZWF0dXJlczppLmZlYXR1cmVzLHdyYXBYOmkud3JhcFh9KSxzdHlsZTppLnN0eWxlP2kuc3R5bGU6ZnVuY3Rpb24oKXt2YXIgdD1GdSgpO3JldHVybiBLKHRbTnQuUE9MWUdPTl0sdFtOdC5MSU5FX1NUUklOR10pLEsodFtOdC5HRU9NRVRSWV9DT0xMRUNUSU9OXSx0W050LkxJTkVfU1RSSU5HXSksZnVuY3Rpb24oZSxpKXtyZXR1cm4gZS5nZXRHZW9tZXRyeSgpP3RbZS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKV06bnVsbH19KCksdXBkYXRlV2hpbGVBbmltYXRpbmc6ITAsdXBkYXRlV2hpbGVJbnRlcmFjdGluZzohMH0pO2lmKHRoaXMuZmVhdHVyZU92ZXJsYXlfPW4saS5sYXllcnMpaWYoImZ1bmN0aW9uIj09dHlwZW9mIGkubGF5ZXJzKXI9aS5sYXllcnM7ZWxzZXt2YXIgbz1pLmxheWVycztyPWZ1bmN0aW9uKHQpe3JldHVybiBYKG8sdCl9fWVsc2Ugcj1SO3RoaXMubGF5ZXJGaWx0ZXJfPXIsdGhpcy5mZWF0dXJlTGF5ZXJBc3NvY2lhdGlvbl89e307dmFyIHM9dGhpcy5nZXRGZWF0dXJlcygpO3YocyxoLkFERCx0aGlzLmFkZEZlYXR1cmVfLHRoaXMpLHYocyxoLlJFTU9WRSx0aGlzLnJlbW92ZUZlYXR1cmVfLHRoaXMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5hZGRGZWF0dXJlTGF5ZXJBc3NvY2lhdGlvbl89ZnVuY3Rpb24odCxlKXt0aGlzLmZlYXR1cmVMYXllckFzc29jaWF0aW9uX1tvKHQpXT1lfSxlLnByb3RvdHlwZS5nZXRGZWF0dXJlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZlYXR1cmVPdmVybGF5Xy5nZXRTb3VyY2UoKS5nZXRGZWF0dXJlc0NvbGxlY3Rpb24oKX0sZS5wcm90b3R5cGUuZ2V0SGl0VG9sZXJhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGl0VG9sZXJhbmNlX30sZS5wcm90b3R5cGUuZ2V0TGF5ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmVhdHVyZUxheWVyQXNzb2NpYXRpb25fW28odCldfSxlLnByb3RvdHlwZS5nZXRPdmVybGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmVhdHVyZU92ZXJsYXlffSxlLnByb3RvdHlwZS5zZXRIaXRUb2xlcmFuY2U9ZnVuY3Rpb24odCl7dGhpcy5oaXRUb2xlcmFuY2VfPXR9LGUucHJvdG90eXBlLnNldE1hcD1mdW5jdGlvbihlKXt2YXIgaT10aGlzLmdldE1hcCgpLHI9dGhpcy5nZXRGZWF0dXJlcygpO2kmJnIuZm9yRWFjaChpLnVuc2tpcEZlYXR1cmUuYmluZChpKSksdC5wcm90b3R5cGUuc2V0TWFwLmNhbGwodGhpcyxlKSx0aGlzLmZlYXR1cmVPdmVybGF5Xy5zZXRNYXAoZSksZSYmci5mb3JFYWNoKGUuc2tpcEZlYXR1cmUuYmluZChlKSl9LGUucHJvdG90eXBlLmFkZEZlYXR1cmVfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0TWFwKCk7ZSYmZS5za2lwRmVhdHVyZSh0LmVsZW1lbnQpfSxlLnByb3RvdHlwZS5yZW1vdmVGZWF0dXJlXz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldE1hcCgpO2UmJmUudW5za2lwRmVhdHVyZSh0LmVsZW1lbnQpfSxlLnByb3RvdHlwZS5yZW1vdmVGZWF0dXJlTGF5ZXJBc3NvY2lhdGlvbl89ZnVuY3Rpb24odCl7ZGVsZXRlIHRoaXMuZmVhdHVyZUxheWVyQXNzb2NpYXRpb25fW28odCldfSxlfShGbyk7ZnVuY3Rpb24gaWQodCl7cmV0dXJuIHQuZmVhdHVyZT90LmZlYXR1cmU6dC5lbGVtZW50P3QuZWxlbWVudDp2b2lkIDB9dmFyIHJkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e30scj1pO3IuaGFuZGxlRG93bkV2ZW50fHwoci5oYW5kbGVEb3duRXZlbnQ9Uiksci5zdG9wRG93bnx8KHIuc3RvcERvd249dyksdC5jYWxsKHRoaXMsciksdGhpcy5zb3VyY2VfPWkuc291cmNlP2kuc291cmNlOm51bGwsdGhpcy52ZXJ0ZXhfPXZvaWQgMD09PWkudmVydGV4fHxpLnZlcnRleCx0aGlzLmVkZ2VfPXZvaWQgMD09PWkuZWRnZXx8aS5lZGdlLHRoaXMuZmVhdHVyZXNfPWkuZmVhdHVyZXM/aS5mZWF0dXJlczpudWxsLHRoaXMuZmVhdHVyZXNMaXN0ZW5lcktleXNfPVtdLHRoaXMuZmVhdHVyZUNoYW5nZUxpc3RlbmVyS2V5c189e30sdGhpcy5pbmRleGVkRmVhdHVyZXNFeHRlbnRzXz17fSx0aGlzLnBlbmRpbmdGZWF0dXJlc189e30sdGhpcy5waXhlbENvb3JkaW5hdGVfPW51bGwsdGhpcy5waXhlbFRvbGVyYW5jZV89dm9pZCAwIT09aS5waXhlbFRvbGVyYW5jZT9pLnBpeGVsVG9sZXJhbmNlOjEwLHRoaXMuc29ydEJ5RGlzdGFuY2VfPWZ1bmN0aW9uKHQsZSl7dmFyIGk9cnIodGhpcy5waXhlbENvb3JkaW5hdGVfLHQuc2VnbWVudCkscj1ycih0aGlzLnBpeGVsQ29vcmRpbmF0ZV8sZS5zZWdtZW50KTtyZXR1cm4gaS1yfS5iaW5kKHRoaXMpLHRoaXMuckJ1c2hfPW5ldyB0bCx0aGlzLlNFR01FTlRfV1JJVEVSU189e1BvaW50OnRoaXMud3JpdGVQb2ludEdlb21ldHJ5XyxMaW5lU3RyaW5nOnRoaXMud3JpdGVMaW5lU3RyaW5nR2VvbWV0cnlfLExpbmVhclJpbmc6dGhpcy53cml0ZUxpbmVTdHJpbmdHZW9tZXRyeV8sUG9seWdvbjp0aGlzLndyaXRlUG9seWdvbkdlb21ldHJ5XyxNdWx0aVBvaW50OnRoaXMud3JpdGVNdWx0aVBvaW50R2VvbWV0cnlfLE11bHRpTGluZVN0cmluZzp0aGlzLndyaXRlTXVsdGlMaW5lU3RyaW5nR2VvbWV0cnlfLE11bHRpUG9seWdvbjp0aGlzLndyaXRlTXVsdGlQb2x5Z29uR2VvbWV0cnlfLEdlb21ldHJ5Q29sbGVjdGlvbjp0aGlzLndyaXRlR2VvbWV0cnlDb2xsZWN0aW9uR2VvbWV0cnlfLENpcmNsZTp0aGlzLndyaXRlQ2lyY2xlR2VvbWV0cnlffX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuYWRkRmVhdHVyZT1mdW5jdGlvbih0LGUpe3ZhciBpPXZvaWQgMD09PWV8fGUscj1vKHQpLG49dC5nZXRHZW9tZXRyeSgpO2lmKG4pe3ZhciBzPXRoaXMuU0VHTUVOVF9XUklURVJTX1tuLmdldFR5cGUoKV07cyYmKHRoaXMuaW5kZXhlZEZlYXR1cmVzRXh0ZW50c19bcl09bi5nZXRFeHRlbnQoWzEvMCwxLzAsLTEvMCwtMS8wXSkscy5jYWxsKHRoaXMsdCxuKSl9aSYmKHRoaXMuZmVhdHVyZUNoYW5nZUxpc3RlbmVyS2V5c19bcl09dih0LE0uQ0hBTkdFLHRoaXMuaGFuZGxlRmVhdHVyZUNoYW5nZV8sdGhpcykpfSxlLnByb3RvdHlwZS5mb3JFYWNoRmVhdHVyZUFkZF89ZnVuY3Rpb24odCl7dGhpcy5hZGRGZWF0dXJlKHQpfSxlLnByb3RvdHlwZS5mb3JFYWNoRmVhdHVyZVJlbW92ZV89ZnVuY3Rpb24odCl7dGhpcy5yZW1vdmVGZWF0dXJlKHQpfSxlLnByb3RvdHlwZS5nZXRGZWF0dXJlc189ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy5mZWF0dXJlc18/dD10aGlzLmZlYXR1cmVzXzp0aGlzLnNvdXJjZV8mJih0PXRoaXMuc291cmNlXy5nZXRGZWF0dXJlcygpKSx0fSxlLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbihlKXt2YXIgaT10aGlzLnNuYXBUbyhlLnBpeGVsLGUuY29vcmRpbmF0ZSxlLm1hcCk7cmV0dXJuIGkuc25hcHBlZCYmKGUuY29vcmRpbmF0ZT1pLnZlcnRleC5zbGljZSgwLDIpLGUucGl4ZWw9aS52ZXJ0ZXhQaXhlbCksdC5wcm90b3R5cGUuaGFuZGxlRXZlbnQuY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5oYW5kbGVGZWF0dXJlQWRkXz1mdW5jdGlvbih0KXt2YXIgZT1pZCh0KTt0aGlzLmFkZEZlYXR1cmUoZSl9LGUucHJvdG90eXBlLmhhbmRsZUZlYXR1cmVSZW1vdmVfPWZ1bmN0aW9uKHQpe3ZhciBlPWlkKHQpO3RoaXMucmVtb3ZlRmVhdHVyZShlKX0sZS5wcm90b3R5cGUuaGFuZGxlRmVhdHVyZUNoYW5nZV89ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQ7aWYodGhpcy5oYW5kbGluZ0Rvd25VcFNlcXVlbmNlKXt2YXIgaT1vKGUpO2kgaW4gdGhpcy5wZW5kaW5nRmVhdHVyZXNffHwodGhpcy5wZW5kaW5nRmVhdHVyZXNfW2ldPWUpfWVsc2UgdGhpcy51cGRhdGVGZWF0dXJlXyhlKX0sZS5wcm90b3R5cGUuaGFuZGxlVXBFdmVudD1mdW5jdGlvbih0KXt2YXIgZT1jKHRoaXMucGVuZGluZ0ZlYXR1cmVzXyk7cmV0dXJuIGUubGVuZ3RoJiYoZS5mb3JFYWNoKHRoaXMudXBkYXRlRmVhdHVyZV8uYmluZCh0aGlzKSksdGhpcy5wZW5kaW5nRmVhdHVyZXNfPXt9KSwhMX0sZS5wcm90b3R5cGUucmVtb3ZlRmVhdHVyZT1mdW5jdGlvbih0LGUpe3ZhciBpPXZvaWQgMD09PWV8fGUscj1vKHQpLG49dGhpcy5pbmRleGVkRmVhdHVyZXNFeHRlbnRzX1tyXTtpZihuKXt2YXIgcz10aGlzLnJCdXNoXyxhPVtdO3MuZm9yRWFjaEluRXh0ZW50KG4sZnVuY3Rpb24oZSl7dD09PWUuZmVhdHVyZSYmYS5wdXNoKGUpfSk7Zm9yKHZhciBoPWEubGVuZ3RoLTE7aD49MDstLWgpcy5yZW1vdmUoYVtoXSl9aSYmKEUodGhpcy5mZWF0dXJlQ2hhbmdlTGlzdGVuZXJLZXlzX1tyXSksZGVsZXRlIHRoaXMuZmVhdHVyZUNoYW5nZUxpc3RlbmVyS2V5c19bcl0pfSxlLnByb3RvdHlwZS5zZXRNYXA9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5nZXRNYXAoKSxyPXRoaXMuZmVhdHVyZXNMaXN0ZW5lcktleXNfLG49dGhpcy5nZXRGZWF0dXJlc18oKTtpJiYoci5mb3JFYWNoKEUpLHIubGVuZ3RoPTAsbi5mb3JFYWNoKHRoaXMuZm9yRWFjaEZlYXR1cmVSZW1vdmVfLmJpbmQodGhpcykpKSx0LnByb3RvdHlwZS5zZXRNYXAuY2FsbCh0aGlzLGUpLGUmJih0aGlzLmZlYXR1cmVzXz9yLnB1c2godih0aGlzLmZlYXR1cmVzXyxoLkFERCx0aGlzLmhhbmRsZUZlYXR1cmVBZGRfLHRoaXMpLHYodGhpcy5mZWF0dXJlc18saC5SRU1PVkUsdGhpcy5oYW5kbGVGZWF0dXJlUmVtb3ZlXyx0aGlzKSk6dGhpcy5zb3VyY2VfJiZyLnB1c2godih0aGlzLnNvdXJjZV8scnAuQURERkVBVFVSRSx0aGlzLmhhbmRsZUZlYXR1cmVBZGRfLHRoaXMpLHYodGhpcy5zb3VyY2VfLHJwLlJFTU9WRUZFQVRVUkUsdGhpcy5oYW5kbGVGZWF0dXJlUmVtb3ZlXyx0aGlzKSksbi5mb3JFYWNoKHRoaXMuZm9yRWFjaEZlYXR1cmVBZGRfLmJpbmQodGhpcykpKX0sZS5wcm90b3R5cGUuc25hcFRvPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10dChbaS5nZXRDb29yZGluYXRlRnJvbVBpeGVsKFt0WzBdLXRoaXMucGl4ZWxUb2xlcmFuY2VfLHRbMV0rdGhpcy5waXhlbFRvbGVyYW5jZV9dKSxpLmdldENvb3JkaW5hdGVGcm9tUGl4ZWwoW3RbMF0rdGhpcy5waXhlbFRvbGVyYW5jZV8sdFsxXS10aGlzLnBpeGVsVG9sZXJhbmNlX10pXSksbj10aGlzLnJCdXNoXy5nZXRJbkV4dGVudChyKTt0aGlzLnZlcnRleF8mJiF0aGlzLmVkZ2VfJiYobj1uLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5mZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0VHlwZSgpIT09TnQuQ0lSQ0xFfSkpO3ZhciBvLHMsYSxoLGw9ITEsdT1udWxsLHA9bnVsbDtpZihuLmxlbmd0aD4wKXt0aGlzLnBpeGVsQ29vcmRpbmF0ZV89ZSxuLnNvcnQodGhpcy5zb3J0QnlEaXN0YW5jZV8pO3ZhciBjPW5bMF0uc2VnbWVudCxkPW5bMF0uZmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKT09PU50LkNJUkNMRTt0aGlzLnZlcnRleF8mJiF0aGlzLmVkZ2VfPyhvPWkuZ2V0UGl4ZWxGcm9tQ29vcmRpbmF0ZShjWzBdKSxzPWkuZ2V0UGl4ZWxGcm9tQ29vcmRpbmF0ZShjWzFdKSxhPWVyKHQsbyksaD1lcih0LHMpLE1hdGguc3FydChNYXRoLm1pbihhLGgpKTw9dGhpcy5waXhlbFRvbGVyYW5jZV8mJihsPSEwLHU9YT5oP2NbMV06Y1swXSxwPWkuZ2V0UGl4ZWxGcm9tQ29vcmRpbmF0ZSh1KSkpOnRoaXMuZWRnZV8mJih1PWQ/ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmdldFJhZGl1cygpLHI9ZS5nZXRDZW50ZXIoKSxuPXJbMF0sbz1yWzFdLHM9dFswXS1uLGE9dFsxXS1vOzA9PT1zJiYwPT09YSYmKHM9MSk7dmFyIGg9TWF0aC5zcXJ0KHMqcythKmEpO3JldHVybltuK2kqcy9oLG8raSphL2hdfShlLG5bMF0uZmVhdHVyZS5nZXRHZW9tZXRyeSgpKTpaaShlLGMpLGlyKHQscD1pLmdldFBpeGVsRnJvbUNvb3JkaW5hdGUodSkpPD10aGlzLnBpeGVsVG9sZXJhbmNlXyYmKGw9ITAsdGhpcy52ZXJ0ZXhfJiYhZCYmKG89aS5nZXRQaXhlbEZyb21Db29yZGluYXRlKGNbMF0pLHM9aS5nZXRQaXhlbEZyb21Db29yZGluYXRlKGNbMV0pLGE9ZXIocCxvKSxoPWVyKHAscyksTWF0aC5zcXJ0KE1hdGgubWluKGEsaCkpPD10aGlzLnBpeGVsVG9sZXJhbmNlXyYmKHU9YT5oP2NbMV06Y1swXSxwPWkuZ2V0UGl4ZWxGcm9tQ29vcmRpbmF0ZSh1KSkpKSksbCYmKHA9W01hdGgucm91bmQocFswXSksTWF0aC5yb3VuZChwWzFdKV0pfXJldHVybntzbmFwcGVkOmwsdmVydGV4OnUsdmVydGV4UGl4ZWw6cH19LGUucHJvdG90eXBlLnVwZGF0ZUZlYXR1cmVfPWZ1bmN0aW9uKHQpe3RoaXMucmVtb3ZlRmVhdHVyZSh0LCExKSx0aGlzLmFkZEZlYXR1cmUodCwhMSl9LGUucHJvdG90eXBlLndyaXRlQ2lyY2xlR2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPVBpKGUpLmdldENvb3JkaW5hdGVzKClbMF0scj0wLG49aS5sZW5ndGgtMTtyPG47KytyKXt2YXIgbz1pLnNsaWNlKHIscisyKSxzPXtmZWF0dXJlOnQsc2VnbWVudDpvfTt0aGlzLnJCdXNoXy5pbnNlcnQodHQobykscyl9fSxlLnByb3RvdHlwZS53cml0ZUdlb21ldHJ5Q29sbGVjdGlvbkdlb21ldHJ5Xz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1lLmdldEdlb21ldHJpZXNBcnJheSgpLHI9MDtyPGkubGVuZ3RoOysrcil7dmFyIG49dGhpcy5TRUdNRU5UX1dSSVRFUlNfW2lbcl0uZ2V0VHlwZSgpXTtuJiZuLmNhbGwodGhpcyx0LGlbcl0pfX0sZS5wcm90b3R5cGUud3JpdGVMaW5lU3RyaW5nR2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUuZ2V0Q29vcmRpbmF0ZXMoKSxyPTAsbj1pLmxlbmd0aC0xO3I8bjsrK3Ipe3ZhciBvPWkuc2xpY2UocixyKzIpLHM9e2ZlYXR1cmU6dCxzZWdtZW50Om99O3RoaXMuckJ1c2hfLmluc2VydCh0dChvKSxzKX19LGUucHJvdG90eXBlLndyaXRlTXVsdGlMaW5lU3RyaW5nR2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUuZ2V0Q29vcmRpbmF0ZXMoKSxyPTAsbj1pLmxlbmd0aDtyPG47KytyKWZvcih2YXIgbz1pW3JdLHM9MCxhPW8ubGVuZ3RoLTE7czxhOysrcyl7dmFyIGg9by5zbGljZShzLHMrMiksbD17ZmVhdHVyZTp0LHNlZ21lbnQ6aH07dGhpcy5yQnVzaF8uaW5zZXJ0KHR0KGgpLGwpfX0sZS5wcm90b3R5cGUud3JpdGVNdWx0aVBvaW50R2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUuZ2V0Q29vcmRpbmF0ZXMoKSxyPTAsbj1pLmxlbmd0aDtyPG47KytyKXt2YXIgbz1pW3JdLHM9e2ZlYXR1cmU6dCxzZWdtZW50OltvLG9dfTt0aGlzLnJCdXNoXy5pbnNlcnQoZS5nZXRFeHRlbnQoKSxzKX19LGUucHJvdG90eXBlLndyaXRlTXVsdGlQb2x5Z29uR2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUuZ2V0Q29vcmRpbmF0ZXMoKSxyPTAsbj1pLmxlbmd0aDtyPG47KytyKWZvcih2YXIgbz1pW3JdLHM9MCxhPW8ubGVuZ3RoO3M8YTsrK3MpZm9yKHZhciBoPW9bc10sbD0wLHU9aC5sZW5ndGgtMTtsPHU7KytsKXt2YXIgcD1oLnNsaWNlKGwsbCsyKSxjPXtmZWF0dXJlOnQsc2VnbWVudDpwfTt0aGlzLnJCdXNoXy5pbnNlcnQodHQocCksYyl9fSxlLnByb3RvdHlwZS53cml0ZVBvaW50R2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5nZXRDb29yZGluYXRlcygpLHI9e2ZlYXR1cmU6dCxzZWdtZW50OltpLGldfTt0aGlzLnJCdXNoXy5pbnNlcnQoZS5nZXRFeHRlbnQoKSxyKX0sZS5wcm90b3R5cGUud3JpdGVQb2x5Z29uR2VvbWV0cnlfPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUuZ2V0Q29vcmRpbmF0ZXMoKSxyPTAsbj1pLmxlbmd0aDtyPG47KytyKWZvcih2YXIgbz1pW3JdLHM9MCxhPW8ubGVuZ3RoLTE7czxhOysrcyl7dmFyIGg9by5zbGljZShzLHMrMiksbD17ZmVhdHVyZTp0LHNlZ21lbnQ6aH07dGhpcy5yQnVzaF8uaW5zZXJ0KHR0KGgpLGwpfX0sZX0ocW8pLG5kPSJ0cmFuc2xhdGVzdGFydCIsb2Q9InRyYW5zbGF0aW5nIixzZD0idHJhbnNsYXRlZW5kIixhZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXt0LmNhbGwodGhpcyxlKSx0aGlzLmZlYXR1cmVzPWksdGhpcy5jb29yZGluYXRlPXJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KFApLGhkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGkscj1lfHx7fTtpZih0LmNhbGwodGhpcyxyKSx0aGlzLmxhc3RDb29yZGluYXRlXz1udWxsLHRoaXMuZmVhdHVyZXNfPXZvaWQgMCE9PXIuZmVhdHVyZXM/ci5mZWF0dXJlczpudWxsLHIubGF5ZXJzKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiByLmxheWVycylpPXIubGF5ZXJzO2Vsc2V7dmFyIG49ci5sYXllcnM7aT1mdW5jdGlvbih0KXtyZXR1cm4gWChuLHQpfX1lbHNlIGk9Ujt0aGlzLmxheWVyRmlsdGVyXz1pLHRoaXMuaGl0VG9sZXJhbmNlXz1yLmhpdFRvbGVyYW5jZT9yLmhpdFRvbGVyYW5jZTowLHRoaXMubGFzdEZlYXR1cmVfPW51bGwsdih0aGlzLEcoSW8uQUNUSVZFKSx0aGlzLmhhbmRsZUFjdGl2ZUNoYW5nZWRfLHRoaXMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5oYW5kbGVEb3duRXZlbnQ9ZnVuY3Rpb24odCl7aWYodGhpcy5sYXN0RmVhdHVyZV89dGhpcy5mZWF0dXJlc0F0UGl4ZWxfKHQucGl4ZWwsdC5tYXApLCF0aGlzLmxhc3RDb29yZGluYXRlXyYmdGhpcy5sYXN0RmVhdHVyZV8pe3RoaXMubGFzdENvb3JkaW5hdGVfPXQuY29vcmRpbmF0ZSx0aGlzLmhhbmRsZU1vdmVFdmVudCh0KTt2YXIgZT10aGlzLmZlYXR1cmVzX3x8bmV3IFUoW3RoaXMubGFzdEZlYXR1cmVfXSk7cmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgYWQobmQsZSx0LmNvb3JkaW5hdGUpKSwhMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUuaGFuZGxlVXBFdmVudD1mdW5jdGlvbih0KXtpZih0aGlzLmxhc3RDb29yZGluYXRlXyl7dGhpcy5sYXN0Q29vcmRpbmF0ZV89bnVsbCx0aGlzLmhhbmRsZU1vdmVFdmVudCh0KTt2YXIgZT10aGlzLmZlYXR1cmVzX3x8bmV3IFUoW3RoaXMubGFzdEZlYXR1cmVfXSk7cmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgYWQoc2QsZSx0LmNvb3JkaW5hdGUpKSwhMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUuaGFuZGxlRHJhZ0V2ZW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMubGFzdENvb3JkaW5hdGVfKXt2YXIgZT10LmNvb3JkaW5hdGUsaT1lWzBdLXRoaXMubGFzdENvb3JkaW5hdGVfWzBdLHI9ZVsxXS10aGlzLmxhc3RDb29yZGluYXRlX1sxXSxuPXRoaXMuZmVhdHVyZXNffHxuZXcgVShbdGhpcy5sYXN0RmVhdHVyZV9dKTtuLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRHZW9tZXRyeSgpO2UudHJhbnNsYXRlKGksciksdC5zZXRHZW9tZXRyeShlKX0pLHRoaXMubGFzdENvb3JkaW5hdGVfPWUsdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBhZChvZCxuLGUpKX19LGUucHJvdG90eXBlLmhhbmRsZU1vdmVFdmVudD1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcC5nZXRWaWV3cG9ydCgpO3RoaXMuZmVhdHVyZXNBdFBpeGVsXyh0LnBpeGVsLHQubWFwKT8oZS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMubGFzdENvb3JkaW5hdGVfPyJvbC1ncmFiIjoib2wtZ3JhYmJpbmciKSxlLmNsYXNzTGlzdC5hZGQodGhpcy5sYXN0Q29vcmRpbmF0ZV8/Im9sLWdyYWJiaW5nIjoib2wtZ3JhYiIpKTplLmNsYXNzTGlzdC5yZW1vdmUoIm9sLWdyYWIiLCJvbC1ncmFiYmluZyIpfSxlLnByb3RvdHlwZS5mZWF0dXJlc0F0UGl4ZWxfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZm9yRWFjaEZlYXR1cmVBdFBpeGVsKHQsZnVuY3Rpb24odCl7aWYoIXRoaXMuZmVhdHVyZXNffHxYKHRoaXMuZmVhdHVyZXNfLmdldEFycmF5KCksdCkpcmV0dXJuIHR9LmJpbmQodGhpcykse2xheWVyRmlsdGVyOnRoaXMubGF5ZXJGaWx0ZXJfLGhpdFRvbGVyYW5jZTp0aGlzLmhpdFRvbGVyYW5jZV99KX0sZS5wcm90b3R5cGUuZ2V0SGl0VG9sZXJhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGl0VG9sZXJhbmNlX30sZS5wcm90b3R5cGUuc2V0SGl0VG9sZXJhbmNlPWZ1bmN0aW9uKHQpe3RoaXMuaGl0VG9sZXJhbmNlXz10fSxlLnByb3RvdHlwZS5zZXRNYXA9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5nZXRNYXAoKTt0LnByb3RvdHlwZS5zZXRNYXAuY2FsbCh0aGlzLGUpLHRoaXMudXBkYXRlU3RhdGVfKGkpfSxlLnByb3RvdHlwZS5oYW5kbGVBY3RpdmVDaGFuZ2VkXz1mdW5jdGlvbigpe3RoaXMudXBkYXRlU3RhdGVfKG51bGwpfSxlLnByb3RvdHlwZS51cGRhdGVTdGF0ZV89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRNYXAoKSxpPXRoaXMuZ2V0QWN0aXZlKCk7ZSYmaXx8KGU9ZXx8dCkmJmUuZ2V0Vmlld3BvcnQoKS5jbGFzc0xpc3QucmVtb3ZlKCJvbC1ncmFiIiwib2wtZ3JhYmJpbmciKX0sZX0ocW8pO2Z1bmN0aW9uIGxkKHQpe2Zvcih2YXIgZT1bXSxpPTAscj10Lmxlbmd0aDtpPHI7KytpKWUucHVzaCh0W2ldLmNsb25lKCkpO3JldHVybiBlfXZhciB1ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLmdlb21ldHJpZXNfPWV8fG51bGwsdGhpcy5saXN0ZW5HZW9tZXRyaWVzQ2hhbmdlXygpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS51bmxpc3Rlbkdlb21ldHJpZXNDaGFuZ2VfPWZ1bmN0aW9uKCl7aWYodGhpcy5nZW9tZXRyaWVzXylmb3IodmFyIHQ9MCxlPXRoaXMuZ2VvbWV0cmllc18ubGVuZ3RoO3Q8ZTsrK3QpeCh0aGlzLmdlb21ldHJpZXNfW3RdLE0uQ0hBTkdFLHRoaXMuY2hhbmdlZCx0aGlzKX0sZS5wcm90b3R5cGUubGlzdGVuR2VvbWV0cmllc0NoYW5nZV89ZnVuY3Rpb24oKXtpZih0aGlzLmdlb21ldHJpZXNfKWZvcih2YXIgdD0wLGU9dGhpcy5nZW9tZXRyaWVzXy5sZW5ndGg7dDxlOysrdCl2KHRoaXMuZ2VvbWV0cmllc19bdF0sTS5DSEFOR0UsdGhpcy5jaGFuZ2VkLHRoaXMpfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBlKG51bGwpO3JldHVybiB0LnNldEdlb21ldHJpZXModGhpcy5nZW9tZXRyaWVzXyksdH0sZS5wcm90b3R5cGUuY2xvc2VzdFBvaW50WFk9ZnVuY3Rpb24odCxlLGkscil7aWYocjxydCh0aGlzLmdldEV4dGVudCgpLHQsZSkpcmV0dXJuIHI7Zm9yKHZhciBuPXRoaXMuZ2VvbWV0cmllc18sbz0wLHM9bi5sZW5ndGg7bzxzOysrbylyPW5bb10uY2xvc2VzdFBvaW50WFkodCxlLGkscik7cmV0dXJuIHJ9LGUucHJvdG90eXBlLmNvbnRhaW5zWFk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dGhpcy5nZW9tZXRyaWVzXyxyPTAsbj1pLmxlbmd0aDtyPG47KytyKWlmKGlbcl0uY29udGFpbnNYWSh0LGUpKXJldHVybiEwO3JldHVybiExfSxlLnByb3RvdHlwZS5jb21wdXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3V0KHQpO2Zvcih2YXIgZT10aGlzLmdlb21ldHJpZXNfLGk9MCxyPWUubGVuZ3RoO2k8cjsrK2kpZnQodCxlW2ldLmdldEV4dGVudCgpKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cmllcz1mdW5jdGlvbigpe3JldHVybiBsZCh0aGlzLmdlb21ldHJpZXNfKX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cmllc0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2VvbWV0cmllc199LGUucHJvdG90eXBlLmdldFNpbXBsaWZpZWRHZW9tZXRyeT1mdW5jdGlvbih0KXtpZih0aGlzLnNpbXBsaWZpZWRHZW9tZXRyeVJldmlzaW9uIT10aGlzLmdldFJldmlzaW9uKCkmJihwKHRoaXMuc2ltcGxpZmllZEdlb21ldHJ5Q2FjaGUpLHRoaXMuc2ltcGxpZmllZEdlb21ldHJ5TWF4TWluU3F1YXJlZFRvbGVyYW5jZT0wLHRoaXMuc2ltcGxpZmllZEdlb21ldHJ5UmV2aXNpb249dGhpcy5nZXRSZXZpc2lvbigpKSx0PDB8fDAhPT10aGlzLnNpbXBsaWZpZWRHZW9tZXRyeU1heE1pblNxdWFyZWRUb2xlcmFuY2UmJnQ8dGhpcy5zaW1wbGlmaWVkR2VvbWV0cnlNYXhNaW5TcXVhcmVkVG9sZXJhbmNlKXJldHVybiB0aGlzO3ZhciBpPXQudG9TdHJpbmcoKTtpZih0aGlzLnNpbXBsaWZpZWRHZW9tZXRyeUNhY2hlLmhhc093blByb3BlcnR5KGkpKXJldHVybiB0aGlzLnNpbXBsaWZpZWRHZW9tZXRyeUNhY2hlW2ldO2Zvcih2YXIgcj1bXSxuPXRoaXMuZ2VvbWV0cmllc18sbz0hMSxzPTAsYT1uLmxlbmd0aDtzPGE7KytzKXt2YXIgaD1uW3NdLGw9aC5nZXRTaW1wbGlmaWVkR2VvbWV0cnkodCk7ci5wdXNoKGwpLGwhPT1oJiYobz0hMCl9aWYobyl7dmFyIHU9bmV3IGUobnVsbCk7cmV0dXJuIHUuc2V0R2VvbWV0cmllc0FycmF5KHIpLHRoaXMuc2ltcGxpZmllZEdlb21ldHJ5Q2FjaGVbaV09dSx1fXJldHVybiB0aGlzLnNpbXBsaWZpZWRHZW9tZXRyeU1heE1pblNxdWFyZWRUb2xlcmFuY2U9dCx0aGlzfSxlLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIE50LkdFT01FVFJZX0NPTExFQ1RJT059LGUucHJvdG90eXBlLmludGVyc2VjdHNFeHRlbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZ2VvbWV0cmllc18saT0wLHI9ZS5sZW5ndGg7aTxyOysraSlpZihlW2ldLmludGVyc2VjdHNFeHRlbnQodCkpcmV0dXJuITA7cmV0dXJuITF9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuZ2VvbWV0cmllc18ubGVuZ3RofSxlLnByb3RvdHlwZS5yb3RhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dGhpcy5nZW9tZXRyaWVzXyxyPTAsbj1pLmxlbmd0aDtyPG47KytyKWlbcl0ucm90YXRlKHQsZSk7dGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pO3J8fChyPVR0KHRoaXMuZ2V0RXh0ZW50KCkpKTtmb3IodmFyIG49dGhpcy5nZW9tZXRyaWVzXyxvPTAscz1uLmxlbmd0aDtvPHM7KytvKW5bb10uc2NhbGUodCxlLHIpO3RoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5zZXRHZW9tZXRyaWVzPWZ1bmN0aW9uKHQpe3RoaXMuc2V0R2VvbWV0cmllc0FycmF5KGxkKHQpKX0sZS5wcm90b3R5cGUuc2V0R2VvbWV0cmllc0FycmF5PWZ1bmN0aW9uKHQpe3RoaXMudW5saXN0ZW5HZW9tZXRyaWVzQ2hhbmdlXygpLHRoaXMuZ2VvbWV0cmllc189dCx0aGlzLmxpc3Rlbkdlb21ldHJpZXNDaGFuZ2VfKCksdGhpcy5jaGFuZ2VkKCl9LGUucHJvdG90eXBlLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmdlb21ldHJpZXNfLGk9MCxyPWUubGVuZ3RoO2k8cjsrK2kpZVtpXS5hcHBseVRyYW5zZm9ybSh0KTt0aGlzLmNoYW5nZWQoKX0sZS5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMuZ2VvbWV0cmllc18scj0wLG49aS5sZW5ndGg7cjxuOysrcilpW3JdLnRyYW5zbGF0ZSh0LGUpO3RoaXMuY2hhbmdlZCgpfSxlLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWw9ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuR2VvbWV0cmllc0NoYW5nZV8oKSx0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKX0sZX0oWGUpLHBkPWZ1bmN0aW9uKCl7dGhpcy5kYXRhUHJvamVjdGlvbj1udWxsLHRoaXMuZGVmYXVsdEZlYXR1cmVQcm9qZWN0aW9uPW51bGx9O3BkLnByb3RvdHlwZS5nZXRSZWFkT3B0aW9ucz1mdW5jdGlvbih0LGUpe3ZhciBpO3JldHVybiBlJiYoaT17ZGF0YVByb2plY3Rpb246ZS5kYXRhUHJvamVjdGlvbj9lLmRhdGFQcm9qZWN0aW9uOnRoaXMucmVhZFByb2plY3Rpb24odCksZmVhdHVyZVByb2plY3Rpb246ZS5mZWF0dXJlUHJvamVjdGlvbn0pLHRoaXMuYWRhcHRPcHRpb25zKGkpfSxwZC5wcm90b3R5cGUuYWRhcHRPcHRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiB1KHtkYXRhUHJvamVjdGlvbjp0aGlzLmRhdGFQcm9qZWN0aW9uLGZlYXR1cmVQcm9qZWN0aW9uOnRoaXMuZGVmYXVsdEZlYXR1cmVQcm9qZWN0aW9ufSx0KX0scGQucHJvdG90eXBlLmdldExhc3RFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scGQucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gcigpfSxwZC5wcm90b3R5cGUucmVhZEZlYXR1cmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigpfSxwZC5wcm90b3R5cGUucmVhZEZlYXR1cmVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoKX0scGQucHJvdG90eXBlLnJlYWRHZW9tZXRyeT1mdW5jdGlvbih0LGUpe3JldHVybiByKCl9LHBkLnByb3RvdHlwZS5yZWFkUHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gcigpfSxwZC5wcm90b3R5cGUud3JpdGVGZWF0dXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoKX0scGQucHJvdG90eXBlLndyaXRlRmVhdHVyZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigpfSxwZC5wcm90b3R5cGUud3JpdGVHZW9tZXRyeT1mdW5jdGlvbih0LGUpe3JldHVybiByKCl9O3ZhciBjZD1wZDtmdW5jdGlvbiBkZCh0LGUsaSl7dmFyIHIsbj1pP0VlKGkuZmVhdHVyZVByb2plY3Rpb24pOm51bGwsbz1pP0VlKGkuZGF0YVByb2plY3Rpb24pOm51bGw7aWYocj1uJiZvJiYhSWUobixvKT9BcnJheS5pc0FycmF5KHQpP2JlKHQsbyxuKTooZT90LmNsb25lKCk6dCkudHJhbnNmb3JtKGU/bjpvLGU/bzpuKTp0LGUmJmkmJnZvaWQgMCE9PWkuZGVjaW1hbHMmJiFBcnJheS5pc0FycmF5KHIpKXt2YXIgcz1NYXRoLnBvdygxMCxpLmRlY2ltYWxzKTtyPT09dCYmKHI9dC5jbG9uZSgpKSxyLmFwcGx5VHJhbnNmb3JtKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSl0W2VdPU1hdGgucm91bmQodFtlXSpzKS9zO3JldHVybiB0fSl9cmV0dXJuIHJ9ZnVuY3Rpb24gZmQodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgZT1KU09OLnBhcnNlKHQpO3JldHVybiBlfHxudWxsfXJldHVybiBudWxsIT09dD90Om51bGx9dmFyIF9kPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gSGwuSlNPTn0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZWFkRmVhdHVyZUZyb21PYmplY3QoZmQodCksdGhpcy5nZXRSZWFkT3B0aW9ucyh0LGUpKX0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVhZEZlYXR1cmVzRnJvbU9iamVjdChmZCh0KSx0aGlzLmdldFJlYWRPcHRpb25zKHQsZSkpfSxlLnByb3RvdHlwZS5yZWFkRmVhdHVyZUZyb21PYmplY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS5yZWFkRmVhdHVyZXNGcm9tT2JqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUucmVhZEdlb21ldHJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVhZEdlb21ldHJ5RnJvbU9iamVjdChmZCh0KSx0aGlzLmdldFJlYWRPcHRpb25zKHQsZSkpfSxlLnByb3RvdHlwZS5yZWFkR2VvbWV0cnlGcm9tT2JqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUucmVhZFByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVhZFByb2plY3Rpb25Gcm9tT2JqZWN0KGZkKHQpKX0sZS5wcm90b3R5cGUucmVhZFByb2plY3Rpb25Gcm9tT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiByKCl9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZT1mdW5jdGlvbih0LGUpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLndyaXRlRmVhdHVyZU9iamVjdCh0LGUpKX0sZS5wcm90b3R5cGUud3JpdGVGZWF0dXJlT2JqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUud3JpdGVGZWF0dXJlcz1mdW5jdGlvbih0LGUpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLndyaXRlRmVhdHVyZXNPYmplY3QodCxlKSl9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZXNPYmplY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS53cml0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMud3JpdGVHZW9tZXRyeU9iamVjdCh0LGUpKX0sZS5wcm90b3R5cGUud3JpdGVHZW9tZXRyeU9iamVjdD1mdW5jdGlvbih0LGUpe3JldHVybiByKCl9LGV9KGNkKSxnZD17fTtnZFtOdC5QT0lOVF09ZnVuY3Rpb24odCl7dmFyIGU7ZT12b2lkIDAhPT10Lm0mJnZvaWQgMCE9PXQuej9uZXcgY2koW3QueCx0LnksdC56LHQubV0sQXQuWFlaTSk6dm9pZCAwIT09dC56P25ldyBjaShbdC54LHQueSx0LnpdLEF0LlhZWik6dm9pZCAwIT09dC5tP25ldyBjaShbdC54LHQueSx0Lm1dLEF0LlhZTSk6bmV3IGNpKFt0LngsdC55XSk7cmV0dXJuIGV9LGdkW050LkxJTkVfU1RSSU5HXT1mdW5jdGlvbih0KXt2YXIgZT1tZCh0KTtyZXR1cm4gbmV3IGhyKHQucGF0aHNbMF0sZSl9LGdkW050LlBPTFlHT05dPWZ1bmN0aW9uKHQpe3ZhciBlPW1kKHQpO3JldHVybiBuZXcgSWkodC5yaW5ncyxlKX0sZ2RbTnQuTVVMVElfUE9JTlRdPWZ1bmN0aW9uKHQpe3ZhciBlPW1kKHQpO3JldHVybiBuZXcgYmModC5wb2ludHMsZSl9LGdkW050Lk1VTFRJX0xJTkVfU1RSSU5HXT1mdW5jdGlvbih0KXt2YXIgZT1tZCh0KTtyZXR1cm4gbmV3IFBjKHQucGF0aHMsZSl9LGdkW050Lk1VTFRJX1BPTFlHT05dPWZ1bmN0aW9uKHQpe3ZhciBlPW1kKHQpO3JldHVybiBuZXcgRmModC5yaW5ncyxlKX07dmFyIHlkPXt9O2Z1bmN0aW9uIHZkKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGk7aWYoIm51bWJlciI9PXR5cGVvZiB0LngmJiJudW1iZXIiPT10eXBlb2YgdC55KWk9TnQuUE9JTlQ7ZWxzZSBpZih0LnBvaW50cylpPU50Lk1VTFRJX1BPSU5UO2Vsc2UgaWYodC5wYXRocyl7aT0xPT09dC5wYXRocy5sZW5ndGg/TnQuTElORV9TVFJJTkc6TnQuTVVMVElfTElORV9TVFJJTkd9ZWxzZSBpZih0LnJpbmdzKXt2YXIgcj10LG49bWQociksbz1mdW5jdGlvbih0LGUpe3ZhciBpLHIsbj1bXSxvPVtdLHM9W107Zm9yKGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpe24ubGVuZ3RoPTAsZWkobiwwLHRbaV0sZS5sZW5ndGgpO3ZhciBhPVNpKG4sMCxuLmxlbmd0aCxlLmxlbmd0aCk7YT9vLnB1c2goW3RbaV1dKTpzLnB1c2godFtpXSl9Zm9yKDtzLmxlbmd0aDspe3ZhciBoPXMuc2hpZnQoKSxsPSExO2ZvcihpPW8ubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciB1PW9baV1bMF0scD1vdChuZXcgcGkodSkuZ2V0RXh0ZW50KCksbmV3IHBpKGgpLmdldEV4dGVudCgpKTtpZihwKXtvW2ldLnB1c2goaCksbD0hMDticmVha319bHx8by5wdXNoKFtoLnJldmVyc2UoKV0pfXJldHVybiBvfShyLnJpbmdzLG4pOzE9PT1vLmxlbmd0aD8oaT1OdC5QT0xZR09OLHQucmluZ3M9b1swXSk6KGk9TnQuTVVMVElfUE9MWUdPTix0LnJpbmdzPW8pfXJldHVybiBkZCgoMCxnZFtpXSkodCksITEsZSl9ZnVuY3Rpb24gbWQodCl7dmFyIGU9QXQuWFk7cmV0dXJuITA9PT10Lmhhc1omJiEwPT09dC5oYXNNP2U9QXQuWFlaTTohMD09PXQuaGFzWj9lPUF0LlhZWjohMD09PXQuaGFzTSYmKGU9QXQuWFlNKSxlfWZ1bmN0aW9uIHhkKHQpe3ZhciBlPXQuZ2V0TGF5b3V0KCk7cmV0dXJue2hhc1o6ZT09PUF0LlhZWnx8ZT09PUF0LlhZWk0saGFzTTplPT09QXQuWFlNfHxlPT09QXQuWFlaTX19ZnVuY3Rpb24gRWQodCxlKXtyZXR1cm4oMCx5ZFt0LmdldFR5cGUoKV0pKGRkKHQsITAsZSksZSl9eWRbTnQuUE9JTlRdPWZ1bmN0aW9uKHQsZSl7dmFyIGkscj10LmdldENvb3JkaW5hdGVzKCksbj10LmdldExheW91dCgpO249PT1BdC5YWVo/aT17eDpyWzBdLHk6clsxXSx6OnJbMl19Om49PT1BdC5YWU0/aT17eDpyWzBdLHk6clsxXSxtOnJbMl19Om49PT1BdC5YWVpNP2k9e3g6clswXSx5OnJbMV0sejpyWzJdLG06clszXX06bj09PUF0LlhZP2k9e3g6clswXSx5OnJbMV19OlkoITEsMzQpO3JldHVybiBpfSx5ZFtOdC5MSU5FX1NUUklOR109ZnVuY3Rpb24odCxlKXt2YXIgaT10LHI9eGQoaSk7cmV0dXJue2hhc1o6ci5oYXNaLGhhc006ci5oYXNNLHBhdGhzOltpLmdldENvb3JkaW5hdGVzKCldfX0seWRbTnQuUE9MWUdPTl09ZnVuY3Rpb24odCxlKXt2YXIgaT10LHI9eGQoaSk7cmV0dXJue2hhc1o6ci5oYXNaLGhhc006ci5oYXNNLHJpbmdzOmkuZ2V0Q29vcmRpbmF0ZXMoITEpfX0seWRbTnQuTVVMVElfUE9JTlRdPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dCxyPXhkKGkpO3JldHVybntoYXNaOnIuaGFzWixoYXNNOnIuaGFzTSxwb2ludHM6aS5nZXRDb29yZGluYXRlcygpfX0seWRbTnQuTVVMVElfTElORV9TVFJJTkddPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dCxyPXhkKGkpO3JldHVybntoYXNaOnIuaGFzWixoYXNNOnIuaGFzTSxwYXRoczppLmdldENvb3JkaW5hdGVzKCl9fSx5ZFtOdC5NVUxUSV9QT0xZR09OXT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT14ZCh0KSxyPXQuZ2V0Q29vcmRpbmF0ZXMoITEpLG49W10sbz0wO288ci5sZW5ndGg7bysrKWZvcih2YXIgcz1yW29dLmxlbmd0aC0xO3M+PTA7cy0tKW4ucHVzaChyW29dW3NdKTtyZXR1cm57aGFzWjppLmhhc1osaGFzTTppLmhhc00scmluZ3M6bn19O3ZhciBTZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9O3QuY2FsbCh0aGlzKSx0aGlzLmdlb21ldHJ5TmFtZV89aS5nZW9tZXRyeU5hbWV9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnJlYWRGZWF0dXJlRnJvbU9iamVjdD1mdW5jdGlvbih0LGUpe3ZhciBpPXQscj12ZChpLmdlb21ldHJ5LGUpLG49bmV3IEI7cmV0dXJuIHRoaXMuZ2VvbWV0cnlOYW1lXyYmbi5zZXRHZW9tZXRyeU5hbWUodGhpcy5nZW9tZXRyeU5hbWVfKSxuLnNldEdlb21ldHJ5KHIpLGUmJmUuaWRGaWVsZCYmaS5hdHRyaWJ1dGVzW2UuaWRGaWVsZF0mJm4uc2V0SWQoaS5hdHRyaWJ1dGVzW2UuaWRGaWVsZF0pLGkuYXR0cmlidXRlcyYmbi5zZXRQcm9wZXJ0aWVzKGkuYXR0cmlidXRlcyksbn0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVzRnJvbU9iamVjdD1mdW5jdGlvbih0LGUpe3ZhciBpPWV8fHt9O2lmKHQuZmVhdHVyZXMpe3ZhciByPVtdLG49dC5mZWF0dXJlcztpLmlkRmllbGQ9dC5vYmplY3RJZEZpZWxkTmFtZTtmb3IodmFyIG89MCxzPW4ubGVuZ3RoO288czsrK28pci5wdXNoKHRoaXMucmVhZEZlYXR1cmVGcm9tT2JqZWN0KG5bb10saSkpO3JldHVybiByfXJldHVyblt0aGlzLnJlYWRGZWF0dXJlRnJvbU9iamVjdCh0LGkpXX0sZS5wcm90b3R5cGUucmVhZEdlb21ldHJ5RnJvbU9iamVjdD1mdW5jdGlvbih0LGUpe3JldHVybiB2ZCh0LGUpfSxlLnByb3RvdHlwZS5yZWFkUHJvamVjdGlvbkZyb21PYmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3BhdGlhbFJlZmVyZW5jZSYmdm9pZCAwIT09dC5zcGF0aWFsUmVmZXJlbmNlLndraWQ/RWUoIkVQU0c6Iit0LnNwYXRpYWxSZWZlcmVuY2Uud2tpZCk6bnVsbH0sZS5wcm90b3R5cGUud3JpdGVHZW9tZXRyeU9iamVjdD1mdW5jdGlvbih0LGUpe3JldHVybiBFZCh0LHRoaXMuYWRhcHRPcHRpb25zKGUpKX0sZS5wcm90b3R5cGUud3JpdGVGZWF0dXJlT2JqZWN0PWZ1bmN0aW9uKHQsZSl7ZT10aGlzLmFkYXB0T3B0aW9ucyhlKTt2YXIgaT17fSxyPXQuZ2V0R2VvbWV0cnkoKTtyJiYoaS5nZW9tZXRyeT1FZChyLGUpLGUmJmUuZmVhdHVyZVByb2plY3Rpb24mJihpLmdlb21ldHJ5LnNwYXRpYWxSZWZlcmVuY2U9e3draWQ6TnVtYmVyKEVlKGUuZmVhdHVyZVByb2plY3Rpb24pLmdldENvZGUoKS5zcGxpdCgiOiIpLnBvcCgpKX0pKTt2YXIgbj10LmdldFByb3BlcnRpZXMoKTtyZXR1cm4gZGVsZXRlIG5bdC5nZXRHZW9tZXRyeU5hbWUoKV0sZChuKT9pLmF0dHJpYnV0ZXM9e306aS5hdHRyaWJ1dGVzPW4saX0sZS5wcm90b3R5cGUud3JpdGVGZWF0dXJlc09iamVjdD1mdW5jdGlvbih0LGUpe2U9dGhpcy5hZGFwdE9wdGlvbnMoZSk7Zm9yKHZhciBpPVtdLHI9MCxuPXQubGVuZ3RoO3I8bjsrK3IpaS5wdXNoKHRoaXMud3JpdGVGZWF0dXJlT2JqZWN0KHRbcl0sZSkpO3JldHVybntmZWF0dXJlczppfX0sZX0oX2QpLFRkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy54bWxTZXJpYWxpemVyXz1uZXcgWE1MU2VyaWFsaXplcn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiBIbC5YTUx9LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgaT1ydSh0KTtyZXR1cm4gdGhpcy5yZWFkRmVhdHVyZUZyb21Eb2N1bWVudChpLGUpfXJldHVybiBpdSh0KT90aGlzLnJlYWRGZWF0dXJlRnJvbURvY3VtZW50KHQsZSk6dGhpcy5yZWFkRmVhdHVyZUZyb21Ob2RlKHQsZSl9cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlRnJvbURvY3VtZW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5yZWFkRmVhdHVyZXNGcm9tRG9jdW1lbnQodCxlKTtyZXR1cm4gaS5sZW5ndGg+MD9pWzBdOm51bGx9LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlRnJvbU5vZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVzPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgaT1ydSh0KTtyZXR1cm4gdGhpcy5yZWFkRmVhdHVyZXNGcm9tRG9jdW1lbnQoaSxlKX1yZXR1cm4gaXUodCk/dGhpcy5yZWFkRmVhdHVyZXNGcm9tRG9jdW1lbnQodCxlKTp0aGlzLnJlYWRGZWF0dXJlc0Zyb21Ob2RlKHQsZSl9cmV0dXJuW119LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlc0Zyb21Eb2N1bWVudD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1bXSxyPXQuZmlyc3RDaGlsZDtyO3I9ci5uZXh0U2libGluZylyLm5vZGVUeXBlPT1Ob2RlLkVMRU1FTlRfTk9ERSYmSyhpLHRoaXMucmVhZEZlYXR1cmVzRnJvbU5vZGUocixlKSk7cmV0dXJuIGl9LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlc0Zyb21Ob2RlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUucmVhZEdlb21ldHJ5PWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgaT1ydSh0KTtyZXR1cm4gdGhpcy5yZWFkR2VvbWV0cnlGcm9tRG9jdW1lbnQoaSxlKX1yZXR1cm4gaXUodCk/dGhpcy5yZWFkR2VvbWV0cnlGcm9tRG9jdW1lbnQodCxlKTp0aGlzLnJlYWRHZW9tZXRyeUZyb21Ob2RlKHQsZSl9cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLnJlYWRHZW9tZXRyeUZyb21Eb2N1bWVudD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsfSxlLnByb3RvdHlwZS5yZWFkR2VvbWV0cnlGcm9tTm9kZT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsfSxlLnByb3RvdHlwZS5yZWFkUHJvamVjdGlvbj1mdW5jdGlvbih0KXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBlPXJ1KHQpO3JldHVybiB0aGlzLnJlYWRQcm9qZWN0aW9uRnJvbURvY3VtZW50KGUpfXJldHVybiBpdSh0KT90aGlzLnJlYWRQcm9qZWN0aW9uRnJvbURvY3VtZW50KHQpOnRoaXMucmVhZFByb2plY3Rpb25Gcm9tTm9kZSh0KX1yZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUucmVhZFByb2plY3Rpb25Gcm9tRG9jdW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVByb2plY3Rpb259LGUucHJvdG90eXBlLnJlYWRQcm9qZWN0aW9uRnJvbU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVByb2plY3Rpb259LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMud3JpdGVGZWF0dXJlTm9kZSh0LGUpO3JldHVybiB0aGlzLnhtbFNlcmlhbGl6ZXJfLnNlcmlhbGl6ZVRvU3RyaW5nKGkpfSxlLnByb3RvdHlwZS53cml0ZUZlYXR1cmVOb2RlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZXM9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLndyaXRlRmVhdHVyZXNOb2RlKHQsZSk7cmV0dXJuIHRoaXMueG1sU2VyaWFsaXplcl8uc2VyaWFsaXplVG9TdHJpbmcoaSl9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZXNOb2RlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLndyaXRlR2VvbWV0cnk9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLndyaXRlR2VvbWV0cnlOb2RlKHQsZSk7cmV0dXJuIHRoaXMueG1sU2VyaWFsaXplcl8uc2VyaWFsaXplVG9TdHJpbmcoaSl9LGUucHJvdG90eXBlLndyaXRlR2VvbWV0cnlOb2RlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGx9LGV9KGNkKSxDZD0iaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiLFJkPS9eW1xzXHhhMF0qJC8sd2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyk7dmFyIGk9ZXx8e307dGhpcy5mZWF0dXJlVHlwZT1pLmZlYXR1cmVUeXBlLHRoaXMuZmVhdHVyZU5TPWkuZmVhdHVyZU5TLHRoaXMuc3JzTmFtZT1pLnNyc05hbWUsdGhpcy5zY2hlbWFMb2NhdGlvbj0iIix0aGlzLkZFQVRVUkVfQ09MTEVDVElPTl9QQVJTRVJTPXt9LHRoaXMuRkVBVFVSRV9DT0xMRUNUSU9OX1BBUlNFUlNbdGhpcy5uYW1lc3BhY2VdPXtmZWF0dXJlTWVtYmVyOm91KHRoaXMucmVhZEZlYXR1cmVzSW50ZXJuYWwpLGZlYXR1cmVNZW1iZXJzOnN1KHRoaXMucmVhZEZlYXR1cmVzSW50ZXJuYWwpfX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUucmVhZEZlYXR1cmVzSW50ZXJuYWw9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmxvY2FsTmFtZSxyPW51bGw7aWYoIkZlYXR1cmVDb2xsZWN0aW9uIj09aSlyPWd1KFtdLHRoaXMuRkVBVFVSRV9DT0xMRUNUSU9OX1BBUlNFUlMsdCxlLHRoaXMpO2Vsc2UgaWYoImZlYXR1cmVNZW1iZXJzIj09aXx8ImZlYXR1cmVNZW1iZXIiPT1pKXt2YXIgbj1lWzBdLG89bi5mZWF0dXJlVHlwZSxzPW4uZmVhdHVyZU5TO2lmKCFvJiZ0LmNoaWxkTm9kZXMpe289W10scz17fTtmb3IodmFyIGE9MCxoPXQuY2hpbGROb2Rlcy5sZW5ndGg7YTxoOysrYSl7dmFyIGw9dC5jaGlsZE5vZGVzW2FdO2lmKDE9PT1sLm5vZGVUeXBlKXt2YXIgdT1sLm5vZGVOYW1lLnNwbGl0KCI6IikucG9wKCk7aWYoLTE9PT1vLmluZGV4T2YodSkpe3ZhciBwPSIiLGM9MCxkPWwubmFtZXNwYWNlVVJJO2Zvcih2YXIgZiBpbiBzKXtpZihzW2ZdPT09ZCl7cD1mO2JyZWFrfSsrY31wfHwoc1twPSJwIitjXT1kKSxvLnB1c2gocCsiOiIrdSl9fX0iZmVhdHVyZU1lbWJlciIhPWkmJihuLmZlYXR1cmVUeXBlPW8sbi5mZWF0dXJlTlM9cyl9aWYoInN0cmluZyI9PXR5cGVvZiBzKXt2YXIgXz1zOyhzPXt9KS5wMD1ffXZhciBnPXt9LHk9QXJyYXkuaXNBcnJheShvKT9vOltvXTtmb3IodmFyIHYgaW4gcyl7Zm9yKHZhciBtPXt9LHg9MCxFPXkubGVuZ3RoO3g8RTsrK3gpeygtMT09PXlbeF0uaW5kZXhPZigiOiIpPyJwMCI6eVt4XS5zcGxpdCgiOiIpWzBdKT09PXYmJihtW3lbeF0uc3BsaXQoIjoiKS5wb3AoKV09ImZlYXR1cmVNZW1iZXJzIj09aT9vdSh0aGlzLnJlYWRGZWF0dXJlRWxlbWVudCx0aGlzKTpzdSh0aGlzLnJlYWRGZWF0dXJlRWxlbWVudCx0aGlzKSl9Z1tzW3ZdXT1tfXI9Z3UoImZlYXR1cmVNZW1iZXIiPT1pP3ZvaWQgMDpbXSxnLHQsZSl9cmV0dXJuIG51bGw9PT1yJiYocj1bXSkscn0sZS5wcm90b3R5cGUucmVhZEdlb21ldHJ5RWxlbWVudD1mdW5jdGlvbih0LGUpe3ZhciBpPWVbMF07aS5zcnNOYW1lPXQuZmlyc3RFbGVtZW50Q2hpbGQuZ2V0QXR0cmlidXRlKCJzcnNOYW1lIiksaS5zcnNEaW1lbnNpb249dC5maXJzdEVsZW1lbnRDaGlsZC5nZXRBdHRyaWJ1dGUoInNyc0RpbWVuc2lvbiIpO3ZhciByPWd1KG51bGwsdGhpcy5HRU9NRVRSWV9QQVJTRVJTLHQsZSx0aGlzKTtyZXR1cm4gcj9kZChyLCExLGkpOnZvaWQgMH0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVFbGVtZW50SW50ZXJuYWw9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgcixuPXt9LG89dC5maXJzdEVsZW1lbnRDaGlsZDtvO289by5uZXh0RWxlbWVudFNpYmxpbmcpe3ZhciBzPXZvaWQgMCxhPW8ubG9jYWxOYW1lOzA9PT1vLmNoaWxkTm9kZXMubGVuZ3RofHwxPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKDM9PT1vLmZpcnN0Q2hpbGQubm9kZVR5cGV8fDQ9PT1vLmZpcnN0Q2hpbGQubm9kZVR5cGUpPyhzPWV1KG8sITEpLFJkLnRlc3QocykmJihzPXZvaWQgMCkpOihpJiYocz10aGlzLnJlYWRHZW9tZXRyeUVsZW1lbnQobyxlKSkscz8iYm91bmRlZEJ5IiE9PWEmJihyPWEpOnM9dGhpcy5yZWFkRmVhdHVyZUVsZW1lbnRJbnRlcm5hbChvLGUsITEpKSxuW2FdPyhuW2FdaW5zdGFuY2VvZiBBcnJheXx8KG5bYV09W25bYV1dKSxuW2FdLnB1c2gocykpOm5bYV09czt2YXIgaD1vLmF0dHJpYnV0ZXMubGVuZ3RoO2lmKGg+MCl7blthXT17X2NvbnRlbnRfOm5bYV19O2Zvcih2YXIgbD0wO2w8aDtsKyspe3ZhciB1PW8uYXR0cmlidXRlc1tsXS5uYW1lO25bYV1bdV09by5hdHRyaWJ1dGVzW2xdLnZhbHVlfX19aWYoaSl7dmFyIHA9bmV3IEIobik7ciYmcC5zZXRHZW9tZXRyeU5hbWUocik7dmFyIGM9dC5nZXRBdHRyaWJ1dGUoImZpZCIpfHxmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlTlMoZSxpKXx8IiJ9KHQsdGhpcy5uYW1lc3BhY2UsImlkIik7cmV0dXJuIGMmJnAuc2V0SWQoYykscH1yZXR1cm4gbn0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVFbGVtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVhZEZlYXR1cmVFbGVtZW50SW50ZXJuYWwodCxlLCEwKX0sZS5wcm90b3R5cGUucmVhZFBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5yZWFkRmxhdENvb3JkaW5hdGVzRnJvbU5vZGVfKHQsZSk7aWYoaSlyZXR1cm4gbmV3IGNpKGksQXQuWFlaKX0sZS5wcm90b3R5cGUucmVhZE11bHRpUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT1ndShbXSx0aGlzLk1VTFRJUE9JTlRfUEFSU0VSU18sdCxlLHRoaXMpO3JldHVybiBpP25ldyBiYyhpKTp2b2lkIDB9LGUucHJvdG90eXBlLnJlYWRNdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgaT1ndShbXSx0aGlzLk1VTFRJTElORVNUUklOR19QQVJTRVJTXyx0LGUsdGhpcyk7aWYoaSlyZXR1cm4gbmV3IFBjKGkpfSxlLnByb3RvdHlwZS5yZWFkTXVsdGlQb2x5Z29uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3UoW10sdGhpcy5NVUxUSVBPTFlHT05fUEFSU0VSU18sdCxlLHRoaXMpO2lmKGkpcmV0dXJuIG5ldyBGYyhpKX0sZS5wcm90b3R5cGUucG9pbnRNZW1iZXJQYXJzZXJfPWZ1bmN0aW9uKHQsZSl7X3UodGhpcy5QT0lOVE1FTUJFUl9QQVJTRVJTXyx0LGUsdGhpcyl9LGUucHJvdG90eXBlLmxpbmVTdHJpbmdNZW1iZXJQYXJzZXJfPWZ1bmN0aW9uKHQsZSl7X3UodGhpcy5MSU5FU1RSSU5HTUVNQkVSX1BBUlNFUlNfLHQsZSx0aGlzKX0sZS5wcm90b3R5cGUucG9seWdvbk1lbWJlclBhcnNlcl89ZnVuY3Rpb24odCxlKXtfdSh0aGlzLlBPTFlHT05NRU1CRVJfUEFSU0VSU18sdCxlLHRoaXMpfSxlLnByb3RvdHlwZS5yZWFkTGluZVN0cmluZz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMucmVhZEZsYXRDb29yZGluYXRlc0Zyb21Ob2RlXyh0LGUpO3JldHVybiBpP25ldyBocihpLEF0LlhZWik6dm9pZCAwfSxlLnByb3RvdHlwZS5yZWFkRmxhdExpbmVhclJpbmdfPWZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3UobnVsbCx0aGlzLkdFT01FVFJZX0ZMQVRfQ09PUkRJTkFURVNfUEFSU0VSUyx0LGUsdGhpcyk7cmV0dXJuIGl8fHZvaWQgMH0sZS5wcm90b3R5cGUucmVhZExpbmVhclJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnJlYWRGbGF0Q29vcmRpbmF0ZXNGcm9tTm9kZV8odCxlKTtpZihpKXJldHVybiBuZXcgcGkoaSxBdC5YWVopfSxlLnByb3RvdHlwZS5yZWFkUG9seWdvbj1mdW5jdGlvbih0LGUpe3ZhciBpPWd1KFtudWxsXSx0aGlzLkZMQVRfTElORUFSX1JJTkdTX1BBUlNFUlMsdCxlLHRoaXMpO2lmKGkmJmlbMF0pe3ZhciByLG4sbz1pWzBdLHM9W28ubGVuZ3RoXTtmb3Iocj0xLG49aS5sZW5ndGg7cjxuOysrcilLKG8saVtyXSkscy5wdXNoKG8ubGVuZ3RoKTtyZXR1cm4gbmV3IElpKG8sQXQuWFlaLHMpfX0sZS5wcm90b3R5cGUucmVhZEZsYXRDb29yZGluYXRlc0Zyb21Ob2RlXz1mdW5jdGlvbih0LGUpe3JldHVybiBndShudWxsLHRoaXMuR0VPTUVUUllfRkxBVF9DT09SRElOQVRFU19QQVJTRVJTLHQsZSx0aGlzKX0sZS5wcm90b3R5cGUucmVhZEdlb21ldHJ5RnJvbU5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnJlYWRHZW9tZXRyeUVsZW1lbnQodCxbdGhpcy5nZXRSZWFkT3B0aW9ucyh0LGV8fHt9KV0pO3JldHVybiBpfHxudWxsfSxlLnByb3RvdHlwZS5yZWFkRmVhdHVyZXNGcm9tTm9kZT1mdW5jdGlvbih0LGUpe3ZhciBpPXtmZWF0dXJlVHlwZTp0aGlzLmZlYXR1cmVUeXBlLGZlYXR1cmVOUzp0aGlzLmZlYXR1cmVOU307cmV0dXJuIGUmJnUoaSx0aGlzLmdldFJlYWRPcHRpb25zKHQsZSkpLHRoaXMucmVhZEZlYXR1cmVzSW50ZXJuYWwodCxbaV0pfHxbXX0sZS5wcm90b3R5cGUucmVhZFByb2plY3Rpb25Gcm9tTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gRWUodGhpcy5zcnNOYW1lP3RoaXMuc3JzTmFtZTp0LmZpcnN0RWxlbWVudENoaWxkLmdldEF0dHJpYnV0ZSgic3JzTmFtZSIpKX0sZX0oVGQpO3dkLnByb3RvdHlwZS5uYW1lc3BhY2U9Q2Qsd2QucHJvdG90eXBlLkZMQVRfTElORUFSX1JJTkdTX1BBUlNFUlM9eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI6e319LHdkLnByb3RvdHlwZS5HRU9NRVRSWV9GTEFUX0NPT1JESU5BVEVTX1BBUlNFUlM9eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI6e319LHdkLnByb3RvdHlwZS5HRU9NRVRSWV9QQVJTRVJTPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOnt9fSx3ZC5wcm90b3R5cGUuTVVMVElQT0lOVF9QQVJTRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7cG9pbnRNZW1iZXI6b3Uod2QucHJvdG90eXBlLnBvaW50TWVtYmVyUGFyc2VyXykscG9pbnRNZW1iZXJzOm91KHdkLnByb3RvdHlwZS5wb2ludE1lbWJlclBhcnNlcl8pfX0sd2QucHJvdG90eXBlLk1VTFRJTElORVNUUklOR19QQVJTRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7bGluZVN0cmluZ01lbWJlcjpvdSh3ZC5wcm90b3R5cGUubGluZVN0cmluZ01lbWJlclBhcnNlcl8pLGxpbmVTdHJpbmdNZW1iZXJzOm91KHdkLnByb3RvdHlwZS5saW5lU3RyaW5nTWVtYmVyUGFyc2VyXyl9fSx3ZC5wcm90b3R5cGUuTVVMVElQT0xZR09OX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntwb2x5Z29uTWVtYmVyOm91KHdkLnByb3RvdHlwZS5wb2x5Z29uTWVtYmVyUGFyc2VyXykscG9seWdvbk1lbWJlcnM6b3Uod2QucHJvdG90eXBlLnBvbHlnb25NZW1iZXJQYXJzZXJfKX19LHdkLnByb3RvdHlwZS5QT0lOVE1FTUJFUl9QQVJTRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7UG9pbnQ6b3Uod2QucHJvdG90eXBlLnJlYWRGbGF0Q29vcmRpbmF0ZXNGcm9tTm9kZV8pfX0sd2QucHJvdG90eXBlLkxJTkVTVFJJTkdNRU1CRVJfUEFSU0VSU189eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI6e0xpbmVTdHJpbmc6b3Uod2QucHJvdG90eXBlLnJlYWRMaW5lU3RyaW5nKX19LHdkLnByb3RvdHlwZS5QT0xZR09OTUVNQkVSX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntQb2x5Z29uOm91KHdkLnByb3RvdHlwZS5yZWFkUG9seWdvbil9fSx3ZC5wcm90b3R5cGUuUklOR19QQVJTRVJTPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntMaW5lYXJSaW5nOnN1KHdkLnByb3RvdHlwZS5yZWFkRmxhdExpbmVhclJpbmdfKX19O3ZhciBJZD13ZDtmdW5jdGlvbiBMZCh0KXtyZXR1cm4gT2QoZXUodCwhMSkpfWZ1bmN0aW9uIE9kKHQpe3ZhciBlPS9eXHMqKHRydWV8MSl8KGZhbHNlfDApXHMqJC8uZXhlYyh0KTtyZXR1cm4gZT92b2lkIDAhPT1lWzFdfHwhMTp2b2lkIDB9ZnVuY3Rpb24gUGQodCl7dmFyIGU9ZXUodCwhMSksaT1EYXRlLnBhcnNlKGUpO3JldHVybiBpc05hTihpKT92b2lkIDA6aS8xZTN9ZnVuY3Rpb24gYmQodCl7cmV0dXJuIE1kKGV1KHQsITEpKX1mdW5jdGlvbiBNZCh0KXt2YXIgZT0vXlxzKihbK1wtXT9cZCpcLj9cZCsoPzplWytcLV0/XGQrKT8pXHMqJC9pLmV4ZWModCk7cmV0dXJuIGU/cGFyc2VGbG9hdChlWzFdKTp2b2lkIDB9ZnVuY3Rpb24gRmQodCl7cmV0dXJuIEFkKGV1KHQsITEpKX1mdW5jdGlvbiBBZCh0KXt2YXIgZT0vXlxzKihcZCspXHMqJC8uZXhlYyh0KTtyZXR1cm4gZT9wYXJzZUludChlWzFdLDEwKTp2b2lkIDB9ZnVuY3Rpb24gTmQodCl7cmV0dXJuIGV1KHQsITEpLnRyaW0oKX1mdW5jdGlvbiBHZCh0LGUpe2pkKHQsZT8iMSI6IjAiKX1mdW5jdGlvbiBEZCh0LGUpe3ZhciBpPWUudG9QcmVjaXNpb24oKTt0LmFwcGVuZENoaWxkKFFsLmNyZWF0ZVRleHROb2RlKGkpKX1mdW5jdGlvbiBrZCh0LGUpe3ZhciBpPWUudG9TdHJpbmcoKTt0LmFwcGVuZENoaWxkKFFsLmNyZWF0ZVRleHROb2RlKGkpKX1mdW5jdGlvbiBqZCh0LGUpe3QuYXBwZW5kQ2hpbGQoUWwuY3JlYXRlVGV4dE5vZGUoZSkpfXZhciBVZD1DZCsiIGh0dHA6Ly9zY2hlbWFzLm9wZW5naXMubmV0L2dtbC8zLjEuMS9wcm9maWxlcy9nbWxzZlByb2ZpbGUvMS4wLjAvZ21sc2YueHNkIixZZD17TXVsdGlMaW5lU3RyaW5nOiJsaW5lU3RyaW5nTWVtYmVyIixNdWx0aUN1cnZlOiJjdXJ2ZU1lbWJlciIsTXVsdGlQb2x5Z29uOiJwb2x5Z29uTWVtYmVyIixNdWx0aVN1cmZhY2U6InN1cmZhY2VNZW1iZXIifSxCZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9O3QuY2FsbCh0aGlzLGkpLHRoaXMuc3VyZmFjZV89dm9pZCAwIT09aS5zdXJmYWNlJiZpLnN1cmZhY2UsdGhpcy5jdXJ2ZV89dm9pZCAwIT09aS5jdXJ2ZSYmaS5jdXJ2ZSx0aGlzLm11bHRpQ3VydmVfPXZvaWQgMD09PWkubXVsdGlDdXJ2ZXx8aS5tdWx0aUN1cnZlLHRoaXMubXVsdGlTdXJmYWNlXz12b2lkIDA9PT1pLm11bHRpU3VyZmFjZXx8aS5tdWx0aVN1cmZhY2UsdGhpcy5zY2hlbWFMb2NhdGlvbj1pLnNjaGVtYUxvY2F0aW9uP2kuc2NoZW1hTG9jYXRpb246VWQsdGhpcy5oYXNaPXZvaWQgMCE9PWkuaGFzWiYmaS5oYXNafXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5yZWFkTXVsdGlDdXJ2ZV89ZnVuY3Rpb24odCxlKXt2YXIgaT1ndShbXSx0aGlzLk1VTFRJQ1VSVkVfUEFSU0VSU18sdCxlLHRoaXMpO3JldHVybiBpP25ldyBQYyhpKTp2b2lkIDB9LGUucHJvdG90eXBlLnJlYWRNdWx0aVN1cmZhY2VfPWZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3UoW10sdGhpcy5NVUxUSVNVUkZBQ0VfUEFSU0VSU18sdCxlLHRoaXMpO2lmKGkpcmV0dXJuIG5ldyBGYyhpKX0sZS5wcm90b3R5cGUuY3VydmVNZW1iZXJQYXJzZXJfPWZ1bmN0aW9uKHQsZSl7X3UodGhpcy5DVVJWRU1FTUJFUl9QQVJTRVJTXyx0LGUsdGhpcyl9LGUucHJvdG90eXBlLnN1cmZhY2VNZW1iZXJQYXJzZXJfPWZ1bmN0aW9uKHQsZSl7X3UodGhpcy5TVVJGQUNFTUVNQkVSX1BBUlNFUlNfLHQsZSx0aGlzKX0sZS5wcm90b3R5cGUucmVhZFBhdGNoXz1mdW5jdGlvbih0LGUpe3JldHVybiBndShbbnVsbF0sdGhpcy5QQVRDSEVTX1BBUlNFUlNfLHQsZSx0aGlzKX0sZS5wcm90b3R5cGUucmVhZFNlZ21lbnRfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KFtudWxsXSx0aGlzLlNFR01FTlRTX1BBUlNFUlNfLHQsZSx0aGlzKX0sZS5wcm90b3R5cGUucmVhZFBvbHlnb25QYXRjaF89ZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3UoW251bGxdLHRoaXMuRkxBVF9MSU5FQVJfUklOR1NfUEFSU0VSUyx0LGUsdGhpcyl9LGUucHJvdG90eXBlLnJlYWRMaW5lU3RyaW5nU2VnbWVudF89ZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3UoW251bGxdLHRoaXMuR0VPTUVUUllfRkxBVF9DT09SRElOQVRFU19QQVJTRVJTLHQsZSx0aGlzKX0sZS5wcm90b3R5cGUuaW50ZXJpb3JQYXJzZXJfPWZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3Uodm9pZCAwLHRoaXMuUklOR19QQVJTRVJTLHQsZSx0aGlzKTtpJiZlW2UubGVuZ3RoLTFdLnB1c2goaSl9LGUucHJvdG90eXBlLmV4dGVyaW9yUGFyc2VyXz1mdW5jdGlvbih0LGUpe3ZhciBpPWd1KHZvaWQgMCx0aGlzLlJJTkdfUEFSU0VSUyx0LGUsdGhpcyk7aSYmKGVbZS5sZW5ndGgtMV1bMF09aSl9LGUucHJvdG90eXBlLnJlYWRTdXJmYWNlXz1mdW5jdGlvbih0LGUpe3ZhciBpPWd1KFtudWxsXSx0aGlzLlNVUkZBQ0VfUEFSU0VSU18sdCxlLHRoaXMpO2lmKGkmJmlbMF0pe3ZhciByLG4sbz1pWzBdLHM9W28ubGVuZ3RoXTtmb3Iocj0xLG49aS5sZW5ndGg7cjxuOysrcilLKG8saVtyXSkscy5wdXNoKG8ubGVuZ3RoKTtyZXR1cm4gbmV3IElpKG8sQXQuWFlaLHMpfX0sZS5wcm90b3R5cGUucmVhZEN1cnZlXz1mdW5jdGlvbih0LGUpe3ZhciBpPWd1KFtudWxsXSx0aGlzLkNVUlZFX1BBUlNFUlNfLHQsZSx0aGlzKTtyZXR1cm4gaT9uZXcgaHIoaSxBdC5YWVopOnZvaWQgMH0sZS5wcm90b3R5cGUucmVhZEVudmVsb3BlXz1mdW5jdGlvbih0LGUpe3ZhciBpPWd1KFtudWxsXSx0aGlzLkVOVkVMT1BFX1BBUlNFUlNfLHQsZSx0aGlzKTtyZXR1cm4gbHQoaVsxXVswXSxpWzFdWzFdLGlbMl1bMF0saVsyXVsxXSl9LGUucHJvdG90eXBlLnJlYWRGbGF0UG9zXz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaSxyPWV1KHQsITEpLG49L15ccyooWytcLV0/XGQqXC4/XGQrKD86W2VFXVsrXC1dP1xkKyk/KVxzKi8sbz1bXTtpPW4uZXhlYyhyKTspby5wdXNoKHBhcnNlRmxvYXQoaVsxXSkpLHI9ci5zdWJzdHIoaVswXS5sZW5ndGgpO2lmKCIiPT09cil7dmFyIHMsYSxoPWVbMF0uc3JzTmFtZSxsPSJlbnUiO2lmKGgpbD1FZShoKS5nZXRBeGlzT3JpZW50YXRpb24oKTtpZigibmV1Ij09PWwpZm9yKHM9MCxhPW8ubGVuZ3RoO3M8YTtzKz0zKXt2YXIgdT1vW3NdLHA9b1tzKzFdO29bc109cCxvW3MrMV09dX12YXIgYz1vLmxlbmd0aDtpZigyPT1jJiZvLnB1c2goMCksMCE9PWMpcmV0dXJuIG99fSxlLnByb3RvdHlwZS5yZWFkRmxhdFBvc0xpc3RfPWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZXUodCwhMSkucmVwbGFjZSgvXlxzKnxccyokL2csIiIpLHI9ZVswXSxuPXIuc3JzTmFtZSxvPXIuc3JzRGltZW5zaW9uLHM9ImVudSI7biYmKHM9RWUobikuZ2V0QXhpc09yaWVudGF0aW9uKCkpO3ZhciBhLGgsbCx1PWkuc3BsaXQoL1xzKy8pLHA9Mjt0LmdldEF0dHJpYnV0ZSgic3JzRGltZW5zaW9uIik/cD1BZCh0LmdldEF0dHJpYnV0ZSgic3JzRGltZW5zaW9uIikpOnQuZ2V0QXR0cmlidXRlKCJkaW1lbnNpb24iKT9wPUFkKHQuZ2V0QXR0cmlidXRlKCJkaW1lbnNpb24iKSk6dC5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgic3JzRGltZW5zaW9uIik/cD1BZCh0LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJzcnNEaW1lbnNpb24iKSk6byYmKHA9QWQobykpO2Zvcih2YXIgYz1bXSxkPTAsZj11Lmxlbmd0aDtkPGY7ZCs9cClhPXBhcnNlRmxvYXQodVtkXSksaD1wYXJzZUZsb2F0KHVbZCsxXSksbD0zPT09cD9wYXJzZUZsb2F0KHVbZCsyXSk6MCwiZW4iPT09cy5zdWJzdHIoMCwyKT9jLnB1c2goYSxoLGwpOmMucHVzaChoLGEsbCk7cmV0dXJuIGN9LGUucHJvdG90eXBlLndyaXRlUG9zXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9aVtpLmxlbmd0aC0xXSxuPXIuaGFzWixvPW4/IjMiOiIyIjt0LnNldEF0dHJpYnV0ZSgic3JzRGltZW5zaW9uIixvKTt2YXIgcz1yLnNyc05hbWUsYT0iZW51IjtzJiYoYT1FZShzKS5nZXRBeGlzT3JpZW50YXRpb24oKSk7dmFyIGgsbD1lLmdldENvb3JkaW5hdGVzKCk7KGg9ImVuIj09PWEuc3Vic3RyKDAsMik/bFswXSsiICIrbFsxXTpsWzFdKyIgIitsWzBdLG4pJiYoaCs9IiAiKyhsWzJdfHwwKSk7amQodCxoKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRzXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9ImVudSI7ZSYmKHI9RWUoZSkuZ2V0QXhpc09yaWVudGF0aW9uKCkpO3ZhciBuPSJlbiI9PT1yLnN1YnN0cigwLDIpP3RbMF0rIiAiK3RbMV06dFsxXSsiICIrdFswXTtpJiYobis9IiAiKyh0WzJdfHwwKSk7cmV0dXJuIG59LGUucHJvdG90eXBlLndyaXRlUG9zTGlzdF89ZnVuY3Rpb24odCxlLGkpe3ZhciByPWlbaS5sZW5ndGgtMV0sbj1yLmhhc1osbz1uPyIzIjoiMiI7dC5zZXRBdHRyaWJ1dGUoInNyc0RpbWVuc2lvbiIsbyk7Zm9yKHZhciBzLGE9ci5zcnNOYW1lLGg9ZS5nZXRDb29yZGluYXRlcygpLGw9aC5sZW5ndGgsdT1uZXcgQXJyYXkobCkscD0wO3A8bDsrK3Apcz1oW3BdLHVbcF09dGhpcy5nZXRDb29yZHNfKHMsYSxuKTtqZCh0LHUuam9pbigiICIpKX0sZS5wcm90b3R5cGUud3JpdGVQb2ludF89ZnVuY3Rpb24odCxlLGkpe3ZhciByPWlbaS5sZW5ndGgtMV0uc3JzTmFtZTtyJiZ0LnNldEF0dHJpYnV0ZSgic3JzTmFtZSIscik7dmFyIG49dHUodC5uYW1lc3BhY2VVUkksInBvcyIpO3QuYXBwZW5kQ2hpbGQobiksdGhpcy53cml0ZVBvc18obixlLGkpfSxlLnByb3RvdHlwZS53cml0ZUVudmVsb3BlPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pW2kubGVuZ3RoLTFdLnNyc05hbWU7ciYmdC5zZXRBdHRyaWJ1dGUoInNyc05hbWUiLHIpO3ZhciBuPVtlWzBdKyIgIitlWzFdLGVbMl0rIiAiK2VbM11dO3Z1KHtub2RlOnR9LHRoaXMuRU5WRUxPUEVfU0VSSUFMSVpFUlNfLGN1LG4saSxbImxvd2VyQ29ybmVyIiwidXBwZXJDb3JuZXIiXSx0aGlzKX0sZS5wcm90b3R5cGUud3JpdGVMaW5lYXJSaW5nXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9aVtpLmxlbmd0aC0xXS5zcnNOYW1lO3ImJnQuc2V0QXR0cmlidXRlKCJzcnNOYW1lIixyKTt2YXIgbj10dSh0Lm5hbWVzcGFjZVVSSSwicG9zTGlzdCIpO3QuYXBwZW5kQ2hpbGQobiksdGhpcy53cml0ZVBvc0xpc3RfKG4sZSxpKX0sZS5wcm90b3R5cGUuUklOR19OT0RFX0ZBQ1RPUllfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1lW2UubGVuZ3RoLTFdLG49ci5ub2RlLG89ci5leHRlcmlvcldyaXR0ZW47cmV0dXJuIHZvaWQgMD09PW8mJihyLmV4dGVyaW9yV3JpdHRlbj0hMCksdHUobi5uYW1lc3BhY2VVUkksdm9pZCAwIT09bz8iaW50ZXJpb3IiOiJleHRlcmlvciIpfSxlLnByb3RvdHlwZS53cml0ZVN1cmZhY2VPclBvbHlnb25fPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pW2kubGVuZ3RoLTFdLG49ci5oYXNaLG89ci5zcnNOYW1lO2lmKCJQb2x5Z29uUGF0Y2giIT09dC5ub2RlTmFtZSYmbyYmdC5zZXRBdHRyaWJ1dGUoInNyc05hbWUiLG8pLCJQb2x5Z29uIj09PXQubm9kZU5hbWV8fCJQb2x5Z29uUGF0Y2giPT09dC5ub2RlTmFtZSl7dmFyIHM9ZS5nZXRMaW5lYXJSaW5ncygpO3Z1KHtub2RlOnQsaGFzWjpuLHNyc05hbWU6b30sdGhpcy5SSU5HX1NFUklBTElaRVJTXyx0aGlzLlJJTkdfTk9ERV9GQUNUT1JZXyxzLGksdm9pZCAwLHRoaXMpfWVsc2UgaWYoIlN1cmZhY2UiPT09dC5ub2RlTmFtZSl7dmFyIGE9dHUodC5uYW1lc3BhY2VVUkksInBhdGNoZXMiKTt0LmFwcGVuZENoaWxkKGEpLHRoaXMud3JpdGVTdXJmYWNlUGF0Y2hlc18oYSxlLGkpfX0sZS5wcm90b3R5cGUud3JpdGVDdXJ2ZU9yTGluZVN0cmluZ189ZnVuY3Rpb24odCxlLGkpe3ZhciByPWlbaS5sZW5ndGgtMV0uc3JzTmFtZTtpZigiTGluZVN0cmluZ1NlZ21lbnQiIT09dC5ub2RlTmFtZSYmciYmdC5zZXRBdHRyaWJ1dGUoInNyc05hbWUiLHIpLCJMaW5lU3RyaW5nIj09PXQubm9kZU5hbWV8fCJMaW5lU3RyaW5nU2VnbWVudCI9PT10Lm5vZGVOYW1lKXt2YXIgbj10dSh0Lm5hbWVzcGFjZVVSSSwicG9zTGlzdCIpO3QuYXBwZW5kQ2hpbGQobiksdGhpcy53cml0ZVBvc0xpc3RfKG4sZSxpKX1lbHNlIGlmKCJDdXJ2ZSI9PT10Lm5vZGVOYW1lKXt2YXIgbz10dSh0Lm5hbWVzcGFjZVVSSSwic2VnbWVudHMiKTt0LmFwcGVuZENoaWxkKG8pLHRoaXMud3JpdGVDdXJ2ZVNlZ21lbnRzXyhvLGUsaSl9fSxlLnByb3RvdHlwZS53cml0ZU11bHRpU3VyZmFjZU9yUG9seWdvbl89ZnVuY3Rpb24odCxlLGkpe3ZhciByPWlbaS5sZW5ndGgtMV0sbj1yLmhhc1osbz1yLnNyc05hbWUscz1yLnN1cmZhY2U7byYmdC5zZXRBdHRyaWJ1dGUoInNyc05hbWUiLG8pO3ZhciBhPWUuZ2V0UG9seWdvbnMoKTt2dSh7bm9kZTp0LGhhc1o6bixzcnNOYW1lOm8sc3VyZmFjZTpzfSx0aGlzLlNVUkZBQ0VPUlBPTFlHT05NRU1CRVJfU0VSSUFMSVpFUlNfLHRoaXMuTVVMVElHRU9NRVRSWV9NRU1CRVJfTk9ERV9GQUNUT1JZXyxhLGksdm9pZCAwLHRoaXMpfSxlLnByb3RvdHlwZS53cml0ZU11bHRpUG9pbnRfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pW2kubGVuZ3RoLTFdLG49ci5zcnNOYW1lLG89ci5oYXNaO24mJnQuc2V0QXR0cmlidXRlKCJzcnNOYW1lIixuKTt2YXIgcz1lLmdldFBvaW50cygpO3Z1KHtub2RlOnQsaGFzWjpvLHNyc05hbWU6bn0sdGhpcy5QT0lOVE1FTUJFUl9TRVJJQUxJWkVSU18scHUoInBvaW50TWVtYmVyIikscyxpLHZvaWQgMCx0aGlzKX0sZS5wcm90b3R5cGUud3JpdGVNdWx0aUN1cnZlT3JMaW5lU3RyaW5nXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9aVtpLmxlbmd0aC0xXSxuPXIuaGFzWixvPXIuc3JzTmFtZSxzPXIuY3VydmU7byYmdC5zZXRBdHRyaWJ1dGUoInNyc05hbWUiLG8pO3ZhciBhPWUuZ2V0TGluZVN0cmluZ3MoKTt2dSh7bm9kZTp0LGhhc1o6bixzcnNOYW1lOm8sY3VydmU6c30sdGhpcy5MSU5FU1RSSU5HT1JDVVJWRU1FTUJFUl9TRVJJQUxJWkVSU18sdGhpcy5NVUxUSUdFT01FVFJZX01FTUJFUl9OT0RFX0ZBQ1RPUllfLGEsaSx2b2lkIDAsdGhpcyl9LGUucHJvdG90eXBlLndyaXRlUmluZ189ZnVuY3Rpb24odCxlLGkpe3ZhciByPXR1KHQubmFtZXNwYWNlVVJJLCJMaW5lYXJSaW5nIik7dC5hcHBlbmRDaGlsZChyKSx0aGlzLndyaXRlTGluZWFyUmluZ18ocixlLGkpfSxlLnByb3RvdHlwZS53cml0ZVN1cmZhY2VPclBvbHlnb25NZW1iZXJfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLkdFT01FVFJZX05PREVfRkFDVE9SWV8oZSxpKTtyJiYodC5hcHBlbmRDaGlsZChyKSx0aGlzLndyaXRlU3VyZmFjZU9yUG9seWdvbl8ocixlLGkpKX0sZS5wcm90b3R5cGUud3JpdGVQb2ludE1lbWJlcl89ZnVuY3Rpb24odCxlLGkpe3ZhciByPXR1KHQubmFtZXNwYWNlVVJJLCJQb2ludCIpO3QuYXBwZW5kQ2hpbGQociksdGhpcy53cml0ZVBvaW50XyhyLGUsaSl9LGUucHJvdG90eXBlLndyaXRlTGluZVN0cmluZ09yQ3VydmVNZW1iZXJfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLkdFT01FVFJZX05PREVfRkFDVE9SWV8oZSxpKTtyJiYodC5hcHBlbmRDaGlsZChyKSx0aGlzLndyaXRlQ3VydmVPckxpbmVTdHJpbmdfKHIsZSxpKSl9LGUucHJvdG90eXBlLndyaXRlU3VyZmFjZVBhdGNoZXNfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10dSh0Lm5hbWVzcGFjZVVSSSwiUG9seWdvblBhdGNoIik7dC5hcHBlbmRDaGlsZChyKSx0aGlzLndyaXRlU3VyZmFjZU9yUG9seWdvbl8ocixlLGkpfSxlLnByb3RvdHlwZS53cml0ZUN1cnZlU2VnbWVudHNfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10dSh0Lm5hbWVzcGFjZVVSSSwiTGluZVN0cmluZ1NlZ21lbnQiKTt0LmFwcGVuZENoaWxkKHIpLHRoaXMud3JpdGVDdXJ2ZU9yTGluZVN0cmluZ18ocixlLGkpfSxlLnByb3RvdHlwZS53cml0ZUdlb21ldHJ5RWxlbWVudD1mdW5jdGlvbih0LGUsaSl7dmFyIHIsbj1pW2kubGVuZ3RoLTFdLG89dSh7fSxuKTtvLm5vZGU9dCxyPUFycmF5LmlzQXJyYXkoZSk/bi5kYXRhUHJvamVjdGlvbj9iZShlLG4uZmVhdHVyZVByb2plY3Rpb24sbi5kYXRhUHJvamVjdGlvbik6ZTpkZChlLCEwLG4pLHZ1KG8sdGhpcy5HRU9NRVRSWV9TRVJJQUxJWkVSU18sdGhpcy5HRU9NRVRSWV9OT0RFX0ZBQ1RPUllfLFtyXSxpLHZvaWQgMCx0aGlzKX0sZS5wcm90b3R5cGUud3JpdGVGZWF0dXJlRWxlbWVudD1mdW5jdGlvbih0LGUsaSl7dmFyIHI9ZS5nZXRJZCgpO3ImJnQuc2V0QXR0cmlidXRlKCJmaWQiLHIpO3ZhciBuPWlbaS5sZW5ndGgtMV0sbz1uLmZlYXR1cmVOUyxzPWUuZ2V0R2VvbWV0cnlOYW1lKCk7bi5zZXJpYWxpemVyc3x8KG4uc2VyaWFsaXplcnM9e30sbi5zZXJpYWxpemVyc1tvXT17fSk7dmFyIGE9ZS5nZXRQcm9wZXJ0aWVzKCksaD1bXSxsPVtdO2Zvcih2YXIgcCBpbiBhKXt2YXIgYz1hW3BdO251bGwhPT1jJiYoaC5wdXNoKHApLGwucHVzaChjKSxwPT1zfHwiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRTaW1wbGlmaWVkR2VvbWV0cnk/cCBpbiBuLnNlcmlhbGl6ZXJzW29dfHwobi5zZXJpYWxpemVyc1tvXVtwXT1sdSh0aGlzLndyaXRlR2VvbWV0cnlFbGVtZW50LHRoaXMpKTpwIGluIG4uc2VyaWFsaXplcnNbb118fChuLnNlcmlhbGl6ZXJzW29dW3BdPWx1KGpkKSkpfXZhciBkPXUoe30sbik7ZC5ub2RlPXQsdnUoZCxuLnNlcmlhbGl6ZXJzLHB1KHZvaWQgMCxvKSxsLGksaCl9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZU1lbWJlcnNfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pW2kubGVuZ3RoLTFdLG49ci5mZWF0dXJlVHlwZSxvPXIuZmVhdHVyZU5TLHM9e307c1tvXT17fSxzW29dW25dPWx1KHRoaXMud3JpdGVGZWF0dXJlRWxlbWVudCx0aGlzKTt2YXIgYT11KHt9LHIpO2Eubm9kZT10LHZ1KGEscyxwdShuLG8pLGUsaSl9LGUucHJvdG90eXBlLk1VTFRJR0VPTUVUUllfTUVNQkVSX05PREVfRkFDVE9SWV89ZnVuY3Rpb24odCxlLGkpe3ZhciByPWVbZS5sZW5ndGgtMV0ubm9kZTtyZXR1cm4gdHUodGhpcy5uYW1lc3BhY2UsWWRbci5ub2RlTmFtZV0pfSxlLnByb3RvdHlwZS5HRU9NRVRSWV9OT0RFX0ZBQ1RPUllfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcixuPWVbZS5sZW5ndGgtMV0sbz1uLm11bHRpU3VyZmFjZSxzPW4uc3VyZmFjZSxhPW4uY3VydmUsaD1uLm11bHRpQ3VydmU7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/cj0iRW52ZWxvcGUiOiJNdWx0aVBvbHlnb24iPT09KHI9dC5nZXRUeXBlKCkpJiYhMD09PW8/cj0iTXVsdGlTdXJmYWNlIjoiUG9seWdvbiI9PT1yJiYhMD09PXM/cj0iU3VyZmFjZSI6IkxpbmVTdHJpbmciPT09ciYmITA9PT1hP3I9IkN1cnZlIjoiTXVsdGlMaW5lU3RyaW5nIj09PXImJiEwPT09aCYmKHI9Ik11bHRpQ3VydmUiKSx0dSh0aGlzLm5hbWVzcGFjZSxyKX0sZS5wcm90b3R5cGUud3JpdGVHZW9tZXRyeU5vZGU9ZnVuY3Rpb24odCxlKXtlPXRoaXMuYWRhcHRPcHRpb25zKGUpO3ZhciBpPXR1KHRoaXMubmFtZXNwYWNlLCJnZW9tIikscj17bm9kZTppLGhhc1o6dGhpcy5oYXNaLHNyc05hbWU6dGhpcy5zcnNOYW1lLGN1cnZlOnRoaXMuY3VydmVfLHN1cmZhY2U6dGhpcy5zdXJmYWNlXyxtdWx0aVN1cmZhY2U6dGhpcy5tdWx0aVN1cmZhY2VfLG11bHRpQ3VydmU6dGhpcy5tdWx0aUN1cnZlX307cmV0dXJuIGUmJnUocixlKSx0aGlzLndyaXRlR2VvbWV0cnlFbGVtZW50KGksdCxbcl0pLGl9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZXNOb2RlPWZ1bmN0aW9uKHQsZSl7ZT10aGlzLmFkYXB0T3B0aW9ucyhlKTt2YXIgaT10dSh0aGlzLm5hbWVzcGFjZSwiZmVhdHVyZU1lbWJlcnMiKTtpLnNldEF0dHJpYnV0ZU5TKCRsLCJ4c2k6c2NoZW1hTG9jYXRpb24iLHRoaXMuc2NoZW1hTG9jYXRpb24pO3ZhciByPXtzcnNOYW1lOnRoaXMuc3JzTmFtZSxoYXNaOnRoaXMuaGFzWixjdXJ2ZTp0aGlzLmN1cnZlXyxzdXJmYWNlOnRoaXMuc3VyZmFjZV8sbXVsdGlTdXJmYWNlOnRoaXMubXVsdGlTdXJmYWNlXyxtdWx0aUN1cnZlOnRoaXMubXVsdGlDdXJ2ZV8sZmVhdHVyZU5TOnRoaXMuZmVhdHVyZU5TLGZlYXR1cmVUeXBlOnRoaXMuZmVhdHVyZVR5cGV9O3JldHVybiBlJiZ1KHIsZSksdGhpcy53cml0ZUZlYXR1cmVNZW1iZXJzXyhpLHQsW3JdKSxpfSxlfShJZCk7QmQucHJvdG90eXBlLkdFT01FVFJZX0ZMQVRfQ09PUkRJTkFURVNfUEFSU0VSUz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7cG9zOnN1KEJkLnByb3RvdHlwZS5yZWFkRmxhdFBvc18pLHBvc0xpc3Q6c3UoQmQucHJvdG90eXBlLnJlYWRGbGF0UG9zTGlzdF8pfX0sQmQucHJvdG90eXBlLkZMQVRfTElORUFSX1JJTkdTX1BBUlNFUlM9eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI6e2ludGVyaW9yOkJkLnByb3RvdHlwZS5pbnRlcmlvclBhcnNlcl8sZXh0ZXJpb3I6QmQucHJvdG90eXBlLmV4dGVyaW9yUGFyc2VyX319LEJkLnByb3RvdHlwZS5HRU9NRVRSWV9QQVJTRVJTPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntQb2ludDpzdShJZC5wcm90b3R5cGUucmVhZFBvaW50KSxNdWx0aVBvaW50OnN1KElkLnByb3RvdHlwZS5yZWFkTXVsdGlQb2ludCksTGluZVN0cmluZzpzdShJZC5wcm90b3R5cGUucmVhZExpbmVTdHJpbmcpLE11bHRpTGluZVN0cmluZzpzdShJZC5wcm90b3R5cGUucmVhZE11bHRpTGluZVN0cmluZyksTGluZWFyUmluZzpzdShJZC5wcm90b3R5cGUucmVhZExpbmVhclJpbmcpLFBvbHlnb246c3UoSWQucHJvdG90eXBlLnJlYWRQb2x5Z29uKSxNdWx0aVBvbHlnb246c3UoSWQucHJvdG90eXBlLnJlYWRNdWx0aVBvbHlnb24pLFN1cmZhY2U6c3UoQmQucHJvdG90eXBlLnJlYWRTdXJmYWNlXyksTXVsdGlTdXJmYWNlOnN1KEJkLnByb3RvdHlwZS5yZWFkTXVsdGlTdXJmYWNlXyksQ3VydmU6c3UoQmQucHJvdG90eXBlLnJlYWRDdXJ2ZV8pLE11bHRpQ3VydmU6c3UoQmQucHJvdG90eXBlLnJlYWRNdWx0aUN1cnZlXyksRW52ZWxvcGU6c3UoQmQucHJvdG90eXBlLnJlYWRFbnZlbG9wZV8pfX0sQmQucHJvdG90eXBlLk1VTFRJQ1VSVkVfUEFSU0VSU189eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI6e2N1cnZlTWVtYmVyOm91KEJkLnByb3RvdHlwZS5jdXJ2ZU1lbWJlclBhcnNlcl8pLGN1cnZlTWVtYmVyczpvdShCZC5wcm90b3R5cGUuY3VydmVNZW1iZXJQYXJzZXJfKX19LEJkLnByb3RvdHlwZS5NVUxUSVNVUkZBQ0VfUEFSU0VSU189eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI6e3N1cmZhY2VNZW1iZXI6b3UoQmQucHJvdG90eXBlLnN1cmZhY2VNZW1iZXJQYXJzZXJfKSxzdXJmYWNlTWVtYmVyczpvdShCZC5wcm90b3R5cGUuc3VyZmFjZU1lbWJlclBhcnNlcl8pfX0sQmQucHJvdG90eXBlLkNVUlZFTUVNQkVSX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntMaW5lU3RyaW5nOm91KElkLnByb3RvdHlwZS5yZWFkTGluZVN0cmluZyksQ3VydmU6b3UoQmQucHJvdG90eXBlLnJlYWRDdXJ2ZV8pfX0sQmQucHJvdG90eXBlLlNVUkZBQ0VNRU1CRVJfUEFSU0VSU189eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI6e1BvbHlnb246b3UoSWQucHJvdG90eXBlLnJlYWRQb2x5Z29uKSxTdXJmYWNlOm91KEJkLnByb3RvdHlwZS5yZWFkU3VyZmFjZV8pfX0sQmQucHJvdG90eXBlLlNVUkZBQ0VfUEFSU0VSU189eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI6e3BhdGNoZXM6c3UoQmQucHJvdG90eXBlLnJlYWRQYXRjaF8pfX0sQmQucHJvdG90eXBlLkNVUlZFX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntzZWdtZW50czpzdShCZC5wcm90b3R5cGUucmVhZFNlZ21lbnRfKX19LEJkLnByb3RvdHlwZS5FTlZFTE9QRV9QQVJTRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7bG93ZXJDb3JuZXI6b3UoQmQucHJvdG90eXBlLnJlYWRGbGF0UG9zTGlzdF8pLHVwcGVyQ29ybmVyOm91KEJkLnByb3RvdHlwZS5yZWFkRmxhdFBvc0xpc3RfKX19LEJkLnByb3RvdHlwZS5QQVRDSEVTX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntQb2x5Z29uUGF0Y2g6c3UoQmQucHJvdG90eXBlLnJlYWRQb2x5Z29uUGF0Y2hfKX19LEJkLnByb3RvdHlwZS5TRUdNRU5UU19QQVJTRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7TGluZVN0cmluZ1NlZ21lbnQ6c3UoQmQucHJvdG90eXBlLnJlYWRMaW5lU3RyaW5nU2VnbWVudF8pfX0sQmQucHJvdG90eXBlLndyaXRlRmVhdHVyZXMsQmQucHJvdG90eXBlLlJJTkdfU0VSSUFMSVpFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntleHRlcmlvcjpsdShCZC5wcm90b3R5cGUud3JpdGVSaW5nXyksaW50ZXJpb3I6bHUoQmQucHJvdG90eXBlLndyaXRlUmluZ18pfX0sQmQucHJvdG90eXBlLkVOVkVMT1BFX1NFUklBTElaRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7bG93ZXJDb3JuZXI6bHUoamQpLHVwcGVyQ29ybmVyOmx1KGpkKX19LEJkLnByb3RvdHlwZS5TVVJGQUNFT1JQT0xZR09OTUVNQkVSX1NFUklBTElaRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7c3VyZmFjZU1lbWJlcjpsdShCZC5wcm90b3R5cGUud3JpdGVTdXJmYWNlT3JQb2x5Z29uTWVtYmVyXykscG9seWdvbk1lbWJlcjpsdShCZC5wcm90b3R5cGUud3JpdGVTdXJmYWNlT3JQb2x5Z29uTWVtYmVyXyl9fSxCZC5wcm90b3R5cGUuUE9JTlRNRU1CRVJfU0VSSUFMSVpFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntwb2ludE1lbWJlcjpsdShCZC5wcm90b3R5cGUud3JpdGVQb2ludE1lbWJlcl8pfX0sQmQucHJvdG90eXBlLkxJTkVTVFJJTkdPUkNVUlZFTUVNQkVSX1NFUklBTElaRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7bGluZVN0cmluZ01lbWJlcjpsdShCZC5wcm90b3R5cGUud3JpdGVMaW5lU3RyaW5nT3JDdXJ2ZU1lbWJlcl8pLGN1cnZlTWVtYmVyOmx1KEJkLnByb3RvdHlwZS53cml0ZUxpbmVTdHJpbmdPckN1cnZlTWVtYmVyXyl9fSxCZC5wcm90b3R5cGUuR0VPTUVUUllfU0VSSUFMSVpFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntDdXJ2ZTpsdShCZC5wcm90b3R5cGUud3JpdGVDdXJ2ZU9yTGluZVN0cmluZ18pLE11bHRpQ3VydmU6bHUoQmQucHJvdG90eXBlLndyaXRlTXVsdGlDdXJ2ZU9yTGluZVN0cmluZ18pLFBvaW50Omx1KEJkLnByb3RvdHlwZS53cml0ZVBvaW50XyksTXVsdGlQb2ludDpsdShCZC5wcm90b3R5cGUud3JpdGVNdWx0aVBvaW50XyksTGluZVN0cmluZzpsdShCZC5wcm90b3R5cGUud3JpdGVDdXJ2ZU9yTGluZVN0cmluZ18pLE11bHRpTGluZVN0cmluZzpsdShCZC5wcm90b3R5cGUud3JpdGVNdWx0aUN1cnZlT3JMaW5lU3RyaW5nXyksTGluZWFyUmluZzpsdShCZC5wcm90b3R5cGUud3JpdGVMaW5lYXJSaW5nXyksUG9seWdvbjpsdShCZC5wcm90b3R5cGUud3JpdGVTdXJmYWNlT3JQb2x5Z29uXyksTXVsdGlQb2x5Z29uOmx1KEJkLnByb3RvdHlwZS53cml0ZU11bHRpU3VyZmFjZU9yUG9seWdvbl8pLFN1cmZhY2U6bHUoQmQucHJvdG90eXBlLndyaXRlU3VyZmFjZU9yUG9seWdvbl8pLE11bHRpU3VyZmFjZTpsdShCZC5wcm90b3R5cGUud3JpdGVNdWx0aVN1cmZhY2VPclBvbHlnb25fKSxFbnZlbG9wZTpsdShCZC5wcm90b3R5cGUud3JpdGVFbnZlbG9wZSl9fTt2YXIgVmQ9QmQsWGQ9VmQ7WGQucHJvdG90eXBlLndyaXRlRmVhdHVyZXMsWGQucHJvdG90eXBlLndyaXRlRmVhdHVyZXNOb2RlO3ZhciB6ZD1YZCxXZD1DZCsiIGh0dHA6Ly9zY2hlbWFzLm9wZW5naXMubmV0L2dtbC8yLjEuMi9mZWF0dXJlLnhzZCIsS2Q9e011bHRpTGluZVN0cmluZzoibGluZVN0cmluZ01lbWJlciIsTXVsdGlDdXJ2ZToiY3VydmVNZW1iZXIiLE11bHRpUG9seWdvbjoicG9seWdvbk1lbWJlciIsTXVsdGlTdXJmYWNlOiJzdXJmYWNlTWVtYmVyIn0sSGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fTt0LmNhbGwodGhpcyxpKSx0aGlzLkZFQVRVUkVfQ09MTEVDVElPTl9QQVJTRVJTW0NkXS5mZWF0dXJlTWVtYmVyPW91KHRoaXMucmVhZEZlYXR1cmVzSW50ZXJuYWwpLHRoaXMuc2NoZW1hTG9jYXRpb249aS5zY2hlbWFMb2NhdGlvbj9pLnNjaGVtYUxvY2F0aW9uOldkfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5yZWFkRmxhdENvb3JkaW5hdGVzXz1mdW5jdGlvbih0LGUpe3ZhciBpPWV1KHQsITEpLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKSxyPWVbMF0uc3JzTmFtZSxuPSJlbnUiO2lmKHIpe3ZhciBvPUVlKHIpO28mJihuPW8uZ2V0QXhpc09yaWVudGF0aW9uKCkpfWZvcih2YXIgcz1pLnRyaW0oKS5zcGxpdCgvXHMrLyksYT1bXSxoPTAsbD1zLmxlbmd0aDtoPGw7aCsrKXt2YXIgdT1zW2hdLnNwbGl0KC8sKy8pLHA9cGFyc2VGbG9hdCh1WzBdKSxjPXBhcnNlRmxvYXQodVsxXSksZD0zPT09dS5sZW5ndGg/cGFyc2VGbG9hdCh1WzJdKTowOyJlbiI9PT1uLnN1YnN0cigwLDIpP2EucHVzaChwLGMsZCk6YS5wdXNoKGMscCxkKX1yZXR1cm4gYX0sZS5wcm90b3R5cGUucmVhZEJveF89ZnVuY3Rpb24odCxlKXt2YXIgaT1ndShbbnVsbF0sdGhpcy5CT1hfUEFSU0VSU18sdCxlLHRoaXMpO3JldHVybiBsdChpWzFdWzBdLGlbMV1bMV0saVsxXVszXSxpWzFdWzRdKX0sZS5wcm90b3R5cGUuaW5uZXJCb3VuZGFyeUlzUGFyc2VyXz1mdW5jdGlvbih0LGUpe3ZhciBpPWd1KHZvaWQgMCx0aGlzLlJJTkdfUEFSU0VSUyx0LGUsdGhpcyk7aSYmZVtlLmxlbmd0aC0xXS5wdXNoKGkpfSxlLnByb3RvdHlwZS5vdXRlckJvdW5kYXJ5SXNQYXJzZXJfPWZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3Uodm9pZCAwLHRoaXMuUklOR19QQVJTRVJTLHQsZSx0aGlzKTtpJiYoZVtlLmxlbmd0aC0xXVswXT1pKX0sZS5wcm90b3R5cGUuR0VPTUVUUllfTk9ERV9GQUNUT1JZXz1mdW5jdGlvbih0LGUsaSl7dmFyIHIsbj1lW2UubGVuZ3RoLTFdLG89bi5tdWx0aVN1cmZhY2Uscz1uLnN1cmZhY2UsYT1uLm11bHRpQ3VydmU7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/cj0iRW52ZWxvcGUiOiJNdWx0aVBvbHlnb24iPT09KHI9dC5nZXRUeXBlKCkpJiYhMD09PW8/cj0iTXVsdGlTdXJmYWNlIjoiUG9seWdvbiI9PT1yJiYhMD09PXM/cj0iU3VyZmFjZSI6Ik11bHRpTGluZVN0cmluZyI9PT1yJiYhMD09PWEmJihyPSJNdWx0aUN1cnZlIiksdHUoImh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIixyKX0sZS5wcm90b3R5cGUud3JpdGVGZWF0dXJlRWxlbWVudD1mdW5jdGlvbih0LGUsaSl7dmFyIHI9ZS5nZXRJZCgpO3ImJnQuc2V0QXR0cmlidXRlKCJmaWQiLHIpO3ZhciBuPWlbaS5sZW5ndGgtMV0sbz1uLmZlYXR1cmVOUyxzPWUuZ2V0R2VvbWV0cnlOYW1lKCk7bi5zZXJpYWxpemVyc3x8KG4uc2VyaWFsaXplcnM9e30sbi5zZXJpYWxpemVyc1tvXT17fSk7dmFyIGE9ZS5nZXRQcm9wZXJ0aWVzKCksaD1bXSxsPVtdO2Zvcih2YXIgcCBpbiBhKXt2YXIgYz1hW3BdO251bGwhPT1jJiYoaC5wdXNoKHApLGwucHVzaChjKSxwPT1zfHwiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRTaW1wbGlmaWVkR2VvbWV0cnk/cCBpbiBuLnNlcmlhbGl6ZXJzW29dfHwobi5zZXJpYWxpemVyc1tvXVtwXT1sdSh0aGlzLndyaXRlR2VvbWV0cnlFbGVtZW50LHRoaXMpKTpwIGluIG4uc2VyaWFsaXplcnNbb118fChuLnNlcmlhbGl6ZXJzW29dW3BdPWx1KGpkKSkpfXZhciBkPXUoe30sbik7ZC5ub2RlPXQsdnUoZCxuLnNlcmlhbGl6ZXJzLHB1KHZvaWQgMCxvKSxsLGksaCl9LGUucHJvdG90eXBlLndyaXRlQ3VydmVPckxpbmVTdHJpbmdfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pW2kubGVuZ3RoLTFdLnNyc05hbWU7aWYoIkxpbmVTdHJpbmdTZWdtZW50IiE9PXQubm9kZU5hbWUmJnImJnQuc2V0QXR0cmlidXRlKCJzcnNOYW1lIixyKSwiTGluZVN0cmluZyI9PT10Lm5vZGVOYW1lfHwiTGluZVN0cmluZ1NlZ21lbnQiPT09dC5ub2RlTmFtZSl7dmFyIG49dGhpcy5jcmVhdGVDb29yZGluYXRlc05vZGVfKHQubmFtZXNwYWNlVVJJKTt0LmFwcGVuZENoaWxkKG4pLHRoaXMud3JpdGVDb29yZGluYXRlc18obixlLGkpfWVsc2UgaWYoIkN1cnZlIj09PXQubm9kZU5hbWUpe3ZhciBvPXR1KHQubmFtZXNwYWNlVVJJLCJzZWdtZW50cyIpO3QuYXBwZW5kQ2hpbGQobyksdGhpcy53cml0ZUN1cnZlU2VnbWVudHNfKG8sZSxpKX19LGUucHJvdG90eXBlLndyaXRlTGluZVN0cmluZ09yQ3VydmVNZW1iZXJfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLkdFT01FVFJZX05PREVfRkFDVE9SWV8oZSxpKTtyJiYodC5hcHBlbmRDaGlsZChyKSx0aGlzLndyaXRlQ3VydmVPckxpbmVTdHJpbmdfKHIsZSxpKSl9LGUucHJvdG90eXBlLndyaXRlTXVsdGlDdXJ2ZU9yTGluZVN0cmluZ189ZnVuY3Rpb24odCxlLGkpe3ZhciByPWlbaS5sZW5ndGgtMV0sbj1yLmhhc1osbz1yLnNyc05hbWUscz1yLmN1cnZlO28mJnQuc2V0QXR0cmlidXRlKCJzcnNOYW1lIixvKTt2YXIgYT1lLmdldExpbmVTdHJpbmdzKCk7dnUoe25vZGU6dCxoYXNaOm4sc3JzTmFtZTpvLGN1cnZlOnN9LHRoaXMuTElORVNUUklOR09SQ1VSVkVNRU1CRVJfU0VSSUFMSVpFUlNfLHRoaXMuTVVMVElHRU9NRVRSWV9NRU1CRVJfTk9ERV9GQUNUT1JZXyxhLGksdm9pZCAwLHRoaXMpfSxlLnByb3RvdHlwZS53cml0ZUdlb21ldHJ5RWxlbWVudD1mdW5jdGlvbih0LGUsaSl7dmFyIHIsbj1pW2kubGVuZ3RoLTFdLG89dSh7fSxuKTtvLm5vZGU9dCxyPUFycmF5LmlzQXJyYXkoZSk/bi5kYXRhUHJvamVjdGlvbj9iZShlLG4uZmVhdHVyZVByb2plY3Rpb24sbi5kYXRhUHJvamVjdGlvbik6ZTpkZChlLCEwLG4pLHZ1KG8sdGhpcy5HRU9NRVRSWV9TRVJJQUxJWkVSU18sdGhpcy5HRU9NRVRSWV9OT0RFX0ZBQ1RPUllfLFtyXSxpLHZvaWQgMCx0aGlzKX0sZS5wcm90b3R5cGUuY3JlYXRlQ29vcmRpbmF0ZXNOb2RlXz1mdW5jdGlvbih0KXt2YXIgZT10dSh0LCJjb29yZGluYXRlcyIpO3JldHVybiBlLnNldEF0dHJpYnV0ZSgiZGVjaW1hbCIsIi4iKSxlLnNldEF0dHJpYnV0ZSgiY3MiLCIsIiksZS5zZXRBdHRyaWJ1dGUoInRzIiwiICIpLGV9LGUucHJvdG90eXBlLndyaXRlQ29vcmRpbmF0ZXNfPWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIHI9aVtpLmxlbmd0aC0xXSxuPXIuaGFzWixvPXIuc3JzTmFtZSxzPWUuZ2V0Q29vcmRpbmF0ZXMoKSxhPXMubGVuZ3RoLGg9bmV3IEFycmF5KGEpLGw9MDtsPGE7KytsKXt2YXIgdT1zW2xdO2hbbF09dGhpcy5nZXRDb29yZHNfKHUsbyxuKX1qZCh0LGguam9pbigiICIpKX0sZS5wcm90b3R5cGUud3JpdGVDdXJ2ZVNlZ21lbnRzXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9dHUodC5uYW1lc3BhY2VVUkksIkxpbmVTdHJpbmdTZWdtZW50Iik7dC5hcHBlbmRDaGlsZChyKSx0aGlzLndyaXRlQ3VydmVPckxpbmVTdHJpbmdfKHIsZSxpKX0sZS5wcm90b3R5cGUud3JpdGVTdXJmYWNlT3JQb2x5Z29uXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9aVtpLmxlbmd0aC0xXSxuPXIuaGFzWixvPXIuc3JzTmFtZTtpZigiUG9seWdvblBhdGNoIiE9PXQubm9kZU5hbWUmJm8mJnQuc2V0QXR0cmlidXRlKCJzcnNOYW1lIixvKSwiUG9seWdvbiI9PT10Lm5vZGVOYW1lfHwiUG9seWdvblBhdGNoIj09PXQubm9kZU5hbWUpe3ZhciBzPWUuZ2V0TGluZWFyUmluZ3MoKTt2dSh7bm9kZTp0LGhhc1o6bixzcnNOYW1lOm99LHRoaXMuUklOR19TRVJJQUxJWkVSU18sdGhpcy5SSU5HX05PREVfRkFDVE9SWV8scyxpLHZvaWQgMCx0aGlzKX1lbHNlIGlmKCJTdXJmYWNlIj09PXQubm9kZU5hbWUpe3ZhciBhPXR1KHQubmFtZXNwYWNlVVJJLCJwYXRjaGVzIik7dC5hcHBlbmRDaGlsZChhKSx0aGlzLndyaXRlU3VyZmFjZVBhdGNoZXNfKGEsZSxpKX19LGUucHJvdG90eXBlLlJJTkdfTk9ERV9GQUNUT1JZXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9ZVtlLmxlbmd0aC0xXSxuPXIubm9kZSxvPXIuZXh0ZXJpb3JXcml0dGVuO3JldHVybiB2b2lkIDA9PT1vJiYoci5leHRlcmlvcldyaXR0ZW49ITApLHR1KG4ubmFtZXNwYWNlVVJJLHZvaWQgMCE9PW8/ImlubmVyQm91bmRhcnlJcyI6Im91dGVyQm91bmRhcnlJcyIpfSxlLnByb3RvdHlwZS53cml0ZVN1cmZhY2VQYXRjaGVzXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9dHUodC5uYW1lc3BhY2VVUkksIlBvbHlnb25QYXRjaCIpO3QuYXBwZW5kQ2hpbGQociksdGhpcy53cml0ZVN1cmZhY2VPclBvbHlnb25fKHIsZSxpKX0sZS5wcm90b3R5cGUud3JpdGVSaW5nXz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9dHUodC5uYW1lc3BhY2VVUkksIkxpbmVhclJpbmciKTt0LmFwcGVuZENoaWxkKHIpLHRoaXMud3JpdGVMaW5lYXJSaW5nXyhyLGUsaSl9LGUucHJvdG90eXBlLmdldENvb3Jkc189ZnVuY3Rpb24odCxlLGkpe3ZhciByPSJlbnUiO2UmJihyPUVlKGUpLmdldEF4aXNPcmllbnRhdGlvbigpKTt2YXIgbj0iZW4iPT09ci5zdWJzdHIoMCwyKT90WzBdKyIsIit0WzFdOnRbMV0rIiwiK3RbMF07aSYmKG4rPSIsIisodFsyXXx8MCkpO3JldHVybiBufSxlLnByb3RvdHlwZS53cml0ZVBvaW50Xz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9aVtpLmxlbmd0aC0xXSxuPXIuaGFzWixvPXIuc3JzTmFtZTtvJiZ0LnNldEF0dHJpYnV0ZSgic3JzTmFtZSIsbyk7dmFyIHM9dGhpcy5jcmVhdGVDb29yZGluYXRlc05vZGVfKHQubmFtZXNwYWNlVVJJKTt0LmFwcGVuZENoaWxkKHMpO3ZhciBhPWUuZ2V0Q29vcmRpbmF0ZXMoKTtqZChzLHRoaXMuZ2V0Q29vcmRzXyhhLG8sbikpfSxlLnByb3RvdHlwZS53cml0ZU11bHRpUG9pbnRfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pW2kubGVuZ3RoLTFdLG49ci5oYXNaLG89ci5zcnNOYW1lO28mJnQuc2V0QXR0cmlidXRlKCJzcnNOYW1lIixvKTt2YXIgcz1lLmdldFBvaW50cygpO3Z1KHtub2RlOnQsaGFzWjpuLHNyc05hbWU6b30sdGhpcy5QT0lOVE1FTUJFUl9TRVJJQUxJWkVSU18scHUoInBvaW50TWVtYmVyIikscyxpLHZvaWQgMCx0aGlzKX0sZS5wcm90b3R5cGUud3JpdGVQb2ludE1lbWJlcl89ZnVuY3Rpb24odCxlLGkpe3ZhciByPXR1KHQubmFtZXNwYWNlVVJJLCJQb2ludCIpO3QuYXBwZW5kQ2hpbGQociksdGhpcy53cml0ZVBvaW50XyhyLGUsaSl9LGUucHJvdG90eXBlLndyaXRlTGluZWFyUmluZ189ZnVuY3Rpb24odCxlLGkpe3ZhciByPWlbaS5sZW5ndGgtMV0uc3JzTmFtZTtyJiZ0LnNldEF0dHJpYnV0ZSgic3JzTmFtZSIscik7dmFyIG49dGhpcy5jcmVhdGVDb29yZGluYXRlc05vZGVfKHQubmFtZXNwYWNlVVJJKTt0LmFwcGVuZENoaWxkKG4pLHRoaXMud3JpdGVDb29yZGluYXRlc18obixlLGkpfSxlLnByb3RvdHlwZS53cml0ZU11bHRpU3VyZmFjZU9yUG9seWdvbl89ZnVuY3Rpb24odCxlLGkpe3ZhciByPWlbaS5sZW5ndGgtMV0sbj1yLmhhc1osbz1yLnNyc05hbWUscz1yLnN1cmZhY2U7byYmdC5zZXRBdHRyaWJ1dGUoInNyc05hbWUiLG8pO3ZhciBhPWUuZ2V0UG9seWdvbnMoKTt2dSh7bm9kZTp0LGhhc1o6bixzcnNOYW1lOm8sc3VyZmFjZTpzfSx0aGlzLlNVUkZBQ0VPUlBPTFlHT05NRU1CRVJfU0VSSUFMSVpFUlNfLHRoaXMuTVVMVElHRU9NRVRSWV9NRU1CRVJfTk9ERV9GQUNUT1JZXyxhLGksdm9pZCAwLHRoaXMpfSxlLnByb3RvdHlwZS53cml0ZVN1cmZhY2VPclBvbHlnb25NZW1iZXJfPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLkdFT01FVFJZX05PREVfRkFDVE9SWV8oZSxpKTtyJiYodC5hcHBlbmRDaGlsZChyKSx0aGlzLndyaXRlU3VyZmFjZU9yUG9seWdvbl8ocixlLGkpKX0sZS5wcm90b3R5cGUud3JpdGVFbnZlbG9wZT1mdW5jdGlvbih0LGUsaSl7dmFyIHI9aVtpLmxlbmd0aC0xXS5zcnNOYW1lO3ImJnQuc2V0QXR0cmlidXRlKCJzcnNOYW1lIixyKTt2YXIgbj1bZVswXSsiICIrZVsxXSxlWzJdKyIgIitlWzNdXTt2dSh7bm9kZTp0fSx0aGlzLkVOVkVMT1BFX1NFUklBTElaRVJTXyxjdSxuLGksWyJsb3dlckNvcm5lciIsInVwcGVyQ29ybmVyIl0sdGhpcyl9LGUucHJvdG90eXBlLk1VTFRJR0VPTUVUUllfTUVNQkVSX05PREVfRkFDVE9SWV89ZnVuY3Rpb24odCxlLGkpe3ZhciByPWVbZS5sZW5ndGgtMV0ubm9kZTtyZXR1cm4gdHUoImh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIixLZFtyLm5vZGVOYW1lXSl9LGV9KElkKTtIZC5wcm90b3R5cGUuR0VPTUVUUllfRkxBVF9DT09SRElOQVRFU19QQVJTRVJTPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntjb29yZGluYXRlczpzdShIZC5wcm90b3R5cGUucmVhZEZsYXRDb29yZGluYXRlc18pfX0sSGQucHJvdG90eXBlLkZMQVRfTElORUFSX1JJTkdTX1BBUlNFUlM9eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI6e2lubmVyQm91bmRhcnlJczpIZC5wcm90b3R5cGUuaW5uZXJCb3VuZGFyeUlzUGFyc2VyXyxvdXRlckJvdW5kYXJ5SXM6SGQucHJvdG90eXBlLm91dGVyQm91bmRhcnlJc1BhcnNlcl99fSxIZC5wcm90b3R5cGUuQk9YX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntjb29yZGluYXRlczpvdShIZC5wcm90b3R5cGUucmVhZEZsYXRDb29yZGluYXRlc18pfX0sSGQucHJvdG90eXBlLkdFT01FVFJZX1BBUlNFUlM9eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCI6e1BvaW50OnN1KElkLnByb3RvdHlwZS5yZWFkUG9pbnQpLE11bHRpUG9pbnQ6c3UoSWQucHJvdG90eXBlLnJlYWRNdWx0aVBvaW50KSxMaW5lU3RyaW5nOnN1KElkLnByb3RvdHlwZS5yZWFkTGluZVN0cmluZyksTXVsdGlMaW5lU3RyaW5nOnN1KElkLnByb3RvdHlwZS5yZWFkTXVsdGlMaW5lU3RyaW5nKSxMaW5lYXJSaW5nOnN1KElkLnByb3RvdHlwZS5yZWFkTGluZWFyUmluZyksUG9seWdvbjpzdShJZC5wcm90b3R5cGUucmVhZFBvbHlnb24pLE11bHRpUG9seWdvbjpzdShJZC5wcm90b3R5cGUucmVhZE11bHRpUG9seWdvbiksQm94OnN1KEhkLnByb3RvdHlwZS5yZWFkQm94Xyl9fSxIZC5wcm90b3R5cGUuR0VPTUVUUllfU0VSSUFMSVpFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntDdXJ2ZTpsdShIZC5wcm90b3R5cGUud3JpdGVDdXJ2ZU9yTGluZVN0cmluZ18pLE11bHRpQ3VydmU6bHUoSGQucHJvdG90eXBlLndyaXRlTXVsdGlDdXJ2ZU9yTGluZVN0cmluZ18pLFBvaW50Omx1KEhkLnByb3RvdHlwZS53cml0ZVBvaW50XyksTXVsdGlQb2ludDpsdShIZC5wcm90b3R5cGUud3JpdGVNdWx0aVBvaW50XyksTGluZVN0cmluZzpsdShIZC5wcm90b3R5cGUud3JpdGVDdXJ2ZU9yTGluZVN0cmluZ18pLE11bHRpTGluZVN0cmluZzpsdShIZC5wcm90b3R5cGUud3JpdGVNdWx0aUN1cnZlT3JMaW5lU3RyaW5nXyksTGluZWFyUmluZzpsdShIZC5wcm90b3R5cGUud3JpdGVMaW5lYXJSaW5nXyksUG9seWdvbjpsdShIZC5wcm90b3R5cGUud3JpdGVTdXJmYWNlT3JQb2x5Z29uXyksTXVsdGlQb2x5Z29uOmx1KEhkLnByb3RvdHlwZS53cml0ZU11bHRpU3VyZmFjZU9yUG9seWdvbl8pLFN1cmZhY2U6bHUoSGQucHJvdG90eXBlLndyaXRlU3VyZmFjZU9yUG9seWdvbl8pLE11bHRpU3VyZmFjZTpsdShIZC5wcm90b3R5cGUud3JpdGVNdWx0aVN1cmZhY2VPclBvbHlnb25fKSxFbnZlbG9wZTpsdShIZC5wcm90b3R5cGUud3JpdGVFbnZlbG9wZSl9fSxIZC5wcm90b3R5cGUuTElORVNUUklOR09SQ1VSVkVNRU1CRVJfU0VSSUFMSVpFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntsaW5lU3RyaW5nTWVtYmVyOmx1KEhkLnByb3RvdHlwZS53cml0ZUxpbmVTdHJpbmdPckN1cnZlTWVtYmVyXyksY3VydmVNZW1iZXI6bHUoSGQucHJvdG90eXBlLndyaXRlTGluZVN0cmluZ09yQ3VydmVNZW1iZXJfKX19LEhkLnByb3RvdHlwZS5SSU5HX1NFUklBTElaRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7b3V0ZXJCb3VuZGFyeUlzOmx1KEhkLnByb3RvdHlwZS53cml0ZVJpbmdfKSxpbm5lckJvdW5kYXJ5SXM6bHUoSGQucHJvdG90eXBlLndyaXRlUmluZ18pfX0sSGQucHJvdG90eXBlLlBPSU5UTUVNQkVSX1NFUklBTElaRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7cG9pbnRNZW1iZXI6bHUoSGQucHJvdG90eXBlLndyaXRlUG9pbnRNZW1iZXJfKX19LEhkLnByb3RvdHlwZS5TVVJGQUNFT1JQT0xZR09OTUVNQkVSX1NFUklBTElaRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7c3VyZmFjZU1lbWJlcjpsdShIZC5wcm90b3R5cGUud3JpdGVTdXJmYWNlT3JQb2x5Z29uTWVtYmVyXykscG9seWdvbk1lbWJlcjpsdShIZC5wcm90b3R5cGUud3JpdGVTdXJmYWNlT3JQb2x5Z29uTWVtYmVyXyl9fSxIZC5wcm90b3R5cGUuRU5WRUxPUEVfU0VSSUFMSVpFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiOntsb3dlckNvcm5lcjpsdShqZCksdXBwZXJDb3JuZXI6bHUoamQpfX07dmFyIFpkPUhkLHFkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e307dC5jYWxsKHRoaXMsaSksdGhpcy5zY2hlbWFMb2NhdGlvbj1pLnNjaGVtYUxvY2F0aW9uP2kuc2NoZW1hTG9jYXRpb246dGhpcy5uYW1lc3BhY2UrIiBodHRwOi8vc2NoZW1hcy5vcGVuZ2lzLm5ldC9nbWwvMy4yLjEvZ21sLnhzZCJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KFZkKTtxZC5wcm90b3R5cGUubmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbC8zLjIiLHFkLnByb3RvdHlwZS5HRU9NRVRSWV9GTEFUX0NPT1JESU5BVEVTX1BBUlNFUlM9eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbC8zLjIiOntwb3M6c3UoVmQucHJvdG90eXBlLnJlYWRGbGF0UG9zXykscG9zTGlzdDpzdShWZC5wcm90b3R5cGUucmVhZEZsYXRQb3NMaXN0Xyl9fSxxZC5wcm90b3R5cGUuRkxBVF9MSU5FQVJfUklOR1NfUEFSU0VSUz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sLzMuMiI6e2ludGVyaW9yOlZkLnByb3RvdHlwZS5pbnRlcmlvclBhcnNlcl8sZXh0ZXJpb3I6VmQucHJvdG90eXBlLmV4dGVyaW9yUGFyc2VyX319LHFkLnByb3RvdHlwZS5HRU9NRVRSWV9QQVJTRVJTPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwvMy4yIjp7UG9pbnQ6c3UoSWQucHJvdG90eXBlLnJlYWRQb2ludCksTXVsdGlQb2ludDpzdShJZC5wcm90b3R5cGUucmVhZE11bHRpUG9pbnQpLExpbmVTdHJpbmc6c3UoSWQucHJvdG90eXBlLnJlYWRMaW5lU3RyaW5nKSxNdWx0aUxpbmVTdHJpbmc6c3UoSWQucHJvdG90eXBlLnJlYWRNdWx0aUxpbmVTdHJpbmcpLExpbmVhclJpbmc6c3UoSWQucHJvdG90eXBlLnJlYWRMaW5lYXJSaW5nKSxQb2x5Z29uOnN1KElkLnByb3RvdHlwZS5yZWFkUG9seWdvbiksTXVsdGlQb2x5Z29uOnN1KElkLnByb3RvdHlwZS5yZWFkTXVsdGlQb2x5Z29uKSxTdXJmYWNlOnN1KHFkLnByb3RvdHlwZS5yZWFkU3VyZmFjZV8pLE11bHRpU3VyZmFjZTpzdShWZC5wcm90b3R5cGUucmVhZE11bHRpU3VyZmFjZV8pLEN1cnZlOnN1KHFkLnByb3RvdHlwZS5yZWFkQ3VydmVfKSxNdWx0aUN1cnZlOnN1KFZkLnByb3RvdHlwZS5yZWFkTXVsdGlDdXJ2ZV8pLEVudmVsb3BlOnN1KHFkLnByb3RvdHlwZS5yZWFkRW52ZWxvcGVfKX19LHFkLnByb3RvdHlwZS5NVUxUSUNVUlZFX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwvMy4yIjp7Y3VydmVNZW1iZXI6b3UoVmQucHJvdG90eXBlLmN1cnZlTWVtYmVyUGFyc2VyXyksY3VydmVNZW1iZXJzOm91KFZkLnByb3RvdHlwZS5jdXJ2ZU1lbWJlclBhcnNlcl8pfX0scWQucHJvdG90eXBlLk1VTFRJU1VSRkFDRV9QQVJTRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sLzMuMiI6e3N1cmZhY2VNZW1iZXI6b3UoVmQucHJvdG90eXBlLnN1cmZhY2VNZW1iZXJQYXJzZXJfKSxzdXJmYWNlTWVtYmVyczpvdShWZC5wcm90b3R5cGUuc3VyZmFjZU1lbWJlclBhcnNlcl8pfX0scWQucHJvdG90eXBlLkNVUlZFTUVNQkVSX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwvMy4yIjp7TGluZVN0cmluZzpvdShJZC5wcm90b3R5cGUucmVhZExpbmVTdHJpbmcpLEN1cnZlOm91KFZkLnByb3RvdHlwZS5yZWFkQ3VydmVfKX19LHFkLnByb3RvdHlwZS5TVVJGQUNFTUVNQkVSX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwvMy4yIjp7UG9seWdvbjpvdShJZC5wcm90b3R5cGUucmVhZFBvbHlnb24pLFN1cmZhY2U6b3UoVmQucHJvdG90eXBlLnJlYWRTdXJmYWNlXyl9fSxxZC5wcm90b3R5cGUuU1VSRkFDRV9QQVJTRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sLzMuMiI6e3BhdGNoZXM6c3UoVmQucHJvdG90eXBlLnJlYWRQYXRjaF8pfX0scWQucHJvdG90eXBlLkNVUlZFX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwvMy4yIjp7c2VnbWVudHM6c3UoVmQucHJvdG90eXBlLnJlYWRTZWdtZW50Xyl9fSxxZC5wcm90b3R5cGUuRU5WRUxPUEVfUEFSU0VSU189eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbC8zLjIiOntsb3dlckNvcm5lcjpvdShWZC5wcm90b3R5cGUucmVhZEZsYXRQb3NMaXN0XyksdXBwZXJDb3JuZXI6b3UoVmQucHJvdG90eXBlLnJlYWRGbGF0UG9zTGlzdF8pfX0scWQucHJvdG90eXBlLlBBVENIRVNfUEFSU0VSU189eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbC8zLjIiOntQb2x5Z29uUGF0Y2g6c3UoVmQucHJvdG90eXBlLnJlYWRQb2x5Z29uUGF0Y2hfKX19LHFkLnByb3RvdHlwZS5TRUdNRU5UU19QQVJTRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sLzMuMiI6e0xpbmVTdHJpbmdTZWdtZW50OnN1KFZkLnByb3RvdHlwZS5yZWFkTGluZVN0cmluZ1NlZ21lbnRfKX19LHFkLnByb3RvdHlwZS5NVUxUSVBPSU5UX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwvMy4yIjp7cG9pbnRNZW1iZXI6b3UoSWQucHJvdG90eXBlLnBvaW50TWVtYmVyUGFyc2VyXykscG9pbnRNZW1iZXJzOm91KElkLnByb3RvdHlwZS5wb2ludE1lbWJlclBhcnNlcl8pfX0scWQucHJvdG90eXBlLk1VTFRJTElORVNUUklOR19QQVJTRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sLzMuMiI6e2xpbmVTdHJpbmdNZW1iZXI6b3UoSWQucHJvdG90eXBlLmxpbmVTdHJpbmdNZW1iZXJQYXJzZXJfKSxsaW5lU3RyaW5nTWVtYmVyczpvdShJZC5wcm90b3R5cGUubGluZVN0cmluZ01lbWJlclBhcnNlcl8pfX0scWQucHJvdG90eXBlLk1VTFRJUE9MWUdPTl9QQVJTRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sLzMuMiI6e3BvbHlnb25NZW1iZXI6b3UoSWQucHJvdG90eXBlLnBvbHlnb25NZW1iZXJQYXJzZXJfKSxwb2x5Z29uTWVtYmVyczpvdShJZC5wcm90b3R5cGUucG9seWdvbk1lbWJlclBhcnNlcl8pfX0scWQucHJvdG90eXBlLlBPSU5UTUVNQkVSX1BBUlNFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwvMy4yIjp7UG9pbnQ6b3UoSWQucHJvdG90eXBlLnJlYWRGbGF0Q29vcmRpbmF0ZXNGcm9tTm9kZV8pfX0scWQucHJvdG90eXBlLkxJTkVTVFJJTkdNRU1CRVJfUEFSU0VSU189eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbC8zLjIiOntMaW5lU3RyaW5nOm91KElkLnByb3RvdHlwZS5yZWFkTGluZVN0cmluZyl9fSxxZC5wcm90b3R5cGUuUE9MWUdPTk1FTUJFUl9QQVJTRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sLzMuMiI6e1BvbHlnb246b3UoSWQucHJvdG90eXBlLnJlYWRQb2x5Z29uKX19LHFkLnByb3RvdHlwZS5SSU5HX1BBUlNFUlM9eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbC8zLjIiOntMaW5lYXJSaW5nOnN1KElkLnByb3RvdHlwZS5yZWFkRmxhdExpbmVhclJpbmdfKX19LHFkLnByb3RvdHlwZS5SSU5HX1NFUklBTElaRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sLzMuMiI6e2V4dGVyaW9yOmx1KFZkLnByb3RvdHlwZS53cml0ZVJpbmdfKSxpbnRlcmlvcjpsdShWZC5wcm90b3R5cGUud3JpdGVSaW5nXyl9fSxxZC5wcm90b3R5cGUuRU5WRUxPUEVfU0VSSUFMSVpFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwvMy4yIjp7bG93ZXJDb3JuZXI6bHUoamQpLHVwcGVyQ29ybmVyOmx1KGpkKX19LHFkLnByb3RvdHlwZS5TVVJGQUNFT1JQT0xZR09OTUVNQkVSX1NFUklBTElaRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sLzMuMiI6e3N1cmZhY2VNZW1iZXI6bHUoVmQucHJvdG90eXBlLndyaXRlU3VyZmFjZU9yUG9seWdvbk1lbWJlcl8pLHBvbHlnb25NZW1iZXI6bHUoVmQucHJvdG90eXBlLndyaXRlU3VyZmFjZU9yUG9seWdvbk1lbWJlcl8pfX0scWQucHJvdG90eXBlLlBPSU5UTUVNQkVSX1NFUklBTElaRVJTXz17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sLzMuMiI6e3BvaW50TWVtYmVyOmx1KFZkLnByb3RvdHlwZS53cml0ZVBvaW50TWVtYmVyXyl9fSxxZC5wcm90b3R5cGUuTElORVNUUklOR09SQ1VSVkVNRU1CRVJfU0VSSUFMSVpFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwvMy4yIjp7bGluZVN0cmluZ01lbWJlcjpsdShWZC5wcm90b3R5cGUud3JpdGVMaW5lU3RyaW5nT3JDdXJ2ZU1lbWJlcl8pLGN1cnZlTWVtYmVyOmx1KFZkLnByb3RvdHlwZS53cml0ZUxpbmVTdHJpbmdPckN1cnZlTWVtYmVyXyl9fSxxZC5wcm90b3R5cGUuR0VPTUVUUllfU0VSSUFMSVpFUlNfPXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwvMy4yIjp7Q3VydmU6bHUoVmQucHJvdG90eXBlLndyaXRlQ3VydmVPckxpbmVTdHJpbmdfKSxNdWx0aUN1cnZlOmx1KFZkLnByb3RvdHlwZS53cml0ZU11bHRpQ3VydmVPckxpbmVTdHJpbmdfKSxQb2ludDpsdShxZC5wcm90b3R5cGUud3JpdGVQb2ludF8pLE11bHRpUG9pbnQ6bHUoVmQucHJvdG90eXBlLndyaXRlTXVsdGlQb2ludF8pLExpbmVTdHJpbmc6bHUoVmQucHJvdG90eXBlLndyaXRlQ3VydmVPckxpbmVTdHJpbmdfKSxNdWx0aUxpbmVTdHJpbmc6bHUoVmQucHJvdG90eXBlLndyaXRlTXVsdGlDdXJ2ZU9yTGluZVN0cmluZ18pLExpbmVhclJpbmc6bHUoVmQucHJvdG90eXBlLndyaXRlTGluZWFyUmluZ18pLFBvbHlnb246bHUoVmQucHJvdG90eXBlLndyaXRlU3VyZmFjZU9yUG9seWdvbl8pLE11bHRpUG9seWdvbjpsdShWZC5wcm90b3R5cGUud3JpdGVNdWx0aVN1cmZhY2VPclBvbHlnb25fKSxTdXJmYWNlOmx1KFZkLnByb3RvdHlwZS53cml0ZVN1cmZhY2VPclBvbHlnb25fKSxNdWx0aVN1cmZhY2U6bHUoVmQucHJvdG90eXBlLndyaXRlTXVsdGlTdXJmYWNlT3JQb2x5Z29uXyksRW52ZWxvcGU6bHUoVmQucHJvdG90eXBlLndyaXRlRW52ZWxvcGUpfX07dmFyIEpkPXFkLFFkPVtudWxsLCJodHRwOi8vd3d3LnRvcG9ncmFmaXguY29tL0dQWC8xLzAiLCJodHRwOi8vd3d3LnRvcG9ncmFmaXguY29tL0dQWC8xLzEiXSwkZD17cnRlOkxmLHRyazpPZix3cHQ6UGZ9LHRmPWZ1KFFkLHtydGU6b3UoTGYpLHRyazpvdShPZiksd3B0Om91KFBmKX0pLGVmPWZ1KFFkLHt0ZXh0Omh1KE5kLCJsaW5rVGV4dCIpLHR5cGU6aHUoTmQsImxpbmtUeXBlIil9KSxyZj1mdShRZCx7cnRlOmx1KGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pWzBdLG49ZS5nZXRQcm9wZXJ0aWVzKCksbz17bm9kZTp0fTtvLnByb3BlcnRpZXM9bjt2YXIgcz1lLmdldEdlb21ldHJ5KCk7aWYocy5nZXRUeXBlKCk9PU50LkxJTkVfU1RSSU5HKXt2YXIgYT1kZChzLCEwLHIpO28uZ2VvbWV0cnlMYXlvdXQ9YS5nZXRMYXlvdXQoKSxuLnJ0ZXB0PWEuZ2V0Q29vcmRpbmF0ZXMoKX12YXIgaD1pW2kubGVuZ3RoLTFdLm5vZGUsbD1kZltoLm5hbWVzcGFjZVVSSV0sdT1kdShuLGwpO3Z1KG8sZmYsY3UsdSxpLGwpfSksdHJrOmx1KGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pWzBdLG49ZS5nZXRQcm9wZXJ0aWVzKCksbz17bm9kZTp0fTtvLnByb3BlcnRpZXM9bjt2YXIgcz1lLmdldEdlb21ldHJ5KCk7aWYocy5nZXRUeXBlKCk9PU50Lk1VTFRJX0xJTkVfU1RSSU5HKXt2YXIgYT1kZChzLCEwLHIpO24udHJrc2VnPWEuZ2V0TGluZVN0cmluZ3MoKX12YXIgaD1pW2kubGVuZ3RoLTFdLm5vZGUsbD1nZltoLm5hbWVzcGFjZVVSSV0sdT1kdShuLGwpO3Z1KG8seWYsY3UsdSxpLGwpfSksd3B0Omx1KGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pWzBdLG49aVtpLmxlbmd0aC0xXTtuLnByb3BlcnRpZXM9ZS5nZXRQcm9wZXJ0aWVzKCk7dmFyIG89ZS5nZXRHZW9tZXRyeSgpO2lmKG8uZ2V0VHlwZSgpPT1OdC5QT0lOVCl7dmFyIHM9ZGQobywhMCxyKTtuLmdlb21ldHJ5TGF5b3V0PXMuZ2V0TGF5b3V0KCksTWYodCxzLmdldENvb3JkaW5hdGVzKCksaSl9fSl9KSxuZj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKTt2YXIgaT1lfHx7fTt0aGlzLmRhdGFQcm9qZWN0aW9uPUVlKCJFUFNHOjQzMjYiKSx0aGlzLnJlYWRFeHRlbnNpb25zXz1pLnJlYWRFeHRlbnNpb25zfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5oYW5kbGVSZWFkRXh0ZW5zaW9uc189ZnVuY3Rpb24odCl7dHx8KHQ9W10pO2Zvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSl7dmFyIHI9dFtlXTtpZih0aGlzLnJlYWRFeHRlbnNpb25zXyl7dmFyIG49ci5nZXQoImV4dGVuc2lvbnNOb2RlXyIpfHxudWxsO3RoaXMucmVhZEV4dGVuc2lvbnNfKHIsbil9ci5zZXQoImV4dGVuc2lvbnNOb2RlXyIsdm9pZCAwKX19LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlRnJvbU5vZGU9ZnVuY3Rpb24odCxlKXtpZighWChRZCx0Lm5hbWVzcGFjZVVSSSkpcmV0dXJuIG51bGw7dmFyIGk9JGRbdC5sb2NhbE5hbWVdO2lmKCFpKXJldHVybiBudWxsO3ZhciByPWkodCxbdGhpcy5nZXRSZWFkT3B0aW9ucyh0LGUpXSk7cmV0dXJuIHI/KHRoaXMuaGFuZGxlUmVhZEV4dGVuc2lvbnNfKFtyXSkscik6bnVsbH0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVzRnJvbU5vZGU9ZnVuY3Rpb24odCxlKXtpZighWChRZCx0Lm5hbWVzcGFjZVVSSSkpcmV0dXJuW107aWYoImdweCI9PXQubG9jYWxOYW1lKXt2YXIgaT1ndShbXSx0Zix0LFt0aGlzLmdldFJlYWRPcHRpb25zKHQsZSldKTtyZXR1cm4gaT8odGhpcy5oYW5kbGVSZWFkRXh0ZW5zaW9uc18oaSksaSk6W119cmV0dXJuW119LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZXNOb2RlPWZ1bmN0aW9uKHQsZSl7ZT10aGlzLmFkYXB0T3B0aW9ucyhlKTt2YXIgaT10dSgiaHR0cDovL3d3dy50b3BvZ3JhZml4LmNvbS9HUFgvMS8xIiwiZ3B4Iik7cmV0dXJuIGkuc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiwieG1sbnM6eHNpIiwkbCksaS5zZXRBdHRyaWJ1dGVOUygkbCwieHNpOnNjaGVtYUxvY2F0aW9uIiwiaHR0cDovL3d3dy50b3BvZ3JhZml4LmNvbS9HUFgvMS8xIGh0dHA6Ly93d3cudG9wb2dyYWZpeC5jb20vR1BYLzEvMS9ncHgueHNkIiksaS5zZXRBdHRyaWJ1dGUoInZlcnNpb24iLCIxLjEiKSxpLnNldEF0dHJpYnV0ZSgiY3JlYXRvciIsIk9wZW5MYXllcnMiKSx2dSh7bm9kZTppfSxyZixUZix0LFtlXSksaX0sZX0oVGQpLG9mPWZ1KFFkLHtuYW1lOmh1KE5kKSxjbXQ6aHUoTmQpLGRlc2M6aHUoTmQpLHNyYzpodShOZCksbGluazp3ZixudW1iZXI6aHUoRmQpLGV4dGVuc2lvbnM6SWYsdHlwZTpodShOZCkscnRlcHQ6ZnVuY3Rpb24odCxlKXt2YXIgaT1ndSh7fSxzZix0LGUpO2lmKGkpe3ZhciByPWVbZS5sZW5ndGgtMV0sbj1yLmZsYXRDb29yZGluYXRlcyxvPXIubGF5b3V0T3B0aW9ucztDZihuLG8sdCxpKX19fSksc2Y9ZnUoUWQse2VsZTpodShiZCksdGltZTpodShQZCl9KSxhZj1mdShRZCx7bmFtZTpodShOZCksY210Omh1KE5kKSxkZXNjOmh1KE5kKSxzcmM6aHUoTmQpLGxpbms6d2YsbnVtYmVyOmh1KEZkKSx0eXBlOmh1KE5kKSxleHRlbnNpb25zOklmLHRya3NlZzpmdW5jdGlvbih0LGUpe3ZhciBpPWVbZS5sZW5ndGgtMV07X3UoaGYsdCxlKTt2YXIgcj1pLmZsYXRDb29yZGluYXRlcztpLmVuZHMucHVzaChyLmxlbmd0aCl9fSksaGY9ZnUoUWQse3Rya3B0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3Uoe30sbGYsdCxlKTtpZihpKXt2YXIgcj1lW2UubGVuZ3RoLTFdLG49ci5mbGF0Q29vcmRpbmF0ZXMsbz1yLmxheW91dE9wdGlvbnM7Q2YobixvLHQsaSl9fX0pLGxmPWZ1KFFkLHtlbGU6aHUoYmQpLHRpbWU6aHUoUGQpfSksdWY9ZnUoUWQse2VsZTpodShiZCksdGltZTpodShQZCksbWFndmFyOmh1KGJkKSxnZW9pZGhlaWdodDpodShiZCksbmFtZTpodShOZCksY210Omh1KE5kKSxkZXNjOmh1KE5kKSxzcmM6aHUoTmQpLGxpbms6d2Ysc3ltOmh1KE5kKSx0eXBlOmh1KE5kKSxmaXg6aHUoTmQpLHNhdDpodShGZCksaGRvcDpodShiZCksdmRvcDpodShiZCkscGRvcDpodShiZCksYWdlb2ZkZ3BzZGF0YTpodShiZCksZGdwc2lkOmh1KEZkKSxleHRlbnNpb25zOklmfSkscGY9WyJ0ZXh0IiwidHlwZSJdLGNmPWZ1KFFkLHt0ZXh0Omx1KGpkKSx0eXBlOmx1KGpkKX0pLGRmPWZ1KFFkLFsibmFtZSIsImNtdCIsImRlc2MiLCJzcmMiLCJsaW5rIiwibnVtYmVyIiwidHlwZSIsInJ0ZXB0Il0pLGZmPWZ1KFFkLHtuYW1lOmx1KGpkKSxjbXQ6bHUoamQpLGRlc2M6bHUoamQpLHNyYzpsdShqZCksbGluazpsdShiZiksbnVtYmVyOmx1KGtkKSx0eXBlOmx1KGpkKSxydGVwdDp1dShsdShNZikpfSksX2Y9ZnUoUWQsWyJlbGUiLCJ0aW1lIl0pLGdmPWZ1KFFkLFsibmFtZSIsImNtdCIsImRlc2MiLCJzcmMiLCJsaW5rIiwibnVtYmVyIiwidHlwZSIsInRya3NlZyJdKSx5Zj1mdShRZCx7bmFtZTpsdShqZCksY210Omx1KGpkKSxkZXNjOmx1KGpkKSxzcmM6bHUoamQpLGxpbms6bHUoYmYpLG51bWJlcjpsdShrZCksdHlwZTpsdShqZCksdHJrc2VnOnV1KGx1KGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj17bm9kZTp0fTtyLmdlb21ldHJ5TGF5b3V0PWUuZ2V0TGF5b3V0KCksci5wcm9wZXJ0aWVzPXt9LHZ1KHIsbWYsdmYsZS5nZXRDb29yZGluYXRlcygpLGkpfSkpfSksdmY9cHUoInRya3B0IiksbWY9ZnUoUWQse3Rya3B0Omx1KE1mKX0pLHhmPWZ1KFFkLFsiZWxlIiwidGltZSIsIm1hZ3ZhciIsImdlb2lkaGVpZ2h0IiwibmFtZSIsImNtdCIsImRlc2MiLCJzcmMiLCJsaW5rIiwic3ltIiwidHlwZSIsImZpeCIsInNhdCIsImhkb3AiLCJ2ZG9wIiwicGRvcCIsImFnZW9mZGdwc2RhdGEiLCJkZ3BzaWQiXSksRWY9ZnUoUWQse2VsZTpsdShEZCksdGltZTpsdShmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBEYXRlKDFlMyplKSxyPWkuZ2V0VVRDRnVsbFllYXIoKSsiLSIrV2koaS5nZXRVVENNb250aCgpKzEsMikrIi0iK1dpKGkuZ2V0VVRDRGF0ZSgpLDIpKyJUIitXaShpLmdldFVUQ0hvdXJzKCksMikrIjoiK1dpKGkuZ2V0VVRDTWludXRlcygpLDIpKyI6IitXaShpLmdldFVUQ1NlY29uZHMoKSwyKSsiWiI7dC5hcHBlbmRDaGlsZChRbC5jcmVhdGVUZXh0Tm9kZShyKSl9KSxtYWd2YXI6bHUoRGQpLGdlb2lkaGVpZ2h0Omx1KERkKSxuYW1lOmx1KGpkKSxjbXQ6bHUoamQpLGRlc2M6bHUoamQpLHNyYzpsdShqZCksbGluazpsdShiZiksc3ltOmx1KGpkKSx0eXBlOmx1KGpkKSxmaXg6bHUoamQpLHNhdDpsdShrZCksaGRvcDpsdShEZCksdmRvcDpsdShEZCkscGRvcDpsdShEZCksYWdlb2ZkZ3BzZGF0YTpsdShEZCksZGdwc2lkOmx1KGtkKX0pLFNmPXtQb2ludDoid3B0IixMaW5lU3RyaW5nOiJydGUiLE11bHRpTGluZVN0cmluZzoidHJrIn07ZnVuY3Rpb24gVGYodCxlLGkpe3ZhciByPXQuZ2V0R2VvbWV0cnkoKTtpZihyKXt2YXIgbj1TZltyLmdldFR5cGUoKV07aWYobilyZXR1cm4gdHUoZVtlLmxlbmd0aC0xXS5ub2RlLm5hbWVzcGFjZVVSSSxuKX19ZnVuY3Rpb24gQ2YodCxlLGkscil7cmV0dXJuIHQucHVzaChwYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJsb24iKSkscGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgibGF0IikpKSwiZWxlImluIHI/KHQucHVzaChyLmVsZSksZGVsZXRlIHIuZWxlLGUuaGFzWj0hMCk6dC5wdXNoKDApLCJ0aW1lImluIHI/KHQucHVzaChyLnRpbWUpLGRlbGV0ZSByLnRpbWUsZS5oYXNNPSEwKTp0LnB1c2goMCksdH1mdW5jdGlvbiBSZih0LGUsaSl7dmFyIHI9QXQuWFksbj0yO2lmKHQuaGFzWiYmdC5oYXNNPyhyPUF0LlhZWk0sbj00KTp0Lmhhc1o/KHI9QXQuWFlaLG49Myk6dC5oYXNNJiYocj1BdC5YWU0sbj0zKSw0IT09bil7Zm9yKHZhciBvPTAscz1lLmxlbmd0aC80O288cztvKyspZVtvKm5dPWVbNCpvXSxlW28qbisxXT1lWzQqbysxXSx0Lmhhc1omJihlW28qbisyXT1lWzQqbysyXSksdC5oYXNNJiYoZVtvKm4rMl09ZVs0Km8rM10pO2lmKGUubGVuZ3RoPWUubGVuZ3RoLzQqbixpKWZvcih2YXIgYT0wLGg9aS5sZW5ndGg7YTxoO2ErKylpW2FdPWlbYV0vNCpufXJldHVybiByfWZ1bmN0aW9uIHdmKHQsZSl7dmFyIGk9ZVtlLmxlbmd0aC0xXSxyPXQuZ2V0QXR0cmlidXRlKCJocmVmIik7bnVsbCE9PXImJihpLmxpbms9ciksX3UoZWYsdCxlKX1mdW5jdGlvbiBJZih0LGUpe2VbZS5sZW5ndGgtMV0uZXh0ZW5zaW9uc05vZGVfPXR9ZnVuY3Rpb24gTGYodCxlKXt2YXIgaT1lWzBdLHI9Z3Uoe2ZsYXRDb29yZGluYXRlczpbXSxsYXlvdXRPcHRpb25zOnt9fSxvZix0LGUpO2lmKHIpe3ZhciBuPXIuZmxhdENvb3JkaW5hdGVzO2RlbGV0ZSByLmZsYXRDb29yZGluYXRlczt2YXIgbz1yLmxheW91dE9wdGlvbnM7ZGVsZXRlIHIubGF5b3V0T3B0aW9uczt2YXIgcz1SZihvLG4pLGE9bmV3IGhyKG4scyk7ZGQoYSwhMSxpKTt2YXIgaD1uZXcgQihhKTtyZXR1cm4gaC5zZXRQcm9wZXJ0aWVzKHIpLGh9fWZ1bmN0aW9uIE9mKHQsZSl7dmFyIGk9ZVswXSxyPWd1KHtmbGF0Q29vcmRpbmF0ZXM6W10sZW5kczpbXSxsYXlvdXRPcHRpb25zOnt9fSxhZix0LGUpO2lmKHIpe3ZhciBuPXIuZmxhdENvb3JkaW5hdGVzO2RlbGV0ZSByLmZsYXRDb29yZGluYXRlczt2YXIgbz1yLmVuZHM7ZGVsZXRlIHIuZW5kczt2YXIgcz1yLmxheW91dE9wdGlvbnM7ZGVsZXRlIHIubGF5b3V0T3B0aW9uczt2YXIgYT1SZihzLG4sbyksaD1uZXcgUGMobixhLG8pO2RkKGgsITEsaSk7dmFyIGw9bmV3IEIoaCk7cmV0dXJuIGwuc2V0UHJvcGVydGllcyhyKSxsfX1mdW5jdGlvbiBQZih0LGUpe3ZhciBpPWVbMF0scj1ndSh7fSx1Zix0LGUpO2lmKHIpe3ZhciBuPXt9LG89Q2YoW10sbix0LHIpLHM9UmYobixvKSxhPW5ldyBjaShvLHMpO2RkKGEsITEsaSk7dmFyIGg9bmV3IEIoYSk7cmV0dXJuIGguc2V0UHJvcGVydGllcyhyKSxofX1mdW5jdGlvbiBiZih0LGUsaSl7dC5zZXRBdHRyaWJ1dGUoImhyZWYiLGUpO3ZhciByPWlbaS5sZW5ndGgtMV0ucHJvcGVydGllcyxuPVtyLmxpbmtUZXh0LHIubGlua1R5cGVdO3Z1KHtub2RlOnR9LGNmLGN1LG4saSxwZil9ZnVuY3Rpb24gTWYodCxlLGkpe3ZhciByPWlbaS5sZW5ndGgtMV0sbj1yLm5vZGUubmFtZXNwYWNlVVJJLG89ci5wcm9wZXJ0aWVzO3N3aXRjaCh0LnNldEF0dHJpYnV0ZU5TKG51bGwsImxhdCIsU3RyaW5nKGVbMV0pKSx0LnNldEF0dHJpYnV0ZU5TKG51bGwsImxvbiIsU3RyaW5nKGVbMF0pKSxyLmdlb21ldHJ5TGF5b3V0KXtjYXNlIEF0LlhZWk06MCE9PWVbM10mJihvLnRpbWU9ZVszXSk7Y2FzZSBBdC5YWVo6MCE9PWVbMl0mJihvLmVsZT1lWzJdKTticmVhaztjYXNlIEF0LlhZTTowIT09ZVsyXSYmKG8udGltZT1lWzJdKX12YXIgcz0icnRlcHQiPT10Lm5vZGVOYW1lP19mW25dOnhmW25dLGE9ZHUobyxzKTt2dSh7bm9kZTp0LHByb3BlcnRpZXM6b30sRWYsY3UsYSxpLHMpfXZhciBGZj1uZjtmdW5jdGlvbiBBZih0LGUpe2lmKCF0KXJldHVybiBudWxsO3ZhciBpO3N3aXRjaCh0LnR5cGUpe2Nhc2UgTnQuUE9JTlQ6aT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGNpKHQuY29vcmRpbmF0ZXMpfSh0KTticmVhaztjYXNlIE50LkxJTkVfU1RSSU5HOmk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBocih0LmNvb3JkaW5hdGVzKX0odCk7YnJlYWs7Y2FzZSBOdC5QT0xZR09OOmk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBJaSh0LmNvb3JkaW5hdGVzKX0odCk7YnJlYWs7Y2FzZSBOdC5NVUxUSV9QT0lOVDppPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYmModC5jb29yZGluYXRlcyl9KHQpO2JyZWFrO2Nhc2UgTnQuTVVMVElfTElORV9TVFJJTkc6aT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFBjKHQuY29vcmRpbmF0ZXMpfSh0KTticmVhaztjYXNlIE50Lk1VTFRJX1BPTFlHT046aT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZjKHQuY29vcmRpbmF0ZXMpfSh0KTticmVhaztjYXNlIE50LkdFT01FVFJZX0NPTExFQ1RJT046aT1mdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2VvbWV0cmllcy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIEFmKHQsZSl9KTtyZXR1cm4gbmV3IHVkKGkpfSh0KTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgR2VvSlNPTiB0eXBlOiAiK3QudHlwZSl9cmV0dXJuIGRkKGksITEsZSl9ZnVuY3Rpb24gTmYodCxlKXt2YXIgaSxyPSh0PWRkKHQsITAsZSkpLmdldFR5cGUoKTtzd2l0Y2gocil7Y2FzZSBOdC5QT0lOVDppPWZ1bmN0aW9uKHQsZSl7cmV0dXJue3R5cGU6IlBvaW50Iixjb29yZGluYXRlczp0LmdldENvb3JkaW5hdGVzKCl9fSh0KTticmVhaztjYXNlIE50LkxJTkVfU1RSSU5HOmk9ZnVuY3Rpb24odCxlKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dC5nZXRDb29yZGluYXRlcygpfX0odCk7YnJlYWs7Y2FzZSBOdC5QT0xZR09OOmk9ZnVuY3Rpb24odCxlKXt2YXIgaTtlJiYoaT1lLnJpZ2h0SGFuZGVkKTtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6dC5nZXRDb29yZGluYXRlcyhpKX19KHQsZSk7YnJlYWs7Y2FzZSBOdC5NVUxUSV9QT0lOVDppPWZ1bmN0aW9uKHQsZSl7cmV0dXJue3R5cGU6Ik11bHRpUG9pbnQiLGNvb3JkaW5hdGVzOnQuZ2V0Q29vcmRpbmF0ZXMoKX19KHQpO2JyZWFrO2Nhc2UgTnQuTVVMVElfTElORV9TVFJJTkc6aT1mdW5jdGlvbih0LGUpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQuZ2V0Q29vcmRpbmF0ZXMoKX19KHQpO2JyZWFrO2Nhc2UgTnQuTVVMVElfUE9MWUdPTjppPWZ1bmN0aW9uKHQsZSl7dmFyIGk7ZSYmKGk9ZS5yaWdodEhhbmRlZCk7cmV0dXJue3R5cGU6Ik11bHRpUG9seWdvbiIsY29vcmRpbmF0ZXM6dC5nZXRDb29yZGluYXRlcyhpKX19KHQsZSk7YnJlYWs7Y2FzZSBOdC5HRU9NRVRSWV9DT0xMRUNUSU9OOmk9ZnVuY3Rpb24odCxlKXtyZXR1cm57dHlwZToiR2VvbWV0cnlDb2xsZWN0aW9uIixnZW9tZXRyaWVzOnQuZ2V0R2VvbWV0cmllc0FycmF5KCkubWFwKGZ1bmN0aW9uKHQpe3ZhciBpPXUoe30sZSk7cmV0dXJuIGRlbGV0ZSBpLmZlYXR1cmVQcm9qZWN0aW9uLE5mKHQsaSl9KX19KHQsZSk7YnJlYWs7Y2FzZSBOdC5DSVJDTEU6aT17dHlwZToiR2VvbWV0cnlDb2xsZWN0aW9uIixnZW9tZXRyaWVzOltdfTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZTogIityKX1yZXR1cm4gaX12YXIgR2Y9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fTt0LmNhbGwodGhpcyksdGhpcy5kYXRhUHJvamVjdGlvbj1FZShpLmRhdGFQcm9qZWN0aW9uP2kuZGF0YVByb2plY3Rpb246IkVQU0c6NDMyNiIpLGkuZmVhdHVyZVByb2plY3Rpb24mJih0aGlzLmRlZmF1bHRGZWF0dXJlUHJvamVjdGlvbj1FZShpLmZlYXR1cmVQcm9qZWN0aW9uKSksdGhpcy5nZW9tZXRyeU5hbWVfPWkuZ2VvbWV0cnlOYW1lLHRoaXMuZXh0cmFjdEdlb21ldHJ5TmFtZV89aS5leHRyYWN0R2VvbWV0cnlOYW1lfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5yZWFkRmVhdHVyZUZyb21PYmplY3Q9ZnVuY3Rpb24odCxlKXt2YXIgaT1udWxsLHI9QWYoKGk9IkZlYXR1cmUiPT09dC50eXBlP3Q6e3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5OnQscHJvcGVydGllczpudWxsfSkuZ2VvbWV0cnksZSksbj1uZXcgQjtyZXR1cm4gdGhpcy5nZW9tZXRyeU5hbWVfP24uc2V0R2VvbWV0cnlOYW1lKHRoaXMuZ2VvbWV0cnlOYW1lXyk6dGhpcy5leHRyYWN0R2VvbWV0cnlOYW1lXyYmImdlb21ldHJ5X25hbWUiaW4gaSE9PXZvaWQgMCYmbi5zZXRHZW9tZXRyeU5hbWUoaS5nZW9tZXRyeV9uYW1lKSxuLnNldEdlb21ldHJ5KHIpLCJpZCJpbiBpJiZuLnNldElkKGkuaWQpLGkucHJvcGVydGllcyYmbi5zZXRQcm9wZXJ0aWVzKGkucHJvcGVydGllcyksbn0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVzRnJvbU9iamVjdD1mdW5jdGlvbih0LGUpe3ZhciBpPW51bGw7aWYoIkZlYXR1cmVDb2xsZWN0aW9uIj09PXQudHlwZSl7aT1bXTtmb3IodmFyIHI9dC5mZWF0dXJlcyxuPTAsbz1yLmxlbmd0aDtuPG87KytuKWkucHVzaCh0aGlzLnJlYWRGZWF0dXJlRnJvbU9iamVjdChyW25dLGUpKX1lbHNlIGk9W3RoaXMucmVhZEZlYXR1cmVGcm9tT2JqZWN0KHQsZSldO3JldHVybiBpfSxlLnByb3RvdHlwZS5yZWFkR2VvbWV0cnlGcm9tT2JqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEFmKHQsZSl9LGUucHJvdG90eXBlLnJlYWRQcm9qZWN0aW9uRnJvbU9iamVjdD1mdW5jdGlvbih0KXt2YXIgZSxpPXQuY3JzO3JldHVybiBpPyJuYW1lIj09aS50eXBlP2U9RWUoaS5wcm9wZXJ0aWVzLm5hbWUpOlkoITEsMzYpOmU9dGhpcy5kYXRhUHJvamVjdGlvbixlfSxlLnByb3RvdHlwZS53cml0ZUZlYXR1cmVPYmplY3Q9ZnVuY3Rpb24odCxlKXtlPXRoaXMuYWRhcHRPcHRpb25zKGUpO3ZhciBpPXt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTpudWxsLHByb3BlcnRpZXM6bnVsbH0scj10LmdldElkKCk7dm9pZCAwIT09ciYmKGkuaWQ9cik7dmFyIG49dC5nZXRHZW9tZXRyeSgpO24mJihpLmdlb21ldHJ5PU5mKG4sZSkpO3ZhciBvPXQuZ2V0UHJvcGVydGllcygpO3JldHVybiBkZWxldGUgb1t0LmdldEdlb21ldHJ5TmFtZSgpXSxkKG8pfHwoaS5wcm9wZXJ0aWVzPW8pLGl9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZXNPYmplY3Q9ZnVuY3Rpb24odCxlKXtlPXRoaXMuYWRhcHRPcHRpb25zKGUpO2Zvcih2YXIgaT1bXSxyPTAsbj10Lmxlbmd0aDtyPG47KytyKWkucHVzaCh0aGlzLndyaXRlRmVhdHVyZU9iamVjdCh0W3JdLGUpKTtyZXR1cm57dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOml9fSxlLnByb3RvdHlwZS53cml0ZUdlb21ldHJ5T2JqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE5mKHQsdGhpcy5hZGFwdE9wdGlvbnMoZSkpfSxlfShfZCk7ZnVuY3Rpb24gRGYodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P3Q6IiJ9dmFyIGtmLGpmLFVmLFlmLEJmLFZmLFhmLHpmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gSGwuVEVYVH0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZWFkRmVhdHVyZUZyb21UZXh0KERmKHQpLHRoaXMuYWRhcHRPcHRpb25zKGUpKX0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVGcm9tVGV4dD1mdW5jdGlvbih0LGUpe3JldHVybiByKCl9LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlcz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlYWRGZWF0dXJlc0Zyb21UZXh0KERmKHQpLHRoaXMuYWRhcHRPcHRpb25zKGUpKX0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVzRnJvbVRleHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS5yZWFkR2VvbWV0cnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZWFkR2VvbWV0cnlGcm9tVGV4dChEZih0KSx0aGlzLmFkYXB0T3B0aW9ucyhlKSl9LGUucHJvdG90eXBlLnJlYWRHZW9tZXRyeUZyb21UZXh0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUucmVhZFByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVhZFByb2plY3Rpb25Gcm9tVGV4dChEZih0KSl9LGUucHJvdG90eXBlLnJlYWRQcm9qZWN0aW9uRnJvbVRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVByb2plY3Rpb259LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLndyaXRlRmVhdHVyZVRleHQodCx0aGlzLmFkYXB0T3B0aW9ucyhlKSl9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZVRleHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigpfSxlLnByb3RvdHlwZS53cml0ZUZlYXR1cmVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMud3JpdGVGZWF0dXJlc1RleHQodCx0aGlzLmFkYXB0T3B0aW9ucyhlKSl9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZXNUZXh0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoKX0sZS5wcm90b3R5cGUud3JpdGVHZW9tZXRyeT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLndyaXRlR2VvbWV0cnlUZXh0KHQsdGhpcy5hZGFwdE9wdGlvbnMoZSkpfSxlLnByb3RvdHlwZS53cml0ZUdlb21ldHJ5VGV4dD1mdW5jdGlvbih0LGUpe3JldHVybiByKCl9LGV9KGNkKSxXZj17QkFST01FVFJJQzoiYmFyb21ldHJpYyIsR1BTOiJncHMiLE5PTkU6Im5vbmUifSxLZj0vXkIoXGR7Mn0pKFxkezJ9KShcZHsyfSkoXGR7Mn0pKFxkezV9KShbTlNdKShcZHszfSkoXGR7NX0pKFtFV10pKFtBVl0pKFxkezV9KShcZHs1fSkvLEhmPS9eSC4oW0EtWl17M30pLio/OiguKikvLFpmPS9eSEZEVEUoXGR7Mn0pKFxkezJ9KShcZHsyfSkvLHFmPS9cclxufFxyfFxuLyxKZj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKTt2YXIgaT1lfHx7fTt0aGlzLmRhdGFQcm9qZWN0aW9uPUVlKCJFUFNHOjQzMjYiKSx0aGlzLmFsdGl0dWRlTW9kZV89aS5hbHRpdHVkZU1vZGU/aS5hbHRpdHVkZU1vZGU6V2YuTk9ORX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUucmVhZEZlYXR1cmVGcm9tVGV4dD1mdW5jdGlvbih0LGUpe3ZhciBpLHIsbj10aGlzLmFsdGl0dWRlTW9kZV8sbz10LnNwbGl0KHFmKSxzPXt9LGE9W10saD0yZTMsbD0wLHU9MSxwPS0xO2ZvcihpPTAscj1vLmxlbmd0aDtpPHI7KytpKXt2YXIgYz1vW2ldLGQ9dm9pZCAwO2lmKCJCIj09Yy5jaGFyQXQoMCkpe2lmKGQ9S2YuZXhlYyhjKSl7dmFyIGY9cGFyc2VJbnQoZFsxXSwxMCksXz1wYXJzZUludChkWzJdLDEwKSxnPXBhcnNlSW50KGRbM10sMTApLHk9cGFyc2VJbnQoZFs0XSwxMCkrcGFyc2VJbnQoZFs1XSwxMCkvNmU0OyJTIj09ZFs2XSYmKHk9LXkpO3ZhciB2PXBhcnNlSW50KGRbN10sMTApK3BhcnNlSW50KGRbOF0sMTApLzZlNDtpZigiVyI9PWRbOV0mJih2PS12KSxhLnB1c2godix5KSxuIT1XZi5OT05FKXt2YXIgbT12b2lkIDA7bT1uPT1XZi5HUFM/cGFyc2VJbnQoZFsxMV0sMTApOm49PVdmLkJBUk9NRVRSSUM/cGFyc2VJbnQoZFsxMl0sMTApOjAsYS5wdXNoKG0pfXZhciB4PURhdGUuVVRDKGgsbCx1LGYsXyxnKTt4PHAmJih4PURhdGUuVVRDKGgsbCx1KzEsZixfLGcpKSxhLnB1c2goeC8xZTMpLHA9eH19ZWxzZSJIIj09Yy5jaGFyQXQoMCkmJigoZD1aZi5leGVjKGMpKT8odT1wYXJzZUludChkWzFdLDEwKSxsPXBhcnNlSW50KGRbMl0sMTApLTEsaD0yZTMrcGFyc2VJbnQoZFszXSwxMCkpOihkPUhmLmV4ZWMoYykpJiYoc1tkWzFdXT1kWzJdLnRyaW0oKSkpfWlmKDA9PT1hLmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgRT1uPT1XZi5OT05FP0F0LlhZTTpBdC5YWVpNLFM9bmV3IGhyKGEsRSksVD1uZXcgQihkZChTLCExLGUpKTtyZXR1cm4gVC5zZXRQcm9wZXJ0aWVzKHMpLFR9LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlc0Zyb21UZXh0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5yZWFkRmVhdHVyZUZyb21UZXh0KHQsZSk7cmV0dXJuIGk/W2ldOltdfSxlfSh6ZiksUWY9WyJodHRwOi8vd3d3Lmdvb2dsZS5jb20va21sL2V4dC8yLjIiXSwkZj1bbnVsbCwiaHR0cDovL2VhcnRoLmdvb2dsZS5jb20va21sLzIuMCIsImh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLjEiLCJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi4yIiwiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9rbWwvMi4yIl0sdF89e2ZyYWN0aW9uOnd1LkZSQUNUSU9OLHBpeGVsczp3dS5QSVhFTFMsaW5zZXRQaXhlbHM6d3UuUElYRUxTfSxlXz1mdSgkZix7RXh0ZW5kZWREYXRhOkhfLFJlZ2lvbjpaXyxNdWx0aUdlb21ldHJ5Omh1KGpfLCJnZW9tZXRyeSIpLExpbmVTdHJpbmc6aHUoR18sImdlb21ldHJ5IiksTGluZWFyUmluZzpodShEXywiZ2VvbWV0cnkiKSxQb2ludDpodShVXywiZ2VvbWV0cnkiKSxQb2x5Z29uOmh1KEJfLCJnZW9tZXRyeSIpLFN0eWxlOmh1KFhfKSxTdHlsZU1hcDpmdW5jdGlvbih0LGUpe3ZhciBpPVNfKHQsZSk7aWYoIWkpcmV0dXJuO3ZhciByPWVbZS5sZW5ndGgtMV07QXJyYXkuaXNBcnJheShpKT9yLlN0eWxlPWk6InN0cmluZyI9PXR5cGVvZiBpP3Iuc3R5bGVVcmw9aTpZKCExLDM4KX0sYWRkcmVzczpodShOZCksZGVzY3JpcHRpb246aHUoTmQpLG5hbWU6aHUoTmQpLG9wZW46aHUoTGQpLHBob25lTnVtYmVyOmh1KE5kKSxzdHlsZVVybDpodShtXyksdmlzaWJpbGl0eTpodShMZCl9LGZ1KFFmLHtNdWx0aVRyYWNrOmh1KGZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3UoW10sT18sdCxlKTtpZighaSlyZXR1cm47cmV0dXJuIG5ldyBQYyhpKX0sImdlb21ldHJ5IiksVHJhY2s6aHUoYl8sImdlb21ldHJ5Iil9KSksaV89ZnUoJGYse0V4dGVuZGVkRGF0YTpIXyxSZWdpb246Wl8sTGluazpmdW5jdGlvbih0LGUpe191KHJfLHQsZSl9LGFkZHJlc3M6aHUoTmQpLGRlc2NyaXB0aW9uOmh1KE5kKSxuYW1lOmh1KE5kKSxvcGVuOmh1KExkKSxwaG9uZU51bWJlcjpodShOZCksdmlzaWJpbGl0eTpodShMZCl9KSxyXz1mdSgkZix7aHJlZjpodShtXyl9KSxuXz1mdSgkZix7TGF0TG9uQWx0Qm94OmZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3Uoe30sUV8sdCxlKTtpZighaSlyZXR1cm47dmFyIHI9ZVtlLmxlbmd0aC0xXSxuPVtwYXJzZUZsb2F0KGkud2VzdCkscGFyc2VGbG9hdChpLnNvdXRoKSxwYXJzZUZsb2F0KGkuZWFzdCkscGFyc2VGbG9hdChpLm5vcnRoKV07ci5leHRlbnQ9bixyLmFsdGl0dWRlTW9kZT1pLmFsdGl0dWRlTW9kZSxyLm1pbkFsdGl0dWRlPXBhcnNlRmxvYXQoaS5taW5BbHRpdHVkZSksci5tYXhBbHRpdHVkZT1wYXJzZUZsb2F0KGkubWF4QWx0aXR1ZGUpfSxMb2Q6ZnVuY3Rpb24odCxlKXt2YXIgaT1ndSh7fSwkXyx0LGUpO2lmKCFpKXJldHVybjt2YXIgcj1lW2UubGVuZ3RoLTFdO3IubWluTG9kUGl4ZWxzPXBhcnNlRmxvYXQoaS5taW5Mb2RQaXhlbHMpLHIubWF4TG9kUGl4ZWxzPXBhcnNlRmxvYXQoaS5tYXhMb2RQaXhlbHMpLHIubWluRmFkZUV4dGVudD1wYXJzZUZsb2F0KGkubWluRmFkZUV4dGVudCksci5tYXhGYWRlRXh0ZW50PXBhcnNlRmxvYXQoaS5tYXhGYWRlRXh0ZW50KX19KSxvXz1mdSgkZixbIkRvY3VtZW50IiwiUGxhY2VtYXJrIl0pLHNfPWZ1KCRmLHtEb2N1bWVudDpsdShmdW5jdGlvbih0LGUsaSl7dnUoe25vZGU6dH0sbmcsb2csZSxpLHZvaWQgMCx0aGlzKX0pLFBsYWNlbWFyazpsdShPZyl9KSxhXz1udWxsO3ZhciBoXyxsXz1udWxsO3ZhciB1XyxwXz1udWxsO3ZhciBjXz1udWxsO3ZhciBkXz1udWxsO3ZhciBmXz1udWxsO3ZhciBfXz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKTt2YXIgaT1lfHx7fTtmX3x8KGFfPW5ldyBtcih7Y29sb3I6a2Y9WzI1NSwyNTUsMjU1LDFdfSksamY9WzIwLDJdLFVmPXd1LlBJWEVMUyxZZj13dS5QSVhFTFMsQmY9WzY0LDY0XSxWZj0iaHR0cHM6Ly9tYXBzLmdvb2dsZS5jb20vbWFwZmlsZXMva21sL3B1c2hwaW4veWx3LXB1c2hwaW4ucG5nIixYZj0uNSxsXz1uZXcgT3Uoe2FuY2hvcjpqZixhbmNob3JPcmlnaW46THUuQk9UVE9NX0xFRlQsYW5jaG9yWFVuaXRzOlVmLGFuY2hvcllVbml0czpZZixjcm9zc09yaWdpbjoiYW5vbnltb3VzIixyb3RhdGlvbjowLHNjYWxlOlhmLHNpemU6QmYsc3JjOlZmfSksaF89Ik5PX0lNQUdFIixwXz1uZXcgRXIoe2NvbG9yOmtmLHdpZHRoOjF9KSx1Xz1uZXcgRXIoe2NvbG9yOls1MSw1MSw1MSwxXSx3aWR0aDoyfSksY189bmV3IFJyKHtmb250OiJib2xkIDE2cHggSGVsdmV0aWNhIixmaWxsOmFfLHN0cm9rZTp1XyxzY2FsZTouOH0pLGRfPW5ldyBOdSh7ZmlsbDphXyxpbWFnZTpsXyx0ZXh0OmNfLHN0cm9rZTpwXyx6SW5kZXg6MH0pLGZfPVtkX10pLHRoaXMuZGF0YVByb2plY3Rpb249RWUoIkVQU0c6NDMyNiIpLHRoaXMuZGVmYXVsdFN0eWxlXz1pLmRlZmF1bHRTdHlsZT9pLmRlZmF1bHRTdHlsZTpmXyx0aGlzLmV4dHJhY3RTdHlsZXNfPXZvaWQgMD09PWkuZXh0cmFjdFN0eWxlc3x8aS5leHRyYWN0U3R5bGVzLHRoaXMud3JpdGVTdHlsZXNfPXZvaWQgMD09PWkud3JpdGVTdHlsZXN8fGkud3JpdGVTdHlsZXMsdGhpcy5zaGFyZWRTdHlsZXNfPXt9LHRoaXMuc2hvd1BvaW50TmFtZXNfPXZvaWQgMD09PWkuc2hvd1BvaW50TmFtZXN8fGkuc2hvd1BvaW50TmFtZXN9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnJlYWREb2N1bWVudE9yRm9sZGVyXz1mdW5jdGlvbih0LGUpe3ZhciBpPWd1KFtdLGZ1KCRmLHtEb2N1bWVudDpudSh0aGlzLnJlYWREb2N1bWVudE9yRm9sZGVyXyx0aGlzKSxGb2xkZXI6bnUodGhpcy5yZWFkRG9jdW1lbnRPckZvbGRlcl8sdGhpcyksUGxhY2VtYXJrOm91KHRoaXMucmVhZFBsYWNlbWFya18sdGhpcyksU3R5bGU6dGhpcy5yZWFkU2hhcmVkU3R5bGVfLmJpbmQodGhpcyksU3R5bGVNYXA6dGhpcy5yZWFkU2hhcmVkU3R5bGVNYXBfLmJpbmQodGhpcyl9KSx0LGUsdGhpcyk7cmV0dXJuIGl8fHZvaWQgMH0sZS5wcm90b3R5cGUucmVhZFBsYWNlbWFya189ZnVuY3Rpb24odCxlKXt2YXIgaT1ndSh7Z2VvbWV0cnk6bnVsbH0sZV8sdCxlKTtpZihpKXt2YXIgcj1uZXcgQixuPXQuZ2V0QXR0cmlidXRlKCJpZCIpO251bGwhPT1uJiZyLnNldElkKG4pO3ZhciBvPWVbMF0scz1pLmdlb21ldHJ5O2lmKHMmJmRkKHMsITEsbyksci5zZXRHZW9tZXRyeShzKSxkZWxldGUgaS5nZW9tZXRyeSx0aGlzLmV4dHJhY3RTdHlsZXNfKXt2YXIgYT1mdW5jdGlvbih0LGUsaSxyLG4pe3JldHVybiBmdW5jdGlvbihvLHMpe3ZhciBhLGg9bixsPSIiO2lmKGgpe3ZhciB1PW8uZ2V0R2VvbWV0cnkoKTt1JiYoaD11LmdldFR5cGUoKT09PU50LlBPSU5UKX1pZihoJiYobD1vLmdldCgibmFtZSIpLGg9aCYmISFsKSx0KXJldHVybiBoPyhhPWdfKHRbMF0sbCksdC5jb25jYXQoYSkpOnQ7aWYoZSl7dmFyIHA9ZnVuY3Rpb24gdChlLGkscil7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZToic3RyaW5nIj09dHlwZW9mIGU/KCEoZSBpbiByKSYmIiMiK2UgaW4gciYmKGU9IiMiK2UpLHQocltlXSxpLHIpKTppfShlLGkscik7cmV0dXJuIGg/KGE9Z18ocFswXSxsKSxwLmNvbmNhdChhKSk6cH1yZXR1cm4gaD8oYT1nXyhpWzBdLGwpLGkuY29uY2F0KGEpKTppfX0oaS5TdHlsZSxpLnN0eWxlVXJsLHRoaXMuZGVmYXVsdFN0eWxlXyx0aGlzLnNoYXJlZFN0eWxlc18sdGhpcy5zaG93UG9pbnROYW1lc18pO3Iuc2V0U3R5bGUoYSl9cmV0dXJuIGRlbGV0ZSBpLlN0eWxlLHIuc2V0UHJvcGVydGllcyhpKSxyfX0sZS5wcm90b3R5cGUucmVhZFNoYXJlZFN0eWxlXz1mdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKG51bGwhPT1pKXt2YXIgcj1YXyh0LGUpO2lmKHIpe3ZhciBuLG89dC5iYXNlVVJJO2lmKG8mJiJhYm91dDpibGFuayIhPW98fChvPXdpbmRvdy5sb2NhdGlvbi5ocmVmKSxvKW49bmV3IFVSTCgiIyIraSxvKS5ocmVmO2Vsc2Ugbj0iIyIraTt0aGlzLnNoYXJlZFN0eWxlc19bbl09cn19fSxlLnByb3RvdHlwZS5yZWFkU2hhcmVkU3R5bGVNYXBfPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXRBdHRyaWJ1dGUoImlkIik7aWYobnVsbCE9PWkpe3ZhciByPVNfKHQsZSk7aWYocil7dmFyIG4sbz10LmJhc2VVUkk7aWYobyYmImFib3V0OmJsYW5rIiE9b3x8KG89d2luZG93LmxvY2F0aW9uLmhyZWYpLG8pbj1uZXcgVVJMKCIjIitpLG8pLmhyZWY7ZWxzZSBuPSIjIitpO3RoaXMuc2hhcmVkU3R5bGVzX1tuXT1yfX19LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlRnJvbU5vZGU9ZnVuY3Rpb24odCxlKXtpZighWCgkZix0Lm5hbWVzcGFjZVVSSSkpcmV0dXJuIG51bGw7dmFyIGk9dGhpcy5yZWFkUGxhY2VtYXJrXyh0LFt0aGlzLmdldFJlYWRPcHRpb25zKHQsZSldKTtyZXR1cm4gaXx8bnVsbH0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVzRnJvbU5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgaTtpZighWCgkZix0Lm5hbWVzcGFjZVVSSSkpcmV0dXJuW107dmFyIHI9dC5sb2NhbE5hbWU7aWYoIkRvY3VtZW50Ij09cnx8IkZvbGRlciI9PXIpcmV0dXJuKGk9dGhpcy5yZWFkRG9jdW1lbnRPckZvbGRlcl8odCxbdGhpcy5nZXRSZWFkT3B0aW9ucyh0LGUpXSkpfHxbXTtpZigiUGxhY2VtYXJrIj09cil7dmFyIG49dGhpcy5yZWFkUGxhY2VtYXJrXyh0LFt0aGlzLmdldFJlYWRPcHRpb25zKHQsZSldKTtyZXR1cm4gbj9bbl06W119aWYoImttbCI9PXIpe2k9W107Zm9yKHZhciBvPXQuZmlyc3RFbGVtZW50Q2hpbGQ7bztvPW8ubmV4dEVsZW1lbnRTaWJsaW5nKXt2YXIgcz10aGlzLnJlYWRGZWF0dXJlc0Zyb21Ob2RlKG8sZSk7cyYmSyhpLHMpfXJldHVybiBpfXJldHVybltdfSxlLnByb3RvdHlwZS5yZWFkTmFtZT1mdW5jdGlvbih0KXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBlPXJ1KHQpO3JldHVybiB0aGlzLnJlYWROYW1lRnJvbURvY3VtZW50KGUpfXJldHVybiBpdSh0KT90aGlzLnJlYWROYW1lRnJvbURvY3VtZW50KHQpOnRoaXMucmVhZE5hbWVGcm9tTm9kZSh0KX19LGUucHJvdG90eXBlLnJlYWROYW1lRnJvbURvY3VtZW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBpPXRoaXMucmVhZE5hbWVGcm9tTm9kZShlKTtpZihpKXJldHVybiBpfX0sZS5wcm90b3R5cGUucmVhZE5hbWVGcm9tTm9kZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5maXJzdEVsZW1lbnRDaGlsZDtlO2U9ZS5uZXh0RWxlbWVudFNpYmxpbmcpaWYoWCgkZixlLm5hbWVzcGFjZVVSSSkmJiJuYW1lIj09ZS5sb2NhbE5hbWUpcmV0dXJuIE5kKGUpO2Zvcih2YXIgaT10LmZpcnN0RWxlbWVudENoaWxkO2k7aT1pLm5leHRFbGVtZW50U2libGluZyl7dmFyIHI9aS5sb2NhbE5hbWU7aWYoWCgkZixpLm5hbWVzcGFjZVVSSSkmJigiRG9jdW1lbnQiPT1yfHwiRm9sZGVyIj09cnx8IlBsYWNlbWFyayI9PXJ8fCJrbWwiPT1yKSl7dmFyIG49dGhpcy5yZWFkTmFtZUZyb21Ob2RlKGkpO2lmKG4pcmV0dXJuIG59fX0sZS5wcm90b3R5cGUucmVhZE5ldHdvcmtMaW5rcz1mdW5jdGlvbih0KXt2YXIgZT1bXTtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBpPXJ1KHQpO0soZSx0aGlzLnJlYWROZXR3b3JrTGlua3NGcm9tRG9jdW1lbnQoaSkpfWVsc2UgaXUodCk/SyhlLHRoaXMucmVhZE5ldHdvcmtMaW5rc0Zyb21Eb2N1bWVudCh0KSk6SyhlLHRoaXMucmVhZE5ldHdvcmtMaW5rc0Zyb21Ob2RlKHQpKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUucmVhZE5ldHdvcmtMaW5rc0Zyb21Eb2N1bWVudD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT10LmZpcnN0Q2hpbGQ7aTtpPWkubmV4dFNpYmxpbmcpaS5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUmJksoZSx0aGlzLnJlYWROZXR3b3JrTGlua3NGcm9tTm9kZShpKSk7cmV0dXJuIGV9LGUucHJvdG90eXBlLnJlYWROZXR3b3JrTGlua3NGcm9tTm9kZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT10LmZpcnN0RWxlbWVudENoaWxkO2k7aT1pLm5leHRFbGVtZW50U2libGluZylpZihYKCRmLGkubmFtZXNwYWNlVVJJKSYmIk5ldHdvcmtMaW5rIj09aS5sb2NhbE5hbWUpe3ZhciByPWd1KHt9LGlfLGksW10pO2UucHVzaChyKX1mb3IodmFyIG49dC5maXJzdEVsZW1lbnRDaGlsZDtuO249bi5uZXh0RWxlbWVudFNpYmxpbmcpe3ZhciBvPW4ubG9jYWxOYW1lOyFYKCRmLG4ubmFtZXNwYWNlVVJJKXx8IkRvY3VtZW50IiE9byYmIkZvbGRlciIhPW8mJiJrbWwiIT1vfHxLKGUsdGhpcy5yZWFkTmV0d29ya0xpbmtzRnJvbU5vZGUobikpfXJldHVybiBlfSxlLnByb3RvdHlwZS5yZWFkUmVnaW9uPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIGk9cnUodCk7SyhlLHRoaXMucmVhZFJlZ2lvbkZyb21Eb2N1bWVudChpKSl9ZWxzZSBpdSh0KT9LKGUsdGhpcy5yZWFkUmVnaW9uRnJvbURvY3VtZW50KHQpKTpLKGUsdGhpcy5yZWFkUmVnaW9uRnJvbU5vZGUodCkpO3JldHVybiBlfSxlLnByb3RvdHlwZS5yZWFkUmVnaW9uRnJvbURvY3VtZW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPXQuZmlyc3RDaGlsZDtpO2k9aS5uZXh0U2libGluZylpLm5vZGVUeXBlPT1Ob2RlLkVMRU1FTlRfTk9ERSYmSyhlLHRoaXMucmVhZFJlZ2lvbkZyb21Ob2RlKGkpKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUucmVhZFJlZ2lvbkZyb21Ob2RlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPXQuZmlyc3RFbGVtZW50Q2hpbGQ7aTtpPWkubmV4dEVsZW1lbnRTaWJsaW5nKWlmKFgoJGYsaS5uYW1lc3BhY2VVUkkpJiYiUmVnaW9uIj09aS5sb2NhbE5hbWUpe3ZhciByPWd1KHt9LG5fLGksW10pO2UucHVzaChyKX1mb3IodmFyIG49dC5maXJzdEVsZW1lbnRDaGlsZDtuO249bi5uZXh0RWxlbWVudFNpYmxpbmcpe3ZhciBvPW4ubG9jYWxOYW1lOyFYKCRmLG4ubmFtZXNwYWNlVVJJKXx8IkRvY3VtZW50IiE9byYmIkZvbGRlciIhPW8mJiJrbWwiIT1vfHxLKGUsdGhpcy5yZWFkUmVnaW9uRnJvbU5vZGUobikpfXJldHVybiBlfSxlLnByb3RvdHlwZS53cml0ZUZlYXR1cmVzTm9kZT1mdW5jdGlvbih0LGUpe2U9dGhpcy5hZGFwdE9wdGlvbnMoZSk7dmFyIGk9dHUoJGZbNF0sImttbCIpLHI9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjtpLnNldEF0dHJpYnV0ZU5TKHIsInhtbG5zOmd4IixRZlswXSksaS5zZXRBdHRyaWJ1dGVOUyhyLCJ4bWxuczp4c2kiLCRsKSxpLnNldEF0dHJpYnV0ZU5TKCRsLCJ4c2k6c2NoZW1hTG9jYXRpb24iLCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2ttbC8yLjIgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20va21sL3NjaGVtYS9rbWwyMmd4LnhzZCIpO3ZhciBuPXtub2RlOml9LG89e307dC5sZW5ndGg+MT9vLkRvY3VtZW50PXQ6MT09dC5sZW5ndGgmJihvLlBsYWNlbWFyaz10WzBdKTt2YXIgcz1vX1tpLm5hbWVzcGFjZVVSSV0sYT1kdShvLHMpO3JldHVybiB2dShuLHNfLGN1LGEsW2VdLHMsdGhpcyksaX0sZX0oVGQpO2Z1bmN0aW9uIGdfKHQsZSl7dmFyIGk9bnVsbCxyPVswLDBdLG49InN0YXJ0IjtpZih0LmdldEltYWdlKCkpe3ZhciBvPXQuZ2V0SW1hZ2UoKS5nZXRJbWFnZVNpemUoKTtpZihudWxsPT09byYmKG89QmYpLDI9PW8ubGVuZ3RoKXt2YXIgcz10LmdldEltYWdlKCkuZ2V0U2NhbGUoKTtyWzBdPXMqb1swXS8yLHJbMV09LXMqb1sxXS8yLG49ImxlZnQifX1pZihudWxsIT09dC5nZXRUZXh0KCkpe3ZhciBhPXQuZ2V0VGV4dCgpOyhpPWEuY2xvbmUoKSkuc2V0Rm9udChhLmdldEZvbnQoKXx8Y18uZ2V0Rm9udCgpKSxpLnNldFNjYWxlKGEuZ2V0U2NhbGUoKXx8Y18uZ2V0U2NhbGUoKSksaS5zZXRGaWxsKGEuZ2V0RmlsbCgpfHxjXy5nZXRGaWxsKCkpLGkuc2V0U3Ryb2tlKGEuZ2V0U3Ryb2tlKCl8fHVfKX1lbHNlIGk9Y18uY2xvbmUoKTtyZXR1cm4gaS5zZXRUZXh0KGUpLGkuc2V0T2Zmc2V0WChyWzBdKSxpLnNldE9mZnNldFkoclsxXSksaS5zZXRUZXh0QWxpZ24obiksbmV3IE51KHt0ZXh0Oml9KX1mdW5jdGlvbiB5Xyh0KXt2YXIgZT1ldSh0LCExKSxpPS9eXHMqIz9ccyooWzAtOUEtRmEtZl17OH0pXHMqJC8uZXhlYyhlKTtpZihpKXt2YXIgcj1pWzFdO3JldHVybltwYXJzZUludChyLnN1YnN0cig2LDIpLDE2KSxwYXJzZUludChyLnN1YnN0cig0LDIpLDE2KSxwYXJzZUludChyLnN1YnN0cigyLDIpLDE2KSxwYXJzZUludChyLnN1YnN0cigwLDIpLDE2KS8yNTVdfX1mdW5jdGlvbiB2Xyh0KXtmb3IodmFyIGUsaT1ldSh0LCExKSxyPVtdLG49L15ccyooWytcLV0/XGQqXC4/XGQrKD86ZVsrXC1dP1xkKyk/KVxzKixccyooWytcLV0/XGQqXC4/XGQrKD86ZVsrXC1dP1xkKyk/KSg/OlxzKixccyooWytcLV0/XGQqXC4/XGQrKD86ZVsrXC1dP1xkKyk/KSk/XHMqL2k7ZT1uLmV4ZWMoaSk7KXt2YXIgbz1wYXJzZUZsb2F0KGVbMV0pLHM9cGFyc2VGbG9hdChlWzJdKSxhPWVbM10/cGFyc2VGbG9hdChlWzNdKTowO3IucHVzaChvLHMsYSksaT1pLnN1YnN0cihlWzBdLmxlbmd0aCl9aWYoIiI9PT1pKXJldHVybiByfWZ1bmN0aW9uIG1fKHQpe3ZhciBlPWV1KHQsITEpLnRyaW0oKSxpPXQuYmFzZVVSSTtyZXR1cm4gaSYmImFib3V0OmJsYW5rIiE9aXx8KGk9d2luZG93LmxvY2F0aW9uLmhyZWYpLGk/bmV3IFVSTChlLGkpLmhyZWY6ZX1mdW5jdGlvbiB4Xyh0KXtyZXR1cm4gYmQodCl9dmFyIEVfPWZ1KCRmLHtQYWlyOmZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3Uoe30scV8sdCxlKTtpZighaSlyZXR1cm47dmFyIHI9aS5rZXk7aWYociYmIm5vcm1hbCI9PXIpe3ZhciBuPWkuc3R5bGVVcmw7biYmKGVbZS5sZW5ndGgtMV09bik7dmFyIG89aS5TdHlsZTtvJiYoZVtlLmxlbmd0aC0xXT1vKX19fSk7ZnVuY3Rpb24gU18odCxlKXtyZXR1cm4gZ3Uodm9pZCAwLEVfLHQsZSl9dmFyIFRfPWZ1KCRmLHtJY29uOmh1KGZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3Uoe30sTV8sdCxlKTtyZXR1cm4gaXx8bnVsbH0pLGhlYWRpbmc6aHUoYmQpLGhvdFNwb3Q6aHUoZnVuY3Rpb24odCl7dmFyIGUsaT10LmdldEF0dHJpYnV0ZSgieHVuaXRzIikscj10LmdldEF0dHJpYnV0ZSgieXVuaXRzIik7cmV0dXJuIGU9Imluc2V0UGl4ZWxzIiE9PWk/Imluc2V0UGl4ZWxzIiE9PXI/THUuQk9UVE9NX0xFRlQ6THUuVE9QX0xFRlQ6Imluc2V0UGl4ZWxzIiE9PXI/THUuQk9UVE9NX1JJR0hUOkx1LlRPUF9SSUdIVCx7eDpwYXJzZUZsb2F0KHQuZ2V0QXR0cmlidXRlKCJ4IikpLHh1bml0czp0X1tpXSx5OnBhcnNlRmxvYXQodC5nZXRBdHRyaWJ1dGUoInkiKSkseXVuaXRzOnRfW3JdLG9yaWdpbjplfX0pLHNjYWxlOmh1KHhfKX0pO3ZhciBDXz1mdSgkZix7Y29sb3I6aHUoeV8pLHNjYWxlOmh1KHhfKX0pO3ZhciBSXz1mdSgkZix7Y29sb3I6aHUoeV8pLHdpZHRoOmh1KGJkKX0pO3ZhciB3Xz1mdSgkZix7Y29sb3I6aHUoeV8pLGZpbGw6aHUoTGQpLG91dGxpbmU6aHUoTGQpfSk7dmFyIElfPWZ1KCRmLHtjb29yZGluYXRlczpzdSh2Xyl9KTtmdW5jdGlvbiBMXyh0LGUpe3JldHVybiBndShudWxsLElfLHQsZSl9dmFyIE9fPWZ1KFFmLHtUcmFjazpvdShiXyl9KTt2YXIgUF89ZnUoJGYse3doZW46ZnVuY3Rpb24odCxlKXt2YXIgaT1lW2UubGVuZ3RoLTFdLndoZW5zLHI9ZXUodCwhMSksbj1EYXRlLnBhcnNlKHIpO2kucHVzaChpc05hTihuKT8wOm4pfX0sZnUoUWYse2Nvb3JkOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZVtlLmxlbmd0aC0xXS5mbGF0Q29vcmRpbmF0ZXMscj1ldSh0LCExKSxuPS9eXHMqKFsrXC1dP1xkKyg/OlwuXGQqKT8oPzplWytcLV0/XGQqKT8pXHMrKFsrXC1dP1xkKyg/OlwuXGQqKT8oPzplWytcLV0/XGQqKT8pXHMrKFsrXC1dP1xkKyg/OlwuXGQqKT8oPzplWytcLV0/XGQqKT8pXHMqJC9pLmV4ZWMocik7aWYobil7dmFyIG89cGFyc2VGbG9hdChuWzFdKSxzPXBhcnNlRmxvYXQoblsyXSksYT1wYXJzZUZsb2F0KG5bM10pO2kucHVzaChvLHMsYSwwKX1lbHNlIGkucHVzaCgwLDAsMCwwKX19KSk7ZnVuY3Rpb24gYl8odCxlKXt2YXIgaT1ndSh7ZmxhdENvb3JkaW5hdGVzOltdLHdoZW5zOltdfSxQXyx0LGUpO2lmKGkpe2Zvcih2YXIgcj1pLmZsYXRDb29yZGluYXRlcyxuPWkud2hlbnMsbz0wLHM9TWF0aC5taW4oci5sZW5ndGgsbi5sZW5ndGgpO288czsrK28pcls0Km8rM109bltvXTtyZXR1cm4gbmV3IGhyKHIsQXQuWFlaTSl9fXZhciBNXz1mdSgkZix7aHJlZjpodShtXyl9LGZ1KFFmLHt4Omh1KGJkKSx5Omh1KGJkKSx3Omh1KGJkKSxoOmh1KGJkKX0pKTt2YXIgRl89ZnUoJGYse2Nvb3JkaW5hdGVzOnN1KHZfKX0pO2Z1bmN0aW9uIEFfKHQsZSl7cmV0dXJuIGd1KG51bGwsRl8sdCxlKX12YXIgTl89ZnUoJGYse2V4dHJ1ZGU6aHUoTGQpLHRlc3NlbGxhdGU6aHUoTGQpLGFsdGl0dWRlTW9kZTpodShOZCl9KTtmdW5jdGlvbiBHXyh0LGUpe3ZhciBpPWd1KHt9LE5fLHQsZSkscj1BXyh0LGUpO2lmKHIpe3ZhciBuPW5ldyBocihyLEF0LlhZWik7cmV0dXJuIG4uc2V0UHJvcGVydGllcyhpKSxufX1mdW5jdGlvbiBEXyh0LGUpe3ZhciBpPWd1KHt9LE5fLHQsZSkscj1BXyh0LGUpO2lmKHIpe3ZhciBuPW5ldyBJaShyLEF0LlhZWixbci5sZW5ndGhdKTtyZXR1cm4gbi5zZXRQcm9wZXJ0aWVzKGkpLG59fXZhciBrXz1mdSgkZix7TGluZVN0cmluZzpvdShHXyksTGluZWFyUmluZzpvdShEXyksTXVsdGlHZW9tZXRyeTpvdShqXyksUG9pbnQ6b3UoVV8pLFBvbHlnb246b3UoQl8pfSk7ZnVuY3Rpb24gal8odCxlKXt2YXIgaSxyPWd1KFtdLGtfLHQsZSk7aWYoIXIpcmV0dXJuIG51bGw7aWYoMD09PXIubGVuZ3RoKXJldHVybiBuZXcgdWQocik7Zm9yKHZhciBuLG8scz0hMCxhPXJbMF0uZ2V0VHlwZSgpLGg9MSxsPXIubGVuZ3RoO2g8bDsrK2gpaWYocltoXS5nZXRUeXBlKCkhPWEpe3M9ITE7YnJlYWt9aWYocylpZihhPT1OdC5QT0lOVCl7dmFyIHU9clswXTtuPXUuZ2V0TGF5b3V0KCksbz11LmdldEZsYXRDb29yZGluYXRlcygpO2Zvcih2YXIgcD0xLGM9ci5sZW5ndGg7cDxjOysrcClLKG8scltwXS5nZXRGbGF0Q29vcmRpbmF0ZXMoKSk7el8oaT1uZXcgYmMobyxuKSxyKX1lbHNlIGE9PU50LkxJTkVfU1RSSU5HP3pfKGk9bmV3IFBjKHIpLHIpOmE9PU50LlBPTFlHT04/el8oaT1uZXcgRmMocikscik6YT09TnQuR0VPTUVUUllfQ09MTEVDVElPTj9pPW5ldyB1ZChyKTpZKCExLDM3KTtlbHNlIGk9bmV3IHVkKHIpO3JldHVybiBpfWZ1bmN0aW9uIFVfKHQsZSl7dmFyIGk9Z3Uoe30sTl8sdCxlKSxyPUFfKHQsZSk7aWYocil7dmFyIG49bmV3IGNpKHIsQXQuWFlaKTtyZXR1cm4gbi5zZXRQcm9wZXJ0aWVzKGkpLG59fXZhciBZXz1mdSgkZix7aW5uZXJCb3VuZGFyeUlzOmZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3Uodm9pZCAwLHRnLHQsZSk7aWYoaSl7dmFyIHI9ZVtlLmxlbmd0aC0xXTtyLnB1c2goaSl9fSxvdXRlckJvdW5kYXJ5SXM6ZnVuY3Rpb24odCxlKXt2YXIgaT1ndSh2b2lkIDAsZWcsdCxlKTtpZihpKXt2YXIgcj1lW2UubGVuZ3RoLTFdO3JbMF09aX19fSk7ZnVuY3Rpb24gQl8odCxlKXt2YXIgaT1ndSh7fSxOXyx0LGUpLHI9Z3UoW251bGxdLFlfLHQsZSk7aWYociYmclswXSl7Zm9yKHZhciBuPXJbMF0sbz1bbi5sZW5ndGhdLHM9MSxhPXIubGVuZ3RoO3M8YTsrK3MpSyhuLHJbc10pLG8ucHVzaChuLmxlbmd0aCk7dmFyIGg9bmV3IElpKG4sQXQuWFlaLG8pO3JldHVybiBoLnNldFByb3BlcnRpZXMoaSksaH19dmFyIFZfPWZ1KCRmLHtJY29uU3R5bGU6ZnVuY3Rpb24odCxlKXt2YXIgaT1ndSh7fSxUXyx0LGUpO2lmKGkpe3ZhciByLG4sbyxzLGE9ZVtlLmxlbmd0aC0xXSxoPSJJY29uImluIGk/aS5JY29uOnt9LGw9ISgiSWNvbiJpbiBpKXx8T2JqZWN0LmtleXMoaCkubGVuZ3RoPjAsdT1oLmhyZWY7dT9yPXU6bCYmKHI9VmYpO3ZhciBwLGM9THUuQk9UVE9NX0xFRlQsZD1pLmhvdFNwb3Q7ZD8obj1bZC54LGQueV0sbz1kLnh1bml0cyxzPWQueXVuaXRzLGM9ZC5vcmlnaW4pOnI9PT1WZj8obj1qZixvPVVmLHM9WWYpOi9eaHR0cDpcL1wvbWFwc1wuKD86Z29vZ2xlfGdzdGF0aWMpXC5jb21cLy8udGVzdChyKSYmKG49Wy41LDBdLG89d3UuRlJBQ1RJT04scz13dS5GUkFDVElPTik7dmFyIGYsXz1oLngsZz1oLnk7dm9pZCAwIT09XyYmdm9pZCAwIT09ZyYmKHA9W18sZ10pO3ZhciB5LHY9aC53LG09aC5oO3ZvaWQgMCE9PXYmJnZvaWQgMCE9PW0mJihmPVt2LG1dKTt2YXIgeD1pLmhlYWRpbmc7dm9pZCAwIT09eCYmKHk9VnQoeCkpO3ZhciBFPWkuc2NhbGU7aWYobCl7cj09VmYmJihmPUJmLHZvaWQgMD09PUUmJihFPVhmKSk7dmFyIFM9bmV3IE91KHthbmNob3I6bixhbmNob3JPcmlnaW46YyxhbmNob3JYVW5pdHM6byxhbmNob3JZVW5pdHM6cyxjcm9zc09yaWdpbjoiYW5vbnltb3VzIixvZmZzZXQ6cCxvZmZzZXRPcmlnaW46THUuQk9UVE9NX0xFRlQscm90YXRpb246eSxzY2FsZTpFLHNpemU6ZixzcmM6cn0pO2EuaW1hZ2VTdHlsZT1TfWVsc2UgYS5pbWFnZVN0eWxlPWhffX0sTGFiZWxTdHlsZTpmdW5jdGlvbih0LGUpe3ZhciBpPWd1KHt9LENfLHQsZSk7aWYoaSl7dmFyIHI9ZVtlLmxlbmd0aC0xXSxuPW5ldyBScih7ZmlsbDpuZXcgbXIoe2NvbG9yOiJjb2xvciJpbiBpP2kuY29sb3I6a2Z9KSxzY2FsZTppLnNjYWxlfSk7ci50ZXh0U3R5bGU9bn19LExpbmVTdHlsZTpmdW5jdGlvbih0LGUpe3ZhciBpPWd1KHt9LFJfLHQsZSk7aWYoaSl7dmFyIHI9ZVtlLmxlbmd0aC0xXSxuPW5ldyBFcih7Y29sb3I6ImNvbG9yImluIGk/aS5jb2xvcjprZix3aWR0aDoid2lkdGgiaW4gaT9pLndpZHRoOjF9KTtyLnN0cm9rZVN0eWxlPW59fSxQb2x5U3R5bGU6ZnVuY3Rpb24odCxlKXt2YXIgaT1ndSh7fSx3Xyx0LGUpO2lmKGkpe3ZhciByPWVbZS5sZW5ndGgtMV0sbj1uZXcgbXIoe2NvbG9yOiJjb2xvciJpbiBpP2kuY29sb3I6a2Z9KTtyLmZpbGxTdHlsZT1uO3ZhciBvPWkuZmlsbDt2b2lkIDAhPT1vJiYoci5maWxsPW8pO3ZhciBzPWkub3V0bGluZTt2b2lkIDAhPT1zJiYoci5vdXRsaW5lPXMpfX19KTtmdW5jdGlvbiBYXyh0LGUpe3ZhciBpPWd1KHt9LFZfLHQsZSk7aWYoIWkpcmV0dXJuIG51bGw7dmFyIHIsbj0iZmlsbFN0eWxlImluIGk/aS5maWxsU3R5bGU6YV8sbz1pLmZpbGw7dm9pZCAwPT09b3x8b3x8KG49bnVsbCksImltYWdlU3R5bGUiaW4gaT9pLmltYWdlU3R5bGUhPWhfJiYocj1pLmltYWdlU3R5bGUpOnI9bF87dmFyIHM9InRleHRTdHlsZSJpbiBpP2kudGV4dFN0eWxlOmNfLGE9InN0cm9rZVN0eWxlImluIGk/aS5zdHJva2VTdHlsZTpwXyxoPWkub3V0bGluZTtyZXR1cm4gdm9pZCAwPT09aHx8aHx8KGE9bnVsbCksW25ldyBOdSh7ZmlsbDpuLGltYWdlOnIsc3Ryb2tlOmEsdGV4dDpzLHpJbmRleDp2b2lkIDB9KV19ZnVuY3Rpb24gel8odCxlKXt2YXIgaSxyLG4sbz1lLmxlbmd0aCxzPW5ldyBBcnJheShlLmxlbmd0aCksYT1uZXcgQXJyYXkoZS5sZW5ndGgpLGg9bmV3IEFycmF5KGUubGVuZ3RoKTtpPXI9bj0hMTtmb3IodmFyIGw9MDtsPG87KytsKXt2YXIgdT1lW2xdO3NbbF09dS5nZXQoImV4dHJ1ZGUiKSxhW2xdPXUuZ2V0KCJ0ZXNzZWxsYXRlIiksaFtsXT11LmdldCgiYWx0aXR1ZGVNb2RlIiksaT1pfHx2b2lkIDAhPT1zW2xdLHI9cnx8dm9pZCAwIT09YVtsXSxuPW58fGhbbF19aSYmdC5zZXQoImV4dHJ1ZGUiLHMpLHImJnQuc2V0KCJ0ZXNzZWxsYXRlIixhKSxuJiZ0LnNldCgiYWx0aXR1ZGVNb2RlIixoKX12YXIgV189ZnUoJGYse2Rpc3BsYXlOYW1lOmh1KE5kKSx2YWx1ZTpodShOZCl9KTt2YXIgS189ZnUoJGYse0RhdGE6ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEF0dHJpYnV0ZSgibmFtZSIpO191KFdfLHQsZSk7dmFyIHI9ZVtlLmxlbmd0aC0xXTtudWxsIT09aT9yW2ldPXIudmFsdWU6bnVsbCE9PXIuZGlzcGxheU5hbWUmJihyW3IuZGlzcGxheU5hbWVdPXIudmFsdWUpLGRlbGV0ZSByLnZhbHVlfSxTY2hlbWFEYXRhOmZ1bmN0aW9uKHQsZSl7X3UoSl8sdCxlKX19KTtmdW5jdGlvbiBIXyh0LGUpe191KEtfLHQsZSl9ZnVuY3Rpb24gWl8odCxlKXtfdShuXyx0LGUpfXZhciBxXz1mdSgkZix7U3R5bGU6aHUoWF8pLGtleTpodShOZCksc3R5bGVVcmw6aHUobV8pfSk7dmFyIEpfPWZ1KCRmLHtTaW1wbGVEYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTtpZihudWxsIT09aSl7dmFyIHI9TmQodCksbj1lW2UubGVuZ3RoLTFdO25baV09cn19fSk7dmFyIFFfPWZ1KCRmLHthbHRpdHVkZU1vZGU6aHUoTmQpLG1pbkFsdGl0dWRlOmh1KGJkKSxtYXhBbHRpdHVkZTpodShiZCksbm9ydGg6aHUoYmQpLHNvdXRoOmh1KGJkKSxlYXN0Omh1KGJkKSx3ZXN0Omh1KGJkKX0pO3ZhciAkXz1mdSgkZix7bWluTG9kUGl4ZWxzOmh1KGJkKSxtYXhMb2RQaXhlbHM6aHUoYmQpLG1pbkZhZGVFeHRlbnQ6aHUoYmQpLG1heEZhZGVFeHRlbnQ6aHUoYmQpfSk7dmFyIHRnPWZ1KCRmLHtMaW5lYXJSaW5nOnN1KExfKX0pO3ZhciBlZz1mdSgkZix7TGluZWFyUmluZzpzdShMXyl9KTtmdW5jdGlvbiBpZyh0LGUpe2Zvcih2YXIgaT1fcihlKSxyPVsyNTUqKDQ9PWkubGVuZ3RoP2lbM106MSksaVsyXSxpWzFdLGlbMF1dLG49MDtuPDQ7KytuKXt2YXIgbz1NYXRoLmZsb29yKHJbbl0pLnRvU3RyaW5nKDE2KTtyW25dPTE9PW8ubGVuZ3RoPyIwIitvOm99amQodCxyLmpvaW4oIiIpKX12YXIgcmc9ZnUoJGYse0RhdGE6bHUoZnVuY3Rpb24odCxlLGkpe3Quc2V0QXR0cmlidXRlKCJuYW1lIixlLm5hbWUpO3ZhciByPXtub2RlOnR9LG49ZS52YWx1ZTsib2JqZWN0Ij09dHlwZW9mIG4/KG51bGwhPT1uJiZuLmRpc3BsYXlOYW1lJiZ2dShyLHJnLGN1LFtuLmRpc3BsYXlOYW1lXSxpLFsiZGlzcGxheU5hbWUiXSksbnVsbCE9PW4mJm4udmFsdWUmJnZ1KHIscmcsY3UsW24udmFsdWVdLGksWyJ2YWx1ZSJdKSk6dnUocixyZyxjdSxbbl0saSxbInZhbHVlIl0pfSksdmFsdWU6bHUoZnVuY3Rpb24odCxlKXtqZCh0LGUpfSksZGlzcGxheU5hbWU6bHUoZnVuY3Rpb24odCxlKXshZnVuY3Rpb24odCxlKXt0LmFwcGVuZENoaWxkKFFsLmNyZWF0ZUNEQVRBU2VjdGlvbihlKSl9KHQsZSl9KX0pO3ZhciBuZz1mdSgkZix7UGxhY2VtYXJrOmx1KE9nKX0pLG9nPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdHUoZVtlLmxlbmd0aC0xXS5ub2RlLm5hbWVzcGFjZVVSSSwiUGxhY2VtYXJrIil9O3ZhciBzZz1wdSgiRGF0YSIpO3ZhciBhZz1mdSgkZixbImhyZWYiXSxmdShRZixbIngiLCJ5IiwidyIsImgiXSkpLGhnPWZ1KCRmLHtocmVmOmx1KGpkKX0sZnUoUWYse3g6bHUoRGQpLHk6bHUoRGQpLHc6bHUoRGQpLGg6bHUoRGQpfSkpLGxnPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdHUoUWZbMF0sImd4OiIraSl9O3ZhciB1Zz1mdSgkZixbInNjYWxlIiwiaGVhZGluZyIsIkljb24iLCJob3RTcG90Il0pLHBnPWZ1KCRmLHtJY29uOmx1KGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj17bm9kZTp0fSxuPWlbaS5sZW5ndGgtMV0ubm9kZSxvPWFnW24ubmFtZXNwYWNlVVJJXSxzPWR1KGUsbyk7dnUocixoZyxjdSxzLGksbykscz1kdShlLG89YWdbUWZbMF1dKSx2dShyLGhnLGxnLHMsaSxvKX0pLGhlYWRpbmc6bHUoRGQpLGhvdFNwb3Q6bHUoZnVuY3Rpb24odCxlKXt0LnNldEF0dHJpYnV0ZSgieCIsU3RyaW5nKGUueCkpLHQuc2V0QXR0cmlidXRlKCJ5IixTdHJpbmcoZS55KSksdC5zZXRBdHRyaWJ1dGUoInh1bml0cyIsZS54dW5pdHMpLHQuc2V0QXR0cmlidXRlKCJ5dW5pdHMiLGUueXVuaXRzKX0pLHNjYWxlOmx1KGpnKX0pO3ZhciBjZz1mdSgkZixbImNvbG9yIiwic2NhbGUiXSksZGc9ZnUoJGYse2NvbG9yOmx1KGlnKSxzY2FsZTpsdShqZyl9KTt2YXIgZmc9ZnUoJGYsWyJjb2xvciIsIndpZHRoIl0pLF9nPWZ1KCRmLHtjb2xvcjpsdShpZyksd2lkdGg6bHUoRGQpfSk7dmFyIGdnPXtQb2ludDoiUG9pbnQiLExpbmVTdHJpbmc6IkxpbmVTdHJpbmciLExpbmVhclJpbmc6IkxpbmVhclJpbmciLFBvbHlnb246IlBvbHlnb24iLE11bHRpUG9pbnQ6Ik11bHRpR2VvbWV0cnkiLE11bHRpTGluZVN0cmluZzoiTXVsdGlHZW9tZXRyeSIsTXVsdGlQb2x5Z29uOiJNdWx0aUdlb21ldHJ5IixHZW9tZXRyeUNvbGxlY3Rpb246Ik11bHRpR2VvbWV0cnkifSx5Zz1mdW5jdGlvbih0LGUsaSl7aWYodClyZXR1cm4gdHUoZVtlLmxlbmd0aC0xXS5ub2RlLm5hbWVzcGFjZVVSSSxnZ1t0LmdldFR5cGUoKV0pfSx2Zz1wdSgiUG9pbnQiKSxtZz1wdSgiTGluZVN0cmluZyIpLHhnPXB1KCJMaW5lYXJSaW5nIiksRWc9cHUoIlBvbHlnb24iKSxTZz1mdSgkZix7TGluZVN0cmluZzpsdShNZyksUG9pbnQ6bHUoTWcpLFBvbHlnb246bHUoR2cpLEdlb21ldHJ5Q29sbGVjdGlvbjpsdShUZyl9KTtmdW5jdGlvbiBUZyh0LGUsaSl7dmFyIHIsbixvPXtub2RlOnR9LHM9ZS5nZXRUeXBlKCk7cz09TnQuR0VPTUVUUllfQ09MTEVDVElPTj8ocj1lLmdldEdlb21ldHJpZXMoKSxuPXlnKTpzPT1OdC5NVUxUSV9QT0lOVD8ocj1lLmdldFBvaW50cygpLG49dmcpOnM9PU50Lk1VTFRJX0xJTkVfU1RSSU5HPyhyPWUuZ2V0TGluZVN0cmluZ3MoKSxuPW1nKTpzPT1OdC5NVUxUSV9QT0xZR09OPyhyPWUuZ2V0UG9seWdvbnMoKSxuPUVnKTpZKCExLDM5KSx2dShvLFNnLG4scixpKX12YXIgQ2c9ZnUoJGYse0xpbmVhclJpbmc6bHUoTWcpfSk7ZnVuY3Rpb24gUmcodCxlLGkpe3Z1KHtub2RlOnR9LENnLHhnLFtlXSxpKX12YXIgd2c9ZnUoJGYse0V4dGVuZGVkRGF0YTpsdShmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciByPXtub2RlOnR9LG49ZS5uYW1lcyxvPWUudmFsdWVzLHM9bi5sZW5ndGgsYT0wO2E8czthKyspdnUocixyZyxzZyxbe25hbWU6blthXSx2YWx1ZTpvW2FdfV0saSl9KSxNdWx0aUdlb21ldHJ5Omx1KFRnKSxMaW5lU3RyaW5nOmx1KE1nKSxMaW5lYXJSaW5nOmx1KE1nKSxQb2ludDpsdShNZyksUG9seWdvbjpsdShHZyksU3R5bGU6bHUoZnVuY3Rpb24odCxlLGkpe3ZhciByPXtub2RlOnR9LG49e30sbz1lLmdldEZpbGwoKSxzPWUuZ2V0U3Ryb2tlKCksYT1lLmdldEltYWdlKCksaD1lLmdldFRleHQoKTthJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRTcmMmJihuLkljb25TdHlsZT1hKTtoJiYobi5MYWJlbFN0eWxlPWgpO3MmJihuLkxpbmVTdHlsZT1zKTtvJiYobi5Qb2x5U3R5bGU9byk7dmFyIGw9aVtpLmxlbmd0aC0xXS5ub2RlLHU9VWdbbC5uYW1lc3BhY2VVUkldLHA9ZHUobix1KTt2dShyLFlnLGN1LHAsaSx1KX0pLGFkZHJlc3M6bHUoamQpLGRlc2NyaXB0aW9uOmx1KGpkKSxuYW1lOmx1KGpkKSxvcGVuOmx1KEdkKSxwaG9uZU51bWJlcjpsdShqZCksc3R5bGVVcmw6bHUoamQpLHZpc2liaWxpdHk6bHUoR2QpfSksSWc9ZnUoJGYsWyJuYW1lIiwib3BlbiIsInZpc2liaWxpdHkiLCJhZGRyZXNzIiwicGhvbmVOdW1iZXIiLCJkZXNjcmlwdGlvbiIsInN0eWxlVXJsIiwiU3R5bGUiXSksTGc9cHUoIkV4dGVuZGVkRGF0YSIpO2Z1bmN0aW9uIE9nKHQsZSxpKXt2YXIgcj17bm9kZTp0fTtlLmdldElkKCkmJnQuc2V0QXR0cmlidXRlKCJpZCIsZS5nZXRJZCgpKTt2YXIgbj1lLmdldFByb3BlcnRpZXMoKSxvPXthZGRyZXNzOjEsZGVzY3JpcHRpb246MSxuYW1lOjEsb3BlbjoxLHBob25lTnVtYmVyOjEsc3R5bGVVcmw6MSx2aXNpYmlsaXR5OjF9O29bZS5nZXRHZW9tZXRyeU5hbWUoKV09MTt2YXIgcz1PYmplY3Qua2V5cyhufHx7fSkuc29ydCgpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hb1t0XX0pO2lmKHMubGVuZ3RoPjApe3ZhciBhPWR1KG4scyk7dnUocix3ZyxMZyxbe25hbWVzOnMsdmFsdWVzOmF9XSxpKX12YXIgaD1lLmdldFN0eWxlRnVuY3Rpb24oKTtpZihoKXt2YXIgbD1oKGUsMCk7aWYobCl7dmFyIHU9QXJyYXkuaXNBcnJheShsKT9sWzBdOmw7dGhpcy53cml0ZVN0eWxlc18mJihuLlN0eWxlPXUpO3ZhciBwPXUuZ2V0VGV4dCgpO3AmJihuLm5hbWU9cC5nZXRUZXh0KCkpfX12YXIgYz1pW2kubGVuZ3RoLTFdLm5vZGUsZD1JZ1tjLm5hbWVzcGFjZVVSSV0sZj1kdShuLGQpO3Z1KHIsd2csY3UsZixpLGQpO3ZhciBfPWlbMF0sZz1lLmdldEdlb21ldHJ5KCk7ZyYmKGc9ZGQoZywhMCxfKSksdnUocix3Zyx5ZyxbZ10saSl9dmFyIFBnPWZ1KCRmLFsiZXh0cnVkZSIsInRlc3NlbGxhdGUiLCJhbHRpdHVkZU1vZGUiLCJjb29yZGluYXRlcyJdKSxiZz1mdSgkZix7ZXh0cnVkZTpsdShHZCksdGVzc2VsbGF0ZTpsdShHZCksYWx0aXR1ZGVNb2RlOmx1KGpkKSxjb29yZGluYXRlczpsdShmdW5jdGlvbih0LGUsaSl7dmFyIHIsbj1pW2kubGVuZ3RoLTFdLG89bi5sYXlvdXQscz1uLnN0cmlkZTtvPT1BdC5YWXx8bz09QXQuWFlNP3I9MjpvPT1BdC5YWVp8fG89PUF0LlhZWk0/cj0zOlkoITEsMzQpO3ZhciBhPWUubGVuZ3RoLGg9IiI7aWYoYT4wKXtoKz1lWzBdO2Zvcih2YXIgbD0xO2w8cjsrK2wpaCs9IiwiK2VbbF07Zm9yKHZhciB1PXM7dTxhO3UrPXMpe2grPSIgIitlW3VdO2Zvcih2YXIgcD0xO3A8cjsrK3ApaCs9IiwiK2VbdStwXX19amQodCxoKX0pfSk7ZnVuY3Rpb24gTWcodCxlLGkpe3ZhciByPWUuZ2V0RmxhdENvb3JkaW5hdGVzKCksbj17bm9kZTp0fTtuLmxheW91dD1lLmdldExheW91dCgpLG4uc3RyaWRlPWUuZ2V0U3RyaWRlKCk7dmFyIG89ZS5nZXRQcm9wZXJ0aWVzKCk7by5jb29yZGluYXRlcz1yO3ZhciBzPWlbaS5sZW5ndGgtMV0ubm9kZSxhPVBnW3MubmFtZXNwYWNlVVJJXSxoPWR1KG8sYSk7dnUobixiZyxjdSxoLGksYSl9dmFyIEZnPWZ1KCRmLHtvdXRlckJvdW5kYXJ5SXM6bHUoUmcpLGlubmVyQm91bmRhcnlJczpsdShSZyl9KSxBZz1wdSgiaW5uZXJCb3VuZGFyeUlzIiksTmc9cHUoIm91dGVyQm91bmRhcnlJcyIpO2Z1bmN0aW9uIEdnKHQsZSxpKXt2YXIgcj1lLmdldExpbmVhclJpbmdzKCksbj1yLnNoaWZ0KCksbz17bm9kZTp0fTt2dShvLEZnLEFnLHIsaSksdnUobyxGZyxOZyxbbl0saSl9dmFyIERnPWZ1KCRmLHtjb2xvcjpsdShpZyl9KSxrZz1wdSgiY29sb3IiKTtmdW5jdGlvbiBqZyh0LGUpe0RkKHQsTWF0aC5yb3VuZCgxZTYqZSkvMWU2KX12YXIgVWc9ZnUoJGYsWyJJY29uU3R5bGUiLCJMYWJlbFN0eWxlIiwiTGluZVN0eWxlIiwiUG9seVN0eWxlIl0pLFlnPWZ1KCRmLHtJY29uU3R5bGU6bHUoZnVuY3Rpb24odCxlLGkpe3ZhciByPXtub2RlOnR9LG49e30sbz1lLmdldFNyYygpLHM9ZS5nZXRTaXplKCksYT1lLmdldEltYWdlU2l6ZSgpLGg9e2hyZWY6b307aWYocyl7aC53PXNbMF0saC5oPXNbMV07dmFyIGw9ZS5nZXRBbmNob3IoKSx1PWUuZ2V0T3JpZ2luKCk7aWYodSYmYSYmMCE9PXVbMF0mJnVbMV0hPT1zWzFdJiYoaC54PXVbMF0saC55PWFbMV0tKHVbMV0rc1sxXSkpLGwmJihsWzBdIT09c1swXS8yfHxsWzFdIT09c1sxXS8yKSl7dmFyIHA9e3g6bFswXSx4dW5pdHM6d3UuUElYRUxTLHk6c1sxXS1sWzFdLHl1bml0czp3dS5QSVhFTFN9O24uaG90U3BvdD1wfX1uLkljb249aDt2YXIgYz1lLmdldFNjYWxlKCk7MSE9PWMmJihuLnNjYWxlPWMpO3ZhciBkPWUuZ2V0Um90YXRpb24oKTswIT09ZCYmKG4uaGVhZGluZz1kKTt2YXIgZj1pW2kubGVuZ3RoLTFdLm5vZGUsXz11Z1tmLm5hbWVzcGFjZVVSSV0sZz1kdShuLF8pO3Z1KHIscGcsY3UsZyxpLF8pfSksTGFiZWxTdHlsZTpsdShmdW5jdGlvbih0LGUsaSl7dmFyIHI9e25vZGU6dH0sbj17fSxvPWUuZ2V0RmlsbCgpO28mJihuLmNvbG9yPW8uZ2V0Q29sb3IoKSk7dmFyIHM9ZS5nZXRTY2FsZSgpO3MmJjEhPT1zJiYobi5zY2FsZT1zKTt2YXIgYT1pW2kubGVuZ3RoLTFdLm5vZGUsaD1jZ1thLm5hbWVzcGFjZVVSSV0sbD1kdShuLGgpO3Z1KHIsZGcsY3UsbCxpLGgpfSksTGluZVN0eWxlOmx1KGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj17bm9kZTp0fSxuPXtjb2xvcjplLmdldENvbG9yKCksd2lkdGg6ZS5nZXRXaWR0aCgpfSxvPWlbaS5sZW5ndGgtMV0ubm9kZSxzPWZnW28ubmFtZXNwYWNlVVJJXSxhPWR1KG4scyk7dnUocixfZyxjdSxhLGkscyl9KSxQb2x5U3R5bGU6bHUoZnVuY3Rpb24odCxlLGkpe3Z1KHtub2RlOnR9LERnLGtnLFtlLmdldENvbG9yKCldLGkpfSl9KTt2YXIgQmc9X18sVmc9aSgxKSxYZz1pLm4oVmcpLHpnPVsxLDAsMCwxLDAsMF0sV2c9ZnVuY3Rpb24odCxlLGkscixuKXt0aGlzLmV4dGVudF8sdGhpcy5pZF89bix0aGlzLnR5cGVfPXQsdGhpcy5mbGF0Q29vcmRpbmF0ZXNfPWUsdGhpcy5mbGF0SW50ZXJpb3JQb2ludHNfPW51bGwsdGhpcy5mbGF0TWlkcG9pbnRzXz1udWxsLHRoaXMuZW5kc189aSx0aGlzLnByb3BlcnRpZXNfPXJ9O1dnLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJvcGVydGllc19bdF19LFdnLnByb3RvdHlwZS5nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5leHRlbnRffHwodGhpcy5leHRlbnRfPXRoaXMudHlwZV89PT1OdC5QT0lOVD9wdCh0aGlzLmZsYXRDb29yZGluYXRlc18pOmN0KHRoaXMuZmxhdENvb3JkaW5hdGVzXywwLHRoaXMuZmxhdENvb3JkaW5hdGVzXy5sZW5ndGgsMikpLHRoaXMuZXh0ZW50X30sV2cucHJvdG90eXBlLmdldEZsYXRJbnRlcmlvclBvaW50PWZ1bmN0aW9uKCl7aWYoIXRoaXMuZmxhdEludGVyaW9yUG9pbnRzXyl7dmFyIHQ9VHQodGhpcy5nZXRFeHRlbnQoKSk7dGhpcy5mbGF0SW50ZXJpb3JQb2ludHNfPWdpKHRoaXMuZmxhdENvb3JkaW5hdGVzXywwLHRoaXMuZW5kc18sMix0LDApfXJldHVybiB0aGlzLmZsYXRJbnRlcmlvclBvaW50c199LFdnLnByb3RvdHlwZS5nZXRGbGF0SW50ZXJpb3JQb2ludHM9ZnVuY3Rpb24oKXtpZighdGhpcy5mbGF0SW50ZXJpb3JQb2ludHNfKXt2YXIgdD1NYyh0aGlzLmZsYXRDb29yZGluYXRlc18sMCx0aGlzLmVuZHNfLDIpO3RoaXMuZmxhdEludGVyaW9yUG9pbnRzXz15aSh0aGlzLmZsYXRDb29yZGluYXRlc18sMCx0aGlzLmVuZHNfLDIsdCl9cmV0dXJuIHRoaXMuZmxhdEludGVyaW9yUG9pbnRzX30sV2cucHJvdG90eXBlLmdldEZsYXRNaWRwb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYXRNaWRwb2ludHNffHwodGhpcy5mbGF0TWlkcG9pbnRzXz1vcih0aGlzLmZsYXRDb29yZGluYXRlc18sMCx0aGlzLmZsYXRDb29yZGluYXRlc18ubGVuZ3RoLDIsLjUpKSx0aGlzLmZsYXRNaWRwb2ludHNffSxXZy5wcm90b3R5cGUuZ2V0RmxhdE1pZHBvaW50cz1mdW5jdGlvbigpe2lmKCF0aGlzLmZsYXRNaWRwb2ludHNfKXt0aGlzLmZsYXRNaWRwb2ludHNfPVtdO2Zvcih2YXIgdD10aGlzLmZsYXRDb29yZGluYXRlc18sZT0wLGk9dGhpcy5lbmRzXyxyPTAsbj1pLmxlbmd0aDtyPG47KytyKXt2YXIgbz1pW3JdLHM9b3IodCxlLG8sMiwuNSk7Syh0aGlzLmZsYXRNaWRwb2ludHNfLHMpLGU9b319cmV0dXJuIHRoaXMuZmxhdE1pZHBvaW50c199LFdnLnByb3RvdHlwZS5nZXRJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlkX30sV2cucHJvdG90eXBlLmdldE9yaWVudGVkRmxhdENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmxhdENvb3JkaW5hdGVzX30sV2cucHJvdG90eXBlLmdldEdlb21ldHJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LFdnLnByb3RvdHlwZS5nZXRTaW1wbGlmaWVkR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXN9LFdnLnByb3RvdHlwZS5nZXRQcm9wZXJ0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcGVydGllc199LFdnLnByb3RvdHlwZS5nZXRTdHJpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sV2cucHJvdG90eXBlLmdldFN0eWxlRnVuY3Rpb249ZnVuY3Rpb24oKXt9LFdnLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZV99LFdnLnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24odCxlKXt2YXIgaT0odD1FZSh0KSkuZ2V0RXh0ZW50KCkscj10LmdldFdvcmxkRXh0ZW50KCksbj1SdChyKS9SdChpKTtZZSh6ZyxyWzBdLHJbM10sbiwtbiwwLDAsMCksR3QodGhpcy5mbGF0Q29vcmRpbmF0ZXNfLDAsdGhpcy5mbGF0Q29vcmRpbmF0ZXNfLmxlbmd0aCwyLHpnLHRoaXMuZmxhdENvb3JkaW5hdGVzXyl9LFdnLnByb3RvdHlwZS5nZXRFbmRzPVdnLnByb3RvdHlwZS5nZXRFbmRzcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZHNffSxXZy5wcm90b3R5cGUuZ2V0RmxhdENvb3JkaW5hdGVzPVdnLnByb3RvdHlwZS5nZXRPcmllbnRlZEZsYXRDb29yZGluYXRlczt2YXIgS2c9V2c7ZnVuY3Rpb24gSGcodCxlLGkpe2lmKDM9PT10KXt2YXIgcj17a2V5czpbXSx2YWx1ZXM6W10sZmVhdHVyZXM6W119LG49aS5yZWFkVmFyaW50KCkraS5wb3M7aS5yZWFkRmllbGRzKFpnLHIsbiksci5sZW5ndGg9ci5mZWF0dXJlcy5sZW5ndGgsci5sZW5ndGgmJihlW3IubmFtZV09cil9fWZ1bmN0aW9uIFpnKHQsZSxpKXtpZigxNT09PXQpZS52ZXJzaW9uPWkucmVhZFZhcmludCgpO2Vsc2UgaWYoMT09PXQpZS5uYW1lPWkucmVhZFN0cmluZygpO2Vsc2UgaWYoNT09PXQpZS5leHRlbnQ9aS5yZWFkVmFyaW50KCk7ZWxzZSBpZigyPT09dCllLmZlYXR1cmVzLnB1c2goaS5wb3MpO2Vsc2UgaWYoMz09PXQpZS5rZXlzLnB1c2goaS5yZWFkU3RyaW5nKCkpO2Vsc2UgaWYoND09PXQpe2Zvcih2YXIgcj1udWxsLG49aS5yZWFkVmFyaW50KCkraS5wb3M7aS5wb3M8bjspcj0xPT09KHQ9aS5yZWFkVmFyaW50KCk+PjMpP2kucmVhZFN0cmluZygpOjI9PT10P2kucmVhZEZsb2F0KCk6Mz09PXQ/aS5yZWFkRG91YmxlKCk6ND09PXQ/aS5yZWFkVmFyaW50NjQoKTo1PT09dD9pLnJlYWRWYXJpbnQoKTo2PT09dD9pLnJlYWRTVmFyaW50KCk6Nz09PXQ/aS5yZWFkQm9vbGVhbigpOm51bGw7ZS52YWx1ZXMucHVzaChyKX19ZnVuY3Rpb24gcWcodCxlLGkpe2lmKDE9PXQpZS5pZD1pLnJlYWRWYXJpbnQoKTtlbHNlIGlmKDI9PXQpZm9yKHZhciByPWkucmVhZFZhcmludCgpK2kucG9zO2kucG9zPHI7KXt2YXIgbj1lLmxheWVyLmtleXNbaS5yZWFkVmFyaW50KCldLG89ZS5sYXllci52YWx1ZXNbaS5yZWFkVmFyaW50KCldO2UucHJvcGVydGllc1tuXT1vfWVsc2UgMz09dD9lLnR5cGU9aS5yZWFkVmFyaW50KCk6ND09dCYmKGUuZ2VvbWV0cnk9aS5wb3MpfWZ1bmN0aW9uIEpnKHQsZSxpKXt0LnBvcz1lLmZlYXR1cmVzW2ldO3ZhciByPXQucmVhZFZhcmludCgpK3QucG9zLG49e2xheWVyOmUsdHlwZTowLHByb3BlcnRpZXM6e319O3JldHVybiB0LnJlYWRGaWVsZHMocWcsbixyKSxufXZhciBRZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKTt2YXIgaT1lfHx7fTt0aGlzLmRhdGFQcm9qZWN0aW9uPW5ldyBlZSh7Y29kZToiIix1bml0czokdC5USUxFX1BJWEVMU30pLHRoaXMuZmVhdHVyZUNsYXNzXz1pLmZlYXR1cmVDbGFzcz9pLmZlYXR1cmVDbGFzczpLZyx0aGlzLmdlb21ldHJ5TmFtZV89aS5nZW9tZXRyeU5hbWUsdGhpcy5sYXllck5hbWVfPWkubGF5ZXJOYW1lP2kubGF5ZXJOYW1lOiJsYXllciIsdGhpcy5sYXllcnNfPWkubGF5ZXJzP2kubGF5ZXJzOm51bGwsdGhpcy5leHRlbnRfPW51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnJlYWRSYXdHZW9tZXRyeV89ZnVuY3Rpb24odCxlLGkscil7dC5wb3M9ZS5nZW9tZXRyeTtmb3IodmFyIG49dC5yZWFkVmFyaW50KCkrdC5wb3Msbz0xLHM9MCxhPTAsaD0wLGw9MCx1PTA7dC5wb3M8bjspe2lmKCFzKXt2YXIgcD10LnJlYWRWYXJpbnQoKTtvPTcmcCxzPXA+PjN9cy0tLDE9PT1vfHwyPT09bz8oYSs9dC5yZWFkU1ZhcmludCgpLGgrPXQucmVhZFNWYXJpbnQoKSwxPT09byYmbD51JiYoci5wdXNoKGwpLHU9bCksaS5wdXNoKGEsaCksbCs9Mik6Nz09PW8/bD51JiYoaS5wdXNoKGlbdV0saVt1KzFdKSxsKz0yKTpZKCExLDU5KX1sPnUmJihyLnB1c2gobCksdT1sKX0sZS5wcm90b3R5cGUuY3JlYXRlRmVhdHVyZV89ZnVuY3Rpb24odCxlLGkpe3ZhciByLG49ZS50eXBlO2lmKDA9PT1uKXJldHVybiBudWxsO3ZhciBvPWUuaWQscz1lLnByb3BlcnRpZXM7c1t0aGlzLmxheWVyTmFtZV9dPWUubGF5ZXIubmFtZTt2YXIgYT1bXSxoPVtdO3RoaXMucmVhZFJhd0dlb21ldHJ5Xyh0LGUsYSxoKTt2YXIgbD1mdW5jdGlvbih0LGUpe3ZhciBpOzE9PT10P2k9MT09PWU/TnQuUE9JTlQ6TnQuTVVMVElfUE9JTlQ6Mj09PXQ/aT0xPT09ZT9OdC5MSU5FX1NUUklORzpOdC5NVUxUSV9MSU5FX1NUUklORzozPT09dCYmKGk9TnQuUE9MWUdPTik7cmV0dXJuIGl9KG4saC5sZW5ndGgpO2lmKHRoaXMuZmVhdHVyZUNsYXNzXz09PUtnKXI9bmV3IHRoaXMuZmVhdHVyZUNsYXNzXyhsLGEsaCxzLG8pO2Vsc2V7dmFyIHU7aWYobD09TnQuUE9MWUdPTil7Zm9yKHZhciBwPVtdLGM9MCxkPTAsZj0wLF89aC5sZW5ndGg7ZjxfOysrZil7dmFyIGc9aFtmXTtTaShhLGMsZywyKXx8KHAucHVzaChoLnNsaWNlKGQsZikpLGQ9ZiksYz1nfXU9cC5sZW5ndGg+MT9uZXcgRmMoYSxBdC5YWSxwKTpuZXcgSWkoYSxBdC5YWSxoKX1lbHNlIHU9bD09PU50LlBPSU5UP25ldyBjaShhLEF0LlhZKTpsPT09TnQuTElORV9TVFJJTkc/bmV3IGhyKGEsQXQuWFkpOmw9PT1OdC5QT0xZR09OP25ldyBJaShhLEF0LlhZLGgpOmw9PT1OdC5NVUxUSV9QT0lOVD9uZXcgYmMoYSxBdC5YWSk6bD09PU50Lk1VTFRJX0xJTkVfU1RSSU5HP25ldyBQYyhhLEF0LlhZLGgpOm51bGw7cj1uZXcoMCx0aGlzLmZlYXR1cmVDbGFzc18pLHRoaXMuZ2VvbWV0cnlOYW1lXyYmci5zZXRHZW9tZXRyeU5hbWUodGhpcy5nZW9tZXRyeU5hbWVfKTt2YXIgeT1kZCh1LCExLHRoaXMuYWRhcHRPcHRpb25zKGkpKTtyLnNldEdlb21ldHJ5KHkpLHIuc2V0SWQobyksci5zZXRQcm9wZXJ0aWVzKHMpfXJldHVybiByfSxlLnByb3RvdHlwZS5nZXRMYXN0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXh0ZW50X30sZS5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiBIbC5BUlJBWV9CVUZGRVJ9LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlcz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMubGF5ZXJzXyxyPW5ldyBYZy5hKHQpLG49ci5yZWFkRmllbGRzKEhnLHt9KSxvPVtdO2Zvcih2YXIgcyBpbiBuKWlmKCFpfHwtMSE9aS5pbmRleE9mKHMpKXtmb3IodmFyIGE9bltzXSxoPTAsbD1hLmxlbmd0aDtoPGw7KytoKXt2YXIgdT1KZyhyLGEsaCk7by5wdXNoKHRoaXMuY3JlYXRlRmVhdHVyZV8ocix1KSl9dGhpcy5leHRlbnRfPWE/WzAsMCxhLmV4dGVudCxhLmV4dGVudF06bnVsbH1yZXR1cm4gb30sZS5wcm90b3R5cGUucmVhZFByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVByb2plY3Rpb259LGUucHJvdG90eXBlLnNldExheWVycz1mdW5jdGlvbih0KXt0aGlzLmxheWVyc189dH0sZX0oY2QpLCRnPVtudWxsXSx0eT1mdSgkZyx7bmQ6ZnVuY3Rpb24odCxlKXtlW2UubGVuZ3RoLTFdLm5kcmVmcy5wdXNoKHQuZ2V0QXR0cmlidXRlKCJyZWYiKSl9LHRhZzpueX0pLGV5PWZ1KCRnLHtub2RlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZVswXSxyPWVbZS5sZW5ndGgtMV0sbj10LmdldEF0dHJpYnV0ZSgiaWQiKSxvPVtwYXJzZUZsb2F0KHQuZ2V0QXR0cmlidXRlKCJsb24iKSkscGFyc2VGbG9hdCh0LmdldEF0dHJpYnV0ZSgibGF0IikpXTtyLm5vZGVzW25dPW87dmFyIHM9Z3Uoe3RhZ3M6e319LHJ5LHQsZSk7aWYoIWQocy50YWdzKSl7dmFyIGE9bmV3IGNpKG8pO2RkKGEsITEsaSk7dmFyIGg9bmV3IEIoYSk7aC5zZXRJZChuKSxoLnNldFByb3BlcnRpZXMocy50YWdzKSxyLmZlYXR1cmVzLnB1c2goaCl9fSx3YXk6ZnVuY3Rpb24odCxlKXt2YXIgaT1ndSh7aWQ6dC5nZXRBdHRyaWJ1dGUoImlkIiksbmRyZWZzOltdLHRhZ3M6e319LHR5LHQsZSk7ZVtlLmxlbmd0aC0xXS53YXlzLnB1c2goaSl9fSksaXk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLmRhdGFQcm9qZWN0aW9uPUVlKCJFUFNHOjQzMjYiKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUucmVhZEZlYXR1cmVzRnJvbU5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldFJlYWRPcHRpb25zKHQsZSk7aWYoIm9zbSI9PXQubG9jYWxOYW1lKXtmb3IodmFyIHI9Z3Uoe25vZGVzOnt9LHdheXM6W10sZmVhdHVyZXM6W119LGV5LHQsW2ldKSxuPTA7bjxyLndheXMubGVuZ3RoO24rKyl7Zm9yKHZhciBvPXIud2F5c1tuXSxzPVtdLGE9MCxoPW8ubmRyZWZzLmxlbmd0aDthPGg7YSsrKXtLKHMsci5ub2Rlc1tvLm5kcmVmc1thXV0pfXZhciBsPXZvaWQgMDtkZChsPW8ubmRyZWZzWzBdPT1vLm5kcmVmc1tvLm5kcmVmcy5sZW5ndGgtMV0/bmV3IElpKHMsQXQuWFksW3MubGVuZ3RoXSk6bmV3IGhyKHMsQXQuWFkpLCExLGkpO3ZhciB1PW5ldyBCKGwpO3Uuc2V0SWQoby5pZCksdS5zZXRQcm9wZXJ0aWVzKG8udGFncyksci5mZWF0dXJlcy5wdXNoKHUpfWlmKHIuZmVhdHVyZXMpcmV0dXJuIHIuZmVhdHVyZXN9cmV0dXJuW119LGV9KFRkKSxyeT1mdSgkZyx7dGFnOm55fSk7ZnVuY3Rpb24gbnkodCxlKXtlW2UubGVuZ3RoLTFdLnRhZ3NbdC5nZXRBdHRyaWJ1dGUoImsiKV09dC5nZXRBdHRyaWJ1dGUoInYiKX12YXIgb3k9aXk7ZnVuY3Rpb24gc3kodCxlLGkscixuLG8pe3ZhciBzLGE7dm9pZCAwIT09bj8ocz1uLGE9dm9pZCAwIT09bz9vOjApOihzPVtdLGE9MCk7Zm9yKHZhciBoPWU7aDxpOyl7dmFyIGw9dFtoKytdO3NbYSsrXT10W2grK10sc1thKytdPWw7Zm9yKHZhciB1PTI7dTxyOysrdSlzW2ErK109dFtoKytdfXJldHVybiBzLmxlbmd0aD1hLHN9ZnVuY3Rpb24gYXkodCxlLGkpe3ZhciByLG49aXx8MWU1LG89bmV3IEFycmF5KGUpO2ZvcihyPTA7cjxlOysrcilvW3JdPTA7Zm9yKHZhciBzPTAsYT10Lmxlbmd0aDtzPGE7KWZvcihyPTA7cjxlOysrciwrK3Mpe3ZhciBoPXRbc10sbD1oLW9bcl07b1tyXT1oLHRbc109bH1yZXR1cm4gbHkodCxuKX1mdW5jdGlvbiBoeSh0LGUsaSl7dmFyIHIsbj1pfHwxZTUsbz1uZXcgQXJyYXkoZSk7Zm9yKHI9MDtyPGU7KytyKW9bcl09MDtmb3IodmFyIHM9dXkodCxuKSxhPTAsaD1zLmxlbmd0aDthPGg7KWZvcihyPTA7cjxlOysrciwrK2Epb1tyXSs9c1thXSxzW2FdPW9bcl07cmV0dXJuIHN9ZnVuY3Rpb24gbHkodCxlKXtmb3IodmFyIGk9ZXx8MWU1LHI9MCxuPXQubGVuZ3RoO3I8bjsrK3IpdFtyXT1NYXRoLnJvdW5kKHRbcl0qaSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSl7dmFyIHI9dFtlXTt0W2VdPXI8MD9+KHI8PDEpOnI8PDF9cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0iIixpPTAscj10Lmxlbmd0aDtpPHI7KytpKWUrPXB5KHRbaV0pO3JldHVybiBlfSh0KX0odCl9ZnVuY3Rpb24gdXkodCxlKXtmb3IodmFyIGk9ZXx8MWU1LHI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPTAscj0wLG49MCxvPXQubGVuZ3RoO248bzsrK24pe3ZhciBzPXQuY2hhckNvZGVBdChuKS02MztpfD0oMzEmcyk8PHIsczwzMj8oZS5wdXNoKGkpLGk9MCxyPTApOnIrPTV9cmV0dXJuIGV9KHQpLGk9MCxyPWUubGVuZ3RoO2k8cjsrK2kpe3ZhciBuPWVbaV07ZVtpXT0xJm4/fihuPj4xKTpuPj4xfXJldHVybiBlfSh0KSxuPTAsbz1yLmxlbmd0aDtuPG87KytuKXJbbl0vPWk7cmV0dXJuIHJ9ZnVuY3Rpb24gcHkodCl7Zm9yKHZhciBlLGk9IiI7dD49MzI7KWU9NjMrKDMyfDMxJnQpLGkrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdD4+PTU7cmV0dXJuIGU9dCs2MyxpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpfXZhciBjeT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKTt2YXIgaT1lfHx7fTt0aGlzLmRhdGFQcm9qZWN0aW9uPUVlKCJFUFNHOjQzMjYiKSx0aGlzLmZhY3Rvcl89aS5mYWN0b3I/aS5mYWN0b3I6MWU1LHRoaXMuZ2VvbWV0cnlMYXlvdXRfPWkuZ2VvbWV0cnlMYXlvdXQ/aS5nZW9tZXRyeUxheW91dDpBdC5YWX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUucmVhZEZlYXR1cmVGcm9tVGV4dD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMucmVhZEdlb21ldHJ5RnJvbVRleHQodCxlKTtyZXR1cm4gbmV3IEIoaSl9LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlc0Zyb21UZXh0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuW3RoaXMucmVhZEZlYXR1cmVGcm9tVGV4dCh0LGUpXX0sZS5wcm90b3R5cGUucmVhZEdlb21ldHJ5RnJvbVRleHQ9ZnVuY3Rpb24odCxlKXt2YXIgaT16ZSh0aGlzLmdlb21ldHJ5TGF5b3V0Xykscj1oeSh0LGksdGhpcy5mYWN0b3JfKTtzeShyLDAsci5sZW5ndGgsaSxyKTt2YXIgbj1yaShyLDAsci5sZW5ndGgsaSk7cmV0dXJuIGRkKG5ldyBocihuLHRoaXMuZ2VvbWV0cnlMYXlvdXRfKSwhMSx0aGlzLmFkYXB0T3B0aW9ucyhlKSl9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZVRleHQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEdlb21ldHJ5KCk7cmV0dXJuIGk/dGhpcy53cml0ZUdlb21ldHJ5VGV4dChpLGUpOihZKCExLDQwKSwiIil9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZXNUZXh0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMud3JpdGVGZWF0dXJlVGV4dCh0WzBdLGUpfSxlLnByb3RvdHlwZS53cml0ZUdlb21ldHJ5VGV4dD1mdW5jdGlvbih0LGUpe3ZhciBpPSh0PWRkKHQsITAsdGhpcy5hZGFwdE9wdGlvbnMoZSkpKS5nZXRGbGF0Q29vcmRpbmF0ZXMoKSxyPXQuZ2V0U3RyaWRlKCk7cmV0dXJuIHN5KGksMCxpLmxlbmd0aCxyLGkpLGF5KGkscix0aGlzLmZhY3Rvcl8pfSxlfSh6ZiksZHk9e1BvaW50OmZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10LmNvb3JkaW5hdGVzO2UmJmkmJnZ5KHIsZSxpKTtyZXR1cm4gbmV3IGNpKHIpfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZnkodC5hcmNzLGUpO3JldHVybiBuZXcgaHIoaSl9LFBvbHlnb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9W10scj0wLG49dC5hcmNzLmxlbmd0aDtyPG47KytyKWlbcl09ZnkodC5hcmNzW3JdLGUpO3JldHVybiBuZXcgSWkoaSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxlLGkpe3ZhciByPXQuY29vcmRpbmF0ZXM7aWYoZSYmaSlmb3IodmFyIG49MCxvPXIubGVuZ3RoO248bzsrK24pdnkocltuXSxlLGkpO3JldHVybiBuZXcgYmMocil9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1bXSxyPTAsbj10LmFyY3MubGVuZ3RoO3I8bjsrK3IpaVtyXT1meSh0LmFyY3Nbcl0sZSk7cmV0dXJuIG5ldyBQYyhpKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPVtdLHI9MCxuPXQuYXJjcy5sZW5ndGg7cjxuOysrcil7Zm9yKHZhciBvPXQuYXJjc1tyXSxzPVtdLGE9MCxoPW8ubGVuZ3RoO2E8aDsrK2Epc1thXT1meShvW2FdLGUpO2lbcl09c31yZXR1cm4gbmV3IEZjKGkpfX07ZnVuY3Rpb24gZnkodCxlKXtmb3IodmFyIGkscixuPVtdLG89MCxzPXQubGVuZ3RoO288czsrK28paT10W29dLG8+MCYmbi5wb3AoKSxyPWk+PTA/ZVtpXTplW35pXS5zbGljZSgpLnJldmVyc2UoKSxuLnB1c2guYXBwbHkobixyKTtmb3IodmFyIGE9MCxoPW4ubGVuZ3RoO2E8aDsrK2EpblthXT1uW2FdLnNsaWNlKCk7cmV0dXJuIG59ZnVuY3Rpb24gX3kodCxlLGkscixuLG8scyl7Zm9yKHZhciBhPXQuZ2VvbWV0cmllcyxoPVtdLGw9MCx1PWEubGVuZ3RoO2w8dTsrK2wpaFtsXT1neShhW2xdLGUsaSxyLG4sbyxzKTtyZXR1cm4gaH1mdW5jdGlvbiBneSh0LGUsaSxyLG4sbyxzKXt2YXIgYSxoPXQudHlwZSxsPWR5W2hdO2E9IlBvaW50Ij09PWh8fCJNdWx0aVBvaW50Ij09PWg/bCh0LGkscik6bCh0LGUpO3ZhciB1PW5ldyBCO3Uuc2V0R2VvbWV0cnkoZGQoYSwhMSxzKSksdm9pZCAwIT09dC5pZCYmdS5zZXRJZCh0LmlkKTt2YXIgcD10LnByb3BlcnRpZXM7cmV0dXJuIG4mJihwfHwocD17fSkscFtuXT1vKSxwJiZ1LnNldFByb3BlcnRpZXMocCksdX1mdW5jdGlvbiB5eSh0LGUsaSl7Zm9yKHZhciByPTAsbj0wLG89MCxzPXQubGVuZ3RoO288czsrK28pe3ZhciBhPXRbb107cis9YVswXSxuKz1hWzFdLGFbMF09cixhWzFdPW4sdnkoYSxlLGkpfX1mdW5jdGlvbiB2eSh0LGUsaSl7dFswXT10WzBdKmVbMF0raVswXSx0WzFdPXRbMV0qZVsxXStpWzFdfXZhciBteT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKTt2YXIgaT1lfHx7fTt0aGlzLmxheWVyTmFtZV89aS5sYXllck5hbWUsdGhpcy5sYXllcnNfPWkubGF5ZXJzP2kubGF5ZXJzOm51bGwsdGhpcy5kYXRhUHJvamVjdGlvbj1FZShpLmRhdGFQcm9qZWN0aW9uP2kuZGF0YVByb2plY3Rpb246IkVQU0c6NDMyNiIpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5yZWFkRmVhdHVyZXNGcm9tT2JqZWN0PWZ1bmN0aW9uKHQsZSl7aWYoIlRvcG9sb2d5Ij09dC50eXBlKXt2YXIgaSxyPXQsbj1udWxsLG89bnVsbDtyLnRyYW5zZm9ybSYmKG49KGk9ci50cmFuc2Zvcm0pLnNjYWxlLG89aS50cmFuc2xhdGUpO3ZhciBzPXIuYXJjcztpJiZmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47KytyKXl5KHRbcl0sZSxpKX0ocyxuLG8pO3ZhciBhLGg9W10sbD1yLm9iamVjdHMsdT10aGlzLmxheWVyTmFtZV87Zm9yKHZhciBwIGluIGwpdGhpcy5sYXllcnNfJiYtMT09dGhpcy5sYXllcnNfLmluZGV4T2YocCl8fCgiR2VvbWV0cnlDb2xsZWN0aW9uIj09PWxbcF0udHlwZT8oYT1sW3BdLGgucHVzaC5hcHBseShoLF95KGEscyxuLG8sdSxwLGUpKSk6KGE9bFtwXSxoLnB1c2goZ3koYSxzLG4sbyx1LHAsZSkpKSk7cmV0dXJuIGh9cmV0dXJuW119LGUucHJvdG90eXBlLnJlYWRQcm9qZWN0aW9uRnJvbU9iamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXRhUHJvamVjdGlvbn0sZX0oX2QpLHh5PWZ1bmN0aW9uKHQpe3RoaXMudGFnTmFtZV89dH07eHkucHJvdG90eXBlLmdldFRhZ05hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWdOYW1lX307dmFyIEV5PXh5LFN5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcyxlKSx0aGlzLmNvbmRpdGlvbnM9aSxZKHRoaXMuY29uZGl0aW9ucy5sZW5ndGg+PTIsNTcpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShFeSksVHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcywiQW5kIixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oU3kpLEN5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIpe3QuY2FsbCh0aGlzLCJCQk9YIiksdGhpcy5nZW9tZXRyeU5hbWU9ZSx0aGlzLmV4dGVudD1pLHRoaXMuc3JzTmFtZT1yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShFeSksUnk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkscixuKXt0LmNhbGwodGhpcyxlKSx0aGlzLmdlb21ldHJ5TmFtZT1pfHwidGhlX2dlb20iLHRoaXMuZ2VvbWV0cnk9cix0aGlzLnNyc05hbWU9bn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oRXkpLHd5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIpe3QuY2FsbCh0aGlzLCJDb250YWlucyIsZSxpLHIpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShSeSksSXk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkpe3QuY2FsbCh0aGlzLGUpLHRoaXMucHJvcGVydHlOYW1lPWl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEV5KSxMeT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXt0LmNhbGwodGhpcywiRHVyaW5nIixlKSx0aGlzLmJlZ2luPWksdGhpcy5lbmQ9cn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oSXkpLE95PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIsbil7dC5jYWxsKHRoaXMsZSxpKSx0aGlzLmV4cHJlc3Npb249cix0aGlzLm1hdGNoQ2FzZT1ufXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShJeSksUHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkscil7dC5jYWxsKHRoaXMsIlByb3BlcnR5SXNFcXVhbFRvIixlLGkscil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KE95KSxieT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMsIlByb3BlcnR5SXNHcmVhdGVyVGhhbiIsZSxpKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oT3kpLE15PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpKXt0LmNhbGwodGhpcywiUHJvcGVydHlJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvIixlLGkpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShPeSksRnk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkscil7dC5jYWxsKHRoaXMsIkludGVyc2VjdHMiLGUsaSxyKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oUnkpLEF5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIpe3QuY2FsbCh0aGlzLCJQcm9wZXJ0eUlzQmV0d2VlbiIsZSksdGhpcy5sb3dlckJvdW5kYXJ5PWksdGhpcy51cHBlckJvdW5kYXJ5PXJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEl5KSxOeT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyLG4sbyxzKXt0LmNhbGwodGhpcywiUHJvcGVydHlJc0xpa2UiLGUpLHRoaXMucGF0dGVybj1pLHRoaXMud2lsZENhcmQ9dm9pZCAwIT09cj9yOiIqIix0aGlzLnNpbmdsZUNoYXI9dm9pZCAwIT09bj9uOiIuIix0aGlzLmVzY2FwZUNoYXI9dm9pZCAwIT09bz9vOiIhIix0aGlzLm1hdGNoQ2FzZT1zfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShJeSksR3k9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcywiUHJvcGVydHlJc051bGwiLGUpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShJeSksRHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkpe3QuY2FsbCh0aGlzLCJQcm9wZXJ0eUlzTGVzc1RoYW4iLGUsaSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KE95KSxreT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7dC5jYWxsKHRoaXMsIlByb3BlcnR5SXNMZXNzVGhhbk9yRXF1YWxUbyIsZSxpKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oT3kpLGp5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMsIk5vdCIpLHRoaXMuY29uZGl0aW9uPWV9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEV5KSxVeT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSxyKXt0LmNhbGwodGhpcywiUHJvcGVydHlJc05vdEVxdWFsVG8iLGUsaSxyKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oT3kpLFl5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMsIk9yIixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oU3kpLEJ5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxpLHIpe3QuY2FsbCh0aGlzLCJXaXRoaW4iLGUsaSxyKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oUnkpO2Z1bmN0aW9uIFZ5KHQpe3ZhciBlPVtudWxsXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7cmV0dXJuIG5ldyhGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShUeSxlKSl9ZnVuY3Rpb24gWHkodCxlLGkpe3JldHVybiBuZXcgQ3kodCxlLGkpfXZhciB6eT17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIjp7Ym91bmRlZEJ5Omh1KElkLnByb3RvdHlwZS5yZWFkR2VvbWV0cnlFbGVtZW50LCJib3VuZHMiKX19LFd5PXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC93ZnMiOnt0b3RhbEluc2VydGVkOmh1KEZkKSx0b3RhbFVwZGF0ZWQ6aHUoRmQpLHRvdGFsRGVsZXRlZDpodShGZCl9fSxLeT17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvd2ZzIjp7VHJhbnNhY3Rpb25TdW1tYXJ5Omh1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LFd5LHQsZSl9LCJ0cmFuc2FjdGlvblN1bW1hcnkiKSxJbnNlcnRSZXN1bHRzOmh1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KFtdLG92LHQsZSl9LCJpbnNlcnRJZHMiKX19LEh5PXsiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC93ZnMiOntQcm9wZXJ0eU5hbWU6bHUoamQpfX0sWnk9eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dmcyI6e0luc2VydDpsdShmdW5jdGlvbih0LGUsaSl7dmFyIHI9aVtpLmxlbmd0aC0xXSxuPXIuZmVhdHVyZVR5cGUsbz1yLmZlYXR1cmVOUyxzPXIuZ21sVmVyc2lvbixhPXR1KG8sbik7dC5hcHBlbmRDaGlsZChhKSwyPT09cz9aZC5wcm90b3R5cGUud3JpdGVGZWF0dXJlRWxlbWVudChhLGUsaSk6VmQucHJvdG90eXBlLndyaXRlRmVhdHVyZUVsZW1lbnQoYSxlLGkpfSksVXBkYXRlOmx1KGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pW2kubGVuZ3RoLTFdO1kodm9pZCAwIT09ZS5nZXRJZCgpLDI3KTt2YXIgbj1yLmZlYXR1cmVUeXBlLG89ci5mZWF0dXJlUHJlZml4LHM9ci5mZWF0dXJlTlMsYT1hdihvLG4pLGg9ZS5nZXRHZW9tZXRyeU5hbWUoKTt0LnNldEF0dHJpYnV0ZSgidHlwZU5hbWUiLGEpLHQuc2V0QXR0cmlidXRlTlMoSnksInhtbG5zOiIrbyxzKTt2YXIgbD1lLmdldElkKCk7aWYodm9pZCAwIT09bCl7Zm9yKHZhciB1PWUuZ2V0S2V5cygpLHA9W10sYz0wLGQ9dS5sZW5ndGg7YzxkO2MrKyl7dmFyIGY9ZS5nZXQodVtjXSk7aWYodm9pZCAwIT09Zil7dmFyIF89dVtjXTtmJiYiZnVuY3Rpb24iPT10eXBlb2YgZi5nZXRTaW1wbGlmaWVkR2VvbWV0cnkmJihfPWgpLHAucHVzaCh7bmFtZTpfLHZhbHVlOmZ9KX19dnUoe2dtbFZlcnNpb246ci5nbWxWZXJzaW9uLG5vZGU6dCxoYXNaOnIuaGFzWixzcnNOYW1lOnIuc3JzTmFtZX0sWnkscHUoIlByb3BlcnR5IikscCxpKSxzdih0LGwsaSl9fSksRGVsZXRlOmx1KGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pW2kubGVuZ3RoLTFdO1kodm9pZCAwIT09ZS5nZXRJZCgpLDI2KTt2YXIgbj1yLmZlYXR1cmVUeXBlLG89ci5mZWF0dXJlUHJlZml4LHM9ci5mZWF0dXJlTlMsYT1hdihvLG4pO3Quc2V0QXR0cmlidXRlKCJ0eXBlTmFtZSIsYSksdC5zZXRBdHRyaWJ1dGVOUyhKeSwieG1sbnM6IitvLHMpO3ZhciBoPWUuZ2V0SWQoKTt2b2lkIDAhPT1oJiZzdih0LGgsaSl9KSxQcm9wZXJ0eTpsdShmdW5jdGlvbih0LGUsaSl7dmFyIHI9dHUoJHksIk5hbWUiKSxuPWlbaS5sZW5ndGgtMV0uZ21sVmVyc2lvbjtpZih0LmFwcGVuZENoaWxkKHIpLGpkKHIsZS5uYW1lKSx2b2lkIDAhPT1lLnZhbHVlJiZudWxsIT09ZS52YWx1ZSl7dmFyIG89dHUoJHksIlZhbHVlIik7dC5hcHBlbmRDaGlsZChvKSxlLnZhbHVlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS52YWx1ZS5nZXRTaW1wbGlmaWVkR2VvbWV0cnk/Mj09PW4/WmQucHJvdG90eXBlLndyaXRlR2VvbWV0cnlFbGVtZW50KG8sZS52YWx1ZSxpKTpWZC5wcm90b3R5cGUud3JpdGVHZW9tZXRyeUVsZW1lbnQobyxlLnZhbHVlLGkpOmpkKG8sZS52YWx1ZSl9fSksTmF0aXZlOmx1KGZ1bmN0aW9uKHQsZSxpKXtlLnZlbmRvcklkJiZ0LnNldEF0dHJpYnV0ZSgidmVuZG9ySWQiLGUudmVuZG9ySWQpO3ZvaWQgMCE9PWUuc2FmZVRvSWdub3JlJiZ0LnNldEF0dHJpYnV0ZSgic2FmZVRvSWdub3JlIixTdHJpbmcoZS5zYWZlVG9JZ25vcmUpKTt2b2lkIDAhPT1lLnZhbHVlJiZqZCh0LGUudmFsdWUpfSl9fSxxeT0iZmVhdHVyZSIsSnk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIixReT0iaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9vZ2MiLCR5PSJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dmcyIsdHY9Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvZmVzIixldj17IjEuMS4wIjoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC93ZnMgaHR0cDovL3NjaGVtYXMub3Blbmdpcy5uZXQvd2ZzLzEuMS4wL3dmcy54c2QiLCIxLjAuMCI6Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvd2ZzIGh0dHA6Ly9zY2hlbWFzLm9wZW5naXMubmV0L3dmcy8xLjAuMC93ZnMueHNkIn0saXY9IjEuMS4wIixydj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKTt2YXIgaT1lfHx7fTt0aGlzLmZlYXR1cmVUeXBlXz1pLmZlYXR1cmVUeXBlLHRoaXMuZmVhdHVyZU5TXz1pLmZlYXR1cmVOUyx0aGlzLmdtbEZvcm1hdF89aS5nbWxGb3JtYXQ/aS5nbWxGb3JtYXQ6bmV3IFZkLHRoaXMuc2NoZW1hTG9jYXRpb25fPWkuc2NoZW1hTG9jYXRpb24/aS5zY2hlbWFMb2NhdGlvbjpldltpdl19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldEZlYXR1cmVUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmVhdHVyZVR5cGVffSxlLnByb3RvdHlwZS5zZXRGZWF0dXJlVHlwZT1mdW5jdGlvbih0KXt0aGlzLmZlYXR1cmVUeXBlXz10fSxlLnByb3RvdHlwZS5yZWFkRmVhdHVyZXNGcm9tTm9kZT1mdW5jdGlvbih0LGUpe3ZhciBpPXtub2RlOnR9O3UoaSx7ZmVhdHVyZVR5cGU6dGhpcy5mZWF0dXJlVHlwZV8sZmVhdHVyZU5TOnRoaXMuZmVhdHVyZU5TX30pLHUoaSx0aGlzLmdldFJlYWRPcHRpb25zKHQsZXx8e30pKTt2YXIgcj1baV07dGhpcy5nbWxGb3JtYXRfLkZFQVRVUkVfQ09MTEVDVElPTl9QQVJTRVJTW0NkXS5mZWF0dXJlTWVtYmVyPW91KElkLnByb3RvdHlwZS5yZWFkRmVhdHVyZXNJbnRlcm5hbCk7dmFyIG49Z3UoW10sdGhpcy5nbWxGb3JtYXRfLkZFQVRVUkVfQ09MTEVDVElPTl9QQVJTRVJTLHQscix0aGlzLmdtbEZvcm1hdF8pO3JldHVybiBufHwobj1bXSksbn0sZS5wcm90b3R5cGUucmVhZFRyYW5zYWN0aW9uUmVzcG9uc2U9ZnVuY3Rpb24odCl7aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgZT1ydSh0KTtyZXR1cm4gdGhpcy5yZWFkVHJhbnNhY3Rpb25SZXNwb25zZUZyb21Eb2N1bWVudChlKX1yZXR1cm4gaXUodCk/dGhpcy5yZWFkVHJhbnNhY3Rpb25SZXNwb25zZUZyb21Eb2N1bWVudCh0KTp0aGlzLnJlYWRUcmFuc2FjdGlvblJlc3BvbnNlRnJvbU5vZGUodCl9fSxlLnByb3RvdHlwZS5yZWFkRmVhdHVyZUNvbGxlY3Rpb25NZXRhZGF0YT1mdW5jdGlvbih0KXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBlPXJ1KHQpO3JldHVybiB0aGlzLnJlYWRGZWF0dXJlQ29sbGVjdGlvbk1ldGFkYXRhRnJvbURvY3VtZW50KGUpfXJldHVybiBpdSh0KT90aGlzLnJlYWRGZWF0dXJlQ29sbGVjdGlvbk1ldGFkYXRhRnJvbURvY3VtZW50KHQpOnRoaXMucmVhZEZlYXR1cmVDb2xsZWN0aW9uTWV0YWRhdGFGcm9tTm9kZSh0KX19LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlQ29sbGVjdGlvbk1ldGFkYXRhRnJvbURvY3VtZW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIHRoaXMucmVhZEZlYXR1cmVDb2xsZWN0aW9uTWV0YWRhdGFGcm9tTm9kZShlKX0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVDb2xsZWN0aW9uTWV0YWRhdGFGcm9tTm9kZT1mdW5jdGlvbih0KXt2YXIgZT17fSxpPUFkKHQuZ2V0QXR0cmlidXRlKCJudW1iZXJPZkZlYXR1cmVzIikpO3JldHVybiBlLm51bWJlck9mRmVhdHVyZXM9aSxndShlLHp5LHQsW10sdGhpcy5nbWxGb3JtYXRfKX0sZS5wcm90b3R5cGUucmVhZFRyYW5zYWN0aW9uUmVzcG9uc2VGcm9tRG9jdW1lbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVUeXBlPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gdGhpcy5yZWFkVHJhbnNhY3Rpb25SZXNwb25zZUZyb21Ob2RlKGUpfSxlLnByb3RvdHlwZS5yZWFkVHJhbnNhY3Rpb25SZXNwb25zZUZyb21Ob2RlPWZ1bmN0aW9uKHQpe3JldHVybiBndSh7fSxLeSx0LFtdKX0sZS5wcm90b3R5cGUud3JpdGVHZXRGZWF0dXJlPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dHUoJHksIkdldEZlYXR1cmUiKTtpZihpLnNldEF0dHJpYnV0ZSgic2VydmljZSIsIldGUyIpLGkuc2V0QXR0cmlidXRlKCJ2ZXJzaW9uIiwiMS4xLjAiKSx0JiYodC5oYW5kbGUmJmkuc2V0QXR0cmlidXRlKCJoYW5kbGUiLHQuaGFuZGxlKSx0Lm91dHB1dEZvcm1hdCYmaS5zZXRBdHRyaWJ1dGUoIm91dHB1dEZvcm1hdCIsdC5vdXRwdXRGb3JtYXQpLHZvaWQgMCE9PXQubWF4RmVhdHVyZXMmJmkuc2V0QXR0cmlidXRlKCJtYXhGZWF0dXJlcyIsU3RyaW5nKHQubWF4RmVhdHVyZXMpKSx0LnJlc3VsdFR5cGUmJmkuc2V0QXR0cmlidXRlKCJyZXN1bHRUeXBlIix0LnJlc3VsdFR5cGUpLHZvaWQgMCE9PXQuc3RhcnRJbmRleCYmaS5zZXRBdHRyaWJ1dGUoInN0YXJ0SW5kZXgiLFN0cmluZyh0LnN0YXJ0SW5kZXgpKSx2b2lkIDAhPT10LmNvdW50JiZpLnNldEF0dHJpYnV0ZSgiY291bnQiLFN0cmluZyh0LmNvdW50KSksdm9pZCAwIT09dC52aWV3UGFyYW1zJiZpLnNldEF0dHJpYnV0ZSgidmlld1BhcmFtcyAiLHQudmlld1BhcmFtcyksZT10LmZpbHRlcix0LmJib3gpKXtZKHQuZ2VvbWV0cnlOYW1lLDEyKTt2YXIgcj1YeSh0Lmdlb21ldHJ5TmFtZSx0LmJib3gsdC5zcnNOYW1lKTtlPWU/VnkoZSxyKTpyfWkuc2V0QXR0cmlidXRlTlMoJGwsInhzaTpzY2hlbWFMb2NhdGlvbiIsdGhpcy5zY2hlbWFMb2NhdGlvbl8pO3ZhciBuPXtub2RlOml9O3JldHVybiB1KG4se3Nyc05hbWU6dC5zcnNOYW1lLGZlYXR1cmVOUzp0LmZlYXR1cmVOUz90LmZlYXR1cmVOUzp0aGlzLmZlYXR1cmVOU18sZmVhdHVyZVByZWZpeDp0LmZlYXR1cmVQcmVmaXgsZ2VvbWV0cnlOYW1lOnQuZ2VvbWV0cnlOYW1lLGZpbHRlcjplLHByb3BlcnR5TmFtZXM6dC5wcm9wZXJ0eU5hbWVzP3QucHJvcGVydHlOYW1lczpbXX0pLFkoQXJyYXkuaXNBcnJheSh0LmZlYXR1cmVUeXBlcyksMTEpLGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1pW2kubGVuZ3RoLTFdLG49dSh7fSxyKTtuLm5vZGU9dCx2dShuLGh2LHB1KCJRdWVyeSIpLGUsaSl9KGksdC5mZWF0dXJlVHlwZXMsW25dKSxpfSxlLnByb3RvdHlwZS53cml0ZVRyYW5zYWN0aW9uPWZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuLG8scz1bXSxhPXR1KCR5LCJUcmFuc2FjdGlvbiIpLGg9ci52ZXJzaW9uP3IudmVyc2lvbjppdixsPSIxLjAuMCI9PT1oPzI6MzthLnNldEF0dHJpYnV0ZSgic2VydmljZSIsIldGUyIpLGEuc2V0QXR0cmlidXRlKCJ2ZXJzaW9uIixoKSxyJiYobj1yLmdtbE9wdGlvbnM/ci5nbWxPcHRpb25zOnt9LHIuaGFuZGxlJiZhLnNldEF0dHJpYnV0ZSgiaGFuZGxlIixyLmhhbmRsZSkpO3ZhciBwPWV2W2hdO2Euc2V0QXR0cmlidXRlTlMoJGwsInhzaTpzY2hlbWFMb2NhdGlvbiIscCk7dmFyIGM9ci5mZWF0dXJlUHJlZml4P3IuZmVhdHVyZVByZWZpeDpxeTtyZXR1cm4gdCYmKG89dSh7bm9kZTphfSx7ZmVhdHVyZU5TOnIuZmVhdHVyZU5TLGZlYXR1cmVUeXBlOnIuZmVhdHVyZVR5cGUsZmVhdHVyZVByZWZpeDpjLGdtbFZlcnNpb246bCxoYXNaOnIuaGFzWixzcnNOYW1lOnIuc3JzTmFtZX0pLHUobyxuKSx2dShvLFp5LHB1KCJJbnNlcnQiKSx0LHMpKSxlJiYobz11KHtub2RlOmF9LHtmZWF0dXJlTlM6ci5mZWF0dXJlTlMsZmVhdHVyZVR5cGU6ci5mZWF0dXJlVHlwZSxmZWF0dXJlUHJlZml4OmMsZ21sVmVyc2lvbjpsLGhhc1o6ci5oYXNaLHNyc05hbWU6ci5zcnNOYW1lfSksdShvLG4pLHZ1KG8sWnkscHUoIlVwZGF0ZSIpLGUscykpLGkmJnZ1KHtub2RlOmEsZmVhdHVyZU5TOnIuZmVhdHVyZU5TLGZlYXR1cmVUeXBlOnIuZmVhdHVyZVR5cGUsZmVhdHVyZVByZWZpeDpjLGdtbFZlcnNpb246bCxzcnNOYW1lOnIuc3JzTmFtZX0sWnkscHUoIkRlbGV0ZSIpLGkscyksci5uYXRpdmVFbGVtZW50cyYmdnUoe25vZGU6YSxmZWF0dXJlTlM6ci5mZWF0dXJlTlMsZmVhdHVyZVR5cGU6ci5mZWF0dXJlVHlwZSxmZWF0dXJlUHJlZml4OmMsZ21sVmVyc2lvbjpsLHNyc05hbWU6ci5zcnNOYW1lfSxaeSxwdSgiTmF0aXZlIiksci5uYXRpdmVFbGVtZW50cyxzKSxhfSxlLnByb3RvdHlwZS5yZWFkUHJvamVjdGlvbkZyb21Eb2N1bWVudD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWlmKGUubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiB0aGlzLnJlYWRQcm9qZWN0aW9uRnJvbU5vZGUoZSk7cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLnJlYWRQcm9qZWN0aW9uRnJvbU5vZGU9ZnVuY3Rpb24odCl7aWYodC5maXJzdEVsZW1lbnRDaGlsZCYmdC5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZClmb3IodmFyIGU9KHQ9dC5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCkuZmlyc3RFbGVtZW50Q2hpbGQ7ZTtlPWUubmV4dEVsZW1lbnRTaWJsaW5nKWlmKDAhPT1lLmNoaWxkTm9kZXMubGVuZ3RoJiYoMSE9PWUuY2hpbGROb2Rlcy5sZW5ndGh8fDMhPT1lLmZpcnN0Q2hpbGQubm9kZVR5cGUpKXt2YXIgaT1be31dO3JldHVybiB0aGlzLmdtbEZvcm1hdF8ucmVhZEdlb21ldHJ5RWxlbWVudChlLGkpLEVlKGkucG9wKCkuc3JzTmFtZSl9cmV0dXJuIG51bGx9LGV9KFRkKTt2YXIgbnY9eyJodHRwOi8vd3d3Lm9wZW5naXMubmV0L29nYyI6e0ZlYXR1cmVJZDpvdShmdW5jdGlvbih0LGUpe3JldHVybiB0LmdldEF0dHJpYnV0ZSgiZmlkIil9KX19O3ZhciBvdj17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvd2ZzIjp7RmVhdHVyZTpmdW5jdGlvbih0LGUpe191KG52LHQsZSl9fX07ZnVuY3Rpb24gc3YodCxlLGkpe3ZhciByPXR1KFF5LCJGaWx0ZXIiKSxuPXR1KFF5LCJGZWF0dXJlSWQiKTtyLmFwcGVuZENoaWxkKG4pLG4uc2V0QXR0cmlidXRlKCJmaWQiLGUpLHQuYXBwZW5kQ2hpbGQocil9ZnVuY3Rpb24gYXYodCxlKXt2YXIgaT0odD10fHxxeSkrIjoiO3JldHVybiAwPT09ZS5pbmRleE9mKGkpP2U6aStlfXZhciBodj17Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvd2ZzIjp7UXVlcnk6bHUoZnVuY3Rpb24odCxlLGkpe3ZhciByLG49aVtpLmxlbmd0aC0xXSxvPW4uZmVhdHVyZVByZWZpeCxzPW4uZmVhdHVyZU5TLGE9bi5wcm9wZXJ0eU5hbWVzLGg9bi5zcnNOYW1lO3I9bz9hdihvLGUpOmU7dC5zZXRBdHRyaWJ1dGUoInR5cGVOYW1lIixyKSxoJiZ0LnNldEF0dHJpYnV0ZSgic3JzTmFtZSIsaCk7cyYmdC5zZXRBdHRyaWJ1dGVOUyhKeSwieG1sbnM6IitvLHMpO3ZhciBsPXUoe30sbik7bC5ub2RlPXQsdnUobCxIeSxwdSgiUHJvcGVydHlOYW1lIiksYSxpKTt2YXIgcD1uLmZpbHRlcjtpZihwKXt2YXIgYz10dShReSwiRmlsdGVyIik7dC5hcHBlbmRDaGlsZChjKSxsdihjLHAsaSl9fSl9LCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L29nYyI6e0R1cmluZzpsdShmdW5jdGlvbih0LGUsaSl7dmFyIHI9dHUodHYsIlZhbHVlUmVmZXJlbmNlIik7amQocixlLnByb3BlcnR5TmFtZSksdC5hcHBlbmRDaGlsZChyKTt2YXIgbj10dShDZCwiVGltZVBlcmlvZCIpO3QuYXBwZW5kQ2hpbGQobik7dmFyIG89dHUoQ2QsImJlZ2luIik7bi5hcHBlbmRDaGlsZChvKSxfdihvLGUuYmVnaW4pO3ZhciBzPXR1KENkLCJlbmQiKTtuLmFwcGVuZENoaWxkKHMpLF92KHMsZS5lbmQpfSksQW5kOmx1KHV2KSxPcjpsdSh1diksTm90Omx1KGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj17bm9kZTp0fSxuPWUuY29uZGl0aW9uO3Z1KHIsaHYscHUobi5nZXRUYWdOYW1lKCkpLFtuXSxpKX0pLEJCT1g6bHUoZnVuY3Rpb24odCxlLGkpe2lbaS5sZW5ndGgtMV0uc3JzTmFtZT1lLnNyc05hbWUsZHYodCxlLmdlb21ldHJ5TmFtZSksVmQucHJvdG90eXBlLndyaXRlR2VvbWV0cnlFbGVtZW50KHQsZS5leHRlbnQsaSl9KSxDb250YWluczpsdShmdW5jdGlvbih0LGUsaSl7aVtpLmxlbmd0aC0xXS5zcnNOYW1lPWUuc3JzTmFtZSxkdih0LGUuZ2VvbWV0cnlOYW1lKSxWZC5wcm90b3R5cGUud3JpdGVHZW9tZXRyeUVsZW1lbnQodCxlLmdlb21ldHJ5LGkpfSksSW50ZXJzZWN0czpsdShmdW5jdGlvbih0LGUsaSl7aVtpLmxlbmd0aC0xXS5zcnNOYW1lPWUuc3JzTmFtZSxkdih0LGUuZ2VvbWV0cnlOYW1lKSxWZC5wcm90b3R5cGUud3JpdGVHZW9tZXRyeUVsZW1lbnQodCxlLmdlb21ldHJ5LGkpfSksV2l0aGluOmx1KGZ1bmN0aW9uKHQsZSxpKXtpW2kubGVuZ3RoLTFdLnNyc05hbWU9ZS5zcnNOYW1lLGR2KHQsZS5nZW9tZXRyeU5hbWUpLFZkLnByb3RvdHlwZS53cml0ZUdlb21ldHJ5RWxlbWVudCh0LGUuZ2VvbWV0cnksaSl9KSxQcm9wZXJ0eUlzRXF1YWxUbzpsdShwdiksUHJvcGVydHlJc05vdEVxdWFsVG86bHUocHYpLFByb3BlcnR5SXNMZXNzVGhhbjpsdShwdiksUHJvcGVydHlJc0xlc3NUaGFuT3JFcXVhbFRvOmx1KHB2KSxQcm9wZXJ0eUlzR3JlYXRlclRoYW46bHUocHYpLFByb3BlcnR5SXNHcmVhdGVyVGhhbk9yRXF1YWxUbzpsdShwdiksUHJvcGVydHlJc051bGw6bHUoZnVuY3Rpb24odCxlLGkpe2R2KHQsZS5wcm9wZXJ0eU5hbWUpfSksUHJvcGVydHlJc0JldHdlZW46bHUoZnVuY3Rpb24odCxlLGkpe2R2KHQsZS5wcm9wZXJ0eU5hbWUpO3ZhciByPXR1KFF5LCJMb3dlckJvdW5kYXJ5Iik7dC5hcHBlbmRDaGlsZChyKSxmdihyLCIiK2UubG93ZXJCb3VuZGFyeSk7dmFyIG49dHUoUXksIlVwcGVyQm91bmRhcnkiKTt0LmFwcGVuZENoaWxkKG4pLGZ2KG4sIiIrZS51cHBlckJvdW5kYXJ5KX0pLFByb3BlcnR5SXNMaWtlOmx1KGZ1bmN0aW9uKHQsZSxpKXt0LnNldEF0dHJpYnV0ZSgid2lsZENhcmQiLGUud2lsZENhcmQpLHQuc2V0QXR0cmlidXRlKCJzaW5nbGVDaGFyIixlLnNpbmdsZUNoYXIpLHQuc2V0QXR0cmlidXRlKCJlc2NhcGVDaGFyIixlLmVzY2FwZUNoYXIpLHZvaWQgMCE9PWUubWF0Y2hDYXNlJiZ0LnNldEF0dHJpYnV0ZSgibWF0Y2hDYXNlIixlLm1hdGNoQ2FzZS50b1N0cmluZygpKTtkdih0LGUucHJvcGVydHlOYW1lKSxmdih0LCIiK2UucGF0dGVybil9KX19O2Z1bmN0aW9uIGx2KHQsZSxpKXt2dSh7bm9kZTp0fSxodixwdShlLmdldFRhZ05hbWUoKSksW2VdLGkpfWZ1bmN0aW9uIHV2KHQsZSxpKXtmb3IodmFyIHI9e25vZGU6dH0sbj1lLmNvbmRpdGlvbnMsbz0wLHM9bi5sZW5ndGg7bzxzOysrbyl7dmFyIGE9bltvXTt2dShyLGh2LHB1KGEuZ2V0VGFnTmFtZSgpKSxbYV0saSl9fWZ1bmN0aW9uIHB2KHQsZSxpKXt2b2lkIDAhPT1lLm1hdGNoQ2FzZSYmdC5zZXRBdHRyaWJ1dGUoIm1hdGNoQ2FzZSIsZS5tYXRjaENhc2UudG9TdHJpbmcoKSksZHYodCxlLnByb3BlcnR5TmFtZSksZnYodCwiIitlLmV4cHJlc3Npb24pfWZ1bmN0aW9uIGN2KHQsZSxpKXt2YXIgcj10dShReSx0KTtqZChyLGkpLGUuYXBwZW5kQ2hpbGQocil9ZnVuY3Rpb24gZHYodCxlKXtjdigiUHJvcGVydHlOYW1lIix0LGUpfWZ1bmN0aW9uIGZ2KHQsZSl7Y3YoIkxpdGVyYWwiLHQsZSl9ZnVuY3Rpb24gX3YodCxlKXt2YXIgaT10dShDZCwiVGltZUluc3RhbnQiKTt0LmFwcGVuZENoaWxkKGkpO3ZhciByPXR1KENkLCJ0aW1lUG9zaXRpb24iKTtpLmFwcGVuZENoaWxkKHIpLGpkKHIsZSl9dmFyIGd2PXJ2LHl2PXtQT0lOVDpjaSxMSU5FU1RSSU5HOmhyLFBPTFlHT046SWksTVVMVElQT0lOVDpiYyxNVUxUSUxJTkVTVFJJTkc6UGMsTVVMVElQT0xZR09OOkZjfSx2dj0iRU1QVFkiLG12PSJaIix4dj0iTSIsRXY9MSxTdj0yLFR2PTMsQ3Y9NCxSdj01LHd2PTYsSXY9e307Zm9yKHZhciBMdiBpbiBOdClJdltMdl09TnRbTHZdLnRvVXBwZXJDYXNlKCk7dmFyIE92PWZ1bmN0aW9uKHQpe3RoaXMud2t0PXQsdGhpcy5pbmRleF89LTF9O092LnByb3RvdHlwZS5pc0FscGhhXz1mdW5jdGlvbih0KXtyZXR1cm4gdD49ImEiJiZ0PD0ieiJ8fHQ+PSJBIiYmdDw9IloifSxPdi5wcm90b3R5cGUuaXNOdW1lcmljXz1mdW5jdGlvbih0LGUpe3JldHVybiB0Pj0iMCImJnQ8PSI5Inx8Ii4iPT10JiYhKHZvaWQgMCE9PWUmJmUpfSxPdi5wcm90b3R5cGUuaXNXaGl0ZVNwYWNlXz1mdW5jdGlvbih0KXtyZXR1cm4iICI9PXR8fCJcdCI9PXR8fCJcciI9PXR8fCJcbiI9PXR9LE92LnByb3RvdHlwZS5uZXh0Q2hhcl89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53a3QuY2hhckF0KCsrdGhpcy5pbmRleF8pfSxPdi5wcm90b3R5cGUubmV4dFRva2VuPWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLm5leHRDaGFyXygpLGk9dGhpcy5pbmRleF8scj1lO2lmKCIoIj09ZSl0PVN2O2Vsc2UgaWYoIiwiPT1lKXQ9UnY7ZWxzZSBpZigiKSI9PWUpdD1UdjtlbHNlIGlmKHRoaXMuaXNOdW1lcmljXyhlKXx8Ii0iPT1lKXQ9Q3Yscj10aGlzLnJlYWROdW1iZXJfKCk7ZWxzZSBpZih0aGlzLmlzQWxwaGFfKGUpKXQ9RXYscj10aGlzLnJlYWRUZXh0XygpO2Vsc2V7aWYodGhpcy5pc1doaXRlU3BhY2VfKGUpKXJldHVybiB0aGlzLm5leHRUb2tlbigpO2lmKCIiIT09ZSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAiK2UpO3Q9d3Z9cmV0dXJue3Bvc2l0aW9uOmksdmFsdWU6cix0eXBlOnR9fSxPdi5wcm90b3R5cGUucmVhZE51bWJlcl89ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuaW5kZXhfLGk9ITEscj0hMTtkb3siLiI9PXQ/aT0hMDoiZSIhPXQmJiJFIiE9dHx8KHI9ITApLHQ9dGhpcy5uZXh0Q2hhcl8oKX13aGlsZSh0aGlzLmlzTnVtZXJpY18odCxpKXx8IXImJigiZSI9PXR8fCJFIj09dCl8fHImJigiLSI9PXR8fCIrIj09dCkpO3JldHVybiBwYXJzZUZsb2F0KHRoaXMud2t0LnN1YnN0cmluZyhlLHRoaXMuaW5kZXhfLS0pKX0sT3YucHJvdG90eXBlLnJlYWRUZXh0Xz1mdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5pbmRleF87ZG97dD10aGlzLm5leHRDaGFyXygpfXdoaWxlKHRoaXMuaXNBbHBoYV8odCkpO3JldHVybiB0aGlzLndrdC5zdWJzdHJpbmcoZSx0aGlzLmluZGV4Xy0tKS50b1VwcGVyQ2FzZSgpfTt2YXIgUHY9ZnVuY3Rpb24odCl7dGhpcy5sZXhlcl89dCx0aGlzLnRva2VuXyx0aGlzLmxheW91dF89QXQuWFl9O2Z1bmN0aW9uIGJ2KHQpe3ZhciBlPXQuZ2V0Q29vcmRpbmF0ZXMoKTtyZXR1cm4gMD09PWUubGVuZ3RoPyIiOmUuam9pbigiICIpfWZ1bmN0aW9uIE12KHQpe2Zvcih2YXIgZT10LmdldENvb3JkaW5hdGVzKCksaT1bXSxyPTAsbj1lLmxlbmd0aDtyPG47KytyKWkucHVzaChlW3JdLmpvaW4oIiAiKSk7cmV0dXJuIGkuam9pbigiLCIpfWZ1bmN0aW9uIEZ2KHQpe2Zvcih2YXIgZT1bXSxpPXQuZ2V0TGluZWFyUmluZ3MoKSxyPTAsbj1pLmxlbmd0aDtyPG47KytyKWUucHVzaCgiKCIrTXYoaVtyXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9UHYucHJvdG90eXBlLmNvbnN1bWVfPWZ1bmN0aW9uKCl7dGhpcy50b2tlbl89dGhpcy5sZXhlcl8ubmV4dFRva2VuKCl9LFB2LnByb3RvdHlwZS5pc1Rva2VuVHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50b2tlbl8udHlwZT09dH0sUHYucHJvdG90eXBlLm1hdGNoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaXNUb2tlblR5cGUodCk7cmV0dXJuIGUmJnRoaXMuY29uc3VtZV8oKSxlfSxQdi5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdW1lXygpLHRoaXMucGFyc2VHZW9tZXRyeV8oKX0sUHYucHJvdG90eXBlLnBhcnNlR2VvbWV0cnlMYXlvdXRfPWZ1bmN0aW9uKCl7dmFyIHQ9QXQuWFksZT10aGlzLnRva2VuXztpZih0aGlzLmlzVG9rZW5UeXBlKEV2KSl7dmFyIGk9ZS52YWx1ZTtpPT09bXY/dD1BdC5YWVo6aT09PXh2P3Q9QXQuWFlNOiJaTSI9PT1pJiYodD1BdC5YWVpNKSx0IT09QXQuWFkmJnRoaXMuY29uc3VtZV8oKX1yZXR1cm4gdH0sUHYucHJvdG90eXBlLnBhcnNlR2VvbWV0cnlDb2xsZWN0aW9uVGV4dF89ZnVuY3Rpb24oKXtpZih0aGlzLm1hdGNoKFN2KSl7dmFyIHQ9W107ZG97dC5wdXNoKHRoaXMucGFyc2VHZW9tZXRyeV8oKSl9d2hpbGUodGhpcy5tYXRjaChSdikpO2lmKHRoaXMubWF0Y2goVHYpKXJldHVybiB0fWVsc2UgaWYodGhpcy5pc0VtcHR5R2VvbWV0cnlfKCkpcmV0dXJuW107dGhyb3cgbmV3IEVycm9yKHRoaXMuZm9ybWF0RXJyb3JNZXNzYWdlXygpKX0sUHYucHJvdG90eXBlLnBhcnNlUG9pbnRUZXh0Xz1mdW5jdGlvbigpe2lmKHRoaXMubWF0Y2goU3YpKXt2YXIgdD10aGlzLnBhcnNlUG9pbnRfKCk7aWYodGhpcy5tYXRjaChUdikpcmV0dXJuIHR9ZWxzZSBpZih0aGlzLmlzRW1wdHlHZW9tZXRyeV8oKSlyZXR1cm4gbnVsbDt0aHJvdyBuZXcgRXJyb3IodGhpcy5mb3JtYXRFcnJvck1lc3NhZ2VfKCkpfSxQdi5wcm90b3R5cGUucGFyc2VMaW5lU3RyaW5nVGV4dF89ZnVuY3Rpb24oKXtpZih0aGlzLm1hdGNoKFN2KSl7dmFyIHQ9dGhpcy5wYXJzZVBvaW50TGlzdF8oKTtpZih0aGlzLm1hdGNoKFR2KSlyZXR1cm4gdH1lbHNlIGlmKHRoaXMuaXNFbXB0eUdlb21ldHJ5XygpKXJldHVybltdO3Rocm93IG5ldyBFcnJvcih0aGlzLmZvcm1hdEVycm9yTWVzc2FnZV8oKSl9LFB2LnByb3RvdHlwZS5wYXJzZVBvbHlnb25UZXh0Xz1mdW5jdGlvbigpe2lmKHRoaXMubWF0Y2goU3YpKXt2YXIgdD10aGlzLnBhcnNlTGluZVN0cmluZ1RleHRMaXN0XygpO2lmKHRoaXMubWF0Y2goVHYpKXJldHVybiB0fWVsc2UgaWYodGhpcy5pc0VtcHR5R2VvbWV0cnlfKCkpcmV0dXJuW107dGhyb3cgbmV3IEVycm9yKHRoaXMuZm9ybWF0RXJyb3JNZXNzYWdlXygpKX0sUHYucHJvdG90eXBlLnBhcnNlTXVsdGlQb2ludFRleHRfPWZ1bmN0aW9uKCl7dmFyIHQ7aWYodGhpcy5tYXRjaChTdikpe2lmKHQ9dGhpcy50b2tlbl8udHlwZT09U3Y/dGhpcy5wYXJzZVBvaW50VGV4dExpc3RfKCk6dGhpcy5wYXJzZVBvaW50TGlzdF8oKSx0aGlzLm1hdGNoKFR2KSlyZXR1cm4gdH1lbHNlIGlmKHRoaXMuaXNFbXB0eUdlb21ldHJ5XygpKXJldHVybltdO3Rocm93IG5ldyBFcnJvcih0aGlzLmZvcm1hdEVycm9yTWVzc2FnZV8oKSl9LFB2LnByb3RvdHlwZS5wYXJzZU11bHRpTGluZVN0cmluZ1RleHRfPWZ1bmN0aW9uKCl7aWYodGhpcy5tYXRjaChTdikpe3ZhciB0PXRoaXMucGFyc2VMaW5lU3RyaW5nVGV4dExpc3RfKCk7aWYodGhpcy5tYXRjaChUdikpcmV0dXJuIHR9ZWxzZSBpZih0aGlzLmlzRW1wdHlHZW9tZXRyeV8oKSlyZXR1cm5bXTt0aHJvdyBuZXcgRXJyb3IodGhpcy5mb3JtYXRFcnJvck1lc3NhZ2VfKCkpfSxQdi5wcm90b3R5cGUucGFyc2VNdWx0aVBvbHlnb25UZXh0Xz1mdW5jdGlvbigpe2lmKHRoaXMubWF0Y2goU3YpKXt2YXIgdD10aGlzLnBhcnNlUG9seWdvblRleHRMaXN0XygpO2lmKHRoaXMubWF0Y2goVHYpKXJldHVybiB0fWVsc2UgaWYodGhpcy5pc0VtcHR5R2VvbWV0cnlfKCkpcmV0dXJuW107dGhyb3cgbmV3IEVycm9yKHRoaXMuZm9ybWF0RXJyb3JNZXNzYWdlXygpKX0sUHYucHJvdG90eXBlLnBhcnNlUG9pbnRfPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9dGhpcy5sYXlvdXRfLmxlbmd0aCxpPTA7aTxlOysraSl7dmFyIHI9dGhpcy50b2tlbl87aWYoIXRoaXMubWF0Y2goQ3YpKWJyZWFrO3QucHVzaChyLnZhbHVlKX1pZih0Lmxlbmd0aD09ZSlyZXR1cm4gdDt0aHJvdyBuZXcgRXJyb3IodGhpcy5mb3JtYXRFcnJvck1lc3NhZ2VfKCkpfSxQdi5wcm90b3R5cGUucGFyc2VQb2ludExpc3RfPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVt0aGlzLnBhcnNlUG9pbnRfKCldO3RoaXMubWF0Y2goUnYpOyl0LnB1c2godGhpcy5wYXJzZVBvaW50XygpKTtyZXR1cm4gdH0sUHYucHJvdG90eXBlLnBhcnNlUG9pbnRUZXh0TGlzdF89ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W3RoaXMucGFyc2VQb2ludFRleHRfKCldO3RoaXMubWF0Y2goUnYpOyl0LnB1c2godGhpcy5wYXJzZVBvaW50VGV4dF8oKSk7cmV0dXJuIHR9LFB2LnByb3RvdHlwZS5wYXJzZUxpbmVTdHJpbmdUZXh0TGlzdF89ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W3RoaXMucGFyc2VMaW5lU3RyaW5nVGV4dF8oKV07dGhpcy5tYXRjaChSdik7KXQucHVzaCh0aGlzLnBhcnNlTGluZVN0cmluZ1RleHRfKCkpO3JldHVybiB0fSxQdi5wcm90b3R5cGUucGFyc2VQb2x5Z29uVGV4dExpc3RfPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVt0aGlzLnBhcnNlUG9seWdvblRleHRfKCldO3RoaXMubWF0Y2goUnYpOyl0LnB1c2godGhpcy5wYXJzZVBvbHlnb25UZXh0XygpKTtyZXR1cm4gdH0sUHYucHJvdG90eXBlLmlzRW1wdHlHZW9tZXRyeV89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmlzVG9rZW5UeXBlKEV2KSYmdGhpcy50b2tlbl8udmFsdWU9PXZ2O3JldHVybiB0JiZ0aGlzLmNvbnN1bWVfKCksdH0sUHYucHJvdG90eXBlLmZvcm1hdEVycm9yTWVzc2FnZV89ZnVuY3Rpb24oKXtyZXR1cm4iVW5leHBlY3RlZCBgIit0aGlzLnRva2VuXy52YWx1ZSsiYCBhdCBwb3NpdGlvbiAiK3RoaXMudG9rZW5fLnBvc2l0aW9uKyIgaW4gYCIrdGhpcy5sZXhlcl8ud2t0KyJgIn0sUHYucHJvdG90eXBlLnBhcnNlR2VvbWV0cnlfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50b2tlbl87aWYodGhpcy5tYXRjaChFdikpe3ZhciBlPXQudmFsdWU7aWYodGhpcy5sYXlvdXRfPXRoaXMucGFyc2VHZW9tZXRyeUxheW91dF8oKSwiR0VPTUVUUllDT0xMRUNUSU9OIj09ZSl7dmFyIGk9dGhpcy5wYXJzZUdlb21ldHJ5Q29sbGVjdGlvblRleHRfKCk7cmV0dXJuIG5ldyB1ZChpKX12YXIgcixuPXl2W2VdO2lmKCFuKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBnZW9tZXRyeSB0eXBlOiAiK2UpO3N3aXRjaChlKXtjYXNlIlBPSU5UIjpyPXRoaXMucGFyc2VQb2ludFRleHRfKCk7YnJlYWs7Y2FzZSJMSU5FU1RSSU5HIjpyPXRoaXMucGFyc2VMaW5lU3RyaW5nVGV4dF8oKTticmVhaztjYXNlIlBPTFlHT04iOnI9dGhpcy5wYXJzZVBvbHlnb25UZXh0XygpO2JyZWFrO2Nhc2UiTVVMVElQT0lOVCI6cj10aGlzLnBhcnNlTXVsdGlQb2ludFRleHRfKCk7YnJlYWs7Y2FzZSJNVUxUSUxJTkVTVFJJTkciOnI9dGhpcy5wYXJzZU11bHRpTGluZVN0cmluZ1RleHRfKCk7YnJlYWs7Y2FzZSJNVUxUSVBPTFlHT04iOnI9dGhpcy5wYXJzZU11bHRpUG9seWdvblRleHRfKCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZ2VvbWV0cnkgdHlwZTogIitlKX1yZXR1cm4gcnx8KHI9bj09PXl2LlBPSU5UP1tOYU4sTmFOXTpbXSksbmV3IG4ocix0aGlzLmxheW91dF8pfXRocm93IG5ldyBFcnJvcih0aGlzLmZvcm1hdEVycm9yTWVzc2FnZV8oKSl9O3ZhciBBdj17UG9pbnQ6YnYsTGluZVN0cmluZzpNdixQb2x5Z29uOkZ2LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9dC5nZXRQb2ludHMoKSxyPTAsbj1pLmxlbmd0aDtyPG47KytyKWUucHVzaCgiKCIrYnYoaVtyXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT10LmdldExpbmVTdHJpbmdzKCkscj0wLG49aS5sZW5ndGg7cjxuOysrcillLnB1c2goIigiK012KGlbcl0pKyIpIik7cmV0dXJuIGUuam9pbigiLCIpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9dC5nZXRQb2x5Z29ucygpLHI9MCxuPWkubGVuZ3RoO3I8bjsrK3IpZS5wdXNoKCIoIitGdihpW3JdKSsiKSIpO3JldHVybiBlLmpvaW4oIiwiKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPXQuZ2V0R2VvbWV0cmllcygpLHI9MCxuPWkubGVuZ3RoO3I8bjsrK3IpZS5wdXNoKE52KGlbcl0pKTtyZXR1cm4gZS5qb2luKCIsIil9fTtmdW5jdGlvbiBOdih0KXt2YXIgZT10LmdldFR5cGUoKSxpPSgwLEF2W2VdKSh0KTtpZihlPWUudG9VcHBlckNhc2UoKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5nZXRGbGF0Q29vcmRpbmF0ZXMpe3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0TGF5b3V0KCksaT0iIjtyZXR1cm4gZSE9PUF0LlhZWiYmZSE9PUF0LlhZWk18fChpKz1tdiksZSE9PUF0LlhZTSYmZSE9PUF0LlhZWk18fChpKz14diksaX0odCk7ci5sZW5ndGg+MCYmKGUrPSIgIityKX1yZXR1cm4gMD09PWkubGVuZ3RoP2UrIiAiK3Z2OmUrIigiK2krIikifXZhciBHdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKTt2YXIgaT1lfHx7fTt0aGlzLnNwbGl0Q29sbGVjdGlvbl89dm9pZCAwIT09aS5zcGxpdENvbGxlY3Rpb24mJmkuc3BsaXRDb2xsZWN0aW9ufXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5wYXJzZV89ZnVuY3Rpb24odCl7dmFyIGU9bmV3IE92KHQpO3JldHVybiBuZXcgUHYoZSkucGFyc2UoKX0sZS5wcm90b3R5cGUucmVhZEZlYXR1cmVGcm9tVGV4dD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMucmVhZEdlb21ldHJ5RnJvbVRleHQodCxlKTtpZihpKXt2YXIgcj1uZXcgQjtyZXR1cm4gci5zZXRHZW9tZXRyeShpKSxyfXJldHVybiBudWxsfSxlLnByb3RvdHlwZS5yZWFkRmVhdHVyZXNGcm9tVGV4dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1bXSxyPXRoaXMucmVhZEdlb21ldHJ5RnJvbVRleHQodCxlKSxuPVtdLG89MCxzPShpPXRoaXMuc3BsaXRDb2xsZWN0aW9uXyYmci5nZXRUeXBlKCk9PU50LkdFT01FVFJZX0NPTExFQ1RJT04/ci5nZXRHZW9tZXRyaWVzQXJyYXkoKTpbcl0pLmxlbmd0aDtvPHM7KytvKXt2YXIgYT1uZXcgQjthLnNldEdlb21ldHJ5KGlbb10pLG4ucHVzaChhKX1yZXR1cm4gbn0sZS5wcm90b3R5cGUucmVhZEdlb21ldHJ5RnJvbVRleHQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnBhcnNlXyh0KTtyZXR1cm4gaT9kZChpLCExLGUpOm51bGx9LGUucHJvdG90eXBlLndyaXRlRmVhdHVyZVRleHQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEdlb21ldHJ5KCk7cmV0dXJuIGk/dGhpcy53cml0ZUdlb21ldHJ5VGV4dChpLGUpOiIifSxlLnByb3RvdHlwZS53cml0ZUZlYXR1cmVzVGV4dD1mdW5jdGlvbih0LGUpe2lmKDE9PXQubGVuZ3RoKXJldHVybiB0aGlzLndyaXRlRmVhdHVyZVRleHQodFswXSxlKTtmb3IodmFyIGk9W10scj0wLG49dC5sZW5ndGg7cjxuOysrcilpLnB1c2godFtyXS5nZXRHZW9tZXRyeSgpKTt2YXIgbz1uZXcgdWQoaSk7cmV0dXJuIHRoaXMud3JpdGVHZW9tZXRyeVRleHQobyxlKX0sZS5wcm90b3R5cGUud3JpdGVHZW9tZXRyeVRleHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTnYoZGQodCwhMCxlKSl9LGV9KHpmKSxEdj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI7ZnVuY3Rpb24ga3YodCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlTlMoRHYsImhyZWYiKX12YXIganY9ZnVuY3Rpb24oKXt9O2p2LnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe2lmKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIGU9cnUodCk7cmV0dXJuIHRoaXMucmVhZEZyb21Eb2N1bWVudChlKX1yZXR1cm4gaXUodCk/dGhpcy5yZWFkRnJvbURvY3VtZW50KHQpOnRoaXMucmVhZEZyb21Ob2RlKHQpfXJldHVybiBudWxsfSxqdi5wcm90b3R5cGUucmVhZEZyb21Eb2N1bWVudD1mdW5jdGlvbih0KXt9LGp2LnByb3RvdHlwZS5yZWFkRnJvbU5vZGU9ZnVuY3Rpb24odCl7fTt2YXIgVXY9anYsWXY9W251bGwsImh0dHA6Ly93d3cub3Blbmdpcy5uZXQvd21zIl0sQnY9ZnUoWXYse1NlcnZpY2U6aHUoZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3Uoe30senYsdCxlKX0pLENhcGFiaWxpdHk6aHUoZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3Uoe30sVnYsdCxlKX0pfSksVnY9ZnUoWXYse1JlcXVlc3Q6aHUoZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3Uoe30sJHYsdCxlKX0pLEV4Y2VwdGlvbjpodShmdW5jdGlvbih0LGUpe3JldHVybiBndShbXSxadix0LGUpfSksTGF5ZXI6aHUoZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3Uoe30scXYsdCxlKX0pfSksWHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLnZlcnNpb249dm9pZCAwfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5yZWFkRnJvbURvY3VtZW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIHRoaXMucmVhZEZyb21Ob2RlKGUpO3JldHVybiBudWxsfSxlLnByb3RvdHlwZS5yZWFkRnJvbU5vZGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPXQuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIikudHJpbSgpO3ZhciBlPWd1KHt2ZXJzaW9uOnRoaXMudmVyc2lvbn0sQnYsdCxbXSk7cmV0dXJuIGV8fG51bGx9LGV9KFV2KSx6dj1mdShZdix7TmFtZTpodShOZCksVGl0bGU6aHUoTmQpLEFic3RyYWN0Omh1KE5kKSxLZXl3b3JkTGlzdDpodShsbSksT25saW5lUmVzb3VyY2U6aHUoa3YpLENvbnRhY3RJbmZvcm1hdGlvbjpodShmdW5jdGlvbih0LGUpe3JldHVybiBndSh7fSxXdix0LGUpfSksRmVlczpodShOZCksQWNjZXNzQ29uc3RyYWludHM6aHUoTmQpLExheWVyTGltaXQ6aHUoRmQpLE1heFdpZHRoOmh1KEZkKSxNYXhIZWlnaHQ6aHUoRmQpfSksV3Y9ZnUoWXYse0NvbnRhY3RQZXJzb25QcmltYXJ5Omh1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LEt2LHQsZSl9KSxDb250YWN0UG9zaXRpb246aHUoTmQpLENvbnRhY3RBZGRyZXNzOmh1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LEh2LHQsZSl9KSxDb250YWN0Vm9pY2VUZWxlcGhvbmU6aHUoTmQpLENvbnRhY3RGYWNzaW1pbGVUZWxlcGhvbmU6aHUoTmQpLENvbnRhY3RFbGVjdHJvbmljTWFpbEFkZHJlc3M6aHUoTmQpfSksS3Y9ZnUoWXYse0NvbnRhY3RQZXJzb246aHUoTmQpLENvbnRhY3RPcmdhbml6YXRpb246aHUoTmQpfSksSHY9ZnUoWXYse0FkZHJlc3NUeXBlOmh1KE5kKSxBZGRyZXNzOmh1KE5kKSxDaXR5Omh1KE5kKSxTdGF0ZU9yUHJvdmluY2U6aHUoTmQpLFBvc3RDb2RlOmh1KE5kKSxDb3VudHJ5Omh1KE5kKX0pLFp2PWZ1KFl2LHtGb3JtYXQ6b3UoTmQpfSkscXY9ZnUoWXYse05hbWU6aHUoTmQpLFRpdGxlOmh1KE5kKSxBYnN0cmFjdDpodShOZCksS2V5d29yZExpc3Q6aHUobG0pLENSUzphdShOZCksRVhfR2VvZ3JhcGhpY0JvdW5kaW5nQm94Omh1KGZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3Uoe30sUXYsdCxlKTtpZighaSlyZXR1cm47dmFyIHI9aS53ZXN0Qm91bmRMb25naXR1ZGUsbj1pLnNvdXRoQm91bmRMYXRpdHVkZSxvPWkuZWFzdEJvdW5kTG9uZ2l0dWRlLHM9aS5ub3J0aEJvdW5kTGF0aXR1ZGU7aWYodm9pZCAwPT09cnx8dm9pZCAwPT09bnx8dm9pZCAwPT09b3x8dm9pZCAwPT09cylyZXR1cm47cmV0dXJuW3IsbixvLHNdfSksQm91bmRpbmdCb3g6YXUoZnVuY3Rpb24odCxlKXt2YXIgaT1bTWQodC5nZXRBdHRyaWJ1dGUoIm1pbngiKSksTWQodC5nZXRBdHRyaWJ1dGUoIm1pbnkiKSksTWQodC5nZXRBdHRyaWJ1dGUoIm1heHgiKSksTWQodC5nZXRBdHRyaWJ1dGUoIm1heHkiKSldLHI9W01kKHQuZ2V0QXR0cmlidXRlKCJyZXN4IikpLE1kKHQuZ2V0QXR0cmlidXRlKCJyZXN5IikpXTtyZXR1cm57Y3JzOnQuZ2V0QXR0cmlidXRlKCJDUlMiKSxleHRlbnQ6aSxyZXM6cn19KSxEaW1lbnNpb246YXUoZnVuY3Rpb24odCxlKXtyZXR1cm57bmFtZTp0LmdldEF0dHJpYnV0ZSgibmFtZSIpLHVuaXRzOnQuZ2V0QXR0cmlidXRlKCJ1bml0cyIpLHVuaXRTeW1ib2w6dC5nZXRBdHRyaWJ1dGUoInVuaXRTeW1ib2wiKSxkZWZhdWx0OnQuZ2V0QXR0cmlidXRlKCJkZWZhdWx0IiksbXVsdGlwbGVWYWx1ZXM6T2QodC5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlVmFsdWVzIikpLG5lYXJlc3RWYWx1ZTpPZCh0LmdldEF0dHJpYnV0ZSgibmVhcmVzdFZhbHVlIikpLGN1cnJlbnQ6T2QodC5nZXRBdHRyaWJ1dGUoImN1cnJlbnQiKSksdmFsdWVzOk5kKHQpfX0pLEF0dHJpYnV0aW9uOmh1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LEp2LHQsZSl9KSxBdXRob3JpdHlVUkw6YXUoZnVuY3Rpb24odCxlKXt2YXIgaT1zbSh0LGUpO2lmKGkpcmV0dXJuIGkubmFtZT10LmdldEF0dHJpYnV0ZSgibmFtZSIpLGk7cmV0dXJufSksSWRlbnRpZmllcjphdShOZCksTWV0YWRhdGFVUkw6YXUoZnVuY3Rpb24odCxlKXt2YXIgaT1zbSh0LGUpO2lmKGkpcmV0dXJuIGkudHlwZT10LmdldEF0dHJpYnV0ZSgidHlwZSIpLGk7cmV0dXJufSksRGF0YVVSTDphdShzbSksRmVhdHVyZUxpc3RVUkw6YXUoc20pLFN0eWxlOmF1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LHJtLHQsZSl9KSxNaW5TY2FsZURlbm9taW5hdG9yOmh1KGJkKSxNYXhTY2FsZURlbm9taW5hdG9yOmh1KGJkKSxMYXllcjphdShmdW5jdGlvbih0LGUpe3ZhciBpPWVbZS5sZW5ndGgtMV0scj1ndSh7fSxxdix0LGUpO2lmKCFyKXJldHVybjt2YXIgbj1PZCh0LmdldEF0dHJpYnV0ZSgicXVlcnlhYmxlIikpO3ZvaWQgMD09PW4mJihuPWkucXVlcnlhYmxlKTtyLnF1ZXJ5YWJsZT12b2lkIDAhPT1uJiZuO3ZhciBvPUFkKHQuZ2V0QXR0cmlidXRlKCJjYXNjYWRlZCIpKTt2b2lkIDA9PT1vJiYobz1pLmNhc2NhZGVkKTtyLmNhc2NhZGVkPW87dmFyIHM9T2QodC5nZXRBdHRyaWJ1dGUoIm9wYXF1ZSIpKTt2b2lkIDA9PT1zJiYocz1pLm9wYXF1ZSk7ci5vcGFxdWU9dm9pZCAwIT09cyYmczt2YXIgYT1PZCh0LmdldEF0dHJpYnV0ZSgibm9TdWJzZXRzIikpO3ZvaWQgMD09PWEmJihhPWkubm9TdWJzZXRzKTtyLm5vU3Vic2V0cz12b2lkIDAhPT1hJiZhO3ZhciBoPU1kKHQuZ2V0QXR0cmlidXRlKCJmaXhlZFdpZHRoIikpO2h8fChoPWkuZml4ZWRXaWR0aCk7ci5maXhlZFdpZHRoPWg7dmFyIGw9TWQodC5nZXRBdHRyaWJ1dGUoImZpeGVkSGVpZ2h0IikpO2x8fChsPWkuZml4ZWRIZWlnaHQpO3IuZml4ZWRIZWlnaHQ9bCxbIlN0eWxlIiwiQ1JTIiwiQXV0aG9yaXR5VVJMIl0uZm9yRWFjaChmdW5jdGlvbih0KXtpZih0IGluIGkpe3ZhciBlPXJbdF18fFtdO3JbdF09ZS5jb25jYXQoaVt0XSl9fSk7cmV0dXJuWyJFWF9HZW9ncmFwaGljQm91bmRpbmdCb3giLCJCb3VuZGluZ0JveCIsIkRpbWVuc2lvbiIsIkF0dHJpYnV0aW9uIiwiTWluU2NhbGVEZW5vbWluYXRvciIsIk1heFNjYWxlRGVub21pbmF0b3IiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCEodCBpbiByKSl7dmFyIGU9aVt0XTtyW3RdPWV9fSkscn0pfSksSnY9ZnUoWXYse1RpdGxlOmh1KE5kKSxPbmxpbmVSZXNvdXJjZTpodShrdiksTG9nb1VSTDpodShobSl9KSxRdj1mdShZdix7d2VzdEJvdW5kTG9uZ2l0dWRlOmh1KGJkKSxlYXN0Qm91bmRMb25naXR1ZGU6aHUoYmQpLHNvdXRoQm91bmRMYXRpdHVkZTpodShiZCksbm9ydGhCb3VuZExhdGl0dWRlOmh1KGJkKX0pLCR2PWZ1KFl2LHtHZXRDYXBhYmlsaXRpZXM6aHUoYW0pLEdldE1hcDpodShhbSksR2V0RmVhdHVyZUluZm86aHUoYW0pfSksdG09ZnUoWXYse0Zvcm1hdDphdShOZCksRENQVHlwZTphdShmdW5jdGlvbih0LGUpe3JldHVybiBndSh7fSxlbSx0LGUpfSl9KSxlbT1mdShZdix7SFRUUDpodShmdW5jdGlvbih0LGUpe3JldHVybiBndSh7fSxpbSx0LGUpfSl9KSxpbT1mdShZdix7R2V0Omh1KHNtKSxQb3N0Omh1KHNtKX0pLHJtPWZ1KFl2LHtOYW1lOmh1KE5kKSxUaXRsZTpodShOZCksQWJzdHJhY3Q6aHUoTmQpLExlZ2VuZFVSTDphdShobSksU3R5bGVTaGVldFVSTDpodShzbSksU3R5bGVVUkw6aHUoc20pfSksbm09ZnUoWXYse0Zvcm1hdDpodShOZCksT25saW5lUmVzb3VyY2U6aHUoa3YpfSksb209ZnUoWXYse0tleXdvcmQ6b3UoTmQpfSk7ZnVuY3Rpb24gc20odCxlKXtyZXR1cm4gZ3Uoe30sbm0sdCxlKX1mdW5jdGlvbiBhbSh0LGUpe3JldHVybiBndSh7fSx0bSx0LGUpfWZ1bmN0aW9uIGhtKHQsZSl7dmFyIGk9c20odCxlKTtpZihpKXt2YXIgcj1bQWQodC5nZXRBdHRyaWJ1dGUoIndpZHRoIikpLEFkKHQuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSldO3JldHVybiBpLnNpemU9cixpfX1mdW5jdGlvbiBsbSh0LGUpe3JldHVybiBndShbXSxvbSx0LGUpfXZhciB1bT1YdixwbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKTt2YXIgaT1lfHx7fTt0aGlzLmZlYXR1cmVOU189Imh0dHA6Ly9tYXBzZXJ2ZXIuZ2lzLnVtbi5lZHUvbWFwc2VydmVyIix0aGlzLmdtbEZvcm1hdF89bmV3IFpkLHRoaXMubGF5ZXJzXz1pLmxheWVycz9pLmxheWVyczpudWxsfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRMYXllcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllcnNffSxlLnByb3RvdHlwZS5zZXRMYXllcnM9ZnVuY3Rpb24odCl7dGhpcy5sYXllcnNfPXR9LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlc189ZnVuY3Rpb24odCxlKXt0LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlVVJJIix0aGlzLmZlYXR1cmVOU18pO3ZhciBpPXQubG9jYWxOYW1lLHI9W107aWYoMD09PXQuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuIHI7aWYoIm1zR01MT3V0cHV0Ij09aSlmb3IodmFyIG49MCxvPXQuY2hpbGROb2Rlcy5sZW5ndGg7bjxvO24rKyl7dmFyIHM9dC5jaGlsZE5vZGVzW25dO2lmKHMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGE9cyxoPWVbMF0sbD1hLmxvY2FsTmFtZS5yZXBsYWNlKCJfbGF5ZXIiLCIiKTtpZighdGhpcy5sYXllcnNffHxYKHRoaXMubGF5ZXJzXyxsKSl7dmFyIHU9bCsiX2ZlYXR1cmUiO2guZmVhdHVyZVR5cGU9dSxoLmZlYXR1cmVOUz10aGlzLmZlYXR1cmVOU187dmFyIHA9e307cFt1XT1vdSh0aGlzLmdtbEZvcm1hdF8ucmVhZEZlYXR1cmVFbGVtZW50LHRoaXMuZ21sRm9ybWF0Xyk7dmFyIGM9ZnUoW2guZmVhdHVyZU5TLG51bGxdLHApO2Euc2V0QXR0cmlidXRlKCJuYW1lc3BhY2VVUkkiLHRoaXMuZmVhdHVyZU5TXyk7dmFyIGQ9Z3UoW10sYyxhLGUsdGhpcy5nbWxGb3JtYXRfKTtkJiZLKHIsZCl9fX1pZigiRmVhdHVyZUNvbGxlY3Rpb24iPT1pKXt2YXIgZj1ndShbXSx0aGlzLmdtbEZvcm1hdF8uRkVBVFVSRV9DT0xMRUNUSU9OX1BBUlNFUlMsdCxbe31dLHRoaXMuZ21sRm9ybWF0Xyk7ZiYmKHI9Zil9cmV0dXJuIHJ9LGUucHJvdG90eXBlLnJlYWRGZWF0dXJlc0Zyb21Ob2RlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9e307cmV0dXJuIGUmJnUoaSx0aGlzLmdldFJlYWRPcHRpb25zKHQsZSkpLHRoaXMucmVhZEZlYXR1cmVzXyh0LFtpXSl9LGV9KFRkKSxjbT1bbnVsbCwiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9vd3MvMS4xIl0sZG09ZnUoY20se1NlcnZpY2VJZGVudGlmaWNhdGlvbjpodShmdW5jdGlvbih0LGUpe3JldHVybiBndSh7fSx3bSx0LGUpfSksU2VydmljZVByb3ZpZGVyOmh1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LEltLHQsZSl9KSxPcGVyYXRpb25zTWV0YWRhdGE6aHUoZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3Uoe30sU20sdCxlKX0pfSksZm09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUucmVhZEZyb21Eb2N1bWVudD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWlmKGUubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiB0aGlzLnJlYWRGcm9tTm9kZShlKTtyZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUucmVhZEZyb21Ob2RlPWZ1bmN0aW9uKHQpe3ZhciBlPWd1KHt9LGRtLHQsW10pO3JldHVybiBlfHxudWxsfSxlfShVdiksX209ZnUoY20se0RlbGl2ZXJ5UG9pbnQ6aHUoTmQpLENpdHk6aHUoTmQpLEFkbWluaXN0cmF0aXZlQXJlYTpodShOZCksUG9zdGFsQ29kZTpodShOZCksQ291bnRyeTpodShOZCksRWxlY3Ryb25pY01haWxBZGRyZXNzOmh1KE5kKX0pLGdtPWZ1KGNtLHtWYWx1ZTphdShmdW5jdGlvbih0LGUpe3JldHVybiBOZCh0KX0pfSkseW09ZnUoY20se0FsbG93ZWRWYWx1ZXM6aHUoZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3Uoe30sZ20sdCxlKX0pfSksdm09ZnUoY20se1Bob25lOmh1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LFRtLHQsZSl9KSxBZGRyZXNzOmh1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LF9tLHQsZSl9KX0pLG1tPWZ1KGNtLHtIVFRQOmh1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LHhtLHQsZSl9KX0pLHhtPWZ1KGNtLHtHZXQ6YXUoZnVuY3Rpb24odCxlKXt2YXIgaT1rdih0KTtpZighaSlyZXR1cm47cmV0dXJuIGd1KHtocmVmOml9LENtLHQsZSl9KSxQb3N0OnZvaWQgMH0pLEVtPWZ1KGNtLHtEQ1A6aHUoZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3Uoe30sbW0sdCxlKX0pfSksU209ZnUoY20se09wZXJhdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJuYW1lIikscj1ndSh7fSxFbSx0LGUpO2lmKCFyKXJldHVybjtlW2UubGVuZ3RoLTFdW2ldPXJ9fSksVG09ZnUoY20se1ZvaWNlOmh1KE5kKSxGYWNzaW1pbGU6aHUoTmQpfSksQ209ZnUoY20se0NvbnN0cmFpbnQ6YXUoZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldEF0dHJpYnV0ZSgibmFtZSIpO2lmKCFpKXJldHVybjtyZXR1cm4gZ3Uoe25hbWU6aX0seW0sdCxlKX0pfSksUm09ZnUoY20se0luZGl2aWR1YWxOYW1lOmh1KE5kKSxQb3NpdGlvbk5hbWU6aHUoTmQpLENvbnRhY3RJbmZvOmh1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LHZtLHQsZSl9KX0pLHdtPWZ1KGNtLHtBYnN0cmFjdDpodShOZCksQWNjZXNzQ29uc3RyYWludHM6aHUoTmQpLEZlZXM6aHUoTmQpLFRpdGxlOmh1KE5kKSxTZXJ2aWNlVHlwZVZlcnNpb246aHUoTmQpLFNlcnZpY2VUeXBlOmh1KE5kKX0pLEltPWZ1KGNtLHtQcm92aWRlck5hbWU6aHUoTmQpLFByb3ZpZGVyU2l0ZTpodShrdiksU2VydmljZUNvbnRhY3Q6aHUoZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3Uoe30sUm0sdCxlKX0pfSk7dmFyIExtPWZtLE9tPVtudWxsLCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dtdHMvMS4wIl0sUG09W251bGwsImh0dHA6Ly93d3cub3Blbmdpcy5uZXQvb3dzLzEuMSJdLGJtPWZ1KE9tLHtDb250ZW50czpodShmdW5jdGlvbih0LGUpe3JldHVybiBndSh7fSxGbSx0LGUpfSl9KSxNbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMub3dzUGFyc2VyXz1uZXcgTG19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnJlYWRGcm9tRG9jdW1lbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVUeXBlPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gdGhpcy5yZWFkRnJvbU5vZGUoZSk7cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLnJlYWRGcm9tTm9kZT1mdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpLnRyaW0oKSxpPXRoaXMub3dzUGFyc2VyXy5yZWFkRnJvbU5vZGUodCk7cmV0dXJuIGk/KGkudmVyc2lvbj1lLChpPWd1KGksYm0sdCxbXSkpfHxudWxsKTpudWxsfSxlfShVdiksRm09ZnUoT20se0xheWVyOmF1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LEFtLHQsZSl9KSxUaWxlTWF0cml4U2V0OmF1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LFltLHQsZSl9KX0pLEFtPWZ1KE9tLHtTdHlsZTphdShmdW5jdGlvbih0LGUpe3ZhciBpPWd1KHt9LE5tLHQsZSk7aWYoIWkpcmV0dXJuO3ZhciByPSJ0cnVlIj09PXQuZ2V0QXR0cmlidXRlKCJpc0RlZmF1bHQiKTtyZXR1cm4gaS5pc0RlZmF1bHQ9cixpfSksRm9ybWF0OmF1KE5kKSxUaWxlTWF0cml4U2V0TGluazphdShmdW5jdGlvbih0LGUpe3JldHVybiBndSh7fSxHbSx0LGUpfSksRGltZW5zaW9uOmF1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGd1KHt9LGptLHQsZSl9KSxSZXNvdXJjZVVSTDphdShmdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJmb3JtYXQiKSxyPXQuZ2V0QXR0cmlidXRlKCJ0ZW1wbGF0ZSIpLG49dC5nZXRBdHRyaWJ1dGUoInJlc291cmNlVHlwZSIpLG89e307aSYmKG8uZm9ybWF0PWkpO3ImJihvLnRlbXBsYXRlPXIpO24mJihvLnJlc291cmNlVHlwZT1uKTtyZXR1cm4gb30pfSxmdShQbSx7VGl0bGU6aHUoTmQpLEFic3RyYWN0Omh1KE5kKSxXR1M4NEJvdW5kaW5nQm94Omh1KGZ1bmN0aW9uKHQsZSl7dmFyIGk9Z3UoW10sVW0sdCxlKTtpZigyIT1pLmxlbmd0aClyZXR1cm47cmV0dXJuIHR0KGkpfSksSWRlbnRpZmllcjpodShOZCl9KSksTm09ZnUoT20se0xlZ2VuZFVSTDphdShmdW5jdGlvbih0LGUpe3ZhciBpPXt9O3JldHVybiBpLmZvcm1hdD10LmdldEF0dHJpYnV0ZSgiZm9ybWF0IiksaS5ocmVmPWt2KHQpLGl9KX0sZnUoUG0se1RpdGxlOmh1KE5kKSxJZGVudGlmaWVyOmh1KE5kKX0pKSxHbT1mdShPbSx7VGlsZU1hdHJpeFNldDpodShOZCksVGlsZU1hdHJpeFNldExpbWl0czpodShmdW5jdGlvbih0LGUpe3JldHVybiBndShbXSxEbSx0LGUpfSl9KSxEbT1mdShPbSx7VGlsZU1hdHJpeExpbWl0czpvdShmdW5jdGlvbih0LGUpe3JldHVybiBndSh7fSxrbSx0LGUpfSl9KSxrbT1mdShPbSx7VGlsZU1hdHJpeDpodShOZCksTWluVGlsZVJvdzpodShGZCksTWF4VGlsZVJvdzpodShGZCksTWluVGlsZUNvbDpodShGZCksTWF4VGlsZUNvbDpodShGZCl9KSxqbT1mdShPbSx7RGVmYXVsdDpodShOZCksVmFsdWU6YXUoTmQpfSxmdShQbSx7SWRlbnRpZmllcjpodShOZCl9KSksVW09ZnUoUG0se0xvd2VyQ29ybmVyOm91KFZtKSxVcHBlckNvcm5lcjpvdShWbSl9KSxZbT1mdShPbSx7V2VsbEtub3duU2NhbGVTZXQ6aHUoTmQpLFRpbGVNYXRyaXg6YXUoZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3Uoe30sQm0sdCxlKX0pfSxmdShQbSx7U3VwcG9ydGVkQ1JTOmh1KE5kKSxJZGVudGlmaWVyOmh1KE5kKX0pKSxCbT1mdShPbSx7VG9wTGVmdENvcm5lcjpodShWbSksU2NhbGVEZW5vbWluYXRvcjpodShiZCksVGlsZVdpZHRoOmh1KEZkKSxUaWxlSGVpZ2h0Omh1KEZkKSxNYXRyaXhXaWR0aDpodShGZCksTWF0cml4SGVpZ2h0Omh1KEZkKX0sZnUoUG0se0lkZW50aWZpZXI6aHUoTmQpfSkpO2Z1bmN0aW9uIFZtKHQsZSl7dmFyIGk9TmQodCkuc3BsaXQoL1xzKy8pO2lmKGkmJjI9PWkubGVuZ3RoKXt2YXIgcj0raVswXSxuPStpWzFdO2lmKCFpc05hTihyKSYmIWlzTmFOKG4pKXJldHVybltyLG5dfX12YXIgWG09TW0sem09ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gZnVuY3Rpb24oKXtpZighdCl7dmFyIGU9ZG9jdW1lbnQuYm9keTtlLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuP3Q9IndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiOmUubW96UmVxdWVzdEZ1bGxTY3JlZW4/dD0ibW96ZnVsbHNjcmVlbmNoYW5nZSI6ZS5tc1JlcXVlc3RGdWxsc2NyZWVuP3Q9Ik1TRnVsbHNjcmVlbkNoYW5nZSI6ZS5yZXF1ZXN0RnVsbHNjcmVlbiYmKHQ9ImZ1bGxzY3JlZW5jaGFuZ2UiKX1yZXR1cm4gdH19KCk7ZnVuY3Rpb24gV20oKXt2YXIgdD1kb2N1bWVudC5ib2R5O3JldHVybiEhKHQud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW58fHQubW96UmVxdWVzdEZ1bGxTY3JlZW4mJmRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbmFibGVkfHx0Lm1zUmVxdWVzdEZ1bGxzY3JlZW4mJmRvY3VtZW50Lm1zRnVsbHNjcmVlbkVuYWJsZWR8fHQucmVxdWVzdEZ1bGxzY3JlZW4mJmRvY3VtZW50LmZ1bGxzY3JlZW5FbmFibGVkKX1mdW5jdGlvbiBLbSgpe3JldHVybiEhKGRvY3VtZW50LndlYmtpdElzRnVsbFNjcmVlbnx8ZG9jdW1lbnQubW96RnVsbFNjcmVlbnx8ZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudHx8ZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpfWZ1bmN0aW9uIEhtKHQpe3QucmVxdWVzdEZ1bGxzY3JlZW4/dC5yZXF1ZXN0RnVsbHNjcmVlbigpOnQubXNSZXF1ZXN0RnVsbHNjcmVlbj90Lm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTp0Lm1velJlcXVlc3RGdWxsU2NyZWVuP3QubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTp0LndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuJiZ0LndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCl9dmFyIFptPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e307dC5jYWxsKHRoaXMse2VsZW1lbnQ6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGFyZ2V0OmkudGFyZ2V0fSksdGhpcy5jc3NDbGFzc05hbWVfPXZvaWQgMCE9PWkuY2xhc3NOYW1lP2kuY2xhc3NOYW1lOiJvbC1mdWxsLXNjcmVlbiI7dmFyIHI9dm9pZCAwIT09aS5sYWJlbD9pLmxhYmVsOiLipKIiO3RoaXMubGFiZWxOb2RlXz0ic3RyaW5nIj09dHlwZW9mIHI/ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocik6cjt2YXIgbj12b2lkIDAhPT1pLmxhYmVsQWN0aXZlP2kubGFiZWxBY3RpdmU6IsOXIjt0aGlzLmxhYmVsQWN0aXZlTm9kZV89InN0cmluZyI9PXR5cGVvZiBuP2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pOm4sdGhpcy5idXR0b25fPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO3ZhciBvPWkudGlwTGFiZWw/aS50aXBMYWJlbDoiVG9nZ2xlIGZ1bGwtc2NyZWVuIjt0aGlzLnNldENsYXNzTmFtZV8odGhpcy5idXR0b25fLEttKCkpLHRoaXMuYnV0dG9uXy5zZXRBdHRyaWJ1dGUoInR5cGUiLCJidXR0b24iKSx0aGlzLmJ1dHRvbl8udGl0bGU9byx0aGlzLmJ1dHRvbl8uYXBwZW5kQ2hpbGQodGhpcy5sYWJlbE5vZGVfKSx2KHRoaXMuYnV0dG9uXyxNLkNMSUNLLHRoaXMuaGFuZGxlQ2xpY2tfLHRoaXMpO3ZhciBzPXRoaXMuY3NzQ2xhc3NOYW1lXysiICIrZm8rIiAiK2dvKyIgIisoV20oKT8iIjpfbyksYT10aGlzLmVsZW1lbnQ7YS5jbGFzc05hbWU9cyxhLmFwcGVuZENoaWxkKHRoaXMuYnV0dG9uXyksdGhpcy5rZXlzXz12b2lkIDAhPT1pLmtleXMmJmkua2V5cyx0aGlzLnNvdXJjZV89aS5zb3VyY2V9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmhhbmRsZUNsaWNrXz1mdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksdGhpcy5oYW5kbGVGdWxsU2NyZWVuXygpfSxlLnByb3RvdHlwZS5oYW5kbGVGdWxsU2NyZWVuXz1mdW5jdGlvbigpe2lmKFdtKCkpe3ZhciB0LGU9dGhpcy5nZXRNYXAoKTtpZihlKWlmKEttKCkpZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4/ZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTpkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuP2RvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTpkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuP2RvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTpkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbiYmZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHQ9dGhpcy5zb3VyY2VfPyJzdHJpbmciPT10eXBlb2YgdGhpcy5zb3VyY2VfP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc291cmNlXyk6dGhpcy5zb3VyY2VfOmUuZ2V0VGFyZ2V0RWxlbWVudCgpLHRoaXMua2V5c18/ZnVuY3Rpb24odCl7dC5tb3pSZXF1ZXN0RnVsbFNjcmVlbldpdGhLZXlzP3QubW96UmVxdWVzdEZ1bGxTY3JlZW5XaXRoS2V5cygpOnQud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4/dC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbigpOkhtKHQpfSh0KTpIbSh0KX19LGUucHJvdG90eXBlLmhhbmRsZUZ1bGxTY3JlZW5DaGFuZ2VfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRNYXAoKTtLbSgpPyh0aGlzLnNldENsYXNzTmFtZV8odGhpcy5idXR0b25fLCEwKSxRbih0aGlzLmxhYmVsQWN0aXZlTm9kZV8sdGhpcy5sYWJlbE5vZGVfKSk6KHRoaXMuc2V0Q2xhc3NOYW1lXyh0aGlzLmJ1dHRvbl8sITEpLFFuKHRoaXMubGFiZWxOb2RlXyx0aGlzLmxhYmVsQWN0aXZlTm9kZV8pKSx0JiZ0LnVwZGF0ZVNpemUoKX0sZS5wcm90b3R5cGUuc2V0Q2xhc3NOYW1lXz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuY3NzQ2xhc3NOYW1lXysiLXRydWUiLHI9dGhpcy5jc3NDbGFzc05hbWVfKyItZmFsc2UiLG49ZT9pOnI7dC5jbGFzc0xpc3QucmVtb3ZlKGkpLHQuY2xhc3NMaXN0LnJlbW92ZShyKSx0LmNsYXNzTGlzdC5hZGQobil9LGUucHJvdG90eXBlLnNldE1hcD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5zZXRNYXAuY2FsbCh0aGlzLGUpLGUmJnRoaXMubGlzdGVuZXJLZXlzLnB1c2godihkb2N1bWVudCx6bSgpLHRoaXMuaGFuZGxlRnVsbFNjcmVlbkNoYW5nZV8sdGhpcykpfSxlfSh1bykscW09InByb2plY3Rpb24iO2Z1bmN0aW9uIEptKHQpe3ZhciBlPXQuZnJhbWVTdGF0ZTtlP3RoaXMubWFwUHJvamVjdGlvbl8hPWUudmlld1N0YXRlLnByb2plY3Rpb24mJih0aGlzLm1hcFByb2plY3Rpb25fPWUudmlld1N0YXRlLnByb2plY3Rpb24sdGhpcy50cmFuc2Zvcm1fPW51bGwpOnRoaXMubWFwUHJvamVjdGlvbl89bnVsbH12YXIgUW09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3IuY2xhc3NOYW1lPXZvaWQgMCE9PWkuY2xhc3NOYW1lP2kuY2xhc3NOYW1lOiJvbC1tb3VzZS1wb3NpdGlvbiIsdC5jYWxsKHRoaXMse2VsZW1lbnQ6cixyZW5kZXI6aS5yZW5kZXJ8fEptLHRhcmdldDppLnRhcmdldH0pLHYodGhpcyxHKHFtKSx0aGlzLmhhbmRsZVByb2plY3Rpb25DaGFuZ2VkXyx0aGlzKSxpLmNvb3JkaW5hdGVGb3JtYXQmJnRoaXMuc2V0Q29vcmRpbmF0ZUZvcm1hdChpLmNvb3JkaW5hdGVGb3JtYXQpLGkucHJvamVjdGlvbiYmdGhpcy5zZXRQcm9qZWN0aW9uKGkucHJvamVjdGlvbiksdGhpcy51bmRlZmluZWRIVE1MXz12b2lkIDAhPT1pLnVuZGVmaW5lZEhUTUw/aS51bmRlZmluZWRIVE1MOiImIzE2MDsiLHRoaXMucmVuZGVyT25Nb3VzZU91dF89ISF0aGlzLnVuZGVmaW5lZEhUTUxfLHRoaXMucmVuZGVyZWRIVE1MXz1yLmlubmVySFRNTCx0aGlzLm1hcFByb2plY3Rpb25fPW51bGwsdGhpcy50cmFuc2Zvcm1fPW51bGwsdGhpcy5sYXN0TW91c2VNb3ZlUGl4ZWxfPW51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmhhbmRsZVByb2plY3Rpb25DaGFuZ2VkXz1mdW5jdGlvbigpe3RoaXMudHJhbnNmb3JtXz1udWxsfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJjb29yZGluYXRlRm9ybWF0Iil9LGUucHJvdG90eXBlLmdldFByb2plY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQocW0pfSxlLnByb3RvdHlwZS5oYW5kbGVNb3VzZU1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRNYXAoKTt0aGlzLmxhc3RNb3VzZU1vdmVQaXhlbF89ZS5nZXRFdmVudFBpeGVsKHQpLHRoaXMudXBkYXRlSFRNTF8odGhpcy5sYXN0TW91c2VNb3ZlUGl4ZWxfKX0sZS5wcm90b3R5cGUuaGFuZGxlTW91c2VPdXQ9ZnVuY3Rpb24odCl7dGhpcy51cGRhdGVIVE1MXyhudWxsKSx0aGlzLmxhc3RNb3VzZU1vdmVQaXhlbF89bnVsbH0sZS5wcm90b3R5cGUuc2V0TWFwPWZ1bmN0aW9uKGUpe2lmKHQucHJvdG90eXBlLnNldE1hcC5jYWxsKHRoaXMsZSksZSl7dmFyIGk9ZS5nZXRWaWV3cG9ydCgpO3RoaXMubGlzdGVuZXJLZXlzLnB1c2godihpLE0uTU9VU0VNT1ZFLHRoaXMuaGFuZGxlTW91c2VNb3ZlLHRoaXMpLHYoaSxNLlRPVUNIU1RBUlQsdGhpcy5oYW5kbGVNb3VzZU1vdmUsdGhpcykpLHRoaXMucmVuZGVyT25Nb3VzZU91dF8mJnRoaXMubGlzdGVuZXJLZXlzLnB1c2godihpLE0uTU9VU0VPVVQsdGhpcy5oYW5kbGVNb3VzZU91dCx0aGlzKSx2KGksTS5UT1VDSEVORCx0aGlzLmhhbmRsZU1vdXNlT3V0LHRoaXMpKX19LGUucHJvdG90eXBlLnNldENvb3JkaW5hdGVGb3JtYXQ9ZnVuY3Rpb24odCl7dGhpcy5zZXQoImNvb3JkaW5hdGVGb3JtYXQiLHQpfSxlLnByb3RvdHlwZS5zZXRQcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuc2V0KHFtLEVlKHQpKX0sZS5wcm90b3R5cGUudXBkYXRlSFRNTF89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy51bmRlZmluZWRIVE1MXztpZih0JiZ0aGlzLm1hcFByb2plY3Rpb25fKXtpZighdGhpcy50cmFuc2Zvcm1fKXt2YXIgaT10aGlzLmdldFByb2plY3Rpb24oKTt0aGlzLnRyYW5zZm9ybV89aT9MZSh0aGlzLm1hcFByb2plY3Rpb25fLGkpOm1lfXZhciByPXRoaXMuZ2V0TWFwKCkuZ2V0Q29vcmRpbmF0ZUZyb21QaXhlbCh0KTtpZihyKXt0aGlzLnRyYW5zZm9ybV8ocixyKTt2YXIgbj10aGlzLmdldENvb3JkaW5hdGVGb3JtYXQoKTtlPW4/bihyKTpyLnRvU3RyaW5nKCl9fXRoaXMucmVuZGVyZWRIVE1MXyYmZT09PXRoaXMucmVuZGVyZWRIVE1MX3x8KHRoaXMuZWxlbWVudC5pbm5lckhUTUw9ZSx0aGlzLnJlbmRlcmVkSFRNTF89ZSl9LGV9KHVvKTtmdW5jdGlvbiAkbSh0KXt0aGlzLnZhbGlkYXRlRXh0ZW50XygpLHRoaXMudXBkYXRlQm94XygpfXZhciB0eD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPWV8fHt9O3QuY2FsbCh0aGlzLHtlbGVtZW50OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHJlbmRlcjppLnJlbmRlcnx8JG0sdGFyZ2V0OmkudGFyZ2V0fSksdGhpcy5jb2xsYXBzZWRfPXZvaWQgMD09PWkuY29sbGFwc2VkfHxpLmNvbGxhcHNlZCx0aGlzLmNvbGxhcHNpYmxlXz12b2lkIDA9PT1pLmNvbGxhcHNpYmxlfHxpLmNvbGxhcHNpYmxlLHRoaXMuY29sbGFwc2libGVffHwodGhpcy5jb2xsYXBzZWRfPSExKTt2YXIgcj12b2lkIDAhPT1pLmNsYXNzTmFtZT9pLmNsYXNzTmFtZToib2wtb3ZlcnZpZXdtYXAiLG49dm9pZCAwIT09aS50aXBMYWJlbD9pLnRpcExhYmVsOiJPdmVydmlldyBtYXAiLG89dm9pZCAwIT09aS5jb2xsYXBzZUxhYmVsP2kuY29sbGFwc2VMYWJlbDoiwqsiOyJzdHJpbmciPT10eXBlb2Ygbz8odGhpcy5jb2xsYXBzZUxhYmVsXz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIiksdGhpcy5jb2xsYXBzZUxhYmVsXy50ZXh0Q29udGVudD1vKTp0aGlzLmNvbGxhcHNlTGFiZWxfPW87dmFyIHM9dm9pZCAwIT09aS5sYWJlbD9pLmxhYmVsOiLCuyI7InN0cmluZyI9PXR5cGVvZiBzPyh0aGlzLmxhYmVsXz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIiksdGhpcy5sYWJlbF8udGV4dENvbnRlbnQ9cyk6dGhpcy5sYWJlbF89czt2YXIgYT10aGlzLmNvbGxhcHNpYmxlXyYmIXRoaXMuY29sbGFwc2VkXz90aGlzLmNvbGxhcHNlTGFiZWxfOnRoaXMubGFiZWxfLGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7aC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJidXR0b24iKSxoLnRpdGxlPW4saC5hcHBlbmRDaGlsZChhKSx2KGgsTS5DTElDSyx0aGlzLmhhbmRsZUNsaWNrXyx0aGlzKSx0aGlzLm92bWFwRGl2Xz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLm92bWFwRGl2Xy5jbGFzc05hbWU9Im9sLW92ZXJ2aWV3bWFwLW1hcCIsdGhpcy5vdm1hcF89bmV3IEhhKHtjb250cm9sczpuZXcgVSxpbnRlcmFjdGlvbnM6bmV3IFUsdmlldzppLnZpZXd9KTt2YXIgbD10aGlzLm92bWFwXztpLmxheWVycyYmaS5sYXllcnMuZm9yRWFjaChmdW5jdGlvbih0KXtsLmFkZExheWVyKHQpfS5iaW5kKHRoaXMpKTt2YXIgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt1LmNsYXNzTmFtZT0ib2wtb3ZlcnZpZXdtYXAtYm94Iix1LnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIsdGhpcy5ib3hPdmVybGF5Xz1uZXcgSmEoe3Bvc2l0aW9uOlswLDBdLHBvc2l0aW9uaW5nOlphLkJPVFRPTV9MRUZULGVsZW1lbnQ6dX0pLHRoaXMub3ZtYXBfLmFkZE92ZXJsYXkodGhpcy5ib3hPdmVybGF5Xyk7dmFyIHA9cisiICIrZm8rIiAiK2dvKyh0aGlzLmNvbGxhcHNlZF8mJnRoaXMuY29sbGFwc2libGVfPyIgIit5bzoiIikrKHRoaXMuY29sbGFwc2libGVfPyIiOiIgb2wtdW5jb2xsYXBzaWJsZSIpLGM9dGhpcy5lbGVtZW50O2MuY2xhc3NOYW1lPXAsYy5hcHBlbmRDaGlsZCh0aGlzLm92bWFwRGl2XyksYy5hcHBlbmRDaGlsZChoKTt2YXIgZD10aGlzLGY9dGhpcy5ib3hPdmVybGF5XyxfPXRoaXMuYm94T3ZlcmxheV8uZ2V0RWxlbWVudCgpLGc9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7cmV0dXJue2NsaWVudFg6dC5jbGllbnRYLV8ub2Zmc2V0V2lkdGgvMixjbGllbnRZOnQuY2xpZW50WStfLm9mZnNldEhlaWdodC8yfX0odCksaT1sLmdldEV2ZW50Q29vcmRpbmF0ZShlKTtmLnNldFBvc2l0aW9uKGkpfSx5PWZ1bmN0aW9uKHQpe3ZhciBlPWwuZ2V0RXZlbnRDb29yZGluYXRlKHQpO2QuZ2V0TWFwKCkuZ2V0VmlldygpLnNldENlbnRlcihlKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixnKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIseSl9O18uYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLGcpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix5KX0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5zZXRNYXA9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5nZXRNYXAoKTtpZihlIT09aSl7aWYoaSl7dmFyIHI9aS5nZXRWaWV3KCk7ciYmdGhpcy51bmJpbmRWaWV3XyhyKSx0aGlzLm92bWFwXy5zZXRUYXJnZXQobnVsbCl9aWYodC5wcm90b3R5cGUuc2V0TWFwLmNhbGwodGhpcyxlKSxlKXt0aGlzLm92bWFwXy5zZXRUYXJnZXQodGhpcy5vdm1hcERpdl8pLHRoaXMubGlzdGVuZXJLZXlzLnB1c2godihlLGwsdGhpcy5oYW5kbGVNYXBQcm9wZXJ0eUNoYW5nZV8sdGhpcykpLDA9PT10aGlzLm92bWFwXy5nZXRMYXllcnMoKS5nZXRMZW5ndGgoKSYmdGhpcy5vdm1hcF8uc2V0TGF5ZXJHcm91cChlLmdldExheWVyR3JvdXAoKSk7dmFyIG49ZS5nZXRWaWV3KCk7biYmKHRoaXMuYmluZFZpZXdfKG4pLG4uaXNEZWYoKSYmKHRoaXMub3ZtYXBfLnVwZGF0ZVNpemUoKSx0aGlzLnJlc2V0RXh0ZW50XygpKSl9fX0sZS5wcm90b3R5cGUuaGFuZGxlTWFwUHJvcGVydHlDaGFuZ2VfPWZ1bmN0aW9uKHQpe2lmKHQua2V5PT09TG4uVklFVyl7dmFyIGU9dC5vbGRWYWx1ZTtlJiZ0aGlzLnVuYmluZFZpZXdfKGUpO3ZhciBpPXRoaXMuZ2V0TWFwKCkuZ2V0VmlldygpO3RoaXMuYmluZFZpZXdfKGkpfX0sZS5wcm90b3R5cGUuYmluZFZpZXdfPWZ1bmN0aW9uKHQpe3YodCxHKEJuKSx0aGlzLmhhbmRsZVJvdGF0aW9uQ2hhbmdlZF8sdGhpcyl9LGUucHJvdG90eXBlLnVuYmluZFZpZXdfPWZ1bmN0aW9uKHQpe3godCxHKEJuKSx0aGlzLmhhbmRsZVJvdGF0aW9uQ2hhbmdlZF8sdGhpcyl9LGUucHJvdG90eXBlLmhhbmRsZVJvdGF0aW9uQ2hhbmdlZF89ZnVuY3Rpb24oKXt0aGlzLm92bWFwXy5nZXRWaWV3KCkuc2V0Um90YXRpb24odGhpcy5nZXRNYXAoKS5nZXRWaWV3KCkuZ2V0Um90YXRpb24oKSl9LGUucHJvdG90eXBlLnZhbGlkYXRlRXh0ZW50Xz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0TWFwKCksZT10aGlzLm92bWFwXztpZih0LmlzUmVuZGVyZWQoKSYmZS5pc1JlbmRlcmVkKCkpe3ZhciBpPXQuZ2V0U2l6ZSgpLHI9dC5nZXRWaWV3KCkuY2FsY3VsYXRlRXh0ZW50KGkpLG49ZS5nZXRTaXplKCksbz1lLmdldFZpZXcoKS5jYWxjdWxhdGVFeHRlbnQobikscz1lLmdldFBpeGVsRnJvbUNvb3JkaW5hdGUoSXQocikpLGE9ZS5nZXRQaXhlbEZyb21Db29yZGluYXRlKFN0KHIpKSxoPU1hdGguYWJzKHNbMF0tYVswXSksbD1NYXRoLmFicyhzWzFdLWFbMV0pLHU9blswXSxwPW5bMV07aDwuMSp1fHxsPC4xKnB8fGg+Ljc1KnV8fGw+Ljc1KnA/dGhpcy5yZXNldEV4dGVudF8oKTpvdChvLHIpfHx0aGlzLnJlY2VudGVyXygpfX0sZS5wcm90b3R5cGUucmVzZXRFeHRlbnRfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRNYXAoKSxlPXRoaXMub3ZtYXBfLGk9dC5nZXRTaXplKCkscj10LmdldFZpZXcoKS5jYWxjdWxhdGVFeHRlbnQoaSksbj1lLmdldFZpZXcoKSxvPU1hdGgubG9nKDcuNSkvTWF0aC5MTjI7TXQociwxLyguMSpNYXRoLnBvdygyLG8vMikpKSxuLmZpdChyKX0sZS5wcm90b3R5cGUucmVjZW50ZXJfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRNYXAoKSxlPXRoaXMub3ZtYXBfLGk9dC5nZXRWaWV3KCk7ZS5nZXRWaWV3KCkuc2V0Q2VudGVyKGkuZ2V0Q2VudGVyKCkpfSxlLnByb3RvdHlwZS51cGRhdGVCb3hfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRNYXAoKSxlPXRoaXMub3ZtYXBfO2lmKHQuaXNSZW5kZXJlZCgpJiZlLmlzUmVuZGVyZWQoKSl7dmFyIGk9dC5nZXRTaXplKCkscj10LmdldFZpZXcoKSxuPWUuZ2V0VmlldygpLG89ci5nZXRSb3RhdGlvbigpLHM9dGhpcy5ib3hPdmVybGF5XyxhPXRoaXMuYm94T3ZlcmxheV8uZ2V0RWxlbWVudCgpLGg9ci5jYWxjdWxhdGVFeHRlbnQoaSksbD1uLmdldFJlc29sdXRpb24oKSx1PUV0KGgpLHA9THQoaCksYz10aGlzLmNhbGN1bGF0ZUNvb3JkaW5hdGVSb3RhdGVfKG8sdSk7cy5zZXRQb3NpdGlvbihjKSxhJiYoYS5zdHlsZS53aWR0aD1NYXRoLmFicygodVswXS1wWzBdKS9sKSsicHgiLGEuc3R5bGUuaGVpZ2h0PU1hdGguYWJzKChwWzFdLXVbMV0pL2wpKyJweCIpfX0sZS5wcm90b3R5cGUuY2FsY3VsYXRlQ29vcmRpbmF0ZVJvdGF0ZV89ZnVuY3Rpb24odCxlKXt2YXIgaSxyPXRoaXMuZ2V0TWFwKCkuZ2V0VmlldygpLmdldENlbnRlcigpO3JldHVybiByJiYoJGkoaT1bZVswXS1yWzBdLGVbMV0tclsxXV0sdCksSGkoaSxyKSksaX0sZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2tfPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0aGlzLmhhbmRsZVRvZ2dsZV8oKX0sZS5wcm90b3R5cGUuaGFuZGxlVG9nZ2xlXz1mdW5jdGlvbigpe3RoaXMuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKHlvKSx0aGlzLmNvbGxhcHNlZF8/UW4odGhpcy5jb2xsYXBzZUxhYmVsXyx0aGlzLmxhYmVsXyk6UW4odGhpcy5sYWJlbF8sdGhpcy5jb2xsYXBzZUxhYmVsXyksdGhpcy5jb2xsYXBzZWRfPSF0aGlzLmNvbGxhcHNlZF87dmFyIHQ9dGhpcy5vdm1hcF87dGhpcy5jb2xsYXBzZWRffHx0LmlzUmVuZGVyZWQoKXx8KHQudXBkYXRlU2l6ZSgpLHRoaXMucmVzZXRFeHRlbnRfKCksbSh0LFJuLGZ1bmN0aW9uKHQpe3RoaXMudXBkYXRlQm94XygpfSx0aGlzKSl9LGUucHJvdG90eXBlLmdldENvbGxhcHNpYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sbGFwc2libGVffSxlLnByb3RvdHlwZS5zZXRDb2xsYXBzaWJsZT1mdW5jdGlvbih0KXt0aGlzLmNvbGxhcHNpYmxlXyE9PXQmJih0aGlzLmNvbGxhcHNpYmxlXz10LHRoaXMuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCJvbC11bmNvbGxhcHNpYmxlIiksIXQmJnRoaXMuY29sbGFwc2VkXyYmdGhpcy5oYW5kbGVUb2dnbGVfKCkpfSxlLnByb3RvdHlwZS5zZXRDb2xsYXBzZWQ9ZnVuY3Rpb24odCl7dGhpcy5jb2xsYXBzaWJsZV8mJnRoaXMuY29sbGFwc2VkXyE9PXQmJnRoaXMuaGFuZGxlVG9nZ2xlXygpfSxlLnByb3RvdHlwZS5nZXRDb2xsYXBzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xsYXBzZWRffSxlLnByb3RvdHlwZS5nZXRPdmVydmlld01hcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm92bWFwX30sZX0odW8pLGV4PSJ1bml0cyIsaXg9e0RFR1JFRVM6ImRlZ3JlZXMiLElNUEVSSUFMOiJpbXBlcmlhbCIsTkFVVElDQUw6Im5hdXRpY2FsIixNRVRSSUM6Im1ldHJpYyIsVVM6InVzIn0scng9WzEsMiw1XTtmdW5jdGlvbiBueCh0KXt2YXIgZT10LmZyYW1lU3RhdGU7dGhpcy52aWV3U3RhdGVfPWU/ZS52aWV3U3RhdGU6bnVsbCx0aGlzLnVwZGF0ZUVsZW1lbnRfKCl9dmFyIG94PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e30scj12b2lkIDAhPT1pLmNsYXNzTmFtZT9pLmNsYXNzTmFtZToib2wtc2NhbGUtbGluZSI7dC5jYWxsKHRoaXMse2VsZW1lbnQ6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscmVuZGVyOmkucmVuZGVyfHxueCx0YXJnZXQ6aS50YXJnZXR9KSx0aGlzLmlubmVyRWxlbWVudF89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5pbm5lckVsZW1lbnRfLmNsYXNzTmFtZT1yKyItaW5uZXIiLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9cisiICIrZm8sdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaW5uZXJFbGVtZW50XyksdGhpcy52aWV3U3RhdGVfPW51bGwsdGhpcy5taW5XaWR0aF89dm9pZCAwIT09aS5taW5XaWR0aD9pLm1pbldpZHRoOjY0LHRoaXMucmVuZGVyZWRWaXNpYmxlXz0hMSx0aGlzLnJlbmRlcmVkV2lkdGhfPXZvaWQgMCx0aGlzLnJlbmRlcmVkSFRNTF89IiIsdih0aGlzLEcoZXgpLHRoaXMuaGFuZGxlVW5pdHNDaGFuZ2VkXyx0aGlzKSx0aGlzLnNldFVuaXRzKGkudW5pdHN8fGl4Lk1FVFJJQyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldFVuaXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KGV4KX0sZS5wcm90b3R5cGUuaGFuZGxlVW5pdHNDaGFuZ2VkXz1mdW5jdGlvbigpe3RoaXMudXBkYXRlRWxlbWVudF8oKX0sZS5wcm90b3R5cGUuc2V0VW5pdHM9ZnVuY3Rpb24odCl7dGhpcy5zZXQoZXgsdCl9LGUucHJvdG90eXBlLnVwZGF0ZUVsZW1lbnRfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3U3RhdGVfO2lmKHQpe3ZhciBlPXQuY2VudGVyLGk9dC5wcm9qZWN0aW9uLHI9dGhpcy5nZXRVbml0cygpLG49cj09aXguREVHUkVFUz8kdC5ERUdSRUVTOiR0Lk1FVEVSUyxvPVNlKGksdC5yZXNvbHV0aW9uLGUsbik7aS5nZXRVbml0cygpIT0kdC5ERUdSRUVTJiZpLmdldE1ldGVyc1BlclVuaXQoKSYmbj09JHQuTUVURVJTJiYobyo9aS5nZXRNZXRlcnNQZXJVbml0KCkpO3ZhciBzPXRoaXMubWluV2lkdGhfKm8sYT0iIjtpZihyPT1peC5ERUdSRUVTKXt2YXIgaD1RdFskdC5ERUdSRUVTXTtpLmdldFVuaXRzKCk9PSR0LkRFR1JFRVM/cyo9aDpvLz1oLHM8aC82MD8oYT0i4oCzIixvKj0zNjAwKTpzPGg/KGE9IuKAsiIsbyo9NjApOmE9IsKwIn1lbHNlIHI9PWl4LklNUEVSSUFMP3M8LjkxNDQ/KGE9ImluIixvLz0uMDI1NCk6czwxNjA5LjM0ND8oYT0iZnQiLG8vPS4zMDQ4KTooYT0ibWkiLG8vPTE2MDkuMzQ0KTpyPT1peC5OQVVUSUNBTD8oby89MTg1MixhPSJubSIpOnI9PWl4Lk1FVFJJQz9zPC4wMDE/KGE9Is68bSIsbyo9MWU2KTpzPDE/KGE9Im1tIixvKj0xZTMpOnM8MWUzP2E9Im0iOihhPSJrbSIsby89MWUzKTpyPT1peC5VUz9zPC45MTQ0PyhhPSJpbiIsbyo9MzkuMzcpOnM8MTYwOS4zNDQ/KGE9ImZ0IixvLz0uMzA0ODAwNjEpOihhPSJtaSIsby89MTYwOS4zNDcyKTpZKCExLDMzKTtmb3IodmFyIGwsdSxwPTMqTWF0aC5mbG9vcihNYXRoLmxvZyh0aGlzLm1pbldpZHRoXypvKS9NYXRoLmxvZygxMCkpOzspe2lmKGw9cnhbKHAlMyszKSUzXSpNYXRoLnBvdygxMCxNYXRoLmZsb29yKHAvMykpLHU9TWF0aC5yb3VuZChsL28pLGlzTmFOKHUpKXJldHVybiB0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheT0ibm9uZSIsdm9pZCh0aGlzLnJlbmRlcmVkVmlzaWJsZV89ITEpO2lmKHU+PXRoaXMubWluV2lkdGhfKWJyZWFrOysrcH12YXIgYz1sKyIgIithO3RoaXMucmVuZGVyZWRIVE1MXyE9YyYmKHRoaXMuaW5uZXJFbGVtZW50Xy5pbm5lckhUTUw9Yyx0aGlzLnJlbmRlcmVkSFRNTF89YyksdGhpcy5yZW5kZXJlZFdpZHRoXyE9dSYmKHRoaXMuaW5uZXJFbGVtZW50Xy5zdHlsZS53aWR0aD11KyJweCIsdGhpcy5yZW5kZXJlZFdpZHRoXz11KSx0aGlzLnJlbmRlcmVkVmlzaWJsZV98fCh0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheT0iIix0aGlzLnJlbmRlcmVkVmlzaWJsZV89ITApfWVsc2UgdGhpcy5yZW5kZXJlZFZpc2libGVfJiYodGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMucmVuZGVyZWRWaXNpYmxlXz0hMSl9LGV9KHVvKSxzeD17VkVSVElDQUw6MCxIT1JJWk9OVEFMOjF9O2Z1bmN0aW9uIGF4KHQpe2lmKHQuZnJhbWVTdGF0ZSl7dGhpcy5zbGlkZXJJbml0aWFsaXplZF98fHRoaXMuaW5pdFNsaWRlcl8oKTt2YXIgZT10LmZyYW1lU3RhdGUudmlld1N0YXRlLnJlc29sdXRpb247ZSE9PXRoaXMuY3VycmVudFJlc29sdXRpb25fJiYodGhpcy5jdXJyZW50UmVzb2x1dGlvbl89ZSx0aGlzLnNldFRodW1iUG9zaXRpb25fKGUpKX19dmFyIGh4PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIGk9ZXx8e307dC5jYWxsKHRoaXMse2VsZW1lbnQ6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscmVuZGVyOmkucmVuZGVyfHxheH0pLHRoaXMuZHJhZ0xpc3RlbmVyS2V5c189W10sdGhpcy5jdXJyZW50UmVzb2x1dGlvbl89dm9pZCAwLHRoaXMuZGlyZWN0aW9uXz1zeC5WRVJUSUNBTCx0aGlzLmRyYWdnaW5nXyx0aGlzLmhlaWdodExpbWl0Xz0wLHRoaXMud2lkdGhMaW1pdF89MCx0aGlzLnByZXZpb3VzWF8sdGhpcy5wcmV2aW91c1lfLHRoaXMudGh1bWJTaXplXz1udWxsLHRoaXMuc2xpZGVySW5pdGlhbGl6ZWRfPSExLHRoaXMuZHVyYXRpb25fPXZvaWQgMCE9PWkuZHVyYXRpb24/aS5kdXJhdGlvbjoyMDA7dmFyIHI9dm9pZCAwIT09aS5jbGFzc05hbWU/aS5jbGFzc05hbWU6Im9sLXpvb21zbGlkZXIiLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7bi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJidXR0b24iKSxuLmNsYXNzTmFtZT1yKyItdGh1bWIgIitmbzt2YXIgbz10aGlzLmVsZW1lbnQ7by5jbGFzc05hbWU9cisiICIrZm8rIiAiK2dvLG8uYXBwZW5kQ2hpbGQobiksdGhpcy5kcmFnZ2VyXz1uZXcgVG4obyksdih0aGlzLmRyYWdnZXJfLEdyLlBPSU5URVJET1dOLHRoaXMuaGFuZGxlRHJhZ2dlclN0YXJ0Xyx0aGlzKSx2KHRoaXMuZHJhZ2dlcl8sR3IuUE9JTlRFUk1PVkUsdGhpcy5oYW5kbGVEcmFnZ2VyRHJhZ18sdGhpcyksdih0aGlzLmRyYWdnZXJfLEdyLlBPSU5URVJVUCx0aGlzLmhhbmRsZURyYWdnZXJFbmRfLHRoaXMpLHYobyxNLkNMSUNLLHRoaXMuaGFuZGxlQ29udGFpbmVyQ2xpY2tfLHRoaXMpLHYobixNLkNMSUNLLE8pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWw9ZnVuY3Rpb24oKXt0aGlzLmRyYWdnZXJfLmRpc3Bvc2UoKSx0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuc2V0TWFwPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLnNldE1hcC5jYWxsKHRoaXMsZSksZSYmZS5yZW5kZXIoKX0sZS5wcm90b3R5cGUuaW5pdFNsaWRlcl89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQsZT10Lm9mZnNldFdpZHRoLGk9dC5vZmZzZXRIZWlnaHQscj10LmZpcnN0RWxlbWVudENoaWxkLG49Z2V0Q29tcHV0ZWRTdHlsZShyKSxvPXIub2Zmc2V0V2lkdGgrcGFyc2VGbG9hdChuLm1hcmdpblJpZ2h0KStwYXJzZUZsb2F0KG4ubWFyZ2luTGVmdCkscz1yLm9mZnNldEhlaWdodCtwYXJzZUZsb2F0KG4ubWFyZ2luVG9wKStwYXJzZUZsb2F0KG4ubWFyZ2luQm90dG9tKTt0aGlzLnRodW1iU2l6ZV89W28sc10sZT5pPyh0aGlzLmRpcmVjdGlvbl89c3guSE9SSVpPTlRBTCx0aGlzLndpZHRoTGltaXRfPWUtbyk6KHRoaXMuZGlyZWN0aW9uXz1zeC5WRVJUSUNBTCx0aGlzLmhlaWdodExpbWl0Xz1pLXMpLHRoaXMuc2xpZGVySW5pdGlhbGl6ZWRfPSEwfSxlLnByb3RvdHlwZS5oYW5kbGVDb250YWluZXJDbGlja189ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRNYXAoKS5nZXRWaWV3KCksaT10aGlzLmdldFJlbGF0aXZlUG9zaXRpb25fKHQub2Zmc2V0WC10aGlzLnRodW1iU2l6ZV9bMF0vMix0Lm9mZnNldFktdGhpcy50aHVtYlNpemVfWzFdLzIpLHI9dGhpcy5nZXRSZXNvbHV0aW9uRm9yUG9zaXRpb25fKGkpO2UuYW5pbWF0ZSh7cmVzb2x1dGlvbjplLmNvbnN0cmFpblJlc29sdXRpb24ociksZHVyYXRpb246dGhpcy5kdXJhdGlvbl8sZWFzaW5nOlhufSl9LGUucHJvdG90eXBlLmhhbmRsZURyYWdnZXJTdGFydF89ZnVuY3Rpb24odCl7aWYoIXRoaXMuZHJhZ2dpbmdfJiZ0Lm9yaWdpbmFsRXZlbnQudGFyZ2V0PT09dGhpcy5lbGVtZW50LmZpcnN0RWxlbWVudENoaWxkJiYodGhpcy5nZXRNYXAoKS5nZXRWaWV3KCkuc2V0SGludChqbiwxKSx0aGlzLnByZXZpb3VzWF89dC5jbGllbnRYLHRoaXMucHJldmlvdXNZXz10LmNsaWVudFksdGhpcy5kcmFnZ2luZ189ITAsMD09PXRoaXMuZHJhZ0xpc3RlbmVyS2V5c18ubGVuZ3RoKSl7dmFyIGU9dGhpcy5oYW5kbGVEcmFnZ2VyRHJhZ18saT10aGlzLmhhbmRsZURyYWdnZXJFbmRfO3RoaXMuZHJhZ0xpc3RlbmVyS2V5c18ucHVzaCh2KGRvY3VtZW50LE0uTU9VU0VNT1ZFLGUsdGhpcyksdihkb2N1bWVudCxHci5QT0lOVEVSTU9WRSxlLHRoaXMpLHYoZG9jdW1lbnQsTS5NT1VTRVVQLGksdGhpcyksdihkb2N1bWVudCxHci5QT0lOVEVSVVAsaSx0aGlzKSl9fSxlLnByb3RvdHlwZS5oYW5kbGVEcmFnZ2VyRHJhZ189ZnVuY3Rpb24odCl7aWYodGhpcy5kcmFnZ2luZ18pe3ZhciBlPXRoaXMuZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCxpPXQuY2xpZW50WC10aGlzLnByZXZpb3VzWF8rcGFyc2VGbG9hdChlLnN0eWxlLmxlZnQpLHI9dC5jbGllbnRZLXRoaXMucHJldmlvdXNZXytwYXJzZUZsb2F0KGUuc3R5bGUudG9wKSxuPXRoaXMuZ2V0UmVsYXRpdmVQb3NpdGlvbl8oaSxyKTt0aGlzLmN1cnJlbnRSZXNvbHV0aW9uXz10aGlzLmdldFJlc29sdXRpb25Gb3JQb3NpdGlvbl8obiksdGhpcy5nZXRNYXAoKS5nZXRWaWV3KCkuc2V0UmVzb2x1dGlvbih0aGlzLmN1cnJlbnRSZXNvbHV0aW9uXyksdGhpcy5zZXRUaHVtYlBvc2l0aW9uXyh0aGlzLmN1cnJlbnRSZXNvbHV0aW9uXyksdGhpcy5wcmV2aW91c1hfPXQuY2xpZW50WCx0aGlzLnByZXZpb3VzWV89dC5jbGllbnRZfX0sZS5wcm90b3R5cGUuaGFuZGxlRHJhZ2dlckVuZF89ZnVuY3Rpb24odCl7aWYodGhpcy5kcmFnZ2luZ18pe3ZhciBlPXRoaXMuZ2V0TWFwKCkuZ2V0VmlldygpO2Uuc2V0SGludChqbiwtMSksZS5hbmltYXRlKHtyZXNvbHV0aW9uOmUuY29uc3RyYWluUmVzb2x1dGlvbih0aGlzLmN1cnJlbnRSZXNvbHV0aW9uXyksZHVyYXRpb246dGhpcy5kdXJhdGlvbl8sZWFzaW5nOlhufSksdGhpcy5kcmFnZ2luZ189ITEsdGhpcy5wcmV2aW91c1hfPXZvaWQgMCx0aGlzLnByZXZpb3VzWV89dm9pZCAwLHRoaXMuZHJhZ0xpc3RlbmVyS2V5c18uZm9yRWFjaChFKSx0aGlzLmRyYWdMaXN0ZW5lcktleXNfLmxlbmd0aD0wfX0sZS5wcm90b3R5cGUuc2V0VGh1bWJQb3NpdGlvbl89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbkZvclJlc29sdXRpb25fKHQpLGk9dGhpcy5lbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO3RoaXMuZGlyZWN0aW9uXz09c3guSE9SSVpPTlRBTD9pLnN0eWxlLmxlZnQ9dGhpcy53aWR0aExpbWl0XyplKyJweCI6aS5zdHlsZS50b3A9dGhpcy5oZWlnaHRMaW1pdF8qZSsicHgifSxlLnByb3RvdHlwZS5nZXRSZWxhdGl2ZVBvc2l0aW9uXz1mdW5jdGlvbih0LGUpe3JldHVybiBrdCh0aGlzLmRpcmVjdGlvbl89PT1zeC5IT1JJWk9OVEFMP3QvdGhpcy53aWR0aExpbWl0XzplL3RoaXMuaGVpZ2h0TGltaXRfLDAsMSl9LGUucHJvdG90eXBlLmdldFJlc29sdXRpb25Gb3JQb3NpdGlvbl89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0TWFwKCkuZ2V0VmlldygpLmdldFJlc29sdXRpb25Gb3JWYWx1ZUZ1bmN0aW9uKCkoMS10KX0sZS5wcm90b3R5cGUuZ2V0UG9zaXRpb25Gb3JSZXNvbHV0aW9uXz1mdW5jdGlvbih0KXtyZXR1cm4gMS10aGlzLmdldE1hcCgpLmdldFZpZXcoKS5nZXRWYWx1ZUZvclJlc29sdXRpb25GdW5jdGlvbigpKHQpfSxlfSh1byksbHg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgaT1lfHx7fTt0LmNhbGwodGhpcyx7ZWxlbWVudDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0YXJnZXQ6aS50YXJnZXR9KSx0aGlzLmV4dGVudD1pLmV4dGVudD9pLmV4dGVudDpudWxsO3ZhciByPXZvaWQgMCE9PWkuY2xhc3NOYW1lP2kuY2xhc3NOYW1lOiJvbC16b29tLWV4dGVudCIsbj12b2lkIDAhPT1pLmxhYmVsP2kubGFiZWw6IkUiLG89dm9pZCAwIT09aS50aXBMYWJlbD9pLnRpcExhYmVsOiJGaXQgdG8gZXh0ZW50IixzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO3Muc2V0QXR0cmlidXRlKCJ0eXBlIiwiYnV0dG9uIikscy50aXRsZT1vLHMuYXBwZW5kQ2hpbGQoInN0cmluZyI9PXR5cGVvZiBuP2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pOm4pLHYocyxNLkNMSUNLLHRoaXMuaGFuZGxlQ2xpY2tfLHRoaXMpO3ZhciBhPXIrIiAiK2ZvKyIgIitnbyxoPXRoaXMuZWxlbWVudDtoLmNsYXNzTmFtZT1hLGguYXBwZW5kQ2hpbGQocyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmhhbmRsZUNsaWNrXz1mdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksdGhpcy5oYW5kbGVab29tVG9FeHRlbnQoKX0sZS5wcm90b3R5cGUuaGFuZGxlWm9vbVRvRXh0ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRNYXAoKS5nZXRWaWV3KCksZT10aGlzLmV4dGVudD90aGlzLmV4dGVudDp0LmdldFByb2plY3Rpb24oKS5nZXRFeHRlbnQoKTt0LmZpdChlKX0sZX0odW8pLHV4PXthcnJheTp7fSxjb2xvcjp7fSxjb2xvcmxpa2U6e30sY29udHJvbDp7fSxjb29yZGluYXRlOnt9LGVhc2luZzp7fSxldmVudHM6e319O3V4LmV2ZW50cy5jb25kaXRpb249e30sdXguZXh0ZW50PXt9LHV4LmZlYXR1cmVsb2FkZXI9e30sdXguZm9ybWF0PXt9LHV4LmZvcm1hdC5maWx0ZXI9e30sdXguZ2VvbT17fSx1eC5oYXM9e30sdXguaW50ZXJhY3Rpb249e30sdXgubGF5ZXI9e30sdXgubG9hZGluZ3N0cmF0ZWd5PXt9LHV4LnByb2o9e30sdXgucHJvai5Vbml0cz17fSx1eC5wcm9qLnByb2o0PXt9LHV4LnJlbmRlcj17fSx1eC5yZW5kZXIuY2FudmFzPXt9LHV4LnJlbmRlcmVyPXt9LHV4LnJlbmRlcmVyLmNhbnZhcz17fSx1eC5yZW5kZXJlci53ZWJnbD17fSx1eC5zaXplPXt9LHV4LnNvdXJjZT17fSx1eC5zcGhlcmU9e30sdXguc3R5bGU9e30sdXguc3R5bGUuSWNvbkltYWdlQ2FjaGU9e30sdXgudGlsZWdyaWQ9e30sdXgueG1sPXt9LHV4LkNvbGxlY3Rpb249VSx1eC5GZWF0dXJlPUIsdXguR2VvbG9jYXRpb249emksdXguR3JhdGljdWxlPU9yLHV4LktpbmV0aWM9YnIsdXguTWFwPUhhLHV4Lk9iamVjdD1ELHV4Lk9ic2VydmFibGU9Rix1eC5PYnNlcnZhYmxlLnVuQnlLZXk9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIGU9MCxpPXQubGVuZ3RoO2U8aTsrK2UpRSh0W2VdKTtlbHNlIEUodCl9LHV4Lk92ZXJsYXk9SmEsdXguUGx1Z2dhYmxlTWFwPWxvLHV4LlZpZXc9cW4sdXguV2ViR0xNYXA9S2wsdXguYXJyYXkuc3RhYmxlU29ydD1xLHV4LmNvbG9yLmFzQXJyYXk9X3IsdXguY29sb3IuYXNTdHJpbmc9ZHIsdXguY29sb3JsaWtlLmFzQ29sb3JMaWtlPVlzLHV4LmNvbnRyb2wuQXR0cmlidXRpb249U28sdXguY29udHJvbC5BdHRyaWJ1dGlvbi5yZW5kZXI9RW8sdXguY29udHJvbC5Db250cm9sPXVvLHV4LmNvbnRyb2wuRnVsbFNjcmVlbj1abSx1eC5jb250cm9sLk1vdXNlUG9zaXRpb249UW0sdXguY29udHJvbC5Nb3VzZVBvc2l0aW9uLnJlbmRlcj1KbSx1eC5jb250cm9sLk92ZXJ2aWV3TWFwPXR4LHV4LmNvbnRyb2wuT3ZlcnZpZXdNYXAucmVuZGVyPSRtLHV4LmNvbnRyb2wuUm90YXRlPUNvLHV4LmNvbnRyb2wuUm90YXRlLnJlbmRlcj1Ubyx1eC5jb250cm9sLlNjYWxlTGluZT1veCx1eC5jb250cm9sLlNjYWxlTGluZS5yZW5kZXI9bngsdXguY29udHJvbC5ab29tPVJvLHV4LmNvbnRyb2wuWm9vbVNsaWRlcj1oeCx1eC5jb250cm9sLlpvb21TbGlkZXIucmVuZGVyPWF4LHV4LmNvbnRyb2wuWm9vbVRvRXh0ZW50PWx4LHV4LmNvbnRyb2wuZGVmYXVsdHM9d28sdXguY29vcmRpbmF0ZS5hZGQ9SGksdXguY29vcmRpbmF0ZS5jcmVhdGVTdHJpbmdYWT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5yKGUsdCl9fSx1eC5jb29yZGluYXRlLmZvcm1hdD1KaSx1eC5jb29yZGluYXRlLnJvdGF0ZT0kaSx1eC5jb29yZGluYXRlLnRvU3RyaW5nSERNUz1mdW5jdGlvbih0LGUpe3JldHVybiB0P3FpKCJOUyIsdFsxXSxlKSsiICIrcWkoIkVXIix0WzBdLGUpOiIifSx1eC5jb29yZGluYXRlLnRvU3RyaW5nWFk9bnIsdXguZWFzaW5nLmVhc2VJbj1Wbix1eC5lYXNpbmcuZWFzZU91dD1Ybix1eC5lYXNpbmcuaW5BbmRPdXQ9em4sdXguZWFzaW5nLmxpbmVhcj1Xbix1eC5lYXNpbmcudXBBbmREb3duPWZ1bmN0aW9uKHQpe3JldHVybiB0PC41P3puKDIqdCk6MS16bigyKih0LS41KSl9LHV4LmV2ZW50cy5jb25kaXRpb24uYWx0S2V5T25seT1Hbyx1eC5ldmVudHMuY29uZGl0aW9uLmFsdFNoaWZ0S2V5c09ubHk9RG8sdXguZXZlbnRzLmNvbmRpdGlvbi5hbHdheXM9am8sdXguZXZlbnRzLmNvbmRpdGlvbi5jbGljaz1mdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlPT1Bci5DTElDS30sdXguZXZlbnRzLmNvbmRpdGlvbi5kb3VibGVDbGljaz1mdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlPT1Bci5EQkxDTElDS30sdXguZXZlbnRzLmNvbmRpdGlvbi5mb2N1cz1rbyx1eC5ldmVudHMuY29uZGl0aW9uLm1vdXNlT25seT1Lbyx1eC5ldmVudHMuY29uZGl0aW9uLm5ldmVyPVlvLHV4LmV2ZW50cy5jb25kaXRpb24ubm9Nb2RpZmllcktleXM9WG8sdXguZXZlbnRzLmNvbmRpdGlvbi5wbGF0Zm9ybU1vZGlmaWVyS2V5T25seT1mdW5jdGlvbih0KXt2YXIgZT10Lm9yaWdpbmFsRXZlbnQ7cmV0dXJuIWUuYWx0S2V5JiYoR2k/ZS5tZXRhS2V5OmUuY3RybEtleSkmJiFlLnNoaWZ0S2V5fSx1eC5ldmVudHMuY29uZGl0aW9uLnBvaW50ZXJNb3ZlPUJvLHV4LmV2ZW50cy5jb25kaXRpb24ucHJpbWFyeUFjdGlvbj1Ibyx1eC5ldmVudHMuY29uZGl0aW9uLnNoaWZ0S2V5T25seT16byx1eC5ldmVudHMuY29uZGl0aW9uLnNpbmdsZUNsaWNrPVZvLHV4LmV2ZW50cy5jb25kaXRpb24udGFyZ2V0Tm90RWRpdGFibGU9V28sdXguZXh0ZW50LmFwcGx5VHJhbnNmb3JtPUZ0LHV4LmV4dGVudC5ib3VuZGluZ0V4dGVudD10dCx1eC5leHRlbnQuYnVmZmVyPWV0LHV4LmV4dGVudC5jb250YWluc0Nvb3JkaW5hdGU9bnQsdXguZXh0ZW50LmNvbnRhaW5zRXh0ZW50PW90LHV4LmV4dGVudC5jb250YWluc1hZPXN0LHV4LmV4dGVudC5jcmVhdGVFbXB0eT1odCx1eC5leHRlbnQuZXF1YWxzPWR0LHV4LmV4dGVudC5leHRlbmQ9ZnQsdXguZXh0ZW50LmdldEFyZWE9eHQsdXguZXh0ZW50LmdldEJvdHRvbUxlZnQ9RXQsdXguZXh0ZW50LmdldEJvdHRvbVJpZ2h0PVN0LHV4LmV4dGVudC5nZXRDZW50ZXI9VHQsdXguZXh0ZW50LmdldEhlaWdodD1SdCx1eC5leHRlbnQuZ2V0SW50ZXJzZWN0aW9uPXd0LHV4LmV4dGVudC5nZXRTaXplPWZ1bmN0aW9uKHQpe3JldHVyblt0WzJdLXRbMF0sdFszXS10WzFdXX0sdXguZXh0ZW50LmdldFRvcExlZnQ9SXQsdXguZXh0ZW50LmdldFRvcFJpZ2h0PUx0LHV4LmV4dGVudC5nZXRXaWR0aD1PdCx1eC5leHRlbnQuaW50ZXJzZWN0cz1QdCx1eC5leHRlbnQuaXNFbXB0eT1idCx1eC5mZWF0dXJlbG9hZGVyLnhocj1xbCx1eC5mb3JtYXQuRXNyaUpTT049U2QsdXguZm9ybWF0LkZlYXR1cmU9Y2QsdXguZm9ybWF0LkdNTD16ZCx1eC5mb3JtYXQuR01MMj1aZCx1eC5mb3JtYXQuR01MMz1WZCx1eC5mb3JtYXQuR01MMzI9SmQsdXguZm9ybWF0LkdQWD1GZix1eC5mb3JtYXQuR2VvSlNPTj1HZix1eC5mb3JtYXQuSUdDPUpmLHV4LmZvcm1hdC5LTUw9QmcsdXguZm9ybWF0Lk1WVD1RZyx1eC5mb3JtYXQuT1NNWE1MPW95LHV4LmZvcm1hdC5Qb2x5bGluZT1jeSx1eC5mb3JtYXQuUG9seWxpbmUuZGVjb2RlRGVsdGFzPWh5LHV4LmZvcm1hdC5Qb2x5bGluZS5kZWNvZGVGbG9hdHM9dXksdXguZm9ybWF0LlBvbHlsaW5lLmVuY29kZURlbHRhcz1heSx1eC5mb3JtYXQuUG9seWxpbmUuZW5jb2RlRmxvYXRzPWx5LHV4LmZvcm1hdC5Ub3BvSlNPTj1teSx1eC5mb3JtYXQuV0ZTPWd2LHV4LmZvcm1hdC5XRlMud3JpdGVGaWx0ZXI9ZnVuY3Rpb24odCl7dmFyIGU9dHUoUXksIkZpbHRlciIpO3JldHVybiBsdihlLHQsW10pLGV9LHV4LmZvcm1hdC5XS1Q9R3YsdXguZm9ybWF0LldNU0NhcGFiaWxpdGllcz11bSx1eC5mb3JtYXQuV01TR2V0RmVhdHVyZUluZm89cG0sdXguZm9ybWF0LldNVFNDYXBhYmlsaXRpZXM9WG0sdXguZm9ybWF0LmZpbHRlci5CYm94PUN5LHV4LmZvcm1hdC5maWx0ZXIuQ29udGFpbnM9d3ksdXguZm9ybWF0LmZpbHRlci5EdXJpbmc9THksdXguZm9ybWF0LmZpbHRlci5FcXVhbFRvPVB5LHV4LmZvcm1hdC5maWx0ZXIuR3JlYXRlclRoYW49YnksdXguZm9ybWF0LmZpbHRlci5HcmVhdGVyVGhhbk9yRXF1YWxUbz1NeSx1eC5mb3JtYXQuZmlsdGVyLkludGVyc2VjdHM9RnksdXguZm9ybWF0LmZpbHRlci5Jc0JldHdlZW49QXksdXguZm9ybWF0LmZpbHRlci5Jc0xpa2U9TnksdXguZm9ybWF0LmZpbHRlci5Jc051bGw9R3ksdXguZm9ybWF0LmZpbHRlci5MZXNzVGhhbj1EeSx1eC5mb3JtYXQuZmlsdGVyLkxlc3NUaGFuT3JFcXVhbFRvPWt5LHV4LmZvcm1hdC5maWx0ZXIuTm90PWp5LHV4LmZvcm1hdC5maWx0ZXIuTm90RXF1YWxUbz1VeSx1eC5mb3JtYXQuZmlsdGVyLk9yPVl5LHV4LmZvcm1hdC5maWx0ZXIuV2l0aGluPUJ5LHV4LmZvcm1hdC5maWx0ZXIuYW5kPVZ5LHV4LmZvcm1hdC5maWx0ZXIuYmJveD1YeSx1eC5mb3JtYXQuZmlsdGVyLmJldHdlZW49ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgQXkodCxlLGkpfSx1eC5mb3JtYXQuZmlsdGVyLmNvbnRhaW5zPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IHd5KHQsZSxpKX0sdXguZm9ybWF0LmZpbHRlci5kdXJpbmc9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgTHkodCxlLGkpfSx1eC5mb3JtYXQuZmlsdGVyLmVxdWFsVG89ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgUHkodCxlLGkpfSx1eC5mb3JtYXQuZmlsdGVyLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBieSh0LGUpfSx1eC5mb3JtYXQuZmlsdGVyLmdyZWF0ZXJUaGFuT3JFcXVhbFRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBNeSh0LGUpfSx1eC5mb3JtYXQuZmlsdGVyLmludGVyc2VjdHM9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgRnkodCxlLGkpfSx1eC5mb3JtYXQuZmlsdGVyLmlzTnVsbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEd5KHQpfSx1eC5mb3JtYXQuZmlsdGVyLmxlc3NUaGFuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBEeSh0LGUpfSx1eC5mb3JtYXQuZmlsdGVyLmxlc3NUaGFuT3JFcXVhbFRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBreSh0LGUpfSx1eC5mb3JtYXQuZmlsdGVyLmxpa2U9ZnVuY3Rpb24odCxlLGkscixuLG8pe3JldHVybiBuZXcgTnkodCxlLGkscixuLG8pfSx1eC5mb3JtYXQuZmlsdGVyLm5vdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGp5KHQpfSx1eC5mb3JtYXQuZmlsdGVyLm5vdEVxdWFsVG89ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgVXkodCxlLGkpfSx1eC5mb3JtYXQuZmlsdGVyLm9yPWZ1bmN0aW9uKHQpe3ZhciBlPVtudWxsXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7cmV0dXJuIG5ldyhGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShZeSxlKSl9LHV4LmZvcm1hdC5maWx0ZXIud2l0aGluPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IEJ5KHQsZSxpKX0sdXguZ2VvbS5DaXJjbGU9T2MsdXguZ2VvbS5HZW9tZXRyeT1YZSx1eC5nZW9tLkdlb21ldHJ5Q29sbGVjdGlvbj11ZCx1eC5nZW9tLkxpbmVTdHJpbmc9aHIsdXguZ2VvbS5MaW5lYXJSaW5nPXBpLHV4Lmdlb20uTXVsdGlMaW5lU3RyaW5nPVBjLHV4Lmdlb20uTXVsdGlQb2ludD1iYyx1eC5nZW9tLk11bHRpUG9seWdvbj1GYyx1eC5nZW9tLlBvaW50PWNpLHV4Lmdlb20uUG9seWdvbj1JaSx1eC5nZW9tLlBvbHlnb24uY2lyY3VsYXI9TGksdXguZ2VvbS5Qb2x5Z29uLmZyb21DaXJjbGU9UGksdXguZ2VvbS5Qb2x5Z29uLmZyb21FeHRlbnQ9T2ksdXguZ2VvbS5TaW1wbGVHZW9tZXRyeT1XZSx1eC5nZXRVaWQ9byx1eC5oYXMuREVWSUNFX1BJWEVMX1JBVElPPURpLHV4Lmhhcy5HRU9MT0NBVElPTj1qaSx1eC5oYXMuVE9VQ0g9VWksdXguaW5oZXJpdHM9ZnVuY3Rpb24odCxlKXt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fSx1eC5pbnRlcmFjdGlvbi5Eb3VibGVDbGlja1pvb209Tm8sdXguaW50ZXJhY3Rpb24uRHJhZ0FuZERyb3A9d2MsdXguaW50ZXJhY3Rpb24uRHJhZ0JveD1ucyx1eC5pbnRlcmFjdGlvbi5EcmFnUGFuPUpvLHV4LmludGVyYWN0aW9uLkRyYWdSb3RhdGU9UW8sdXguaW50ZXJhY3Rpb24uRHJhZ1JvdGF0ZUFuZFpvb209SWMsdXguaW50ZXJhY3Rpb24uRHJhZ1pvb209c3MsdXguaW50ZXJhY3Rpb24uRHJhdz1rYyx1eC5pbnRlcmFjdGlvbi5EcmF3LmNyZWF0ZUJveD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBpPXR0KHQpLHI9W1tFdChpKSxTdChpKSxMdChpKSxJdChpKSxFdChpKV1dLG49ZTtyZXR1cm4gbj9uLnNldENvb3JkaW5hdGVzKHIpOm49bmV3IElpKHIpLG59fSx1eC5pbnRlcmFjdGlvbi5EcmF3LmNyZWF0ZVJlZ3VsYXJQb2x5Z29uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKGkscil7dmFyIG49aVswXSxvPWlbMV0scz1NYXRoLnNxcnQoZXIobixvKSksYT1yfHxQaShuZXcgT2MobiksdCksaD1lO2lmKCFlKXt2YXIgbD1vWzBdLW5bMF0sdT1vWzFdLW5bMV07aD1NYXRoLmF0YW4odS9sKS0obDwwP01hdGguUEk6MCl9cmV0dXJuIGJpKGEsbixzLGgpLGF9fSx1eC5pbnRlcmFjdGlvbi5FeHRlbnQ9VmMsdXguaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb249Rm8sdXguaW50ZXJhY3Rpb24uS2V5Ym9hcmRQYW49bHMsdXguaW50ZXJhY3Rpb24uS2V5Ym9hcmRab29tPXBzLHV4LmludGVyYWN0aW9uLk1vZGlmeT1KYyx1eC5pbnRlcmFjdGlvbi5Nb3VzZVdoZWVsWm9vbT1mcyx1eC5pbnRlcmFjdGlvbi5QaW5jaFJvdGF0ZT1fcyx1eC5pbnRlcmFjdGlvbi5QaW5jaFpvb209Z3MsdXguaW50ZXJhY3Rpb24uUG9pbnRlcj1xbyx1eC5pbnRlcmFjdGlvbi5TZWxlY3Q9ZWQsdXguaW50ZXJhY3Rpb24uU25hcD1yZCx1eC5pbnRlcmFjdGlvbi5UcmFuc2xhdGU9aGQsdXguaW50ZXJhY3Rpb24uZGVmYXVsdHM9eXMsdXgubGF5ZXIuQmFzZT1pbyx1eC5sYXllci5Hcm91cD1vbyx1eC5sYXllci5IZWF0bWFwPW1jLHV4LmxheWVyLkltYWdlPWJwLHV4LmxheWVyLlRpbGU9TnAsdXgubGF5ZXIuVmVjdG9yPWdjLHV4LmxheWVyLlZlY3RvclRpbGU9RWMsdXgubG9hZGluZ3N0cmF0ZWd5LmFsbD1KbCx1eC5sb2FkaW5nc3RyYXRlZ3kuYmJveD1mdW5jdGlvbih0LGUpe3JldHVyblt0XX0sdXgubG9hZGluZ3N0cmF0ZWd5LnRpbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsaSl7dmFyIHI9dC5nZXRaRm9yUmVzb2x1dGlvbihpKSxuPXQuZ2V0VGlsZVJhbmdlRm9yRXh0ZW50QW5kWihlLHIpLG89W10scz1bciwwLDBdO2ZvcihzWzFdPW4ubWluWDtzWzFdPD1uLm1heFg7KytzWzFdKWZvcihzWzJdPW4ubWluWTtzWzJdPD1uLm1heFk7KytzWzJdKW8ucHVzaCh0LmdldFRpbGVDb29yZEV4dGVudChzKSk7cmV0dXJuIG99fSx1eC5wcm9qLlByb2plY3Rpb249ZWUsdXgucHJvai5Vbml0cy5NRVRFUlNfUEVSX1VOSVQ9UXQsdXgucHJvai5hZGRDb29yZGluYXRlVHJhbnNmb3Jtcz13ZSx1eC5wcm9qLmFkZEVxdWl2YWxlbnRQcm9qZWN0aW9ucz1UZSx1eC5wcm9qLmFkZFByb2plY3Rpb249eGUsdXgucHJvai5lcXVpdmFsZW50PUllLHV4LnByb2ouZnJvbUxvbkxhdD1mdW5jdGlvbih0LGUpe3JldHVybiBQZSh0LCJFUFNHOjQzMjYiLHZvaWQgMCE9PWU/ZToiRVBTRzozODU3Iil9LHV4LnByb2ouZ2V0PUVlLHV4LnByb2ouZ2V0UG9pbnRSZXNvbHV0aW9uPVNlLHV4LnByb2ouZ2V0VHJhbnNmb3JtPU9lLHV4LnByb2oucHJvajQucmVnaXN0ZXI9ZnVuY3Rpb24odCl7dmFyIGUsaSxyPU9iamVjdC5rZXlzKHQuZGVmcyksbj1yLmxlbmd0aDtmb3IoZT0wO2U8bjsrK2Upe3ZhciBvPXJbZV07aWYoIUVlKG8pKXt2YXIgcz10LmRlZnMobyk7eGUobmV3IGVlKHtjb2RlOm8sYXhpc09yaWVudGF0aW9uOnMuYXhpcyxtZXRlcnNQZXJVbml0OnMudG9fbWV0ZXIsdW5pdHM6cy51bml0c30pKX19Zm9yKGU9MDtlPG47KytlKXt2YXIgYT1yW2VdLGg9RWUoYSk7Zm9yKGk9MDtpPG47KytpKXt2YXIgbD1yW2ldLHU9RWUobCk7aWYoIXllKGEsbCkpaWYodC5kZWZzW2FdPT09dC5kZWZzW2xdKVRlKFtoLHVdKTtlbHNle3ZhciBwPXQoYSxsKTt3ZShoLHUscC5mb3J3YXJkLHAuaW52ZXJzZSl9fX19LHV4LnByb2oudG9Mb25MYXQ9ZnVuY3Rpb24odCxlKXt2YXIgaT1QZSh0LHZvaWQgMCE9PWU/ZToiRVBTRzozODU3IiwiRVBTRzo0MzI2Iikscj1pWzBdO3JldHVybihyPC0xODB8fHI+MTgwKSYmKGlbMF09WHQocisxODAsMzYwKS0xODApLGl9LHV4LnByb2oudHJhbnNmb3JtPVBlLHV4LnByb2oudHJhbnNmb3JtRXh0ZW50PWJlLHV4LnJlbmRlci5WZWN0b3JDb250ZXh0PVZzLHV4LnJlbmRlci5jYW52YXMubGFiZWxDYWNoZT1Qcyx1eC5yZW5kZXIudG9Db250ZXh0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5jYW52YXMscj1lfHx7fSxuPXIucGl4ZWxSYXRpb3x8RGksbz1yLnNpemU7byYmKGkud2lkdGg9b1swXSpuLGkuaGVpZ2h0PW9bMV0qbixpLnN0eWxlLndpZHRoPW9bMF0rInB4IixpLnN0eWxlLmhlaWdodD1vWzFdKyJweCIpO3ZhciBzPVswLDAsaS53aWR0aCxpLmhlaWdodF0sYT1qZShbMSwwLDAsMSwwLDBdLG4sbik7cmV0dXJuIG5ldyBYcyh0LG4scyxhLDApfSx1eC5yZW5kZXJlci5jYW52YXMuSW1hZ2VMYXllcj1yYSx1eC5yZW5kZXJlci5jYW52YXMuTWFwPVFzLHV4LnJlbmRlcmVyLmNhbnZhcy5UaWxlTGF5ZXI9aGEsdXgucmVuZGVyZXIuY2FudmFzLlZlY3RvckxheWVyPUJhLHV4LnJlbmRlcmVyLmNhbnZhcy5WZWN0b3JUaWxlTGF5ZXI9S2EsdXgucmVuZGVyZXIud2ViZ2wuSW1hZ2VMYXllcj1nbCx1eC5yZW5kZXJlci53ZWJnbC5NYXA9eWwsdXgucmVuZGVyZXIud2ViZ2wuVGlsZUxheWVyPVhsLHV4LnJlbmRlcmVyLndlYmdsLlZlY3RvckxheWVyPVdsLHV4LnNpemUudG9TaXplPWhvLHV4LnNvdXJjZS5CaW5nTWFwcz10cCx1eC5zb3VyY2UuQ2FydG9EQj1pcCx1eC5zb3VyY2UuQ2x1c3Rlcj1zcCx1eC5zb3VyY2UuSW1hZ2U9ZHAsdXguc291cmNlLkltYWdlQXJjR0lTUmVzdD1ncCx1eC5zb3VyY2UuSW1hZ2VDYW52YXM9eXAsdXguc291cmNlLkltYWdlTWFwR3VpZGU9dnAsdXguc291cmNlLkltYWdlU3RhdGljPW1wLHV4LnNvdXJjZS5JbWFnZVdNUz13cCx1eC5zb3VyY2UuT1NNPUxwLHV4LnNvdXJjZS5PU00uQVRUUklCVVRJT049SXAsdXguc291cmNlLlJhc3Rlcj1WcCx1eC5zb3VyY2UuU291cmNlPUlsLHV4LnNvdXJjZS5TdGFtZW49S3AsdXguc291cmNlLlRpbGU9amwsdXguc291cmNlLlRpbGVBcmNHSVNSZXN0PVpwLHV4LnNvdXJjZS5UaWxlRGVidWc9SnAsdXguc291cmNlLlRpbGVJbWFnZT0kdSx1eC5zb3VyY2UuVGlsZUpTT049UXAsdXguc291cmNlLlRpbGVXTVM9dGMsdXguc291cmNlLlVURkdyaWQ9aWMsdXguc291cmNlLlZlY3Rvcj1vcCx1eC5zb3VyY2UuVmVjdG9yVGlsZT1hYyx1eC5zb3VyY2UuV01UUz1sYyx1eC5zb3VyY2UuV01UUy5vcHRpb25zRnJvbUNhcGFiaWxpdGllcz1mdW5jdGlvbih0LGUpe3ZhciBpPUgodC5Db250ZW50cy5MYXllcixmdW5jdGlvbih0LGkscil7cmV0dXJuIHQuSWRlbnRpZmllcj09ZS5sYXllcn0pO2lmKG51bGw9PT1pKXJldHVybiBudWxsO3ZhciByLG49dC5Db250ZW50cy5UaWxlTWF0cml4U2V0OyhyPWkuVGlsZU1hdHJpeFNldExpbmsubGVuZ3RoPjE/SihpLlRpbGVNYXRyaXhTZXRMaW5rLCJwcm9qZWN0aW9uImluIGU/ZnVuY3Rpb24odCxpLHIpe3ZhciBvPUgobixmdW5jdGlvbihlKXtyZXR1cm4gZS5JZGVudGlmaWVyPT10LlRpbGVNYXRyaXhTZXR9KS5TdXBwb3J0ZWRDUlMscz1FZShvLnJlcGxhY2UoL3VybjpvZ2M6ZGVmOmNyczooXHcrKTooLio6KT8oXHcrKSQvLCIkMTokMyIpKXx8RWUobyksYT1FZShlLnByb2plY3Rpb24pO3JldHVybiBzJiZhP0llKHMsYSk6bz09ZS5wcm9qZWN0aW9ufTpmdW5jdGlvbih0LGkscil7cmV0dXJuIHQuVGlsZU1hdHJpeFNldD09ZS5tYXRyaXhTZXR9KTowKTwwJiYocj0wKTt2YXIgbz1pLlRpbGVNYXRyaXhTZXRMaW5rW3JdLlRpbGVNYXRyaXhTZXQscz1pLlRpbGVNYXRyaXhTZXRMaW5rW3JdLlRpbGVNYXRyaXhTZXRMaW1pdHMsYT1pLkZvcm1hdFswXTsiZm9ybWF0ImluIGUmJihhPWUuZm9ybWF0KSwocj1KKGkuU3R5bGUsZnVuY3Rpb24odCxpLHIpe3JldHVybiJzdHlsZSJpbiBlP3QuVGl0bGU9PWUuc3R5bGU6dC5pc0RlZmF1bHR9KSk8MCYmKHI9MCk7dmFyIGg9aS5TdHlsZVtyXS5JZGVudGlmaWVyLGw9e307IkRpbWVuc2lvbiJpbiBpJiZpLkRpbWVuc2lvbi5mb3JFYWNoKGZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10LklkZW50aWZpZXIsbj10LkRlZmF1bHQ7dm9pZCAwPT09biYmKG49dC5WYWx1ZVswXSksbFtyXT1ufSk7dmFyIHUscD1IKHQuQ29udGVudHMuVGlsZU1hdHJpeFNldCxmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQuSWRlbnRpZmllcj09b30pLGM9cC5TdXBwb3J0ZWRDUlM7aWYoYyYmKHU9RWUoYy5yZXBsYWNlKC91cm46b2djOmRlZjpjcnM6KFx3Kyk6KC4qOik/KFx3KykkLywiJDE6JDMiKSl8fEVlKGMpKSwicHJvamVjdGlvbiJpbiBlKXt2YXIgZD1FZShlLnByb2plY3Rpb24pO2QmJih1JiYhSWUoZCx1KXx8KHU9ZCkpfXZhciBmLF8sZz1pLldHUzg0Qm91bmRpbmdCb3g7aWYodm9pZCAwIT09Zyl7dmFyIHk9RWUoIkVQU0c6NDMyNiIpLmdldEV4dGVudCgpO189Z1swXT09eVswXSYmZ1syXT09eVsyXSxmPWJlKGcsIkVQU0c6NDMyNiIsdSk7dmFyIHY9dS5nZXRFeHRlbnQoKTt2JiYob3QodixmKXx8KGY9dm9pZCAwKSl9dmFyIG09RXUocCxmLHMpLHg9W10sRT1lLnJlcXVlc3RFbmNvZGluZztpZihFPXZvaWQgMCE9PUU/RToiIiwiT3BlcmF0aW9uc01ldGFkYXRhImluIHQmJiJHZXRUaWxlImluIHQuT3BlcmF0aW9uc01ldGFkYXRhKWZvcih2YXIgUz10Lk9wZXJhdGlvbnNNZXRhZGF0YS5HZXRUaWxlLkRDUC5IVFRQLkdldCxUPTAsQz1TLmxlbmd0aDtUPEM7KytUKWlmKFNbVF0uQ29uc3RyYWludCl7dmFyIFI9SChTW1RdLkNvbnN0cmFpbnQsZnVuY3Rpb24odCl7cmV0dXJuIkdldEVuY29kaW5nIj09dC5uYW1lfSkuQWxsb3dlZFZhbHVlcy5WYWx1ZTtpZigiIj09PUUmJihFPVJbMF0pLEUhPT1oYy5LVlApYnJlYWs7WChSLGhjLktWUCkmJngucHVzaChTW1RdLmhyZWYpfWVsc2UgU1tUXS5ocmVmJiYoRT1oYy5LVlAseC5wdXNoKFNbVF0uaHJlZikpO3JldHVybiAwPT09eC5sZW5ndGgmJihFPWhjLlJFU1QsaS5SZXNvdXJjZVVSTC5mb3JFYWNoKGZ1bmN0aW9uKHQpeyJ0aWxlIj09PXQucmVzb3VyY2VUeXBlJiYoYT10LmZvcm1hdCx4LnB1c2godC50ZW1wbGF0ZSkpfSkpLHt1cmxzOngsbGF5ZXI6ZS5sYXllcixtYXRyaXhTZXQ6byxmb3JtYXQ6YSxwcm9qZWN0aW9uOnUscmVxdWVzdEVuY29kaW5nOkUsdGlsZUdyaWQ6bSxzdHlsZTpoLGRpbWVuc2lvbnM6bCx3cmFwWDpfLGNyb3NzT3JpZ2luOmUuY3Jvc3NPcmlnaW59fSx1eC5zb3VyY2UuWFlaPWVwLHV4LnNvdXJjZS5ab29taWZ5PWRjLHV4LnNwaGVyZS5nZXRBcmVhPWZ1bmN0aW9uIHQoZSxpKXt2YXIgcj1pfHx7fSxuPXIucmFkaXVzfHxXdCxvPXIucHJvamVjdGlvbnx8IkVQU0c6Mzg1NyIscz1lLmdldFR5cGUoKTtzIT09TnQuR0VPTUVUUllfQ09MTEVDVElPTiYmKGU9ZS5jbG9uZSgpLnRyYW5zZm9ybShvLCJFUFNHOjQzMjYiKSk7dmFyIGEsaCxsLHUscCxjLGQ9MDtzd2l0Y2gocyl7Y2FzZSBOdC5QT0lOVDpjYXNlIE50Lk1VTFRJX1BPSU5UOmNhc2UgTnQuTElORV9TVFJJTkc6Y2FzZSBOdC5NVUxUSV9MSU5FX1NUUklORzpjYXNlIE50LkxJTkVBUl9SSU5HOmJyZWFrO2Nhc2UgTnQuUE9MWUdPTjpmb3IoYT1lLmdldENvb3JkaW5hdGVzKCksZD1NYXRoLmFicyhadChhWzBdLG4pKSxsPTEsdT1hLmxlbmd0aDtsPHU7KytsKWQtPU1hdGguYWJzKFp0KGFbbF0sbikpO2JyZWFrO2Nhc2UgTnQuTVVMVElfUE9MWUdPTjpmb3IobD0wLHU9KGE9ZS5nZXRDb29yZGluYXRlcygpKS5sZW5ndGg7bDx1OysrbClmb3IoaD1hW2xdLGQrPU1hdGguYWJzKFp0KGhbMF0sbikpLHA9MSxjPWgubGVuZ3RoO3A8YzsrK3ApZC09TWF0aC5hYnMoWnQoaFtwXSxuKSk7YnJlYWs7Y2FzZSBOdC5HRU9NRVRSWV9DT0xMRUNUSU9OOnZhciBmPWUuZ2V0R2VvbWV0cmllcygpO2ZvcihsPTAsdT1mLmxlbmd0aDtsPHU7KytsKWQrPXQoZltsXSxpKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZTogIitzKX1yZXR1cm4gZH0sdXguc3BoZXJlLmdldERpc3RhbmNlPUt0LHV4LnNwaGVyZS5nZXRMZW5ndGg9ZnVuY3Rpb24gdChlLGkpe3ZhciByPWl8fHt9LG49ci5yYWRpdXN8fFd0LG89ci5wcm9qZWN0aW9ufHwiRVBTRzozODU3IixzPWUuZ2V0VHlwZSgpO3MhPT1OdC5HRU9NRVRSWV9DT0xMRUNUSU9OJiYoZT1lLmNsb25lKCkudHJhbnNmb3JtKG8sIkVQU0c6NDMyNiIpKTt2YXIgYSxoLGwsdSxwLGMsZD0wO3N3aXRjaChzKXtjYXNlIE50LlBPSU5UOmNhc2UgTnQuTVVMVElfUE9JTlQ6YnJlYWs7Y2FzZSBOdC5MSU5FX1NUUklORzpjYXNlIE50LkxJTkVBUl9SSU5HOmQ9SHQoYT1lLmdldENvb3JkaW5hdGVzKCksbik7YnJlYWs7Y2FzZSBOdC5NVUxUSV9MSU5FX1NUUklORzpjYXNlIE50LlBPTFlHT046Zm9yKGw9MCx1PShhPWUuZ2V0Q29vcmRpbmF0ZXMoKSkubGVuZ3RoO2w8dTsrK2wpZCs9SHQoYVtsXSxuKTticmVhaztjYXNlIE50Lk1VTFRJX1BPTFlHT046Zm9yKGw9MCx1PShhPWUuZ2V0Q29vcmRpbmF0ZXMoKSkubGVuZ3RoO2w8dTsrK2wpZm9yKHA9MCxjPShoPWFbbF0pLmxlbmd0aDtwPGM7KytwKWQrPUh0KGhbcF0sbik7YnJlYWs7Y2FzZSBOdC5HRU9NRVRSWV9DT0xMRUNUSU9OOnZhciBmPWUuZ2V0R2VvbWV0cmllcygpO2ZvcihsPTAsdT1mLmxlbmd0aDtsPHU7KytsKWQrPXQoZltsXSxpKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZTogIitzKX1yZXR1cm4gZH0sdXguc3R5bGUuQXRsYXNNYW5hZ2VyPW9sLHV4LnN0eWxlLkNpcmNsZT1SdSx1eC5zdHlsZS5GaWxsPW1yLHV4LnN0eWxlLkljb249T3UsdXguc3R5bGUuSWNvbkltYWdlQ2FjaGUuc2hhcmVkPUtzLHV4LnN0eWxlLkltYWdlPVR1LHV4LnN0eWxlLlJlZ3VsYXJTaGFwZT1DdSx1eC5zdHlsZS5TdHJva2U9RXIsdXguc3R5bGUuU3R5bGU9TnUsdXguc3R5bGUuVGV4dD1Scix1eC50aWxlZ3JpZC5UaWxlR3JpZD1QbCx1eC50aWxlZ3JpZC5XTVRTPXh1LHV4LnRpbGVncmlkLldNVFMuY3JlYXRlRnJvbUNhcGFiaWxpdGllc01hdHJpeFNldD1FdSx1eC50aWxlZ3JpZC5jcmVhdGVYWVo9RmwsdXgueG1sLmdldEFsbFRleHRDb250ZW50PWV1LHV4LnhtbC5wYXJzZT1ydTtlLmRlZmF1bHQ9dXh9XSkuZGVmYXVsdH0pOwovLyMgc291cmNlTWFwcGluZ1VSTD1vbC5qcy5tYXA="></script>

<script id=" ol_jquery1113min.js " src="data:/text/plain;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 id=" ol_polyfillmin.js " src="data:/text/plain;base64,LyogRGlzYWJsZSBtaW5pZmljYXRpb24gKHJlbW92ZSBgLm1pbmAgZnJvbSBVUkwgcGF0aCkgZm9yIG1vcmUgaW5mbyAqLwoKKGZ1bmN0aW9uKHVuZGVmaW5lZCkge30pLmNhbGwoJ29iamVjdCcgPT09IHR5cGVvZiB3aW5kb3cgJiYgd2luZG93IHx8ICdvYmplY3QnID09PSB0eXBlb2Ygc2VsZiAmJiBzZWxmIHx8ICdvYmplY3QnID09PSB0eXBlb2YgZ2xvYmFsICYmIGdsb2JhbCB8fCB7fSk7"></script>
//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer