Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active August 15, 2016 21:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/d0a486b9070f484c69d045bf3ccb4ecd to your computer and use it in GitHub Desktop.
Save timelyportfolio/d0a486b9070f484c69d045bf3ccb4ecd to your computer and use it in GitHub Desktop.
jquery.sparkline in rhandsontable with NA
license: mit-cmu

Built with blockbuilder.org and R htmlwidgets


NULL/NA in rhandsontable sparkline

Prompted by #rstats friend @TimSalabim3 I recently remembered that the htmlwidget rhandsontable gives us sparklines in cells through a jquery.sparkline renderer. These sparklines can digest NA values from R, but just need one argument na="null" added to the jsonlite::toJSON call.

library(rhandsontable)

DF = data.frame(int = 1:10,
                numeric = rnorm(10),
                logical = TRUE,
                character = LETTERS[1:10],
                fact = factor(letters[1:10]),
                date = seq(from = Sys.Date(), by = "days", length.out = 10),
                stringsAsFactors = FALSE)

# add a sparkline chart
DF$chart = sapply(1:10, function(x) jsonlite::toJSON(list(values=rnorm(10))))

# add some NAs to our chart data
#   note: the na="null" is the important piece
DF$chart[1] <- jsonlite::toJSON(list(values=c(1,2,3,4,5,NA,NA,8,10)),na="null")

rhandsontable(DF, rowHeaders = NULL) %>%
  hot_col("chart", renderer = htmlwidgets::JS("renderSparkline"))

live example

screenshot of sparkline line with na

This file has been truncated, but you can view the full file.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgfTsKCiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgcmVzaXplIGlmIGJpbmRpbmdEZWYgaW1wbGVtZW50cyBpdAogICAgICBpZiAoYmluZGluZ0RlZi5yZXNpemUpIHsKICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgIC8vIFNoaW55IGNhbiBjYWxsIHJlc2l6ZSBiZWZvcmUgaW5pdGlhbGl6ZS9yZW5kZXJWYWx1ZSBoYXZlIGJlZW4KICAgICAgICAgIC8vIGNhbGxlZCwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciB3aWRnZXRzLgogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgICBiaW5kaW5nRGVmLnJlc2l6ZShlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7CiAgICB9CiAgfTsKCiAgdmFyIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgZnVuY3Rpb24gc2NoZWR1bGVTdGF0aWNSZW5kZXIoKSB7CiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgewogICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9LCAxKTsKICAgIH0KICB9CgogIC8vIFJlbmRlciBzdGF0aWMgd2lkZ2V0cyBhZnRlciB0aGUgZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZwogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzCiAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGJpbmRpbmdzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgIHZhciBtYXRjaGVzID0gYmluZGluZy5maW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgIGZvckVhY2gobWF0Y2hlcywgZnVuY3Rpb24oZWwpIHsKICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOwoKICAgICAgICBpZiAoaGFzQ2xhc3MoZWwsICJodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUgKyAiIGh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCI7CgogICAgICAgIHZhciBpbml0UmVzdWx0OwogICAgICAgIGlmIChiaW5kaW5nLmluaXRpYWxpemUpIHsKICAgICAgICAgIGluaXRSZXN1bHQgPSBiaW5kaW5nLmluaXRpYWxpemUoZWwsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsKICAgICAgICAgIHZhciBsYXN0U2l6ZSA9IHt9OwogICAgICAgICAgdmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSAwICYmIHNpemUuaCA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbGFzdFNpemUgPSBzaXplOwogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOwogICAgICAgICAgfTsKCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgd2UncmUgcnVubmluZyBpbiBhIFNoaW55CiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dAogICAgICAgICAgLy8gcmF0aGVyIGEgc2ltcGxlIHN0YXRpYyB3aWRnZXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMKICAgICAgICAgIC8vIGFuIHJtYXJrZG93biBkb2N1bWVudCB0aGF0IGhhcyBydW50aW1lOnNoaW55IGFuZCB3aWRnZXQKICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8KICAgICAgICAgIC8vIGNhbGwgcmVzaXplIGhhbmRsZXJzIGZvciBTaGlueSBvdXRwdXRzLCBub3QgZm9yIHN0YXRpYwogICAgICAgICAgLy8gd2lkZ2V0cywgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgInNob3duLmh0bWx3aWRnZXRzIHNob3duLmJzLnRhYi5odG1sd2lkZ2V0cyBzaG93bi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigKICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwKICAgICAgICAgICAgICByZXNpemVIYW5kbGVyCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlIG9mIGlvc2xpZGVzLCB3aGljaAogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLgogICAgICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBub3QgaGF2ZSB0byBoYXZlIGlvc2xpZGUtc3BlY2lmaWMgY29kZQogICAgICAgICAgLy8gaGVyZSwgYnV0IHJhdGhlciBoYXZlIGlvc2xpZGVzIHJhaXNlIGEgZ2VuZXJpYyBldmVudCwKICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlCiAgICAgICAgICAvLyB3aW5kb3cgdG8gZ2V0dGluZyB0aGF0IGZpeGVkIG1heSBiZSBsb25nLgogICAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAvLyBicm93c2VycyBiZWNhdXNlIGlvc2xpZGVzIGl0c2VsZiBvbmx5IHN1cHBvcnRzCiAgICAgICAgICAgIC8vIHN1Y2ggYnJvd3NlcnMuCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlbGVhdmUiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHREYXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vanNvbiddIik7CiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsKICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzY3JpcHREYXRhLnRleHRDb250ZW50IHx8IHNjcmlwdERhdGEudGV4dCk7CiAgICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBkYXRhLmV2YWxzICYmIGsgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNba10pOwogICAgICAgICAgfQogICAgICAgICAgYmluZGluZy5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBpbml0UmVzdWx0KTsKICAgICAgICAgIGV2YWxBbmRSdW4oZGF0YS5qc0hvb2tzLnJlbmRlciwgaW5pdFJlc3VsdCwgW2VsLCBkYXRhLnhdKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAgaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCk7CiAgfQoKICAvLyBXYWl0IHVudGlsIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIHRvIHJlbmRlciB0aGUgd2lkZ2V0cy4KICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgYXJndW1lbnRzLmNhbGxlZSwgZmFsc2UpOwogICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICB9LCBmYWxzZSk7CiAgfSBlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgewogICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgewogICAgICAgIGRvY3VtZW50LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0KCgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRBdHRhY2htZW50VXJsID0gZnVuY3Rpb24oZGVwbmFtZSwga2V5KSB7CiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0KICAgIGlmICh0eXBlb2Yoa2V5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgIGtleSA9IDE7CgogICAgdmFyIGxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkZXBuYW1lICsgIi0iICsga2V5ICsgIi1hdHRhY2htZW50Iik7CiAgICBpZiAoIWxpbmspIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsKICAgIH0KICAgIHJldHVybiBsaW5rLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzID0gZnVuY3Rpb24oZGYpIHsKICAgIHZhciBuYW1lcyA9IFtdOwogICAgdmFyIGxlbmd0aDsKICAgIGZvciAodmFyIG5hbWUgaW4gZGYpIHsKICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpCiAgICAgICAgICAgIG5hbWVzLnB1c2gobmFtZSk7CiAgICAgICAgaWYgKHR5cGVvZihkZltuYW1lXSkgIT09ICJvYmplY3QiIHx8IHR5cGVvZihkZltuYW1lXS5sZW5ndGgpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihsZW5ndGgpICE9PSAidW5kZWZpbmVkIiAmJiBsZW5ndGggIT09IGRmW25hbWVdLmxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIik7CiAgICAgICAgfQogICAgICAgIGxlbmd0aCA9IGRmW25hbWVdLmxlbmd0aDsKICAgIH0KICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgaXRlbTsKICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IGxlbmd0aDsgcm93KyspIHsKICAgICAgICBpdGVtID0ge307CiAgICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgbmFtZXMubGVuZ3RoOyBjb2wrKykgewogICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1dID0gZGZbbmFtZXNbY29sXV1bcm93XTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZW0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgewogICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gYXJyYXk7CiAgICAgIHZhciBuZXdBcnJheSA9IGFycmF5WzBdLm1hcChmdW5jdGlvbihjb2wsIGkpIHsKICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJvd1tpXQogICAgICAgICAgfSkKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXdBcnJheTsKICB9OwogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkCiAgLy8gdXNpbmcgZXNjYXBlQ2hhci4gQW55IG90aGVyIGNoYXJhY3RlcnMgZXNjYXBlZCBieSBlc2NhcGVDaGFyCiAgLy8gd2lsbCBiZSBpbmNsdWRlZCBhcyB1c3VhbCAoaW5jbHVkaW5nIGVzY2FwZUNoYXIgaXRzZWxmKS4KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOwogICAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgdmFsdWUubGVuZ3RoOyBwb3MrKykgewogICAgICBpZiAoIWVzY2FwZU1vZGUpIHsKICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7CiAgICAgICAgICBlc2NhcGVNb2RlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoY3VycmVudFJlc3VsdCAhPT0gIiIpIHsKICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUKICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIgPSBmdW5jdGlvbihvLCBtZW1iZXIpIHsKICAgIHZhciBwYXJ0cyA9IHNwbGl0V2l0aEVzY2FwZShtZW1iZXIsICcuJywgJ1xcJyk7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOwogICAgICAvLyBwYXJ0IG1heSBiZSBhIGNoYXJhY3RlciBvciAnbnVtZXJpYycgbWVtYmVyIG5hbWUKICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgewogICAgICAgIGlmIChpID09IChsIC0gMSkpIHsgLy8gaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgdGhlbiBldmFsdWxhdGUKICAgICAgICAgIGlmICh0eXBlb2Ygb1twYXJ0XSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOwogICAgICAgIH0gZWxzZSB7IC8vIG90aGVyd2lzZSBjb250aW51ZSB0byBuZXh0IGVtYmVkZGVkIG9iamVjdAogICAgICAgICAgbyA9IG9bcGFydF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCiAgLy8gUmV0cmlldmUgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZiBhbgogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZS4KICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbihlbCkgewogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsKICB9OwoKICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwKICAvLyBhbmQgcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUKICAvLyBzZWxlY3Rvciwgb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgaGFzIG5vIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBlbCA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgaWYgKGVsID09PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7CiAgICB9CiAgfTsKCiAgLy8gRmluZHMgYWxsIGVsZW1lbnRzIGluIHRoZSBzY29wZSB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciwgYW5kCiAgLy8gcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZXMgKGkuZS4gdGhlIHJldHVybiB2YWx1ZXMgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudHMsIGluIGFuIGFycmF5LiBJZiBlbGVtZW50cyB0aGF0CiAgLy8gbWF0Y2ggdGhlIHNlbGVjdG9yIGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgIHZhciByZXN1bHRzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHZhciBwb3N0UmVuZGVySGFuZGxlcnMgPSBbXTsKICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7CiAgICB3aGlsZSAocG9zdFJlbmRlckhhbmRsZXJzLmxlbmd0aCkgewogICAgICB2YXIgaGFuZGxlciA9IHBvc3RSZW5kZXJIYW5kbGVycy5zaGlmdCgpOwogICAgICBpZiAoaGFuZGxlcikgewogICAgICAgIGhhbmRsZXIoKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlCiAgLy8gbmV4dCB0aW1lIHN0YXRpYyB3aWRnZXRzIGFyZSByZW5kZXJlZC4KICB3aW5kb3cuSFRNTFdpZGdldHMuYWRkUG9zdFJlbmRlckhhbmRsZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOwogIH07CgogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuCiAgLy8gb2xkLXN0eWxlIGNsYXNzLWJvdW5kIGRlZmluaXRpb24uIFRoaXMgc2F2ZXMgdXMgZnJvbSBoYXZpbmcKICAvLyB0byByZXdyaXRlIGFsbCB0aGUgbG9naWMgaW4gdGhpcyBmaWxlIHRvIGFjY29tb2RhdGUgYm90aAogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLgogIGZ1bmN0aW9uIGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZm4pIHsKICAgIHZhciByZXN1bHQgPSB7CiAgICAgIG5hbWU6IGRlZm4ubmFtZSwKICAgICAgdHlwZTogZGVmbi50eXBlLAogICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOwogICAgICB9LAogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHgsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOwogICAgICB9LAogICAgICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgIH0KICAgIH07CgogICAgaWYgKGRlZm4uZmluZCkKICAgICAgcmVzdWx0LmZpbmQgPSBkZWZuLmZpbmQ7CiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikKICAgICAgcmVzdWx0LnJlbmRlckVycm9yID0gZGVmbi5yZW5kZXJFcnJvcjsKICAgIGlmIChkZWZuLmNsZWFyRXJyb3IpCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9KSgpOwoK"></script>
<link href="data:text/css;charset=utf-8,%40charset%20%22UTF%2D8%22%3B%2Ehandsontable%7Bposition%3Arelative%7D%2Ehandsontable%20%2Ehide%7Bdisplay%3Anone%7D%2Ehandsontable%20%2Erelative%7Bposition%3Arelative%7D%2Ehandsontable%2EhtAutoSize%7Bvisibility%3Ahidden%3Bleft%3A%2D99000px%3Bposition%3Aabsolute%3Btop%3A%2D99000px%7D%2Ehandsontable%20%2EwtHider%7Bwidth%3A0%7D%2Ehandsontable%20%2EwtSpreader%7Bposition%3Arelative%3Bwidth%3A0%3Bheight%3Aauto%7D%2Ehandsontable%20table%2C%2Ehandsontable%20tbody%2C%2Ehandsontable%20thead%2C%2Ehandsontable%20td%2C%2Ehandsontable%20th%2C%2Ehandsontable%20input%2C%2Ehandsontable%20textarea%2C%2Ehandsontable%20div%7Bbox%2Dsizing%3Acontent%2Dbox%3B%2Dwebkit%2Dbox%2Dsizing%3Acontent%2Dbox%3B%2Dmoz%2Dbox%2Dsizing%3Acontent%2Dbox%7D%2Ehandsontable%20input%2C%2Ehandsontable%20textarea%7Bmin%2Dheight%3Ainitial%7D%2Ehandsontable%20table%2EhtCore%7Bborder%2Dcollapse%3Aseparate%3Bborder%2Dspacing%3A0%3Bmargin%3A0%3Bborder%2Dwidth%3A0%3Btable%2Dlayout%3Afixed%3Bwidth%3A0%3Boutline%2Dwidth%3A0%3Bmax%2Dwidth%3Anone%3Bmax%2Dheight%3Anone%7D%2Ehandsontable%20col%7Bwidth%3A50px%7D%2Ehandsontable%20col%2ErowHeader%7Bwidth%3A50px%7D%2Ehandsontable%20th%2C%2Ehandsontable%20td%7Bborder%2Dtop%2Dwidth%3A0%3Bborder%2Dleft%2Dwidth%3A0%3Bborder%2Dright%3A1px%20solid%20%23CCC%3Bborder%2Dbottom%3A1px%20solid%20%23CCC%3Bheight%3A22px%3Bempty%2Dcells%3Ashow%3Bline%2Dheight%3A21px%3Bpadding%3A0%204px%200%204px%3Bbackground%2Dcolor%3A%23FFF%3Bvertical%2Dalign%3Atop%3Boverflow%3Ahidden%3Boutline%2Dwidth%3A0%3Bwhite%2Dspace%3Apre%2Dline%7D%2Ehandsontable%20td%2EhtInvalid%7Bbackground%2Dcolor%3A%23ff4c42%21important%7D%2Ehandsontable%20td%2EhtNoWrap%7Bwhite%2Dspace%3Anowrap%7D%2Ehandsontable%20th%3Alast%2Dchild%7Bborder%2Dright%3A1px%20solid%20%23CCC%3Bborder%2Dbottom%3A1px%20solid%20%23CCC%7D%2Ehandsontable%20tr%3Afirst%2Dchild%20th%2EhtNoFrame%2C%2Ehandsontable%20th%3Afirst%2Dchild%2EhtNoFrame%2C%2Ehandsontable%20th%2EhtNoFrame%7Bborder%2Dleft%2Dwidth%3A0%3Bbackground%2Dcolor%3Awhite%3Bborder%2Dcolor%3A%23FFF%7D%2Ehandsontable%20th%3Afirst%2Dchild%2C%2Ehandsontable%20td%3Afirst%2Dof%2Dtype%2C%2Ehandsontable%20%2EhtNoFrame%2Bth%2C%2Ehandsontable%20%2EhtNoFrame%2Btd%7Bborder%2Dleft%3A1px%20solid%20%23CCC%7D%2Ehandsontable%2EhtRowHeaders%20thead%20tr%20th%3Anth%2Dchild%282%29%7Bborder%2Dleft%3A1px%20solid%20%23CCC%7D%2Ehandsontable%20tr%3Afirst%2Dchild%20th%2C%2Ehandsontable%20tr%3Afirst%2Dchild%20td%7Bborder%2Dtop%3A1px%20solid%20%23CCC%7D%2Eht%5Fmaster%3Anot%28%2EinnerBorderLeft%29%20%7E%20%2Ehandsontable%20tbody%20tr%20th%2C%2Eht%5Fmaster%3Anot%28%2EinnerBorderLeft%29%20%7E%20%2Ehandsontable%3Anot%28%2Eht%5Fclone%5Ftop%29%20thead%20tr%20th%3Afirst%2Dchild%7Bborder%2Dright%2Dwidth%3A0%7D%2Eht%5Fmaster%3Anot%28%2EinnerBorderTop%29%20thead%20tr%3Alast%2Dchild%20th%2C%2Eht%5Fmaster%3Anot%28%2EinnerBorderTop%29%20%7E%20%2Ehandsontable%20thead%20tr%3Alast%2Dchild%20th%2C%2Eht%5Fmaster%3Anot%28%2EinnerBorderTop%29%20thead%20tr%2ElastChild%20th%2C%2Eht%5Fmaster%3Anot%28%2EinnerBorderTop%29%20%7E%20%2Ehandsontable%20thead%20tr%2ElastChild%20th%7Bborder%2Dbottom%2Dwidth%3A0%7D%2Ehandsontable%20th%7Bbackground%2Dcolor%3A%23EEE%3Bcolor%3A%23222%3Btext%2Dalign%3Acenter%3Bfont%2Dweight%3Anormal%3Bwhite%2Dspace%3Anowrap%7D%2Ehandsontable%20thead%20th%7Bpadding%3A0%7D%2Ehandsontable%20th%2Eactive%7Bbackground%2Dcolor%3A%23CCC%7D%2Ehandsontable%20thead%20th%20%2Erelative%7Bpadding%3A2px%204px%7D%2Ehandsontable%20%2EmanualColumnMover%7Bposition%3Afixed%3Bleft%3A0%3Btop%3A0%3Bbackground%2Dcolor%3Atransparent%3Bwidth%3A5px%3Bheight%3A25px%3Bz%2Dindex%3A999%3Bcursor%3Amove%7D%2Ehandsontable%20%2EmanualRowMover%7Bposition%3Afixed%3Bleft%3A%2D4px%3Btop%3A0%3Bbackground%2Dcolor%3Atransparent%3Bheight%3A5px%3Bwidth%3A50px%3Bz%2Dindex%3A999%3Bcursor%3Amove%7D%2Ehandsontable%20%2EmanualColumnMoverGuide%2C%2Ehandsontable%20%2EmanualRowMoverGuide%7Bposition%3Afixed%3Bleft%3A0%3Btop%3A0%3Bbackground%2Dcolor%3A%23CCC%3Bwidth%3A25px%3Bheight%3A25px%3Bopacity%3A%2E7%3Bdisplay%3Anone%7D%2Ehandsontable%20%2EmanualColumnMoverGuide%2Eactive%2C%2Ehandsontable%20%2EmanualRowMoverGuide%2Eactive%7Bdisplay%3Ablock%3Bz%2Dindex%3A199%7D%2Ehandsontable%20%2EmanualColumnMover%3Ahover%2C%2Ehandsontable%20%2EmanualColumnMover%2Eactive%2C%2Ehandsontable%20%2EmanualRowMover%3Ahover%2C%2Ehandsontable%20%2EmanualRowMover%2Eactive%7Bbackground%2Dcolor%3A%2388F%7D%2Ehandsontable%20%2EmanualColumnResizer%7Bposition%3Afixed%3Btop%3A0%3Bcursor%3Acol%2Dresize%3Bz%2Dindex%3A110%3Bwidth%3A5px%3Bheight%3A25px%7D%2Ehandsontable%20%2EmanualRowResizer%7Bposition%3Afixed%3Bleft%3A0%3Bcursor%3Arow%2Dresize%3Bz%2Dindex%3A110%3Bheight%3A5px%3Bwidth%3A50px%7D%2Ehandsontable%20%2EmanualColumnResizer%3Ahover%2C%2Ehandsontable%20%2EmanualColumnResizer%2Eactive%2C%2Ehandsontable%20%2EmanualRowResizer%3Ahover%2C%2Ehandsontable%20%2EmanualRowResizer%2Eactive%7Bbackground%2Dcolor%3A%23AAB%7D%2Ehandsontable%20%2EmanualColumnResizerGuide%7Bposition%3Afixed%3Bright%3A0%3Btop%3A0%3Bbackground%2Dcolor%3A%23AAB%3Bdisplay%3Anone%3Bwidth%3A0%3Bborder%2Dright%3A1px%20dashed%20%23777%3Bmargin%2Dleft%3A5px%7D%2Ehandsontable%20%2EmanualRowResizerGuide%7Bposition%3Afixed%3Bleft%3A0%3Bbottom%3A0%3Bbackground%2Dcolor%3A%23AAB%3Bdisplay%3Anone%3Bheight%3A0%3Bborder%2Dbottom%3A1px%20dashed%20%23777%3Bmargin%2Dtop%3A5px%7D%2Ehandsontable%20%2EmanualColumnResizerGuide%2Eactive%2C%2Ehandsontable%20%2EmanualRowResizerGuide%2Eactive%7Bdisplay%3Ablock%3Bz%2Dindex%3A199%7D%2Ehandsontable%20%2EcolumnSorting%7Bposition%3Arelative%7D%2Ehandsontable%20%2EcolumnSorting%3Ahover%7Btext%2Ddecoration%3Aunderline%3Bcursor%3Apointer%7D%2Ehandsontable%20%2EcolumnSorting%2Eascending%3A%3Aafter%7Bcontent%3A%27%5C25B2%27%3Bcolor%3A%235f5f5f%3Bposition%3Aabsolute%3Bright%3A%2D15px%7D%2Ehandsontable%20%2EcolumnSorting%2Edescending%3A%3Aafter%7Bcontent%3A%27%5C25BC%27%3Bcolor%3A%235f5f5f%3Bposition%3Aabsolute%3Bright%3A%2D15px%7D%2Ehandsontable%20th%2EbeforeHiddenColumn%7Bposition%3Arelative%7D%2Ehandsontable%20th%2EbeforeHiddenColumn%3A%3Aafter%2C%2Ehandsontable%20th%2EafterHiddenColumn%3A%3Abefore%7Bcontent%3A%27%5C25C0%27%3Bcolor%3A%23bbb%3Bposition%3Aabsolute%3Bright%3A1px%3Btop%3A2px%3Bfont%2Dsize%3A5pt%7D%2Ehandsontable%20th%2EafterHiddenColumn%7Bposition%3Arelative%7D%2Ehandsontable%20th%2EafterHiddenColumn%3A%3Abefore%7Bleft%3A1px%3Btop%3A2px%3Bright%3Aauto%3Bcontent%3A%27%5C25B6%27%7D%2Ehandsontable%20td%2EafterHiddenColumn%2EfirstVisible%7Bborder%2Dleft%3A1px%20solid%20%23CCC%7D%2Ehandsontable%20thead%20th%2EhiddenHeader%7Bdisplay%3Anone%7D%2Ehandsontable%20%2EwtBorder%7Bposition%3Aabsolute%3Bfont%2Dsize%3A0%7D%2Ehandsontable%20%2EwtBorder%2Ehidden%7Bdisplay%3Anone%21important%7D%2Ehandsontable%20td%2Earea%7Bbackground%3A%2Dmoz%2Dlinear%2Dgradient%28top%2Crgba%28181%2C209%2C255%2C0%2E34%29%200%2Crgba%28181%2C209%2C255%2C0%2E34%29%20100%25%29%3Bbackground%3A%2Dwebkit%2Dgradient%28linear%2Cleft%20top%2Cleft%20bottom%2Ccolor%2Dstop%280%25%2Crgba%28181%2C209%2C255%2C0%2E34%29%29%2Ccolor%2Dstop%28100%25%2Crgba%28181%2C209%2C255%2C0%2E34%29%29%29%3Bbackground%3A%2Dwebkit%2Dlinear%2Dgradient%28top%2Crgba%28181%2C209%2C255%2C0%2E34%29%200%2Crgba%28181%2C209%2C255%2C0%2E34%29%20100%25%29%3Bbackground%3A%2Do%2Dlinear%2Dgradient%28top%2Crgba%28181%2C209%2C255%2C0%2E34%29%200%2Crgba%28181%2C209%2C255%2C0%2E34%29%20100%25%29%3Bbackground%3A%2Dms%2Dlinear%2Dgradient%28top%2Crgba%28181%2C209%2C255%2C0%2E34%29%200%2Crgba%28181%2C209%2C255%2C0%2E34%29%20100%25%29%3Bbackground%3Alinear%2Dgradient%28to%20bottom%2Crgba%28181%2C209%2C255%2C0%2E34%29%200%2Crgba%28181%2C209%2C255%2C0%2E34%29%20100%25%29%3Bfilter%3Aprogid%3ADXImageTransform%2EMicrosoft%2Egradient%28startColorstr%3D%27%2357b5d1ff%27%2CendColorstr%3D%27%2357b5d1ff%27%2CGradientType%3D0%29%3Bbackground%2Dcolor%3A%23fff%7D%2Ehandsontable%20%2EwtBorder%2Ecorner%7Bfont%2Dsize%3A0%3Bcursor%3Acrosshair%7D%2Ehandsontable%20%2EhtBorder%2EhtFillBorder%7Bbackground%3Ared%3Bwidth%3A1px%3Bheight%3A1px%7D%2EhandsontableInput%7Bborder%3A0%3Boutline%2Dwidth%3A0%3Bmargin%3A0%3Bpadding%3A1px%205px%200%205px%3Bfont%2Dfamily%3Ainherit%3Bline%2Dheight%3A21px%3Bfont%2Dsize%3Ainherit%3Bbox%2Dshadow%3A0%200%200%202px%20%235292f7%20inset%3Bresize%3Anone%3Bdisplay%3Ainline%2Dblock%3Bcolor%3A%23000%3Bborder%2Dradius%3A0%3Bbackground%2Dcolor%3A%23FFF%7D%2EhandsontableInputHolder%7Bposition%3Aabsolute%3Btop%3A0%3Bleft%3A0%3Bz%2Dindex%3A100%7D%2EhtSelectEditor%7B%2Dwebkit%2Dappearance%3Amenulist%2Dbutton%21important%3Bposition%3Aabsolute%3Bwidth%3Aauto%7D%2Ehandsontable%20%2EhtDimmed%7Bcolor%3A%23777%7D%2Ehandsontable%20%2EhtSubmenu%7Bposition%3Arelative%7D%2Ehandsontable%20%2EhtSubmenu%20%3Aafter%7Bcontent%3A%27%E2%96%B6%27%3Bcolor%3A%23777%3Bposition%3Aabsolute%3Bright%3A5px%7D%2Ehandsontable%20%2EhtLeft%7Btext%2Dalign%3Aleft%7D%2Ehandsontable%20%2EhtCenter%7Btext%2Dalign%3Acenter%7D%2Ehandsontable%20%2EhtRight%7Btext%2Dalign%3Aright%7D%2Ehandsontable%20%2EhtJustify%7Btext%2Dalign%3Ajustify%7D%2Ehandsontable%20%2EhtTop%7Bvertical%2Dalign%3Atop%7D%2Ehandsontable%20%2EhtMiddle%7Bvertical%2Dalign%3Amiddle%7D%2Ehandsontable%20%2EhtBottom%7Bvertical%2Dalign%3Abottom%7D%2Ehandsontable%20%2EhtPlaceholder%7Bcolor%3A%23999%7D%2Ehandsontable%20%2EhtAutocompleteArrow%7Bfloat%3Aright%3Bfont%2Dsize%3A10px%3Bcolor%3A%23EEE%3Bcursor%3Adefault%3Bwidth%3A16px%3Btext%2Dalign%3Acenter%7D%2Ehandsontable%20td%20%2EhtAutocompleteArrow%3Ahover%7Bcolor%3A%23777%7D%2Ehandsontable%20td%2Earea%20%2EhtAutocompleteArrow%7Bcolor%3A%23d3d3d3%7D%2Ehandsontable%20%2EhtCheckboxRendererInput%7Bdisplay%3Ainline%2Dblock%3Bvertical%2Dalign%3Amiddle%7D%2Ehandsontable%20%2EhtCheckboxRendererInput%2EnoValue%7Bopacity%3A%2E5%7D%2Ehandsontable%20%2EhtCheckboxRendererLabel%7Bcursor%3Apointer%3Bdisplay%3Ainline%2Dblock%3Bwidth%3A100%25%7D%2EhtCommentCell%7Bposition%3Arelative%7D%2EhtCommentCell%3Aafter%7Bcontent%3A%27%27%3Bposition%3Aabsolute%3Btop%3A0%3Bright%3A0%3Bborder%2Dleft%3A6px%20solid%20transparent%3Bborder%2Dtop%3A6px%20solid%20red%7D%40%2Dwebkit%2Dkeyframes%20opacity%2Dhide%7Bfrom%7Bopacity%3A1%7Dto%7Bopacity%3A0%7D%7D%40keyframes%20opacity%2Dhide%7Bfrom%7Bopacity%3A1%7Dto%7Bopacity%3A0%7D%7D%40%2Dwebkit%2Dkeyframes%20opacity%2Dshow%7Bfrom%7Bopacity%3A0%7Dto%7Bopacity%3A1%7D%7D%40keyframes%20opacity%2Dshow%7Bfrom%7Bopacity%3A0%7Dto%7Bopacity%3A1%7D%7D%2Ehandsontable%20%2Ehandsontable%2Eht%5Fclone%5Ftop%20%2EwtHider%7Bpadding%3A0%200%205px%200%7D%2Ehandsontable%20%2EautocompleteEditor%2Ehandsontable%7Bpadding%2Dright%3A17px%7D%2Ehandsontable%20%2EautocompleteEditor%2Ehandsontable%2EhtMacScroll%7Bpadding%2Dright%3A15px%7D%2Ehandsontable%2Elistbox%7Bmargin%3A0%7D%2Ehandsontable%2Elistbox%20%2Eht%5Fmaster%20table%7Bborder%3A1px%20solid%20%23ccc%3Bborder%2Dcollapse%3Aseparate%3Bbackground%3Awhite%7D%2Ehandsontable%2Elistbox%20th%2C%2Ehandsontable%2Elistbox%20tr%3Afirst%2Dchild%20th%2C%2Ehandsontable%2Elistbox%20tr%3Alast%2Dchild%20th%2C%2Ehandsontable%2Elistbox%20tr%3Afirst%2Dchild%20td%2C%2Ehandsontable%2Elistbox%20td%7Bborder%2Dcolor%3Atransparent%7D%2Ehandsontable%2Elistbox%20th%2C%2Ehandsontable%2Elistbox%20td%7Bwhite%2Dspace%3Anowrap%3Btext%2Doverflow%3Aellipsis%7D%2Ehandsontable%2Elistbox%20td%2EhtDimmed%7Bcursor%3Adefault%3Bcolor%3Ainherit%3Bfont%2Dstyle%3Ainherit%7D%2Ehandsontable%2Elistbox%20%2EwtBorder%7Bvisibility%3Ahidden%7D%2Ehandsontable%2Elistbox%20tr%20td%2Ecurrent%2C%2Ehandsontable%2Elistbox%20tr%3Ahover%20td%7Bbackground%3A%23eee%7D%2Eht%5Fclone%5Ftop%7Bz%2Dindex%3A101%7D%2Eht%5Fclone%5Fleft%7Bz%2Dindex%3A102%7D%2Eht%5Fclone%5Ftop%5Fleft%5Fcorner%2C%2Eht%5Fclone%5Fbottom%5Fleft%5Fcorner%7Bz%2Dindex%3A103%7D%2Eht%5Fclone%5Fdebug%7Bz%2Dindex%3A103%7D%2Ehandsontable%20td%2EhtSearchResult%7Bbackground%3A%23fcedd9%3Bcolor%3A%23583707%7D%2EhtBordered%7Bborder%2Dwidth%3A1px%7D%2EhtBordered%2EhtTopBorderSolid%7Bborder%2Dtop%2Dstyle%3Asolid%3Bborder%2Dtop%2Dcolor%3A%23000%7D%2EhtBordered%2EhtRightBorderSolid%7Bborder%2Dright%2Dstyle%3Asolid%3Bborder%2Dright%2Dcolor%3A%23000%7D%2EhtBordered%2EhtBottomBorderSolid%7Bborder%2Dbottom%2Dstyle%3Asolid%3Bborder%2Dbottom%2Dcolor%3A%23000%7D%2EhtBordered%2EhtLeftBorderSolid%7Bborder%2Dleft%2Dstyle%3Asolid%3Bborder%2Dleft%2Dcolor%3A%23000%7D%2EhtCommentTextArea%7B%2Dmoz%2Dbox%2Dshadow%3A1px%201px%202px%20%23bbb%3B%2Dwebkit%2Dbox%2Dshadow%3A1px%201px%202px%20%23bbb%3Bbackground%2Dcolor%3A%23fffacd%3Bborder%3A1px%20solid%20%23999%3Bbox%2Dshadow%3A1px%201px%202px%20%23bbb%3Bfont%2Dfamily%3A%27Arial%27%7D%2Ehandsontable%20tbody%20tr%20th%3Anth%2Dlast%2Dchild%282%29%7Bborder%2Dright%3A1px%20solid%20%23CCC%7D%2Ehandsontable%20thead%20tr%3Anth%2Dlast%2Dchild%282%29%20th%2EhtGroupIndicatorContainer%7Bborder%2Dbottom%3A1px%20solid%20%23CCC%3Bpadding%2Dbottom%3A5px%7D%2Eht%5Fclone%5Ftop%5Fleft%5Fcorner%20thead%20tr%20th%3Anth%2Dlast%2Dchild%282%29%7Bborder%2Dright%3A1px%20solid%20%23CCC%7D%2EhtCollapseButton%7Bwidth%3A10px%3Bheight%3A10px%3Bline%2Dheight%3A10px%3Btext%2Dalign%3Acenter%3Bborder%2Dradius%3A5px%3Bborder%3A1px%20solid%20%23f3f3f3%3B%2Dwebkit%2Dbox%2Dshadow%3A1px%201px%203px%20rgba%280%2C0%2C0%2C0%2E4%29%3Bbox%2Dshadow%3A1px%201px%203px%20rgba%280%2C0%2C0%2C0%2E4%29%3Bcursor%3Apointer%3Bmargin%2Dbottom%3A3px%3Bposition%3Arelative%7D%2EhtCollapseButton%3Aafter%7Bcontent%3A%22%22%3Bheight%3A300%25%3Bwidth%3A1px%3Bdisplay%3Ablock%3Bbackground%3A%23ccc%3Bmargin%2Dleft%3A4px%3Bposition%3Aabsolute%3Bbottom%3A10px%7Dthead%20%2EhtCollapseButton%7Bright%3A5px%3Bposition%3Aabsolute%3Btop%3A5px%3Bbackground%3A%23fff%7Dthead%20%2EhtCollapseButton%3Aafter%7Bheight%3A1px%3Bwidth%3A700%25%3Bright%3A10px%3Btop%3A4px%7D%2Ehandsontable%20tr%20th%20%2EhtExpandButton%7Bposition%3Aabsolute%3Bwidth%3A10px%3Bheight%3A10px%3Bline%2Dheight%3A10px%3Btext%2Dalign%3Acenter%3Bborder%2Dradius%3A5px%3Bborder%3A1px%20solid%20%23f3f3f3%3B%2Dwebkit%2Dbox%2Dshadow%3A1px%201px%203px%20rgba%280%2C0%2C0%2C0%2E4%29%3Bbox%2Dshadow%3A1px%201px%203px%20rgba%280%2C0%2C0%2C0%2E4%29%3Bcursor%3Apointer%3Btop%3A0%3Bdisplay%3Anone%7D%2Ehandsontable%20thead%20tr%20th%20%2EhtExpandButton%7Btop%3A5px%7D%2Ehandsontable%20tr%20th%20%2EhtExpandButton%2Eclickable%7Bdisplay%3Ablock%7D%2EcollapsibleIndicator%7Bposition%3Aabsolute%3Btop%3A50%25%3Btransform%3Atranslate%280%25%2C%2D50%25%29%3Bright%3A5px%3Bborder%3A1px%20solid%20%23a6a6a6%3Bline%2Dheight%3A10px%3Bcolor%3A%23222%3Bborder%2Dradius%3A10px%3Bfont%2Dsize%3A10px%3Bwidth%3A10px%3Bheight%3A10px%3Bcursor%3Apointer%3B%2Dwebkit%2Dbox%2Dshadow%3A0%200%200%206px%20rgba%28238%2C238%2C238%2C1%29%3B%2Dmoz%2Dbox%2Dshadow%3A0%200%200%206px%20rgba%28238%2C238%2C238%2C1%29%3Bbox%2Dshadow%3A0%200%200%206px%20rgba%28238%2C238%2C238%2C1%29%3Bbackground%3A%23eee%7D%2Ehandsontable%20col%2Ehidden%7Bwidth%3A0%21important%7D%2Ehandsontable%20table%20tr%20th%2ElightRightBorder%7Bborder%2Dright%3A1px%20solid%20%23e6e6e6%7D%2Ehandsontable%20tr%2Ehidden%2C%2Ehandsontable%20tr%2Ehidden%20td%2C%2Ehandsontable%20tr%2Ehidden%20th%7Bdisplay%3Anone%7D%2Eht%5Fmaster%2C%2Eht%5Fclone%5Fleft%2C%2Eht%5Fclone%5Ftop%2C%2Eht%5Fclone%5Fbottom%7Boverflow%3Ahidden%7D%2Eht%5Fmaster%20%2EwtHolder%7Boverflow%3Aauto%7D%2Eht%5Fclone%5Fleft%20%2EwtHolder%7Boverflow%2Dx%3Ahidden%3Boverflow%2Dy%3Aauto%7D%2Eht%5Fclone%5Ftop%20%2EwtHolder%2C%2Eht%5Fclone%5Fbottom%20%2EwtHolder%7Boverflow%2Dx%3Aauto%3Boverflow%2Dy%3Ahidden%7D%2EwtDebugHidden%7Bdisplay%3Anone%7D%2EwtDebugVisible%7Bdisplay%3Ablock%3B%2Dwebkit%2Danimation%2Dduration%3A%2E5s%3B%2Dwebkit%2Danimation%2Dname%3AwtFadeInFromNone%3Banimation%2Dduration%3A%2E5s%3Banimation%2Dname%3AwtFadeInFromNone%7D%40keyframes%20wtFadeInFromNone%7B0%25%7Bdisplay%3Anone%3Bopacity%3A0%7D1%25%7Bdisplay%3Ablock%3Bopacity%3A0%7D100%25%7Bdisplay%3Ablock%3Bopacity%3A1%7D%7D%40%2Dwebkit%2Dkeyframes%20wtFadeInFromNone%7B0%25%7Bdisplay%3Anone%3Bopacity%3A0%7D1%25%7Bdisplay%3Ablock%3Bopacity%3A0%7D100%25%7Bdisplay%3Ablock%3Bopacity%3A1%7D%7D%2Ehandsontable%2Emobile%2C%2Ehandsontable%2Emobile%20%2EwtHolder%7B%2Dwebkit%2Dtouch%2Dcallout%3Anone%3B%2Dwebkit%2Duser%2Dselect%3Anone%3B%2Dkhtml%2Duser%2Dselect%3Anone%3B%2Dmoz%2Duser%2Dselect%3Anone%3B%2Dms%2Duser%2Dselect%3Anone%3Buser%2Dselect%3Anone%3B%2Dwebkit%2Dtap%2Dhighlight%2Dcolor%3Argba%280%2C0%2C0%2C0%29%3B%2Dwebkit%2Doverflow%2Dscrolling%3Atouch%7D%2EhtMobileEditorContainer%7Bdisplay%3Anone%3Bposition%3Aabsolute%3Btop%3A0%3Bwidth%3A70%25%3Bheight%3A54pt%3Bbackground%3A%23f8f8f8%3Bborder%2Dradius%3A20px%3Bborder%3A1px%20solid%20%23ebebeb%3Bz%2Dindex%3A999%3Bbox%2Dsizing%3Aborder%2Dbox%3B%2Dwebkit%2Dbox%2Dsizing%3Aborder%2Dbox%3B%2Dwebkit%2Dtext%2Dsize%2Dadjust%3Anone%7D%2EtopLeftSelectionHandle%3Anot%28%2Eht%5Fmaster%20%2EtopLeftSelectionHandle%29%2C%2EtopLeftSelectionHandle%2DHitArea%3Anot%28%2Eht%5Fmaster%20%2EtopLeftSelectionHandle%2DHitArea%29%7Bz%2Dindex%3A9999%7D%2EtopLeftSelectionHandle%2C%2EtopLeftSelectionHandle%2DHitArea%2C%2EbottomRightSelectionHandle%2C%2EbottomRightSelectionHandle%2DHitArea%7Bleft%3A%2D10000px%3Btop%3A%2D10000px%7D%2EhtMobileEditorContainer%2Eactive%7Bdisplay%3Ablock%7D%2EhtMobileEditorContainer%20%2Einputs%7Bposition%3Aabsolute%3Bright%3A210pt%3Bbottom%3A10pt%3Btop%3A10pt%3Bleft%3A14px%3Bheight%3A34pt%7D%2EhtMobileEditorContainer%20%2Einputs%20textarea%7Bfont%2Dsize%3A13pt%3Bborder%3A1px%20solid%20%23a1a1a1%3B%2Dwebkit%2Dappearance%3Anone%3B%2Dwebkit%2Dbox%2Dshadow%3Anone%3B%2Dmoz%2Dbox%2Dshadow%3Anone%3Bbox%2Dshadow%3Anone%3Bposition%3Aabsolute%3Bleft%3A14px%3Bright%3A14px%3Btop%3A0%3Bbottom%3A0%3Bpadding%3A7pt%7D%2EhtMobileEditorContainer%20%2EcellPointer%7Bposition%3Aabsolute%3Btop%3A%2D13pt%3Bheight%3A0%3Bwidth%3A0%3Bleft%3A30px%3Bborder%2Dleft%3A13pt%20solid%20transparent%3Bborder%2Dright%3A13pt%20solid%20transparent%3Bborder%2Dbottom%3A13pt%20solid%20%23ebebeb%7D%2EhtMobileEditorContainer%20%2EcellPointer%2Ehidden%7Bdisplay%3Anone%7D%2EhtMobileEditorContainer%20%2EcellPointer%3Abefore%7Bcontent%3A%27%27%3Bdisplay%3Ablock%3Bposition%3Aabsolute%3Btop%3A2px%3Bheight%3A0%3Bwidth%3A0%3Bleft%3A%2D13pt%3Bborder%2Dleft%3A13pt%20solid%20transparent%3Bborder%2Dright%3A13pt%20solid%20transparent%3Bborder%2Dbottom%3A13pt%20solid%20%23f8f8f8%7D%2EhtMobileEditorContainer%20%2EmoveHandle%7Bposition%3Aabsolute%3Btop%3A10pt%3Bleft%3A5px%3Bwidth%3A30px%3Bbottom%3A0%3Bcursor%3Amove%3Bz%2Dindex%3A9999%7D%2EhtMobileEditorContainer%20%2EmoveHandle%3Aafter%7Bcontent%3A%22%2E%2E%5Ca%2E%2E%5Ca%2E%2E%5Ca%2E%2E%22%3Bwhite%2Dspace%3Apre%3Bline%2Dheight%3A10px%3Bfont%2Dsize%3A20pt%3Bdisplay%3Ainline%2Dblock%3Bmargin%2Dtop%3A%2D8px%3Bcolor%3A%23ebebeb%7D%2EhtMobileEditorContainer%20%2EpositionControls%7Bwidth%3A205pt%3Bposition%3Aabsolute%3Bright%3A5pt%3Btop%3A0%3Bbottom%3A0%7D%2EhtMobileEditorContainer%20%2EpositionControls%3Ediv%7Bwidth%3A50pt%3Bheight%3A100%25%3Bfloat%3Aleft%7D%2EhtMobileEditorContainer%20%2EpositionControls%3Ediv%3Aafter%7Bcontent%3A%22%20%22%3Bdisplay%3Ablock%3Bwidth%3A15pt%3Bheight%3A15pt%3Btext%2Dalign%3Acenter%3Bline%2Dheight%3A50pt%7D%2EhtMobileEditorContainer%20%2EleftButton%3Aafter%2C%2EhtMobileEditorContainer%20%2ErightButton%3Aafter%2C%2EhtMobileEditorContainer%20%2EupButton%3Aafter%2C%2EhtMobileEditorContainer%20%2EdownButton%3Aafter%7Btransform%2Dorigin%3A5pt%205pt%3B%2Dwebkit%2Dtransform%2Dorigin%3A5pt%205pt%3Bmargin%3A21pt%200%200%2021pt%7D%2EhtMobileEditorContainer%20%2EleftButton%3Aafter%7Bborder%2Dtop%3A2px%20solid%20%23288ffe%3Bborder%2Dleft%3A2px%20solid%20%23288ffe%3B%2Dwebkit%2Dtransform%3Arotate%28%2D45deg%29%7D%2EhtMobileEditorContainer%20%2EleftButton%3Aactive%3Aafter%7Bborder%2Dcolor%3A%23cfcfcf%7D%2EhtMobileEditorContainer%20%2ErightButton%3Aafter%7Bborder%2Dtop%3A2px%20solid%20%23288ffe%3Bborder%2Dleft%3A2px%20solid%20%23288ffe%3B%2Dwebkit%2Dtransform%3Arotate%28135deg%29%7D%2EhtMobileEditorContainer%20%2ErightButton%3Aactive%3Aafter%7Bborder%2Dcolor%3A%23cfcfcf%7D%2EhtMobileEditorContainer%20%2EupButton%3Aafter%7Bborder%2Dtop%3A2px%20solid%20%23288ffe%3Bborder%2Dleft%3A2px%20solid%20%23288ffe%3B%2Dwebkit%2Dtransform%3Arotate%2845deg%29%7D%2EhtMobileEditorContainer%20%2EupButton%3Aactive%3Aafter%7Bborder%2Dcolor%3A%23cfcfcf%7D%2EhtMobileEditorContainer%20%2EdownButton%3Aafter%7Bborder%2Dtop%3A2px%20solid%20%23288ffe%3Bborder%2Dleft%3A2px%20solid%20%23288ffe%3B%2Dwebkit%2Dtransform%3Arotate%28225deg%29%7D%2EhtMobileEditorContainer%20%2EdownButton%3Aactive%3Aafter%7Bborder%2Dcolor%3A%23cfcfcf%7D%2Ehandsontable%2Ehide%2Dtween%7B%2Dwebkit%2Danimation%3Aopacity%2Dhide%20%2E3s%3Banimation%3Aopacity%2Dhide%20%2E3s%3Banimation%2Dfill%2Dmode%3Aforwards%3B%2Dwebkit%2Danimation%2Dfill%2Dmode%3Aforwards%7D%2Ehandsontable%2Eshow%2Dtween%7B%2Dwebkit%2Danimation%3Aopacity%2Dshow%20%2E3s%3Banimation%3Aopacity%2Dshow%20%2E3s%3Banimation%2Dfill%2Dmode%3Aforwards%3B%2Dwebkit%2Danimation%2Dfill%2Dmode%3Aforwards%7D%2EhtContextMenu%7Bdisplay%3Anone%3Bposition%3Aabsolute%3Bz%2Dindex%3A1060%7D%2EhtContextMenu%20%2Eht%5Fclone%5Ftop%2C%2EhtContextMenu%20%2Eht%5Fclone%5Fleft%2C%2EhtContextMenu%20%2Eht%5Fclone%5Fcorner%2C%2EhtContextMenu%20%2Eht%5Fclone%5Fdebug%7Bdisplay%3Anone%7D%2EhtContextMenu%20table%2EhtCore%7Bborder%3A1px%20solid%20%23bbb%3Bborder%2Dbottom%2Dwidth%3A2px%3Bborder%2Dright%2Dwidth%3A2px%7D%2EhtContextMenu%20%2EwtBorder%7Bvisibility%3Ahidden%7D%2EhtContextMenu%20table%20tbody%20tr%20td%7Bbackground%3Awhite%3Bborder%2Dwidth%3A0%3Bpadding%3A4px%206px%200%206px%3Bcursor%3Apointer%3Boverflow%3Ahidden%3Bwhite%2Dspace%3Anowrap%3Btext%2Doverflow%3Aellipsis%7D%2EhtContextMenu%20table%20tbody%20tr%20td%3Afirst%2Dchild%7Bborder%3A0%7D%2EhtContextMenu%20table%20tbody%20tr%20td%2EhtDimmed%7Bfont%2Dstyle%3Anormal%3Bcolor%3A%23323232%7D%2EhtContextMenu%20table%20tbody%20tr%20td%2Ecurrent%2C%2EhtContextMenu%20table%20tbody%20tr%20td%2Ezeroclipboard%2Dis%2Dhover%7Bbackground%3A%23e9e9e9%7D%2EhtContextMenu%20table%20tbody%20tr%20td%2EhtSeparator%7Bborder%2Dtop%3A1px%20solid%20%23bbb%3Bheight%3A0%3Bpadding%3A0%3Bcursor%3Adefault%7D%2EhtContextMenu%20table%20tbody%20tr%20td%2EhtDisabled%7Bcolor%3A%23999%7D%2EhtContextMenu%20table%20tbody%20tr%20td%2EhtDisabled%3Ahover%7Bbackground%3A%23fff%3Bcolor%3A%23999%3Bcursor%3Adefault%7D%2EhtContextMenu%20table%20tbody%20tr%2EhtHidden%7Bdisplay%3Anone%7D%2EhtContextMenu%20table%20tbody%20tr%20td%20%2EhtItemWrapper%7Bmargin%2Dleft%3A10px%3Bmargin%2Dright%3A6px%7D%2EhtContextMenu%20table%20tbody%20tr%20td%20div%20span%2Eselected%7Bmargin%2Dtop%3A%2D2px%3Bposition%3Aabsolute%3Bleft%3A4px%7D%2EhtContextMenu%20%2Eht%5Fmaster%20%2EwtHolder%7Boverflow%3Ahidden%7D%2Epika%2Dsingle%7Bz%2Dindex%3A9999%3Bdisplay%3Ablock%3Bposition%3Arelative%3Bcolor%3A%23333%3Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%23ccc%3Bborder%2Dbottom%2Dcolor%3A%23bbb%3Bfont%2Dfamily%3A%22Helvetica%20Neue%22%2CHelvetica%2CArial%2Csans%2Dserif%7D%2Epika%2Dsingle%3Abefore%2C%2Epika%2Dsingle%3Aafter%7Bcontent%3A%22%20%22%3Bdisplay%3Atable%7D%2Epika%2Dsingle%3Aafter%7Bclear%3Aboth%7D%2Epika%2Dsingle%7B%2Azoom%3A1%7D%2Epika%2Dsingle%2Eis%2Dhidden%7Bdisplay%3Anone%7D%2Epika%2Dsingle%2Eis%2Dbound%7Bposition%3Aabsolute%3Bbox%2Dshadow%3A0%205px%2015px%20%2D5px%20rgba%280%2C0%2C0%2C%2E5%29%7D%2Epika%2Dlendar%7Bfloat%3Aleft%3Bwidth%3A240px%3Bmargin%3A8px%7D%2Epika%2Dtitle%7Bposition%3Arelative%3Btext%2Dalign%3Acenter%7D%2Epika%2Dlabel%7Bdisplay%3Ainline%2Dblock%3B%2Adisplay%3Ainline%3Bposition%3Arelative%3Bz%2Dindex%3A9999%3Boverflow%3Ahidden%3Bmargin%3A0%3Bpadding%3A5px%203px%3Bfont%2Dsize%3A14px%3Bline%2Dheight%3A20px%3Bfont%2Dweight%3Abold%3Bbackground%2Dcolor%3A%23fff%7D%2Epika%2Dtitle%20select%7Bcursor%3Apointer%3Bposition%3Aabsolute%3Bz%2Dindex%3A9998%3Bmargin%3A0%3Bleft%3A0%3Btop%3A5px%3Bfilter%3Aalpha%28opacity%3D0%29%3Bopacity%3A0%7D%2Epika%2Dprev%2C%2Epika%2Dnext%7Bdisplay%3Ablock%3Bcursor%3Apointer%3Bposition%3Arelative%3Boutline%3A0%3Bborder%3A0%3Bpadding%3A0%3Bwidth%3A20px%3Bheight%3A30px%3Btext%2Dindent%3A20px%3Bwhite%2Dspace%3Anowrap%3Boverflow%3Ahidden%3Bbackground%2Dcolor%3Atransparent%3Bbackground%2Dposition%3Acenter%20center%3Bbackground%2Drepeat%3Ano%2Drepeat%3Bbackground%2Dsize%3A75%25%2075%25%3Bopacity%3A%2E5%3B%2Aposition%3Aabsolute%3B%2Atop%3A0%7D%2Epika%2Dprev%3Ahover%2C%2Epika%2Dnext%3Ahover%7Bopacity%3A1%7D%2Epika%2Dprev%2C%2Eis%2Drtl%20%2Epika%2Dnext%7Bfloat%3Aleft%3Bbackground%2Dimage%3Aurl%28%27data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj%2BOD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8%2BAqBIl6kKgHiXqQqAeJepBo%2Fz38J%2FU0uAHlaBkBl9I4GwAAAABJRU5ErkJggg%3D%3D%27%29%3B%2Aleft%3A0%7D%2Epika%2Dnext%2C%2Eis%2Drtl%20%2Epika%2Dprev%7Bfloat%3Aright%3Bbackground%2Dimage%3Aurl%28%27data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO%2BBJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII%3D%27%29%3B%2Aright%3A0%7D%2Epika%2Dprev%2Eis%2Ddisabled%2C%2Epika%2Dnext%2Eis%2Ddisabled%7Bcursor%3Adefault%3Bopacity%3A%2E2%7D%2Epika%2Dselect%7Bdisplay%3Ainline%2Dblock%3B%2Adisplay%3Ainline%7D%2Epika%2Dtable%7Bwidth%3A100%25%3Bborder%2Dcollapse%3Acollapse%3Bborder%2Dspacing%3A0%3Bborder%3A0%7D%2Epika%2Dtable%20th%2C%2Epika%2Dtable%20td%7Bwidth%3A14%2E285714285714286%25%3Bpadding%3A0%7D%2Epika%2Dtable%20th%7Bcolor%3A%23999%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A25px%3Bfont%2Dweight%3Abold%3Btext%2Dalign%3Acenter%7D%2Epika%2Dbutton%7Bcursor%3Apointer%3Bdisplay%3Ablock%3Bbox%2Dsizing%3Aborder%2Dbox%3B%2Dmoz%2Dbox%2Dsizing%3Aborder%2Dbox%3Boutline%3A0%3Bborder%3A0%3Bmargin%3A0%3Bwidth%3A100%25%3Bpadding%3A5px%3Bcolor%3A%23666%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A15px%3Btext%2Dalign%3Aright%3Bbackground%3A%23f5f5f5%7D%2Epika%2Dweek%7Bfont%2Dsize%3A11px%3Bcolor%3A%23999%7D%2Eis%2Dtoday%20%2Epika%2Dbutton%7Bcolor%3A%233af%3Bfont%2Dweight%3Abold%7D%2Eis%2Dselected%20%2Epika%2Dbutton%7Bcolor%3A%23fff%3Bfont%2Dweight%3Abold%3Bbackground%3A%233af%3Bbox%2Dshadow%3Ainset%200%201px%203px%20%23178fe5%3Bborder%2Dradius%3A3px%7D%2Eis%2Dinrange%20%2Epika%2Dbutton%7Bbackground%3A%23d5e9f7%7D%2Eis%2Dstartrange%20%2Epika%2Dbutton%7Bcolor%3A%23fff%3Bbackground%3A%236cb31d%3Bbox%2Dshadow%3Anone%3Bborder%2Dradius%3A3px%7D%2Eis%2Dendrange%20%2Epika%2Dbutton%7Bcolor%3A%23fff%3Bbackground%3A%233af%3Bbox%2Dshadow%3Anone%3Bborder%2Dradius%3A3px%7D%2Eis%2Ddisabled%20%2Epika%2Dbutton%7Bpointer%2Devents%3Anone%3Bcursor%3Adefault%3Bcolor%3A%23999%3Bopacity%3A%2E3%7D%2Epika%2Dbutton%3Ahover%7Bcolor%3A%23fff%3Bbackground%3A%23ff8000%3Bbox%2Dshadow%3Anone%3Bborder%2Dradius%3A3px%7D%2Epika%2Dtable%20abbr%7Bborder%2Dbottom%3A0%3Bcursor%3Ahelp%7D" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyohDQooVGhlIE1JVCBMaWNlbnNlKQ0KDQpDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBNYXJjaW4gV2FycGVjaG93c2tpDQpDb3B5cmlnaHQgKGMpIDIwMTUgSGFuZHNvbmNvZGUgc3AuIHogby5vLiA8aGVsbG9AaGFuZHNvbmNvZGUubmV0Pg0KDQpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcNCmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQ0KJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZw0Kd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLA0KZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvDQpwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8NCnRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUNCmluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KDQpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRg0KTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULg0KSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkNCkNMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsDQpUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQ0KU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQoNCiovDQohZnVuY3Rpb24oZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz1lKCk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSxlKTtlbHNle3ZhciB0O3Q9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLHQuSGFuZHNvbnRhYmxlPWUoKX19KGZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uIHQoZSxuLG8pe2Z1bmN0aW9uIHIobCxhKXtpZighbltsXSl7aWYoIWVbbF0pe3ZhciB1PSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFhJiZ1KXJldHVybiB1KGwsITApO2lmKGkpcmV0dXJuIGkobCwhMCk7aWYoc1tsXSYmInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3dbc1tsXV0pcmV0dXJuIHdpbmRvd1tzW2xdXTt2YXIgYz1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitsKyInIik7dGhyb3cgYy5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixjfXZhciBoPW5bbF09e2V4cG9ydHM6e319O2VbbF1bMF0uY2FsbChoLmV4cG9ydHMsZnVuY3Rpb24odCl7dmFyIG49ZVtsXVsxXVt0XTtyZXR1cm4gcihuP246dCl9LGgsaC5leHBvcnRzLHQsZSxuLG8pfXJldHVybiBuW2xdLmV4cG9ydHN9Zm9yKHZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLHM9SlNPTi5wYXJzZSgneyJ6ZXJvY2xpcGJvYXJkIjoiWmVyb0NsaXBib2FyZCIsIm1vbWVudCI6Im1vbWVudCIsInBpa2FkYXkiOiJQaWthZGF5In0nKXx8e30sbD0wO2w8by5sZW5ndGg7bCsrKXIob1tsXSk7cmV0dXJuIHJ9KHsxOltmdW5jdGlvbihlLHQsbil7d2luZG93LmpRdWVyeSYmIWZ1bmN0aW9uKGUpe2UuZm4uaGFuZHNvbnRhYmxlPWZ1bmN0aW9uKGUpe3ZhciB0LG4sbyxyLGkscz10aGlzLmZpcnN0KCksbD1zLmRhdGEoImhhbmRzb250YWJsZSIpO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gaT1lfHx7fSxsP2wudXBkYXRlU2V0dGluZ3MoaSk6KGw9bmV3IEhhbmRzb250YWJsZS5Db3JlKHNbMF0saSkscy5kYXRhKCJoYW5kc29udGFibGUiLGwpLGwuaW5pdCgpKSxzO2lmKG89W10sYXJndW1lbnRzLmxlbmd0aD4xKWZvcih0PTEsbj1hcmd1bWVudHMubGVuZ3RoO24+dDt0Kyspby5wdXNoKGFyZ3VtZW50c1t0XSk7aWYobCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBsW2VdKXRocm93IG5ldyBFcnJvcigiSGFuZHNvbnRhYmxlIGRvIG5vdCBwcm92aWRlIGFjdGlvbjogIitlKTtyPWxbZV0uYXBwbHkobCxvKSwiZGVzdHJveSI9PT1lJiZzLnJlbW92ZURhdGEoKX1yZXR1cm4gcn19KHdpbmRvdy5qUXVlcnkpfSx7fV0sMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtXYWxrb250YWJsZUJvcmRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEN9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscyxsLGEsdT0obz1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KSxjPXUuZ2V0Q29tcHV0ZWRTdHlsZSxoPXUuZ2V0VHJpbW1pbmdDb250YWluZXIsZD11LmlubmVyV2lkdGgsZj11LmlubmVySGVpZ2h0LHA9dS5vZmZzZXQsZz11Lm91dGVySGVpZ2h0LG09dS5vdXRlcldpZHRoLHc9KHI9ZSgiaGVscGVycy9kb20vZXZlbnQiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbix2PShpPWUoImhlbHBlcnMvYnJvd3NlciIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkuaXNNb2JpbGVCcm93c2VyLHk9KHM9ZSgiZXZlbnRNYW5hZ2VyIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5FdmVudE1hbmFnZXIsYj0obD1lKCJjZWxsL2Nvb3JkcyIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSkuV2Fsa29udGFibGVDZWxsQ29vcmRzLEM9KChhPWUoIm92ZXJsYXkvX2Jhc2UuanMiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLldhbGtvbnRhYmxlT3ZlcmxheSxmdW5jdGlvbihlLHQpe3QmJih0aGlzLmV2ZW50TWFuYWdlcj1uZXcgeShlKSx0aGlzLmluc3RhbmNlPWUsdGhpcy53b3Q9ZSx0aGlzLnNldHRpbmdzPXQsdGhpcy5tb3VzZURvd249ITEsdGhpcy5tYWluPW51bGwsdGhpcy50b3A9bnVsbCx0aGlzLmxlZnQ9bnVsbCx0aGlzLmJvdHRvbT1udWxsLHRoaXMucmlnaHQ9bnVsbCx0aGlzLnRvcFN0eWxlPW51bGwsdGhpcy5sZWZ0U3R5bGU9bnVsbCx0aGlzLmJvdHRvbVN0eWxlPW51bGwsdGhpcy5yaWdodFN0eWxlPW51bGwsdGhpcy5jb3JuZXJEZWZhdWx0U3R5bGU9e3dpZHRoOiI1cHgiLGhlaWdodDoiNXB4Iixib3JkZXJXaWR0aDoiMnB4Iixib3JkZXJTdHlsZToic29saWQiLGJvcmRlckNvbG9yOiIjRkZGIn0sdGhpcy5jb3JuZXI9bnVsbCx0aGlzLmNvcm5lclN0eWxlPW51bGwsdGhpcy5jcmVhdGVCb3JkZXJzKHQpLHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKSl9KTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoQyx7cmVnaXN0ZXJMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQuYm9keSwibW91c2Vkb3duIixmdW5jdGlvbigpe3JldHVybiBlLm9uTW91c2VEb3duKCl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LmJvZHksIm1vdXNldXAiLGZ1bmN0aW9uKCl7cmV0dXJuIGUub25Nb3VzZVVwKCl9KTtmb3IodmFyIHQ9dGhpcyxuPWZ1bmN0aW9uKG4sbyl7dC5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0Lm1haW4uY2hpbGROb2Rlc1tuXSwibW91c2VlbnRlciIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25Nb3VzZUVudGVyKHQsZS5tYWluLmNoaWxkTm9kZXNbbl0pfSl9LG89MCxyPXRoaXMubWFpbi5jaGlsZE5vZGVzLmxlbmd0aDtyPm87bysrKW4obyxyKX0sb25Nb3VzZURvd246ZnVuY3Rpb24oKXt0aGlzLm1vdXNlRG93bj0hMH0sb25Nb3VzZVVwOmZ1bmN0aW9uKCl7dGhpcy5tb3VzZURvd249ITF9LG9uTW91c2VFbnRlcjpmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIGUuY2xpZW50WTxNYXRoLmZsb29yKGkudG9wKT8hMDplLmNsaWVudFk+TWF0aC5jZWlsKGkudG9wK2kuaGVpZ2h0KT8hMDplLmNsaWVudFg8TWF0aC5mbG9vcihpLmxlZnQpPyEwOmUuY2xpZW50WD5NYXRoLmNlaWwoaS5sZWZ0K2kud2lkdGgpPyEwOnZvaWQgMH1mdW5jdGlvbiBvKGUpe24oZSkmJihyLmV2ZW50TWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LmJvZHksIm1vdXNlbW92ZSIsbyksdC5zdHlsZS5kaXNwbGF5PSJibG9jayIpfWlmKHRoaXMubW91c2VEb3duJiZ0aGlzLndvdC5nZXRTZXR0aW5nKCJoaWRlQm9yZGVyT25Nb3VzZURvd25PdmVyIikpe2UucHJldmVudERlZmF1bHQoKSx3KGUpO3ZhciByPXRoaXMsaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3Quc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudC5ib2R5LCJtb3VzZW1vdmUiLG8pfX0sY3JlYXRlQm9yZGVyczpmdW5jdGlvbihlKXt0aGlzLm1haW49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dmFyIHQ9WyJ0b3AiLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiLCJjb3JuZXIiXSxuPXRoaXMubWFpbi5zdHlsZTtuLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbi50b3A9MCxuLmxlZnQ9MDtmb3IodmFyIG89MDs1Pm87bysrKXt2YXIgcj10W29dLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aS5jbGFzc05hbWU9Ind0Qm9yZGVyICIrKHRoaXMuc2V0dGluZ3MuY2xhc3NOYW1lfHwiIiksdGhpcy5zZXR0aW5nc1tyXSYmdGhpcy5zZXR0aW5nc1tyXS5oaWRlJiYoaS5jbGFzc05hbWUrPSIgaGlkZGVuIiksbj1pLnN0eWxlLG4uYmFja2dyb3VuZENvbG9yPXRoaXMuc2V0dGluZ3Nbcl0mJnRoaXMuc2V0dGluZ3Nbcl0uY29sb3I/dGhpcy5zZXR0aW5nc1tyXS5jb2xvcjplLmJvcmRlci5jb2xvcixuLmhlaWdodD10aGlzLnNldHRpbmdzW3JdJiZ0aGlzLnNldHRpbmdzW3JdLndpZHRoP3RoaXMuc2V0dGluZ3Nbcl0ud2lkdGgrInB4IjplLmJvcmRlci53aWR0aCsicHgiLG4ud2lkdGg9dGhpcy5zZXR0aW5nc1tyXSYmdGhpcy5zZXR0aW5nc1tyXS53aWR0aD90aGlzLnNldHRpbmdzW3JdLndpZHRoKyJweCI6ZS5ib3JkZXIud2lkdGgrInB4Iix0aGlzLm1haW4uYXBwZW5kQ2hpbGQoaSl9dGhpcy50b3A9dGhpcy5tYWluLmNoaWxkTm9kZXNbMF0sdGhpcy5sZWZ0PXRoaXMubWFpbi5jaGlsZE5vZGVzWzFdLHRoaXMuYm90dG9tPXRoaXMubWFpbi5jaGlsZE5vZGVzWzJdLHRoaXMucmlnaHQ9dGhpcy5tYWluLmNoaWxkTm9kZXNbM10sdGhpcy50b3BTdHlsZT10aGlzLnRvcC5zdHlsZSx0aGlzLmxlZnRTdHlsZT10aGlzLmxlZnQuc3R5bGUsdGhpcy5ib3R0b21TdHlsZT10aGlzLmJvdHRvbS5zdHlsZSx0aGlzLnJpZ2h0U3R5bGU9dGhpcy5yaWdodC5zdHlsZSx0aGlzLmNvcm5lcj10aGlzLm1haW4uY2hpbGROb2Rlc1s0XSx0aGlzLmNvcm5lci5jbGFzc05hbWUrPSIgY29ybmVyIix0aGlzLmNvcm5lclN0eWxlPXRoaXMuY29ybmVyLnN0eWxlLHRoaXMuY29ybmVyU3R5bGUud2lkdGg9dGhpcy5jb3JuZXJEZWZhdWx0U3R5bGUud2lkdGgsdGhpcy5jb3JuZXJTdHlsZS5oZWlnaHQ9dGhpcy5jb3JuZXJEZWZhdWx0U3R5bGUuaGVpZ2h0LHRoaXMuY29ybmVyU3R5bGUuYm9yZGVyPVt0aGlzLmNvcm5lckRlZmF1bHRTdHlsZS5ib3JkZXJXaWR0aCx0aGlzLmNvcm5lckRlZmF1bHRTdHlsZS5ib3JkZXJTdHlsZSx0aGlzLmNvcm5lckRlZmF1bHRTdHlsZS5ib3JkZXJDb2xvcl0uam9pbigiICIpLHYoKSYmdGhpcy5jcmVhdGVNdWx0aXBsZVNlbGVjdG9ySGFuZGxlcygpLHRoaXMuZGlzYXBwZWFyKCksdGhpcy53b3Qud3RUYWJsZS5ib3JkZXJzSG9sZGVyfHwodGhpcy53b3Qud3RUYWJsZS5ib3JkZXJzSG9sZGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMud290Lnd0VGFibGUuYm9yZGVyc0hvbGRlci5jbGFzc05hbWU9Imh0Qm9yZGVycyIsdGhpcy53b3Qud3RUYWJsZS5zcHJlYWRlci5hcHBlbmRDaGlsZCh0aGlzLndvdC53dFRhYmxlLmJvcmRlcnNIb2xkZXIpKSx0aGlzLndvdC53dFRhYmxlLmJvcmRlcnNIb2xkZXIuaW5zZXJ0QmVmb3JlKHRoaXMubWFpbix0aGlzLndvdC53dFRhYmxlLmJvcmRlcnNIb2xkZXIuZmlyc3RDaGlsZCl9LGNyZWF0ZU11bHRpcGxlU2VsZWN0b3JIYW5kbGVzOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb25IYW5kbGVzPXt0b3BMZWZ0OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHRvcExlZnRIaXRBcmVhOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLGJvdHRvbVJpZ2h0OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLGJvdHRvbVJpZ2h0SGl0QXJlYTpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKX07dmFyIGU9MTAsdD00MDt0aGlzLnNlbGVjdGlvbkhhbmRsZXMudG9wTGVmdC5jbGFzc05hbWU9InRvcExlZnRTZWxlY3Rpb25IYW5kbGUiLHRoaXMuc2VsZWN0aW9uSGFuZGxlcy50b3BMZWZ0SGl0QXJlYS5jbGFzc05hbWU9InRvcExlZnRTZWxlY3Rpb25IYW5kbGUtSGl0QXJlYSIsdGhpcy5zZWxlY3Rpb25IYW5kbGVzLmJvdHRvbVJpZ2h0LmNsYXNzTmFtZT0iYm90dG9tUmlnaHRTZWxlY3Rpb25IYW5kbGUiLHRoaXMuc2VsZWN0aW9uSGFuZGxlcy5ib3R0b21SaWdodEhpdEFyZWEuY2xhc3NOYW1lPSJib3R0b21SaWdodFNlbGVjdGlvbkhhbmRsZS1IaXRBcmVhIix0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzPXt0b3BMZWZ0OnRoaXMuc2VsZWN0aW9uSGFuZGxlcy50b3BMZWZ0LnN0eWxlLHRvcExlZnRIaXRBcmVhOnRoaXMuc2VsZWN0aW9uSGFuZGxlcy50b3BMZWZ0SGl0QXJlYS5zdHlsZSxib3R0b21SaWdodDp0aGlzLnNlbGVjdGlvbkhhbmRsZXMuYm90dG9tUmlnaHQuc3R5bGUsYm90dG9tUmlnaHRIaXRBcmVhOnRoaXMuc2VsZWN0aW9uSGFuZGxlcy5ib3R0b21SaWdodEhpdEFyZWEuc3R5bGV9O3ZhciBuPXtwb3NpdGlvbjoiYWJzb2x1dGUiLGhlaWdodDp0KyJweCIsd2lkdGg6dCsicHgiLCJib3JkZXItcmFkaXVzIjpwYXJzZUludCh0LzEuNSwxMCkrInB4In07Zm9yKHZhciBvIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShvKSYmKHRoaXMuc2VsZWN0aW9uSGFuZGxlcy5zdHlsZXMuYm90dG9tUmlnaHRIaXRBcmVhW29dPW5bb10sdGhpcy5zZWxlY3Rpb25IYW5kbGVzLnN0eWxlcy50b3BMZWZ0SGl0QXJlYVtvXT1uW29dKTt2YXIgcj17cG9zaXRpb246ImFic29sdXRlIixoZWlnaHQ6ZSsicHgiLHdpZHRoOmUrInB4IiwiYm9yZGVyLXJhZGl1cyI6cGFyc2VJbnQoZS8xLjUsMTApKyJweCIsYmFja2dyb3VuZDoiI0Y1RjVGRiIsYm9yZGVyOiIxcHggc29saWQgIzQyODVjOCJ9O2Zvcih2YXIgaSBpbiByKXIuaGFzT3duUHJvcGVydHkoaSkmJih0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLmJvdHRvbVJpZ2h0W2ldPXJbaV0sdGhpcy5zZWxlY3Rpb25IYW5kbGVzLnN0eWxlcy50b3BMZWZ0W2ldPXJbaV0pO3RoaXMubWFpbi5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdGlvbkhhbmRsZXMudG9wTGVmdCksdGhpcy5tYWluLmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0aW9uSGFuZGxlcy5ib3R0b21SaWdodCksdGhpcy5tYWluLmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0aW9uSGFuZGxlcy50b3BMZWZ0SGl0QXJlYSksdGhpcy5tYWluLmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0aW9uSGFuZGxlcy5ib3R0b21SaWdodEhpdEFyZWEpfSxpc1BhcnRSYW5nZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLndvdC5zZWxlY3Rpb25zLmFyZWEuY2VsbFJhbmdlJiYoZSE9dGhpcy53b3Quc2VsZWN0aW9ucy5hcmVhLmNlbGxSYW5nZS50by5yb3d8fHQhPXRoaXMud290LnNlbGVjdGlvbnMuYXJlYS5jZWxsUmFuZ2UudG8uY29sKX0sdXBkYXRlTXVsdGlwbGVTZWxlY3Rpb25IYW5kbGVzUG9zaXRpb246ZnVuY3Rpb24oZSx0LG4sbyxyLGkpe3ZhciBzPXBhcnNlSW50KHRoaXMuc2VsZWN0aW9uSGFuZGxlcy5zdHlsZXMudG9wTGVmdC53aWR0aCwxMCksbD1wYXJzZUludCh0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLnRvcExlZnRIaXRBcmVhLndpZHRoLDEwKTt0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLnRvcExlZnQudG9wPXBhcnNlSW50KG4tcywxMCkrInB4Iix0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLnRvcExlZnQubGVmdD1wYXJzZUludChvLXMsMTApKyJweCIsdGhpcy5zZWxlY3Rpb25IYW5kbGVzLnN0eWxlcy50b3BMZWZ0SGl0QXJlYS50b3A9cGFyc2VJbnQobi1sLzQqMywxMCkrInB4Iix0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLnRvcExlZnRIaXRBcmVhLmxlZnQ9cGFyc2VJbnQoby1sLzQqMywxMCkrInB4Iix0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLmJvdHRvbVJpZ2h0LnRvcD1wYXJzZUludChuK2ksMTApKyJweCIsdGhpcy5zZWxlY3Rpb25IYW5kbGVzLnN0eWxlcy5ib3R0b21SaWdodC5sZWZ0PXBhcnNlSW50KG8rciwxMCkrInB4Iix0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLmJvdHRvbVJpZ2h0SGl0QXJlYS50b3A9cGFyc2VJbnQobitpLWwvNCwxMCkrInB4Iix0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLmJvdHRvbVJpZ2h0SGl0QXJlYS5sZWZ0PXBhcnNlSW50KG8rci1sLzQsMTApKyJweCIsdGhpcy5zZXR0aW5ncy5ib3JkZXIubXVsdGlwbGVTZWxlY3Rpb25IYW5kbGVzVmlzaWJsZSYmdGhpcy5zZXR0aW5ncy5ib3JkZXIubXVsdGlwbGVTZWxlY3Rpb25IYW5kbGVzVmlzaWJsZSgpPyh0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLnRvcExlZnQuZGlzcGxheT0iYmxvY2siLHRoaXMuc2VsZWN0aW9uSGFuZGxlcy5zdHlsZXMudG9wTGVmdEhpdEFyZWEuZGlzcGxheT0iYmxvY2siLHRoaXMuaXNQYXJ0UmFuZ2UoZSx0KT8odGhpcy5zZWxlY3Rpb25IYW5kbGVzLnN0eWxlcy5ib3R0b21SaWdodC5kaXNwbGF5PSJub25lIix0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLmJvdHRvbVJpZ2h0SGl0QXJlYS5kaXNwbGF5PSJub25lIik6KHRoaXMuc2VsZWN0aW9uSGFuZGxlcy5zdHlsZXMuYm90dG9tUmlnaHQuZGlzcGxheT0iYmxvY2siLHRoaXMuc2VsZWN0aW9uSGFuZGxlcy5zdHlsZXMuYm90dG9tUmlnaHRIaXRBcmVhLmRpc3BsYXk9ImJsb2NrIikpOih0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLnRvcExlZnQuZGlzcGxheT0ibm9uZSIsdGhpcy5zZWxlY3Rpb25IYW5kbGVzLnN0eWxlcy5ib3R0b21SaWdodC5kaXNwbGF5PSJub25lIix0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLnRvcExlZnRIaXRBcmVhLmRpc3BsYXk9Im5vbmUiLHRoaXMuc2VsZWN0aW9uSGFuZGxlcy5zdHlsZXMuYm90dG9tUmlnaHRIaXRBcmVhLmRpc3BsYXk9Im5vbmUiKSxlPT10aGlzLndvdC53dFNldHRpbmdzLmdldFNldHRpbmcoImZpeGVkUm93c1RvcCIpfHx0PT10aGlzLndvdC53dFNldHRpbmdzLmdldFNldHRpbmcoImZpeGVkQ29sdW1uc0xlZnQiKT8odGhpcy5zZWxlY3Rpb25IYW5kbGVzLnN0eWxlcy50b3BMZWZ0LnpJbmRleD0iOTk5OSIsdGhpcy5zZWxlY3Rpb25IYW5kbGVzLnN0eWxlcy50b3BMZWZ0SGl0QXJlYS56SW5kZXg9Ijk5OTkiKToodGhpcy5zZWxlY3Rpb25IYW5kbGVzLnN0eWxlcy50b3BMZWZ0LnpJbmRleD0iIix0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLnRvcExlZnRIaXRBcmVhLnpJbmRleD0iIil9LGFwcGVhcjpmdW5jdGlvbihlKXtpZighdGhpcy5kaXNhYmxlZCl7dmFyIHQsbixvLHIsaSxzLGwsYSx1LHcseSxDLF8sUixTLEUsVCxNLE87Tz10aGlzLndvdC53dFRhYmxlLmdldFJlbmRlcmVkUm93c0NvdW50KCk7Zm9yKHZhciBrPTA7Tz5rO2srKyl7dmFyIEg9dGhpcy53b3Qud3RUYWJsZS5yb3dGaWx0ZXIucmVuZGVyZWRUb1NvdXJjZShrKTtpZihIPj1lWzBdJiZIPD1lWzJdKXtfPUg7YnJlYWt9fWZvcih2YXIgRD1PLTE7RD49MDtELS0pe3ZhciBBPXRoaXMud290Lnd0VGFibGUucm93RmlsdGVyLnJlbmRlcmVkVG9Tb3VyY2UoRCk7aWYoQT49ZVswXSYmQTw9ZVsyXSl7Uz1BO2JyZWFrfX1PPXRoaXMud290Lnd0VGFibGUuZ2V0UmVuZGVyZWRDb2x1bW5zQ291bnQoKTtmb3IodmFyIHg9MDtPPng7eCsrKXt2YXIgUD10aGlzLndvdC53dFRhYmxlLmNvbHVtbkZpbHRlci5yZW5kZXJlZFRvU291cmNlKHgpO2lmKFA+PWVbMV0mJlA8PWVbM10pe1I9UDticmVha319Zm9yKHZhciBOPU8tMTtOPj0wO04tLSl7dmFyIEw9dGhpcy53b3Qud3RUYWJsZS5jb2x1bW5GaWx0ZXIucmVuZGVyZWRUb1NvdXJjZShOKTtpZihMPj1lWzFdJiZMPD1lWzNdKXtFPUw7YnJlYWt9fWlmKHZvaWQgMD09PV98fHZvaWQgMD09PVIpcmV0dXJuIHZvaWQgdGhpcy5kaXNhcHBlYXIoKTt0PV8hPT1TfHxSIT09RSxuPXRoaXMud290Lnd0VGFibGUuZ2V0Q2VsbChuZXcgYihfLFIpKSxvPXQ/dGhpcy53b3Qud3RUYWJsZS5nZXRDZWxsKG5ldyBiKFMsRSkpOm4scj1wKG4pLGk9dD9wKG8pOnIscz1wKHRoaXMud290Lnd0VGFibGUuVEFCTEUpLGE9ci50b3AseT1pLnRvcCtnKG8pLWEsdz1yLmxlZnQsQz1pLmxlZnQrbShvKS13LGw9YS1zLnRvcC0xLHU9dy1zLmxlZnQtMTt2YXIgVz1jKG4pO3BhcnNlSW50KFcuYm9yZGVyVG9wV2lkdGgsMTApPjAmJihsKz0xLHk9eT4wP3ktMTowKSxwYXJzZUludChXLmJvcmRlckxlZnRXaWR0aCwxMCk+MCYmKHUrPTEsQz1DPjA/Qy0xOjApLHRoaXMudG9wU3R5bGUudG9wPWwrInB4Iix0aGlzLnRvcFN0eWxlLmxlZnQ9dSsicHgiLHRoaXMudG9wU3R5bGUud2lkdGg9QysicHgiLHRoaXMudG9wU3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMubGVmdFN0eWxlLnRvcD1sKyJweCIsdGhpcy5sZWZ0U3R5bGUubGVmdD11KyJweCIsdGhpcy5sZWZ0U3R5bGUuaGVpZ2h0PXkrInB4Iix0aGlzLmxlZnRTdHlsZS5kaXNwbGF5PSJibG9jayI7dmFyIEk9TWF0aC5mbG9vcih0aGlzLnNldHRpbmdzLmJvcmRlci53aWR0aC8yKTt0aGlzLmJvdHRvbVN0eWxlLnRvcD1sK3ktSSsicHgiLHRoaXMuYm90dG9tU3R5bGUubGVmdD11KyJweCIsdGhpcy5ib3R0b21TdHlsZS53aWR0aD1DKyJweCIsdGhpcy5ib3R0b21TdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5yaWdodFN0eWxlLnRvcD1sKyJweCIsdGhpcy5yaWdodFN0eWxlLmxlZnQ9dStDLUkrInB4Iix0aGlzLnJpZ2h0U3R5bGUuaGVpZ2h0PXkrMSsicHgiLHRoaXMucmlnaHRTdHlsZS5kaXNwbGF5PSJibG9jayIsdigpfHwhdGhpcy5oYXNTZXR0aW5nKHRoaXMuc2V0dGluZ3MuYm9yZGVyLmNvcm5lclZpc2libGUpfHx0aGlzLmlzUGFydFJhbmdlKFMsRSk/dGhpcy5jb3JuZXJTdHlsZS5kaXNwbGF5PSJub25lIjoodGhpcy5jb3JuZXJTdHlsZS50b3A9bCt5LTQrInB4Iix0aGlzLmNvcm5lclN0eWxlLmxlZnQ9dStDLTQrInB4Iix0aGlzLmNvcm5lclN0eWxlLmJvcmRlclJpZ2h0V2lkdGg9dGhpcy5jb3JuZXJEZWZhdWx0U3R5bGUuYm9yZGVyV2lkdGgsdGhpcy5jb3JuZXJTdHlsZS53aWR0aD10aGlzLmNvcm5lckRlZmF1bHRTdHlsZS53aWR0aCx0aGlzLmNvcm5lclN0eWxlLmRpc3BsYXk9ImJsb2NrIixUPWgodGhpcy53b3Qud3RUYWJsZS5UQUJMRSksRT09PXRoaXMud290LmdldFNldHRpbmcoInRvdGFsQ29sdW1ucyIpLTEmJihNPW8ub2Zmc2V0TGVmdCttKG8pPj1kKFQpLE0mJih0aGlzLmNvcm5lclN0eWxlLmxlZnQ9TWF0aC5mbG9vcih1K0MtMy1wYXJzZUludCh0aGlzLmNvcm5lckRlZmF1bHRTdHlsZS53aWR0aCkvMikrInB4Iix0aGlzLmNvcm5lclN0eWxlLmJvcmRlclJpZ2h0V2lkdGg9MCkpLFM9PT10aGlzLndvdC5nZXRTZXR0aW5nKCJ0b3RhbFJvd3MiKS0xJiYoTT1vLm9mZnNldFRvcCtnKG8pPj1mKFQpLE0mJih0aGlzLmNvcm5lclN0eWxlLnRvcD1NYXRoLmZsb29yKGwreS0zLXBhcnNlSW50KHRoaXMuY29ybmVyRGVmYXVsdFN0eWxlLmhlaWdodCkvMikrInB4Iix0aGlzLmNvcm5lclN0eWxlLmJvcmRlckJvdHRvbVdpZHRoPTApKSksdigpJiZ0aGlzLnVwZGF0ZU11bHRpcGxlU2VsZWN0aW9uSGFuZGxlc1Bvc2l0aW9uKF8sUixsLHUsQyx5KX19LGRpc2FwcGVhcjpmdW5jdGlvbigpe3RoaXMudG9wU3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5sZWZ0U3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5ib3R0b21TdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLnJpZ2h0U3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5jb3JuZXJTdHlsZS5kaXNwbGF5PSJub25lIix2KCkmJih0aGlzLnNlbGVjdGlvbkhhbmRsZXMuc3R5bGVzLnRvcExlZnQuZGlzcGxheT0ibm9uZSIsdGhpcy5zZWxlY3Rpb25IYW5kbGVzLnN0eWxlcy5ib3R0b21SaWdodC5kaXNwbGF5PSJub25lIil9LGhhc1NldHRpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSgpOiEhZX19LHt9KSx3aW5kb3cuV2Fsa29udGFibGVCb3JkZXI9Q30seyJjZWxsL2Nvb3JkcyI6NSxldmVudE1hbmFnZXI6NDEsImhlbHBlcnMvYnJvd3NlciI6NDMsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL2RvbS9ldmVudCI6NDcsIm92ZXJsYXkvX2Jhc2UuanMiOjExfV0sMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtXYWxrb250YWJsZVZpZXdwb3J0Q29sdW1uc0NhbGN1bGF0b3I6e2dldDpmdW5jdGlvbigpe3JldHVybiByfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG89bmV3IFdlYWtNYXAscj1mdW5jdGlvbihlLHQsbixyLGkscyxsKXt2YXIgYT12b2lkIDAhPT1hcmd1bWVudHNbN10/YXJndW1lbnRzWzddOmZ1bmN0aW9uKGUpe3JldHVybiBlfTtvLnNldCh0aGlzLHt2aWV3cG9ydFdpZHRoOmUsc2Nyb2xsT2Zmc2V0OnQsdG90YWxDb2x1bW5zOm4sY29sdW1uV2lkdGhGbjpyLG92ZXJyaWRlRm46aSxvbmx5RnVsbHlWaXNpYmxlOnMsc3RyZXRjaGluZ0NvbHVtbldpZHRoRm46YX0pLHRoaXMuY291bnQ9MCx0aGlzLnN0YXJ0Q29sdW1uPW51bGwsdGhpcy5lbmRDb2x1bW49bnVsbCx0aGlzLnN0YXJ0UG9zaXRpb249bnVsbCx0aGlzLnN0cmV0Y2hBbGxSYXRpbz0wLHRoaXMuc3RyZXRjaExhc3RXaWR0aD0wLHRoaXMuc3RyZXRjaD1sLHRoaXMudG90YWxUYXJnZXRXaWR0aD0wLHRoaXMubmVlZFZlcmlmeUxhc3RDb2x1bW5XaWR0aD0hMCx0aGlzLnN0cmV0Y2hBbGxDb2x1bW5zV2lkdGg9W10sdGhpcy5jYWxjdWxhdGUoKX0saT1yOyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhyLHtjYWxjdWxhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD0wLG49ITAscj1bXSxpPW8uZ2V0KHRoaXMpLHM9aS5vbmx5RnVsbHlWaXNpYmxlLGw9aS5vdmVycmlkZUZuLGE9aS5zY3JvbGxPZmZzZXQsdT1pLnRvdGFsQ29sdW1ucyxjPWkudmlld3BvcnRXaWR0aCxoPTA7dT5oO2grKylpZihlPXRoaXMuX2dldENvbHVtbldpZHRoKGgpLGE+PXQmJiFzJiYodGhpcy5zdGFydENvbHVtbj1oKSx0Pj1hJiZhK2M+PXQrZSYmKG51bGw9PXRoaXMuc3RhcnRDb2x1bW4mJih0aGlzLnN0YXJ0Q29sdW1uPWgpLHRoaXMuZW5kQ29sdW1uPWgpLHIucHVzaCh0KSx0Kz1lLHN8fCh0aGlzLmVuZENvbHVtbj1oKSx0Pj1hK2Mpe249ITE7YnJlYWt9aWYodGhpcy5lbmRDb2x1bW49PT11LTEmJm4pZm9yKHRoaXMuc3RhcnRDb2x1bW49dGhpcy5lbmRDb2x1bW47dGhpcy5zdGFydENvbHVtbj4wOyl7dmFyIGQ9clt0aGlzLmVuZENvbHVtbl0rZS1yW3RoaXMuc3RhcnRDb2x1bW4tMV07aWYoKGM+PWR8fCFzKSYmdGhpcy5zdGFydENvbHVtbi0tLGQ+YylicmVha31udWxsIT09dGhpcy5zdGFydENvbHVtbiYmbCYmbCh0aGlzKSx0aGlzLnN0YXJ0UG9zaXRpb249clt0aGlzLnN0YXJ0Q29sdW1uXSx2b2lkIDA9PXRoaXMuc3RhcnRQb3NpdGlvbiYmKHRoaXMuc3RhcnRQb3NpdGlvbj1udWxsKSxudWxsIT09dGhpcy5zdGFydENvbHVtbiYmKHRoaXMuY291bnQ9dGhpcy5lbmRDb2x1bW4tdGhpcy5zdGFydENvbHVtbisxKX0scmVmcmVzaFN0cmV0Y2hpbmc6ZnVuY3Rpb24oZSl7aWYoIm5vbmUiIT09dGhpcy5zdHJldGNoKXt0aGlzLnRvdGFsVGFyZ2V0V2lkdGg9ZTtmb3IodmFyIHQ9by5nZXQodGhpcyksbj10LnRvdGFsQ29sdW1ucyxyPTAsaT0wO24+aTtpKyspe3ZhciBzPXRoaXMuX2dldENvbHVtbldpZHRoKGkpLGw9dC5zdHJldGNoaW5nQ29sdW1uV2lkdGhGbih2b2lkIDAsaSk7Im51bWJlciI9PXR5cGVvZiBsP2UtPWw6cis9c312YXIgYT1lLXI7aWYoImFsbCI9PT10aGlzLnN0cmV0Y2gmJmE+MCl0aGlzLnN0cmV0Y2hBbGxSYXRpbz1lL3IsdGhpcy5zdHJldGNoQWxsQ29sdW1uc1dpZHRoPVtdLHRoaXMubmVlZFZlcmlmeUxhc3RDb2x1bW5XaWR0aD0hMDtlbHNlIGlmKCJsYXN0Ij09PXRoaXMuc3RyZXRjaCYmZSE9PTEvMCl7dmFyIHU9dGhpcy5fZ2V0Q29sdW1uV2lkdGgobi0xKSxjPWErdTt0aGlzLnN0cmV0Y2hMYXN0V2lkdGg9Yz49MD9jOnV9fX0sZ2V0U3RyZXRjaGVkQ29sdW1uV2lkdGg6ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsO3JldHVybiJhbGwiPT09dGhpcy5zdHJldGNoJiYwIT09dGhpcy5zdHJldGNoQWxsUmF0aW8/bj10aGlzLl9nZXRTdHJldGNoZWRBbGxDb2x1bW5XaWR0aChlLHQpOiJsYXN0Ij09PXRoaXMuc3RyZXRjaCYmMCE9PXRoaXMuc3RyZXRjaExhc3RXaWR0aCYmKG49dGhpcy5fZ2V0U3RyZXRjaGVkTGFzdENvbHVtbldpZHRoKGUpKSxufSxfZ2V0U3RyZXRjaGVkQWxsQ29sdW1uV2lkdGg6ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9by5nZXQodGhpcyksaT1yLnRvdGFsQ29sdW1ucztpZighdGhpcy5zdHJldGNoQWxsQ29sdW1uc1dpZHRoW2VdKXt2YXIgcz1NYXRoLnJvdW5kKHQqdGhpcy5zdHJldGNoQWxsUmF0aW8pLGw9ci5zdHJldGNoaW5nQ29sdW1uV2lkdGhGbihzLGUpO3ZvaWQgMD09PWw/dGhpcy5zdHJldGNoQWxsQ29sdW1uc1dpZHRoW2VdPXM6dGhpcy5zdHJldGNoQWxsQ29sdW1uc1dpZHRoW2VdPWlzTmFOKGwpP3RoaXMuX2dldENvbHVtbldpZHRoKGUpOmx9aWYodGhpcy5zdHJldGNoQWxsQ29sdW1uc1dpZHRoLmxlbmd0aD09PWkmJnRoaXMubmVlZFZlcmlmeUxhc3RDb2x1bW5XaWR0aCl7dGhpcy5uZWVkVmVyaWZ5TGFzdENvbHVtbldpZHRoPSExO2Zvcih2YXIgYT0wO2E8dGhpcy5zdHJldGNoQWxsQ29sdW1uc1dpZHRoLmxlbmd0aDthKyspbis9dGhpcy5zdHJldGNoQWxsQ29sdW1uc1dpZHRoW2FdO24hPT10aGlzLnRvdGFsVGFyZ2V0V2lkdGgmJih0aGlzLnN0cmV0Y2hBbGxDb2x1bW5zV2lkdGhbdGhpcy5zdHJldGNoQWxsQ29sdW1uc1dpZHRoLmxlbmd0aC0xXSs9dGhpcy50b3RhbFRhcmdldFdpZHRoLW4pfXJldHVybiB0aGlzLnN0cmV0Y2hBbGxDb2x1bW5zV2lkdGhbZV19LF9nZXRTdHJldGNoZWRMYXN0Q29sdW1uV2lkdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9by5nZXQodGhpcyksbj10LnRvdGFsQ29sdW1ucztyZXR1cm4gZT09PW4tMT90aGlzLnN0cmV0Y2hMYXN0V2lkdGg6bnVsbH0sX2dldENvbHVtbldpZHRoOmZ1bmN0aW9uKGUpe3ZhciB0PW8uZ2V0KHRoaXMpLmNvbHVtbldpZHRoRm4oZSk7cmV0dXJuIHZvaWQgMD09PXQmJih0PWkuREVGQVVMVF9XSURUSCksdH19LHtnZXQgREVGQVVMVF9XSURUSCgpe3JldHVybiA1MH19KSx3aW5kb3cuV2Fsa29udGFibGVWaWV3cG9ydENvbHVtbnNDYWxjdWxhdG9yPXJ9LHt9XSw0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se1dhbGtvbnRhYmxlVmlld3BvcnRSb3dzQ2FsY3VsYXRvcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbz1uZXcgV2Vha01hcCxyPWZ1bmN0aW9uKGUsdCxuLHIsaSxzLGwpe28uc2V0KHRoaXMse3ZpZXdwb3J0SGVpZ2h0OmUsc2Nyb2xsT2Zmc2V0OnQsdG90YWxSb3dzOm4scm93SGVpZ2h0Rm46cixvdmVycmlkZUZuOmksb25seUZ1bGx5VmlzaWJsZTpzLGhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQ6bH0pLHRoaXMuY291bnQ9MCx0aGlzLnN0YXJ0Um93PW51bGwsdGhpcy5lbmRSb3c9bnVsbCx0aGlzLnN0YXJ0UG9zaXRpb249bnVsbCx0aGlzLmNhbGN1bGF0ZSgpfSxpPXI7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKHIse2NhbGN1bGF0ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT0wLHQ9ITAsbj1bXSxyPW8uZ2V0KHRoaXMpLHM9ci5vbmx5RnVsbHlWaXNpYmxlLGw9ci5vdmVycmlkZUZuLGE9ci5yb3dIZWlnaHRGbix1PXIuc2Nyb2xsT2Zmc2V0LGM9ci50b3RhbFJvd3MsaD1yLnZpZXdwb3J0SGVpZ2h0LGQ9ci5ob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0fHwwLGY9MDtjPmY7ZisrKXt2YXIgcD1hKGYpO2lmKHZvaWQgMD09PXAmJihwPWkuREVGQVVMVF9IRUlHSFQpLHU+PWUmJiFzJiYodGhpcy5zdGFydFJvdz1mKSxlPj11JiZ1K2gtZD49ZStwJiYobnVsbD09PXRoaXMuc3RhcnRSb3cmJih0aGlzLnN0YXJ0Um93PWYpLHRoaXMuZW5kUm93PWYpLG4ucHVzaChlKSxlKz1wLHN8fCh0aGlzLmVuZFJvdz1mKSxlPj11K2gtZCl7dD0hMTticmVha319aWYodGhpcy5lbmRSb3c9PT1jLTEmJnQpZm9yKHRoaXMuc3RhcnRSb3c9dGhpcy5lbmRSb3c7dGhpcy5zdGFydFJvdz4wOyl7dmFyIGc9blt0aGlzLmVuZFJvd10rcC1uW3RoaXMuc3RhcnRSb3ctMV07aWYoKGgtZD49Z3x8IXMpJiZ0aGlzLnN0YXJ0Um93LS0sZz49aC1kKWJyZWFrfW51bGwhPT10aGlzLnN0YXJ0Um93JiZsJiZsKHRoaXMpLHRoaXMuc3RhcnRQb3NpdGlvbj1uW3RoaXMuc3RhcnRSb3ddLHZvaWQgMD09dGhpcy5zdGFydFBvc2l0aW9uJiYodGhpcy5zdGFydFBvc2l0aW9uPW51bGwpLG51bGwhPT10aGlzLnN0YXJ0Um93JiYodGhpcy5jb3VudD10aGlzLmVuZFJvdy10aGlzLnN0YXJ0Um93KzEpfX0se2dldCBERUZBVUxUX0hFSUdIVCgpe3JldHVybiAyM319KSx3aW5kb3cuV2Fsa29udGFibGVWaWV3cG9ydFJvd3NDYWxjdWxhdG9yPXJ9LHt9XSw1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se1dhbGtvbnRhYmxlQ2VsbENvb3Jkczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbz1mdW5jdGlvbihlLHQpeyJ1bmRlZmluZWQiIT10eXBlb2YgZSYmInVuZGVmaW5lZCIhPXR5cGVvZiB0Pyh0aGlzLnJvdz1lLHRoaXMuY29sPXQpOih0aGlzLnJvdz1udWxsLHRoaXMuY29sPW51bGwpfTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3Mobyx7aXNWYWxpZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yb3c8MHx8dGhpcy5jb2w8MD8hMTohKHRoaXMucm93Pj1lLmdldFNldHRpbmcoInRvdGFsUm93cyIpfHx0aGlzLmNvbD49ZS5nZXRTZXR0aW5nKCJ0b3RhbENvbHVtbnMiKSl9LGlzRXF1YWw6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10aGlzPyEwOnRoaXMucm93PT09ZS5yb3cmJnRoaXMuY29sPT09ZS5jb2x9LGlzU291dGhFYXN0T2Y6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucm93Pj1lLnJvdyYmdGhpcy5jb2w+PWUuY29sfSxpc05vcnRoV2VzdE9mOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJvdzw9ZS5yb3cmJnRoaXMuY29sPD1lLmNvbH0saXNTb3V0aFdlc3RPZjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yb3c+PWUucm93JiZ0aGlzLmNvbDw9ZS5jb2x9LGlzTm9ydGhFYXN0T2Y6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucm93PD1lLnJvdyYmdGhpcy5jb2w+PWUuY29sfX0se30pLHdpbmRvdy5XYWxrb250YWJsZUNlbGxDb29yZHM9b30se31dLDY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7V2Fsa29udGFibGVDZWxsUmFuZ2U6e2dldDpmdW5jdGlvbigpe3JldHVybiBpfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scj0obz1lKCJjZWxsL2Nvb3JkcyIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSkuV2Fsa29udGFibGVDZWxsQ29vcmRzLGk9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuaGlnaGxpZ2h0PWUsdGhpcy5mcm9tPXQsdGhpcy50bz1ufSxzPWk7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKGkse2lzVmFsaWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZnJvbS5pc1ZhbGlkKGUpJiZ0aGlzLnRvLmlzVmFsaWQoZSl9LGlzU2luZ2xlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJvbS5yb3c9PT10aGlzLnRvLnJvdyYmdGhpcy5mcm9tLmNvbD09PXRoaXMudG8uY29sfSxnZXRIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgodGhpcy5mcm9tLnJvdyx0aGlzLnRvLnJvdyktTWF0aC5taW4odGhpcy5mcm9tLnJvdyx0aGlzLnRvLnJvdykrMX0sZ2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgodGhpcy5mcm9tLmNvbCx0aGlzLnRvLmNvbCktTWF0aC5taW4odGhpcy5mcm9tLmNvbCx0aGlzLnRvLmNvbCkrMX0saW5jbHVkZXM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSxuPXQucm93LG89dC5jb2wscj10aGlzLmdldFRvcExlZnRDb3JuZXIoKSxpPXRoaXMuZ2V0Qm90dG9tUmlnaHRDb3JuZXIoKTtyZXR1cm4gci5yb3c8PW4mJmkucm93Pj1uJiZyLmNvbDw9byYmaS5jb2w+PW99LGluY2x1ZGVzUmFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaW5jbHVkZXMoZS5nZXRUb3BMZWZ0Q29ybmVyKCkpJiZ0aGlzLmluY2x1ZGVzKGUuZ2V0Qm90dG9tUmlnaHRDb3JuZXIoKSl9LGlzRXF1YWw6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWluKHRoaXMuZnJvbS5yb3csdGhpcy50by5yb3cpPT1NYXRoLm1pbihlLmZyb20ucm93LGUudG8ucm93KSYmTWF0aC5tYXgodGhpcy5mcm9tLnJvdyx0aGlzLnRvLnJvdyk9PU1hdGgubWF4KGUuZnJvbS5yb3csZS50by5yb3cpJiZNYXRoLm1pbih0aGlzLmZyb20uY29sLHRoaXMudG8uY29sKT09TWF0aC5taW4oZS5mcm9tLmNvbCxlLnRvLmNvbCkmJk1hdGgubWF4KHRoaXMuZnJvbS5jb2wsdGhpcy50by5jb2wpPT1NYXRoLm1heChlLmZyb20uY29sLGUudG8uY29sKX0sb3ZlcmxhcHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNTb3V0aEVhc3RPZih0aGlzLmdldFRvcExlZnRDb3JuZXIoKSkmJmUuaXNOb3J0aFdlc3RPZih0aGlzLmdldEJvdHRvbVJpZ2h0Q29ybmVyKCkpfSxpc1NvdXRoRWFzdE9mOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldFRvcExlZnRDb3JuZXIoKS5pc1NvdXRoRWFzdE9mKGUpfHx0aGlzLmdldEJvdHRvbVJpZ2h0Q29ybmVyKCkuaXNTb3V0aEVhc3RPZihlKX0saXNOb3J0aFdlc3RPZjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRUb3BMZWZ0Q29ybmVyKCkuaXNOb3J0aFdlc3RPZihlKXx8dGhpcy5nZXRCb3R0b21SaWdodENvcm5lcigpLmlzTm9ydGhXZXN0T2YoZSl9LGV4cGFuZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFRvcExlZnRDb3JuZXIoKSxuPXRoaXMuZ2V0Qm90dG9tUmlnaHRDb3JuZXIoKTtyZXR1cm4gZS5yb3c8dC5yb3d8fGUuY29sPHQuY29sfHxlLnJvdz5uLnJvd3x8ZS5jb2w+bi5jb2w/KHRoaXMuZnJvbT1uZXcgcihNYXRoLm1pbih0LnJvdyxlLnJvdyksTWF0aC5taW4odC5jb2wsZS5jb2wpKSx0aGlzLnRvPW5ldyByKE1hdGgubWF4KG4ucm93LGUucm93KSxNYXRoLm1heChuLmNvbCxlLmNvbCkpLCEwKTohMX0sZXhwYW5kQnlSYW5nZTpmdW5jdGlvbihlKXtpZih0aGlzLmluY2x1ZGVzUmFuZ2UoZSl8fCF0aGlzLm92ZXJsYXBzKGUpKXJldHVybiExO3ZhciB0PXRoaXMuZ2V0VG9wTGVmdENvcm5lcigpLG49dGhpcy5nZXRCb3R0b21SaWdodENvcm5lcigpLG89KHRoaXMuZ2V0VG9wUmlnaHRDb3JuZXIoKSx0aGlzLmdldEJvdHRvbUxlZnRDb3JuZXIoKSxlLmdldFRvcExlZnRDb3JuZXIoKSksaT1lLmdldEJvdHRvbVJpZ2h0Q29ybmVyKCksbD1NYXRoLm1pbih0LnJvdyxvLnJvdyksYT1NYXRoLm1pbih0LmNvbCxvLmNvbCksdT1NYXRoLm1heChuLnJvdyxpLnJvdyksYz1NYXRoLm1heChuLmNvbCxpLmNvbCksaD1uZXcgcihsLGEpLGQ9bmV3IHIodSxjKSxmPW5ldyBzKGgsaCxkKS5pc0Nvcm5lcih0aGlzLmZyb20sZSkscD1lLmlzRXF1YWwobmV3IHMoaCxoLGQpKTtyZXR1cm4gZiYmIXAmJih0aGlzLmZyb20uY29sPmguY29sJiYoaC5jb2w9YyxkLmNvbD1hKSx0aGlzLmZyb20ucm93Pmgucm93JiYoaC5yb3c9dSxkLnJvdz1sKSksdGhpcy5mcm9tPWgsdGhpcy50bz1kLCEwfSxnZXREaXJlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mcm9tLmlzTm9ydGhXZXN0T2YodGhpcy50byk/Ik5XLVNFIjp0aGlzLmZyb20uaXNOb3J0aEVhc3RPZih0aGlzLnRvKT8iTkUtU1ciOnRoaXMuZnJvbS5pc1NvdXRoRWFzdE9mKHRoaXMudG8pPyJTRS1OVyI6dGhpcy5mcm9tLmlzU291dGhXZXN0T2YodGhpcy50byk/IlNXLU5FIjp2b2lkIDB9LHNldERpcmVjdGlvbjpmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJOVy1TRSI6dGhpcy5mcm9tPXRoaXMuZ2V0VG9wTGVmdENvcm5lcigpLHRoaXMudG89dGhpcy5nZXRCb3R0b21SaWdodENvcm5lcigpO2JyZWFrO2Nhc2UiTkUtU1ciOnRoaXMuZnJvbT10aGlzLmdldFRvcFJpZ2h0Q29ybmVyKCksdGhpcy50bz10aGlzLmdldEJvdHRvbUxlZnRDb3JuZXIoKTticmVhaztjYXNlIlNFLU5XIjp0aGlzLmZyb209dGhpcy5nZXRCb3R0b21SaWdodENvcm5lcigpLHRoaXMudG89dGhpcy5nZXRUb3BMZWZ0Q29ybmVyKCk7YnJlYWs7Y2FzZSJTVy1ORSI6dGhpcy5mcm9tPXRoaXMuZ2V0Qm90dG9tTGVmdENvcm5lcigpLHRoaXMudG89dGhpcy5nZXRUb3BSaWdodENvcm5lcigpfX0sZ2V0VG9wTGVmdENvcm5lcjpmdW5jdGlvbigpe3JldHVybiBuZXcgcihNYXRoLm1pbih0aGlzLmZyb20ucm93LHRoaXMudG8ucm93KSxNYXRoLm1pbih0aGlzLmZyb20uY29sLHRoaXMudG8uY29sKSl9LGdldEJvdHRvbVJpZ2h0Q29ybmVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByKE1hdGgubWF4KHRoaXMuZnJvbS5yb3csdGhpcy50by5yb3cpLE1hdGgubWF4KHRoaXMuZnJvbS5jb2wsdGhpcy50by5jb2wpKX0sZ2V0VG9wUmlnaHRDb3JuZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIoTWF0aC5taW4odGhpcy5mcm9tLnJvdyx0aGlzLnRvLnJvdyksTWF0aC5tYXgodGhpcy5mcm9tLmNvbCx0aGlzLnRvLmNvbCkpfSxnZXRCb3R0b21MZWZ0Q29ybmVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByKE1hdGgubWF4KHRoaXMuZnJvbS5yb3csdGhpcy50by5yb3cpLE1hdGgubWluKHRoaXMuZnJvbS5jb2wsdGhpcy50by5jb2wpKX0saXNDb3JuZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCYmdC5pbmNsdWRlcyhlKSYmKHRoaXMuZ2V0VG9wTGVmdENvcm5lcigpLmlzRXF1YWwobmV3IHIodC5mcm9tLnJvdyx0LmZyb20uY29sKSl8fHRoaXMuZ2V0VG9wUmlnaHRDb3JuZXIoKS5pc0VxdWFsKG5ldyByKHQuZnJvbS5yb3csdC50by5jb2wpKXx8dGhpcy5nZXRCb3R0b21MZWZ0Q29ybmVyKCkuaXNFcXVhbChuZXcgcih0LnRvLnJvdyx0LmZyb20uY29sKSl8fHRoaXMuZ2V0Qm90dG9tUmlnaHRDb3JuZXIoKS5pc0VxdWFsKG5ldyByKHQudG8ucm93LHQudG8uY29sKSkpPyEwOmUuaXNFcXVhbCh0aGlzLmdldFRvcExlZnRDb3JuZXIoKSl8fGUuaXNFcXVhbCh0aGlzLmdldFRvcFJpZ2h0Q29ybmVyKCkpfHxlLmlzRXF1YWwodGhpcy5nZXRCb3R0b21MZWZ0Q29ybmVyKCkpfHxlLmlzRXF1YWwodGhpcy5nZXRCb3R0b21SaWdodENvcm5lcigpKX0sZ2V0T3Bwb3NpdGVDb3JuZXI6ZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiByKSlyZXR1cm4hMTtpZih0JiZ0LmluY2x1ZGVzKGUpKXtpZih0aGlzLmdldFRvcExlZnRDb3JuZXIoKS5pc0VxdWFsKG5ldyByKHQuZnJvbS5yb3csdC5mcm9tLmNvbCkpKXJldHVybiB0aGlzLmdldEJvdHRvbVJpZ2h0Q29ybmVyKCk7aWYodGhpcy5nZXRUb3BSaWdodENvcm5lcigpLmlzRXF1YWwobmV3IHIodC5mcm9tLnJvdyx0LnRvLmNvbCkpKXJldHVybiB0aGlzLmdldEJvdHRvbUxlZnRDb3JuZXIoKTtpZih0aGlzLmdldEJvdHRvbUxlZnRDb3JuZXIoKS5pc0VxdWFsKG5ldyByKHQudG8ucm93LHQuZnJvbS5jb2wpKSlyZXR1cm4gdGhpcy5nZXRUb3BSaWdodENvcm5lcigpO2lmKHRoaXMuZ2V0Qm90dG9tUmlnaHRDb3JuZXIoKS5pc0VxdWFsKG5ldyByKHQudG8ucm93LHQudG8uY29sKSkpcmV0dXJuIHRoaXMuZ2V0VG9wTGVmdENvcm5lcigpfXJldHVybiBlLmlzRXF1YWwodGhpcy5nZXRCb3R0b21SaWdodENvcm5lcigpKT90aGlzLmdldFRvcExlZnRDb3JuZXIoKTplLmlzRXF1YWwodGhpcy5nZXRUb3BMZWZ0Q29ybmVyKCkpP3RoaXMuZ2V0Qm90dG9tUmlnaHRDb3JuZXIoKTplLmlzRXF1YWwodGhpcy5nZXRUb3BSaWdodENvcm5lcigpKT90aGlzLmdldEJvdHRvbUxlZnRDb3JuZXIoKTplLmlzRXF1YWwodGhpcy5nZXRCb3R0b21MZWZ0Q29ybmVyKCkpP3RoaXMuZ2V0VG9wUmlnaHRDb3JuZXIoKTp2b2lkIDB9LGdldEJvcmRlcnNTaGFyZWRXaXRoOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmluY2x1ZGVzUmFuZ2UoZSkpcmV0dXJuW107dmFyIHQ9e3RvcDpNYXRoLm1pbih0aGlzLmZyb20ucm93LHRoaXMudG8ucm93KSxib3R0b206TWF0aC5tYXgodGhpcy5mcm9tLnJvdyx0aGlzLnRvLnJvdyksbGVmdDpNYXRoLm1pbih0aGlzLmZyb20uY29sLHRoaXMudG8uY29sKSxyaWdodDpNYXRoLm1heCh0aGlzLmZyb20uY29sLHRoaXMudG8uY29sKX0sbj17dG9wOk1hdGgubWluKGUuZnJvbS5yb3csZS50by5yb3cpLGJvdHRvbTpNYXRoLm1heChlLmZyb20ucm93LGUudG8ucm93KSxsZWZ0Ok1hdGgubWluKGUuZnJvbS5jb2wsZS50by5jb2wpLHJpZ2h0Ok1hdGgubWF4KGUuZnJvbS5jb2wsZS50by5jb2wpfSxvPVtdO3JldHVybiB0LnRvcD09bi50b3AmJm8ucHVzaCgidG9wIiksdC5yaWdodD09bi5yaWdodCYmby5wdXNoKCJyaWdodCIpLHQuYm90dG9tPT1uLmJvdHRvbSYmby5wdXNoKCJib3R0b20iKSx0LmxlZnQ9PW4ubGVmdCYmby5wdXNoKCJsZWZ0Iiksb30sZ2V0SW5uZXI6ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5nZXRUb3BMZWZ0Q29ybmVyKCksdD10aGlzLmdldEJvdHRvbVJpZ2h0Q29ybmVyKCksbj1bXSxvPWUucm93O288PXQucm93O28rKylmb3IodmFyIGk9ZS5jb2w7aTw9dC5jb2w7aSsrKXRoaXMuZnJvbS5yb3c9PT1vJiZ0aGlzLmZyb20uY29sPT09aXx8dGhpcy50by5yb3c9PT1vJiZ0aGlzLnRvLmNvbD09PWl8fG4ucHVzaChuZXcgcihvLGkpKTtyZXR1cm4gbn0sZ2V0QWxsOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZ2V0VG9wTGVmdENvcm5lcigpLHQ9dGhpcy5nZXRCb3R0b21SaWdodENvcm5lcigpLG49W10sbz1lLnJvdztvPD10LnJvdztvKyspZm9yKHZhciBpPWUuY29sO2k8PXQuY29sO2krKyllLnJvdz09PW8mJmUuY29sPT09aT9uLnB1c2goZSk6dC5yb3c9PT1vJiZ0LmNvbD09PWk/bi5wdXNoKHQpOm4ucHVzaChuZXcgcihvLGkpKTtyZXR1cm4gbn0sZm9yQWxsOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLmdldFRvcExlZnRDb3JuZXIoKSxuPXRoaXMuZ2V0Qm90dG9tUmlnaHRDb3JuZXIoKSxvPXQucm93O288PW4ucm93O28rKylmb3IodmFyIHI9dC5jb2w7cjw9bi5jb2w7cisrKXt2YXIgaT1lKG8scik7aWYoaT09PSExKXJldHVybn19fSx7fSksd2luZG93LldhbGtvbnRhYmxlQ2VsbFJhbmdlPWl9LHsiY2VsbC9jb29yZHMiOjV9XSw3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se1dhbGtvbnRhYmxlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQX19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGwsYSx1LGMsaCxkLGYscCxnLG0sdz0obz1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KSx2PXcuYWRkQ2xhc3MseT13LmZhc3RJbm5lclRleHQsYj13LmlzVmlzaWJsZSxDPXcucmVtb3ZlQ2xhc3MsXz0ocj1lKCJoZWxwZXJzL29iamVjdCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkub2JqZWN0RWFjaCxSPShpPWUoImhlbHBlcnMvc3RyaW5nIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KSxTPVIudG9VcHBlckNhc2VGaXJzdCxFPVIucmFuZG9tU3RyaW5nLFQ9KHM9ZSgiZXZlbnQiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLldhbGtvbnRhYmxlRXZlbnQsTT0obD1lKCJvdmVybGF5cyIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSkuV2Fsa29udGFibGVPdmVybGF5cyxPPShhPWUoInNjcm9sbCIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSkuV2Fsa29udGFibGVTY3JvbGwsaz0odT1lKCJzZXR0aW5ncyIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSkuV2Fsa29udGFibGVTZXR0aW5ncyxIPShjPWUoInRhYmxlIiksYyYmYy5fX2VzTW9kdWxlJiZjfHx7ImRlZmF1bHQiOmN9KS5XYWxrb250YWJsZVRhYmxlLEQ9KGg9ZSgidmlld3BvcnQiKSxoJiZoLl9fZXNNb2R1bGUmJmh8fHsiZGVmYXVsdCI6aH0pLldhbGtvbnRhYmxlVmlld3BvcnQsQT0oKGQ9ZSgib3ZlcmxheS9fYmFzZS5qcyIpLGQmJmQuX19lc01vZHVsZSYmZHx8eyJkZWZhdWx0IjpkfSkuV2Fsa29udGFibGVPdmVybGF5LChmPWUoIm92ZXJsYXkvdG9wLmpzIiksZiYmZi5fX2VzTW9kdWxlJiZmfHx7ImRlZmF1bHQiOmZ9KS5XYWxrb250YWJsZVRvcE92ZXJsYXksKHA9ZSgib3ZlcmxheS9sZWZ0LmpzIikscCYmcC5fX2VzTW9kdWxlJiZwfHx7ImRlZmF1bHQiOnB9KS5XYWxrb250YWJsZUxlZnRPdmVybGF5LChnPWUoIm92ZXJsYXkvZGVidWcuanMiKSxnJiZnLl9fZXNNb2R1bGUmJmd8fHsiZGVmYXVsdCI6Z30pLldhbGtvbnRhYmxlRGVidWdPdmVybGF5LChtPWUoIm92ZXJsYXkvdG9wTGVmdENvcm5lci5qcyIpLG0mJm0uX19lc01vZHVsZSYmbXx8eyJkZWZhdWx0IjptfSkuV2Fsa29udGFibGVUb3BMZWZ0Q29ybmVyT3ZlcmxheSxmdW5jdGlvbihlKXt2YXIgdD1bXTtpZih0aGlzLmd1aWQ9Ind0XyIrRSgpLGUuY2xvbmVTb3VyY2U/KHRoaXMuY2xvbmVTb3VyY2U9ZS5jbG9uZVNvdXJjZSx0aGlzLmNsb25lT3ZlcmxheT1lLmNsb25lT3ZlcmxheSx0aGlzLnd0U2V0dGluZ3M9ZS5jbG9uZVNvdXJjZS53dFNldHRpbmdzLHRoaXMud3RUYWJsZT1uZXcgSCh0aGlzLGUudGFibGUsZS53dFJvb3RFbGVtZW50KSx0aGlzLnd0U2Nyb2xsPW5ldyBPKHRoaXMpLHRoaXMud3RWaWV3cG9ydD1lLmNsb25lU291cmNlLnd0Vmlld3BvcnQsdGhpcy53dEV2ZW50PW5ldyBUKHRoaXMpLHRoaXMuc2VsZWN0aW9ucz10aGlzLmNsb25lU291cmNlLnNlbGVjdGlvbnMpOih0aGlzLnd0U2V0dGluZ3M9bmV3IGsodGhpcyxlKSx0aGlzLnd0VGFibGU9bmV3IEgodGhpcyxlLnRhYmxlKSx0aGlzLnd0U2Nyb2xsPW5ldyBPKHRoaXMpLHRoaXMud3RWaWV3cG9ydD1uZXcgRCh0aGlzKSx0aGlzLnd0RXZlbnQ9bmV3IFQodGhpcyksdGhpcy5zZWxlY3Rpb25zPXRoaXMuZ2V0U2V0dGluZygic2VsZWN0aW9ucyIpLHRoaXMud3RPdmVybGF5cz1uZXcgTSh0aGlzKSx0aGlzLmV4cG9ydFNldHRpbmdzQXNDbGFzc05hbWVzKCkpLHRoaXMud3RUYWJsZS5USEVBRC5jaGlsZE5vZGVzLmxlbmd0aCYmdGhpcy53dFRhYmxlLlRIRUFELmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGgpe2Zvcih2YXIgbj0wLG89dGhpcy53dFRhYmxlLlRIRUFELmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGg7bz5uO24rKyl0LnB1c2godGhpcy53dFRhYmxlLlRIRUFELmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1tuXS5pbm5lckhUTUwpO3RoaXMuZ2V0U2V0dGluZygiY29sdW1uSGVhZGVycyIpLmxlbmd0aHx8dGhpcy51cGRhdGUoImNvbHVtbkhlYWRlcnMiLFtmdW5jdGlvbihlLG4pe3kobix0W2VdKX1dKX10aGlzLmRyYXduPSExLHRoaXMuZHJhd0ludGVycnVwdGVkPSExfSk7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKEEse2RyYXc6ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiExO3JldHVybiB0aGlzLmRyYXdJbnRlcnJ1cHRlZD0hMSxlfHxiKHRoaXMud3RUYWJsZS5UQUJMRSk/dGhpcy53dFRhYmxlLmRyYXcoZSk6dGhpcy5kcmF3SW50ZXJydXB0ZWQ9ITAsdGhpc30sZ2V0Q2VsbDpmdW5jdGlvbihlKXt2YXIgdD12b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiExO2lmKCF0KXJldHVybiB0aGlzLnd0VGFibGUuZ2V0Q2VsbChlKTt2YXIgbj10aGlzLnd0U2V0dGluZ3MuZ2V0U2V0dGluZygidG90YWxSb3dzIiksbz10aGlzLnd0U2V0dGluZ3MuZ2V0U2V0dGluZygiZml4ZWRSb3dzVG9wIikscj10aGlzLnd0U2V0dGluZ3MuZ2V0U2V0dGluZygiZml4ZWRSb3dzQm90dG9tIiksaT10aGlzLnd0U2V0dGluZ3MuZ2V0U2V0dGluZygiZml4ZWRDb2x1bW5zTGVmdCIpO2lmKGUucm93PG8mJmUuY29sPGkpcmV0dXJuIHRoaXMud3RPdmVybGF5cy50b3BMZWZ0Q29ybmVyT3ZlcmxheS5jbG9uZS53dFRhYmxlLmdldENlbGwoZSk7aWYoZS5yb3c8bylyZXR1cm4gdGhpcy53dE92ZXJsYXlzLnRvcE92ZXJsYXkuY2xvbmUud3RUYWJsZS5nZXRDZWxsKGUpO2lmKGUuY29sPGkmJmUucm93Pj1uLXIpe2lmKHRoaXMud3RPdmVybGF5cy5ib3R0b21MZWZ0Q29ybmVyT3ZlcmxheS5jbG9uZSlyZXR1cm4gdGhpcy53dE92ZXJsYXlzLmJvdHRvbUxlZnRDb3JuZXJPdmVybGF5LmNsb25lLnd0VGFibGUuZ2V0Q2VsbChlKX1lbHNle2lmKGUuY29sPGkpcmV0dXJuIHRoaXMud3RPdmVybGF5cy5sZWZ0T3ZlcmxheS5jbG9uZS53dFRhYmxlLmdldENlbGwoZSk7aWYoZS5yb3c8biYmZS5yb3c+bi1yJiZ0aGlzLnd0T3ZlcmxheXMuYm90dG9tT3ZlcmxheS5jbG9uZSlyZXR1cm4gdGhpcy53dE92ZXJsYXlzLmJvdHRvbU92ZXJsYXkuY2xvbmUud3RUYWJsZS5nZXRDZWxsKGUpfXJldHVybiB0aGlzLnd0VGFibGUuZ2V0Q2VsbChlKX0sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMud3RTZXR0aW5ncy51cGRhdGUoZSx0KX0sc2Nyb2xsVmVydGljYWw6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMud3RPdmVybGF5cy50b3BPdmVybGF5LnNjcm9sbFRvKGUpLHRoaXMuZ2V0U2V0dGluZygib25TY3JvbGxWZXJ0aWNhbGx5IiksdGhpc30sc2Nyb2xsSG9yaXpvbnRhbDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy53dE92ZXJsYXlzLmxlZnRPdmVybGF5LnNjcm9sbFRvKGUpLHRoaXMuZ2V0U2V0dGluZygib25TY3JvbGxIb3Jpem9udGFsbHkiKSx0aGlzfSxzY3JvbGxWaWV3cG9ydDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy53dFNjcm9sbC5zY3JvbGxWaWV3cG9ydChlKSx0aGlzfSxnZXRWaWV3cG9ydDpmdW5jdGlvbigpe3JldHVyblt0aGlzLnd0VGFibGUuZ2V0Rmlyc3RWaXNpYmxlUm93KCksdGhpcy53dFRhYmxlLmdldEZpcnN0VmlzaWJsZUNvbHVtbigpLHRoaXMud3RUYWJsZS5nZXRMYXN0VmlzaWJsZVJvdygpLHRoaXMud3RUYWJsZS5nZXRMYXN0VmlzaWJsZUNvbHVtbigpXX0sZ2V0T3ZlcmxheU5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZU92ZXJsYXk/dGhpcy5jbG9uZU92ZXJsYXkudHlwZToibWFzdGVyIn0saXNPdmVybGF5TmFtZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9uZU92ZXJsYXk/dGhpcy5jbG9uZU92ZXJsYXkudHlwZT09PWU6ITF9LGV4cG9ydFNldHRpbmdzQXNDbGFzc05hbWVzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXtyb3dIZWFkZXJzOlsiYXJyYXkiXSxjb2x1bW5IZWFkZXJzOlsiYXJyYXkiXX0sbj1bXSxvPVtdO18odCxmdW5jdGlvbih0LHIpe3QuaW5kZXhPZigiYXJyYXkiKT4tMSYmZS5nZXRTZXR0aW5nKHIpLmxlbmd0aCYmby5wdXNoKCJodCIrUyhyKSksbi5wdXNoKCJodCIrUyhyKSl9KSxDKHRoaXMud3RUYWJsZS53dFJvb3RFbGVtZW50LnBhcmVudE5vZGUsbiksdih0aGlzLnd0VGFibGUud3RSb290RWxlbWVudC5wYXJlbnROb2RlLG8pfSxnZXRTZXR0aW5nOmZ1bmN0aW9uKGUsdCxuLG8scil7cmV0dXJuIHRoaXMud3RTZXR0aW5ncy5nZXRTZXR0aW5nKGUsdCxuLG8scil9LGhhc1NldHRpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMud3RTZXR0aW5ncy5oYXMoZSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnd0T3ZlcmxheXMuZGVzdHJveSgpLHRoaXMud3RFdmVudC5kZXN0cm95KCl9fSx7fSksd2luZG93LldhbGtvbnRhYmxlPUF9LHtldmVudDo4LCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9vYmplY3QiOjUyLCJoZWxwZXJzL3N0cmluZyI6NTQsIm92ZXJsYXkvX2Jhc2UuanMiOjExLCJvdmVybGF5L2RlYnVnLmpzIjoxMiwib3ZlcmxheS9sZWZ0LmpzIjoxMywib3ZlcmxheS90b3AuanMiOjE0LCJvdmVybGF5L3RvcExlZnRDb3JuZXIuanMiOjE1LG92ZXJsYXlzOjE2LHNjcm9sbDoxNyxzZXR0aW5nczoxOSx0YWJsZToyMCx2aWV3cG9ydDoyMn1dLDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXt2YXIgdD10aGlzLG49ZChlKTt0aGlzLmluc3RhbmNlPWU7dmFyIG89W251bGwsbnVsbF07dGhpcy5kYmxDbGlja1RpbWVvdXQ9W251bGwsbnVsbF07dmFyIHIsaT1mdW5jdGlvbihlKXt2YXIgbj10LnBhcmVudENlbGwoZS5yZWFsVGFyZ2V0KTt1KGUucmVhbFRhcmdldCwiY29ybmVyIik/dC5pbnN0YW5jZS5nZXRTZXR0aW5nKCJvbkNlbGxDb3JuZXJNb3VzZURvd24iLGUsZS5yZWFsVGFyZ2V0KTpuLlREJiZ0Lmluc3RhbmNlLmhhc1NldHRpbmcoIm9uQ2VsbE1vdXNlRG93biIpJiZ0Lmluc3RhbmNlLmdldFNldHRpbmcoIm9uQ2VsbE1vdXNlRG93biIsZSxuLmNvb3JkcyxuLlRELHQuaW5zdGFuY2UpLDIhPT1lLmJ1dHRvbiYmbi5URCYmKG9bMF09bi5URCxjbGVhclRpbWVvdXQodC5kYmxDbGlja1RpbWVvdXRbMF0pLHQuZGJsQ2xpY2tUaW1lb3V0WzBdPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtvWzBdPW51bGx9LDFlMykpfSxzPWZ1bmN0aW9uKGUpe3QuaW5zdGFuY2UudG91Y2hNb3Zpbmc9ITB9LGw9ZnVuY3Rpb24oZSl7bi5hZGRFdmVudExpc3RlbmVyKHRoaXMsInRvdWNobW92ZSIscyksdC5jaGVja0lmVG91Y2hNb3ZlPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5pbnN0YW5jZS50b3VjaE1vdmluZz09PSEwPyh0Lmluc3RhbmNlLnRvdWNoTW92aW5nPXZvaWQgMCx2b2lkIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixzLCExKSk6dm9pZCBpKGUpfSwzMCl9LGY9ZnVuY3Rpb24oZSl7dmFyIG4sbyxyO3QuaW5zdGFuY2UuaGFzU2V0dGluZygib25DZWxsTW91c2VPdmVyIikmJihuPXQuaW5zdGFuY2Uud3RUYWJsZS5UQUJMRSxvPWEoZS5yZWFsVGFyZ2V0LFsiVEQiLCJUSCJdLG4pLHI9dC5pbnN0YW5jZS5jbG9uZVNvdXJjZXx8dC5pbnN0YW5jZSxvJiZvIT09ci5sYXN0TW91c2VPdmVyJiZjKG8sbikmJihyLmxhc3RNb3VzZU92ZXI9byx0Lmluc3RhbmNlLmdldFNldHRpbmcoIm9uQ2VsbE1vdXNlT3ZlciIsZSx0Lmluc3RhbmNlLnd0VGFibGUuZ2V0Q29vcmRzKG8pLG8sdC5pbnN0YW5jZSkpKX0scD1mdW5jdGlvbihlKXtpZigyIT09ZS5idXR0b24pe3ZhciBuPXQucGFyZW50Q2VsbChlLnJlYWxUYXJnZXQpO24uVEQ9PT1vWzBdJiZuLlREPT09b1sxXT8odShlLnJlYWxUYXJnZXQsImNvcm5lciIpP3QuaW5zdGFuY2UuZ2V0U2V0dGluZygib25DZWxsQ29ybmVyRGJsQ2xpY2siLGUsbi5jb29yZHMsbi5URCx0Lmluc3RhbmNlKTp0Lmluc3RhbmNlLmdldFNldHRpbmcoIm9uQ2VsbERibENsaWNrIixlLG4uY29vcmRzLG4uVEQsdC5pbnN0YW5jZSksb1swXT1udWxsLG9bMV09bnVsbCk6bi5URD09PW9bMF0mJihvWzFdPW4uVEQsY2xlYXJUaW1lb3V0KHQuZGJsQ2xpY2tUaW1lb3V0WzFdKSx0LmRibENsaWNrVGltZW91dFsxXT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7b1sxXT1udWxsfSw1MDApKX19LGc9ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KHIpLGUucHJldmVudERlZmF1bHQoKSxwKGUpfTtpZihuLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5pbnN0YW5jZS53dFRhYmxlLmhvbGRlciwibW91c2Vkb3duIixpKSxuLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5pbnN0YW5jZS53dFRhYmxlLlRBQkxFLCJtb3VzZW92ZXIiLGYpLG4uYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmluc3RhbmNlLnd0VGFibGUuaG9sZGVyLCJtb3VzZXVwIixwKSx0aGlzLmluc3RhbmNlLnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmaCgpJiYhdC5pbnN0YW5jZS53dFRhYmxlLmlzV29ya2luZ09uQ2xvbmUoKSl7dmFyIG09Ii4iK3RoaXMuaW5zdGFuY2Uud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZS5jbGFzc05hbWUuc3BsaXQoIiAiKS5qb2luKCIuIik7bi5hZGRFdmVudExpc3RlbmVyKHRoaXMuaW5zdGFuY2Uud3RUYWJsZS5ob2xkZXIsInRvdWNoc3RhcnQiLGZ1bmN0aW9uKGUpe3QuaW5zdGFuY2UudG91Y2hBcHBsaWVkPSEwLGMoZS50YXJnZXQsbSkmJmwuY2FsbChlLnRhcmdldCxlKX0pLG4uYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmluc3RhbmNlLnd0VGFibGUuaG9sZGVyLCJ0b3VjaGVuZCIsZnVuY3Rpb24oZSl7dC5pbnN0YW5jZS50b3VjaEFwcGxpZWQ9ITEsYyhlLnRhcmdldCxtKSYmZy5jYWxsKGUudGFyZ2V0LGUpfSksdC5pbnN0YW5jZS5tb21lbnR1bVNjcm9sbGluZ3x8KHQuaW5zdGFuY2UubW9tZW50dW1TY3JvbGxpbmc9e30pLG4uYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmluc3RhbmNlLnd0VGFibGUuaG9sZGVyLCJzY3JvbGwiLGZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dCh0Lmluc3RhbmNlLm1vbWVudHVtU2Nyb2xsaW5nLl90aW1lb3V0KSx0Lmluc3RhbmNlLm1vbWVudHVtU2Nyb2xsaW5nLm9uZ29pbmd8fHQuaW5zdGFuY2UuZ2V0U2V0dGluZygib25CZWZvcmVUb3VjaFNjcm9sbCIpLHQuaW5zdGFuY2UubW9tZW50dW1TY3JvbGxpbmcub25nb2luZz0hMCx0Lmluc3RhbmNlLm1vbWVudHVtU2Nyb2xsaW5nLl90aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0Lmluc3RhbmNlLnRvdWNoQXBwbGllZHx8KHQuaW5zdGFuY2UubW9tZW50dW1TY3JvbGxpbmcub25nb2luZz0hMSx0Lmluc3RhbmNlLmdldFNldHRpbmcoIm9uQWZ0ZXJNb21lbnR1bVNjcm9sbCIpKX0sMjAwKX0pfW4uYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsZnVuY3Rpb24oKXsibm9uZSIhPT10Lmluc3RhbmNlLmdldFNldHRpbmcoInN0cmV0Y2hIIikmJnQuaW5zdGFuY2UuZHJhdygpfSksdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuZGJsQ2xpY2tUaW1lb3V0WzBdKSxjbGVhclRpbWVvdXQodGhpcy5kYmxDbGlja1RpbWVvdXRbMV0pLG4uZGVzdHJveSgpfX1PYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtXYWxrb250YWJsZUV2ZW50OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciByLGkscyxsPShyPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLGE9bC5jbG9zZXN0LHU9bC5oYXNDbGFzcyxjPWwuaXNDaGlsZE9mLGg9KGk9ZSgiaGVscGVycy9icm93c2VyIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5pc01vYmlsZUJyb3dzZXIsZD0ocz1lKCJldmVudE1hbmFnZXIiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLmV2ZW50TWFuYWdlcjtvLnByb3RvdHlwZS5wYXJlbnRDZWxsPWZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49dGhpcy5pbnN0YW5jZS53dFRhYmxlLlRBQkxFLG89YShlLFsiVEQiLCJUSCJdLG4pLHI9YShvLFsiVEFCTEUiXSk7cmV0dXJuIG8mJmMobyxuKSYmcj09bj8odC5jb29yZHM9dGhpcy5pbnN0YW5jZS53dFRhYmxlLmdldENvb3JkcyhvKSx0LlREPW8pOnUoZSwid3RCb3JkZXIiKSYmdShlLCJjdXJyZW50Iik/KHQuY29vcmRzPXRoaXMuaW5zdGFuY2Uuc2VsZWN0aW9ucy5jdXJyZW50LmNlbGxSYW5nZS5oaWdobGlnaHQsdC5URD10aGlzLmluc3RhbmNlLnd0VGFibGUuZ2V0Q2VsbCh0LmNvb3JkcykpOnUoZSwid3RCb3JkZXIiKSYmdShlLCJhcmVhIikmJnRoaXMuaW5zdGFuY2Uuc2VsZWN0aW9ucy5hcmVhLmNlbGxSYW5nZSYmKHQuY29vcmRzPXRoaXMuaW5zdGFuY2Uuc2VsZWN0aW9ucy5hcmVhLmNlbGxSYW5nZS50byx0LlREPXRoaXMuaW5zdGFuY2Uud3RUYWJsZS5nZXRDZWxsKHQuY29vcmRzKSksdH0sd2luZG93LldhbGtvbnRhYmxlRXZlbnQ9b30se2V2ZW50TWFuYWdlcjo0MSwiaGVscGVycy9icm93c2VyIjo0MywiaGVscGVycy9kb20vZWxlbWVudCI6NDZ9XSw5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se1dhbGtvbnRhYmxlQ29sdW1uRmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLm9mZnNldD1lLHRoaXMudG90YWw9dCx0aGlzLmNvdW50VEg9bn07JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKG8se29mZnNldHRlZDpmdW5jdGlvbihlKXtyZXR1cm4gZSt0aGlzLm9mZnNldH0sdW5PZmZzZXR0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUtdGhpcy5vZmZzZXR9LHJlbmRlcmVkVG9Tb3VyY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub2Zmc2V0dGVkKGUpfSxzb3VyY2VUb1JlbmRlcmVkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnVuT2Zmc2V0dGVkKGUpfSxvZmZzZXR0ZWRUSDpmdW5jdGlvbihlKXtyZXR1cm4gZS10aGlzLmNvdW50VEh9LHVuT2Zmc2V0dGVkVEg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUrdGhpcy5jb3VudFRIfSx2aXNpYmxlUm93SGVhZGVkQ29sdW1uVG9Tb3VyY2VDb2x1bW46ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVuZGVyZWRUb1NvdXJjZSh0aGlzLm9mZnNldHRlZFRIKGUpKX0sc291cmNlQ29sdW1uVG9WaXNpYmxlUm93SGVhZGVkQ29sdW1uOmZ1bmN0aW9uKGUpew0KcmV0dXJuIHRoaXMudW5PZmZzZXR0ZWRUSCh0aGlzLnNvdXJjZVRvUmVuZGVyZWQoZSkpfX0se30pLHdpbmRvdy5XYWxrb250YWJsZUNvbHVtbkZpbHRlcj1vfSx7fV0sMTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7V2Fsa29udGFibGVSb3dGaWx0ZXI6e2dldDpmdW5jdGlvbigpe3JldHVybiBvfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG89ZnVuY3Rpb24oZSx0LG4pe3RoaXMub2Zmc2V0PWUsdGhpcy50b3RhbD10LHRoaXMuY291bnRUSD1ufTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3Mobyx7b2Zmc2V0dGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlK3RoaXMub2Zmc2V0fSx1bk9mZnNldHRlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS10aGlzLm9mZnNldH0scmVuZGVyZWRUb1NvdXJjZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vZmZzZXR0ZWQoZSl9LHNvdXJjZVRvUmVuZGVyZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudW5PZmZzZXR0ZWQoZSl9LG9mZnNldHRlZFRIOmZ1bmN0aW9uKGUpe3JldHVybiBlLXRoaXMuY291bnRUSH0sdW5PZmZzZXR0ZWRUSDpmdW5jdGlvbihlKXtyZXR1cm4gZSt0aGlzLmNvdW50VEh9LHZpc2libGVDb2xIZWFkZWRSb3dUb1NvdXJjZVJvdzpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW5kZXJlZFRvU291cmNlKHRoaXMub2Zmc2V0dGVkVEgoZSkpfSxzb3VyY2VSb3dUb1Zpc2libGVDb2xIZWFkZWRSb3c6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudW5PZmZzZXR0ZWRUSCh0aGlzLnNvdXJjZVRvUmVuZGVyZWQoZSkpfX0se30pLHdpbmRvdy5XYWxrb250YWJsZVJvd0ZpbHRlcj1vfSx7fV0sMTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7V2Fsa29udGFibGVPdmVybGF5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZH19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzPShvPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pLGw9cy5nZXRTY3JvbGxhYmxlRWxlbWVudCxhPXMuZ2V0VHJpbW1pbmdDb250YWluZXIsdT0ocj1lKCJoZWxwZXJzL29iamVjdCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkuZGVmaW5lR2V0dGVyLGM9KGk9ZSgiZXZlbnRNYW5hZ2VyIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5ldmVudE1hbmFnZXIsaD17fSxkPWZ1bmN0aW9uKGUpe3UodGhpcywid290IixlLHt3cml0YWJsZTohMX0pLHRoaXMuaW5zdGFuY2U9dGhpcy53b3QsdGhpcy50eXBlPSIiLHRoaXMubWFpblRhYmxlU2Nyb2xsYWJsZUVsZW1lbnQ9bnVsbCx0aGlzLlRBQkxFPXRoaXMud290Lnd0VGFibGUuVEFCTEUsdGhpcy5oaWRlcj10aGlzLndvdC53dFRhYmxlLmhpZGVyLHRoaXMuc3ByZWFkZXI9dGhpcy53b3Qud3RUYWJsZS5zcHJlYWRlcix0aGlzLmhvbGRlcj10aGlzLndvdC53dFRhYmxlLmhvbGRlcix0aGlzLnd0Um9vdEVsZW1lbnQ9dGhpcy53b3Qud3RUYWJsZS53dFJvb3RFbGVtZW50LHRoaXMudHJpbW1pbmdDb250YWluZXI9YSh0aGlzLmhpZGVyLnBhcmVudE5vZGUucGFyZW50Tm9kZSksdGhpcy5uZWVkRnVsbFJlbmRlcj10aGlzLnNob3VsZEJlUmVuZGVyZWQoKSx0aGlzLmFyZUVsZW1lbnRTaXplc0FkanVzdGVkPSExfSxmPWQ7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKGQse3Nob3VsZEJlUmVuZGVyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdXBkYXRlVHJpbW1pbmdDb250YWluZXI6ZnVuY3Rpb24oKXt0aGlzLnRyaW1taW5nQ29udGFpbmVyPWEodGhpcy5oaWRlci5wYXJlbnROb2RlLnBhcmVudE5vZGUpfSx1cGRhdGVNYWluU2Nyb2xsYWJsZUVsZW1lbnQ6ZnVuY3Rpb24oKXt0aGlzLm1haW5UYWJsZVNjcm9sbGFibGVFbGVtZW50PWwodGhpcy53b3Qud3RUYWJsZS5UQUJMRSl9LG1ha2VDbG9uZTpmdW5jdGlvbihlKXtpZigtMT09PWYuQ0xPTkVfVFlQRVMuaW5kZXhPZihlKSl0aHJvdyBuZXcgRXJyb3IoJ0Nsb25lIHR5cGUgIicrZSsnIiBpcyBub3Qgc3VwcG9ydGVkLicpO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEFCTEUiKTt0LmNsYXNzTmFtZT0iaHRfY2xvbmVfIitlKyIgaGFuZHNvbnRhYmxlIix0LnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdC5zdHlsZS50b3A9MCx0LnN0eWxlLmxlZnQ9MCx0LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLG4uY2xhc3NOYW1lPXRoaXMud290Lnd0VGFibGUuVEFCTEUuY2xhc3NOYW1lLHQuYXBwZW5kQ2hpbGQobiksdGhpcy50eXBlPWUsdGhpcy53b3Qud3RUYWJsZS53dFJvb3RFbGVtZW50LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodCk7dmFyIG89dGhpcy53b3QuZ2V0U2V0dGluZygicHJldmVudE92ZXJmbG93Iik7cmV0dXJuIG89PT0hMHx8Imhvcml6b250YWwiPT09byYmdGhpcy50eXBlPT09Zi5DTE9ORV9UT1B8fCJ2ZXJ0aWNhbCI9PT1vJiZ0aGlzLnR5cGU9PT1mLkNMT05FX0xFRlQ/dGhpcy5tYWluVGFibGVTY3JvbGxhYmxlRWxlbWVudD13aW5kb3c6dGhpcy5tYWluVGFibGVTY3JvbGxhYmxlRWxlbWVudD1sKHRoaXMud290Lnd0VGFibGUuVEFCTEUpLG5ldyBXYWxrb250YWJsZSh7Y2xvbmVTb3VyY2U6dGhpcy53b3QsY2xvbmVPdmVybGF5OnRoaXMsdGFibGU6bn0pfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGU9dm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTohMSx0PXRoaXMuc2hvdWxkQmVSZW5kZXJlZCgpO3RoaXMuY2xvbmUmJih0aGlzLm5lZWRGdWxsUmVuZGVyfHx0KSYmdGhpcy5jbG9uZS5kcmF3KGUpLHRoaXMubmVlZEZ1bGxSZW5kZXI9dH0sZGVzdHJveTpmdW5jdGlvbigpe2ModGhpcy5jbG9uZSkuZGVzdHJveSgpfX0se2dldCBDTE9ORV9UT1AoKXtyZXR1cm4idG9wIn0sZ2V0IENMT05FX0JPVFRPTSgpe3JldHVybiJib3R0b20ifSxnZXQgQ0xPTkVfTEVGVCgpe3JldHVybiJsZWZ0In0sZ2V0IENMT05FX1RPUF9MRUZUX0NPUk5FUigpe3JldHVybiJ0b3BfbGVmdF9jb3JuZXIifSxnZXQgQ0xPTkVfQk9UVE9NX0xFRlRfQ09STkVSKCl7cmV0dXJuImJvdHRvbV9sZWZ0X2Nvcm5lciJ9LGdldCBDTE9ORV9ERUJVRygpe3JldHVybiJkZWJ1ZyJ9LGdldCBDTE9ORV9UWVBFUygpe3JldHVybltmLkNMT05FX1RPUCxmLkNMT05FX0JPVFRPTSxmLkNMT05FX0xFRlQsZi5DTE9ORV9UT1BfTEVGVF9DT1JORVIsZi5DTE9ORV9CT1RUT01fTEVGVF9DT1JORVIsZi5DTE9ORV9ERUJVR119LHJlZ2lzdGVyT3ZlcmxheTpmdW5jdGlvbihlLHQpe2lmKC0xPT09Zi5DTE9ORV9UWVBFUy5pbmRleE9mKGUpKXRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgb3ZlcmxheSAoIitlKyIpLiIpO2hbZV09dH0sY3JlYXRlT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgaFtlXSh0KX0saXNPdmVybGF5VHlwZU9mOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmhbdF0/ZSBpbnN0YW5jZW9mIGhbdF06ITF9fSksd2luZG93LldhbGtvbnRhYmxlT3ZlcmxheT1kfSx7ZXZlbnRNYW5hZ2VyOjQxLCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9vYmplY3QiOjUyfV0sMTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7V2Fsa29udGFibGVEZWJ1Z092ZXJsYXk6e2dldDpmdW5jdGlvbigpe3JldHVybiBsfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpPShvPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pLmFkZENsYXNzLHM9KHI9ZSgiX2Jhc2UiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLldhbGtvbnRhYmxlT3ZlcmxheSxsPWZ1bmN0aW9uKGUpeyR0cmFjZXVyUnVudGltZS5zdXBlckNvbnN0cnVjdG9yKGEpLmNhbGwodGhpcyxlKSx0aGlzLmNsb25lPXRoaXMubWFrZUNsb25lKHMuQ0xPTkVfREVCVUcpLHRoaXMuY2xvbmUud3RUYWJsZS5ob2xkZXIuc3R5bGUub3BhY2l0eT0uNCx0aGlzLmNsb25lLnd0VGFibGUuaG9sZGVyLnN0eWxlLnRleHRTaGFkb3c9IjAgMCAycHggI2ZmMDAwMCIsaSh0aGlzLmNsb25lLnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUsInd0RGVidWdWaXNpYmxlIil9LGE9bDskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MobCx7fSx7fSxzKSx3aW5kb3cuV2Fsa29udGFibGVEZWJ1Z092ZXJsYXk9bCxzLnJlZ2lzdGVyT3ZlcmxheShzLkNMT05FX0RFQlVHLGwpfSx7X2Jhc2U6MTEsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2fV0sMTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7V2Fsa29udGFibGVMZWZ0T3ZlcmxheTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHd9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGk9KG89ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSkscz1pLmFkZENsYXNzLGw9aS5nZXRTY3JvbGxiYXJXaWR0aCxhPWkuZ2V0U2Nyb2xsTGVmdCx1PWkuZ2V0V2luZG93U2Nyb2xsVG9wLGM9aS5oYXNDbGFzcyxoPWkub3V0ZXJXaWR0aCxkPWkuaW5uZXJIZWlnaHQsZj1pLnJlbW92ZUNsYXNzLHA9aS5zZXRPdmVybGF5UG9zaXRpb24sZz1pLnJlc2V0Q3NzVHJhbnNmb3JtLG09KHI9ZSgiX2Jhc2UiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLldhbGtvbnRhYmxlT3ZlcmxheSx3PWZ1bmN0aW9uKGUpeyR0cmFjZXVyUnVudGltZS5zdXBlckNvbnN0cnVjdG9yKHYpLmNhbGwodGhpcyxlKSx0aGlzLmNsb25lPXRoaXMubWFrZUNsb25lKG0uQ0xPTkVfTEVGVCl9LHY9dzskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3Modyx7c2hvdWxkQmVSZW5kZXJlZDpmdW5jdGlvbigpe3JldHVybiEoIXRoaXMud290LmdldFNldHRpbmcoImZpeGVkQ29sdW1uc0xlZnQiKSYmIXRoaXMud290LmdldFNldHRpbmcoInJvd0hlYWRlcnMiKS5sZW5ndGgpfSxyZXNldEZpeGVkUG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzLm5lZWRGdWxsUmVuZGVyJiZ0aGlzLndvdC53dFRhYmxlLmhvbGRlci5wYXJlbnROb2RlKXt2YXIgZT10aGlzLmNsb25lLnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUsdD0wLG49dGhpcy53b3QuZ2V0U2V0dGluZygicHJldmVudE92ZXJmbG93Iik7aWYodGhpcy50cmltbWluZ0NvbnRhaW5lciE9PXdpbmRvd3x8biYmImhvcml6b250YWwiPT09bil0PXRoaXMuZ2V0U2Nyb2xsUG9zaXRpb24oKSxnKGUpO2Vsc2V7dmFyIG8scixpPXRoaXMud290Lnd0VGFibGUuaGlkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz1NYXRoLmNlaWwoaS5sZWZ0KSxsPU1hdGguY2VpbChpLnJpZ2h0KTtyPXRoaXMud290Lnd0VGFibGUuaGlkZXIuc3R5bGUudG9wLHI9IiI9PT1yPzA6cixvPTA+cyYmbC1lLm9mZnNldFdpZHRoPjA/LXM6MCx0PW8sbys9InB4IixwKGUsbyxyKX10aGlzLmFkanVzdEhlYWRlckJvcmRlcnNQb3NpdGlvbih0KSx0aGlzLmFkanVzdEVsZW1lbnRzU2l6ZSgpfX0sc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oZSl7dGhpcy5tYWluVGFibGVTY3JvbGxhYmxlRWxlbWVudD09PXdpbmRvdz93aW5kb3cuc2Nyb2xsVG8oZSx1KCkpOnRoaXMubWFpblRhYmxlU2Nyb2xsYWJsZUVsZW1lbnQuc2Nyb2xsTGVmdD1lfSxvblNjcm9sbDpmdW5jdGlvbigpe3RoaXMud290LmdldFNldHRpbmcoIm9uU2Nyb2xsVmVydGljYWxseSIpfSxzdW1DZWxsU2l6ZXM6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxvPXRoaXMud290Lnd0U2V0dGluZ3MuZGVmYXVsdENvbHVtbldpZHRoO3Q+ZTspbis9dGhpcy53b3Qud3RUYWJsZS5nZXRTdHJldGNoZWRDb2x1bW5XaWR0aChlKXx8byxlKys7cmV0dXJuIG59LGFkanVzdEVsZW1lbnRzU2l6ZTpmdW5jdGlvbigpe3ZhciBlPXZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ITE7dGhpcy51cGRhdGVUcmltbWluZ0NvbnRhaW5lcigpLCh0aGlzLm5lZWRGdWxsUmVuZGVyfHxlKSYmKHRoaXMuYWRqdXN0Um9vdEVsZW1lbnRTaXplKCksdGhpcy5hZGp1c3RSb290Q2hpbGRyZW5TaXplKCksZXx8KHRoaXMuYXJlRWxlbWVudFNpemVzQWRqdXN0ZWQ9ITApKX0sYWRqdXN0Um9vdEVsZW1lbnRTaXplOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLndvdC53dFRhYmxlLmhvbGRlcixuPXQuY2xpZW50SGVpZ2h0PT09dC5vZmZzZXRIZWlnaHQ/MDpsKCksbz10aGlzLmNsb25lLnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUscj1vLnN0eWxlLGk9dGhpcy53b3QuZ2V0U2V0dGluZygicHJldmVudE92ZXJmbG93Iik7aWYodGhpcy50cmltbWluZ0NvbnRhaW5lciE9PXdpbmRvd3x8InZlcnRpY2FsIj09PWkpe3ZhciBzPXRoaXMud290Lnd0Vmlld3BvcnQuZ2V0V29ya3NwYWNlSGVpZ2h0KCktbjtzPU1hdGgubWluKHMsZCh0aGlzLndvdC53dFRhYmxlLnd0Um9vdEVsZW1lbnQpKSxyLmhlaWdodD1zKyJweCJ9ZWxzZSByLmhlaWdodD0iIjt0aGlzLmNsb25lLnd0VGFibGUuaG9sZGVyLnN0eWxlLmhlaWdodD1yLmhlaWdodCxlPWgodGhpcy5jbG9uZS53dFRhYmxlLlRBQkxFKSxyLndpZHRoPSgwPT09ZT9lOmUrNCkrInB4In0sYWRqdXN0Um9vdENoaWxkcmVuU2l6ZTpmdW5jdGlvbigpe3ZhciBlPWwoKTt0aGlzLmNsb25lLnd0VGFibGUuaGlkZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGlkZXIuc3R5bGUuaGVpZ2h0LHRoaXMuY2xvbmUud3RUYWJsZS5ob2xkZXIuc3R5bGUuaGVpZ2h0PXRoaXMuY2xvbmUud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZS5zdHlsZS5oZWlnaHQsMD09PWUmJihlPTMwKSx0aGlzLmNsb25lLnd0VGFibGUuaG9sZGVyLnN0eWxlLndpZHRoPXBhcnNlSW50KHRoaXMuY2xvbmUud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZS5zdHlsZS53aWR0aCwxMCkrZSsicHgifSxhcHBseVRvRE9NOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy53b3QuZ2V0U2V0dGluZygidG90YWxDb2x1bW5zIik7aWYodGhpcy5hcmVFbGVtZW50U2l6ZXNBZGp1c3RlZHx8dGhpcy5hZGp1c3RFbGVtZW50c1NpemUoKSwibnVtYmVyIj09dHlwZW9mIHRoaXMud290Lnd0Vmlld3BvcnQuY29sdW1uc1JlbmRlckNhbGN1bGF0b3Iuc3RhcnRQb3NpdGlvbil0aGlzLnNwcmVhZGVyLnN0eWxlLmxlZnQ9dGhpcy53b3Qud3RWaWV3cG9ydC5jb2x1bW5zUmVuZGVyQ2FsY3VsYXRvci5zdGFydFBvc2l0aW9uKyJweCI7ZWxzZXtpZigwIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkluY29ycmVjdCB2YWx1ZSBvZiB0aGUgY29sdW1uc1JlbmRlckNhbGN1bGF0b3IiKTt0aGlzLnNwcmVhZGVyLnN0eWxlLmxlZnQ9IjAifXRoaXMuc3ByZWFkZXIuc3R5bGUucmlnaHQ9IiIsdGhpcy5uZWVkRnVsbFJlbmRlciYmdGhpcy5zeW5jT3ZlcmxheU9mZnNldCgpfSxzeW5jT3ZlcmxheU9mZnNldDpmdW5jdGlvbigpeyJudW1iZXIiPT10eXBlb2YgdGhpcy53b3Qud3RWaWV3cG9ydC5yb3dzUmVuZGVyQ2FsY3VsYXRvci5zdGFydFBvc2l0aW9uP3RoaXMuY2xvbmUud3RUYWJsZS5zcHJlYWRlci5zdHlsZS50b3A9dGhpcy53b3Qud3RWaWV3cG9ydC5yb3dzUmVuZGVyQ2FsY3VsYXRvci5zdGFydFBvc2l0aW9uKyJweCI6dGhpcy5jbG9uZS53dFRhYmxlLnNwcmVhZGVyLnN0eWxlLnRvcD0iIn0sc2Nyb2xsVG86ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldFRhYmxlUGFyZW50T2Zmc2V0KCksbz10aGlzLndvdC5jbG9uZVNvdXJjZT90aGlzLndvdC5jbG9uZVNvdXJjZTp0aGlzLndvdCxyPW8ud3RUYWJsZS5ob2xkZXIsaT0wO3QmJnIub2Zmc2V0V2lkdGghPT1yLmNsaWVudFdpZHRoJiYoaT1sKCkpLHQ/KG4rPXRoaXMuc3VtQ2VsbFNpemVzKDAsZSsxKSxuLT10aGlzLndvdC53dFZpZXdwb3J0LmdldFZpZXdwb3J0V2lkdGgoKSk6bis9dGhpcy5zdW1DZWxsU2l6ZXModGhpcy53b3QuZ2V0U2V0dGluZygiZml4ZWRDb2x1bW5zTGVmdCIpLGUpLG4rPWksdGhpcy5zZXRTY3JvbGxQb3NpdGlvbihuKX0sZ2V0VGFibGVQYXJlbnRPZmZzZXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLndvdC5nZXRTZXR0aW5nKCJwcmV2ZW50T3ZlcmZsb3ciKSx0PTA7cmV0dXJuIGV8fHRoaXMudHJpbW1pbmdDb250YWluZXIhPT13aW5kb3d8fCh0PXRoaXMud290Lnd0VGFibGUuaG9sZGVyT2Zmc2V0LmxlZnQpLHR9LGdldFNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcy5tYWluVGFibGVTY3JvbGxhYmxlRWxlbWVudCl9LGFkanVzdEhlYWRlckJvcmRlcnNQb3NpdGlvbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLndvdC53dFRhYmxlLmhvbGRlci5wYXJlbnROb2RlLG49dGhpcy53b3QuZ2V0U2V0dGluZygicm93SGVhZGVycyIpLG89dGhpcy53b3QuZ2V0U2V0dGluZygiZml4ZWRDb2x1bW5zTGVmdCIpO2lmKG8mJiFuLmxlbmd0aClzKHQsImlubmVyQm9yZGVyTGVmdCIpO2Vsc2UgaWYoIW8mJm4ubGVuZ3RoKXt2YXIgcj1jKHQsImlubmVyQm9yZGVyTGVmdCIpO2U/cyh0LCJpbm5lckJvcmRlckxlZnQiKTpmKHQsImlubmVyQm9yZGVyTGVmdCIpLCghciYmZXx8ciYmIWUpJiZ0aGlzLndvdC53dE92ZXJsYXlzLmFkanVzdEVsZW1lbnRzU2l6ZSgpfX19LHt9LG0pLHdpbmRvdy5XYWxrb250YWJsZUxlZnRPdmVybGF5PXcsbS5yZWdpc3Rlck92ZXJsYXkobS5DTE9ORV9MRUZULHcpfSx7X2Jhc2U6MTEsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2fV0sMTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7V2Fsa29udGFibGVUb3BPdmVybGF5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gd319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaT0obz1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KSxzPWkuYWRkQ2xhc3MsbD1pLmdldFNjcm9sbGJhcldpZHRoLGE9aS5nZXRTY3JvbGxUb3AsdT1pLmdldFdpbmRvd1Njcm9sbExlZnQsYz1pLmhhc0NsYXNzLGg9aS5vdXRlckhlaWdodCxkPWkuaW5uZXJXaWR0aCxmPWkucmVtb3ZlQ2xhc3MscD1pLnNldE92ZXJsYXlQb3NpdGlvbixnPWkucmVzZXRDc3NUcmFuc2Zvcm0sbT0ocj1lKCJfYmFzZSIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkuV2Fsa29udGFibGVPdmVybGF5LHc9ZnVuY3Rpb24oZSl7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IodikuY2FsbCh0aGlzLGUpLHRoaXMuY2xvbmU9dGhpcy5tYWtlQ2xvbmUobS5DTE9ORV9UT1ApfSx2PXc7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKHcse3Nob3VsZEJlUmVuZGVyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hKCF0aGlzLndvdC5nZXRTZXR0aW5nKCJmaXhlZFJvd3NUb3AiKSYmIXRoaXMud290LmdldFNldHRpbmcoImNvbHVtbkhlYWRlcnMiKS5sZW5ndGgpfSxyZXNldEZpeGVkUG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzLm5lZWRGdWxsUmVuZGVyJiZ0aGlzLndvdC53dFRhYmxlLmhvbGRlci5wYXJlbnROb2RlKXt2YXIgZT10aGlzLmNsb25lLnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUsdD0wLG49dGhpcy53b3QuZ2V0U2V0dGluZygicHJldmVudE92ZXJmbG93Iik7aWYodGhpcy50cmltbWluZ0NvbnRhaW5lciE9PXdpbmRvd3x8biYmInZlcnRpY2FsIj09PW4pdD10aGlzLmdldFNjcm9sbFBvc2l0aW9uKCksZyhlKTtlbHNle3ZhciBvLHIsaT10aGlzLndvdC53dFRhYmxlLmhpZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHM9TWF0aC5jZWlsKGkudG9wKSxsPU1hdGguY2VpbChpLmJvdHRvbSk7bz10aGlzLndvdC53dFRhYmxlLmhpZGVyLnN0eWxlLmxlZnQsbz0iIj09PW8/MDpvLHI9MD5zJiZsLWUub2Zmc2V0SGVpZ2h0PjA/LXM6MCx0PXIscis9InB4IixwKGUsbyxyKX10aGlzLmFkanVzdEhlYWRlckJvcmRlcnNQb3NpdGlvbih0KSx0aGlzLmFkanVzdEVsZW1lbnRzU2l6ZSgpfX0sc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oZSl7dGhpcy5tYWluVGFibGVTY3JvbGxhYmxlRWxlbWVudD09PXdpbmRvdz93aW5kb3cuc2Nyb2xsVG8odSgpLGUpOnRoaXMubWFpblRhYmxlU2Nyb2xsYWJsZUVsZW1lbnQuc2Nyb2xsVG9wPWV9LG9uU2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy53b3QuZ2V0U2V0dGluZygib25TY3JvbGxIb3Jpem9udGFsbHkiKX0sc3VtQ2VsbFNpemVzOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAsbz10aGlzLndvdC53dFNldHRpbmdzLnNldHRpbmdzLmRlZmF1bHRSb3dIZWlnaHQ7dD5lOyl7dmFyIHI9dGhpcy53b3Qud3RUYWJsZS5nZXRSb3dIZWlnaHQoZSk7bis9dm9pZCAwPT09cj9vOnIsZSsrfXJldHVybiBufSxhZGp1c3RFbGVtZW50c1NpemU6ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiExO3RoaXMudXBkYXRlVHJpbW1pbmdDb250YWluZXIoKSwodGhpcy5uZWVkRnVsbFJlbmRlcnx8ZSkmJih0aGlzLmFkanVzdFJvb3RFbGVtZW50U2l6ZSgpLHRoaXMuYWRqdXN0Um9vdENoaWxkcmVuU2l6ZSgpLGV8fCh0aGlzLmFyZUVsZW1lbnRTaXplc0FkanVzdGVkPSEwKSl9LGFkanVzdFJvb3RFbGVtZW50U2l6ZTpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy53b3Qud3RUYWJsZS5ob2xkZXIsbj10LmNsaWVudFdpZHRoPT09dC5vZmZzZXRXaWR0aD8wOmwoKSxvPXRoaXMuY2xvbmUud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZSxyPW8uc3R5bGUsaT10aGlzLndvdC5nZXRTZXR0aW5nKCJwcmV2ZW50T3ZlcmZsb3ciKTtpZih0aGlzLnRyaW1taW5nQ29udGFpbmVyIT09d2luZG93fHwiaG9yaXpvbnRhbCI9PT1pKXt2YXIgcz10aGlzLndvdC53dFZpZXdwb3J0LmdldFdvcmtzcGFjZVdpZHRoKCktbjtzPU1hdGgubWluKHMsZCh0aGlzLndvdC53dFRhYmxlLnd0Um9vdEVsZW1lbnQpKSxyLndpZHRoPXMrInB4In1lbHNlIHIud2lkdGg9IiI7dGhpcy5jbG9uZS53dFRhYmxlLmhvbGRlci5zdHlsZS53aWR0aD1yLndpZHRoLGU9aCh0aGlzLmNsb25lLnd0VGFibGUuVEFCTEUpLHIuaGVpZ2h0PSgwPT09ZT9lOmUrNCkrInB4In0sYWRqdXN0Um9vdENoaWxkcmVuU2l6ZTpmdW5jdGlvbigpe3ZhciBlPWwoKTt0aGlzLmNsb25lLnd0VGFibGUuaGlkZXIuc3R5bGUud2lkdGg9dGhpcy5oaWRlci5zdHlsZS53aWR0aCx0aGlzLmNsb25lLnd0VGFibGUuaG9sZGVyLnN0eWxlLndpZHRoPXRoaXMuY2xvbmUud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZS5zdHlsZS53aWR0aCwwPT09ZSYmKGU9MzApLHRoaXMuY2xvbmUud3RUYWJsZS5ob2xkZXIuc3R5bGUuaGVpZ2h0PXBhcnNlSW50KHRoaXMuY2xvbmUud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZS5zdHlsZS5oZWlnaHQsMTApK2UrInB4In0sYXBwbHlUb0RPTTpmdW5jdGlvbigpe3ZhciBlPXRoaXMud290LmdldFNldHRpbmcoInRvdGFsUm93cyIpO2lmKHRoaXMuYXJlRWxlbWVudFNpemVzQWRqdXN0ZWR8fHRoaXMuYWRqdXN0RWxlbWVudHNTaXplKCksIm51bWJlciI9PXR5cGVvZiB0aGlzLndvdC53dFZpZXdwb3J0LnJvd3NSZW5kZXJDYWxjdWxhdG9yLnN0YXJ0UG9zaXRpb24pdGhpcy5zcHJlYWRlci5zdHlsZS50b3A9dGhpcy53b3Qud3RWaWV3cG9ydC5yb3dzUmVuZGVyQ2FsY3VsYXRvci5zdGFydFBvc2l0aW9uKyJweCI7ZWxzZXtpZigwIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkluY29ycmVjdCB2YWx1ZSBvZiB0aGUgcm93c1JlbmRlckNhbGN1bGF0b3IiKTt0aGlzLnNwcmVhZGVyLnN0eWxlLnRvcD0iMCJ9dGhpcy5zcHJlYWRlci5zdHlsZS5ib3R0b209IiIsdGhpcy5uZWVkRnVsbFJlbmRlciYmdGhpcy5zeW5jT3ZlcmxheU9mZnNldCgpfSxzeW5jT3ZlcmxheU9mZnNldDpmdW5jdGlvbigpeyJudW1iZXIiPT10eXBlb2YgdGhpcy53b3Qud3RWaWV3cG9ydC5jb2x1bW5zUmVuZGVyQ2FsY3VsYXRvci5zdGFydFBvc2l0aW9uP3RoaXMuY2xvbmUud3RUYWJsZS5zcHJlYWRlci5zdHlsZS5sZWZ0PXRoaXMud290Lnd0Vmlld3BvcnQuY29sdW1uc1JlbmRlckNhbGN1bGF0b3Iuc3RhcnRQb3NpdGlvbisicHgiOnRoaXMuY2xvbmUud3RUYWJsZS5zcHJlYWRlci5zdHlsZS5sZWZ0PSIifSxzY3JvbGxUbzpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0VGFibGVQYXJlbnRPZmZzZXQoKSxvPXRoaXMud290LmNsb25lU291cmNlP3RoaXMud290LmNsb25lU291cmNlOnRoaXMud290LHI9by53dFRhYmxlLmhvbGRlcixpPTA7aWYodCYmci5vZmZzZXRIZWlnaHQhPT1yLmNsaWVudEhlaWdodCYmKGk9bCgpKSx0KXt2YXIgcz10aGlzLndvdC5nZXRTZXR0aW5nKCJmaXhlZFJvd3NCb3R0b20iKSxhPSh0aGlzLndvdC5nZXRTZXR0aW5nKCJmaXhlZFJvd3NUb3AiKSx0aGlzLndvdC5nZXRTZXR0aW5nKCJ0b3RhbFJvd3MiKSk7bis9dGhpcy5zdW1DZWxsU2l6ZXMoMCxlKzEpLG4tPXRoaXMud290Lnd0Vmlld3BvcnQuZ2V0Vmlld3BvcnRIZWlnaHQoKS10aGlzLnN1bUNlbGxTaXplcyhhLXMsYSksbis9MX1lbHNlIG4rPXRoaXMuc3VtQ2VsbFNpemVzKHRoaXMud290LmdldFNldHRpbmcoImZpeGVkUm93c1RvcCIpLGUpO24rPWksdGhpcy5zZXRTY3JvbGxQb3NpdGlvbihuKX0sZ2V0VGFibGVQYXJlbnRPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYWluVGFibGVTY3JvbGxhYmxlRWxlbWVudD09PXdpbmRvdz90aGlzLndvdC53dFRhYmxlLmhvbGRlck9mZnNldC50b3A6MH0sZ2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLm1haW5UYWJsZVNjcm9sbGFibGVFbGVtZW50KX0sYWRqdXN0SGVhZGVyQm9yZGVyc1Bvc2l0aW9uOmZ1bmN0aW9uKGUpe2lmKDA9PT10aGlzLndvdC5nZXRTZXR0aW5nKCJmaXhlZFJvd3NUb3AiKSYmdGhpcy53b3QuZ2V0U2V0dGluZygiY29sdW1uSGVhZGVycyIpLmxlbmd0aD4wKXt2YXIgdD10aGlzLndvdC53dFRhYmxlLmhvbGRlci5wYXJlbnROb2RlLG49Yyh0LCJpbm5lckJvcmRlclRvcCIpO2V8fDA9PT10aGlzLndvdC5nZXRTZXR0aW5nKCJ0b3RhbFJvd3MiKT9zKHQsImlubmVyQm9yZGVyVG9wIik6Zih0LCJpbm5lckJvcmRlclRvcCIpLCghbiYmZXx8biYmIWUpJiZ0aGlzLndvdC53dE92ZXJsYXlzLmFkanVzdEVsZW1lbnRzU2l6ZSgpfWlmKDA9PT10aGlzLndvdC5nZXRTZXR0aW5nKCJyb3dIZWFkZXJzIikubGVuZ3RoKXt2YXIgbz10aGlzLmNsb25lLnd0VGFibGUuVEhFQUQucXVlcnlTZWxlY3RvckFsbCgidGg6bnRoLW9mLXR5cGUoMikiKTtpZihvKWZvcih2YXIgcj0wO3I8by5sZW5ndGg7cisrKW9bcl0uc3R5bGVbImJvcmRlci1sZWZ0LXdpZHRoIl09MH19fSx7fSxtKSx3aW5kb3cuV2Fsa29udGFibGVUb3BPdmVybGF5PXcsbS5yZWdpc3Rlck92ZXJsYXkobS5DTE9ORV9UT1Asdyl9LHtfYmFzZToxMSwiaGVscGVycy9kb20vZWxlbWVudCI6NDZ9XSwxNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtXYWxrb250YWJsZVRvcExlZnRDb3JuZXJPdmVybGF5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaT0obz1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KSxzPWkub3V0ZXJIZWlnaHQsbD1pLm91dGVyV2lkdGgsYT1pLnNldE92ZXJsYXlQb3NpdGlvbix1PWkucmVzZXRDc3NUcmFuc2Zvcm0sYz0ocj1lKCJfYmFzZSIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkuV2Fsa29udGFibGVPdmVybGF5LGg9ZnVuY3Rpb24oZSl7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IoZCkuY2FsbCh0aGlzLGUpLHRoaXMuY2xvbmU9dGhpcy5tYWtlQ2xvbmUoYy5DTE9ORV9UT1BfTEVGVF9DT1JORVIpfSxkPWg7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKGgse3Nob3VsZEJlUmVuZGVyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hKCF0aGlzLndvdC5nZXRTZXR0aW5nKCJmaXhlZFJvd3NUb3AiKSYmIXRoaXMud290LmdldFNldHRpbmcoImNvbHVtbkhlYWRlcnMiKS5sZW5ndGh8fCF0aGlzLndvdC5nZXRTZXR0aW5nKCJmaXhlZENvbHVtbnNMZWZ0IikmJiF0aGlzLndvdC5nZXRTZXR0aW5nKCJyb3dIZWFkZXJzIikubGVuZ3RoKX0scmVzZXRGaXhlZFBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy51cGRhdGVUcmltbWluZ0NvbnRhaW5lcigpLHRoaXMud290Lnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUpe3ZhciBlPXRoaXMuY2xvbmUud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZSx0PXModGhpcy5jbG9uZS53dFRhYmxlLlRBQkxFKSxuPWwodGhpcy5jbG9uZS53dFRhYmxlLlRBQkxFKSxvPXRoaXMud290LmdldFNldHRpbmcoInByZXZlbnRPdmVyZmxvdyIpO2lmKHRoaXMudHJpbW1pbmdDb250YWluZXI9PT13aW5kb3cpe3ZhciByPXRoaXMud290Lnd0VGFibGUuaGlkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaT1NYXRoLmNlaWwoci50b3ApLGM9TWF0aC5jZWlsKHIubGVmdCksaD1NYXRoLmNlaWwoci5ib3R0b20pLGQ9TWF0aC5jZWlsKHIucmlnaHQpLGY9IjAiLHA9IjAiO28mJiJ2ZXJ0aWNhbCIhPT1vfHwwPmMmJmQtZS5vZmZzZXRXaWR0aD4wJiYoZj0tYysicHgiKSxvJiYiaG9yaXpvbnRhbCIhPT1vfHwwPmkmJmgtZS5vZmZzZXRIZWlnaHQ+MCYmKHA9LWkrInB4IiksYShlLGYscCl9ZWxzZSB1KGUpO2Uuc3R5bGUuaGVpZ2h0PSgwPT09dD90OnQrNCkrInB4IixlLnN0eWxlLndpZHRoPSgwPT09bj9uOm4rNCkrInB4In19fSx7fSxjKSx3aW5kb3cuV2Fsa29udGFibGVUb3BMZWZ0Q29ybmVyT3ZlcmxheT1oLGMucmVnaXN0ZXJPdmVybGF5KGMuQ0xPTkVfVE9QX0xFRlRfQ09STkVSLGgpfSx7X2Jhc2U6MTEsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2fV0sMTY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7V2Fsa29udGFibGVPdmVybGF5czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHd9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscyxsLGE9KG89ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSksdT1hLmdldFNjcm9sbGFibGVFbGVtZW50LGM9YS5nZXRTY3JvbGxiYXJXaWR0aCxoPWEuZ2V0U2Nyb2xsTGVmdCxkPWEuZ2V0U2Nyb2xsVG9wLGY9KHI9ZSgiaGVscGVycy9hcnJheSIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkuYXJyYXlFYWNoLHA9KGk9ZSgiaGVscGVycy91bmljb2RlIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5pc0tleSxnPShzPWUoImhlbHBlcnMvYnJvd3NlciIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuaXNNb2JpbGVCcm93c2VyLG09KGw9ZSgiZXZlbnRNYW5hZ2VyIiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KS5FdmVudE1hbmFnZXIsdz1mdW5jdGlvbihlKXt0aGlzLndvdD1lLHRoaXMuaW5zdGFuY2U9dGhpcy53b3QsdGhpcy5ldmVudE1hbmFnZXI9bmV3IG0odGhpcy53b3QpLHRoaXMud290LnVwZGF0ZSgic2Nyb2xsYmFyV2lkdGgiLGMoKSksdGhpcy53b3QudXBkYXRlKCJzY3JvbGxiYXJIZWlnaHQiLGMoKSksdGhpcy5zY3JvbGxhYmxlRWxlbWVudD11KHRoaXMud290Lnd0VGFibGUuVEFCTEUpLHRoaXMudG9wT3ZlcmxheT1XYWxrb250YWJsZU92ZXJsYXkuY3JlYXRlT3ZlcmxheShXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfVE9QLHRoaXMud290KSwidW5kZWZpbmVkIj09dHlwZW9mIFdhbGtvbnRhYmxlQm90dG9tT3ZlcmxheT90aGlzLmJvdHRvbU92ZXJsYXk9e25lZWRGdWxsUmVuZGVyOiExfTp0aGlzLmJvdHRvbU92ZXJsYXk9V2Fsa29udGFibGVPdmVybGF5LmNyZWF0ZU92ZXJsYXkoV2Fsa29udGFibGVPdmVybGF5LkNMT05FX0JPVFRPTSx0aGlzLndvdCksdGhpcy5sZWZ0T3ZlcmxheT1XYWxrb250YWJsZU92ZXJsYXkuY3JlYXRlT3ZlcmxheShXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfTEVGVCx0aGlzLndvdCksdGhpcy50b3BPdmVybGF5Lm5lZWRGdWxsUmVuZGVyJiZ0aGlzLmxlZnRPdmVybGF5Lm5lZWRGdWxsUmVuZGVyJiYodGhpcy50b3BMZWZ0Q29ybmVyT3ZlcmxheT1XYWxrb250YWJsZU92ZXJsYXkuY3JlYXRlT3ZlcmxheShXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfVE9QX0xFRlRfQ09STkVSLHRoaXMud290KSksdGhpcy5ib3R0b21PdmVybGF5Lm5lZWRGdWxsUmVuZGVyJiZ0aGlzLmxlZnRPdmVybGF5Lm5lZWRGdWxsUmVuZGVyJiYidW5kZWZpbmVkIiE9dHlwZW9mIFdhbGtvbnRhYmxlQm90dG9tTGVmdENvcm5lck92ZXJsYXk/dGhpcy5ib3R0b21MZWZ0Q29ybmVyT3ZlcmxheT1XYWxrb250YWJsZU92ZXJsYXkuY3JlYXRlT3ZlcmxheShXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfQk9UVE9NX0xFRlRfQ09STkVSLHRoaXMud290KTp0aGlzLmJvdHRvbUxlZnRDb3JuZXJPdmVybGF5PXtuZWVkRnVsbFJlbmRlcjohMX0sdGhpcy53b3QuZ2V0U2V0dGluZygiZGVidWciKSYmKHRoaXMuZGVidWc9V2Fsa29udGFibGVPdmVybGF5LmNyZWF0ZU92ZXJsYXkoV2Fsa29udGFibGVPdmVybGF5LkNMT05FX0RFQlVHLHRoaXMud290KSksdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5rZXlQcmVzc2VkPSExLHRoaXMuc3ByZWFkZXJMYXN0U2l6ZT17d2lkdGg6bnVsbCxoZWlnaHQ6bnVsbH0sdGhpcy5vdmVybGF5U2Nyb2xsUG9zaXRpb25zPXttYXN0ZXI6e3RvcDowLGxlZnQ6MH0sdG9wOnt0b3A6bnVsbCxsZWZ0OjB9LGJvdHRvbTp7dG9wOm51bGwsbGVmdDowfSxsZWZ0Ont0b3A6MCxsZWZ0Om51bGx9fSx0aGlzLnBlbmRpbmdTY3JvbGxDYWxsYmFja3M9e21hc3Rlcjp7dG9wOjAsbGVmdDowfSx0b3A6e2xlZnQ6MH0sYm90dG9tOntsZWZ0OjB9LGxlZnQ6e3RvcDowfX0sdGhpcy52ZXJ0aWNhbFNjcm9sbGluZz0hMSx0aGlzLmhvcml6b250YWxTY3JvbGxpbmc9ITEsdGhpcy5kZWxlZ2F0ZWRTY3JvbGxDYWxsYmFjaz0hMSx0aGlzLnJlZ2lzdGVyZWRMaXN0ZW5lcnM9W10sdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpfTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3Modyx7cmVmcmVzaEFsbDpmdW5jdGlvbigpe2lmKHRoaXMud290LmRyYXduKXtpZighdGhpcy53b3Qud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZSlyZXR1cm4gdm9pZCB0aGlzLmRlc3Ryb3koKTt0aGlzLndvdC5kcmF3KCEwKSx0aGlzLnZlcnRpY2FsU2Nyb2xsaW5nJiZ0aGlzLmxlZnRPdmVybGF5Lm9uU2Nyb2xsKCksdGhpcy5ob3Jpem9udGFsU2Nyb2xsaW5nJiZ0aGlzLnRvcE92ZXJsYXkub25TY3JvbGwoKSx0aGlzLnZlcnRpY2FsU2Nyb2xsaW5nPSExLHRoaXMuaG9yaXpvbnRhbFNjcm9sbGluZz0hMX19LHJlZ2lzdGVyTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMudG9wT3ZlcmxheS5tYWluVGFibGVTY3JvbGxhYmxlRWxlbWVudCxuPXRoaXMubGVmdE92ZXJsYXkubWFpblRhYmxlU2Nyb2xsYWJsZUVsZW1lbnQsbz1bXTtmb3Ioby5wdXNoKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsImtleWRvd24iLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uS2V5RG93bih0KX1dKSxvLnB1c2goW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCwia2V5dXAiLGZ1bmN0aW9uKCl7cmV0dXJuIGUub25LZXlVcCgpfV0pLG8ucHVzaChbZG9jdW1lbnQsInZpc2liaWxpdHljaGFuZ2UiLGZ1bmN0aW9uKCl7cmV0dXJuIGUub25LZXlVcCgpfV0pLG8ucHVzaChbdCwic2Nyb2xsIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vblRhYmxlU2Nyb2xsKHQpfV0pLHQhPT1uJiZvLnB1c2goW24sInNjcm9sbCIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25UYWJsZVNjcm9sbCh0KX1dKSx0aGlzLnRvcE92ZXJsYXkubmVlZEZ1bGxSZW5kZXImJihvLnB1c2goW3RoaXMudG9wT3ZlcmxheS5jbG9uZS53dFRhYmxlLmhvbGRlciwic2Nyb2xsIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vblRhYmxlU2Nyb2xsKHQpfV0pLG8ucHVzaChbdGhpcy50b3BPdmVybGF5LmNsb25lLnd0VGFibGUuaG9sZGVyLCJ3aGVlbCIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25UYWJsZVNjcm9sbCh0KX1dKSksdGhpcy5ib3R0b21PdmVybGF5Lm5lZWRGdWxsUmVuZGVyJiYoby5wdXNoKFt0aGlzLmJvdHRvbU92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIsInNjcm9sbCIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25UYWJsZVNjcm9sbCh0KX1dKSxvLnB1c2goW3RoaXMuYm90dG9tT3ZlcmxheS5jbG9uZS53dFRhYmxlLmhvbGRlciwid2hlZWwiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uVGFibGVTY3JvbGwodCl9XSkpLHRoaXMubGVmdE92ZXJsYXkubmVlZEZ1bGxSZW5kZXImJihvLnB1c2goW3RoaXMubGVmdE92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIsInNjcm9sbCIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25UYWJsZVNjcm9sbCh0KX1dKSxvLnB1c2goW3RoaXMubGVmdE92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIsIndoZWVsIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vblRhYmxlU2Nyb2xsKHQpfV0pKSx0aGlzLnRvcE92ZXJsYXkudHJpbW1pbmdDb250YWluZXIhPT13aW5kb3cmJnRoaXMubGVmdE92ZXJsYXkudHJpbW1pbmdDb250YWluZXIhPT13aW5kb3cmJm8ucHVzaChbd2luZG93LCJ3aGVlbCIsZnVuY3Rpb24odCl7dmFyIG4sbz10LndoZWVsRGVsdGFZfHx0LmRlbHRhWSxyPXQud2hlZWxEZWx0YVh8fHQuZGVsdGFYO2UudG9wT3ZlcmxheS5jbG9uZS53dFRhYmxlLmhvbGRlci5jb250YWlucyh0LnJlYWxUYXJnZXQpP249InRvcCI6ZS5ib3R0b21PdmVybGF5LmNsb25lJiZlLmJvdHRvbU92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIuY29udGFpbnModC5yZWFsVGFyZ2V0KT9uPSJib3R0b20iOmUubGVmdE92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIuY29udGFpbnModC5yZWFsVGFyZ2V0KSYmKG49ImxlZnQiKSwidG9wIj09biYmMCE9PW8/dC5wcmV2ZW50RGVmYXVsdCgpOiJsZWZ0Ij09biYmMCE9PXI/dC5wcmV2ZW50RGVmYXVsdCgpOiJib3R0b20iPT1uJiYwIT09byYmdC5wcmV2ZW50RGVmYXVsdCgpfV0pO28ubGVuZ3RoOyl7dmFyIHI9by5wb3AoKTt0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHJbMF0sclsxXSxyWzJdKSx0aGlzLnJlZ2lzdGVyZWRMaXN0ZW5lcnMucHVzaChyKX19LGRlcmVnaXN0ZXJMaXN0ZW5lcnM6ZnVuY3Rpb24oKXtmb3IoO3RoaXMucmVnaXN0ZXJlZExpc3RlbmVycy5sZW5ndGg7KXt2YXIgZT10aGlzLnJlZ2lzdGVyZWRMaXN0ZW5lcnMucG9wKCk7dGhpcy5ldmVudE1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlWzBdLGVbMV0sZVsyXSl9fSxvblRhYmxlU2Nyb2xsOmZ1bmN0aW9uKGUpe2lmKCFnKCkpe3ZhciB0PXRoaXMubGVmdE92ZXJsYXkubWFpblRhYmxlU2Nyb2xsYWJsZUVsZW1lbnQsbj10aGlzLnRvcE92ZXJsYXkubWFpblRhYmxlU2Nyb2xsYWJsZUVsZW1lbnQsbz1lLnRhcmdldDt0aGlzLmtleVByZXNzZWQmJihuIT09d2luZG93JiZvIT09d2luZG93JiYhZS50YXJnZXQuY29udGFpbnMobil8fHQhPT13aW5kb3cmJm8hPT13aW5kb3cmJiFlLnRhcmdldC5jb250YWlucyh0KSl8fCgic2Nyb2xsIj09PWUudHlwZT90aGlzLnN5bmNTY3JvbGxQb3NpdGlvbnMoZSk6dGhpcy50cmFuc2xhdGVNb3VzZVdoZWVsVG9TY3JvbGwoZSkpfX0sb25LZXlEb3duOmZ1bmN0aW9uKGUpe3RoaXMua2V5UHJlc3NlZD1wKGUua2V5Q29kZSwiQVJST1dfVVB8QVJST1dfUklHSFR8QVJST1dfRE9XTnxBUlJPV19MRUZUIil9LG9uS2V5VXA6ZnVuY3Rpb24oKXt0aGlzLmtleVByZXNzZWQ9ITF9LHRyYW5zbGF0ZU1vdXNlV2hlZWxUb1Njcm9sbDpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMudG9wT3ZlcmxheS5jbG9uZS53dFRhYmxlLmhvbGRlcixvPXRoaXMuYm90dG9tT3ZlcmxheS5jbG9uZT90aGlzLmJvdHRvbU92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXI6bnVsbCxyPXRoaXMubGVmdE92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIsaT17dHlwZToid2hlZWwifSxzPWUudGFyZ2V0LGw9ZS53aGVlbERlbHRhWXx8LTEqZS5kZWx0YVksYT1lLndoZWVsRGVsdGFYfHwtMSplLmRlbHRhWDtmb3IoMT09PWUuZGVsdGFNb2RlJiYobD0xMjAqbCxhPTEyMCphKTtzIT1kb2N1bWVudCYmbnVsbCE9czspe2lmKHMuY2xhc3NOYW1lLmluZGV4T2YoInd0SG9sZGVyIik+LTEpe3Q9czticmVha31zPXMucGFyZW50Tm9kZX1yZXR1cm4gaS50YXJnZXQ9dCx0PT1uP3RoaXMuc3luY1Njcm9sbFBvc2l0aW9ucyhpLC0uMipsKTp0PT1vP3RoaXMuc3luY1Njcm9sbFBvc2l0aW9ucyhpLC0uMipsKTp0PT1yJiZ0aGlzLnN5bmNTY3JvbGxQb3NpdGlvbnMoaSwtLjIqYSksITF9LHN5bmNTY3JvbGxQb3NpdGlvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9dm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO2lmKCF0aGlzLmRlc3Ryb3llZCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5zeW5jU2Nyb2xsV2l0aE1hc3RlcigpO3ZhciBuLG8scixpPXRoaXMubGVmdE92ZXJsYXkubWFpblRhYmxlU2Nyb2xsYWJsZUVsZW1lbnQscz10aGlzLnRvcE92ZXJsYXkubWFpblRhYmxlU2Nyb2xsYWJsZUVsZW1lbnQsbD1lLnRhcmdldCxhPTAsdT0hMSxjPSExLGY9dGhpcy53b3QuZ2V0U2V0dGluZygicHJldmVudE92ZXJmbG93Iik7dGhpcy50b3BPdmVybGF5Lm5lZWRGdWxsUmVuZGVyJiYobj10aGlzLnRvcE92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIpLHRoaXMuYm90dG9tT3ZlcmxheS5uZWVkRnVsbFJlbmRlciYmKHI9dGhpcy5ib3R0b21PdmVybGF5LmNsb25lLnd0VGFibGUuaG9sZGVyKSx0aGlzLmxlZnRPdmVybGF5Lm5lZWRGdWxsUmVuZGVyJiYobz10aGlzLmxlZnRPdmVybGF5LmNsb25lLnd0VGFibGUuaG9sZGVyKSxsPT09ZG9jdW1lbnQmJihsPXdpbmRvdyksbD09PWl8fGw9PT1zPyhhPWgoZj90aGlzLnNjcm9sbGFibGVFbGVtZW50OmwpLHRoaXMuaG9yaXpvbnRhbFNjcm9sbGluZz0hMCx0aGlzLm92ZXJsYXlTY3JvbGxQb3NpdGlvbnMubWFzdGVyLmxlZnQ9YSx1PSEwLHRoaXMucGVuZGluZ1Njcm9sbENhbGxiYWNrcy5tYXN0ZXIubGVmdD4wP3RoaXMucGVuZGluZ1Njcm9sbENhbGxiYWNrcy5tYXN0ZXIubGVmdC0tOihuJiZuLnNjcm9sbExlZnQhPT1hJiYobnVsbD09dCYmdGhpcy5wZW5kaW5nU2Nyb2xsQ2FsbGJhY2tzLnRvcC5sZWZ0Kyssbi5zY3JvbGxMZWZ0PWEsYz1pIT09d2luZG93KSxyJiZyLnNjcm9sbExlZnQhPT1hJiYobnVsbD09dCYmdGhpcy5wZW5kaW5nU2Nyb2xsQ2FsbGJhY2tzLmJvdHRvbS5sZWZ0Kyssci5zY3JvbGxMZWZ0PWEsYz1pIT09d2luZG93KSksYT1kKGwpLHRoaXMudmVydGljYWxTY3JvbGxpbmc9ITAsdGhpcy5vdmVybGF5U2Nyb2xsUG9zaXRpb25zLm1hc3Rlci50b3A9YSx1PSEwLHRoaXMucGVuZGluZ1Njcm9sbENhbGxiYWNrcy5tYXN0ZXIudG9wPjA/dGhpcy5wZW5kaW5nU2Nyb2xsQ2FsbGJhY2tzLm1hc3Rlci50b3AtLTpvJiZvLnNjcm9sbFRvcCE9PWEmJihudWxsPT10JiZ0aGlzLnBlbmRpbmdTY3JvbGxDYWxsYmFja3MubGVmdC50b3ArKyxvLnNjcm9sbFRvcD1hLGM9cyE9PXdpbmRvdykpOmw9PT1yPyhhPWgobCksdGhpcy5ob3Jpem9udGFsU2Nyb2xsaW5nPSEwLHRoaXMub3ZlcmxheVNjcm9sbFBvc2l0aW9ucy5ib3R0b20ubGVmdD1hLHU9ITAsdGhpcy5wZW5kaW5nU2Nyb2xsQ2FsbGJhY2tzLmJvdHRvbS5sZWZ0PjA/dGhpcy5wZW5kaW5nU2Nyb2xsQ2FsbGJhY2tzLmJvdHRvbS5sZWZ0LS06KG51bGw9PXQmJnRoaXMucGVuZGluZ1Njcm9sbENhbGxiYWNrcy5tYXN0ZXIubGVmdCsrLGkuc2Nyb2xsTGVmdD1hLG4mJm4uc2Nyb2xsTGVmdCE9PWEmJihudWxsPT10JiZ0aGlzLnBlbmRpbmdTY3JvbGxDYWxsYmFja3MudG9wLmxlZnQrKyxuLnNjcm9sbExlZnQ9YSxjPXMhPT13aW5kb3cpKSxudWxsIT09dCYmKHU9ITAscy5zY3JvbGxUb3ArPXQpKTpsPT09bj8oYT1oKGwpLHRoaXMuaG9yaXpvbnRhbFNjcm9sbGluZz0hMCx0aGlzLm92ZXJsYXlTY3JvbGxQb3NpdGlvbnMudG9wLmxlZnQ9YSx1PSEwLHRoaXMucGVuZGluZ1Njcm9sbENhbGxiYWNrcy50b3AubGVmdD4wP3RoaXMucGVuZGluZ1Njcm9sbENhbGxiYWNrcy50b3AubGVmdC0tOihudWxsPT10JiZ0aGlzLnBlbmRpbmdTY3JvbGxDYWxsYmFja3MubWFzdGVyLmxlZnQrKyxpLnNjcm9sbExlZnQ9YSksbnVsbCE9PXQmJih1PSEwLHMuc2Nyb2xsVG9wKz10KSxyJiZyLnNjcm9sbExlZnQhPT1hJiYobnVsbD09dCYmdGhpcy5wZW5kaW5nU2Nyb2xsQ2FsbGJhY2tzLmJvdHRvbS5sZWZ0Kyssci5zY3JvbGxMZWZ0PWEsYz1zIT09d2luZG93KSk6bD09PW8mJihhPWQobCksdGhpcy5vdmVybGF5U2Nyb2xsUG9zaXRpb25zLmxlZnQudG9wIT09YSYmKHRoaXMudmVydGljYWxTY3JvbGxpbmc9ITAsdGhpcy5vdmVybGF5U2Nyb2xsUG9zaXRpb25zLmxlZnQudG9wPWEsdT0hMCx0aGlzLnBlbmRpbmdTY3JvbGxDYWxsYmFja3MubGVmdC50b3A+MD90aGlzLnBlbmRpbmdTY3JvbGxDYWxsYmFja3MubGVmdC50b3AtLToobnVsbD09dCYmdGhpcy5wZW5kaW5nU2Nyb2xsQ2FsbGJhY2tzLm1hc3Rlci50b3ArKyxzLnNjcm9sbFRvcD1hKSksbnVsbCE9PXQmJih1PSEwLHMuc2Nyb2xsTGVmdCs9dCkpLCF0aGlzLmtleVByZXNzZWQmJnUmJiJzY3JvbGwiPT09ZS50eXBlJiYodGhpcy5kZWxlZ2F0ZWRTY3JvbGxDYWxsYmFjaz90aGlzLmRlbGVnYXRlZFNjcm9sbENhbGxiYWNrPSExOnRoaXMucmVmcmVzaEFsbCgpLGMmJih0aGlzLmRlbGVnYXRlZFNjcm9sbENhbGxiYWNrPSEwKSl9fSxzeW5jU2Nyb2xsV2l0aE1hc3RlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMudG9wT3ZlcmxheS5tYWluVGFibGVTY3JvbGxhYmxlRWxlbWVudDt0aGlzLnRvcE92ZXJsYXkubmVlZEZ1bGxSZW5kZXImJih0aGlzLnRvcE92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIuc2Nyb2xsTGVmdD1lLnNjcm9sbExlZnQpLHRoaXMubGVmdE92ZXJsYXkubmVlZEZ1bGxSZW5kZXImJih0aGlzLmxlZnRPdmVybGF5LmNsb25lLnd0VGFibGUuaG9sZGVyLnNjcm9sbFRvcD1lLnNjcm9sbFRvcCl9LHVwZGF0ZU1haW5TY3JvbGxhYmxlRWxlbWVudHM6ZnVuY3Rpb24oKXt0aGlzLmRlcmVnaXN0ZXJMaXN0ZW5lcnMoKSx0aGlzLmxlZnRPdmVybGF5LnVwZGF0ZU1haW5TY3JvbGxhYmxlRWxlbWVudCgpLHRoaXMudG9wT3ZlcmxheS51cGRhdGVNYWluU2Nyb2xsYWJsZUVsZW1lbnQoKSx0aGlzLmJvdHRvbU92ZXJsYXkubmVlZEZ1bGxSZW5kZXImJnRoaXMuYm90dG9tT3ZlcmxheS51cGRhdGVNYWluU2Nyb2xsYWJsZUVsZW1lbnQoKSx0aGlzLnNjcm9sbGFibGVFbGVtZW50PXUodGhpcy53b3Qud3RUYWJsZS5UQUJMRSksdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5ldmVudE1hbmFnZXIuZGVzdHJveSgpLHRoaXMudG9wT3ZlcmxheS5kZXN0cm95KCksdGhpcy5ib3R0b21PdmVybGF5LmNsb25lJiZ0aGlzLmJvdHRvbU92ZXJsYXkuZGVzdHJveSgpLHRoaXMubGVmdE92ZXJsYXkuZGVzdHJveSgpLHRoaXMudG9wTGVmdENvcm5lck92ZXJsYXkmJnRoaXMudG9wTGVmdENvcm5lck92ZXJsYXkuZGVzdHJveSgpLHRoaXMuYm90dG9tTGVmdENvcm5lck92ZXJsYXkmJnRoaXMuYm90dG9tTGVmdENvcm5lck92ZXJsYXkuY2xvbmUmJnRoaXMuYm90dG9tTGVmdENvcm5lck92ZXJsYXkuZGVzdHJveSgpLHRoaXMuZGVidWcmJnRoaXMuZGVidWcuZGVzdHJveSgpLHRoaXMuZGVzdHJveWVkPSEwfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGU9dm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTohMTtpZih0aGlzLnRvcE92ZXJsYXkuYXJlRWxlbWVudFNpemVzQWRqdXN0ZWQmJnRoaXMubGVmdE92ZXJsYXkuYXJlRWxlbWVudFNpemVzQWRqdXN0ZWQpe3ZhciB0PXRoaXMud290Lnd0VGFibGUud3RSb290RWxlbWVudC5wYXJlbnROb2RlfHx0aGlzLndvdC53dFRhYmxlLnd0Um9vdEVsZW1lbnQsbj10LmNsaWVudFdpZHRoLG89dC5jbGllbnRIZWlnaHQ7bj09PXRoaXMuc3ByZWFkZXJMYXN0U2l6ZS53aWR0aCYmbz09PXRoaXMuc3ByZWFkZXJMYXN0U2l6ZS5oZWlnaHR8fCh0aGlzLnNwcmVhZGVyTGFzdFNpemUud2lkdGg9bix0aGlzLnNwcmVhZGVyTGFzdFNpemUuaGVpZ2h0PW8sdGhpcy5hZGp1c3RFbGVtZW50c1NpemUoKSl9dGhpcy5ib3R0b21PdmVybGF5LmNsb25lJiZ0aGlzLmJvdHRvbU92ZXJsYXkucmVmcmVzaChlKSx0aGlzLmxlZnRPdmVybGF5LnJlZnJlc2goZSksdGhpcy50b3BPdmVybGF5LnJlZnJlc2goZSksdGhpcy50b3BMZWZ0Q29ybmVyT3ZlcmxheSYmdGhpcy50b3BMZWZ0Q29ybmVyT3ZlcmxheS5yZWZyZXNoKGUpLHRoaXMuYm90dG9tTGVmdENvcm5lck92ZXJsYXkmJnRoaXMuYm90dG9tTGVmdENvcm5lck92ZXJsYXkuY2xvbmUmJnRoaXMuYm90dG9tTGVmdENvcm5lck92ZXJsYXkucmVmcmVzaChlKSx0aGlzLmRlYnVnJiZ0aGlzLmRlYnVnLnJlZnJlc2goZSl9LGFkanVzdEVsZW1lbnRzU2l6ZTpmdW5jdGlvbigpe3ZhciBlPXZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ITEsdD10aGlzLndvdC5nZXRTZXR0aW5nKCJ0b3RhbENvbHVtbnMiKSxuPXRoaXMud290LmdldFNldHRpbmcoInRvdGFsUm93cyIpLG89dGhpcy53b3Qud3RWaWV3cG9ydC5nZXRSb3dIZWFkZXJXaWR0aCgpLHI9dGhpcy53b3Qud3RWaWV3cG9ydC5nZXRDb2x1bW5IZWFkZXJIZWlnaHQoKSxpPXRoaXMud290Lnd0VGFibGUuaGlkZXIuc3R5bGU7aS53aWR0aD1vK3RoaXMubGVmdE92ZXJsYXkuc3VtQ2VsbFNpemVzKDAsdCkrInB4IixpLmhlaWdodD1yK3RoaXMudG9wT3ZlcmxheS5zdW1DZWxsU2l6ZXMoMCxuKSsxKyJweCIsdGhpcy50b3BPdmVybGF5LmFkanVzdEVsZW1lbnRzU2l6ZShlKSx0aGlzLmxlZnRPdmVybGF5LmFkanVzdEVsZW1lbnRzU2l6ZShlKSx0aGlzLmJvdHRvbU92ZXJsYXkuY2xvbmUmJnRoaXMuYm90dG9tT3ZlcmxheS5hZGp1c3RFbGVtZW50c1NpemUoZSl9LGFwcGx5VG9ET006ZnVuY3Rpb24oKXt0aGlzLnRvcE92ZXJsYXkuYXJlRWxlbWVudFNpemVzQWRqdXN0ZWQmJnRoaXMubGVmdE92ZXJsYXkuYXJlRWxlbWVudFNpemVzQWRqdXN0ZWR8fHRoaXMuYWRqdXN0RWxlbWVudHNTaXplKCksdGhpcy50b3BPdmVybGF5LmFwcGx5VG9ET00oKSx0aGlzLmJvdHRvbU92ZXJsYXkuY2xvbmUmJnRoaXMuYm90dG9tT3ZlcmxheS5hcHBseVRvRE9NKCksdGhpcy5sZWZ0T3ZlcmxheS5hcHBseVRvRE9NKCl9LGdldFBhcmVudE92ZXJsYXk6ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7dmFyIHQ9W3RoaXMudG9wT3ZlcmxheSx0aGlzLmxlZnRPdmVybGF5LHRoaXMuYm90dG9tT3ZlcmxheSx0aGlzLnRvcExlZnRDb3JuZXJPdmVybGF5LHRoaXMuYm90dG9tTGVmdENvcm5lck92ZXJsYXldLG49bnVsbDtyZXR1cm4gZih0LGZ1bmN0aW9uKHQsbyl7dCYmdC5jbG9uZSYmdC5jbG9uZS53dFRhYmxlLlRBQkxFLmNvbnRhaW5zKGUpJiYobj10LmNsb25lKX0pLG59fSx7fSksd2luZG93LldhbGtvbnRhYmxlT3ZlcmxheXM9d30se2V2ZW50TWFuYWdlcjo0MSwiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvYnJvd3NlciI6NDMsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL3VuaWNvZGUiOjU1fV0sMTc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7V2Fsa29udGFibGVTY3JvbGw6e2dldDpmdW5jdGlvbigpe3JldHVybiBwfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpPShvPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pLHM9aS5pbm5lckhlaWdodCxsPWkuaW5uZXJXaWR0aCxhPWkuZ2V0U2Nyb2xsTGVmdCx1PWkuZ2V0U2Nyb2xsVG9wLGM9aS5vZmZzZXQsaD0ocj1lKCJoZWxwZXJzL251bWJlciIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSksZD1oLnJhbmdlRWFjaCxmPWgucmFuZ2VFYWNoUmV2ZXJzZSxwPWZ1bmN0aW9uKGUpe3RoaXMud290PWUsdGhpcy5pbnN0YW5jZT1lfTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MocCx7c2Nyb2xsVmlld3BvcnQ6ZnVuY3Rpb24oZSl7aWYodGhpcy53b3QuZHJhd24pe3ZhciB0PXRoaXMuX2dldFZhcmlhYmxlcygpLG49dC50b3BPdmVybGF5LG89dC5sZWZ0T3ZlcmxheSxyPXQudG90YWxSb3dzLGk9dC50b3RhbENvbHVtbnMscz10LmZpeGVkUm93c1RvcCxsPXQuZml4ZWRSb3dzQm90dG9tLGE9dC5maXhlZENvbHVtbnNMZWZ0O2lmKGUucm93PDB8fGUucm93PnItMSl0aHJvdyBuZXcgRXJyb3IoInJvdyAiK2Uucm93KyIgZG9lcyBub3QgZXhpc3QiKTtpZihlLmNvbDwwfHxlLmNvbD5pLTEpdGhyb3cgbmV3IEVycm9yKCJjb2x1bW4gIitlLmNvbCsiIGRvZXMgbm90IGV4aXN0Iik7ZS5yb3c+PXMmJmUucm93PHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93KCk/bi5zY3JvbGxUbyhlLnJvdyk6ZS5yb3c+dGhpcy5nZXRMYXN0VmlzaWJsZVJvdygpJiZlLnJvdzxyLWwmJm4uc2Nyb2xsVG8oZS5yb3csITApLGUuY29sPj1hJiZlLmNvbDx0aGlzLmdldEZpcnN0VmlzaWJsZUNvbHVtbigpP28uc2Nyb2xsVG8oZS5jb2wpOmUuY29sPnRoaXMuZ2V0TGFzdFZpc2libGVDb2x1bW4oKSYmby5zY3JvbGxUbyhlLmNvbCwhMCl9fSxnZXRGaXJzdFZpc2libGVSb3c6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9nZXRWYXJpYWJsZXMoKSx0PWUudG9wT3ZlcmxheSxuPWUud3RUYWJsZSxvPWUud3RWaWV3cG9ydCxyPWUudG90YWxSb3dzLGk9ZS5maXhlZFJvd3NUb3AsbD1uLmdldEZpcnN0VmlzaWJsZVJvdygpO2lmKHQubWFpblRhYmxlU2Nyb2xsYWJsZUVsZW1lbnQ9PT13aW5kb3cpe3ZhciBhPWMobi53dFJvb3RFbGVtZW50KSxoPXMobi5oaWRlciksZD1zKHdpbmRvdykscD11KHdpbmRvdyk7aWYoYS50b3AraC1kPD1wKXt2YXIgZz1vLmdldENvbHVtbkhlYWRlckhlaWdodCgpO2crPXQuc3VtQ2VsbFNpemVzKDAsaSksZihyLDEsZnVuY3Rpb24oZSl7cmV0dXJuIGcrPXQuc3VtQ2VsbFNpemVzKGUtMSxlKSxhLnRvcCtoLWc8PXA/KGw9ZSwhMSk6dm9pZCAwfSl9fXJldHVybiBsfSxnZXRMYXN0VmlzaWJsZVJvdzpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2dldFZhcmlhYmxlcygpLHQ9ZS50b3BPdmVybGF5LG49ZS53dFRhYmxlLG89ZS53dFZpZXdwb3J0LHI9ZS50b3RhbFJvd3MsaT1uLmdldExhc3RWaXNpYmxlUm93KCk7aWYodC5tYWluVGFibGVTY3JvbGxhYmxlRWxlbWVudD09PXdpbmRvdyl7dmFyIGw9YyhuLnd0Um9vdEVsZW1lbnQpLGE9cyh3aW5kb3cpLGg9dSh3aW5kb3cpO2lmKGwudG9wPmgpe3ZhciBmPW8uZ2V0Q29sdW1uSGVhZGVySGVpZ2h0KCk7ZCgxLHIsZnVuY3Rpb24oZSl7cmV0dXJuIGYrPXQuc3VtQ2VsbFNpemVzKGUtMSxlKSxsLnRvcCtmLWg+PWE/KGk9ZS0yLCExKTp2b2lkIDB9KX19cmV0dXJuIGl9LGdldEZpcnN0VmlzaWJsZUNvbHVtbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2dldFZhcmlhYmxlcygpLHQ9ZS5sZWZ0T3ZlcmxheSxuPWUud3RUYWJsZSxvPWUud3RWaWV3cG9ydCxyPWUudG90YWxDb2x1bW5zLGk9KGUuZml4ZWRDb2x1bW5zTGVmdCxuLmdldEZpcnN0VmlzaWJsZUNvbHVtbigpKTtpZih0Lm1haW5UYWJsZVNjcm9sbGFibGVFbGVtZW50PT09d2luZG93KXt2YXIgcz1jKG4ud3RSb290RWxlbWVudCksdT1sKG4uaGlkZXIpLGg9bCh3aW5kb3cpLGQ9YSh3aW5kb3cpO2lmKHMubGVmdCt1LWg8PWQpe3ZhciBwPW8uZ2V0Um93SGVhZGVyV2lkdGgoKTtmKHIsMSxmdW5jdGlvbihlKXtyZXR1cm4gcCs9dC5zdW1DZWxsU2l6ZXMoZS0xLGUpLHMubGVmdCt1LXA8PWQ/KGk9ZSwhMSk6dm9pZCAwfSl9fXJldHVybiBpfSxnZXRMYXN0VmlzaWJsZUNvbHVtbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2dldFZhcmlhYmxlcygpLHQ9ZS5sZWZ0T3ZlcmxheSxuPWUud3RUYWJsZSxvPWUud3RWaWV3cG9ydCxyPWUudG90YWxDb2x1bW5zLGk9bi5nZXRMYXN0VmlzaWJsZUNvbHVtbigpO2lmKHQubWFpblRhYmxlU2Nyb2xsYWJsZUVsZW1lbnQ9PT13aW5kb3cpe3ZhciBzPWMobi53dFJvb3RFbGVtZW50KSx1PWwod2luZG93KSxoPWEod2luZG93KTtpZihzLmxlZnQ+aCl7dmFyIGY9by5nZXRSb3dIZWFkZXJXaWR0aCgpO2QoMSxyLGZ1bmN0aW9uKGUpe3JldHVybiBmKz10LnN1bUNlbGxTaXplcyhlLTEsZSkscy5sZWZ0K2YtaD49dT8oaT1lLTIsITEpOnZvaWQgMH0pfX1yZXR1cm4gaX0sX2dldFZhcmlhYmxlczpmdW5jdGlvbigpe3ZhciBlPXRoaXMud290LHQ9ZS53dE92ZXJsYXlzLnRvcE92ZXJsYXksbj1lLnd0T3ZlcmxheXMubGVmdE92ZXJsYXksbz1lLnd0VGFibGUscj1lLnd0Vmlld3BvcnQsaT1lLmdldFNldHRpbmcoInRvdGFsUm93cyIpLHM9ZS5nZXRTZXR0aW5nKCJ0b3RhbENvbHVtbnMiKSxsPWUuZ2V0U2V0dGluZygiZml4ZWRSb3dzVG9wIiksYT1lLmdldFNldHRpbmcoImZpeGVkUm93c0JvdHRvbSIpLHU9ZS5nZXRTZXR0aW5nKCJmaXhlZENvbHVtbnNMZWZ0Iik7cmV0dXJue3RvcE92ZXJsYXk6dCxsZWZ0T3ZlcmxheTpuLHd0VGFibGU6byx3dFZpZXdwb3J0OnIsdG90YWxSb3dzOmksdG90YWxDb2x1bW5zOnMsZml4ZWRSb3dzVG9wOmwsZml4ZWRSb3dzQm90dG9tOmEsZml4ZWRDb2x1bW5zTGVmdDp1fX19LHt9KSx3aW5kb3cuV2Fsa29udGFibGVTY3JvbGw9cH0seyJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9udW1iZXIiOjUxfV0sMTg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7V2Fsa29udGFibGVTZWxlY3Rpb246e2dldDpmdW5jdGlvbigpe3JldHVybiBofX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpLHMsbD0obz1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KS5hZGRDbGFzcyxhPShyPWUoImJvcmRlciIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkuV2Fsa29udGFibGVCb3JkZXIsdT0oaT1lKCJjZWxsL2Nvb3JkcyIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkuV2Fsa29udGFibGVDZWxsQ29vcmRzLGM9KHM9ZSgiY2VsbC9yYW5nZSIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuV2Fsa29udGFibGVDZWxsUmFuZ2UsaD1mdW5jdGlvbihlLHQpe3RoaXMuc2V0dGluZ3M9ZSx0aGlzLmNlbGxSYW5nZT10fHxudWxsLHRoaXMuaW5zdGFuY2VCb3JkZXJzPXt9fTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoaCx7Z2V0Qm9yZGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmluc3RhbmNlQm9yZGVyc1tlLmd1aWRdP3RoaXMuaW5zdGFuY2VCb3JkZXJzW2UuZ3VpZF06dm9pZCh0aGlzLmluc3RhbmNlQm9yZGVyc1tlLmd1aWRdPW5ldyBhKGUsdGhpcy5zZXR0aW5ncykpfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLmNlbGxSYW5nZX0sYWRkOmZ1bmN0aW9uKGUpe3RoaXMuaXNFbXB0eSgpP3RoaXMuY2VsbFJhbmdlPW5ldyBjKGUsZSxlKTp0aGlzLmNlbGxSYW5nZS5leHBhbmQoZSl9LHJlcGxhY2U6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5pc0VtcHR5KCkpe2lmKHRoaXMuY2VsbFJhbmdlLmZyb20uaXNFcXVhbChlKSlyZXR1cm4gdGhpcy5jZWxsUmFuZ2UuZnJvbT10LCEwO2lmKHRoaXMuY2VsbFJhbmdlLnRvLmlzRXF1YWwoZSkpcmV0dXJuIHRoaXMuY2VsbFJhbmdlLnRvPXQsITB9cmV0dXJuITF9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5jZWxsUmFuZ2U9bnVsbH0sZ2V0Q29ybmVyczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuY2VsbFJhbmdlLmdldFRvcExlZnRDb3JuZXIoKSx0PXRoaXMuY2VsbFJhbmdlLmdldEJvdHRvbVJpZ2h0Q29ybmVyKCk7cmV0dXJuW2Uucm93LGUuY29sLHQucm93LHQuY29sXX0sYWRkQ2xhc3NBdENvb3JkczpmdW5jdGlvbihlLHQsbixvKXt2YXIgcj1lLnd0VGFibGUuZ2V0Q2VsbChuZXcgdSh0LG4pKTsib2JqZWN0Ij09dHlwZW9mIHImJmwocixvKX0sZHJhdzpmdW5jdGlvbihlKXtpZih0aGlzLmlzRW1wdHkoKSl7aWYodGhpcy5zZXR0aW5ncy5ib3JkZXIpe3ZhciB0PXRoaXMuZ2V0Qm9yZGVyKGUpO3QmJnQuZGlzYXBwZWFyKCl9fWVsc2V7Zm9yKHZhciBuLG8scixpPWUud3RUYWJsZS5nZXRSZW5kZXJlZFJvd3NDb3VudCgpLHM9ZS53dFRhYmxlLmdldFJlbmRlcmVkQ29sdW1uc0NvdW50KCksYT10aGlzLmdldENvcm5lcnMoKSx1PTA7cz51O3UrKylvPWUud3RUYWJsZS5jb2x1bW5GaWx0ZXIucmVuZGVyZWRUb1NvdXJjZSh1KSxvPj1hWzFdJiZvPD1hWzNdJiYocj1lLnd0VGFibGUuZ2V0Q29sdW1uSGVhZGVyKG8pLHImJnRoaXMuc2V0dGluZ3MuaGlnaGxpZ2h0Q29sdW1uQ2xhc3NOYW1lJiZsKHIsdGhpcy5zZXR0aW5ncy5oaWdobGlnaHRDb2x1bW5DbGFzc05hbWUpKTtmb3IodmFyIGM9MDtpPmM7YysrKXtuPWUud3RUYWJsZS5yb3dGaWx0ZXIucmVuZGVyZWRUb1NvdXJjZShjKSxuPj1hWzBdJiZuPD1hWzJdJiYocj1lLnd0VGFibGUuZ2V0Um93SGVhZGVyKG4pLHImJnRoaXMuc2V0dGluZ3MuaGlnaGxpZ2h0Um93Q2xhc3NOYW1lJiZsKHIsdGhpcy5zZXR0aW5ncy5oaWdobGlnaHRSb3dDbGFzc05hbWUpKTtmb3IodmFyIGg9MDtzPmg7aCsrKW89ZS53dFRhYmxlLmNvbHVtbkZpbHRlci5yZW5kZXJlZFRvU291cmNlKGgpLG4+PWFbMF0mJm48PWFbMl0mJm8+PWFbMV0mJm88PWFbM10/dGhpcy5zZXR0aW5ncy5jbGFzc05hbWUmJnRoaXMuYWRkQ2xhc3NBdENvb3JkcyhlLG4sbyx0aGlzLnNldHRpbmdzLmNsYXNzTmFtZSk6bj49YVswXSYmbjw9YVsyXT90aGlzLnNldHRpbmdzLmhpZ2hsaWdodFJvd0NsYXNzTmFtZSYmdGhpcy5hZGRDbGFzc0F0Q29vcmRzKGUsbixvLHRoaXMuc2V0dGluZ3MuaGlnaGxpZ2h0Um93Q2xhc3NOYW1lKTpvPj1hWzFdJiZvPD1hWzNdJiZ0aGlzLnNldHRpbmdzLmhpZ2hsaWdodENvbHVtbkNsYXNzTmFtZSYmdGhpcy5hZGRDbGFzc0F0Q29vcmRzKGUsbixvLHRoaXMuc2V0dGluZ3MuaGlnaGxpZ2h0Q29sdW1uQ2xhc3NOYW1lKX1pZihlLmdldFNldHRpbmcoIm9uQmVmb3JlRHJhd0JvcmRlcnMiLGEsdGhpcy5zZXR0aW5ncy5jbGFzc05hbWUpLHRoaXMuc2V0dGluZ3MuYm9yZGVyKXt2YXIgZD10aGlzLmdldEJvcmRlcihlKTtkJiZkLmFwcGVhcihhKX19fX0se30pLHdpbmRvdy5XYWxrb250YWJsZVNlbGVjdGlvbj1ofSx7Ym9yZGVyOjIsImNlbGwvY29vcmRzIjo1LCJjZWxsL3JhbmdlIjo2LCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0Nn1dLDE5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se1dhbGtvbnRhYmxlU2V0dGluZ3M6e2dldDpmdW5jdGlvbigpe3JldHVybiBpfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scj0obz1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KS5mYXN0SW5uZXJUZXh0LGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMud290PWUsdGhpcy5pbnN0YW5jZT1lLHRoaXMuZGVmYXVsdHM9e3RhYmxlOnZvaWQgMCxkZWJ1ZzohMSxleHRlcm5hbFJvd0NhbGN1bGF0b3I6ITEsc3RyZXRjaEg6Im5vbmUiLGN1cnJlbnRSb3dDbGFzc05hbWU6bnVsbCxjdXJyZW50Q29sdW1uQ2xhc3NOYW1lOm51bGwscHJldmVudE92ZXJmbG93OmZ1bmN0aW9uKCl7cmV0dXJuITF9LGRhdGE6dm9pZCAwLGZpeGVkQ29sdW1uc0xlZnQ6MCxmaXhlZFJvd3NUb3A6MCxmaXhlZFJvd3NCb3R0b206MCxtaW5TcGFyZVJvd3M6MCxyb3dIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuW119LGNvbHVtbkhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdG90YWxSb3dzOnZvaWQgMCx0b3RhbENvbHVtbnM6dm9pZCAwLGNlbGxSZW5kZXJlcjpmdW5jdGlvbihlLHQsbyl7dmFyIGk9bi5nZXRTZXR0aW5nKCJkYXRhIixlLHQpO3Iobyx2b2lkIDA9PT1pfHxudWxsPT09aT8iIjppKTsNCn0sY29sdW1uV2lkdGg6ZnVuY3Rpb24oZSl7fSxyb3dIZWlnaHQ6ZnVuY3Rpb24oZSl7fSxkZWZhdWx0Um93SGVpZ2h0OjIzLGRlZmF1bHRDb2x1bW5XaWR0aDo1MCxzZWxlY3Rpb25zOm51bGwsaGlkZUJvcmRlck9uTW91c2VEb3duT3ZlcjohMSx2aWV3cG9ydFJvd0NhbGN1bGF0b3JPdmVycmlkZTpudWxsLHZpZXdwb3J0Q29sdW1uQ2FsY3VsYXRvck92ZXJyaWRlOm51bGwsb25DZWxsTW91c2VEb3duOm51bGwsb25DZWxsTW91c2VPdmVyOm51bGwsb25DZWxsRGJsQ2xpY2s6bnVsbCxvbkNlbGxDb3JuZXJNb3VzZURvd246bnVsbCxvbkNlbGxDb3JuZXJEYmxDbGljazpudWxsLGJlZm9yZURyYXc6bnVsbCxvbkRyYXc6bnVsbCxvbkJlZm9yZURyYXdCb3JkZXJzOm51bGwsb25TY3JvbGxWZXJ0aWNhbGx5Om51bGwsb25TY3JvbGxIb3Jpem9udGFsbHk6bnVsbCxvbkJlZm9yZVRvdWNoU2Nyb2xsOm51bGwsb25BZnRlck1vbWVudHVtU2Nyb2xsOm51bGwsb25CZWZvcmVTdHJldGNoaW5nQ29sdW1uV2lkdGg6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHNjcm9sbGJhcldpZHRoOjEwLHNjcm9sbGJhckhlaWdodDoxMCxyZW5kZXJBbGxSb3dzOiExLGdyb3VwczohMSxyb3dIZWFkZXJXaWR0aDpudWxsLGNvbHVtbkhlYWRlckhlaWdodDpudWxsfSx0aGlzLnNldHRpbmdzPXt9O2Zvcih2YXIgbyBpbiB0aGlzLmRlZmF1bHRzKWlmKHRoaXMuZGVmYXVsdHMuaGFzT3duUHJvcGVydHkobykpaWYodm9pZCAwIT09dFtvXSl0aGlzLnNldHRpbmdzW29dPXRbb107ZWxzZXtpZih2b2lkIDA9PT10aGlzLmRlZmF1bHRzW29dKXRocm93IG5ldyBFcnJvcignQSByZXF1aXJlZCBzZXR0aW5nICInK28rJyIgd2FzIG5vdCBwcm92aWRlZCcpO3RoaXMuc2V0dGluZ3Nbb109dGhpcy5kZWZhdWx0c1tvXX19OyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhpLHt1cGRhdGU6ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10KWZvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0aGlzLnNldHRpbmdzW25dPWVbbl0pO2Vsc2UgdGhpcy5zZXR0aW5nc1tlXT10O3JldHVybiB0aGlzLndvdH0sZ2V0U2V0dGluZzpmdW5jdGlvbihlLHQsbixvLHIpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNldHRpbmdzW2VdP3RoaXMuc2V0dGluZ3NbZV0odCxuLG8scik6dm9pZCAwIT09dCYmQXJyYXkuaXNBcnJheSh0aGlzLnNldHRpbmdzW2VdKT90aGlzLnNldHRpbmdzW2VdW3RdOnRoaXMuc2V0dGluZ3NbZV19LGhhczpmdW5jdGlvbihlKXtyZXR1cm4hIXRoaXMuc2V0dGluZ3NbZV19fSx7fSksd2luZG93LldhbGtvbnRhYmxlU2V0dGluZ3M9aX0seyJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0Nn1dLDIwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se1dhbGtvbnRhYmxlVGFibGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBSfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpLHMsbCxhLHU9KG89ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSksYz11LmdldFN0eWxlLGg9dS5nZXRUcmltbWluZ0NvbnRhaW5lcixkPXUuaGFzQ2xhc3MsZj11LmluZGV4LHA9dS5vZmZzZXQsZz11LnJlbW92ZUNsYXNzLG09dS5yZW1vdmVUZXh0Tm9kZXMsdz11Lm92ZXJsYXlDb250YWluc0VsZW1lbnQsdj11LmNsb3Nlc3QseT0ocj1lKCJjZWxsL2Nvb3JkcyIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkuV2Fsa29udGFibGVDZWxsQ29vcmRzLGI9KChpPWUoImNlbGwvcmFuZ2UiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLldhbGtvbnRhYmxlQ2VsbFJhbmdlLChzPWUoImZpbHRlci9jb2x1bW4iKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLldhbGtvbnRhYmxlQ29sdW1uRmlsdGVyKSxDPShsPWUoImZpbHRlci9yb3ciKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLldhbGtvbnRhYmxlUm93RmlsdGVyLF89KGE9ZSgidGFibGVSZW5kZXJlciIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSkuV2Fsa29udGFibGVUYWJsZVJlbmRlcmVyLFI9ZnVuY3Rpb24oZSx0KXt0aGlzLndvdD1lLHRoaXMuaW5zdGFuY2U9dGhpcy53b3QsdGhpcy5UQUJMRT10LHRoaXMuVEJPRFk9bnVsbCx0aGlzLlRIRUFEPW51bGwsdGhpcy5DT0xHUk9VUD1udWxsLHRoaXMudGFibGVPZmZzZXQ9MCx0aGlzLmhvbGRlck9mZnNldD0wLG0odGhpcy5UQUJMRSksdGhpcy5zcHJlYWRlcj10aGlzLmNyZWF0ZVNwcmVhZGVyKHRoaXMuVEFCTEUpLHRoaXMuaGlkZXI9dGhpcy5jcmVhdGVIaWRlcih0aGlzLnNwcmVhZGVyKSx0aGlzLmhvbGRlcj10aGlzLmNyZWF0ZUhvbGRlcih0aGlzLmhpZGVyKSx0aGlzLnd0Um9vdEVsZW1lbnQ9dGhpcy5ob2xkZXIucGFyZW50Tm9kZSx0aGlzLmFsaWduT3ZlcmxheXNXaXRoVHJpbW1pbmdDb250YWluZXIoKSx0aGlzLmZpeFRhYmxlRG9tVHJlZSgpLHRoaXMuY29sZ3JvdXBDaGlsZHJlbkxlbmd0aD10aGlzLkNPTEdST1VQLmNoaWxkTm9kZXMubGVuZ3RoLHRoaXMudGhlYWRDaGlsZHJlbkxlbmd0aD10aGlzLlRIRUFELmZpcnN0Q2hpbGQ/dGhpcy5USEVBRC5maXJzdENoaWxkLmNoaWxkTm9kZXMubGVuZ3RoOjAsdGhpcy50Ym9keUNoaWxkcmVuTGVuZ3RoPXRoaXMuVEJPRFkuY2hpbGROb2Rlcy5sZW5ndGgsdGhpcy5yb3dGaWx0ZXI9bnVsbCx0aGlzLmNvbHVtbkZpbHRlcj1udWxsfTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoUix7Zml4VGFibGVEb21UcmVlOmZ1bmN0aW9uKCl7dGhpcy5UQk9EWT10aGlzLlRBQkxFLnF1ZXJ5U2VsZWN0b3IoInRib2R5IiksdGhpcy5UQk9EWXx8KHRoaXMuVEJPRFk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSx0aGlzLlRBQkxFLmFwcGVuZENoaWxkKHRoaXMuVEJPRFkpKSx0aGlzLlRIRUFEPXRoaXMuVEFCTEUucXVlcnlTZWxlY3RvcigidGhlYWQiKSx0aGlzLlRIRUFEfHwodGhpcy5USEVBRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aGVhZCIpLHRoaXMuVEFCTEUuaW5zZXJ0QmVmb3JlKHRoaXMuVEhFQUQsdGhpcy5UQk9EWSkpLHRoaXMuQ09MR1JPVVA9dGhpcy5UQUJMRS5xdWVyeVNlbGVjdG9yKCJjb2xncm91cCIpLHRoaXMuQ09MR1JPVVB8fCh0aGlzLkNPTEdST1VQPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNvbGdyb3VwIiksdGhpcy5UQUJMRS5pbnNlcnRCZWZvcmUodGhpcy5DT0xHUk9VUCx0aGlzLlRIRUFEKSksdGhpcy53b3QuZ2V0U2V0dGluZygiY29sdW1uSGVhZGVycyIpLmxlbmd0aCYmIXRoaXMuVEhFQUQuY2hpbGROb2Rlcy5sZW5ndGgmJnRoaXMuVEhFQUQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVFIiKSl9LGNyZWF0ZVNwcmVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5wYXJlbnROb2RlO3JldHVybiBuJiYxPT09bi5ub2RlVHlwZSYmZChuLCJ3dEhvbGRlciIpfHwodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LmNsYXNzTmFtZT0id3RTcHJlYWRlciIsbiYmbi5pbnNlcnRCZWZvcmUodCxlKSx0LmFwcGVuZENoaWxkKGUpKSx0LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdH0sY3JlYXRlSGlkZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLnBhcmVudE5vZGU7cmV0dXJuIG4mJjE9PT1uLm5vZGVUeXBlJiZkKG4sInd0SG9sZGVyIil8fCh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHQuY2xhc3NOYW1lPSJ3dEhpZGVyIixuJiZuLmluc2VydEJlZm9yZSh0LGUpLHQuYXBwZW5kQ2hpbGQoZSkpLHR9LGNyZWF0ZUhvbGRlcjpmdW5jdGlvbihlKXt2YXIgdCxuPWUucGFyZW50Tm9kZTtyZXR1cm4gbiYmMT09PW4ubm9kZVR5cGUmJmQobiwid3RIb2xkZXIiKXx8KHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLHQuY2xhc3NOYW1lPSJ3dEhvbGRlciIsbiYmbi5pbnNlcnRCZWZvcmUodCxlKSx0aGlzLmlzV29ya2luZ09uQ2xvbmUoKXx8KHQucGFyZW50Tm9kZS5jbGFzc05hbWUrPSJodF9tYXN0ZXIgaGFuZHNvbnRhYmxlIiksdC5hcHBlbmRDaGlsZChlKSksdH0sYWxpZ25PdmVybGF5c1dpdGhUcmltbWluZ0NvbnRhaW5lcjpmdW5jdGlvbigpe3ZhciBlPWgodGhpcy53dFJvb3RFbGVtZW50KTtpZighdGhpcy5pc1dvcmtpbmdPbkNsb25lKCkpaWYodGhpcy5ob2xkZXIucGFyZW50Tm9kZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGU9PT13aW5kb3cpe3ZhciB0PXRoaXMud290LmdldFNldHRpbmcoInByZXZlbnRPdmVyZmxvdyIpO3R8fCh0aGlzLmhvbGRlci5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSIsdGhpcy53dFJvb3RFbGVtZW50LnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIil9ZWxzZSB0aGlzLmhvbGRlci5zdHlsZS53aWR0aD1jKGUsIndpZHRoIiksdGhpcy5ob2xkZXIuc3R5bGUuaGVpZ2h0PWMoZSwiaGVpZ2h0IiksdGhpcy5ob2xkZXIuc3R5bGUub3ZlcmZsb3c9IiJ9LGlzV29ya2luZ09uQ2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMud290LmNsb25lU291cmNlfSxkcmF3OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuaW5zdGFuY2UuZ2V0U2V0dGluZygidG90YWxSb3dzIik7aWYodGhpcy5pc1dvcmtpbmdPbkNsb25lKCl8fCh0aGlzLmhvbGRlck9mZnNldD1wKHRoaXMuaG9sZGVyKSxlPXRoaXMud290Lnd0Vmlld3BvcnQuY3JlYXRlUmVuZGVyQ2FsY3VsYXRvcnMoZSkpLGUpdGhpcy5pc1dvcmtpbmdPbkNsb25lKCl8fHRoaXMud290Lnd0Vmlld3BvcnQuY3JlYXRlVmlzaWJsZUNhbGN1bGF0b3JzKCksdGhpcy53b3Qud3RPdmVybGF5cyYmdGhpcy53b3Qud3RPdmVybGF5cy5yZWZyZXNoKCEwKTtlbHNle3RoaXMuaXNXb3JraW5nT25DbG9uZSgpP3RoaXMudGFibGVPZmZzZXQ9dGhpcy53b3QuY2xvbmVTb3VyY2Uud3RUYWJsZS50YWJsZU9mZnNldDp0aGlzLnRhYmxlT2Zmc2V0PXAodGhpcy5UQUJMRSk7dmFyIG47bj1XYWxrb250YWJsZU92ZXJsYXkuaXNPdmVybGF5VHlwZU9mKHRoaXMud290LmNsb25lT3ZlcmxheSxXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfREVCVUcpfHxXYWxrb250YWJsZU92ZXJsYXkuaXNPdmVybGF5VHlwZU9mKHRoaXMud290LmNsb25lT3ZlcmxheSxXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfVE9QKXx8V2Fsa29udGFibGVPdmVybGF5LmlzT3ZlcmxheVR5cGVPZih0aGlzLndvdC5jbG9uZU92ZXJsYXksV2Fsa29udGFibGVPdmVybGF5LkNMT05FX1RPUF9MRUZUX0NPUk5FUik/MDpXYWxrb250YWJsZU92ZXJsYXkuaXNPdmVybGF5VHlwZU9mKHRoaXMuaW5zdGFuY2UuY2xvbmVPdmVybGF5LFdhbGtvbnRhYmxlT3ZlcmxheS5DTE9ORV9CT1RUT00pfHxXYWxrb250YWJsZU92ZXJsYXkuaXNPdmVybGF5VHlwZU9mKHRoaXMuaW5zdGFuY2UuY2xvbmVPdmVybGF5LFdhbGtvbnRhYmxlT3ZlcmxheS5DTE9ORV9CT1RUT01fTEVGVF9DT1JORVIpP01hdGgubWF4KHQtdGhpcy53b3QuZ2V0U2V0dGluZygiZml4ZWRSb3dzQm90dG9tIiksMCk6dGhpcy53b3Qud3RWaWV3cG9ydC5yb3dzUmVuZGVyQ2FsY3VsYXRvci5zdGFydFJvdzt2YXIgbztvPVdhbGtvbnRhYmxlT3ZlcmxheS5pc092ZXJsYXlUeXBlT2YodGhpcy53b3QuY2xvbmVPdmVybGF5LFdhbGtvbnRhYmxlT3ZlcmxheS5DTE9ORV9ERUJVRyl8fFdhbGtvbnRhYmxlT3ZlcmxheS5pc092ZXJsYXlUeXBlT2YodGhpcy53b3QuY2xvbmVPdmVybGF5LFdhbGtvbnRhYmxlT3ZlcmxheS5DTE9ORV9MRUZUKXx8V2Fsa29udGFibGVPdmVybGF5LmlzT3ZlcmxheVR5cGVPZih0aGlzLndvdC5jbG9uZU92ZXJsYXksV2Fsa29udGFibGVPdmVybGF5LkNMT05FX1RPUF9MRUZUX0NPUk5FUil8fFdhbGtvbnRhYmxlT3ZlcmxheS5pc092ZXJsYXlUeXBlT2YodGhpcy53b3QuY2xvbmVPdmVybGF5LFdhbGtvbnRhYmxlT3ZlcmxheS5DTE9ORV9CT1RUT01fTEVGVF9DT1JORVIpPzA6dGhpcy53b3Qud3RWaWV3cG9ydC5jb2x1bW5zUmVuZGVyQ2FsY3VsYXRvci5zdGFydENvbHVtbix0aGlzLnJvd0ZpbHRlcj1uZXcgQyhuLHQsdGhpcy53b3QuZ2V0U2V0dGluZygiY29sdW1uSGVhZGVycyIpLmxlbmd0aCksdGhpcy5jb2x1bW5GaWx0ZXI9bmV3IGIobyx0aGlzLndvdC5nZXRTZXR0aW5nKCJ0b3RhbENvbHVtbnMiKSx0aGlzLndvdC5nZXRTZXR0aW5nKCJyb3dIZWFkZXJzIikubGVuZ3RoKSx0aGlzLmFsaWduT3ZlcmxheXNXaXRoVHJpbW1pbmdDb250YWluZXIoKSx0aGlzLl9kb0RyYXcoKX1yZXR1cm4gdGhpcy5yZWZyZXNoU2VsZWN0aW9ucyhlKSx0aGlzLmlzV29ya2luZ09uQ2xvbmUoKXx8KHRoaXMud290Lnd0T3ZlcmxheXMudG9wT3ZlcmxheS5yZXNldEZpeGVkUG9zaXRpb24oKSx0aGlzLndvdC53dE92ZXJsYXlzLmJvdHRvbU92ZXJsYXkuY2xvbmUmJnRoaXMud290Lnd0T3ZlcmxheXMuYm90dG9tT3ZlcmxheS5yZXNldEZpeGVkUG9zaXRpb24oKSx0aGlzLndvdC53dE92ZXJsYXlzLmxlZnRPdmVybGF5LnJlc2V0Rml4ZWRQb3NpdGlvbigpLHRoaXMud290Lnd0T3ZlcmxheXMudG9wTGVmdENvcm5lck92ZXJsYXkmJnRoaXMud290Lnd0T3ZlcmxheXMudG9wTGVmdENvcm5lck92ZXJsYXkucmVzZXRGaXhlZFBvc2l0aW9uKCksdGhpcy5pbnN0YW5jZS53dE92ZXJsYXlzLmJvdHRvbUxlZnRDb3JuZXJPdmVybGF5JiZ0aGlzLmluc3RhbmNlLnd0T3ZlcmxheXMuYm90dG9tTGVmdENvcm5lck92ZXJsYXkuY2xvbmUmJnRoaXMud290Lnd0T3ZlcmxheXMuYm90dG9tTGVmdENvcm5lck92ZXJsYXkucmVzZXRGaXhlZFBvc2l0aW9uKCkpLHRoaXMud290LmRyYXduPSEwLHRoaXN9LF9kb0RyYXc6ZnVuY3Rpb24oKXt2YXIgZT1uZXcgXyh0aGlzKTtlLnJlbmRlcigpfSxyZW1vdmVDbGFzc0Zyb21DZWxsczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5UQUJMRS5xdWVyeVNlbGVjdG9yQWxsKCIuIitlKSxuPTAsbz10Lmxlbmd0aDtvPm47bisrKWcodFtuXSxlKX0scmVmcmVzaFNlbGVjdGlvbnM6ZnVuY3Rpb24oZSl7aWYodGhpcy53b3Quc2VsZWN0aW9ucyl7dmFyIHQ9dGhpcy53b3Quc2VsZWN0aW9ucy5sZW5ndGg7aWYoZSlmb3IodmFyIG49MDt0Pm47bisrKXRoaXMud290LnNlbGVjdGlvbnNbbl0uc2V0dGluZ3MuY2xhc3NOYW1lJiZ0aGlzLnJlbW92ZUNsYXNzRnJvbUNlbGxzKHRoaXMud290LnNlbGVjdGlvbnNbbl0uc2V0dGluZ3MuY2xhc3NOYW1lKSx0aGlzLndvdC5zZWxlY3Rpb25zW25dLnNldHRpbmdzLmhpZ2hsaWdodFJvd0NsYXNzTmFtZSYmdGhpcy5yZW1vdmVDbGFzc0Zyb21DZWxscyh0aGlzLndvdC5zZWxlY3Rpb25zW25dLnNldHRpbmdzLmhpZ2hsaWdodFJvd0NsYXNzTmFtZSksdGhpcy53b3Quc2VsZWN0aW9uc1tuXS5zZXR0aW5ncy5oaWdobGlnaHRDb2x1bW5DbGFzc05hbWUmJnRoaXMucmVtb3ZlQ2xhc3NGcm9tQ2VsbHModGhpcy53b3Quc2VsZWN0aW9uc1tuXS5zZXR0aW5ncy5oaWdobGlnaHRDb2x1bW5DbGFzc05hbWUpO2Zvcih2YXIgbz0wO3Q+bztvKyspdGhpcy53b3Quc2VsZWN0aW9uc1tvXS5kcmF3KHRoaXMud290LGUpfX0sZ2V0Q2VsbDpmdW5jdGlvbihlKXtpZih0aGlzLmlzUm93QmVmb3JlUmVuZGVyZWRSb3dzKGUucm93KSlyZXR1cm4tMTtpZih0aGlzLmlzUm93QWZ0ZXJSZW5kZXJlZFJvd3MoZS5yb3cpKXJldHVybi0yO3ZhciB0PXRoaXMuVEJPRFkuY2hpbGROb2Rlc1t0aGlzLnJvd0ZpbHRlci5zb3VyY2VUb1JlbmRlcmVkKGUucm93KV07cmV0dXJuIHQ/dC5jaGlsZE5vZGVzW3RoaXMuY29sdW1uRmlsdGVyLnNvdXJjZUNvbHVtblRvVmlzaWJsZVJvd0hlYWRlZENvbHVtbihlLmNvbCldOnZvaWQgMH0sZ2V0Q29sdW1uSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MCxuPXRoaXMuVEhFQUQuY2hpbGROb2Rlc1t0XTtyZXR1cm4gbj9uLmNoaWxkTm9kZXNbdGhpcy5jb2x1bW5GaWx0ZXIuc291cmNlQ29sdW1uVG9WaXNpYmxlUm93SGVhZGVkQ29sdW1uKGUpXTp2b2lkIDB9LGdldFJvd0hlYWRlcjpmdW5jdGlvbihlKXtpZigwPT09dGhpcy5jb2x1bW5GaWx0ZXIuc291cmNlQ29sdW1uVG9WaXNpYmxlUm93SGVhZGVkQ29sdW1uKDApKXJldHVybiBudWxsO3ZhciB0PXRoaXMuVEJPRFkuY2hpbGROb2Rlc1t0aGlzLnJvd0ZpbHRlci5zb3VyY2VUb1JlbmRlcmVkKGUpXTtyZXR1cm4gdD90LmNoaWxkTm9kZXNbMF06dm9pZCAwfSxnZXRDb29yZHM6ZnVuY3Rpb24oZSl7IlREIiE9PWUubm9kZU5hbWUmJiJUSCIhPT1lLm5vZGVOYW1lJiYoZT12KGUsWyJURCIsIlRIIl0pKTt2YXIgdD1lLnBhcmVudE5vZGUsbj10LnBhcmVudE5vZGUsbz1mKHQpLHI9ZS5jZWxsSW5kZXg7cmV0dXJuIHcoV2Fsa29udGFibGVPdmVybGF5LkNMT05FX1RPUF9MRUZUX0NPUk5FUixlKXx8dyhXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfVE9QLGUpPyJUSEVBRCI9PT1uLm5vZGVOYW1lJiYoby09bi5jaGlsZE5vZGVzLmxlbmd0aCk6bz1uPT09dGhpcy5USEVBRD90aGlzLnJvd0ZpbHRlci52aXNpYmxlQ29sSGVhZGVkUm93VG9Tb3VyY2VSb3cobyk6dGhpcy5yb3dGaWx0ZXIucmVuZGVyZWRUb1NvdXJjZShvKSxyPXcoV2Fsa29udGFibGVPdmVybGF5LkNMT05FX1RPUF9MRUZUX0NPUk5FUixlKXx8dyhXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfTEVGVCxlKT90aGlzLmNvbHVtbkZpbHRlci5vZmZzZXR0ZWRUSChyKTp0aGlzLmNvbHVtbkZpbHRlci52aXNpYmxlUm93SGVhZGVkQ29sdW1uVG9Tb3VyY2VDb2x1bW4ociksbmV3IHkobyxyKX0sZ2V0VHJGb3JSb3c6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuVEJPRFkuY2hpbGROb2Rlc1t0aGlzLnJvd0ZpbHRlci5zb3VyY2VUb1JlbmRlcmVkKGUpXX0sZ2V0Rmlyc3RSZW5kZXJlZFJvdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLndvdC53dFZpZXdwb3J0LnJvd3NSZW5kZXJDYWxjdWxhdG9yLnN0YXJ0Um93fSxnZXRGaXJzdFZpc2libGVSb3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53b3Qud3RWaWV3cG9ydC5yb3dzVmlzaWJsZUNhbGN1bGF0b3Iuc3RhcnRSb3d9LGdldEZpcnN0UmVuZGVyZWRDb2x1bW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53b3Qud3RWaWV3cG9ydC5jb2x1bW5zUmVuZGVyQ2FsY3VsYXRvci5zdGFydENvbHVtbn0sZ2V0Rmlyc3RWaXNpYmxlQ29sdW1uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud290Lnd0Vmlld3BvcnQuY29sdW1uc1Zpc2libGVDYWxjdWxhdG9yLnN0YXJ0Q29sdW1ufSxnZXRMYXN0UmVuZGVyZWRSb3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53b3Qud3RWaWV3cG9ydC5yb3dzUmVuZGVyQ2FsY3VsYXRvci5lbmRSb3d9LGdldExhc3RWaXNpYmxlUm93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud290Lnd0Vmlld3BvcnQucm93c1Zpc2libGVDYWxjdWxhdG9yLmVuZFJvd30sZ2V0TGFzdFJlbmRlcmVkQ29sdW1uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud290Lnd0Vmlld3BvcnQuY29sdW1uc1JlbmRlckNhbGN1bGF0b3IuZW5kQ29sdW1ufSxnZXRMYXN0VmlzaWJsZUNvbHVtbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLndvdC53dFZpZXdwb3J0LmNvbHVtbnNWaXNpYmxlQ2FsY3VsYXRvci5lbmRDb2x1bW59LGlzUm93QmVmb3JlUmVuZGVyZWRSb3dzOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJvd0ZpbHRlci5zb3VyY2VUb1JlbmRlcmVkKGUpPDAmJmU+PTB9LGlzUm93QWZ0ZXJWaWV3cG9ydDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yb3dGaWx0ZXIuc291cmNlVG9SZW5kZXJlZChlKT50aGlzLmdldExhc3RWaXNpYmxlUm93KCl9LGlzUm93QWZ0ZXJSZW5kZXJlZFJvd3M6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucm93RmlsdGVyLnNvdXJjZVRvUmVuZGVyZWQoZSk+dGhpcy5nZXRMYXN0UmVuZGVyZWRSb3coKX0saXNDb2x1bW5CZWZvcmVWaWV3cG9ydDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jb2x1bW5GaWx0ZXIuc291cmNlVG9SZW5kZXJlZChlKTwwJiZlPj0wfSxpc0NvbHVtbkFmdGVyVmlld3BvcnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29sdW1uRmlsdGVyLnNvdXJjZVRvUmVuZGVyZWQoZSk+dGhpcy5nZXRMYXN0VmlzaWJsZUNvbHVtbigpfSxpc0xhc3RSb3dGdWxseVZpc2libGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMYXN0VmlzaWJsZVJvdygpPT09dGhpcy5nZXRMYXN0UmVuZGVyZWRSb3coKX0saXNMYXN0Q29sdW1uRnVsbHlWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TGFzdFZpc2libGVDb2x1bW4oKT09PXRoaXMuZ2V0TGFzdFJlbmRlcmVkQ29sdW1uKCl9LGdldFJlbmRlcmVkQ29sdW1uc0NvdW50OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy53b3Qud3RWaWV3cG9ydC5jb2x1bW5zUmVuZGVyQ2FsY3VsYXRvci5jb3VudCx0PXRoaXMud290LmdldFNldHRpbmcoInRvdGFsQ29sdW1ucyIpO2lmKHRoaXMud290LmlzT3ZlcmxheU5hbWUoV2Fsa29udGFibGVPdmVybGF5LkNMT05FX0RFQlVHKSllPXQ7ZWxzZSBpZih0aGlzLndvdC5pc092ZXJsYXlOYW1lKFdhbGtvbnRhYmxlT3ZlcmxheS5DTE9ORV9MRUZUKXx8dGhpcy53b3QuaXNPdmVybGF5TmFtZShXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfVE9QX0xFRlRfQ09STkVSKXx8dGhpcy53b3QuaXNPdmVybGF5TmFtZShXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfQk9UVE9NX0xFRlRfQ09STkVSKSlyZXR1cm4gTWF0aC5taW4odGhpcy53b3QuZ2V0U2V0dGluZygiZml4ZWRDb2x1bW5zTGVmdCIpLHQpO3JldHVybiBlfSxnZXRSZW5kZXJlZFJvd3NDb3VudDpmdW5jdGlvbigpe3ZhciBlPXRoaXMud290Lnd0Vmlld3BvcnQucm93c1JlbmRlckNhbGN1bGF0b3IuY291bnQsdD10aGlzLndvdC5nZXRTZXR0aW5nKCJ0b3RhbFJvd3MiKTtyZXR1cm4gdGhpcy53b3QuaXNPdmVybGF5TmFtZShXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfREVCVUcpP2U9dDp0aGlzLndvdC5pc092ZXJsYXlOYW1lKFdhbGtvbnRhYmxlT3ZlcmxheS5DTE9ORV9UT1ApfHx0aGlzLndvdC5pc092ZXJsYXlOYW1lKFdhbGtvbnRhYmxlT3ZlcmxheS5DTE9ORV9UT1BfTEVGVF9DT1JORVIpP2U9TWF0aC5taW4odGhpcy53b3QuZ2V0U2V0dGluZygiZml4ZWRSb3dzVG9wIiksdCk6KHRoaXMud290LmlzT3ZlcmxheU5hbWUoV2Fsa29udGFibGVPdmVybGF5LkNMT05FX0JPVFRPTSl8fHRoaXMud290LmlzT3ZlcmxheU5hbWUoV2Fsa29udGFibGVPdmVybGF5LkNMT05FX0JPVFRPTV9MRUZUX0NPUk5FUikpJiYoZT1NYXRoLm1pbih0aGlzLndvdC5nZXRTZXR0aW5nKCJmaXhlZFJvd3NCb3R0b20iKSx0KSksZX0sZ2V0VmlzaWJsZVJvd3NDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndvdC53dFZpZXdwb3J0LnJvd3NWaXNpYmxlQ2FsY3VsYXRvci5jb3VudH0sYWxsUm93c0luVmlld3BvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53b3QuZ2V0U2V0dGluZygidG90YWxSb3dzIik9PXRoaXMuZ2V0VmlzaWJsZVJvd3NDb3VudCgpfSxnZXRSb3dIZWlnaHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy53b3Qud3RTZXR0aW5ncy5zZXR0aW5ncy5yb3dIZWlnaHQoZSksbj10aGlzLndvdC53dFZpZXdwb3J0Lm92ZXJzaXplZFJvd3NbZV07cmV0dXJuIHZvaWQgMCE9PW4mJih0PXZvaWQgMD09PXQ/bjpNYXRoLm1heCh0LG4pKSx0fSxnZXRDb2x1bW5IZWFkZXJIZWlnaHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy53b3Qud3RTZXR0aW5ncy5zZXR0aW5ncy5kZWZhdWx0Um93SGVpZ2h0LG49dGhpcy53b3Qud3RWaWV3cG9ydC5vdmVyc2l6ZWRDb2x1bW5IZWFkZXJzW2VdO3JldHVybiB2b2lkIDAhPT1uJiYodD10P01hdGgubWF4KHQsbik6biksdH0sZ2V0VmlzaWJsZUNvbHVtbnNDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndvdC53dFZpZXdwb3J0LmNvbHVtbnNWaXNpYmxlQ2FsY3VsYXRvci5jb3VudH0sYWxsQ29sdW1uc0luVmlld3BvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53b3QuZ2V0U2V0dGluZygidG90YWxDb2x1bW5zIik9PXRoaXMuZ2V0VmlzaWJsZUNvbHVtbnNDb3VudCgpfSxnZXRDb2x1bW5XaWR0aDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLndvdC53dFNldHRpbmdzLnNldHRpbmdzLmNvbHVtbldpZHRoO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q9dChlKToib2JqZWN0Ij09dHlwZW9mIHQmJih0PXRbZV0pLHR8fHRoaXMud290Lnd0U2V0dGluZ3Muc2V0dGluZ3MuZGVmYXVsdENvbHVtbldpZHRofSxnZXRTdHJldGNoZWRDb2x1bW5XaWR0aDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldENvbHVtbldpZHRoKGUpLG49bnVsbD09dD90aGlzLmluc3RhbmNlLnd0U2V0dGluZ3Muc2V0dGluZ3MuZGVmYXVsdENvbHVtbldpZHRoOnQsbz10aGlzLndvdC53dFZpZXdwb3J0LmNvbHVtbnNSZW5kZXJDYWxjdWxhdG9yO2lmKG8pe3ZhciByPW8uZ2V0U3RyZXRjaGVkQ29sdW1uV2lkdGgoZSxuKTtyJiYobj1yKX1yZXR1cm4gbn19LHt9KSx3aW5kb3cuV2Fsa29udGFibGVUYWJsZT1SfSx7ImNlbGwvY29vcmRzIjo1LCJjZWxsL3JhbmdlIjo2LCJmaWx0ZXIvY29sdW1uIjo5LCJmaWx0ZXIvcm93IjoxMCwiaGVscGVycy9kb20vZWxlbWVudCI6NDYsdGFibGVSZW5kZXJlcjoyMX1dLDIxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0KXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJUSCIpO3JldHVybiB0Lmluc2VydEJlZm9yZShuLGUpLHQucmVtb3ZlQ2hpbGQoZSksbn1mdW5jdGlvbiByKGUsdCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEQiKTtyZXR1cm4gdC5pbnNlcnRCZWZvcmUobixlKSx0LnJlbW92ZUNoaWxkKGUpLG59T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7V2Fsa29udGFibGVUYWJsZVJlbmRlcmVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcH19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBpLHM9KGk9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSksbD1zLmFkZENsYXNzLGE9cy5lbXB0eSx1PXMuZ2V0U2Nyb2xsYmFyV2lkdGgsYz1zLmhhc0NsYXNzLGg9cy5pbm5lckhlaWdodCxkPXMub3V0ZXJXaWR0aCxmPSExLHA9ZnVuY3Rpb24oZSl7dGhpcy53dFRhYmxlPWUsdGhpcy53b3Q9ZS5pbnN0YW5jZSx0aGlzLmluc3RhbmNlPWUuaW5zdGFuY2UsdGhpcy5yb3dGaWx0ZXI9ZS5yb3dGaWx0ZXIsdGhpcy5jb2x1bW5GaWx0ZXI9ZS5jb2x1bW5GaWx0ZXIsdGhpcy5UQUJMRT1lLlRBQkxFLHRoaXMuVEhFQUQ9ZS5USEVBRCx0aGlzLlRCT0RZPWUuVEJPRFksdGhpcy5DT0xHUk9VUD1lLkNPTEdST1VQLHRoaXMucm93SGVhZGVycz1bXSx0aGlzLnJvd0hlYWRlckNvdW50PTAsdGhpcy5jb2x1bW5IZWFkZXJzPVtdLHRoaXMuY29sdW1uSGVhZGVyQ291bnQ9MCx0aGlzLmZpeGVkUm93c1RvcD0wLHRoaXMuZml4ZWRSb3dzQm90dG9tPTB9OyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhwLHtyZW5kZXI6ZnVuY3Rpb24oKXt0aGlzLnd0VGFibGUuaXNXb3JraW5nT25DbG9uZSgpfHx0aGlzLndvdC5nZXRTZXR0aW5nKCJiZWZvcmVEcmF3IiwhMCksdGhpcy5yb3dIZWFkZXJzPXRoaXMud290LmdldFNldHRpbmcoInJvd0hlYWRlcnMiKSx0aGlzLnJvd0hlYWRlckNvdW50PXRoaXMucm93SGVhZGVycy5sZW5ndGgsdGhpcy5maXhlZFJvd3NUb3A9dGhpcy53b3QuZ2V0U2V0dGluZygiZml4ZWRSb3dzVG9wIiksdGhpcy5maXhlZFJvd3NCb3R0b209dGhpcy53b3QuZ2V0U2V0dGluZygiZml4ZWRSb3dzQm90dG9tIiksdGhpcy5jb2x1bW5IZWFkZXJzPXRoaXMud290LmdldFNldHRpbmcoImNvbHVtbkhlYWRlcnMiKSx0aGlzLmNvbHVtbkhlYWRlckNvdW50PXRoaXMuY29sdW1uSGVhZGVycy5sZW5ndGg7dmFyIGUsdD10aGlzLnd0VGFibGUuZ2V0UmVuZGVyZWRDb2x1bW5zQ291bnQoKSxuPXRoaXMud3RUYWJsZS5nZXRSZW5kZXJlZFJvd3NDb3VudCgpLG89dGhpcy53b3QuZ2V0U2V0dGluZygidG90YWxDb2x1bW5zIikscj10aGlzLndvdC5nZXRTZXR0aW5nKCJ0b3RhbFJvd3MiKSxpPSExO2lmKChXYWxrb250YWJsZU92ZXJsYXkuaXNPdmVybGF5VHlwZU9mKHRoaXMud290LmNsb25lT3ZlcmxheSxXYWxrb250YWJsZU92ZXJsYXkuQ0xPTkVfQk9UVE9NKXx8V2Fsa29udGFibGVPdmVybGF5LmlzT3ZlcmxheVR5cGVPZih0aGlzLndvdC5jbG9uZU92ZXJsYXksV2Fsa29udGFibGVPdmVybGF5LkNMT05FX0JPVFRPTV9MRUZUX0NPUk5FUikpJiYodGhpcy5jb2x1bW5IZWFkZXJzPVtdLHRoaXMuY29sdW1uSGVhZGVyQ291bnQ9MCksbz4wJiYodGhpcy5hZGp1c3RBdmFpbGFibGVOb2RlcygpLGk9ITAsdGhpcy5yZW5kZXJDb2x1bW5IZWFkZXJzKCksdGhpcy5yZW5kZXJSb3dzKHIsbix0KSx0aGlzLnd0VGFibGUuaXNXb3JraW5nT25DbG9uZSgpfHwoZT10aGlzLndvdC53dFZpZXdwb3J0LmdldFdvcmtzcGFjZVdpZHRoKCksdGhpcy53b3Qud3RWaWV3cG9ydC5jb250YWluZXJXaWR0aD1udWxsKSx0aGlzLmFkanVzdENvbHVtbldpZHRocyh0KSx0aGlzLm1hcmtPdmVyc2l6ZWRDb2x1bW5IZWFkZXJzKCksdGhpcy5hZGp1c3RDb2x1bW5IZWFkZXJIZWlnaHRzKCkpLGl8fHRoaXMuYWRqdXN0QXZhaWxhYmxlTm9kZXMoKSx0aGlzLnJlbW92ZVJlZHVuZGFudFJvd3MobiksdGhpcy53dFRhYmxlLmlzV29ya2luZ09uQ2xvbmUoKSYmIXRoaXMud290LmlzT3ZlcmxheU5hbWUoV2Fsa29udGFibGVPdmVybGF5LkNMT05FX0JPVFRPTSl8fHRoaXMubWFya092ZXJzaXplZFJvd3MoKSx0aGlzLnd0VGFibGUuaXNXb3JraW5nT25DbG9uZSgpKXRoaXMud290LmlzT3ZlcmxheU5hbWUoV2Fsa29udGFibGVPdmVybGF5LkNMT05FX0JPVFRPTSkmJnRoaXMud290LmNsb25lU291cmNlLnd0T3ZlcmxheXMuYWRqdXN0RWxlbWVudHNTaXplKCk7ZWxzZXt0aGlzLndvdC53dFZpZXdwb3J0LmNyZWF0ZVZpc2libGVDYWxjdWxhdG9ycygpLHRoaXMud290Lnd0T3ZlcmxheXMucmVmcmVzaCghMSk7dmFyIHM9ZCh0aGlzLnd0VGFibGUuaGlkZXIpLGw9ZCh0aGlzLnd0VGFibGUuVEFCTEUpO2lmKDAhPT1zJiZsIT09cyYmdGhpcy5hZGp1c3RDb2x1bW5XaWR0aHModCksdGhpcy53b3Qud3RPdmVybGF5cy5hcHBseVRvRE9NKCksZSE9PXRoaXMud290Lnd0Vmlld3BvcnQuZ2V0V29ya3NwYWNlV2lkdGgoKSl7dGhpcy53b3Qud3RWaWV3cG9ydC5jb250YWluZXJXaWR0aD1udWxsO3ZhciBhPXRoaXMud3RUYWJsZS5nZXRGaXJzdFJlbmRlcmVkQ29sdW1uKCksdT10aGlzLnd0VGFibGUuZ2V0TGFzdFJlbmRlcmVkQ29sdW1uKCksYz10aGlzLndvdC5nZXRTZXR0aW5nKCJyb3dIZWFkZXJXaWR0aCIpO2lmKG51bGwhPWMpZm9yKHZhciBoPTA7aDx0aGlzLnJvd0hlYWRlckNvdW50O2grKyl0aGlzLkNPTEdST1VQLmNoaWxkTm9kZXNbaF0uc3R5bGUud2lkdGg9KGlzTmFOKGMpP2NbaF06YykrInB4Ijtmb3IodmFyIGY9YTt1PmY7ZisrKXt2YXIgcD10aGlzLnd0VGFibGUuZ2V0U3RyZXRjaGVkQ29sdW1uV2lkdGgoZiksZz10aGlzLmNvbHVtbkZpbHRlci5zb3VyY2VUb1JlbmRlcmVkKGYpO3RoaXMuQ09MR1JPVVAuY2hpbGROb2Rlc1tnK3RoaXMucm93SGVhZGVyQ291bnRdLnN0eWxlLndpZHRoPXArInB4In19dGhpcy53b3QuZ2V0U2V0dGluZygib25EcmF3IiwhMCl9fSxyZW1vdmVSZWR1bmRhbnRSb3dzOmZ1bmN0aW9uKGUpe2Zvcig7dGhpcy53dFRhYmxlLnRib2R5Q2hpbGRyZW5MZW5ndGg+ZTspdGhpcy5UQk9EWS5yZW1vdmVDaGlsZCh0aGlzLlRCT0RZLmxhc3RDaGlsZCksdGhpcy53dFRhYmxlLnRib2R5Q2hpbGRyZW5MZW5ndGgtLX0scmVuZGVyUm93czpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciBvLHIsaT0wLHM9dGhpcy5yb3dGaWx0ZXIucmVuZGVyZWRUb1NvdXJjZShpKSxsPXRoaXMud3RUYWJsZS5pc1dvcmtpbmdPbkNsb25lKCk7ZT5zJiZzPj0wJiYoIWYmJmk+MWUzJiYoZj0hMCxjb25zb2xlLndhcm4oJ1BlcmZvcm1hbmNlIHRpcDogSGFuZHNvbnRhYmxlIHJlbmRlcmVkIG1vcmUgdGhhbiAxMDAwIHZpc2libGUgcm93cy4gQ29uc2lkZXIgbGltaXRpbmcgdGhlIG51bWJlciBvZiByZW5kZXJlZCByb3dzIGJ5IHNwZWNpZnlpbmcgdGhlIHRhYmxlIGhlaWdodCBhbmQvb3IgdHVybmluZyBvZmYgdGhlICJyZW5kZXJBbGxSb3dzIiBvcHRpb24uJykpLHZvaWQgMD09PXR8fGkhPT10KTspe2lmKHI9dGhpcy5nZXRPckNyZWF0ZVRyRm9yUm93KGksciksdGhpcy5yZW5kZXJSb3dIZWFkZXJzKHMsciksdGhpcy5hZGp1c3RDb2x1bW5zKHIsbit0aGlzLnJvd0hlYWRlckNvdW50KSxvPXRoaXMucmVuZGVyQ2VsbHMocyxyLG4pLGwmJiF0aGlzLndvdC5pc092ZXJsYXlOYW1lKFdhbGtvbnRhYmxlT3ZlcmxheS5DTE9ORV9CT1RUT00pfHx0aGlzLnJlc2V0T3ZlcnNpemVkUm93KHMpLHIuZmlyc3RDaGlsZCl7dmFyIGE9dGhpcy53b3Qud3RUYWJsZS5nZXRSb3dIZWlnaHQocyk7YT8oYS0tLHIuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQ9YSsicHgiKTpyLmZpcnN0Q2hpbGQuc3R5bGUuaGVpZ2h0PSIifWkrKyxzPXRoaXMucm93RmlsdGVyLnJlbmRlcmVkVG9Tb3VyY2UoaSl9fSxyZXNldE92ZXJzaXplZFJvdzpmdW5jdGlvbihlKXt0aGlzLndvdC5nZXRTZXR0aW5nKCJleHRlcm5hbFJvd0NhbGN1bGF0b3IiKXx8dGhpcy53b3Qud3RWaWV3cG9ydC5vdmVyc2l6ZWRSb3dzJiZ0aGlzLndvdC53dFZpZXdwb3J0Lm92ZXJzaXplZFJvd3NbZV0mJih0aGlzLndvdC53dFZpZXdwb3J0Lm92ZXJzaXplZFJvd3NbZV09dm9pZCAwKX0sbWFya092ZXJzaXplZFJvd3M6ZnVuY3Rpb24oKXtpZighdGhpcy53b3QuZ2V0U2V0dGluZygiZXh0ZXJuYWxSb3dDYWxjdWxhdG9yIikpe3ZhciBlLHQsbixvLHIsaT10aGlzLmluc3RhbmNlLnd0VGFibGUuVEJPRFkuY2hpbGROb2Rlcy5sZW5ndGgscz1pKnRoaXMuaW5zdGFuY2Uud3RTZXR0aW5ncy5zZXR0aW5ncy5kZWZhdWx0Um93SGVpZ2h0LGw9aCh0aGlzLmluc3RhbmNlLnd0VGFibGUuVEJPRFkpLTE7dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5nKCJ0b3RhbFJvd3MiKTtpZihzIT09bHx8dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5nKCJmaXhlZFJvd3NCb3R0b20iKSlmb3IoO2k7KWktLSxuPXRoaXMuaW5zdGFuY2Uud3RUYWJsZS5yb3dGaWx0ZXIucmVuZGVyZWRUb1NvdXJjZShpKSxlPXRoaXMuaW5zdGFuY2Uud3RUYWJsZS5nZXRSb3dIZWlnaHQobiksbz10aGlzLmluc3RhbmNlLnd0VGFibGUuZ2V0VHJGb3JSb3cobikscj1vLnF1ZXJ5U2VsZWN0b3IoInRoIiksdD1yP2gocik6aChvKS0xLCghZSYmdGhpcy5pbnN0YW5jZS53dFNldHRpbmdzLnNldHRpbmdzLmRlZmF1bHRSb3dIZWlnaHQ8dHx8dD5lKSYmKHRoaXMuaW5zdGFuY2Uud3RWaWV3cG9ydC5vdmVyc2l6ZWRSb3dzW25dPSsrdCl9fSxtYXJrT3ZlcnNpemVkQ29sdW1uSGVhZGVyczpmdW5jdGlvbigpe3ZhciBlPXRoaXMud290LmdldE92ZXJsYXlOYW1lKCk7aWYodGhpcy5jb2x1bW5IZWFkZXJDb3VudCYmIXRoaXMud290Lnd0Vmlld3BvcnQuaGFzT3ZlcnNpemVkQ29sdW1uSGVhZGVyc01hcmtlZFtlXSYmIXRoaXMud3RUYWJsZS5pc1dvcmtpbmdPbkNsb25lKCkpe2Zvcih2YXIgdD10aGlzLnd0VGFibGUuZ2V0UmVuZGVyZWRDb2x1bW5zQ291bnQoKSxuPTA7bjx0aGlzLmNvbHVtbkhlYWRlckNvdW50O24rKylmb3IodmFyIG89LTEqdGhpcy5yb3dIZWFkZXJDb3VudDt0Pm87bysrKXRoaXMubWFya0lmT3ZlcnNpemVkQ29sdW1uSGVhZGVyKG8pO3RoaXMud290Lnd0Vmlld3BvcnQuaGFzT3ZlcnNpemVkQ29sdW1uSGVhZGVyc01hcmtlZFtlXT0hMH19LGFkanVzdENvbHVtbkhlYWRlckhlaWdodHM6ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy53b3QuZ2V0U2V0dGluZygiY29sdW1uSGVhZGVycyIpLHQ9dGhpcy53b3Qud3RUYWJsZS5USEVBRC5jaGlsZE5vZGVzLG49dGhpcy53b3Qud3RWaWV3cG9ydC5vdmVyc2l6ZWRDb2x1bW5IZWFkZXJzLG89MCxyPWUubGVuZ3RoO3I+bztvKyspaWYobltvXSl7aWYoMD09PXRbb10uY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuO3Rbb10uY2hpbGROb2Rlc1swXS5zdHlsZS5oZWlnaHQ9bltvXSsicHgifX0sbWFya0lmT3ZlcnNpemVkQ29sdW1uSGVhZGVyOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLG8scj10aGlzLndvdC53dFRhYmxlLmNvbHVtbkZpbHRlci5yZW5kZXJlZFRvU291cmNlKGUpLGk9dGhpcy5jb2x1bW5IZWFkZXJDb3VudCxzPXRoaXMud290Lnd0U2V0dGluZ3Muc2V0dGluZ3MuZGVmYXVsdFJvd0hlaWdodCxsPXRoaXMud290LmdldFNldHRpbmcoImNvbHVtbkhlYWRlckhlaWdodCIpfHxbXTtpOylpLS0sdD10aGlzLndvdC53dFRhYmxlLmdldENvbHVtbkhlYWRlckhlaWdodChpKSxuPXRoaXMud290Lnd0VGFibGUuZ2V0Q29sdW1uSGVhZGVyKHIsaSksbiYmKG89aChuKSwoIXQmJm8+c3x8bz50KSYmKHRoaXMud290Lnd0Vmlld3BvcnQub3ZlcnNpemVkQ29sdW1uSGVhZGVyc1tpXT1vKSxBcnJheS5pc0FycmF5KGwpP251bGwhPWxbaV0mJih0aGlzLndvdC53dFZpZXdwb3J0Lm92ZXJzaXplZENvbHVtbkhlYWRlcnNbaV09bFtpXSk6aXNOYU4obCl8fCh0aGlzLndvdC53dFZpZXdwb3J0Lm92ZXJzaXplZENvbHVtbkhlYWRlcnNbaV09bCksdGhpcy53b3Qud3RWaWV3cG9ydC5vdmVyc2l6ZWRDb2x1bW5IZWFkZXJzW2ldPChsW2ldfHxsKSYmKHRoaXMud290Lnd0Vmlld3BvcnQub3ZlcnNpemVkQ29sdW1uSGVhZGVyc1tpXT1sW2ldfHxsKSl9LHJlbmRlckNlbGxzOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIG8saSxzPTA7bj5zO3MrKylpPXRoaXMuY29sdW1uRmlsdGVyLnJlbmRlcmVkVG9Tb3VyY2Uocyksbz0wPT09cz90LmNoaWxkTm9kZXNbdGhpcy5jb2x1bW5GaWx0ZXIuc291cmNlQ29sdW1uVG9WaXNpYmxlUm93SGVhZGVkQ29sdW1uKGkpXTpvLm5leHRTaWJsaW5nLCJUSCI9PW8ubm9kZU5hbWUmJihvPXIobyx0KSksYyhvLCJoaWRlIil8fChvLmNsYXNzTmFtZT0iIiksby5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIiksdGhpcy53b3Qud3RTZXR0aW5ncy5zZXR0aW5ncy5jZWxsUmVuZGVyZXIoZSxpLG8pO3JldHVybiBvfSxhZGp1c3RDb2x1bW5XaWR0aHM6ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPXRoaXMud290LmNsb25lU291cmNlP3RoaXMud290LmNsb25lU291cmNlOnRoaXMud290LG89bi53dFRhYmxlLmhvbGRlcjtvLm9mZnNldEhlaWdodDxvLnNjcm9sbEhlaWdodCYmKHQ9dSgpKSx0aGlzLndvdC53dFZpZXdwb3J0LmNvbHVtbnNSZW5kZXJDYWxjdWxhdG9yLnJlZnJlc2hTdHJldGNoaW5nKHRoaXMud290Lnd0Vmlld3BvcnQuZ2V0Vmlld3BvcnRXaWR0aCgpLXQpO3ZhciByPXRoaXMud290LmdldFNldHRpbmcoInJvd0hlYWRlcldpZHRoIik7aWYobnVsbCE9cilmb3IodmFyIGk9MDtpPHRoaXMucm93SGVhZGVyQ291bnQ7aSsrKXRoaXMuQ09MR1JPVVAuY2hpbGROb2Rlc1tpXS5zdHlsZS53aWR0aD0oaXNOYU4ocik/cltpXTpyKSsicHgiO2Zvcih2YXIgcz0wO2U+cztzKyspe3ZhciBsPXRoaXMud3RUYWJsZS5nZXRTdHJldGNoZWRDb2x1bW5XaWR0aCh0aGlzLmNvbHVtbkZpbHRlci5yZW5kZXJlZFRvU291cmNlKHMpKTt0aGlzLkNPTEdST1VQLmNoaWxkTm9kZXNbcyt0aGlzLnJvd0hlYWRlckNvdW50XS5zdHlsZS53aWR0aD1sKyJweCJ9fSxhcHBlbmRUb1Rib2R5OmZ1bmN0aW9uKGUpe3RoaXMuVEJPRFkuYXBwZW5kQ2hpbGQoZSksdGhpcy53dFRhYmxlLnRib2R5Q2hpbGRyZW5MZW5ndGgrK30sZ2V0T3JDcmVhdGVUckZvclJvdzpmdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBlPj10aGlzLnd0VGFibGUudGJvZHlDaGlsZHJlbkxlbmd0aD8obj10aGlzLmNyZWF0ZVJvdygpLHRoaXMuYXBwZW5kVG9UYm9keShuKSk6bj0wPT09ZT90aGlzLlRCT0RZLmZpcnN0Q2hpbGQ6dC5uZXh0U2libGluZyxuLmNsYXNzTmFtZSYmbi5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIiksbn0sY3JlYXRlUm93OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRSIiksdD0wO3Q8dGhpcy5yb3dIZWFkZXJDb3VudDt0KyspZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJUSCIpKTtyZXR1cm4gZX0scmVuZGVyUm93SGVhZGVyOmZ1bmN0aW9uKGUsdCxuKXtuLmNsYXNzTmFtZT0iIixuLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKSx0aGlzLnJvd0hlYWRlcnNbdF0oZSxuLHQpfSxyZW5kZXJSb3dIZWFkZXJzOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQuZmlyc3RDaGlsZCxyPTA7cjx0aGlzLnJvd0hlYWRlckNvdW50O3IrKyluPyJURCI9PW4ubm9kZU5hbWUmJihuPW8obix0KSk6KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEgiKSx0LmFwcGVuZENoaWxkKG4pKSx0aGlzLnJlbmRlclJvd0hlYWRlcihlLHIsbiksbj1uLm5leHRTaWJsaW5nfSxhZGp1c3RBdmFpbGFibGVOb2RlczpmdW5jdGlvbigpe3RoaXMuYWRqdXN0Q29sR3JvdXBzKCksdGhpcy5hZGp1c3RUaGVhZCgpfSxyZW5kZXJDb2x1bW5IZWFkZXJzOmZ1bmN0aW9uKCl7dGhpcy53b3QuZ2V0T3ZlcmxheU5hbWUoKTtpZih0aGlzLmNvbHVtbkhlYWRlckNvdW50KWZvcih2YXIgZT10aGlzLnd0VGFibGUuZ2V0UmVuZGVyZWRDb2x1bW5zQ291bnQoKSx0PTA7dDx0aGlzLmNvbHVtbkhlYWRlckNvdW50O3QrKylmb3IodmFyIG49dGhpcy5nZXRUckZvckNvbHVtbkhlYWRlcnModCksbz0tMSp0aGlzLnJvd0hlYWRlckNvdW50O2U+bztvKyspe3ZhciByPXRoaXMuY29sdW1uRmlsdGVyLnJlbmRlcmVkVG9Tb3VyY2Uobyk7dGhpcy5yZW5kZXJDb2x1bW5IZWFkZXIodCxyLG4uY2hpbGROb2Rlc1tvK3RoaXMucm93SGVhZGVyQ291bnRdKX19LGFkanVzdENvbEdyb3VwczpmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLnd0VGFibGUuZ2V0UmVuZGVyZWRDb2x1bW5zQ291bnQoKTt0aGlzLnd0VGFibGUuY29sZ3JvdXBDaGlsZHJlbkxlbmd0aDxlK3RoaXMucm93SGVhZGVyQ291bnQ7KXRoaXMuQ09MR1JPVVAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQ09MIikpLHRoaXMud3RUYWJsZS5jb2xncm91cENoaWxkcmVuTGVuZ3RoKys7Zm9yKDt0aGlzLnd0VGFibGUuY29sZ3JvdXBDaGlsZHJlbkxlbmd0aD5lK3RoaXMucm93SGVhZGVyQ291bnQ7KXRoaXMuQ09MR1JPVVAucmVtb3ZlQ2hpbGQodGhpcy5DT0xHUk9VUC5sYXN0Q2hpbGQpLHRoaXMud3RUYWJsZS5jb2xncm91cENoaWxkcmVuTGVuZ3RoLS07dGhpcy5yb3dIZWFkZXJDb3VudCYmbCh0aGlzLkNPTEdST1VQLmNoaWxkTm9kZXNbMF0sInJvd0hlYWRlciIpfSxhZGp1c3RUaGVhZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMud3RUYWJsZS5nZXRSZW5kZXJlZENvbHVtbnNDb3VudCgpLHQ9dGhpcy5USEVBRC5maXJzdENoaWxkO2lmKHRoaXMuY29sdW1uSGVhZGVycy5sZW5ndGgpe2Zvcih2YXIgbj0wLG89dGhpcy5jb2x1bW5IZWFkZXJzLmxlbmd0aDtvPm47bisrKXtmb3IodD10aGlzLlRIRUFELmNoaWxkTm9kZXNbbl0sdHx8KHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVFIiKSx0aGlzLlRIRUFELmFwcGVuZENoaWxkKHQpKSx0aGlzLnRoZWFkQ2hpbGRyZW5MZW5ndGg9dC5jaGlsZE5vZGVzLmxlbmd0aDt0aGlzLnRoZWFkQ2hpbGRyZW5MZW5ndGg8ZSt0aGlzLnJvd0hlYWRlckNvdW50Oyl0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRIIikpLHRoaXMudGhlYWRDaGlsZHJlbkxlbmd0aCsrO2Zvcig7dGhpcy50aGVhZENoaWxkcmVuTGVuZ3RoPmUrdGhpcy5yb3dIZWFkZXJDb3VudDspdC5yZW1vdmVDaGlsZCh0Lmxhc3RDaGlsZCksdGhpcy50aGVhZENoaWxkcmVuTGVuZ3RoLS19dmFyIHI9dGhpcy5USEVBRC5jaGlsZE5vZGVzLmxlbmd0aDtpZihyPnRoaXMuY29sdW1uSGVhZGVycy5sZW5ndGgpZm9yKHZhciBpPXRoaXMuY29sdW1uSGVhZGVycy5sZW5ndGg7cj5pO2krKyl0aGlzLlRIRUFELnJlbW92ZUNoaWxkKHRoaXMuVEhFQUQubGFzdENoaWxkKX1lbHNlIHQmJmEodCl9LGdldFRyRm9yQ29sdW1uSGVhZGVyczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5USEVBRC5jaGlsZE5vZGVzW2VdfSxyZW5kZXJDb2x1bW5IZWFkZXI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuLmNsYXNzTmFtZT0iIixuLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKSx0aGlzLmNvbHVtbkhlYWRlcnNbZV0odCxuLGUpfSxhZGp1c3RDb2x1bW5zOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUuY2hpbGROb2Rlcy5sZW5ndGg7dD5uOyl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEQiKTtlLmFwcGVuZENoaWxkKG8pLG4rK31mb3IoO24+dDspZS5yZW1vdmVDaGlsZChlLmxhc3RDaGlsZCksbi0tfSxyZW1vdmVSZWR1bmRhbnRDb2x1bW5zOmZ1bmN0aW9uKGUpe2Zvcig7dGhpcy53dFRhYmxlLnRib2R5Q2hpbGRyZW5MZW5ndGg+ZTspdGhpcy5UQk9EWS5yZW1vdmVDaGlsZCh0aGlzLlRCT0RZLmxhc3RDaGlsZCksdGhpcy53dFRhYmxlLnRib2R5Q2hpbGRyZW5MZW5ndGgtLX19LHt9KSx3aW5kb3cuV2Fsa29udGFibGVUYWJsZVJlbmRlcmVyPXB9LHsiaGVscGVycy9kb20vZWxlbWVudCI6NDZ9XSwyMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtXYWxrb250YWJsZVZpZXdwb3J0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdn19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGwsYT0obz1lKCJicm93c2VyIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLHU9KHI9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSksYz11LmdldFNjcm9sbGJhcldpZHRoLGg9KHUuZ2V0U2Nyb2xsVG9wLHUuZ2V0U3R5bGUpLGQ9dS5vZmZzZXQsZj11Lm91dGVySGVpZ2h0LHA9dS5vdXRlcldpZHRoLGc9KGk9ZSgiZXZlbnRNYW5hZ2VyIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5FdmVudE1hbmFnZXIsbT0ocz1lKCJjYWxjdWxhdG9yL3ZpZXdwb3J0Q29sdW1ucyIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuV2Fsa29udGFibGVWaWV3cG9ydENvbHVtbnNDYWxjdWxhdG9yLHc9KGw9ZSgiY2FsY3VsYXRvci92aWV3cG9ydFJvd3MiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLldhbGtvbnRhYmxlVmlld3BvcnRSb3dzQ2FsY3VsYXRvcix2PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy53b3Q9ZSx0aGlzLmluc3RhbmNlPXRoaXMud290LHRoaXMub3ZlcnNpemVkUm93cz1bXSx0aGlzLm92ZXJzaXplZENvbHVtbkhlYWRlcnM9W10sdGhpcy5oYXNPdmVyc2l6ZWRDb2x1bW5IZWFkZXJzTWFya2VkPXt9LHRoaXMuY2xpZW50SGVpZ2h0PTAsdGhpcy5jb250YWluZXJXaWR0aD1OYU4sdGhpcy5yb3dIZWFkZXJXaWR0aD1OYU4sdGhpcy5yb3dzVmlzaWJsZUNhbGN1bGF0b3I9bnVsbCx0aGlzLmNvbHVtbnNWaXNpYmxlQ2FsY3VsYXRvcj1udWxsLHRoaXMuZXZlbnRNYW5hZ2VyPW5ldyBnKHRoaXMud290KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHdpbmRvdywicmVzaXplIixmdW5jdGlvbigpe3QuY2xpZW50SGVpZ2h0PXQuZ2V0V29ya3NwYWNlSGVpZ2h0KCl9KX07JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKHYse2dldFdvcmtzcGFjZUhlaWdodDpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5pbnN0YW5jZS53dE92ZXJsYXlzLnRvcE92ZXJsYXkudHJpbW1pbmdDb250YWluZXIsbj0wO3JldHVybiB0PT09d2luZG93P249ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDooZT1mKHQpLG49ZT4wJiZ0LmNsaWVudEhlaWdodD4wP3QuY2xpZW50SGVpZ2h0OjEvMCksbn0sZ2V0V29ya3NwYWNlV2lkdGg6ZnVuY3Rpb24oKXt2YXIgZSx0LG49dGhpcy53b3QuZ2V0U2V0dGluZygidG90YWxDb2x1bW5zIiksbz10aGlzLmluc3RhbmNlLnd0T3ZlcmxheXMubGVmdE92ZXJsYXkudHJpbW1pbmdDb250YWluZXIscj10aGlzLndvdC5nZXRTZXR0aW5nKCJzdHJldGNoSCIpLGk9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoLHM9dGhpcy53b3QuZ2V0U2V0dGluZygicHJldmVudE92ZXJmbG93Iik7cmV0dXJuIHM/cCh0aGlzLmluc3RhbmNlLnd0VGFibGUud3RSb290RWxlbWVudCk6KGU9YS5mcmVlemVPdmVybGF5cz9NYXRoLm1pbihpLXRoaXMuZ2V0V29ya3NwYWNlT2Zmc2V0KCkubGVmdCxpKTpNYXRoLm1pbih0aGlzLmdldENvbnRhaW5lckZpbGxXaWR0aCgpLGktdGhpcy5nZXRXb3Jrc3BhY2VPZmZzZXQoKS5sZWZ0LGkpLG89PT13aW5kb3cmJm4+MCYmdGhpcy5zdW1Db2x1bW5XaWR0aHMoMCxuLTEpPmU/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOm8hPT13aW5kb3cmJih0PWgodGhpcy5pbnN0YW5jZS53dE92ZXJsYXlzLmxlZnRPdmVybGF5LnRyaW1taW5nQ29udGFpbmVyLCJvdmVyZmxvdyIpLCJzY3JvbGwiPT10fHwiaGlkZGVuIj09dHx8ImF1dG8iPT10KT9NYXRoLm1heChlLG8uY2xpZW50V2lkdGgpOiJub25lIiE9PXImJnI/ZTpNYXRoLm1heChlLHAodGhpcy5pbnN0YW5jZS53dFRhYmxlLlRBQkxFKSkpfSxoYXNWZXJ0aWNhbFNjcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFdvcmtzcGFjZUFjdHVhbEhlaWdodCgpPnRoaXMuZ2V0V29ya3NwYWNlSGVpZ2h0KCl9LGhhc0hvcml6b250YWxTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRXb3Jrc3BhY2VBY3R1YWxXaWR0aCgpPnRoaXMuZ2V0V29ya3NwYWNlV2lkdGgoKX0sc3VtQ29sdW1uV2lkdGhzOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7dD5lOyluKz10aGlzLndvdC53dFRhYmxlLmdldENvbHVtbldpZHRoKGUpLGUrKztyZXR1cm4gbn0sZ2V0Q29udGFpbmVyRmlsbFdpZHRoOmZ1bmN0aW9uKCl7aWYodGhpcy5jb250YWluZXJXaWR0aClyZXR1cm4gdGhpcy5jb250YWluZXJXaWR0aDt2YXIgZSx0LG49dGhpcy5pbnN0YW5jZS53dFRhYmxlLmhvbGRlcjtyZXR1cm4gdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LnN0eWxlLndpZHRoPSIxMDAlIix0LnN0eWxlLmhlaWdodD0iMXB4IixuLmFwcGVuZENoaWxkKHQpLGU9dC5vZmZzZXRXaWR0aCx0aGlzLmNvbnRhaW5lcldpZHRoPWUsbi5yZW1vdmVDaGlsZCh0KSxlfSxnZXRXb3Jrc3BhY2VPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZCh0aGlzLndvdC53dFRhYmxlLlRBQkxFKX0sZ2V0V29ya3NwYWNlQWN0dWFsSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcy53b3Qud3RUYWJsZS5UQUJMRSl9LGdldFdvcmtzcGFjZUFjdHVhbFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHAodGhpcy53b3Qud3RUYWJsZS5UQUJMRSl8fHAodGhpcy53b3Qud3RUYWJsZS5UQk9EWSl8fHAodGhpcy53b3Qud3RUYWJsZS5USEVBRCl9LGdldENvbHVtbkhlYWRlckhlaWdodDpmdW5jdGlvbigpe3JldHVybiBpc05hTih0aGlzLmNvbHVtbkhlYWRlckhlaWdodCkmJih0aGlzLmNvbHVtbkhlYWRlckhlaWdodD1mKHRoaXMud290Lnd0VGFibGUuVEhFQUQpKSx0aGlzLmNvbHVtbkhlYWRlckhlaWdodH0sZ2V0Vmlld3BvcnRIZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMuZ2V0V29ya3NwYWNlSGVpZ2h0KCk7cmV0dXJuIHQ9PT0xLzA/dDooZT10aGlzLmdldENvbHVtbkhlYWRlckhlaWdodCgpLGU+MCYmKHQtPWUpLHQpfSxnZXRSb3dIZWFkZXJXaWR0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaW5zdGFuY2UuZ2V0U2V0dGluZygicm93SGVhZGVyV2lkdGgiKSx0PXRoaXMuaW5zdGFuY2UuZ2V0U2V0dGluZygicm93SGVhZGVycyIpO2lmKGUpe3RoaXMucm93SGVhZGVyV2lkdGg9MDtmb3IodmFyIG49MCxvPXQubGVuZ3RoO28+bjtuKyspdGhpcy5yb3dIZWFkZXJXaWR0aCs9ZVtuXXx8ZX1pZih0aGlzLndvdC5jbG9uZVNvdXJjZSlyZXR1cm4gdGhpcy53b3QuY2xvbmVTb3VyY2Uud3RWaWV3cG9ydC5nZXRSb3dIZWFkZXJXaWR0aCgpO2lmKGlzTmFOKHRoaXMucm93SGVhZGVyV2lkdGgpKWlmKHQubGVuZ3RoKXt2YXIgcj10aGlzLmluc3RhbmNlLnd0VGFibGUuVEFCTEUucXVlcnlTZWxlY3RvcigiVEgiKTt0aGlzLnJvd0hlYWRlcldpZHRoPTA7Zm9yKHZhciBpPTAscz10Lmxlbmd0aDtzPmk7aSsrKXI/KHRoaXMucm93SGVhZGVyV2lkdGgrPXAocikscj1yLm5leHRTaWJsaW5nKTp0aGlzLnJvd0hlYWRlcldpZHRoKz01MH1lbHNlIHRoaXMucm93SGVhZGVyV2lkdGg9MDtyZXR1cm4gdGhpcy5yb3dIZWFkZXJXaWR0aH0sZ2V0Vmlld3BvcnRXaWR0aDpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5nZXRXb3Jrc3BhY2VXaWR0aCgpO3JldHVybiB0PT09MS8wP3Q6KGU9dGhpcy5nZXRSb3dIZWFkZXJXaWR0aCgpLGU+MD90LWU6dCl9LGNyZWF0ZVJvd3NDYWxjdWxhdG9yOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLG8scixpLHMsbD12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiExLGE9dGhpcztyZXR1cm4gdGhpcy5yb3dIZWFkZXJXaWR0aD1OYU4sZT10aGlzLndvdC53dFNldHRpbmdzLnNldHRpbmdzLnJlbmRlckFsbFJvd3M/MS8wOnRoaXMuZ2V0Vmlld3BvcnRIZWlnaHQoKSx0PXRoaXMud290Lnd0T3ZlcmxheXMudG9wT3ZlcmxheS5nZXRTY3JvbGxQb3NpdGlvbigpLXRoaXMud290Lnd0T3ZlcmxheXMudG9wT3ZlcmxheS5nZXRUYWJsZVBhcmVudE9mZnNldCgpLDA+dCYmKHQ9MCksbj10aGlzLndvdC5nZXRTZXR0aW5nKCJmaXhlZFJvd3NUb3AiKSxyPXRoaXMud290LmdldFNldHRpbmcoImZpeGVkUm93c0JvdHRvbSIpLHM9dGhpcy53b3QuZ2V0U2V0dGluZygidG90YWxSb3dzIiksbiYmKGk9dGhpcy53b3Qud3RPdmVybGF5cy50b3BPdmVybGF5LnN1bUNlbGxTaXplcygwLG4pLHQrPWksZS09aSksciYmdGhpcy53b3Qud3RPdmVybGF5cy5ib3R0b21PdmVybGF5LmNsb25lJiYoaT10aGlzLndvdC53dE92ZXJsYXlzLmJvdHRvbU92ZXJsYXkuc3VtQ2VsbFNpemVzKHMtcixzKSxlLT1pKSxvPXRoaXMud290Lnd0VGFibGUuaG9sZGVyLmNsaWVudEhlaWdodD09PXRoaXMud290Lnd0VGFibGUuaG9sZGVyLm9mZnNldEhlaWdodD8wOmMoKSxuZXcgdyhlLHQsdGhpcy53b3QuZ2V0U2V0dGluZygidG90YWxSb3dzIiksZnVuY3Rpb24oZSl7cmV0dXJuIGEud290Lnd0VGFibGUuZ2V0Um93SGVpZ2h0KGUpfSxsP251bGw6dGhpcy53b3Qud3RTZXR0aW5ncy5zZXR0aW5ncy52aWV3cG9ydFJvd0NhbGN1bGF0b3JPdmVycmlkZSxsLG8pfSxjcmVhdGVDb2x1bW5zQ2FsY3VsYXRvcjpmdW5jdGlvbigpe3ZhciBlLHQsbj12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiExLG89dGhpcyxyPXRoaXMuZ2V0Vmlld3BvcnRXaWR0aCgpO2lmKHRoaXMuY29sdW1uSGVhZGVySGVpZ2h0PU5hTixlPXRoaXMud290Lnd0T3ZlcmxheXMubGVmdE92ZXJsYXkuZ2V0U2Nyb2xsUG9zaXRpb24oKS10aGlzLndvdC53dE92ZXJsYXlzLmxlZnRPdmVybGF5LmdldFRhYmxlUGFyZW50T2Zmc2V0KCksMD5lJiYoZT0wKSx0PXRoaXMud290LmdldFNldHRpbmcoImZpeGVkQ29sdW1uc0xlZnQiKSl7dmFyIGk9dGhpcy53b3Qud3RPdmVybGF5cy5sZWZ0T3ZlcmxheS5zdW1DZWxsU2l6ZXMoMCx0KTtlKz1pLHItPWl9cmV0dXJuIHRoaXMud290Lnd0VGFibGUuaG9sZGVyLmNsaWVudFdpZHRoIT09dGhpcy53b3Qud3RUYWJsZS5ob2xkZXIub2Zmc2V0V2lkdGgmJihyLT1jKCkpLG5ldyBtKHIsZSx0aGlzLndvdC5nZXRTZXR0aW5nKCJ0b3RhbENvbHVtbnMiKSxmdW5jdGlvbihlKXtyZXR1cm4gby53b3Qud3RUYWJsZS5nZXRDb2x1bW5XaWR0aChlKX0sbj9udWxsOnRoaXMud290Lnd0U2V0dGluZ3Muc2V0dGluZ3Mudmlld3BvcnRDb2x1bW5DYWxjdWxhdG9yT3ZlcnJpZGUsbix0aGlzLndvdC5nZXRTZXR0aW5nKCJzdHJldGNoSCIpLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG8ud290LmdldFNldHRpbmcoIm9uQmVmb3JlU3RyZXRjaGluZ0NvbHVtbldpZHRoIixlLHQpfSl9LGNyZWF0ZVJlbmRlckNhbGN1bGF0b3JzOmZ1bmN0aW9uKCl7dmFyIGU9dm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTohMTtpZihlKXt2YXIgdD10aGlzLmNyZWF0ZVJvd3NDYWxjdWxhdG9yKCEwKSxuPXRoaXMuY3JlYXRlQ29sdW1uc0NhbGN1bGF0b3IoITApO3RoaXMuYXJlQWxsUHJvcG9zZWRWaXNpYmxlUm93c0FscmVhZHlSZW5kZXJlZCh0KSYmdGhpcy5hcmVBbGxQcm9wb3NlZFZpc2libGVDb2x1bW5zQWxyZWFkeVJlbmRlcmVkKG4pfHwoZT0hMSl9cmV0dXJuIGV8fCh0aGlzLnJvd3NSZW5kZXJDYWxjdWxhdG9yPXRoaXMuY3JlYXRlUm93c0NhbGN1bGF0b3IoKSx0aGlzLmNvbHVtbnNSZW5kZXJDYWxjdWxhdG9yPXRoaXMuY3JlYXRlQ29sdW1uc0NhbGN1bGF0b3IoKSksdGhpcy5yb3dzVmlzaWJsZUNhbGN1bGF0b3I9bnVsbCx0aGlzLmNvbHVtbnNWaXNpYmxlQ2FsY3VsYXRvcj1udWxsLGV9LGNyZWF0ZVZpc2libGVDYWxjdWxhdG9yczpmdW5jdGlvbigpe3RoaXMucm93c1Zpc2libGVDYWxjdWxhdG9yPXRoaXMuY3JlYXRlUm93c0NhbGN1bGF0b3IoITApLHRoaXMuY29sdW1uc1Zpc2libGVDYWxjdWxhdG9yPXRoaXMuY3JlYXRlQ29sdW1uc0NhbGN1bGF0b3IoITApfSxhcmVBbGxQcm9wb3NlZFZpc2libGVSb3dzQWxyZWFkeVJlbmRlcmVkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJvd3NWaXNpYmxlQ2FsY3VsYXRvcj9lLnN0YXJ0Um93PHRoaXMucm93c1JlbmRlckNhbGN1bGF0b3Iuc3RhcnRSb3d8fGUuc3RhcnRSb3c9PT10aGlzLnJvd3NSZW5kZXJDYWxjdWxhdG9yLnN0YXJ0Um93JiZlLnN0YXJ0Um93PjA/ITE6IShlLmVuZFJvdz50aGlzLnJvd3NSZW5kZXJDYWxjdWxhdG9yLmVuZFJvd3x8ZS5lbmRSb3c9PT10aGlzLnJvd3NSZW5kZXJDYWxjdWxhdG9yLmVuZFJvdyYmZS5lbmRSb3c8dGhpcy53b3QuZ2V0U2V0dGluZygidG90YWxSb3dzIiktMSk6ITF9LGFyZUFsbFByb3Bvc2VkVmlzaWJsZUNvbHVtbnNBbHJlYWR5UmVuZGVyZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29sdW1uc1Zpc2libGVDYWxjdWxhdG9yP2Uuc3RhcnRDb2x1bW48dGhpcy5jb2x1bW5zUmVuZGVyQ2FsY3VsYXRvci5zdGFydENvbHVtbnx8ZS5zdGFydENvbHVtbj09PXRoaXMuY29sdW1uc1JlbmRlckNhbGN1bGF0b3Iuc3RhcnRDb2x1bW4mJmUuc3RhcnRDb2x1bW4+MD8hMTohKGUuZW5kQ29sdW1uPnRoaXMuY29sdW1uc1JlbmRlckNhbGN1bGF0b3IuZW5kQ29sdW1ufHxlLmVuZENvbHVtbj09PXRoaXMuY29sdW1uc1JlbmRlckNhbGN1bGF0b3IuZW5kQ29sdW1uJiZlLmVuZENvbHVtbjx0aGlzLndvdC5nZXRTZXR0aW5nKCJ0b3RhbENvbHVtbnMiKS0xKTohMX19LHt9KSx3aW5kb3cuV2Fsa29udGFibGVWaWV3cG9ydD12fSx7YnJvd3NlcjoyMywiY2FsY3VsYXRvci92aWV3cG9ydENvbHVtbnMiOjMsImNhbGN1bGF0b3Ivdmlld3BvcnRSb3dzIjo0LGV2ZW50TWFuYWdlcjo0MSwiaGVscGVycy9kb20vZWxlbWVudCI6NDZ9XSwyMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7dmFyIG49bmV3IG8uQ29yZShlLHR8fHt9KTtyZXR1cm4gbi5pbml0KCksbn12YXIgcixpLHMsbCxhLHUsYyxoLGQsZixwLGcsbSx3LHYseSxiLEMsXyxSLFMsRTt0LmV4cG9ydHM9byxvLnV0aWxzPXt9LHI9ZSgic2hpbXMvcnVudGltZSIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSxpPWUoImVzNmNvbGxlY3Rpb25zIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9O3ZhciBUPShzPWUoInBsdWdpbkhvb2tzIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5Ib29rcztvLmhvb2tzfHwoby5ob29rcz1uZXcgVCksby51dGlscy5Ib29rcz1ULGw9ZSgiY29yZSIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSxhPWUoInJlbmRlcmVycy9fY2VsbERlY29yYXRvciIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSx1PWUoImNlbGxUeXBlcyIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSxjPWUoInBsdWdpbnMvanF1ZXJ5SGFuZHNvbnRhYmxlIiksYyYmYy5fX2VzTW9kdWxlJiZjfHx7ImRlZmF1bHQiOmN9O3ZhciBNPShoPWUoImhlbHBlcnMvYXJyYXkiKSxoJiZoLl9fZXNNb2R1bGUmJmh8fHsiZGVmYXVsdCI6aH0pLE89KGQ9ZSgiaGVscGVycy9icm93c2VyIiksZCYmZC5fX2VzTW9kdWxlJiZkfHx7ImRlZmF1bHQiOmR9KSxrPShmPWUoImhlbHBlcnMvZGF0YSIpLGYmJmYuX19lc01vZHVsZSYmZnx8eyJkZWZhdWx0IjpmfSksSD0ocD1lKCJoZWxwZXJzL2RhdGUiKSxwJiZwLl9fZXNNb2R1bGUmJnB8fHsiZGVmYXVsdCI6cH0pLEQ9KGc9ZSgiaGVscGVycy9mZWF0dXJlIiksZyYmZy5fX2VzTW9kdWxlJiZnfHx7ImRlZmF1bHQiOmd9KSxBPShtPWUoImhlbHBlcnMvZnVuY3Rpb24iKSxtJiZtLl9fZXNNb2R1bGUmJm18fHsiZGVmYXVsdCI6bX0pLHg9KHc9ZSgiaGVscGVycy9taXhlZCIpLHcmJncuX19lc01vZHVsZSYmd3x8eyJkZWZhdWx0Ijp3fSksUD0odj1lKCJoZWxwZXJzL251bWJlciIpLHYmJnYuX19lc01vZHVsZSYmdnx8eyJkZWZhdWx0Ijp2fSksTj0oeT1lKCJoZWxwZXJzL29iamVjdCIpLHkmJnkuX19lc01vZHVsZSYmeXx8eyJkZWZhdWx0Ijp5fSksTD0oYj1lKCJoZWxwZXJzL3NldHRpbmciKSxiJiZiLl9fZXNNb2R1bGUmJmJ8fHsiZGVmYXVsdCI6Yn0pLFc9KEM9ZSgiaGVscGVycy9zdHJpbmciKSxDJiZDLl9fZXNNb2R1bGUmJkN8fHsiZGVmYXVsdCI6Q30pLEk9KF89ZSgiaGVscGVycy91bmljb2RlIiksXyYmXy5fX2VzTW9kdWxlJiZffHx7ImRlZmF1bHQiOl99KSxqPShSPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxSJiZSLl9fZXNNb2R1bGUmJlJ8fHsiZGVmYXVsdCI6Un0pLFY9KFM9ZSgiaGVscGVycy9kb20vZXZlbnQiKSxTJiZTLl9fZXNNb2R1bGUmJlN8fHsiZGVmYXVsdCI6U30pLEY9W00sTyxrLEgsRCxBLHgsUCxOLEwsVyxJXSxCPVtqLFZdO28uYnVpbGREYXRlPSJNb24gSnVuIDA2IDIwMTYgMTM6MzA6MDMgR01UKzAyMDAgKENFU1QpIixvLnBhY2thZ2VOYW1lPSJoYW5kc29udGFibGUiLG8udmVyc2lvbj0iMC4yNS4xIjt2YXIgej0iQEBiYXNlVmVyc2lvbiI7L15AQC8udGVzdCh6KXx8KG8uYmFzZVZlcnNpb249eiksby5wbHVnaW5zPXt9O3ZhciBZPShFPWUoInBsdWdpbnMiKSxFJiZFLl9fZXNNb2R1bGUmJkV8fHsiZGVmYXVsdCI6RX0pLnJlZ2lzdGVyUGx1Z2luO28ucGx1Z2lucy5yZWdpc3RlclBsdWdpbj1ZLG8uaGVscGVyPXt9LG8uZG9tPXt9LG8uRG9tPW8uZG9tLE0uYXJyYXlFYWNoKEYsZnVuY3Rpb24oZSl7TS5hcnJheUVhY2goT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSksZnVuY3Rpb24odCl7Il8iIT09dC5jaGFyQXQoMCkmJihvLmhlbHBlclt0XT1lW3RdKX0pfSksTS5hcnJheUVhY2goQixmdW5jdGlvbihlKXtNLmFycmF5RWFjaChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSxmdW5jdGlvbih0KXsiXyIhPT10LmNoYXJBdCgwKSYmKG8uZG9tW3RdPWVbdF0pfSl9KX0se2NlbGxUeXBlczoyNCxjb3JlOjI1LGVzNmNvbGxlY3Rpb25zOiJlczZjb2xsZWN0aW9ucyIsImhlbHBlcnMvYXJyYXkiOjQyLCJoZWxwZXJzL2Jyb3dzZXIiOjQzLCJoZWxwZXJzL2RhdGEiOjQ0LCJoZWxwZXJzL2RhdGUiOjQ1LCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9kb20vZXZlbnQiOjQ3LCJoZWxwZXJzL2ZlYXR1cmUiOjQ4LCJoZWxwZXJzL2Z1bmN0aW9uIjo0OSwiaGVscGVycy9taXhlZCI6NTAsImhlbHBlcnMvbnVtYmVyIjo1MSwiaGVscGVycy9vYmplY3QiOjUyLCJoZWxwZXJzL3NldHRpbmciOjUzLCJoZWxwZXJzL3N0cmluZyI6NTQsImhlbHBlcnMvdW5pY29kZSI6NTUscGx1Z2luSG9va3M6NTgscGx1Z2luczo1OSwicGx1Z2lucy9qcXVlcnlIYW5kc29udGFibGUiOjEsInJlbmRlcmVycy9fY2VsbERlY29yYXRvciI6OTMsInNoaW1zL3J1bnRpbWUiOjEwMH1dLDI0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciBvLHIsaSxzLGwsYSx1LGMsaCxkLGYscCxnLG0sdyx2LHksYixDLF8sUixTLEUsVCxNPShvPWUoImhlbHBlcnMvYnJvd3NlciIpLA0KbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KS5pc01vYmlsZUJyb3dzZXIsTz0ocj1lKCJlZGl0b3JzIiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KS5nZXRFZGl0b3JDb25zdHJ1Y3RvcixrPShpPWUoInJlbmRlcmVycyIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkuZ2V0UmVuZGVyZXIsSD0oKHM9ZSgiZWRpdG9ycy9hdXRvY29tcGxldGVFZGl0b3IiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLkF1dG9jb21wbGV0ZUVkaXRvciwobD1lKCJlZGl0b3JzL2NoZWNrYm94RWRpdG9yIiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KS5DaGVja2JveEVkaXRvciwoYT1lKCJlZGl0b3JzL2RhdGVFZGl0b3IiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLkRhdGVFZGl0b3IsKHU9ZSgiZWRpdG9ycy9kcm9wZG93bkVkaXRvciIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSkuRHJvcGRvd25FZGl0b3IsKGM9ZSgiZWRpdG9ycy9oYW5kc29udGFibGVFZGl0b3IiKSxjJiZjLl9fZXNNb2R1bGUmJmN8fHsiZGVmYXVsdCI6Y30pLkhhbmRzb250YWJsZUVkaXRvciwoaD1lKCJlZGl0b3JzL21vYmlsZVRleHRFZGl0b3IiKSxoJiZoLl9fZXNNb2R1bGUmJmh8fHsiZGVmYXVsdCI6aH0pLk1vYmlsZVRleHRFZGl0b3IsKGQ9ZSgiZWRpdG9ycy9udW1lcmljRWRpdG9yIiksZCYmZC5fX2VzTW9kdWxlJiZkfHx7ImRlZmF1bHQiOmR9KS5OdW1lcmljRWRpdG9yLChmPWUoImVkaXRvcnMvcGFzc3dvcmRFZGl0b3IiKSxmJiZmLl9fZXNNb2R1bGUmJmZ8fHsiZGVmYXVsdCI6Zn0pLlBhc3N3b3JkRWRpdG9yLChwPWUoImVkaXRvcnMvc2VsZWN0RWRpdG9yIikscCYmcC5fX2VzTW9kdWxlJiZwfHx7ImRlZmF1bHQiOnB9KS5TZWxlY3RFZGl0b3IsKGc9ZSgiZWRpdG9ycy90ZXh0RWRpdG9yIiksZyYmZy5fX2VzTW9kdWxlJiZnfHx7ImRlZmF1bHQiOmd9KS5UZXh0RWRpdG9yLChtPWUoInJlbmRlcmVycy9hdXRvY29tcGxldGVSZW5kZXJlciIpLG0mJm0uX19lc01vZHVsZSYmbXx8eyJkZWZhdWx0IjptfSkuQXV0b2NvbXBsZXRlUmVuZGVyZXIsKHc9ZSgicmVuZGVyZXJzL2NoZWNrYm94UmVuZGVyZXIiKSx3JiZ3Ll9fZXNNb2R1bGUmJnd8fHsiZGVmYXVsdCI6d30pLkNoZWNrYm94UmVuZGVyZXIsKHY9ZSgicmVuZGVyZXJzL2h0bWxSZW5kZXJlciIpLHYmJnYuX19lc01vZHVsZSYmdnx8eyJkZWZhdWx0Ijp2fSkuSHRtbFJlbmRlcmVyLCh5PWUoInJlbmRlcmVycy9udW1lcmljUmVuZGVyZXIiKSx5JiZ5Ll9fZXNNb2R1bGUmJnl8fHsiZGVmYXVsdCI6eX0pLk51bWVyaWNSZW5kZXJlciwoYj1lKCJyZW5kZXJlcnMvcGFzc3dvcmRSZW5kZXJlciIpLGImJmIuX19lc01vZHVsZSYmYnx8eyJkZWZhdWx0IjpifSkuUGFzc3dvcmRSZW5kZXJlciwoQz1lKCJyZW5kZXJlcnMvdGV4dFJlbmRlcmVyIiksQyYmQy5fX2VzTW9kdWxlJiZDfHx7ImRlZmF1bHQiOkN9KS5UZXh0UmVuZGVyZXIsKF89ZSgidmFsaWRhdG9ycy9hdXRvY29tcGxldGVWYWxpZGF0b3IiKSxfJiZfLl9fZXNNb2R1bGUmJl98fHsiZGVmYXVsdCI6X30pLkF1dG9jb21wbGV0ZVZhbGlkYXRvciwoUj1lKCJ2YWxpZGF0b3JzL2RhdGVWYWxpZGF0b3IiKSxSJiZSLl9fZXNNb2R1bGUmJlJ8fHsiZGVmYXVsdCI6Un0pLkRhdGVWYWxpZGF0b3IsKFM9ZSgidmFsaWRhdG9ycy90aW1lVmFsaWRhdG9yIiksUyYmUy5fX2VzTW9kdWxlJiZTfHx7ImRlZmF1bHQiOlN9KS5UaW1lVmFsaWRhdG9yLChFPWUoInZhbGlkYXRvcnMvbnVtZXJpY1ZhbGlkYXRvciIpLEUmJkUuX19lc01vZHVsZSYmRXx8eyJkZWZhdWx0IjpFfSkuTnVtZXJpY1ZhbGlkYXRvciwoVD1lKCJicm93c2VyIiksVCYmVC5fX2VzTW9kdWxlJiZUfHx7ImRlZmF1bHQiOlR9KVsiZGVmYXVsdCJdKTtILkF1dG9jb21wbGV0ZUNlbGw9e2VkaXRvcjpPKCJhdXRvY29tcGxldGUiKSxyZW5kZXJlcjprKCJhdXRvY29tcGxldGUiKSx2YWxpZGF0b3I6SC5BdXRvY29tcGxldGVWYWxpZGF0b3J9LEguQ2hlY2tib3hDZWxsPXtlZGl0b3I6TygiY2hlY2tib3giKSxyZW5kZXJlcjprKCJjaGVja2JveCIpfSxILlRleHRDZWxsPXtlZGl0b3I6TyhNKCk/Im1vYmlsZSI6InRleHQiKSxyZW5kZXJlcjprKCJ0ZXh0Iil9LEguTnVtZXJpY0NlbGw9e2VkaXRvcjpPKCJudW1lcmljIikscmVuZGVyZXI6aygibnVtZXJpYyIpLHZhbGlkYXRvcjpILk51bWVyaWNWYWxpZGF0b3IsZGF0YVR5cGU6Im51bWJlciJ9LEguRGF0ZUNlbGw9e2VkaXRvcjpPKCJkYXRlIiksdmFsaWRhdG9yOkguRGF0ZVZhbGlkYXRvcixyZW5kZXJlcjprKCJhdXRvY29tcGxldGUiKX0sSC5UaW1lQ2VsbD17ZWRpdG9yOk8oInRleHQiKSx2YWxpZGF0b3I6SC5UaW1lVmFsaWRhdG9yLHJlbmRlcmVyOmsoInRleHQiKX0sSC5IYW5kc29udGFibGVDZWxsPXtlZGl0b3I6TygiaGFuZHNvbnRhYmxlIikscmVuZGVyZXI6aygiYXV0b2NvbXBsZXRlIil9LEguUGFzc3dvcmRDZWxsPXtlZGl0b3I6TygicGFzc3dvcmQiKSxyZW5kZXJlcjprKCJwYXNzd29yZCIpLGNvcHlhYmxlOiExfSxILkRyb3Bkb3duQ2VsbD17ZWRpdG9yOk8oImRyb3Bkb3duIikscmVuZGVyZXI6aygiYXV0b2NvbXBsZXRlIiksdmFsaWRhdG9yOkguQXV0b2NvbXBsZXRlVmFsaWRhdG9yfSxILmNlbGxUeXBlcz17dGV4dDpILlRleHRDZWxsLGRhdGU6SC5EYXRlQ2VsbCx0aW1lOkguVGltZUNlbGwsbnVtZXJpYzpILk51bWVyaWNDZWxsLGNoZWNrYm94OkguQ2hlY2tib3hDZWxsLGF1dG9jb21wbGV0ZTpILkF1dG9jb21wbGV0ZUNlbGwsaGFuZHNvbnRhYmxlOkguSGFuZHNvbnRhYmxlQ2VsbCxwYXNzd29yZDpILlBhc3N3b3JkQ2VsbCxkcm9wZG93bjpILkRyb3Bkb3duQ2VsbH0sSC5jZWxsTG9va3VwPXt2YWxpZGF0b3I6e251bWVyaWM6SC5OdW1lcmljVmFsaWRhdG9yLGF1dG9jb21wbGV0ZTpILkF1dG9jb21wbGV0ZVZhbGlkYXRvcn19fSx7YnJvd3NlcjoyMyxlZGl0b3JzOjI5LCJlZGl0b3JzL2F1dG9jb21wbGV0ZUVkaXRvciI6MzEsImVkaXRvcnMvY2hlY2tib3hFZGl0b3IiOjMyLCJlZGl0b3JzL2RhdGVFZGl0b3IiOjMzLCJlZGl0b3JzL2Ryb3Bkb3duRWRpdG9yIjozNCwiZWRpdG9ycy9oYW5kc29udGFibGVFZGl0b3IiOjM1LCJlZGl0b3JzL21vYmlsZVRleHRFZGl0b3IiOjM2LCJlZGl0b3JzL251bWVyaWNFZGl0b3IiOjM3LCJlZGl0b3JzL3Bhc3N3b3JkRWRpdG9yIjozOCwiZWRpdG9ycy9zZWxlY3RFZGl0b3IiOjM5LCJlZGl0b3JzL3RleHRFZGl0b3IiOjQwLCJoZWxwZXJzL2Jyb3dzZXIiOjQzLHJlbmRlcmVyczo5MiwicmVuZGVyZXJzL2F1dG9jb21wbGV0ZVJlbmRlcmVyIjo5NCwicmVuZGVyZXJzL2NoZWNrYm94UmVuZGVyZXIiOjk1LCJyZW5kZXJlcnMvaHRtbFJlbmRlcmVyIjo5NiwicmVuZGVyZXJzL251bWVyaWNSZW5kZXJlciI6OTcsInJlbmRlcmVycy9wYXNzd29yZFJlbmRlcmVyIjo5OCwicmVuZGVyZXJzL3RleHRSZW5kZXJlciI6OTksInZhbGlkYXRvcnMvYXV0b2NvbXBsZXRlVmFsaWRhdG9yIjoxMDUsInZhbGlkYXRvcnMvZGF0ZVZhbGlkYXRvciI6MTA2LCJ2YWxpZGF0b3JzL251bWVyaWNWYWxpZGF0b3IiOjEwNywidmFsaWRhdG9ycy90aW1lVmFsaWRhdG9yIjoxMDh9XSwyNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgbyxyLGkscyxsLGEsdSxjLGgsZCxmLHAsZyxtLHcsdix5LGIsQyxfLFIsUz0obz1lKCJicm93c2VyIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLEU9KHI9ZSgibnVtZXJhbCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSlbImRlZmF1bHQiXSxUPShpPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLE09VC5hZGRDbGFzcyxPPVQuZW1wdHksaz1ULmlzQ2hpbGRPZldlYkNvbXBvbmVudFRhYmxlLEg9VC5yZW1vdmVDbGFzcyxEPShzPWUoImhlbHBlcnMvc2V0dGluZyIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuY29sdW1uRmFjdG9yeSxBPShsPWUoImhlbHBlcnMvYnJvd3NlciIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSkuaXNNb2JpbGVCcm93c2VyLHg9KGE9ZSgiZGF0YU1hcCIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSkuRGF0YU1hcCxQPSh1PWUoImVkaXRvck1hbmFnZXIiKSx1JiZ1Ll9fZXNNb2R1bGUmJnV8fHsiZGVmYXVsdCI6dX0pLkVkaXRvck1hbmFnZXIsTj0oYz1lKCJldmVudE1hbmFnZXIiKSxjJiZjLl9fZXNNb2R1bGUmJmN8fHsiZGVmYXVsdCI6Y30pLmV2ZW50TWFuYWdlcixMPShoPWUoImhlbHBlcnMvb2JqZWN0IiksaCYmaC5fX2VzTW9kdWxlJiZofHx7ImRlZmF1bHQiOmh9KSxXPUwuZXh0ZW5kLEk9TC5kdWNrU2NoZW1hLGo9TC5pc09iamVjdEVxdWFscyxWPUwuZGVlcENsb25lLEY9KGQ9ZSgiaGVscGVycy9hcnJheSIpLGQmJmQuX19lc01vZHVsZSYmZHx8eyJkZWZhdWx0IjpkfSksQj1GLmFycmF5RmxhdHRlbix6PUYuYXJyYXlNYXAsWT0oZj1lKCJwbHVnaW5zIiksZiYmZi5fX2VzTW9kdWxlJiZmfHx7ImRlZmF1bHQiOmZ9KS5nZXRQbHVnaW4sVT0ocD1lKCJyZW5kZXJlcnMiKSxwJiZwLl9fZXNNb2R1bGUmJnB8fHsiZGVmYXVsdCI6cH0pLmdldFJlbmRlcmVyLEc9KGc9ZSgiaGVscGVycy9zdHJpbmciKSxnJiZnLl9fZXNNb2R1bGUmJmd8fHsiZGVmYXVsdCI6Z30pLnJhbmRvbVN0cmluZywkPShtPWUoImhlbHBlcnMvbnVtYmVyIiksbSYmbS5fX2VzTW9kdWxlJiZtfHx7ImRlZmF1bHQiOm19KS5yYW5nZUVhY2gsWD0odz1lKCJ0YWJsZVZpZXciKSx3JiZ3Ll9fZXNNb2R1bGUmJnd8fHsiZGVmYXVsdCI6d30pLlRhYmxlVmlldyxLPSh2PWUoImRhdGFTb3VyY2UiKSx2JiZ2Ll9fZXNNb2R1bGUmJnZ8fHsiZGVmYXVsdCI6dn0pLkRhdGFTb3VyY2UscT0oeT1lKCJoZWxwZXJzL2RhdGEiKSx5JiZ5Ll9fZXNNb2R1bGUmJnl8fHsiZGVmYXVsdCI6eX0pLFo9cS50cmFuc2xhdGVSb3dzVG9Db2x1bW5zLEo9cS5jZWxsTWV0aG9kTG9va3VwRmFjdG9yeSxRPXEuc3ByZWFkc2hlZXRDb2x1bW5MYWJlbCxlZT0oYj1lKCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY2VsbC9jb29yZHMiKSxiJiZiLl9fZXNNb2R1bGUmJmJ8fHsiZGVmYXVsdCI6Yn0pLldhbGtvbnRhYmxlQ2VsbENvb3Jkcyx0ZT0oQz1lKCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY2VsbC9yYW5nZSIpLEMmJkMuX19lc01vZHVsZSYmQ3x8eyJkZWZhdWx0IjpDfSkuV2Fsa29udGFibGVDZWxsUmFuZ2UsbmU9KChfPWUoIjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9zZWxlY3Rpb24iKSxfJiZfLl9fZXNNb2R1bGUmJl98fHsiZGVmYXVsdCI6X30pLldhbGtvbnRhYmxlU2VsZWN0aW9uLChSPWUoIjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9jYWxjdWxhdG9yL3ZpZXdwb3J0Q29sdW1ucyIpLFImJlIuX19lc01vZHVsZSYmUnx8eyJkZWZhdWx0IjpSfSkuV2Fsa29udGFibGVWaWV3cG9ydENvbHVtbnNDYWxjdWxhdG9yKTtTLmFjdGl2ZUd1aWQ9bnVsbCxTLkNvcmU9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7dmFyIGU9ITE7cmV0dXJue3ZhbGlkYXRvcnNJblF1ZXVlOjAsdmFsaWQ6ITAsYWRkVmFsaWRhdG9yVG9RdWV1ZTpmdW5jdGlvbigpe3RoaXMudmFsaWRhdG9yc0luUXVldWUrKyxlPSExfSxyZW1vdmVWYWxpZGF0b3JGb3JtUXVldWU6ZnVuY3Rpb24oKXt0aGlzLnZhbGlkYXRvcnNJblF1ZXVlPXRoaXMudmFsaWRhdG9yc0luUXVldWUtMTwwPzA6dGhpcy52YWxpZGF0b3JzSW5RdWV1ZS0xLHRoaXMuY2hlY2tJZlF1ZXVlSXNFbXB0eSgpfSxvblF1ZXVlRW1wdHk6ZnVuY3Rpb24oZSl7fSxjaGVja0lmUXVldWVJc0VtcHR5OmZ1bmN0aW9uKCl7MD09dGhpcy52YWxpZGF0b3JzSW5RdWV1ZSYmMD09ZSYmKGU9ITAsdGhpcy5vblF1ZXVlRW1wdHkodGhpcy52YWxpZCkpfX19ZnVuY3Rpb24gbyhlLHQsbyl7ZnVuY3Rpb24gcigpe3ZhciBuO2UubGVuZ3RoJiYobj1TLmhvb2tzLnJ1bihtLCJiZWZvcmVDaGFuZ2UiLGUsdCksImZ1bmN0aW9uIj09dHlwZW9mIG4/Y29uc29sZS53YXJuKCJZb3VyIGJlZm9yZUNoYW5nZSBjYWxsYmFjayByZXR1cm5zIGEgZnVuY3Rpb24uIEl0J3Mgbm90IHN1cHBvcnRlZCBzaW5jZSBIYW5kc29udGFibGUgMC4xMi4xIChhbmQgdGhlIHJldHVybmVkIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGV4ZWN1dGVkKS4iKTpuPT09ITEmJmUuc3BsaWNlKDAsZS5sZW5ndGgpKSxvKCl9dmFyIGk9bmV3IG47aS5vblF1ZXVlRW1wdHk9cjtmb3IodmFyIHM9ZS5sZW5ndGgtMTtzPj0wO3MtLSlpZihudWxsPT09ZVtzXSllLnNwbGljZShzLDEpO2Vsc2V7dmFyIGw9ZVtzXVswXSxhPWgucHJvcFRvQ29sKGVbc11bMV0pLHU9bS5nZXRDZWxsTWV0YShsLGEpO2lmKCJudW1lcmljIj09PXUudHlwZSYmInN0cmluZyI9PXR5cGVvZiBlW3NdWzNdJiZlW3NdWzNdLmxlbmd0aD4wJiYoL14tP1tcZFxzXSooXC58XCwpP1xkKiQvLnRlc3QoZVtzXVszXSl8fHUuZm9ybWF0KSl7dmFyIGM9ZVtzXVszXS5sZW5ndGg7InVuZGVmaW5lZCI9PXR5cGVvZiB1Lmxhbmd1YWdlP0UubGFuZ3VhZ2UoImVuIik6ZVtzXVszXS5pbmRleE9mKCIuIik9PT1jLTMmJi0xPT09ZVtzXVszXS5pbmRleE9mKCIsIik/RS5sYW5ndWFnZSgiZW4iKTpFLmxhbmd1YWdlKHUubGFuZ3VhZ2UpLEUudmFsaWRhdGUoZVtzXVszXSkmJihlW3NdWzNdPUUoKS51bmZvcm1hdChlW3NdWzNdKSl9bS5nZXRDZWxsVmFsaWRhdG9yKHUpJiYoaS5hZGRWYWxpZGF0b3JUb1F1ZXVlKCksbS52YWxpZGF0ZUNlbGwoZVtzXVszXSx1LGZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKG8pe2lmKCJib29sZWFuIiE9dHlwZW9mIG8pdGhyb3cgbmV3IEVycm9yKCJWYWxpZGF0aW9uIGVycm9yOiByZXN1bHQgaXMgbm90IGJvb2xlYW4iKTtvPT09ITEmJm4uYWxsb3dJbnZhbGlkPT09ITEmJihlLnNwbGljZSh0LDEpLG4udmFsaWQ9ITAsLS10KSxpLnJlbW92ZVZhbGlkYXRvckZvcm1RdWV1ZSgpfX0ocyx1KSx0KSl9aS5jaGVja0lmUXVldWVJc0VtcHR5KCl9ZnVuY3Rpb24gcihlLHQpe3ZhciBuPWUubGVuZ3RoLTE7aWYoISgwPm4pKXtmb3IoO24+PTA7bi0tKWlmKG51bGwhPT1lW25dKXtpZihudWxsIT1lW25dWzJdfHxudWxsIT1lW25dWzNdKXtpZihjLnNldHRpbmdzLmFsbG93SW5zZXJ0Um93KWZvcig7ZVtuXVswXT5tLmNvdW50Um93cygpLTE7KWguY3JlYXRlUm93KCk7aWYoImFycmF5Ij09PW0uZGF0YVR5cGUmJighYy5zZXR0aW5ncy5jb2x1bW5zfHwwPT09Yy5zZXR0aW5ncy5jb2x1bW5zLmxlbmd0aCkmJmMuc2V0dGluZ3MuYWxsb3dJbnNlcnRDb2x1bW4pZm9yKDtoLnByb3BUb0NvbChlW25dWzFdKT5tLmNvdW50Q29scygpLTE7KWguY3JlYXRlQ29sKCk7aC5zZXQoZVtuXVswXSxlW25dWzFdLGVbbl1bM10pfX1lbHNlIGUuc3BsaWNlKG4sMSk7bS5mb3JjZUZ1bGxSZW5kZXI9ITAsZi5hZGp1c3RSb3dzQW5kQ29scygpLFMuaG9va3MucnVuKG0sImJlZm9yZUNoYW5nZVJlbmRlciIsZSx0KSxwLnJlZnJlc2hCb3JkZXJzKG51bGwsITApLG0udmlldy53dC53dE92ZXJsYXlzLmFkanVzdEVsZW1lbnRzU2l6ZSgpLFMuaG9va3MucnVuKG0sImFmdGVyQ2hhbmdlIixlLHR8fCJlZGl0Iil9fWZ1bmN0aW9uIGkoZSx0LG4pe3JldHVybiJvYmplY3QiPT10eXBlb2YgZT9lOltbZSx0LG5dXX1mdW5jdGlvbiBzKGUpe2lmKGUuaGFzT3duUHJvcGVydHkoInR5cGUiKSl7dmFyIHQsbj17fTtpZigib2JqZWN0Ij09dHlwZW9mIGUudHlwZSl0PWUudHlwZTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgZS50eXBlJiYodD1TLmNlbGxUeXBlc1tlLnR5cGVdLHZvaWQgMD09PXQpKXRocm93IG5ldyBFcnJvcignWW91IGRlY2xhcmVkIGNlbGwgdHlwZSAiJytlLnR5cGUrJyIgYXMgYSBzdHJpbmcgdGhhdCBpcyBub3QgbWFwcGVkIHRvIGEga25vd24gb2JqZWN0LiBDZWxsIHR5cGUgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYSBzdHJpbmcgbWFwcGVkIHRvIGFuIG9iamVjdCBpbiBIYW5kc29udGFibGUuY2VsbFR5cGVzJyk7Zm9yKHZhciBvIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShvKSYmIWUuaGFzT3duUHJvcGVydHkobykmJihuW29dPXRbb10pO3JldHVybiBufX1mdW5jdGlvbiBsKGUpe3JldHVybiBTLmhvb2tzLnJ1bihtLCJtb2RpZnlSb3ciLGUpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuIFMuaG9va3MucnVuKG0sIm1vZGlmeUNvbCIsZSl9ZnVuY3Rpb24gdSgpe3Rocm93IG5ldyBFcnJvcigiVGhpcyBtZXRob2QgY2Fubm90IGJlIGNhbGxlZCBiZWNhdXNlIHRoaXMgSGFuZHNvbnRhYmxlIGluc3RhbmNlIGhhcyBiZWVuIGRlc3Ryb3llZCIpfXZhciBjLGgsZCxmLHAsZyxtPXRoaXMsdz1mdW5jdGlvbigpe30sdj1OKG0pO1cody5wcm90b3R5cGUsb2UucHJvdG90eXBlKSxXKHcucHJvdG90eXBlLHQpLFcody5wcm90b3R5cGUscyh0KSksdGhpcy5yb290RWxlbWVudD1lLHRoaXMuaXNIb3RUYWJsZUVudj1rKHRoaXMucm9vdEVsZW1lbnQpLFMuZXZlbnRNYW5hZ2VyLmlzSG90VGFibGVFbnY9dGhpcy5pc0hvdFRhYmxlRW52LHRoaXMuY29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHRoaXMucmVuZGVyQ2FsbD0hMSxlLmluc2VydEJlZm9yZSh0aGlzLmNvbnRhaW5lcixlLmZpcnN0Q2hpbGQpLHRoaXMuZ3VpZD0iaHRfIitHKCksZD1uZXcgSyhtKSx0aGlzLnJvb3RFbGVtZW50LmlkJiYiaHRfIiE9PXRoaXMucm9vdEVsZW1lbnQuaWQuc3Vic3RyaW5nKDAsMyl8fCh0aGlzLnJvb3RFbGVtZW50LmlkPXRoaXMuZ3VpZCksYz17Y2VsbFNldHRpbmdzOltdLGNvbHVtblNldHRpbmdzOltdLGNvbHVtbnNTZXR0aW5nQ29uZmxpY3RzOlsiZGF0YSIsIndpZHRoIl0sc2V0dGluZ3M6bmV3IHcsc2VsUmFuZ2U6bnVsbCxpc1BvcHVsYXRlZDpudWxsLHNjcm9sbGFibGU6bnVsbCxmaXJzdFJ1bjohMH0sZj17YWx0ZXI6ZnVuY3Rpb24oZSx0LG4sbyxyKXtmdW5jdGlvbiBpKGUsdCxuLG8pe3ZhciByPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuImFycmF5Ij09PW8/ZT1bXToib2JqZWN0Ij09PW8mJihlPXt9KSxlfSxpPXoobmV3IEFycmF5KG4pLGZ1bmN0aW9uKCl7cmV0dXJuIHIoKX0pO2kudW5zaGlmdCh0LDApLGUuc3BsaWNlLmFwcGx5KGUsaSl9dmFyIHM7c3dpdGNoKG49bnx8MSxlKXtjYXNlImluc2VydF9yb3ciOmlmKG0uZ2V0U2V0dGluZ3MoKS5tYXhSb3dzPT09bS5jb3VudFNvdXJjZVJvd3MoKSlyZXR1cm47cz1oLmNyZWF0ZVJvdyh0LG4pLGkoYy5jZWxsU2V0dGluZ3MsdCxuLCJhcnJheSIpLHMmJihwLmlzU2VsZWN0ZWQoKSYmYy5zZWxSYW5nZS5mcm9tLnJvdz49dD8oYy5zZWxSYW5nZS5mcm9tLnJvdz1jLnNlbFJhbmdlLmZyb20ucm93K3MscC50cmFuc2Zvcm1FbmQocywwKSk6cC5yZWZyZXNoQm9yZGVycygpKTticmVhaztjYXNlImluc2VydF9jb2wiOnM9aC5jcmVhdGVDb2wodCxuKTtmb3IodmFyIGw9MCx1PW0uY291bnRTb3VyY2VSb3dzKCk7dT5sO2wrKyljLmNlbGxTZXR0aW5nc1tsXSYmaShjLmNlbGxTZXR0aW5nc1tsXSx0LG4pO2lmKHMpe2lmKEFycmF5LmlzQXJyYXkobS5nZXRTZXR0aW5ncygpLmNvbEhlYWRlcnMpKXt2YXIgZD1bdCwwXTtkLmxlbmd0aCs9cyxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KG0uZ2V0U2V0dGluZ3MoKS5jb2xIZWFkZXJzLGQpfXAuaXNTZWxlY3RlZCgpJiZjLnNlbFJhbmdlLmZyb20uY29sPj10PyhjLnNlbFJhbmdlLmZyb20uY29sPWMuc2VsUmFuZ2UuZnJvbS5jb2wrcyxwLnRyYW5zZm9ybUVuZCgwLHMpKTpwLnJlZnJlc2hCb3JkZXJzKCl9YnJlYWs7Y2FzZSJyZW1vdmVfcm93IjpoLnJlbW92ZVJvdyh0LG4pLGMuY2VsbFNldHRpbmdzLnNwbGljZSh0LG4pO3ZhciBnPW0uY291bnRSb3dzKCksdz1tLmdldFNldHRpbmdzKCkuZml4ZWRSb3dzVG9wO3c+PXQrMSYmKG0uZ2V0U2V0dGluZ3MoKS5maXhlZFJvd3NUb3AtPU1hdGgubWluKG4sdy10KSk7dmFyIHY9bS5nZXRTZXR0aW5ncygpLmZpeGVkUm93c0JvdHRvbTt2JiZ0Pj1nLXYmJihtLmdldFNldHRpbmdzKCkuZml4ZWRSb3dzQm90dG9tLT1NYXRoLm1pbihuLHYpKSxmLmFkanVzdFJvd3NBbmRDb2xzKCkscC5yZWZyZXNoQm9yZGVycygpO2JyZWFrO2Nhc2UicmVtb3ZlX2NvbCI6dmFyIHk9YSh0KTtoLnJlbW92ZUNvbCh0LG4pO2Zvcih2YXIgYj0wLEM9bS5jb3VudFNvdXJjZVJvd3MoKTtDPmI7YisrKWMuY2VsbFNldHRpbmdzW2JdJiZjLmNlbGxTZXR0aW5nc1tiXS5zcGxpY2UoeSxuKTt2YXIgXz1tLmdldFNldHRpbmdzKCkuZml4ZWRDb2x1bW5zTGVmdDtfPj10KzEmJihtLmdldFNldHRpbmdzKCkuZml4ZWRDb2x1bW5zTGVmdC09TWF0aC5taW4obixfLXQpKSxBcnJheS5pc0FycmF5KG0uZ2V0U2V0dGluZ3MoKS5jb2xIZWFkZXJzKSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgeSYmKHk9LTEpLG0uZ2V0U2V0dGluZ3MoKS5jb2xIZWFkZXJzLnNwbGljZSh5LG4pKSxmLmFkanVzdFJvd3NBbmRDb2xzKCkscC5yZWZyZXNoQm9yZGVycygpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBubyBzdWNoIGFjdGlvbiAiJytlKyciJyl9cnx8Zi5hZGp1c3RSb3dzQW5kQ29scygpfSxhZGp1c3RSb3dzQW5kQ29sczpmdW5jdGlvbigpe2lmKGMuc2V0dGluZ3MubWluUm93cyl7dmFyIGU9bS5jb3VudFJvd3MoKTtpZihlPGMuc2V0dGluZ3MubWluUm93cylmb3IodmFyIHQ9MCxuPWMuc2V0dGluZ3MubWluUm93cztuLWU+dDt0KyspaC5jcmVhdGVSb3cobS5jb3VudFJvd3MoKSwxLCEwKX1pZihjLnNldHRpbmdzLm1pblNwYXJlUm93cyl7dmFyIG89bS5jb3VudEVtcHR5Um93cyghMCk7aWYobzxjLnNldHRpbmdzLm1pblNwYXJlUm93cylmb3IoO288Yy5zZXR0aW5ncy5taW5TcGFyZVJvd3MmJm0uY291bnRSb3dzKCk8Yy5zZXR0aW5ncy5tYXhSb3dzO28rKyloLmNyZWF0ZVJvdyhtLmNvdW50Um93cygpLDEsITApfXZhciByO2lmKChjLnNldHRpbmdzLm1pbkNvbHN8fGMuc2V0dGluZ3MubWluU3BhcmVDb2xzKSYmKHI9bS5jb3VudEVtcHR5Q29scyghMCkpLGMuc2V0dGluZ3MubWluQ29scyYmIWMuc2V0dGluZ3MuY29sdW1ucyYmbS5jb3VudENvbHMoKTxjLnNldHRpbmdzLm1pbkNvbHMpZm9yKDttLmNvdW50Q29scygpPGMuc2V0dGluZ3MubWluQ29scztyKyspaC5jcmVhdGVDb2wobS5jb3VudENvbHMoKSwxLCEwKTtpZihjLnNldHRpbmdzLm1pblNwYXJlQ29scyYmIWMuc2V0dGluZ3MuY29sdW1ucyYmImFycmF5Ij09PW0uZGF0YVR5cGUmJnI8Yy5zZXR0aW5ncy5taW5TcGFyZUNvbHMpZm9yKDtyPGMuc2V0dGluZ3MubWluU3BhcmVDb2xzJiZtLmNvdW50Q29scygpPGMuc2V0dGluZ3MubWF4Q29scztyKyspaC5jcmVhdGVDb2wobS5jb3VudENvbHMoKSwxLCEwKTt2YXIgaT1tLmNvdW50Um93cygpLHM9bS5jb3VudENvbHMoKTtpZigwIT09aSYmMCE9PXN8fHAuZGVzZWxlY3QoKSxwLmlzU2VsZWN0ZWQoKSl7dmFyIGw9ITEsYT1jLnNlbFJhbmdlLmZyb20ucm93LHU9Yy5zZWxSYW5nZS5mcm9tLmNvbCxkPWMuc2VsUmFuZ2UudG8ucm93LGY9Yy5zZWxSYW5nZS50by5jb2w7YT5pLTE/KGE9aS0xLGw9ITAsZD5hJiYoZD1hKSk6ZD5pLTEmJihkPWktMSxsPSEwLGE+ZCYmKGE9ZCkpLHU+cy0xPyh1PXMtMSxsPSEwLGY+dSYmKGY9dSkpOmY+cy0xJiYoZj1zLTEsbD0hMCx1PmYmJih1PWYpKSxsJiZtLnNlbGVjdENlbGwoYSx1LGQsZil9bS52aWV3JiZtLnZpZXcud3Qud3RPdmVybGF5cy5hZGp1c3RFbGVtZW50c1NpemUoKX0scG9wdWxhdGVGcm9tQXJyYXk6ZnVuY3Rpb24oZSx0LG4sbyxyLGkscyl7dmFyIGwsYSx1LGgsZD1bXSxmPXt9O2lmKGE9dC5sZW5ndGgsMD09PWEpcmV0dXJuITE7dmFyIHAsZyx3LHY7KHtyb3c6bnVsbD09PW4/bnVsbDpuLnJvdyxjb2w6bnVsbD09PW4/bnVsbDpuLmNvbH0pO3N3aXRjaChyKXtjYXNlInNoaWZ0X2Rvd24iOmZvcihwPW4/bi5jb2wtZS5jb2wrMTowLGc9bj9uLnJvdy1lLnJvdysxOjAsdD1aKHQpLHU9MCxoPXQubGVuZ3RoLHc9TWF0aC5tYXgoaCxwKTt3PnU7dSsrKWlmKGg+dSl7Zm9yKGw9MCxhPXRbdV0ubGVuZ3RoO2ctYT5sO2wrKyl0W3VdLnB1c2godFt1XVtsJWFdKTt0W3VdLnVuc2hpZnQoZS5jb2wrdSxlLnJvdywwKSxtLnNwbGljZUNvbC5hcHBseShtLHRbdV0pfWVsc2UgdFt1JWhdWzBdPWUuY29sK3UsbS5zcGxpY2VDb2wuYXBwbHkobSx0W3UlaF0pO2JyZWFrO2Nhc2Uic2hpZnRfcmlnaHQiOmZvcihwPW4/bi5jb2wtZS5jb2wrMTowLGc9bj9uLnJvdy1lLnJvdysxOjAsbD0wLGE9dC5sZW5ndGgsdj1NYXRoLm1heChhLGcpO3Y+bDtsKyspaWYoYT5sKXtmb3IodT0wLGg9dFtsXS5sZW5ndGg7cC1oPnU7dSsrKXRbbF0ucHVzaCh0W2xdW3UlaF0pO3RbbF0udW5zaGlmdChlLnJvdytsLGUuY29sLDApLG0uc3BsaWNlUm93LmFwcGx5KG0sdFtsXSl9ZWxzZSB0W2wlYV1bMF09ZS5yb3crbCxtLnNwbGljZVJvdy5hcHBseShtLHRbbCVhXSk7YnJlYWs7Y2FzZSJvdmVyd3JpdGUiOmRlZmF1bHQ6Zi5yb3c9ZS5yb3csZi5jb2w9ZS5jb2w7dmFyIHksYj17cm93Om4mJmU/bi5yb3ctZS5yb3crMToxLGNvbDpuJiZlP24uY29sLWUuY29sKzE6MX0sQz0wLF89MCxSPSEwLFM9ZnVuY3Rpb24oZSl7dmFyIG49dm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLG89dFtlJXQubGVuZ3RoXTtyZXR1cm4gbnVsbCE9PW4/b1tuJW8ubGVuZ3RoXTpvfSxFPXQubGVuZ3RoLFQ9bj9uLnJvdy1lLnJvdysxOjA7Zm9yKGE9bj9UOk1hdGgubWF4KEUsVCksbD0wO2E+bCYmIShuJiZmLnJvdz5uLnJvdyYmVD5FfHwhYy5zZXR0aW5ncy5hbGxvd0luc2VydFJvdyYmZi5yb3c+bS5jb3VudFJvd3MoKS0xfHxmLnJvdz49Yy5zZXR0aW5ncy5tYXhSb3dzKTtsKyspe3ZhciBNPWwtQyxPPVMoTSkubGVuZ3RoLGs9bj9uLmNvbC1lLmNvbCsxOjA7aWYoaD1uP2s6TWF0aC5tYXgoTyxrKSxmLmNvbD1lLmNvbCx5PW0uZ2V0Q2VsbE1ldGEoZi5yb3csZi5jb2wpLCJwYXN0ZSIhPT1vJiYiYXV0b2ZpbGwiIT09b3x8IXkuc2tpcFJvd09uUGFzdGUpe2ZvcihfPTAsdT0wO2g+dSYmIShuJiZmLmNvbD5uLmNvbCYmaz5PfHwhYy5zZXR0aW5ncy5hbGxvd0luc2VydENvbHVtbiYmZi5jb2w+bS5jb3VudENvbHMoKS0xfHxmLmNvbD49Yy5zZXR0aW5ncy5tYXhDb2xzKTt1KyspaWYoeT1tLmdldENlbGxNZXRhKGYucm93LGYuY29sKSwicGFzdGUiIT09byYmImF1dG9maWxsIiE9PW98fCF5LnNraXBDb2x1bW5PblBhc3RlKWlmKHkucmVhZE9ubHkpZi5jb2wrKztlbHNle3ZhciBIPXUtXyxEPVMoTSxIKSxBPW0uZ2V0RGF0YUF0Q2VsbChmLnJvdyxmLmNvbCkseD17cm93Ok0sY29sOkh9O2lmKCJhdXRvZmlsbCI9PT1vKXt2YXIgUD1tLnJ1bkhvb2tzKCJiZWZvcmVBdXRvZmlsbEluc2lkZVBvcHVsYXRlIix4LGksdCxzLHt9LGIpO1AmJihEPSJ1bmRlZmluZWQiPT10eXBlb2YgUC52YWx1ZT9EOlAudmFsdWUpfWlmKG51bGwhPT1EJiYib2JqZWN0Ij09dHlwZW9mIEQpaWYobnVsbD09PUF8fCJvYmplY3QiIT10eXBlb2YgQSlSPSExO2Vsc2V7dmFyIE49SShBWzBdfHxBKSxMPUkoRFswXXx8RCk7aihOLEwpP0Q9VihEKTpSPSExfWVsc2UgbnVsbCE9PUEmJiJvYmplY3QiPT10eXBlb2YgQSYmKFI9ITEpO1ImJmQucHVzaChbZi5yb3csZi5jb2wsRF0pLFI9ITAsZi5jb2wrK31lbHNlIF8rKyxmLmNvbCsrLGgrKztmLnJvdysrfWVsc2UgQysrLGYucm93KyssYSsrfW0uc2V0RGF0YUF0Q2VsbChkLG51bGwsbnVsbCxvfHwicG9wdWxhdGVGcm9tQXJyYXkiKX19fSx0aGlzLnNlbGVjdGlvbj1wPXtpblByb2dyZXNzOiExLHNlbGVjdGVkSGVhZGVyOntjb2xzOiExLHJvd3M6ITF9LHNldFNlbGVjdGVkSGVhZGVyczpmdW5jdGlvbihlLHQpe20uc2VsZWN0aW9uLnNlbGVjdGVkSGVhZGVyLnJvd3M9ZSxtLnNlbGVjdGlvbi5zZWxlY3RlZEhlYWRlci5jb2xzPXR9LGJlZ2luOmZ1bmN0aW9uKCl7bS5zZWxlY3Rpb24uaW5Qcm9ncmVzcz0hMH0sZmluaXNoOmZ1bmN0aW9uKCl7dmFyIGU9bS5nZXRTZWxlY3RlZCgpO1MuaG9va3MucnVuKG0sImFmdGVyU2VsZWN0aW9uRW5kIixlWzBdLGVbMV0sZVsyXSxlWzNdKSxTLmhvb2tzLnJ1bihtLCJhZnRlclNlbGVjdGlvbkVuZEJ5UHJvcCIsZVswXSxtLmNvbFRvUHJvcChlWzFdKSxlWzJdLG0uY29sVG9Qcm9wKGVbM10pKSxtLnNlbGVjdGlvbi5pblByb2dyZXNzPSExfSxpc0luUHJvZ3Jlc3M6ZnVuY3Rpb24oKXtyZXR1cm4gbS5zZWxlY3Rpb24uaW5Qcm9ncmVzc30sc2V0UmFuZ2VTdGFydDpmdW5jdGlvbihlLHQpe1MuaG9va3MucnVuKG0sImJlZm9yZVNldFJhbmdlU3RhcnQiLGUpLGMuc2VsUmFuZ2U9bmV3IHRlKGUsZSxlKSxwLnNldFJhbmdlRW5kKGUsbnVsbCx0KX0sc2V0UmFuZ2VTdGFydE9ubHk6ZnVuY3Rpb24oZSl7Uy5ob29rcy5ydW4obSwiYmVmb3JlU2V0UmFuZ2VTdGFydE9ubHkiLGUpLGMuc2VsUmFuZ2U9bmV3IHRlKGUsZSxlKX0sc2V0UmFuZ2VFbmQ6ZnVuY3Rpb24oZSx0LG4pe2lmKG51bGwhPT1jLnNlbFJhbmdlKXt2YXIgbyxyPSExLGk9ITAscz1tLnZpZXcud3Qud3RUYWJsZS5nZXRGaXJzdFZpc2libGVSb3coKSxsPW0udmlldy53dC53dFRhYmxlLmdldEZpcnN0VmlzaWJsZUNvbHVtbigpLGE9e3JvdzpudWxsLGNvbDpudWxsfTtTLmhvb2tzLnJ1bihtLCJiZWZvcmVTZXRSYW5nZUVuZCIsZSksbS5zZWxlY3Rpb24uYmVnaW4oKSxhLnJvdz1lLnJvdzwwP3M6ZS5yb3csYS5jb2w9ZS5jb2w8MD9sOmUuY29sLGMuc2VsUmFuZ2UudG89bmV3IGVlKGEucm93LGEuY29sKSxjLnNldHRpbmdzLm11bHRpU2VsZWN0fHwoYy5zZWxSYW5nZS5mcm9tPWUpLG0udmlldy53dC5zZWxlY3Rpb25zLmN1cnJlbnQuY2xlYXIoKSxvPW0uZ2V0Q2VsbE1ldGEoYy5zZWxSYW5nZS5oaWdobGlnaHQucm93LGMuc2VsUmFuZ2UuaGlnaGxpZ2h0LmNvbCkuZGlzYWJsZVZpc3VhbFNlbGVjdGlvbiwic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSksKG89PT0hMXx8QXJyYXkuaXNBcnJheShvKSYmLTE9PT1vLmluZGV4T2YoImN1cnJlbnQiKSkmJm0udmlldy53dC5zZWxlY3Rpb25zLmN1cnJlbnQuYWRkKGMuc2VsUmFuZ2UuaGlnaGxpZ2h0KSxtLnZpZXcud3Quc2VsZWN0aW9ucy5hcmVhLmNsZWFyKCksKG89PT0hMXx8QXJyYXkuaXNBcnJheShvKSYmLTE9PT1vLmluZGV4T2YoImFyZWEiKSkmJnAuaXNNdWx0aXBsZSgpJiYobS52aWV3Lnd0LnNlbGVjdGlvbnMuYXJlYS5hZGQoYy5zZWxSYW5nZS5mcm9tKSxtLnZpZXcud3Quc2VsZWN0aW9ucy5hcmVhLmFkZChjLnNlbFJhbmdlLnRvKSksKGMuc2V0dGluZ3MuY3VycmVudFJvd0NsYXNzTmFtZXx8Yy5zZXR0aW5ncy5jdXJyZW50Q29sQ2xhc3NOYW1lKSYmKG0udmlldy53dC5zZWxlY3Rpb25zLmhpZ2hsaWdodC5jbGVhcigpLG0udmlldy53dC5zZWxlY3Rpb25zLmhpZ2hsaWdodC5hZGQoYy5zZWxSYW5nZS5mcm9tKSxtLnZpZXcud3Quc2VsZWN0aW9ucy5oaWdobGlnaHQuYWRkKGMuc2VsUmFuZ2UudG8pKSxTLmhvb2tzLnJ1bihtLCJhZnRlclNlbGVjdGlvbiIsYy5zZWxSYW5nZS5mcm9tLnJvdyxjLnNlbFJhbmdlLmZyb20uY29sLGMuc2VsUmFuZ2UudG8ucm93LGMuc2VsUmFuZ2UudG8uY29sKSxTLmhvb2tzLnJ1bihtLCJhZnRlclNlbGVjdGlvbkJ5UHJvcCIsYy5zZWxSYW5nZS5mcm9tLnJvdyxoLmNvbFRvUHJvcChjLnNlbFJhbmdlLmZyb20uY29sKSxjLnNlbFJhbmdlLnRvLnJvdyxoLmNvbFRvUHJvcChjLnNlbFJhbmdlLnRvLmNvbCkpLCgwPT09Yy5zZWxSYW5nZS5mcm9tLnJvdyYmYy5zZWxSYW5nZS50by5yb3c9PT1tLmNvdW50Um93cygpLTEmJm0uY291bnRSb3dzKCk+MXx8MD09PWMuc2VsUmFuZ2UuZnJvbS5jb2wmJmMuc2VsUmFuZ2UudG8uY29sPT09bS5jb3VudENvbHMoKS0xJiZtLmNvdW50Q29scygpPjEpJiYocj0hMCksKGUucm93PDB8fGUuY29sPDApJiYoaT0hMSksdCE9PSExJiYhciYmaSYmKGMuc2VsUmFuZ2UuZnJvbSYmIXAuaXNNdWx0aXBsZSgpP20udmlldy5zY3JvbGxWaWV3cG9ydChjLnNlbFJhbmdlLmZyb20pOm0udmlldy5zY3JvbGxWaWV3cG9ydChlKSkscC5yZWZyZXNoQm9yZGVycyhudWxsLG4pfX0scmVmcmVzaEJvcmRlcnM6ZnVuY3Rpb24oZSx0KXt0fHxnLmRlc3Ryb3lFZGl0b3IoZSksbS52aWV3LnJlbmRlcigpLHAuaXNTZWxlY3RlZCgpJiYhdCYmZy5wcmVwYXJlRWRpdG9yKCl9LGlzTXVsdGlwbGU6ZnVuY3Rpb24oKXt2YXIgZT0hKGMuc2VsUmFuZ2UudG8uY29sPT09Yy5zZWxSYW5nZS5mcm9tLmNvbCYmYy5zZWxSYW5nZS50by5yb3c9PT1jLnNlbFJhbmdlLmZyb20ucm93KSx0PVMuaG9va3MucnVuKG0sImFmdGVySXNNdWx0aXBsZVNlbGVjdGlvbiIsZSk7cmV0dXJuIGU/dDp2b2lkIDB9LHRyYW5zZm9ybVN0YXJ0OmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciByLGkscyxsLGE9bmV3IGVlKGUsdCksdT0wLGg9MDttLnJ1bkhvb2tzKCJtb2RpZnlUcmFuc2Zvcm1TdGFydCIsYSkscj1tLmNvdW50Um93cygpLGk9bS5jb3VudENvbHMoKSxsPW0uZ2V0U2V0dGluZ3MoKS5maXhlZFJvd3NCb3R0b20sYy5zZWxSYW5nZS5oaWdobGlnaHQucm93K2U+ci0xP24mJmMuc2V0dGluZ3MubWluU3BhcmVSb3dzPjAmJiEobCYmYy5zZWxSYW5nZS5oaWdobGlnaHQucm93Pj1yLWwtMSk/KG0uYWx0ZXIoImluc2VydF9yb3ciLHIpLHI9bS5jb3VudFJvd3MoKSk6Yy5zZXR0aW5ncy5hdXRvV3JhcENvbCYmKGEucm93PTEtcixhLmNvbD1jLnNlbFJhbmdlLmhpZ2hsaWdodC5jb2wrYS5jb2w9PWktMT8xLWk6MSk6Yy5zZXR0aW5ncy5hdXRvV3JhcENvbCYmYy5zZWxSYW5nZS5oaWdobGlnaHQucm93K2Eucm93PDAmJmMuc2VsUmFuZ2UuaGlnaGxpZ2h0LmNvbCthLmNvbD49MCYmKGEucm93PXItMSxhLmNvbD1jLnNlbFJhbmdlLmhpZ2hsaWdodC5jb2wrYS5jb2w9PTA/aS0xOi0xKSxjLnNlbFJhbmdlLmhpZ2hsaWdodC5jb2wrYS5jb2w+aS0xP24mJmMuc2V0dGluZ3MubWluU3BhcmVDb2xzPjA/KG0uYWx0ZXIoImluc2VydF9jb2wiLGkpLGk9bS5jb3VudENvbHMoKSk6Yy5zZXR0aW5ncy5hdXRvV3JhcFJvdyYmKGEucm93PWMuc2VsUmFuZ2UuaGlnaGxpZ2h0LnJvdythLnJvdz09ci0xPzEtcjoxLGEuY29sPTEtaSk6Yy5zZXR0aW5ncy5hdXRvV3JhcFJvdyYmYy5zZWxSYW5nZS5oaWdobGlnaHQuY29sK2EuY29sPDAmJmMuc2VsUmFuZ2UuaGlnaGxpZ2h0LnJvdythLnJvdz49MCYmKGEucm93PWMuc2VsUmFuZ2UuaGlnaGxpZ2h0LnJvdythLnJvdz09MD9yLTE6LTEsYS5jb2w9aS0xKSxzPW5ldyBlZShjLnNlbFJhbmdlLmhpZ2hsaWdodC5yb3crYS5yb3csYy5zZWxSYW5nZS5oaWdobGlnaHQuY29sK2EuY29sKSxzLnJvdzwwPyh1PS0xLHMucm93PTApOnMucm93PjAmJnMucm93Pj1yJiYodT0xLHMucm93PXItMSkscy5jb2w8MD8oaD0tMSxzLmNvbD0wKTpzLmNvbD4wJiZzLmNvbD49aSYmKGg9MSxzLmNvbD1pLTEpLG0ucnVuSG9va3MoImFmdGVyTW9kaWZ5VHJhbnNmb3JtU3RhcnQiLHMsdSxoKSxwLnNldFJhbmdlU3RhcnQocyxvKX0sdHJhbnNmb3JtRW5kOmZ1bmN0aW9uKGUsdCl7dmFyIG4sbyxyLGk9bmV3IGVlKGUsdCkscz0wLGw9MDttLnJ1bkhvb2tzKCJtb2RpZnlUcmFuc2Zvcm1FbmQiLGkpLG49bS5jb3VudFJvd3MoKSxvPW0uY291bnRDb2xzKCkscj1uZXcgZWUoYy5zZWxSYW5nZS50by5yb3craS5yb3csYy5zZWxSYW5nZS50by5jb2wraS5jb2wpLHIucm93PDA/KHM9LTEsci5yb3c9MCk6ci5yb3c+MCYmci5yb3c+PW4mJihzPTEsci5yb3c9bi0xKSxyLmNvbDwwPyhsPS0xLHIuY29sPTApOnIuY29sPjAmJnIuY29sPj1vJiYobD0xLHIuY29sPW8tMSksbS5ydW5Ib29rcygiYWZ0ZXJNb2RpZnlUcmFuc2Zvcm1FbmQiLHIscyxsKSxwLnNldFJhbmdlRW5kKHIsITApfSxpc1NlbGVjdGVkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT1jLnNlbFJhbmdlfSxpbkluU2VsZWN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiBwLmlzU2VsZWN0ZWQoKT9jLnNlbFJhbmdlLmluY2x1ZGVzKGUpOiExfSxkZXNlbGVjdDpmdW5jdGlvbigpe3AuaXNTZWxlY3RlZCgpJiYobS5zZWxlY3Rpb24uaW5Qcm9ncmVzcz0hMSxjLnNlbFJhbmdlPW51bGwsbS52aWV3Lnd0LnNlbGVjdGlvbnMuY3VycmVudC5jbGVhcigpLG0udmlldy53dC5zZWxlY3Rpb25zLmFyZWEuY2xlYXIoKSwoYy5zZXR0aW5ncy5jdXJyZW50Um93Q2xhc3NOYW1lfHxjLnNldHRpbmdzLmN1cnJlbnRDb2xDbGFzc05hbWUpJiZtLnZpZXcud3Quc2VsZWN0aW9ucy5oaWdobGlnaHQuY2xlYXIoKSxnLmRlc3Ryb3lFZGl0b3IoKSxwLnJlZnJlc2hCb3JkZXJzKCksUy5ob29rcy5ydW4obSwiYWZ0ZXJEZXNlbGVjdCIpKX0sc2VsZWN0QWxsOmZ1bmN0aW9uKCl7Yy5zZXR0aW5ncy5tdWx0aVNlbGVjdCYmKHAuc2V0UmFuZ2VTdGFydChuZXcgZWUoMCwwKSkscC5zZXRSYW5nZUVuZChuZXcgZWUobS5jb3VudFJvd3MoKS0xLG0uY291bnRDb2xzKCktMSksITEpKX0sZW1wdHk6ZnVuY3Rpb24oKXtpZihwLmlzU2VsZWN0ZWQoKSl7dmFyIGUsdCxuPWMuc2VsUmFuZ2UuZ2V0VG9wTGVmdENvcm5lcigpLG89Yy5zZWxSYW5nZS5nZXRCb3R0b21SaWdodENvcm5lcigpLHI9W107Zm9yKGU9bi5yb3c7ZTw9by5yb3c7ZSsrKWZvcih0PW4uY29sO3Q8PW8uY29sO3QrKyltLmdldENlbGxNZXRhKGUsdCkucmVhZE9ubHl8fHIucHVzaChbZSx0LCIiXSk7bS5zZXREYXRhQXRDZWxsKHIpfX19LHRoaXMuaW5pdD1mdW5jdGlvbigpe2Quc2V0RGF0YShjLnNldHRpbmdzLmRhdGEpLFMuaG9va3MucnVuKG0sImJlZm9yZUluaXQiKSxBKCkmJk0obS5yb290RWxlbWVudCwibW9iaWxlIiksdGhpcy51cGRhdGVTZXR0aW5ncyhjLnNldHRpbmdzLCEwKSx0aGlzLnZpZXc9bmV3IFgodGhpcyksZz1uZXcgUChtLGMscCxoKSx0aGlzLmZvcmNlRnVsbFJlbmRlcj0hMCxTLmhvb2tzLnJ1bihtLCJpbml0IiksdGhpcy52aWV3LnJlbmRlcigpLCJvYmplY3QiPT10eXBlb2YgYy5maXJzdFJ1biYmKFMuaG9va3MucnVuKG0sImFmdGVyQ2hhbmdlIixjLmZpcnN0UnVuWzBdLGMuZmlyc3RSdW5bMV0pLGMuZmlyc3RSdW49ITEpLFMuaG9va3MucnVuKG0sImFmdGVySW5pdCIpfSx0aGlzLnZhbGlkYXRlQ2VsbD1mdW5jdGlvbihlLHQsbixvKXtmdW5jdGlvbiByKGUpe3ZhciBvPXQudmlzdWFsQ29sLHI9dC52aXN1YWxSb3csaT1tLmdldENlbGwocixvLCEwKTtpJiYiVEgiIT1pLm5vZGVOYW1lJiZtLnZpZXcud3Qud3RTZXR0aW5ncy5zZXR0aW5ncy5jZWxsUmVuZGVyZXIocixvLGkpLG4oZSl9dmFyIGk9bS5nZXRDZWxsVmFsaWRhdG9yKHQpOyJbb2JqZWN0IFJlZ0V4cF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGkpJiYoaT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXtuKGUudGVzdCh0KSl9fShpKSksImZ1bmN0aW9uIj09dHlwZW9mIGk/KGU9Uy5ob29rcy5ydW4obSwiYmVmb3JlVmFsaWRhdGUiLGUsdC52aXN1YWxSb3csdC5wcm9wLG8pLG0uX3JlZ2lzdGVyVGltZW91dChzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5jYWxsKHQsZSxmdW5jdGlvbihuKXtuPVMuaG9va3MucnVuKG0sImFmdGVyVmFsaWRhdGUiLG4sZSx0LnZpc3VhbFJvdyx0LnByb3AsbyksdC52YWxpZD1uLHIobiksUy5ob29rcy5ydW4obSwicG9zdEFmdGVyVmFsaWRhdGUiLG4sZSx0LnZpc3VhbFJvdyx0LnByb3Asbyl9KX0sMCkpKTptLl9yZWdpc3RlclRpbWVvdXQoc2V0VGltZW91dChmdW5jdGlvbigpe3QudmFsaWQ9ITAscih0LnZhbGlkKX0sMCkpfSx0aGlzLnNldERhdGFBdENlbGw9ZnVuY3Rpb24oZSx0LG4scyl7dmFyIGwsYSx1LGM9aShlLHQsbiksZD1bXTtmb3IobD0wLGE9Yy5sZW5ndGg7YT5sO2wrKyl7aWYoIm9iamVjdCIhPXR5cGVvZiBjW2xdKXRocm93IG5ldyBFcnJvcigiTWV0aG9kIGBzZXREYXRhQXRDZWxsYCBhY2NlcHRzIHJvdyBudW1iZXIgb3IgY2hhbmdlcyBhcnJheSBvZiBhcnJheXMgYXMgaXRzIGZpcnN0IHBhcmFtZXRlciIpO2lmKCJudW1iZXIiIT10eXBlb2YgY1tsXVsxXSl0aHJvdyBuZXcgRXJyb3IoIk1ldGhvZCBgc2V0RGF0YUF0Q2VsbGAgYWNjZXB0cyByb3cgYW5kIGNvbHVtbiBudW1iZXIgYXMgaXRzIHBhcmFtZXRlcnMuIElmIHlvdSB3YW50IHRvIHVzZSBvYmplY3QgcHJvcGVydHkgbmFtZSwgdXNlIG1ldGhvZCBgc2V0RGF0YUF0Um93UHJvcGAiKTt1PWguY29sVG9Qcm9wKGNbbF1bMV0pLGQucHVzaChbY1tsXVswXSx1LGguZ2V0KGNbbF1bMF0sdSksY1tsXVsyXV0pfXN8fCJvYmplY3QiIT10eXBlb2YgZXx8KHM9dCksbyhkLHMsZnVuY3Rpb24oKXtyKGQscyl9KX0sdGhpcy5zZXREYXRhQXRSb3dQcm9wPWZ1bmN0aW9uKGUsdCxuLHMpe3ZhciBsLGEsdT1pKGUsdCxuKSxjPVtdO2ZvcihsPTAsYT11Lmxlbmd0aDthPmw7bCsrKWMucHVzaChbdVtsXVswXSx1W2xdWzFdLGguZ2V0KHVbbF1bMF0sdVtsXVsxXSksdVtsXVsyXV0pO3N8fCJvYmplY3QiIT10eXBlb2YgZXx8KHM9dCksbyhjLHMsZnVuY3Rpb24oKXtyKGMscyl9KX0sdGhpcy5saXN0ZW49ZnVuY3Rpb24oKXtTLmFjdGl2ZUd1aWQ9bS5ndWlkfSx0aGlzLnVubGlzdGVuPWZ1bmN0aW9uKCl7Uy5hY3RpdmVHdWlkPW51bGx9LHRoaXMuaXNMaXN0ZW5pbmc9ZnVuY3Rpb24oKXtyZXR1cm4gUy5hY3RpdmVHdWlkPT09bS5ndWlkfSx0aGlzLmRlc3Ryb3lFZGl0b3I9ZnVuY3Rpb24oZSl7cC5yZWZyZXNoQm9yZGVycyhlKX0sdGhpcy5wb3B1bGF0ZUZyb21BcnJheT1mdW5jdGlvbihlLHQsbixvLHIsaSxzLGwsYSl7dmFyIHU7aWYoIm9iamVjdCIhPXR5cGVvZiBufHwib2JqZWN0IiE9dHlwZW9mIG5bMF0pdGhyb3cgbmV3IEVycm9yKCJwb3B1bGF0ZUZyb21BcnJheSBwYXJhbWV0ZXIgYGlucHV0YCBtdXN0IGJlIGFuIGFycmF5IG9mIGFycmF5cyIpO3JldHVybiB1PSJudW1iZXIiPT10eXBlb2Ygbz9uZXcgZWUobyxyKTpudWxsLGYucG9wdWxhdGVGcm9tQXJyYXkobmV3IGVlKGUsdCksbix1LGkscyxsLGEpfSx0aGlzLnNwbGljZUNvbD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGguc3BsaWNlQ29sLmFwcGx5KGgsYXJndW1lbnRzKX0sdGhpcy5zcGxpY2VSb3c9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoLnNwbGljZVJvdy5hcHBseShoLGFyZ3VtZW50cyl9LHRoaXMuZ2V0U2VsZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gcC5pc1NlbGVjdGVkKCk/W2Muc2VsUmFuZ2UuZnJvbS5yb3csYy5zZWxSYW5nZS5mcm9tLmNvbCxjLnNlbFJhbmdlLnRvLnJvdyxjLnNlbFJhbmdlLnRvLmNvbF06dm9pZCAwfSx0aGlzLmdldFNlbGVjdGVkUmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gcC5pc1NlbGVjdGVkKCk/Yy5zZWxSYW5nZTp2b2lkIDB9LHRoaXMucmVuZGVyPWZ1bmN0aW9uKCl7bS52aWV3JiYobS5yZW5kZXJDYWxsPSEwLG0uZm9yY2VGdWxsUmVuZGVyPSEwLHAucmVmcmVzaEJvcmRlcnMobnVsbCwhMCkpfSx0aGlzLmxvYWREYXRhPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtjLmNlbGxTZXR0aW5ncy5sZW5ndGg9MH1pZigib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lKWUucHVzaCYmZS5zcGxpY2V8fChlPVtlXSk7ZWxzZXtpZihudWxsIT09ZSl0aHJvdyBuZXcgRXJyb3IoImxvYWREYXRhIG9ubHkgYWNjZXB0cyBhcnJheSBvZiBvYmplY3RzIG9yIGFycmF5IG9mIGFycmF5cyAoIit0eXBlb2YgZSsiIGdpdmVuKSIpO2U9W107Zm9yKHZhciBuLG89MCxyPWMuc2V0dGluZ3Muc3RhcnRSb3dzO3I+bztvKyspe249W107Zm9yKHZhciBpPTAscz1jLnNldHRpbmdzLnN0YXJ0Q29scztzPmk7aSsrKW4ucHVzaChudWxsKTtlLnB1c2gobil9fWMuaXNQb3B1bGF0ZWQ9ITEsdy5wcm90b3R5cGUuZGF0YT1lLEFycmF5LmlzQXJyYXkoYy5zZXR0aW5ncy5kYXRhU2NoZW1hKXx8QXJyYXkuaXNBcnJheShlWzBdKT9tLmRhdGFUeXBlPSJhcnJheSI6ImZ1bmN0aW9uIj09dHlwZW9mIGMuc2V0dGluZ3MuZGF0YVNjaGVtYT9tLmRhdGFUeXBlPSJmdW5jdGlvbiI6bS5kYXRhVHlwZT0ib2JqZWN0IixoJiZoLmRlc3Ryb3koKSxoPW5ldyB4KG0sYyx3KSxkLmRhdGE9ZSxkLmRhdGFUeXBlPW0uZGF0YVR5cGUsZC5jb2xUb1Byb3A9aC5jb2xUb1Byb3AuYmluZChoKSxkLnByb3BUb0NvbD1oLnByb3BUb0NvbC5iaW5kKGgpLHQoKSxmLmFkanVzdFJvd3NBbmRDb2xzKCksUy5ob29rcy5ydW4obSwiYWZ0ZXJMb2FkRGF0YSIsYy5maXJzdFJ1biksYy5maXJzdFJ1bj9jLmZpcnN0UnVuPVtudWxsLCJsb2FkRGF0YSJdOihTLmhvb2tzLnJ1bihtLCJhZnRlckNoYW5nZSIsbnVsbCwibG9hZERhdGEiKSxtLnJlbmRlcigpKSxjLmlzUG9wdWxhdGVkPSEwfSx0aGlzLmdldERhdGE9ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBlP2guZ2V0QWxsKCk6aC5nZXRSYW5nZShuZXcgZWUoZSx0KSxuZXcgZWUobixvKSxoLkRFU1RJTkFUSU9OX1JFTkRFUkVSKX0sdGhpcy5nZXRDb3B5YWJsZVRleHQ9ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIGguZ2V0Q29weWFibGVUZXh0KG5ldyBlZShlLHQpLG5ldyBlZShuLG8pKX0sdGhpcy5nZXRDb3B5YWJsZURhdGE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaC5nZXRDb3B5YWJsZShlLGguY29sVG9Qcm9wKHQpKX0sdGhpcy5nZXRTY2hlbWE9ZnVuY3Rpb24oKXtyZXR1cm4gaC5nZXRTY2hlbWEoKX0sdGhpcy51cGRhdGVTZXR0aW5ncz1mdW5jdGlvbihlLHQpe3ZhciBuLG87aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBlLnJvd3MpdGhyb3cgbmV3IEVycm9yKCcicm93cyIgc2V0dGluZyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiBkbyB5b3UgbWVhbiBzdGFydFJvd3MsIG1pblJvd3Mgb3IgbWF4Um93cz8nKTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGUuY29scyl0aHJvdyBuZXcgRXJyb3IoJyJjb2xzIiBzZXR0aW5nIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIGRvIHlvdSBtZWFuIHN0YXJ0Q29scywgbWluQ29scyBvciBtYXhDb2xzPycpO2ZvcihuIGluIGUpImRhdGEiIT09biYmKFMuaG9va3MuZ2V0UmVnaXN0ZXJlZCgpLmluZGV4T2Yobik+LTE/KCJmdW5jdGlvbiI9PXR5cGVvZiBlW25dfHxBcnJheS5pc0FycmF5KGVbbl0pKSYmbS5hZGRIb29rKG4sZVtuXSk6IXQmJmUuaGFzT3duUHJvcGVydHkobikmJih3LnByb3RvdHlwZVtuXT1lW25dKSk7aWYodm9pZCAwPT09ZS5kYXRhJiZ2b2lkIDA9PT1jLnNldHRpbmdzLmRhdGE/bS5sb2FkRGF0YShudWxsKTp2b2lkIDAhPT1lLmRhdGE/bS5sb2FkRGF0YShlLmRhdGEpOnZvaWQgMCE9PWUuY29sdW1ucyYmaC5jcmVhdGVNYXAoKSxvPW0uY291bnRDb2xzKCksdm9pZCAwPT09ZS5jZWxsJiZ2b2lkIDA9PT1lLmNlbGxzJiZ2b2lkIDA9PT1lLmNvbHVtbnN8fChjLmNlbGxTZXR0aW5ncy5sZW5ndGg9MCksbz4wKXt2YXIgcixpO2ZvcihuPTA7bz5uO24rKyljLmNvbHVtblNldHRpbmdzW25dPUQodyxjLmNvbHVtbnNTZXR0aW5nQ29uZmxpY3RzKSxyPWMuY29sdW1uU2V0dGluZ3Nbbl0ucHJvdG90eXBlLHcucHJvdG90eXBlLmNvbHVtbnMmJihpPXcucHJvdG90eXBlLmNvbHVtbnNbbl0saSYmKFcocixpKSxXKHIscyhpKSkpKX1pZigidW5kZWZpbmVkIiE9dHlwZW9mIGUuY2VsbClmb3IobiBpbiBlLmNlbGwpaWYoZS5jZWxsLmhhc093blByb3BlcnR5KG4pKXt2YXIgbD1lLmNlbGxbbl07bS5zZXRDZWxsTWV0YU9iamVjdChsLnJvdyxsLmNvbCxsKX1TLmhvb2tzLnJ1bihtLCJhZnRlckNlbGxNZXRhUmVzZXQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGUuY2xhc3NOYW1lJiYody5wcm90b3R5cGUuY2xhc3NOYW1lJiZIKG0ucm9vdEVsZW1lbnQsdy5wcm90b3R5cGUuY2xhc3NOYW1lKSxlLmNsYXNzTmFtZSYmTShtLnJvb3RFbGVtZW50LGUuY2xhc3NOYW1lKSk7dmFyIGE9bS5yb290RWxlbWVudC5zdHlsZS5oZWlnaHQ7IiIhPT1hJiYoYT1wYXJzZUludChtLnJvb3RFbGVtZW50LnN0eWxlLmhlaWdodCwxMCkpO3ZhciB1PWUuaGVpZ2h0O2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB1JiYodT11KCkpLHQpe3ZhciBkPW0ucm9vdEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpO2QmJm0ucm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLWluaXRpYWxzdHlsZSIsbS5yb290RWxlbWVudC5nZXRBdHRyaWJ1dGUoInN0eWxlIikpfWlmKG51bGw9PT11KXt2YXIgZz1tLnJvb3RFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1pbml0aWFsc3R5bGUiKTtnJiYoZy5pbmRleE9mKCJoZWlnaHQiKT4tMXx8Zy5pbmRleE9mKCJvdmVyZmxvdyIpPi0xKT9tLnJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgic3R5bGUiLGcpOihtLnJvb3RFbGVtZW50LnN0eWxlLmhlaWdodD0iIixtLnJvb3RFbGVtZW50LnN0eWxlLm92ZXJmbG93PSIiKX1lbHNlIHZvaWQgMCE9PXUmJihtLnJvb3RFbGVtZW50LnN0eWxlLmhlaWdodD11KyJweCIsbS5yb290RWxlbWVudC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBlLndpZHRoKXt2YXIgdj1lLndpZHRoOyJmdW5jdGlvbiI9PXR5cGVvZiB2JiYodj12KCkpLG0ucm9vdEVsZW1lbnQuc3R5bGUud2lkdGg9disicHgifXR8fChoLmNsZWFyTGVuZ3RoQ2FjaGUoKSxTLmhvb2tzLnJ1bihtLCJhZnRlclVwZGF0ZVNldHRpbmdzIikpLGYuYWRqdXN0Um93c0FuZENvbHMoKSxtLnZpZXcmJiFjLmZpcnN0UnVuJiYobS5mb3JjZUZ1bGxSZW5kZXI9ITAscC5yZWZyZXNoQm9yZGVycyhudWxsLCEwKSksdHx8IW0udmlld3x8IiIhPT1hJiYiIiE9PXUmJnZvaWQgMCE9PXV8fGE9PT11fHxtLnZpZXcud3Qud3RPdmVybGF5cy51cGRhdGVNYWluU2Nyb2xsYWJsZUVsZW1lbnRzKCl9LHRoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24oKXt2YXIgZT1tLmdldFNlbGVjdGVkKCk7aWYody5wcm90b3R5cGUuZ2V0VmFsdWUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3LnByb3RvdHlwZS5nZXRWYWx1ZSlyZXR1cm4gdy5wcm90b3R5cGUuZ2V0VmFsdWUuY2FsbChtKTtpZihlKXJldHVybiBtLmdldERhdGEoKVtlWzBdXVt3LnByb3RvdHlwZS5nZXRWYWx1ZV19ZWxzZSBpZihlKXJldHVybiBtLmdldERhdGFBdENlbGwoZVswXSxlWzFdKX0sdGhpcy5nZXRTZXR0aW5ncz1mdW5jdGlvbigpe3JldHVybiBjLnNldHRpbmdzfSx0aGlzLmNsZWFyPWZ1bmN0aW9uKCl7cC5zZWxlY3RBbGwoKSxwLmVtcHR5KCl9LHRoaXMuYWx0ZXI9ZnVuY3Rpb24oZSx0LG4sbyxyKXtmLmFsdGVyKGUsdCxuLG8scil9LHRoaXMuZ2V0Q2VsbD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG0udmlldy5nZXRDZWxsQXRDb29yZHMobmV3IGVlKGUsdCksbil9LHRoaXMuZ2V0Q29vcmRzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnZpZXcud3Qud3RUYWJsZS5nZXRDb29yZHMuY2FsbCh0aGlzLnZpZXcud3Qud3RUYWJsZSxlKX0sdGhpcy5jb2xUb1Byb3A9ZnVuY3Rpb24oZSl7cmV0dXJuIGguY29sVG9Qcm9wKGUpfSx0aGlzLnByb3BUb0NvbD1mdW5jdGlvbihlKXtyZXR1cm4gaC5wcm9wVG9Db2woZSl9LHRoaXMuZ2V0RGF0YUF0Q2VsbD1mdW5jdGlvbihlLHQpe3JldHVybiBoLmdldChlLGguY29sVG9Qcm9wKHQpKX0sdGhpcy5nZXREYXRhQXRSb3dQcm9wPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGguZ2V0KGUsdCl9LHRoaXMuZ2V0RGF0YUF0Q29sPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiB0LmNvbmNhdC5hcHBseSh0LGguZ2V0UmFuZ2UobmV3IGVlKDAsZSksbmV3IGVlKGMuc2V0dGluZ3MuZGF0YS5sZW5ndGgtMSxlKSxoLkRFU1RJTkFUSU9OX1JFTkRFUkVSKSl9LHRoaXMuZ2V0RGF0YUF0UHJvcD1mdW5jdGlvbihlKXt2YXIgdCxuPVtdO3JldHVybiB0PWguZ2V0UmFuZ2UobmV3IGVlKDAsaC5wcm9wVG9Db2woZSkpLG5ldyBlZShjLnNldHRpbmdzLmRhdGEubGVuZ3RoLTEsaC5wcm9wVG9Db2woZSkpLGguREVTVElOQVRJT05fUkVOREVSRVIpLG4uY29uY2F0LmFwcGx5KG4sdCl9LHRoaXMuZ2V0U291cmNlRGF0YT1mdW5jdGlvbihlLHQsbixvKXt2YXIgcjtyZXR1cm4gcj12b2lkIDA9PT1lP2QuZ2V0RGF0YSgpOmQuZ2V0QnlSYW5nZShuZXcgZWUoZSx0KSxuZXcgZWUobixvKSl9LHRoaXMuZ2V0U291cmNlRGF0YUF0Q29sPWZ1bmN0aW9uKGUpe3JldHVybiBkLmdldEF0Q29sdW1uKGUpfSx0aGlzLmdldFNvdXJjZURhdGFBdFJvdz1mdW5jdGlvbihlKXtyZXR1cm4gZC5nZXRBdFJvdyhlKX0sdGhpcy5nZXRTb3VyY2VEYXRhQXRDZWxsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGQuZ2V0QXRDZWxsKGUsdCl9LHRoaXMuZ2V0RGF0YUF0Um93PWZ1bmN0aW9uKGUpe3ZhciB0PWguZ2V0UmFuZ2UobmV3IGVlKGUsMCksbmV3IGVlKGUsdGhpcy5jb3VudENvbHMoKS0xKSxoLkRFU1RJTkFUSU9OX1JFTkRFUkVSKTtyZXR1cm4gdFswXX0sdGhpcy5nZXREYXRhVHlwZT1mdW5jdGlvbihlLHQsbixvKXt2YXIgcj10aGlzLGk9bnVsbCxzPW51bGw7dm9pZCAwPT09ZSYmKGU9MCxuPXRoaXMuY291bnRSb3dzKCksdD0wLG89dGhpcy5jb3VudENvbHMoKSksdm9pZCAwPT09biYmKG49ZSksdm9pZCAwPT09byYmKG89dCk7dmFyIGw9Im1peGVkIjtyZXR1cm4gJChNYXRoLm1pbihlLG4pLE1hdGgubWF4KGUsbiksZnVuY3Rpb24oZSl7dmFyIG49ITA7cmV0dXJuICQoTWF0aC5taW4odCxvKSxNYXRoLm1heCh0LG8pLGZ1bmN0aW9uKHQpe3ZhciBvPXIuZ2V0Q2VsbE1ldGEoZSx0KTtyZXR1cm4gcz1vLnR5cGUsaT9uPWk9PT1zOmk9cyxufSksbD1uP3M6Im1peGVkIixufSksbH0sdGhpcy5yZW1vdmVDZWxsTWV0YT1mdW5jdGlvbihlLHQsbil7dmFyIG89bS5nZXRDZWxsTWV0YShlLHQpO3ZvaWQgMCE9b1tuXSYmZGVsZXRlIGMuY2VsbFNldHRpbmdzW2VdW3RdW25dfSx0aGlzLnNldENlbGxNZXRhT2JqZWN0PWZ1bmN0aW9uKGUsdCxuKXtpZigib2JqZWN0Ij09dHlwZW9mIG4pZm9yKHZhciBvIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShvKSl7dmFyIHI9bltvXTt0aGlzLnNldENlbGxNZXRhKGUsdCxvLHIpfX0sdGhpcy5zZXRDZWxsTWV0YT1mdW5jdGlvbihlLHQsbixvKXtjLmNlbGxTZXR0aW5nc1tlXXx8KGMuY2VsbFNldHRpbmdzW2VdPVtdKSxjLmNlbGxTZXR0aW5nc1tlXVt0XXx8KGMuY2VsbFNldHRpbmdzW2VdW3RdPW5ldyBjLmNvbHVtblNldHRpbmdzW3RdKSxjLmNlbGxTZXR0aW5nc1tlXVt0XVtuXT1vLFMuaG9va3MucnVuKG0sImFmdGVyU2V0Q2VsbE1ldGEiLGUsdCxuLG8pfSx0aGlzLmdldENlbGxzTWV0YT1mdW5jdGlvbigpe3JldHVybiBCKGMuY2VsbFNldHRpbmdzKX0sdGhpcy5nZXRDZWxsTWV0YT1mdW5jdGlvbihlLHQpe3ZhciBuLG89aC5jb2xUb1Byb3AodCkscj1lLGk9dDtpZihlPWwoZSksdD1hKHQpLGMuY29sdW1uU2V0dGluZ3NbdF18fChjLmNvbHVtblNldHRpbmdzW3RdPUQodyxjLmNvbHVtbnNTZXR0aW5nQ29uZmxpY3RzKSksYy5jZWxsU2V0dGluZ3NbZV18fChjLmNlbGxTZXR0aW5nc1tlXT1bXSksYy5jZWxsU2V0dGluZ3NbZV1bdF18fChjLmNlbGxTZXR0aW5nc1tlXVt0XT1uZXcgYy5jb2x1bW5TZXR0aW5nc1t0XSksbj1jLmNlbGxTZXR0aW5nc1tlXVt0XSxuLnJvdz1lLG4uY29sPXQsbi52aXN1YWxSb3c9cixuLnZpc3VhbENvbD1pLG4ucHJvcD1vLG4uaW5zdGFuY2U9bSxTLmhvb2tzLnJ1bihtLCJiZWZvcmVHZXRDZWxsTWV0YSIsZSx0LG4pLFcobixzKG4pKSxuLmNlbGxzKXt2YXIgdT1uLmNlbGxzLmNhbGwobixlLHQsbyk7dSYmKFcobix1KSxXKG4scyh1KSkpfXJldHVybiBTLmhvb2tzLnJ1bihtLCJhZnRlckdldENlbGxNZXRhIixlLHQsbiksbn0sdGhpcy5pc0NvbHVtbk1vZGlmaWNhdGlvbkFsbG93ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hKCJvYmplY3QiPT09bS5kYXRhVHlwZXx8bS5nZXRTZXR0aW5ncygpLmNvbHVtbnMpfTt2YXIgeT1KKCJyZW5kZXJlciIpO3RoaXMuZ2V0Q2VsbFJlbmRlcmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG49eS5jYWxsKHRoaXMsZSx0KTtyZXR1cm4gVShuKX0sdGhpcy5nZXRDZWxsRWRpdG9yPUooImVkaXRvciIpLHRoaXMuZ2V0Q2VsbFZhbGlkYXRvcj1KKCJ2YWxpZGF0b3IiKSx0aGlzLnZhbGlkYXRlQ2VsbHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IG47ZSYmKHQub25RdWV1ZUVtcHR5PWUpO2Zvcih2YXIgbz1tLmNvdW50Um93cygpLTE7bz49MDspe2Zvcih2YXIgcj1tLmNvdW50Q29scygpLTE7cj49MDspdC5hZGRWYWxpZGF0b3JUb1F1ZXVlKCksbS52YWxpZGF0ZUNlbGwobS5nZXREYXRhQXRDZWxsKG8sciksbS5nZXRDZWxsTWV0YShvLHIpLGZ1bmN0aW9uKGUpe2lmKCJib29sZWFuIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJWYWxpZGF0aW9uIGVycm9yOiByZXN1bHQgaXMgbm90IGJvb2xlYW4iKTtlPT09ITEmJih0LnZhbGlkPSExKSx0LnJlbW92ZVZhbGlkYXRvckZvcm1RdWV1ZSgpfSwidmFsaWRhdGVDZWxscyIpLHItLTtvLS19dC5jaGVja0lmUXVldWVJc0VtcHR5KCl9LHRoaXMuZ2V0Um93SGVhZGVyPWZ1bmN0aW9uKGUpe3ZhciB0PWMuc2V0dGluZ3Mucm93SGVhZGVycztyZXR1cm4gdm9pZCAwIT09ZSYmKGU9Uy5ob29rcy5ydW4obSwibW9kaWZ5Um93SGVhZGVyIixlKSksdm9pZCAwPT09ZT8odD1bXSwkKG0uY291bnRSb3dzKCktMSxmdW5jdGlvbihlKXt0LnB1c2gobS5nZXRSb3dIZWFkZXIoZSkpfSkpOkFycmF5LmlzQXJyYXkodCkmJnZvaWQgMCE9PXRbZV0/dD10W2VdOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q9dChlKTp0JiYic3RyaW5nIiE9dHlwZW9mIHQmJiJudW1iZXIiIT10eXBlb2YgdCYmKHQ9ZSsxKSx0fSx0aGlzLmhhc1Jvd0hlYWRlcnM9ZnVuY3Rpb24oKXtyZXR1cm4hIWMuc2V0dGluZ3Mucm93SGVhZGVyc30sdGhpcy5oYXNDb2xIZWFkZXJzPWZ1bmN0aW9uKCl7aWYodm9pZCAwIT09Yy5zZXR0aW5ncy5jb2xIZWFkZXJzJiZudWxsIT09Yy5zZXR0aW5ncy5jb2xIZWFkZXJzKXJldHVybiEhYy5zZXR0aW5ncy5jb2xIZWFkZXJzO2Zvcih2YXIgZT0wLHQ9bS5jb3VudENvbHMoKTt0PmU7ZSsrKWlmKG0uZ2V0Q29sSGVhZGVyKGUpKXJldHVybiEwO3JldHVybiExfSx0aGlzLmdldENvbEhlYWRlcj1mdW5jdGlvbihlKXtpZihlPVMuaG9va3MucnVuKG0sIm1vZGlmeUNvbEhlYWRlciIsZSksdm9pZCAwPT09ZSl7Zm9yKHZhciB0PVtdLG49MCxvPW0uY291bnRDb2xzKCk7bz5uO24rKyl0LnB1c2gobS5nZXRDb2xIZWFkZXIobikpO3JldHVybiB0fXZhciByPWU7cmV0dXJuIGU9Uy5ob29rcy5ydW4obSwibW9kaWZ5Q29sIixlKSxjLnNldHRpbmdzLmNvbHVtbnMmJmMuc2V0dGluZ3MuY29sdW1uc1tlXSYmYy5zZXR0aW5ncy5jb2x1bW5zW2VdLnRpdGxlP2Muc2V0dGluZ3MuY29sdW1uc1tlXS50aXRsZTpBcnJheS5pc0FycmF5KGMuc2V0dGluZ3MuY29sSGVhZGVycykmJnZvaWQgMCE9PWMuc2V0dGluZ3MuY29sSGVhZGVyc1tlXT9jLnNldHRpbmdzLmNvbEhlYWRlcnNbZV06ImZ1bmN0aW9uIj09dHlwZW9mIGMuc2V0dGluZ3MuY29sSGVhZGVycz9jLnNldHRpbmdzLmNvbEhlYWRlcnMoZSk6Yy5zZXR0aW5ncy5jb2xIZWFkZXJzJiYic3RyaW5nIiE9dHlwZW9mIGMuc2V0dGluZ3MuY29sSGVhZGVycyYmIm51bWJlciIhPXR5cGVvZiBjLnNldHRpbmdzLmNvbEhlYWRlcnM/UShyKTpjLnNldHRpbmdzLmNvbEhlYWRlcnN9LHRoaXMuX2dldENvbFdpZHRoRnJvbVNldHRpbmdzPWZ1bmN0aW9uKGUpe3ZhciB0PW0uZ2V0Q2VsbE1ldGEoMCxlKSxuPXQud2lkdGg7aWYodm9pZCAwIT09biYmbiE9PWMuc2V0dGluZ3Mud2lkdGh8fChuPXQuY29sV2lkdGhzKSx2b2lkIDAhPT1uJiZudWxsIT09bil7c3dpdGNoKHR5cGVvZiBuKXtjYXNlIm9iamVjdCI6bj1uW2VdO2JyZWFrO2Nhc2UiZnVuY3Rpb24iOm49bihlKX0ic3RyaW5nIj09dHlwZW9mIG4mJihuPXBhcnNlSW50KG4sMTApKX1yZXR1cm4gbn0sdGhpcy5nZXRDb2xXaWR0aD1mdW5jdGlvbihlKXt2YXIgdD1tLl9nZXRDb2xXaWR0aEZyb21TZXR0aW5ncyhlKTtyZXR1cm4gdD1TLmhvb2tzLnJ1bihtLCJtb2RpZnlDb2xXaWR0aCIsdCxlKSx2b2lkIDA9PT10JiYodD1uZS5ERUZBVUxUX1dJRFRIKSx0fSx0aGlzLl9nZXRSb3dIZWlnaHRGcm9tU2V0dGluZ3M9ZnVuY3Rpb24oZSl7dmFyIHQ9Yy5zZXR0aW5ncy5yb3dIZWlnaHRzO2lmKHZvaWQgMCE9PXQmJm51bGwhPT10KXtzd2l0Y2godHlwZW9mIHQpe2Nhc2Uib2JqZWN0Ijp0PXRbZV07YnJlYWs7Y2FzZSJmdW5jdGlvbiI6dD10KGUpfSJzdHJpbmciPT10eXBlb2YgdCYmKHQ9cGFyc2VJbnQodCwxMCkpfXJldHVybiB0fSx0aGlzLmdldFJvd0hlaWdodD1mdW5jdGlvbihlKXt2YXIgdD1tLl9nZXRSb3dIZWlnaHRGcm9tU2V0dGluZ3MoZSk7cmV0dXJuIHQ9Uy5ob29rcy5ydW4obSwibW9kaWZ5Um93SGVpZ2h0Iix0LGUpfSx0aGlzLmNvdW50U291cmNlUm93cz1mdW5jdGlvbigpe3JldHVybiBtLmdldFNvdXJjZURhdGEoKT9tLmdldFNvdXJjZURhdGEoKS5sZW5ndGg6MH0sdGhpcy5jb3VudFJvd3M9ZnVuY3Rpb24oKXtyZXR1cm4gaC5nZXRMZW5ndGgoKX0sdGhpcy5jb3VudENvbHM9ZnVuY3Rpb24oKXtyZXR1cm4ib2JqZWN0Ij09PW0uZGF0YVR5cGV8fCJmdW5jdGlvbiI9PT1tLmRhdGFUeXBlP2Muc2V0dGluZ3MuY29sdW1ucyYmYy5zZXR0aW5ncy5jb2x1bW5zLmxlbmd0aD9jLnNldHRpbmdzLmNvbHVtbnMubGVuZ3RoOmguY29sVG9Qcm9wQ2FjaGUubGVuZ3RoOiJhcnJheSI9PT1tLmRhdGFUeXBlP2Muc2V0dGluZ3MuY29sdW1ucyYmYy5zZXR0aW5ncy5jb2x1bW5zLmxlbmd0aD9jLnNldHRpbmdzLmNvbHVtbnMubGVuZ3RoOmMuc2V0dGluZ3MuZGF0YSYmYy5zZXR0aW5ncy5kYXRhWzBdJiZjLnNldHRpbmdzLmRhdGFbMF0ubGVuZ3RoP2Muc2V0dGluZ3MuZGF0YVswXS5sZW5ndGg6MDp2b2lkIDB9LHRoaXMucm93T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG0udmlldy53dC53dFRhYmxlLmdldEZpcnN0UmVuZGVyZWRSb3coKX0sdGhpcy5jb2xPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbS52aWV3Lnd0Lnd0VGFibGUuZ2V0Rmlyc3RSZW5kZXJlZENvbHVtbigpfSx0aGlzLmNvdW50UmVuZGVyZWRSb3dzPWZ1bmN0aW9uKCl7cmV0dXJuIG0udmlldy53dC5kcmF3bj9tLnZpZXcud3Qud3RUYWJsZS5nZXRSZW5kZXJlZFJvd3NDb3VudCgpOi0xfSx0aGlzLmNvdW50VmlzaWJsZVJvd3M9ZnVuY3Rpb24oKXtyZXR1cm4gbS52aWV3Lnd0LmRyYXduP20udmlldy53dC53dFRhYmxlLmdldFZpc2libGVSb3dzQ291bnQoKTotMX0sdGhpcy5jb3VudFJlbmRlcmVkQ29scz1mdW5jdGlvbigpe3JldHVybiBtLnZpZXcud3QuZHJhd24/bS52aWV3Lnd0Lnd0VGFibGUuZ2V0UmVuZGVyZWRDb2x1bW5zQ291bnQoKTotMX0sdGhpcy5jb3VudFZpc2libGVDb2xzPWZ1bmN0aW9uKCl7cmV0dXJuIG0udmlldy53dC5kcmF3bj9tLnZpZXcud3Qud3RUYWJsZS5nZXRWaXNpYmxlQ29sdW1uc0NvdW50KCk6LTF9LHRoaXMuY291bnRFbXB0eVJvd3M9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49bS5jb3VudFJvd3MoKS0xLG89MDtuPj0wOyl7aWYodD1TLmhvb2tzLnJ1bih0aGlzLCJtb2RpZnlSb3ciLG4pLG0uaXNFbXB0eVJvdyh0KSlvKys7ZWxzZSBpZihlKWJyZWFrO24tLX1yZXR1cm4gb30sdGhpcy5jb3VudEVtcHR5Q29scz1mdW5jdGlvbihlKXtpZihtLmNvdW50Um93cygpPDEpcmV0dXJuIDA7Zm9yKHZhciB0PW0uY291bnRDb2xzKCktMSxuPTA7dD49MDspe2lmKG0uaXNFbXB0eUNvbCh0KSluKys7ZWxzZSBpZihlKWJyZWFrO3QtLX1yZXR1cm4gbn0sdGhpcy5pc0VtcHR5Um93PWZ1bmN0aW9uKGUpe3JldHVybiBjLnNldHRpbmdzLmlzRW1wdHlSb3cuY2FsbChtLGUpfSx0aGlzLmlzRW1wdHlDb2w9ZnVuY3Rpb24oZSl7cmV0dXJuIGMuc2V0dGluZ3MuaXNFbXB0eUNvbC5jYWxsKG0sZSl9LHRoaXMuc2VsZWN0Q2VsbD1mdW5jdGlvbihlLHQsbixvLHIsaSl7dmFyIHM7aWYoaT0idW5kZWZpbmVkIj09dHlwZW9mIGl8fGk9PT0hMCwibnVtYmVyIiE9dHlwZW9mIGV8fDA+ZXx8ZT49bS5jb3VudFJvd3MoKSlyZXR1cm4hMTtpZigibnVtYmVyIiE9dHlwZW9mIHR8fDA+dHx8dD49bS5jb3VudENvbHMoKSlyZXR1cm4hMTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIG4pe2lmKCJudW1iZXIiIT10eXBlb2Ygbnx8MD5ufHxuPj1tLmNvdW50Um93cygpKXJldHVybiExO2lmKCJudW1iZXIiIT10eXBlb2Ygb3x8MD5vfHxvPj1tLmNvdW50Q29scygpKXJldHVybiExOw0KfXJldHVybiBzPW5ldyBlZShlLHQpLGMuc2VsUmFuZ2U9bmV3IHRlKHMscyxzKSxpJiZtLmxpc3RlbigpLCJ1bmRlZmluZWQiPT10eXBlb2Ygbj9wLnNldFJhbmdlRW5kKGMuc2VsUmFuZ2UuZnJvbSxyKTpwLnNldFJhbmdlRW5kKG5ldyBlZShuLG8pLHIpLG0uc2VsZWN0aW9uLmZpbmlzaCgpLCEwfSx0aGlzLnNlbGVjdENlbGxCeVByb3A9ZnVuY3Rpb24oZSx0LG4sbyxyKXtyZXR1cm4gYXJndW1lbnRzWzFdPWgucHJvcFRvQ29sKGFyZ3VtZW50c1sxXSksInVuZGVmaW5lZCIhPXR5cGVvZiBhcmd1bWVudHNbM10mJihhcmd1bWVudHNbM109aC5wcm9wVG9Db2woYXJndW1lbnRzWzNdKSksbS5zZWxlY3RDZWxsLmFwcGx5KG0sYXJndW1lbnRzKX0sdGhpcy5kZXNlbGVjdENlbGw9ZnVuY3Rpb24oKXtwLmRlc2VsZWN0KCl9LHRoaXMuc2Nyb2xsVmlld3BvcnRUbz1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMCE9PWUmJigwPmV8fGU+PW0uY291bnRSb3dzKCkpKXJldHVybiExO2lmKHZvaWQgMCE9PXQmJigwPnR8fHQ+PW0uY291bnRDb2xzKCkpKXJldHVybiExO3ZhciBuPSExO3JldHVybiB2b2lkIDAhPT1lJiZ2b2lkIDAhPT10JiYobS52aWV3Lnd0LnNjcm9sbFZlcnRpY2FsKGUpLG0udmlldy53dC5zY3JvbGxIb3Jpem9udGFsKHQpLG49ITApLCJudW1iZXIiPT10eXBlb2YgZSYmIm51bWJlciIhPXR5cGVvZiB0JiYobS52aWV3Lnd0LnNjcm9sbFZlcnRpY2FsKGUpLG49ITApLCJudW1iZXIiPT10eXBlb2YgdCYmIm51bWJlciIhPXR5cGVvZiBlJiYobS52aWV3Lnd0LnNjcm9sbEhvcml6b250YWwodCksbj0hMCksbn0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7bS5fY2xlYXJUaW1lb3V0cygpLG0udmlldyYmbS52aWV3LmRlc3Ryb3koKSxkJiZkLmRlc3Ryb3koKSxkPW51bGwsTyhtLnJvb3RFbGVtZW50KSx2LmRlc3Ryb3koKSxTLmhvb2tzLnJ1bihtLCJhZnRlckRlc3Ryb3kiKSxTLmhvb2tzLmRlc3Ryb3kobSk7Zm9yKHZhciBlIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShlKSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBtW2VdP21bZV09dToiZ3VpZCIhPT1lJiYobVtlXT1udWxsKSk7aCYmaC5kZXN0cm95KCksaD1udWxsLGM9bnVsbCxmPW51bGwscD1udWxsLGc9bnVsbCxtPW51bGwsdz1udWxsfSx0aGlzLmdldEFjdGl2ZUVkaXRvcj1mdW5jdGlvbigpe3JldHVybiBnLmdldEFjdGl2ZUVkaXRvcigpfSx0aGlzLmdldFBsdWdpbj1mdW5jdGlvbihlKXtyZXR1cm4gWSh0aGlzLGUpfSx0aGlzLmdldEluc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIG19LHRoaXMuYWRkSG9vaz1mdW5jdGlvbihlLHQpe1MuaG9va3MuYWRkKGUsdCxtKX0sdGhpcy5oYXNIb29rPWZ1bmN0aW9uKGUpe3JldHVybiBTLmhvb2tzLmhhcyhlLG0pfSx0aGlzLmFkZEhvb2tPbmNlPWZ1bmN0aW9uKGUsdCl7Uy5ob29rcy5vbmNlKGUsdCxtKX0sdGhpcy5yZW1vdmVIb29rPWZ1bmN0aW9uKGUsdCl7Uy5ob29rcy5yZW1vdmUoZSx0LG0pfSx0aGlzLnJ1bkhvb2tzPWZ1bmN0aW9uKGUsdCxuLG8scixpLHMpe3JldHVybiBTLmhvb2tzLnJ1bihtLGUsdCxuLG8scixpLHMpfSx0aGlzLnRpbWVvdXRzPVtdLHRoaXMuX3JlZ2lzdGVyVGltZW91dD1mdW5jdGlvbihlKXt0aGlzLnRpbWVvdXRzLnB1c2goZSl9LHRoaXMuX2NsZWFyVGltZW91dHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MCx0PXRoaXMudGltZW91dHMubGVuZ3RoO3Q+ZTtlKyspY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dHNbZV0pfSx0aGlzLnZlcnNpb249Uy52ZXJzaW9uLFMuaG9va3MucnVuKG0sImNvbnN0cnVjdCIpfTt2YXIgb2U9ZnVuY3Rpb24oKXt9O29lLnByb3RvdHlwZT17ZGF0YTp2b2lkIDAsZGF0YVNjaGVtYTp2b2lkIDAsd2lkdGg6dm9pZCAwLGhlaWdodDp2b2lkIDAsc3RhcnRSb3dzOjUsc3RhcnRDb2xzOjUscm93SGVhZGVyczp2b2lkIDAsY29sSGVhZGVyczpudWxsLGNvbFdpZHRoczp2b2lkIDAscm93SGVpZ2h0czp2b2lkIDAsY29sdW1uczp2b2lkIDAsY2VsbHM6dm9pZCAwLGNlbGw6W10sY29tbWVudHM6ITEsY3VzdG9tQm9yZGVyczohMSxtaW5Sb3dzOjAsbWluQ29sczowLG1heFJvd3M6MS8wLG1heENvbHM6MS8wLG1pblNwYXJlUm93czowLG1pblNwYXJlQ29sczowLGFsbG93SW5zZXJ0Um93OiEwLGFsbG93SW5zZXJ0Q29sdW1uOiEwLGFsbG93UmVtb3ZlUm93OiEwLGFsbG93UmVtb3ZlQ29sdW1uOiEwLG11bHRpU2VsZWN0OiEwLGZpbGxIYW5kbGU6ITAsZml4ZWRSb3dzVG9wOjAsZml4ZWRSb3dzQm90dG9tOjAsZml4ZWRDb2x1bW5zTGVmdDowLG91dHNpZGVDbGlja0Rlc2VsZWN0czohMCxlbnRlckJlZ2luc0VkaXRpbmc6ITAsZW50ZXJNb3Zlczp7cm93OjEsY29sOjB9LHRhYk1vdmVzOntyb3c6MCxjb2w6MX0sYXV0b1dyYXBSb3c6ITEsYXV0b1dyYXBDb2w6ITEsY29weVJvd3NMaW1pdDoxZTMsY29weUNvbHNMaW1pdDoxZTMscGFzdGVNb2RlOiJvdmVyd3JpdGUiLHBlcnNpc3RlbnRTdGF0ZTp2b2lkIDAsY3VycmVudFJvd0NsYXNzTmFtZTp2b2lkIDAsY3VycmVudENvbENsYXNzTmFtZTp2b2lkIDAsY2xhc3NOYW1lOnZvaWQgMCx0YWJsZUNsYXNzTmFtZTp2b2lkIDAsc3RyZXRjaEg6Im5vbmUiLGlzRW1wdHlSb3c6ZnVuY3Rpb24oZSl7dmFyIHQsbixvLHI7Zm9yKHQ9MCxuPXRoaXMuY291bnRDb2xzKCk7bj50O3QrKylpZihvPXRoaXMuZ2V0RGF0YUF0Q2VsbChlLHQpLCIiIT09byYmbnVsbCE9PW8mJiJ1bmRlZmluZWQiIT10eXBlb2YgbylyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIG8/KHI9dGhpcy5nZXRDZWxsTWV0YShlLHQpLGoodGhpcy5nZXRTY2hlbWEoKVtyLnByb3BdLG8pKTohMTtyZXR1cm4hMH0saXNFbXB0eUNvbDpmdW5jdGlvbihlKXt2YXIgdCxuLG87Zm9yKHQ9MCxuPXRoaXMuY291bnRSb3dzKCk7bj50O3QrKylpZihvPXRoaXMuZ2V0RGF0YUF0Q2VsbCh0LGUpLCIiIT09byYmbnVsbCE9PW8mJiJ1bmRlZmluZWQiIT10eXBlb2YgbylyZXR1cm4hMTtyZXR1cm4hMH0sb2JzZXJ2ZURPTVZpc2liaWxpdHk6ITAsYWxsb3dJbnZhbGlkOiEwLGFsbG93RW1wdHk6ITAsaW52YWxpZENlbGxDbGFzc05hbWU6Imh0SW52YWxpZCIscGxhY2Vob2xkZXI6ITEscGxhY2Vob2xkZXJDZWxsQ2xhc3NOYW1lOiJodFBsYWNlaG9sZGVyIixyZWFkT25seUNlbGxDbGFzc05hbWU6Imh0RGltbWVkIixyZW5kZXJlcjp2b2lkIDAsY29tbWVudGVkQ2VsbENsYXNzTmFtZToiaHRDb21tZW50Q2VsbCIsZnJhZ21lbnRTZWxlY3Rpb246ITEscmVhZE9ubHk6ITEsc2tpcENvbHVtbk9uUGFzdGU6ITEsc2VhcmNoOiExLHR5cGU6InRleHQiLGNvcHlhYmxlOiEwLGVkaXRvcjp2b2lkIDAsYXV0b0NvbXBsZXRlOnZvaWQgMCx2aXNpYmxlUm93czoxMCx0cmltRHJvcGRvd246ITAsZGVidWc6ITEsd29yZFdyYXA6ITAsbm9Xb3JkV3JhcENsYXNzTmFtZToiaHROb1dyYXAiLGNvbnRleHRNZW51OnZvaWQgMCxjb250ZXh0TWVudUNvcHlQYXN0ZTp2b2lkIDAsY29weVBhc3RlOnZvaWQgMCx1bmRvOnZvaWQgMCxjb2x1bW5Tb3J0aW5nOnZvaWQgMCxtYW51YWxDb2x1bW5Nb3ZlOnZvaWQgMCxtYW51YWxDb2x1bW5SZXNpemU6dm9pZCAwLG1hbnVhbFJvd01vdmU6dm9pZCAwLG1hbnVhbFJvd1Jlc2l6ZTp2b2lkIDAsbWVyZ2VDZWxsczohMSx2aWV3cG9ydFJvd1JlbmRlcmluZ09mZnNldDoiYXV0byIsdmlld3BvcnRDb2x1bW5SZW5kZXJpbmdPZmZzZXQ6ImF1dG8iLHZhbGlkYXRvcjp2b2lkIDAsZGlzYWJsZVZpc3VhbFNlbGVjdGlvbjohMSxzb3J0SW5kaWNhdG9yOnZvaWQgMCxtYW51YWxDb2x1bW5GcmVlemU6dm9pZCAwLHRyaW1XaGl0ZXNwYWNlOiEwLHNldHRpbmdzOnZvaWQgMCxzb3VyY2U6dm9pZCAwLHRpdGxlOnZvaWQgMCxjaGVja2VkVGVtcGxhdGU6dm9pZCAwLHVuY2hlY2tlZFRlbXBsYXRlOnZvaWQgMCxsYWJlbDp2b2lkIDAsZm9ybWF0OnZvaWQgMCxsYW5ndWFnZTp2b2lkIDAsc2VsZWN0T3B0aW9uczp2b2lkIDAsYXV0b0NvbHVtblNpemU6dm9pZCAwLGF1dG9Sb3dTaXplOnZvaWQgMCxkYXRlRm9ybWF0OnZvaWQgMCxjb3JyZWN0Rm9ybWF0OiExLGRlZmF1bHREYXRlOnZvaWQgMCxzdHJpY3Q6dm9pZCAwLHJlbmRlckFsbFJvd3M6dm9pZCAwLHByZXZlbnRPdmVyZmxvdzohMSxiaW5kUm93c1dpdGhIZWFkZXJzOnZvaWQgMCxjb2xsYXBzaWJsZUNvbHVtbnM6dm9pZCAwLGNvbHVtblN1bW1hcnk6dm9pZCAwLGRyb3Bkb3duTWVudTp2b2lkIDAsZmlsdGVyczp2b2lkIDAsZ2FudHRDaGFydDp2b2lkIDAsaGVhZGVyVG9vbHRpcHM6dm9pZCAwLGhpZGRlbkNvbHVtbnM6dm9pZCAwLGhpZGRlblJvd3M6dm9pZCAwLG5lc3RlZEhlYWRlcnM6dm9pZCAwLHRyaW1Sb3dzOnZvaWQgMCxyb3dIZWFkZXJXaWR0aDp2b2lkIDAsY29sdW1uSGVhZGVySGVpZ2h0OnZvaWQgMCxvYnNlcnZlQ2hhbmdlczp2b2lkIDAsc29ydEZ1bmN0aW9uOnZvaWQgMCxzb3J0QnlSZWxldmFuY2U6ITAsZmlsdGVyOiEwLGZpbHRlcmluZ0Nhc2VTZW5zaXRpdmU6ITF9LFMuRGVmYXVsdFNldHRpbmdzPW9lfSx7IjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9jYWxjdWxhdG9yL3ZpZXdwb3J0Q29sdW1ucyI6MywiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL2NlbGwvY29vcmRzIjo1LCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY2VsbC9yYW5nZSI6NiwiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL3NlbGVjdGlvbiI6MTgsYnJvd3NlcjoyMyxkYXRhTWFwOjI2LGRhdGFTb3VyY2U6MjcsZWRpdG9yTWFuYWdlcjoyOCxldmVudE1hbmFnZXI6NDEsImhlbHBlcnMvYXJyYXkiOjQyLCJoZWxwZXJzL2Jyb3dzZXIiOjQzLCJoZWxwZXJzL2RhdGEiOjQ0LCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9udW1iZXIiOjUxLCJoZWxwZXJzL29iamVjdCI6NTIsImhlbHBlcnMvc2V0dGluZyI6NTMsImhlbHBlcnMvc3RyaW5nIjo1NCxudW1lcmFsOiJudW1lcmFsIixwbHVnaW5zOjU5LHJlbmRlcmVyczo5Mix0YWJsZVZpZXc6MTAxfV0sMjY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQsbil7dmFyIG89dGhpczt0aGlzLmluc3RhbmNlPWUsdGhpcy5wcml2PXQsdGhpcy5HcmlkU2V0dGluZ3M9bix0aGlzLmRhdGFTb3VyY2U9dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5ncygpLmRhdGEsdGhpcy5jYWNoZWRMZW5ndGg9bnVsbCx0aGlzLmxhdGVzdFNvdXJjZVJvd3NDb3VudD0wLHRoaXMuZGF0YVNvdXJjZVswXT90aGlzLmR1Y2tTY2hlbWE9dGhpcy5yZWN1cnNpdmVEdWNrU2NoZW1hKHRoaXMuZGF0YVNvdXJjZVswXSk6dGhpcy5kdWNrU2NoZW1hPXt9LHRoaXMuY3JlYXRlTWFwKCksdGhpcy5pbnRlcnZhbD1TLmNyZWF0ZShmdW5jdGlvbigpe3JldHVybiBvLmNsZWFyTGVuZ3RoQ2FjaGUoKX0sIjE1ZnBzIil9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7RGF0YU1hcDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgcixpLHMsbCxhLHUsYyxoLGQsZj0ocj1lKCJicm93c2VyIiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KVsiZGVmYXVsdCJdLHA9KGk9ZSgiU2hlZXRDbGlwIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KVsiZGVmYXVsdCJdLGc9KHM9ZSgiaGVscGVycy9kYXRhIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5jZWxsTWV0aG9kTG9va3VwRmFjdG9yeSxtPShsPWUoImhlbHBlcnMvc2V0dGluZyIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSkuY29sdW1uRmFjdG9yeSx3PShhPWUoImhlbHBlcnMvb2JqZWN0IiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KSx2PXcuZHVja1NjaGVtYSx5PXcuZGVlcEV4dGVuZCxiPXcuZGVlcENsb25lLEM9KHU9ZSgiaGVscGVycy9hcnJheSIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSksXz1DLmV4dGVuZEFycmF5LFI9Qy50bzJkQXJyYXksUz0oYz1lKCJ1dGlscy9pbnRlcnZhbCIpLGMmJmMuX19lc01vZHVsZSYmY3x8eyJkZWZhdWx0IjpjfSkuSW50ZXJ2YWwsRT0oaD1lKCJoZWxwZXJzL251bWJlciIpLGgmJmguX19lc01vZHVsZSYmaHx8eyJkZWZhdWx0IjpofSkucmFuZ2VFYWNoLFQ9KGQ9ZSgibXVsdGlNYXAiKSxkJiZkLl9fZXNNb2R1bGUmJmR8fHsiZGVmYXVsdCI6ZH0pLk11bHRpTWFwO28ucHJvdG90eXBlLkRFU1RJTkFUSU9OX1JFTkRFUkVSPTEsby5wcm90b3R5cGUuREVTVElOQVRJT05fQ0xJUEJPQVJEX0dFTkVSQVRPUj0yLG8ucHJvdG90eXBlLnJlY3Vyc2l2ZUR1Y2tTY2hlbWE9ZnVuY3Rpb24oZSl7cmV0dXJuIHYoZSl9LG8ucHJvdG90eXBlLnJlY3Vyc2l2ZUR1Y2tDb2x1bW5zPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbyxyO2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgdCYmKHQ9MCxuPSIiKSwib2JqZWN0Ij09dHlwZW9mIGUmJiFBcnJheS5pc0FycmF5KGUpKWZvcihyIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShyKSYmKG51bGw9PT1lW3JdPyhvPW4rcix0aGlzLmNvbFRvUHJvcENhY2hlLnB1c2gobyksdGhpcy5wcm9wVG9Db2xDYWNoZS5zZXQobyx0KSx0KyspOnQ9dGhpcy5yZWN1cnNpdmVEdWNrQ29sdW1ucyhlW3JdLHQscisiLiIpKTtyZXR1cm4gdH0sby5wcm90b3R5cGUuY3JlYXRlTWFwPWZ1bmN0aW9uKCl7dmFyIGUsdCxuPXRoaXMuZ2V0U2NoZW1hKCk7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigidHJ5aW5nIHRvIGNyZWF0ZSBgY29sdW1uc2AgZGVmaW5pdGlvbiBidXQgeW91IGRpZG50JyBwcm92aWRlIGBzY2hlbWFgIG5vciBgZGF0YWAiKTt0aGlzLmNvbFRvUHJvcENhY2hlPVtdLHRoaXMucHJvcFRvQ29sQ2FjaGU9bmV3IFQ7dmFyIG89dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5ncygpLmNvbHVtbnM7aWYobylmb3IoZT0wLHQ9by5sZW5ndGg7dD5lO2UrKykidW5kZWZpbmVkIiE9dHlwZW9mIG9bZV0uZGF0YSYmKHRoaXMuY29sVG9Qcm9wQ2FjaGVbZV09b1tlXS5kYXRhLHRoaXMucHJvcFRvQ29sQ2FjaGUuc2V0KG9bZV0uZGF0YSxlKSk7ZWxzZSB0aGlzLnJlY3Vyc2l2ZUR1Y2tDb2x1bW5zKG4pfSxvLnByb3RvdHlwZS5jb2xUb1Byb3A9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9Zi5ob29rcy5ydW4odGhpcy5pbnN0YW5jZSwibW9kaWZ5Q29sIixlKSx0aGlzLmNvbFRvUHJvcENhY2hlJiYidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuY29sVG9Qcm9wQ2FjaGVbZV0/dGhpcy5jb2xUb1Byb3BDYWNoZVtlXTplfSxvLnByb3RvdHlwZS5wcm9wVG9Db2w9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHQ9InVuZGVmaW5lZCI9PXR5cGVvZiB0aGlzLnByb3BUb0NvbENhY2hlLmdldChlKT9lOnRoaXMucHJvcFRvQ29sQ2FjaGUuZ2V0KGUpLHQ9Zi5ob29rcy5ydW4odGhpcy5pbnN0YW5jZSwidW5tb2RpZnlDb2wiLHQpfSxvLnByb3RvdHlwZS5nZXRTY2hlbWE9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmluc3RhbmNlLmdldFNldHRpbmdzKCkuZGF0YVNjaGVtYTtyZXR1cm4gZT8iZnVuY3Rpb24iPT10eXBlb2YgZT9lKCk6ZTp0aGlzLmR1Y2tTY2hlbWF9LG8ucHJvdG90eXBlLmNyZWF0ZVJvdz1mdW5jdGlvbihlLHQsbil7dmFyIG8scixpPXRoaXMuaW5zdGFuY2UuY291bnRDb2xzKCkscz0wO3R8fCh0PTEpLCgibnVtYmVyIiE9dHlwZW9mIGV8fGU+PXRoaXMuaW5zdGFuY2UuY291bnRTb3VyY2VSb3dzKCkpJiYoZT10aGlzLmluc3RhbmNlLmNvdW50U291cmNlUm93cygpKSxyPWU7Zm9yKHZhciBsPXRoaXMuaW5zdGFuY2UuZ2V0U2V0dGluZ3MoKS5tYXhSb3dzO3Q+cyYmdGhpcy5pbnN0YW5jZS5jb3VudFNvdXJjZVJvd3MoKTxsOykiYXJyYXkiPT09dGhpcy5pbnN0YW5jZS5kYXRhVHlwZT90aGlzLmluc3RhbmNlLmdldFNldHRpbmdzKCkuZGF0YVNjaGVtYT9vPWIodGhpcy5nZXRTY2hlbWEoKSk6KG89W10sRShpLTEsZnVuY3Rpb24oKXtyZXR1cm4gby5wdXNoKG51bGwpfSkpOiJmdW5jdGlvbiI9PT10aGlzLmluc3RhbmNlLmRhdGFUeXBlP289dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5ncygpLmRhdGFTY2hlbWEoZSk6KG89e30seShvLHRoaXMuZ2V0U2NoZW1hKCkpKSxlPT09dGhpcy5pbnN0YW5jZS5jb3VudFNvdXJjZVJvd3MoKT90aGlzLmRhdGFTb3VyY2UucHVzaChvKTp0aGlzLmRhdGFTb3VyY2Uuc3BsaWNlKGUsMCxvKSxzKysscisrO3JldHVybiBmLmhvb2tzLnJ1bih0aGlzLmluc3RhbmNlLCJhZnRlckNyZWF0ZVJvdyIsZSxzLG4pLHRoaXMuaW5zdGFuY2UuZm9yY2VGdWxsUmVuZGVyPSEwLHN9LG8ucHJvdG90eXBlLmNyZWF0ZUNvbD1mdW5jdGlvbihlLHQsbil7aWYoIXRoaXMuaW5zdGFuY2UuaXNDb2x1bW5Nb2RpZmljYXRpb25BbGxvd2VkKCkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY3JlYXRlIG5ldyBjb2x1bW4uIFdoZW4gZGF0YSBzb3VyY2UgaW4gYW4gb2JqZWN0LCB5b3UgY2FuIG9ubHkgaGF2ZSBhcyBtdWNoIGNvbHVtbnMgYXMgZGVmaW5lZCBpbiBmaXJzdCBkYXRhIHJvdywgZGF0YSBzY2hlbWEgb3IgaW4gdGhlICdjb2x1bW5zJyBzZXR0aW5nLklmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gYWRkIG5ldyBjb2x1bW5zLCB5b3UgaGF2ZSB0byB1c2UgYXJyYXkgZGF0YXNvdXJjZS4iKTt2YXIgbyxyLGk9dGhpcy5pbnN0YW5jZS5jb3VudFNvdXJjZVJvd3MoKSxzPXRoaXMuZGF0YVNvdXJjZSxsPTA7dHx8KHQ9MSksKCJudW1iZXIiIT10eXBlb2YgZXx8ZT49dGhpcy5pbnN0YW5jZS5jb3VudENvbHMoKSkmJihlPXRoaXMuaW5zdGFuY2UuY291bnRDb2xzKCkpLHI9ZTtmb3IodmFyIGE9dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5ncygpLm1heENvbHM7dD5sJiZ0aGlzLmluc3RhbmNlLmNvdW50Q29scygpPGE7KXtpZihvPW0odGhpcy5HcmlkU2V0dGluZ3MsdGhpcy5wcml2LmNvbHVtbnNTZXR0aW5nQ29uZmxpY3RzKSwibnVtYmVyIiE9dHlwZW9mIGV8fGU+PXRoaXMuaW5zdGFuY2UuY291bnRDb2xzKCkpe2Zvcih2YXIgdT0wO2k+dTt1KyspInVuZGVmaW5lZCI9PXR5cGVvZiBzW3VdJiYoc1t1XT1bXSksc1t1XS5wdXNoKG51bGwpO3RoaXMucHJpdi5jb2x1bW5TZXR0aW5ncy5wdXNoKG8pfWVsc2V7Zm9yKHZhciB1PTA7aT51O3UrKylzW3VdLnNwbGljZShyLDAsbnVsbCk7dGhpcy5wcml2LmNvbHVtblNldHRpbmdzLnNwbGljZShyLDAsbyl9bCsrLHIrK31yZXR1cm4gZi5ob29rcy5ydW4odGhpcy5pbnN0YW5jZSwiYWZ0ZXJDcmVhdGVDb2wiLGUsbCxuKSx0aGlzLmluc3RhbmNlLmZvcmNlRnVsbFJlbmRlcj0hMCxsfSxvLnByb3RvdHlwZS5yZW1vdmVSb3c9ZnVuY3Rpb24oZSx0KXt0fHwodD0xKSwibnVtYmVyIiE9dHlwZW9mIGUmJihlPS10KSxlPSh0aGlzLmluc3RhbmNlLmNvdW50U291cmNlUm93cygpK2UpJXRoaXMuaW5zdGFuY2UuY291bnRTb3VyY2VSb3dzKCk7dmFyIG49dGhpcy5waHlzaWNhbFJvd3NUb0xvZ2ljYWwoZSx0KSxvPShuLnNsaWNlKDApLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC1lfSksZi5ob29rcy5ydW4odGhpcy5pbnN0YW5jZSwiYmVmb3JlUmVtb3ZlUm93IixlLHQsbikpO2lmKG8hPT0hMSl7dmFyIHIsaT10aGlzLmRhdGFTb3VyY2U7cj1pLmZpbHRlcihmdW5jdGlvbihlLHQpe3JldHVybi0xPT1uLmluZGV4T2YodCl9KSxpLmxlbmd0aD0wLEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGksciksZi5ob29rcy5ydW4odGhpcy5pbnN0YW5jZSwiYWZ0ZXJSZW1vdmVSb3ciLGUsdCxuKSx0aGlzLmluc3RhbmNlLmZvcmNlRnVsbFJlbmRlcj0hMH19LG8ucHJvdG90eXBlLnJlbW92ZUNvbD1mdW5jdGlvbihlLHQpe2lmKCJvYmplY3QiPT09dGhpcy5pbnN0YW5jZS5kYXRhVHlwZXx8dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5ncygpLmNvbHVtbnMpdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgcmVtb3ZlIGNvbHVtbiB3aXRoIG9iamVjdCBkYXRhIHNvdXJjZSBvciBjb2x1bW5zIG9wdGlvbiBzcGVjaWZpZWQiKTt0fHwodD0xKSwibnVtYmVyIiE9dHlwZW9mIGUmJihlPS10KSxlPSh0aGlzLmluc3RhbmNlLmNvdW50Q29scygpK2UpJXRoaXMuaW5zdGFuY2UuY291bnRDb2xzKCk7dmFyIG49dGhpcy5waHlzaWNhbENvbHVtbnNUb0xvZ2ljYWwoZSx0KSxvPW4uc2xpY2UoMCkuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiB0LWV9KSxyPWYuaG9va3MucnVuKHRoaXMuaW5zdGFuY2UsImJlZm9yZVJlbW92ZUNvbCIsZSx0LG4pO2lmKHIhPT0hMSl7Zm9yKHZhciBpPSEwLHM9by5sZW5ndGgsbD10aGlzLmRhdGFTb3VyY2UsYT0wO3M+YTthKyspaSYmblswXSE9PW5bYV0tYSYmKGk9ITEpO2lmKGkpZm9yKHZhciB1PTAsYz10aGlzLmluc3RhbmNlLmNvdW50U291cmNlUm93cygpO2M+dTt1KyspbFt1XS5zcGxpY2UoblswXSx0KTtlbHNle2Zvcih2YXIgaD0wLGQ9dGhpcy5pbnN0YW5jZS5jb3VudFNvdXJjZVJvd3MoKTtkPmg7aCsrKWZvcih2YXIgcD0wO3M+cDtwKyspbFtoXS5zcGxpY2Uob1twXSwxKTtmb3IodmFyIGc9MDtzPmc7ZysrKXRoaXMucHJpdi5jb2x1bW5TZXR0aW5ncy5zcGxpY2UobltnXSwxKX1mLmhvb2tzLnJ1bih0aGlzLmluc3RhbmNlLCJhZnRlclJlbW92ZUNvbCIsZSx0KSx0aGlzLmluc3RhbmNlLmZvcmNlRnVsbFJlbmRlcj0hMH19LG8ucHJvdG90eXBlLnNwbGljZUNvbD1mdW5jdGlvbihlLHQsbil7dmFyIG89NDw9YXJndW1lbnRzLmxlbmd0aD9bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTpbXSxyPXRoaXMuaW5zdGFuY2UuZ2V0RGF0YUF0Q29sKGUpLGk9ci5zbGljZSh0LHQrbikscz1yLnNsaWNlKHQrbik7XyhvLHMpO2Zvcih2YXIgbD0wO24+bDspby5wdXNoKG51bGwpLGwrKztyZXR1cm4gUihvKSx0aGlzLmluc3RhbmNlLnBvcHVsYXRlRnJvbUFycmF5KHQsZSxvLG51bGwsbnVsbCwic3BsaWNlQ29sIiksaX0sby5wcm90b3R5cGUuc3BsaWNlUm93PWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz00PD1hcmd1bWVudHMubGVuZ3RoP1tdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpOltdLHI9dGhpcy5pbnN0YW5jZS5nZXRTb3VyY2VEYXRhQXRSb3coZSksaT1yLnNsaWNlKHQsdCtuKSxzPXIuc2xpY2UodCtuKTtfKG8scyk7Zm9yKHZhciBsPTA7bj5sOylvLnB1c2gobnVsbCksbCsrO3JldHVybiB0aGlzLmluc3RhbmNlLnBvcHVsYXRlRnJvbUFycmF5KGUsdCxbb10sbnVsbCxudWxsLCJzcGxpY2VSb3ciKSxpfSxvLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSx0KXtlPWYuaG9va3MucnVuKHRoaXMuaW5zdGFuY2UsIm1vZGlmeVJvdyIsZSk7dmFyIG49dGhpcy5kYXRhU291cmNlW2VdO2lmKG4mJm4uaGFzT3duUHJvcGVydHkmJm4uaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIG5bdF07aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi4iKT4tMSl7dmFyIG89dC5zcGxpdCgiLiIpLHI9bjtpZighcilyZXR1cm4gbnVsbDtmb3IodmFyIGk9MCxzPW8ubGVuZ3RoO3M+aTtpKyspaWYocj1yW29baV1dLCJ1bmRlZmluZWQiPT10eXBlb2YgcilyZXR1cm4gbnVsbDtyZXR1cm4gcn1yZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90KHRoaXMuZGF0YVNvdXJjZS5zbGljZShlLGUrMSlbMF0pOm51bGx9O3ZhciBNPWcoImNvcHlhYmxlIiwhMSk7by5wcm90b3R5cGUuZ2V0Q29weWFibGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTS5jYWxsKHRoaXMuaW5zdGFuY2UsZSx0aGlzLnByb3BUb0NvbCh0KSk/dGhpcy5nZXQoZSx0KToiIn0sby5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGUsdCxuLG8pe2U9Zi5ob29rcy5ydW4odGhpcy5pbnN0YW5jZSwibW9kaWZ5Um93IixlLG98fCJkYXRhbWFwR2V0Iik7dmFyIHI9dGhpcy5kYXRhU291cmNlW2VdO2lmKHImJnIuaGFzT3duUHJvcGVydHkmJnIuaGFzT3duUHJvcGVydHkodCkpclt0XT1uO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi4iKT4tMSl7Zm9yKHZhciBpPXQuc3BsaXQoIi4iKSxzPXIsbD0wLGE9aS5sZW5ndGgtMTthPmw7bCsrKSJ1bmRlZmluZWQiPT10eXBlb2Ygc1tpW2xdXSYmKHNbaVtsXV09e30pLHM9c1tpW2xdXTtzW2lbbF1dPW59ZWxzZSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QodGhpcy5kYXRhU291cmNlLnNsaWNlKGUsZSsxKVswXSxuKTpyW3RdPW59LG8ucHJvdG90eXBlLnBoeXNpY2FsUm93c1RvTG9naWNhbD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbixvPXRoaXMuaW5zdGFuY2UuY291bnRTb3VyY2VSb3dzKCkscj0obytlKSVvLGk9W10scz10O28+ciYmczspbj1mLmhvb2tzLnJ1bih0aGlzLmluc3RhbmNlLCJtb2RpZnlSb3ciLHIpLGkucHVzaChuKSxzLS0scisrO3JldHVybiBpfSxvLnByb3RvdHlwZS5waHlzaWNhbENvbHVtbnNUb0xvZ2ljYWw9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dGhpcy5pbnN0YW5jZS5jb3VudENvbHMoKSxvPShuK2UpJW4scj1bXSxpPXQ7bj5vJiZpOyl7dmFyIHM9Zi5ob29rcy5ydW4odGhpcy5pbnN0YW5jZSwibW9kaWZ5Q29sIixvKTtyLnB1c2gocyksaS0tLG8rK31yZXR1cm4gcn0sby5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuaW5zdGFuY2UuY291bnRTb3VyY2VSb3dzKCk7ZSsrKWZvcih2YXIgdD0wO3Q8dGhpcy5pbnN0YW5jZS5jb3VudENvbHMoKTt0KyspdGhpcy5zZXQoZSx0aGlzLmNvbFRvUHJvcCh0KSwiIil9LG8ucHJvdG90eXBlLmNsZWFyTGVuZ3RoQ2FjaGU9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlZExlbmd0aD1udWxsfSxvLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5pbnN0YW5jZS5jb3VudFNvdXJjZVJvd3MoKTtpZihmLmhvb2tzLmhhcygibW9kaWZ5Um93Iix0aGlzLmluc3RhbmNlKSl7dmFyIG49ITE7dGhpcy5pbnRlcnZhbC5zdGFydCgpLHQhPT10aGlzLmxhdGVzdFNvdXJjZVJvd3NDb3VudCYmKG49ITApLHRoaXMubGF0ZXN0U291cmNlUm93c0NvdW50PXQsbnVsbD09PXRoaXMuY2FjaGVkTGVuZ3RofHxuPyhFKHQtMSxmdW5jdGlvbihuKXtuPWYuaG9va3MucnVuKGUuaW5zdGFuY2UsIm1vZGlmeVJvdyIsbiksbnVsbD09PW4mJi0tdH0pLHRoaXMuY2FjaGVkTGVuZ3RoPXQpOnQ9dGhpcy5jYWNoZWRMZW5ndGh9ZWxzZSB0aGlzLmludGVydmFsLnN0b3AoKTtyZXR1cm4gdH0sby5wcm90b3R5cGUuZ2V0QWxsPWZ1bmN0aW9uKCl7dmFyIGU9e3JvdzowLGNvbDowfSx0PXtyb3c6TWF0aC5tYXgodGhpcy5pbnN0YW5jZS5jb3VudFNvdXJjZVJvd3MoKS0xLDApLGNvbDpNYXRoLm1heCh0aGlzLmluc3RhbmNlLmNvdW50Q29scygpLTEsMCl9O3JldHVybiBlLnJvdy10LnJvdyE9PTB8fHRoaXMuaW5zdGFuY2UuY291bnRTb3VyY2VSb3dzKCk/dGhpcy5nZXRSYW5nZShlLHQsby5wcm90b3R5cGUuREVTVElOQVRJT05fUkVOREVSRVIpOltdfSxvLnByb3RvdHlwZS5nZXRSYW5nZT1mdW5jdGlvbihlLHQsbil7dmFyIG8scixpLHMsbCxhPVtdLHU9bj09PXRoaXMuREVTVElOQVRJT05fQ0xJUEJPQVJEX0dFTkVSQVRPUj90aGlzLmdldENvcHlhYmxlOnRoaXMuZ2V0O2ZvcihyPU1hdGgubWF4KGUucm93LHQucm93KSxzPU1hdGgubWF4KGUuY29sLHQuY29sKSxvPU1hdGgubWluKGUucm93LHQucm93KTtyPj1vO28rKyl7bD1bXTt2YXIgYz1mLmhvb2tzLnJ1bih0aGlzLmluc3RhbmNlLCJtb2RpZnlSb3ciLG8pO2ZvcihpPU1hdGgubWluKGUuY29sLHQuY29sKTtzPj1pO2krKyl7aWYobnVsbD09PWMpYnJlYWs7bC5wdXNoKHUuY2FsbCh0aGlzLG8sdGhpcy5jb2xUb1Byb3AoaSkpKX1udWxsIT09YyYmYS5wdXNoKGwpfXJldHVybiBhfSxvLnByb3RvdHlwZS5nZXRUZXh0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHAuc3RyaW5naWZ5KHRoaXMuZ2V0UmFuZ2UoZSx0LHRoaXMuREVTVElOQVRJT05fUkVOREVSRVIpKX0sby5wcm90b3R5cGUuZ2V0Q29weWFibGVUZXh0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHAuc3RyaW5naWZ5KHRoaXMuZ2V0UmFuZ2UoZSx0LHRoaXMuREVTVElOQVRJT05fQ0xJUEJPQVJEX0dFTkVSQVRPUikpfSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5pbnRlcnZhbC5zdG9wKCksdGhpcy5pbnRlcnZhbD1udWxsLHRoaXMuaW5zdGFuY2U9bnVsbCx0aGlzLnByaXY9bnVsbCx0aGlzLkdyaWRTZXR0aW5ncz1udWxsLHRoaXMuZGF0YVNvdXJjZT1udWxsLHRoaXMuY2FjaGVkTGVuZ3RoPW51bGwsdGhpcy5kdWNrU2NoZW1hPW51bGx9fSx7U2hlZXRDbGlwOiJTaGVldENsaXAiLGJyb3dzZXI6MjMsImhlbHBlcnMvYXJyYXkiOjQyLCJoZWxwZXJzL2RhdGEiOjQ0LCJoZWxwZXJzL251bWJlciI6NTEsImhlbHBlcnMvb2JqZWN0Ijo1MiwiaGVscGVycy9zZXR0aW5nIjo1MyxtdWx0aU1hcDo1NywidXRpbHMvaW50ZXJ2YWwiOjEwM31dLDI3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0RhdGFTb3VyY2U6e2dldDpmdW5jdGlvbigpe3JldHVybiBmfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpLHMsbCxhPSgobz1lKCJoZWxwZXJzL2RhdGEiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pLmNlbGxNZXRob2RMb29rdXBGYWN0b3J5LChyPWUoImhlbHBlcnMvc2V0dGluZyIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkuY29sdW1uRmFjdG9yeSxpPWUoImhlbHBlcnMvb2JqZWN0IiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KSx1PShhLmR1Y2tTY2hlbWEsYS5kZWVwRXh0ZW5kLGEuZ2V0UHJvcGVydHkpLGM9KHM9ZSgiaGVscGVycy9hcnJheSIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSksaD0oYy5leHRlbmRBcnJheSxjLmFycmF5RWFjaCksZD0obD1lKCJoZWxwZXJzL251bWJlciIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSkucmFuZ2VFYWNoLGY9ZnVuY3Rpb24oZSl7dmFyIHQ9dm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbXTt0aGlzLmhvdD1lLHRoaXMuZGF0YT10LHRoaXMuZGF0YVR5cGU9ImFycmF5Iix0aGlzLmNvbFRvUHJvcD1mdW5jdGlvbigpe30sdGhpcy5wcm9wVG9Db2w9ZnVuY3Rpb24oKXt9fTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoZix7Z2V0RGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGF9LHNldERhdGE6ZnVuY3Rpb24oZSl7dGhpcy5kYXRhPWV9LGdldEF0Q29sdW1uOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1bXTtyZXR1cm4gaCh0aGlzLmRhdGEsZnVuY3Rpb24obyl7dmFyIHI9dC5jb2xUb1Byb3AoZSk7bz0ic3RyaW5nIj09dHlwZW9mIHI/dShvLHIpOm9bcl0sbi5wdXNoKG8pfSksbn0sZ2V0QXRSb3c6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZGF0YVtlXX0sZ2V0QXRDZWxsOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZGF0YVtlXVt0aGlzLmNvbFRvUHJvcCh0KV19LGdldEJ5UmFuZ2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLG89TWF0aC5taW4oZS5yb3csdC5yb3cpLHI9TWF0aC5taW4oZS5jb2wsdC5jb2wpLGk9TWF0aC5tYXgoZS5yb3csdC5yb3cpLHM9TWF0aC5tYXgoZS5jb2wsdC5jb2wpLGw9W107cmV0dXJuIGQobyxpLGZ1bmN0aW9uKGUpe3ZhciB0LG89bi5nZXRBdFJvdyhlKTsiYXJyYXkiPT09bi5kYXRhVHlwZT90PW8uc2xpY2UocixzKToib2JqZWN0Ij09PW4uZGF0YVR5cGUmJih0PXt9LGQocixzLGZ1bmN0aW9uKGUpe3ZhciByPW4uY29sVG9Qcm9wKGUpO3Rbcl09b1tyXX0pKSxsLnB1c2godCl9KSxsfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5kYXRhPW51bGwsdGhpcy5ob3Q9bnVsbH19LHt9KX0seyJoZWxwZXJzL2FycmF5Ijo0MiwiaGVscGVycy9kYXRhIjo0NCwiaGVscGVycy9udW1iZXIiOjUxLCJoZWxwZXJzL29iamVjdCI6NTIsImhlbHBlcnMvc2V0dGluZyI6NTN9XSwyODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCxuKXtmdW5jdGlvbiBvKGUpe3ZhciBvPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnNldHRpbmdzLmVudGVyTW92ZXM/dC5zZXR0aW5ncy5lbnRlck1vdmVzKGV2ZW50KTp0LnNldHRpbmdzLmVudGVyTW92ZXM7ZT9uLnRyYW5zZm9ybVN0YXJ0KC1vLnJvdywtby5jb2wpOm4udHJhbnNmb3JtU3RhcnQoby5yb3csby5jb2wsITApfWZ1bmN0aW9uIHIoZSl7ZT9uLnRyYW5zZm9ybUVuZCgtMSwwKTpuLnRyYW5zZm9ybVN0YXJ0KC0xLDApfWZ1bmN0aW9uIGkoZSl7ZT9uLnRyYW5zZm9ybUVuZCgxLDApOm4udHJhbnNmb3JtU3RhcnQoMSwwKX1mdW5jdGlvbiBzKGUpe2U/bi50cmFuc2Zvcm1FbmQoMCwxKTpuLnRyYW5zZm9ybVN0YXJ0KDAsMSl9ZnVuY3Rpb24gbChlKXtlP24udHJhbnNmb3JtRW5kKDAsLTEpOm4udHJhbnNmb3JtU3RhcnQoMCwtMSl9ZnVuY3Rpb24gYShhKXt2YXIgdSxkO2lmKGUuaXNMaXN0ZW5pbmcoKSYmKGMuaG9va3MucnVuKGUsImJlZm9yZUtleURvd24iLGEpLCFfJiYheShhKSYmKHQubGFzdEtleUNvZGU9YS5rZXlDb2RlLG4uaXNTZWxlY3RlZCgpKSkpe2lmKHU9KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmIWEuYWx0S2V5LG0mJiFtLmlzV2FpdGluZygpJiYhKHAoYS5rZXlDb2RlKXx8ZyhhLmtleUNvZGUpfHx1fHxDLmlzRWRpdG9yT3BlbmVkKCkpKXJldHVybiB2b2lkIEMub3BlbkVkaXRvcigiIixhKTtzd2l0Y2goZD1hLnNoaWZ0S2V5P24uc2V0UmFuZ2VFbmQ6bi5zZXRSYW5nZVN0YXJ0LGEua2V5Q29kZSl7Y2FzZSBmLkE6IUMuaXNFZGl0b3JPcGVuZWQoKSYmdSYmKG4uc2VsZWN0QWxsKCksYS5wcmV2ZW50RGVmYXVsdCgpLHcoYSkpO2JyZWFrO2Nhc2UgZi5BUlJPV19VUDpDLmlzRWRpdG9yT3BlbmVkKCkmJiFtLmlzV2FpdGluZygpJiZDLmNsb3NlRWRpdG9yQW5kU2F2ZUNoYW5nZXModSkscihhLnNoaWZ0S2V5KSxhLnByZXZlbnREZWZhdWx0KCksdyhhKTticmVhaztjYXNlIGYuQVJST1dfRE9XTjpDLmlzRWRpdG9yT3BlbmVkKCkmJiFtLmlzV2FpdGluZygpJiZDLmNsb3NlRWRpdG9yQW5kU2F2ZUNoYW5nZXModSksaShhLnNoaWZ0S2V5KSxhLnByZXZlbnREZWZhdWx0KCksdyhhKTticmVhaztjYXNlIGYuQVJST1dfUklHSFQ6Qy5pc0VkaXRvck9wZW5lZCgpJiYhbS5pc1dhaXRpbmcoKSYmQy5jbG9zZUVkaXRvckFuZFNhdmVDaGFuZ2VzKHUpLHMoYS5zaGlmdEtleSksYS5wcmV2ZW50RGVmYXVsdCgpLHcoYSk7YnJlYWs7Y2FzZSBmLkFSUk9XX0xFRlQ6Qy5pc0VkaXRvck9wZW5lZCgpJiYhbS5pc1dhaXRpbmcoKSYmQy5jbG9zZUVkaXRvckFuZFNhdmVDaGFuZ2VzKHUpLGwoYS5zaGlmdEtleSksYS5wcmV2ZW50RGVmYXVsdCgpLHcoYSk7YnJlYWs7Y2FzZSBmLlRBQjp2YXIgYj0iZnVuY3Rpb24iPT10eXBlb2YgdC5zZXR0aW5ncy50YWJNb3Zlcz90LnNldHRpbmdzLnRhYk1vdmVzKGEpOnQuc2V0dGluZ3MudGFiTW92ZXM7YS5zaGlmdEtleT9uLnRyYW5zZm9ybVN0YXJ0KC1iLnJvdywtYi5jb2wpOm4udHJhbnNmb3JtU3RhcnQoYi5yb3csYi5jb2wsITApLGEucHJldmVudERlZmF1bHQoKSx3KGEpO2JyZWFrO2Nhc2UgZi5CQUNLU1BBQ0U6Y2FzZSBmLkRFTEVURTpuLmVtcHR5KGEpLEMucHJlcGFyZUVkaXRvcigpLGEucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIGYuRjI6Qy5vcGVuRWRpdG9yKG51bGwsYSksbSYmbS5lbmFibGVGdWxsRWRpdE1vZGUoKSxhLnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSBmLkVOVEVSOkMuaXNFZGl0b3JPcGVuZWQoKT8obSYmbS5zdGF0ZSE9PWMuRWRpdG9yU3RhdGUuV0FJVElORyYmQy5jbG9zZUVkaXRvckFuZFNhdmVDaGFuZ2VzKHUpLG8oYS5zaGlmdEtleSkpOmUuZ2V0U2V0dGluZ3MoKS5lbnRlckJlZ2luc0VkaXRpbmc/KEMub3BlbkVkaXRvcihudWxsLGEpLG0mJm0uZW5hYmxlRnVsbEVkaXRNb2RlKCkpOm8oYS5zaGlmdEtleSksYS5wcmV2ZW50RGVmYXVsdCgpLHYoYSk7YnJlYWs7Y2FzZSBmLkVTQ0FQRTpDLmlzRWRpdG9yT3BlbmVkKCkmJkMuY2xvc2VFZGl0b3JBbmRSZXN0b3JlT3JpZ2luYWxWYWx1ZSh1KSxhLnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSBmLkhPTUU6ZChhLmN0cmxLZXl8fGEubWV0YUtleT9uZXcgaCgwLHQuc2VsUmFuZ2UuZnJvbS5jb2wpOm5ldyBoKHQuc2VsUmFuZ2UuZnJvbS5yb3csMCkpLGEucHJldmVudERlZmF1bHQoKSx3KGEpO2JyZWFrO2Nhc2UgZi5FTkQ6ZChhLmN0cmxLZXl8fGEubWV0YUtleT9uZXcgaChlLmNvdW50Um93cygpLTEsdC5zZWxSYW5nZS5mcm9tLmNvbCk6bmV3IGgodC5zZWxSYW5nZS5mcm9tLnJvdyxlLmNvdW50Q29scygpLTEpKSxhLnByZXZlbnREZWZhdWx0KCksdyhhKTticmVhaztjYXNlIGYuUEFHRV9VUDpuLnRyYW5zZm9ybVN0YXJ0KC1lLmNvdW50VmlzaWJsZVJvd3MoKSwwKSxhLnByZXZlbnREZWZhdWx0KCksdyhhKTticmVhaztjYXNlIGYuUEFHRV9ET1dOOm4udHJhbnNmb3JtU3RhcnQoZS5jb3VudFZpc2libGVSb3dzKCksMCksYS5wcmV2ZW50RGVmYXVsdCgpLHcoYSl9fX1mdW5jdGlvbiB1KCl7ZnVuY3Rpb24gdChlLHQsbil7IlREIj09bi5ub2RlTmFtZSYmKEMub3BlbkVkaXRvcigpLG0mJm0uZW5hYmxlRnVsbEVkaXRNb2RlKCkpfWUuYWRkSG9vaygiYWZ0ZXJEb2N1bWVudEtleURvd24iLGEpLGQuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsImtleWRvd24iLGZ1bmN0aW9uKHQpe2UucnVuSG9va3MoImFmdGVyRG9jdW1lbnRLZXlEb3duIix0KX0pLGUudmlldy53dC51cGRhdGUoIm9uQ2VsbERibENsaWNrIix0KSxlLmFkZEhvb2soImFmdGVyRGVzdHJveSIsZnVuY3Rpb24oKXtfPSEwfSl9dmFyIGQsbSxDPXRoaXMsXz0hMTtkPWIoZSksdGhpcy5kZXN0cm95RWRpdG9yPWZ1bmN0aW9uKGUpe3RoaXMuY2xvc2VFZGl0b3IoZSl9LHRoaXMuZ2V0QWN0aXZlRWRpdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG19LHRoaXMucHJlcGFyZUVkaXRvcj1mdW5jdGlvbigpe3ZhciBuLG8scixpLHMsbCxhO3JldHVybiBtJiZtLmlzV2FpdGluZygpP3ZvaWQgdGhpcy5jbG9zZUVkaXRvcighMSwhMSxmdW5jdGlvbihlKXtlJiZDLnByZXBhcmVFZGl0b3IoKX0pOihuPXQuc2VsUmFuZ2UuaGlnaGxpZ2h0LnJvdyxvPXQuc2VsUmFuZ2UuaGlnaGxpZ2h0LmNvbCxyPWUuY29sVG9Qcm9wKG8pLGk9ZS5nZXRDZWxsKG4sbykscz1lLmdldERhdGFBdENlbGwobixvKSxsPWUuZ2V0Q2VsbE1ldGEobixvKSxhPWUuZ2V0Q2VsbEVkaXRvcihsKSx2b2lkKGE/KG09Yy5lZGl0b3JzLmdldEVkaXRvcihhLGUpLG0ucHJlcGFyZShuLG8scixpLHMsbCkpOm09dm9pZCAwKSl9LHRoaXMuaXNFZGl0b3JPcGVuZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbSYmbS5pc09wZW5lZCgpfSx0aGlzLm9wZW5FZGl0b3I9ZnVuY3Rpb24oZSx0KXttJiYhbS5jZWxsUHJvcGVydGllcy5yZWFkT25seT9tLmJlZ2luRWRpdGluZyhlLHQpOm0mJm0uY2VsbFByb3BlcnRpZXMucmVhZE9ubHkmJnQmJnQua2V5Q29kZT09PWYuRU5URVImJm8oKX0sdGhpcy5jbG9zZUVkaXRvcj1mdW5jdGlvbihlLHQsbil7bT9tLmZpbmlzaEVkaXRpbmcoZSx0LG4pOm4mJm4oITEpfSx0aGlzLmNsb3NlRWRpdG9yQW5kU2F2ZUNoYW5nZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc2VFZGl0b3IoITEsZSl9LHRoaXMuY2xvc2VFZGl0b3JBbmRSZXN0b3JlT3JpZ2luYWxWYWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zZUVkaXRvcighMCxlKX0sdSgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0VkaXRvck1hbmFnZXI6e2dldDpmdW5jdGlvbigpe3JldHVybiBvfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIHIsaSxzLGwsYSx1LGM9KHI9ZSgiYnJvd3NlciIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSlbImRlZmF1bHQiXSxoPShpPWUoIjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9jZWxsL2Nvb3JkcyIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkuV2Fsa29udGFibGVDZWxsQ29vcmRzLGQ9KHM9ZSgiaGVscGVycy91bmljb2RlIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KSxmPWQuS0VZX0NPREVTLHA9ZC5pc01ldGFLZXksZz1kLmlzQ3RybEtleSxtPShsPWUoImhlbHBlcnMvZG9tL2V2ZW50IiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KSx3PW0uc3RvcFByb3BhZ2F0aW9uLHY9bS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24seT1tLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkLGI9KChhPWUoImVkaXRvcnMiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLmdldEVkaXRvciwodT1lKCJldmVudE1hbmFnZXIiKSx1JiZ1Ll9fZXNNb2R1bGUmJnV8fHsiZGVmYXVsdCI6dX0pLmV2ZW50TWFuYWdlcik7Yy5FZGl0b3JNYW5hZ2VyPW99LHsiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL2NlbGwvY29vcmRzIjo1LGJyb3dzZXI6MjMsZWRpdG9yczoyOSxldmVudE1hbmFnZXI6NDEsImhlbHBlcnMvZG9tL2V2ZW50Ijo0NywiaGVscGVycy91bmljb2RlIjo1NX1dLDI5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7dmFyIHQsbjtuPXt9LHQ9ZSx0aGlzLmdldENvbnN0cnVjdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ3VpZCBpbiBufHwobltlLmd1aWRdPW5ldyB0KGUpKSxuW2UuZ3VpZF19fWZ1bmN0aW9uIHIoZSx0KXt2YXIgbj1uZXcgbyh0KTsic3RyaW5nIj09dHlwZW9mIGUmJihkW2VdPW4sYy5lZGl0b3JzW2goZSkrIkVkaXRvciJdPXQpLGYuc2V0KHQsbil9ZnVuY3Rpb24gaShlLHQpe3ZhciBuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlKWYuZ2V0KGUpfHxyKG51bGwsZSksbj1mLmdldChlKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBFcnJvcignT25seSBzdHJpbmdzIGFuZCBmdW5jdGlvbnMgY2FuIGJlIHBhc3NlZCBhcyAiZWRpdG9yIiBwYXJhbWV0ZXIgJyk7bj1kW2VdfWlmKCFuKXRocm93IEVycm9yKCdObyBlZGl0b3IgcmVnaXN0ZXJlZCB1bmRlciBuYW1lICInK2UrJyInKTtyZXR1cm4gbi5nZXRJbnN0YW5jZSh0KX1mdW5jdGlvbiBzKGUpe3ZhciB0O2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBFcnJvcignT25seSBzdHJpbmdzIGFuZCBmdW5jdGlvbnMgY2FuIGJlIHBhc3NlZCBhcyAiZWRpdG9yIiBwYXJhbWV0ZXIgJyk7aWYodD1kW2VdLCF0KXRocm93IEVycm9yKCdObyBlZGl0b3IgcmVnaXN0ZXJlZCB1bmRlciBuYW1lICInK2UrJyInKTtyZXR1cm4gdC5nZXRDb25zdHJ1Y3RvcigpfWZ1bmN0aW9uIGwoZSl7cmV0dXJuISFkW2VdfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se3JlZ2lzdGVyRWRpdG9yOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn19LGdldEVkaXRvcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9fSxoYXNFZGl0b3I6e2dldDpmdW5jdGlvbigpe3JldHVybiBsfX0sZ2V0RWRpdG9yQ29uc3RydWN0b3I6e2dldDpmdW5jdGlvbigpe3JldHVybiBzfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIGEsdSxjPShhPWUoImJyb3dzZXIiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pWyJkZWZhdWx0Il0saD0odT1lKCJoZWxwZXJzL3N0cmluZyIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSkudG9VcHBlckNhc2VGaXJzdCxkPXt9LGY9bmV3IFdlYWtNYXA7Yy5lZGl0b3JzPWMuZWRpdG9yc3x8e30sYy5lZGl0b3JzLnJlZ2lzdGVyRWRpdG9yPXIsYy5lZGl0b3JzLmdldEVkaXRvcj1pfSx7YnJvd3NlcjoyMywiaGVscGVycy9zdHJpbmciOjU0fV0sMzA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXt0aGlzLmluc3RhbmNlPWUsdGhpcy5zdGF0ZT1sLkVkaXRvclN0YXRlLlZJUkdJTix0aGlzLl9vcGVuZWQ9ITEsdGhpcy5fZnVsbEVkaXRNb2RlPSExLHRoaXMuX2Nsb3NlQ2FsbGJhY2s9bnVsbCx0aGlzLmluaXQoKX1PYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtCYXNlRWRpdG9yOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciByLGkscyxsPShyPWUoImJyb3dzZXIiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pWyJkZWZhdWx0Il0sYT0oaT1lKCJoZWxwZXJzL21peGVkIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5zdHJpbmdpZnksdT0ocz1lKCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY2VsbC9jb29yZHMiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLldhbGtvbnRhYmxlQ2VsbENvb3JkcztsLmVkaXRvcnM9bC5lZGl0b3JzfHx7fSxsLmVkaXRvcnMuQmFzZUVkaXRvcj1vLGwuRWRpdG9yU3RhdGU9e1ZJUkdJTjoiU1RBVEVfVklSR0lOIixFRElUSU5HOiJTVEFURV9FRElUSU5HIixXQUlUSU5HOiJTVEFURV9XQUlUSU5HIixGSU5JU0hFRDoiU1RBVEVfRklOSVNIRUQifSxvLnByb3RvdHlwZS5fZmlyZUNhbGxiYWNrcz1mdW5jdGlvbihlKXt0aGlzLl9jbG9zZUNhbGxiYWNrJiYodGhpcy5fY2xvc2VDYWxsYmFjayhlKSx0aGlzLl9jbG9zZUNhbGxiYWNrPW51bGwpfSxvLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7fSxvLnByb3RvdHlwZS5nZXRWYWx1ZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFZGl0b3IgZ2V0VmFsdWUoKSBtZXRob2QgdW5pbXBsZW1lbnRlZCIpfSxvLnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbihlKXt0aHJvdyBFcnJvcigiRWRpdG9yIHNldFZhbHVlKCkgbWV0aG9kIHVuaW1wbGVtZW50ZWQiKX0sby5wcm90b3R5cGUub3Blbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJFZGl0b3Igb3BlbigpIG1ldGhvZCB1bmltcGxlbWVudGVkIil9LG8ucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkVkaXRvciBjbG9zZSgpIG1ldGhvZCB1bmltcGxlbWVudGVkIil9LG8ucHJvdG90eXBlLnByZXBhcmU9ZnVuY3Rpb24oZSx0LG4sbyxyLGkpe3RoaXMuVEQ9byx0aGlzLnJvdz1lLHRoaXMuY29sPXQsdGhpcy5wcm9wPW4sdGhpcy5vcmlnaW5hbFZhbHVlPXIsdGhpcy5jZWxsUHJvcGVydGllcz1pLHRoaXMuaW5zdGFuY2Uudmlldy5pc01vdXNlRG93bigpJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZG9jdW1lbnQuYm9keT9kb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTpkb2N1bWVudC5hY3RpdmVFbGVtZW50fHxkb2N1bWVudC5ib2R5LmZvY3VzKCksdGhpcy5zdGF0ZT1sLkVkaXRvclN0YXRlLlZJUkdJTn0sby5wcm90b3R5cGUuZXh0ZW5kPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe24uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIHQoZSx0KXtmdW5jdGlvbiBuKCl7fXJldHVybiBuLnByb3RvdHlwZT10LnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgbixlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9dmFyIG49dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gdChlLG4pfSxvLnByb3RvdHlwZS5zYXZlVmFsdWU9ZnVuY3Rpb24oZSx0KXt2YXIgbixvO3Q/KG49dGhpcy5pbnN0YW5jZS5nZXRTZWxlY3RlZCgpLG5bMF0+blsyXSYmKG89blswXSxuWzBdPW5bMl0sblsyXT1vKSxuWzFdPm5bM10mJihvPW5bMV0sblsxXT1uWzNdLG5bM109byksdGhpcy5pbnN0YW5jZS5wb3B1bGF0ZUZyb21BcnJheShuWzBdLG5bMV0sZSxuWzJdLG5bM10sImVkaXQiKSk6dGhpcy5pbnN0YW5jZS5wb3B1bGF0ZUZyb21BcnJheSh0aGlzLnJvdyx0aGlzLmNvbCxlLG51bGwsbnVsbCwiZWRpdCIpfSxvLnByb3RvdHlwZS5iZWdpbkVkaXRpbmc9ZnVuY3Rpb24oZSx0KXt0aGlzLnN0YXRlPT1sLkVkaXRvclN0YXRlLlZJUkdJTiYmKHRoaXMuaW5zdGFuY2Uudmlldy5zY3JvbGxWaWV3cG9ydChuZXcgdSh0aGlzLnJvdyx0aGlzLmNvbCkpLHRoaXMuaW5zdGFuY2Uudmlldy5yZW5kZXIoKSx0aGlzLnN0YXRlPWwuRWRpdG9yU3RhdGUuRURJVElORyxlPSJzdHJpbmciPT10eXBlb2YgZT9lOnRoaXMub3JpZ2luYWxWYWx1ZSx0aGlzLnNldFZhbHVlKGEoZSkpLHRoaXMub3Blbih0KSx0aGlzLl9vcGVuZWQ9ITAsdGhpcy5mb2N1cygpLHRoaXMuaW5zdGFuY2Uudmlldy5yZW5kZXIoKSl9LG8ucHJvdG90eXBlLmZpbmlzaEVkaXRpbmc9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvLHI9dGhpcztpZihuKXt2YXIgaT10aGlzLl9jbG9zZUNhbGxiYWNrO3RoaXMuX2Nsb3NlQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7aSYmaShlKSxuKGUpfX1pZighdGhpcy5pc1dhaXRpbmcoKSl7aWYodGhpcy5zdGF0ZT09bC5FZGl0b3JTdGF0ZS5WSVJHSU4pcmV0dXJuIHZvaWQgdGhpcy5pbnN0YW5jZS5fcmVnaXN0ZXJUaW1lb3V0KHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLl9maXJlQ2FsbGJhY2tzKCEwKX0sMCkpO2lmKHRoaXMuc3RhdGU9PWwuRWRpdG9yU3RhdGUuRURJVElORyl7aWYoZSlyZXR1cm4gdGhpcy5jYW5jZWxDaGFuZ2VzKCksdm9pZCB0aGlzLmluc3RhbmNlLnZpZXcucmVuZGVyKCk7dmFyIHM9dGhpcy5nZXRWYWx1ZSgpO289dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5ncygpLnRyaW1XaGl0ZXNwYWNlP1tbInN0cmluZyI9PXR5cGVvZiBzP1N0cmluZy5wcm90b3R5cGUudHJpbS5jYWxsKHN8fCIiKTpzXV06W1tzXV0sdGhpcy5zdGF0ZT1sLkVkaXRvclN0YXRlLldBSVRJTkcsdGhpcy5zYXZlVmFsdWUobyx0KSx0aGlzLmluc3RhbmNlLmdldENlbGxWYWxpZGF0b3IodGhpcy5jZWxsUHJvcGVydGllcyk/dGhpcy5pbnN0YW5jZS5hZGRIb29rT25jZSgicG9zdEFmdGVyVmFsaWRhdGUiLGZ1bmN0aW9uKGUpe3Iuc3RhdGU9bC5FZGl0b3JTdGF0ZS5GSU5JU0hFRCxyLmRpc2NhcmRFZGl0b3IoZSl9KToodGhpcy5zdGF0ZT1sLkVkaXRvclN0YXRlLkZJTklTSEVELHRoaXMuZGlzY2FyZEVkaXRvcighMCkpfX19LG8ucHJvdG90eXBlLmNhbmNlbENoYW5nZXM9ZnVuY3Rpb24oKXt0aGlzLnN0YXRlPWwuRWRpdG9yU3RhdGUuRklOSVNIRUQsdGhpcy5kaXNjYXJkRWRpdG9yKCl9LG8ucHJvdG90eXBlLmRpc2NhcmRFZGl0b3I9ZnVuY3Rpb24oZSl7dGhpcy5zdGF0ZT09PWwuRWRpdG9yU3RhdGUuRklOSVNIRUQmJihlPT09ITEmJnRoaXMuY2VsbFByb3BlcnRpZXMuYWxsb3dJbnZhbGlkIT09ITA/KHRoaXMuaW5zdGFuY2Uuc2VsZWN0Q2VsbCh0aGlzLnJvdyx0aGlzLmNvbCksdGhpcy5mb2N1cygpLHRoaXMuc3RhdGU9bC5FZGl0b3JTdGF0ZS5FRElUSU5HLHRoaXMuX2ZpcmVDYWxsYmFja3MoITEpKToodGhpcy5jbG9zZSgpLHRoaXMuX29wZW5lZD0hMSx0aGlzLl9mdWxsRWRpdE1vZGU9ITEsdGhpcy5zdGF0ZT1sLkVkaXRvclN0YXRlLlZJUkdJTix0aGlzLl9maXJlQ2FsbGJhY2tzKCEwKSkpfSxvLnByb3RvdHlwZS5lbmFibGVGdWxsRWRpdE1vZGU9ZnVuY3Rpb24oKXt0aGlzLl9mdWxsRWRpdE1vZGU9ITB9LG8ucHJvdG90eXBlLmlzSW5GdWxsRWRpdE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnVsbEVkaXRNb2RlfSxvLnByb3RvdHlwZS5pc09wZW5lZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcGVuZWR9LG8ucHJvdG90eXBlLmlzV2FpdGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlPT09bC5FZGl0b3JTdGF0ZS5XQUlUSU5HfSxvLnByb3RvdHlwZS5jaGVja0VkaXRvclNlY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmluc3RhbmNlLmNvdW50Um93cygpLHQ9IiI7cmV0dXJuIHRoaXMucm93PHRoaXMuaW5zdGFuY2UuZ2V0U2V0dGluZ3MoKS5maXhlZFJvd3NUb3A/dD10aGlzLmNvbDx0aGlzLmluc3RhbmNlLmdldFNldHRpbmdzKCkuZml4ZWRDb2x1bW5zTGVmdD8idG9wLWxlZnQtY29ybmVyIjoidG9wIjp0aGlzLmluc3RhbmNlLmdldFNldHRpbmdzKCkuZml4ZWRSb3dzQm90dG9tJiZ0aGlzLnJvdz49ZS10aGlzLmluc3RhbmNlLmdldFNldHRpbmdzKCkuZml4ZWRSb3dzQm90dG9tP3Q9dGhpcy5jb2w8dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5ncygpLmZpeGVkQ29sdW1uc0xlZnQ/ImJvdHRvbS1sZWZ0LWNvcm5lciI6ImJvdHRvbSI6dGhpcy5jb2w8dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5ncygpLmZpeGVkQ29sdW1uc0xlZnQmJih0PSJsZWZ0IiksdH19LHsiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL2NlbGwvY29vcmRzIjo1LGJyb3dzZXI6MjMsImhlbHBlcnMvbWl4ZWQiOjUwfV0sMzE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXtrPSExO3ZhciB0PXRoaXMuZ2V0QWN0aXZlRWRpdG9yKCk7aWYoZihlLmtleUNvZGUpfHxlLmtleUNvZGU9PT1kLkJBQ0tTUEFDRXx8ZS5rZXlDb2RlPT09ZC5ERUxFVEV8fGUua2V5Q29kZT09PWQuSU5TRVJUKXt2YXIgbj0wO2lmKGUua2V5Q29kZT09PWQuQyYmKGUuY3RybEtleXx8ZS5tZXRhS2V5KSlyZXR1cm47dC5pc09wZW5lZCgpfHwobis9MTApLHQuaHRFZGl0b3ImJnQuaW5zdGFuY2UuX3JlZ2lzdGVyVGltZW91dChzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5xdWVyeUNob2ljZXModC5URVhUQVJFQS52YWx1ZSksaz0hMH0sbikpfX1PYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtBdXRvY29tcGxldGVFZGl0b3I6e2dldDpmdW5jdGlvbigpe3JldHVybiBPfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIHIsaSxzLGwsYSx1LGMsaD0oKHI9ZSgiYnJvd3NlciIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSlbImRlZmF1bHQiXSxpPWUoImhlbHBlcnMvdW5pY29kZSIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSksZD1oLktFWV9DT0RFUyxmPWguaXNQcmludGFibGVDaGFyLHA9KHM9ZSgiaGVscGVycy9taXhlZCIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuc3RyaW5naWZ5LGc9KGw9ZSgiaGVscGVycy9hcnJheSIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSkucGl2b3QsbT0oYT1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KSx3PW0uYWRkQ2xhc3Msdj1tLmdldENhcmV0UG9zaXRpb24seT1tLmdldFNjcm9sbGJhcldpZHRoLGI9bS5nZXRTZWxlY3Rpb25FbmRQb3NpdGlvbixDPW0ub3V0ZXJXaWR0aCxfPW0ub3V0ZXJIZWlnaHQsUj1tLm9mZnNldCxTPW0uZ2V0VHJpbW1pbmdDb250YWluZXIsRT1tLnNldENhcmV0UG9zaXRpb24sVD0odT1lKCJlZGl0b3JzIiksdSYmdS5fX2VzTW9kdWxlJiZ1fHx7ImRlZmF1bHQiOnV9KS5yZWdpc3RlckVkaXRvcixNPShjPWUoImhhbmRzb250YWJsZUVkaXRvciIpLGMmJmMuX19lc01vZHVsZSYmY3x8eyJkZWZhdWx0IjpjfSkuSGFuZHNvbnRhYmxlRWRpdG9yLE89TS5wcm90b3R5cGUuZXh0ZW5kKCk7Ty5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe00ucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucXVlcnk9bnVsbCx0aGlzLmNob2ljZXM9W119LE8ucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnRzPWZ1bmN0aW9uKCl7TS5wcm90b3R5cGUuY3JlYXRlRWxlbWVudHMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHcodGhpcy5odENvbnRhaW5lciwiYXV0b2NvbXBsZXRlRWRpdG9yIiksdyh0aGlzLmh0Q29udGFpbmVyLC0xPT09d2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybS5pbmRleE9mKCJNYWMiKT8iIjoiaHRNYWNTY3JvbGwiKX07dmFyIGs9ITE7Ty5wcm90b3R5cGUucHJlcGFyZT1mdW5jdGlvbigpe3RoaXMuaW5zdGFuY2UuYWRkSG9vaygiYmVmb3JlS2V5RG93biIsbyksTS5wcm90b3R5cGUucHJlcGFyZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LE8ucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oKXt0aGlzLlRFWFRBUkVBX1BBUkVOVC5zdHlsZS5vdmVyZmxvdz0iYXV0byIsTS5wcm90b3R5cGUub3Blbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5URVhUQVJFQV9QQVJFTlQuc3R5bGUub3ZlcmZsb3c9IiI7dmFyIGU9dGhpcy5odEVkaXRvci5nZXRJbnN0YW5jZSgpLHQ9dGhpcyxuPXZvaWQgMD09PXRoaXMuY2VsbFByb3BlcnRpZXMudHJpbURyb3Bkb3duPyEwOnRoaXMuY2VsbFByb3BlcnRpZXMudHJpbURyb3Bkb3duO3RoaXMuVEVYVEFSRUEuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIsdGhpcy5mb2N1cygpLGUudXBkYXRlU2V0dGluZ3Moe2NvbFdpZHRoczpuP1tDKHRoaXMuVEVYVEFSRUEpLTJdOnZvaWQgMCx3aWR0aDpuP0ModGhpcy5URVhUQVJFQSkreSgpKzI6dm9pZCAwLGFmdGVyUmVuZGVyZXI6ZnVuY3Rpb24oZSxuLG8scixpKXt2YXIgcyxsLGE9dGhpcy5nZXRDZWxsTWV0YShuLG8pLmZpbHRlcmluZ0Nhc2VTZW5zaXRpdmU9PT0hMDtpPXAoaSksaSYmKHM9YT9pLmluZGV4T2YodGhpcy5xdWVyeSk6aS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodC5xdWVyeS50b0xvd2VyQ2FzZSgpKSwtMSE9cyYmKGw9aS5zdWJzdHIocyx0LnF1ZXJ5Lmxlbmd0aCksZS5pbm5lckhUTUw9aS5yZXBsYWNlKGwsIjxzdHJvbmc+IitsKyI8L3N0cm9uZz4iKSkpfSxhdXRvQ29sdW1uU2l6ZTohMCxtb2RpZnlDb2xXaWR0aDpmdW5jdGlvbihlLHQpe3ZhciBvPXRoaXMuZ2V0UGx1Z2luKCJhdXRvQ29sdW1uU2l6ZSIpLndpZHRocztyZXR1cm4gb1t0XSYmKGU9b1t0XSksbj9lOmUrMTV9fSksdGhpcy5odEVkaXRvci52aWV3Lnd0Lnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUuc3R5bGVbInBhZGRpbmctcmlnaHQiXT15KCkrMisicHgiLGsmJihrPSExKSx0Lmluc3RhbmNlLl9yZWdpc3RlclRpbWVvdXQoc2V0VGltZW91dChmdW5jdGlvbigpe3QucXVlcnlDaG9pY2VzKHQuVEVYVEFSRUEudmFsdWUpfSwwKSl9LE8ucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7TS5wcm90b3R5cGUuY2xvc2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxPLnByb3RvdHlwZS5xdWVyeUNob2ljZXM9ZnVuY3Rpb24oZSl7dGhpcy5xdWVyeT1lO3ZhciB0PXRoaXMuY2VsbFByb3BlcnRpZXMuc291cmNlLG49dGhpcy5jZWxsUHJvcGVydGllcy5maWx0ZXIsbz10aGlzLmNlbGxQcm9wZXJ0aWVzLmZpbHRlcmluZ0Nhc2VTZW5zaXRpdmU7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpe3ZhciByPXRoaXM7dC5jYWxsKHRoaXMuY2VsbFByb3BlcnRpZXMsZSxmdW5jdGlvbihlKXtyLnVwZGF0ZUNob2ljZXNMaXN0KGUpfSl9ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgaTtpZihlJiZuIT09ITEpe3ZhciBzPWUudG9Mb3dlckNhc2UoKTtpPXQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBvPy0xIT10LmluZGV4T2YoZSk6LTEhPXQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHMpfSl9ZWxzZSBpPXQ7dGhpcy51cGRhdGVDaG9pY2VzTGlzdChpKX1lbHNlIHRoaXMudXBkYXRlQ2hvaWNlc0xpc3QoW10pfSxPLnByb3RvdHlwZS51cGRhdGVDaG9pY2VzTGlzdD1mdW5jdGlvbihlKXt2YXIgdD12KHRoaXMuVEVYVEFSRUEpLG49Yih0aGlzLlRFWFRBUkVBKSxvPXRoaXMuY2VsbFByb3BlcnRpZXMuc29ydEJ5UmVsZXZhbmNlLHI9dGhpcy5jZWxsUHJvcGVydGllcy5maWx0ZXIsaT1udWxsLHM9bnVsbDtpZihvJiYoaT1PLnNvcnRCeVJlbGV2YW5jZSh0aGlzLmdldFZhbHVlKCksZSx0aGlzLmNlbGxQcm9wZXJ0aWVzLmZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUpKSxyPT09ITEpcz1pP2lbMF06MDtlbHNle2Zvcih2YXIgbD1bXSxhPTAsdT1lLmxlbmd0aDt1PmE7YSsrKWk/bC5wdXNoKGVbaVthXV0pOmwucHVzaChlW2FdKTtzPTAsZT1sfXRoaXMuY2hvaWNlcz1lLHRoaXMuaHRFZGl0b3IubG9hZERhdGEoZyhbZV0pKSx0aGlzLnVwZGF0ZURyb3Bkb3duSGVpZ2h0KCksdGhpcy5mbGlwRHJvcGRvd25JZk5lZWRlZCgpLHRoaXMuY2VsbFByb3BlcnRpZXMuc3RyaWN0PT09ITAmJnRoaXMuaGlnaGxpZ2h0QmVzdE1hdGNoaW5nQ2hvaWNlKHMpLHRoaXMuaW5zdGFuY2UubGlzdGVuKCksdGhpcy5URVhUQVJFQS5mb2N1cygpLEUodGhpcy5URVhUQVJFQSx0LHQ9PT1uP3ZvaWQgMDpuKX0sTy5wcm90b3R5cGUuZmxpcERyb3Bkb3duSWZOZWVkZWQ9ZnVuY3Rpb24oKXt2YXIgZT1SKHRoaXMuVEVYVEFSRUEpLHQ9Xyh0aGlzLlRFWFRBUkVBKSxuPXRoaXMuZ2V0RHJvcGRvd25IZWlnaHQoKSxvPVModGhpcy5pbnN0YW5jZS52aWV3Lnd0Lnd0VGFibGUuVEFCTEUpLHI9e3JvdzowLGNvbDowfTtvIT09d2luZG93JiYocj1SKG8pKTt2YXIgaT1yLnRvcCsoby5zY3JvbGxIZWlnaHQtby5zY3JvbGxUb3ApLHM9ci50b3Arby5zY3JvbGxIZWlnaHQsbD1lLnRvcCt0K24+aTtsJiZzPmk/dGhpcy5mbGlwRHJvcGRvd24obik6dGhpcy51bmZsaXBEcm9wZG93bigpfSxPLnByb3RvdHlwZS5mbGlwRHJvcGRvd249ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5odEVkaXRvci5yb290RWxlbWVudC5zdHlsZTt0LnBvc2l0aW9uPSJhYnNvbHV0ZSIsdC50b3A9LWUrInB4Iix0aGlzLmh0RWRpdG9yLmZsaXBwZWQ9ITB9LE8ucHJvdG90eXBlLnVuZmxpcERyb3Bkb3duPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5odEVkaXRvci5yb290RWxlbWVudC5zdHlsZTsiYWJzb2x1dGUiPT09ZS5wb3NpdGlvbiYmKGUucG9zaXRpb249IiIsZS50b3A9IiIpLHRoaXMuaHRFZGl0b3IuZmxpcHBlZD12b2lkIDB9LE8ucHJvdG90eXBlLnVwZGF0ZURyb3Bkb3duSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5odEVkaXRvci5nZXRDb2xXaWR0aCgwKSt5KCkrMix0PXRoaXMuY2VsbFByb3BlcnRpZXMudHJpbURyb3Bkb3duO3RoaXMuaHRFZGl0b3IudXBkYXRlU2V0dGluZ3Moe2hlaWdodDp0aGlzLmdldERyb3Bkb3duSGVpZ2h0KCksd2lkdGg6dD92b2lkIDA6ZX0pLHRoaXMuaHRFZGl0b3Iudmlldy53dC53dFRhYmxlLmFsaWduT3ZlcmxheXNXaXRoVHJpbW1pbmdDb250YWluZXIoKX0sTy5wcm90b3R5cGUuZmluaXNoRWRpdGluZz1mdW5jdGlvbihlKXtlfHx0aGlzLmluc3RhbmNlLnJlbW92ZUhvb2soImJlZm9yZUtleURvd24iLG8pLE0ucHJvdG90eXBlLmZpbmlzaEVkaXRpbmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxPLnByb3RvdHlwZS5oaWdobGlnaHRCZXN0TWF0Y2hpbmdDaG9pY2U9ZnVuY3Rpb24oZSl7Im51bWJlciI9PXR5cGVvZiBlP3RoaXMuaHRFZGl0b3Iuc2VsZWN0Q2VsbChlLDApOnRoaXMuaHRFZGl0b3IuZGVzZWxlY3RDZWxsKCl9LE8uc29ydEJ5UmVsZXZhbmNlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbyxyLGkscyxsPVtdLGE9ZS5sZW5ndGgsdT1bXSxjPXQubGVuZ3RoO2lmKDA9PT1hKXtmb3Iocz0wO2M+cztzKyspdS5wdXNoKHMpO3JldHVybiB1fWZvcihzPTA7Yz5zO3MrKylvPXAodFtzXSkscj1uP28uaW5kZXhPZihlKTpvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihlLnRvTG93ZXJDYXNlKCkpLC0xIT1yJiYoaT1vLmxlbmd0aC1yLWEsbC5wdXNoKHtiYXNlSW5kZXg6cyxpbmRleDpyLGNoYXJzTGVmdDppLHZhbHVlOm99KSk7Zm9yKGwuc29ydChmdW5jdGlvbihlLHQpe3JldHVybi0xPT09dC5pbmRleD8tMTotMT09PWUuaW5kZXg/MTplLmluZGV4PHQuaW5kZXg/LTE6dC5pbmRleDxlLmluZGV4PzE6ZS5pbmRleD09PXQuaW5kZXg/ZS5jaGFyc0xlZnQ8dC5jaGFyc0xlZnQ/LTE6ZS5jaGFyc0xlZnQ+dC5jaGFyc0xlZnQ/MTowOnZvaWQgMH0pLHM9MCxjPWwubGVuZ3RoO2M+cztzKyspdS5wdXNoKGxbc10uYmFzZUluZGV4KTtyZXR1cm4gdX0sTy5wcm90b3R5cGUuZ2V0RHJvcGRvd25IZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmh0RWRpdG9yLmdldEluc3RhbmNlKCkuZ2V0Um93SGVpZ2h0KDApfHwyMyx0PXRoaXMuY2VsbFByb3BlcnRpZXMudmlzaWJsZVJvd3M7cmV0dXJuIHRoaXMuY2hvaWNlcy5sZW5ndGg+PXQ/dCplOnRoaXMuY2hvaWNlcy5sZW5ndGgqZSs4fSxPLnByb3RvdHlwZS5hbGxvd0tleUV2ZW50UHJvcGFnYXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9e3Jvdzp0aGlzLmh0RWRpdG9yLmdldFNlbGVjdGVkUmFuZ2UoKT90aGlzLmh0RWRpdG9yLmdldFNlbGVjdGVkUmFuZ2UoKS5mcm9tLnJvdzotMX0sbj0hMTtyZXR1cm4gZT09PWQuQVJST1dfRE9XTiYmdC5yb3c+MCYmdC5yb3c8dGhpcy5odEVkaXRvci5jb3VudFJvd3MoKS0xJiYobj0hMCksZT09PWQuQVJST1dfVVAmJnQucm93Pi0xJiYobj0hMCksbn0sVCgiYXV0b2NvbXBsZXRlIixPKX0se2Jyb3dzZXI6MjMsZWRpdG9yczoyOSxoYW5kc29udGFibGVFZGl0b3I6MzUsImhlbHBlcnMvYXJyYXkiOjQyLCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9taXhlZCI6NTAsImhlbHBlcnMvdW5pY29kZSI6NTV9XSwzMjpbZnVuY3Rpb24oZSx0LG4pew0KInVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0NoZWNrYm94RWRpdG9yOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzPShvPWUoImVkaXRvcnMiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pLnJlZ2lzdGVyRWRpdG9yLGw9KHI9ZSgiX2Jhc2VFZGl0b3IiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLkJhc2VFZGl0b3IsYT0oaT1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5oYXNDbGFzcyx1PWZ1bmN0aW9uKCl7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IoYykuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxjPXU7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKHUse2JlZ2luRWRpdGluZzpmdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQpe3ZhciBuPXRoaXMuVEQucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT0iY2hlY2tib3giXScpO2EobiwiaHRCYWRWYWx1ZSIpfHxuLmNsaWNrKCl9fSxmaW5pc2hFZGl0aW5nOmZ1bmN0aW9uKCl7fSxpbml0OmZ1bmN0aW9uKCl7fSxvcGVuOmZ1bmN0aW9uKCl7fSxjbG9zZTpmdW5jdGlvbigpe30sZ2V0VmFsdWU6ZnVuY3Rpb24oKXt9LHNldFZhbHVlOmZ1bmN0aW9uKCl7fSxmb2N1czpmdW5jdGlvbigpe319LHt9LGwpLHMoImNoZWNrYm94Iix1KX0se19iYXNlRWRpdG9yOjMwLGVkaXRvcnM6MjksImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2fV0sMzM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7RGF0ZUVkaXRvcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFR9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscyxsLGEsdSxjLGgsZCxmPShvPWUoImJyb3dzZXIiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pWyJkZWZhdWx0Il0scD0ocj1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KSxnPXAuYWRkQ2xhc3MsbT1wLm91dGVySGVpZ2h0LHc9KGk9ZSgiaGVscGVycy9vYmplY3QiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLmRlZXBFeHRlbmQsdj0ocz1lKCJldmVudE1hbmFnZXIiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLkV2ZW50TWFuYWdlcix5PShsPWUoImVkaXRvcnMiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLGI9KHkuZ2V0RWRpdG9yLHkucmVnaXN0ZXJFZGl0b3IpLEM9KGE9ZSgiaGVscGVycy91bmljb2RlIiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KS5pc01ldGFLZXksXz0odT1lKCJoZWxwZXJzL2RvbS9ldmVudCIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSkuc3RvcFByb3BhZ2F0aW9uLFI9KGM9ZSgidGV4dEVkaXRvciIpLGMmJmMuX19lc01vZHVsZSYmY3x8eyJkZWZhdWx0IjpjfSkuVGV4dEVkaXRvcixTPShoPWUoIm1vbWVudCIpLGgmJmguX19lc01vZHVsZSYmaHx8eyJkZWZhdWx0IjpofSlbImRlZmF1bHQiXSxFPShkPWUoInBpa2FkYXkiKSxkJiZkLl9fZXNNb2R1bGUmJmR8fHsiZGVmYXVsdCI6ZH0pWyJkZWZhdWx0Il07Zi5lZGl0b3JzPWYuZWRpdG9yc3x8e30sZi5lZGl0b3JzLkRhdGVFZGl0b3I9VDt2YXIgVD1mdW5jdGlvbihlKXt0aGlzLiRkYXRlUGlja2VyPW51bGwsdGhpcy5kYXRlUGlja2VyPW51bGwsdGhpcy5kYXRlUGlja2VyU3R5bGU9bnVsbCx0aGlzLmRlZmF1bHREYXRlRm9ybWF0PSJERC9NTS9ZWVlZIix0aGlzLmlzQ2VsbEVkaXRlZD0hMSx0aGlzLnBhcmVudERlc3Ryb3llZD0hMSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJDb25zdHJ1Y3RvcihNKS5jYWxsKHRoaXMsZSl9LE09VDskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoVCx7aW5pdDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIFMpdGhyb3cgbmV3IEVycm9yKCJZb3UgbmVlZCB0byBpbmNsdWRlIG1vbWVudC5qcyB0byB5b3VyIHByb2plY3QuIik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIEUpdGhyb3cgbmV3IEVycm9yKCJZb3UgbmVlZCB0byBpbmNsdWRlIFBpa2FkYXkgdG8geW91ciBwcm9qZWN0LiIpOyR0cmFjZXVyUnVudGltZS5zdXBlckdldCh0aGlzLE0ucHJvdG90eXBlLCJpbml0IikuY2FsbCh0aGlzKSx0aGlzLmluc3RhbmNlLmFkZEhvb2soImFmdGVyRGVzdHJveSIsZnVuY3Rpb24oKXtlLnBhcmVudERlc3Ryb3llZD0hMCxlLmRlc3Ryb3lFbGVtZW50cygpfSl9LGNyZWF0ZUVsZW1lbnRzOmZ1bmN0aW9uKCl7JHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsTS5wcm90b3R5cGUsImNyZWF0ZUVsZW1lbnRzIikuY2FsbCh0aGlzKSx0aGlzLmRhdGVQaWNrZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksdGhpcy5kYXRlUGlja2VyU3R5bGU9dGhpcy5kYXRlUGlja2VyLnN0eWxlLHRoaXMuZGF0ZVBpY2tlclN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5kYXRlUGlja2VyU3R5bGUudG9wPTAsdGhpcy5kYXRlUGlja2VyU3R5bGUubGVmdD0wLHRoaXMuZGF0ZVBpY2tlclN0eWxlLnpJbmRleD05OTk5LGcodGhpcy5kYXRlUGlja2VyLCJodERhdGVwaWNrZXJIb2xkZXIiKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZGF0ZVBpY2tlciksdGhpcy4kZGF0ZVBpY2tlcj1uZXcgRSh0aGlzLmdldERhdGVQaWNrZXJDb25maWcoKSk7dmFyIGU9bmV3IHYodGhpcyk7ZS5hZGRFdmVudExpc3RlbmVyKHRoaXMuZGF0ZVBpY2tlciwibW91c2Vkb3duIixmdW5jdGlvbihlKXtyZXR1cm4gXyhlKX0pLHRoaXMuaGlkZURhdGVwaWNrZXIoKX0sZGVzdHJveUVsZW1lbnRzOmZ1bmN0aW9uKCl7dGhpcy4kZGF0ZVBpY2tlci5kZXN0cm95KCl9LHByZXBhcmU6ZnVuY3Rpb24oZSx0LG4sbyxyLGkpe3RoaXMuX29wZW5lZD0hMSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxNLnByb3RvdHlwZSwicHJlcGFyZSIpLmNhbGwodGhpcyxlLHQsbixvLHIsaSl9LG9wZW46ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGw7JHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsTS5wcm90b3R5cGUsIm9wZW4iKS5jYWxsKHRoaXMpLHRoaXMuc2hvd0RhdGVwaWNrZXIoZSl9LGNsb3NlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9vcGVuZWQ9ITEsdGhpcy5pbnN0YW5jZS5fcmVnaXN0ZXJUaW1lb3V0KHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmluc3RhbmNlLnNlbGVjdGlvbi5yZWZyZXNoQm9yZGVycygpfSwwKSksJHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsTS5wcm90b3R5cGUsImNsb3NlIikuY2FsbCh0aGlzKX0sZmluaXNoRWRpdGluZzpmdW5jdGlvbigpe3ZhciBlPXZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ITEsdD12b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiExO2lmKGUpe3ZhciBuPXRoaXMub3JpZ2luYWxWYWx1ZTt2b2lkIDAhPT1uJiZ0aGlzLnNldFZhbHVlKG4pfXRoaXMuaGlkZURhdGVwaWNrZXIoKSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxNLnByb3RvdHlwZSwiZmluaXNoRWRpdGluZyIpLmNhbGwodGhpcyxlLHQpfSxzaG93RGF0ZXBpY2tlcjpmdW5jdGlvbihlKXt0aGlzLiRkYXRlUGlja2VyLmNvbmZpZyh0aGlzLmdldERhdGVQaWNrZXJDb25maWcoKSk7dmFyIHQsbj10aGlzLlRELmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89dGhpcy5jZWxsUHJvcGVydGllcy5kYXRlRm9ybWF0fHx0aGlzLmRlZmF1bHREYXRlRm9ybWF0LHI9dGhpcy4kZGF0ZVBpY2tlci5jb25maWcoKSxpPXRoaXMuaW5zdGFuY2Uudmlldy5pc01vdXNlRG93bigpLHM9ZT9DKGUua2V5Q29kZSk6ITE7dGhpcy5kYXRlUGlja2VyU3R5bGUudG9wPXdpbmRvdy5wYWdlWU9mZnNldCtuLnRvcCttKHRoaXMuVEQpKyJweCIsdGhpcy5kYXRlUGlja2VyU3R5bGUubGVmdD13aW5kb3cucGFnZVhPZmZzZXQrbi5sZWZ0KyJweCIsdGhpcy4kZGF0ZVBpY2tlci5fb25JbnB1dEZvY3VzPWZ1bmN0aW9uKCl7fSxyLmZvcm1hdD1vLHRoaXMub3JpZ2luYWxWYWx1ZT8odD10aGlzLm9yaWdpbmFsVmFsdWUsUyh0LG8sITApLmlzVmFsaWQoKSYmdGhpcy4kZGF0ZVBpY2tlci5zZXRNb21lbnQoUyh0LG8pLCEwKSx0aGlzLmdldFZhbHVlKCkhPT10aGlzLm9yaWdpbmFsVmFsdWUmJnRoaXMuc2V0VmFsdWUodGhpcy5vcmlnaW5hbFZhbHVlKSxzfHxpfHx0aGlzLnNldFZhbHVlKCIiKSk6dGhpcy5jZWxsUHJvcGVydGllcy5kZWZhdWx0RGF0ZT8odD10aGlzLmNlbGxQcm9wZXJ0aWVzLmRlZmF1bHREYXRlLHIuZGVmYXVsdERhdGU9dCxTKHQsbywhMCkuaXNWYWxpZCgpJiZ0aGlzLiRkYXRlUGlja2VyLnNldE1vbWVudChTKHQsbyksITApLHN8fGl8fHRoaXMuc2V0VmFsdWUoIiIpKTp0aGlzLiRkYXRlUGlja2VyLmdvdG9Ub2RheSgpLHRoaXMuZGF0ZVBpY2tlclN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLiRkYXRlUGlja2VyLnNob3coKX0saGlkZURhdGVwaWNrZXI6ZnVuY3Rpb24oKXt0aGlzLmRhdGVQaWNrZXJTdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLiRkYXRlUGlja2VyLmhpZGUoKX0sZ2V0RGF0ZVBpY2tlckNvbmZpZzpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLlRFWFRBUkVBLG49e307dGhpcy5jZWxsUHJvcGVydGllcyYmdGhpcy5jZWxsUHJvcGVydGllcy5kYXRlUGlja2VyQ29uZmlnJiZ3KG4sdGhpcy5jZWxsUHJvcGVydGllcy5kYXRlUGlja2VyQ29uZmlnKTt2YXIgbz1uLm9uU2VsZWN0LHI9bi5vbkNsb3NlO3JldHVybiBuLmZpZWxkPXQsbi50cmlnZ2VyPXQsbi5jb250YWluZXI9dGhpcy5kYXRlUGlja2VyLG4uYm91bmQ9ITEsbi5mb3JtYXQ9bi5mb3JtYXR8fHRoaXMuZGVmYXVsdERhdGVGb3JtYXQsbi5yZXBvc2l0aW9uPW4ucmVwb3NpdGlvbnx8ITEsbi5vblNlbGVjdD1mdW5jdGlvbih0KXtpc05hTih0LmdldFRpbWUoKSl8fCh0PVModCkuZm9ybWF0KGUuY2VsbFByb3BlcnRpZXMuZGF0ZUZvcm1hdHx8ZS5kZWZhdWx0RGF0ZUZvcm1hdCkpLGUuc2V0VmFsdWUodCksZS5oaWRlRGF0ZXBpY2tlcigpLG8mJm8oKX0sbi5vbkNsb3NlPWZ1bmN0aW9uKCl7ZS5wYXJlbnREZXN0cm95ZWR8fGUuZmluaXNoRWRpdGluZyghMSksciYmcigpfSxufX0se30sUiksYigiZGF0ZSIsVCl9LHticm93c2VyOjIzLGVkaXRvcnM6MjksZXZlbnRNYW5hZ2VyOjQxLCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9kb20vZXZlbnQiOjQ3LCJoZWxwZXJzL29iamVjdCI6NTIsImhlbHBlcnMvdW5pY29kZSI6NTUsbW9tZW50OiJtb21lbnQiLHBpa2FkYXk6InBpa2FkYXkiLHRleHRFZGl0b3I6NDB9XSwzNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtEcm9wZG93bkVkaXRvcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGN9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscz0obz1lKCJicm93c2VyIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLGw9KHI9ZSgiZWRpdG9ycyIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSksYT0obC5nZXRFZGl0b3IsbC5yZWdpc3RlckVkaXRvciksdT0obC5nZXRFZGl0b3JDb25zdHJ1Y3RvciwoaT1lKCJhdXRvY29tcGxldGVFZGl0b3IiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLkF1dG9jb21wbGV0ZUVkaXRvciksYz1mdW5jdGlvbigpeyR0cmFjZXVyUnVudGltZS5zdXBlckNvbnN0cnVjdG9yKGgpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saD1jOyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhjLHtwcmVwYXJlOmZ1bmN0aW9uKGUsdCxuLG8scixpKXskdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxoLnByb3RvdHlwZSwicHJlcGFyZSIpLmNhbGwodGhpcyxlLHQsbixvLHIsaSksdGhpcy5jZWxsUHJvcGVydGllcy5maWx0ZXI9ITEsdGhpcy5jZWxsUHJvcGVydGllcy5zdHJpY3Q9ITB9fSx7fSx1KSxzLmhvb2tzLmFkZCgiYmVmb3JlVmFsaWRhdGUiLGZ1bmN0aW9uKGUsdCxuLG8pe3ZhciByPXRoaXMuZ2V0Q2VsbE1ldGEodCx0aGlzLnByb3BUb0NvbChuKSk7ci5lZGl0b3I9PT1zLmVkaXRvcnMuRHJvcGRvd25FZGl0b3ImJnZvaWQgMD09PXIuc3RyaWN0JiYoci5maWx0ZXI9ITEsci5zdHJpY3Q9ITApfSksYSgiZHJvcGRvd24iLGMpfSx7YXV0b2NvbXBsZXRlRWRpdG9yOjMxLGJyb3dzZXI6MjMsZWRpdG9yczoyOX1dLDM1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0hhbmRzb250YWJsZUVkaXRvcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGJ9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscyxsLGEsdSxjPShvPWUoImJyb3dzZXIiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pWyJkZWZhdWx0Il0saD0ocj1lKCJoZWxwZXJzL3VuaWNvZGUiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLktFWV9DT0RFUyxkPShpPWUoImhlbHBlcnMvb2JqZWN0IiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5leHRlbmQsZj0ocz1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5zZXRDYXJldFBvc2l0aW9uLHA9KGw9ZSgiaGVscGVycy9kb20vZXZlbnQiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLGc9cC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24sbT1wLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkLHc9KGE9ZSgiZWRpdG9ycyIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSksdj0ody5nZXRFZGl0b3Isdy5yZWdpc3RlckVkaXRvcikseT0odT1lKCJ0ZXh0RWRpdG9yIiksdSYmdS5fX2VzTW9kdWxlJiZ1fHx7ImRlZmF1bHQiOnV9KS5UZXh0RWRpdG9yLGI9eS5wcm90b3R5cGUuZXh0ZW5kKCk7Yi5wcm90b3R5cGUuY3JlYXRlRWxlbWVudHM9ZnVuY3Rpb24oKXt5LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50cy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7ZS5jbGFzc05hbWU9ImhhbmRzb250YWJsZUVkaXRvciIsdGhpcy5URVhUQVJFQV9QQVJFTlQuYXBwZW5kQ2hpbGQoZSksdGhpcy5odENvbnRhaW5lcj1lLHRoaXMuYXNzaWduSG9va3MoKX0sYi5wcm90b3R5cGUucHJlcGFyZT1mdW5jdGlvbihlLHQsbixvLHIsaSl7eS5wcm90b3R5cGUucHJlcGFyZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHM9dGhpcyxsPXtzdGFydFJvd3M6MCxzdGFydENvbHM6MCxtaW5Sb3dzOjAsbWluQ29sczowLGNsYXNzTmFtZToibGlzdGJveCIsY29weVBhc3RlOiExLGF1dG9Db2x1bW5TaXplOiExLGF1dG9Sb3dTaXplOiExLHJlYWRPbmx5OiEwLGZpbGxIYW5kbGU6ITEsYWZ0ZXJPbkNlbGxNb3VzZURvd246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFZhbHVlKCk7dm9pZCAwIT09ZSYmcy5zZXRWYWx1ZShlKSxzLmluc3RhbmNlLmRlc3Ryb3lFZGl0b3IoKX19O3RoaXMuY2VsbFByb3BlcnRpZXMuaGFuZHNvbnRhYmxlJiZkKGwsaS5oYW5kc29udGFibGUpLHRoaXMuaHRPcHRpb25zPWx9O3ZhciBDPWZ1bmN0aW9uKGUpe2lmKCFtKGUpKXt2YXIgdCxuPXRoaXMuZ2V0QWN0aXZlRWRpdG9yKCksbz1uLmh0RWRpdG9yLmdldEluc3RhbmNlKCk7aWYoZS5rZXlDb2RlPT1oLkFSUk9XX0RPV04paWYoby5nZXRTZWxlY3RlZCgpfHxvLmZsaXBwZWQpe2lmKG8uZ2V0U2VsZWN0ZWQoKSlpZihvLmZsaXBwZWQpdD1vLmdldFNlbGVjdGVkKClbMF0rMTtlbHNlIGlmKCFvLmZsaXBwZWQpe3ZhciByPW8uZ2V0U2VsZWN0ZWQoKVswXSxpPW8uY291bnRSb3dzKCktMTt0PU1hdGgubWluKGkscisxKX19ZWxzZSB0PTA7ZWxzZSBpZihlLmtleUNvZGU9PWguQVJST1dfVVApaWYoIW8uZ2V0U2VsZWN0ZWQoKSYmby5mbGlwcGVkKXQ9by5jb3VudFJvd3MoKS0xO2Vsc2UgaWYoby5nZXRTZWxlY3RlZCgpKWlmKG8uZmxpcHBlZCl7dmFyIHI9by5nZXRTZWxlY3RlZCgpWzBdO3Q9TWF0aC5tYXgoMCxyLTEpfWVsc2V7dmFyIHI9by5nZXRTZWxlY3RlZCgpWzBdO3Q9ci0xfXZvaWQgMCE9PXQmJigwPnR8fG8uZmxpcHBlZCYmdD5vLmNvdW50Um93cygpLTE/by5kZXNlbGVjdENlbGwoKTpvLnNlbGVjdENlbGwodCwwKSxvLmdldERhdGEoKS5sZW5ndGgmJihlLnByZXZlbnREZWZhdWx0KCksZyhlKSxuLmluc3RhbmNlLmxpc3RlbigpLG4uVEVYVEFSRUEuZm9jdXMoKSkpfX07Yi5wcm90b3R5cGUub3Blbj1mdW5jdGlvbigpe3RoaXMuaW5zdGFuY2UuYWRkSG9vaygiYmVmb3JlS2V5RG93biIsQykseS5wcm90b3R5cGUub3Blbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5odEVkaXRvciYmdGhpcy5odEVkaXRvci5kZXN0cm95KCksdGhpcy5odEVkaXRvcj1uZXcgYyh0aGlzLmh0Q29udGFpbmVyLHRoaXMuaHRPcHRpb25zKSx0aGlzLmNlbGxQcm9wZXJ0aWVzLnN0cmljdD8odGhpcy5odEVkaXRvci5zZWxlY3RDZWxsKDAsMCksdGhpcy5URVhUQVJFQS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iKToodGhpcy5odEVkaXRvci5kZXNlbGVjdENlbGwoKSx0aGlzLlRFWFRBUkVBLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiKSxmKHRoaXMuVEVYVEFSRUEsMCx0aGlzLlRFWFRBUkVBLnZhbHVlLmxlbmd0aCl9LGIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5pbnN0YW5jZS5yZW1vdmVIb29rKCJiZWZvcmVLZXlEb3duIixDKSx0aGlzLmluc3RhbmNlLmxpc3RlbigpLHkucHJvdG90eXBlLmNsb3NlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYi5wcm90b3R5cGUuZm9jdXM9ZnVuY3Rpb24oKXt0aGlzLmluc3RhbmNlLmxpc3RlbigpLHkucHJvdG90eXBlLmZvY3VzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYi5wcm90b3R5cGUuYmVnaW5FZGl0aW5nPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuaW5zdGFuY2UuZ2V0U2V0dGluZ3MoKS5vbkJlZ2luRWRpdGluZzt0JiZ0KCk9PT0hMXx8eS5wcm90b3R5cGUuYmVnaW5FZGl0aW5nLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYi5wcm90b3R5cGUuZmluaXNoRWRpdGluZz1mdW5jdGlvbihlLHQpe2lmKHRoaXMuaHRFZGl0b3ImJnRoaXMuaHRFZGl0b3IuaXNMaXN0ZW5pbmcoKSYmdGhpcy5pbnN0YW5jZS5saXN0ZW4oKSx0aGlzLmh0RWRpdG9yJiZ0aGlzLmh0RWRpdG9yLmdldFNlbGVjdGVkKCkpe3ZhciBuPXRoaXMuaHRFZGl0b3IuZ2V0SW5zdGFuY2UoKS5nZXRWYWx1ZSgpO3ZvaWQgMCE9PW4mJnRoaXMuc2V0VmFsdWUobil9cmV0dXJuIHkucHJvdG90eXBlLmZpbmlzaEVkaXRpbmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxiLnByb3RvdHlwZS5hc3NpZ25Ib29rcz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5pbnN0YW5jZS5hZGRIb29rKCJhZnRlckRlc3Ryb3kiLGZ1bmN0aW9uKCl7ZS5odEVkaXRvciYmZS5odEVkaXRvci5kZXN0cm95KCl9KX0sdigiaGFuZHNvbnRhYmxlIixiKX0se2Jyb3dzZXI6MjMsZWRpdG9yczoyOSwiaGVscGVycy9kb20vZWxlbWVudCI6NDYsImhlbHBlcnMvZG9tL2V2ZW50Ijo0NywiaGVscGVycy9vYmplY3QiOjUyLCJoZWxwZXJzL3VuaWNvZGUiOjU1LHRleHRFZGl0b3I6NDB9XSwzNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtNb2JpbGVUZXh0RWRpdG9yOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ga319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGwsYSx1LGM9KChvPWUoImJyb3dzZXIiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pWyJkZWZhdWx0Il0sKHI9ZSgiaGVscGVycy91bmljb2RlIiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KS5LRVlfQ09ERVMpLGg9KGk9ZSgiaGVscGVycy9kb20vZXZlbnQiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLGQ9aC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24sZj1oLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkLHA9KHM9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSksZz1wLmFkZENsYXNzLG09cC5nZXRTY3JvbGxMZWZ0LHc9cC5nZXRTY3JvbGxUb3Asdj1wLmhhc0NsYXNzLHk9cC5pc0NoaWxkT2YsYj1wLm9mZnNldCxDPXAub3V0ZXJIZWlnaHQsXz1wLm91dGVyV2lkdGgsUj1wLnJlbW92ZUNsYXNzLFM9cC5zZXRDYXJldFBvc2l0aW9uLEU9KGw9ZSgiZWRpdG9ycyIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSksVD0oRS5nZXRFZGl0b3IsRS5yZWdpc3RlckVkaXRvciksTT0oYT1lKCJfYmFzZUVkaXRvciIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSkuQmFzZUVkaXRvcixPPSh1PWUoImV2ZW50TWFuYWdlciIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSkuZXZlbnRNYW5hZ2VyLGs9TS5wcm90b3R5cGUuZXh0ZW5kKCksSD17fSxEPWZ1bmN0aW9uKCl7dGhpcy5jb250cm9scz17fSx0aGlzLmNvbnRyb2xzLmxlZnRCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksdGhpcy5jb250cm9scy5sZWZ0QnV0dG9uLmNsYXNzTmFtZT0ibGVmdEJ1dHRvbiIsdGhpcy5jb250cm9scy5yaWdodEJ1dHRvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLmNvbnRyb2xzLnJpZ2h0QnV0dG9uLmNsYXNzTmFtZT0icmlnaHRCdXR0b24iLHRoaXMuY29udHJvbHMudXBCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksdGhpcy5jb250cm9scy51cEJ1dHRvbi5jbGFzc05hbWU9InVwQnV0dG9uIix0aGlzLmNvbnRyb2xzLmRvd25CdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksdGhpcy5jb250cm9scy5kb3duQnV0dG9uLmNsYXNzTmFtZT0iZG93bkJ1dHRvbiI7Zm9yKHZhciBlIGluIHRoaXMuY29udHJvbHMpdGhpcy5jb250cm9scy5oYXNPd25Qcm9wZXJ0eShlKSYmdGhpcy5wb3NpdGlvbkNvbnRyb2xzLmFwcGVuZENoaWxkKHRoaXMuY29udHJvbHNbZV0pfTtrLnByb3RvdHlwZS52YWx1ZUNoYW5nZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0VmFsdWUhPXRoaXMuZ2V0VmFsdWUoKX0say5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5ldmVudE1hbmFnZXI9Tyh0aGlzLmluc3RhbmNlKSx0aGlzLmNyZWF0ZUVsZW1lbnRzKCksdGhpcy5iaW5kRXZlbnRzKCksdGhpcy5pbnN0YW5jZS5hZGRIb29rKCJhZnRlckRlc3Ryb3kiLGZ1bmN0aW9uKCl7ZS5kZXN0cm95KCl9KX0say5wcm90b3R5cGUuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5URVhUQVJFQS52YWx1ZX0say5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oZSl7dGhpcy5pbml0VmFsdWU9ZSx0aGlzLlRFWFRBUkVBLnZhbHVlPWV9LGsucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5lZGl0b3JDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksdGhpcy5lZGl0b3JDb250YWluZXIuY2xhc3NOYW1lPSJodE1vYmlsZUVkaXRvckNvbnRhaW5lciIsdGhpcy5jZWxsUG9pbnRlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLmNlbGxQb2ludGVyLmNsYXNzTmFtZT0iY2VsbFBvaW50ZXIiLHRoaXMubW92ZUhhbmRsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLm1vdmVIYW5kbGUuY2xhc3NOYW1lPSJtb3ZlSGFuZGxlIix0aGlzLmlucHV0UGFuZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLmlucHV0UGFuZS5jbGFzc05hbWU9ImlucHV0cyIsdGhpcy5wb3NpdGlvbkNvbnRyb2xzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHRoaXMucG9zaXRpb25Db250cm9scy5jbGFzc05hbWU9InBvc2l0aW9uQ29udHJvbHMiLHRoaXMuVEVYVEFSRUE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKSxnKHRoaXMuVEVYVEFSRUEsImhhbmRzb250YWJsZUlucHV0IiksdGhpcy5pbnB1dFBhbmUuYXBwZW5kQ2hpbGQodGhpcy5URVhUQVJFQSksdGhpcy5lZGl0b3JDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jZWxsUG9pbnRlciksdGhpcy5lZGl0b3JDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5tb3ZlSGFuZGxlKSx0aGlzLmVkaXRvckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmlucHV0UGFuZSksdGhpcy5lZGl0b3JDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5wb3NpdGlvbkNvbnRyb2xzKSxELmNhbGwodGhpcyksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmVkaXRvckNvbnRhaW5lcil9LGsucHJvdG90eXBlLm9uQmVmb3JlS2V5RG93bj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dC5nZXRBY3RpdmVFZGl0b3IoKTtpZihlLnRhcmdldD09PW4uVEVYVEFSRUEmJiFmKGUpKXN3aXRjaChlLmtleUNvZGUpe2Nhc2UgYy5FTlRFUjpuLmNsb3NlKCksZS5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgYy5CQUNLU1BBQ0U6ZChlKX19LGsucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oKXt0aGlzLmluc3RhbmNlLmFkZEhvb2soImJlZm9yZUtleURvd24iLHRoaXMub25CZWZvcmVLZXlEb3duKSxnKHRoaXMuZWRpdG9yQ29udGFpbmVyLCJhY3RpdmUiKSxSKHRoaXMuY2VsbFBvaW50ZXIsImhpZGRlbiIpLHRoaXMudXBkYXRlRWRpdG9yUG9zaXRpb24oKX0say5wcm90b3R5cGUuZm9jdXM9ZnVuY3Rpb24oKXt0aGlzLlRFWFRBUkVBLmZvY3VzKCksUyh0aGlzLlRFWFRBUkVBLHRoaXMuVEVYVEFSRUEudmFsdWUubGVuZ3RoKX0say5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLlRFWFRBUkVBLmJsdXIoKSx0aGlzLmluc3RhbmNlLnJlbW92ZUhvb2soImJlZm9yZUtleURvd24iLHRoaXMub25CZWZvcmVLZXlEb3duKSxSKHRoaXMuZWRpdG9yQ29udGFpbmVyLCJhY3RpdmUiKX0say5wcm90b3R5cGUuc2Nyb2xsVG9WaWV3PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5pbnN0YW5jZS5nZXRTZWxlY3RlZFJhbmdlKCkuaGlnaGxpZ2h0O3RoaXMuaW5zdGFuY2Uudmlldy5zY3JvbGxWaWV3cG9ydChlKX0say5wcm90b3R5cGUuaGlkZUNlbGxQb2ludGVyPWZ1bmN0aW9uKCl7dih0aGlzLmNlbGxQb2ludGVyLCJoaWRkZW4iKXx8Zyh0aGlzLmNlbGxQb2ludGVyLCJoaWRkZW4iKX0say5wcm90b3R5cGUudXBkYXRlRWRpdG9yUG9zaXRpb249ZnVuY3Rpb24oZSx0KXtpZihlJiZ0KWU9cGFyc2VJbnQoZSwxMCksdD1wYXJzZUludCh0LDEwKSx0aGlzLmVkaXRvckNvbnRhaW5lci5zdHlsZS50b3A9dCsicHgiLHRoaXMuZWRpdG9yQ29udGFpbmVyLnN0eWxlLmxlZnQ9ZSsicHgiO2Vsc2V7dmFyIG49dGhpcy5pbnN0YW5jZS5nZXRTZWxlY3RlZCgpLG89dGhpcy5pbnN0YW5jZS5nZXRDZWxsKG5bMF0sblsxXSk7aWYoSC5jZWxsUG9pbnRlcnx8KEguY2VsbFBvaW50ZXI9e2hlaWdodDpDKHRoaXMuY2VsbFBvaW50ZXIpLHdpZHRoOl8odGhpcy5jZWxsUG9pbnRlcil9KSxILmVkaXRvckNvbnRhaW5lcnx8KEguZWRpdG9yQ29udGFpbmVyPXt3aWR0aDpfKHRoaXMuZWRpdG9yQ29udGFpbmVyKX0pLHZvaWQgMCE9PW8pe3ZhciByPXRoaXMuaW5zdGFuY2Uudmlldy53dC53dE92ZXJsYXlzLmxlZnRPdmVybGF5LnRyaW1taW5nQ29udGFpbmVyPT13aW5kb3c/MDptKHRoaXMuaW5zdGFuY2Uudmlldy53dC53dE92ZXJsYXlzLmxlZnRPdmVybGF5LmhvbGRlciksaT10aGlzLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy50b3BPdmVybGF5LnRyaW1taW5nQ29udGFpbmVyPT13aW5kb3c/MDp3KHRoaXMuaW5zdGFuY2Uudmlldy53dC53dE92ZXJsYXlzLnRvcE92ZXJsYXkuaG9sZGVyKSxzPWIobyksbD1fKG8pLGE9e3g6cix5Oml9O3RoaXMuZWRpdG9yQ29udGFpbmVyLnN0eWxlLnRvcD1wYXJzZUludChzLnRvcCtDKG8pLWEueStILmNlbGxQb2ludGVyLmhlaWdodCwxMCkrInB4Iix0aGlzLmVkaXRvckNvbnRhaW5lci5zdHlsZS5sZWZ0PXBhcnNlSW50KHdpbmRvdy5pbm5lcldpZHRoLzItSC5lZGl0b3JDb250YWluZXIud2lkdGgvMiwxMCkrInB4IixzLmxlZnQrbC8yPnBhcnNlSW50KHRoaXMuZWRpdG9yQ29udGFpbmVyLnN0eWxlLmxlZnQsMTApK0guZWRpdG9yQ29udGFpbmVyLndpZHRoP3RoaXMuZWRpdG9yQ29udGFpbmVyLnN0eWxlLmxlZnQ9d2luZG93LmlubmVyV2lkdGgtSC5lZGl0b3JDb250YWluZXIud2lkdGgrInB4IjpzLmxlZnQrbC8yPHBhcnNlSW50KHRoaXMuZWRpdG9yQ29udGFpbmVyLnN0eWxlLmxlZnQsMTApKzIwJiYodGhpcy5lZGl0b3JDb250YWluZXIuc3R5bGUubGVmdD0iMHB4IiksdGhpcy5jZWxsUG9pbnRlci5zdHlsZS5sZWZ0PXBhcnNlSW50KHMubGVmdC1ILmNlbGxQb2ludGVyLndpZHRoLzItYih0aGlzLmVkaXRvckNvbnRhaW5lcikubGVmdCtsLzItYS54LDEwKSsicHgifX19LGsucHJvdG90eXBlLnVwZGF0ZUVkaXRvckRhdGE9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmluc3RhbmNlLmdldFNlbGVjdGVkKCksdD10aGlzLmluc3RhbmNlLmdldERhdGFBdENlbGwoZVswXSxlWzFdKTt0aGlzLnJvdz1lWzBdLHRoaXMuY29sPWVbMV0sdGhpcy5zZXRWYWx1ZSh0KSx0aGlzLnVwZGF0ZUVkaXRvclBvc2l0aW9uKCl9LGsucHJvdG90eXBlLnByZXBhcmVBbmRTYXZlPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIHRoaXMudmFsdWVDaGFuZ2VkKCk/KGU9dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5ncygpLnRyaW1XaGl0ZXNwYWNlP1tbU3RyaW5nLnByb3RvdHlwZS50cmltLmNhbGwodGhpcy5nZXRWYWx1ZSgpKV1dOltbdGhpcy5nZXRWYWx1ZSgpXV0sdm9pZCB0aGlzLnNhdmVWYWx1ZShlKSk6ITB9LGsucHJvdG90eXBlLmJpbmRFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5jb250cm9scy5sZWZ0QnV0dG9uLCJ0b3VjaGVuZCIsZnVuY3Rpb24odCl7ZS5wcmVwYXJlQW5kU2F2ZSgpLGUuaW5zdGFuY2Uuc2VsZWN0aW9uLnRyYW5zZm9ybVN0YXJ0KDAsLTEsbnVsbCwhMCksZS51cGRhdGVFZGl0b3JEYXRhKCksdC5wcmV2ZW50RGVmYXVsdCgpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmNvbnRyb2xzLnJpZ2h0QnV0dG9uLCJ0b3VjaGVuZCIsZnVuY3Rpb24odCl7ZS5wcmVwYXJlQW5kU2F2ZSgpLGUuaW5zdGFuY2Uuc2VsZWN0aW9uLnRyYW5zZm9ybVN0YXJ0KDAsMSxudWxsLCEwKSxlLnVwZGF0ZUVkaXRvckRhdGEoKSx0LnByZXZlbnREZWZhdWx0KCl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHRoaXMuY29udHJvbHMudXBCdXR0b24sInRvdWNoZW5kIixmdW5jdGlvbih0KXtlLnByZXBhcmVBbmRTYXZlKCksZS5pbnN0YW5jZS5zZWxlY3Rpb24udHJhbnNmb3JtU3RhcnQoLTEsMCxudWxsLCEwKSxlLnVwZGF0ZUVkaXRvckRhdGEoKSx0LnByZXZlbnREZWZhdWx0KCl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHRoaXMuY29udHJvbHMuZG93bkJ1dHRvbiwidG91Y2hlbmQiLGZ1bmN0aW9uKHQpe2UucHJlcGFyZUFuZFNhdmUoKSxlLmluc3RhbmNlLnNlbGVjdGlvbi50cmFuc2Zvcm1TdGFydCgxLDAsbnVsbCwhMCksZS51cGRhdGVFZGl0b3JEYXRhKCksdC5wcmV2ZW50RGVmYXVsdCgpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLm1vdmVIYW5kbGUsInRvdWNoc3RhcnQiLGZ1bmN0aW9uKHQpe2lmKDE9PXQudG91Y2hlcy5sZW5ndGgpe3ZhciBuPXQudG91Y2hlc1swXSxvPXt4OmUuZWRpdG9yQ29udGFpbmVyLm9mZnNldExlZnQseTplLmVkaXRvckNvbnRhaW5lci5vZmZzZXRUb3B9LHI9e3g6bi5wYWdlWC1vLngseTpuLnBhZ2VZLW8ueX07ZS5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLCJ0b3VjaG1vdmUiLGZ1bmN0aW9uKHQpe3ZhciBuPXQudG91Y2hlc1swXTtlLnVwZGF0ZUVkaXRvclBvc2l0aW9uKG4ucGFnZVgtci54LG4ucGFnZVktci55KSxlLmhpZGVDZWxsUG9pbnRlcigpLHQucHJldmVudERlZmF1bHQoKX0pfX0pLHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQuYm9keSwidG91Y2hlbmQiLGZ1bmN0aW9uKHQpe3kodC50YXJnZXQsZS5lZGl0b3JDb250YWluZXIpfHx5KHQudGFyZ2V0LGUuaW5zdGFuY2Uucm9vdEVsZW1lbnQpfHxlLmNsb3NlKCl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHRoaXMuaW5zdGFuY2Uudmlldy53dC53dE92ZXJsYXlzLmxlZnRPdmVybGF5LmhvbGRlciwic2Nyb2xsIixmdW5jdGlvbih0KXtlLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy5sZWZ0T3ZlcmxheS50cmltbWluZ0NvbnRhaW5lciE9d2luZG93JiZlLmhpZGVDZWxsUG9pbnRlcigpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy50b3BPdmVybGF5LmhvbGRlciwic2Nyb2xsIixmdW5jdGlvbih0KXtlLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy50b3BPdmVybGF5LnRyaW1taW5nQ29udGFpbmVyIT13aW5kb3cmJmUuaGlkZUNlbGxQb2ludGVyKCl9KX0say5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZXZlbnRNYW5hZ2VyLmNsZWFyKCksdGhpcy5lZGl0b3JDb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVkaXRvckNvbnRhaW5lcil9LFQoIm1vYmlsZSIsayl9LHtfYmFzZUVkaXRvcjozMCxicm93c2VyOjIzLGVkaXRvcnM6MjksZXZlbnRNYW5hZ2VyOjQxLCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9kb20vZXZlbnQiOjQ3LCJoZWxwZXJzL3VuaWNvZGUiOjU1fV0sMzc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7TnVtZXJpY0VkaXRvcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHV9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscz0obz1lKCJudW1lcmFsIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLGw9KHI9ZSgiZWRpdG9ycyIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkucmVnaXN0ZXJFZGl0b3IsYT0oaT1lKCJ0ZXh0RWRpdG9yIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5UZXh0RWRpdG9yLHU9ZnVuY3Rpb24oKXskdHJhY2V1clJ1bnRpbWUuc3VwZXJDb25zdHJ1Y3RvcihjKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGM9dTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3ModSx7YmVnaW5FZGl0aW5nOmZ1bmN0aW9uKGUpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZSYmdGhpcy5vcmlnaW5hbFZhbHVlKXsidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuY2VsbFByb3BlcnRpZXMubGFuZ3VhZ2UmJnMubGFuZ3VhZ2UodGhpcy5jZWxsUHJvcGVydGllcy5sYW5ndWFnZSk7dmFyIHQ9cy5sYW5ndWFnZURhdGEoKS5kZWxpbWl0ZXJzLmRlY2ltYWw7ZT0oIiIrdGhpcy5vcmlnaW5hbFZhbHVlKS5yZXBsYWNlKCIuIix0KX0kdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxjLnByb3RvdHlwZSwiYmVnaW5FZGl0aW5nIikuY2FsbCh0aGlzLGUpfX0se30sYSksbCgibnVtZXJpYyIsdSl9LHtlZGl0b3JzOjI5LG51bWVyYWw6Im51bWVyYWwiLHRleHRFZGl0b3I6NDB9XSwzODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtQYXNzd29yZEVkaXRvcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGh9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscyxsPSgobz1lKCJicm93c2VyIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLChyPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLmVtcHR5KSxhPShpPWUoImVkaXRvcnMiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLHU9KGEuZ2V0RWRpdG9yLGEucmVnaXN0ZXJFZGl0b3IpLGM9KHM9ZSgidGV4dEVkaXRvciIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuVGV4dEVkaXRvcixoPWZ1bmN0aW9uKCl7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IoZCkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxkPWg7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKGgse2NyZWF0ZUVsZW1lbnRzOmZ1bmN0aW9uKCl7JHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsZC5wcm90b3R5cGUsImNyZWF0ZUVsZW1lbnRzIikuY2FsbCh0aGlzKSx0aGlzLlRFWFRBUkVBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdGhpcy5URVhUQVJFQS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJwYXNzd29yZCIpLHRoaXMuVEVYVEFSRUEuY2xhc3NOYW1lPSJoYW5kc29udGFibGVJbnB1dCIsdGhpcy50ZXh0YXJlYVN0eWxlPXRoaXMuVEVYVEFSRUEuc3R5bGUsdGhpcy50ZXh0YXJlYVN0eWxlLndpZHRoPTAsdGhpcy50ZXh0YXJlYVN0eWxlLmhlaWdodD0wLGwodGhpcy5URVhUQVJFQV9QQVJFTlQpLHRoaXMuVEVYVEFSRUFfUEFSRU5ULmFwcGVuZENoaWxkKHRoaXMuVEVYVEFSRUEpfX0se30sYyksdSgicGFzc3dvcmQiLGgpfSx7YnJvd3NlcjoyMyxlZGl0b3JzOjI5LCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0Nix0ZXh0RWRpdG9yOjQwfV0sMzk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7U2VsZWN0RWRpdG9yOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVH19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGwsYSx1PShvPWUoImJyb3dzZXIiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pWyJkZWZhdWx0Il0sYz0ocj1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KSxoPWMuYWRkQ2xhc3MsZD1jLmVtcHR5LGY9Yy5mYXN0SW5uZXJIVE1MLHA9Yy5nZXRDb21wdXRlZFN0eWxlLGc9Yy5nZXRDc3NUcmFuc2Zvcm0sbT1jLmdldFNjcm9sbGFibGVFbGVtZW50LHc9Yy5vZmZzZXQsdj1jLm91dGVySGVpZ2h0LHk9Yy5vdXRlcldpZHRoLGI9Yy5yZXNldENzc1RyYW5zZm9ybSxDPShpPWUoImhlbHBlcnMvZG9tL2V2ZW50IiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24sXz0ocz1lKCJoZWxwZXJzL3VuaWNvZGUiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLktFWV9DT0RFUyxSPShsPWUoImVkaXRvcnMiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLFM9KFIuZ2V0RWRpdG9yLFIucmVnaXN0ZXJFZGl0b3IpLEU9KGE9ZSgiX2Jhc2VFZGl0b3IiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLkJhc2VFZGl0b3IsVD1FLnByb3RvdHlwZS5leHRlbmQoKTtULnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiU0VMRUNUIiksaCh0aGlzLnNlbGVjdCwiaHRTZWxlY3RFZGl0b3IiKSx0aGlzLnNlbGVjdC5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLmluc3RhbmNlLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0KSx0aGlzLnJlZ2lzdGVySG9va3MoKX0sVC5wcm90b3R5cGUucmVnaXN0ZXJIb29rcz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5pbnN0YW5jZS5hZGRIb29rKCJhZnRlclNjcm9sbEhvcml6b250YWxseSIsZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWZyZXNoRGltZW5zaW9ucygpfSksdGhpcy5pbnN0YW5jZS5hZGRIb29rKCJhZnRlclNjcm9sbFZlcnRpY2FsbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIGUucmVmcmVzaERpbWVuc2lvbnMoKX0pLHRoaXMuaW5zdGFuY2UuYWRkSG9vaygiYWZ0ZXJDb2x1bW5SZXNpemUiLGZ1bmN0aW9uKCl7cmV0dXJuIGUucmVmcmVzaERpbWVuc2lvbnMoKX0pLHRoaXMuaW5zdGFuY2UuYWRkSG9vaygiYWZ0ZXJSb3dSZXNpemUiLGZ1bmN0aW9uKCl7cmV0dXJuIGUucmVmcmVzaERpbWVuc2lvbnMoKX0pfSxULnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKCl7RS5wcm90b3R5cGUucHJlcGFyZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGUsdD10aGlzLmNlbGxQcm9wZXJ0aWVzLnNlbGVjdE9wdGlvbnM7ZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLnByZXBhcmVPcHRpb25zKHQodGhpcy5yb3csdGhpcy5jb2wsdGhpcy5wcm9wKSk6dGhpcy5wcmVwYXJlT3B0aW9ucyh0KSxkKHRoaXMuc2VsZWN0KTtmb3IodmFyIG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG4pKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJPUFRJT04iKTtvLnZhbHVlPW4sZihvLGVbbl0pLHRoaXMuc2VsZWN0LmFwcGVuZENoaWxkKG8pfX0sVC5wcm90b3R5cGUucHJlcGFyZU9wdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIHQ9e307aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIG49MCxvPWUubGVuZ3RoO28+bjtuKyspdFtlW25dXT1lW25dO2Vsc2Uib2JqZWN0Ij09dHlwZW9mIGUmJih0PWUpO3JldHVybiB0fSxULnByb3RvdHlwZS5nZXRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdC52YWx1ZX0sVC5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oZSl7dGhpcy5zZWxlY3QudmFsdWU9ZX07dmFyIE09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXQuZ2V0QWN0aXZlRWRpdG9yKCk7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSBfLkFSUk9XX1VQOnZhciBvPW4uc2VsZWN0LnNlbGVjdGVkSW5kZXgtMTtvPj0wJiYobi5zZWxlY3Rbb10uc2VsZWN0ZWQ9ITApLEMoZSksZS5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgXy5BUlJPV19ET1dOOnZhciByPW4uc2VsZWN0LnNlbGVjdGVkSW5kZXgrMTtyPD1uLnNlbGVjdC5sZW5ndGgtMSYmKG4uc2VsZWN0W3JdLnNlbGVjdGVkPSEwKSxDKGUpLGUucHJldmVudERlZmF1bHQoKX19O1QucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWQ9ITAsdGhpcy5yZWZyZXNoRGltZW5zaW9ucygpLHRoaXMuc2VsZWN0LnN0eWxlLmRpc3BsYXk9IiIsdGhpcy5pbnN0YW5jZS5hZGRIb29rKCJiZWZvcmVLZXlEb3duIixNKX0sVC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWQ9ITEsdGhpcy5zZWxlY3Quc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5pbnN0YW5jZS5yZW1vdmVIb29rKCJiZWZvcmVLZXlEb3duIixNKX0sVC5wcm90b3R5cGUuZm9jdXM9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdC5mb2N1cygpfSxULnByb3RvdHlwZS5yZWZyZXNoRGltZW5zaW9ucz1mdW5jdGlvbigpe2lmKHRoaXMuc3RhdGU9PT11LkVkaXRvclN0YXRlLkVESVRJTkcpe2lmKHRoaXMuVEQ9dGhpcy5nZXRFZGl0ZWRDZWxsKCksIXRoaXMuVEQpcmV0dXJuIHZvaWQgdGhpcy5jbG9zZSgpO3ZhciBlLHQ9eSh0aGlzLlREKSsxLG49dih0aGlzLlREKSsxLG89dyh0aGlzLlREKSxyPXcodGhpcy5pbnN0YW5jZS5yb290RWxlbWVudCksaT1tKHRoaXMuVEQpLHM9by50b3Atci50b3AtMS0oaS5zY3JvbGxUb3B8fDApLGw9by5sZWZ0LXIubGVmdC0xLShpLnNjcm9sbExlZnR8fDApLGE9dGhpcy5jaGVja0VkaXRvclNlY3Rpb24oKSxjPXRoaXMuaW5zdGFuY2UuZ2V0U2V0dGluZ3MoKTtjLnJvd0hlYWRlcnM/MTowLGMuY29sSGVhZGVycz8xOjA7c3dpdGNoKGEpe2Nhc2UidG9wIjplPWcodGhpcy5pbnN0YW5jZS52aWV3Lnd0Lnd0T3ZlcmxheXMudG9wT3ZlcmxheS5jbG9uZS53dFRhYmxlLmhvbGRlci5wYXJlbnROb2RlKTticmVhaztjYXNlImxlZnQiOmU9Zyh0aGlzLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy5sZWZ0T3ZlcmxheS5jbG9uZS53dFRhYmxlLmhvbGRlci5wYXJlbnROb2RlKTticmVhaztjYXNlInRvcC1sZWZ0LWNvcm5lciI6ZT1nKHRoaXMuaW5zdGFuY2Uudmlldy53dC53dE92ZXJsYXlzLnRvcExlZnRDb3JuZXJPdmVybGF5LmNsb25lLnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUpO2JyZWFrO2Nhc2UiYm90dG9tLWxlZnQtY29ybmVyIjplPWcodGhpcy5pbnN0YW5jZS52aWV3Lnd0Lnd0T3ZlcmxheXMuYm90dG9tTGVmdENvcm5lck92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZSk7YnJlYWs7Y2FzZSJib3R0b20iOmU9Zyh0aGlzLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy5ib3R0b21PdmVybGF5LmNsb25lLnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUpfTA9PT10aGlzLmluc3RhbmNlLmdldFNlbGVjdGVkKClbMF0mJihzKz0xKSwwPT09dGhpcy5pbnN0YW5jZS5nZXRTZWxlY3RlZCgpWzFdJiYobCs9MSk7dmFyIGg9dGhpcy5zZWxlY3Quc3R5bGU7ZSYmLTEhPWU/aFtlWzBdXT1lWzFdOmIodGhpcy5zZWxlY3QpO3ZhciBkPXAodGhpcy5URCk7cGFyc2VJbnQoZC5ib3JkZXJUb3BXaWR0aCwxMCk+MCYmKG4tPTEpLHBhcnNlSW50KGQuYm9yZGVyTGVmdFdpZHRoLDEwKT4wJiYodC09MSksaC5oZWlnaHQ9bisicHgiLGgubWluV2lkdGg9dCsicHgiLGgudG9wPXMrInB4IixoLmxlZnQ9bCsicHgiLGgubWFyZ2luPSIwcHgifX0sVC5wcm90b3R5cGUuZ2V0RWRpdGVkQ2VsbD1mdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5jaGVja0VkaXRvclNlY3Rpb24oKTtzd2l0Y2godCl7Y2FzZSJ0b3AiOmU9dGhpcy5pbnN0YW5jZS52aWV3Lnd0Lnd0T3ZlcmxheXMudG9wT3ZlcmxheS5jbG9uZS53dFRhYmxlLmdldENlbGwoe3Jvdzp0aGlzLnJvdyxjb2w6dGhpcy5jb2x9KSx0aGlzLnNlbGVjdC5zdHlsZS56SW5kZXg9MTAxO2JyZWFrO2Nhc2UiY29ybmVyIjplPXRoaXMuaW5zdGFuY2Uudmlldy53dC53dE92ZXJsYXlzLnRvcExlZnRDb3JuZXJPdmVybGF5LmNsb25lLnd0VGFibGUuZ2V0Q2VsbCh7cm93OnRoaXMucm93LGNvbDp0aGlzLmNvbH0pLHRoaXMuc2VsZWN0LnN0eWxlLnpJbmRleD0xMDM7YnJlYWs7Y2FzZSJsZWZ0IjplPXRoaXMuaW5zdGFuY2Uudmlldy53dC53dE92ZXJsYXlzLmxlZnRPdmVybGF5LmNsb25lLnd0VGFibGUuZ2V0Q2VsbCh7cm93OnRoaXMucm93LGNvbDp0aGlzLmNvbH0pLHRoaXMuc2VsZWN0LnN0eWxlLnpJbmRleD0xMDI7YnJlYWs7ZGVmYXVsdDplPXRoaXMuaW5zdGFuY2UuZ2V0Q2VsbCh0aGlzLnJvdyx0aGlzLmNvbCksdGhpcy5zZWxlY3Quc3R5bGUuekluZGV4PSIifXJldHVybi0xIT1lJiYtMiE9ZT9lOnZvaWQgMH0sUygic2VsZWN0IixUKX0se19iYXNlRWRpdG9yOjMwLGJyb3dzZXI6MjMsZWRpdG9yczoyOSwiaGVscGVycy9kb20vZWxlbWVudCI6NDYsImhlbHBlcnMvZG9tL2V2ZW50Ijo0NywiaGVscGVycy91bmljb2RlIjo1NX1dLDQwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se1RleHRFZGl0b3I6e2dldDpmdW5jdGlvbigpe3JldHVybiBOfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpLHMsbCxhLHUsYyxoPShvPWUoImJyb3dzZXIiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pWyJkZWZhdWx0Il0sZD0ocj1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KSxmPWQuYWRkQ2xhc3MscD1kLmdldENhcmV0UG9zaXRpb24sZz1kLmdldENvbXB1dGVkU3R5bGUsbT1kLmdldENzc1RyYW5zZm9ybSx3PWQuZ2V0U2Nyb2xsYWJsZUVsZW1lbnQsdj1kLmdldFNjcm9sbGJhcldpZHRoLHk9ZC5pbm5lcldpZHRoLGI9ZC5vZmZzZXQsQz1kLnJlc2V0Q3NzVHJhbnNmb3JtLF89ZC5zZXRDYXJldFBvc2l0aW9uLFI9ZC5oYXNWZXJ0aWNhbFNjcm9sbGJhcixTPWQuaGFzSG9yaXpvbnRhbFNjcm9sbGJhcixFPShpPWUoImF1dG9SZXNpemUiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pWyJkZWZhdWx0Il0sVD0ocz1lKCJfYmFzZUVkaXRvciIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuQmFzZUVkaXRvcixNPShsPWUoImV2ZW50TWFuYWdlciIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSkuZXZlbnRNYW5hZ2VyLE89KGE9ZSgiZWRpdG9ycyIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSksaz0oTy5nZXRFZGl0b3IsTy5yZWdpc3RlckVkaXRvciksSD0odT1lKCJoZWxwZXJzL3VuaWNvZGUiKSx1JiZ1Ll9fZXNNb2R1bGUmJnV8fHsiZGVmYXVsdCI6dX0pLktFWV9DT0RFUyxEPShjPWUoImhlbHBlcnMvZG9tL2V2ZW50IiksYyYmYy5fX2VzTW9kdWxlJiZjfHx7ImRlZmF1bHQiOmN9KSxBPUQuc3RvcFByb3BhZ2F0aW9uLHg9RC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24sUD1ELmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkLE49VC5wcm90b3R5cGUuZXh0ZW5kKCk7Ti5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5jcmVhdGVFbGVtZW50cygpLHRoaXMuZXZlbnRNYW5hZ2VyPU0odGhpcyksdGhpcy5iaW5kRXZlbnRzKCksdGhpcy5hdXRvUmVzaXplPUUoKSx0aGlzLmluc3RhbmNlLmFkZEhvb2soImFmdGVyRGVzdHJveSIsZnVuY3Rpb24oKXtlLmRlc3Ryb3koKX0pfSxOLnByb3RvdHlwZS5nZXRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlRFWFRBUkVBLnZhbHVlfSxOLnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbihlKXt0aGlzLlRFWFRBUkVBLnZhbHVlPWV9O3ZhciBMPWZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcyxvPW4uZ2V0QWN0aXZlRWRpdG9yKCk7aWYodD0oZS5jdHJsS2V5fHxlLm1ldGFLZXkpJiYhZS5hbHRLZXksZS50YXJnZXQ9PT1vLlRFWFRBUkVBJiYhUChlKSl7aWYoMTc9PT1lLmtleUNvZGV8fDIyND09PWUua2V5Q29kZXx8OTE9PT1lLmtleUNvZGV8fDkzPT09ZS5rZXlDb2RlKXJldHVybiB2b2lkIHgoZSk7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSBILkFSUk9XX1JJR0hUOm8uaXNJbkZ1bGxFZGl0TW9kZSgpJiYoIW8uaXNXYWl0aW5nKCkmJiFvLmFsbG93S2V5RXZlbnRQcm9wYWdhdGlvbnx8IW8uaXNXYWl0aW5nKCkmJm8uYWxsb3dLZXlFdmVudFByb3BhZ2F0aW9uJiYhby5hbGxvd0tleUV2ZW50UHJvcGFnYXRpb24oZS5rZXlDb2RlKSkmJngoZSk7YnJlYWs7Y2FzZSBILkFSUk9XX0xFRlQ6by5pc0luRnVsbEVkaXRNb2RlKCkmJighby5pc1dhaXRpbmcoKSYmIW8uYWxsb3dLZXlFdmVudFByb3BhZ2F0aW9ufHwhby5pc1dhaXRpbmcoKSYmby5hbGxvd0tleUV2ZW50UHJvcGFnYXRpb24mJiFvLmFsbG93S2V5RXZlbnRQcm9wYWdhdGlvbihlLmtleUNvZGUpKSYmeChlKTticmVhaztjYXNlIEguQVJST1dfVVA6Y2FzZSBILkFSUk9XX0RPV046by5pc0luRnVsbEVkaXRNb2RlKCkmJighby5pc1dhaXRpbmcoKSYmIW8uYWxsb3dLZXlFdmVudFByb3BhZ2F0aW9ufHwhby5pc1dhaXRpbmcoKSYmby5hbGxvd0tleUV2ZW50UHJvcGFnYXRpb24mJiFvLmFsbG93S2V5RXZlbnRQcm9wYWdhdGlvbihlLmtleUNvZGUpKSYmeChlKTticmVhaztjYXNlIEguRU5URVI6dmFyIHI9by5pbnN0YW5jZS5nZXRTZWxlY3RlZCgpLGk9IShyWzBdPT09clsyXSYmclsxXT09PXJbM10pO2lmKHQmJiFpfHxlLmFsdEtleSl7aWYoby5pc09wZW5lZCgpKXt2YXIgcz1wKG8uVEVYVEFSRUEpLGw9by5nZXRWYWx1ZSgpLGE9bC5zbGljZSgwLHMpKyJcbiIrbC5zbGljZShzKTtvLnNldFZhbHVlKGEpLF8oby5URVhUQVJFQSxzKzEpfWVsc2Ugby5iZWdpbkVkaXRpbmcoby5vcmlnaW5hbFZhbHVlKyJcbiIpO3goZSl9ZS5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgSC5BOmNhc2UgSC5YOmNhc2UgSC5DOmNhc2UgSC5WOnQmJngoZSk7YnJlYWs7Y2FzZSBILkJBQ0tTUEFDRTpjYXNlIEguREVMRVRFOmNhc2UgSC5IT01FOmNhc2UgSC5FTkQ6eChlKX0tMT09PVtILkFSUk9XX1VQLEguQVJST1dfUklHSFQsSC5BUlJPV19ET1dOLEguQVJST1dfTEVGVF0uaW5kZXhPZihlLmtleUNvZGUpJiZvLmF1dG9SZXNpemUucmVzaXplKFN0cmluZy5mcm9tQ2hhckNvZGUoZS5rZXlDb2RlKSl9fTtOLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoRGltZW5zaW9ucygpLHRoaXMuaW5zdGFuY2UuYWRkSG9vaygiYmVmb3JlS2V5RG93biIsTCl9LE4ucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKGUpe3RoaXMudGV4dGFyZWFQYXJlbnRTdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLmF1dG9SZXNpemUudW5PYnNlcnZlKCksZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PXRoaXMuVEVYVEFSRUEmJnRoaXMuaW5zdGFuY2UubGlzdGVuKCksdGhpcy5pbnN0YW5jZS5yZW1vdmVIb29rKCJiZWZvcmVLZXlEb3duIixMKX0sTi5wcm90b3R5cGUuZm9jdXM9ZnVuY3Rpb24oKXt0aGlzLlRFWFRBUkVBLmZvY3VzKCksXyh0aGlzLlRFWFRBUkVBLHRoaXMuVEVYVEFSRUEudmFsdWUubGVuZ3RoKX0sTi5wcm90b3R5cGUuY3JlYXRlRWxlbWVudHM9ZnVuY3Rpb24oKXt0aGlzLlRFWFRBUkVBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRFWFRBUkVBIiksZih0aGlzLlRFWFRBUkVBLCJoYW5kc29udGFibGVJbnB1dCIpLHRoaXMudGV4dGFyZWFTdHlsZT10aGlzLlRFWFRBUkVBLnN0eWxlLHRoaXMudGV4dGFyZWFTdHlsZS53aWR0aD0wLHRoaXMudGV4dGFyZWFTdHlsZS5oZWlnaHQ9MCx0aGlzLlRFWFRBUkVBX1BBUkVOVD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxmKHRoaXMuVEVYVEFSRUFfUEFSRU5ULCJoYW5kc29udGFibGVJbnB1dEhvbGRlciIpLHRoaXMudGV4dGFyZWFQYXJlbnRTdHlsZT10aGlzLlRFWFRBUkVBX1BBUkVOVC5zdHlsZSx0aGlzLnRleHRhcmVhUGFyZW50U3R5bGUudG9wPTAsdGhpcy50ZXh0YXJlYVBhcmVudFN0eWxlLmxlZnQ9MCx0aGlzLnRleHRhcmVhUGFyZW50U3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5URVhUQVJFQV9QQVJFTlQuYXBwZW5kQ2hpbGQodGhpcy5URVhUQVJFQSksdGhpcy5pbnN0YW5jZS5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLlRFWFRBUkVBX1BBUkVOVCk7dmFyIGU9dGhpczt0aGlzLmluc3RhbmNlLl9yZWdpc3RlclRpbWVvdXQoc2V0VGltZW91dChmdW5jdGlvbigpe2UucmVmcmVzaERpbWVuc2lvbnMoKX0sMCkpfSxOLnByb3RvdHlwZS5nZXRFZGl0ZWRDZWxsPWZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLmNoZWNrRWRpdG9yU2VjdGlvbigpO3N3aXRjaCh0KXtjYXNlInRvcCI6ZT10aGlzLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy50b3BPdmVybGF5LmNsb25lLnd0VGFibGUuZ2V0Q2VsbCh7cm93OnRoaXMucm93LGNvbDp0aGlzLmNvbH0pLHRoaXMudGV4dGFyZWFQYXJlbnRTdHlsZS56SW5kZXg9MTAxO2JyZWFrO2Nhc2UidG9wLWxlZnQtY29ybmVyIjplPXRoaXMuaW5zdGFuY2Uudmlldy53dC53dE92ZXJsYXlzLnRvcExlZnRDb3JuZXJPdmVybGF5LmNsb25lLnd0VGFibGUuZ2V0Q2VsbCh7cm93OnRoaXMucm93LGNvbDp0aGlzLmNvbH0pLHRoaXMudGV4dGFyZWFQYXJlbnRTdHlsZS56SW5kZXg9MTAzO2JyZWFrO2Nhc2UiYm90dG9tLWxlZnQtY29ybmVyIjplPXRoaXMuaW5zdGFuY2Uudmlldy53dC53dE92ZXJsYXlzLmJvdHRvbUxlZnRDb3JuZXJPdmVybGF5LmNsb25lLnd0VGFibGUuZ2V0Q2VsbCh7cm93OnRoaXMucm93LGNvbDp0aGlzLmNvbH0pLHRoaXMudGV4dGFyZWFQYXJlbnRTdHlsZS56SW5kZXg9MTAzO2JyZWFrO2Nhc2UibGVmdCI6ZT10aGlzLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy5sZWZ0T3ZlcmxheS5jbG9uZS53dFRhYmxlLmdldENlbGwoe3Jvdzp0aGlzLnJvdyxjb2w6dGhpcy5jb2x9KSx0aGlzLnRleHRhcmVhUGFyZW50U3R5bGUuekluZGV4PTEwMjticmVhaztjYXNlImJvdHRvbSI6ZT10aGlzLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy5ib3R0b21PdmVybGF5LmNsb25lLnd0VGFibGUuZ2V0Q2VsbCh7cm93OnRoaXMucm93LGNvbDp0aGlzLmNvbH0pLHRoaXMudGV4dGFyZWFQYXJlbnRTdHlsZS56SW5kZXg9MTAyO2JyZWFrO2RlZmF1bHQ6ZT10aGlzLmluc3RhbmNlLmdldENlbGwodGhpcy5yb3csdGhpcy5jb2wpLHRoaXMudGV4dGFyZWFQYXJlbnRTdHlsZS56SW5kZXg9IiJ9cmV0dXJuLTEhPWUmJi0yIT1lP2U6dm9pZCAwfSxOLnByb3RvdHlwZS5yZWZyZXNoRGltZW5zaW9ucz1mdW5jdGlvbigpe2lmKHRoaXMuc3RhdGU9PT1oLkVkaXRvclN0YXRlLkVESVRJTkcpe2lmKHRoaXMuVEQ9dGhpcy5nZXRFZGl0ZWRDZWxsKCksIXRoaXMuVEQpcmV0dXJuIHZvaWQgdGhpcy5jbG9zZSghMCk7dmFyIGUsdD1iKHRoaXMuVEQpLG49Yih0aGlzLmluc3RhbmNlLnJvb3RFbGVtZW50KSxvPXcodGhpcy5URCkscj10aGlzLmluc3RhbmNlLmNvdW50Um93cygpLGk9dC50b3Atbi50b3AtMS0oby5zY3JvbGxUb3B8fDApLHM9dC5sZWZ0LW4ubGVmdC0xLShvLnNjcm9sbExlZnR8fDApLGw9dGhpcy5pbnN0YW5jZS5nZXRTZXR0aW5ncygpLGE9KHRoaXMuaW5zdGFuY2UuaGFzUm93SGVhZGVycygpLHRoaXMuaW5zdGFuY2UuaGFzQ29sSGVhZGVycygpKSx1PXRoaXMuY2hlY2tFZGl0b3JTZWN0aW9uKCksYz10aGlzLlRELnN0eWxlLmJhY2tncm91bmRDb2xvcjtzd2l0Y2godSl7Y2FzZSJ0b3AiOmU9bSh0aGlzLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy50b3BPdmVybGF5LmNsb25lLnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUpO2JyZWFrO2Nhc2UibGVmdCI6ZT1tKHRoaXMuaW5zdGFuY2Uudmlldy53dC53dE92ZXJsYXlzLmxlZnRPdmVybGF5LmNsb25lLnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUpO2JyZWFrO2Nhc2UidG9wLWxlZnQtY29ybmVyIjplPW0odGhpcy5pbnN0YW5jZS52aWV3Lnd0Lnd0T3ZlcmxheXMudG9wTGVmdENvcm5lck92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZSk7YnJlYWs7Y2FzZSJib3R0b20tbGVmdC1jb3JuZXIiOmU9bSh0aGlzLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy5ib3R0b21MZWZ0Q29ybmVyT3ZlcmxheS5jbG9uZS53dFRhYmxlLmhvbGRlci5wYXJlbnROb2RlKTticmVhaztjYXNlImJvdHRvbSI6ZT1tKHRoaXMuaW5zdGFuY2Uudmlldy53dC53dE92ZXJsYXlzLmJvdHRvbU92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZSl9KGEmJjA9PT10aGlzLmluc3RhbmNlLmdldFNlbGVjdGVkKClbMF18fGwuZml4ZWRSb3dzQm90dG9tJiZ0aGlzLmluc3RhbmNlLmdldFNlbGVjdGVkKClbMF09PT1yLWwuZml4ZWRSb3dzQm90dG9tKSYmKGkrPTEpLDA9PT10aGlzLmluc3RhbmNlLmdldFNlbGVjdGVkKClbMV0mJihzKz0xKSxlJiYtMSE9ZT90aGlzLnRleHRhcmVhUGFyZW50U3R5bGVbZVswXV09ZVsxXTpDKHRoaXMuVEVYVEFSRUFfUEFSRU5UKSx0aGlzLnRleHRhcmVhUGFyZW50U3R5bGUudG9wPWkrInB4Iix0aGlzLnRleHRhcmVhUGFyZW50U3R5bGUubGVmdD1zKyJweCI7dmFyIGQ9dGhpcy5pbnN0YW5jZS52aWV3Lnd0Lnd0Vmlld3BvcnQucm93c1JlbmRlckNhbGN1bGF0b3Iuc3RhcnRQb3NpdGlvbixmPXRoaXMuaW5zdGFuY2Uudmlldy53dC53dFZpZXdwb3J0LmNvbHVtbnNSZW5kZXJDYWxjdWxhdG9yLnN0YXJ0UG9zaXRpb24scD10aGlzLmluc3RhbmNlLnZpZXcud3Qud3RPdmVybGF5cy5sZWZ0T3ZlcmxheS5nZXRTY3JvbGxQb3NpdGlvbigpLF89dGhpcy5pbnN0YW5jZS52aWV3Lnd0Lnd0T3ZlcmxheXMudG9wT3ZlcmxheS5nZXRTY3JvbGxQb3NpdGlvbigpLEU9digpLFQ9dGhpcy5URC5vZmZzZXRUb3ArZC1fLE09dGhpcy5URC5vZmZzZXRMZWZ0K2YtcCxPPXkodGhpcy5URCktOCxrPVIobyk/RTowLEg9UyhvKT9FOjAsRD10aGlzLmluc3RhbmNlLnZpZXcubWF4aW11bVZpc2libGVFbGVtZW50V2lkdGgoTSktOS1rLEE9dGhpcy5URC5zY3JvbGxIZWlnaHQrMSx4PU1hdGgubWF4KHRoaXMuaW5zdGFuY2Uudmlldy5tYXhpbXVtVmlzaWJsZUVsZW1lbnRIZWlnaHQoVCktSCwyMyksUD1nKHRoaXMuVEQpO3RoaXMuVEVYVEFSRUEuc3R5bGUuZm9udFNpemU9UC5mb250U2l6ZSx0aGlzLlRFWFRBUkVBLnN0eWxlLmZvbnRGYW1pbHk9UC5mb250RmFtaWx5LHRoaXMuVEVYVEFSRUEuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIiLHRoaXMuVEVYVEFSRUEuc3R5bGUuYmFja2dyb3VuZENvbG9yPWM/YzpnKHRoaXMuVEVYVEFSRUEpLmJhY2tncm91bmRDb2xvcix0aGlzLmF1dG9SZXNpemUuaW5pdCh0aGlzLlRFWFRBUkVBLHttaW5IZWlnaHQ6TWF0aC5taW4oQSx4KSxtYXhIZWlnaHQ6eCxtaW5XaWR0aDpNYXRoLm1pbihPLEQpLG1heFdpZHRoOkR9LCEwKSx0aGlzLnRleHRhcmVhUGFyZW50U3R5bGUuZGlzcGxheT0iYmxvY2sifX0sTi5wcm90b3R5cGUuYmluZEV2ZW50cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLlRFWFRBUkVBLCJjdXQiLGZ1bmN0aW9uKGUpe0EoZSl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHRoaXMuVEVYVEFSRUEsInBhc3RlIixmdW5jdGlvbihlKXtBKGUpfSksdGhpcy5pbnN0YW5jZS5hZGRIb29rKCJhZnRlclNjcm9sbEhvcml6b250YWxseSIsZnVuY3Rpb24oKXtlLnJlZnJlc2hEaW1lbnNpb25zKCl9KSx0aGlzLmluc3RhbmNlLmFkZEhvb2soImFmdGVyU2Nyb2xsVmVydGljYWxseSIsZnVuY3Rpb24oKXtlLnJlZnJlc2hEaW1lbnNpb25zKCl9KSx0aGlzLmluc3RhbmNlLmFkZEhvb2soImFmdGVyQ29sdW1uUmVzaXplIixmdW5jdGlvbigpe2UucmVmcmVzaERpbWVuc2lvbnMoKSxlLmZvY3VzKCl9KSx0aGlzLmluc3RhbmNlLmFkZEhvb2soImFmdGVyUm93UmVzaXplIixmdW5jdGlvbigpe2UucmVmcmVzaERpbWVuc2lvbnMoKSxlLmZvY3VzKCl9KSx0aGlzLmluc3RhbmNlLmFkZEhvb2soImFmdGVyRGVzdHJveSIsZnVuY3Rpb24oKXtlLmV2ZW50TWFuYWdlci5kZXN0cm95KCl9KX0sTi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZXZlbnRNYW5hZ2VyLmRlc3Ryb3koKX0saygidGV4dCIsTil9LHtfYmFzZUVkaXRvcjozMCxhdXRvUmVzaXplOiJhdXRvUmVzaXplIixicm93c2VyOjIzLGVkaXRvcnM6MjksZXZlbnRNYW5hZ2VyOjQxLCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9kb20vZXZlbnQiOjQ3LCJoZWxwZXJzL3VuaWNvZGUiOjU1fV0sNDE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQpe3ZhciBuLG8scixpLHMsbCxhPSJIT1QtVEFCTEUiO2lmKHQuaXNUYXJnZXRXZWJDb21wb25lbnQ9ITEsdC5yZWFsVGFyZ2V0PXQudGFyZ2V0LGw9dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24sdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb249ZnVuY3Rpb24oKXtsLmFwcGx5KHRoaXMpLHAodGhpcyl9LCF1LmV2ZW50TWFuYWdlci5pc0hvdFRhYmxlRW52KXJldHVybiB0O2Zvcih0PWgodCkscz10LnBhdGg/dC5wYXRoLmxlbmd0aDowO3MtLTspe2lmKHQucGF0aFtzXS5ub2RlTmFtZT09PWEpbj0hMDtlbHNlIGlmKG4mJnQucGF0aFtzXS5zaGFkb3dSb290KXtpPXQucGF0aFtzXTticmVha30wIT09c3x8aXx8KGk9dC5wYXRoW3NdKX1yZXR1cm4gaXx8KGk9dC50YXJnZXQpLHQuaXNUYXJnZXRXZWJDb21wb25lbnQ9ITAsZigpP3QucmVhbFRhcmdldD10LnNyY0VsZW1lbnR8fHQudG9FbGVtZW50OihlIGluc3RhbmNlb2YgdS5Db3JlfHxlIGluc3RhbmNlb2YgV2Fsa29udGFibGUpJiYoZSBpbnN0YW5jZW9mIHUuQ29yZT9vPWUudmlldz9lLnZpZXcud3Qud3RUYWJsZS5UQUJMRTpudWxsOmUgaW5zdGFuY2VvZiBXYWxrb250YWJsZSYmKG89ZS53dFRhYmxlLlRBQkxFLnBhcmVudE5vZGUucGFyZW50Tm9kZSkscj1kKHQudGFyZ2V0LFthXSxvKSxyP3QucmVhbFRhcmdldD1vLnF1ZXJ5U2VsZWN0b3IoYSl8fHQudGFyZ2V0OnQucmVhbFRhcmdldD10LnRhcmdldCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInRhcmdldCIse2dldDpmdW5jdGlvbigpe3JldHVybiBoKGkpOw0KfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHR9ZnVuY3Rpb24gcihlKXtyZXR1cm4gbmV3IGcoZSl9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7RXZlbnRNYW5hZ2VyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ319LGV2ZW50TWFuYWdlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgaSxzLGwsYSx1PShpPWUoImJyb3dzZXIiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pWyJkZWZhdWx0Il0sYz0ocz1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KSxoPWMucG9seW1lcldyYXAsZD1jLmNsb3Nlc3QsZj0obD1lKCJoZWxwZXJzL2ZlYXR1cmUiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLmlzV2ViQ29tcG9uZW50U3VwcG9ydGVkTmF0aXZlbHkscD0oYT1lKCJoZWxwZXJzL2RvbS9ldmVudCIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSkuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uLGc9ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGw7dGhpcy5jb250ZXh0PWV8fHRoaXMsdGhpcy5jb250ZXh0LmV2ZW50TGlzdGVuZXJzfHwodGhpcy5jb250ZXh0LmV2ZW50TGlzdGVuZXJzPVtdKX07JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKGcse2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSl7ZT1vKHMsZSksbi5jYWxsKHRoaXMsZSl9dmFyIGk9dGhpcyxzPXRoaXMuY29udGV4dDtyZXR1cm4gdGhpcy5jb250ZXh0LmV2ZW50TGlzdGVuZXJzLnB1c2goe2VsZW1lbnQ6ZSxldmVudDp0LGNhbGxiYWNrOm4sY2FsbGJhY2tQcm94eTpyfSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXI/ZS5hZGRFdmVudExpc3RlbmVyKHQsciwhMSk6ZS5hdHRhY2hFdmVudCgib24iK3QsciksdS5jb3VudEV2ZW50TWFuYWdlckxpc3RlbmVycysrLGZ1bmN0aW9uKCl7aS5yZW1vdmVFdmVudExpc3RlbmVyKGUsdCxuKX19LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgbyxyPXRoaXMuY29udGV4dC5ldmVudExpc3RlbmVycy5sZW5ndGg7ci0tOylpZihvPXRoaXMuY29udGV4dC5ldmVudExpc3RlbmVyc1tyXSxvLmV2ZW50PT10JiZvLmVsZW1lbnQ9PWUpe2lmKG4mJm4hPW8uY2FsbGJhY2spY29udGludWU7dGhpcy5jb250ZXh0LmV2ZW50TGlzdGVuZXJzLnNwbGljZShyLDEpLG8uZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyP28uZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG8uZXZlbnQsby5jYWxsYmFja1Byb3h5LCExKTpvLmVsZW1lbnQuZGV0YWNoRXZlbnQoIm9uIitvLmV2ZW50LG8uY2FsbGJhY2tQcm94eSksdS5jb3VudEV2ZW50TWFuYWdlckxpc3RlbmVycy0tfX0sY2xlYXJFdmVudHM6ZnVuY3Rpb24oKXtpZih0aGlzLmNvbnRleHQpZm9yKHZhciBlPXRoaXMuY29udGV4dC5ldmVudExpc3RlbmVycy5sZW5ndGg7ZS0tOyl7dmFyIHQ9dGhpcy5jb250ZXh0LmV2ZW50TGlzdGVuZXJzW2VdO3QmJnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LmVsZW1lbnQsdC5ldmVudCx0LmNhbGxiYWNrKX19LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5jbGVhckV2ZW50cygpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5jbGVhckV2ZW50cygpLHRoaXMuY29udGV4dD1udWxsfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixvPXtidWJibGVzOiEwLGNhbmNlbGFibGU6Im1vdXNlbW92ZSIhPT10LHZpZXc6d2luZG93LGRldGFpbDowLHNjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDoxLGNsaWVudFk6MSxjdHJsS2V5OiExLGFsdEtleTohMSxzaGlmdEtleTohMSxtZXRhS2V5OiExLGJ1dHRvbjowLHJlbGF0ZWRUYXJnZXQ6dm9pZCAwfTtkb2N1bWVudC5jcmVhdGVFdmVudD8obj1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKSxuLmluaXRNb3VzZUV2ZW50KHQsby5idWJibGVzLG8uY2FuY2VsYWJsZSxvLnZpZXcsby5kZXRhaWwsby5zY3JlZW5YLG8uc2NyZWVuWSxvLmNsaWVudFgsby5jbGllbnRZLG8uY3RybEtleSxvLmFsdEtleSxvLnNoaWZ0S2V5LG8ubWV0YUtleSxvLmJ1dHRvbixvLnJlbGF0ZWRUYXJnZXR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZSkpOm49ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKSxlLmRpc3BhdGNoRXZlbnQ/ZS5kaXNwYXRjaEV2ZW50KG4pOmUuZmlyZUV2ZW50KCJvbiIrdCxuKX19LHt9KSx1LmNvdW50RXZlbnRNYW5hZ2VyTGlzdGVuZXJzPTAsdS5ldmVudE1hbmFnZXI9cn0se2Jyb3dzZXI6MjMsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL2RvbS9ldmVudCI6NDcsImhlbHBlcnMvZmVhdHVyZSI6NDh9XSw0MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGg7bj50OyllW3RdPVtlW3RdXSx0Kyt9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj0wLG89dC5sZW5ndGg7bz5uOyllLnB1c2godFtuXSksbisrfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9W107aWYoIWV8fDA9PT1lLmxlbmd0aHx8IWVbMF18fDA9PT1lWzBdLmxlbmd0aClyZXR1cm4gdDtmb3IodmFyIG49ZS5sZW5ndGgsbz1lWzBdLmxlbmd0aCxyPTA7bj5yO3IrKylmb3IodmFyIGk9MDtvPmk7aSsrKXRbaV18fCh0W2ldPVtdKSx0W2ldW3JdPWVbcl1baV07cmV0dXJuIHR9ZnVuY3Rpb24gcyhlLHQsbixvKXt2YXIgcj0tMSxpPWUubGVuZ3RoO2ZvcihvJiZpJiYobj1lWysrcl0pOysrcjxpOyluPXQobixlW3JdLHIsZSk7cmV0dXJuIG59ZnVuY3Rpb24gbChlLHQpe2Zvcih2YXIgbj0tMSxvPWUubGVuZ3RoLHI9LTEsaT1bXTsrK248bzspe3ZhciBzPWVbbl07dChzLG4sZSkmJihpWysrcl09cyl9cmV0dXJuIGl9ZnVuY3Rpb24gYShlLHQpe2Zvcih2YXIgbj0tMSxvPWUubGVuZ3RoLHI9LTEsaT1bXTsrK248bzspe3ZhciBzPWVbbl07aVsrK3JdPXQocyxuLGUpfXJldHVybiBpfWZ1bmN0aW9uIHUoZSx0KXtmb3IodmFyIG49LTEsbz1lLmxlbmd0aDsrK248byYmdChlW25dLG4sZSkhPT0hMTspO3JldHVybiBlfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIHMoZSxmdW5jdGlvbihlLHQpe3JldHVybiBlK3R9LDApfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIHMoZSxmdW5jdGlvbihlLHQpe3JldHVybiBlPnQ/ZTp0fSxBcnJheS5pc0FycmF5KGUpP2VbMF06dm9pZCAwKX1mdW5jdGlvbiBkKGUpe3JldHVybiBzKGUsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD5lP2U6dH0sQXJyYXkuaXNBcnJheShlKT9lWzBdOnZvaWQgMCl9ZnVuY3Rpb24gZihlKXtyZXR1cm4gZS5sZW5ndGg/YyhlKS9lLmxlbmd0aDowfWZ1bmN0aW9uIHAoZSl7cmV0dXJuIHMoZSxmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbmNhdChBcnJheS5pc0FycmF5KHQpP3AodCk6dCl9LFtdKX1mdW5jdGlvbiBnKGUpe3ZhciB0PVtdO3JldHVybiB1KGUsZnVuY3Rpb24oZSl7LTE9PT10LmluZGV4T2YoZSkmJnQucHVzaChlKX0pLHR9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7dG8yZEFycmF5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LGV4dGVuZEFycmF5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn19LHBpdm90OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX19LGFycmF5UmVkdWNlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc319LGFycmF5RmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbH19LGFycmF5TWFwOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX19LGFycmF5RWFjaDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHV9fSxhcnJheVN1bTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGN9fSxhcnJheU1heDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGh9fSxhcnJheU1pbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGR9fSxhcnJheUF2Zzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGZ9fSxhcnJheUZsYXR0ZW46e2dldDpmdW5jdGlvbigpe3JldHVybiBwfX0sYXJyYXlVbmlxdWU6e2dldDpmdW5jdGlvbigpe3JldHVybiBnfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSl9LHt9XSw0MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKCl7cmV0dXJuIGF9ZnVuY3Rpb24gcigpe3JldHVybiB1fWZ1bmN0aW9uIGkoKXtyZXR1cm4gY31mdW5jdGlvbiBzKCl7cmV0dXJuIGh9ZnVuY3Rpb24gbChlKXtyZXR1cm4gZXx8KGU9bmF2aWdhdG9yLnVzZXJBZ2VudCksL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se2lzSUU4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LGlzSUU5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn19LGlzU2FmYXJpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX19LGlzQ2hyb21lOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc319LGlzTW9iaWxlQnJvd3Nlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgYT0hZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoInRlc3QiKS50ZXh0Q29udGVudCx1PSEhZG9jdW1lbnQuZG9jdW1lbnRNb2RlLGM9L1NhZmFyaS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmL0FwcGxlIENvbXB1dGVyLy50ZXN0KG5hdmlnYXRvci52ZW5kb3IpLGg9L0Nocm9tZS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmL0dvb2dsZS8udGVzdChuYXZpZ2F0b3IudmVuZG9yKX0se31dLDQ0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7Zm9yKHZhciB0LG49ZSsxLG89IiI7bj4wOyl0PShuLTEpJTI2LG89U3RyaW5nLmZyb21DaGFyQ29kZSg2NSt0KStvLG49cGFyc2VJbnQoKG4tdCkvMjYsMTApO3JldHVybiBvfWZ1bmN0aW9uIHIoZSx0KXtlPSJudW1iZXIiPT10eXBlb2YgZT9lOjEwMCx0PSJudW1iZXIiPT10eXBlb2YgdD90OjQ7dmFyIG4scixpPVtdO2ZvcihuPTA7ZT5uO24rKyl7dmFyIHM9W107Zm9yKHI9MDt0PnI7cisrKXMucHVzaChvKHIpKyhuKzEpKTtpLnB1c2gocyl9cmV0dXJuIGl9ZnVuY3Rpb24gaShlLHQpe2U9Im51bWJlciI9PXR5cGVvZiBlP2U6MTAwLHQ9Im51bWJlciI9PXR5cGVvZiB0P3Q6NDt2YXIgbixyLGk9W107Zm9yKG49MDtlPm47bisrKXt2YXIgcz17fTtmb3Iocj0wO3Q+cjtyKyspc1sicHJvcCIrcl09byhyKSsobisxKTtpLnB1c2gocyl9cmV0dXJuIGl9ZnVuY3Rpb24gcyhlLHQpe2Zvcih2YXIgbixvPVtdLHI9MDtlPnI7cisrKXtuPVtdO2Zvcih2YXIgaT0wO3Q+aTtpKyspbi5wdXNoKCIiKTtvLnB1c2gobil9cmV0dXJuIG99ZnVuY3Rpb24gbChlKXt2YXIgdCxuLG8scixpPVtdLHM9MDtmb3IodD0wLG49ZS5sZW5ndGg7bj50O3QrKylmb3Iobz0wLHI9ZVt0XS5sZW5ndGg7cj5vO28rKylvPT1zJiYoaS5wdXNoKFtdKSxzKyspLGlbb10ucHVzaChlW3RdW29dKTtyZXR1cm4gaX1mdW5jdGlvbiBhKGUsdCl7ZnVuY3Rpb24gbihlKXt2YXIgdD1oLmNlbGxUeXBlc1tlXTtpZigidW5kZWZpbmVkIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCdZb3UgZGVjbGFyZWQgY2VsbCB0eXBlICInK2UrJyIgYXMgYSBzdHJpbmcgdGhhdCBpcyBub3QgbWFwcGVkIHRvIGEga25vd24gb2JqZWN0LiBDZWxsIHR5cGUgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYSBzdHJpbmcgbWFwcGVkIHRvIGFuIG9iamVjdCBpbiBIYW5kc29udGFibGUuY2VsbFR5cGVzJyk7cmV0dXJuIHR9cmV0dXJuIHQ9InVuZGVmaW5lZCI9PXR5cGVvZiB0PyEwOnQsZnVuY3Rpb24obyxyKXtyZXR1cm4gZnVuY3Rpb24gaShvKXtpZihvKXtpZihvLmhhc093blByb3BlcnR5KGUpJiZ2b2lkIDAhPT1vW2VdKXJldHVybiBvW2VdO2lmKG8uaGFzT3duUHJvcGVydHkoInR5cGUiKSYmby50eXBlKXt2YXIgcjtpZigic3RyaW5nIiE9dHlwZW9mIG8udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkNlbGwgdHlwZSBtdXN0IGJlIGEgc3RyaW5nICIpO2lmKHI9bihvLnR5cGUpLHIuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIHJbZV07aWYodClyZXR1cm59cmV0dXJuIGkoZChvKSl9fSgibnVtYmVyIj09dHlwZW9mIG8/dGhpcy5nZXRDZWxsTWV0YShvLHIpOm8pfX1PYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtzcHJlYWRzaGVldENvbHVtbkxhYmVsOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LGNyZWF0ZVNwcmVhZHNoZWV0RGF0YTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSxjcmVhdGVTcHJlYWRzaGVldE9iamVjdERhdGE6e2dldDpmdW5jdGlvbigpe3JldHVybiBpfX0sY3JlYXRlRW1wdHlTcHJlYWRzaGVldERhdGE6e2dldDpmdW5jdGlvbigpe3JldHVybiBzfX0sdHJhbnNsYXRlUm93c1RvQ29sdW1uczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9fSxjZWxsTWV0aG9kTG9va3VwRmFjdG9yeTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgdSxjLGg9KHU9ZSgiYnJvd3NlciIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSlbImRlZmF1bHQiXSxkPShjPWUoIm9iamVjdCIpLGMmJmMuX19lc01vZHVsZSYmY3x8eyJkZWZhdWx0IjpjfSkuZ2V0UHJvdG90eXBlT2Z9LHticm93c2VyOjIzLG9iamVjdDo1Mn1dLDQ1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9bmV3IERhdGUoZSk7cmV0dXJuIGlzTmFOKG5ldyBEYXRlKGUrIlQwMDowMCIpLmdldERhdGUoKSk/dDpuZXcgRGF0ZSh0LmdldFRpbWUoKSs2ZTQqdC5nZXRUaW1lem9uZU9mZnNldCgpKX1PYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtnZXROb3JtYWxpemVkRGF0ZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KX0se31dLDQ2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0LG4pe2Zvcig7bnVsbCE9ZSYmZSE9PW47KXtpZihlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJih0LmluZGV4T2YoZS5ub2RlTmFtZSk+LTF8fHQuaW5kZXhPZihlKT4tMSkpcmV0dXJuIGU7ZT1lLmhvc3QmJmUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/ZS5ob3N0OmUucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiByKGUsdCl7dmFyIG49ZS5wYXJlbnROb2RlLG89W107Zm9yKCJzdHJpbmciPT10eXBlb2YgdD9vPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCksMCk6by5wdXNoKHQpO251bGwhPW47KXtpZihvLmluZGV4T2Yobik+LTEpcmV0dXJuITA7bj1uLnBhcmVudE5vZGV9cmV0dXJuITF9ZnVuY3Rpb24gaShlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJmUubm9kZU5hbWU9PT1vLnRvVXBwZXJDYXNlKCl9dmFyIG4sbz0iaG90LXRhYmxlIixyPSExO2ZvcihuPXMoZSk7bnVsbCE9bjspe2lmKHQobikpe3I9ITA7YnJlYWt9aWYobi5ob3N0JiZuLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXtpZihyPXQobi5ob3N0KSlicmVhaztuPW4uaG9zdH1uPW4ucGFyZW50Tm9kZX1yZXR1cm4gcn1mdW5jdGlvbiBzKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgUG9seW1lciYmImZ1bmN0aW9uIj09dHlwZW9mIHdyYXA/d3JhcChlKTplfWZ1bmN0aW9uIGwoZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBQb2x5bWVyJiYiZnVuY3Rpb24iPT10eXBlb2YgdW53cmFwP3Vud3JhcChlKTplfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9MDtpZihlLnByZXZpb3VzU2libGluZylmb3IoO2U9ZS5wcmV2aW91c1NpYmxpbmc7KSsrdDtyZXR1cm4gdH1mdW5jdGlvbiB1KGUsdCl7dmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmh0X2Nsb25lXyIrZSk7cmV0dXJuIG4/bi5jb250YWlucyh0KTpudWxsfWZ1bmN0aW9uIGMoZSl7dmFyIHQ9MCxuPVtdO2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJuIG47Zm9yKDtlW3RdOyluLnB1c2goZVt0XSksdCsrO3JldHVybiBufWZ1bmN0aW9uIGgoZSx0KXtyZXR1cm4gSyhlLHQpfWZ1bmN0aW9uIGQoZSx0KXtyZXR1cm4gcShlLHQpfWZ1bmN0aW9uIGYoZSx0KXtyZXR1cm4gWihlLHQpfWZ1bmN0aW9uIHAoZSx0KXtpZigzPT09ZS5ub2RlVHlwZSl0LnJlbW92ZUNoaWxkKGUpO2Vsc2UgaWYoWyJUQUJMRSIsIlRIRUFEIiwiVEJPRFkiLCJURk9PVCIsIlRSIl0uaW5kZXhPZihlLm5vZGVOYW1lKT4tMSlmb3IodmFyIG49ZS5jaGlsZE5vZGVzLG89bi5sZW5ndGgtMTtvPj0wO28tLSlwKG5bb10sZSl9ZnVuY3Rpb24gZyhlKXtmb3IodmFyIHQ7dD1lLmxhc3RDaGlsZDspZS5yZW1vdmVDaGlsZCh0KX1mdW5jdGlvbiBtKGUsdCl7bGUudGVzdCh0KT9lLmlubmVySFRNTD10OncoZSx0KX1mdW5jdGlvbiB3KGUsdCl7dmFyIG49ZS5maXJzdENoaWxkO24mJjM9PT1uLm5vZGVUeXBlJiZudWxsPT09bi5uZXh0U2libGluZz9hZT9uLnRleHRDb250ZW50PXQ6bi5kYXRhPXQ6KGcoZSksZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0KSkpfWZ1bmN0aW9uIHYoZSl7Zm9yKHZhciB0PWU7bCh0KSE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDspe2lmKG51bGw9PT10KXJldHVybiExO2lmKHQubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2lmKHQuaG9zdCl7aWYodC5ob3N0LmltcGwpcmV0dXJuIHYodC5ob3N0LmltcGwpO2lmKHQuaG9zdClyZXR1cm4gdih0Lmhvc3QpO3Rocm93IG5ldyBFcnJvcigiTG9zdCBpbiBXZWIgQ29tcG9uZW50cyB3b3JsZCIpfXJldHVybiExfWlmKCJub25lIj09PXQuc3R5bGUuZGlzcGxheSlyZXR1cm4hMTt0PXQucGFyZW50Tm9kZX1yZXR1cm4hMH1mdW5jdGlvbiB5KGUpe3ZhciB0LG4sbyxyLGk7aWYocj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbmUoKSYmZS5maXJzdENoaWxkJiYiQ0FQVElPTiI9PT1lLmZpcnN0Q2hpbGQubm9kZU5hbWUpcmV0dXJuIGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7dG9wOmkudG9wKyh3aW5kb3cucGFnZVlPZmZzZXR8fHIuc2Nyb2xsVG9wKS0oci5jbGllbnRUb3B8fDApLGxlZnQ6aS5sZWZ0Kyh3aW5kb3cucGFnZVhPZmZzZXR8fHIuc2Nyb2xsTGVmdCktKHIuY2xpZW50TGVmdHx8MCl9O2Zvcih0PWUub2Zmc2V0TGVmdCxuPWUub2Zmc2V0VG9wLG89ZTsoZT1lLm9mZnNldFBhcmVudCkmJmUhPT1kb2N1bWVudC5ib2R5Oyl0Kz1lLm9mZnNldExlZnQsbis9ZS5vZmZzZXRUb3Asbz1lO3JldHVybiBvJiYiZml4ZWQiPT09by5zdHlsZS5wb3NpdGlvbiYmKHQrPXdpbmRvdy5wYWdlWE9mZnNldHx8ci5zY3JvbGxMZWZ0LG4rPXdpbmRvdy5wYWdlWU9mZnNldHx8ci5zY3JvbGxUb3ApLHtsZWZ0OnQsdG9wOm59fWZ1bmN0aW9uIGIoKXt2YXIgZT13aW5kb3cuc2Nyb2xsWTtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCksZX1mdW5jdGlvbiBDKCl7dmFyIGU9d2luZG93LnNjcm9sbFg7cmV0dXJuIHZvaWQgMD09PWUmJihlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0KSxlfWZ1bmN0aW9uIF8oZSl7cmV0dXJuIGU9PT13aW5kb3c/YigpOmUuc2Nyb2xsVG9wfWZ1bmN0aW9uIFIoZSl7cmV0dXJuIGU9PT13aW5kb3c/QygpOmUuc2Nyb2xsTGVmdH1mdW5jdGlvbiBTKGUpe2Zvcih2YXIgdCxuLG8scj1lLnBhcmVudE5vZGUsaT1bImF1dG8iLCJzY3JvbGwiXSxzPSIiLGw9IiIsYT0iIix1PSIiO3ImJnIuc3R5bGUmJmRvY3VtZW50LmJvZHkhPT1yOyl7aWYodD1yLnN0eWxlLm92ZXJmbG93LG49ci5zdHlsZS5vdmVyZmxvd1gsbz1yLnN0eWxlLm92ZXJmbG93WSwic2Nyb2xsIj09dHx8InNjcm9sbCI9PW58fCJzY3JvbGwiPT1vKXJldHVybiByO2lmKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlJiYocz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShyKSxsPXMuZ2V0UHJvcGVydHlWYWx1ZSgib3ZlcmZsb3ciKSxhPXMuZ2V0UHJvcGVydHlWYWx1ZSgib3ZlcmZsb3cteSIpLHU9cy5nZXRQcm9wZXJ0eVZhbHVlKCJvdmVyZmxvdy14IiksInNjcm9sbCI9PT1sfHwic2Nyb2xsIj09PXV8fCJzY3JvbGwiPT09YSkpcmV0dXJuIHI7aWYoci5jbGllbnRIZWlnaHQ8PXIuc2Nyb2xsSGVpZ2h0JiYoLTEhPT1pLmluZGV4T2Yobyl8fC0xIT09aS5pbmRleE9mKHQpfHwtMSE9PWkuaW5kZXhPZihsKXx8LTEhPT1pLmluZGV4T2YoYSkpKXJldHVybiByO2lmKHIuY2xpZW50V2lkdGg8PXIuc2Nyb2xsV2lkdGgmJigtMSE9PWkuaW5kZXhPZihuKXx8LTEhPT1pLmluZGV4T2YodCl8fC0xIT09aS5pbmRleE9mKGwpfHwtMSE9PWkuaW5kZXhPZih1KSkpcmV0dXJuIHI7cj1yLnBhcmVudE5vZGV9cmV0dXJuIHdpbmRvd31mdW5jdGlvbiBFKGUpe2Zvcih2YXIgdD1lLnBhcmVudE5vZGU7dCYmdC5zdHlsZSYmZG9jdW1lbnQuYm9keSE9PXQ7KXtpZigidmlzaWJsZSIhPT10LnN0eWxlLm92ZXJmbG93JiYiIiE9PXQuc3R5bGUub3ZlcmZsb3cpcmV0dXJuIHQ7aWYod2luZG93LmdldENvbXB1dGVkU3R5bGUpe3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpO2lmKCJ2aXNpYmxlIiE9PW4uZ2V0UHJvcGVydHlWYWx1ZSgib3ZlcmZsb3ciKSYmIiIhPT1uLmdldFByb3BlcnR5VmFsdWUoIm92ZXJmbG93IikpcmV0dXJuIHR9dD10LnBhcmVudE5vZGV9cmV0dXJuIHdpbmRvd31mdW5jdGlvbiBUKGUsdCl7aWYoZSl7aWYoZSE9PXdpbmRvdyl7dmFyIG4sbz1lLnN0eWxlW3RdO3JldHVybiIiIT09byYmdm9pZCAwIT09bz9vOihuPU0oZSksIiIhPT1uW3RdJiZ2b2lkIDAhPT1uW3RdP25bdF06dm9pZCAwKX1pZigid2lkdGgiPT09dClyZXR1cm4gd2luZG93LmlubmVyV2lkdGgrInB4IjtpZigiaGVpZ2h0Ij09PXQpcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCsicHgifX1mdW5jdGlvbiBNKGUpe3JldHVybiBlLmN1cnJlbnRTdHlsZXx8ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlKX1mdW5jdGlvbiBPKGUpe3JldHVybiBlLm9mZnNldFdpZHRofWZ1bmN0aW9uIGsoZSl7cmV0dXJuIG5lKCkmJmUuZmlyc3RDaGlsZCYmIkNBUFRJT04iPT09ZS5maXJzdENoaWxkLm5vZGVOYW1lP2Uub2Zmc2V0SGVpZ2h0K2UuZmlyc3RDaGlsZC5vZmZzZXRIZWlnaHQ6ZS5vZmZzZXRIZWlnaHR9ZnVuY3Rpb24gSChlKXtyZXR1cm4gZS5jbGllbnRIZWlnaHR8fGUuaW5uZXJIZWlnaHR9ZnVuY3Rpb24gRChlKXtyZXR1cm4gZS5jbGllbnRXaWR0aHx8ZS5pbm5lcldpZHRofWZ1bmN0aW9uIEEoZSx0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpOmUuYXR0YWNoRXZlbnQoIm9uIit0LG4pfWZ1bmN0aW9uIHgoZSx0LG4pe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyP2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITEpOmUuZGV0YWNoRXZlbnQoIm9uIit0LG4pfWZ1bmN0aW9uIFAoZSl7aWYoZS5zZWxlY3Rpb25TdGFydClyZXR1cm4gZS5zZWxlY3Rpb25TdGFydDtpZihkb2N1bWVudC5zZWxlY3Rpb24pe2UuZm9jdXMoKTt2YXIgdD1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtpZihudWxsPT10KXJldHVybiAwO3ZhciBuPWUuY3JlYXRlVGV4dFJhbmdlKCksbz1uLmR1cGxpY2F0ZSgpO3JldHVybiBuLm1vdmVUb0Jvb2ttYXJrKHQuZ2V0Qm9va21hcmsoKSksby5zZXRFbmRQb2ludCgiRW5kVG9TdGFydCIsbiksby50ZXh0Lmxlbmd0aH1yZXR1cm4gMH1mdW5jdGlvbiBOKGUpe2lmKGUuc2VsZWN0aW9uRW5kKXJldHVybiBlLnNlbGVjdGlvbkVuZDtpZihkb2N1bWVudC5zZWxlY3Rpb24pe3ZhciB0PWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO2lmKG51bGw9PXQpcmV0dXJuIDA7dmFyIG49ZS5jcmVhdGVUZXh0UmFuZ2UoKTtyZXR1cm4gbi50ZXh0LmluZGV4T2YodC50ZXh0KSt0LnRleHQubGVuZ3RofX1mdW5jdGlvbiBMKCl7dmFyIGU9IiI7cmV0dXJuIHdpbmRvdy5nZXRTZWxlY3Rpb24/ZT13aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKTpkb2N1bWVudC5zZWxlY3Rpb24mJiJDb250cm9sIiE9PWRvY3VtZW50LnNlbGVjdGlvbi50eXBlJiYoZT1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS50ZXh0KSxlfWZ1bmN0aW9uIFcoZSx0LG4pe2lmKHZvaWQgMD09PW4mJihuPXQpLGUuc2V0U2VsZWN0aW9uUmFuZ2Upe2UuZm9jdXMoKTt0cnl7ZS5zZXRTZWxlY3Rpb25SYW5nZSh0LG4pfWNhdGNoKG8pe3ZhciByPWUucGFyZW50Tm9kZSxpPXIuc3R5bGUuZGlzcGxheTtyLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixlLnNldFNlbGVjdGlvblJhbmdlKHQsbiksci5zdHlsZS5kaXNwbGF5PWl9fWVsc2UgaWYoZS5jcmVhdGVUZXh0UmFuZ2Upe3ZhciBzPWUuY3JlYXRlVGV4dFJhbmdlKCk7cy5jb2xsYXBzZSghMCkscy5tb3ZlRW5kKCJjaGFyYWN0ZXIiLG4pLHMubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLHQpLHMuc2VsZWN0KCl9fWZ1bmN0aW9uIEkoKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7ZS5zdHlsZS53aWR0aD0iMTAwJSIsZS5zdHlsZS5oZWlnaHQ9IjIwMHB4Ijt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdC5zdHlsZS50b3A9IjBweCIsdC5zdHlsZS5sZWZ0PSIwcHgiLHQuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIix0LnN0eWxlLndpZHRoPSIyMDBweCIsdC5zdHlsZS5oZWlnaHQ9IjE1MHB4Iix0LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLHQuYXBwZW5kQ2hpbGQoZSksKGRvY3VtZW50LmJvZHl8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQodCk7dmFyIG49ZS5vZmZzZXRXaWR0aDt0LnN0eWxlLm92ZXJmbG93PSJzY3JvbGwiO3ZhciBvPWUub2Zmc2V0V2lkdGg7cmV0dXJuIG49PW8mJihvPXQuY2xpZW50V2lkdGgpLChkb2N1bWVudC5ib2R5fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLnJlbW92ZUNoaWxkKHQpLG4tb31mdW5jdGlvbiBqKCl7cmV0dXJuIHZvaWQgMD09PXNlJiYoc2U9SSgpKSxzZX1mdW5jdGlvbiBWKGUpe3JldHVybiBlLm9mZnNldFdpZHRoIT09ZS5jbGllbnRXaWR0aH1mdW5jdGlvbiBGKGUpe3JldHVybiBlLm9mZnNldEhlaWdodCE9PWUuY2xpZW50SGVpZ2h0fWZ1bmN0aW9uIEIoZSx0LG4pe1EoKXx8ZWUoKT8oZS5zdHlsZS50b3A9bixlLnN0eWxlLmxlZnQ9dCk6dGUoKT9lLnN0eWxlWyItd2Via2l0LXRyYW5zZm9ybSJdPSJ0cmFuc2xhdGUzZCgiK3QrIiwiK24rIiwwKSI6ZS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIrdCsiLCIrbisiLDApIn1mdW5jdGlvbiB6KGUpe3ZhciB0O3JldHVybiBlLnN0eWxlLnRyYW5zZm9ybSYmIiIhPT0odD1lLnN0eWxlLnRyYW5zZm9ybSk/WyJ0cmFuc2Zvcm0iLHRdOmUuc3R5bGVbIi13ZWJraXQtdHJhbnNmb3JtIl0mJiIiIT09KHQ9ZS5zdHlsZVsiLXdlYmtpdC10cmFuc2Zvcm0iXSk/WyItd2Via2l0LXRyYW5zZm9ybSIsdF06LTF9ZnVuY3Rpb24gWShlKXtlLnN0eWxlLnRyYW5zZm9ybSYmIiIhPT1lLnN0eWxlLnRyYW5zZm9ybT9lLnN0eWxlLnRyYW5zZm9ybT0iIjplLnN0eWxlWyItd2Via2l0LXRyYW5zZm9ybSJdJiYiIiE9PWUuc3R5bGVbIi13ZWJraXQtdHJhbnNmb3JtIl0mJihlLnN0eWxlWyItd2Via2l0LXRyYW5zZm9ybSJdPSIiKX1mdW5jdGlvbiBVKGUpe3ZhciB0PVsiSU5QVVQiLCJTRUxFQ1QiLCJURVhUQVJFQSJdO3JldHVybiBlJiYodC5pbmRleE9mKGUubm9kZU5hbWUpPi0xfHwidHJ1ZSI9PT1lLmNvbnRlbnRFZGl0YWJsZSl9ZnVuY3Rpb24gRyhlKXtyZXR1cm4gVShlKSYmLTE9PWUuY2xhc3NOYW1lLmluZGV4T2YoImhhbmRzb250YWJsZUlucHV0IikmJi0xPT1lLmNsYXNzTmFtZS5pbmRleE9mKCJjb3B5UGFzdGUiKX1PYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtjbG9zZXN0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LGlzQ2hpbGRPZjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSxpc0NoaWxkT2ZXZWJDb21wb25lbnRUYWJsZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9fSxwb2x5bWVyV3JhcDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHN9fSxwb2x5bWVyVW53cmFwOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbH19LGluZGV4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX19LG92ZXJsYXlDb250YWluc0VsZW1lbnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB1fX0saGFzQ2xhc3M6e2dldDpmdW5jdGlvbigpe3JldHVybiBofX0sYWRkQ2xhc3M6e2dldDpmdW5jdGlvbigpe3JldHVybiBkfX0scmVtb3ZlQ2xhc3M6e2dldDpmdW5jdGlvbigpe3JldHVybiBmfX0scmVtb3ZlVGV4dE5vZGVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcH19LGVtcHR5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ319LEhUTUxfQ0hBUkFDVEVSUzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGxlfX0sZmFzdElubmVySFRNTDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG19fSxmYXN0SW5uZXJUZXh0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gd319LGlzVmlzaWJsZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZ9fSxvZmZzZXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB5fX0sZ2V0V2luZG93U2Nyb2xsVG9wOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYn19LGdldFdpbmRvd1Njcm9sbExlZnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBDfX0sZ2V0U2Nyb2xsVG9wOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gX319LGdldFNjcm9sbExlZnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBSfX0sZ2V0U2Nyb2xsYWJsZUVsZW1lbnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBTfX0sZ2V0VHJpbW1pbmdDb250YWluZXI6e2dldDpmdW5jdGlvbigpe3JldHVybiBFfX0sZ2V0U3R5bGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBUfX0sZ2V0Q29tcHV0ZWRTdHlsZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE19fSxvdXRlcldpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT319LG91dGVySGVpZ2h0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ga319LGlubmVySGVpZ2h0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSH19LGlubmVyV2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiBEfX0sYWRkRXZlbnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBBfX0scmVtb3ZlRXZlbnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB4fX0sZ2V0Q2FyZXRQb3NpdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFB9fSxnZXRTZWxlY3Rpb25FbmRQb3NpdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE59fSxnZXRTZWxlY3Rpb25UZXh0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTH19LHNldENhcmV0UG9zaXRpb246e2dldDpmdW5jdGlvbigpe3JldHVybiBXfX0sZ2V0U2Nyb2xsYmFyV2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiBqfX0saGFzVmVydGljYWxTY3JvbGxiYXI6e2dldDpmdW5jdGlvbigpe3JldHVybiBWfX0saGFzSG9yaXpvbnRhbFNjcm9sbGJhcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEZ9fSxzZXRPdmVybGF5UG9zaXRpb246e2dldDpmdW5jdGlvbigpe3JldHVybiBCfX0sZ2V0Q3NzVHJhbnNmb3JtOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gen19LHJlc2V0Q3NzVHJhbnNmb3JtOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gWX19LGlzSW5wdXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBVfX0saXNPdXRzaWRlSW5wdXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBHfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyICQsWCxLLHEsWixKPSgkPWUoIi4uL2Jyb3dzZXIiKSwkJiYkLl9fZXNNb2R1bGUmJiR8fHsiZGVmYXVsdCI6JH0pLFE9Si5pc0lFOCxlZT1KLmlzSUU5LHRlPUouaXNTYWZhcmksbmU9KFg9ZSgiLi4vZmVhdHVyZSIpLFgmJlguX19lc01vZHVsZSYmWHx8eyJkZWZhdWx0IjpYfSkuaGFzQ2FwdGlvblByb2JsZW0sb2U9ISFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0O2lmKG9lKXt2YXIgcmU9ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gZS5jbGFzc0xpc3QuYWRkKCJ0ZXN0IiwidGVzdDIiKSxlLmNsYXNzTGlzdC5jb250YWlucygidGVzdDIiKX0oKTtLPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIiI9PT10PyExOmUuY2xhc3NMaXN0LmNvbnRhaW5zKHQpfSxxPWZ1bmN0aW9uKGUsdCl7dmFyIG49MDtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoIiAiKSksdD1jKHQpLHJlKWUuY2xhc3NMaXN0LmFkZC5hcHBseShlLmNsYXNzTGlzdCx0KTtlbHNlIGZvcig7dCYmdFtuXTspZS5jbGFzc0xpc3QuYWRkKHRbbl0pLG4rK30sWj1mdW5jdGlvbihlLHQpe3ZhciBuPTA7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnNwbGl0KCIgIikpLHQ9Yyh0KSxyZSllLmNsYXNzTGlzdC5yZW1vdmUuYXBwbHkoZS5jbGFzc0xpc3QsdCk7ZWxzZSBmb3IoO3QmJnRbbl07KWUuY2xhc3NMaXN0LnJlbW92ZSh0W25dKSxuKyt9fWVsc2V7dmFyIGllPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUmVnRXhwKCIoXFxzfF4pIitlKyIoXFxzfCQpIil9O0s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4hIWUuY2xhc3NOYW1lLm1hdGNoKGllKHQpKX0scT1mdW5jdGlvbihlLHQpe3ZhciBuPTAsbz1lLmNsYXNzTmFtZTtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoIiAiKSksIiI9PT1vKW89dC5qb2luKCIgIik7ZWxzZSBmb3IoO3QmJnRbbl07KWllKHRbbl0pLnRlc3Qobyl8fChvKz0iICIrdFtuXSksbisrO2UuY2xhc3NOYW1lPW99LFo9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLG89ZS5jbGFzc05hbWU7Zm9yKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5zcGxpdCgiICIpKTt0JiZ0W25dOylvPW8ucmVwbGFjZShpZSh0W25dKSwiICIpLnRyaW0oKSxuKys7ZS5jbGFzc05hbWUhPT1vJiYoZS5jbGFzc05hbWU9byl9fXZhciBzZSxsZT0vKDwoLiopPnwmKC4qKTspLyxhZT0hIWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJ0ZXN0IikudGV4dENvbnRlbnR9LHsiLi4vYnJvd3NlciI6NDMsIi4uL2ZlYXR1cmUiOjQ4fV0sNDc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXtlLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25FbmFibGVkPSExLGUuY2FuY2VsQnViYmxlPSEwfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIGUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvbkVuYWJsZWQ9PT0hMX1mdW5jdGlvbiBpKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlLnN0b3BQcm9wYWdhdGlvbj9lLnN0b3BQcm9wYWdhdGlvbigpOmUuY2FuY2VsQnViYmxlPSEwfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGUucGFnZVg/ZS5wYWdlWDplLmNsaWVudFgraCgpfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGUucGFnZVk/ZS5wYWdlWTplLmNsaWVudFkrYygpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se3N0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSxzdG9wUHJvcGFnYXRpb246e2dldDpmdW5jdGlvbigpe3JldHVybiBpfX0scGFnZVg6e2dldDpmdW5jdGlvbigpe3JldHVybiBzfX0scGFnZVk6e2dldDpmdW5jdGlvbigpe3JldHVybiBsfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIGEsdT0oYT1lKCJlbGVtZW50IiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KSxjPXUuZ2V0V2luZG93U2Nyb2xsVG9wLGg9dS5nZXRXaW5kb3dTY3JvbGxMZWZ0fSx7ZWxlbWVudDo0Nn1dLDQ4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7cmV0dXJuIGQuY2FsbCh3aW5kb3csZSl9ZnVuY3Rpb24gcihlKXtmLmNhbGwod2luZG93LGUpfWZ1bmN0aW9uIGkoKXtyZXR1cm4ib250b3VjaHN0YXJ0ImluIHdpbmRvd31mdW5jdGlvbiBzKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuISghZS5jcmVhdGVTaGFkb3dSb290fHwhZS5jcmVhdGVTaGFkb3dSb290LnRvU3RyaW5nKCkubWF0Y2goL1xbbmF0aXZlIGNvZGVcXS8pKX1mdW5jdGlvbiBsKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEFCTEUiKTtlLnN0eWxlLmJvcmRlclNwYWNpbmc9MCxlLnN0eWxlLmJvcmRlcldpZHRoPTAsZS5zdHlsZS5wYWRkaW5nPTA7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEJPRFkiKTtlLmFwcGVuZENoaWxkKHQpLHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVFIiKSksdC5maXJzdENoaWxkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlREIikpLHQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmlubmVySFRNTD0iPHRyPjx0ZD50PGJyPnQ8L3RkPjwvdHI+Ijt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJDQVBUSU9OIik7bi5pbm5lckhUTUw9ImM8YnI+Yzxicj5jPGJyPmMiLG4uc3R5bGUucGFkZGluZz0wLG4uc3R5bGUubWFyZ2luPTAsZS5pbnNlcnRCZWZvcmUobix0KSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpLGc9ZS5vZmZzZXRIZWlnaHQ8MiplLmxhc3RDaGlsZC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlKX1mdW5jdGlvbiBhKCl7cmV0dXJuIHZvaWQgMD09PWcmJmwoKSxnfWZ1bmN0aW9uIHUoZSl7dmFyIHQ9dm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4gbT9tOm09Im9iamVjdCI9PXR5cGVvZiBJbnRsP25ldyBJbnRsLkNvbGxhdG9yKGUsdCkuY29tcGFyZToiZnVuY3Rpb24iPT10eXBlb2YgU3RyaW5nLnByb3RvdHlwZS5sb2NhbGVDb21wYXJlP2Z1bmN0aW9uKGUsdCl7cmV0dXJuKGUrIiIpLmxvY2FsZUNvbXBhcmUodCl9OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10PzA6ZT50Py0xOjF9fU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se3JlcXVlc3RBbmltYXRpb25GcmFtZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxjYW5jZWxBbmltYXRpb25GcmFtZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSxpc1RvdWNoU3VwcG9ydGVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX19LGlzV2ViQ29tcG9uZW50U3VwcG9ydGVkTmF0aXZlbHk6e2dldDpmdW5jdGlvbigpe3JldHVybiBzfX0saGFzQ2FwdGlvblByb2JsZW06e2dldDpmdW5jdGlvbigpe3JldHVybiBhfX0sZ2V0Q29tcGFyaXNvbkZ1bmN0aW9uOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO2Zvcih2YXIgYz0wLGg9WyJtcyIsIm1veiIsIndlYmtpdCIsIm8iXSxkPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUsZj13aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUscD0wO3A8aC5sZW5ndGgmJiFkOysrcClkPXdpbmRvd1toW3BdKyJSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiXSxmPXdpbmRvd1toW3BdKyJDYW5jZWxBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbaFtwXSsiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lIl07ZHx8KGQ9ZnVuY3Rpb24oZSl7dmFyIHQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksbj1NYXRoLm1heCgwLDE2LSh0LWMpKSxvPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSh0K24pfSxuKTtyZXR1cm4gYz10K24sb30pLGZ8fChmPWZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dChlKX0pO3ZhciBnLG19LHt9XSw0OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiByKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD10aGlzLHM9YXJndW1lbnRzLGw9RGF0ZS5ub3coKSxhPSExO3IubGFzdENhbGxUaHJvdHRsZWQ9ITAsb3x8KG89bCxhPSEwKTt2YXIgdT1uLShsLW8pO3JldHVybiBhPyhyLmxhc3RDYWxsVGhyb3R0bGVkPSExLGUuYXBwbHkodGhpcyxzKSk6KGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmxhc3RDYWxsVGhyb3R0bGVkPSExLGUuYXBwbHkodCxzKSxvPTAsaT12b2lkIDB9LHUpKSxyfXZhciBuPXZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MjAwLG89MCxyPXtsYXN0Q2FsbFRocm90dGxlZDohMH0saT1udWxsO3JldHVybiB0fWZ1bmN0aW9uIGkoZSl7ZnVuY3Rpb24gdCgpe2w9aX1mdW5jdGlvbiBuKCl7cmV0dXJuIGw/KGwtLSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk6cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIG89dm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToyMDAsaT12b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOjEwLHM9cihlLG8pLGw9aTtyZXR1cm4gbi5jbGVhckhpdHM9dCxufWZ1bmN0aW9uIHMoZSl7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMsaT1hcmd1bWVudHM7cmV0dXJuIHImJmNsZWFyVGltZW91dChyKSxyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtuPWUuYXBwbHkodCxpKX0sbyksbn12YXIgbixvPXZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MjAwLHI9bnVsbDtyZXR1cm4gdH1mdW5jdGlvbiBsKCl7Zm9yKHZhciBlPVtdLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPWUsbz1uWzBdLHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobiwxKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZChyLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQoZSl9LG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKX19ZnVuY3Rpb24gYShlKXtmb3IodmFyIHQ9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG49W10sbz0wO288YXJndW1lbnRzLmxlbmd0aDtvKyspbltvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodGhpcyx0LmNvbmNhdChuKSl9fWZ1bmN0aW9uIHUoZSl7ZnVuY3Rpb24gdChvKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHI9W10saT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspcltpXT1hcmd1bWVudHNbaV07dmFyIHMsbD1vLmNvbmNhdChyKTtyZXR1cm4gcz1sLmxlbmd0aD49bj9lLmFwcGx5KHRoaXMsbCk6dChsKX19dmFyIG49ZS5sZW5ndGg7cmV0dXJuIHQoW10pfWZ1bmN0aW9uIGMoZSl7ZnVuY3Rpb24gdChvKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHI9W10saT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspcltpXT1hcmd1bWVudHNbaV07dmFyIHMsbD1vLmNvbmNhdChyLnJldmVyc2UoKSk7cmV0dXJuIHM9bC5sZW5ndGg+PW4/ZS5hcHBseSh0aGlzLGwpOnQobCl9fXZhciBuPWUubGVuZ3RoO3JldHVybiB0KFtdKX1PYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtwcm94eTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSx0aHJvdHRsZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSx0aHJvdHRsZUFmdGVySGl0czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9fSxkZWJvdW5jZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHN9fSxwaXBlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbH19LHBhcnRpYWw6e2dldDpmdW5jdGlvbigpe3JldHVybiBhfX0sY3Vycnk6e2dldDpmdW5jdGlvbigpe3JldHVybiB1fX0sY3VycnlSaWdodDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGN9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgaCxkPShoPWUoImFycmF5IiksaCYmaC5fX2VzTW9kdWxlJiZofHx7ImRlZmF1bHQiOmh9KS5hcnJheVJlZHVjZX0se2FycmF5OjQyfV0sNTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpjYXNlIm51bWJlciI6cmV0dXJuIGUrIiI7Y2FzZSJvYmplY3QiOnJldHVybiBudWxsPT09ZT8iIjplLnRvU3RyaW5nKCk7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiIiO2RlZmF1bHQ6cmV0dXJuIGUudG9TdHJpbmcoKX19T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7c3RyaW5naWZ5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pfSx7fV0sNTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXt2YXIgdD10eXBlb2YgZTtyZXR1cm4ibnVtYmVyIj09dD8haXNOYU4oZSkmJmlzRmluaXRlKGUpOiJzdHJpbmciPT10P2UubGVuZ3RoPzE9PWUubGVuZ3RoPy9cZC8udGVzdChlKTovXlxzKlsrLV0/XHMqKD86KD86XGQrKD86XC5cZCspPyg/OmVbKy1dP1xkKyk/KXwoPzoweFthLWZcZF0rKSlccyokL2kudGVzdChlKTohMToib2JqZWN0Ij09dD8hKCFlfHwibnVtYmVyIiE9dHlwZW9mIGUudmFsdWVPZigpfHxlIGluc3RhbmNlb2YgRGF0ZSk6ITF9ZnVuY3Rpb24gcihlLHQsbil7dmFyIG89LTE7Zm9yKCJmdW5jdGlvbiI9PXR5cGVvZiB0PyhuPXQsdD1lKTpvPWUtMTsrK288PXQmJm4obykhPT0hMTspO31mdW5jdGlvbiBpKGUsdCxuKXt2YXIgbz1lKzE7Zm9yKCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9MCk7LS1vPj10JiZuKG8pIT09ITE7KTt9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiB0PXBhcnNlSW50KHQudG9TdHJpbmcoKS5yZXBsYWNlKCIlIiwiIiksMTApLHQ9cGFyc2VJbnQoZSp0LzEwMCl9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7aXNOdW1lcmljOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LHJhbmdlRWFjaDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSxyYW5nZUVhY2hSZXZlcnNlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX19LHZhbHVlQWNjb3JkaW5nUGVyY2VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHN9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KX0se31dLDUyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7dmFyIHQ7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/dD1bXToodD17fSxwKGUsZnVuY3Rpb24oZSxuKXtlJiYib2JqZWN0Ij09dHlwZW9mIGUmJiFBcnJheS5pc0FycmF5KGUpP3Rbbl09byhlKTpBcnJheS5pc0FycmF5KGUpP2UubGVuZ3RoJiYib2JqZWN0Ij09dHlwZW9mIGVbMF0mJiFBcnJheS5pc0FycmF5KGVbMF0pP3Rbbl09W28oZVswXSldOnRbbl09W106dFtuXT1udWxsfSkpLHR9ZnVuY3Rpb24gcihlLHQpe3JldHVybiB0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LGUucHJvdG90eXBlPW5ldyB0LGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIHAodCxmdW5jdGlvbih0LG4pe2Vbbl09dH0pLGV9ZnVuY3Rpb24gcyhlLHQpe3AodCxmdW5jdGlvbihuLG8pe3Rbb10mJiJvYmplY3QiPT10eXBlb2YgdFtvXT8oZVtvXXx8KEFycmF5LmlzQXJyYXkodFtvXSk/ZVtvXT1bXToiW29iamVjdCBEYXRlXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodFtvXSk/ZVtvXT10W29dOmVbb109e30pLHMoZVtvXSx0W29dKSk6ZVtvXT10W29dfSl9ZnVuY3Rpb24gbChlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSk6ZX1mdW5jdGlvbiBhKGUpe3ZhciB0PXt9O3JldHVybiBwKGUsZnVuY3Rpb24oZSxuKXt0W25dPWV9KSx0fWZ1bmN0aW9uIHUoZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbi0xXT1hcmd1bWVudHNbbl07cmV0dXJuIGUuTUlYSU5TfHwoZS5NSVhJTlM9W10pLHcodCxmdW5jdGlvbih0KXtlLk1JWElOUy5wdXNoKHQuTUlYSU5fTkFNRSkscCh0LGZ1bmN0aW9uKHQsbil7aWYodm9pZCAwIT09ZS5wcm90b3R5cGVbbl0pdGhyb3cgbmV3IEVycm9yKCJNaXhpbiBjb25mbGljdC4gUHJvcGVydHkgJyIrbisiJyBhbHJlYWR5IGV4aXN0IGFuZCBjYW5ub3QgYmUgb3ZlcndyaXR0ZW4uIik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpZS5wcm90b3R5cGVbbl09dDtlbHNle3ZhciBvPWZ1bmN0aW9uKGUsdCl7ZT0iXyIrZTt2YXIgbj1mdW5jdGlvbihlKXtyZXR1cm4oQXJyYXkuaXNBcnJheShlKXx8aChlKSkmJihlPWwoZSkpLGV9O3JldHVybiBmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzW2VdJiYodGhpc1tlXT1uKHQpKSx0aGlzW2VdfX0scj1mdW5jdGlvbihlKXtyZXR1cm4gZT0iXyIrZSxmdW5jdGlvbih0KXt0aGlzW2VdPXR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsbix7Z2V0Om8obix0KSxzZXQ6cihuKSxjb25maWd1cmFibGU6ITB9KX19KX0pLGV9ZnVuY3Rpb24gYyhlLHQpe3JldHVybiBKU09OLnN0cmluZ2lmeShlKT09PUpTT04uc3RyaW5naWZ5KHQpfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBkKGUpe3ZhciB0O2lmKCJvYmplY3QiPT10eXBlb2YgZS5fX3Byb3RvX18pdD1lLl9fcHJvdG9fXztlbHNle3ZhciBuLG89ZS5jb25zdHJ1Y3RvcjsiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3RvciYmKG49byxkZWxldGUgZS5jb25zdHJ1Y3RvciYmKG89ZS5jb25zdHJ1Y3RvcixlLmNvbnN0cnVjdG9yPW4pKSx0PW8/by5wcm90b3R5cGU6bnVsbH1yZXR1cm4gdH1mdW5jdGlvbiBmKGUsdCxuLG8pe28udmFsdWU9bixvLndyaXRhYmxlPW8ud3JpdGFibGUhPT0hMSxvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlIT09ITEsby5jb25maWd1cmFibGU9by5jb25maWd1cmFibGUhPT0hMSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LG8pfWZ1bmN0aW9uIHAoZSx0KXtmb3IodmFyIG4gaW4gZSlpZigoIWUuaGFzT3duUHJvcGVydHl8fGUuaGFzT3duUHJvcGVydHkmJmUuaGFzT3duUHJvcGVydHkobikpJiZ0KGVbbl0sbixlKT09PSExKWJyZWFrO3JldHVybiBlfWZ1bmN0aW9uIGcoZSx0KXt2YXIgbj10LnNwbGl0KCIuIiksbz1lO3JldHVybiBwKG4sZnVuY3Rpb24oZSl7cmV0dXJuIG89b1tlXSx2b2lkIDA9PT1vPyhvPXZvaWQgMCwhMSk6dm9pZCAwfSksb31PYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtkdWNrU2NoZW1hOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LGluaGVyaXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiByfX0sZXh0ZW5kOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX19LGRlZXBFeHRlbmQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBzfX0sZGVlcENsb25lOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbH19LGNsb25lOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX19LG1peGluOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX19LGlzT2JqZWN0RXF1YWxzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY319LGlzT2JqZWN0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH19LGdldFByb3RvdHlwZU9mOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZH19LGRlZmluZUdldHRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGZ9fSxvYmplY3RFYWNoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcH19LGdldFByb3BlcnR5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBtLHc9KG09ZSgiYXJyYXkiKSxtJiZtLl9fZXNNb2R1bGUmJm18fHsiZGVmYXVsdCI6bX0pLmFycmF5RWFjaH0se2FycmF5OjQyfV0sNTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQpe2Z1bmN0aW9uIG4oKXt9aShuLGUpO2Zvcih2YXIgbz0wLHI9dC5sZW5ndGg7cj5vO28rKyluLnByb3RvdHlwZVt0W29dXT12b2lkIDA7cmV0dXJuIG59T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7Y29sdW1uRmFjdG9yeTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgcixpPShyPWUoIm9iamVjdCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkuaW5oZXJpdH0se29iamVjdDo1Mn1dLDU0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7cmV0dXJuIGVbMF0udG9VcHBlckNhc2UoKStlLnN1YnN0cigxKX1mdW5jdGlvbiByKGUsdCl7dmFyIG49ITA7cmV0dXJuIHAodC5sZW5ndGgtMSxmdW5jdGlvbihvKXtyZXR1cm4gZS5jaGFyQXQobykhPT10LmNoYXJBdChvKT8obj0hMSwhMSk6dm9pZCAwfSksbn1mdW5jdGlvbiBpKGUsdCl7dmFyIG49ITAsbz10Lmxlbmd0aC0xLHI9ZS5sZW5ndGgtMTtyZXR1cm4gcChvLGZ1bmN0aW9uKGkpe3ZhciBzPXItaSxsPW8taTtyZXR1cm4gZS5jaGFyQXQocykhPT10LmNoYXJBdChsKT8obj0hMSwhMSk6dm9pZCAwfSksbn1mdW5jdGlvbiBzKCl7Zm9yKHZhciBlPVtdLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWVbdF09YXJndW1lbnRzW3RdO2Zvcih2YXIgbj1bXSxvPWUubGVuZ3RoO28tLTspe3ZhciByPWYoZVtvXSkudG9Mb3dlckNhc2UoKTstMT09PW4uaW5kZXhPZihyKSYmbi5wdXNoKHIpfXJldHVybiAxPT09bi5sZW5ndGh9ZnVuY3Rpb24gbCgpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gTWF0aC5mbG9vcig2NTUzNiooMStNYXRoLnJhbmRvbSgpKSkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKX1yZXR1cm4gZSgpK2UoKStlKCkrZSgpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuL14oWzAtOV1bMC05XT9cJSQpfCheMTAwXCUkKS8udGVzdChlKX1mdW5jdGlvbiB1KGUpe3ZhciB0PXZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307cmV0dXJuKGUrIiIpLnJlcGxhY2UoLyg/OlxcKT9cWyhbXlxbXF1dKyldL2csZnVuY3Rpb24oZSxuKXtyZXR1cm4iXFwiPT09ZS5jaGFyQXQoMCk/ZS5zdWJzdHIoMSxlLmxlbmd0aC0xKTp2b2lkIDA9PT10W25dPyIiOnRbbl19KX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49dm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXToiICI7aWYoZSs9IiIsZS5sZW5ndGg+PXQpcmV0dXJuIGU7bj1TdHJpbmcobik7dmFyIG89bi5sZW5ndGg7b3x8KG49IiAiKTt2YXIgcj10LWUubGVuZ3RoLGk9TWF0aC5jZWlsKHIvbi5sZW5ndGgpLHM9IiI7cmV0dXJuIHAoaSxmdW5jdGlvbihlKXtzKz1ufSkscz1zLnNsaWNlKDAscikscytlfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se3RvVXBwZXJDYXNlRmlyc3Q6e2dldDpmdW5jdGlvbigpe3JldHVybiBvfX0sc3RhcnRzV2l0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSxlbmRzV2l0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9fSxlcXVhbHNJZ25vcmVDYXNlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc319LHJhbmRvbVN0cmluZzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9fSxpc1BlcmNlbnRWYWx1ZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9fSxzdWJzdGl0dXRlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX19LHBhZFN0YXJ0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBoLGQsZj0oaD1lKCJtaXhlZCIpLGgmJmguX19lc01vZHVsZSYmaHx8eyJkZWZhdWx0IjpofSkuc3RyaW5naWZ5LHA9KGQ9ZSgibnVtYmVyIiksZCYmZC5fX2VzTW9kdWxlJiZkfHx7ImRlZmF1bHQiOmR9KS5yYW5nZUVhY2h9LHttaXhlZDo1MCxudW1iZXI6NTF9XSw1NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe3JldHVybiAzMj09ZXx8ZT49NDgmJjU3Pj1lfHxlPj05NiYmMTExPj1lfHxlPj0xODYmJjE5Mj49ZXx8ZT49MjE5JiYyMjI+PWV8fGU+PTIyNnx8ZT49NjUmJjkwPj1lfWZ1bmN0aW9uIHIoZSl7dmFyIHQ9W3UuQVJST1dfRE9XTix1LkFSUk9XX1VQLHUuQVJST1dfTEVGVCx1LkFSUk9XX1JJR0hULHUuSE9NRSx1LkVORCx1LkRFTEVURSx1LkJBQ0tTUEFDRSx1LkYxLHUuRjIsdS5GMyx1LkY0LHUuRjUsdS5GNix1LkY3LHUuRjgsdS5GOSx1LkYxMCx1LkYxMSx1LkYxMix1LlRBQix1LlBBR0VfRE9XTix1LlBBR0VfVVAsdS5FTlRFUix1LkVTQ0FQRSx1LlNISUZULHUuQ0FQU19MT0NLLHUuQUxUXTtyZXR1cm4tMSE9PXQuaW5kZXhPZihlKX1mdW5jdGlvbiBpKGUpe3JldHVybi0xIT09W3UuQ09OVFJPTF9MRUZULDIyNCx1LkNPTU1BTkRfTEVGVCx1LkNPTU1BTkRfUklHSFRdLmluZGV4T2YoZSl9ZnVuY3Rpb24gcyhlLHQpe3ZhciBuPXQuc3BsaXQoInwiKSxvPSExO3JldHVybiBhKG4sZnVuY3Rpb24odCl7cmV0dXJuIGU9PT11W3RdPyhvPSEwLCExKTp2b2lkIDB9KSxvfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0tFWV9DT0RFUzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHV9fSxpc1ByaW50YWJsZUNoYXI6e2dldDpmdW5jdGlvbigpe3JldHVybiBvfX0saXNNZXRhS2V5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn19LGlzQ3RybEtleTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9fSxpc0tleTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHN9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbCxhPShsPWUoImFycmF5IiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KS5hcnJheUVhY2gsdT17TU9VU0VfTEVGVDoxLE1PVVNFX1JJR0hUOjMsTU9VU0VfTUlERExFOjIsQkFDS1NQQUNFOjgsQ09NTUE6MTg4LElOU0VSVDo0NSxERUxFVEU6NDYsRU5EOjM1LEVOVEVSOjEzLEVTQ0FQRToyNyxDT05UUk9MX0xFRlQ6OTEsQ09NTUFORF9MRUZUOjE3LENPTU1BTkRfUklHSFQ6OTMsQUxUOjE4LEhPTUU6MzYsUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxTUEFDRTozMixTSElGVDoxNixDQVBTX0xPQ0s6MjAsVEFCOjksQVJST1dfUklHSFQ6MzksQVJST1dfTEVGVDozNyxBUlJPV19VUDozOCxBUlJPV19ET1dOOjQwLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLEE6NjUsWDo4OCxDOjY3LFY6ODZ9fSx7YXJyYXk6NDJ9XSw1NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtsb2NhbEhvb2tzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzPShvPWUoImJyb3dzZXIiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pWyJkZWZhdWx0Il0sbD0ocj1lKCJoZWxwZXJzL2FycmF5IiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KS5hcnJheUVhY2gsYT0oaT1lKCJoZWxwZXJzL29iamVjdCIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkuZGVmaW5lR2V0dGVyLHU9ImxvY2FsSG9va3MiLGM9e19sb2NhbEhvb2tzOk9iamVjdC5jcmVhdGUobnVsbCksYWRkTG9jYWxIb29rOmZ1bmN0aW9uKGUsdCl7dGhpcy5fbG9jYWxIb29rc1tlXXx8KHRoaXMuX2xvY2FsSG9va3NbZV09W10pLHRoaXMuX2xvY2FsSG9va3NbZV0ucHVzaCh0KX0scnVuTG9jYWxIb29rczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTt2YXIgbz10aGlzO3RoaXMuX2xvY2FsSG9va3NbZV0mJmwodGhpcy5fbG9jYWxIb29rc1tlXSxmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBseShvLHQpfSl9LGNsZWFyTG9jYWxIb29rczpmdW5jdGlvbigpe3RoaXMuX2xvY2FsSG9va3M9e319fTthKGMsIk1JWElOX05BTUUiLHUse3dyaXRhYmxlOiExLGVudW1lcmFibGU6ITF9KSxzLnV0aWxzLmxvY2FsSG9va3M9Y30se2Jyb3dzZXI6MjMsImhlbHBlcnMvYXJyYXkiOjQyLCJoZWxwZXJzL29iamVjdCI6NTJ9XSw1NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gbnVsbCE9PWUmJiFuKGUpJiYoInN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGUpfWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG51bGwhPT1lJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSl9ZnVuY3Rpb24gbihlKXtyZXR1cm4gZSE9PWV9dmFyIG89e2FycmF5TWFwOltdLHdlYWtNYXA6bmV3IFdlYWtNYXB9O3JldHVybntnZXQ6ZnVuY3Rpb24obil7cmV0dXJuIGUobik/by5hcnJheU1hcFtuXTp0KG4pP28ud2Vha01hcC5nZXQobik6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24obixyKXtpZihlKG4pKW8uYXJyYXlNYXBbbl09cjtlbHNle2lmKCF0KG4pKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBrZXkgdHlwZSIpO28ud2Vha01hcC5zZXQobixyKX19LCJkZWxldGUiOmZ1bmN0aW9uKG4pe2Uobik/ZGVsZXRlIG8uYXJyYXlNYXBbbl06dChuKSYmby53ZWFrTWFwWyJkZWxldGUiXShuKX19fU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se011bHRpTWFwOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pLHdpbmRvdy5NdWx0aU1hcD1vfSx7fV0sNTg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7SG9va3M6e2dldDpmdW5jdGlvbigpe3JldHVybiBhfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpPVsiYWZ0ZXJDZWxsTWV0YVJlc2V0IiwiYWZ0ZXJDaGFuZ2UiLCJhZnRlckNoYW5nZXNPYnNlcnZlZCIsImFmdGVyQ29udGV4dE1lbnVEZWZhdWx0T3B0aW9ucyIsImFmdGVyQ29udGV4dE1lbnVIaWRlIiwiYWZ0ZXJDb250ZXh0TWVudVNob3ciLCJhZnRlckNvcHlMaW1pdCIsImFmdGVyQ3JlYXRlQ29sIiwiYWZ0ZXJDcmVhdGVSb3ciLCJhZnRlckRlc2VsZWN0IiwiYWZ0ZXJEZXN0cm95IiwiYWZ0ZXJEb2N1bWVudEtleURvd24iLCJhZnRlckdldENlbGxNZXRhIiwiYWZ0ZXJHZXRDb2xIZWFkZXIiLCJhZnRlckdldFJvd0hlYWRlciIsImFmdGVySW5pdCIsImFmdGVyTG9hZERhdGEiLCJhZnRlck1vbWVudHVtU2Nyb2xsIiwiYWZ0ZXJPbkNlbGxDb3JuZXJNb3VzZURvd24iLCJhZnRlck9uQ2VsbE1vdXNlRG93biIsImFmdGVyT25DZWxsTW91c2VPdmVyIiwiYWZ0ZXJSZW1vdmVDb2wiLCJhZnRlclJlbW92ZVJvdyIsImFmdGVyUmVuZGVyIiwiYmVmb3JlUmVuZGVyZXIiLCJhZnRlclJlbmRlcmVyIiwiYWZ0ZXJTY3JvbGxIb3Jpem9udGFsbHkiLCJhZnRlclNjcm9sbFZlcnRpY2FsbHkiLCJhZnRlclNlbGVjdGlvbiIsImFmdGVyU2VsZWN0aW9uQnlQcm9wIiwiYWZ0ZXJTZWxlY3Rpb25FbmQiLCJhZnRlclNlbGVjdGlvbkVuZEJ5UHJvcCIsImFmdGVyU2V0Q2VsbE1ldGEiLCJhZnRlclVwZGF0ZVNldHRpbmdzIiwiYWZ0ZXJWYWxpZGF0ZSIsImJlZm9yZUF1dG9maWxsIiwiYmVmb3JlQ2VsbEFsaWdubWVudCIsImJlZm9yZUNoYW5nZSIsImJlZm9yZUNoYW5nZVJlbmRlciIsImJlZm9yZURyYXdCb3JkZXJzIiwiYmVmb3JlR2V0Q2VsbE1ldGEiLCJiZWZvcmVJbml0IiwiYmVmb3JlSW5pdFdhbGtvbnRhYmxlIiwiYmVmb3JlS2V5RG93biIsImJlZm9yZU9uQ2VsbE1vdXNlRG93biIsImJlZm9yZU9uQ2VsbE1vdXNlT3ZlciIsImJlZm9yZVJlbW92ZUNvbCIsImJlZm9yZVJlbW92ZVJvdyIsImJlZm9yZVJlbmRlciIsImJlZm9yZVNldFJhbmdlU3RhcnQiLCJiZWZvcmVTZXRSYW5nZUVuZCIsImJlZm9yZVRvdWNoU2Nyb2xsIiwiYmVmb3JlVmFsaWRhdGUiLCJjb25zdHJ1Y3QiLCJpbml0IiwibW9kaWZ5Q29sIiwidW5tb2RpZnlDb2wiLCJtb2RpZnlDb2xIZWFkZXIiLCJtb2RpZnlDb2xXaWR0aCIsIm1vZGlmeVJvdyIsIm1vZGlmeVJvd0hlYWRlciIsIm1vZGlmeVJvd0hlaWdodCIsInBlcnNpc3RlbnRTdGF0ZUxvYWQiLCJwZXJzaXN0ZW50U3RhdGVSZXNldCIsInBlcnNpc3RlbnRTdGF0ZVNhdmUiLCJiZWZvcmVDb2x1bW5Tb3J0IiwiYWZ0ZXJDb2x1bW5Tb3J0IiwiYWZ0ZXJBdXRvZmlsbEFwcGx5VmFsdWVzIiwibW9kaWZ5Q29weWFibGVSYW5nZSIsImJlZm9yZUNvbHVtbk1vdmUiLCJhZnRlckNvbHVtbk1vdmUiLCJiZWZvcmVSb3dNb3ZlIiwiYWZ0ZXJSb3dNb3ZlIiwiYmVmb3JlQ29sdW1uUmVzaXplIiwiYWZ0ZXJDb2x1bW5SZXNpemUiLCJiZWZvcmVSb3dSZXNpemUiLCJhZnRlclJvd1Jlc2l6ZSIsImFmdGVyR2V0Q29sdW1uSGVhZGVyUmVuZGVyZXJzIiwiYWZ0ZXJHZXRSb3dIZWFkZXJSZW5kZXJlcnMiLCJiZWZvcmVTdHJldGNoaW5nQ29sdW1uV2lkdGgiLCJiZWZvcmVGaWx0ZXIiLCJhZnRlckZpbHRlciIsIm1vZGlmeUNvbHVtbkhlYWRlckhlaWdodCJdLHM9KG89ZSgiaGVscGVycy9hcnJheSIpLA0KbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KS5hcnJheUVhY2gsbD0ocj1lKCJoZWxwZXJzL29iamVjdCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkub2JqZWN0RWFjaCxhPWZ1bmN0aW9uKCl7dGhpcy5nbG9iYWxCdWNrZXQ9dGhpcy5jcmVhdGVFbXB0eUJ1Y2tldCgpfTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoYSx7Y3JlYXRlRW1wdHlCdWNrZXQ6ZnVuY3Rpb24oKXt2YXIgZT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBzKGksZnVuY3Rpb24odCl7cmV0dXJuIGVbdF09W119KSxlfSxnZXRCdWNrZXQ6ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGw7cmV0dXJuIGU/KGUucGx1Z2luSG9va0J1Y2tldHx8KGUucGx1Z2luSG9va0J1Y2tldD10aGlzLmNyZWF0ZUVtcHR5QnVja2V0KCkpLGUucGx1Z2luSG9va0J1Y2tldCk6dGhpcy5nbG9iYWxCdWNrZXR9LGFkZDpmdW5jdGlvbihlLHQpe3ZhciBuPXZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxvPXRoaXM7aWYoQXJyYXkuaXNBcnJheSh0KSlzKHQsZnVuY3Rpb24odCl7cmV0dXJuIG8uYWRkKGUsdCxuKX0pO2Vsc2V7dmFyIHI9dGhpcy5nZXRCdWNrZXQobik7InVuZGVmaW5lZCI9PXR5cGVvZiByW2VdJiYodGhpcy5yZWdpc3RlcihlKSxyW2VdPVtdKSx0LnNraXA9ITEsLTE9PT1yW2VdLmluZGV4T2YodCkmJnJbZV0ucHVzaCh0KX1yZXR1cm4gdGhpc30sb25jZTpmdW5jdGlvbihlLHQpe3ZhciBuPXZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxvPXRoaXM7QXJyYXkuaXNBcnJheSh0KT9zKHQsZnVuY3Rpb24odCl7cmV0dXJuIG8ub25jZShlLHQsbil9KToodC5ydW5PbmNlPSEwLHRoaXMuYWRkKGUsdCxuKSl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxvPXRoaXMuZ2V0QnVja2V0KG4pO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2Ygb1tlXSYmb1tlXS5pbmRleE9mKHQpPj0wPyh0LnNraXA9ITAsITApOiExfSxoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9dm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLG49dGhpcy5nZXRCdWNrZXQodCk7cmV0dXJuISh2b2lkIDA9PT1uW2VdfHwhbltlXS5sZW5ndGgpfSxydW46ZnVuY3Rpb24oZSx0LG4sbyxyLGkscyxsKXt2YXIgYT10aGlzLmdsb2JhbEJ1Y2tldFt0XSx1PS0xLGM9YT9hLmxlbmd0aDowO2lmKGMpZm9yKDsrK3U8YzspaWYoYVt1XSYmIWFbdV0uc2tpcCl7dmFyIGg9YVt1XS5jYWxsKGUsbixvLHIsaSxzLGwpO3ZvaWQgMCE9PWgmJihuPWgpLGFbdV0mJmFbdV0ucnVuT25jZSYmdGhpcy5yZW1vdmUodCxhW3VdKX12YXIgZD10aGlzLmdldEJ1Y2tldChlKVt0XSxmPS0xLHA9ZD9kLmxlbmd0aDowO2lmKHApZm9yKDsrK2Y8cDspaWYoZFtmXSYmIWRbZl0uc2tpcCl7dmFyIGc9ZFtmXS5jYWxsKGUsbixvLHIsaSxzLGwpO3ZvaWQgMCE9PWcmJihuPWcpLGRbZl0mJmRbZl0ucnVuT25jZSYmdGhpcy5yZW1vdmUodCxkW2ZdLGUpfXJldHVybiBufSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU9dm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO2wodGhpcy5nZXRCdWNrZXQoZSksZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuW3RdLmxlbmd0aD0wfSl9LHJlZ2lzdGVyOmZ1bmN0aW9uKGUpe3RoaXMuaXNSZWdpc3RlcmVkKGUpfHxpLnB1c2goZSl9LGRlcmVnaXN0ZXI6ZnVuY3Rpb24oZSl7dGhpcy5pc1JlZ2lzdGVyZWQoZSkmJmkuc3BsaWNlKGkuaW5kZXhPZihlKSwxKX0saXNSZWdpc3RlcmVkOmZ1bmN0aW9uKGUpe3JldHVybiBpLmluZGV4T2YoZSk+PTB9LGdldFJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX19LHt9KX0seyJoZWxwZXJzL2FycmF5Ijo0MiwiaGVscGVycy9vYmplY3QiOjUyfV0sNTk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQpe2U9ZChlKSxjLnBsdWdpbnNbZV09dCxjLmhvb2tzLmFkZCgiY29uc3RydWN0IixmdW5jdGlvbigpe3ZhciBuO2YuaGFzKHRoaXMpfHxmLnNldCh0aGlzLHt9KSxuPWYuZ2V0KHRoaXMpLG5bZV18fChuW2VdPW5ldyB0KHRoaXMpKX0pLGMuaG9va3MuYWRkKCJhZnRlckRlc3Ryb3kiLGZ1bmN0aW9uKCl7aWYoZi5oYXModGhpcykpe3ZhciBlPWYuZ2V0KHRoaXMpO2goZSxmdW5jdGlvbihlKXtyZXR1cm4gZS5kZXN0cm95KCl9KSxmWyJkZWxldGUiXSh0aGlzKX19KX1mdW5jdGlvbiByKGUsdCl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IEVycm9yKCdPbmx5IHN0cmluZ3MgY2FuIGJlIHBhc3NlZCBhcyAicGx1Z2luIiBwYXJhbWV0ZXInKTt2YXIgbj1kKHQpO2lmKGYuaGFzKGUpJiZmLmdldChlKVtuXSlyZXR1cm4gZi5nZXQoZSlbbl19ZnVuY3Rpb24gaShlKXtyZXR1cm4gZi5oYXMoZSk/T2JqZWN0LmtleXMoZi5nZXQoZSkpOltdfWZ1bmN0aW9uIHMoZSx0KXt2YXIgbj1udWxsO3JldHVybiBmLmhhcyhlKSYmaChmLmdldChlKSxmdW5jdGlvbihlLG8pe2U9PT10JiYobj1vKX0pLG59T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7cmVnaXN0ZXJQbHVnaW46e2dldDpmdW5jdGlvbigpe3JldHVybiBvfX0sZ2V0UGx1Z2luOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn19LGdldFJlZ2lzdHJlZFBsdWdpbk5hbWVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX19LGdldFBsdWdpbk5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiBzfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIGwsYSx1LGM9KGw9ZSgiYnJvd3NlciIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSlbImRlZmF1bHQiXSxoPShhPWUoImhlbHBlcnMvb2JqZWN0IiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KS5vYmplY3RFYWNoLGQ9KHU9ZSgiaGVscGVycy9zdHJpbmciKSx1JiZ1Ll9fZXNNb2R1bGUmJnV8fHsiZGVmYXVsdCI6dX0pLnRvVXBwZXJDYXNlRmlyc3QsZj1uZXcgV2Vha01hcH0se2Jyb3dzZXI6MjMsImhlbHBlcnMvb2JqZWN0Ijo1MiwiaGVscGVycy9zdHJpbmciOjU0fV0sNjA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7ImRlZmF1bHQiOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdn19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGw9KG89ZSgiYnJvd3NlciIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXSxhPShyPWUoImhlbHBlcnMvb2JqZWN0IiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KSx1PWEuZGVmaW5lR2V0dGVyLGM9YS5vYmplY3RFYWNoLGg9KGk9ZSgiaGVscGVycy9hcnJheSIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkuYXJyYXlFYWNoLGQ9KHM9ZSgicGx1Z2lucyIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSksZj1kLmdldFJlZ2lzdHJlZFBsdWdpbk5hbWVzLHA9ZC5nZXRQbHVnaW5OYW1lLGc9bmV3IFdlYWtNYXAsbT1udWxsLHc9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt1KHRoaXMsImhvdCIsZSx7d3JpdGFibGU6ITF9KSxnLnNldCh0aGlzLHtob29rczp7fX0pLG09bnVsbCx0aGlzLnBsdWdpbk5hbWU9bnVsbCx0aGlzLnBsdWdpbnNJbml0aWFsaXplZENhbGxiYWNrcz1bXSx0aGlzLmlzUGx1Z2luc1JlYWR5PSExLHRoaXMuZW5hYmxlZD0hMSx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMuaG90LmFkZEhvb2soImFmdGVyUGx1Z2luc0luaXRpYWxpemVkIixmdW5jdGlvbigpe3JldHVybiB0Lm9uQWZ0ZXJQbHVnaW5zSW5pdGlhbGl6ZWQoKX0pLHRoaXMuaG90LmFkZEhvb2soImFmdGVyVXBkYXRlU2V0dGluZ3MiLGZ1bmN0aW9uKCl7cmV0dXJuIHQub25VcGRhdGVTZXR0aW5ncygpfSksdGhpcy5ob3QuYWRkSG9vaygiYmVmb3JlSW5pdCIsZnVuY3Rpb24oKXtyZXR1cm4gdC5pbml0KCl9KX07JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKHcse2luaXQ6ZnVuY3Rpb24oKXt0aGlzLnBsdWdpbk5hbWU9cCh0aGlzLmhvdCx0aGlzKSx0aGlzLmlzRW5hYmxlZCYmdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5lbmFibGVQbHVnaW4oKSxtfHwobT1mKHRoaXMuaG90KSksbS5pbmRleE9mKHRoaXMucGx1Z2luTmFtZSk+PTAmJm0uc3BsaWNlKG0uaW5kZXhPZih0aGlzLnBsdWdpbk5hbWUpLDEpLG0ubGVuZ3RofHx0aGlzLmhvdC5ydW5Ib29rcygiYWZ0ZXJQbHVnaW5zSW5pdGlhbGl6ZWQiKSx0aGlzLmluaXRpYWxpemVkPSEwfSxlbmFibGVQbHVnaW46ZnVuY3Rpb24oKXt0aGlzLmVuYWJsZWQ9ITB9LGRpc2FibGVQbHVnaW46ZnVuY3Rpb24oKXt0aGlzLmV2ZW50TWFuYWdlciYmdGhpcy5ldmVudE1hbmFnZXIuY2xlYXIoKSx0aGlzLmNsZWFySG9va3MoKSx0aGlzLmVuYWJsZWQ9ITF9LGFkZEhvb2s6ZnVuY3Rpb24oZSx0KXt2YXIgbj1nLmdldCh0aGlzKS5ob29rc1tlXT1nLmdldCh0aGlzKS5ob29rc1tlXXx8W107dGhpcy5ob3QuYWRkSG9vayhlLHQpLG4ucHVzaCh0KSxnLmdldCh0aGlzKS5ob29rc1tlXT1ufSxyZW1vdmVIb29rczpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2goZy5nZXQodGhpcykuaG9va3NbZV18fFtdLGZ1bmN0aW9uKG4pe3QuaG90LnJlbW92ZUhvb2soZSxuKX0pfSxjbGVhckhvb2tzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWcuZ2V0KHRoaXMpLmhvb2tzO2ModCxmdW5jdGlvbih0LG4pe3JldHVybiBlLnJlbW92ZUhvb2tzKG4pfSksdC5sZW5ndGg9MH0sY2FsbE9uUGx1Z2luc1JlYWR5OmZ1bmN0aW9uKGUpe3RoaXMuaXNQbHVnaW5zUmVhZHk/ZSgpOnRoaXMucGx1Z2luc0luaXRpYWxpemVkQ2FsbGJhY2tzLnB1c2goZSl9LG9uQWZ0ZXJQbHVnaW5zSW5pdGlhbGl6ZWQ6ZnVuY3Rpb24oKXtoKHRoaXMucGx1Z2luc0luaXRpYWxpemVkQ2FsbGJhY2tzLGZ1bmN0aW9uKGUpe3JldHVybiBlKCl9KSx0aGlzLnBsdWdpbnNJbml0aWFsaXplZENhbGxiYWNrcy5sZW5ndGg9MCx0aGlzLmlzUGx1Z2luc1JlYWR5PSEwfSxvblVwZGF0ZVNldHRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQmJih0aGlzLmVuYWJsZWQmJiF0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmRpc2FibGVQbHVnaW4oKSwhdGhpcy5lbmFibGVkJiZ0aGlzLmlzRW5hYmxlZCgpJiZ0aGlzLmVuYWJsZVBsdWdpbigpLHRoaXMuZW5hYmxlZCYmdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy51cGRhdGVQbHVnaW4oKSl9LHVwZGF0ZVBsdWdpbjpmdW5jdGlvbigpe30sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5ldmVudE1hbmFnZXImJnRoaXMuZXZlbnRNYW5hZ2VyLmRlc3Ryb3koKSx0aGlzLmNsZWFySG9va3MoKSxjKHRoaXMsZnVuY3Rpb24odCxuKXsiaG90IiE9PW4mJihlW25dPW51bGwpfSksZGVsZXRlIHRoaXMuaG90fX0se30pO3ZhciB2PXc7bC5wbHVnaW5zLkJhc2VQbHVnaW49d30se2Jyb3dzZXI6MjMsImhlbHBlcnMvYXJyYXkiOjQyLCJoZWxwZXJzL29iamVjdCI6NTIscGx1Z2luczo1OX1dLDYxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0F1dG9Db2x1bW5TaXplOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQX19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGwsYSx1LGMsaCxkLGYscD0obz1lKCJfYmFzZSIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXSxnPShyPWUoImhlbHBlcnMvYXJyYXkiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLG09Zy5hcnJheUVhY2gsdz1nLmFycmF5RmlsdGVyLHY9KGk9ZSgiaGVscGVycy9mZWF0dXJlIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KSx5PXYuY2FuY2VsQW5pbWF0aW9uRnJhbWUsYj12LnJlcXVlc3RBbmltYXRpb25GcmFtZSxDPShzPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLmlzVmlzaWJsZSxfPShsPWUoInV0aWxzL2dob3N0VGFibGUiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLkdob3N0VGFibGUsUj0oYT1lKCJoZWxwZXJzL29iamVjdCIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSksUz1SLmlzT2JqZWN0LEU9KFIub2JqZWN0RWFjaCx1PWUoImhlbHBlcnMvbnVtYmVyIiksdSYmdS5fX2VzTW9kdWxlJiZ1fHx7ImRlZmF1bHQiOnV9KSxUPUUudmFsdWVBY2NvcmRpbmdQZXJjZW50LE09RS5yYW5nZUVhY2gsTz0oYz1lKCJwbHVnaW5zIiksYyYmYy5fX2VzTW9kdWxlJiZjfHx7ImRlZmF1bHQiOmN9KS5yZWdpc3RlclBsdWdpbixrPShoPWUoInV0aWxzL3NhbXBsZXNHZW5lcmF0b3IiKSxoJiZoLl9fZXNNb2R1bGUmJmh8fHsiZGVmYXVsdCI6aH0pLlNhbXBsZXNHZW5lcmF0b3IsSD0oZD1lKCJoZWxwZXJzL3N0cmluZyIpLGQmJmQuX19lc01vZHVsZSYmZHx8eyJkZWZhdWx0IjpkfSkuaXNQZXJjZW50VmFsdWUsRD0oZj1lKCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY2FsY3VsYXRvci92aWV3cG9ydENvbHVtbnMiKSxmJiZmLl9fZXNNb2R1bGUmJmZ8fHsiZGVmYXVsdCI6Zn0pLldhbGtvbnRhYmxlVmlld3BvcnRDb2x1bW5zQ2FsY3VsYXRvcixBPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IoeCkuY2FsbCh0aGlzLGUpLHRoaXMud2lkdGhzPVtdLHRoaXMuZ2hvc3RUYWJsZT1uZXcgXyh0aGlzLmhvdCksdGhpcy5zYW1wbGVzR2VuZXJhdG9yPW5ldyBrKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuaG90LmdldERhdGFBdENlbGwoZSxuKX0pLHRoaXMuZmlyc3RDYWxjdWxhdGlvbj0hMCx0aGlzLmluUHJvZ3Jlc3M9ITEsdGhpcy5hZGRIb29rKCJiZWZvcmVDb2x1bW5SZXNpemUiLGZ1bmN0aW9uKGUsbixvKXtyZXR1cm4gdC5vbkJlZm9yZUNvbHVtblJlc2l6ZShlLG4sbyl9KX0seD1BOyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhBLHtpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5hdXRvQ29sdW1uU2l6ZSE9PSExJiYhdGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5jb2xXaWR0aHN9LGVuYWJsZVBsdWdpbjpmdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIXRoaXMuZW5hYmxlZCl7dmFyIHQ9dGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5hdXRvQ29sdW1uU2l6ZSxuPXQmJnQuaGFzT3duUHJvcGVydHkoInNhbXBsaW5nUmF0aW8iKT90aGlzLmhvdC5nZXRTZXR0aW5ncygpLmF1dG9Db2x1bW5TaXplLnNhbXBsaW5nUmF0aW86dm9pZCAwO24mJiFpc05hTihuKSYmKHRoaXMuc2FtcGxlc0dlbmVyYXRvci5jdXN0b21TYW1wbGVDb3VudD1wYXJzZUludChuLDEwKSksdCYmbnVsbCE9dC51c2VIZWFkZXJzJiZ0aGlzLmdob3N0VGFibGUuc2V0U2V0dGluZygidXNlSGVhZGVycyIsdC51c2VIZWFkZXJzKSx0aGlzLmFkZEhvb2soImFmdGVyTG9hZERhdGEiLGZ1bmN0aW9uKCl7cmV0dXJuIGUub25BZnRlckxvYWREYXRhKCl9KSx0aGlzLmFkZEhvb2soImJlZm9yZUNoYW5nZSIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25CZWZvcmVDaGFuZ2UodCl9KSx0aGlzLmFkZEhvb2soImJlZm9yZVJlbmRlciIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25CZWZvcmVSZW5kZXIodCl9KSx0aGlzLmFkZEhvb2soIm1vZGlmeUNvbFdpZHRoIixmdW5jdGlvbih0LG4pe3JldHVybiBlLmdldENvbHVtbldpZHRoKG4sdCl9KSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyx4LnByb3RvdHlwZSwiZW5hYmxlUGx1Z2luIikuY2FsbCh0aGlzKX19LGRpc2FibGVQbHVnaW46ZnVuY3Rpb24oKXskdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyx4LnByb3RvdHlwZSwiZGlzYWJsZVBsdWdpbiIpLmNhbGwodGhpcyl9LGNhbGN1bGF0ZUNvbHVtbnNXaWR0aDpmdW5jdGlvbigpe3ZhciBlPXZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e2Zyb206MCx0bzp0aGlzLmhvdC5jb3VudENvbHMoKS0xfSx0PXZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2Zyb206MCx0bzp0aGlzLmhvdC5jb3VudFJvd3MoKS0xfSxuPXZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06ITEsbz10aGlzOyJudW1iZXIiPT10eXBlb2YgZSYmKGU9e2Zyb206ZSx0bzplfSksIm51bWJlciI9PXR5cGVvZiB0JiYodD17ZnJvbTp0LHRvOnR9KSxNKGUuZnJvbSxlLnRvLGZ1bmN0aW9uKGUpe2lmKG58fHZvaWQgMD09PW8ud2lkdGhzW2VdJiYhby5ob3QuX2dldENvbFdpZHRoRnJvbVNldHRpbmdzKGUpKXt2YXIgcj1vLnNhbXBsZXNHZW5lcmF0b3IuZ2VuZXJhdGVDb2x1bW5TYW1wbGVzKGUsdCk7ci5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG8uZ2hvc3RUYWJsZS5hZGRDb2x1bW4odCxlKX0pfX0pLHRoaXMuZ2hvc3RUYWJsZS5jb2x1bW5zLmxlbmd0aCYmKHRoaXMuZ2hvc3RUYWJsZS5nZXRXaWR0aHMoZnVuY3Rpb24oZSx0KXtyZXR1cm4gby53aWR0aHNbZV09dH0pLHRoaXMuZ2hvc3RUYWJsZS5jbGVhbigpKX0sY2FsY3VsYXRlQWxsQ29sdW1uc1dpZHRoOmZ1bmN0aW9uKCl7dmFyIGU9dm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7ZnJvbTowLHRvOnRoaXMuaG90LmNvdW50Um93cygpLTF9LHQ9dGhpcyxuPTAsbz10aGlzLmhvdC5jb3VudENvbHMoKS0xLHI9bnVsbDt0aGlzLmluUHJvZ3Jlc3M9ITA7dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm4gdC5ob3Q/KHQuY2FsY3VsYXRlQ29sdW1uc1dpZHRoKHtmcm9tOm4sdG86TWF0aC5taW4obit4LkNBTENVTEFUSU9OX1NURVAsbyl9LGUpLG49bit4LkNBTENVTEFUSU9OX1NURVArMSx2b2lkKG8+bj9yPWIoaSk6KHkociksdC5pblByb2dyZXNzPSExLHQuaG90LnZpZXcud3Qud3RPdmVybGF5cy5hZGp1c3RFbGVtZW50c1NpemUoITApLHQuaG90LnZpZXcud3Qud3RPdmVybGF5cy5sZWZ0T3ZlcmxheS5uZWVkRnVsbFJlbmRlciYmdC5ob3Qudmlldy53dC53dE92ZXJsYXlzLmxlZnRPdmVybGF5LmNsb25lLmRyYXcoKSkpKTooeShyKSx2b2lkKHQuaW5Qcm9ncmVzcz0hMSkpfTt0aGlzLmZpcnN0Q2FsY3VsYXRpb24mJnRoaXMuZ2V0U3luY0NhbGN1bGF0aW9uTGltaXQoKSYmKHRoaXMuY2FsY3VsYXRlQ29sdW1uc1dpZHRoKHtmcm9tOjAsdG86dGhpcy5nZXRTeW5jQ2FsY3VsYXRpb25MaW1pdCgpfSxlKSx0aGlzLmZpcnN0Q2FsY3VsYXRpb249ITEsbj10aGlzLmdldFN5bmNDYWxjdWxhdGlvbkxpbWl0KCkrMSksbz5uP2koKTp0aGlzLmluUHJvZ3Jlc3M9ITF9LHJlY2FsY3VsYXRlQWxsQ29sdW1uc1dpZHRoOmZ1bmN0aW9uKCl7dGhpcy5ob3QudmlldyYmQyh0aGlzLmhvdC52aWV3Lnd0Lnd0VGFibGUuVEFCTEUpJiYodGhpcy5jbGVhckNhY2hlKCksdGhpcy5jYWxjdWxhdGVBbGxDb2x1bW5zV2lkdGgoKSl9LGdldFN5bmNDYWxjdWxhdGlvbkxpbWl0OmZ1bmN0aW9uKCl7dmFyIGU9eC5TWU5DX0NBTENVTEFUSU9OX0xJTUlULHQ9dGhpcy5ob3QuY291bnRDb2xzKCktMTtyZXR1cm4gUyh0aGlzLmhvdC5nZXRTZXR0aW5ncygpLmF1dG9Db2x1bW5TaXplKSYmKGU9dGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5hdXRvQ29sdW1uU2l6ZS5zeW5jTGltaXQsSChlKT9lPVQodCxlKTplPj49MCksTWF0aC5taW4oZSx0KX0sZ2V0Q29sdW1uV2lkdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzWzFdLG49dm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTohMCxvPXQ7cmV0dXJuIHZvaWQgMD09PW8mJihvPXRoaXMud2lkdGhzW2VdLG4mJiJudW1iZXIiPT10eXBlb2YgbyYmKG89TWF0aC5tYXgobyxELkRFRkFVTFRfV0lEVEgpKSksb30sZ2V0Rmlyc3RWaXNpYmxlQ29sdW1uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ob3Qudmlldy53dDtyZXR1cm4gZS53dFZpZXdwb3J0LmNvbHVtbnNWaXNpYmxlQ2FsY3VsYXRvcj9lLnd0VGFibGUuZ2V0Rmlyc3RWaXNpYmxlQ29sdW1uKCk6ZS53dFZpZXdwb3J0LmNvbHVtbnNSZW5kZXJDYWxjdWxhdG9yP2Uud3RUYWJsZS5nZXRGaXJzdFJlbmRlcmVkQ29sdW1uKCk6LTF9LGdldExhc3RWaXNpYmxlQ29sdW1uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ob3Qudmlldy53dDtyZXR1cm4gZS53dFZpZXdwb3J0LmNvbHVtbnNWaXNpYmxlQ2FsY3VsYXRvcj9lLnd0VGFibGUuZ2V0TGFzdFZpc2libGVDb2x1bW4oKTplLnd0Vmlld3BvcnQuY29sdW1uc1JlbmRlckNhbGN1bGF0b3I/ZS53dFRhYmxlLmdldExhc3RSZW5kZXJlZENvbHVtbigpOi0xfSxjbGVhckNhY2hlOmZ1bmN0aW9uKCl7dGhpcy53aWR0aHMubGVuZ3RoPTB9LGlzTmVlZFJlY2FsY3VsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuISF3KHRoaXMud2lkdGhzLGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lfSkubGVuZ3RofSxvbkJlZm9yZVJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG90LnJlbmRlckNhbGwsdD10aGlzLmhvdC5jb3VudFJvd3MoKTt0JiYodGhpcy5jYWxjdWxhdGVDb2x1bW5zV2lkdGgoe2Zyb206dGhpcy5nZXRGaXJzdFZpc2libGVDb2x1bW4oKSx0bzp0aGlzLmdldExhc3RWaXNpYmxlQ29sdW1uKCl9LHZvaWQgMCxlKSx0aGlzLmlzTmVlZFJlY2FsY3VsYXRlKCkmJiF0aGlzLmluUHJvZ3Jlc3MmJnRoaXMuY2FsY3VsYXRlQWxsQ29sdW1uc1dpZHRoKCkpfSxvbkFmdGVyTG9hZERhdGE6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuaG90LnZpZXc/dGhpcy5yZWNhbGN1bGF0ZUFsbENvbHVtbnNXaWR0aCgpOnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmhvdCYmZS5yZWNhbGN1bGF0ZUFsbENvbHVtbnNXaWR0aCgpfSwwKX0sb25CZWZvcmVDaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczttKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQud2lkdGhzW3QuaG90LnByb3BUb0NvbChlWzFdKV09dm9pZCAwfSl9LG9uQmVmb3JlQ29sdW1uUmVzaXplOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbiYmKHRoaXMuY2FsY3VsYXRlQ29sdW1uc1dpZHRoKGUsdm9pZCAwLCEwKSx0PXRoaXMuZ2V0Q29sdW1uV2lkdGgoZSx2b2lkIDAsITEpKSx0fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5naG9zdFRhYmxlLmNsZWFuKCksJHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMseC5wcm90b3R5cGUsImRlc3Ryb3kiKS5jYWxsKHRoaXMpfX0se2dldCBDQUxDVUxBVElPTl9TVEVQKCl7cmV0dXJuIDUwfSxnZXQgU1lOQ19DQUxDVUxBVElPTl9MSU1JVCgpe3JldHVybiA1MH19LHApLE8oImF1dG9Db2x1bW5TaXplIixBKX0seyIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY2FsY3VsYXRvci92aWV3cG9ydENvbHVtbnMiOjMsX2Jhc2U6NjAsImhlbHBlcnMvYXJyYXkiOjQyLCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9mZWF0dXJlIjo0OCwiaGVscGVycy9udW1iZXIiOjUxLCJoZWxwZXJzL29iamVjdCI6NTIsImhlbHBlcnMvc3RyaW5nIjo1NCxwbHVnaW5zOjU5LCJ1dGlscy9naG9zdFRhYmxlIjoxMDIsInV0aWxzL3NhbXBsZXNHZW5lcmF0b3IiOjEwNH1dLDYyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0F1dG9Sb3dTaXplOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ga319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGwsYSx1LGMsaCxkLGY9KG89ZSgiX2Jhc2UiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pWyJkZWZhdWx0Il0scD0ocj1lKCJoZWxwZXJzL2FycmF5IiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KSxnPShwLmFycmF5RWFjaCxwLmFycmF5RmlsdGVyKSxtPShpPWUoImhlbHBlcnMvZmVhdHVyZSIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSksdz1tLmNhbmNlbEFuaW1hdGlvbkZyYW1lLHY9bS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUseT0ocz1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5pc1Zpc2libGUsYj0obD1lKCJ1dGlscy9naG9zdFRhYmxlIiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KS5HaG9zdFRhYmxlLEM9KGE9ZSgiaGVscGVycy9vYmplY3QiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLF89Qy5pc09iamVjdCxSPShDLm9iamVjdEVhY2gsdT1lKCJoZWxwZXJzL251bWJlciIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSksUz1SLnZhbHVlQWNjb3JkaW5nUGVyY2VudCxFPVIucmFuZ2VFYWNoLFQ9KGM9ZSgicGx1Z2lucyIpLGMmJmMuX19lc01vZHVsZSYmY3x8eyJkZWZhdWx0IjpjfSkucmVnaXN0ZXJQbHVnaW4sTT0oaD1lKCJ1dGlscy9zYW1wbGVzR2VuZXJhdG9yIiksaCYmaC5fX2VzTW9kdWxlJiZofHx7ImRlZmF1bHQiOmh9KS5TYW1wbGVzR2VuZXJhdG9yLE89KGQ9ZSgiaGVscGVycy9zdHJpbmciKSxkJiZkLl9fZXNNb2R1bGUmJmR8fHsiZGVmYXVsdCI6ZH0pLmlzUGVyY2VudFZhbHVlLGs9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczskdHJhY2V1clJ1bnRpbWUuc3VwZXJDb25zdHJ1Y3RvcihIKS5jYWxsKHRoaXMsZSksdGhpcy5oZWlnaHRzPVtdLHRoaXMuZ2hvc3RUYWJsZT1uZXcgYih0aGlzLmhvdCksdGhpcy5zYW1wbGVzR2VuZXJhdG9yPW5ldyBNKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGU+PTA/dC5ob3QuZ2V0RGF0YUF0Q2VsbChlLG4pOi0xPT09ZT90LmhvdC5nZXRDb2xIZWFkZXIobik6bnVsbH0pLHRoaXMuZmlyc3RDYWxjdWxhdGlvbj0hMCx0aGlzLmluUHJvZ3Jlc3M9ITEsdGhpcy5hZGRIb29rKCJiZWZvcmVSb3dSZXNpemUiLGZ1bmN0aW9uKGUsbixvKXtyZXR1cm4gdC5vbkJlZm9yZVJvd1Jlc2l6ZShlLG4sbyl9KX0sSD1rOyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhrLHtpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5hdXRvUm93U2l6ZT09PSEwfHxfKHRoaXMuaG90LmdldFNldHRpbmdzKCkuYXV0b1Jvd1NpemUpfSxlbmFibGVQbHVnaW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCF0aGlzLmVuYWJsZWQpe3ZhciB0PXRoaXMuaG90LmdldFNldHRpbmdzKCkuYXV0b1Jvd1NpemUsbj10JiZ0Lmhhc093blByb3BlcnR5KCJzYW1wbGluZ1JhdGlvIik/dGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5hdXRvUm93U2l6ZS5zYW1wbGluZ1JhdGlvOnZvaWQgMDtuJiYhaXNOYU4obikmJih0aGlzLnNhbXBsZXNHZW5lcmF0b3IuY3VzdG9tU2FtcGxlQ291bnQ9cGFyc2VJbnQobiwxMCkpLHRoaXMuYWRkSG9vaygiYWZ0ZXJMb2FkRGF0YSIsZnVuY3Rpb24oKXtyZXR1cm4gZS5vbkFmdGVyTG9hZERhdGEoKX0pLHRoaXMuYWRkSG9vaygiYmVmb3JlQ2hhbmdlIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbkJlZm9yZUNoYW5nZSh0KX0pLHRoaXMuYWRkSG9vaygiYmVmb3JlQ29sdW1uTW92ZSIsZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWNhbGN1bGF0ZUFsbFJvd3NIZWlnaHQoKX0pLHRoaXMuYWRkSG9vaygiYmVmb3JlQ29sdW1uUmVzaXplIixmdW5jdGlvbigpe3JldHVybiBlLnJlY2FsY3VsYXRlQWxsUm93c0hlaWdodCgpfSksdGhpcy5hZGRIb29rKCJiZWZvcmVDb2x1bW5Tb3J0IixmdW5jdGlvbigpe3JldHVybiBlLmNsZWFyQ2FjaGUoKX0pLHRoaXMuYWRkSG9vaygiYmVmb3JlUmVuZGVyIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbkJlZm9yZVJlbmRlcih0KX0pLHRoaXMuYWRkSG9vaygiYmVmb3JlUm93TW92ZSIsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5vbkJlZm9yZVJvd01vdmUodCxuKX0pLHRoaXMuYWRkSG9vaygibW9kaWZ5Um93SGVpZ2h0IixmdW5jdGlvbih0LG4pe3JldHVybiBlLmdldFJvd0hlaWdodChuLHQpfSksdGhpcy5hZGRIb29rKCJtb2RpZnlDb2x1bW5IZWFkZXJIZWlnaHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0Q29sdW1uSGVhZGVySGVpZ2h0KCl9KSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxILnByb3RvdHlwZSwiZW5hYmxlUGx1Z2luIikuY2FsbCh0aGlzKX19LGRpc2FibGVQbHVnaW46ZnVuY3Rpb24oKXskdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxILnByb3RvdHlwZSwiZGlzYWJsZVBsdWdpbiIpLmNhbGwodGhpcyl9LGNhbGN1bGF0ZVJvd3NIZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOntmcm9tOjAsdG86dGhpcy5ob3QuY291bnRSb3dzKCktMX0sdD12b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntmcm9tOjAsdG86dGhpcy5ob3QuY291bnRDb2xzKCktMX0sbj12b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOiExLG89dGhpcztpZigibnVtYmVyIj09dHlwZW9mIGUmJihlPXtmcm9tOmUsdG86ZX0pLCJudW1iZXIiPT10eXBlb2YgdCYmKHQ9e2Zyb206dCx0bzp0fSksbnVsbCE9PXRoaXMuaG90LmdldENvbEhlYWRlcigwKSl7dmFyIHI9dGhpcy5zYW1wbGVzR2VuZXJhdG9yLmdlbmVyYXRlUm93U2FtcGxlcygtMSx0KTt0aGlzLmdob3N0VGFibGUuYWRkQ29sdW1uSGVhZGVyc1JvdyhyLmdldCgtMSkpfUUoZS5mcm9tLGUudG8sZnVuY3Rpb24oZSl7aWYobnx8dm9pZCAwPT09by5oZWlnaHRzW2VdKXt2YXIgcj1vLnNhbXBsZXNHZW5lcmF0b3IuZ2VuZXJhdGVSb3dTYW1wbGVzKGUsdCk7ci5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG8uZ2hvc3RUYWJsZS5hZGRSb3codCxlKX0pfX0pLHRoaXMuZ2hvc3RUYWJsZS5yb3dzLmxlbmd0aCYmKHRoaXMuZ2hvc3RUYWJsZS5nZXRIZWlnaHRzKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG8uaGVpZ2h0c1tlXT10fSksdGhpcy5naG9zdFRhYmxlLmNsZWFuKCkpfSxjYWxjdWxhdGVBbGxSb3dzSGVpZ2h0OmZ1bmN0aW9uKCl7dmFyIGU9dm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7ZnJvbTowLHRvOnRoaXMuaG90LmNvdW50Q29scygpLTF9LHQ9dGhpcyxuPTAsbz10aGlzLmhvdC5jb3VudFJvd3MoKS0xLHI9bnVsbDt0aGlzLmluUHJvZ3Jlc3M9ITA7dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm4gdC5ob3Q/KHQuY2FsY3VsYXRlUm93c0hlaWdodCh7ZnJvbTpuLHRvOk1hdGgubWluKG4rSC5DQUxDVUxBVElPTl9TVEVQLG8pfSxlKSxuPW4rSC5DQUxDVUxBVElPTl9TVEVQKzEsdm9pZChvPm4/cj12KGkpOih3KHIpLHQuaW5Qcm9ncmVzcz0hMSx0LmhvdC52aWV3Lnd0Lnd0T3ZlcmxheXMuYWRqdXN0RWxlbWVudHNTaXplKCEwKSx0LmhvdC52aWV3Lnd0Lnd0T3ZlcmxheXMubGVmdE92ZXJsYXkubmVlZEZ1bGxSZW5kZXImJnQuaG90LnZpZXcud3Qud3RPdmVybGF5cy5sZWZ0T3ZlcmxheS5jbG9uZS5kcmF3KCkpKSk6KHcociksdm9pZCh0LmluUHJvZ3Jlc3M9ITEpKX07dGhpcy5maXJzdENhbGN1bGF0aW9uJiZ0aGlzLmdldFN5bmNDYWxjdWxhdGlvbkxpbWl0KCkmJih0aGlzLmNhbGN1bGF0ZVJvd3NIZWlnaHQoe2Zyb206MCx0bzp0aGlzLmdldFN5bmNDYWxjdWxhdGlvbkxpbWl0KCl9LGUpLHRoaXMuZmlyc3RDYWxjdWxhdGlvbj0hMSxuPXRoaXMuZ2V0U3luY0NhbGN1bGF0aW9uTGltaXQoKSsxKSxvPm4/aSgpOnRoaXMuaW5Qcm9ncmVzcz0hMX0scmVjYWxjdWxhdGVBbGxSb3dzSGVpZ2h0OmZ1bmN0aW9uKCl7eSh0aGlzLmhvdC52aWV3Lnd0Lnd0VGFibGUuVEFCTEUpJiYodGhpcy5jbGVhckNhY2hlKCksdGhpcy5jYWxjdWxhdGVBbGxSb3dzSGVpZ2h0KCkpfSxnZXRTeW5jQ2FsY3VsYXRpb25MaW1pdDpmdW5jdGlvbigpe3ZhciBlPUguU1lOQ19DQUxDVUxBVElPTl9MSU1JVCx0PXRoaXMuaG90LmNvdW50Um93cygpLTE7cmV0dXJuIF8odGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5hdXRvUm93U2l6ZSkmJihlPXRoaXMuaG90LmdldFNldHRpbmdzKCkuYXV0b1Jvd1NpemUuc3luY0xpbWl0LE8oZSk/ZT1TKHQsZSk6ZT4+PTApLE1hdGgubWluKGUsdCl9LGdldFJvd0hlaWdodDpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHNbMV0sbj10O3JldHVybiB2b2lkIDAhPT10aGlzLmhlaWdodHNbZV0mJnRoaXMuaGVpZ2h0c1tlXT4odHx8MCkmJihuPXRoaXMuaGVpZ2h0c1tlXSksbn0sZ2V0Q29sdW1uSGVhZGVySGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVpZ2h0c1stMV19LGdldEZpcnN0VmlzaWJsZVJvdzpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG90LnZpZXcud3Q7cmV0dXJuIGUud3RWaWV3cG9ydC5yb3dzVmlzaWJsZUNhbGN1bGF0b3I/ZS53dFRhYmxlLmdldEZpcnN0VmlzaWJsZVJvdygpOmUud3RWaWV3cG9ydC5yb3dzUmVuZGVyQ2FsY3VsYXRvcj9lLnd0VGFibGUuZ2V0Rmlyc3RSZW5kZXJlZFJvdygpOi0xfSxnZXRMYXN0VmlzaWJsZVJvdzpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG90LnZpZXcud3Q7cmV0dXJuIGUud3RWaWV3cG9ydC5yb3dzVmlzaWJsZUNhbGN1bGF0b3I/ZS53dFRhYmxlLmdldExhc3RWaXNpYmxlUm93KCk6ZS53dFZpZXdwb3J0LnJvd3NSZW5kZXJDYWxjdWxhdG9yP2Uud3RUYWJsZS5nZXRMYXN0UmVuZGVyZWRSb3coKTotMX0sY2xlYXJDYWNoZTpmdW5jdGlvbigpe3RoaXMuaGVpZ2h0cy5sZW5ndGg9MCx0aGlzLmhlaWdodHNbLTFdPXZvaWQgMH0sY2xlYXJDYWNoZUJ5UmFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczsibnVtYmVyIj09dHlwZW9mIGUmJihlPXtmcm9tOmUsdG86ZX0pLEUoTWF0aC5taW4oZS5mcm9tLGUudG8pLE1hdGgubWF4KGUuZnJvbSxlLnRvKSxmdW5jdGlvbihlKXtyZXR1cm4gdC5oZWlnaHRzW2VdPXZvaWQgMH0pfSxpc05lZWRSZWNhbGN1bGF0ZTpmdW5jdGlvbigpe3JldHVybiEhZyh0aGlzLmhlaWdodHMsZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWV9KS5sZW5ndGh9LG9uQmVmb3JlUmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ob3QucmVuZGVyQ2FsbDt0aGlzLmNhbGN1bGF0ZVJvd3NIZWlnaHQoe2Zyb206dGhpcy5nZXRGaXJzdFZpc2libGVSb3coKSx0bzp0aGlzLmdldExhc3RWaXNpYmxlUm93KCl9LHZvaWQgMCxlKTt2YXIgdD10aGlzLmhvdC5nZXRTZXR0aW5ncygpLmZpeGVkUm93c0JvdHRvbTtpZih0KXt2YXIgbj10aGlzLmhvdC5jb3VudFJvd3MoKS0xO3RoaXMuY2FsY3VsYXRlUm93c0hlaWdodCh7ZnJvbTpuLXQsdG86bn0pfXRoaXMuaXNOZWVkUmVjYWxjdWxhdGUoKSYmIXRoaXMuaW5Qcm9ncmVzcyYmdGhpcy5jYWxjdWxhdGVBbGxSb3dzSGVpZ2h0KCl9LG9uQmVmb3JlUm93TW92ZTpmdW5jdGlvbihlLHQpe3RoaXMuY2xlYXJDYWNoZUJ5UmFuZ2Uoe2Zyb206ZSx0bzp0fSksdGhpcy5jYWxjdWxhdGVBbGxSb3dzSGVpZ2h0KCl9LG9uQmVmb3JlUm93UmVzaXplOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbiYmKHRoaXMuY2FsY3VsYXRlUm93c0hlaWdodChlLHZvaWQgMCwhMCksdD10aGlzLmdldFJvd0hlaWdodChlKSksdH0sb25BZnRlckxvYWREYXRhOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmhvdC52aWV3P3RoaXMucmVjYWxjdWxhdGVBbGxSb3dzSGVpZ2h0KCk6c2V0VGltZW91dChmdW5jdGlvbigpe2UuaG90JiZlLnJlY2FsY3VsYXRlQWxsUm93c0hlaWdodCgpfSwwKX0sb25CZWZvcmVDaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9bnVsbDsxPT09ZS5sZW5ndGg/dD1lWzBdWzBdOmUubGVuZ3RoPjEmJih0PXtmcm9tOmVbMF1bMF0sdG86ZVtlLmxlbmd0aC0xXVswXX0pLG51bGwhPT10JiZ0aGlzLmNsZWFyQ2FjaGVCeVJhbmdlKHQpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5naG9zdFRhYmxlLmNsZWFuKCksJHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsSC5wcm90b3R5cGUsImRlc3Ryb3kiKS5jYWxsKHRoaXMpfX0se2dldCBDQUxDVUxBVElPTl9TVEVQKCl7cmV0dXJuIDUwfSxnZXQgU1lOQ19DQUxDVUxBVElPTl9MSU1JVCgpe3JldHVybiA1MDB9fSxmKSxUKCJhdXRvUm93U2l6ZSIsayl9LHtfYmFzZTo2MCwiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL2ZlYXR1cmUiOjQ4LCJoZWxwZXJzL251bWJlciI6NTEsImhlbHBlcnMvb2JqZWN0Ijo1MiwiaGVscGVycy9zdHJpbmciOjU0LHBsdWdpbnM6NTksInV0aWxzL2dob3N0VGFibGUiOjEwMiwidXRpbHMvc2FtcGxlc0dlbmVyYXRvciI6MTA0fV0sNjM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQsbixvKXt2YXIgcixpLHMsbCxhLHU9bi5sZW5ndGgsYz1uP25bMF0ubGVuZ3RoOjAsaD1bXSxkPVtdO2lmKHI9dC5yb3ctZS5yb3csaT10LmNvbC1lLmNvbCwtMSE9PVsiZG93biIsInVwIl0uaW5kZXhPZihvKSl7Zm9yKHZhciBmPTA7aT49ZjtmKyspcz1wYXJzZUludChuWzBdW2ZdLDEwKSxsPXBhcnNlSW50KG5bdS0xXVtmXSwxMCksYT0oImRvd24iPT09bz9sLXM6cy1sKS8odS0xKXx8MCxkLnB1c2goYSk7aC5wdXNoKGQpfWlmKC0xIT09WyJyaWdodCIsImxlZnQiXS5pbmRleE9mKG8pKWZvcih2YXIgcD0wO3I+PXA7cCsrKXM9cGFyc2VJbnQobltwXVswXSwxMCksbD1wYXJzZUludChuW3BdW2MtMV0sMTApLGE9KCJyaWdodCI9PT1vP2wtczpzLWwpLyhjLTEpfHwwLGQ9W10sZC5wdXNoKGEpLGgucHVzaChkKTtyZXR1cm4gaH1mdW5jdGlvbiByKGUpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIGUuYXV0b2ZpbGw/dm9pZChlLmF1dG9maWxsLmhhbmRsZSYmZS5hdXRvZmlsbC5oYW5kbGUuaXNEcmFnZ2VkJiYoZS5hdXRvZmlsbC5oYW5kbGUuaXNEcmFnZ2VkPjEmJmUuYXV0b2ZpbGwuYXBwbHkoKSxlLmF1dG9maWxsLmhhbmRsZS5pc0RyYWdnZWQ9MCxsPSExKSk6ITB9ZnVuY3Rpb24gbihlKXt2YXIgdCxuO3JldHVybiBzLmluc3RhbmNlLmF1dG9maWxsPyh0PWYocy5pbnN0YW5jZS50YWJsZSkudG9wLSh3aW5kb3cucGFnZVlPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApK3Aocy5pbnN0YW5jZS50YWJsZSksbj1mKHMuaW5zdGFuY2UudGFibGUpLmxlZnQtKHdpbmRvdy5wYWdlWE9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQpK2cocy5pbnN0YW5jZS50YWJsZSkscy5hZGRpbmdTdGFydGVkPT09ITEmJnMuaW5zdGFuY2UuYXV0b2ZpbGwuaGFuZGxlLmlzRHJhZ2dlZD4wJiZlLmNsaWVudFk+dCYmZS5jbGllbnRYPD1uPyhzLmluc3RhbmNlLm1vdXNlRHJhZ091dHNpZGU9ITAscy5hZGRpbmdTdGFydGVkPSEwKTpzLmluc3RhbmNlLm1vdXNlRHJhZ091dHNpZGU9ITEsdm9pZChzLmluc3RhbmNlLm1vdXNlRHJhZ091dHNpZGUmJnYoImF1dG9JbnNlcnRSb3ciKSYmc2V0VGltZW91dChmdW5jdGlvbigpe3MuYWRkaW5nU3RhcnRlZD0hMSxzLmluc3RhbmNlLmFsdGVyKCJpbnNlcnRfcm93Iil9LDIwMCkpKTohMX12YXIgbyxyLGkscz10aGlzLGw9ITE7dGhpcy5pbnN0YW5jZT1lLHRoaXMuYWRkaW5nU3RhcnRlZD0hMSxpPW0oZSksaS5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIix0KSxpLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsbiksbz10aGlzLmluc3RhbmNlLnZpZXcud3Qud3RTZXR0aW5ncy5zZXR0aW5ncy5vbkNlbGxDb3JuZXJNb3VzZURvd24sdGhpcy5pbnN0YW5jZS52aWV3Lnd0Lnd0U2V0dGluZ3Muc2V0dGluZ3Mub25DZWxsQ29ybmVyTW91c2VEb3duPWZ1bmN0aW9uKHQpe2UuYXV0b2ZpbGwuaGFuZGxlLmlzRHJhZ2dlZD0xLGw9ITAsbyh0KX0scj10aGlzLmluc3RhbmNlLnZpZXcud3Qud3RTZXR0aW5ncy5zZXR0aW5ncy5vbkNlbGxNb3VzZU92ZXIsdGhpcy5pbnN0YW5jZS52aWV3Lnd0Lnd0U2V0dGluZ3Muc2V0dGluZ3Mub25DZWxsTW91c2VPdmVyPWZ1bmN0aW9uKHQsbixvLGkpe2UuYXV0b2ZpbGwmJmwmJiFlLnZpZXcuaXNNb3VzZURvd24oKSYmZS5hdXRvZmlsbC5oYW5kbGUmJmUuYXV0b2ZpbGwuaGFuZGxlLmlzRHJhZ2dlZCYmKGUuYXV0b2ZpbGwuaGFuZGxlLmlzRHJhZ2dlZCsrLGUuYXV0b2ZpbGwuc2hvd0JvcmRlcihuKSxlLmF1dG9maWxsLmNoZWNrSWZOZXdSb3dOZWVkZWQoKSkscih0LG4sbyxpKX0sdGhpcy5pbnN0YW5jZS52aWV3Lnd0Lnd0U2V0dGluZ3Muc2V0dGluZ3Mub25DZWxsQ29ybmVyRGJsQ2xpY2s9ZnVuY3Rpb24oKXtlLmF1dG9maWxsLnNlbGVjdEFkamFjZW50KCl9fWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiJkaXJlY3Rpb24iPT09dD9uPSJzdHJpbmciPT10eXBlb2YgZT9lOiJvYmplY3QiPT10eXBlb2YgZSYmdm9pZCAwIT09ZVt0XT9lW3RdOiEwOiJhdXRvSW5zZXJ0Um93Ij09PXQ/bj0ib2JqZWN0Ij09dHlwZW9mIGUmJnZvaWQgMCE9PWVbdF0/ZVt0XTohMDoiZmlsbEhhbmRsZSI9PT10JiYobj0hIWUpLG59fU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0F1dG9maWxsOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBzLGwsYSx1LGMsaD0ocz1lKCJicm93c2VyIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KVsiZGVmYXVsdCJdLGQ9KGw9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSksZj1kLm9mZnNldCxwPWQub3V0ZXJIZWlnaHQsZz1kLm91dGVyV2lkdGgsbT0oYT1lKCJldmVudE1hbmFnZXIiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLmV2ZW50TWFuYWdlcix3PSgodT1lKCJwbHVnaW5zIiksdSYmdS5fX2VzTW9kdWxlJiZ1fHx7ImRlZmF1bHQiOnV9KS5yZWdpc3RlclBsdWdpbiwoYz1lKCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY2VsbC9jb29yZHMiKSxjJiZjLl9fZXNNb2R1bGUmJmN8fHsiZGVmYXVsdCI6Y30pLldhbGtvbnRhYmxlQ2VsbENvb3Jkcyk7ci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuaGFuZGxlPXt9fSxyLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5oYW5kbGUuZGlzYWJsZWQ9ITB9LHIucHJvdG90eXBlLnNlbGVjdEFkamFjZW50PWZ1bmN0aW9uKCl7dmFyIGUsdCxuLG8scjtlPXRoaXMuaW5zdGFuY2Uuc2VsZWN0aW9uLmlzTXVsdGlwbGUoKT90aGlzLmluc3RhbmNlLnZpZXcud3Quc2VsZWN0aW9ucy5hcmVhLmdldENvcm5lcnMoKTp0aGlzLmluc3RhbmNlLnZpZXcud3Quc2VsZWN0aW9ucy5jdXJyZW50LmdldENvcm5lcnMoKSx0PXRoaXMuaW5zdGFuY2UuZ2V0RGF0YSgpO2U6Zm9yKG49ZVsyXSsxO248dGhpcy5pbnN0YW5jZS5jb3VudFJvd3MoKTtuKyspe2ZvcihyPWVbMV07cjw9ZVszXTtyKyspaWYodFtuXVtyXSlicmVhayBlOyh0W25dW2VbMV0tMV18fHRbbl1bZVszXSsxXSkmJihvPW4pfW8mJih0aGlzLmluc3RhbmNlLnZpZXcud3Quc2VsZWN0aW9ucy5maWxsLmNsZWFyKCksdGhpcy5pbnN0YW5jZS52aWV3Lnd0LnNlbGVjdGlvbnMuZmlsbC5hZGQobmV3IHcoZVswXSxlWzFdKSksdGhpcy5pbnN0YW5jZS52aWV3Lnd0LnNlbGVjdGlvbnMuZmlsbC5hZGQobmV3IHcobyxlWzNdKSksdGhpcy5hcHBseSgpKX0sci5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLHMsbCxhO3RoaXMuaGFuZGxlLmlzRHJhZ2dlZD0wLHRoaXMuaW5zdGFuY2Uudmlldy53dC5zZWxlY3Rpb25zLmZpbGwuaXNFbXB0eSgpfHwoZT10aGlzLmluc3RhbmNlLnZpZXcud3Quc2VsZWN0aW9ucy5maWxsLmdldENvcm5lcnMoKSx0aGlzLmluc3RhbmNlLnZpZXcud3Quc2VsZWN0aW9ucy5maWxsLmNsZWFyKCksdD10aGlzLmluc3RhbmNlLnNlbGVjdGlvbi5pc011bHRpcGxlKCk/dGhpcy5pbnN0YW5jZS52aWV3Lnd0LnNlbGVjdGlvbnMuYXJlYS5nZXRDb3JuZXJzKCk6dGhpcy5pbnN0YW5jZS52aWV3Lnd0LnNlbGVjdGlvbnMuY3VycmVudC5nZXRDb3JuZXJzKCksaC5ob29rcy5ydW4odGhpcy5pbnN0YW5jZSwiYWZ0ZXJBdXRvZmlsbEFwcGx5VmFsdWVzIix0LGUpLGVbMF09PT10WzBdJiZlWzFdPHRbMV0/KHM9ImxlZnQiLG49bmV3IHcoZVswXSxlWzFdKSxyPW5ldyB3KGVbMl0sdFsxXS0xKSk6ZVswXT09PXRbMF0mJmVbM10+dFszXT8ocz0icmlnaHQiLG49bmV3IHcoZVswXSx0WzNdKzEpLHI9bmV3IHcoZVsyXSxlWzNdKSk6ZVswXTx0WzBdJiZlWzFdPT09dFsxXT8ocz0idXAiLG49bmV3IHcoZVswXSxlWzFdKSxyPW5ldyB3KHRbMF0tMSxlWzNdKSk6ZVsyXT50WzJdJiZlWzFdPT09dFsxXSYmKHM9ImRvd24iLG49bmV3IHcodFsyXSsxLGVbMV0pLHI9bmV3IHcoZVsyXSxlWzNdKSksbiYmbi5yb3c+LTEmJm4uY29sPi0xPyhhPXtmcm9tOnRoaXMuaW5zdGFuY2UuZ2V0U2VsZWN0ZWRSYW5nZSgpLmZyb20sdG86dGhpcy5pbnN0YW5jZS5nZXRTZWxlY3RlZFJhbmdlKCkudG99LGk9dGhpcy5pbnN0YW5jZS5nZXREYXRhKGEuZnJvbS5yb3csYS5mcm9tLmNvbCxhLnRvLnJvdyxhLnRvLmNvbCksbD1vKG4scixpLHMpLGguaG9va3MucnVuKHRoaXMuaW5zdGFuY2UsImJlZm9yZUF1dG9maWxsIixuLHIsaSksdGhpcy5pbnN0YW5jZS5wb3B1bGF0ZUZyb21BcnJheShuLnJvdyxuLmNvbCxpLHIucm93LHIuY29sLCJhdXRvZmlsbCIsbnVsbCxzLGwpLHRoaXMuaW5zdGFuY2Uuc2VsZWN0aW9uLnNldFJhbmdlU3RhcnQobmV3IHcoZVswXSxlWzFdKSksdGhpcy5pbnN0YW5jZS5zZWxlY3Rpb24uc2V0UmFuZ2VFbmQobmV3IHcoZVsyXSxlWzNdKSkpOnRoaXMuaW5zdGFuY2Uuc2VsZWN0aW9uLnJlZnJlc2hCb3JkZXJzKCkpfSxyLnByb3RvdHlwZS5zaG93Qm9yZGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuaW5zdGFuY2UuZ2V0U2VsZWN0ZWRSYW5nZSgpLmdldFRvcExlZnRDb3JuZXIoKSxuPXRoaXMuaW5zdGFuY2UuZ2V0U2VsZWN0ZWRSYW5nZSgpLmdldEJvdHRvbVJpZ2h0Q29ybmVyKCk7aWYoImhvcml6b250YWwiIT09digiZGlyZWN0aW9uIikmJihuLnJvdzxlLnJvd3x8dC5yb3c+ZS5yb3cpKWU9bmV3IHcoZS5yb3csbi5jb2wpO2Vsc2V7aWYoInZlcnRpY2FsIj09PXYoImRpcmVjdGlvbiIpKXJldHVybjtlPW5ldyB3KG4ucm93LGUuY29sKX10aGlzLmluc3RhbmNlLnZpZXcud3Quc2VsZWN0aW9ucy5maWxsLmNsZWFyKCksdGhpcy5pbnN0YW5jZS52aWV3Lnd0LnNlbGVjdGlvbnMuZmlsbC5hZGQodGhpcy5pbnN0YW5jZS5nZXRTZWxlY3RlZFJhbmdlKCkuZnJvbSksdGhpcy5pbnN0YW5jZS52aWV3Lnd0LnNlbGVjdGlvbnMuZmlsbC5hZGQodGhpcy5pbnN0YW5jZS5nZXRTZWxlY3RlZFJhbmdlKCkudG8pLHRoaXMuaW5zdGFuY2Uudmlldy53dC5zZWxlY3Rpb25zLmZpbGwuYWRkKGUpLHRoaXMuaW5zdGFuY2Uudmlldy5yZW5kZXIoKX0sci5wcm90b3R5cGUuY2hlY2tJZk5ld1Jvd05lZWRlZD1mdW5jdGlvbigpe3ZhciBlLHQsbj10aGlzLmluc3RhbmNlLmNvdW50Um93cygpLG89dGhpczt0aGlzLmluc3RhbmNlLnZpZXcud3Quc2VsZWN0aW9ucy5maWxsLmNlbGxSYW5nZSYmdGhpcy5hZGRpbmdTdGFydGVkPT09ITEmJnYoImF1dG9JbnNlcnRSb3ciKSYmKHQ9dGhpcy5pbnN0YW5jZS5nZXRTZWxlY3RlZCgpLGU9dGhpcy5pbnN0YW5jZS52aWV3Lnd0LnNlbGVjdGlvbnMuZmlsbC5nZXRDb3JuZXJzKCksdFsyXTxuLTEmJmVbMl09PT1uLTEmJih0aGlzLmFkZGluZ1N0YXJ0ZWQ9ITAsdGhpcy5pbnN0YW5jZS5fcmVnaXN0ZXJUaW1lb3V0KHNldFRpbWVvdXQoZnVuY3Rpb24oKXtvLmluc3RhbmNlLmFsdGVyKCJpbnNlcnRfcm93Iiksby5hZGRpbmdTdGFydGVkPSExfSwyMDApKSkpfSxoLmhvb2tzLmFkZCgiYWZ0ZXJJbml0IixmdW5jdGlvbigpe3ZhciBlPW5ldyByKHRoaXMpO3Y9aSh0aGlzLmdldFNldHRpbmdzKCkuZmlsbEhhbmRsZSksdm9pZCAwIT09digiZmlsbEhhbmRsZSIpJiYoZS5oYW5kbGUmJnYoImZpbGxIYW5kbGUiKT09PSExP2UuZGlzYWJsZSgpOmUuaGFuZGxlfHx2KCJmaWxsSGFuZGxlIik9PT0hMXx8KHRoaXMuYXV0b2ZpbGw9ZSx0aGlzLmF1dG9maWxsLmluaXQoKSkpfSk7dmFyIHY7aC5BdXRvZmlsbD1yfSx7IjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9jZWxsL2Nvb3JkcyI6NSxicm93c2VyOjIzLGV2ZW50TWFuYWdlcjo0MSwiaGVscGVycy9kb20vZWxlbWVudCI6NDYscGx1Z2luczo1OX1dLDY0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0NvbHVtblNvcnRpbmc6e2dldDpmdW5jdGlvbigpe3JldHVybiBffX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpLHMsbCxhLHU9KG89ZSgiYnJvd3NlciIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXSxjPShyPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLGg9Yy5hZGRDbGFzcyxkPWMuY2xvc2VzdCxmPWMuaGFzQ2xhc3MscD1jLmluZGV4LGc9Yy5yZW1vdmVDbGFzcyxtPShpPWUoImhlbHBlcnMvYXJyYXkiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLHc9KG0uYXJyYXlFYWNoLG0uYXJyYXlNYXApLHY9bS5hcnJheVJlZHVjZSx5PShzPWUoImV2ZW50TWFuYWdlciIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuZXZlbnRNYW5hZ2VyLGI9KGw9ZSgiX2Jhc2UiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pWyJkZWZhdWx0Il0sQz0oYT1lKCJwbHVnaW5zIiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KS5yZWdpc3RlclBsdWdpbjt1Lmhvb2tzLnJlZ2lzdGVyKCJiZWZvcmVDb2x1bW5Tb3J0IiksdS5ob29rcy5yZWdpc3RlcigiYWZ0ZXJDb2x1bW5Tb3J0Iik7dmFyIF89ZnVuY3Rpb24oZSl7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IoUikuY2FsbCh0aGlzLGUpLHRoaXMuc29ydEluZGljYXRvcnM9W10sdGhpcy5sYXN0U29ydGVkQ29sdW1uPW51bGx9LFI9XzskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoXyx7aXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmhvdC5nZXRTZXR0aW5ncygpLmNvbHVtblNvcnRpbmd9LGVuYWJsZVBsdWdpbjpmdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIXRoaXMuZW5hYmxlZCl7dmFyIHQ9dGhpczt0aGlzLmhvdC5zb3J0SW5kZXg9W10sdGhpcy5ob3Quc29ydD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIHQuc29ydEJ5Q29sdW1uLmFwcGx5KHQsZSl9LCJ1bmRlZmluZWQiPT10eXBlb2YgdGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5vYnNlcnZlQ2hhbmdlcyYmdGhpcy5lbmFibGVPYnNlcnZlQ2hhbmdlc1BsdWdpbigpLHRoaXMuYmluZENvbHVtblNvcnRpbmdBZnRlckNsaWNrKCksdGhpcy5hZGRIb29rKCJhZnRlclRyaW1Sb3ciLGZ1bmN0aW9uKHQpe3JldHVybiBlLnNvcnQoKX0pLHRoaXMuYWRkSG9vaygiYWZ0ZXJVbnRyaW1Sb3ciLGZ1bmN0aW9uKHQpe3JldHVybiBlLnNvcnQoKX0pLHRoaXMuYWRkSG9vaygibW9kaWZ5Um93IixmdW5jdGlvbih0KXtyZXR1cm4gZS50cmFuc2xhdGVSb3codCl9KSx0aGlzLmFkZEhvb2soImFmdGVyVXBkYXRlU2V0dGluZ3MiLGZ1bmN0aW9uKCl7cmV0dXJuIGUub25BZnRlclVwZGF0ZVNldHRpbmdzKCl9KSx0aGlzLmFkZEhvb2soImFmdGVyR2V0Q29sSGVhZGVyIixmdW5jdGlvbih0LG4pe3JldHVybiBlLmdldENvbEhlYWRlcih0LG4pfSksdGhpcy5hZGRIb29rKCJhZnRlckNyZWF0ZVJvdyIsZnVuY3Rpb24oKXt0LmFmdGVyQ3JlYXRlUm93LmFwcGx5KHQsYXJndW1lbnRzKX0pLHRoaXMuYWRkSG9vaygiYWZ0ZXJSZW1vdmVSb3ciLGZ1bmN0aW9uKCl7dC5hZnRlclJlbW92ZVJvdy5hcHBseSh0LGFyZ3VtZW50cyl9KSx0aGlzLmFkZEhvb2soImFmdGVySW5pdCIsZnVuY3Rpb24oKXtyZXR1cm4gZS5zb3J0QnlTZXR0aW5ncygpfSksdGhpcy5hZGRIb29rKCJhZnRlckxvYWREYXRhIixmdW5jdGlvbigpe2UuaG90LnNvcnRJbmRleD1bXSxlLmhvdC52aWV3JiZlLnNvcnRCeVNldHRpbmdzKCl9KSx0aGlzLmhvdC52aWV3JiZ0aGlzLnNvcnRCeVNldHRpbmdzKCksJHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsUi5wcm90b3R5cGUsImVuYWJsZVBsdWdpbiIpLmNhbGwodGhpcyl9fSxkaXNhYmxlUGx1Z2luOmZ1bmN0aW9uKCl7dGhpcy5ob3Quc29ydD12b2lkIDAsJHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsUi5wcm90b3R5cGUsImRpc2FibGVQbHVnaW4iKS5jYWxsKHRoaXMpfSxvbkFmdGVyVXBkYXRlU2V0dGluZ3M6ZnVuY3Rpb24oKXt0aGlzLnNvcnRCeVNldHRpbmdzKCl9LHNvcnRCeVNldHRpbmdzOmZ1bmN0aW9uKCl7dmFyIGUsdCxuPXRoaXMuaG90LmdldFNldHRpbmdzKCkuY29sdW1uU29ydGluZyxvPXRoaXMubG9hZFNvcnRpbmdTdGF0ZSgpOyJ1bmRlZmluZWQiPT10eXBlb2Ygbz8oZT1uLmNvbHVtbix0PW4uc29ydE9yZGVyKTooZT1vLnNvcnRDb2x1bW4sdD1vLnNvcnRPcmRlciksIm51bWJlciI9PXR5cGVvZiBlJiYodGhpcy5sYXN0U29ydGVkQ29sdW1uPWUsdGhpcy5zb3J0QnlDb2x1bW4oZSx0KSl9LHNldFNvcnRpbmdDb2x1bW46ZnVuY3Rpb24oZSx0KXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGU/KHRoaXMuaG90LnNvcnRDb2x1bW49dm9pZCAwLHZvaWQodGhpcy5ob3Quc29ydE9yZGVyPXZvaWQgMCkpOih0aGlzLmhvdC5zb3J0Q29sdW1uPT09ZSYmInVuZGVmaW5lZCI9PXR5cGVvZiB0P3RoaXMuaG90LnNvcnRPcmRlcj09PSExP3RoaXMuaG90LnNvcnRPcmRlcj12b2lkIDA6dGhpcy5ob3Quc29ydE9yZGVyPSF0aGlzLmhvdC5zb3J0T3JkZXI6dGhpcy5ob3Quc29ydE9yZGVyPSJ1bmRlZmluZWQiPT10eXBlb2YgdD8hMDp0LHZvaWQodGhpcy5ob3Quc29ydENvbHVtbj1lKSl9LHNvcnRCeUNvbHVtbjpmdW5jdGlvbihlLHQpe2lmKHRoaXMuc2V0U29ydGluZ0NvbHVtbihlLHQpLCJ1bmRlZmluZWQiIT10eXBlb2YgdGhpcy5ob3Quc29ydENvbHVtbil7dmFyIG49dS5ob29rcy5ydW4odGhpcy5ob3QsImJlZm9yZUNvbHVtblNvcnQiLHRoaXMuaG90LnNvcnRDb2x1bW4sdGhpcy5ob3Quc29ydE9yZGVyKTtuIT09ITEmJnRoaXMuc29ydCgpLHRoaXMudXBkYXRlT3JkZXJDbGFzcygpLHRoaXMudXBkYXRlU29ydEluZGljYXRvcigpLHRoaXMuaG90LnJlbmRlcigpLHRoaXMuc2F2ZVNvcnRpbmdTdGF0ZSgpLHUuaG9va3MucnVuKHRoaXMuaG90LCJhZnRlckNvbHVtblNvcnQiLHRoaXMuaG90LnNvcnRDb2x1bW4sdGhpcy5ob3Quc29ydE9yZGVyKX19LHNhdmVTb3J0aW5nU3RhdGU6ZnVuY3Rpb24oKXt2YXIgZT17fTsidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuaG90LnNvcnRDb2x1bW4mJihlLnNvcnRDb2x1bW49dGhpcy5ob3Quc29ydENvbHVtbiksInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzLmhvdC5zb3J0T3JkZXImJihlLnNvcnRPcmRlcj10aGlzLmhvdC5zb3J0T3JkZXIpLChlLmhhc093blByb3BlcnR5KCJzb3J0Q29sdW1uIil8fGUuaGFzT3duUHJvcGVydHkoInNvcnRPcmRlciIpKSYmdS5ob29rcy5ydW4odGhpcy5ob3QsInBlcnNpc3RlbnRTdGF0ZVNhdmUiLCJjb2x1bW5Tb3J0aW5nIixlKX0sbG9hZFNvcnRpbmdTdGF0ZTpmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiB1Lmhvb2tzLnJ1bih0aGlzLmhvdCwicGVyc2lzdGVudFN0YXRlTG9hZCIsImNvbHVtblNvcnRpbmciLGUpLGUudmFsdWV9LHVwZGF0ZU9yZGVyQ2xhc3M6ZnVuY3Rpb24oKXt2YXIgZTt0aGlzLmhvdC5zb3J0T3JkZXI9PT0hMD9lPSJhc2NlbmRpbmciOnRoaXMuaG90LnNvcnRPcmRlcj09PSExJiYoZT0iZGVzY2VuZGluZyIpLHRoaXMuc29ydE9yZGVyQ2xhc3M9ZX0sYmluZENvbHVtblNvcnRpbmdBZnRlckNsaWNrOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXIuaG90LnZpZXcuVEJPRFkucXVlcnlTZWxlY3RvcigidHIiKSx0PTE7cmV0dXJuIGUmJih0PWUucXVlcnlTZWxlY3RvckFsbCgidGgiKS5sZW5ndGgpLHR9ZnVuY3Rpb24gdCh0KXt2YXIgbj1kKHQsIlRIIik7cmV0dXJuIHIuaG90LnZpZXcud3Qud3RUYWJsZS5nZXRGaXJzdFJlbmRlcmVkQ29sdW1uKCkrcChuKS1lKCl9dmFyIG49dGhpcztpZighdGhpcy5iaW5kZWRTb3J0RXZlbnQpe3ZhciBvPXkodGhpcy5ob3QpLHI9dGhpczt0aGlzLmJpbmRlZFNvcnRFdmVudD0hMCxvLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5ob3Qucm9vdEVsZW1lbnQsImNsaWNrIixmdW5jdGlvbihlKXtpZihmKGUudGFyZ2V0LCJjb2x1bW5Tb3J0aW5nIikpe3ZhciBvPXQoZS50YXJnZXQpO28hPT1uLmxhc3RTb3J0ZWRDb2x1bW4mJihuLmhvdC5zb3J0T3JkZXI9ITApLG4ubGFzdFNvcnRlZENvbHVtbj1vLG4uc29ydEJ5Q29sdW1uKG8pfX0pfX0sZW5hYmxlT2JzZXJ2ZUNoYW5nZXNQbHVnaW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuaG90Ll9yZWdpc3RlclRpbWVvdXQoc2V0VGltZW91dChmdW5jdGlvbigpe2UuaG90LnVwZGF0ZVNldHRpbmdzKHtvYnNlcnZlQ2hhbmdlczohMH0pfSwwKSl9LGRlZmF1bHRTb3J0OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiJzdHJpbmciPT10eXBlb2YgdFsxXSYmKHRbMV09dFsxXS50b0xvd2VyQ2FzZSgpKSwic3RyaW5nIj09dHlwZW9mIG5bMV0mJihuWzFdPW5bMV0udG9Mb3dlckNhc2UoKSksdFsxXT09PW5bMV0/MDpudWxsPT09dFsxXXx8IiI9PT10WzFdPzE6bnVsbD09PW5bMV18fCIiPT09blsxXT8tMTppc05hTih0WzFdKSYmIWlzTmFOKG5bMV0pP2U/MTotMTohaXNOYU4odFsxXSkmJmlzTmFOKG5bMV0pP2U/LTE6MTp0WzFdPG5bMV0/ZT8tMToxOnRbMV0+blsxXT9lPzE6LTE6MH19LGRhdGVTb3J0OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4pe2lmKHRbMV09PT1uWzFdKXJldHVybiAwO2lmKG51bGw9PT10WzFdfHwiIj09PXRbMV0pcmV0dXJuIDE7aWYobnVsbD09PW5bMV18fCIiPT09blsxXSlyZXR1cm4tMTt2YXIgbz1uZXcgRGF0ZSh0WzFdKSxyPW5ldyBEYXRlKG5bMV0pO3JldHVybiByPm8/ZT8tMToxOm8+cj9lPzE6LTE6MH19LG51bWVyaWNTb3J0OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4pe3ZhciBvPXBhcnNlRmxvYXQodFsxXSkscj1wYXJzZUZsb2F0KG5bMV0pO3JldHVybiBvPT09cnx8aXNOYU4obykmJmlzTmFOKHIpPzA6aXNOYU4obyk/MTppc05hTihyKT8tMTpyPm8/ZT8tMToxOm8+cj9lPzE6LTE6MH19LHNvcnQ6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRoaXMuaG90LnNvcnRPcmRlcilyZXR1cm4gdm9pZCh0aGlzLmhvdC5zb3J0SW5kZXgubGVuZ3RoPTApO3ZhciBlLHQ7dGhpcy5ob3Quc29ydGluZ0VuYWJsZWQ9ITEsdGhpcy5ob3Quc29ydEluZGV4Lmxlbmd0aD0wO2Zvcih2YXIgbj0wLG89dGhpcy5ob3QuY291bnRSb3dzKCktdGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5taW5TcGFyZVJvd3M7bz5uO24rKyl0aGlzLmhvdC5zb3J0SW5kZXgucHVzaChbbix0aGlzLmhvdC5nZXREYXRhQXRDZWxsKG4sdGhpcy5ob3Quc29ydENvbHVtbildKTtpZihlPXRoaXMuaG90LmdldENlbGxNZXRhKDAsdGhpcy5ob3Quc29ydENvbHVtbiksZS5zb3J0RnVuY3Rpb24pdD1lLnNvcnRGdW5jdGlvbjtlbHNlIHN3aXRjaChlLnR5cGUpe2Nhc2UiZGF0ZSI6dD10aGlzLmRhdGVTb3J0O2JyZWFrO2Nhc2UibnVtZXJpYyI6dD10aGlzLm51bWVyaWNTb3J0O2JyZWFrO2RlZmF1bHQ6dD10aGlzLmRlZmF1bHRTb3J0fXRoaXMuaG90LnNvcnRJbmRleC5zb3J0KHQodGhpcy5ob3Quc29ydE9yZGVyKSk7Zm9yKHZhciByPXRoaXMuaG90LnNvcnRJbmRleC5sZW5ndGg7cjx0aGlzLmhvdC5jb3VudFJvd3MoKTtyKyspdGhpcy5ob3Quc29ydEluZGV4LnB1c2goW3IsdGhpcy5ob3QuZ2V0RGF0YUF0Q2VsbChyLHRoaXMuaG90LnNvcnRDb2x1bW4pXSk7dGhpcy5ob3Quc29ydGluZ0VuYWJsZWQ9ITB9LHVwZGF0ZVNvcnRJbmRpY2F0b3I6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuaG90LnNvcnRPcmRlcil7dmFyIGU9dGhpcy5ob3QuZ2V0Q2VsbE1ldGEoMCx0aGlzLmhvdC5zb3J0Q29sdW1uKTt0aGlzLnNvcnRJbmRpY2F0b3JzW3RoaXMuaG90LnNvcnRDb2x1bW5dPWUuc29ydEluZGljYXRvcn19LHRyYW5zbGF0ZVJvdzpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ob3Quc29ydGluZ0VuYWJsZWQmJiJ1bmRlZmluZWQiIT10eXBlb2YgdGhpcy5ob3Quc29ydE9yZGVyJiZ0aGlzLmhvdC5zb3J0SW5kZXgmJnRoaXMuaG90LnNvcnRJbmRleC5sZW5ndGgmJnRoaXMuaG90LnNvcnRJbmRleFtlXT90aGlzLmhvdC5zb3J0SW5kZXhbZV1bMF06ZX0sdW50cmFuc2xhdGVSb3c6ZnVuY3Rpb24oZSl7aWYodGhpcy5ob3Quc29ydGluZ0VuYWJsZWQmJnRoaXMuaG90LnNvcnRJbmRleCYmdGhpcy5ob3Quc29ydEluZGV4Lmxlbmd0aClmb3IodmFyIHQ9MDt0PHRoaXMuaG90LnNvcnRJbmRleC5sZW5ndGg7dCsrKWlmKHRoaXMuaG90LnNvcnRJbmRleFt0XVswXT09ZSlyZXR1cm4gdH0sZ2V0Q29sSGVhZGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5xdWVyeVNlbGVjdG9yKCIuY29sSGVhZGVyIiksbz0odC5nZXRBdHRyaWJ1dGUoImNvbHNwYW4iKSx0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzKSxyPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwobyx0LnBhcmVudE5vZGUpO3ItPW8ubGVuZ3RoLG4mJih0aGlzLmhvdC5nZXRTZXR0aW5ncygpLmNvbHVtblNvcnRpbmcmJmU+PTAmJi0xPT09ciYmaChuLCJjb2x1bW5Tb3J0aW5nIiksZyhuLCJkZXNjZW5kaW5nIiksZyhuLCJhc2NlbmRpbmciKSx0aGlzLnNvcnRJbmRpY2F0b3JzW2VdJiZlPT09dGhpcy5ob3Quc29ydENvbHVtbiYmKCJhc2NlbmRpbmciPT09dGhpcy5zb3J0T3JkZXJDbGFzcz9oKG4sImFzY2VuZGluZyIpOiJkZXNjZW5kaW5nIj09PXRoaXMuc29ydE9yZGVyQ2xhc3MmJmgobiwiZGVzY2VuZGluZyIpKSl9LGlzU29ydGVkOmZ1bmN0aW9uKCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzLmhvdC5zb3J0Q29sdW1ufSxhZnRlckNyZWF0ZVJvdzpmdW5jdGlvbihlLHQpe2lmKHRoaXMuaXNTb3J0ZWQoKSl7Zm9yKHZhciBuPTA7bjx0aGlzLmhvdC5zb3J0SW5kZXgubGVuZ3RoO24rKyl0aGlzLmhvdC5zb3J0SW5kZXhbbl1bMF0+PWUmJih0aGlzLmhvdC5zb3J0SW5kZXhbbl1bMF0rPXQpO2Zvcih2YXIgbj0wO3Q+bjtuKyspdGhpcy5ob3Quc29ydEluZGV4LnNwbGljZShlK24sMCxbZStuLHRoaXMuaG90LmdldFNvdXJjZURhdGEoKVtlK25dW3RoaXMuaG90LnNvcnRDb2x1bW4rdGhpcy5ob3QuY29sT2Zmc2V0KCldXSk7dGhpcy5zYXZlU29ydGluZ1N0YXRlKCl9fSxhZnRlclJlbW92ZVJvdzpmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHYobyxmdW5jdGlvbih0LG4pe3JldHVybiBlPm4mJnQrKyx0fSwwKX1pZih0aGlzLmlzU29ydGVkKCkpe3ZhciBvPXRoaXMuaG90LnNvcnRJbmRleC5zcGxpY2UoZSx0KTtvPXcobyxmdW5jdGlvbihlKXtyZXR1cm4gZVswXX0pLHRoaXMuaG90LnNvcnRJbmRleD13KHRoaXMuaG90LnNvcnRJbmRleCxmdW5jdGlvbihlLHQpe3ZhciBvPW4oZVswXSk7cmV0dXJuIG8mJihlWzBdLT1vKSxlfSksdGhpcy5zYXZlU29ydGluZ1N0YXRlKCl9fX0se30sYiksQygiY29sdW1uU29ydGluZyIsXyl9LHtfYmFzZTo2MCxicm93c2VyOjIzLGV2ZW50TWFuYWdlcjo0MSwiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LHBsdWdpbnM6NTl9XSw2NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtDb21tZW50RWRpdG9yOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHI9KG89ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSkuYWRkQ2xhc3MsaT1mdW5jdGlvbigpe3RoaXMuZWRpdG9yPXRoaXMuY3JlYXRlRWRpdG9yKCksdGhpcy5lZGl0b3JTdHlsZT10aGlzLmVkaXRvci5zdHlsZSx0aGlzLmVkaXRvclN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5lZGl0b3JTdHlsZS56SW5kZXg9MTAwLHRoaXMuaGlkZSgpfSxzPWk7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKGkse3NldFBvc2l0aW9uOmZ1bmN0aW9uKGUsdCl7dGhpcy5lZGl0b3JTdHlsZS5sZWZ0PWUrInB4IiwNCnRoaXMuZWRpdG9yU3R5bGUudG9wPXQrInB4In0sc2hvdzpmdW5jdGlvbigpe3RoaXMuZWRpdG9yU3R5bGUuZGlzcGxheT0iYmxvY2sifSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5lZGl0b3JTdHlsZS5kaXNwbGF5PSJub25lIn0saXNWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuImJsb2NrIj09PXRoaXMuZWRpdG9yU3R5bGUuZGlzcGxheX0sc2V0VmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiIiO2U9ZXx8IiIsdGhpcy5nZXRJbnB1dEVsZW1lbnQoKS52YWx1ZT1lfSxnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldElucHV0RWxlbWVudCgpLnZhbHVlfSxpc0ZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PXRoaXMuZ2V0SW5wdXRFbGVtZW50KCl9LGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5nZXRJbnB1dEVsZW1lbnQoKS5mb2N1cygpfSxjcmVhdGVFZGl0b3I6ZnVuY3Rpb24oKXt2YXIgZSx0LG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLiIrcy5DTEFTU19FRElUT1JfQ09OVEFJTkVSKTtyZXR1cm4gbnx8KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscihuLHMuQ0xBU1NfRURJVE9SX0NPTlRBSU5FUiksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChuKSksZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyKGUscy5DTEFTU19FRElUT1IpLHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKSxyKHQscy5DTEFTU19JTlBVVCksZS5hcHBlbmRDaGlsZCh0KSxuLmFwcGVuZENoaWxkKGUpLGV9LGdldElucHV0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkaXRvci5xdWVyeVNlbGVjdG9yKCIuIitzLkNMQVNTX0lOUFVUKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWRpdG9yLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lZGl0b3IpLHRoaXMuZWRpdG9yPW51bGwsdGhpcy5lZGl0b3JTdHlsZT1udWxsfX0se2dldCBDTEFTU19FRElUT1JfQ09OVEFJTkVSKCl7cmV0dXJuImh0Q29tbWVudHNDb250YWluZXIifSxnZXQgQ0xBU1NfRURJVE9SKCl7cmV0dXJuImh0Q29tbWVudHMifSxnZXQgQ0xBU1NfSU5QVVQoKXtyZXR1cm4iaHRDb21tZW50VGV4dEFyZWEifSxnZXQgQ0xBU1NfQ0VMTCgpe3JldHVybiJodENvbW1lbnRDZWxsIn19KX0seyJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0Nn1dLDY2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0NvbW1lbnRzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gU319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGwsYSx1LGM9KG89ZSgiYnJvd3NlciIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXSxoPShyPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLGQ9aC5hZGRDbGFzcyxmPWguY2xvc2VzdCxwPWguZ2V0V2luZG93U2Nyb2xsTGVmdCxnPWguZ2V0V2luZG93U2Nyb2xsVG9wLG09aC5oYXNDbGFzcyx3PWgub2Zmc2V0LHY9KGk9ZSgiZXZlbnRNYW5hZ2VyIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5FdmVudE1hbmFnZXIseT0ocz1lKCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY2VsbC9jb29yZHMiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLldhbGtvbnRhYmxlQ2VsbENvb3JkcyxiPShsPWUoInBsdWdpbnMiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLEM9Yi5yZWdpc3RlclBsdWdpbixfPShiLmdldFBsdWdpbiwoYT1lKCJfYmFzZSIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSlbImRlZmF1bHQiXSksUj0odT1lKCJjb21tZW50RWRpdG9yIiksdSYmdS5fX2VzTW9kdWxlJiZ1fHx7ImRlZmF1bHQiOnV9KS5Db21tZW50RWRpdG9yLFM9ZnVuY3Rpb24oZSl7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IoRSkuY2FsbCh0aGlzLGUpLHRoaXMuZWRpdG9yPW51bGwsdGhpcy5ldmVudE1hbmFnZXI9bnVsbCx0aGlzLnJhbmdlPXt9LHRoaXMubW91c2VEb3duPSExLHRoaXMuY29udGV4dE1lbnVFdmVudD0hMSx0aGlzLnRpbWVyPW51bGx9LEU9UzskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoUyx7aXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG90LmdldFNldHRpbmdzKCkuY29tbWVudHN9LGVuYWJsZVBsdWdpbjpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5lbmFibGVkfHwodGhpcy5lZGl0b3J8fCh0aGlzLmVkaXRvcj1uZXcgUiksdGhpcy5ldmVudE1hbmFnZXJ8fCh0aGlzLmV2ZW50TWFuYWdlcj1uZXcgdih0aGlzKSksdGhpcy5hZGRIb29rKCJhZnRlckNvbnRleHRNZW51RGVmYXVsdE9wdGlvbnMiLGZ1bmN0aW9uKHQpe3JldHVybiBlLmFkZFRvQ29udGV4dE1lbnUodCl9KSx0aGlzLmFkZEhvb2soImFmdGVyUmVuZGVyZXIiLGZ1bmN0aW9uKHQsbixvLHIsaSxzKXtyZXR1cm4gZS5vbkFmdGVyUmVuZGVyZXIodCxzKX0pLHRoaXMuYWRkSG9vaygiYWZ0ZXJTY3JvbGxIb3Jpem9udGFsbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIGUucmVmcmVzaEVkaXRvclBvc2l0aW9uKCl9KSx0aGlzLmFkZEhvb2soImFmdGVyU2Nyb2xsVmVydGljYWxseSIsZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWZyZXNoRWRpdG9yUG9zaXRpb24oKX0pLHRoaXMuYWRkSG9vaygiYWZ0ZXJDb2x1bW5SZXNpemUiLGZ1bmN0aW9uKCl7cmV0dXJuIGUucmVmcmVzaEVkaXRvclBvc2l0aW9uKCl9KSx0aGlzLmFkZEhvb2soImFmdGVyUm93UmVzaXplIixmdW5jdGlvbigpe3JldHVybiBlLnJlZnJlc2hFZGl0b3JQb3NpdGlvbigpfSksdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpLCR0cmFjZXVyUnVudGltZS5zdXBlckdldCh0aGlzLEUucHJvdG90eXBlLCJlbmFibGVQbHVnaW4iKS5jYWxsKHRoaXMpKX0sZGlzYWJsZVBsdWdpbjpmdW5jdGlvbigpeyR0cmFjZXVyUnVudGltZS5zdXBlckdldCh0aGlzLEUucHJvdG90eXBlLCJkaXNhYmxlUGx1Z2luIikuY2FsbCh0aGlzKX0scmVnaXN0ZXJMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlb3ZlciIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25Nb3VzZU92ZXIodCl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZWRvd24iLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTW91c2VEb3duKHQpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbk1vdXNlTW92ZSh0KX0pLHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTW91c2VVcCh0KX0pLHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5lZGl0b3IuZ2V0SW5wdXRFbGVtZW50KCksImJsdXIiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uRWRpdG9yQmx1cih0KX0pfSxzZXRSYW5nZTpmdW5jdGlvbihlKXt0aGlzLnJhbmdlPWV9LGNsZWFyUmFuZ2U6ZnVuY3Rpb24oKXt0aGlzLnJhbmdlPXt9fSx0YXJnZXRJc0NlbGxXaXRoQ29tbWVudDpmdW5jdGlvbihlKXtyZXR1cm4hKCFtKGUudGFyZ2V0LCJodENvbW1lbnRDZWxsIil8fCFmKGUudGFyZ2V0LFt0aGlzLmhvdC5yb290RWxlbWVudF0pKX0sdGFyZ2V0SXNDb21tZW50VGV4dEFyZWE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWRpdG9yLmdldElucHV0RWxlbWVudCgpPT09ZS50YXJnZXR9LHNhdmVDb21tZW50OmZ1bmN0aW9uKCl7aWYoIXRoaXMucmFuZ2UuZnJvbSl0aHJvdyBuZXcgRXJyb3IoJ0JlZm9yZSB1c2luZyB0aGlzIG1ldGhvZCwgZmlyc3Qgc2V0IGNlbGwgcmFuZ2UgKGhvdC5nZXRQbHVnaW4oImNvbW1lbnQiKS5zZXRSYW5nZSgpKScpO3ZhciBlPXRoaXMuZWRpdG9yLmdldFZhbHVlKCksdD10aGlzLnJhbmdlLmZyb20ucm93LG49dGhpcy5yYW5nZS5mcm9tLmNvbDt0aGlzLmhvdC5zZXRDZWxsTWV0YSh0LG4sImNvbW1lbnQiLGUpLHRoaXMuaG90LnJlbmRlcigpfSxzYXZlQ29tbWVudEF0Q2VsbDpmdW5jdGlvbihlLHQpe3RoaXMuc2V0UmFuZ2Uoe2Zyb206bmV3IHkoZSx0KX0pLHRoaXMuc2F2ZUNvbW1lbnQoKX0scmVtb3ZlQ29tbWVudDpmdW5jdGlvbigpe2lmKCF0aGlzLnJhbmdlLmZyb20pdGhyb3cgbmV3IEVycm9yKCdCZWZvcmUgdXNpbmcgdGhpcyBtZXRob2QsIGZpcnN0IHNldCBjZWxsIHJhbmdlIChob3QuZ2V0UGx1Z2luKCJjb21tZW50Iikuc2V0UmFuZ2UoKSknKTt0aGlzLmhvdC5yZW1vdmVDZWxsTWV0YSh0aGlzLnJhbmdlLmZyb20ucm93LHRoaXMucmFuZ2UuZnJvbS5jb2wsImNvbW1lbnQiKSx0aGlzLmhvdC5yZW5kZXIoKSx0aGlzLmhpZGUoKX0scmVtb3ZlQ29tbWVudEF0Q2VsbDpmdW5jdGlvbihlLHQpe3RoaXMuc2V0UmFuZ2Uoe2Zyb206bmV3IHkoZSx0KX0pLHRoaXMucmVtb3ZlQ29tbWVudCgpfSxzaG93OmZ1bmN0aW9uKCl7aWYoIXRoaXMucmFuZ2UuZnJvbSl0aHJvdyBuZXcgRXJyb3IoJ0JlZm9yZSB1c2luZyB0aGlzIG1ldGhvZCwgZmlyc3Qgc2V0IGNlbGwgcmFuZ2UgKGhvdC5nZXRQbHVnaW4oImNvbW1lbnQiKS5zZXRSYW5nZSgpKScpO3ZhciBlPXRoaXMuaG90LmdldENlbGxNZXRhKHRoaXMucmFuZ2UuZnJvbS5yb3csdGhpcy5yYW5nZS5mcm9tLmNvbCk7cmV0dXJuIHRoaXMucmVmcmVzaEVkaXRvclBvc2l0aW9uKCEwKSx0aGlzLmVkaXRvci5zZXRWYWx1ZShlLmNvbW1lbnR8fCIiKSx0aGlzLmVkaXRvci5zaG93KCksITB9LHNob3dBdENlbGw6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zZXRSYW5nZSh7ZnJvbTpuZXcgeShlLHQpfSksdGhpcy5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmVkaXRvci5oaWRlKCl9LHJlZnJlc2hFZGl0b3JQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBlPXZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ITE7aWYoZXx8dGhpcy5yYW5nZS5mcm9tJiZ0aGlzLmVkaXRvci5pc1Zpc2libGUoKSl7dmFyIHQ9dGhpcy5ob3Qudmlldy53dC53dFRhYmxlLmdldENlbGwodGhpcy5yYW5nZS5mcm9tKSxuPXcodCksbz10aGlzLmhvdC5nZXRDb2xXaWR0aCh0aGlzLnJhbmdlLmZyb20uY29sKSxyPW4udG9wLGk9bi5sZWZ0LHM9MCxsPTA7dGhpcy5ob3Qudmlldy53dC53dFZpZXdwb3J0Lmhhc1ZlcnRpY2FsU2Nyb2xsKCkmJihyLT10aGlzLmhvdC52aWV3Lnd0Lnd0T3ZlcmxheXMudG9wT3ZlcmxheS5nZXRTY3JvbGxQb3NpdGlvbigpLHM9MjApLHRoaXMuaG90LnZpZXcud3Qud3RWaWV3cG9ydC5oYXNIb3Jpem9udGFsU2Nyb2xsKCkmJihpLT10aGlzLmhvdC52aWV3Lnd0Lnd0T3ZlcmxheXMubGVmdE92ZXJsYXkuZ2V0U2Nyb2xsUG9zaXRpb24oKSxsPTIwKTt2YXIgYT1pK28sdT1yLGM9dGhpcy5ob3Qudmlldy53dC53dFRhYmxlLmhvbGRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxoPXtsZWZ0OmMubGVmdCtwKCkrbCxyaWdodDpjLnJpZ2h0K3AoKS0xNSx0b3A6Yy50b3ArZygpK3MsYm90dG9tOmMuYm90dG9tK2coKX07YTw9aC5sZWZ0fHxhPmgucmlnaHR8fHU8PWgudG9wfHx1PmguYm90dG9tP3RoaXMuaGlkZSgpOnRoaXMuZWRpdG9yLnNldFBvc2l0aW9uKGEsdSl9fSxvbk1vdXNlRG93bjpmdW5jdGlvbihlKXt0aGlzLm1vdXNlRG93bj0hMCx0aGlzLmhvdC52aWV3JiZ0aGlzLmhvdC52aWV3Lnd0JiYodGhpcy5jb250ZXh0TWVudUV2ZW50fHx0aGlzLnRhcmdldElzQ29tbWVudFRleHRBcmVhKGUpfHx0aGlzLnRhcmdldElzQ2VsbFdpdGhDb21tZW50KGUpfHx0aGlzLmhpZGUoKSx0aGlzLmNvbnRleHRNZW51RXZlbnQ9ITEpfSxvbk1vdXNlT3ZlcjpmdW5jdGlvbihlKXtpZighdGhpcy5tb3VzZURvd24mJiF0aGlzLmVkaXRvci5pc0ZvY3VzZWQoKSlpZih0aGlzLnRhcmdldElzQ2VsbFdpdGhDb21tZW50KGUpKXt2YXIgdD10aGlzLmhvdC52aWV3Lnd0Lnd0VGFibGUuZ2V0Q29vcmRzKGUudGFyZ2V0KSxuPXtmcm9tOm5ldyB5KHQucm93LHQuY29sKX07dGhpcy5zZXRSYW5nZShuKSx0aGlzLnNob3coKX1lbHNlIHRoaXMudGFyZ2V0SXNDb21tZW50VGV4dEFyZWEoZSl8fHRoaXMuZWRpdG9yLmlzRm9jdXNlZCgpfHx0aGlzLmhpZGUoKX0sb25Nb3VzZU1vdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLnRhcmdldElzQ29tbWVudFRleHRBcmVhKGUpJiYodGhpcy5tb3VzZURvd249ITAsY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe3QubW91c2VEb3duPSExfSwyMDApKX0sb25Nb3VzZVVwOmZ1bmN0aW9uKGUpe3RoaXMubW91c2VEb3duPSExfSxvbkFmdGVyUmVuZGVyZXI6ZnVuY3Rpb24oZSx0KXt0LmNvbW1lbnQmJmQoZSx0LmNvbW1lbnRlZENlbGxDbGFzc05hbWUpfSxvbkVkaXRvckJsdXI6ZnVuY3Rpb24oZSl7dGhpcy5zYXZlQ29tbWVudCgpfSxjaGVja1NlbGVjdGlvbkNvbW1lbnRzQ29uc2lzdGVuY3k6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmhvdC5nZXRTZWxlY3RlZFJhbmdlKCk7aWYoIWUpcmV0dXJuITE7dmFyIHQ9ITEsbj1lLmZyb207cmV0dXJuIHRoaXMuaG90LmdldENlbGxNZXRhKG4ucm93LG4uY29sKS5jb21tZW50JiYodD0hMCksdH0sb25Db250ZXh0TWVudUFkZENvbW1lbnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5ob3QuZ2V0U2VsZWN0ZWRSYW5nZSgpO3RoaXMuY29udGV4dE1lbnVFdmVudD0hMCx0aGlzLnNldFJhbmdlKHtmcm9tOnQuZnJvbX0pLHRoaXMuc2hvdygpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmhvdCYmKGUuaG90LmRlc2VsZWN0Q2VsbCgpLGUuZWRpdG9yLmZvY3VzKCkpfSwxMCl9LG9uQ29udGV4dE1lbnVSZW1vdmVDb21tZW50OmZ1bmN0aW9uKGUsdCl7dGhpcy5jb250ZXh0TWVudUV2ZW50PSEwLHRoaXMucmVtb3ZlQ29tbWVudEF0Q2VsbCh0LnN0YXJ0LnJvdyx0LnN0YXJ0LmNvbCl9LGFkZFRvQ29udGV4dE1lbnU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztlLml0ZW1zLnB1c2goYy5wbHVnaW5zLkNvbnRleHRNZW51LlNFUEFSQVRPUix7a2V5OiJjb21tZW50c0FkZEVkaXQiLG5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdC5jaGVja1NlbGVjdGlvbkNvbW1lbnRzQ29uc2lzdGVuY3koKT8iRWRpdCBDb21tZW50IjoiQWRkIENvbW1lbnQifSxjYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiB0Lm9uQ29udGV4dE1lbnVBZGRDb21tZW50KCl9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZ2V0U2VsZWN0ZWQoKX19LHtrZXk6ImNvbW1lbnRzUmVtb3ZlIixuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbGV0ZSBDb21tZW50In0sY2FsbGJhY2s6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5vbkNvbnRleHRNZW51UmVtb3ZlQ29tbWVudChlLG4pfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiF0LmNoZWNrU2VsZWN0aW9uQ29tbWVudHNDb25zaXN0ZW5jeSgpfX0pfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lZGl0b3ImJnRoaXMuZWRpdG9yLmRlc3Ryb3koKSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxFLnByb3RvdHlwZSwiZGVzdHJveSIpLmNhbGwodGhpcyl9fSx7fSxfKSxDKCJjb21tZW50cyIsUyl9LHsiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL2NlbGwvY29vcmRzIjo1LF9iYXNlOjYwLGJyb3dzZXI6MjMsY29tbWVudEVkaXRvcjo2NSxldmVudE1hbmFnZXI6NDEsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LHBsdWdpbnM6NTl9XSw2NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7dmFyIG47cmV0dXJuIGkodCxmdW5jdGlvbih0KXt2YXIgbz10LmtleT90LmtleS5zcGxpdCgiOiIpOm51bGw7cmV0dXJuIEFycmF5LmlzQXJyYXkobykmJm9bMV09PT1lPyhuPXQsITEpOnZvaWQgMH0pLG59T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7Q29tbWFuZEV4ZWN1dG9yOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciByLGk9KHI9ZSgiaGVscGVycy9hcnJheSIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSkuYXJyYXlFYWNoLHM9ZnVuY3Rpb24oZSl7dGhpcy5ob3Q9ZSx0aGlzLmNvbW1hbmRzPXt9LHRoaXMuY29tbW9uQ2FsbGJhY2s9bnVsbH07JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKHMse3JlZ2lzdGVyQ29tbWFuZDpmdW5jdGlvbihlLHQpe3RoaXMuY29tbWFuZHNbZV09dH0sc2V0Q29tbW9uQ2FsbGJhY2s6ZnVuY3Rpb24oZSl7dGhpcy5jb21tb25DYWxsYmFjaz1lfSxleGVjdXRlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0W24tMV09YXJndW1lbnRzW25dO3ZhciByPXRoaXMscz1lLnNwbGl0KCI6Iik7ZT1zWzBdO3ZhciBsPTI9PT1zLmxlbmd0aD9zWzFdOm51bGwsYT10aGlzLmNvbW1hbmRzW2VdO2lmKCFhKXRocm93IG5ldyBFcnJvcigiTWVudSBjb21tYW5kICciK2UrIicgbm90IGV4aXN0cy4iKTtpZihsJiZhLnN1Ym1lbnUmJihhPW8obCxhLnN1Ym1lbnUuaXRlbXMpKSxhLmRpc2FibGVkIT09ITAmJigiZnVuY3Rpb24iIT10eXBlb2YgYS5kaXNhYmxlZHx8YS5kaXNhYmxlZC5jYWxsKHRoaXMuaG90KSE9PSEwKSYmIWEuaGFzT3duUHJvcGVydHkoInN1Ym1lbnUiKSl7dmFyIHU9W107ImZ1bmN0aW9uIj09dHlwZW9mIGEuY2FsbGJhY2smJnUucHVzaChhLmNhbGxiYWNrKSwiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb21tb25DYWxsYmFjayYmdS5wdXNoKHRoaXMuY29tbW9uQ2FsbGJhY2spLHQudW5zaGlmdChzLmpvaW4oIjoiKSksaSh1LGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGx5KHIuaG90LHQpfSl9fX0se30pfSx7ImhlbHBlcnMvYXJyYXkiOjQyfV0sNjg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7Q29udGV4dE1lbnU6e2dldDpmdW5jdGlvbigpe3JldHVybiBCfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpLHMsbCxhLHUsYyxoLGQsYSxmLHA9KG89ZSgiYnJvd3NlciIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXSxnPShyPWUoIl9iYXNlIiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KVsiZGVmYXVsdCJdLG09KGk9ZSgiaGVscGVycy9hcnJheSIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkuYXJyYXlFYWNoLHc9KHM9ZSgiY29tbWFuZEV4ZWN1dG9yIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5Db21tYW5kRXhlY3V0b3Isdj0obD1lKCJldmVudE1hbmFnZXIiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLkV2ZW50TWFuYWdlcix5PShhPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLmhhc0NsYXNzLGI9KHU9ZSgiaXRlbXNGYWN0b3J5IiksdSYmdS5fX2VzTW9kdWxlJiZ1fHx7ImRlZmF1bHQiOnV9KS5JdGVtc0ZhY3RvcnksQz0oYz1lKCJtZW51IiksYyYmYy5fX2VzTW9kdWxlJiZjfHx7ImRlZmF1bHQiOmN9KS5NZW51LF89KGg9ZSgicGx1Z2lucyIpLGgmJmguX19lc01vZHVsZSYmaHx8eyJkZWZhdWx0IjpofSkucmVnaXN0ZXJQbHVnaW4sUj0oZD1lKCJoZWxwZXJzL2RvbS9ldmVudCIpLGQmJmQuX19lc01vZHVsZSYmZHx8eyJkZWZhdWx0IjpkfSksUz1SLnN0b3BQcm9wYWdhdGlvbixFPVIucGFnZVgsVD1SLnBhZ2VZLE09KGE9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSksTz1NLmdldFdpbmRvd1Njcm9sbExlZnQsaz1NLmdldFdpbmRvd1Njcm9sbFRvcCxIPShmPWUoInByZWRlZmluZWRJdGVtcyIpLGYmJmYuX19lc01vZHVsZSYmZnx8eyJkZWZhdWx0IjpmfSksRD1ILlJPV19BQk9WRSxBPUguUk9XX0JFTE9XLHg9SC5DT0xVTU5fTEVGVCxQPUguQ09MVU1OX1JJR0hULE49SC5SRU1PVkVfUk9XLEw9SC5SRU1PVkVfQ09MVU1OLFc9SC5VTkRPLEk9SC5SRURPLGo9SC5SRUFEX09OTFksVj1ILkFMSUdOTUVOVCxGPUguU0VQQVJBVE9SLEI9ZnVuY3Rpb24oZSl7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IoeikuY2FsbCh0aGlzLGUpLHRoaXMuZXZlbnRNYW5hZ2VyPW5ldyB2KHRoaXMpLHRoaXMuY29tbWFuZEV4ZWN1dG9yPW5ldyB3KHRoaXMuaG90KSx0aGlzLml0ZW1zRmFjdG9yeT1udWxsLHRoaXMubWVudT1udWxsfSx6PUI7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKEIse2lzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhvdC5nZXRTZXR0aW5ncygpLmNvbnRleHRNZW51fSxlbmFibGVQbHVnaW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCF0aGlzLmVuYWJsZWQpe3RoaXMuaXRlbXNGYWN0b3J5PW5ldyBiKHRoaXMuaG90LHouREVGQVVMVF9JVEVNUyk7dmFyIHQ9dGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5jb250ZXh0TWVudSxuPXtpdGVtczp0aGlzLml0ZW1zRmFjdG9yeS5nZXRJdGVtcyh0KX07dGhpcy5yZWdpc3RlckV2ZW50cygpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmNhbGxiYWNrJiZ0aGlzLmNvbW1hbmRFeGVjdXRvci5zZXRDb21tb25DYWxsYmFjayh0LmNhbGxiYWNrKSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyx6LnByb3RvdHlwZSwiZW5hYmxlUGx1Z2luIikuY2FsbCh0aGlzKSx0aGlzLmNhbGxPblBsdWdpbnNSZWFkeShmdW5jdGlvbigpe2UuaG90LnJ1bkhvb2tzKCJhZnRlckNvbnRleHRNZW51RGVmYXVsdE9wdGlvbnMiLG4pLGUuaXRlbXNGYWN0b3J5LnNldFByZWRlZmluZWRJdGVtcyhuLml0ZW1zKTt2YXIgbz1lLml0ZW1zRmFjdG9yeS5nZXRJdGVtcyh0KTtlLm1lbnU9bmV3IEMoZS5ob3Qse2NsYXNzTmFtZToiaHRDb250ZXh0TWVudSIsa2VlcEluVmlld3BvcnQ6ITB9KSxlLm1lbnUuc2V0TWVudUl0ZW1zKG8pLGUubWVudS5hZGRMb2NhbEhvb2soImFmdGVyT3BlbiIsZnVuY3Rpb24oKXtyZXR1cm4gZS5vbk1lbnVBZnRlck9wZW4oKX0pLGUubWVudS5hZGRMb2NhbEhvb2soImFmdGVyQ2xvc2UiLGZ1bmN0aW9uKCl7cmV0dXJuIGUub25NZW51QWZ0ZXJDbG9zZSgpfSksZS5tZW51LmFkZExvY2FsSG9vaygiZXhlY3V0ZUNvbW1hbmQiLGZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBlLmV4ZWN1dGVDb21tYW5kLmFwcGx5KGUsdCl9KSxtKG8sZnVuY3Rpb24odCl7cmV0dXJuIGUuY29tbWFuZEV4ZWN1dG9yLnJlZ2lzdGVyQ29tbWFuZCh0LmtleSx0KX0pfSl9fSx1cGRhdGVQbHVnaW46ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVQbHVnaW4oKSx0aGlzLmVuYWJsZVBsdWdpbigpLCR0cmFjZXVyUnVudGltZS5zdXBlckdldCh0aGlzLHoucHJvdG90eXBlLCJ1cGRhdGVQbHVnaW4iKS5jYWxsKHRoaXMpfSxkaXNhYmxlUGx1Z2luOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpLHRoaXMubWVudSYmKHRoaXMubWVudS5kZXN0cm95KCksdGhpcy5tZW51PW51bGwpLCR0cmFjZXVyUnVudGltZS5zdXBlckdldCh0aGlzLHoucHJvdG90eXBlLCJkaXNhYmxlUGx1Z2luIikuY2FsbCh0aGlzKX0scmVnaXN0ZXJFdmVudHM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5ob3Qucm9vdEVsZW1lbnQsImNvbnRleHRtZW51IixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbkNvbnRleHRNZW51KHQpfSl9LG9wZW46ZnVuY3Rpb24oZSl7dGhpcy5tZW51JiYodGhpcy5tZW51Lm9wZW4oKSx0aGlzLm1lbnUuc2V0UG9zaXRpb24oe3RvcDpwYXJzZUludChUKGUpLDEwKS1rKCksbGVmdDpwYXJzZUludChFKGUpLDEwKS1PKCl9KSx0aGlzLm1lbnUuaG90TWVudS5pc0hvdFRhYmxlRW52PXRoaXMuaG90LmlzSG90VGFibGVFbnYscC5ldmVudE1hbmFnZXIuaXNIb3RUYWJsZUVudj10aGlzLmhvdC5pc0hvdFRhYmxlRW52KX0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm1lbnUmJnRoaXMubWVudS5jbG9zZSgpfSxleGVjdXRlQ29tbWFuZDpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyllW3RdPWFyZ3VtZW50c1t0XTt0aGlzLmNvbW1hbmRFeGVjdXRvci5leGVjdXRlLmFwcGx5KHRoaXMuY29tbWFuZEV4ZWN1dG9yLGUpfSxvbkNvbnRleHRNZW51OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIlREIj09PWUubm9kZU5hbWV8fCJURCI9PT1lLnBhcmVudE5vZGUubm9kZU5hbWV9dmFyIG49dGhpcy5ob3QuZ2V0U2V0dGluZ3MoKSxvPW4ucm93SGVhZGVycyxyPW4uY29sSGVhZGVycyxpPWUucmVhbFRhcmdldDtpZih0aGlzLmNsb3NlKCksZS5wcmV2ZW50RGVmYXVsdCgpLFMoZSksb3x8cil7aWYobyYmcil7dmFyIHM9aS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoIi5jb3JuZXJIZWFkZXIiKS5sZW5ndGg+MDtpZihzKXJldHVybn19ZWxzZSBpZighKHQoaSl8fHkoaSwiY3VycmVudCIpJiZ5KGksInd0Qm9yZGVyIikpKXJldHVybjt0aGlzLm9wZW4oZSl9LG9uTWVudUFmdGVyT3BlbjpmdW5jdGlvbigpe3RoaXMuaG90LnJ1bkhvb2tzKCJhZnRlckNvbnRleHRNZW51U2hvdyIsdGhpcyl9LG9uTWVudUFmdGVyQ2xvc2U6ZnVuY3Rpb24oKXt0aGlzLmhvdC5saXN0ZW4oKSx0aGlzLmhvdC5ydW5Ib29rcygiYWZ0ZXJDb250ZXh0TWVudUhpZGUiLHRoaXMpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpLHRoaXMubWVudSYmdGhpcy5tZW51LmRlc3Ryb3koKSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyx6LnByb3RvdHlwZSwiZGVzdHJveSIpLmNhbGwodGhpcyl9fSx7Z2V0IERFRkFVTFRfSVRFTVMoKXtyZXR1cm5bRCxBLEYseCxQLEYsTixMLEYsVyxJLEYsaixGLFZdfX0sZyksQi5TRVBBUkFUT1I9e25hbWU6Rn0scC5ob29rcy5yZWdpc3RlcigiYWZ0ZXJDb250ZXh0TWVudURlZmF1bHRPcHRpb25zIikscC5ob29rcy5yZWdpc3RlcigiYWZ0ZXJDb250ZXh0TWVudVNob3ciKSxwLmhvb2tzLnJlZ2lzdGVyKCJhZnRlckNvbnRleHRNZW51SGlkZSIpLHAuaG9va3MucmVnaXN0ZXIoImFmdGVyQ29udGV4dE1lbnVFeGVjdXRlIiksXygiY29udGV4dE1lbnUiLEIpfSx7X2Jhc2U6NjAsYnJvd3NlcjoyMyxjb21tYW5kRXhlY3V0b3I6NjcsZXZlbnRNYW5hZ2VyOjQxLCJoZWxwZXJzL2FycmF5Ijo0MiwiaGVscGVycy9kb20vZWxlbWVudCI6NDYsImhlbHBlcnMvZG9tL2V2ZW50Ijo0NyxpdGVtc0ZhY3Rvcnk6NzAsbWVudTo3MSxwbHVnaW5zOjU5LHByZWRlZmluZWRJdGVtczo3Mn1dLDY5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0N1cnNvcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGZ9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscz0obz1lKCJicm93c2VyIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLGw9KHI9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSksYT1sLmdldFdpbmRvd1Njcm9sbExlZnQsdT1sLmdldFdpbmRvd1Njcm9sbFRvcCxjPShpPWUoImhlbHBlcnMvZG9tL2V2ZW50IiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KSxoPWMucGFnZVgsZD1jLnBhZ2VZLGY9ZnVuY3Rpb24oZSl7dmFyIHQsbixvLHIsaSxzLGw9dSgpLGM9YSgpO3RoaXMudHlwZT10aGlzLmdldFNvdXJjZVR5cGUoZSksImxpdGVyYWwiPT09dGhpcy50eXBlPyh0PXBhcnNlSW50KGUudG9wLDEwKSxvPXBhcnNlSW50KGUubGVmdCwxMCksaT1lLmhlaWdodHx8MCxzPWUud2lkdGh8fDAsbj10LHI9byx0Kz1sLG8rPWMpOiJldmVudCI9PT10aGlzLnR5cGUmJih0PXBhcnNlSW50KGQoZSksMTApLG89cGFyc2VJbnQoaChlKSwxMCksaT1lLnRhcmdldC5jbGllbnRIZWlnaHQscz1lLnRhcmdldC5jbGllbnRXaWR0aCxuPXQtbCxyPW8tYyksdGhpcy50b3A9dCx0aGlzLnRvcFJlbGF0aXZlPW4sdGhpcy5sZWZ0PW8sdGhpcy5sZWZ0UmVsYXRpdmU9cix0aGlzLnNjcm9sbFRvcD1sLHRoaXMuc2Nyb2xsTGVmdD1jLHRoaXMuY2VsbEhlaWdodD1pLHRoaXMuY2VsbFdpZHRoPXN9OyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhmLHtnZXRTb3VyY2VUeXBlOmZ1bmN0aW9uKGUpe3ZhciB0PSJsaXRlcmFsIjtyZXR1cm4gZSBpbnN0YW5jZW9mIEV2ZW50JiYodD0iZXZlbnQiKSx0fSxmaXRzQWJvdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudG9wUmVsYXRpdmU+PWUub2Zmc2V0SGVpZ2h0fSxmaXRzQmVsb3c6ZnVuY3Rpb24oZSl7dmFyIHQ9dm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp3aW5kb3cuaW5uZXJIZWlnaHQ7cmV0dXJuIHRoaXMudG9wUmVsYXRpdmUrZS5vZmZzZXRIZWlnaHQ8PXR9LGZpdHNPblJpZ2h0OmZ1bmN0aW9uKGUpe3ZhciB0PXZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06d2luZG93LmlubmVyV2lkdGg7cmV0dXJuIHRoaXMubGVmdFJlbGF0aXZlK3RoaXMuY2VsbFdpZHRoK2Uub2Zmc2V0V2lkdGg8PXR9LGZpdHNPbkxlZnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubGVmdFJlbGF0aXZlPj1lLm9mZnNldFdpZHRofX0se30pLHMucGx1Z2lucy51dGlscz1zLnBsdWdpbnMudXRpbHN8fHt9LHMucGx1Z2lucy51dGlscy5DdXJzb3I9Zn0se2Jyb3dzZXI6MjMsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL2RvbS9ldmVudCI6NDd9XSw3MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKCl7dmFyIGU9dm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsLHQ9dm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbXSxuPXZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30sbz1bXTtyZXR1cm4gZSYmZS5pdGVtcz9lPWUuaXRlbXM6QXJyYXkuaXNBcnJheShlKXx8KGU9dCksdShlKT9hKGUsZnVuY3Rpb24oZSx0KXt2YXIgcj1uWyJzdHJpbmciPT10eXBlb2YgZT9lOnRdO3J8fChyPWUpLHUoZSk/YyhyLGUpOiJzdHJpbmciPT10eXBlb2YgciYmKHI9e25hbWU6cn0pLHZvaWQgMD09PXIua2V5JiYoci5rZXk9dCksby5wdXNoKHIpfSk6aChlLGZ1bmN0aW9uKGUsdCl7dmFyIHI9bltlXTshciYmcC5pbmRleE9mKGUpPj0wfHwocnx8KHI9e25hbWU6ZSxrZXk6dCsiIn0pLHUoZSkmJmMocixlKSx2b2lkIDA9PT1yLmtleSYmKHIua2V5PXQpLG8ucHVzaChyKSl9KSxvfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0l0ZW1zRmFjdG9yeTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG19fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgcixpLHMsbD0ocj1lKCJoZWxwZXJzL29iamVjdCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSksYT1sLm9iamVjdEVhY2gsdT1sLmlzT2JqZWN0LGM9bC5leHRlbmQsaD0oaT1lKCJoZWxwZXJzL2FycmF5IiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5hcnJheUVhY2gsZD0ocz1lKCJwcmVkZWZpbmVkSXRlbXMiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLGY9ZC5TRVBBUkFUT1IscD1kLklURU1TLGc9ZC5wcmVkZWZpbmVkSXRlbXMsbT1mdW5jdGlvbihlKXt2YXIgdD12b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGw7dGhpcy5ob3Q9ZSx0aGlzLnByZWRlZmluZWRJdGVtcz1nKCksdGhpcy5kZWZhdWx0T3JkZXJQYXR0ZXJuPXR9OyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhtLHtzZXRQcmVkZWZpbmVkSXRlbXM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXt9O3RoaXMuZGVmYXVsdE9yZGVyUGF0dGVybi5sZW5ndGg9MCxhKGUsZnVuY3Rpb24oZSxvKXt2YXIgcj0iIjtlLm5hbWU9PT1mPyhuW2ZdPWUscj1mKTppc05hTihwYXJzZUludChvLDEwKSk/KGUua2V5PXZvaWQgMD09PWUua2V5P286ZS5rZXksbltvXT1lLHI9ZS5rZXkpOihuW2Uua2V5XT1lLHI9ZS5rZXkpLHQuZGVmYXVsdE9yZGVyUGF0dGVybi5wdXNoKHIpfSksdGhpcy5wcmVkZWZpbmVkSXRlbXM9bn0sZ2V0SXRlbXM6ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGw7cmV0dXJuIG8oZSx0aGlzLmRlZmF1bHRPcmRlclBhdHRlcm4sdGhpcy5wcmVkZWZpbmVkSXRlbXMpfX0se30pfSx7ImhlbHBlcnMvYXJyYXkiOjQyLCJoZWxwZXJzL29iamVjdCI6NTIscHJlZGVmaW5lZEl0ZW1zOjcyfV0sNzE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7TWVudTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHp9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscyxsLGEsdSxjLGgsZCxmLHAsZz0obz1lKCJicm93c2VyIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLG09KHI9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSksdz1tLmFkZENsYXNzLHY9bS5lbXB0eSx5PW0uZmFzdElubmVySFRNTCxiPW0uZ2V0U2Nyb2xsYmFyV2lkdGgsQz1tLmlzQ2hpbGRPZixfPW0ucmVtb3ZlQ2xhc3MsUj0oaT1lKCJoZWxwZXJzL2FycmF5IiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KSxTPVIuYXJyYXlFYWNoLEU9Ui5hcnJheUZpbHRlcixUPVIuYXJyYXlSZWR1Y2UsTT0ocz1lKCJjdXJzb3IiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLkN1cnNvcixPPShsPWUoImV2ZW50TWFuYWdlciIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSkuRXZlbnRNYW5hZ2VyLGs9KGE9ZSgiaGVscGVycy9vYmplY3QiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLm1peGluLEg9KHU9ZSgiaGVscGVycy9mdW5jdGlvbiIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSkuZGVib3VuY2UsRD0oYz1lKCJ1dGlscyIpLGMmJmMuX19lc01vZHVsZSYmY3x8eyJkZWZhdWx0IjpjfSksQT1ELmZpbHRlclNlcGFyYXRvcnMseD1ELmhhc1N1Yk1lbnUsUD1ELmlzRGlzYWJsZWQsTj1ELmlzSXRlbUhpZGRlbixMPUQuaXNTZXBhcmF0b3IsVz1ELmlzU2VsZWN0aW9uRGlzYWJsZWQsST1ELm5vcm1hbGl6ZVNlbGVjdGlvbixqPShoPWUoImhlbHBlcnMvdW5pY29kZSIpLGgmJmguX19lc01vZHVsZSYmaHx8eyJkZWZhdWx0IjpofSkuS0VZX0NPREVTLFY9KGQ9ZSgibWl4aW5zL2xvY2FsSG9va3MiKSxkJiZkLl9fZXNNb2R1bGUmJmR8fHsiZGVmYXVsdCI6ZH0pLmxvY2FsSG9va3MsRj0oZj1lKCJwcmVkZWZpbmVkSXRlbXMiKSxmJiZmLl9fZXNNb2R1bGUmJmZ8fHsiZGVmYXVsdCI6Zn0pLlNFUEFSQVRPUixCPShwPWUoImhlbHBlcnMvZG9tL2V2ZW50IikscCYmcC5fX2VzTW9kdWxlJiZwfHx7ImRlZmF1bHQiOnB9KS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24sej1mdW5jdGlvbihlLHQpe3RoaXMuaG90PWUsdGhpcy5vcHRpb25zPXR8fHtwYXJlbnQ6bnVsbCxuYW1lOm51bGwsY2xhc3NOYW1lOiIiLGtlZXBJblZpZXdwb3J0OiEwLHN0YW5kYWxvbmU6ITF9LHRoaXMuZXZlbnRNYW5hZ2VyPW5ldyBPKHRoaXMpLHRoaXMuY29udGFpbmVyPXRoaXMuY3JlYXRlQ29udGFpbmVyKHRoaXMub3B0aW9ucy5uYW1lKSx0aGlzLmhvdE1lbnU9bnVsbCx0aGlzLmhvdFN1Yk1lbnVzPXt9LHRoaXMucGFyZW50TWVudT10aGlzLm9wdGlvbnMucGFyZW50fHxudWxsLHRoaXMubWVudUl0ZW1zPW51bGwsdGhpcy5vcmlnT3V0c2lkZUNsaWNrRGVzZWxlY3RzPW51bGwsdGhpcy5vZmZzZXQ9e2Fib3ZlOjAsYmVsb3c6MCxsZWZ0OjAscmlnaHQ6MH0sdGhpcy5fYWZ0ZXJTY3JvbGxDYWxsYmFjaz1udWxsLHRoaXMucmVnaXN0ZXJFdmVudHMoKX0sWT16OyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyh6LHtyZWdpc3RlckV2ZW50czpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIm1vdXNlZG93biIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25Eb2N1bWVudE1vdXNlRG93bih0KX0pfSxzZXRNZW51SXRlbXM6ZnVuY3Rpb24oZSl7dGhpcy5tZW51SXRlbXM9ZX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDt0aGlzLm9mZnNldFtlXT10fSxpc1N1Yk1lbnU6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMucGFyZW50TWVudX0sb3BlbjpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5jb250YWluZXIucmVtb3ZlQXR0cmlidXRlKCJzdHlsZSIpLHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt2YXIgdD1IKGZ1bmN0aW9uKHQpe3JldHVybiBlLm9wZW5TdWJNZW51KHQpfSwzMDApLG49RSh0aGlzLm1lbnVJdGVtcyxmdW5jdGlvbih0KXtyZXR1cm4gTih0LGUuaG90KX0pO249QShuLEYpO3ZhciBvPXtkYXRhOm4sY29sSGVhZGVyczohMSxjb2xXaWR0aHM6WzIwMF0sYXV0b1Jvd1NpemU6ITEscmVhZE9ubHk6ITAsY29weVBhc3RlOiExLGNvbHVtbnM6W3tkYXRhOiJuYW1lIixyZW5kZXJlcjpmdW5jdGlvbih0LG4sbyxyLGkscyl7cmV0dXJuIGUubWVudUl0ZW1SZW5kZXJlcih0LG4sbyxyLGkscyl9fV0scmVuZGVyQWxsUm93czohMCxmcmFnbWVudFNlbGVjdGlvbjoiY2VsbCIsZGlzYWJsZVZpc3VhbFNlbGVjdGlvbjoiYXJlYSIsYmVmb3JlS2V5RG93bjpmdW5jdGlvbih0KXtyZXR1cm4gZS5vbkJlZm9yZUtleURvd24odCl9LGFmdGVyT25DZWxsTW91c2VPdmVyOmZ1bmN0aW9uKG4sbyxyKXtlLmlzQWxsU3ViTWVudXNDbG9zZWQoKT90KG8ucm93KTplLm9wZW5TdWJNZW51KG8ucm93KX19O3RoaXMub3JpZ091dHNpZGVDbGlja0Rlc2VsZWN0cz10aGlzLmhvdC5nZXRTZXR0aW5ncygpLm91dHNpZGVDbGlja0Rlc2VsZWN0cyx0aGlzLmhvdC5nZXRTZXR0aW5ncygpLm91dHNpZGVDbGlja0Rlc2VsZWN0cz0hMSx0aGlzLmhvdE1lbnU9bmV3IGcuQ29yZSh0aGlzLmNvbnRhaW5lcixvKSx0aGlzLmhvdE1lbnUuYWRkSG9vaygiYWZ0ZXJJbml0IixmdW5jdGlvbigpe3JldHVybiBlLm9uQWZ0ZXJJbml0KCl9KSx0aGlzLmhvdE1lbnUuaW5pdCgpLHRoaXMuaG90TWVudS5saXN0ZW4oKSx0aGlzLmJsb2NrTWFpblRhYmxlQ2FsbGJhY2tzKCksdGhpcy5ydW5Mb2NhbEhvb2tzKCJhZnRlck9wZW4iKX0sY2xvc2U6ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiExO3RoaXMuaXNPcGVuZWQoKSYmKGUmJnRoaXMucGFyZW50TWVudT90aGlzLnBhcmVudE1lbnUuY2xvc2UoKToodGhpcy5jbG9zZUFsbFN1Yk1lbnVzKCksdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5yZWxlYXNlTWFpblRhYmxlQ2FsbGJhY2tzKCksdGhpcy5ob3RNZW51LmRlc3Ryb3koKSx0aGlzLmhvdE1lbnU9bnVsbCx0aGlzLmhvdC5nZXRTZXR0aW5ncygpLm91dHNpZGVDbGlja0Rlc2VsZWN0cz10aGlzLm9yaWdPdXRzaWRlQ2xpY2tEZXNlbGVjdHMsdGhpcy5ydW5Mb2NhbEhvb2tzKCJhZnRlckNsb3NlIikpKX0sb3BlblN1Yk1lbnU6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuaG90TWVudSlyZXR1cm4hMTt2YXIgdD10aGlzLmhvdE1lbnUuZ2V0Q2VsbChlLDApO2lmKHRoaXMuY2xvc2VBbGxTdWJNZW51cygpLCF0fHwheCh0KSlyZXR1cm4hMTt2YXIgbj10aGlzLmhvdE1lbnUuZ2V0U291cmNlRGF0YUF0Um93KGUpLG89bmV3IFkodGhpcy5ob3Qse3BhcmVudDp0aGlzLG5hbWU6bi5uYW1lLGNsYXNzTmFtZTp0aGlzLm9wdGlvbnMuY2xhc3NOYW1lLGtlZXBJblZpZXdwb3J0OiEwfSk7cmV0dXJuIG8uc2V0TWVudUl0ZW1zKG4uc3VibWVudS5pdGVtcyksby5vcGVuKCksby5zZXRQb3NpdGlvbih0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSx0aGlzLmhvdFN1Yk1lbnVzW24ua2V5XT1vLG99LGNsb3NlU3ViTWVudTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmhvdE1lbnUuZ2V0U291cmNlRGF0YUF0Um93KGUpLG49dGhpcy5ob3RTdWJNZW51c1t0LmtleV07biYmKG4uZGVzdHJveSgpLGRlbGV0ZSB0aGlzLmhvdFN1Yk1lbnVzW3Qua2V5XSl9LGNsb3NlQWxsU3ViTWVudXM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO1ModGhpcy5ob3RNZW51LmdldERhdGEoKSxmdW5jdGlvbih0LG4pe3JldHVybiBlLmNsb3NlU3ViTWVudShuKX0pfSxpc0FsbFN1Yk1lbnVzQ2xvc2VkOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1PYmplY3Qua2V5cyh0aGlzLmhvdFN1Yk1lbnVzKS5sZW5ndGh9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmNsZWFyTG9jYWxIb29rcygpLHRoaXMuY2xvc2UoKSx0aGlzLnBhcmVudE1lbnU9bnVsbCx0aGlzLmV2ZW50TWFuYWdlci5kZXN0cm95KCl9LGlzT3BlbmVkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLmhvdE1lbnV9LGV4ZWN1dGVDb21tYW5kOmZ1bmN0aW9uKGUpe2lmKHRoaXMuaXNPcGVuZWQoKSYmdGhpcy5ob3RNZW51LmdldFNlbGVjdGVkKCkpe3ZhciB0PXRoaXMuaG90TWVudS5nZXRTb3VyY2VEYXRhQXRSb3codGhpcy5ob3RNZW51LmdldFNlbGVjdGVkKClbMF0pO2lmKHRoaXMucnVuTG9jYWxIb29rcygic2VsZWN0Iix0LGUpLHQuaXNDb21tYW5kIT09ITEmJnQubmFtZSE9PUYpe3ZhciBuPXRoaXMuaG90LmdldFNlbGVjdGVkUmFuZ2UoKSxvPW4/SShuKTp7fTt0aGlzLnJ1bkxvY2FsSG9va3MoImV4ZWN1dGVDb21tYW5kIix0LmtleSxvLGUpLHRoaXMuaXNTdWJNZW51KCkmJnRoaXMucGFyZW50TWVudS5ydW5Mb2NhbEhvb2tzKCJleGVjdXRlQ29tbWFuZCIsdC5rZXksbyxlKSx0LmRpc2FibGVkPT09ITB8fCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRpc2FibGVkJiZ0LmRpc2FibGVkLmNhbGwodGhpcy5ob3QpPT09ITB8fHQuc3VibWVudXx8dGhpcy5jbG9zZSghMCl9fX0sc2V0UG9zaXRpb246ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IE0oZSk7dGhpcy5vcHRpb25zLmtlZXBJblZpZXdwb3J0Pyh0LmZpdHNCZWxvdyh0aGlzLmNvbnRhaW5lcik/dGhpcy5zZXRQb3NpdGlvbkJlbG93Q3Vyc29yKHQpOnQuZml0c0Fib3ZlKHRoaXMuY29udGFpbmVyKT90aGlzLnNldFBvc2l0aW9uQWJvdmVDdXJzb3IodCk6dGhpcy5zZXRQb3NpdGlvbkJlbG93Q3Vyc29yKHQpLHQuZml0c09uUmlnaHQodGhpcy5jb250YWluZXIpP3RoaXMuc2V0UG9zaXRpb25PblJpZ2h0T2ZDdXJzb3IodCk6dGhpcy5zZXRQb3NpdGlvbk9uTGVmdE9mQ3Vyc29yKHQpKToodGhpcy5zZXRQb3NpdGlvbkJlbG93Q3Vyc29yKHQpLHRoaXMuc2V0UG9zaXRpb25PblJpZ2h0T2ZDdXJzb3IodCkpfSxzZXRQb3NpdGlvbkFib3ZlQ3Vyc29yOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMub2Zmc2V0LmFib3ZlK2UudG9wLXRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDt0aGlzLmlzU3ViTWVudSgpJiYodD1lLnRvcCtlLmNlbGxIZWlnaHQtdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0KzMpLHRoaXMuY29udGFpbmVyLnN0eWxlLnRvcD10KyJweCJ9LHNldFBvc2l0aW9uQmVsb3dDdXJzb3I6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5vZmZzZXQuYmVsb3crZS50b3A7dGhpcy5pc1N1Yk1lbnUoKSYmKHQ9ZS50b3AtMSksdGhpcy5jb250YWluZXIuc3R5bGUudG9wPXQrInB4In0sc2V0UG9zaXRpb25PblJpZ2h0T2ZDdXJzb3I6ZnVuY3Rpb24oZSl7dmFyIHQ7dD10aGlzLmlzU3ViTWVudSgpPzErZS5sZWZ0K2UuY2VsbFdpZHRoOnRoaXMub2Zmc2V0LnJpZ2h0KzErZS5sZWZ0LHRoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQ9dCsicHgifSxzZXRQb3NpdGlvbk9uTGVmdE9mQ3Vyc29yOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMub2Zmc2V0LmxlZnQrZS5sZWZ0LXRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoK2IoKSs0O3RoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQ9dCsicHgifSxzZWxlY3RGaXJzdENlbGw6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmhvdE1lbnUuZ2V0Q2VsbCgwLDApO0woZSl8fFAoZSl8fFcoZSk/dGhpcy5zZWxlY3ROZXh0Q2VsbCgwLDApOnRoaXMuaG90TWVudS5zZWxlY3RDZWxsKDAsMCl9LHNlbGVjdExhc3RDZWxsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ob3RNZW51LmNvdW50Um93cygpLTEsdD10aGlzLmhvdE1lbnUuZ2V0Q2VsbChlLDApO0wodCl8fFAodCl8fFcodCk/dGhpcy5zZWxlY3RQcmV2Q2VsbChlLDApOnRoaXMuaG90TWVudS5zZWxlY3RDZWxsKGUsMCl9LHNlbGVjdE5leHRDZWxsOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZSsxLG89bjx0aGlzLmhvdE1lbnUuY291bnRSb3dzKCk/dGhpcy5ob3RNZW51LmdldENlbGwobix0KTpudWxsO28mJihMKG8pfHxQKG8pfHxXKG8pP3RoaXMuc2VsZWN0TmV4dENlbGwobix0KTp0aGlzLmhvdE1lbnUuc2VsZWN0Q2VsbChuLHQpKX0sc2VsZWN0UHJldkNlbGw6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLTEsbz1uPj0wP3RoaXMuaG90TWVudS5nZXRDZWxsKG4sdCk6bnVsbDtvJiYoTChvKXx8UChvKXx8VyhvKT90aGlzLnNlbGVjdFByZXZDZWxsKG4sdCk6dGhpcy5ob3RNZW51LnNlbGVjdENlbGwobix0KSl9LG1lbnVJdGVtUmVuZGVyZXI6ZnVuY3Rpb24oZSx0LG4sbyxyLGkpe3ZhciBzPXRoaXMsbD1lLmdldFNvdXJjZURhdGFBdFJvdyhuKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaGFzT3duUHJvcGVydHkoInN1Ym1lbnUiKX0sYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFJlZ0V4cChGLCJpIikudGVzdChlLm5hbWUpfSxoPWZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITB8fCJmdW5jdGlvbiI9PXR5cGVvZiBlLmRpc2FibGVkJiZlLmRpc2FibGVkLmNhbGwocy5ob3QpPT09ITB9LGQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZVNlbGVjdGlvbn07ImZ1bmN0aW9uIj09dHlwZW9mIGkmJihpPWkuY2FsbCh0aGlzLmhvdCkpLHYodCksdyhhLCJodEl0ZW1XcmFwcGVyIiksdC5hcHBlbmRDaGlsZChhKSxjKGwpP3codCwiaHRTZXBhcmF0b3IiKToiZnVuY3Rpb24iPT10eXBlb2YgbC5yZW5kZXJlcj8odyh0LCJodEN1c3RvbU1lbnVSZW5kZXJlciIpLHQuYXBwZW5kQ2hpbGQobC5yZW5kZXJlcihlLGEsbixvLHIsaSkpKTp5KGEsaSksaChsKT8odyh0LCJodERpc2FibGVkIiksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZWVudGVyIixmdW5jdGlvbigpe3JldHVybiBlLmRlc2VsZWN0Q2VsbCgpfSkpOmQobCk/KHcodCwiaHRTZWxlY3Rpb25EaXNhYmxlZCIpLHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodCwibW91c2VlbnRlciIsZnVuY3Rpb24oKXtyZXR1cm4gZS5kZXNlbGVjdENlbGwoKX0pKTp1KGwpPyh3KHQsImh0U3VibWVudSIpLGQobCk/dGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZWVudGVyIixmdW5jdGlvbigpe3JldHVybiBlLmRlc2VsZWN0Q2VsbCgpfSk6dGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZWVudGVyIixmdW5jdGlvbigpe3JldHVybiBlLnNlbGVjdENlbGwobixvLHZvaWQgMCx2b2lkIDAsdm9pZCAwLCExKX0pKTooXyh0LCJodFN1Ym1lbnUiKSxfKHQsImh0RGlzYWJsZWQiKSxkKGwpP3RoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodCwibW91c2VlbnRlciIsZnVuY3Rpb24oKXtyZXR1cm4gZS5kZXNlbGVjdENlbGwoKX0pOnRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodCwibW91c2VlbnRlciIsZnVuY3Rpb24oKXtyZXR1cm4gZS5zZWxlY3RDZWxsKG4sbyx2b2lkIDAsdm9pZCAwLHZvaWQgMCwhMSl9KSl9LGNyZWF0ZUNvbnRhaW5lcjpmdW5jdGlvbigpe3ZhciBlPXZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDtlJiYoZT1lLnJlcGxhY2UoLyAvZywiXyIpLGU9dGhpcy5vcHRpb25zLmNsYXNzTmFtZSsiU3ViXyIrZSk7dmFyIHQ7cmV0dXJuIHQ9ZT9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuIit0aGlzLm9wdGlvbnMuY2xhc3NOYW1lKyIuIitlKTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuIit0aGlzLm9wdGlvbnMuY2xhc3NOYW1lKSx0fHwodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx3KHQsImh0TWVudSAiK3RoaXMub3B0aW9ucy5jbGFzc05hbWUpLGUmJncodCxlKSxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLmFwcGVuZENoaWxkKHQpKSx0fSxibG9ja01haW5UYWJsZUNhbGxiYWNrczpmdW5jdGlvbigpe3RoaXMuX2FmdGVyU2Nyb2xsQ2FsbGJhY2s9ZnVuY3Rpb24oKXt9LHRoaXMuaG90LmFkZEhvb2soImFmdGVyU2Nyb2xsVmVydGljYWxseSIsdGhpcy5fYWZ0ZXJTY3JvbGxDYWxsYmFjayksdGhpcy5ob3QuYWRkSG9vaygiYWZ0ZXJTY3JvbGxIb3Jpem9udGFsbHkiLHRoaXMuX2FmdGVyU2Nyb2xsQ2FsbGJhY2spfSxyZWxlYXNlTWFpblRhYmxlQ2FsbGJhY2tzOmZ1bmN0aW9uKCl7dGhpcy5fYWZ0ZXJTY3JvbGxDYWxsYmFjayYmKHRoaXMuaG90LnJlbW92ZUhvb2soImFmdGVyU2Nyb2xsVmVydGljYWxseSIsdGhpcy5fYWZ0ZXJTY3JvbGxDYWxsYmFjayksdGhpcy5ob3QucmVtb3ZlSG9vaygiYWZ0ZXJTY3JvbGxIb3Jpem9udGFsbHkiLHRoaXMuX2FmdGVyU2Nyb2xsQ2FsbGJhY2spLHRoaXMuX2FmdGVyU2Nyb2xsQ2FsbGJhY2s9bnVsbCl9LG9uQmVmb3JlS2V5RG93bjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmhvdE1lbnUuZ2V0U2VsZWN0ZWQoKSxuPSExO3N3aXRjaChlLmtleUNvZGUpe2Nhc2Ugai5FU0NBUEU6dGhpcy5jbG9zZSgpLG49ITA7YnJlYWs7Y2FzZSBqLkVOVEVSOnQmJih0aGlzLmhvdE1lbnUuZ2V0U291cmNlRGF0YUF0Um93KHRbMF0pLnN1Ym1lbnU/bj0hMDoodGhpcy5leGVjdXRlQ29tbWFuZChlKSx0aGlzLmNsb3NlKCEwKSkpO2JyZWFrO2Nhc2Ugai5BUlJPV19ET1dOOnQ/dGhpcy5zZWxlY3ROZXh0Q2VsbCh0WzBdLHRbMV0pOnRoaXMuc2VsZWN0Rmlyc3RDZWxsKCksbj0hMDticmVhaztjYXNlIGouQVJST1dfVVA6dD90aGlzLnNlbGVjdFByZXZDZWxsKHRbMF0sdFsxXSk6dGhpcy5zZWxlY3RMYXN0Q2VsbCgpLG49ITA7YnJlYWs7Y2FzZSBqLkFSUk9XX1JJR0hUOmlmKHQpe3ZhciBvPXRoaXMub3BlblN1Yk1lbnUodFswXSk7byYmby5zZWxlY3RGaXJzdENlbGwoKX1uPSEwO2JyZWFrO2Nhc2Ugai5BUlJPV19MRUZUOnQmJnRoaXMuaXNTdWJNZW51KCkmJih0aGlzLmNsb3NlKCksdGhpcy5wYXJlbnRNZW51JiZ0aGlzLnBhcmVudE1lbnUuaG90TWVudS5saXN0ZW4oKSxuPSEwKX1uJiYoZS5wcmV2ZW50RGVmYXVsdCgpLEIoZSkpfSxvbkFmdGVySW5pdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG90TWVudS5nZXRTZXR0aW5ncygpLmRhdGEsdD10aGlzLmhvdE1lbnUudmlldy53dC53dFRhYmxlLmhpZGVyLnN0eWxlLG49dGhpcy5ob3RNZW51LnZpZXcud3Qud3RUYWJsZS5ob2xkZXIuc3R5bGUsbz1wYXJzZUludCh0LndpZHRoLDEwKSxyPVQoZSxmdW5jdGlvbihlLHQpe3JldHVybiBlKyh0Lm5hbWU9PT1GPzE6MjYpfSwwKTtuLndpZHRoPW8rMjIrInB4IixuLmhlaWdodD1yKzQrInB4In0sb25Eb2N1bWVudE1vdXNlRG93bjpmdW5jdGlvbihlKXt0aGlzLmlzT3BlbmVkKCkmJih0aGlzLmNvbnRhaW5lciYmQyhlLnRhcmdldCx0aGlzLmNvbnRhaW5lcikmJnRoaXMuZXhlY3V0ZUNvbW1hbmQoZSksdGhpcy5vcHRpb25zLnN0YW5kYWxvbmUmJnRoaXMuaG90TWVudSYmIUMoZS50YXJnZXQsdGhpcy5ob3RNZW51LnJvb3RFbGVtZW50KT90aGlzLmNsb3NlKCEwKToodGhpcy5pc0FsbFN1Yk1lbnVzQ2xvc2VkKCl8fHRoaXMuaXNTdWJNZW51KCkpJiYhQyhlLnRhcmdldCwiLmh0TWVudSIpJiZDKGUudGFyZ2V0LGRvY3VtZW50KSYmdGhpcy5jbG9zZSghMCkpfX0se30pLGsoeixWKX0se2Jyb3dzZXI6MjMsY3Vyc29yOjY5LGV2ZW50TWFuYWdlcjo0MSwiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL2RvbS9ldmVudCI6NDcsImhlbHBlcnMvZnVuY3Rpb24iOjQ5LCJoZWxwZXJzL29iamVjdCI6NTIsImhlbHBlcnMvdW5pY29kZSI6NTUsIm1peGlucy9sb2NhbEhvb2tzIjo1NixwcmVkZWZpbmVkSXRlbXM6NzIsdXRpbHM6NzN9XSw3MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKCl7dmFyIGU9e307cmV0dXJuIGMoRCxmdW5jdGlvbih0LG4pe3JldHVybiBlW25dPWgodCl9KSxlfWZ1bmN0aW9uIHIoZSx0KXstMT09PUguaW5kZXhPZihlKSYmKERbZV09dCl9dmFyIGk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7Uk9XX0FCT1ZFOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdn19LFJPV19CRUxPVzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHl9fSxDT0xVTU5fTEVGVDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGJ9fSxDT0xVTU5fUklHSFQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBDfX0sQ0xFQVJfQ09MVU1OOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gX319LFJFTU9WRV9ST1c6e2dldDpmdW5jdGlvbigpe3JldHVybiBSfX0sUkVNT1ZFX0NPTFVNTjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFN9fSxVTkRPOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRX19LFJFRE86e2dldDpmdW5jdGlvbigpe3JldHVybiBUfX0sUkVBRF9PTkxZOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTX19LEFMSUdOTUVOVDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE99fSxTRVBBUkFUT1I6e2dldDpmdW5jdGlvbigpe3JldHVybiBrfX0sSVRFTVM6e2dldDpmdW5jdGlvbigpe3JldHVybiBIfX0scHJlZGVmaW5lZEl0ZW1zOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LGFkZEl0ZW06e2dldDpmdW5jdGlvbigpe3JldHVybiByfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIHMsbCxhLHU9KHM9ZSgiaGVscGVycy9vYmplY3QiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLGM9dS5vYmplY3RFYWNoLGg9dS5jbG9uZSxkPSgobD1lKCJoZWxwZXJzL251bWJlciIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSkucmFuZ2VFYWNoLGE9ZSgidXRpbHMiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLGY9ZC5hbGlnbixwPWQuZ2V0QWxpZ25tZW50Q2xhc3NlcyxnPWQuZ2V0VmFsaWRTZWxlY3Rpb24sbT1kLmNoZWNrU2VsZWN0aW9uQ29uc2lzdGVuY3ksdz1kLm1hcmtMYWJlbEFzU2VsZWN0ZWQsdj0icm93X2Fib3ZlIix5PSJyb3dfYmVsb3ciLGI9ImNvbF9sZWZ0IixDPSJjb2xfcmlnaHQiLF89ImNsZWFyX2NvbHVtbiIsUj0icmVtb3ZlX3JvdyIsUz0icmVtb3ZlX2NvbCIsRT0idW5kbyIsVD0icmVkbyIsTT0ibWFrZV9yZWFkX29ubHkiLE89ImFsaWdubWVudCIsaz0iLS0tLS0tLS0tIixIPVt2LHksYixDLF8sUixTLEUsVCxNLE8sa10sRD0oaT17fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxrLHt2YWx1ZTp7bmFtZTprfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHYse3ZhbHVlOntrZXk6dixuYW1lOiJJbnNlcnQgcm93IGFib3ZlIixjYWxsYmFjazpmdW5jdGlvbihlLHQpe3RoaXMuYWx0ZXIoImluc2VydF9yb3ciLHQuc3RhcnQucm93KX0sZGlzYWJsZWQ6ZnVuY3Rpb24oKXt2YXIgZT1nKHRoaXMpO2lmKCFlfHx0aGlzLmNvdW50Um93cygpPj10aGlzLmdldFNldHRpbmdzKCkubWF4Um93cylyZXR1cm4hMDt2YXIgdD10aGlzLmNvdW50Um93cygpLG49WzAsZVsxXSx0LTEsZVsxXV07cmV0dXJuIG4uam9pbigiLCIpPT09ZS5qb2luKCIsIikmJnQ+MX0saGlkZGVuOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZ2V0U2V0dGluZ3MoKS5hbGxvd0luc2VydFJvd319LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGkseSx7dmFsdWU6e2tleTp5LG5hbWU6Ikluc2VydCByb3cgYmVsb3ciLGNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7dGhpcy5hbHRlcigiaW5zZXJ0X3JvdyIsdC5lbmQucm93KzEpfSxkaXNhYmxlZDpmdW5jdGlvbigpe3ZhciBlPWcodGhpcyk7aWYoIWV8fHRoaXMuY291bnRSb3dzKCk+PXRoaXMuZ2V0U2V0dGluZ3MoKS5tYXhSb3dzKXJldHVybiEwO3ZhciB0PXRoaXMuY291bnRSb3dzKCksbj1bMCxlWzFdLHQtMSxlWzFdXTtyZXR1cm4gbi5qb2luKCIsIik9PT1lLmpvaW4oIiwiKSYmdD4xfSxoaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5nZXRTZXR0aW5ncygpLmFsbG93SW5zZXJ0Um93fX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxiLHt2YWx1ZTp7a2V5OmIsbmFtZToiSW5zZXJ0IGNvbHVtbiBvbiB0aGUgbGVmdCIsY2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXt0aGlzLmFsdGVyKCJpbnNlcnRfY29sIix0LnN0YXJ0LmNvbCl9LGRpc2FibGVkOmZ1bmN0aW9uKCl7dmFyIGU9Zyh0aGlzKTtpZighZSlyZXR1cm4hMDtpZighdGhpcy5pc0NvbHVtbk1vZGlmaWNhdGlvbkFsbG93ZWQoKSlyZXR1cm4hMDt2YXIgdD1bZVswXSwwLGVbMF0sdGhpcy5jb3VudENvbHMoKS0xXSxuPXQuam9pbigiLCIpPT1lLmpvaW4oIiwiKSxvPTE9PXRoaXMuY291bnRDb2xzKCk7cmV0dXJuIGVbMV08MHx8dGhpcy5jb3VudENvbHMoKT49dGhpcy5nZXRTZXR0aW5ncygpLm1heENvbHN8fCFvJiZufSxoaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5nZXRTZXR0aW5ncygpLmFsbG93SW5zZXJ0Q29sdW1ufX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxDLHt2YWx1ZTp7a2V5OkMsbmFtZToiSW5zZXJ0IGNvbHVtbiBvbiB0aGUgcmlnaHQiLGNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7dGhpcy5hbHRlcigiaW5zZXJ0X2NvbCIsdC5lbmQuY29sKzEpfSxkaXNhYmxlZDpmdW5jdGlvbigpe3ZhciBlPWcodGhpcyk7aWYoIWUpcmV0dXJuITA7aWYoIXRoaXMuaXNDb2x1bW5Nb2RpZmljYXRpb25BbGxvd2VkKCkpcmV0dXJuITA7dmFyIHQ9W2VbMF0sMCxlWzBdLHRoaXMuY291bnRDb2xzKCktMV0sbj10LmpvaW4oIiwiKT09ZS5qb2luKCIsIiksbz0xPT10aGlzLmNvdW50Q29scygpO3JldHVybiBlWzFdPDB8fHRoaXMuY291bnRDb2xzKCk+PXRoaXMuZ2V0U2V0dGluZ3MoKS5tYXhDb2xzfHwhbyYmbn0saGlkZGVuOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZ2V0U2V0dGluZ3MoKS5hbGxvd0luc2VydENvbHVtbn19LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksXyx7dmFsdWU6e2tleTpfLG5hbWU6IkNsZWFyIGNvbHVtbiIsY2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnN0YXJ0LmNvbDt0aGlzLmNvdW50Um93cygpJiZ0aGlzLnBvcHVsYXRlRnJvbUFycmF5KDAsbixbW251bGxdXSxNYXRoLm1heCh0LnN0YXJ0LnJvdyx0LmVuZC5yb3cpLG4pfSxkaXNhYmxlZDpmdW5jdGlvbigpe3ZhciBlPWcodGhpcyk7aWYoIWUpcmV0dXJuITA7dmFyIHQ9W2VbMF0sMCxlWzBdLHRoaXMuY291bnRDb2xzKCktMV0sbj10LmpvaW4oIiwiKT09ZS5qb2luKCIsIik7cmV0dXJuIGVbMV08MHx8dGhpcy5jb3VudENvbHMoKT49dGhpcy5nZXRTZXR0aW5ncygpLm1heENvbHN8fG59fSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLFIse3ZhbHVlOntrZXk6UixuYW1lOiJSZW1vdmUgcm93IixjYWxsYmFjazpmdW5jdGlvbihlLHQpe3ZhciBuPXQuZW5kLnJvdy10LnN0YXJ0LnJvdysxO3RoaXMuYWx0ZXIoInJlbW92ZV9yb3ciLHQuc3RhcnQucm93LG4pfSxkaXNhYmxlZDpmdW5jdGlvbigpe3ZhciBlPWcodGhpcyk7aWYoIWV8fHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkSGVhZGVyLmNvbHMpcmV0dXJuITA7dmFyIHQ9WzAsZVsxXSx0aGlzLmNvdW50Um93cygpLTEsZVsxXV07cmV0dXJuIHQuam9pbigiLCIpPT09ZS5qb2luKCIsIil9LGhpZGRlbjpmdW5jdGlvbigpe3JldHVybiF0aGlzLmdldFNldHRpbmdzKCkuYWxsb3dSZW1vdmVSb3d9fSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLFMse3ZhbHVlOntrZXk6UyxuYW1lOiJSZW1vdmUgY29sdW1uIixjYWxsYmFjazpmdW5jdGlvbihlLHQpe3ZhciBuPXQuZW5kLmNvbC10LnN0YXJ0LmNvbCsxO3RoaXMuYWx0ZXIoInJlbW92ZV9jb2wiLHQuc3RhcnQuY29sLG4pfSxkaXNhYmxlZDpmdW5jdGlvbigpe3ZhciBlPWcodGhpcyk7aWYoIWV8fHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkSGVhZGVyLnJvd3MpcmV0dXJuITA7aWYoIXRoaXMuaXNDb2x1bW5Nb2RpZmljYXRpb25BbGxvd2VkKCkpcmV0dXJuITA7dmFyIHQ9W2VbMF0sMCxlWzBdLHRoaXMuY291bnRDb2xzKCktMV0sbj10LmpvaW4oIiwiKT09ZS5qb2luKCIsIik7cmV0dXJuIGVbMV08MHx8bn0saGlkZGVuOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZ2V0U2V0dGluZ3MoKS5hbGxvd1JlbW92ZUNvbHVtbn19LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksRSx7dmFsdWU6e2tleTpFLG5hbWU6IlVuZG8iLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy51bmRvKCl9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5kb1JlZG8mJiF0aGlzLnVuZG9SZWRvLmlzVW5kb0F2YWlsYWJsZSgpfX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxULHt2YWx1ZTp7a2V5OlQsbmFtZToiUmVkbyIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnJlZG8oKX0sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmRvUmVkbyYmIXRoaXMudW5kb1JlZG8uaXNSZWRvQXZhaWxhYmxlKCl9fSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLE0se3ZhbHVlOntrZXk6TSxuYW1lOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PSJSZWFkIG9ubHkiLG49bSh0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSxmdW5jdGlvbih0LG4pe3JldHVybiBlLmdldENlbGxNZXRhKHQsbikucmVhZE9ubHl9KTtyZXR1cm4gbiYmKHQ9dyh0KSksdH0sY2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5nZXRTZWxlY3RlZFJhbmdlKCksbj1tKHQsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5nZXRDZWxsTWV0YSh0LG4pLnJlYWRPbmx5fSk7dC5mb3JBbGwoZnVuY3Rpb24odCxvKXtlLmdldENlbGxNZXRhKHQsbykucmVhZE9ubHk9IW59KSx0aGlzLnJlbmRlcigpfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiF0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKX19LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksTyx7dmFsdWU6e2tleTpPLG5hbWU6IkFsaWdubWVudCIsZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5nZXRTZWxlY3RlZFJhbmdlKCl9LHN1Ym1lbnU6e2l0ZW1zOlt7a2V5Ok8rIjpsZWZ0IixuYW1lOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PSJMZWZ0IixuPW0odGhpcy5nZXRTZWxlY3RlZFJhbmdlKCksZnVuY3Rpb24odCxuKXt2YXIgbz1lLmdldENlbGxNZXRhKHQsbikuY2xhc3NOYW1lO3JldHVybiBvJiYtMSE9PW8uaW5kZXhPZigiaHRMZWZ0Iik/ITA6dm9pZCAwfSk7cmV0dXJuIG4mJih0PXcodCkpLHR9LGNhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSgpLG49cCh0LGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuZ2V0Q2VsbE1ldGEodCxuKS5jbGFzc05hbWU7DQp9KSxvPSJob3Jpem9udGFsIixyPSJodExlZnQiO3RoaXMucnVuSG9va3MoImJlZm9yZUNlbGxBbGlnbm1lbnQiLG4sdCxvLHIpLGYodCxvLHIsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5nZXRDZWxsTWV0YSh0LG4pfSksdGhpcy5yZW5kZXIoKX0sZGlzYWJsZWQ6ITF9LHtrZXk6TysiOmNlbnRlciIsbmFtZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0iQ2VudGVyIixuPW0odGhpcy5nZXRTZWxlY3RlZFJhbmdlKCksZnVuY3Rpb24odCxuKXt2YXIgbz1lLmdldENlbGxNZXRhKHQsbikuY2xhc3NOYW1lO3JldHVybiBvJiYtMSE9PW8uaW5kZXhPZigiaHRDZW50ZXIiKT8hMDp2b2lkIDB9KTtyZXR1cm4gbiYmKHQ9dyh0KSksdH0sY2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5nZXRTZWxlY3RlZFJhbmdlKCksbj1wKHQsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5nZXRDZWxsTWV0YSh0LG4pLmNsYXNzTmFtZX0pLG89Imhvcml6b250YWwiLHI9Imh0Q2VudGVyIjt0aGlzLnJ1bkhvb2tzKCJiZWZvcmVDZWxsQWxpZ25tZW50IixuLHQsbyxyKSxmKHQsbyxyLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuZ2V0Q2VsbE1ldGEodCxuKX0pLHRoaXMucmVuZGVyKCl9LGRpc2FibGVkOiExfSx7a2V5Ok8rIjpyaWdodCIsbmFtZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0iUmlnaHQiLG49bSh0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSxmdW5jdGlvbih0LG4pe3ZhciBvPWUuZ2V0Q2VsbE1ldGEodCxuKS5jbGFzc05hbWU7cmV0dXJuIG8mJi0xIT09by5pbmRleE9mKCJodFJpZ2h0Iik/ITA6dm9pZCAwfSk7cmV0dXJuIG4mJih0PXcodCkpLHR9LGNhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSgpLG49cCh0LGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuZ2V0Q2VsbE1ldGEodCxuKS5jbGFzc05hbWV9KSxvPSJob3Jpem9udGFsIixyPSJodFJpZ2h0Ijt0aGlzLnJ1bkhvb2tzKCJiZWZvcmVDZWxsQWxpZ25tZW50IixuLHQsbyxyKSxmKHQsbyxyLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuZ2V0Q2VsbE1ldGEodCxuKX0pLHRoaXMucmVuZGVyKCl9LGRpc2FibGVkOiExfSx7a2V5Ok8rIjpqdXN0aWZ5IixuYW1lOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PSJKdXN0aWZ5IixuPW0odGhpcy5nZXRTZWxlY3RlZFJhbmdlKCksZnVuY3Rpb24odCxuKXt2YXIgbz1lLmdldENlbGxNZXRhKHQsbikuY2xhc3NOYW1lO3JldHVybiBvJiYtMSE9PW8uaW5kZXhPZigiaHRKdXN0aWZ5Iik/ITA6dm9pZCAwfSk7cmV0dXJuIG4mJih0PXcodCkpLHR9LGNhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSgpLG49cCh0LGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuZ2V0Q2VsbE1ldGEodCxuKS5jbGFzc05hbWV9KSxvPSJob3Jpem9udGFsIixyPSJodEp1c3RpZnkiO3RoaXMucnVuSG9va3MoImJlZm9yZUNlbGxBbGlnbm1lbnQiLG4sdCxvLHIpLGYodCxvLHIsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5nZXRDZWxsTWV0YSh0LG4pfSksdGhpcy5yZW5kZXIoKX0sZGlzYWJsZWQ6ITF9LHtuYW1lOmt9LHtrZXk6TysiOnRvcCIsbmFtZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0iVG9wIixuPW0odGhpcy5nZXRTZWxlY3RlZFJhbmdlKCksZnVuY3Rpb24odCxuKXt2YXIgbz1lLmdldENlbGxNZXRhKHQsbikuY2xhc3NOYW1lO3JldHVybiBvJiYtMSE9PW8uaW5kZXhPZigiaHRUb3AiKT8hMDp2b2lkIDB9KTtyZXR1cm4gbiYmKHQ9dyh0KSksdH0sY2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5nZXRTZWxlY3RlZFJhbmdlKCksbj1wKHQsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5nZXRDZWxsTWV0YSh0LG4pLmNsYXNzTmFtZX0pLG89InZlcnRpY2FsIixyPSJodFRvcCI7dGhpcy5ydW5Ib29rcygiYmVmb3JlQ2VsbEFsaWdubWVudCIsbix0LG8sciksZih0LG8scixmdW5jdGlvbih0LG4pe3JldHVybiBlLmdldENlbGxNZXRhKHQsbil9KSx0aGlzLnJlbmRlcigpfSxkaXNhYmxlZDohMX0se2tleTpPKyI6bWlkZGxlIixuYW1lOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PSJNaWRkbGUiLG49bSh0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSxmdW5jdGlvbih0LG4pe3ZhciBvPWUuZ2V0Q2VsbE1ldGEodCxuKS5jbGFzc05hbWU7cmV0dXJuIG8mJi0xIT09by5pbmRleE9mKCJodE1pZGRsZSIpPyEwOnZvaWQgMH0pO3JldHVybiBuJiYodD13KHQpKSx0fSxjYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSxuPXAodCxmdW5jdGlvbih0LG4pe3JldHVybiBlLmdldENlbGxNZXRhKHQsbikuY2xhc3NOYW1lfSksbz0idmVydGljYWwiLHI9Imh0TWlkZGxlIjt0aGlzLnJ1bkhvb2tzKCJiZWZvcmVDZWxsQWxpZ25tZW50IixuLHQsbyxyKSxmKHQsbyxyLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuZ2V0Q2VsbE1ldGEodCxuKX0pLHRoaXMucmVuZGVyKCl9LGRpc2FibGVkOiExfSx7a2V5Ok8rIjpib3R0b20iLG5hbWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9IkJvdHRvbSIsbj1tKHRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSgpLGZ1bmN0aW9uKHQsbil7dmFyIG89ZS5nZXRDZWxsTWV0YSh0LG4pLmNsYXNzTmFtZTtyZXR1cm4gbyYmLTEhPT1vLmluZGV4T2YoImh0Qm90dG9tIik/ITA6dm9pZCAwfSk7cmV0dXJuIG4mJih0PXcodCkpLHR9LGNhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSgpLG49cCh0LGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuZ2V0Q2VsbE1ldGEodCxuKS5jbGFzc05hbWV9KSxvPSJ2ZXJ0aWNhbCIscj0iaHRCb3R0b20iO3RoaXMucnVuSG9va3MoImJlZm9yZUNlbGxBbGlnbm1lbnQiLG4sdCxvLHIpLGYodCxvLHIsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5nZXRDZWxsTWV0YSh0LG4pfSksdGhpcy5yZW5kZXIoKX0sZGlzYWJsZWQ6ITF9XX19LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksaSl9LHsiaGVscGVycy9udW1iZXIiOjUxLCJoZWxwZXJzL29iamVjdCI6NTIsdXRpbHM6NzN9XSw3MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe3JldHVybntzdGFydDplLmdldFRvcExlZnRDb3JuZXIoKSxlbmQ6ZS5nZXRCb3R0b21SaWdodENvcm5lcigpfX1mdW5jdGlvbiByKGUpe3JldHVybiBFKGUsImh0U2VwYXJhdG9yIil9ZnVuY3Rpb24gaShlKXtyZXR1cm4gRShlLCJodFN1Ym1lbnUiKX1mdW5jdGlvbiBzKGUpe3JldHVybiBFKGUsImh0RGlzYWJsZWQiKX1mdW5jdGlvbiBsKGUpe3JldHVybiBFKGUsImh0U2VsZWN0aW9uRGlzYWJsZWQiKX1mdW5jdGlvbiBhKGUpe3ZhciB0PWUuZ2V0U2VsZWN0ZWQoKTtyZXR1cm4gdD90WzBdPDA/bnVsbDp0Om51bGx9ZnVuY3Rpb24gdShlLHQpe3JldHVybi0xIT1lLmluZGV4T2YodCk/ZTooZT1lLnJlcGxhY2UoImh0VG9wIiwiIikucmVwbGFjZSgiaHRNaWRkbGUiLCIiKS5yZXBsYWNlKCJodEJvdHRvbSIsIiIpLnJlcGxhY2UoIiAgIiwiIiksZSs9IiAiK3QpfWZ1bmN0aW9uIGMoZSx0KXtyZXR1cm4tMSE9ZS5pbmRleE9mKHQpP2U6KGU9ZS5yZXBsYWNlKCJodExlZnQiLCIiKS5yZXBsYWNlKCJodENlbnRlciIsIiIpLnJlcGxhY2UoImh0UmlnaHQiLCIiKS5yZXBsYWNlKCJodEp1c3RpZnkiLCIiKS5yZXBsYWNlKCIgICIsIiIpLGUrPSIgIit0KX1mdW5jdGlvbiBoKGUsdCl7Zm9yKHZhciBuPXt9LG89ZS5mcm9tLnJvdztvPD1lLnRvLnJvdztvKyspZm9yKHZhciByPWUuZnJvbS5jb2w7cjw9ZS50by5jb2w7cisrKW5bb118fChuW29dPVtdKSxuW29dW3JdPXQobyxyKTtyZXR1cm4gbn1mdW5jdGlvbiBkKGUsdCxuLG8pe2lmKGUuZnJvbS5yb3c9PWUudG8ucm93JiZlLmZyb20uY29sPT1lLnRvLmNvbClmKGUuZnJvbS5yb3csZS5mcm9tLmNvbCx0LG4sbyk7ZWxzZSBmb3IodmFyIHI9ZS5mcm9tLnJvdztyPD1lLnRvLnJvdztyKyspZm9yKHZhciBpPWUuZnJvbS5jb2w7aTw9ZS50by5jb2w7aSsrKWYocixpLHQsbixvKX1mdW5jdGlvbiBmKGUsdCxuLG8scil7dmFyIGk9cihlLHQpLHM9bztpLmNsYXNzTmFtZSYmKHM9InZlcnRpY2FsIj09PW4/dShpLmNsYXNzTmFtZSxvKTpjKGkuY2xhc3NOYW1lLG8pKSxpLmNsYXNzTmFtZT1zfWZ1bmN0aW9uIHAoZSx0KXt2YXIgbj0hMTtyZXR1cm4gZSYmZS5mb3JBbGwoZnVuY3Rpb24oZSxvKXtyZXR1cm4gdChlLG8pPyhuPSEwLCExKTp2b2lkIDB9KSxufWZ1bmN0aW9uIGcoZSl7cmV0dXJuJzxzcGFuIGNsYXNzPSJzZWxlY3RlZCI+JytTdHJpbmcuZnJvbUNoYXJDb2RlKDEwMDAzKSsiPC9zcGFuPiIrZX1mdW5jdGlvbiBtKGUsdCl7cmV0dXJuIWUuaGlkZGVufHwhKCJmdW5jdGlvbiI9PXR5cGVvZiBlLmhpZGRlbiYmZS5oaWRkZW4uY2FsbCh0KSl9ZnVuY3Rpb24gdyhlLHQpe2Zvcih2YXIgbj1lLnNsaWNlKDApLG89MDtvPG4ubGVuZ3RoJiZuW29dLm5hbWU9PT10OyluLnNoaWZ0KCk7cmV0dXJuIG59ZnVuY3Rpb24gdihlLHQpe3ZhciBuPWUuc2xpY2UoMCk7cmV0dXJuIG4ucmV2ZXJzZSgpLG49dyhuLHQpLG4ucmV2ZXJzZSgpLG59ZnVuY3Rpb24geShlKXt2YXIgdD1bXTtyZXR1cm4gUyhlLGZ1bmN0aW9uKGUsbil7bj4wP3RbdC5sZW5ndGgtMV0ubmFtZSE9PWUubmFtZSYmdC5wdXNoKGUpOnQucHVzaChlKX0pLHR9ZnVuY3Rpb24gYihlKXt2YXIgdD12b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOlQsbj1lLnNsaWNlKDApO3JldHVybiBuPXcobix0KSxuPXYobix0KSxuPXkobil9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7bm9ybWFsaXplU2VsZWN0aW9uOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LGlzU2VwYXJhdG9yOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn19LGhhc1N1Yk1lbnU6e2dldDpmdW5jdGlvbigpe3JldHVybiBpfX0saXNEaXNhYmxlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHN9fSxpc1NlbGVjdGlvbkRpc2FibGVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbH19LGdldFZhbGlkU2VsZWN0aW9uOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX19LHByZXBhcmVWZXJ0aWNhbEFsaWduQ2xhc3M6e2dldDpmdW5jdGlvbigpe3JldHVybiB1fX0scHJlcGFyZUhvcml6b250YWxBbGlnbkNsYXNzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY319LGdldEFsaWdubWVudENsYXNzZXM6e2dldDpmdW5jdGlvbigpe3JldHVybiBofX0sYWxpZ246e2dldDpmdW5jdGlvbigpe3JldHVybiBkfX0sY2hlY2tTZWxlY3Rpb25Db25zaXN0ZW5jeTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHB9fSxtYXJrTGFiZWxBc1NlbGVjdGVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ319LGlzSXRlbUhpZGRlbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG19fSxmaWx0ZXJTZXBhcmF0b3JzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYn19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBDLF8sUixTPShDPWUoImhlbHBlcnMvYXJyYXkiKSxDJiZDLl9fZXNNb2R1bGUmJkN8fHsiZGVmYXVsdCI6Q30pLmFycmF5RWFjaCxFPShfPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxfJiZfLl9fZXNNb2R1bGUmJl98fHsiZGVmYXVsdCI6X30pLmhhc0NsYXNzLFQ9KFI9ZSgicHJlZGVmaW5lZEl0ZW1zIiksUiYmUi5fX2VzTW9kdWxlJiZSfHx7ImRlZmF1bHQiOlJ9KS5TRVBBUkFUT1J9LHsiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LHByZWRlZmluZWRJdGVtczo3Mn1dLDc0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0NvbnRleHRNZW51Q29weVBhc3RlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gd319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGwsYSx1LGM9KG89ZSgiYnJvd3NlciIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXSxoPShyPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLnJlbW92ZUNsYXNzLGQ9KGk9ZSgiaGVscGVycy9hcnJheSIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkuYXJyYXlFYWNoLGY9KHM9ZSgiZXZlbnRNYW5hZ2VyIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5FdmVudE1hbmFnZXIscD0obD1lKCJwbHVnaW5zIiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KS5yZWdpc3RlclBsdWdpbixnPShhPWUoIl9iYXNlIiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KVsiZGVmYXVsdCJdLG09KHU9ZSgiemVyb2NsaXBib2FyZCIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSlbImRlZmF1bHQiXSx3PWZ1bmN0aW9uKGUpeyR0cmFjZXVyUnVudGltZS5zdXBlckNvbnN0cnVjdG9yKHYpLmNhbGwodGhpcyxlKSx0aGlzLmV2ZW50TWFuYWdlcj1uZXcgZih0aGlzKSx0aGlzLnN3ZlBhdGg9bnVsbCx0aGlzLm91dHNpZGVDbGlja0Rlc2VsZWN0c0NhY2hlPW51bGx9LHY9dzskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3Modyx7aXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG90LmdldFNldHRpbmdzKCkuY29udGV4dE1lbnVDb3B5UGFzdGV9LGVuYWJsZVBsdWdpbjpmdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIXRoaXMuZW5hYmxlZCl7Im9iamVjdCI9PXR5cGVvZiB0aGlzLmhvdC5nZXRTZXR0aW5ncygpLmNvbnRleHRNZW51Q29weVBhc3RlJiYodGhpcy5zd2ZQYXRoPXRoaXMuaG90LmdldFNldHRpbmdzKCkuY29udGV4dE1lbnVDb3B5UGFzdGUuc3dmUGF0aCksInVuZGVmaW5lZCI9PXR5cGVvZiBtJiZjb25zb2xlLmVycm9yKCJUbyBiZSBhYmxlIHRvIHVzZSB0aGUgQ29weS9QYXN0ZSBmZWF0dXJlIGZyb20gdGhlIGNvbnRleHQgbWVudSwgeW91IG5lZWQgdG8gbWFudWFsbHkgaW5jbHVkZSBaZXJvQ2xpcGJvYXJkLmpzIGZpbGUgdG8geW91ciB3ZWJzaXRlLiIpO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKX1jYXRjaCh0KXsidW5kZWZpbmVkIj09dHlwZW9mIG5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJmNvbnNvbGUuZXJyb3IoIlRvIGJlIGFibGUgdG8gdXNlIHRoZSBDb3B5L1Bhc3RlIGZlYXR1cmUgZnJvbSB0aGUgY29udGV4dCBtZW51LCB5b3VyIGJyb3dzZXIgbmVlZHMgdG8gaGF2ZSBGbGFzaCBQbHVnaW4gaW5zdGFsbGVkLiIpfXRoaXMuc3dmUGF0aCYmbS5jb25maWcoe3N3ZlBhdGg6dGhpcy5zd2ZQYXRofSksdGhpcy5ob3QuYWRkSG9vaygiYWZ0ZXJDb250ZXh0TWVudVNob3ciLGZ1bmN0aW9uKCl7cmV0dXJuIGUub25BZnRlckNvbnRleHRNZW51U2hvdygpfSksdGhpcy5ob3QuYWRkSG9vaygiYWZ0ZXJDb250ZXh0TWVudURlZmF1bHRPcHRpb25zIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbkFmdGVyQ29udGV4dE1lbnVEZWZhdWx0T3B0aW9ucyh0KX0pLHRoaXMucmVnaXN0ZXJFdmVudHMoKSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyx2LnByb3RvdHlwZSwiZW5hYmxlUGx1Z2luIikuY2FsbCh0aGlzKX19LGRpc2FibGVQbHVnaW46ZnVuY3Rpb24oKXskdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyx2LnByb3RvdHlwZSwiZGlzYWJsZVBsdWdpbiIpLmNhbGwodGhpcyl9LHJlZ2lzdGVyRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZWVudGVyIixmdW5jdGlvbigpe3JldHVybiBlLnJlbW92ZUN1cnJlbnRDbGFzcygpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtyZXR1cm4gZS5yZW1vdmVaZXJvQ2xpcGJvYXJkQ2xhc3MoKX0pfSxnZXRDb3B5VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3QuY29weVBhc3RlLnNldENvcHlhYmxlVGV4dCgpLHRoaXMuaG90LmNvcHlQYXN0ZS5jb3B5UGFzdGVJbnN0YW5jZS5lbFRleHRhcmVhLnZhbHVlfSxvbkFmdGVyQ29udGV4dE1lbnVEZWZhdWx0T3B0aW9uczpmdW5jdGlvbihlKXtlLml0ZW1zLnVuc2hpZnQoe2tleToiY29weSIsbmFtZToiQ29weSJ9LHtrZXk6InBhc3RlIixuYW1lOiJQYXN0ZSIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLmNvcHlQYXN0ZS50cmlnZ2VyUGFzdGUoKX19LGMucGx1Z2lucy5Db250ZXh0TWVudS5TRVBBUkFUT1IpfSxvbkFmdGVyQ29udGV4dE1lbnVTaG93OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuaG90LmdldFBsdWdpbigiY29udGV4dE1lbnUiKSxuPXQubWVudS5ob3RNZW51LmdldFNvdXJjZURhdGEoKTtkKG4sZnVuY3Rpb24obixvKXtpZigiY29weSI9PT1uLmtleSl7dmFyIHI9bmV3IG0odC5tZW51LmhvdE1lbnUuZ2V0Q2VsbChvLDApKTtyZXR1cm4gci5vZmYoKSxyLm9uKCJjb3B5IixmdW5jdGlvbih0KXt2YXIgbj10LmNsaXBib2FyZERhdGE7bi5zZXREYXRhKCJ0ZXh0L3BsYWluIixlLmdldENvcHlWYWx1ZSgpKSxlLmhvdC5nZXRTZXR0aW5ncygpLm91dHNpZGVDbGlja0Rlc2VsZWN0cz1lLm91dHNpZGVDbGlja0Rlc2VsZWN0c0NhY2hlfSksITF9fSl9LHJlbW92ZUN1cnJlbnRDbGFzczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG90LmdldFBsdWdpbigiY29udGV4dE1lbnUiKTtpZihlLm1lbnUuaXNPcGVuZWQoKSl7dmFyIHQ9ZS5tZW51LmhvdE1lbnUucm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcigidGQuY3VycmVudCIpO3QmJmgodCwiY3VycmVudCIpfXRoaXMub3V0c2lkZUNsaWNrRGVzZWxlY3RzQ2FjaGU9dGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5vdXRzaWRlQ2xpY2tEZXNlbGVjdHMsdGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5vdXRzaWRlQ2xpY2tEZXNlbGVjdHM9ITF9LHJlbW92ZVplcm9DbGlwYm9hcmRDbGFzczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG90LmdldFBsdWdpbigiY29udGV4dE1lbnUiKTtpZihlLm1lbnUuaXNPcGVuZWQoKSl7dmFyIHQ9ZS5tZW51LmhvdE1lbnUucm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcigidGQuemVyb2NsaXBib2FyZC1pcy1ob3ZlciIpO3QmJmgodCwiemVyb2NsaXBib2FyZC1pcy1ob3ZlciIpfXRoaXMuaG90LmdldFNldHRpbmdzKCkub3V0c2lkZUNsaWNrRGVzZWxlY3RzPXRoaXMub3V0c2lkZUNsaWNrRGVzZWxlY3RzQ2FjaGV9fSx7fSxnKSxwKCJjb250ZXh0TWVudUNvcHlQYXN0ZSIsdyl9LHtfYmFzZTo2MCxicm93c2VyOjIzLGV2ZW50TWFuYWdlcjo0MSwiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LHBsdWdpbnM6NTksemVyb2NsaXBib2FyZDoiemVyb2NsaXBib2FyZCJ9XSw3NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe2Z1bmN0aW9uIHQoKXtlLmlzTGlzdGVuaW5nKCkmJmUuc2VsZWN0aW9uLmVtcHR5KCl9ZnVuY3Rpb24gbih0KXt2YXIgbixvLHIsaSxzLGwsYSx1LGMsaDtpZihlLmlzTGlzdGVuaW5nKCkmJmUuc2VsZWN0aW9uLmlzU2VsZWN0ZWQoKSl7bj10LG89eS5wYXJzZShuKSxyPWUuZ2V0U2VsZWN0ZWQoKSxpPW5ldyBIKHJbMF0sclsxXSkscz1uZXcgSChyWzJdLHJbM10pLGw9bmV3IEQoaSxpLHMpLGE9bC5nZXRUb3BMZWZ0Q29ybmVyKCksdT1sLmdldEJvdHRvbVJpZ2h0Q29ybmVyKCksYz1hLGg9bmV3IEgoTWF0aC5tYXgodS5yb3csby5sZW5ndGgtMSthLnJvdyksTWF0aC5tYXgodS5jb2wsb1swXS5sZW5ndGgtMSthLmNvbCkpO3ZhciBkPXMucm93LWkucm93Pj1vLmxlbmd0aC0xLGY9cy5jb2wtaS5jb2w+PW9bMF0ubGVuZ3RoLTE7ZS5hZGRIb29rT25jZSgiYWZ0ZXJDaGFuZ2UiLGZ1bmN0aW9uKHQsbil7dmFyIG89dD90Lmxlbmd0aDowO2lmKG8pe3ZhciByPXtyb3c6MCxjb2w6MH0saT0tMTtSKHQsZnVuY3Rpb24oZSxuKXt2YXIgcz1vPm4rMT90W24rMV06bnVsbDtzJiYoZHx8KHIucm93PXIucm93K01hdGgubWF4KHNbMF0tZVswXS0xLDApKSwhZiYmZVsxXT5pJiYoaT1lWzFdLHIuY29sPXIuY29sK01hdGgubWF4KHNbMV0tZVsxXS0xLDApKSl9KSxlLnNlbGVjdENlbGwoYy5yb3csYy5jb2wsaC5yb3crci5yb3csaC5jb2wrci5jb2wpfX0pLGUucG9wdWxhdGVGcm9tQXJyYXkoYy5yb3csYy5jb2wsbyxoLnJvdyxoLmNvbCwicGFzdGUiLGUuZ2V0U2V0dGluZ3MoKS5wYXN0ZU1vZGUpfX1mdW5jdGlvbiBvKHQpe2lmKGUuZ2V0U2VsZWN0ZWQoKSYmIShlLmdldEFjdGl2ZUVkaXRvcigpJiZlLmdldEFjdGl2ZUVkaXRvcigpLmlzT3BlbmVkKCl8fE0odCkpKXtpZihfKHQua2V5Q29kZSkpe2lmKGUuZ2V0U2V0dGluZ3MoKS5mcmFnbWVudFNlbGVjdGlvbiYmTygpKXJldHVybjtyZXR1cm4gci5zZXRDb3B5YWJsZVRleHQoKSx2b2lkIFQodCl9dmFyIG49KHQuY3RybEtleXx8dC5tZXRhS2V5KSYmIXQuYWx0S2V5O3Qua2V5Q29kZT09Qy5BJiZuJiZlLl9yZWdpc3RlclRpbWVvdXQoc2V0VGltZW91dChrKHIuc2V0Q29weWFibGVUZXh0LHIpLDApKX19dmFyIHI9dGhpczt0aGlzLmNvcHlQYXN0ZUluc3RhbmNlPXYoKSx0aGlzLmNvcHlQYXN0ZUluc3RhbmNlLm9uQ3V0KHQpLHRoaXMuY29weVBhc3RlSW5zdGFuY2Uub25QYXN0ZShuKSx0aGlzLm9uUGFzdGU9bixlLmFkZEhvb2soImJlZm9yZUtleURvd24iLG8pLHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuY29weVBhc3RlSW5zdGFuY2UmJih0aGlzLmNvcHlQYXN0ZUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrKHQpLHRoaXMuY29weVBhc3RlSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2sobiksdGhpcy5jb3B5UGFzdGVJbnN0YW5jZS5kZXN0cm95KCksdGhpcy5jb3B5UGFzdGVJbnN0YW5jZT1udWxsKSxlLnJlbW92ZUhvb2soImJlZm9yZUtleURvd24iLG8pfSxlLmFkZEhvb2soImFmdGVyRGVzdHJveSIsayh0aGlzLmRlc3Ryb3ksdGhpcykpLHRoaXMudHJpZ2dlclBhc3RlPWsodGhpcy5jb3B5UGFzdGVJbnN0YW5jZS50cmlnZ2VyUGFzdGUsdGhpcy5jb3B5UGFzdGVJbnN0YW5jZSksdGhpcy50cmlnZ2VyQ3V0PWsodGhpcy5jb3B5UGFzdGVJbnN0YW5jZS50cmlnZ2VyQ3V0LHRoaXMuY29weVBhc3RlSW5zdGFuY2UpLHRoaXMuc2V0Q29weWFibGVUZXh0PWZ1bmN0aW9uKCl7dmFyIHQ9ZS5nZXRTZXR0aW5ncygpLG49dC5jb3B5Um93c0xpbWl0LG89dC5jb3B5Q29sc0xpbWl0LHI9ZS5nZXRTZWxlY3RlZFJhbmdlKCksaT1yLmdldFRvcExlZnRDb3JuZXIoKSxzPXIuZ2V0Qm90dG9tUmlnaHRDb3JuZXIoKSxsPWkucm93LGE9aS5jb2wsdT1zLnJvdyxjPXMuY29sLGg9TWF0aC5taW4odSxsK24tMSksZD1NYXRoLm1pbihjLGErby0xKSxmPVtdO2YucHVzaCh7c3RhcnRSb3c6bCxzdGFydENvbDphLGVuZFJvdzpoLGVuZENvbDpkfSksZj13Lmhvb2tzLnJ1bihlLCJtb2RpZnlDb3B5YWJsZVJhbmdlIixmKTt2YXIgcD10aGlzLmdldFJhbmdlZENvcHlhYmxlRGF0YShmKTtlLmNvcHlQYXN0ZS5jb3B5UGFzdGVJbnN0YW5jZS5jb3B5YWJsZShwKSx1PT09aCYmYz09PWR8fHcuaG9va3MucnVuKGUsImFmdGVyQ29weUxpbWl0Iix1LWwrMSxjLWErMSxuLG8pfSx0aGlzLmdldFJhbmdlZENvcHlhYmxlRGF0YT1mdW5jdGlvbih0KXt2YXIgbj1bXSxvPVtdLHI9W107cmV0dXJuIFIodCxmdW5jdGlvbihlKXtTKGUuc3RhcnRSb3csZS5lbmRSb3csZnVuY3Rpb24oZSl7LTE9PT1vLmluZGV4T2YoZSkmJm8ucHVzaChlKX0pLFMoZS5zdGFydENvbCxlLmVuZENvbCxmdW5jdGlvbihlKXstMT09PXIuaW5kZXhPZihlKSYmci5wdXNoKGUpfSl9KSxSKG8sZnVuY3Rpb24odCl7dmFyIG89W107UihyLGZ1bmN0aW9uKG4pe28ucHVzaChlLmdldENvcHlhYmxlRGF0YSh0LG4pKX0pLG4ucHVzaChvKX0pLHkuc3RyaW5naWZ5KG4pfX1mdW5jdGlvbiByKCl7dmFyIGU9dGhpcyx0PWUuZ2V0U2V0dGluZ3MoKS5jb3B5UGFzdGUhPT0hMTt0JiYhZS5jb3B5UGFzdGU/ZS5jb3B5UGFzdGU9bmV3IG8oZSk6IXQmJmUuY29weVBhc3RlJiYoZS5jb3B5UGFzdGUuZGVzdHJveSgpLGUuY29weVBhc3RlPW51bGwpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0NvcHlQYXN0ZVBsdWdpbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgaSxzLGwsYSx1LGMsaCxkLGYscCxnLG0sdz0oaT1lKCJicm93c2VyIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KVsiZGVmYXVsdCJdLHY9KHM9ZSgiY29weVBhc3RlIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KVsiZGVmYXVsdCJdLHk9KGw9ZSgiU2hlZXRDbGlwIiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KVsiZGVmYXVsdCJdLGI9KGE9ZSgiaGVscGVycy91bmljb2RlIiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KSxDPWIuS0VZX0NPREVTLF89Yi5pc0N0cmxLZXksUj0odT1lKCJoZWxwZXJzL2FycmF5IiksdSYmdS5fX2VzTW9kdWxlJiZ1fHx7ImRlZmF1bHQiOnV9KS5hcnJheUVhY2gsUz0oYz1lKCJoZWxwZXJzL251bWJlciIpLGMmJmMuX19lc01vZHVsZSYmY3x8eyJkZWZhdWx0IjpjfSkucmFuZ2VFYWNoLEU9KGg9ZSgiaGVscGVycy9kb20vZXZlbnQiKSxoJiZoLl9fZXNNb2R1bGUmJmh8fHsiZGVmYXVsdCI6aH0pLFQ9RS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24sTT1FLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkLE89KGQ9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLGQmJmQuX19lc01vZHVsZSYmZHx8eyJkZWZhdWx0IjpkfSkuZ2V0U2VsZWN0aW9uVGV4dCxrPShmPWUoImhlbHBlcnMvZnVuY3Rpb24iKSxmJiZmLl9fZXNNb2R1bGUmJmZ8fHsiZGVmYXVsdCI6Zn0pLnByb3h5LEg9KChwPWUoInBsdWdpbnMiKSxwJiZwLl9fZXNNb2R1bGUmJnB8fHsiZGVmYXVsdCI6cH0pLnJlZ2lzdGVyUGx1Z2luLChnPWUoIjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9jZWxsL2Nvb3JkcyIpLGcmJmcuX19lc01vZHVsZSYmZ3x8eyJkZWZhdWx0IjpnfSkuV2Fsa29udGFibGVDZWxsQ29vcmRzKSxEPShtPWUoIjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9jZWxsL3JhbmdlIiksbSYmbS5fX2VzTW9kdWxlJiZtfHx7ImRlZmF1bHQiOm19KS5XYWxrb250YWJsZUNlbGxSYW5nZTt3Lmhvb2tzLmFkZCgiYWZ0ZXJJbml0IixyKSx3Lmhvb2tzLmFkZCgiYWZ0ZXJVcGRhdGVTZXR0aW5ncyIsciksdy5ob29rcy5yZWdpc3RlcigiYWZ0ZXJDb3B5TGltaXQiKSx3Lmhvb2tzLnJlZ2lzdGVyKCJtb2RpZnlDb3B5YWJsZVJhbmdlIil9LHsiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL2NlbGwvY29vcmRzIjo1LCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY2VsbC9yYW5nZSI6NixTaGVldENsaXA6IlNoZWV0Q2xpcCIsYnJvd3NlcjoyMyxjb3B5UGFzdGU6ImNvcHlQYXN0ZSIsImhlbHBlcnMvYXJyYXkiOjQyLCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9kb20vZXZlbnQiOjQ3LCJoZWxwZXJzL2Z1bmN0aW9uIjo0OSwiaGVscGVycy9udW1iZXIiOjUxLCJoZWxwZXJzL3VuaWNvZGUiOjU1LHBsdWdpbnM6NTl9XSw3NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKCl7fXZhciByLGkscyxsLGEsdT0ocj1lKCJicm93c2VyIiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KVsiZGVmYXVsdCJdLGM9KChpPWUoInBsdWdpbnMiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLnJlZ2lzdGVyUGx1Z2luLChzPWUoIjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9jZWxsL3JhbmdlIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5XYWxrb250YWJsZUNlbGxSYW5nZSksaD0obD1lKCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvc2VsZWN0aW9uIiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KS5XYWxrb250YWJsZVNlbGVjdGlvbixkPWZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGUmJmU9PT0hMD8hMDoib2JqZWN0Ij09dHlwZW9mIGUmJmUubGVuZ3RoPjB9LGY9ZnVuY3Rpb24oKXtkKHRoaXMuZ2V0U2V0dGluZ3MoKS5jdXN0b21Cb3JkZXJzKSYmKHRoaXMuY3VzdG9tQm9yZGVyc3x8KGE9dGhpcyx0aGlzLmN1c3RvbUJvcmRlcnM9bmV3IG8pKX0scD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGEudmlldy53dC5zZWxlY3Rpb25zLmxlbmd0aDt0KyspaWYoYS52aWV3Lnd0LnNlbGVjdGlvbnNbdF0uc2V0dGluZ3MuY2xhc3NOYW1lPT1lKXJldHVybiB0O3JldHVybi0xfSxnPWZ1bmN0aW9uKGUpe3ZhciB0PXtyb3c6ZS5yb3csY29sOmUuY29sfSxuPW5ldyBoKGUsbmV3IGModCx0LHQpKSxvPXAoZS5jbGFzc05hbWUpO28+PTA/YS52aWV3Lnd0LnNlbGVjdGlvbnNbb109bjphLnZpZXcud3Quc2VsZWN0aW9ucy5wdXNoKG4pfSxtPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1fKGUsdCk7bz1SKG8sbiksdGhpcy5zZXRDZWxsTWV0YShlLHQsImJvcmRlcnMiLG8pLGcobyl9LHc9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUucmFuZ2Usbj10LmZyb20ucm93O248PXQudG8ucm93O24rKylmb3IodmFyIG89dC5mcm9tLmNvbDtvPD10LnRvLmNvbDtvKyspe3ZhciByPV8obixvKSxpPTA7bj09dC5mcm9tLnJvdyYmKGkrKyxlLmhhc093blByb3BlcnR5KCJ0b3AiKSYmKHIudG9wPWUudG9wKSksbj09dC50by5yb3cmJihpKyssZS5oYXNPd25Qcm9wZXJ0eSgiYm90dG9tIikmJihyLmJvdHRvbT1lLmJvdHRvbSkpLG89PXQuZnJvbS5jb2wmJihpKyssZS5oYXNPd25Qcm9wZXJ0eSgibGVmdCIpJiYoci5sZWZ0PWUubGVmdCkpLG89PXQudG8uY29sJiYoaSsrLGUuaGFzT3duUHJvcGVydHkoInJpZ2h0IikmJihyLnJpZ2h0PWUucmlnaHQpKSxpPjAmJih0aGlzLnNldENlbGxNZXRhKG4sbywiYm9yZGVycyIsciksZyhyKSl9fSx2PWZ1bmN0aW9uKGUsdCl7cmV0dXJuImJvcmRlcl9yb3ciK2UrImNvbCIrdH0seT1mdW5jdGlvbigpe3JldHVybnt3aWR0aDoxLGNvbG9yOiIjMDAwIn19LGI9ZnVuY3Rpb24oKXtyZXR1cm57aGlkZTohMH19LEM9ZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6MSxjb2xvcjoiIzAwMCIsY29ybmVyVmlzaWJsZTohMX19LF89ZnVuY3Rpb24oZSx0KXtyZXR1cm57Y2xhc3NOYW1lOnYoZSx0KSxib3JkZXI6QygpLHJvdzplLGNvbDp0LHRvcDpiKCkscmlnaHQ6YigpLGJvdHRvbTpiKCksbGVmdDpiKCl9fSxSPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoImJvcmRlciIpJiYoZS5ib3JkZXI9dC5ib3JkZXIpLHQuaGFzT3duUHJvcGVydHkoInRvcCIpJiYoZS50b3A9dC50b3ApLHQuaGFzT3duUHJvcGVydHkoInJpZ2h0IikmJihlLnJpZ2h0PXQucmlnaHQpLHQuaGFzT3duUHJvcGVydHkoImJvdHRvbSIpJiYoZS5ib3R0b209dC5ib3R0b20pLHQuaGFzT3duUHJvcGVydHkoImxlZnQiKSYmKGUubGVmdD10LmxlZnQpLGV9LFM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi4iK2UpLG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dJiYiVEQiIT10W25dLm5vZGVOYW1lKXt2YXIgbz10W25dLnBhcmVudE5vZGU7by5wYXJlbnROb2RlJiZvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyl9fSxFPWZ1bmN0aW9uKGUsdCl7dmFyIG49dihlLHQpO1MobiksdGhpcy5yZW1vdmVDZWxsTWV0YShlLHQsImJvcmRlcnMiKX0sVD1mdW5jdGlvbihlLHQsbixvKXt2YXIgcj10aGlzLmdldENlbGxNZXRhKGUsdCkuYm9yZGVycztyJiZ2b2lkIDAhPXIuYm9yZGVyfHwocj1fKGUsdCkpLG8/cltuXT1iKCk6cltuXT15KCksdGhpcy5zZXRDZWxsTWV0YShlLHQsImJvcmRlcnMiLHIpO3ZhciBpPXYoZSx0KTtTKGkpLGcociksdGhpcy5yZW5kZXIoKX0sTT1mdW5jdGlvbihlLHQsbil7aWYoZS5mcm9tLnJvdz09ZS50by5yb3cmJmUuZnJvbS5jb2w9PWUudG8uY29sKSJub0JvcmRlcnMiPT10P0UuY2FsbCh0aGlzLGUuZnJvbS5yb3csZS5mcm9tLmNvbCk6VC5jYWxsKHRoaXMsZS5mcm9tLnJvdyxlLmZyb20uY29sLHQsbik7ZWxzZSBzd2l0Y2godCl7Y2FzZSJub0JvcmRlcnMiOmZvcih2YXIgbz1lLmZyb20uY29sO288PWUudG8uY29sO28rKylmb3IodmFyIHI9ZS5mcm9tLnJvdztyPD1lLnRvLnJvdztyKyspRS5jYWxsKHRoaXMscixvKTticmVhaztjYXNlInRvcCI6Zm9yKHZhciBpPWUuZnJvbS5jb2w7aTw9ZS50by5jb2w7aSsrKVQuY2FsbCh0aGlzLGUuZnJvbS5yb3csaSx0LG4pO2JyZWFrO2Nhc2UicmlnaHQiOmZvcih2YXIgcz1lLmZyb20ucm93O3M8PWUudG8ucm93O3MrKylULmNhbGwodGhpcyxzLGUudG8uY29sLHQpO2JyZWFrO2Nhc2UiYm90dG9tIjpmb3IodmFyIGw9ZS5mcm9tLmNvbDtsPD1lLnRvLmNvbDtsKyspVC5jYWxsKHRoaXMsZS50by5yb3csbCx0KTticmVhaztjYXNlImxlZnQiOmZvcih2YXIgYT1lLmZyb20ucm93O2E8PWUudG8ucm93O2ErKylULmNhbGwodGhpcyxhLGUuZnJvbS5jb2wsdCl9fSxPPWZ1bmN0aW9uKGUsdCl7dmFyIG49ITE7cmV0dXJuIGUuZ2V0U2VsZWN0ZWRSYW5nZSgpLmZvckFsbChmdW5jdGlvbihvLHIpe3ZhciBpPWUuZ2V0Q2VsbE1ldGEobyxyKS5ib3JkZXJzO2lmKGkpe2lmKCF0KXJldHVybiBuPSEwLCExO2lmKCFpW3RdLmhhc093blByb3BlcnR5KCJoaWRlIikpcmV0dXJuIG49ITAsITF9fSksbn0saz1mdW5jdGlvbihlKXtyZXR1cm4nPHNwYW4gY2xhc3M9InNlbGVjdGVkIj4nK1N0cmluZy5mcm9tQ2hhckNvZGUoMTAwMDMpKyI8L3NwYW4+IitlfSxIPWZ1bmN0aW9uKGUpe3RoaXMuZ2V0U2V0dGluZ3MoKS5jdXN0b21Cb3JkZXJzJiYoZS5pdGVtcy5wdXNoKHUucGx1Z2lucy5Db250ZXh0TWVudS5TRVBBUkFUT1IpLGUuaXRlbXMucHVzaCh7a2V5OiJib3JkZXJzIixuYW1lOiJCb3JkZXJzIixzdWJtZW51OntpdGVtczpbe2tleToiYm9yZGVyczp0b3AiLG5hbWU6ZnVuY3Rpb24oKXt2YXIgZT0iVG9wIix0PU8odGhpcywidG9wIik7cmV0dXJuIHQmJihlPWsoZSkpLGV9LGNhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9Tyh0aGlzLCJ0b3AiKTtNLmNhbGwodGhpcyx0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSwidG9wIixlKX0sZGlzYWJsZWQ6ITF9LHtrZXk6ImJvcmRlcnM6cmlnaHQiLG5hbWU6ZnVuY3Rpb24oKXt2YXIgZT0iUmlnaHQiLHQ9Tyh0aGlzLCJyaWdodCIpO3JldHVybiB0JiYoZT1rKGUpKSxlfSxjYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPU8odGhpcywicmlnaHQiKTtNLmNhbGwodGhpcyx0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSwicmlnaHQiLGUpfSxkaXNhYmxlZDohMX0se2tleToiYm9yZGVyczpib3R0b20iLG5hbWU6ZnVuY3Rpb24oKXt2YXIgZT0iQm90dG9tIix0PU8odGhpcywiYm90dG9tIik7cmV0dXJuIHQmJihlPWsoZSkpLGV9LGNhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9Tyh0aGlzLCJib3R0b20iKTtNLmNhbGwodGhpcyx0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSwiYm90dG9tIixlKX0sZGlzYWJsZWQ6ITF9LHtrZXk6ImJvcmRlcnM6bGVmdCIsbmFtZTpmdW5jdGlvbigpe3ZhciBlPSJMZWZ0Iix0PU8odGhpcywibGVmdCIpO3JldHVybiB0JiYoZT1rKGUpKSxlfSxjYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPU8odGhpcywibGVmdCIpO00uY2FsbCh0aGlzLHRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSgpLCJsZWZ0IixlKX0sZGlzYWJsZWQ6ITF9LHtrZXk6ImJvcmRlcnM6bm9fYm9yZGVycyIsbmFtZToiUmVtb3ZlIGJvcmRlcihzKSIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtNLmNhbGwodGhpcyx0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSwibm9Cb3JkZXJzIil9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIU8odGhpcyl9fV19fSkpfTt1Lmhvb2tzLmFkZCgiYmVmb3JlSW5pdCIsZiksdS5ob29rcy5hZGQoImFmdGVyQ29udGV4dE1lbnVEZWZhdWx0T3B0aW9ucyIsSCksdS5ob29rcy5hZGQoImFmdGVySW5pdCIsZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFNldHRpbmdzKCkuY3VzdG9tQm9yZGVycztpZihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLnJhbmdlP3cuY2FsbCh0aGlzLGVbdF0pOm0uY2FsbCh0aGlzLGVbdF0ucm93LGVbdF0uY29sLGVbdF0pO3RoaXMucmVuZGVyKCksdGhpcy52aWV3Lnd0LmRyYXcoITApfX0pLHUuQ3VzdG9tQm9yZGVycz1vfSx7IjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9jZWxsL3JhbmdlIjo2LCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvc2VsZWN0aW9uIjoxOCxicm93c2VyOjIzLHBsdWdpbnM6NTl9XSw3NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKCl7dGhpcy5ib3VuZGFyaWVzPW51bGwsdGhpcy5jYWxsYmFjaz1udWxsfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0RyYWdUb1Njcm9sbDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgcixpLHMsbD0ocj1lKCJicm93c2VyIiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KVsiZGVmYXVsdCJdLGE9KGk9ZSgiZXZlbnRNYW5hZ2VyIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5ldmVudE1hbmFnZXI7KHM9ZSgicGx1Z2lucyIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkucmVnaXN0ZXJQbHVnaW47bC5wbHVnaW5zLkRyYWdUb1Njcm9sbD1vLG8ucHJvdG90eXBlLnNldEJvdW5kYXJpZXM9ZnVuY3Rpb24oZSl7dGhpcy5ib3VuZGFyaWVzPWV9LG8ucHJvdG90eXBlLnNldENhbGxiYWNrPWZ1bmN0aW9uKGUpe3RoaXMuY2FsbGJhY2s9ZX0sby5wcm90b3R5cGUuY2hlY2s9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLG89MDt0PHRoaXMuYm91bmRhcmllcy50b3A/bz10LXRoaXMuYm91bmRhcmllcy50b3A6dD50aGlzLmJvdW5kYXJpZXMuYm90dG9tJiYobz10LXRoaXMuYm91bmRhcmllcy5ib3R0b20pLGU8dGhpcy5ib3VuZGFyaWVzLmxlZnQ/bj1lLXRoaXMuYm91bmRhcmllcy5sZWZ0OmU+dGhpcy5ib3VuZGFyaWVzLnJpZ2h0JiYobj1lLXRoaXMuYm91bmRhcmllcy5yaWdodCksdGhpcy5jYWxsYmFjayhuLG8pfTt2YXIgdSxjPWZ1bmN0aW9uKGUpe2UuZHJhZ1RvU2Nyb2xsTGlzdGVuaW5nPSExO3ZhciB0PWUudmlldy53dC53dFRhYmxlLmhvbGRlcjt1PW5ldyBvLHQhPT13aW5kb3cmJih1LnNldEJvdW5kYXJpZXModC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksdS5zZXRDYWxsYmFjayhmdW5jdGlvbihlLG4pezA+ZT90LnNjcm9sbExlZnQtPTUwOmU+MCYmKHQuc2Nyb2xsTGVmdCs9NTApLDA+bj90LnNjcm9sbFRvcC09MjA6bj4wJiYodC5zY3JvbGxUb3ArPTIwKX0pLGUuZHJhZ1RvU2Nyb2xsTGlzdGVuaW5nPSEwKX07bC5ob29rcy5hZGQoImFmdGVySW5pdCIsZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9YSh0aGlzKTt0LmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGZ1bmN0aW9uKCl7ZS5kcmFnVG9TY3JvbGxMaXN0ZW5pbmc9ITF9KSx0LmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsZnVuY3Rpb24odCl7ZS5kcmFnVG9TY3JvbGxMaXN0ZW5pbmcmJnUuY2hlY2sodC5jbGllbnRYLHQuY2xpZW50WSl9KX0pLGwuaG9va3MuYWRkKCJhZnRlckRlc3Ryb3kiLGZ1bmN0aW9uKCl7YSh0aGlzKS5jbGVhcigpfSksbC5ob29rcy5hZGQoImFmdGVyT25DZWxsTW91c2VEb3duIixmdW5jdGlvbigpe2ModGhpcyl9KSxsLmhvb2tzLmFkZCgiYWZ0ZXJPbkNlbGxDb3JuZXJNb3VzZURvd24iLGZ1bmN0aW9uKCl7Yyh0aGlzKX0pLGwucGx1Z2lucy5EcmFnVG9TY3JvbGw9b30se2Jyb3dzZXI6MjMsZXZlbnRNYW5hZ2VyOjQxLHBsdWdpbnM6NTl9XSw3ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtNYW51YWxDb2x1bW5GcmVlemU6e2dldDpmdW5jdGlvbigpe3JldHVybiB1fX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpLHM9KG89ZSgiYnJvd3NlciIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXSxsPShyPWUoIl9iYXNlIiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KVsiZGVmYXVsdCJdLGE9KGk9ZSgicGx1Z2lucyIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkucmVnaXN0ZXJQbHVnaW4sdT1mdW5jdGlvbihlKXskdHJhY2V1clJ1bnRpbWUuc3VwZXJDb25zdHJ1Y3RvcihjKS5jYWxsKHRoaXMsZSksdGhpcy5tYW51YWxDb2x1bW5Nb3ZlUGx1Z2luPW51bGwsdGhpcy5mcm96ZW5Db2x1bW5zQmFzZVBvc2l0aW9ucz1bXX0sYz11OyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyh1LHtpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuaG90LmdldFNldHRpbmdzKCkubWFudWFsQ29sdW1uRnJlZXplfSxlbmFibGVQbHVnaW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZW5hYmxlZHx8KHRoaXMuYWRkSG9vaygibW9kaWZ5Q29sIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbk1vZGlmeUNvbCh0KX0pLHRoaXMuYWRkSG9vaygiYWZ0ZXJDb250ZXh0TWVudURlZmF1bHRPcHRpb25zIixmdW5jdGlvbih0KXtyZXR1cm4gZS5hZGRDb250ZXh0TWVudUVudHJ5KHQpfSksJHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsYy5wcm90b3R5cGUsImVuYWJsZVBsdWdpbiIpLmNhbGwodGhpcykpfSxpbml0OmZ1bmN0aW9uKCl7JHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsYy5wcm90b3R5cGUsImluaXQiKS5jYWxsKHRoaXMpLHRoaXMuZml4ZWRDb2x1bW5zQ291bnQ9dGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5maXhlZENvbHVtbnNMZWZ0fSxnZXRNYW51YWxDb2x1bW5Nb3ZlUGx1Z2luOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFudWFsQ29sdW1uTW92ZVBsdWdpbnx8KHRoaXMubWFudWFsQ29sdW1uTW92ZVBsdWdpbj10aGlzLmhvdC5nZXRQbHVnaW4oIm1hbnVhbENvbHVtbk1vdmUiKSksdGhpcy5tYW51YWxDb2x1bW5Nb3ZlUGx1Z2lufSxvbk1vZGlmeUNvbDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRNYW51YWxDb2x1bW5Nb3ZlUGx1Z2luKCkuaXNFbmFibGVkKCk/ZTp0aGlzLmdldExvZ2ljYWxDb2x1bW5JbmRleChlKX0sYWRkQ29udGV4dE1lbnVFbnRyeTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2UuaXRlbXMucHVzaChzLnBsdWdpbnMuQ29udGV4dE1lbnUuU0VQQVJBVE9SLHtrZXk6ImZyZWV6ZV9jb2x1bW4iLG5hbWU6ZnVuY3Rpb24oKXt2YXIgZT10LmhvdC5nZXRTZWxlY3RlZCgpWzFdO3JldHVybiBlPnQuZml4ZWRDb2x1bW5zQ291bnQtMT8iRnJlZXplIHRoaXMgY29sdW1uIjoiVW5mcmVlemUgdGhpcyBjb2x1bW4ifSxkaXNhYmxlZDpmdW5jdGlvbigpe3ZhciBlPXQuaG90LmdldFNlbGVjdGVkKCk7cmV0dXJuIGVbMV0hPT1lWzNdfSxjYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPXQuaG90LmdldFNlbGVjdGVkKClbMV07ZT50LmZpeGVkQ29sdW1uc0NvdW50LTE/dC5mcmVlemVDb2x1bW4oZSk6dC51bmZyZWV6ZUNvbHVtbihlKX19KX0sZnJlZXplQ29sdW1uOmZ1bmN0aW9uKGUpe2U8PXRoaXMuZml4ZWRDb2x1bW5zQ291bnQtMXx8KGUhPT10aGlzLmdldExvZ2ljYWxDb2x1bW5JbmRleChlKSYmKHRoaXMuZnJvemVuQ29sdW1uc0Jhc2VQb3NpdGlvbnNbdGhpcy5maXhlZENvbHVtbnNDb3VudF09ZSksdGhpcy5jaGFuZ2VDb2x1bW5Qb3NpdGlvbnMoZSx0aGlzLmZpeGVkQ29sdW1uc0NvdW50KSx0aGlzLmFkZEZpeGVkQ29sdW1uKCksdGhpcy5ob3Qudmlldy53dC53dE92ZXJsYXlzLmxlZnRPdmVybGF5LnJlZnJlc2goKSx0aGlzLmhvdC52aWV3Lnd0Lnd0T3ZlcmxheXMuYWRqdXN0RWxlbWVudHNTaXplKCkpfSx1bmZyZWV6ZUNvbHVtbjpmdW5jdGlvbihlKXtpZighKGU+dGhpcy5maXhlZENvbHVtbnNDb3VudC0xKSl7dmFyIHQ9dGhpcy5nZXRCZXN0Q29sdW1uUmV0dXJuUG9zaXRpb24oZSk7dGhpcy5jaGFuZ2VDb2x1bW5Qb3NpdGlvbnMoZSx0KSx0aGlzLnJlbW92ZUZpeGVkQ29sdW1uKCksdGhpcy5ob3Qudmlldy53dC53dE92ZXJsYXlzLmxlZnRPdmVybGF5LnJlZnJlc2goKSx0aGlzLmhvdC52aWV3Lnd0Lnd0T3ZlcmxheXMuYWRqdXN0RWxlbWVudHNTaXplKCl9fSxhZGRGaXhlZENvbHVtbjpmdW5jdGlvbigpe3RoaXMuaG90LnVwZGF0ZVNldHRpbmdzKHtmaXhlZENvbHVtbnNMZWZ0OnRoaXMuZml4ZWRDb2x1bW5zQ291bnQrMX0pLHRoaXMuZml4ZWRDb2x1bW5zQ291bnQrK30scmVtb3ZlRml4ZWRDb2x1bW46ZnVuY3Rpb24oKXt0aGlzLmhvdC51cGRhdGVTZXR0aW5ncyh7Zml4ZWRDb2x1bW5zTGVmdDp0aGlzLmZpeGVkQ29sdW1uc0NvdW50LTF9KSx0aGlzLmZpeGVkQ29sdW1uc0NvdW50LS19LGdldEJlc3RDb2x1bW5SZXR1cm5Qb3NpdGlvbjpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMuZml4ZWRDb2x1bW5zQ291bnQsbz10aGlzLmdldExvZ2ljYWxDb2x1bW5JbmRleChuKTtpZihudWxsPT10aGlzLmZyb3plbkNvbHVtbnNCYXNlUG9zaXRpb25zW2VdKWZvcih0PXRoaXMuZ2V0TG9naWNhbENvbHVtbkluZGV4KGUpO3Q+bzspbisrLG89dGhpcy5nZXRMb2dpY2FsQ29sdW1uSW5kZXgobik7ZWxzZXtmb3IodD10aGlzLmZyb3plbkNvbHVtbnNCYXNlUG9zaXRpb25zW2VdLHRoaXMuZnJvemVuQ29sdW1uc0Jhc2VQb3NpdGlvbnNbZV09dm9pZCAwO3Q+PW87KW4rKyxvPXRoaXMuZ2V0TG9naWNhbENvbHVtbkluZGV4KG4pO249b31yZXR1cm4gbi0xfSxnZXRWaXNpYmxlQ29sdW1uSW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0TWFudWFsQ29sdW1uTW92ZVBsdWdpbigpLmdldFZpc2libGVDb2x1bW5JbmRleChlKX0sZ2V0TG9naWNhbENvbHVtbkluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldE1hbnVhbENvbHVtbk1vdmVQbHVnaW4oKS5nZXRMb2dpY2FsQ29sdW1uSW5kZXgoZSl9LGNoYW5nZUNvbHVtblBvc2l0aW9uczpmdW5jdGlvbihlLHQpe3RoaXMuZ2V0TWFudWFsQ29sdW1uTW92ZVBsdWdpbigpLmNoYW5nZUNvbHVtblBvc2l0aW9ucyhlLHQpfX0se30sbCksYSgibWFudWFsQ29sdW1uRnJlZXplIix1KX0se19iYXNlOjYwLGJyb3dzZXI6MjMscGx1Z2luczo1OX1dLDc5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se01hbnVhbENvbHVtbk1vdmU6e2dldDpmdW5jdGlvbigpe3JldHVybiBNfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpLHMsbCxhLHUsYyxoPShvPWUoIl9iYXNlLmpzIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLGQ9KHI9ZSgiYnJvd3NlciIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSlbImRlZmF1bHQiXSxmPShpPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLHA9Zi5hZGRDbGFzcyxnPWYuaGFzQ2xhc3MsbT1mLnJlbW92ZUNsYXNzLHc9Zi5vdXRlckhlaWdodCx2PShzPWUoImhlbHBlcnMvYXJyYXkiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLHk9di5hcnJheUVhY2gsYj12LmFycmF5TWFwLEM9KGw9ZSgiaGVscGVycy9udW1iZXIiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLnJhbmdlRWFjaCxfPShhPWUoImV2ZW50TWFuYWdlciIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSkuZXZlbnRNYW5hZ2VyLFI9KHU9ZSgiaGVscGVycy9kb20vZXZlbnQiKSx1JiZ1Ll9fZXNNb2R1bGUmJnV8fHsiZGVmYXVsdCI6dX0pLFM9Ui5wYWdlWCxFPShSLnBhZ2VZLChjPWUoInBsdWdpbnMiKSxjJiZjLl9fZXNNb2R1bGUmJmN8fHsiZGVmYXVsdCI6Y30pLnJlZ2lzdGVyUGx1Z2luKSxUPW5ldyBXZWFrTWFwLE09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczskdHJhY2V1clJ1bnRpbWUuc3VwZXJDb25zdHJ1Y3RvcihPKS5jYWxsKHRoaXMsZSksVC5zZXQodGhpcyx7Z3VpZGVDbGFzc05hbWU6Im1hbnVhbENvbHVtbk1vdmVyR3VpZGUiLGhhbmRsZUNsYXNzTmFtZToibWFudWFsQ29sdW1uTW92ZXIiLHN0YXJ0T2Zmc2V0Om51bGwscHJlc3NlZDpudWxsLHN0YXJ0Q29sOm51bGwsZW5kQ29sOm51bGwsY3VycmVudENvbDpudWxsLHN0YXJ0WDpudWxsLHN0YXJ0WTpudWxsfSksdGhpcy5ndWlkZUVsZW1lbnQ9bnVsbCx0aGlzLmhhbmRsZUVsZW1lbnQ9bnVsbCx0aGlzLmN1cnJlbnRUSD1udWxsLHRoaXMuY29sdW1uUG9zaXRpb25zPVtdLHRoaXMuZXZlbnRNYW5hZ2VyPV8odGhpcyksdGhpcy5hZGRIb29rKCJpbml0IixmdW5jdGlvbigpe3JldHVybiB0Lm9uSW5pdCgpfSl9LE89TTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoTSx7aXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmhvdC5nZXRTZXR0aW5ncygpLm1hbnVhbENvbHVtbk1vdmV9LGVuYWJsZVBsdWdpbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1ULmdldCh0aGlzKSxuPXRoaXMuaG90LmdldFNldHRpbmdzKCkubWFudWFsQ29sdW1uTW92ZSxvPXRoaXMubG9hZE1hbnVhbENvbHVtblBvc2l0aW9ucygpO3RoaXMuaGFuZGxlRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLmhhbmRsZUVsZW1lbnQuY2xhc3NOYW1lPXQuaGFuZGxlQ2xhc3NOYW1lLHRoaXMuZ3VpZGVFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHRoaXMuZ3VpZGVFbGVtZW50LmNsYXNzTmFtZT10Lmd1aWRlQ2xhc3NOYW1lLHRoaXMuYWRkSG9vaygibW9kaWZ5Q29sIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbk1vZGlmeUNvbCh0KX0pLHRoaXMuYWRkSG9vaygidW5tb2RpZnlDb2wiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uVW5tb2RpZnlDb2wodCl9KSx0aGlzLmFkZEhvb2soImFmdGVyUmVtb3ZlQ29sIixmdW5jdGlvbih0LG4pe3JldHVybiBlLm9uQWZ0ZXJSZW1vdmVDb2wodCxuKX0pLHRoaXMuYWRkSG9vaygiYWZ0ZXJDcmVhdGVDb2wiLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUub25BZnRlckNyZWF0ZUNvbCh0LG4pfSksdGhpcy5yZWdpc3RlckV2ZW50cygpLCJ1bmRlZmluZWQiIT10eXBlb2Ygbz90aGlzLmNvbHVtblBvc2l0aW9ucz1vOkFycmF5LmlzQXJyYXkobik/dGhpcy5jb2x1bW5Qb3NpdGlvbnM9bjpuJiZ2b2lkIDAhPT10aGlzLmNvbHVtblBvc2l0aW9uc3x8KHRoaXMuY29sdW1uUG9zaXRpb25zPVtdKSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxPLnByb3RvdHlwZSwiZW5hYmxlUGx1Z2luIikuY2FsbCh0aGlzKX0sdXBkYXRlUGx1Z2luOmZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlUGx1Z2luKCksdGhpcy5lbmFibGVQbHVnaW4oKSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxPLnByb3RvdHlwZSwidXBkYXRlUGx1Z2luIikuY2FsbCh0aGlzKX0sZGlzYWJsZVBsdWdpbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG90LmdldFNldHRpbmdzKCkubWFudWFsQ29sdW1uTW92ZTtBcnJheS5pc0FycmF5KGUpJiYodGhpcy51bnJlZ2lzdGVyRXZlbnRzKCksdGhpcy5jb2x1bW5Qb3NpdGlvbnM9W10pLCR0cmFjZXVyUnVudGltZS5zdXBlckdldCh0aGlzLE8ucHJvdG90eXBlLCJkaXNhYmxlUGx1Z2luIikuY2FsbCh0aGlzKX0scmVnaXN0ZXJFdmVudHM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5ob3Qucm9vdEVsZW1lbnQsIm1vdXNlb3ZlciIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25Nb3VzZU92ZXIodCl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHRoaXMuaG90LnJvb3RFbGVtZW50LCJtb3VzZWRvd24iLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTW91c2VEb3duKHQpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csIm1vdXNlbW92ZSIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25Nb3VzZU1vdmUodCl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHdpbmRvdywibW91c2V1cCIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25Nb3VzZVVwKHQpfSl9LHVucmVnaXN0ZXJFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLmV2ZW50TWFuYWdlci5jbGVhcigpfSxzYXZlTWFudWFsQ29sdW1uUG9zaXRpb25zOmZ1bmN0aW9uKCl7ZC5ob29rcy5ydW4odGhpcy5ob3QsInBlcnNpc3RlbnRTdGF0ZVNhdmUiLCJtYW51YWxDb2x1bW5Qb3NpdGlvbnMiLHRoaXMuY29sdW1uUG9zaXRpb25zKX0sbG9hZE1hbnVhbENvbHVtblBvc2l0aW9uczpmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiBkLmhvb2tzLnJ1bih0aGlzLmhvdCwicGVyc2lzdGVudFN0YXRlTG9hZCIsIm1hbnVhbENvbHVtblBvc2l0aW9ucyIsZSksZS52YWx1ZX0sY29tcGxldGVTZXR0aW5nc0FycmF5OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuaG90LmNvdW50Q29scygpO3RoaXMuY29sdW1uUG9zaXRpb25zLmxlbmd0aCE9PXQmJkMoMCx0LTEsZnVuY3Rpb24odCl7LTE9PT1lLmNvbHVtblBvc2l0aW9ucy5pbmRleE9mKHQpJiZlLmNvbHVtblBvc2l0aW9ucy5wdXNoKHQpfSl9LHNldHVwSGFuZGxlUG9zaXRpb246ZnVuY3Rpb24oZSl7dGhpcy5jdXJyZW50VEg9ZTt2YXIgdD1ULmdldCh0aGlzKSxuPXRoaXMuaG90LnZpZXcud3Qud3RUYWJsZS5nZXRDb29yZHMoZSkuY29sLG89dyh0aGlzLmN1cnJlbnRUSCk7aWYobj49MCl7dmFyIHI9dGhpcy5jdXJyZW50VEguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dC5jdXJyZW50Q29sPW4sdC5zdGFydE9mZnNldD1yLmxlZnQsdGhpcy5oYW5kbGVFbGVtZW50LnN0eWxlLnRvcD1yLnRvcCsicHgiLHRoaXMuaGFuZGxlRWxlbWVudC5zdHlsZS5sZWZ0PXQuc3RhcnRPZmZzZXQrInB4Iix0aGlzLmhhbmRsZUVsZW1lbnQuc3R5bGUuaGVpZ2h0PW8rInB4Iix0aGlzLmhvdC5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhhbmRsZUVsZW1lbnQpfX0scmVmcmVzaEhhbmRsZVBvc2l0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPTY7dD4wP3RoaXMuaGFuZGxlRWxlbWVudC5zdHlsZS5sZWZ0PW4ubGVmdCtuLndpZHRoLW8rInB4Ijp0aGlzLmhhbmRsZUVsZW1lbnQuc3R5bGUubGVmdD1uLmxlZnQrInB4In0sc2V0dXBHdWlkZVBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jdXJyZW50VEguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdD1ULmdldCh0aGlzKSxuPXBhcnNlSW50KHcodGhpcy5oYW5kbGVFbGVtZW50KSwxMCksbz1wYXJzZUludCh0aGlzLmhhbmRsZUVsZW1lbnQuc3R5bGUudG9wLDEwKStuLHI9cGFyc2VJbnQodGhpcy5ob3Qudmlldy5tYXhpbXVtVmlzaWJsZUVsZW1lbnRIZWlnaHQoMCksMTApO3AodGhpcy5oYW5kbGVFbGVtZW50LCJhY3RpdmUiKSxwKHRoaXMuZ3VpZGVFbGVtZW50LCJhY3RpdmUiKSx0aGlzLmd1aWRlRWxlbWVudC5zdHlsZS53aWR0aD1lLndpZHRoKyJweCIsdGhpcy5ndWlkZUVsZW1lbnQuc3R5bGUuaGVpZ2h0PXItbisicHgiLHRoaXMuZ3VpZGVFbGVtZW50LnN0eWxlLnRvcD1vKyJweCIsdGhpcy5ndWlkZUVsZW1lbnQuc3R5bGUubGVmdD10LnN0YXJ0T2Zmc2V0KyJweCIsdGhpcy5ob3Qucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5ndWlkZUVsZW1lbnQpfSxyZWZyZXNoR3VpZGVQb3NpdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1ULmdldCh0aGlzKTt0aGlzLmd1aWRlRWxlbWVudC5zdHlsZS5sZWZ0PXQuc3RhcnRPZmZzZXQrZSsicHgifSxoaWRlSGFuZGxlQW5kR3VpZGU6ZnVuY3Rpb24oKXttKHRoaXMuaGFuZGxlRWxlbWVudCwiYWN0aXZlIiksbSh0aGlzLmd1aWRlRWxlbWVudCwiYWN0aXZlIil9LGNoZWNrQ29sdW1uSGVhZGVyOmZ1bmN0aW9uKGUpe2lmKGUhPXRoaXMuaG90LnJvb3RFbGVtZW50KXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIlRIRUFEIj09PXQudGFnTmFtZT8hMDp0aGlzLmNoZWNrQ29sdW1uSGVhZGVyKHQpfXJldHVybiExfSxjcmVhdGVQb3NpdGlvbkRhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jb2x1bW5Qb3NpdGlvbnM7dC5sZW5ndGg8ZSYmQyh0Lmxlbmd0aCxlLTEsZnVuY3Rpb24oZSl7dFtlXT1lfSl9LGdldFRIRnJvbVRhcmdldEVsZW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIlRBQkxFIiE9ZS50YWdOYW1lPyJUSCI9PWUudGFnTmFtZT9lOnRoaXMuZ2V0VEhGcm9tVGFyZ2V0RWxlbWVudChlLnBhcmVudE5vZGUpOm51bGx9LGNoYW5nZUNvbHVtblBvc2l0aW9uczpmdW5jdGlvbihlLHQpe3ZhciBuPU1hdGgubWF4KGUsdCk7bj50aGlzLmNvbHVtblBvc2l0aW9ucy5sZW5ndGgtMSYmdGhpcy5jcmVhdGVQb3NpdGlvbkRhdGEobisxKSx0aGlzLmNvbHVtblBvc2l0aW9ucy5zcGxpY2UodCwwLHRoaXMuY29sdW1uUG9zaXRpb25zLnNwbGljZShlLDEpWzBdKX0sZ2V0VmlzaWJsZUNvbHVtbkluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlPnRoaXMuY29sdW1uUG9zaXRpb25zLmxlbmd0aC0xJiZ0aGlzLmNyZWF0ZVBvc2l0aW9uRGF0YShlKSx0aGlzLmNvbHVtblBvc2l0aW9ucy5pbmRleE9mKGUpfSxnZXRMb2dpY2FsQ29sdW1uSW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29sdW1uUG9zaXRpb25zW2VdfSxvbk1vdXNlT3ZlcjpmdW5jdGlvbihlKXt2YXIgdD1ULmdldCh0aGlzKTtpZih0aGlzLmNoZWNrQ29sdW1uSGVhZGVyKGUudGFyZ2V0KSl7dmFyIG49dGhpcy5nZXRUSEZyb21UYXJnZXRFbGVtZW50KGUudGFyZ2V0KTtpZihuKWlmKHQucHJlc3NlZCl7dmFyIG89dGhpcy5ob3Qudmlldy53dC53dFRhYmxlLmdldENvb3JkcyhuKS5jb2w7bz49MCYmKHQuZW5kQ29sPW8sdGhpcy5yZWZyZXNoSGFuZGxlUG9zaXRpb24obix0LmVuZENvbC10LnN0YXJ0Q29sKSl9ZWxzZSB0aGlzLnNldHVwSGFuZGxlUG9zaXRpb24obil9fSxvbk1vdXNlRG93bjpmdW5jdGlvbihlKXt2YXIgdD1ULmdldCh0aGlzKTtnKGUudGFyZ2V0LHQuaGFuZGxlQ2xhc3NOYW1lKSYmKHQuc3RhcnRYPVMoZSksdGhpcy5zZXR1cEd1aWRlUG9zaXRpb24oKSx0LnByZXNzZWQ9dGhpcy5ob3QsdC5zdGFydENvbD10LmN1cnJlbnRDb2wsdC5lbmRDb2w9dC5jdXJyZW50Q29sKX0sb25Nb3VzZU1vdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9VC5nZXQodGhpcyk7dC5wcmVzc2VkJiZ0aGlzLnJlZnJlc2hHdWlkZVBvc2l0aW9uKFMoZSktdC5zdGFydFgpfSxvbk1vdXNlVXA6ZnVuY3Rpb24oZSl7dmFyIHQ9VC5nZXQodGhpcyk7dC5wcmVzc2VkJiYodGhpcy5oaWRlSGFuZGxlQW5kR3VpZGUoKSx0LnByZXNzZWQ9ITEsdGhpcy5jcmVhdGVQb3NpdGlvbkRhdGEodGhpcy5ob3QuY291bnRDb2xzKCkpLHRoaXMuY2hhbmdlQ29sdW1uUG9zaXRpb25zKHQuc3RhcnRDb2wsdC5lbmRDb2wpLGQuaG9va3MucnVuKHRoaXMuaG90LCJiZWZvcmVDb2x1bW5Nb3ZlIix0LnN0YXJ0Q29sLHQuZW5kQ29sKSx0aGlzLmhvdC5mb3JjZUZ1bGxSZW5kZXI9ITAsdGhpcy5ob3Qudmlldy5yZW5kZXIoKSx0aGlzLnNhdmVNYW51YWxDb2x1bW5Qb3NpdGlvbnMoKSxkLmhvb2tzLnJ1bih0aGlzLmhvdCwiYWZ0ZXJDb2x1bW5Nb3ZlIix0LnN0YXJ0Q29sLHQuZW5kQ29sKSx0aGlzLnNldHVwSGFuZGxlUG9zaXRpb24odGhpcy5jdXJyZW50VEgpKX0sb25Nb2RpZnlDb2w6ZnVuY3Rpb24oZSl7cmV0dXJuLTE9PXR5cGVvZiB0aGlzLmdldFZpc2libGVDb2x1bW5JbmRleChlKSYmdGhpcy5jcmVhdGVQb3NpdGlvbkRhdGEoZSsxKSx0aGlzLmdldExvZ2ljYWxDb2x1bW5JbmRleChlKX0sb25Vbm1vZGlmeUNvbDpmdW5jdGlvbihlKXtyZXR1cm4tMT09dHlwZW9mIHRoaXMuZ2V0VmlzaWJsZUNvbHVtbkluZGV4KGUpJiZ0aGlzLmNyZWF0ZVBvc2l0aW9uRGF0YShlKzEpLHRoaXMuZ2V0VmlzaWJsZUNvbHVtbkluZGV4KGUpfSxvbkFmdGVyUmVtb3ZlQ29sOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5pc0VuYWJsZWQoKSl7dmFyIG4sbz10aGlzLmNvbHVtblBvc2l0aW9ucztuPW8uc3BsaWNlKGUsdCksbz1iKG8sZnVuY3Rpb24oZSx0KXt2YXIgbz1lO3JldHVybiB5KG4sZnVuY3Rpb24odCxuKXtlPnQmJm8tLX0pLG99KSx0aGlzLmNvbHVtblBvc2l0aW9ucz1vfX0sb25BZnRlckNyZWF0ZUNvbDpmdW5jdGlvbihlLHQpe2lmKHRoaXMuaXNFbmFibGVkKCkpe3ZhciBuPXRoaXMuY29sdW1uUG9zaXRpb25zO2lmKG4ubGVuZ3RoKXt2YXIgbz1bXTtDKDAsdC0xLGZ1bmN0aW9uKHQpe28ucHVzaChlK3QpfSksZT49bi5sZW5ndGg/bi5jb25jYXQobyk6KG49YihuLGZ1bmN0aW9uKG4sbyl7cmV0dXJuIG4+PWU/bit0Om59KSxuLnNwbGljZS5hcHBseShuLFtlLDBdLmNvbmNhdChvKSkpLHRoaXMuY29sdW1uUG9zaXRpb25zPW59fX0sb25Jbml0OmZ1bmN0aW9uKCl7dGhpcy5jb21wbGV0ZVNldHRpbmdzQXJyYXkoKX19LHt9LGgpLEUoIm1hbnVhbENvbHVtbk1vdmUiLE0pLGQuaG9va3MucmVnaXN0ZXIoImJlZm9yZUNvbHVtbk1vdmUiKSxkLmhvb2tzLnJlZ2lzdGVyKCJhZnRlckNvbHVtbk1vdmUiKSxkLmhvb2tzLnJlZ2lzdGVyKCJ1bm1vZGlmeUNvbCIpfSx7Il9iYXNlLmpzIjo2MCxicm93c2VyOjIzLGV2ZW50TWFuYWdlcjo0MSwiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL2RvbS9ldmVudCI6NDcsImhlbHBlcnMvbnVtYmVyIjo1MSxwbHVnaW5zOjU5fV0sODA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7TWFudWFsQ29sdW1uUmVzaXplOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gU319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGwsYSx1LGMsaD0obz1lKCJicm93c2VyIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLGQ9KHI9ZSgiX2Jhc2UuanMiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pWyJkZWZhdWx0Il0sZj0oaT1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KSxwPWYuYWRkQ2xhc3MsZz1mLmhhc0NsYXNzLG09Zi5yZW1vdmVDbGFzcyx3PWYub3V0ZXJIZWlnaHQsdj0ocz1lKCJldmVudE1hbmFnZXIiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLmV2ZW50TWFuYWdlcix5PShsPWUoImhlbHBlcnMvZG9tL2V2ZW50IiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KSxiPXkucGFnZVgsQz0oeS5wYWdlWSwoYT1lKCJoZWxwZXJzL2FycmF5IiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KS5hcnJheUVhY2gpLF89KHU9ZSgiaGVscGVycy9udW1iZXIiKSx1JiZ1Ll9fZXNNb2R1bGUmJnV8fHsiZGVmYXVsdCI6dX0pLnJhbmdlRWFjaCxSPShjPWUoInBsdWdpbnMiKSxjJiZjLl9fZXNNb2R1bGUmJmN8fHsiZGVmYXVsdCI6Y30pLnJlZ2lzdGVyUGx1Z2luLFM9ZnVuY3Rpb24oZSl7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IoRSkuY2FsbCh0aGlzLGUpLHRoaXMuY3VycmVudFRIPW51bGwsdGhpcy5jdXJyZW50Q29sPW51bGwsdGhpcy5zZWxlY3RlZENvbHM9W10sdGhpcy5jdXJyZW50V2lkdGg9bnVsbCx0aGlzLm5ld1NpemU9bnVsbCx0aGlzLnN0YXJ0WT1udWxsLHRoaXMuc3RhcnRXaWR0aD1udWxsLHRoaXMuc3RhcnRPZmZzZXQ9bnVsbCx0aGlzLmhhbmRsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLmd1aWRlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHRoaXMuZXZlbnRNYW5hZ2VyPXYodGhpcyksdGhpcy5wcmVzc2VkPW51bGwsdGhpcy5kYmxjbGljaz0wLHRoaXMuYXV0b3Jlc2l6ZVRpbWVvdXQ9bnVsbCx0aGlzLm1hbnVhbENvbHVtbldpZHRocz1bXSxwKHRoaXMuaGFuZGxlLCJtYW51YWxDb2x1bW5SZXNpemVyIikscCh0aGlzLmd1aWRlLCJtYW51YWxDb2x1bW5SZXNpemVyR3VpZGUiKX0sRT1TOyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhTLHtpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5tYW51YWxDb2x1bW5SZXNpemV9LGVuYWJsZVBsdWdpbjpmdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIXRoaXMuZW5hYmxlZCl7dGhpcy5tYW51YWxDb2x1bW5XaWR0aHM9W107DQp2YXIgdD10aGlzLmhvdC5nZXRTZXR0aW5ncygpLm1hbnVhbENvbHVtblJlc2l6ZSxuPXRoaXMubG9hZE1hbnVhbENvbHVtbldpZHRocygpO3RoaXMuYWRkSG9vaygibW9kaWZ5Q29sV2lkdGgiLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUub25Nb2RpZnlDb2xXaWR0aCh0LG4pfSksdGhpcy5hZGRIb29rKCJiZWZvcmVTdHJldGNoaW5nQ29sdW1uV2lkdGgiLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUub25CZWZvcmVTdHJldGNoaW5nQ29sdW1uV2lkdGgodCxuKX0pLHRoaXMuYWRkSG9vaygiYmVmb3JlQ29sdW1uUmVzaXplIixmdW5jdGlvbih0LG4sbyl7cmV0dXJuIGUub25CZWZvcmVDb2x1bW5SZXNpemUodCxuLG8pfSksInVuZGVmaW5lZCIhPXR5cGVvZiBuP3RoaXMubWFudWFsQ29sdW1uV2lkdGhzPW46QXJyYXkuaXNBcnJheSh0KT90aGlzLm1hbnVhbENvbHVtbldpZHRocz10OnRoaXMubWFudWFsQ29sdW1uV2lkdGhzPVtdLGguaG9va3MucmVnaXN0ZXIoImJlZm9yZUNvbHVtblJlc2l6ZSIpLGguaG9va3MucmVnaXN0ZXIoImFmdGVyQ29sdW1uUmVzaXplIiksdGhpcy5iaW5kRXZlbnRzKCksJHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsRS5wcm90b3R5cGUsImVuYWJsZVBsdWdpbiIpLmNhbGwodGhpcyl9fSx1cGRhdGVQbHVnaW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmhvdC5nZXRTZXR0aW5ncygpLm1hbnVhbENvbHVtblJlc2l6ZTtBcnJheS5pc0FycmF5KGUpP3RoaXMubWFudWFsQ29sdW1uV2lkdGhzPWU6ZXx8KHRoaXMubWFudWFsQ29sdW1uV2lkdGhzPVtdKX0sZGlzYWJsZVBsdWdpbjpmdW5jdGlvbigpeyR0cmFjZXVyUnVudGltZS5zdXBlckdldCh0aGlzLEUucHJvdG90eXBlLCJkaXNhYmxlUGx1Z2luIikuY2FsbCh0aGlzKX0sc2F2ZU1hbnVhbENvbHVtbldpZHRoczpmdW5jdGlvbigpe3RoaXMuaG90LnJ1bkhvb2tzKCJwZXJzaXN0ZW50U3RhdGVTYXZlIiwibWFudWFsQ29sdW1uV2lkdGhzIix0aGlzLm1hbnVhbENvbHVtbldpZHRocyl9LGxvYWRNYW51YWxDb2x1bW5XaWR0aHM6ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4gdGhpcy5ob3QucnVuSG9va3MoInBlcnNpc3RlbnRTdGF0ZUxvYWQiLCJtYW51YWxDb2x1bW5XaWR0aHMiLGUpLGUudmFsdWV9LHNldHVwSGFuZGxlUG9zaXRpb246ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZighZS5wYXJlbnROb2RlKXJldHVybiExO3RoaXMuY3VycmVudFRIPWU7dmFyIG49dGhpcy5ob3Qudmlldy53dC53dFRhYmxlLmdldENvb3JkcyhlKS5jb2wsbz13KHRoaXMuY3VycmVudFRIKTtpZihuPj0wKXt2YXIgcj10aGlzLmN1cnJlbnRUSC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZih0aGlzLmN1cnJlbnRDb2w9bix0aGlzLnNlbGVjdGVkQ29scz1bXSx0aGlzLmhvdC5zZWxlY3Rpb24uaXNTZWxlY3RlZCgpJiZ0aGlzLmhvdC5zZWxlY3Rpb24uc2VsZWN0ZWRIZWFkZXIuY29scyl7dmFyIGk9dGhpcy5ob3QuZ2V0U2VsZWN0ZWRSYW5nZSgpLHM9aS5mcm9tLGw9aS50byxhPXMuY29sLHU9bC5jb2w7YT49dSYmKGE9bC5jb2wsdT1zLmNvbCksdGhpcy5jdXJyZW50Q29sPj1hJiZ0aGlzLmN1cnJlbnRDb2w8PXU/XyhhLHUsZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2VsZWN0ZWRDb2xzLnB1c2goZSl9KTp0aGlzLnNlbGVjdGVkQ29scy5wdXNoKHRoaXMuY3VycmVudENvbCl9ZWxzZSB0aGlzLnNlbGVjdGVkQ29scy5wdXNoKHRoaXMuY3VycmVudENvbCk7dGhpcy5zdGFydE9mZnNldD1yLmxlZnQtNix0aGlzLnN0YXJ0V2lkdGg9cGFyc2VJbnQoci53aWR0aCwxMCksdGhpcy5oYW5kbGUuc3R5bGUudG9wPXIudG9wKyJweCIsdGhpcy5oYW5kbGUuc3R5bGUubGVmdD10aGlzLnN0YXJ0T2Zmc2V0K3RoaXMuc3RhcnRXaWR0aCsicHgiLHRoaXMuaGFuZGxlLnN0eWxlLmhlaWdodD1vKyJweCIsdGhpcy5ob3Qucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5oYW5kbGUpfX0scmVmcmVzaEhhbmRsZVBvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGUuc3R5bGUubGVmdD10aGlzLnN0YXJ0T2Zmc2V0K3RoaXMuY3VycmVudFdpZHRoKyJweCJ9LHNldHVwR3VpZGVQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBlPXBhcnNlSW50KHcodGhpcy5oYW5kbGUpLDEwKSx0PXBhcnNlSW50KHRoaXMuaGFuZGxlLnN0eWxlLnRvcCwxMCkrZSxuPXBhcnNlSW50KHRoaXMuaG90LnZpZXcubWF4aW11bVZpc2libGVFbGVtZW50SGVpZ2h0KDApLDEwKTtwKHRoaXMuaGFuZGxlLCJhY3RpdmUiKSxwKHRoaXMuZ3VpZGUsImFjdGl2ZSIpLHRoaXMuZ3VpZGUuc3R5bGUudG9wPXQrInB4Iix0aGlzLmd1aWRlLnN0eWxlLmxlZnQ9dGhpcy5oYW5kbGUuc3R5bGUubGVmdCx0aGlzLmd1aWRlLnN0eWxlLmhlaWdodD1uLWUrInB4Iix0aGlzLmhvdC5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmd1aWRlKX0scmVmcmVzaEd1aWRlUG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLmd1aWRlLnN0eWxlLmxlZnQ9dGhpcy5oYW5kbGUuc3R5bGUubGVmdH0saGlkZUhhbmRsZUFuZEd1aWRlOmZ1bmN0aW9uKCl7bSh0aGlzLmhhbmRsZSwiYWN0aXZlIiksbSh0aGlzLmd1aWRlLCJhY3RpdmUiKX0sY2hlY2tJZkNvbHVtbkhlYWRlcjpmdW5jdGlvbihlKXtpZihlIT10aGlzLmhvdC5yb290RWxlbWVudCl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiJUSEVBRCI9PT10LnRhZ05hbWU/ITA6dGhpcy5jaGVja0lmQ29sdW1uSGVhZGVyKHQpfXJldHVybiExfSxnZXRUSEZyb21UYXJnZXRFbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiJUQUJMRSIhPWUudGFnTmFtZT8iVEgiPT1lLnRhZ05hbWU/ZTp0aGlzLmdldFRIRnJvbVRhcmdldEVsZW1lbnQoZS5wYXJlbnROb2RlKTpudWxsfSxvbk1vdXNlT3ZlcjpmdW5jdGlvbihlKXtpZih0aGlzLmNoZWNrSWZDb2x1bW5IZWFkZXIoZS50YXJnZXQpKXt2YXIgdD10aGlzLmdldFRIRnJvbVRhcmdldEVsZW1lbnQoZS50YXJnZXQpO2lmKCF0KXJldHVybjt2YXIgbj10LmdldEF0dHJpYnV0ZSgiY29sc3BhbiIpOyF0fHxudWxsIT09biYmMSE9PW58fHRoaXMucHJlc3NlZHx8dGhpcy5zZXR1cEhhbmRsZVBvc2l0aW9uKHQpfX0sYWZ0ZXJNb3VzZURvd25UaW1lb3V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWZ1bmN0aW9uKCl7ZS5ob3QuZm9yY2VGdWxsUmVuZGVyPSEwLGUuaG90LnZpZXcucmVuZGVyKCksZS5ob3Qudmlldy53dC53dE92ZXJsYXlzLmFkanVzdEVsZW1lbnRzU2l6ZSghMCl9LG49ZnVuY3Rpb24obixvKXt2YXIgcj1lLmhvdC5ydW5Ib29rcygiYmVmb3JlQ29sdW1uUmVzaXplIixuLGUubmV3U2l6ZSwhMCk7dm9pZCAwIT09ciYmKGUubmV3U2l6ZT1yKSwiYWxsIj09PWUuaG90LmdldFNldHRpbmdzKCkuc3RyZXRjaEg/ZS5jbGVhck1hbnVhbFNpemUobik6ZS5zZXRNYW51YWxTaXplKG4sZS5uZXdTaXplKSxvJiZ0KCksZS5zYXZlTWFudWFsQ29sdW1uV2lkdGhzKCksZS5ob3QucnVuSG9va3MoImFmdGVyQ29sdW1uUmVzaXplIixuLGUubmV3U2l6ZSwhMCl9O2lmKHRoaXMuZGJsY2xpY2s+PTIpe3ZhciBvPXRoaXMuc2VsZWN0ZWRDb2xzLmxlbmd0aDtvPjE/KEModGhpcy5zZWxlY3RlZENvbHMsZnVuY3Rpb24oZSl7bihlKX0pLHQoKSk6Qyh0aGlzLnNlbGVjdGVkQ29scyxmdW5jdGlvbihlKXtuKGUsITApfSl9dGhpcy5kYmxjbGljaz0wLHRoaXMuYXV0b3Jlc2l6ZVRpbWVvdXQ9bnVsbH0sb25Nb3VzZURvd246ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztnKGUudGFyZ2V0LCJtYW51YWxDb2x1bW5SZXNpemVyIikmJih0aGlzLnNldHVwR3VpZGVQb3NpdGlvbigpLHRoaXMucHJlc3NlZD10aGlzLmhvdCxudWxsPT09dGhpcy5hdXRvcmVzaXplVGltZW91dCYmKHRoaXMuYXV0b3Jlc2l6ZVRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB0LmFmdGVyTW91c2VEb3duVGltZW91dCgpfSw1MDApLHRoaXMuaG90Ll9yZWdpc3RlclRpbWVvdXQodGhpcy5hdXRvcmVzaXplVGltZW91dCkpLHRoaXMuZGJsY2xpY2srKyx0aGlzLnN0YXJ0WD1iKGUpLHRoaXMubmV3U2l6ZT10aGlzLnN0YXJ0V2lkdGgpfSxvbk1vdXNlTW92ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMucHJlc3NlZCYmKHRoaXMuY3VycmVudFdpZHRoPXRoaXMuc3RhcnRXaWR0aCsoYihlKS10aGlzLnN0YXJ0WCksQyh0aGlzLnNlbGVjdGVkQ29scyxmdW5jdGlvbihlKXt0Lm5ld1NpemU9dC5zZXRNYW51YWxTaXplKGUsdC5jdXJyZW50V2lkdGgpfSksdGhpcy5yZWZyZXNoSGFuZGxlUG9zaXRpb24oKSx0aGlzLnJlZnJlc2hHdWlkZVBvc2l0aW9uKCkpfSxvbk1vdXNlVXA6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWZ1bmN0aW9uKCl7dC5ob3QuZm9yY2VGdWxsUmVuZGVyPSEwLHQuaG90LnZpZXcucmVuZGVyKCksdC5ob3Qudmlldy53dC53dE92ZXJsYXlzLmFkanVzdEVsZW1lbnRzU2l6ZSghMCl9LG89ZnVuY3Rpb24oZSxvKXt0LmhvdC5ydW5Ib29rcygiYmVmb3JlQ29sdW1uUmVzaXplIixlLHQubmV3U2l6ZSksbyYmbigpLHQuc2F2ZU1hbnVhbENvbHVtbldpZHRocygpLHQuaG90LnJ1bkhvb2tzKCJhZnRlckNvbHVtblJlc2l6ZSIsZSx0Lm5ld1NpemUpfTtpZih0aGlzLnByZXNzZWQpe2lmKHRoaXMuaGlkZUhhbmRsZUFuZEd1aWRlKCksdGhpcy5wcmVzc2VkPSExLHRoaXMubmV3U2l6ZSE9dGhpcy5zdGFydFdpZHRoKXt2YXIgcj10aGlzLnNlbGVjdGVkQ29scy5sZW5ndGg7cj4xPyhDKHRoaXMuc2VsZWN0ZWRDb2xzLGZ1bmN0aW9uKGUpe28oZSl9KSxuKCkpOkModGhpcy5zZWxlY3RlZENvbHMsZnVuY3Rpb24oZSl7byhlLCEwKX0pfXRoaXMuc2V0dXBIYW5kbGVQb3NpdGlvbih0aGlzLmN1cnJlbnRUSCl9fSxiaW5kRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHRoaXMuaG90LnJvb3RFbGVtZW50LCJtb3VzZW92ZXIiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTW91c2VPdmVyKHQpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmhvdC5yb290RWxlbWVudCwibW91c2Vkb3duIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbk1vdXNlRG93bih0KX0pLHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIod2luZG93LCJtb3VzZW1vdmUiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTW91c2VNb3ZlKHQpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csIm1vdXNldXAiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTW91c2VVcCh0KX0pfSxzZXRNYW51YWxTaXplOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9TWF0aC5tYXgodCwyMCksZT10aGlzLmhvdC5ydW5Ib29rcygibW9kaWZ5Q29sIixlKSx0aGlzLm1hbnVhbENvbHVtbldpZHRoc1tlXT10LHR9LGNsZWFyTWFudWFsU2l6ZTpmdW5jdGlvbihlKXtlPXRoaXMuaG90LnJ1bkhvb2tzKCJtb2RpZnlDb2wiLGUpLHRoaXMubWFudWFsQ29sdW1uV2lkdGhzW2VdPXZvaWQgMH0sb25Nb2RpZnlDb2xXaWR0aDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuYWJsZWQmJih0PXRoaXMuaG90LnJ1bkhvb2tzKCJtb2RpZnlDb2wiLHQpLHRoaXMuaG90LmdldFNldHRpbmdzKCkubWFudWFsQ29sdW1uUmVzaXplJiZ0aGlzLm1hbnVhbENvbHVtbldpZHRoc1t0XSk/dGhpcy5tYW51YWxDb2x1bW5XaWR0aHNbdF06ZX0sb25CZWZvcmVTdHJldGNoaW5nQ29sdW1uV2lkdGg6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm1hbnVhbENvbHVtbldpZHRoc1t0XTtyZXR1cm4gdm9pZCAwPT09biYmKG49ZSksbn0sb25CZWZvcmVDb2x1bW5SZXNpemU6ZnVuY3Rpb24oKXt0aGlzLmhvdC52aWV3Lnd0Lnd0Vmlld3BvcnQuaGFzT3ZlcnNpemVkQ29sdW1uSGVhZGVyc01hcmtlZD17fX19LHt9LGQpLFIoIm1hbnVhbENvbHVtblJlc2l6ZSIsUyl9LHsiX2Jhc2UuanMiOjYwLGJyb3dzZXI6MjMsZXZlbnRNYW5hZ2VyOjQxLCJoZWxwZXJzL2FycmF5Ijo0MiwiaGVscGVycy9kb20vZWxlbWVudCI6NDYsImhlbHBlcnMvZG9tL2V2ZW50Ijo0NywiaGVscGVycy9udW1iZXIiOjUxLHBsdWdpbnM6NTl9XSw4MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtNYW51YWxSb3dNb3ZlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTX19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGwsYSx1LGMsaD0obz1lKCJfYmFzZS5qcyIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXSxkPShyPWUoImJyb3dzZXIiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pWyJkZWZhdWx0Il0sZj0oaT1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KSxwPWYuYWRkQ2xhc3MsZz1mLmhhc0NsYXNzLG09Zi5yZW1vdmVDbGFzcyx3PWYub3V0ZXJXaWR0aCx2PShzPWUoImhlbHBlcnMvYXJyYXkiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLHk9di5hcnJheUVhY2gsYj12LmFycmF5TWFwLEM9KGw9ZSgiaGVscGVycy9udW1iZXIiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLnJhbmdlRWFjaCxfPShhPWUoImV2ZW50TWFuYWdlciIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSkuZXZlbnRNYW5hZ2VyLFI9KHU9ZSgiaGVscGVycy9kb20vZXZlbnQiKSx1JiZ1Ll9fZXNNb2R1bGUmJnV8fHsiZGVmYXVsdCI6dX0pLFM9KFIucGFnZVgsUi5wYWdlWSksRT0oYz1lKCJwbHVnaW5zIiksYyYmYy5fX2VzTW9kdWxlJiZjfHx7ImRlZmF1bHQiOmN9KS5yZWdpc3RlclBsdWdpbixUPW5ldyBXZWFrTWFwLE09ZnVuY3Rpb24oZSl7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IoTykuY2FsbCh0aGlzLGUpLFQuc2V0KHRoaXMse2d1aWRlQ2xhc3NOYW1lOiJtYW51YWxSb3dNb3Zlckd1aWRlIixoYW5kbGVDbGFzc05hbWU6Im1hbnVhbFJvd01vdmVyIixzdGFydE9mZnNldDpudWxsLHByZXNzZWQ6bnVsbCxzdGFydFJvdzpudWxsLGVuZFJvdzpudWxsLGN1cnJlbnRSb3c6bnVsbCxzdGFydFg6bnVsbCxzdGFydFk6bnVsbH0pLHRoaXMuZ3VpZGVFbGVtZW50PW51bGwsdGhpcy5oYW5kbGVFbGVtZW50PW51bGwsdGhpcy5jdXJyZW50VEg9bnVsbCx0aGlzLnJvd1Bvc2l0aW9ucz1bXSx0aGlzLmV2ZW50TWFuYWdlcj1fKHRoaXMpfSxPPU07JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKE0se2lzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5tYW51YWxSb3dNb3ZlfSxlbmFibGVQbHVnaW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9VC5nZXQodGhpcyksbj10aGlzLmhvdC5nZXRTZXR0aW5ncygpLm1hbnVhbFJvd01vdmUsbz10aGlzLmxvYWRNYW51YWxSb3dQb3NpdGlvbnMoKTt0aGlzLmhhbmRsZUVsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksdGhpcy5oYW5kbGVFbGVtZW50LmNsYXNzTmFtZT10LmhhbmRsZUNsYXNzTmFtZSx0aGlzLmd1aWRlRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLmd1aWRlRWxlbWVudC5jbGFzc05hbWU9dC5ndWlkZUNsYXNzTmFtZSx0aGlzLmFkZEhvb2soIm1vZGlmeVJvdyIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25Nb2RpZnlSb3codCl9KSx0aGlzLmFkZEhvb2soImFmdGVyUmVtb3ZlUm93IixmdW5jdGlvbih0LG4pe3JldHVybiBlLm9uQWZ0ZXJSZW1vdmVSb3codCxuKX0pLHRoaXMuYWRkSG9vaygiYWZ0ZXJDcmVhdGVSb3ciLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUub25BZnRlckNyZWF0ZVJvdyh0LG4pfSksdGhpcy5hZGRIb29rKCJpbml0IixmdW5jdGlvbigpe3JldHVybiBlLm9uSW5pdCgpfSksdGhpcy5yZWdpc3RlckV2ZW50cygpLCJ1bmRlZmluZWQiIT10eXBlb2Ygbz90aGlzLnJvd1Bvc2l0aW9ucz1vOkFycmF5LmlzQXJyYXkobik/dGhpcy5yb3dQb3NpdGlvbnM9bjpuJiZ2b2lkIDAhPT10aGlzLnJvd1Bvc2l0aW9uc3x8KHRoaXMucm93UG9zaXRpb25zPVtdKSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxPLnByb3RvdHlwZSwiZW5hYmxlUGx1Z2luIikuY2FsbCh0aGlzKX0sdXBkYXRlUGx1Z2luOmZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlUGx1Z2luKCksdGhpcy5lbmFibGVQbHVnaW4oKSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxPLnByb3RvdHlwZSwidXBkYXRlUGx1Z2luIikuY2FsbCh0aGlzKX0sZGlzYWJsZVBsdWdpbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG90LmdldFNldHRpbmdzKCkubWFudWFsUm93TW92ZTtBcnJheS5pc0FycmF5KGUpJiYodGhpcy51bnJlZ2lzdGVyRXZlbnRzKCksdGhpcy5yb3dQb3NpdGlvbnM9W10pLCR0cmFjZXVyUnVudGltZS5zdXBlckdldCh0aGlzLE8ucHJvdG90eXBlLCJkaXNhYmxlUGx1Z2luIikuY2FsbCh0aGlzKX0scmVnaXN0ZXJFdmVudHM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5ob3Qucm9vdEVsZW1lbnQsIm1vdXNlb3ZlciIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25Nb3VzZU92ZXIodCl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHRoaXMuaG90LnJvb3RFbGVtZW50LCJtb3VzZWRvd24iLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTW91c2VEb3duKHQpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csIm1vdXNlbW92ZSIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25Nb3VzZU1vdmUodCl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHdpbmRvdywibW91c2V1cCIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25Nb3VzZVVwKHQpfSl9LHVucmVnaXN0ZXJFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLmV2ZW50TWFuYWdlci5jbGVhcigpfSxzYXZlTWFudWFsUm93UG9zaXRpb25zOmZ1bmN0aW9uKCl7ZC5ob29rcy5ydW4odGhpcy5ob3QsInBlcnNpc3RlbnRTdGF0ZVNhdmUiLCJtYW51YWxSb3dQb3NpdGlvbnMiLHRoaXMucm93UG9zaXRpb25zKX0sbG9hZE1hbnVhbFJvd1Bvc2l0aW9uczpmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiBkLmhvb2tzLnJ1bih0aGlzLmhvdCwicGVyc2lzdGVudFN0YXRlTG9hZCIsIm1hbnVhbFJvd1Bvc2l0aW9ucyIsZSksZS52YWx1ZX0sY29tcGxldGVTZXR0aW5nc0FycmF5OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuaG90LmNvdW50Um93cygpO3RoaXMucm93UG9zaXRpb25zLmxlbmd0aCE9PXQmJkMoMCx0LTEsZnVuY3Rpb24odCl7LTE9PT1lLnJvd1Bvc2l0aW9ucy5pbmRleE9mKHQpJiZlLnJvd1Bvc2l0aW9ucy5wdXNoKHQpfSl9LHNldHVwSGFuZGxlUG9zaXRpb246ZnVuY3Rpb24oZSl7dGhpcy5jdXJyZW50VEg9ZTt2YXIgdD1ULmdldCh0aGlzKSxuPXRoaXMuaG90LnZpZXcud3Qud3RUYWJsZS5nZXRDb29yZHMoZSkucm93LG89dyh0aGlzLmN1cnJlbnRUSCk7aWYobj49MCl7dmFyIHI9dGhpcy5jdXJyZW50VEguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dC5jdXJyZW50Um93PW4sdC5zdGFydE9mZnNldD1yLnRvcCx0aGlzLmhhbmRsZUVsZW1lbnQuc3R5bGUudG9wPXQuc3RhcnRPZmZzZXQrInB4Iix0aGlzLmhhbmRsZUVsZW1lbnQuc3R5bGUubGVmdD1yLmxlZnQrInB4Iix0aGlzLmhhbmRsZUVsZW1lbnQuc3R5bGUud2lkdGg9bysicHgiLHRoaXMuaG90LnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGFuZGxlRWxlbWVudCl9fSxyZWZyZXNoSGFuZGxlUG9zaXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89Njt0PjA/dGhpcy5oYW5kbGVFbGVtZW50LnN0eWxlLnRvcD1uLnRvcCtuLmhlaWdodC1vKyJweCI6dGhpcy5oYW5kbGVFbGVtZW50LnN0eWxlLnRvcD1uLnRvcCsicHgifSxzZXR1cEd1aWRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmN1cnJlbnRUSC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0PVQuZ2V0KHRoaXMpLG49cGFyc2VJbnQodyh0aGlzLmhhbmRsZUVsZW1lbnQpLDEwKSxvPXBhcnNlSW50KHRoaXMuaGFuZGxlRWxlbWVudC5zdHlsZS5sZWZ0LDEwKStuLHI9cGFyc2VJbnQodGhpcy5ob3Qudmlldy5tYXhpbXVtVmlzaWJsZUVsZW1lbnRXaWR0aCgwKSwxMCk7cCh0aGlzLmhhbmRsZUVsZW1lbnQsImFjdGl2ZSIpLHAodGhpcy5ndWlkZUVsZW1lbnQsImFjdGl2ZSIpLHRoaXMuZ3VpZGVFbGVtZW50LnN0eWxlLmhlaWdodD1lLmhlaWdodCsicHgiLHRoaXMuZ3VpZGVFbGVtZW50LnN0eWxlLndpZHRoPXItbisicHgiLHRoaXMuZ3VpZGVFbGVtZW50LnN0eWxlLnRvcD10LnN0YXJ0T2Zmc2V0KyJweCIsdGhpcy5ndWlkZUVsZW1lbnQuc3R5bGUubGVmdD1vKyJweCIsdGhpcy5ob3Qucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5ndWlkZUVsZW1lbnQpfSxyZWZyZXNoR3VpZGVQb3NpdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1ULmdldCh0aGlzKTt0aGlzLmd1aWRlRWxlbWVudC5zdHlsZS50b3A9dC5zdGFydE9mZnNldCtlKyJweCJ9LGhpZGVIYW5kbGVBbmRHdWlkZTpmdW5jdGlvbigpe20odGhpcy5oYW5kbGVFbGVtZW50LCJhY3RpdmUiKSxtKHRoaXMuZ3VpZGVFbGVtZW50LCJhY3RpdmUiKX0sY2hlY2tSb3dIZWFkZXI6ZnVuY3Rpb24oZSl7aWYoZSE9dGhpcy5ob3Qucm9vdEVsZW1lbnQpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4iVEJPRFkiPT09dC50YWdOYW1lPyEwOnRoaXMuY2hlY2tSb3dIZWFkZXIodCl9cmV0dXJuITF9LGNyZWF0ZVBvc2l0aW9uRGF0YTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnJvd1Bvc2l0aW9uczt0Lmxlbmd0aDxlJiZDKHQubGVuZ3RoLGUtMSxmdW5jdGlvbihlKXt0W2VdPWV9KX0sZ2V0VEhGcm9tVGFyZ2V0RWxlbWVudDpmdW5jdGlvbihlKXtyZXR1cm4iVEFCTEUiIT1lLnRhZ05hbWU/IlRIIj09ZS50YWdOYW1lP2U6dGhpcy5nZXRUSEZyb21UYXJnZXRFbGVtZW50KGUucGFyZW50Tm9kZSk6bnVsbH0sY2hhbmdlUm93UG9zaXRpb25zOmZ1bmN0aW9uKGUsdCl7dmFyIG49TWF0aC5tYXgoZSx0KTtuPnRoaXMucm93UG9zaXRpb25zLmxlbmd0aC0xJiZ0aGlzLmNyZWF0ZVBvc2l0aW9uRGF0YShuKzEpLHRoaXMucm93UG9zaXRpb25zLnNwbGljZSh0LDAsdGhpcy5yb3dQb3NpdGlvbnMuc3BsaWNlKGUsMSlbMF0pfSxnZXRWaXNpYmxlUm93SW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+dGhpcy5yb3dQb3NpdGlvbnMubGVuZ3RoLTEmJnRoaXMuY3JlYXRlUG9zaXRpb25EYXRhKGUpLHRoaXMucm93UG9zaXRpb25zLmluZGV4T2YoZSl9LGdldExvZ2ljYWxSb3dJbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yb3dQb3NpdGlvbnNbZV19LG9uTW91c2VPdmVyOmZ1bmN0aW9uKGUpe3ZhciB0PVQuZ2V0KHRoaXMpO2lmKHRoaXMuY2hlY2tSb3dIZWFkZXIoZS50YXJnZXQpKXt2YXIgbj10aGlzLmdldFRIRnJvbVRhcmdldEVsZW1lbnQoZS50YXJnZXQpO24mJih0LnByZXNzZWQ/KHQuZW5kUm93PXRoaXMuaG90LnZpZXcud3Qud3RUYWJsZS5nZXRDb29yZHMobikucm93LHRoaXMucmVmcmVzaEhhbmRsZVBvc2l0aW9uKG4sdC5lbmRSb3ctdC5zdGFydFJvdykpOnRoaXMuc2V0dXBIYW5kbGVQb3NpdGlvbihuKSl9fSxvbk1vdXNlRG93bjpmdW5jdGlvbihlKXt2YXIgdD1ULmdldCh0aGlzKTtnKGUudGFyZ2V0LHQuaGFuZGxlQ2xhc3NOYW1lKSYmKHQuc3RhcnRZPVMoZSksdGhpcy5zZXR1cEd1aWRlUG9zaXRpb24oKSx0LnByZXNzZWQ9dGhpcy5ob3QsdC5zdGFydFJvdz10LmN1cnJlbnRSb3csdC5lbmRSb3c9dC5jdXJyZW50Um93KX0sb25Nb3VzZU1vdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9VC5nZXQodGhpcyk7dC5wcmVzc2VkJiZ0aGlzLnJlZnJlc2hHdWlkZVBvc2l0aW9uKFMoZSktdC5zdGFydFkpfSxvbk1vdXNlVXA6ZnVuY3Rpb24oZSl7dmFyIHQ9VC5nZXQodGhpcyk7dC5wcmVzc2VkJiYodGhpcy5oaWRlSGFuZGxlQW5kR3VpZGUoKSx0LnByZXNzZWQ9ITEsdGhpcy5jcmVhdGVQb3NpdGlvbkRhdGEodGhpcy5ob3QuY291bnRSb3dzKCkpLHRoaXMuY2hhbmdlUm93UG9zaXRpb25zKHQuc3RhcnRSb3csdC5lbmRSb3cpLGQuaG9va3MucnVuKHRoaXMuaG90LCJiZWZvcmVSb3dNb3ZlIix0LnN0YXJ0Um93LHQuZW5kUm93KSx0aGlzLmhvdC5mb3JjZUZ1bGxSZW5kZXI9ITAsdGhpcy5ob3Qudmlldy5yZW5kZXIoKSx0aGlzLnNhdmVNYW51YWxSb3dQb3NpdGlvbnMoKSxkLmhvb2tzLnJ1bih0aGlzLmhvdCwiYWZ0ZXJSb3dNb3ZlIix0LnN0YXJ0Um93LHQuZW5kUm93KSx0aGlzLnNldHVwSGFuZGxlUG9zaXRpb24odGhpcy5jdXJyZW50VEgpKX0sb25Nb2RpZnlSb3c6ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiB0aGlzLmdldFZpc2libGVSb3dJbmRleChlKSYmdGhpcy5jcmVhdGVQb3NpdGlvbkRhdGEoZSsxKSx0aGlzLmdldExvZ2ljYWxSb3dJbmRleChlKX0sb25BZnRlclJlbW92ZVJvdzpmdW5jdGlvbihlLHQpe2lmKHRoaXMuaXNFbmFibGVkKCkpe3ZhciBuLG89dGhpcy5yb3dQb3NpdGlvbnM7bj1vLnNwbGljZShlLHQpLG89YihvLGZ1bmN0aW9uKGUsdCl7dmFyIG89ZTtyZXR1cm4geShuLGZ1bmN0aW9uKHQsbil7ZT50JiZvLS19KSxvfSksdGhpcy5yb3dQb3NpdGlvbnM9b319LG9uQWZ0ZXJDcmVhdGVSb3c6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmlzRW5hYmxlZCgpKXt2YXIgbj10aGlzLnJvd1Bvc2l0aW9ucztpZihuLmxlbmd0aCl7Zm9yKHZhciBvPVtdLHI9MDt0PnI7cisrKW8ucHVzaChlK3IpO2U+PW4ubGVuZ3RoP24uY29uY2F0KG8pOihuPWIobixmdW5jdGlvbihuLG8pe3JldHVybiBuPj1lP24rdDpufSksbi5zcGxpY2UuYXBwbHkobixbZSwwXS5jb25jYXQobykpKSx0aGlzLnJvd1Bvc2l0aW9ucz1ufX19LG9uSW5pdDpmdW5jdGlvbigpe3RoaXMuY29tcGxldGVTZXR0aW5nc0FycmF5KCl9fSx7fSxoKSxFKCJNYW51YWxSb3dNb3ZlIixNKSxkLmhvb2tzLnJlZ2lzdGVyKCJiZWZvcmVSb3dNb3ZlIiksZC5ob29rcy5yZWdpc3RlcigiYWZ0ZXJSb3dNb3ZlIil9LHsiX2Jhc2UuanMiOjYwLGJyb3dzZXI6MjMsZXZlbnRNYW5hZ2VyOjQxLCJoZWxwZXJzL2FycmF5Ijo0MiwiaGVscGVycy9kb20vZWxlbWVudCI6NDYsImhlbHBlcnMvZG9tL2V2ZW50Ijo0NywiaGVscGVycy9udW1iZXIiOjUxLHBsdWdpbnM6NTl9XSw4MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtNYW51YWxSb3dSZXNpemU6e2dldDpmdW5jdGlvbigpe3JldHVybiBTfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIG8scixpLHMsbCxhLHUsYyxoPShvPWUoImJyb3dzZXIiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pWyJkZWZhdWx0Il0sZD0ocj1lKCJfYmFzZS5qcyIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSlbImRlZmF1bHQiXSxmPShpPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLHA9Zi5hZGRDbGFzcyxnPWYuaGFzQ2xhc3MsbT1mLnJlbW92ZUNsYXNzLHc9Zi5vdXRlcldpZHRoLHY9KHM9ZSgiZXZlbnRNYW5hZ2VyIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5ldmVudE1hbmFnZXIseT0obD1lKCJoZWxwZXJzL2RvbS9ldmVudCIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSksYj0oeS5wYWdlWCx5LnBhZ2VZKSxDPShhPWUoImhlbHBlcnMvYXJyYXkiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLmFycmF5RWFjaCxfPSh1PWUoImhlbHBlcnMvbnVtYmVyIiksdSYmdS5fX2VzTW9kdWxlJiZ1fHx7ImRlZmF1bHQiOnV9KS5yYW5nZUVhY2gsUj0oYz1lKCJwbHVnaW5zIiksYyYmYy5fX2VzTW9kdWxlJiZjfHx7ImRlZmF1bHQiOmN9KS5yZWdpc3RlclBsdWdpbixTPWZ1bmN0aW9uKGUpeyR0cmFjZXVyUnVudGltZS5zdXBlckNvbnN0cnVjdG9yKEUpLmNhbGwodGhpcyxlKSx0aGlzLmN1cnJlbnRUSD1udWxsLHRoaXMuY3VycmVudFJvdz1udWxsLHRoaXMuc2VsZWN0ZWRSb3dzPVtdLHRoaXMuY3VycmVudEhlaWdodD1udWxsLHRoaXMubmV3U2l6ZT1udWxsLHRoaXMuc3RhcnRZPW51bGwsdGhpcy5zdGFydEhlaWdodD1udWxsLHRoaXMuc3RhcnRPZmZzZXQ9bnVsbCx0aGlzLmhhbmRsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLmd1aWRlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHRoaXMuZXZlbnRNYW5hZ2VyPXYodGhpcyksdGhpcy5wcmVzc2VkPW51bGwsdGhpcy5kYmxjbGljaz0wLHRoaXMuYXV0b3Jlc2l6ZVRpbWVvdXQ9bnVsbCx0aGlzLm1hbnVhbFJvd0hlaWdodHM9W10scCh0aGlzLmhhbmRsZSwibWFudWFsUm93UmVzaXplciIpLHAodGhpcy5ndWlkZSwibWFudWFsUm93UmVzaXplckd1aWRlIil9LEU9UzskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoUyx7aXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG90LmdldFNldHRpbmdzKCkubWFudWFsUm93UmVzaXplfSxlbmFibGVQbHVnaW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCF0aGlzLmVuYWJsZWQpe3RoaXMubWFudWFsUm93SGVpZ2h0cz1bXTt2YXIgdD10aGlzLmhvdC5nZXRTZXR0aW5ncygpLm1hbnVhbFJvd1Jlc2l6ZSxuPXRoaXMubG9hZE1hbnVhbFJvd0hlaWdodHMoKTsidW5kZWZpbmVkIiE9dHlwZW9mIG4/dGhpcy5tYW51YWxSb3dIZWlnaHRzPW46QXJyYXkuaXNBcnJheSh0KT90aGlzLm1hbnVhbFJvd0hlaWdodHM9dDp0aGlzLm1hbnVhbFJvd0hlaWdodHM9W10sdGhpcy5hZGRIb29rKCJtb2RpZnlSb3dIZWlnaHQiLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUub25Nb2RpZnlSb3dIZWlnaHQodCxuKX0pLGguaG9va3MucmVnaXN0ZXIoImJlZm9yZVJvd1Jlc2l6ZSIpLGguaG9va3MucmVnaXN0ZXIoImFmdGVyUm93UmVzaXplIiksdGhpcy5iaW5kRXZlbnRzKCksJHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsRS5wcm90b3R5cGUsImVuYWJsZVBsdWdpbiIpLmNhbGwodGhpcyl9fSx1cGRhdGVQbHVnaW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmhvdC5nZXRTZXR0aW5ncygpLm1hbnVhbFJvd1Jlc2l6ZTtBcnJheS5pc0FycmF5KGUpP3RoaXMubWFudWFsUm93SGVpZ2h0cz1lOmV8fCh0aGlzLm1hbnVhbFJvd0hlaWdodHM9W10pfSxkaXNhYmxlUGx1Z2luOmZ1bmN0aW9uKCl7JHRyYWNldXJSdW50aW1lLnN1cGVyR2V0KHRoaXMsRS5wcm90b3R5cGUsImRpc2FibGVQbHVnaW4iKS5jYWxsKHRoaXMpfSxzYXZlTWFudWFsUm93SGVpZ2h0czpmdW5jdGlvbigpe3RoaXMuaG90LnJ1bkhvb2tzKCJwZXJzaXN0ZW50U3RhdGVTYXZlIiwibWFudWFsUm93SGVpZ2h0cyIsdGhpcy5tYW51YWxSb3dIZWlnaHRzKX0sbG9hZE1hbnVhbFJvd0hlaWdodHM6ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4gdGhpcy5ob3QucnVuSG9va3MoInBlcnNpc3RlbnRTdGF0ZUxvYWQiLCJtYW51YWxSb3dIZWlnaHRzIixlKSxlLnZhbHVlfSxzZXR1cEhhbmRsZVBvc2l0aW9uOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5jdXJyZW50VEg9ZTt2YXIgbj10aGlzLmhvdC52aWV3Lnd0Lnd0VGFibGUuZ2V0Q29vcmRzKGUpLnJvdyxvPXcodGhpcy5jdXJyZW50VEgpO2lmKG4+PTApe3ZhciByPXRoaXMuY3VycmVudFRILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKHRoaXMuY3VycmVudFJvdz1uLHRoaXMuc2VsZWN0ZWRSb3dzPVtdLHRoaXMuaG90LnNlbGVjdGlvbi5pc1NlbGVjdGVkKCkmJnRoaXMuaG90LnNlbGVjdGlvbi5zZWxlY3RlZEhlYWRlci5yb3dzKXt2YXIgaT10aGlzLmhvdC5nZXRTZWxlY3RlZFJhbmdlKCkscz1pLmZyb20sbD1pLnRvLGE9cy5yb3csdT1sLnJvdzthPj11JiYoYT1sLnJvdyx1PXMucm93KSx0aGlzLmN1cnJlbnRSb3c+PWEmJnRoaXMuY3VycmVudFJvdzw9dT9fKGEsdSxmdW5jdGlvbihlKXtyZXR1cm4gdC5zZWxlY3RlZFJvd3MucHVzaChlKX0pOnRoaXMuc2VsZWN0ZWRSb3dzLnB1c2godGhpcy5jdXJyZW50Um93KX1lbHNlIHRoaXMuc2VsZWN0ZWRSb3dzLnB1c2godGhpcy5jdXJyZW50Um93KTt0aGlzLnN0YXJ0T2Zmc2V0PXIudG9wLTYsdGhpcy5zdGFydEhlaWdodD1wYXJzZUludChyLmhlaWdodCwxMCksdGhpcy5oYW5kbGUuc3R5bGUubGVmdD1yLmxlZnQrInB4Iix0aGlzLmhhbmRsZS5zdHlsZS50b3A9dGhpcy5zdGFydE9mZnNldCt0aGlzLnN0YXJ0SGVpZ2h0KyJweCIsdGhpcy5oYW5kbGUuc3R5bGUud2lkdGg9bysicHgiLHRoaXMuaG90LnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGFuZGxlKX19LHJlZnJlc2hIYW5kbGVQb3NpdGlvbjpmdW5jdGlvbigpe3RoaXMuaGFuZGxlLnN0eWxlLnRvcD10aGlzLnN0YXJ0T2Zmc2V0K3RoaXMuY3VycmVudEhlaWdodCsicHgifSxzZXR1cEd1aWRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgZT1wYXJzZUludCh3KHRoaXMuaGFuZGxlKSwxMCksdD1wYXJzZUludCh0aGlzLmhhbmRsZS5zdHlsZS5sZWZ0LDEwKStlLG49cGFyc2VJbnQodGhpcy5ob3Qudmlldy5tYXhpbXVtVmlzaWJsZUVsZW1lbnRXaWR0aCgwKSwxMCk7cCh0aGlzLmhhbmRsZSwiYWN0aXZlIikscCh0aGlzLmd1aWRlLCJhY3RpdmUiKSx0aGlzLmd1aWRlLnN0eWxlLnRvcD10aGlzLmhhbmRsZS5zdHlsZS50b3AsdGhpcy5ndWlkZS5zdHlsZS5sZWZ0PXQrInB4Iix0aGlzLmd1aWRlLnN0eWxlLndpZHRoPW4tZSsicHgiLHRoaXMuaG90LnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZ3VpZGUpfSxyZWZyZXNoR3VpZGVQb3NpdGlvbjpmdW5jdGlvbigpe3RoaXMuZ3VpZGUuc3R5bGUudG9wPXRoaXMuaGFuZGxlLnN0eWxlLnRvcH0saGlkZUhhbmRsZUFuZEd1aWRlOmZ1bmN0aW9uKCl7bSh0aGlzLmhhbmRsZSwiYWN0aXZlIiksbSh0aGlzLmd1aWRlLCJhY3RpdmUiKX0sY2hlY2tJZlJvd0hlYWRlcjpmdW5jdGlvbihlKXtpZihlIT10aGlzLmhvdC5yb290RWxlbWVudCl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiJUQk9EWSI9PT10LnRhZ05hbWU/ITA6dGhpcy5jaGVja0lmUm93SGVhZGVyKHQpfXJldHVybiExfSxnZXRUSEZyb21UYXJnZXRFbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiJUQUJMRSIhPWUudGFnTmFtZT8iVEgiPT1lLnRhZ05hbWU/ZTp0aGlzLmdldFRIRnJvbVRhcmdldEVsZW1lbnQoZS5wYXJlbnROb2RlKTpudWxsfSxvbk1vdXNlT3ZlcjpmdW5jdGlvbihlKXtpZih0aGlzLmNoZWNrSWZSb3dIZWFkZXIoZS50YXJnZXQpKXt2YXIgdD10aGlzLmdldFRIRnJvbVRhcmdldEVsZW1lbnQoZS50YXJnZXQpO3QmJih0aGlzLnByZXNzZWR8fHRoaXMuc2V0dXBIYW5kbGVQb3NpdGlvbih0KSl9fSxhZnRlck1vdXNlRG93blRpbWVvdXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZnVuY3Rpb24oKXtlLmhvdC5mb3JjZUZ1bGxSZW5kZXI9ITAsZS5ob3Qudmlldy5yZW5kZXIoKSxlLmhvdC52aWV3Lnd0Lnd0T3ZlcmxheXMuYWRqdXN0RWxlbWVudHNTaXplKCEwKX0sbj1mdW5jdGlvbihuLG8pe3ZhciByPWUuaG90LnJ1bkhvb2tzKCJiZWZvcmVSb3dSZXNpemUiLG4sZS5uZXdTaXplLCEwKTt2b2lkIDAhPT1yJiYoZS5uZXdTaXplPXIpLGUuc2V0TWFudWFsU2l6ZShuLGUubmV3U2l6ZSksbyYmdCgpLGUuaG90LnJ1bkhvb2tzKCJhZnRlclJvd1Jlc2l6ZSIsbixlLm5ld1NpemUsITApfTtpZih0aGlzLmRibGNsaWNrPj0yKXt2YXIgbz10aGlzLnNlbGVjdGVkUm93cy5sZW5ndGg7bz4xPyhDKHRoaXMuc2VsZWN0ZWRSb3dzLGZ1bmN0aW9uKGUpe24oZSl9KSx0KCkpOkModGhpcy5zZWxlY3RlZFJvd3MsZnVuY3Rpb24oZSl7bihlLCEwKX0pfXRoaXMuZGJsY2xpY2s9MCx0aGlzLmF1dG9yZXNpemVUaW1lb3V0PW51bGx9LG9uTW91c2VEb3duOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZyhlLnRhcmdldCwibWFudWFsUm93UmVzaXplciIpJiYodGhpcy5zZXR1cEd1aWRlUG9zaXRpb24oKSx0aGlzLnByZXNzZWQ9dGhpcy5ob3QsbnVsbD09dGhpcy5hdXRvcmVzaXplVGltZW91dCYmKHRoaXMuYXV0b3Jlc2l6ZVRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB0LmFmdGVyTW91c2VEb3duVGltZW91dCgpfSw1MDApLHRoaXMuaG90Ll9yZWdpc3RlclRpbWVvdXQodGhpcy5hdXRvcmVzaXplVGltZW91dCkpLHRoaXMuZGJsY2xpY2srKyx0aGlzLnN0YXJ0WT1iKGUpLHRoaXMubmV3U2l6ZT10aGlzLnN0YXJ0SGVpZ2h0KX0sb25Nb3VzZU1vdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLnByZXNzZWQmJih0aGlzLmN1cnJlbnRIZWlnaHQ9dGhpcy5zdGFydEhlaWdodCsoYihlKS10aGlzLnN0YXJ0WSksQyh0aGlzLnNlbGVjdGVkUm93cyxmdW5jdGlvbihlKXt0Lm5ld1NpemU9dC5zZXRNYW51YWxTaXplKGUsdC5jdXJyZW50SGVpZ2h0KX0pLHRoaXMucmVmcmVzaEhhbmRsZVBvc2l0aW9uKCksdGhpcy5yZWZyZXNoR3VpZGVQb3NpdGlvbigpKX0sb25Nb3VzZVVwOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1mdW5jdGlvbigpe3QuaG90LmZvcmNlRnVsbFJlbmRlcj0hMCx0LmhvdC52aWV3LnJlbmRlcigpLHQuaG90LnZpZXcud3Qud3RPdmVybGF5cy5hZGp1c3RFbGVtZW50c1NpemUoITApfSxvPWZ1bmN0aW9uKGUsbyl7dC5ob3QucnVuSG9va3MoImJlZm9yZVJvd1Jlc2l6ZSIsZSx0Lm5ld1NpemUpLG8mJm4oKSx0LnNhdmVNYW51YWxSb3dIZWlnaHRzKCksdC5ob3QucnVuSG9va3MoImFmdGVyUm93UmVzaXplIixlLHQubmV3U2l6ZSl9O2lmKHRoaXMucHJlc3NlZCl7aWYodGhpcy5oaWRlSGFuZGxlQW5kR3VpZGUoKSx0aGlzLnByZXNzZWQ9ITEsdGhpcy5uZXdTaXplIT10aGlzLnN0YXJ0SGVpZ2h0KXt2YXIgcj10aGlzLnNlbGVjdGVkUm93cy5sZW5ndGg7cj4xPyhDKHRoaXMuc2VsZWN0ZWRSb3dzLGZ1bmN0aW9uKGUpe28oZSl9KSxuKCkpOkModGhpcy5zZWxlY3RlZFJvd3MsZnVuY3Rpb24oZSl7byhlLCEwKX0pfXRoaXMuc2V0dXBIYW5kbGVQb3NpdGlvbih0aGlzLmN1cnJlbnRUSCl9fSxiaW5kRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHRoaXMuaG90LnJvb3RFbGVtZW50LCJtb3VzZW92ZXIiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTW91c2VPdmVyKHQpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmhvdC5yb290RWxlbWVudCwibW91c2Vkb3duIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbk1vdXNlRG93bih0KX0pLHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIod2luZG93LCJtb3VzZW1vdmUiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTW91c2VNb3ZlKHQpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csIm1vdXNldXAiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTW91c2VVcCh0KX0pfSxzZXRNYW51YWxTaXplOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9dGhpcy5ob3QucnVuSG9va3MoIm1vZGlmeVJvdyIsZSksdGhpcy5tYW51YWxSb3dIZWlnaHRzW2VdPXQsdH0sb25Nb2RpZnlSb3dIZWlnaHQ6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmVuYWJsZWQpe3ZhciBuPXRoaXMuaG90LmdldFBsdWdpbigiYXV0b1Jvd1NpemUiKSxvPW4/bi5oZWlnaHRzW3RdOm51bGw7dD10aGlzLmhvdC5ydW5Ib29rcygibW9kaWZ5Um93Iix0KTt2YXIgcj10aGlzLm1hbnVhbFJvd0hlaWdodHNbdF07aWYodm9pZCAwIT09ciYmKHI9PT1vfHxyPihlfHwwKSkpcmV0dXJuIHJ9cmV0dXJuIGV9fSx7fSxkKSxSKCJtYW51YWxSb3dSZXNpemUiLFMpfSx7Il9iYXNlLmpzIjo2MCxicm93c2VyOjIzLGV2ZW50TWFuYWdlcjo0MSwiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL2RvbS9ldmVudCI6NDcsImhlbHBlcnMvbnVtYmVyIjo1MSxwbHVnaW5zOjU5fV0sODM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbygpe3ZhciBlPVtdO3JldHVybiBlLmdldEluZm89ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxvPXRoaXMubGVuZ3RoO28+bjtuKyspaWYodGhpc1tuXS5yb3c8PWUmJnRoaXNbbl0ucm93K3RoaXNbbl0ucm93c3Bhbi0xPj1lJiZ0aGlzW25dLmNvbDw9dCYmdGhpc1tuXS5jb2wrdGhpc1tuXS5jb2xzcGFuLTE+PXQpcmV0dXJuIHRoaXNbbl19LGUuc2V0SW5mbz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXRoaXMubGVuZ3RoO24+dDt0KyspaWYodGhpc1t0XS5yb3c9PT1lLnJvdyYmdGhpc1t0XS5jb2w9PT1lLmNvbClyZXR1cm4gdm9pZCh0aGlzW3RdPWUpO3RoaXMucHVzaChlKX0sZS5yZW1vdmVJbmZvPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAsbz10aGlzLmxlbmd0aDtvPm47bisrKWlmKHRoaXNbbl0ucm93PT09ZSYmdGhpc1tuXS5jb2w9PT10KXt0aGlzLnNwbGljZShuLDEpO2JyZWFrfX0sZX1mdW5jdGlvbiByKGUpe2lmKHRoaXMubWVyZ2VkQ2VsbEluZm9Db2xsZWN0aW9uPW5ldyBvLEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTAsbj1lLmxlbmd0aDtuPnQ7dCsrKXRoaXMubWVyZ2VkQ2VsbEluZm9Db2xsZWN0aW9uLnNldEluZm8oZVt0XSl9ZnVuY3Rpb24gaShlLHQpe3ZhciBuPXRoaXMuZ2V0U2V0dGluZ3MoKS5tZXJnZUNlbGxzO2lmKG4mJiF0aGlzLnNlbGVjdGlvbi5pc011bHRpcGxlKCkpe3ZhciBvPXRoaXMubWVyZ2VDZWxscy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb24uZ2V0SW5mbyhlWzBdLGVbMV0pO28mJihlWzBdPW8ucm93LGVbMV09by5jb2wsZVsyXT1vLnJvdytvLnJvd3NwYW4tMSxlWzNdPW8uY29sK28uY29sc3Bhbi0xKX19ZnVuY3Rpb24gcyhlLHQpe3RoaXMubWVyZ2VDZWxscyYmdGhpcy5tZXJnZUNlbGxzLnNoaWZ0Q29sbGVjdGlvbigicmlnaHQiLGUsdCl9ZnVuY3Rpb24gbChlLHQpe3RoaXMubWVyZ2VDZWxscyYmdGhpcy5tZXJnZUNlbGxzLnNoaWZ0Q29sbGVjdGlvbigibGVmdCIsZSx0KX1mdW5jdGlvbiBhKGUsdCl7dGhpcy5tZXJnZUNlbGxzJiZ0aGlzLm1lcmdlQ2VsbHMuc2hpZnRDb2xsZWN0aW9uKCJkb3duIixlLHQpfWZ1bmN0aW9uIHUoZSx0KXt0aGlzLm1lcmdlQ2VsbHMmJnRoaXMubWVyZ2VDZWxscy5zaGlmdENvbGxlY3Rpb24oInVwIixlLHQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se01lcmdlQ2VsbHM6e2dldDpmdW5jdGlvbigpe3JldHVybiByfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIGMsaCxkLGYscCxnLG09KGM9ZSgiYnJvd3NlciIpLGMmJmMuX19lc01vZHVsZSYmY3x8eyJkZWZhdWx0IjpjfSlbImRlZmF1bHQiXSx3PSgoaD1lKCJwbHVnaW5zIiksaCYmaC5fX2VzTW9kdWxlJiZofHx7ImRlZmF1bHQiOmh9KS5yZWdpc3RlclBsdWdpbiwoZD1lKCJoZWxwZXJzL2RvbS9ldmVudCIpLGQmJmQuX19lc01vZHVsZSYmZHx8eyJkZWZhdWx0IjpkfSkuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSx2PShmPWUoIjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9jZWxsL2Nvb3JkcyIpLGYmJmYuX19lc01vZHVsZSYmZnx8eyJkZWZhdWx0IjpmfSkuV2Fsa29udGFibGVDZWxsQ29vcmRzLHk9KHA9ZSgiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL2NlbGwvcmFuZ2UiKSxwJiZwLl9fZXNNb2R1bGUmJnB8fHsiZGVmYXVsdCI6cH0pLldhbGtvbnRhYmxlQ2VsbFJhbmdlLGI9KGc9ZSgiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL3RhYmxlIiksZyYmZy5fX2VzTW9kdWxlJiZnfHx7ImRlZmF1bHQiOmd9KS5XYWxrb250YWJsZVRhYmxlO3IucHJvdG90eXBlLmNhbk1lcmdlUmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIWUuaXNTaW5nbGUoKX0sci5wcm90b3R5cGUubWVyZ2VSYW5nZT1mdW5jdGlvbihlKXtpZih0aGlzLmNhbk1lcmdlUmFuZ2UoZSkpe3ZhciB0PWUuZ2V0VG9wTGVmdENvcm5lcigpLG49ZS5nZXRCb3R0b21SaWdodENvcm5lcigpLG89e307by5yb3c9dC5yb3csby5jb2w9dC5jb2wsby5yb3dzcGFuPW4ucm93LXQucm93KzEsby5jb2xzcGFuPW4uY29sLXQuY29sKzEsdGhpcy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb24uc2V0SW5mbyhvKX19LHIucHJvdG90eXBlLm1lcmdlT3JVbm1lcmdlU2VsZWN0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubWVyZ2VkQ2VsbEluZm9Db2xsZWN0aW9uLmdldEluZm8oZS5mcm9tLnJvdyxlLmZyb20uY29sKTt0P3RoaXMudW5tZXJnZVNlbGVjdGlvbihlLmZyb20pOnRoaXMubWVyZ2VTZWxlY3Rpb24oZSl9LHIucHJvdG90eXBlLm1lcmdlU2VsZWN0aW9uPWZ1bmN0aW9uKGUpe3RoaXMubWVyZ2VSYW5nZShlKX0sci5wcm90b3R5cGUudW5tZXJnZVNlbGVjdGlvbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLm1lcmdlZENlbGxJbmZvQ29sbGVjdGlvbi5nZXRJbmZvKGUucm93LGUuY29sKTt0aGlzLm1lcmdlZENlbGxJbmZvQ29sbGVjdGlvbi5yZW1vdmVJbmZvKHQucm93LHQuY29sKX0sci5wcm90b3R5cGUuYXBwbHlTcGFuUHJvcGVydGllcz1mdW5jdGlvbihlLHQsbil7dmFyIG89dGhpcy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb24uZ2V0SW5mbyh0LG4pO28/by5yb3c9PT10JiZvLmNvbD09PW4/KGUuc2V0QXR0cmlidXRlKCJyb3dzcGFuIixvLnJvd3NwYW4pLGUuc2V0QXR0cmlidXRlKCJjb2xzcGFuIixvLmNvbHNwYW4pKTooZS5yZW1vdmVBdHRyaWJ1dGUoInJvd3NwYW4iKSxlLnJlbW92ZUF0dHJpYnV0ZSgiY29sc3BhbiIpLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpOihlLnJlbW92ZUF0dHJpYnV0ZSgicm93c3BhbiIpLGUucmVtb3ZlQXR0cmlidXRlKCJjb2xzcGFuIikpfSxyLnByb3RvdHlwZS5tb2RpZnlUcmFuc2Zvcm09ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQucm93Pj1lLnJvdyYmdC5yb3c8PWUucm93K2Uucm93c3Bhbi0xfSxyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuY29sPj1lLmNvbCYmdC5jb2w8PWUuY29sK2UuY29sc3Bhbi0xfSxpPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdih0LnRvLnJvdytlLnJvdyx0LnRvLmNvbCtlLmNvbCl9LHM9e3JvdzpuLnJvdyxjb2w6bi5jb2x9O2lmKCJtb2RpZnlUcmFuc2Zvcm1TdGFydCI9PWUpe3RoaXMubGFzdERlc2lyZWRDb29yZHN8fCh0aGlzLmxhc3REZXNpcmVkQ29vcmRzPW5ldyB2KG51bGwsbnVsbCkpO2Zvcih2YXIgbCxhPW5ldyB2KHQuaGlnaGxpZ2h0LnJvdyx0LmhpZ2hsaWdodC5jb2wpLHU9dGhpcy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb24uZ2V0SW5mbyhhLnJvdyxhLmNvbCksYz0wLGg9dGhpcy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb24ubGVuZ3RoO2g+YztjKyspe3ZhciBkPXRoaXMubWVyZ2VkQ2VsbEluZm9Db2xsZWN0aW9uW2NdO2lmKGQ9bmV3IHYoZC5yb3crZC5yb3dzcGFuLTEsZC5jb2wrZC5jb2xzcGFuLTEpLHQuaW5jbHVkZXMoZCkpe2w9ITA7YnJlYWt9fWlmKHUpe3ZhciBmPW5ldyB2KHUucm93LHUuY29sKSxwPW5ldyB2KHUucm93K3Uucm93c3Bhbi0xLHUuY29sK3UuY29sc3Bhbi0xKSxnPW5ldyB5KGYsZixwKTtnLmluY2x1ZGVzKHRoaXMubGFzdERlc2lyZWRDb29yZHMpfHwodGhpcy5sYXN0RGVzaXJlZENvb3Jkcz1uZXcgdihudWxsLG51bGwpKSxzLnJvdz10aGlzLmxhc3REZXNpcmVkQ29vcmRzLnJvdz90aGlzLmxhc3REZXNpcmVkQ29vcmRzLnJvdy1hLnJvdzpzLnJvdyxzLmNvbD10aGlzLmxhc3REZXNpcmVkQ29vcmRzLmNvbD90aGlzLmxhc3REZXNpcmVkQ29vcmRzLmNvbC1hLmNvbDpzLmNvbCxuLnJvdz4wP3Mucm93PXUucm93K3Uucm93c3Bhbi0xLWEucm93K24ucm93Om4ucm93PDAmJihzLnJvdz1hLnJvdy11LnJvdytuLnJvdyksbi5jb2w+MD9zLmNvbD11LmNvbCt1LmNvbHNwYW4tMS1hLmNvbCtuLmNvbDpuLmNvbDwwJiYocy5jb2w9YS5jb2wtdS5jb2wrbi5jb2wpfXZhciBtPW5ldyB2KHQuaGlnaGxpZ2h0LnJvdytzLnJvdyx0LmhpZ2hsaWdodC5jb2wrcy5jb2wpLHc9dGhpcy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb24uZ2V0SW5mbyhtLnJvdyxtLmNvbCk7dyYmKHRoaXMubGFzdERlc2lyZWRDb29yZHM9bSxzPXtyb3c6dy5yb3ctYS5yb3csY29sOncuY29sLWEuY29sfSl9ZWxzZSBpZigibW9kaWZ5VHJhbnNmb3JtRW5kIj09ZSlmb3IodmFyIGM9MCxoPXRoaXMubWVyZ2VkQ2VsbEluZm9Db2xsZWN0aW9uLmxlbmd0aDtoPmM7YysrKXt2YXIgYj10aGlzLm1lcmdlZENlbGxJbmZvQ29sbGVjdGlvbltjXSxmPW5ldyB2KGIucm93LGIuY29sKSxwPW5ldyB2KGIucm93K2Iucm93c3Bhbi0xLGIuY29sK2IuY29sc3Bhbi0xKSxDPW5ldyB5KGYsZixwKSxfPXQuZ2V0Qm9yZGVyc1NoYXJlZFdpdGgoQyk7aWYoQy5pc0VxdWFsKHQpKXQuc2V0RGlyZWN0aW9uKCJOVy1TRSIpO2Vsc2UgaWYoXy5sZW5ndGg+MCl7dmFyIFI9dC5oaWdobGlnaHQuaXNFcXVhbChDLmZyb20pO18uaW5kZXhPZigidG9wIik+LTE/dC50by5pc1NvdXRoRWFzdE9mKEMuZnJvbSkmJlI/dC5zZXREaXJlY3Rpb24oIk5XLVNFIik6dC50by5pc1NvdXRoV2VzdE9mKEMuZnJvbSkmJlImJnQuc2V0RGlyZWN0aW9uKCJORS1TVyIpOl8uaW5kZXhPZigiYm90dG9tIik+LTEmJih0LnRvLmlzTm9ydGhFYXN0T2YoQy5mcm9tKSYmUj90LnNldERpcmVjdGlvbigiU1ctTkUiKTp0LnRvLmlzTm9ydGhXZXN0T2YoQy5mcm9tKSYmUiYmdC5zZXREaXJlY3Rpb24oIlNFLU5XIikpfXZhciBtPWkocyksUz1vKGIsbSksRT1yKGIsbSk7dC5pbmNsdWRlc1JhbmdlKEMpJiYoQy5pbmNsdWRlcyhtKXx8U3x8RSkmJihTJiYocy5yb3c8MD9zLnJvdy09Yi5yb3dzcGFuLTE6cy5yb3c+MCYmKHMucm93Kz1iLnJvd3NwYW4tMSkpLEUmJihzLmNvbDwwP3MuY29sLT1iLmNvbHNwYW4tMTpzLmNvbD4wJiYocy5jb2wrPWIuY29sc3Bhbi0xKSkpfTAhPT1zLnJvdyYmKG4ucm93PXMucm93KSwwIT09cy5jb2wmJihuLmNvbD1zLmNvbCl9LHIucHJvdG90eXBlLnNoaWZ0Q29sbGVjdGlvbj1mdW5jdGlvbihlLHQsbil7dmFyIG89WzAsMF07c3dpdGNoKGUpe2Nhc2UicmlnaHQiOm9bMF0rPTE7YnJlYWs7Y2FzZSJsZWZ0IjpvWzBdLT0xO2JyZWFrO2Nhc2UiZG93biI6b1sxXSs9MTticmVhaztjYXNlInVwIjpvWzFdLT0xfWZvcih2YXIgcj0wO3I8dGhpcy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb24ubGVuZ3RoO3IrKyl7dmFyIGk9dGhpcy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb25bcl07InJpZ2h0Ij09PWV8fCJsZWZ0Ij09PWU/dDw9aS5jb2wmJihpLmNvbCs9b1swXSk6dDw9aS5yb3cmJihpLnJvdys9b1sxXSl9fTt2YXIgQz1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLmdldFNldHRpbmdzKCkubWVyZ2VDZWxsczt0JiYoZS5tZXJnZUNlbGxzfHwoZS5tZXJnZUNlbGxzPW5ldyByKHQpKSl9LF89ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UubWVyZ2VDZWxscyYmKGUudmlldy53dC53dFRhYmxlLmdldENlbGw9ZnVuY3Rpb24odCl7aWYoZS5nZXRTZXR0aW5ncygpLm1lcmdlQ2VsbHMpe3ZhciBuPWUubWVyZ2VDZWxscy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb24uZ2V0SW5mbyh0LnJvdyx0LmNvbCk7biYmKHQ9bil9cmV0dXJuIGIucHJvdG90eXBlLmdldENlbGwuY2FsbCh0aGlzLHQpfSl9LFI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS5nZXRTZXR0aW5ncygpLm1lcmdlQ2VsbHM7aWYodClpZihlLm1lcmdlQ2VsbHMpe2lmKGUubWVyZ2VDZWxscy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb249bmV3IG8sQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIG49MCxpPXQubGVuZ3RoO2k+bjtuKyspZS5tZXJnZUNlbGxzLm1lcmdlZENlbGxJbmZvQ29sbGVjdGlvbi5zZXRJbmZvKHRbbl0pfWVsc2UgZS5tZXJnZUNlbGxzPW5ldyByKHQpO2Vsc2UgZS5tZXJnZUNlbGxzJiYoZS5tZXJnZUNlbGxzLm1lcmdlZENlbGxJbmZvQ29sbGVjdGlvbj1uZXcgbyl9LFM9ZnVuY3Rpb24oZSl7aWYodGhpcy5tZXJnZUNlbGxzKXt2YXIgdD0oZS5jdHJsS2V5fHxlLm1ldGFLZXkpJiYhZS5hbHRLZXk7dCYmNzc9PT1lLmtleUNvZGUmJih0aGlzLm1lcmdlQ2VsbHMubWVyZ2VPclVubWVyZ2VTZWxlY3Rpb24odGhpcy5nZXRTZWxlY3RlZFJhbmdlKCkpLHRoaXMucmVuZGVyKCksdyhlKSl9fSxFPWZ1bmN0aW9uKGUpe3RoaXMuZ2V0U2V0dGluZ3MoKS5tZXJnZUNlbGxzJiYoZS5pdGVtcy5wdXNoKG0ucGx1Z2lucy5Db250ZXh0TWVudS5TRVBBUkFUT1IpLGUuaXRlbXMucHVzaCh7a2V5OiJtZXJnZUNlbGxzIixuYW1lOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTZWxlY3RlZCgpLHQ9dGhpcy5tZXJnZUNlbGxzLm1lcmdlZENlbGxJbmZvQ29sbGVjdGlvbi5nZXRJbmZvKGVbMF0sZVsxXSk7cmV0dXJuIHQ/IlVubWVyZ2UgY2VsbHMiOiJNZXJnZSBjZWxscyJ9LGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tZXJnZUNlbGxzLm1lcmdlT3JVbm1lcmdlU2VsZWN0aW9uKHRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSgpKSx0aGlzLnJlbmRlcigpfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiExfX0pKX0sVD1mdW5jdGlvbihlLHQsbixvLHIsaSl7dGhpcy5tZXJnZUNlbGxzJiZ0aGlzLm1lcmdlQ2VsbHMuYXBwbHlTcGFuUHJvcGVydGllcyhlLHQsbil9LE09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuZ2V0U2V0dGluZ3MoKS5tZXJnZUNlbGxzO2lmKG4pe3ZhciBvPXRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSgpO2lmKHRoaXMubWVyZ2VDZWxscy5tb2RpZnlUcmFuc2Zvcm0oZSxvLHQpLCJtb2RpZnlUcmFuc2Zvcm1FbmQiPT09ZSl7dmFyIHI9dGhpcy5jb3VudFJvd3MoKSxpPXRoaXMuY291bnRDb2xzKCk7by5mcm9tLnJvdzwwP28uZnJvbS5yb3c9MDpvLmZyb20ucm93PjAmJm8uZnJvbS5yb3c+PXImJihvLmZyb20ucm93PW8uZnJvbS0xKSxvLmZyb20uY29sPDA/by5mcm9tLmNvbD0wOm8uZnJvbS5jb2w+MCYmby5mcm9tLmNvbD49aSYmKG8uZnJvbS5jb2w9aS0xKX19fX0sTz1mdW5jdGlvbihlKXt0aGlzLmxhc3REZXNpcmVkQ29vcmRzPW51bGw7dmFyIHQ9dGhpcy5nZXRTZXR0aW5ncygpLm1lcmdlQ2VsbHM7aWYodCl7dmFyIG49dGhpcy5nZXRTZWxlY3RlZFJhbmdlKCk7bi5oaWdobGlnaHQ9bmV3IHYobi5oaWdobGlnaHQucm93LG4uaGlnaGxpZ2h0LmNvbCksbi50bz1lO3ZhciBvPSExO2Rve289ITE7Zm9yKHZhciByPTAsaT10aGlzLm1lcmdlQ2VsbHMubWVyZ2VkQ2VsbEluZm9Db2xsZWN0aW9uLmxlbmd0aDtpPnI7cisrKXt2YXIgcz10aGlzLm1lcmdlQ2VsbHMubWVyZ2VkQ2VsbEluZm9Db2xsZWN0aW9uW3JdLGw9bmV3IHYocy5yb3cscy5jb2wpLGE9bmV3IHYocy5yb3crcy5yb3dzcGFuLTEscy5jb2wrcy5jb2xzcGFuLTEpLHU9bmV3IHkobCxsLGEpO24uZXhwYW5kQnlSYW5nZSh1KSYmKGUucm93PW4udG8ucm93LGUuY29sPW4udG8uY29sLG89ITApfX13aGlsZShvKX19LGs9ZnVuY3Rpb24oZSx0KXtpZih0JiYiYXJlYSI9PXQpe3ZhciBuPXRoaXMuZ2V0U2V0dGluZ3MoKS5tZXJnZUNlbGxzO2lmKG4pZm9yKHZhciBvPXRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSgpLHI9bmV3IHkoby5mcm9tLG8uZnJvbSxvLmZyb20pLGk9bmV3IHkoby50byxvLnRvLG8udG8pLHM9MCxsPXRoaXMubWVyZ2VDZWxscy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb24ubGVuZ3RoO2w+cztzKyspe3ZhciBhPXRoaXMubWVyZ2VDZWxscy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb25bc10sdT1uZXcgdihhLnJvdyxhLmNvbCksYz1uZXcgdihhLnJvdythLnJvd3NwYW4tMSxhLmNvbCthLmNvbHNwYW4tMSksaD1uZXcgeSh1LHUsYyk7ci5leHBhbmRCeVJhbmdlKGgpJiYoZVswXT1yLmZyb20ucm93LGVbMV09ci5mcm9tLmNvbCksaS5leHBhbmRCeVJhbmdlKGgpJiYoZVsyXT1pLmZyb20ucm93LGVbM109aS5mcm9tLmNvbCl9fX0sSD1mdW5jdGlvbihlLHQsbil7dmFyIG89dGhpcy5nZXRTZXR0aW5ncygpLm1lcmdlQ2VsbHM7aWYobyl7dmFyIHI9dGhpcy5tZXJnZUNlbGxzLm1lcmdlZENlbGxJbmZvQ29sbGVjdGlvbi5nZXRJbmZvKGUsdCk7IXJ8fHIucm93PT1lJiZyLmNvbD09dHx8KG4uY29weWFibGU9ITEpfX0sRD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFNldHRpbmdzKCkubWVyZ2VDZWxscztpZih0KWZvcih2YXIgbixvPXRoaXMuY291bnRDb2xzKCkscj0wO28+cjtyKyspe2lmKG49dGhpcy5tZXJnZUNlbGxzLm1lcmdlZENlbGxJbmZvQ29sbGVjdGlvbi5nZXRJbmZvKGUuc3RhcnRSb3csciksbiYmbi5yb3c8ZS5zdGFydFJvdylyZXR1cm4gZS5zdGFydFJvdz1uLnJvdyxELmNhbGwodGhpcyxlKTtpZihuPXRoaXMubWVyZ2VDZWxscy5tZXJnZWRDZWxsSW5mb0NvbGxlY3Rpb24uZ2V0SW5mbyhlLmVuZFJvdyxyKSl7dmFyIGk9bi5yb3crbi5yb3dzcGFuLTE7aWYoaT5lLmVuZFJvdylyZXR1cm4gZS5lbmRSb3c9aSxELmNhbGwodGhpcyxlKX19fSxBPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0U2V0dGluZ3MoKS5tZXJnZUNlbGxzO2lmKHQpZm9yKHZhciBuLG89dGhpcy5jb3VudFJvd3MoKSxyPTA7bz5yO3IrKyl7aWYobj10aGlzLm1lcmdlQ2VsbHMubWVyZ2VkQ2VsbEluZm9Db2xsZWN0aW9uLmdldEluZm8ocixlLnN0YXJ0Q29sdW1uKSxuJiZuLmNvbDxlLnN0YXJ0Q29sdW1uKXJldHVybiBlLnN0YXJ0Q29sdW1uPW4uY29sLEEuY2FsbCh0aGlzLGUpO2lmKG49dGhpcy5tZXJnZUNlbGxzLm1lcmdlZENlbGxJbmZvQ29sbGVjdGlvbi5nZXRJbmZvKHIsZS5lbmRDb2x1bW4pKXt2YXIgaT1uLmNvbCtuLmNvbHNwYW4tMTtpZihpPmUuZW5kQ29sdW1uKXJldHVybiBlLmVuZENvbHVtbj1pLEEuY2FsbCh0aGlzLGUpfX19LHg9ZnVuY3Rpb24oZSl7aWYoZSYmdGhpcy5tZXJnZUNlbGxzKXt2YXIgdD10aGlzLm1lcmdlQ2VsbHMubWVyZ2VkQ2VsbEluZm9Db2xsZWN0aW9uLG49dGhpcy5nZXRTZWxlY3RlZFJhbmdlKCk7Zm9yKHZhciBvIGluIHQpaWYobi5oaWdobGlnaHQucm93PT10W29dLnJvdyYmbi5oaWdobGlnaHQuY29sPT10W29dLmNvbCYmbi50by5yb3c9PXRbb10ucm93K3Rbb10ucm93c3Bhbi0xJiZuLnRvLmNvbD09dFtvXS5jb2wrdFtvXS5jb2xzcGFuLTEpcmV0dXJuITF9cmV0dXJuIGV9O20uaG9va3MuYWRkKCJiZWZvcmVJbml0IixDKSxtLmhvb2tzLmFkZCgiYWZ0ZXJJbml0IixfKSxtLmhvb2tzLmFkZCgiYWZ0ZXJVcGRhdGVTZXR0aW5ncyIsUiksbS5ob29rcy5hZGQoImJlZm9yZUtleURvd24iLFMpLG0uaG9va3MuYWRkKCJtb2RpZnlUcmFuc2Zvcm1TdGFydCIsTSgibW9kaWZ5VHJhbnNmb3JtU3RhcnQiKSksbS5ob29rcy5hZGQoIm1vZGlmeVRyYW5zZm9ybUVuZCIsTSgibW9kaWZ5VHJhbnNmb3JtRW5kIikpLG0uaG9va3MuYWRkKCJiZWZvcmVTZXRSYW5nZUVuZCIsTyksbS5ob29rcy5hZGQoImJlZm9yZURyYXdCb3JkZXJzIixrKSxtLmhvb2tzLmFkZCgiYWZ0ZXJJc011bHRpcGxlU2VsZWN0aW9uIix4KSxtLmhvb2tzLmFkZCgiYWZ0ZXJSZW5kZXJlciIsVCksbS5ob29rcy5hZGQoImFmdGVyQ29udGV4dE1lbnVEZWZhdWx0T3B0aW9ucyIsRSksbS5ob29rcy5hZGQoImFmdGVyR2V0Q2VsbE1ldGEiLEgpLG0uaG9va3MuYWRkKCJhZnRlclZpZXdwb3J0Um93Q2FsY3VsYXRvck92ZXJyaWRlIixEKSxtLmhvb2tzLmFkZCgiYWZ0ZXJWaWV3cG9ydENvbHVtbkNhbGN1bGF0b3JPdmVycmlkZSIsQSksbS5ob29rcy5hZGQoImFmdGVyQXV0b2ZpbGxBcHBseVZhbHVlcyIsaSksbS5ob29rcy5hZGQoImFmdGVyQ3JlYXRlQ29sIixzKSxtLmhvb2tzLmFkZCgiYWZ0ZXJSZW1vdmVDb2wiLGwpLG0uaG9va3MuYWRkKCJhZnRlckNyZWF0ZVJvdyIsYSksbS5ob29rcy5hZGQoImFmdGVyUmVtb3ZlUm93Iix1KSxtLk1lcmdlQ2VsbHM9cn0seyIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY2VsbC9jb29yZHMiOjUsIjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9jZWxsL3JhbmdlIjo2LCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvdGFibGUiOjIwLGJyb3dzZXI6MjMsImhlbHBlcnMvZG9tL2V2ZW50Ijo0NyxwbHVnaW5zOjU5fV0sODQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7TXVsdGlwbGVTZWxlY3Rpb25IYW5kbGVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gd319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBvLHIsaSxzLGwsYSx1PSgobz1lKCJicm93c2VyIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLHI9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSksYz11LmdldFdpbmRvd1Njcm9sbFRvcCxoPXUuaGFzQ2xhc3MsZD11LmdldFdpbmRvd1Njcm9sbExlZnQsZj0oaT1lKCJoZWxwZXJzL2Jyb3dzZXIiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLmlzTW9iaWxlQnJvd3NlcixwPShzPWUoIl9iYXNlIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KVsiZGVmYXVsdCJdLGc9KGw9ZSgiZXZlbnRNYW5hZ2VyIiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KS5FdmVudE1hbmFnZXIsbT0oYT1lKCJwbHVnaW5zIiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KS5yZWdpc3RlclBsdWdpbix3PWZ1bmN0aW9uKGUpeyR0cmFjZXVyUnVudGltZS5zdXBlckNvbnN0cnVjdG9yKHYpLmNhbGwodGhpcyxlKSx0aGlzLmRyYWdnZWQ9W10sdGhpcy5ldmVudE1hbmFnZXI9bnVsbCx0aGlzLmxhc3RTZXRDZWxsPW51bGx9LHY9dzskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3Modyx7aXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIGYoKX0sZW5hYmxlUGx1Z2luOmZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkfHwodGhpcy5ldmVudE1hbmFnZXJ8fCh0aGlzLmV2ZW50TWFuYWdlcj1uZXcgZyh0aGlzKSksdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpLCR0cmFjZXVyUnVudGltZS5zdXBlckdldCh0aGlzLHYucHJvdG90eXBlLCJlbmFibGVQbHVnaW4iKS5jYWxsKHRoaXMpKX0scmVnaXN0ZXJMaXN0ZW5lcnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKDE9PT10LmRyYWdnZWQubGVuZ3RoKXJldHVybiB0LmRyYWdnZWQuc3BsaWNlKDAsdC5kcmFnZ2VkLmxlbmd0aCksITA7dmFyIG49dC5kcmFnZ2VkLmluZGV4T2YoZSk7cmV0dXJuLTE9PW4/ITE6dm9pZCgwPT09bj90LmRyYWdnZWQ9dC5kcmFnZ2VkLnNsaWNlKDAsMSk6MT09biYmKHQuZHJhZ2dlZD10LmRyYWdnZWQuc2xpY2UoLTEpKSl9dmFyIHQ9dGhpczt0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHRoaXMuaG90LnJvb3RFbGVtZW50LCJ0b3VjaHN0YXJ0IixmdW5jdGlvbihlKXt2YXIgbjtyZXR1cm4gaChlLnRhcmdldCwidG9wTGVmdFNlbGVjdGlvbkhhbmRsZS1IaXRBcmVhIik/KG49dC5ob3QuZ2V0U2VsZWN0ZWRSYW5nZSgpLHQuZHJhZ2dlZC5wdXNoKCJ0b3BMZWZ0IiksdC50b3VjaFN0YXJ0UmFuZ2U9e3dpZHRoOm4uZ2V0V2lkdGgoKSxoZWlnaHQ6bi5nZXRIZWlnaHQoKSxkaXJlY3Rpb246bi5nZXREaXJlY3Rpb24oKX0sZS5wcmV2ZW50RGVmYXVsdCgpLCExKTpoKGUudGFyZ2V0LCJib3R0b21SaWdodFNlbGVjdGlvbkhhbmRsZS1IaXRBcmVhIik/KG49dC5ob3QuZ2V0U2VsZWN0ZWRSYW5nZSgpLHQuZHJhZ2dlZC5wdXNoKCJib3R0b21SaWdodCIpLHQudG91Y2hTdGFydFJhbmdlPXt3aWR0aDpuLmdldFdpZHRoKCksaGVpZ2h0Om4uZ2V0SGVpZ2h0KCksZGlyZWN0aW9uOm4uZ2V0RGlyZWN0aW9uKCl9LGUucHJldmVudERlZmF1bHQoKSwhMSk6dm9pZCAwfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmhvdC5yb290RWxlbWVudCwidG91Y2hlbmQiLGZ1bmN0aW9uKG4pe3JldHVybiBoKG4udGFyZ2V0LCJ0b3BMZWZ0U2VsZWN0aW9uSGFuZGxlLUhpdEFyZWEiKT8oZS5jYWxsKHQsInRvcExlZnQiKSx0LnRvdWNoU3RhcnRSYW5nZT12b2lkIDAsbi5wcmV2ZW50RGVmYXVsdCgpLCExKTpoKG4udGFyZ2V0LCJib3R0b21SaWdodFNlbGVjdGlvbkhhbmRsZS1IaXRBcmVhIik/KGUuY2FsbCh0LCJib3R0b21SaWdodCIpLHQudG91Y2hTdGFydFJhbmdlPXZvaWQgMCxuLnByZXZlbnREZWZhdWx0KCksITEpOnZvaWQgMH0pLHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5ob3Qucm9vdEVsZW1lbnQsInRvdWNobW92ZSIsZnVuY3Rpb24oZSl7DQp2YXIgbixvLHIsaSxzLGwsYSx1PWMoKSxoPWQoKTswIT09dC5kcmFnZ2VkLmxlbmd0aCYmKG49ZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLnRvdWNoZXNbMF0uc2NyZWVuWC1oLGUudG91Y2hlc1swXS5zY3JlZW5ZLXUpLG4mJm4hPT10Lmxhc3RTZXRDZWxsJiYoIlREIiE9bi5ub2RlTmFtZSYmIlRIIiE9bi5ub2RlTmFtZXx8KG89dC5ob3QuZ2V0Q29vcmRzKG4pLC0xPT1vLmNvbCYmKG8uY29sPTApLHI9dC5ob3QuZ2V0U2VsZWN0ZWRSYW5nZSgpLGk9ci5nZXRXaWR0aCgpLHM9ci5nZXRIZWlnaHQoKSxsPXIuZ2V0RGlyZWN0aW9uKCksMT09aSYmMT09cyYmdC5ob3Quc2VsZWN0aW9uLnNldFJhbmdlRW5kKG8pLGE9dC5nZXRDdXJyZW50UmFuZ2VDb29yZHMocixvLHQudG91Y2hTdGFydFJhbmdlLmRpcmVjdGlvbixsLHQuZHJhZ2dlZFswXSksbnVsbCE9PWEuc3RhcnQmJnQuaG90LnNlbGVjdGlvbi5zZXRSYW5nZVN0YXJ0KGEuc3RhcnQpLHQuaG90LnNlbGVjdGlvbi5zZXRSYW5nZUVuZChhLmVuZCksdC5sYXN0U2V0Q2VsbD1uKSxlLnByZXZlbnREZWZhdWx0KCkpKX0pfSxnZXRDdXJyZW50UmFuZ2VDb29yZHM6ZnVuY3Rpb24oZSx0LG4sbyxyKXt2YXIgaT1lLmdldFRvcExlZnRDb3JuZXIoKSxzPWUuZ2V0Qm90dG9tUmlnaHRDb3JuZXIoKSxsPWUuZ2V0Qm90dG9tTGVmdENvcm5lcigpLGE9ZS5nZXRUb3BSaWdodENvcm5lcigpLHU9e3N0YXJ0Om51bGwsZW5kOm51bGx9O3N3aXRjaChuKXtjYXNlIk5FLVNXIjpzd2l0Y2gobyl7Y2FzZSJORS1TVyI6Y2FzZSJOVy1TRSI6dT0idG9wTGVmdCI9PXI/e3N0YXJ0Om5ldyBXYWxrb250YWJsZUNlbGxDb29yZHModC5yb3csZS5oaWdobGlnaHQuY29sKSxlbmQ6bmV3IFdhbGtvbnRhYmxlQ2VsbENvb3JkcyhsLnJvdyx0LmNvbCl9OntzdGFydDpuZXcgV2Fsa29udGFibGVDZWxsQ29vcmRzKGUuaGlnaGxpZ2h0LnJvdyx0LmNvbCksZW5kOm5ldyBXYWxrb250YWJsZUNlbGxDb29yZHModC5yb3csaS5jb2wpfTticmVhaztjYXNlIlNFLU5XIjoiYm90dG9tUmlnaHQiPT1yJiYodT17c3RhcnQ6bmV3IFdhbGtvbnRhYmxlQ2VsbENvb3JkcyhzLnJvdyx0LmNvbCksZW5kOm5ldyBXYWxrb250YWJsZUNlbGxDb29yZHModC5yb3csaS5jb2wpfSl9YnJlYWs7Y2FzZSJOVy1TRSI6c3dpdGNoKG8pe2Nhc2UiTkUtU1ciOiJ0b3BMZWZ0Ij09cj91PXtzdGFydDp0LGVuZDpsfTp1LmVuZD10O2JyZWFrO2Nhc2UiTlctU0UiOiJ0b3BMZWZ0Ij09cj91PXtzdGFydDp0LGVuZDpzfTp1LmVuZD10O2JyZWFrO2Nhc2UiU0UtTlciOiJ0b3BMZWZ0Ij09cj91PXtzdGFydDp0LGVuZDppfTp1LmVuZD10O2JyZWFrO2Nhc2UiU1ctTkUiOiJ0b3BMZWZ0Ij09cj91PXtzdGFydDp0LGVuZDphfTp1LmVuZD10fWJyZWFrO2Nhc2UiU1ctTkUiOnN3aXRjaChvKXtjYXNlIk5XLVNFIjp1PSJib3R0b21SaWdodCI9PXI/e3N0YXJ0Om5ldyBXYWxrb250YWJsZUNlbGxDb29yZHModC5yb3csaS5jb2wpLGVuZDpuZXcgV2Fsa29udGFibGVDZWxsQ29vcmRzKGwucm93LHQuY29sKX06e3N0YXJ0Om5ldyBXYWxrb250YWJsZUNlbGxDb29yZHMoaS5yb3csdC5jb2wpLGVuZDpuZXcgV2Fsa29udGFibGVDZWxsQ29vcmRzKHQucm93LHMuY29sKX07YnJlYWs7Y2FzZSJTVy1ORSI6dT0idG9wTGVmdCI9PXI/e3N0YXJ0Om5ldyBXYWxrb250YWJsZUNlbGxDb29yZHMoZS5oaWdobGlnaHQucm93LHQuY29sKSxlbmQ6bmV3IFdhbGtvbnRhYmxlQ2VsbENvb3Jkcyh0LnJvdyxzLmNvbCl9OntzdGFydDpuZXcgV2Fsa29udGFibGVDZWxsQ29vcmRzKHQucm93LGkuY29sKSxlbmQ6bmV3IFdhbGtvbnRhYmxlQ2VsbENvb3JkcyhpLnJvdyx0LmNvbCl9O2JyZWFrO2Nhc2UiU0UtTlciOiJib3R0b21SaWdodCI9PXI/dT17c3RhcnQ6bmV3IFdhbGtvbnRhYmxlQ2VsbENvb3Jkcyh0LnJvdyxhLmNvbCksZW5kOm5ldyBXYWxrb250YWJsZUNlbGxDb29yZHMoaS5yb3csdC5jb2wpfToidG9wTGVmdCI9PXImJih1PXtzdGFydDpsLGVuZDp0fSl9YnJlYWs7Y2FzZSJTRS1OVyI6c3dpdGNoKG8pe2Nhc2UiTlctU0UiOmNhc2UiTkUtU1ciOmNhc2UiU1ctTkUiOiJ0b3BMZWZ0Ij09ciYmKHUuZW5kPXQpO2JyZWFrO2Nhc2UiU0UtTlciOiJ0b3BMZWZ0Ij09cj91LmVuZD10OnU9e3N0YXJ0OnQsZW5kOml9fX1yZXR1cm4gdX0saXNEcmFnZ2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHJhZ2dlZC5sZW5ndGg+MH19LHt9LHApLG0oIm11bHRpcGxlU2VsZWN0aW9uSGFuZGxlcyIsdyl9LHtfYmFzZTo2MCxicm93c2VyOjIzLGV2ZW50TWFuYWdlcjo0MSwiaGVscGVycy9icm93c2VyIjo0MywiaGVscGVycy9kb20vZWxlbWVudCI6NDYscGx1Z2luczo1OX1dLDg1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0RhdGFPYnNlcnZlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGh9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscyxsPShvPWUoImpzb25wYXRjaCIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXSxhPShyPWUoIi4uLy4uL21peGlucy9sb2NhbEhvb2tzIiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KS5sb2NhbEhvb2tzLHU9KGk9ZSgiLi4vLi4vaGVscGVycy9vYmplY3QiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLm1peGluLGM9KHM9ZSgidXRpbHMiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLmNsZWFuUGF0Y2hlcyxoPWZ1bmN0aW9uKGUpe3RoaXMub2JzZXJ2ZWREYXRhPW51bGwsdGhpcy5vYnNlcnZlcj1udWxsLHRoaXMucGF1c2VkPSExLHRoaXMuc2V0T2JzZXJ2ZWREYXRhKGUpfTskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoaCx7c2V0T2JzZXJ2ZWREYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5vYnNlcnZlciYmbC51bm9ic2VydmUodGhpcy5vYnNlcnZlZERhdGEsdGhpcy5vYnNlcnZlciksdGhpcy5vYnNlcnZlZERhdGE9ZSx0aGlzLm9ic2VydmVyPWwub2JzZXJ2ZSh0aGlzLm9ic2VydmVkRGF0YSxmdW5jdGlvbihlKXtyZXR1cm4gdC5vbkNoYW5nZShlKX0pfSxpc1BhdXNlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhdXNlZH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlZD0hMH0scmVzdW1lOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZWQ9ITF9LG9uQ2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMucnVuTG9jYWxIb29rcygiY2hhbmdlIixjKGUpKX0sZGVzdHJveTpmdW5jdGlvbigpe2wudW5vYnNlcnZlKHRoaXMub2JzZXJ2ZWREYXRhLHRoaXMub2JzZXJ2ZXIpLHRoaXMub2JzZXJ2ZWREYXRhPW51bGwsdGhpcy5vYnNlcnZlcj1udWxsfX0se30pLHUoaCxhKX0seyIuLi8uLi9oZWxwZXJzL29iamVjdCI6NTIsIi4uLy4uL21peGlucy9sb2NhbEhvb2tzIjo1Nixqc29ucGF0Y2g6Impzb25wYXRjaCIsdXRpbHM6ODd9XSw4NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtPYnNlcnZlQ2hhbmdlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHB9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscyxsLGEsdT0obz1lKCJicm93c2VyIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLGM9KHI9ZSgiX2Jhc2UiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pWyJkZWZhdWx0Il0saD0oKGk9ZSgianNvbnBhdGNoIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KVsiZGVmYXVsdCJdLChzPWUoImRhdGFPYnNlcnZlciIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuRGF0YU9ic2VydmVyKSxkPShsPWUoImhlbHBlcnMvYXJyYXkiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLmFycmF5RWFjaCxmPShhPWUoInBsdWdpbnMiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLnJlZ2lzdGVyUGx1Z2luO3UuaG9va3MucmVnaXN0ZXIoImFmdGVyQ2hhbmdlc09ic2VydmVkIik7dmFyIHA9ZnVuY3Rpb24oZSl7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IoZykuY2FsbCh0aGlzLGUpLHRoaXMub2JzZXJ2ZXI9bnVsbH0sZz1wOyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhwLHtpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3QuZ2V0U2V0dGluZ3MoKS5vYnNlcnZlQ2hhbmdlc30sZW5hYmxlUGx1Z2luOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmVuYWJsZWR8fCh0aGlzLm9ic2VydmVyfHwodGhpcy5vYnNlcnZlcj1uZXcgaCh0aGlzLmhvdC5nZXRTb3VyY2VEYXRhKCkpLHRoaXMuX2V4cG9zZVB1YmxpY0FwaSgpKSx0aGlzLm9ic2VydmVyLmFkZExvY2FsSG9vaygiY2hhbmdlIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbkRhdGFDaGFuZ2UodCl9KSx0aGlzLmFkZEhvb2soImFmdGVyQ3JlYXRlUm93IixmdW5jdGlvbigpe3JldHVybiBlLm9uQWZ0ZXJUYWJsZUFsdGVyKCl9KSx0aGlzLmFkZEhvb2soImFmdGVyUmVtb3ZlUm93IixmdW5jdGlvbigpe3JldHVybiBlLm9uQWZ0ZXJUYWJsZUFsdGVyKCl9KSx0aGlzLmFkZEhvb2soImFmdGVyQ3JlYXRlQ29sIixmdW5jdGlvbigpe3JldHVybiBlLm9uQWZ0ZXJUYWJsZUFsdGVyKCl9KSx0aGlzLmFkZEhvb2soImFmdGVyUmVtb3ZlQ29sIixmdW5jdGlvbigpe3JldHVybiBlLm9uQWZ0ZXJUYWJsZUFsdGVyKCl9KSx0aGlzLmFkZEhvb2soImFmdGVyQ2hhbmdlIixmdW5jdGlvbih0LG4pe3JldHVybiBlLm9uQWZ0ZXJUYWJsZUFsdGVyKG4pfSksdGhpcy5hZGRIb29rKCJhZnRlckxvYWREYXRhIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbkFmdGVyTG9hZERhdGEodCl9KSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxnLnByb3RvdHlwZSwiZW5hYmxlUGx1Z2luIikuY2FsbCh0aGlzKSl9LGRpc2FibGVQbHVnaW46ZnVuY3Rpb24oKXt0aGlzLm9ic2VydmVyJiYodGhpcy5vYnNlcnZlci5kZXN0cm95KCksdGhpcy5vYnNlcnZlcj1udWxsLHRoaXMuX2RlbGV0ZVB1YmxpY0FwaSgpKSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxnLnByb3RvdHlwZSwiZGlzYWJsZVBsdWdpbiIpLmNhbGwodGhpcyl9LG9uRGF0YUNoYW5nZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKCF0aGlzLm9ic2VydmVyLmlzUGF1c2VkKCkpe3ZhciBuPXthZGQ6ZnVuY3Rpb24oZSl7aXNOYU4oZS5jb2wpP3QuaG90LnJ1bkhvb2tzKCJhZnRlckNyZWF0ZVJvdyIsZS5yb3cpOnQuaG90LnJ1bkhvb2tzKCJhZnRlckNyZWF0ZUNvbCIsZS5jb2wpfSxyZW1vdmU6ZnVuY3Rpb24oZSl7aXNOYU4oZS5jb2wpP3QuaG90LnJ1bkhvb2tzKCJhZnRlclJlbW92ZVJvdyIsZS5yb3csMSk6dC5ob3QucnVuSG9va3MoImFmdGVyUmVtb3ZlQ29sIixlLmNvbCwxKX0scmVwbGFjZTpmdW5jdGlvbihlKXt0LmhvdC5ydW5Ib29rcygiYWZ0ZXJDaGFuZ2UiLFtlLnJvdyxlLmNvbCxudWxsLGUudmFsdWVdLCJleHRlcm5hbCIpfX07ZChlLGZ1bmN0aW9uKGUpe25bZS5vcF0mJm5bZS5vcF0oZSl9KSx0aGlzLmhvdC5yZW5kZXIoKX10aGlzLmhvdC5ydW5Ib29rcygiYWZ0ZXJDaGFuZ2VzT2JzZXJ2ZWQiKX0sb25BZnRlclRhYmxlQWx0ZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczsibG9hZERhdGEiIT09ZSYmKHRoaXMub2JzZXJ2ZXIucGF1c2UoKSx0aGlzLmhvdC5hZGRIb29rT25jZSgiYWZ0ZXJDaGFuZ2VzT2JzZXJ2ZWQiLGZ1bmN0aW9uKCl7cmV0dXJuIHQub2JzZXJ2ZXIucmVzdW1lKCl9KSl9LG9uQWZ0ZXJMb2FkRGF0YTpmdW5jdGlvbihlKXtlfHx0aGlzLm9ic2VydmVyLnNldE9ic2VydmVkRGF0YSh0aGlzLmhvdC5nZXRTb3VyY2VEYXRhKCkpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5vYnNlcnZlciYmKHRoaXMub2JzZXJ2ZXIuZGVzdHJveSgpLHRoaXMuX2RlbGV0ZVB1YmxpY0FwaSgpKSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQodGhpcyxnLnByb3RvdHlwZSwiZGVzdHJveSIpLmNhbGwodGhpcyl9LF9leHBvc2VQdWJsaWNBcGk6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5ob3Q7dC5wYXVzZU9ic2VydmluZ0NoYW5nZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZS5vYnNlcnZlci5wYXVzZSgpfSx0LnJlc3VtZU9ic2VydmluZ0NoYW5nZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZS5vYnNlcnZlci5yZXN1bWUoKX0sdC5pc1BhdXNlZE9ic2VydmluZ0NoYW5nZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZS5vYnNlcnZlci5pc1BhdXNlZCgpfX0sX2RlbGV0ZVB1YmxpY0FwaTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG90O2RlbGV0ZSBlLnBhdXNlT2JzZXJ2aW5nQ2hhbmdlcyxkZWxldGUgZS5yZXN1bWVPYnNlcnZpbmdDaGFuZ2VzLGRlbGV0ZSBlLmlzUGF1c2VkT2JzZXJ2aW5nQ2hhbmdlc319LHt9LGMpLGYoIm9ic2VydmVDaGFuZ2VzIixwKX0se19iYXNlOjYwLGJyb3dzZXI6MjMsZGF0YU9ic2VydmVyOjg1LCJoZWxwZXJzL2FycmF5Ijo0Mixqc29ucGF0Y2g6Impzb25wYXRjaCIscGx1Z2luczo1OX1dLDg3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9W107cmV0dXJuIGU9bChlLGZ1bmN0aW9uKGUpe3JldHVybi9bXC9dbGVuZ3RoL2dpLnRlc3QoZS5wYXRoKT8hMTohIXIoZS5wYXRoKX0pLGU9YShlLGZ1bmN0aW9uKGUpe3ZhciB0PXIoZS5wYXRoKTtyZXR1cm4gZS5yb3c9dC5yb3csZS5jb2w9dC5jb2wsZX0pLGU9bChlLGZ1bmN0aW9uKGUpe2lmKC0xIT09WyJhZGQiLCJyZW1vdmUiXS5pbmRleE9mKGUub3ApJiYhaXNOYU4oZS5jb2wpKXtpZigtMSE9PXQuaW5kZXhPZihlLmNvbCkpcmV0dXJuITE7dC5wdXNoKGUuY29sKX1yZXR1cm4hMH0pLHQubGVuZ3RoPTAsZX1mdW5jdGlvbiByKGUpe3ZhciB0PWUubWF0Y2goL15cLyhcZCspXC8/KC4qKT8kLyk7aWYoIXQpcmV0dXJuIG51bGw7dmFyIG49dCxvPW5bMV0scj1uWzJdO3JldHVybntyb3c6cGFyc2VJbnQobywxMCksY29sOi9eXGQqJC8udGVzdChyKT9wYXJzZUludChyLDEwKTpyfX1PYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtjbGVhblBhdGNoZXM6e2dldDpmdW5jdGlvbigpe3JldHVybiBvfX0scGFyc2VQYXRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciBpLHM9KGk9ZSgiLi4vLi4vaGVscGVycy9hcnJheSIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSksbD1zLmFycmF5RmlsdGVyLGE9cy5hcnJheU1hcH0seyIuLi8uLi9oZWxwZXJzL2FycmF5Ijo0Mn1dLDg4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7dmFyIHQsbj1mdW5jdGlvbigpe3dpbmRvdy5sb2NhbFN0b3JhZ2VbZSsiX19wZXJzaXN0ZW50U3RhdGVLZXlzIl09SlNPTi5zdHJpbmdpZnkodCl9LG89ZnVuY3Rpb24oKXt2YXIgbj13aW5kb3cubG9jYWxTdG9yYWdlW2UrIl9fcGVyc2lzdGVudFN0YXRlS2V5cyJdLG89InN0cmluZyI9PXR5cGVvZiBuP0pTT04ucGFyc2Uobik6dm9pZCAwO3Q9bz9vOltdfSxyPWZ1bmN0aW9uKCl7dD1bXSxuKCl9O28oKSx0aGlzLnNhdmVWYWx1ZT1mdW5jdGlvbihvLHIpe3dpbmRvdy5sb2NhbFN0b3JhZ2VbZSsiXyIrb109SlNPTi5zdHJpbmdpZnkociksLTE9PXQuaW5kZXhPZihvKSYmKHQucHVzaChvKSxuKCkpfSx0aGlzLmxvYWRWYWx1ZT1mdW5jdGlvbih0LG4pe3Q9InVuZGVmaW5lZCI9PXR5cGVvZiB0P246dDt2YXIgbz13aW5kb3cubG9jYWxTdG9yYWdlW2UrIl8iK3RdO3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2Ygbz92b2lkIDA6SlNPTi5wYXJzZShvKX0sdGhpcy5yZXNldD1mdW5jdGlvbih0KXt3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZSsiXyIrdCl9LHRoaXMucmVzZXRBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZSsiXyIrdFtuXSk7cigpfX1mdW5jdGlvbiByKCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXM7Zm9yKHZhciB0IGluIHIpci5oYXNPd25Qcm9wZXJ0eSh0KSYmZS5hZGRIb29rKHQsclt0XSl9ZnVuY3Rpb24gdCgpe3ZhciBlPXRoaXM7Zm9yKHZhciB0IGluIHIpci5oYXNPd25Qcm9wZXJ0eSh0KSYmZS5yZW1vdmVIb29rKHQsclt0XSl9dmFyIG49dGhpczt0aGlzLmluaXQ9ZnVuY3Rpb24oKXt2YXIgcj10aGlzLGk9ci5nZXRTZXR0aW5ncygpLnBlcnNpc3RlbnRTdGF0ZTtyZXR1cm4gbi5lbmFibGVkPSEhaSxuLmVuYWJsZWQ/KHIuc3RvcmFnZXx8KHIuc3RvcmFnZT1uZXcgbyhyLnJvb3RFbGVtZW50LmlkKSksci5yZXNldFN0YXRlPW4ucmVzZXRWYWx1ZSx2b2lkIGUuY2FsbChyKSk6dm9pZCB0LmNhbGwocil9LHRoaXMuc2F2ZVZhbHVlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztuLnN0b3JhZ2Uuc2F2ZVZhbHVlKGUsdCl9LHRoaXMubG9hZFZhbHVlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt0LnZhbHVlPW4uc3RvcmFnZS5sb2FkVmFsdWUoZSl9LHRoaXMucmVzZXRWYWx1ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzOyJ1bmRlZmluZWQiPT10eXBlb2YgZT90LnN0b3JhZ2UucmVzZXRBbGwoKTp0LnN0b3JhZ2UucmVzZXQoZSl9O3ZhciByPXtwZXJzaXN0ZW50U3RhdGVTYXZlOm4uc2F2ZVZhbHVlLHBlcnNpc3RlbnRTdGF0ZUxvYWQ6bi5sb2FkVmFsdWUscGVyc2lzdGVudFN0YXRlUmVzZXQ6bi5yZXNldFZhbHVlfTtmb3IodmFyIGkgaW4gcilyLmhhc093blByb3BlcnR5KGkpJiZsLmhvb2tzLnJlZ2lzdGVyKGkpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se0hhbmRzb250YWJsZVBlcnNpc3RlbnRTdGF0ZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgaSxzLGw9KGk9ZSgiYnJvd3NlciIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSlbImRlZmF1bHQiXSxhPSgocz1lKCJwbHVnaW5zIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5yZWdpc3RlclBsdWdpbixuZXcgcik7bC5ob29rcy5hZGQoImJlZm9yZUluaXQiLGEuaW5pdCksbC5ob29rcy5hZGQoImFmdGVyVXBkYXRlU2V0dGluZ3MiLGEuaW5pdCl9LHticm93c2VyOjIzLHBsdWdpbnM6NTl9XSw4OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKCl7dmFyIGU9dGhpcyx0PSEhZS5nZXRTZXR0aW5ncygpLnNlYXJjaDt0P2Uuc2VhcmNoPW5ldyBsLlNlYXJjaChlKTpkZWxldGUgZS5zZWFyY2h9dmFyIHIsaSxzLGw9KHI9ZSgiYnJvd3NlciIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSlbImRlZmF1bHQiXSxhPShpPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLHU9YS5hZGRDbGFzcyxjPWEucmVtb3ZlQ2xhc3MsaD0ocz1lKCJyZW5kZXJlcnMiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLGQ9aC5yZWdpc3RlclJlbmRlcmVyLGY9aC5nZXRSZW5kZXJlcjtsLlNlYXJjaD1mdW5jdGlvbihlKXt0aGlzLnF1ZXJ5PWZ1bmN0aW9uKHQsbixvKXt2YXIgcj1lLmNvdW50Um93cygpLGk9ZS5jb3VudENvbHMoKSxzPVtdO258fChuPWwuU2VhcmNoLmdsb2JhbC5nZXREZWZhdWx0Q2FsbGJhY2soKSksb3x8KG89bC5TZWFyY2guZ2xvYmFsLmdldERlZmF1bHRRdWVyeU1ldGhvZCgpKTtmb3IodmFyIGE9MDtyPmE7YSsrKWZvcih2YXIgdT0wO2k+dTt1Kyspe3ZhciBjPWUuZ2V0RGF0YUF0Q2VsbChhLHUpLGg9ZS5nZXRDZWxsTWV0YShhLHUpLGQ9aC5zZWFyY2guY2FsbGJhY2t8fG4sZj1oLnNlYXJjaC5xdWVyeU1ldGhvZHx8byxwPWYodCxjKTtpZihwKXt2YXIgZz17cm93OmEsY29sOnUsZGF0YTpjfTtzLnB1c2goZyl9ZCYmZChlLGEsdSxjLHApfXJldHVybiBzfX0sbC5TZWFyY2guREVGQVVMVF9DQUxMQkFDSz1mdW5jdGlvbihlLHQsbixvLHIpe2UuZ2V0Q2VsbE1ldGEodCxuKS5pc1NlYXJjaFJlc3VsdD1yfSxsLlNlYXJjaC5ERUZBVUxUX1FVRVJZX01FVEhPRD1mdW5jdGlvbihlLHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgZSYmbnVsbCE9ZSYmZS50b0xvd2VyQ2FzZSYmMCE9PWUubGVuZ3RoPyJ1bmRlZmluZWQiPT10eXBlb2YgdHx8bnVsbD09dD8hMTotMSE9dC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihlLnRvTG93ZXJDYXNlKCkpOiExfSxsLlNlYXJjaC5ERUZBVUxUX1NFQVJDSF9SRVNVTFRfQ0xBU1M9Imh0U2VhcmNoUmVzdWx0IixsLlNlYXJjaC5nbG9iYWw9ZnVuY3Rpb24oKXt2YXIgZT1sLlNlYXJjaC5ERUZBVUxUX0NBTExCQUNLLHQ9bC5TZWFyY2guREVGQVVMVF9RVUVSWV9NRVRIT0Qsbj1sLlNlYXJjaC5ERUZBVUxUX1NFQVJDSF9SRVNVTFRfQ0xBU1M7cmV0dXJue2dldERlZmF1bHRDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBlfSxzZXREZWZhdWx0Q2FsbGJhY2s6ZnVuY3Rpb24odCl7ZT10fSxnZXREZWZhdWx0UXVlcnlNZXRob2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdH0sc2V0RGVmYXVsdFF1ZXJ5TWV0aG9kOmZ1bmN0aW9uKGUpe3Q9ZX0sZ2V0RGVmYXVsdFNlYXJjaFJlc3VsdENsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuIG59LHNldERlZmF1bHRTZWFyY2hSZXN1bHRDbGFzczpmdW5jdGlvbihlKXtuPWV9fX0oKSxsLlNlYXJjaENlbGxEZWNvcmF0b3I9ZnVuY3Rpb24oZSx0LG4sbyxyLGkscyl7dmFyIGE9bnVsbCE9PXMuc2VhcmNoJiYib2JqZWN0Ij09dHlwZW9mIHMuc2VhcmNoJiZzLnNlYXJjaC5zZWFyY2hSZXN1bHRDbGFzc3x8bC5TZWFyY2guZ2xvYmFsLmdldERlZmF1bHRTZWFyY2hSZXN1bHRDbGFzcygpO3MuaXNTZWFyY2hSZXN1bHQ/dSh0LGEpOmModCxhKX07dmFyIHA9ZigiYmFzZSIpO2QoImJhc2UiLGZ1bmN0aW9uKGUsdCxuLG8scixpLHMpe3AuYXBwbHkodGhpcyxhcmd1bWVudHMpLGwuU2VhcmNoQ2VsbERlY29yYXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxsLmhvb2tzLmFkZCgiYWZ0ZXJJbml0IixvKSxsLmhvb2tzLmFkZCgiYWZ0ZXJVcGRhdGVTZXR0aW5ncyIsbyl9LHticm93c2VyOjIzLCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NixyZW5kZXJlcnM6OTJ9XSw5MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtUb3VjaFNjcm9sbDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGZ9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscyxsPShvPWUoImJyb3dzZXIiKSxvJiZvLl9fZXNNb2R1bGUmJm98fHsiZGVmYXVsdCI6b30pWyJkZWZhdWx0Il0sYT0ocj1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KSx1PWEuYWRkQ2xhc3MsYz1hLnJlbW92ZUNsYXNzLGg9KGk9ZSgiX2Jhc2UiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pWyJkZWZhdWx0Il0sZD0ocz1lKCJwbHVnaW5zIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5yZWdpc3RlclBsdWdpbixmPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7JHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3IocCkuY2FsbCh0aGlzLGUpLHRoaXMuaG90LmFkZEhvb2soImFmdGVySW5pdCIsZnVuY3Rpb24oKXtyZXR1cm4gdC5hZnRlckluaXQoKX0pLHRoaXMuaG90LmFkZEhvb2soImFmdGVyVXBkYXRlU2V0dGluZ3MiLGZ1bmN0aW9uKCl7cmV0dXJuIHQub25BZnRlclVwZGF0ZVNldHRpbmdzKCl9KSx0aGlzLnNjcm9sbGJhcnM9W10sdGhpcy5jbG9uZXM9W119LHA9ZjskdHJhY2V1clJ1bnRpbWUuY3JlYXRlQ2xhc3MoZix7YWZ0ZXJJbml0OmZ1bmN0aW9uKCl7dGhpcy5yZWdpc3RlckV2ZW50cygpLHRoaXMub25BZnRlclVwZGF0ZVNldHRpbmdzKCl9LG9uQWZ0ZXJVcGRhdGVTZXR0aW5nczpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5ob3QuYWRkSG9va09uY2UoImFmdGVyUmVuZGVyIixmdW5jdGlvbigpe3ZhciB0PWUuaG90LnZpZXcud3Qud3RPdmVybGF5cztlLnNjcm9sbGJhcnM9W10sZS5zY3JvbGxiYXJzLnB1c2godC50b3BPdmVybGF5KSx0LmJvdHRvbU92ZXJsYXkuY2xvbmUmJmUuc2Nyb2xsYmFycy5wdXNoKHQuYm90dG9tT3ZlcmxheSksZS5zY3JvbGxiYXJzLnB1c2godC5sZWZ0T3ZlcmxheSksdC50b3BMZWZ0Q29ybmVyT3ZlcmxheSYmZS5zY3JvbGxiYXJzLnB1c2godC50b3BMZWZ0Q29ybmVyT3ZlcmxheSksdC5ib3R0b21MZWZ0Q29ybmVyT3ZlcmxheSYmdC5ib3R0b21MZWZ0Q29ybmVyT3ZlcmxheS5jbG9uZSYmZS5zY3JvbGxiYXJzLnB1c2godC5ib3R0b21MZWZ0Q29ybmVyT3ZlcmxheSksZS5jbG9uZXM9W10sdC50b3BPdmVybGF5Lm5lZWRGdWxsUmVuZGVyJiZlLmNsb25lcy5wdXNoKHQudG9wT3ZlcmxheS5jbG9uZS53dFRhYmxlLmhvbGRlci5wYXJlbnROb2RlKSx0LmJvdHRvbU92ZXJsYXkubmVlZEZ1bGxSZW5kZXImJmUuY2xvbmVzLnB1c2godC5ib3R0b21PdmVybGF5LmNsb25lLnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUpLHQubGVmdE92ZXJsYXkubmVlZEZ1bGxSZW5kZXImJmUuY2xvbmVzLnB1c2godC5sZWZ0T3ZlcmxheS5jbG9uZS53dFRhYmxlLmhvbGRlci5wYXJlbnROb2RlKSx0LnRvcExlZnRDb3JuZXJPdmVybGF5JiZlLmNsb25lcy5wdXNoKHQudG9wTGVmdENvcm5lck92ZXJsYXkuY2xvbmUud3RUYWJsZS5ob2xkZXIucGFyZW50Tm9kZSksdC5ib3R0b21MZWZ0Q29ybmVyT3ZlcmxheSYmdC5ib3R0b21MZWZ0Q29ybmVyT3ZlcmxheS5jbG9uZSYmZS5jbG9uZXMucHVzaCh0LmJvdHRvbUxlZnRDb3JuZXJPdmVybGF5LmNsb25lLnd0VGFibGUuaG9sZGVyLnBhcmVudE5vZGUpfSl9LHJlZ2lzdGVyRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmhvdC5hZGRIb29rKCJiZWZvcmVUb3VjaFNjcm9sbCIsZnVuY3Rpb24oKXtyZXR1cm4gZS5vbkJlZm9yZVRvdWNoU2Nyb2xsKCl9KSx0aGlzLmhvdC5hZGRIb29rKCJhZnRlck1vbWVudHVtU2Nyb2xsIixmdW5jdGlvbigpe3JldHVybiBlLm9uQWZ0ZXJNb21lbnR1bVNjcm9sbCgpfSl9LG9uQmVmb3JlVG91Y2hTY3JvbGw6ZnVuY3Rpb24oKXtsLmZyZWV6ZU92ZXJsYXlzPSEwO2Zvcih2YXIgZT0wLHQ9dGhpcy5jbG9uZXMubGVuZ3RoO3Q+ZTtlKyspdSh0aGlzLmNsb25lc1tlXSwiaGlkZS10d2VlbiIpfSxvbkFmdGVyTW9tZW50dW1TY3JvbGw6ZnVuY3Rpb24oKXtsLmZyZWV6ZU92ZXJsYXlzPSExO2Zvcih2YXIgZT10aGlzLHQ9MCxuPXRoaXMuY2xvbmVzLmxlbmd0aDtuPnQ7dCsrKWModGhpcy5jbG9uZXNbdF0sImhpZGUtdHdlZW4iKTtmb3IodmFyIG89MCxyPXRoaXMuY2xvbmVzLmxlbmd0aDtyPm87bysrKXUodGhpcy5jbG9uZXNbb10sInNob3ctdHdlZW4iKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsbj1lLmNsb25lcy5sZW5ndGg7bj50O3QrKyljKGUuY2xvbmVzW3RdLCJzaG93LXR3ZWVuIil9LDQwMCk7Zm9yKHZhciBpPTAscz10aGlzLnNjcm9sbGJhcnMubGVuZ3RoO3M+aTtpKyspdGhpcy5zY3JvbGxiYXJzW2ldLnJlZnJlc2goKSx0aGlzLnNjcm9sbGJhcnNbaV0ucmVzZXRGaXhlZFBvc2l0aW9uKCk7dGhpcy5ob3Qudmlldy53dC53dE92ZXJsYXlzLnN5bmNTY3JvbGxXaXRoTWFzdGVyKCl9fSx7fSxoKSxkKCJ0b3VjaFNjcm9sbCIsZil9LHtfYmFzZTo2MCxicm93c2VyOjIzLCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NixwbHVnaW5zOjU5fV0sOTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbygpe3ZhciBlPXRoaXMsdD0idW5kZWZpbmVkIj09dHlwZW9mIGUuZ2V0U2V0dGluZ3MoKS51bmRvfHxlLmdldFNldHRpbmdzKCkudW5kbzt0P2UudW5kb1JlZG98fChlLnVuZG9SZWRvPW5ldyBmLlVuZG9SZWRvKGUpLHMoZSksZS5hZGRIb29rKCJiZWZvcmVLZXlEb3duIixyKSxlLmFkZEhvb2soImFmdGVyQ2hhbmdlIixpKSk6ZS51bmRvUmVkbyYmKGRlbGV0ZSBlLnVuZG9SZWRvLGwoZSksZS5yZW1vdmVIb29rKCJiZWZvcmVLZXlEb3duIixyKSxlLnJlbW92ZUhvb2soImFmdGVyQ2hhbmdlIixpKSl9ZnVuY3Rpb24gcihlKXt2YXIgdD10aGlzLG49KGUuY3RybEtleXx8ZS5tZXRhS2V5KSYmIWUuYWx0S2V5O24mJig4OT09PWUua2V5Q29kZXx8ZS5zaGlmdEtleSYmOTA9PT1lLmtleUNvZGU/KHQudW5kb1JlZG8ucmVkbygpLHkoZSkpOjkwPT09ZS5rZXlDb2RlJiYodC51bmRvUmVkby51bmRvKCkseShlKSkpfWZ1bmN0aW9uIGkoZSx0KXt2YXIgbj10aGlzO3JldHVybiJsb2FkRGF0YSI9PXQ/bi51bmRvUmVkby5jbGVhcigpOnZvaWQgMH1mdW5jdGlvbiBzKGUpe2UudW5kbz1mdW5jdGlvbigpe3JldHVybiBlLnVuZG9SZWRvLnVuZG8oKX0sZS5yZWRvPWZ1bmN0aW9uKCl7cmV0dXJuIGUudW5kb1JlZG8ucmVkbygpfSxlLmlzVW5kb0F2YWlsYWJsZT1mdW5jdGlvbigpe3JldHVybiBlLnVuZG9SZWRvLmlzVW5kb0F2YWlsYWJsZSgpfSxlLmlzUmVkb0F2YWlsYWJsZT1mdW5jdGlvbigpe3JldHVybiBlLnVuZG9SZWRvLmlzUmVkb0F2YWlsYWJsZSgpfSxlLmNsZWFyVW5kbz1mdW5jdGlvbigpe3JldHVybiBlLnVuZG9SZWRvLmNsZWFyKCl9fWZ1bmN0aW9uIGwoZSl7ZGVsZXRlIGUudW5kbyxkZWxldGUgZS5yZWRvLGRlbGV0ZSBlLmlzVW5kb0F2YWlsYWJsZSxkZWxldGUgZS5pc1JlZG9BdmFpbGFibGUsZGVsZXRlIGUuY2xlYXJVbmRvfXZhciBhLHUsYyxoLGQsZj0oYT1lKCJicm93c2VyIiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KVsiZGVmYXVsdCJdLHA9KHU9ZSgiaGVscGVycy9hcnJheSIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSkuYXJyYXlNYXAsZz0oYz1lKCJoZWxwZXJzL251bWJlciIpLGMmJmMuX19lc01vZHVsZSYmY3x8eyJkZWZhdWx0IjpjfSkucmFuZ2VFYWNoLG09KGg9ZSgiaGVscGVycy9vYmplY3QiKSxoJiZoLl9fZXNNb2R1bGUmJmh8fHsiZGVmYXVsdCI6aH0pLHc9bS5pbmhlcml0LHY9bS5kZWVwQ2xvbmUseT0oZD1lKCJoZWxwZXJzL2RvbS9ldmVudCIpLGQmJmQuX19lc01vZHVsZSYmZHx8eyJkZWZhdWx0IjpkfSkuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO2YuVW5kb1JlZG89ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLmluc3RhbmNlPWUsdGhpcy5kb25lQWN0aW9ucz1bXSx0aGlzLnVuZG9uZUFjdGlvbnM9W10sdGhpcy5pZ25vcmVOZXdBY3Rpb25zPSExLGUuYWRkSG9vaygiYWZ0ZXJDaGFuZ2UiLGZ1bmN0aW9uKGUsbil7aWYoZSl7dmFyIG89bmV3IGYuVW5kb1JlZG8uQ2hhbmdlQWN0aW9uKGUpO3QuZG9uZShvKX19KSxlLmFkZEhvb2soImFmdGVyQ3JlYXRlUm93IixmdW5jdGlvbihlLG4sbyl7aWYoIW8pe3ZhciByPW5ldyBmLlVuZG9SZWRvLkNyZWF0ZVJvd0FjdGlvbihlLG4pO3QuZG9uZShyKX19KSxlLmFkZEhvb2soImJlZm9yZVJlbW92ZVJvdyIsZnVuY3Rpb24oZSxuKXt2YXIgbz10Lmluc3RhbmNlLmdldFNvdXJjZURhdGEoKTtlPShvLmxlbmd0aCtlKSVvLmxlbmd0aDt2YXIgcj1vLnNsaWNlKGUsZStuKSxpPW5ldyBmLlVuZG9SZWRvLlJlbW92ZVJvd0FjdGlvbihlLHIpO3QuZG9uZShpKX0pLGUuYWRkSG9vaygiYWZ0ZXJDcmVhdGVDb2wiLGZ1bmN0aW9uKGUsbixvKXtpZighbyl7dmFyIHI9bmV3IGYuVW5kb1JlZG8uQ3JlYXRlQ29sdW1uQWN0aW9uKGUsbik7dC5kb25lKHIpfX0pLGUuYWRkSG9vaygiYmVmb3JlUmVtb3ZlQ29sIixmdW5jdGlvbihuLG8pe3ZhciByPXQuaW5zdGFuY2UuZ2V0RGF0YSgpO249KHQuaW5zdGFuY2UuY291bnRDb2xzKCkrbikldC5pbnN0YW5jZS5jb3VudENvbHMoKTt2YXIgaT1bXSxzPVtdLGw9W107ZygwLHIubGVuZ3RoLTEsZnVuY3Rpb24oZSl7aVtlXT1yW2VdLnNsaWNlKG4sbitvKX0pLGcoMCxvLTEsZnVuY3Rpb24odCl7bC5wdXNoKGUucnVuSG9va3MoIm1vZGlmeUNvbCIsbit0KSl9KSxBcnJheS5pc0FycmF5KGUuZ2V0U2V0dGluZ3MoKS5jb2xIZWFkZXJzKSYmZygwLG8tMSxmdW5jdGlvbih0KXtzLnB1c2goZS5nZXRTZXR0aW5ncygpLmNvbEhlYWRlcnNbZS5ydW5Ib29rcygibW9kaWZ5Q29sIixuK3QpXXx8bnVsbCl9KTt2YXIgYT10Lmluc3RhbmNlLmdldFBsdWdpbigibWFudWFsQ29sdW1uTW92ZSIpLHU9bmV3IGYuVW5kb1JlZG8uUmVtb3ZlQ29sdW1uQWN0aW9uKGwsaSxzLGE/YS5jb2x1bW5Qb3NpdGlvbnM6W10pO3QuZG9uZSh1KX0pLGUuYWRkSG9vaygiYmVmb3JlQ2VsbEFsaWdubWVudCIsZnVuY3Rpb24oZSxuLG8scil7dmFyIGk9bmV3IGYuVW5kb1JlZG8uQ2VsbEFsaWdubWVudEFjdGlvbihlLG4sbyxyKTt0LmRvbmUoaSl9KSxlLmFkZEhvb2soImJlZm9yZUZpbHRlciIsZnVuY3Rpb24oZSl7dC5kb25lKG5ldyBmLlVuZG9SZWRvLkZpbHRlcnNBY3Rpb24oZSkpfSl9LGYuVW5kb1JlZG8ucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oZSl7dGhpcy5pZ25vcmVOZXdBY3Rpb25zfHwodGhpcy5kb25lQWN0aW9ucy5wdXNoKGUpLHRoaXMudW5kb25lQWN0aW9ucy5sZW5ndGg9MCl9LGYuVW5kb1JlZG8ucHJvdG90eXBlLnVuZG89ZnVuY3Rpb24oKXtpZih0aGlzLmlzVW5kb0F2YWlsYWJsZSgpKXt2YXIgZT10aGlzLmRvbmVBY3Rpb25zLnBvcCgpO3RoaXMuaWdub3JlTmV3QWN0aW9ucz0hMDt2YXIgdD10aGlzO2UudW5kbyh0aGlzLmluc3RhbmNlLGZ1bmN0aW9uKCl7dC5pZ25vcmVOZXdBY3Rpb25zPSExLHQudW5kb25lQWN0aW9ucy5wdXNoKGUpfSl9fSxmLlVuZG9SZWRvLnByb3RvdHlwZS5yZWRvPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1JlZG9BdmFpbGFibGUoKSl7dmFyIGU9dGhpcy51bmRvbmVBY3Rpb25zLnBvcCgpO3RoaXMuaWdub3JlTmV3QWN0aW9ucz0hMDt2YXIgdD10aGlzO2UucmVkbyh0aGlzLmluc3RhbmNlLGZ1bmN0aW9uKCl7dC5pZ25vcmVOZXdBY3Rpb25zPSExLHQuZG9uZUFjdGlvbnMucHVzaChlKX0pfX0sZi5VbmRvUmVkby5wcm90b3R5cGUuaXNVbmRvQXZhaWxhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9uZUFjdGlvbnMubGVuZ3RoPjB9LGYuVW5kb1JlZG8ucHJvdG90eXBlLmlzUmVkb0F2YWlsYWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuZG9uZUFjdGlvbnMubGVuZ3RoPjB9LGYuVW5kb1JlZG8ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5kb25lQWN0aW9ucy5sZW5ndGg9MCx0aGlzLnVuZG9uZUFjdGlvbnMubGVuZ3RoPTB9LGYuVW5kb1JlZG8uQWN0aW9uPWZ1bmN0aW9uKCl7fSxmLlVuZG9SZWRvLkFjdGlvbi5wcm90b3R5cGUudW5kbz1mdW5jdGlvbigpe30sZi5VbmRvUmVkby5BY3Rpb24ucHJvdG90eXBlLnJlZG89ZnVuY3Rpb24oKXt9LGYuVW5kb1JlZG8uQ2hhbmdlQWN0aW9uPWZ1bmN0aW9uKGUpe3RoaXMuY2hhbmdlcz1lfSx3KGYuVW5kb1JlZG8uQ2hhbmdlQWN0aW9uLGYuVW5kb1JlZG8uQWN0aW9uKSxmLlVuZG9SZWRvLkNoYW5nZUFjdGlvbi5wcm90b3R5cGUudW5kbz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj12KHRoaXMuY2hhbmdlcyksbz1lLmNvdW50RW1wdHlSb3dzKCEwKSxyPWUuY291bnRFbXB0eUNvbHMoITApLGk9MCxzPW4ubGVuZ3RoO3M+aTtpKyspbltpXS5zcGxpY2UoMywxKTtlLmFkZEhvb2tPbmNlKCJhZnRlckNoYW5nZSIsdCksZS5zZXREYXRhQXRSb3dQcm9wKG4sbnVsbCxudWxsLCJ1bmRvIik7Zm9yKHZhciBpPTAscz1uLmxlbmd0aDtzPmk7aSsrKWUuZ2V0U2V0dGluZ3MoKS5taW5TcGFyZVJvd3MmJm5baV1bMF0rMStlLmdldFNldHRpbmdzKCkubWluU3BhcmVSb3dzPT09ZS5jb3VudFJvd3MoKSYmbz09ZS5nZXRTZXR0aW5ncygpLm1pblNwYXJlUm93cyYmKGUuYWx0ZXIoInJlbW92ZV9yb3ciLHBhcnNlSW50KG5baV1bMF0rMSwxMCksZS5nZXRTZXR0aW5ncygpLm1pblNwYXJlUm93cyksZS51bmRvUmVkby5kb25lQWN0aW9ucy5wb3AoKSksZS5nZXRTZXR0aW5ncygpLm1pblNwYXJlQ29scyYmbltpXVsxXSsxK2UuZ2V0U2V0dGluZ3MoKS5taW5TcGFyZUNvbHM9PT1lLmNvdW50Q29scygpJiZyPT1lLmdldFNldHRpbmdzKCkubWluU3BhcmVDb2xzJiYoZS5hbHRlcigicmVtb3ZlX2NvbCIscGFyc2VJbnQobltpXVsxXSsxLDEwKSxlLmdldFNldHRpbmdzKCkubWluU3BhcmVDb2xzKSxlLnVuZG9SZWRvLmRvbmVBY3Rpb25zLnBvcCgpKX0sZi5VbmRvUmVkby5DaGFuZ2VBY3Rpb24ucHJvdG90eXBlLnJlZG89ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dih0aGlzLmNoYW5nZXMpLG89MCxyPW4ubGVuZ3RoO3I+bztvKyspbltvXS5zcGxpY2UoMiwxKTtlLmFkZEhvb2tPbmNlKCJhZnRlckNoYW5nZSIsdCksZS5zZXREYXRhQXRSb3dQcm9wKG4sbnVsbCxudWxsLCJyZWRvIil9LGYuVW5kb1JlZG8uQ3JlYXRlUm93QWN0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy5pbmRleD1lLHRoaXMuYW1vdW50PXR9LHcoZi5VbmRvUmVkby5DcmVhdGVSb3dBY3Rpb24sZi5VbmRvUmVkby5BY3Rpb24pLGYuVW5kb1JlZG8uQ3JlYXRlUm93QWN0aW9uLnByb3RvdHlwZS51bmRvPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jb3VudFJvd3MoKSxvPWUuZ2V0U2V0dGluZ3MoKS5taW5TcGFyZVJvd3M7dGhpcy5pbmRleD49biYmdGhpcy5pbmRleC1vPG4mJih0aGlzLmluZGV4LT1vKSxlLmFkZEhvb2tPbmNlKCJhZnRlclJlbW92ZVJvdyIsdCksZS5hbHRlcigicmVtb3ZlX3JvdyIsdGhpcy5pbmRleCx0aGlzLmFtb3VudCl9LGYuVW5kb1JlZG8uQ3JlYXRlUm93QWN0aW9uLnByb3RvdHlwZS5yZWRvPWZ1bmN0aW9uKGUsdCl7ZS5hZGRIb29rT25jZSgiYWZ0ZXJDcmVhdGVSb3ciLHQpLGUuYWx0ZXIoImluc2VydF9yb3ciLHRoaXMuaW5kZXgrMSx0aGlzLmFtb3VudCl9LGYuVW5kb1JlZG8uUmVtb3ZlUm93QWN0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy5pbmRleD1lLHRoaXMuZGF0YT10fSx3KGYuVW5kb1JlZG8uUmVtb3ZlUm93QWN0aW9uLGYuVW5kb1JlZG8uQWN0aW9uKSxmLlVuZG9SZWRvLlJlbW92ZVJvd0FjdGlvbi5wcm90b3R5cGUudW5kbz1mdW5jdGlvbihlLHQpe3ZhciBuPVt0aGlzLmluZGV4LDBdO0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KG4sdGhpcy5kYXRhKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGUuZ2V0U291cmNlRGF0YSgpLG4pLGUuYWRkSG9va09uY2UoImFmdGVyUmVuZGVyIix0KSxlLnJlbmRlcigpfSxmLlVuZG9SZWRvLlJlbW92ZVJvd0FjdGlvbi5wcm90b3R5cGUucmVkbz1mdW5jdGlvbihlLHQpe2UuYWRkSG9va09uY2UoImFmdGVyUmVtb3ZlUm93Iix0KSxlLmFsdGVyKCJyZW1vdmVfcm93Iix0aGlzLmluZGV4LHRoaXMuZGF0YS5sZW5ndGgpfSxmLlVuZG9SZWRvLkNyZWF0ZUNvbHVtbkFjdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuaW5kZXg9ZSx0aGlzLmFtb3VudD10fSx3KGYuVW5kb1JlZG8uQ3JlYXRlQ29sdW1uQWN0aW9uLGYuVW5kb1JlZG8uQWN0aW9uKSxmLlVuZG9SZWRvLkNyZWF0ZUNvbHVtbkFjdGlvbi5wcm90b3R5cGUudW5kbz1mdW5jdGlvbihlLHQpe2UuYWRkSG9va09uY2UoImFmdGVyUmVtb3ZlQ29sIix0KSxlLmFsdGVyKCJyZW1vdmVfY29sIix0aGlzLmluZGV4LHRoaXMuYW1vdW50KX0sZi5VbmRvUmVkby5DcmVhdGVDb2x1bW5BY3Rpb24ucHJvdG90eXBlLnJlZG89ZnVuY3Rpb24oZSx0KXtlLmFkZEhvb2tPbmNlKCJhZnRlckNyZWF0ZUNvbCIsdCksZS5hbHRlcigiaW5zZXJ0X2NvbCIsdGhpcy5pbmRleCsxLHRoaXMuYW1vdW50KX0sZi5VbmRvUmVkby5DZWxsQWxpZ25tZW50QWN0aW9uPWZ1bmN0aW9uKGUsdCxuLG8pe3RoaXMuc3RhdGVCZWZvcmU9ZSx0aGlzLnJhbmdlPXQsdGhpcy50eXBlPW4sdGhpcy5hbGlnbm1lbnQ9b30sZi5VbmRvUmVkby5DZWxsQWxpZ25tZW50QWN0aW9uLnByb3RvdHlwZS51bmRvPWZ1bmN0aW9uKGUsdCl7aWYoZS5nZXRQbHVnaW4oImNvbnRleHRNZW51IikuaXNFbmFibGVkKCkpe2Zvcih2YXIgbj10aGlzLnJhbmdlLmZyb20ucm93O248PXRoaXMucmFuZ2UudG8ucm93O24rKylmb3IodmFyIG89dGhpcy5yYW5nZS5mcm9tLmNvbDtvPD10aGlzLnJhbmdlLnRvLmNvbDtvKyspZS5zZXRDZWxsTWV0YShuLG8sImNsYXNzTmFtZSIsdGhpcy5zdGF0ZUJlZm9yZVtuXVtvXXx8IiBodExlZnQiKTtlLmFkZEhvb2tPbmNlKCJhZnRlclJlbmRlciIsdCksZS5yZW5kZXIoKX19LGYuVW5kb1JlZG8uQ2VsbEFsaWdubWVudEFjdGlvbi5wcm90b3R5cGUucmVkbz1mdW5jdGlvbihlLHQpe2UuZ2V0UGx1Z2luKCJjb250ZXh0TWVudSIpLmlzRW5hYmxlZCgpJiYoZS5zZWxlY3RDZWxsKHRoaXMucmFuZ2UuZnJvbS5yb3csdGhpcy5yYW5nZS5mcm9tLmNvbCx0aGlzLnJhbmdlLnRvLnJvdyx0aGlzLnJhbmdlLnRvLmNvbCksZS5nZXRQbHVnaW4oImNvbnRleHRNZW51IikuZXhlY3V0ZUNvbW1hbmQoImFsaWdubWVudDoiK3RoaXMuYWxpZ25tZW50LnJlcGxhY2UoImh0IiwiIikudG9Mb3dlckNhc2UoKSksZS5hZGRIb29rT25jZSgiYWZ0ZXJSZW5kZXIiLHQpLGUucmVuZGVyKCkpfSxmLlVuZG9SZWRvLlJlbW92ZUNvbHVtbkFjdGlvbj1mdW5jdGlvbihlLHQsbixvKXt0aGlzLmluZGV4ZXM9ZSx0aGlzLmRhdGE9dCx0aGlzLmFtb3VudD10aGlzLmRhdGFbMF0ubGVuZ3RoLHRoaXMuaGVhZGVycz1uLHRoaXMuY29sdW1uUG9zaXRpb25zPW8uc2xpY2UoMCl9LHcoZi5VbmRvUmVkby5SZW1vdmVDb2x1bW5BY3Rpb24sZi5VbmRvUmVkby5BY3Rpb24pLGYuVW5kb1JlZG8uUmVtb3ZlQ29sdW1uQWN0aW9uLnByb3RvdHlwZS51bmRvPWZ1bmN0aW9uKGUsdCl7dmFyIG4sbz10aGlzLHI9dGhpcy5pbmRleGVzLnNsaWNlKDApLnNvcnQoKSxpPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbltvLmluZGV4ZXMuaW5kZXhPZihyW3RdKV19LHM9W107ZygwLHRoaXMuZGF0YS5sZW5ndGgtMSxmdW5jdGlvbihlKXtzW2VdPXAoby5kYXRhW2VdLGkpfSk7dmFyIGw9W107bD1wKHRoaXMuaGVhZGVycyxpKSxnKDAsdGhpcy5kYXRhLmxlbmd0aC0xLGZ1bmN0aW9uKHQpe249ZS5nZXRTb3VyY2VEYXRhQXRSb3codCksZygwLHIubGVuZ3RoLTEsZnVuY3Rpb24oZSl7bi5zcGxpY2UocltlXSwwLHNbdF1bZV0pfSl9KSwidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuaGVhZGVycyYmZygwLGwubGVuZ3RoLTEsZnVuY3Rpb24odCl7ZS5nZXRTZXR0aW5ncygpLmNvbEhlYWRlcnMuc3BsaWNlKHJbdF0sMCxsW3RdKX0pLGUuZ2V0UGx1Z2luKCJtYW51YWxDb2x1bW5Nb3ZlIikmJihlLmdldFBsdWdpbigibWFudWFsQ29sdW1uTW92ZSIpLmNvbHVtblBvc2l0aW9ucz10aGlzLmNvbHVtblBvc2l0aW9ucyksZS5hZGRIb29rT25jZSgiYWZ0ZXJSZW5kZXIiLHQpLGUucmVuZGVyKCl9LGYuVW5kb1JlZG8uUmVtb3ZlQ29sdW1uQWN0aW9uLnByb3RvdHlwZS5yZWRvPWZ1bmN0aW9uKGUsdCl7ZS5hZGRIb29rT25jZSgiYWZ0ZXJSZW1vdmVDb2wiLHQpLGUuYWx0ZXIoInJlbW92ZV9jb2wiLGUucnVuSG9va3MoInVubW9kaWZ5Q29sIix0aGlzLmluZGV4ZXNbMF0pLHRoaXMuYW1vdW50KX0sZi5VbmRvUmVkby5GaWx0ZXJzQWN0aW9uPWZ1bmN0aW9uKGUpe3RoaXMuZm9ybXVsYVN0YWNrcz1lfSx3KGYuVW5kb1JlZG8uRmlsdGVyc0FjdGlvbixmLlVuZG9SZWRvLkFjdGlvbiksZi5VbmRvUmVkby5GaWx0ZXJzQWN0aW9uLnByb3RvdHlwZS51bmRvPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRQbHVnaW4oImZpbHRlcnMiKTtlLmFkZEhvb2tPbmNlKCJhZnRlclJlbmRlciIsdCksbi5mb3JtdWxhQ29sbGVjdGlvbi5pbXBvcnRBbGxGb3JtdWxhcyh0aGlzLmZvcm11bGFTdGFja3Muc2xpY2UoMCx0aGlzLmZvcm11bGFTdGFja3MubGVuZ3RoLTEpKSxuLmZpbHRlcigpfSxmLlVuZG9SZWRvLkZpbHRlcnNBY3Rpb24ucHJvdG90eXBlLnJlZG89ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldFBsdWdpbigiZmlsdGVycyIpO2UuYWRkSG9va09uY2UoImFmdGVyUmVuZGVyIix0KSxuLmZvcm11bGFDb2xsZWN0aW9uLmltcG9ydEFsbEZvcm11bGFzKHRoaXMuZm9ybXVsYVN0YWNrcyksbi5maWx0ZXIoKX0sZi5ob29rcy5hZGQoImFmdGVySW5pdCIsbyksZi5ob29rcy5hZGQoImFmdGVyVXBkYXRlU2V0dGluZ3MiLG8pfSx7YnJvd3NlcjoyMywiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvZG9tL2V2ZW50Ijo0NywiaGVscGVycy9udW1iZXIiOjUxLCJoZWxwZXJzL29iamVjdCI6NTJ9XSw5MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7dmFyIG47Y1tlXT10LG49dShlKSsiUmVuZGVyZXIiLGEucmVuZGVyZXJzW25dPXQsYVtuXT10LCJiYXNlIj09PWUmJihhLnJlbmRlcmVycy5jZWxsRGVjb3JhdG9yPXQpfWZ1bmN0aW9uIHIoZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IEVycm9yKCdPbmx5IHN0cmluZ3MgYW5kIGZ1bmN0aW9ucyBjYW4gYmUgcGFzc2VkIGFzICJyZW5kZXJlciIgcGFyYW1ldGVyJyk7aWYoIShlIGluIGMpKXRocm93IEVycm9yKCdObyBlZGl0b3IgcmVnaXN0ZXJlZCB1bmRlciBuYW1lICInK2UrJyInKTtyZXR1cm4gY1tlXX1mdW5jdGlvbiBpKGUpe3JldHVybiBlIGluIGN9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7cmVnaXN0ZXJSZW5kZXJlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxnZXRSZW5kZXJlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSxoYXNSZW5kZXJlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgcyxsLGE9KHM9ZSgiYnJvd3NlciIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSlbImRlZmF1bHQiXSx1PShsPWUoImhlbHBlcnMvc3RyaW5nIiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KS50b1VwcGVyQ2FzZUZpcnN0LGM9e307YS5yZW5kZXJlcnM9YS5yZW5kZXJlcnN8fHt9LGEucmVuZGVyZXJzLnJlZ2lzdGVyUmVuZGVyZXI9byxhLnJlbmRlcmVycy5nZXRSZW5kZXJlcj1yfSx7YnJvd3NlcjoyMywiaGVscGVycy9zdHJpbmciOjU0fV0sOTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQsbixvLHIsaSxzKXtzLmNsYXNzTmFtZSYmKHQuY2xhc3NOYW1lP3QuY2xhc3NOYW1lPXQuY2xhc3NOYW1lKyIgIitzLmNsYXNzTmFtZTp0LmNsYXNzTmFtZT1zLmNsYXNzTmFtZSkscy5yZWFkT25seSYmbCh0LHMucmVhZE9ubHlDZWxsQ2xhc3NOYW1lKSxzLnZhbGlkPT09ITEmJnMuaW52YWxpZENlbGxDbGFzc05hbWU/bCh0LHMuaW52YWxpZENlbGxDbGFzc05hbWUpOmEodCxzLmludmFsaWRDZWxsQ2xhc3NOYW1lKSxzLndvcmRXcmFwPT09ITEmJnMubm9Xb3JkV3JhcENsYXNzTmFtZSYmbCh0LHMubm9Xb3JkV3JhcENsYXNzTmFtZSksIWkmJnMucGxhY2Vob2xkZXImJmwodCxzLnBsYWNlaG9sZGVyQ2VsbENsYXNzTmFtZSl9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7Y2VsbERlY29yYXRvcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgcixpLHM9KHI9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSksbD1zLmFkZENsYXNzLGE9cy5yZW1vdmVDbGFzcyx1PShpPWUoInJlbmRlcmVycyIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkucmVnaXN0ZXJSZW5kZXJlcjt1KCJiYXNlIixvKX0seyJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NixyZW5kZXJlcnM6OTJ9XSw5NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCxuLG8scixpLHMpe3ZhciBsPShtLmNsb25lTm9kZSghMCksdy5jbG9uZU5vZGUoITApKTtpZihmKCJ0ZXh0IikoZSx0LG4sbyxyLGkscyksdC5hcHBlbmRDaGlsZChsKSx1KHQsImh0QXV0b2NvbXBsZXRlIiksdC5maXJzdENoaWxkfHx0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpLCFlLmFjQXJyb3dMaXN0ZW5lcil7dmFyIGE9aChlKTtlLmFjQXJyb3dMaXN0ZW5lcj1mdW5jdGlvbihyKXtjKHIudGFyZ2V0LCJodEF1dG9jb21wbGV0ZUFycm93IikmJmUudmlldy53dC5nZXRTZXR0aW5nKCJvbkNlbGxEYmxDbGljayIsbnVsbCxuZXcgZyhuLG8pLHQpfSxhLmFkZEV2ZW50TGlzdGVuZXIoZS5yb290RWxlbWVudCwibW91c2Vkb3duIixlLmFjQXJyb3dMaXN0ZW5lciksZS5hZGRIb29rT25jZSgiYWZ0ZXJEZXN0cm95IixmdW5jdGlvbigpe2EuZGVzdHJveSgpfSl9fU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se2F1dG9jb21wbGV0ZVJlbmRlcmVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciByLGkscyxsLGE9KHI9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSksdT1hLmFkZENsYXNzLGM9YS5oYXNDbGFzcyxoPShhLmVtcHR5LChpPWUoImV2ZW50TWFuYWdlciIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkuZXZlbnRNYW5hZ2VyKSxkPShzPWUoInJlbmRlcmVycyIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSksZj1kLmdldFJlbmRlcmVyLHA9ZC5yZWdpc3RlclJlbmRlcmVyLGc9KGw9ZSgiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL2NlbGwvY29vcmRzIiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KS5XYWxrb250YWJsZUNlbGxDb29yZHMsbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKTttLmNsYXNzTmFtZT0iaHRBdXRvY29tcGxldGVXcmFwcGVyIjt2YXIgdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKTt3LmNsYXNzTmFtZT0iaHRBdXRvY29tcGxldGVBcnJvdyIsdy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDk2NjApKSk7cCgiYXV0b2NvbXBsZXRlIixvKX0seyIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY2VsbC9jb29yZHMiOjUsZXZlbnRNYW5hZ2VyOjQxLCJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NixyZW5kZXJlcnM6OTJ9XSw5NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCxuLG8sdSxjLGgpe2Z1bmN0aW9uIGQoZSl7dmFyIHQ9W0UuU1BBQ0UsRS5FTlRFUixFLkRFTEVURSxFLkJBQ0tTUEFDRV07LTE9PT10LmluZGV4T2YoZS5rZXlDb2RlKXx8TyhlKXx8ZyhmdW5jdGlvbigpe00oZSksZS5wcmV2ZW50RGVmYXVsdCgpfSksZS5rZXlDb2RlIT09RS5TUEFDRSYmZS5rZXlDb2RlIT09RS5FTlRFUnx8ZigpLGUua2V5Q29kZSE9PUUuREVMRVRFJiZlLmtleUNvZGUhPT1FLkJBQ0tTUEFDRXx8ZighMSl9ZnVuY3Rpb24gZigpe3ZhciBlPXZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDtnKGZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLG89dC5sZW5ndGg7bz5uO24rKyl7aWYoeSh0W25dLEQpJiZudWxsPT09ZSlyZXR1cm47cCh0W25dLGUpfX0pfWZ1bmN0aW9uIHAoZSl7dmFyIHQ9dm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO251bGw9PT10P2UuY2hlY2tlZD0hZS5jaGVja2VkOmUuY2hlY2tlZD10LG0uZmlyZUV2ZW50KGUsImNoYW5nZSIpfWZ1bmN0aW9uIGcodCl7dmFyIG49ZS5nZXRTZWxlY3RlZFJhbmdlKCk7aWYobilmb3IodmFyIG89bi5nZXRUb3BMZWZ0Q29ybmVyKCkscj1uLmdldEJvdHRvbVJpZ2h0Q29ybmVyKCksaT1vLnJvdztpPD1yLnJvdztpKyspZm9yKHZhciBzPW8uY29sO3M8PXIuY29sO3MrKyl7dmFyIGw9ZS5nZXRDZWxsKGkscyksYT1lLmdldENlbGxNZXRhKGkscyksdT1sLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W3R5cGU9Y2hlY2tib3hdIik7dS5sZW5ndGg+MCYmIWEucmVhZE9ubHkmJnQodSl9fVIoImJhc2UiKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIG09bmV3IEMoZSksXz1yKCksUz1oLmxhYmVsLFQ9ITE7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBoLmNoZWNrZWRUZW1wbGF0ZSYmKGguY2hlY2tlZFRlbXBsYXRlPSEwKSwidW5kZWZpbmVkIj09dHlwZW9mIGgudW5jaGVja2VkVGVtcGxhdGUmJihoLnVuY2hlY2tlZFRlbXBsYXRlPSExKSx3KHQpLGM9PT1oLmNoZWNrZWRUZW1wbGF0ZXx8YihjLGguY2hlY2tlZFRlbXBsYXRlKT9fLmNoZWNrZWQ9ITA6Yz09PWgudW5jaGVja2VkVGVtcGxhdGV8fGIoYyxoLnVuY2hlY2tlZFRlbXBsYXRlKT9fLmNoZWNrZWQ9ITE6bnVsbD09PWM/dihfLCJub1ZhbHVlIik6KF8uc3R5bGUuZGlzcGxheT0ibm9uZSIsdihfLEQpLFQ9ITApLF8uc2V0QXR0cmlidXRlKCJkYXRhLXJvdyIsbiksXy5zZXRBdHRyaWJ1dGUoImRhdGEtY29sIixvKSwhVCYmUyl7dmFyIEE9IiI7Uy52YWx1ZT9BPSJmdW5jdGlvbiI9PXR5cGVvZiBTLnZhbHVlP1MudmFsdWUuY2FsbCh0aGlzLG4sbyx1LGMpOlMudmFsdWU6Uy5wcm9wZXJ0eSYmKEE9ZS5nZXREYXRhQXRSb3dQcm9wKG4sUy5wcm9wZXJ0eSkpO3ZhciB4PWkoQSk7ImJlZm9yZSI9PT1TLnBvc2l0aW9uP3guYXBwZW5kQ2hpbGQoXyk6eC5pbnNlcnRCZWZvcmUoXyx4LmZpcnN0Q2hpbGQpLF89eH10LmFwcGVuZENoaWxkKF8pLFQmJnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiNiYWQtdmFsdWUjIikpLEguaGFzKGUpfHwoaC5yZWFkT25seT9tLmFkZEV2ZW50TGlzdGVuZXIoZS5yb290RWxlbWVudCwiY2xpY2siLHMpOihtLmFkZEV2ZW50TGlzdGVuZXIoZS5yb290RWxlbWVudCwibW91c2V1cCIsZnVuY3Rpb24odCl7cmV0dXJuIGwodCxlKX0pLG0uYWRkRXZlbnRMaXN0ZW5lcihlLnJvb3RFbGVtZW50LCJjaGFuZ2UiLGZ1bmN0aW9uKHQpe3JldHVybiBhKHQsZSl9KSksSC5zZXQoZSwhMCkpLGsuaGFzKGUpfHwoay5zZXQoZSwhMCksZS5hZGRIb29rKCJiZWZvcmVLZXlEb3duIixkKSl9ZnVuY3Rpb24gcigpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7cmV0dXJuIGUuY2xhc3NOYW1lPSJodENoZWNrYm94UmVuZGVyZXJJbnB1dCIsZS50eXBlPSJjaGVja2JveCIsZS5zZXRBdHRyaWJ1dGUoImF1dG9jb21wbGV0ZSIsIm9mZiIpLGUuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIiksZS5jbG9uZU5vZGUoITEpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtyZXR1cm4gdC5jbGFzc05hbWU9Imh0Q2hlY2tib3hSZW5kZXJlckxhYmVsIix0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpKSx0LmNsb25lTm9kZSghMCl9ZnVuY3Rpb24gcyhlKXt1KGUudGFyZ2V0KSYmZS5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIGwoZSx0KXt1KGUudGFyZ2V0KSYmc2V0VGltZW91dCh0Lmxpc3RlbiwxMCl9ZnVuY3Rpb24gYShlLHQpe2lmKCF1KGUudGFyZ2V0KSlyZXR1cm4hMTt2YXIgbj1wYXJzZUludChlLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtcm93IiksMTApLG89cGFyc2VJbnQoZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbCIpLDEwKSxyPXQuZ2V0Q2VsbE1ldGEobixvKTt0LnNldERhdGFBdENlbGwobixvLGUudGFyZ2V0LmNoZWNrZWQ/ci5jaGVja2VkVGVtcGxhdGV8fCEwOnIudW5jaGVja2VkVGVtcGxhdGV8fCExKX1mdW5jdGlvbiB1KGUpe3JldHVybiJJTlBVVCI9PT1lLnRhZ05hbWUmJiJjaGVja2JveCI9PT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se2NoZWNrYm94UmVuZGVyZXI6e2dldDpmdW5jdGlvbigpe3JldHVybiBvfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIGMsaCxkLGYscCxnLG09KGM9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLGMmJmMuX19lc01vZHVsZSYmY3x8eyJkZWZhdWx0IjpjfSksdz1tLmVtcHR5LHY9bS5hZGRDbGFzcyx5PW0uaGFzQ2xhc3MsYj0oaD1lKCJoZWxwZXJzL3N0cmluZyIpLGgmJmguX19lc01vZHVsZSYmaHx8eyJkZWZhdWx0IjpofSkuZXF1YWxzSWdub3JlQ2FzZSxDPShkPWUoImV2ZW50TWFuYWdlciIpLGQmJmQuX19lc01vZHVsZSYmZHx8eyJkZWZhdWx0IjpkfSkuRXZlbnRNYW5hZ2VyLF89KGY9ZSgicmVuZGVyZXJzIiksZiYmZi5fX2VzTW9kdWxlJiZmfHx7ImRlZmF1bHQiOmZ9KSxSPV8uZ2V0UmVuZGVyZXIsUz1fLnJlZ2lzdGVyUmVuZGVyZXIsRT0ocD1lKCJoZWxwZXJzL3VuaWNvZGUiKSxwJiZwLl9fZXNNb2R1bGUmJnB8fHsiZGVmYXVsdCI6cH0pLktFWV9DT0RFUyxUPShnPWUoImhlbHBlcnMvZG9tL2V2ZW50IiksZyYmZy5fX2VzTW9kdWxlJiZnfHx7ImRlZmF1bHQiOmd9KSxNPShULnN0b3BQcm9wYWdhdGlvbixULnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiksTz1ULmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkLGs9bmV3IFdlYWtNYXAsSD1uZXcgV2Vha01hcCxEPSJodEJhZFZhbHVlIjtTKCJjaGVja2JveCIsbyl9LHtldmVudE1hbmFnZXI6NDEsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL2RvbS9ldmVudCI6NDcsImhlbHBlcnMvc3RyaW5nIjo1NCwiaGVscGVycy91bmljb2RlIjo1NSxyZW5kZXJlcnM6OTJ9XSw5NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCxuLG8scixpLGwpe2EoImJhc2UiKS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbnVsbCE9PWkmJnZvaWQgMCE9PWl8fChpPSIiKSxzKHQsaSl9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7aHRtbFJlbmRlcmVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciByLGkscz0ocj1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KS5mYXN0SW5uZXJIVE1MLGw9KGk9ZSgicmVuZGVyZXJzIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KSxhPWwuZ2V0UmVuZGVyZXIsdT1sLnJlZ2lzdGVyUmVuZGVyZXI7dSgiaHRtbCIsbyl9LHsiaGVscGVycy9kb20vZWxlbWVudCI6NDYscmVuZGVyZXJzOjkyfV0sOTc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQsbixvLHIsaSxzKXtpZihoKGkpKXsidW5kZWZpbmVkIiE9dHlwZW9mIHMubGFuZ3VhZ2UmJmwubGFuZ3VhZ2Uocy5sYW5ndWFnZSksaT1sKGkpLmZvcm1hdChzLmZvcm1hdHx8IjAiKTt2YXIgYT1zLmNsYXNzTmFtZXx8IiIsYz1hLmxlbmd0aD9hLnNwbGl0KCIgIik6W107Yy5pbmRleE9mKCJodExlZnQiKTwwJiZjLmluZGV4T2YoImh0Q2VudGVyIik8MCYmYy5pbmRleE9mKCJodFJpZ2h0Iik8MCYmYy5pbmRleE9mKCJodEp1c3RpZnkiKTwwJiZjLnB1c2goImh0UmlnaHQiKSxjLmluZGV4T2YoImh0TnVtZXJpYyIpPDAmJmMucHVzaCgiaHROdW1lcmljIikscy5jbGFzc05hbWU9Yy5qb2luKCIgIil9dSgidGV4dCIpKGUsdCxuLG8scixpLHMpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se251bWVyaWNSZW5kZXJlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgcixpLHMsbD0ocj1lKCJudW1lcmFsIiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KVsiZGVmYXVsdCJdLGE9KGk9ZSgicmVuZGVyZXJzIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KSx1PWEuZ2V0UmVuZGVyZXIsYz1hLnJlZ2lzdGVyUmVuZGVyZXIsaD0ocz1lKCJoZWxwZXJzL251bWJlciIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuaXNOdW1lcmljO2MoIm51bWVyaWMiLG8pfSx7ImhlbHBlcnMvbnVtYmVyIjo1MSxudW1lcmFsOiJudW1lcmFsIixyZW5kZXJlcnM6OTJ9XSw5ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCxuLG8scixpLGwpe2EoInRleHQiKS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaT10LmlubmVySFRNTDt2YXIgdSxjPWwuaGFzaExlbmd0aHx8aS5sZW5ndGgsaD1sLmhhc2hTeW1ib2x8fCIqIjtmb3IodT0iIjt1LnNwbGl0KGgpLmxlbmd0aC0xPGM7dSs9aCk7cyh0LHUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se3Bhc3N3b3JkUmVuZGVyZXI6e2dldDpmdW5jdGlvbigpe3JldHVybiBvfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIHIsaSxzPShyPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pLmZhc3RJbm5lckhUTUwsbD0oaT1lKCJyZW5kZXJlcnMiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLGE9bC5nZXRSZW5kZXJlcix1PWwucmVnaXN0ZXJSZW5kZXJlcjt1KCJwYXNzd29yZCIsbyl9LHsiaGVscGVycy9kb20vZWxlbWVudCI6NDYscmVuZGVyZXJzOjkyfV0sOTk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQsbixvLHIsaSxzKXtkKCJiYXNlIikuYXBwbHkodGhpcyxhcmd1bWVudHMpLCFpJiZzLnBsYWNlaG9sZGVyJiYoaT1zLnBsYWNlaG9sZGVyKTt2YXIgbD1jKGkpO2lmKGUuZ2V0U2V0dGluZ3MoKS50cmltV2hpdGVzcGFjZXx8KGw9bC5yZXBsYWNlKC8gL2csU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSkscy5yZW5kZXJlclRlbXBsYXRlKXthKHQpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRFTVBMQVRFIik7aC5zZXRBdHRyaWJ1dGUoImJpbmQiLCJ7e319IiksaC5pbm5lckhUTUw9cy5yZW5kZXJlclRlbXBsYXRlLEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUoaCksaC5tb2RlbD1lLmdldFNvdXJjZURhdGFBdFJvdyhuKSx0LmFwcGVuZENoaWxkKGgpfWVsc2UgdSh0LGwpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se3RleHRSZW5kZXJlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgcixpLHMsbD0ocj1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksciYmci5fX2VzTW9kdWxlJiZyfHx7ImRlZmF1bHQiOnJ9KSxhPWwuZW1wdHksdT1sLmZhc3RJbm5lclRleHQsYz0oaT1lKCJoZWxwZXJzL21peGVkIiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KS5zdHJpbmdpZnksaD0ocz1lKCJyZW5kZXJlcnMiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLGQ9aC5nZXRSZW5kZXJlcixmPWgucmVnaXN0ZXJSZW5kZXJlcjtmKCJ0ZXh0IixvKX0seyJoZWxwZXJzL2RvbS9lbGVtZW50Ijo0NiwiaGVscGVycy9taXhlZCI6NTAscmVuZGVyZXJzOjkyfV0sMTAwOltmdW5jdGlvbihlLHQsbil7IWZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUpe3JldHVybntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTplLHdyaXRhYmxlOiEwfX1mdW5jdGlvbiBuKCl7cmV0dXJuIl9fJCIrTWF0aC5mbG9vcigxZTkqTWF0aC5yYW5kb20oKSkrIiQiKyArK0ErIiRfXyJ9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gV1tlXX1mdW5jdGlvbiByKCl7dmFyIGU9bigpO3JldHVybiBXW2VdPSEwLGV9ZnVuY3Rpb24gaShlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJmUgaW5zdGFuY2VvZiBhfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGkoZSk/InN5bWJvbCI6dHlwZW9mIGV9ZnVuY3Rpb24gbChlKXt2YXIgdD1uZXcgYShlKTtpZighKHRoaXMgaW5zdGFuY2VvZiBsKSlyZXR1cm4gdDt0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wgY2Fubm90IGJlIG5ldydlZCIpfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9bigpO0UodGhpcyxOLHt2YWx1ZTp0aGlzfSksRSh0aGlzLHgse3ZhbHVlOnR9KSxFKHRoaXMsUCx7dmFsdWU6ZX0pLGModGhpcyksTFt0XT10aGlzfWZ1bmN0aW9uIHUoZSl7dmFyIHQ9ZVtJXTtyZXR1cm4gdCYmdC5zZWxmPT09ZT90OkgoZSk/KFYuaGFzaC52YWx1ZT1GKyssVi5zZWxmLnZhbHVlPWUsai52YWx1ZT1SKG51bGwsViksRShlLEksaiksai52YWx1ZSk6dm9pZCAwfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIHUoZSksVC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gaChlKXtyZXR1cm4gTFtlXXx8V1tlXX1mdW5jdGlvbiBkKGUpe3JldHVybiBpKGUpP2VbeF06ZX1mdW5jdGlvbiBmKGUpe2Zvcih2YXIgdD1bXSxuPU8oZSksbz0wO288bi5sZW5ndGg7bysrKXt2YXIgcj1MW25bb11dO3ImJnQucHVzaChyKX1yZXR1cm4gdH1mdW5jdGlvbiBwKHQpew0KcmV0dXJuIGUudHJhY2V1ciYmZS50cmFjZXVyLm9wdGlvbnNbdF19ZnVuY3Rpb24gZyhlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWZvcih2YXIgbj1PKGFyZ3VtZW50c1t0XSksbz0wO288bi5sZW5ndGg7bysrKXt2YXIgcj1uW29dO2gocil8fCFmdW5jdGlvbih0LG4pe0UoZSxuLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtuXX0sZW51bWVyYWJsZTohMH0pfShhcmd1bWVudHNbdF0sbltvXSl9cmV0dXJuIGV9ZnVuY3Rpb24gbShlKXtyZXR1cm4gbnVsbCE9ZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpfWZ1bmN0aW9uIHcoZSl7aWYobnVsbD09ZSl0aHJvdyBfKCk7cmV0dXJuIEMoZSl9ZnVuY3Rpb24gdihlKXtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW4gT2JqZWN0Iik7cmV0dXJuIGV9ZnVuY3Rpb24geShlLHQpe2UuU3ltYm9sfHwoZS5TeW1ib2w9dCxPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzPWYpLGUuU3ltYm9sLml0ZXJhdG9yfHwoZS5TeW1ib2wuaXRlcmF0b3I9dCgiU3ltYm9sLml0ZXJhdG9yIikpfWZ1bmN0aW9uIGIoZSl7eShlLGwpLGUuUmVmbGVjdD1lLlJlZmxlY3R8fHt9LGUuUmVmbGVjdC5nbG9iYWw9ZS5SZWZsZWN0Lmdsb2JhbHx8ZX1pZighZS4kdHJhY2V1clJ1bnRpbWUpe3ZhciBDPU9iamVjdCxfPVR5cGVFcnJvcixSPUMuY3JlYXRlLFM9Qy5kZWZpbmVQcm9wZXJ0aWVzLEU9Qy5kZWZpbmVQcm9wZXJ0eSxUPUMuZnJlZXplLE09Qy5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsTz1DLmdldE93blByb3BlcnR5TmFtZXMsaz1DLmtleXMsSD1PYmplY3QuaXNFeHRlbnNpYmxlLEQ9dCxBPTAseD1uKCksUD1uKCksTj1uKCksTD1SKG51bGwpLFc9UihudWxsKTtFKGwucHJvdG90eXBlLCJjb25zdHJ1Y3RvciIsdChsKSksRShsLnByb3RvdHlwZSwidG9TdHJpbmciLEQoZnVuY3Rpb24oKXt2YXIgZT10aGlzW05dO2lmKCFwKCJzeW1ib2xzIikpcmV0dXJuIGVbeF07aWYoIWUpdGhyb3cgVHlwZUVycm9yKCJDb252ZXJzaW9uIGZyb20gc3ltYm9sIHRvIHN0cmluZyIpO3ZhciB0PWVbUF07cmV0dXJuIHZvaWQgMD09PXQmJih0PSIiKSwiU3ltYm9sKCIrdCsiKSJ9KSksRShsLnByb3RvdHlwZSwidmFsdWVPZiIsRChmdW5jdGlvbigpe3ZhciBlPXRoaXNbTl07aWYoIWUpdGhyb3cgVHlwZUVycm9yKCJDb252ZXJzaW9uIGZyb20gc3ltYm9sIHRvIHN0cmluZyIpO3JldHVybiBwKCJzeW1ib2xzIik/ZTplW3hdfSkpLEUoYS5wcm90b3R5cGUsImNvbnN0cnVjdG9yIix0KGwpKSxFKGEucHJvdG90eXBlLCJ0b1N0cmluZyIse3ZhbHVlOmwucHJvdG90eXBlLnRvU3RyaW5nLGVudW1lcmFibGU6ITF9KSxFKGEucHJvdG90eXBlLCJ2YWx1ZU9mIix7dmFsdWU6bC5wcm90b3R5cGUudmFsdWVPZixlbnVtZXJhYmxlOiExfSk7dmFyIEk9cigpLGo9e3ZhbHVlOnZvaWQgMH0sVj17aGFzaDp7dmFsdWU6dm9pZCAwfSxzZWxmOnt2YWx1ZTp2b2lkIDB9fSxGPTA7YyhhLnByb3RvdHlwZSksYihlKSxlLiR0cmFjZXVyUnVudGltZT17Y2hlY2tPYmplY3RDb2VyY2libGU6dixjcmVhdGVQcml2YXRlTmFtZTpyLGRlZmluZVByb3BlcnRpZXM6UyxkZWZpbmVQcm9wZXJ0eTpFLGV4cG9ydFN0YXI6ZyxnZXRPd25IYXNoT2JqZWN0OnUsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOk0sZ2V0T3duUHJvcGVydHlOYW1lczpPLGlzT2JqZWN0Om0saXNQcml2YXRlTmFtZTpvLGlzU3ltYm9sU3RyaW5nOmgsa2V5czprLHNldHVwR2xvYmFsczpiLHRvT2JqZWN0OncsdG9Qcm9wZXJ0eTpkLCJ0eXBlb2YiOnN9fX0od2luZG93KSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlLG49W10sbz0wLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgaT0kdHJhY2V1clJ1bnRpbWUuY2hlY2tPYmplY3RDb2VyY2libGUoYXJndW1lbnRzW3JdKTsiZnVuY3Rpb24iIT10eXBlb2YgaVt0KFN5bWJvbC5pdGVyYXRvcildJiYoaVt0KFN5bWJvbC5pdGVyYXRvcildPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUubGVuZ3RoLG49MDtyZXR1cm57bmV4dDpmdW5jdGlvbigpe3ZhciBvPXtkb25lOiEwfTtyZXR1cm4gdD5uJiYoby5kb25lPSExLG8udmFsdWU9ZVtuXSwrK24pLG99fX0pO2Zvcih2YXIgcz1pW3QoU3ltYm9sLml0ZXJhdG9yKV0oKTshKGU9cy5uZXh0KCkpLmRvbmU7KW5bbysrXT1lLnZhbHVlfXJldHVybiBufXZhciB0PSR0cmFjZXVyUnVudGltZS50b1Byb3BlcnR5OyR0cmFjZXVyUnVudGltZS5zcHJlYWQ9ZX0oKSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKGUsdCl7dmFyIG49ZyhlKTtkb3t2YXIgbz1wKG4sdCk7aWYobylyZXR1cm4gbztuPWcobil9d2hpbGUobil9ZnVuY3Rpb24gdChlKXtyZXR1cm4gZS5fX3Byb3RvX199ZnVuY3Rpb24gbihlLHQsbixyKXtyZXR1cm4gbyhlLHQsbikuYXBwbHkoZSxyKX1mdW5jdGlvbiBvKHQsbixvKXt2YXIgcj1lKG4sbyk7cmV0dXJuIHI/ci5nZXQ/ci5nZXQuY2FsbCh0KTpyLnZhbHVlOnZvaWQgMH1mdW5jdGlvbiByKHQsbixvLHIpe3ZhciBpPWUobixvKTtpZihpJiZpLnNldClyZXR1cm4gaS5zZXQuY2FsbCh0LHIpLHI7dGhyb3cgYygic3VwZXIgaGFzIG5vIHNldHRlciAnIitvKyInLiIpfWZ1bmN0aW9uIGkoZSl7Zm9yKHZhciB0PXt9LG49dihlKSxvPTA7bzxuLmxlbmd0aDtvKyspe3ZhciByPW5bb107dFtyXT1wKGUscil9Zm9yKHZhciBpPXkoZSksbz0wO288aS5sZW5ndGg7bysrKXt2YXIgcz1pW29dO3RbbShzKV09cChlLG0ocykpfXJldHVybiB0fWZ1bmN0aW9uIHMoZSx0LG4sbyl7cmV0dXJuIGYodCwiY29uc3RydWN0b3IiLHt2YWx1ZTplLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwfSksYXJndW1lbnRzLmxlbmd0aD4zPygiZnVuY3Rpb24iPT10eXBlb2YgbyYmKGUuX19wcm90b19fPW8pLGUucHJvdG90eXBlPWgobChvKSxpKHQpKSk6ZS5wcm90b3R5cGU9dCxmKGUsInByb3RvdHlwZSIse2NvbmZpZ3VyYWJsZTohMSx3cml0YWJsZTohMX0pLGQoZSxpKG4pKX1mdW5jdGlvbiBsKGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlKXt2YXIgdD1lLnByb3RvdHlwZTtpZih1KHQpPT09dHx8bnVsbD09PXQpcmV0dXJuIGUucHJvdG90eXBlO3Rocm93IG5ldyBjKCJzdXBlciBwcm90b3R5cGUgbXVzdCBiZSBhbiBPYmplY3Qgb3IgbnVsbCIpfWlmKG51bGw9PT1lKXJldHVybiBudWxsO3Rocm93IG5ldyBjKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUrIi4iKX1mdW5jdGlvbiBhKGUsdCxvKXtudWxsIT09Zyh0KSYmbihlLHQsImNvbnN0cnVjdG9yIixvKX12YXIgdT1PYmplY3QsYz1UeXBlRXJyb3IsaD11LmNyZWF0ZSxkPSR0cmFjZXVyUnVudGltZS5kZWZpbmVQcm9wZXJ0aWVzLGY9JHRyYWNldXJSdW50aW1lLmRlZmluZVByb3BlcnR5LHA9JHRyYWNldXJSdW50aW1lLmdldE93blByb3BlcnR5RGVzY3JpcHRvcixnPU9iamVjdC5nZXRQcm90b3R5cGVPZixtPSR0cmFjZXVyUnVudGltZS50b1Byb3BlcnR5LHc9T2JqZWN0LHY9dy5nZXRPd25Qcm9wZXJ0eU5hbWVzLHk9dy5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzPXMsJHRyYWNldXJSdW50aW1lLmRlZmF1bHRTdXBlckNhbGw9YSwkdHJhY2V1clJ1bnRpbWUuc3VwZXJDYWxsPW4sJHRyYWNldXJSdW50aW1lLnN1cGVyQ29uc3RydWN0b3I9dCwkdHJhY2V1clJ1bnRpbWUuc3VwZXJHZXQ9bywkdHJhY2V1clJ1bnRpbWUuc3VwZXJTZXQ9cn0oKX0se31dLDEwMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe3ZhciB0PXRoaXMsbj10aGlzO3RoaXMuZXZlbnRNYW5hZ2VyPV8oZSksdGhpcy5pbnN0YW5jZT1lLHRoaXMuc2V0dGluZ3M9ZS5nZXRTZXR0aW5ncygpLHRoaXMuc2VsZWN0aW9uTW91c2VEb3duPSExO3ZhciBvPWUucm9vdEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpO28mJmUucm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsc3R5bGUiLG8pLGYoZS5yb290RWxlbWVudCwiaGFuZHNvbnRhYmxlIik7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEFCTEUiKTtmKHIsImh0Q29yZSIpLGUuZ2V0U2V0dGluZ3MoKS50YWJsZUNsYXNzTmFtZSYmZihyLGUuZ2V0U2V0dGluZ3MoKS50YWJsZUNsYXNzTmFtZSksdGhpcy5USEVBRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJUSEVBRCIpLHIuYXBwZW5kQ2hpbGQodGhpcy5USEVBRCksdGhpcy5UQk9EWT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJUQk9EWSIpLHIuYXBwZW5kQ2hpbGQodGhpcy5UQk9EWSksZS50YWJsZT1yLGUuY29udGFpbmVyLmluc2VydEJlZm9yZShyLGUuY29udGFpbmVyLmZpcnN0Q2hpbGQpLHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoZS5yb290RWxlbWVudCwibW91c2Vkb3duIixmdW5jdGlvbihlKXt0aGlzLnNlbGVjdGlvbk1vdXNlRG93bj0hMCxuLmlzVGV4dFNlbGVjdGlvbkFsbG93ZWQoZS50YXJnZXQpfHwocygpLGUucHJldmVudERlZmF1bHQoKSx3aW5kb3cuZm9jdXMoKSl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKGUucm9vdEVsZW1lbnQsIm1vdXNldXAiLGZ1bmN0aW9uKGUpe3RoaXMuc2VsZWN0aW9uTW91c2VEb3duPSExfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihlLnJvb3RFbGVtZW50LCJtb3VzZW1vdmUiLGZ1bmN0aW9uKGUpe3RoaXMuc2VsZWN0aW9uTW91c2VEb3duJiYhbi5pc1RleHRTZWxlY3Rpb25BbGxvd2VkKGUudGFyZ2V0KSYmKHMoKSxlLnByZXZlbnREZWZhdWx0KCkpfSksdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsImtleXVwIixmdW5jdGlvbih0KXtlLnNlbGVjdGlvbi5pc0luUHJvZ3Jlc3MoKSYmIXQuc2hpZnRLZXkmJmUuc2VsZWN0aW9uLmZpbmlzaCgpfSk7dmFyIGk7dGhpcy5pc01vdXNlRG93bj1mdW5jdGlvbigpe3JldHVybiBpfSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwibW91c2V1cCIsZnVuY3Rpb24odCl7ZS5zZWxlY3Rpb24uaXNJblByb2dyZXNzKCkmJjE9PT10LndoaWNoJiZlLnNlbGVjdGlvbi5maW5pc2goKSxpPSExLEMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkmJmUudW5saXN0ZW4oKX0pLHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCJtb3VzZWRvd24iLGZ1bmN0aW9uKHQpe3ZhciBvPXQudGFyZ2V0LHI9dC50YXJnZXQscz10Lnh8fHQuY2xpZW50WCxsPXQueXx8dC5jbGllbnRZO2lmKCFpJiZlLnJvb3RFbGVtZW50KXtpZihyPT09ZS52aWV3Lnd0Lnd0VGFibGUuaG9sZGVyKXt2YXIgYT13KCk7aWYoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChzK2EsbCkhPT1lLnZpZXcud3Qud3RUYWJsZS5ob2xkZXJ8fGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQocyxsK2EpIT09ZS52aWV3Lnd0Lnd0VGFibGUuaG9sZGVyKXJldHVybn1lbHNlIGZvcig7ciE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDspe2lmKG51bGw9PT1yKXtpZih0LmlzVGFyZ2V0V2ViQ29tcG9uZW50KWJyZWFrO3JldHVybn1pZihyPT09ZS5yb290RWxlbWVudClyZXR1cm47cj1yLnBhcmVudE5vZGV9dmFyIHU9ImZ1bmN0aW9uIj09dHlwZW9mIG4uc2V0dGluZ3Mub3V0c2lkZUNsaWNrRGVzZWxlY3RzP24uc2V0dGluZ3Mub3V0c2lkZUNsaWNrRGVzZWxlY3RzKG8pOm4uc2V0dGluZ3Mub3V0c2lkZUNsaWNrRGVzZWxlY3RzO3U/ZS5kZXNlbGVjdENlbGwoKTplLmRlc3Ryb3lFZGl0b3IoKX19KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHIsInNlbGVjdHN0YXJ0IixmdW5jdGlvbihlKXtuLnNldHRpbmdzLmZyYWdtZW50U2VsZWN0aW9ufHxiKGUudGFyZ2V0KXx8ZS5wcmV2ZW50RGVmYXVsdCgpfSk7dmFyIHM9ZnVuY3Rpb24oKXt3aW5kb3cuZ2V0U2VsZWN0aW9uP3dpbmRvdy5nZXRTZWxlY3Rpb24oKS5lbXB0eT93aW5kb3cuZ2V0U2VsZWN0aW9uKCkuZW1wdHkoKTp3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzJiZ3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk6ZG9jdW1lbnQuc2VsZWN0aW9uJiZkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKX0sbD1bbmV3IE0oe2NsYXNzTmFtZToiY3VycmVudCIsYm9yZGVyOnt3aWR0aDoyLGNvbG9yOiIjNTI5MkY3Iixjb3JuZXJWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG4uc2V0dGluZ3MuZmlsbEhhbmRsZSYmIW4uaXNDZWxsRWRpdGVkKCkmJiFlLnNlbGVjdGlvbi5pc011bHRpcGxlKCl9LG11bHRpcGxlU2VsZWN0aW9uSGFuZGxlc1Zpc2libGU6ZnVuY3Rpb24oKXtyZXR1cm4hbi5pc0NlbGxFZGl0ZWQoKSYmIWUuc2VsZWN0aW9uLmlzTXVsdGlwbGUoKX19fSksbmV3IE0oe2NsYXNzTmFtZToiYXJlYSIsYm9yZGVyOnt3aWR0aDoxLGNvbG9yOiIjODlBRkY5Iixjb3JuZXJWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG4uc2V0dGluZ3MuZmlsbEhhbmRsZSYmIW4uaXNDZWxsRWRpdGVkKCkmJmUuc2VsZWN0aW9uLmlzTXVsdGlwbGUoKX0sbXVsdGlwbGVTZWxlY3Rpb25IYW5kbGVzVmlzaWJsZTpmdW5jdGlvbigpe3JldHVybiFuLmlzQ2VsbEVkaXRlZCgpJiZlLnNlbGVjdGlvbi5pc011bHRpcGxlKCl9fX0pLG5ldyBNKHtjbGFzc05hbWU6ImhpZ2hsaWdodCIsaGlnaGxpZ2h0Um93Q2xhc3NOYW1lOm4uc2V0dGluZ3MuY3VycmVudFJvd0NsYXNzTmFtZSxoaWdobGlnaHRDb2x1bW5DbGFzc05hbWU6bi5zZXR0aW5ncy5jdXJyZW50Q29sQ2xhc3NOYW1lfSksbmV3IE0oe2NsYXNzTmFtZToiZmlsbCIsYm9yZGVyOnt3aWR0aDoxLGNvbG9yOiJyZWQifX0pXTtsLmN1cnJlbnQ9bFswXSxsLmFyZWE9bFsxXSxsLmhpZ2hsaWdodD1sWzJdLGwuZmlsbD1sWzNdO3ZhciBhPXtkZWJ1ZzpmdW5jdGlvbigpe3JldHVybiBuLnNldHRpbmdzLmRlYnVnfSxleHRlcm5hbFJvd0NhbGN1bGF0b3I6dGhpcy5pbnN0YW5jZS5nZXRQbHVnaW4oImF1dG9Sb3dTaXplIikmJnRoaXMuaW5zdGFuY2UuZ2V0UGx1Z2luKCJhdXRvUm93U2l6ZSIpLmlzRW5hYmxlZCgpLHRhYmxlOnIscHJldmVudE92ZXJmbG93OmZ1bmN0aW9uKCl7cmV0dXJuIHQuc2V0dGluZ3MucHJldmVudE92ZXJmbG93fSxzdHJldGNoSDpmdW5jdGlvbigpe3JldHVybiBuLnNldHRpbmdzLnN0cmV0Y2hIfSxkYXRhOmUuZ2V0RGF0YUF0Q2VsbCx0b3RhbFJvd3M6ZnVuY3Rpb24oKXtyZXR1cm4gZS5jb3VudFJvd3MoKX0sdG90YWxDb2x1bW5zOmZ1bmN0aW9uKCl7cmV0dXJuIGUuY291bnRDb2xzKCl9LGZpeGVkQ29sdW1uc0xlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5zZXR0aW5ncy5maXhlZENvbHVtbnNMZWZ0fSxmaXhlZFJvd3NUb3A6ZnVuY3Rpb24oKXtyZXR1cm4gbi5zZXR0aW5ncy5maXhlZFJvd3NUb3B9LGZpeGVkUm93c0JvdHRvbTpmdW5jdGlvbigpe3JldHVybiBuLnNldHRpbmdzLmZpeGVkUm93c0JvdHRvbX0sbWluU3BhcmVSb3dzOmZ1bmN0aW9uKCl7cmV0dXJuIG4uc2V0dGluZ3MubWluU3BhcmVSb3dzfSxyZW5kZXJBbGxSb3dzOm4uc2V0dGluZ3MucmVuZGVyQWxsUm93cyxyb3dIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIGUuaGFzUm93SGVhZGVycygpJiZ0LnB1c2goZnVuY3Rpb24oZSx0KXtuLmFwcGVuZFJvd0hlYWRlcihlLHQpfSksaC5ob29rcy5ydW4oZSwiYWZ0ZXJHZXRSb3dIZWFkZXJSZW5kZXJlcnMiLHQpLHR9LGNvbHVtbkhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gZS5oYXNDb2xIZWFkZXJzKCkmJnQucHVzaChmdW5jdGlvbihlLHQpe24uYXBwZW5kQ29sSGVhZGVyKGUsdCl9KSxoLmhvb2tzLnJ1bihlLCJhZnRlckdldENvbHVtbkhlYWRlclJlbmRlcmVycyIsdCksdH0sY29sdW1uV2lkdGg6ZS5nZXRDb2xXaWR0aCxyb3dIZWlnaHQ6ZS5nZXRSb3dIZWlnaHQsY2VsbFJlbmRlcmVyOmZ1bmN0aW9uKGUsdCxvKXt2YXIgcj1uLmluc3RhbmNlLmdldENlbGxNZXRhKGUsdCksaT1uLmluc3RhbmNlLmNvbFRvUHJvcCh0KSxzPW4uaW5zdGFuY2UuZ2V0RGF0YUF0Um93UHJvcChlLGkpO2guaG9va3MucnVuKG4uaW5zdGFuY2UsImJlZm9yZVJlbmRlcmVyIixvLGUsdCxpLHMsciksbi5pbnN0YW5jZS5nZXRDZWxsUmVuZGVyZXIocikobi5pbnN0YW5jZSxvLGUsdCxpLHMsciksaC5ob29rcy5ydW4obi5pbnN0YW5jZSwiYWZ0ZXJSZW5kZXJlciIsbyxlLHQsaSxzLHIpfSxzZWxlY3Rpb25zOmwsaGlkZUJvcmRlck9uTW91c2VEb3duT3ZlcjpmdW5jdGlvbigpe3JldHVybiBuLnNldHRpbmdzLmZyYWdtZW50U2VsZWN0aW9ufSxvbkNlbGxNb3VzZURvd246ZnVuY3Rpb24odCxvLHIscyl7aWYoZS5saXN0ZW4oKSxuLmFjdGl2ZVd0PXMsaT0hMCxoLmhvb2tzLnJ1bihlLCJiZWZvcmVPbkNlbGxNb3VzZURvd24iLHQsbyxyKSwhRSh0KSl7dmFyIGw9ZS5nZXRTZWxlY3RlZFJhbmdlKCksYT1lLnNlbGVjdGlvbix1PWEuc2VsZWN0ZWRIZWFkZXI7aWYodC5zaGlmdEtleSYmbClvLnJvdz49MCYmby5jb2w+PTA/KGEuc2V0UmFuZ2VFbmQobyksYS5zZXRTZWxlY3RlZEhlYWRlcnMoITEsITEpKToodS5jb2xzfHx1LnJvd3MpJiZvLnJvdz49MCYmby5jb2w+PTA/KGEuc2V0UmFuZ2VFbmQobmV3IFQoby5yb3csby5jb2wpKSxhLnNldFNlbGVjdGVkSGVhZGVycyghMSwhMSkpOnUuY29scyYmby5yb3c8MD9hLnNldFJhbmdlRW5kKG5ldyBUKGwudG8ucm93LG8uY29sKSk6dS5yb3dzJiZvLmNvbDwwP2Euc2V0UmFuZ2VFbmQobmV3IFQoby5yb3csbC50by5jb2wpKTohdS5jb2xzJiYhdS5yb3dzJiZvLmNvbDwwfHx1LmNvbHMmJm8uY29sPDA/KGEuc2V0UmFuZ2VTdGFydE9ubHkobmV3IFQobC5mcm9tLnJvdywwKSksYS5zZXRSYW5nZUVuZChuZXcgVChvLnJvdyxlLmNvdW50Q29scygpLTEpKSxhLnNldFNlbGVjdGVkSGVhZGVycyghMCwhMSkpOighdS5jb2xzJiYhdS5yb3dzJiZvLnJvdzwwfHx1LnJvd3MmJm8ucm93PDApJiYoYS5zZXRSYW5nZVN0YXJ0T25seShuZXcgVCgwLGwuZnJvbS5jb2wpKSxhLnNldFJhbmdlRW5kKG5ldyBUKGUuY291bnRSb3dzKCktMSxvLmNvbCkpLGEuc2V0U2VsZWN0ZWRIZWFkZXJzKCExLCEwKSk7ZWxzZXt2YXIgYz0hMDtpZihsKXt2YXIgZD1sLGY9ZC5mcm9tLHA9ZC50byxnPSFhLmluSW5TZWxlY3Rpb24obyk7aWYoby5yb3c8MCYmdS5jb2xzKXt2YXIgbT1NYXRoLm1pbihmLmNvbCxwLmNvbCksdz1NYXRoLm1heChmLmNvbCxwLmNvbCk7Yz1vLmNvbDxtfHxvLmNvbD53fWVsc2UgaWYoby5jb2w8MCYmdS5yb3dzKXt2YXIgdj1NYXRoLm1pbihmLnJvdyxwLnJvdykseT1NYXRoLm1heChmLnJvdyxwLnJvdyk7Yz1vLnJvdzx2fHxvLnJvdz55fWVsc2UgYz1nfSgwPT09dC5idXR0b258fDI9PT10LmJ1dHRvbiYmYykmJihvLnJvdzwwJiZvLmNvbD49MD8oYS5zZXRTZWxlY3RlZEhlYWRlcnMoITEsITApLGEuc2V0UmFuZ2VTdGFydE9ubHkobmV3IFQoMCxvLmNvbCkpLGEuc2V0UmFuZ2VFbmQobmV3IFQoZS5jb3VudFJvd3MoKS0xLG8uY29sKSwhMSkpOm8uY29sPDAmJm8ucm93Pj0wPyhhLnNldFNlbGVjdGVkSGVhZGVycyghMCwhMSksYS5zZXRSYW5nZVN0YXJ0T25seShuZXcgVChvLnJvdywwKSksYS5zZXRSYW5nZUVuZChuZXcgVChvLnJvdyxlLmNvdW50Q29scygpLTEpLCExKSk6KG8ucm93PW8ucm93PDA/MDpvLnJvdyxvLmNvbD1vLmNvbDwwPzA6by5jb2wsYS5zZXRTZWxlY3RlZEhlYWRlcnMoITEsITEpLGEuc2V0UmFuZ2VTdGFydChvKSkpfWguaG9va3MucnVuKGUsImFmdGVyT25DZWxsTW91c2VEb3duIix0LG8sciksbi5hY3RpdmVXdD1uLnd0fX0sb25DZWxsTW91c2VPdmVyOmZ1bmN0aW9uKHQsbyxyLHMpe3ZhciBsPXtyb3c6ITEsY29sdW1uOiExfTtuLmFjdGl2ZVd0PXMsaC5ob29rcy5ydW4oZSwiYmVmb3JlT25DZWxsTW91c2VPdmVyIix0LG8scixsKSwwPT09dC5idXR0b24mJihvLnJvdz49MCYmby5jb2w+PTA/aSYmZS5zZWxlY3Rpb24uc2V0UmFuZ2VFbmQobyk6aSYmKG8ucm93PDAmJiFsLmNvbHVtbiYmKGUuc2VsZWN0aW9uLnNlbGVjdGVkSGVhZGVyLmNvbHM/KGUuc2VsZWN0aW9uLnNldFJhbmdlRW5kKG5ldyBUKGUuY291bnRSb3dzKCktMSxvLmNvbCksITEpLGUuc2VsZWN0aW9uLnNldFNlbGVjdGVkSGVhZGVycyghMSwhMCkpOmUuc2VsZWN0aW9uLnNldFJhbmdlRW5kKG5ldyBUKG8ucm93LG8uY29sKSwhMSkpLG8uY29sPDAmJiFsLnJvdyYmKGUuc2VsZWN0aW9uLnNlbGVjdGVkSGVhZGVyLnJvd3M/KGUuc2VsZWN0aW9uLnNldFJhbmdlRW5kKG5ldyBUKG8ucm93LGUuY291bnRDb2xzKCktMSksITEpLGUuc2VsZWN0aW9uLnNldFNlbGVjdGVkSGVhZGVycyghMCwhMSkpOmUuc2VsZWN0aW9uLnNldFJhbmdlRW5kKG5ldyBUKG8ucm93LG8uY29sKSwhMSkpKSksaC5ob29rcy5ydW4oZSwiYWZ0ZXJPbkNlbGxNb3VzZU92ZXIiLHQsbyxyKSxuLmFjdGl2ZVd0PW4ud3R9LG9uQ2VsbENvcm5lck1vdXNlRG93bjpmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksaC5ob29rcy5ydW4oZSwiYWZ0ZXJPbkNlbGxDb3JuZXJNb3VzZURvd24iLHQpfSxiZWZvcmVEcmF3OmZ1bmN0aW9uKGUpe24uYmVmb3JlUmVuZGVyKGUpfSxvbkRyYXc6ZnVuY3Rpb24oZSl7bi5vbkRyYXcoZSl9LG9uU2Nyb2xsVmVydGljYWxseTpmdW5jdGlvbigpe2UucnVuSG9va3MoImFmdGVyU2Nyb2xsVmVydGljYWxseSIpfSxvblNjcm9sbEhvcml6b250YWxseTpmdW5jdGlvbigpe2UucnVuSG9va3MoImFmdGVyU2Nyb2xsSG9yaXpvbnRhbGx5Iil9LG9uQmVmb3JlRHJhd0JvcmRlcnM6ZnVuY3Rpb24odCxuKXtlLnJ1bkhvb2tzKCJiZWZvcmVEcmF3Qm9yZGVycyIsdCxuKX0sb25CZWZvcmVUb3VjaFNjcm9sbDpmdW5jdGlvbigpe2UucnVuSG9va3MoImJlZm9yZVRvdWNoU2Nyb2xsIil9LG9uQWZ0ZXJNb21lbnR1bVNjcm9sbDpmdW5jdGlvbigpe2UucnVuSG9va3MoImFmdGVyTW9tZW50dW1TY3JvbGwiKX0sb25CZWZvcmVTdHJldGNoaW5nQ29sdW1uV2lkdGg6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5ydW5Ib29rcygiYmVmb3JlU3RyZXRjaGluZ0NvbHVtbldpZHRoIix0LG4pfSx2aWV3cG9ydFJvd0NhbGN1bGF0b3JPdmVycmlkZTpmdW5jdGlvbih0KXt2YXIgbz1lLmNvdW50Um93cygpLHI9bi5zZXR0aW5ncy52aWV3cG9ydFJvd1JlbmRlcmluZ09mZnNldDtpZigiYXV0byI9PT1yJiZuLnNldHRpbmdzLmZpeGVkUm93c1RvcCYmKHI9MTApLCJudW1iZXIiPT10eXBlb2YgciYmKHQuc3RhcnRSb3c9TWF0aC5tYXgodC5zdGFydFJvdy1yLDApLHQuZW5kUm93PU1hdGgubWluKHQuZW5kUm93K3Isby0xKSksImF1dG8iPT09cil7dmFyIGk9dC5zdGFydFJvdyt0LmVuZFJvdy10LnN0YXJ0Um93LHM9TWF0aC5jZWlsKGkvbyoxMik7dC5zdGFydFJvdz1NYXRoLm1heCh0LnN0YXJ0Um93LXMsMCksdC5lbmRSb3c9TWF0aC5taW4odC5lbmRSb3crcyxvLTEpfWUucnVuSG9va3MoImFmdGVyVmlld3BvcnRSb3dDYWxjdWxhdG9yT3ZlcnJpZGUiLHQpfSx2aWV3cG9ydENvbHVtbkNhbGN1bGF0b3JPdmVycmlkZTpmdW5jdGlvbih0KXt2YXIgbz1lLmNvdW50Q29scygpLHI9bi5zZXR0aW5ncy52aWV3cG9ydENvbHVtblJlbmRlcmluZ09mZnNldDtpZigiYXV0byI9PT1yJiZuLnNldHRpbmdzLmZpeGVkQ29sdW1uc0xlZnQmJihyPTEwKSwibnVtYmVyIj09dHlwZW9mIHImJih0LnN0YXJ0Q29sdW1uPU1hdGgubWF4KHQuc3RhcnRDb2x1bW4tciwwKSx0LmVuZENvbHVtbj1NYXRoLm1pbih0LmVuZENvbHVtbityLG8tMSkpLCJhdXRvIj09PXIpe3ZhciBpPXQuc3RhcnRDb2x1bW4rdC5lbmRDb2x1bW4tdC5zdGFydENvbHVtbixzPU1hdGguY2VpbChpL28qMTIpO3Quc3RhcnRSb3c9TWF0aC5tYXgodC5zdGFydENvbHVtbi1zLDApLHQuZW5kQ29sdW1uPU1hdGgubWluKHQuZW5kQ29sdW1uK3Msby0xKX1lLnJ1bkhvb2tzKCJhZnRlclZpZXdwb3J0Q29sdW1uQ2FsY3VsYXRvck92ZXJyaWRlIix0KX0scm93SGVhZGVyV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gbi5zZXR0aW5ncy5yb3dIZWFkZXJXaWR0aH0sY29sdW1uSGVhZGVySGVpZ2h0OmZ1bmN0aW9uKCl7dmFyIHQ9ZS5ydW5Ib29rcygibW9kaWZ5Q29sdW1uSGVhZGVySGVpZ2h0Iik7cmV0dXJuIG4uc2V0dGluZ3MuY29sdW1uSGVhZGVySGVpZ2h0fHx0fX07aC5ob29rcy5ydW4oZSwiYmVmb3JlSW5pdFdhbGtvbnRhYmxlIixhKSx0aGlzLnd0PW5ldyBPKGEpLHRoaXMuYWN0aXZlV3Q9dGhpcy53dCx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKG4ud3Qud3RUYWJsZS5zcHJlYWRlciwibW91c2Vkb3duIixmdW5jdGlvbihlKXtlLnRhcmdldD09PW4ud3Qud3RUYWJsZS5zcHJlYWRlciYmMz09PWUud2hpY2gmJlMoZSl9KSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKG4ud3Qud3RUYWJsZS5zcHJlYWRlciwiY29udGV4dG1lbnUiLGZ1bmN0aW9uKGUpe2UudGFyZ2V0PT09bi53dC53dFRhYmxlLnNwcmVhZGVyJiYzPT09ZS53aGljaCYmUyhlKX0pLHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCJjbGljayIsZnVuY3Rpb24oKXtuLnNldHRpbmdzLm9ic2VydmVET01WaXNpYmlsaXR5JiZuLnd0LmRyYXdJbnRlcnJ1cHRlZCYmKG4uaW5zdGFuY2UuZm9yY2VGdWxsUmVuZGVyPSEwLG4ucmVuZGVyKCkpfSl9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7VGFibGVWaWV3OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciByLGkscyxsLGEsdSxjLGg9KHI9ZSgiYnJvd3NlciIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSlbImRlZmF1bHQiXSxkPShpPWUoImhlbHBlcnMvZG9tL2VsZW1lbnQiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLGY9ZC5hZGRDbGFzcyxwPWQuZW1wdHksZz1kLmZhc3RJbm5lckhUTUwsbT1kLmZhc3RJbm5lclRleHQsdz1kLmdldFNjcm9sbGJhcldpZHRoLHY9ZC5oYXNDbGFzcyx5PWQuaXNDaGlsZE9mLGI9ZC5pc0lucHV0LEM9ZC5pc091dHNpZGVJbnB1dCxfPShzPWUoImV2ZW50TWFuYWdlciIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuZXZlbnRNYW5hZ2VyLFI9KGw9ZSgiaGVscGVycy9kb20vZXZlbnQiKSxsJiZsLl9fZXNNb2R1bGUmJmx8fHsiZGVmYXVsdCI6bH0pLFM9Ui5zdG9wUHJvcGFnYXRpb24sRT1SLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkLFQ9KGE9ZSgiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL2NlbGwvY29vcmRzIiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KS5XYWxrb250YWJsZUNlbGxDb29yZHMsTT0odT1lKCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvc2VsZWN0aW9uIiksdSYmdS5fX2VzTW9kdWxlJiZ1fHx7ImRlZmF1bHQiOnV9KS5XYWxrb250YWJsZVNlbGVjdGlvbixPPShjPWUoIjNyZHBhcnR5L3dhbGtvbnRhYmxlL3NyYy9jb3JlIiksYyYmYy5fX2VzTW9kdWxlJiZjfHx7ImRlZmF1bHQiOmN9KS5XYWxrb250YWJsZTtoLlRhYmxlVmlldz1vLG8ucHJvdG90eXBlLmlzVGV4dFNlbGVjdGlvbkFsbG93ZWQ9ZnVuY3Rpb24oZSl7aWYoYihlKSlyZXR1cm4hMDt2YXIgdD15KGUsdGhpcy5pbnN0YW5jZS52aWV3Lnd0Lnd0VGFibGUuc3ByZWFkZXIpO3JldHVybiB0aGlzLnNldHRpbmdzLmZyYWdtZW50U2VsZWN0aW9uPT09ITAmJnQ/ITA6ImNlbGwiPT09dGhpcy5zZXR0aW5ncy5mcmFnbWVudFNlbGVjdGlvbiYmdGhpcy5pc1NlbGVjdGVkT25seUNlbGwoKSYmdD8hMDohKHRoaXMuc2V0dGluZ3MuZnJhZ21lbnRTZWxlY3Rpb258fCF0aGlzLmlzQ2VsbEVkaXRlZCgpfHwhdGhpcy5pc1NlbGVjdGVkT25seUNlbGwoKSl9LG8ucHJvdG90eXBlLmlzU2VsZWN0ZWRPbmx5Q2VsbD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaW5zdGFuY2UuZ2V0U2VsZWN0ZWQoKXx8W10sdD1lWzBdLG49ZVsxXSxvPWVbMl0scj1lWzNdO3JldHVybiB2b2lkIDAhPT10JiZ0PT09byYmbj09PXJ9LG8ucHJvdG90eXBlLmlzQ2VsbEVkaXRlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaW5zdGFuY2UuZ2V0QWN0aXZlRWRpdG9yKCk7cmV0dXJuIGUmJmUuaXNPcGVuZWQoKX0sby5wcm90b3R5cGUuYmVmb3JlUmVuZGVyPWZ1bmN0aW9uKGUpe2UmJmguaG9va3MucnVuKHRoaXMuaW5zdGFuY2UsImJlZm9yZVJlbmRlciIsdGhpcy5pbnN0YW5jZS5mb3JjZUZ1bGxSZW5kZXIpfSxvLnByb3RvdHlwZS5vbkRyYXc9ZnVuY3Rpb24oZSl7ZSYmaC5ob29rcy5ydW4odGhpcy5pbnN0YW5jZSwiYWZ0ZXJSZW5kZXIiLHRoaXMuaW5zdGFuY2UuZm9yY2VGdWxsUmVuZGVyKX0sby5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy53dC5kcmF3KCF0aGlzLmluc3RhbmNlLmZvcmNlRnVsbFJlbmRlciksdGhpcy5pbnN0YW5jZS5mb3JjZUZ1bGxSZW5kZXI9ITEsdGhpcy5pbnN0YW5jZS5yZW5kZXJDYWxsPSExfSxvLnByb3RvdHlwZS5nZXRDZWxsQXRDb29yZHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnd0LmdldENlbGwoZSx0KTtyZXR1cm4gMD5uP251bGw6bn0sby5wcm90b3R5cGUuc2Nyb2xsVmlld3BvcnQ9ZnVuY3Rpb24oZSl7dGhpcy53dC5zY3JvbGxWaWV3cG9ydChlKX0sby5wcm90b3R5cGUuYXBwZW5kUm93SGVhZGVyPWZ1bmN0aW9uKGUsdCl7aWYodC5maXJzdENoaWxkKXt2YXIgbj10LmZpcnN0Q2hpbGQ7aWYoIXYobiwicmVsYXRpdmUiKSlyZXR1cm4gcCh0KSx2b2lkIHRoaXMuYXBwZW5kUm93SGVhZGVyKGUsdCk7dGhpcy51cGRhdGVDZWxsSGVhZGVyKG4ucXVlcnlTZWxlY3RvcigiLnJvd0hlYWRlciIpLGUsdGhpcy5pbnN0YW5jZS5nZXRSb3dIZWFkZXIpfWVsc2V7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7by5jbGFzc05hbWU9InJlbGF0aXZlIixyLmNsYXNzTmFtZT0icm93SGVhZGVyIix0aGlzLnVwZGF0ZUNlbGxIZWFkZXIocixlLHRoaXMuaW5zdGFuY2UuZ2V0Um93SGVhZGVyKSxvLmFwcGVuZENoaWxkKHIpLHQuYXBwZW5kQ2hpbGQobyl9aC5ob29rcy5ydW4odGhpcy5pbnN0YW5jZSwiYWZ0ZXJHZXRSb3dIZWFkZXIiLGUsdCl9LG8ucHJvdG90eXBlLmFwcGVuZENvbEhlYWRlcj1mdW5jdGlvbihlLHQpe2lmKHQuZmlyc3RDaGlsZCl7dmFyIG49dC5maXJzdENoaWxkO3YobiwicmVsYXRpdmUiKT90aGlzLnVwZGF0ZUNlbGxIZWFkZXIobi5xdWVyeVNlbGVjdG9yKCIuY29sSGVhZGVyIiksZSx0aGlzLmluc3RhbmNlLmdldENvbEhlYWRlcik6KHAodCksdGhpcy5hcHBlbmRDb2xIZWFkZXIoZSx0KSl9ZWxzZXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtvLmNsYXNzTmFtZT0icmVsYXRpdmUiLHIuY2xhc3NOYW1lPSJjb2xIZWFkZXIiLHRoaXMudXBkYXRlQ2VsbEhlYWRlcihyLGUsdGhpcy5pbnN0YW5jZS5nZXRDb2xIZWFkZXIpLG8uYXBwZW5kQ2hpbGQociksdC5hcHBlbmRDaGlsZChvKX1oLmhvb2tzLnJ1bih0aGlzLmluc3RhbmNlLCJhZnRlckdldENvbEhlYWRlciIsZSx0KX0sby5wcm90b3R5cGUudXBkYXRlQ2VsbEhlYWRlcj1mdW5jdGlvbihlLHQsbil7dmFyIG89dCxyPXRoaXMud3Qud3RPdmVybGF5cy5nZXRQYXJlbnRPdmVybGF5KGUpfHx0aGlzLnd0O2UucGFyZW50Tm9kZSYmKHYoZSwiY29sSGVhZGVyIik/bz1yLnd0VGFibGUuY29sdW1uRmlsdGVyLnNvdXJjZVRvUmVuZGVyZWQodCk6dihlLCJyb3dIZWFkZXIiKSYmKG89ci53dFRhYmxlLnJvd0ZpbHRlci5zb3VyY2VUb1JlbmRlcmVkKHQpKSksbz4tMT9nKGUsbih0KSk6KG0oZSxTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpLGYoZSwiY29ybmVySGVhZGVyIikpfSxvLnByb3RvdHlwZS5tYXhpbXVtVmlzaWJsZUVsZW1lbnRXaWR0aD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnd0Lnd0Vmlld3BvcnQuZ2V0V29ya3NwYWNlV2lkdGgoKSxuPXQtZTtyZXR1cm4gbj4wP246MH0sby5wcm90b3R5cGUubWF4aW11bVZpc2libGVFbGVtZW50SGVpZ2h0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMud3Qud3RWaWV3cG9ydC5nZXRXb3Jrc3BhY2VIZWlnaHQoKSxuPXQtZTtyZXR1cm4gbj4wP246MH0sby5wcm90b3R5cGUubWFpblZpZXdJc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnd0PT09dGhpcy5hY3RpdmVXdH0sby5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMud3QuZGVzdHJveSgpLHRoaXMuZXZlbnRNYW5hZ2VyLmRlc3Ryb3koKX19LHsiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL2NlbGwvY29vcmRzIjo1LCIzcmRwYXJ0eS93YWxrb250YWJsZS9zcmMvY29yZSI6NywiM3JkcGFydHkvd2Fsa29udGFibGUvc3JjL3NlbGVjdGlvbiI6MTgsYnJvd3NlcjoyMyxldmVudE1hbmFnZXI6NDEsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL2RvbS9ldmVudCI6NDd9XSwxMDI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7R2hvc3RUYWJsZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGd9fSxfX2VzTW9kdWxlOnt2YWx1ZTohMH19KTt2YXIgbyxyLGkscyxsLGEsdT0obz1lKCJicm93c2VyIiksbyYmby5fX2VzTW9kdWxlJiZvfHx7ImRlZmF1bHQiOm99KVsiZGVmYXVsdCJdLGM9KHI9ZSgiaGVscGVycy9kb20vZWxlbWVudCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSksaD1jLmFkZENsYXNzLGQ9Yy5vdXRlckhlaWdodCxmPWMub3V0ZXJXaWR0aCxwPShpPWUoImhlbHBlcnMvYXJyYXkiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLmFycmF5RWFjaCxnPSgocz1lKCJoZWxwZXJzL29iamVjdCIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkub2JqZWN0RWFjaCwobD1lKCJoZWxwZXJzL251bWJlciIpLGwmJmwuX19lc01vZHVsZSYmbHx8eyJkZWZhdWx0IjpsfSkucmFuZ2VFYWNoLChhPWUoImhlbHBlcnMvbWl4ZWQiKSxhJiZhLl9fZXNNb2R1bGUmJmF8fHsiZGVmYXVsdCI6YX0pLnN0cmluZ2lmeSxmdW5jdGlvbihlKXt0aGlzLmhvdD1lLHRoaXMuY29udGFpbmVyPW51bGwsdGhpcy5pbmplY3RlZD0hMSx0aGlzLnJvd3M9W10sdGhpcy5jb2x1bW5zPVtdLHRoaXMuc2FtcGxlcz1udWxsLHRoaXMuc2V0dGluZ3M9e3VzZUhlYWRlcnM6ITB9fSk7JHRyYWNldXJSdW50aW1lLmNyZWF0ZUNsYXNzKGcse2FkZFJvdzpmdW5jdGlvbihlLHQpe2lmKHRoaXMuY29sdW1ucy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEb2Vzbid0IHN1cHBvcnQgbXVsdGktZGltZW5zaW9uYWwgdGFibGUiKTt0aGlzLnJvd3MubGVuZ3RofHwodGhpcy5jb250YWluZXI9dGhpcy5jcmVhdGVDb250YWluZXIodGhpcy5ob3Qucm9vdEVsZW1lbnQuY2xhc3NOYW1lKSk7dmFyIG49e3JvdzplfTt0aGlzLnJvd3MucHVzaChuKSx0aGlzLnNhbXBsZXM9dCx0aGlzLnRhYmxlPXRoaXMuY3JlYXRlVGFibGUodGhpcy5ob3QudGFibGUuY2xhc3NOYW1lKSx0aGlzLnRhYmxlLmNvbEdyb3VwLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlQ29sR3JvdXBzQ29sKCkpLHRoaXMudGFibGUudHIuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVSb3coZSkpLHRoaXMuY29udGFpbmVyLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnRhYmxlLmZyYWdtZW50KSxuLnRhYmxlPXRoaXMudGFibGUudGFibGV9LGFkZENvbHVtbkhlYWRlcnNSb3c6ZnVuY3Rpb24oZSl7aWYobnVsbCE9dGhpcy5ob3QuZ2V0Q29sSGVhZGVyKDApKXt2YXIgdD17cm93Oi0xfTt0aGlzLnJvd3MucHVzaCh0KSx0aGlzLmNvbnRhaW5lcj10aGlzLmNyZWF0ZUNvbnRhaW5lcih0aGlzLmhvdC5yb290RWxlbWVudC5jbGFzc05hbWUpLHRoaXMuc2FtcGxlcz1lLHRoaXMudGFibGU9dGhpcy5jcmVhdGVUYWJsZSh0aGlzLmhvdC50YWJsZS5jbGFzc05hbWUpLHRoaXMudGFibGUuY29sR3JvdXAuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVDb2xHcm91cHNDb2woKSksdGhpcy50YWJsZS50SGVhZC5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNvbHVtbkhlYWRlcnNSb3coKSksdGhpcy5jb250YWluZXIuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudGFibGUuZnJhZ21lbnQpLHQudGFibGU9dGhpcy50YWJsZS50YWJsZX19LGFkZENvbHVtbjpmdW5jdGlvbihlLHQpe2lmKHRoaXMucm93cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEb2Vzbid0IHN1cHBvcnQgbXVsdGktZGltZW5zaW9uYWwgdGFibGUiKTt0aGlzLmNvbHVtbnMubGVuZ3RofHwodGhpcy5jb250YWluZXI9dGhpcy5jcmVhdGVDb250YWluZXIodGhpcy5ob3Qucm9vdEVsZW1lbnQuY2xhc3NOYW1lKSk7dmFyIG49e2NvbDplfTt0aGlzLmNvbHVtbnMucHVzaChuKSx0aGlzLnNhbXBsZXM9dCx0aGlzLnRhYmxlPXRoaXMuY3JlYXRlVGFibGUodGhpcy5ob3QudGFibGUuY2xhc3NOYW1lKSx0aGlzLmdldFNldHRpbmcoInVzZUhlYWRlcnMiKSYmbnVsbCE9PXRoaXMuaG90LmdldENvbEhlYWRlcihlKSYmdGhpcy5ob3Qudmlldy5hcHBlbmRDb2xIZWFkZXIoZSx0aGlzLnRhYmxlLnRoKSx0aGlzLnRhYmxlLnRCb2R5LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlQ29sKGUpKSx0aGlzLmNvbnRhaW5lci5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy50YWJsZS5mcmFnbWVudCksbi50YWJsZT10aGlzLnRhYmxlLnRhYmxlfSxnZXRIZWlnaHRzOmZ1bmN0aW9uKGUpe3RoaXMuaW5qZWN0ZWR8fHRoaXMuaW5qZWN0VGFibGUoKSxwKHRoaXMucm93cyxmdW5jdGlvbih0KXtlKHQucm93LGQodC50YWJsZSktMSl9KX0sZ2V0V2lkdGhzOmZ1bmN0aW9uKGUpe3RoaXMuaW5qZWN0ZWR8fHRoaXMuaW5qZWN0VGFibGUoKSxwKHRoaXMuY29sdW1ucyxmdW5jdGlvbih0KXtlKHQuY29sLGYodC50YWJsZSkpfSl9LHNldFNldHRpbmdzOmZ1bmN0aW9uKGUpe3RoaXMuc2V0dGluZ3M9ZX0sc2V0U2V0dGluZzpmdW5jdGlvbihlLHQpe3RoaXMuc2V0dGluZ3N8fCh0aGlzLnNldHRpbmdzPXt9KSx0aGlzLnNldHRpbmdzW2VdPXR9LGdldFNldHRpbmdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0dGluZ3N9LGdldFNldHRpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2V0dGluZ3M/dGhpcy5zZXR0aW5nc1tlXTpudWxsfSxjcmVhdGVDb2xHcm91cHNDb2w6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZG9jdW1lbnQsbj10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtyZXR1cm4gdGhpcy5ob3QuaGFzUm93SGVhZGVycygpJiZuLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlQ29sRWxlbWVudCgtMSkpLHRoaXMuc2FtcGxlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3AodC5zdHJpbmdzLGZ1bmN0aW9uKHQpe24uYXBwZW5kQ2hpbGQoZS5jcmVhdGVDb2xFbGVtZW50KHQuY29sKSl9KX0pLG59LGNyZWF0ZVJvdzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49ZG9jdW1lbnQsbz1uLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxyPW4uY3JlYXRlRWxlbWVudCgidGgiKTtyZXR1cm4gdGhpcy5ob3QuaGFzUm93SGVhZGVycygpJiYodGhpcy5ob3Qudmlldy5hcHBlbmRSb3dIZWFkZXIoZSxyKSxvLmFwcGVuZENoaWxkKHIpKSx0aGlzLnNhbXBsZXMuZm9yRWFjaChmdW5jdGlvbihyKXtwKHIuc3RyaW5ncyxmdW5jdGlvbihyKXt2YXIgaT1yLmNvbCxzPXQuaG90LmdldENlbGxNZXRhKGUsaSk7cy5jb2w9aSxzLnJvdz1lO3ZhciBsPXQuaG90LmdldENlbGxSZW5kZXJlcihzKSxhPW4uY3JlYXRlRWxlbWVudCgidGQiKTtsKHQuaG90LGEsZSxpLHQuaG90LmNvbFRvUHJvcChpKSxyLnZhbHVlLHMpLG8uYXBwZW5kQ2hpbGQoYSl9KX0pLG99LGNyZWF0ZUNvbHVtbkhlYWRlcnNSb3c6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZG9jdW1lbnQsbj10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZih0aGlzLmhvdC5oYXNSb3dIZWFkZXJzKCkpe3ZhciBvPXQuY3JlYXRlRWxlbWVudCgidGgiKTt0aGlzLmhvdC52aWV3LmFwcGVuZENvbEhlYWRlcigtMSxvKSxuLmFwcGVuZENoaWxkKG8pfXJldHVybiB0aGlzLnNhbXBsZXMuZm9yRWFjaChmdW5jdGlvbihvKXtwKG8uc3RyaW5ncyxmdW5jdGlvbihvKXt2YXIgcj1vLmNvbCxpPXQuY3JlYXRlRWxlbWVudCgidGgiKTtlLmhvdC52aWV3LmFwcGVuZENvbEhlYWRlcihyLGkpLG4uYXBwZW5kQ2hpbGQoaSl9KX0pLG59LGNyZWF0ZUNvbDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49ZG9jdW1lbnQsbz1uLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtyZXR1cm4gdGhpcy5zYW1wbGVzLmZvckVhY2goZnVuY3Rpb24ocil7cChyLnN0cmluZ3MsZnVuY3Rpb24ocil7dmFyIGk9ci5yb3cscz10LmhvdC5nZXRDZWxsTWV0YShpLGUpO3MuY29sPWUscy5yb3c9aTt2YXIgbD10LmhvdC5nZXRDZWxsUmVuZGVyZXIocyksYT1uLmNyZWF0ZUVsZW1lbnQoInRkIiksdT1uLmNyZWF0ZUVsZW1lbnQoInRyIik7bCh0LmhvdCxhLGksZSx0LmhvdC5jb2xUb1Byb3AoZSksci52YWx1ZSxzKSx1LmFwcGVuZENoaWxkKGEpLG8uYXBwZW5kQ2hpbGQodSl9KX0pLG99LGNsZWFuOmZ1bmN0aW9uKCl7dGhpcy5yb3dzLmxlbmd0aD0wLHRoaXMucm93c1stMV09dm9pZCAwLHRoaXMuY29sdW1ucy5sZW5ndGg9MCx0aGlzLnNhbXBsZXMmJnRoaXMuc2FtcGxlcy5jbGVhcigpLHRoaXMuc2FtcGxlcz1udWxsLHRoaXMucmVtb3ZlVGFibGUoKX0saW5qZWN0VGFibGU6ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGw7dGhpcy5pbmplY3RlZHx8KChlfHx0aGlzLmhvdC5yb290RWxlbWVudCkuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIuZnJhZ21lbnQpLHRoaXMuaW5qZWN0ZWQ9ITApfSxyZW1vdmVUYWJsZTpmdW5jdGlvbigpe3RoaXMuaW5qZWN0ZWQmJnRoaXMuY29udGFpbmVyLmNvbnRhaW5lci5wYXJlbnROb2RlJiYodGhpcy5jb250YWluZXIuY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXIuY29udGFpbmVyKSx0aGlzLmNvbnRhaW5lcj1udWxsLHRoaXMuaW5qZWN0ZWQ9ITEpfSxjcmVhdGVDb2xFbGVtZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LG49dC5jcmVhdGVFbGVtZW50KCJjb2wiKTtyZXR1cm4gbi5zdHlsZS53aWR0aD10aGlzLmhvdC52aWV3Lnd0Lnd0VGFibGUuZ2V0U3RyZXRjaGVkQ29sdW1uV2lkdGgoZSkrInB4IixufSxjcmVhdGVUYWJsZTpmdW5jdGlvbigpe3ZhciBlPXZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiIsdD1kb2N1bWVudCxuPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLG89dC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLHI9dC5jcmVhdGVFbGVtZW50KCJ0aGVhZCIpLGk9dC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpLHM9dC5jcmVhdGVFbGVtZW50KCJjb2xncm91cCIpLGw9dC5jcmVhdGVFbGVtZW50KCJ0ciIpLGE9dC5jcmVhdGVFbGVtZW50KCJ0aCIpO3JldHVybiB0aGlzLmlzVmVydGljYWwoKSYmby5hcHBlbmRDaGlsZChzKSx0aGlzLmlzSG9yaXpvbnRhbCgpJiYobC5hcHBlbmRDaGlsZChhKSxyLmFwcGVuZENoaWxkKGwpLG8uc3R5bGUudGFibGVMYXlvdXQ9ImF1dG8iLG8uc3R5bGUud2lkdGg9ImF1dG8iKSxvLmFwcGVuZENoaWxkKHIpLHRoaXMuaXNWZXJ0aWNhbCgpJiZpLmFwcGVuZENoaWxkKGwpLG8uYXBwZW5kQ2hpbGQoaSksaChvLGUpLG4uYXBwZW5kQ2hpbGQobykse2ZyYWdtZW50Om4sdGFibGU6byx0SGVhZDpyLHRCb2R5OmksY29sR3JvdXA6cyx0cjpsLHRoOmF9fSxjcmVhdGVDb250YWluZXI6ZnVuY3Rpb24oKXt2YXIgZT12b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiIiLHQ9ZG9jdW1lbnQsbj10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxvPXQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGU9Imh0R2hvc3RUYWJsZSBodEF1dG9TaXplICIrZS50cmltKCksaChvLGUpLG4uYXBwZW5kQ2hpbGQobykse2ZyYWdtZW50Om4sY29udGFpbmVyOm99fSxpc1ZlcnRpY2FsOmZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5yb3dzLmxlbmd0aHx8dGhpcy5jb2x1bW5zLmxlbmd0aCl9LGlzSG9yaXpvbnRhbDpmdW5jdGlvbigpe3JldHVybiEoIXRoaXMuY29sdW1ucy5sZW5ndGh8fHRoaXMucm93cy5sZW5ndGgpfX0se30pLHUudXRpbHMuR2hvc3RUYWJsZT1nfSx7YnJvd3NlcjoyMywiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL21peGVkIjo1MCwiaGVscGVycy9udW1iZXIiOjUxLCJoZWxwZXJzL29iamVjdCI6NTJ9XSwxMDM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJi9mcHMkLy50ZXN0KGUpJiYoZT0xZTMvcGFyc2VJbnQoZS5yZXBsYWNlKCJmcHMiLCIiKXx8MCwxMCkpLGV9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobix7SW50ZXJ2YWw6e2dldDpmdW5jdGlvbigpe3JldHVybiBwfX0sX19lc01vZHVsZTp7dmFsdWU6ITB9fSk7dmFyIHIsaSxzLGwsYSx1LGM9KHI9ZSgiYnJvd3NlciIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSlbImRlZmF1bHQiXSxoPShpPWUoImhlbHBlcnMvZmVhdHVyZSIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSksZD1oLnJlcXVlc3RBbmltYXRpb25GcmFtZSxmPWguY2FuY2VsQW5pbWF0aW9uRnJhbWUscD0oKHM9ZSgiaGVscGVycy9hcnJheSIpLHMmJnMuX19lc01vZHVsZSYmc3x8eyJkZWZhdWx0IjpzfSkuYXJyYXlFYWNoLChsPWUoImhlbHBlcnMvb2JqZWN0IiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KS5vYmplY3RFYWNoLChhPWUoImhlbHBlcnMvbnVtYmVyIiksYSYmYS5fX2VzTW9kdWxlJiZhfHx7ImRlZmF1bHQiOmF9KS5yYW5nZUVhY2gsKHU9ZSgiaGVscGVycy9taXhlZCIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSkuc3RyaW5naWZ5LGZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt0aGlzLnRpbWVyPW51bGwsdGhpcy5mdW5jPWUsdGhpcy5kZWxheT1vKHQpLHRoaXMuc3RvcHBlZD0hMCx0aGlzLl90aGVuPW51bGwsdGhpcy5fY2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbi5fX2NhbGxiYWNrKCl9fSksZz1wOyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhwLHtzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0b3BwZWQmJih0aGlzLl90aGVuPURhdGUubm93KCksdGhpcy5zdG9wcGVkPSExLHRoaXMudGltZXI9ZCh0aGlzLl9jYWxsYmFjaykpLHRoaXN9LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9wcGVkfHwodGhpcy5zdG9wcGVkPSEwLGYodGhpcy50aW1lciksdGhpcy50aW1lcj1udWxsKSx0aGlzfSxfX2NhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50aW1lcj1kKHRoaXMuX2NhbGxiYWNrKSx0aGlzLmRlbGF5KXt2YXIgZT1EYXRlLm5vdygpLHQ9ZS10aGlzLl90aGVuO3Q+dGhpcy5kZWxheSYmKHRoaXMuX3RoZW49ZS10JXRoaXMuZGVsYXksdGhpcy5mdW5jKCkpfWVsc2UgdGhpcy5mdW5jKCl9fSx7Y3JlYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBnKGUsdCl9fSksYy51dGlscy5JbnRlcnZhbD1wfSx7YnJvd3NlcjoyMywiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvZmVhdHVyZSI6NDgsImhlbHBlcnMvbWl4ZWQiOjUwLCJoZWxwZXJzL251bWJlciI6NTEsImhlbHBlcnMvb2JqZWN0Ijo1Mn1dLDEwNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgbztPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLHtTYW1wbGVzR2VuZXJhdG9yOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbX19LF9fZXNNb2R1bGU6e3ZhbHVlOiEwfX0pO3ZhciByLGkscyxsLGEsdSxjPShyPWUoImJyb3dzZXIiKSxyJiZyLl9fZXNNb2R1bGUmJnJ8fHsiZGVmYXVsdCI6cn0pWyJkZWZhdWx0Il0saD0oaT1lKCJoZWxwZXJzL2RvbS9lbGVtZW50IiksaSYmaS5fX2VzTW9kdWxlJiZpfHx7ImRlZmF1bHQiOml9KSxkPShoLmFkZENsYXNzLGgub3V0ZXJIZWlnaHQsaC5vdXRlcldpZHRoLChzPWUoImhlbHBlcnMvYXJyYXkiKSxzJiZzLl9fZXNNb2R1bGUmJnN8fHsiZGVmYXVsdCI6c30pLmFycmF5RWFjaCxsPWUoImhlbHBlcnMvb2JqZWN0IiksbCYmbC5fX2VzTW9kdWxlJiZsfHx7ImRlZmF1bHQiOmx9KSxmPShkLm9iamVjdEVhY2gsZC5pc09iamVjdCkscD0oYT1lKCJoZWxwZXJzL251bWJlciIpLGEmJmEuX19lc01vZHVsZSYmYXx8eyJkZWZhdWx0IjphfSkucmFuZ2VFYWNoLGc9KHU9ZSgiaGVscGVycy9taXhlZCIpLHUmJnUuX19lc01vZHVsZSYmdXx8eyJkZWZhdWx0Ijp1fSkuc3RyaW5naWZ5LG09ZnVuY3Rpb24oZSl7dGhpcy5zYW1wbGVzPW51bGwsdGhpcy5kYXRhRmFjdG9yeT1lLHRoaXMuY3VzdG9tU2FtcGxlQ291bnQ9bnVsbH0sdz1tOyR0cmFjZXVyUnVudGltZS5jcmVhdGVDbGFzcyhtLChvPXt9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCJnZXRTYW1wbGVDb3VudCIse3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VzdG9tU2FtcGxlQ291bnQ/dGhpcy5jdXN0b21TYW1wbGVDb3VudDp3LlNBTVBMRV9DT1VOVH0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobywiZ2VuZXJhdGVSb3dTYW1wbGVzIix7dmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5nZW5lcmF0ZVNhbXBsZXMoInJvdyIsdCxlKX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobywiZ2VuZXJhdGVDb2x1bW5TYW1wbGVzIix7dmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5nZW5lcmF0ZVNhbXBsZXMoImNvbCIsdCxlKX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobywiZ2VuZXJhdGVTYW1wbGVzIix7dmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXRoaXMscj1uZXcgTWFwO3JldHVybiJudW1iZXIiPT10eXBlb2YgbiYmKG49e2Zyb206bix0bzpufSkscChuLmZyb20sbi50byxmdW5jdGlvbihuKXt2YXIgaT1vLmdlbmVyYXRlU2FtcGxlKGUsdCxuKTtyLnNldChuLGkpfSkscn0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobywiZ2VuZXJhdGVTYW1wbGUiLHt2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIG8scj10aGlzLGk9bmV3IE1hcCxzPVtdO3JldHVybiBwKHQuZnJvbSx0LnRvLGZ1bmN0aW9uKHQpe3ZhciBsLGE7aWYoInJvdyI9PT1lKWE9ci5kYXRhRmFjdG9yeShuLHQpO2Vsc2V7aWYoImNvbCIhPT1lKXRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgc2FtcGxlIHR5cGUiKTthPXIuZGF0YUZhY3RvcnkodCxuKX1vPWYoYSk/T2JqZWN0LmtleXMoYSkubGVuZ3RoOkFycmF5LmlzQXJyYXkoYSk/YS5sZW5ndGg6ZyhhKS5sZW5ndGgsaS5oYXMobyl8fGkuc2V0KG8se25lZWRlZDpyLmdldFNhbXBsZUNvdW50KCksc3RyaW5nczpbXX0pO3ZhciB1PWkuZ2V0KG8pO2lmKHUubmVlZGVkKXt2YXIgYz1zLmluZGV4T2YoYSk+LTE7aWYoIWMpe3ZhciBoPSJyb3ciPT09ZT8iY29sIjoicm93Ijt1LnN0cmluZ3MucHVzaCgobD17fSxPYmplY3QuZGVmaW5lUHJvcGVydHkobCwidmFsdWUiLHt2YWx1ZTphLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGwsaCx7dmFsdWU6dCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMH0pLGwpKSxzLnB1c2goYSksdS5uZWVkZWQtLX19fSksaX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITB9KSxvKSx7Z2V0IFNBTVBMRV9DT1VOVCgpe3JldHVybiAzfX0pLGMudXRpbHMuU2FtcGxlc0dlbmVyYXRvcj1tfSx7YnJvd3NlcjoyMywiaGVscGVycy9hcnJheSI6NDIsImhlbHBlcnMvZG9tL2VsZW1lbnQiOjQ2LCJoZWxwZXJzL21peGVkIjo1MCwiaGVscGVycy9udW1iZXIiOjUxLCJoZWxwZXJzL29iamVjdCI6NTJ9XSwxMDU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQpe3ZhciBuPWUsbz0ic3RyaW5nIj09dHlwZW9mIG4/bi50b0xvd2VyQ2FzZSgpOm51bGw7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgcj0hMSxpPTAscz1lLmxlbmd0aDtzPmk7aSsrKXtpZihuPT09ZVtpXSl7cj0hMDticmVha31pZihvPT09bChlW2ldKS50b0xvd2VyQ2FzZSgpKXtyPSEwO2JyZWFrfX10KHIpfX12YXIgcixpLHM9KHI9ZSgiYnJvd3NlciIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSlbImRlZmF1bHQiXSxsPShpPWUoImhlbHBlcnMvbWl4ZWQiKSxpJiZpLl9fZXNNb2R1bGUmJml8fHsiZGVmYXVsdCI6aX0pLnN0cmluZ2lmeTtzLkF1dG9jb21wbGV0ZVZhbGlkYXRvcj1mdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lJiYoZT0iIiksdGhpcy5hbGxvd0VtcHR5JiYiIj09PWU/dm9pZCB0KCEwKTp2b2lkKHRoaXMuc3RyaWN0JiZ0aGlzLnNvdXJjZT8iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5zb3VyY2U/dGhpcy5zb3VyY2UoZSxvKGUsdCkpOm8oZSx0KSh0aGlzLnNvdXJjZSk6dCghMCkpfX0se2Jyb3dzZXI6MjMsImhlbHBlcnMvbWl4ZWQiOjUwfV0sMTA2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciBvLHIsaSxzLGw9KG89ZSgiYnJvd3NlciIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXSxhPShyPWUoIm1vbWVudCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSlbImRlZmF1bHQiXSx1PShpPWUoIi4uL2hlbHBlcnMvZGF0ZSIpLGkmJmkuX19lc01vZHVsZSYmaXx8eyJkZWZhdWx0IjppfSkuZ2V0Tm9ybWFsaXplZERhdGUsYz0ocz1lKCJlZGl0b3JzIikscyYmcy5fX2VzTW9kdWxlJiZzfHx7ImRlZmF1bHQiOnN9KS5nZXRFZGl0b3I7bC5EYXRlVmFsaWRhdG9yPWZ1bmN0aW9uKGUsdCl7dmFyIG49ITAsbz1jKCJkYXRlIix0aGlzLmluc3RhbmNlKTtudWxsPT1lJiYoZT0iIik7dmFyIHI9YShuZXcgRGF0ZShlKSkuaXNWYWxpZCgpLGk9YShlLHRoaXMuZGF0ZUZvcm1hdHx8by5kZWZhdWx0RGF0ZUZvcm1hdCwhMCkuaXNWYWxpZCgpO2lmKHRoaXMuYWxsb3dFbXB0eSYmIiI9PT1lJiYocj0hMCxpPSEwKSxyfHwobj0hMSksIXImJmkmJihuPSEwKSxyJiYhaSlpZih0aGlzLmNvcnJlY3RGb3JtYXQ9PT0hMCl7dmFyIHM9aChlLHRoaXMuZGF0ZUZvcm1hdCk7dGhpcy5pbnN0YW5jZS5zZXREYXRhQXRDZWxsKHRoaXMucm93LHRoaXMuY29sLHMsImRhdGVWYWxpZGF0b3IiKSxuPSEwfWVsc2Ugbj0hMTt0KG4pfTt2YXIgaD1mdW5jdGlvbihlLHQpe3ZhciBuPWEodShlKSksbz1uLmZvcm1hdCgiWVlZWSIpLHI9YSgpLmZvcm1hdCgiWVlZWSIpO3JldHVybiBvLnN1YnN0cigwLDIpIT09ci5zdWJzdHIoMCwyKT9lLm1hdGNoKG5ldyBSZWdFeHAobykpfHxuLnllYXIoby5yZXBsYWNlKG8uc3Vic3RyKDAsMiksci5zdWJzdHIoMCwyKSkpOm8ubGVuZ3RoPjQmJm4ueWVhcigobi55ZWFyKCkrIiIpLnN1YnN0cigwLDQpKSxuLmZvcm1hdCh0KX19LHsiLi4vaGVscGVycy9kYXRlIjo0NSxicm93c2VyOjIzLGVkaXRvcnM6MjksbW9tZW50OiJtb21lbnQifV0sMTA3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciBvLHI9KG89ZSgiYnJvd3NlciIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXTtyLk51bWVyaWNWYWxpZGF0b3I9ZnVuY3Rpb24oZSx0KXtudWxsPT1lJiYoZT0iIiksdCh0aGlzLmFsbG93RW1wdHkmJiIiPT09ZT8hMDoiIj09PWU/ITE6L14tP1xkKihcLnxcLCk/XGQqJC8udGVzdChlKSl9fSx7YnJvd3NlcjoyM31dLDEwODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgbyxyLGk9KG89ZSgiYnJvd3NlciIpLG8mJm8uX19lc01vZHVsZSYmb3x8eyJkZWZhdWx0IjpvfSlbImRlZmF1bHQiXSxzPShyPWUoIm1vbWVudCIpLHImJnIuX19lc01vZHVsZSYmcnx8eyJkZWZhdWx0IjpyfSlbImRlZmF1bHQiXSxsPVsiWVlZWS1NTS1ERFRISDptbTpzcy5TU1NaIiwiWCIsIngiXTtpLlRpbWVWYWxpZGF0b3I9ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMCxvPXRoaXMudGltZUZvcm1hdHx8Img6bW06c3MgYSI7bnVsbD09PWUmJihlPSIiKSxlPS9eXGR7Myx9JC8udGVzdChlKT9wYXJzZUludChlLDEwKTplO3ZhciByPS9eXGR7MSwyfSQvLnRlc3QoZSk7ciYmKGUrPSI6MDAiKTt2YXIgaT1zKGUsbCwhMCkuaXNWYWxpZCgpP3MoZSk6cyhlLG8pLGE9aS5pc1ZhbGlkKCksdT1zKGUsbywhMCkuaXNWYWxpZCgpJiYhcjtpZih0aGlzLmFsbG93RW1wdHkmJiIiPT09ZSYmKGE9ITAsdT0hMCksYXx8KG49ITEpLCFhJiZ1JiYobj0hMCksYSYmIXUpaWYodGhpcy5jb3JyZWN0Rm9ybWF0PT09ITApe3ZhciBjPWkuZm9ybWF0KG8pO3RoaXMuaW5zdGFuY2Uuc2V0RGF0YUF0Q2VsbCh0aGlzLnJvdyx0aGlzLmNvbCxjLCJ0aW1lVmFsaWRhdG9yIiksbj0hMH1lbHNlIG49ITE7dChuKX19LHticm93c2VyOjIzLG1vbWVudDoibW9tZW50In1dLFNoZWV0Q2xpcDpbZnVuY3Rpb24oZSx0LG4peyFmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlKXtyZXR1cm4gZS5zcGxpdCgnIicpLmxlbmd0aC0xfXZhciBvPXtwYXJzZTpmdW5jdGlvbihlKXt2YXIgbixvLHIsaSxzLGwsYSx1PVtdLGM9MDtmb3Iocj1lLnNwbGl0KCJcbiIpLHIubGVuZ3RoPjEmJiIiPT09cltyLmxlbmd0aC0xXSYmci5wb3AoKSxuPTAsbz1yLmxlbmd0aDtvPm47bis9MSl7Zm9yKHJbbl09cltuXS5zcGxpdCgiCSIpLGk9MCxzPXJbbl0ubGVuZ3RoO3M+aTtpKz0xKXVbY118fCh1W2NdPVtdKSxsJiYwPT09aT8oYT11W2NdLmxlbmd0aC0xLHVbY11bYV09dVtjXVthXSsiXG4iK3Jbbl1bMF0sbCYmMSZ0KHJbbl1bMF0pJiYobD0hMSx1W2NdW2FdPXVbY11bYV0uc3Vic3RyaW5nKDAsdVtjXVthXS5sZW5ndGgtMSkucmVwbGFjZSgvIiIvZywnIicpKSk6aT09PXMtMSYmMD09PXJbbl1baV0uaW5kZXhPZignIicpJiYxJnQocltuXVtpXSk/KHVbY10ucHVzaChyW25dW2ldLnN1YnN0cmluZygxKS5yZXBsYWNlKC8iIi9nLCciJykpLGw9ITApOih1W2NdLnB1c2gocltuXVtpXS5yZXBsYWNlKC8iIi9nLCciJykpLGw9ITEpO2x8fChjKz0xKX1yZXR1cm4gdX0sc3RyaW5naWZ5OmZ1bmN0aW9uKGUpe3ZhciB0LG4sbyxyLGkscz0iIjtmb3IodD0wLG49ZS5sZW5ndGg7bj50O3QrPTEpe2ZvcihyPWVbdF0ubGVuZ3RoLG89MDtyPm87bys9MSlvPjAmJihzKz0iCSIpLGk9ZVt0XVtvXSxzKz0ic3RyaW5nIj09dHlwZW9mIGk/aS5pbmRleE9mKCJcbiIpPi0xPyciJytpLnJlcGxhY2UoLyIvZywnIiInKSsnIic6aTpudWxsPT09aXx8dm9pZCAwPT09aT8iIjppO3MrPSJcbiJ9cmV0dXJuIHN9fTsidW5kZWZpbmVkIiE9dHlwZW9mIG4/KG4ucGFyc2U9by5wYXJzZSxuLnN0cmluZ2lmeT1vLnN0cmluZ2lmeSk6ZS5TaGVldENsaXA9b30od2luZG93KX0se31dLGF1dG9SZXNpemU6W2Z1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBvKCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZS5jdXJyZW50U3R5bGV8fGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZSl9dmFyIHQsbj17bWluSGVpZ2h0OjIwMCxtYXhIZWlnaHQ6MzAwLG1pbldpZHRoOjEwMCxtYXhXaWR0aDozMDB9LG89ZG9jdW1lbnQuYm9keSxyPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlNQQU4iKSxzPWZ1bmN0aW9uKGUsdCxuKXt3aW5kb3cuYXR0YWNoRXZlbnQ/ZS5hdHRhY2hFdmVudCgib24iK3Qsbik6ZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMSl9LGw9ZnVuY3Rpb24oZSx0LG4pe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyP2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITEpOmUuZGV0YWNoRXZlbnQoIm9uIit0LG4pfSxhPWZ1bmN0aW9uKHMpe3ZhciBsLGE7cz8vXlthLXpBLVogXC4sXFxcL1x8MC05XSQvLnRlc3Qocyl8fChzPSIuIik6cz0iIix2b2lkIDAhPT1yLnRleHRDb250ZW50P3IudGV4dENvbnRlbnQ9dC52YWx1ZStzOnIuZGF0YT10LnZhbHVlK3MsaS5zdHlsZS5mb250U2l6ZT1lKHQpLmZvbnRTaXplLGkuc3R5bGUuZm9udEZhbWlseT1lKHQpLmZvbnRGYW1pbHksaS5zdHlsZS53aGl0ZVNwYWNlPSJwcmUiLG8uYXBwZW5kQ2hpbGQoaSksbD1pLmNsaWVudFdpZHRoKzIsby5yZW1vdmVDaGlsZChpKSx0LnN0eWxlLmhlaWdodD1uLm1pbkhlaWdodCsicHgiLG4ubWluV2lkdGg+bD90LnN0eWxlLndpZHRoPW4ubWluV2lkdGgrInB4IjpsPm4ubWF4V2lkdGg/dC5zdHlsZS53aWR0aD1uLm1heFdpZHRoKyJweCI6dC5zdHlsZS53aWR0aD1sKyJweCIsYT10LnNjcm9sbEhlaWdodD90LnNjcm9sbEhlaWdodC0xOjAsbi5taW5IZWlnaHQ+YT90LnN0eWxlLmhlaWdodD1uLm1pbkhlaWdodCsicHgiOm4ubWF4SGVpZ2h0PGE/KHQuc3R5bGUuaGVpZ2h0PW4ubWF4SGVpZ2h0KyJweCIsdC5zdHlsZS5vdmVyZmxvd1k9InZpc2libGUiKTp0LnN0eWxlLmhlaWdodD1hKyJweCJ9LHU9ZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChhLDApfSxjPWZ1bmN0aW9uKGUpe2lmKGUmJmUubWluSGVpZ2h0KWlmKCJpbmhlcml0Ij09ZS5taW5IZWlnaHQpbi5taW5IZWlnaHQ9dC5jbGllbnRIZWlnaHQ7ZWxzZXt2YXIgbz1wYXJzZUludChlLm1pbkhlaWdodCk7aXNOYU4obyl8fChuLm1pbkhlaWdodD1vKX1pZihlJiZlLm1heEhlaWdodClpZigiaW5oZXJpdCI9PWUubWF4SGVpZ2h0KW4ubWF4SGVpZ2h0PXQuY2xpZW50SGVpZ2h0O2Vsc2V7dmFyIHM9cGFyc2VJbnQoZS5tYXhIZWlnaHQpO2lzTmFOKHMpfHwobi5tYXhIZWlnaHQ9cyl9aWYoZSYmZS5taW5XaWR0aClpZigiaW5oZXJpdCI9PWUubWluV2lkdGgpbi5taW5XaWR0aD10LmNsaWVudFdpZHRoO2Vsc2V7dmFyIGw9cGFyc2VJbnQoZS5taW5XaWR0aCk7aXNOYU4obCl8fChuLm1pbldpZHRoPWwpfWlmKGUmJmUubWF4V2lkdGgpaWYoImluaGVyaXQiPT1lLm1heFdpZHRoKW4ubWF4V2lkdGg9dC5jbGllbnRXaWR0aDtlbHNle3ZhciBhPXBhcnNlSW50KGUubWF4V2lkdGgpO2lzTmFOKGEpfHwobi5tYXhXaWR0aD1hKX1pLmZpcnN0Q2hpbGR8fChpLmNsYXNzTmFtZT0iYXV0b1Jlc2l6ZSIsaS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGkuYXBwZW5kQ2hpbGQocikpfSxoPWZ1bmN0aW9uKGUsbyxyKXt0PWUsYyhvKSwiVEVYVEFSRUEiPT10Lm5vZGVOYW1lJiYodC5zdHlsZS5yZXNpemU9Im5vbmUiLHQuc3R5bGUub3ZlcmZsb3dZPSIiLHQuc3R5bGUuaGVpZ2h0PW4ubWluSGVpZ2h0KyJweCIsdC5zdHlsZS5taW5XaWR0aD1uLm1pbldpZHRoKyJweCIsdC5zdHlsZS5tYXhXaWR0aD1uLm1heFdpZHRoKyJweCIsdC5zdHlsZS5vdmVyZmxvd1k9ImhpZGRlbiIpLHImJihzKHQsImNoYW5nZSIsYSkscyh0LCJjdXQiLHUpLHModCwicGFzdGUiLHUpLHModCwiZHJvcCIsdSkscyh0LCJrZXlkb3duIix1KSxzKHQsImZvY3VzIixhKSksYSgpfTtyZXR1cm57aW5pdDpmdW5jdGlvbihlLHQsbil7aChlLHQsbil9LHVuT2JzZXJ2ZTpmdW5jdGlvbigpe2wodCwiY2hhbmdlIixhKSxsKHQsImN1dCIsdSksbCh0LCJwYXN0ZSIsdSksbCh0LCJkcm9wIix1KSxsKHQsImtleWRvd24iLHUpLGwodCwiZm9jdXMiLGEpfSxyZXNpemU6YX19InVuZGVmaW5lZCIhPXR5cGVvZiBuJiYodC5leHBvcnRzPW8pfSx7fV0sY29weVBhc3RlOltmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gbygpe3JldHVybiBpP2kuaGFzQmVlbkRlc3Ryb3llZCgpJiZpLmluaXQoKTppPW5ldyByLGkucmVmQ291bnRlcisrLGl9ZnVuY3Rpb24gcigpe3RoaXMucmVmQ291bnRlcj0wLHRoaXMuaW5pdCgpOw0KfXZhciBpOyJ1bmRlZmluZWQiIT10eXBlb2YgbiYmKHQuZXhwb3J0cz1vKSxyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIGUsdDt0aGlzLmNvcHlDYWxsYmFja3M9W10sdGhpcy5jdXRDYWxsYmFja3M9W10sdGhpcy5wYXN0ZUNhbGxiYWNrcz1bXSx0PWRvY3VtZW50LmJvZHksZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkNvcHlQYXN0ZURpdiIpPyh0aGlzLmVsRGl2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJDb3B5UGFzdGVEaXYiKSx0aGlzLmVsVGV4dGFyZWE9dGhpcy5lbERpdi5maXJzdENoaWxkKToodGhpcy5lbERpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsRGl2LmlkPSJDb3B5UGFzdGVEaXYiLGU9dGhpcy5lbERpdi5zdHlsZSxlLnBvc2l0aW9uPSJmaXhlZCIsZS50b3A9Ii0xMDAwMHB4IixlLmxlZnQ9Ii0xMDAwMHB4Iix0LmFwcGVuZENoaWxkKHRoaXMuZWxEaXYpLHRoaXMuZWxUZXh0YXJlYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpLHRoaXMuZWxUZXh0YXJlYS5jbGFzc05hbWU9ImNvcHlQYXN0ZSIsdGhpcy5lbFRleHRhcmVhLm9ucGFzdGU9ZnVuY3Rpb24oZSl7dmFyIHQsbjsiV2Via2l0QXBwZWFyYW5jZSJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUmJih0PWUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJUZXh0IiksLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpJiYtMT09PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIikmJihuPXQuc3BsaXQoIlxuIiksIiI9PT1uW24ubGVuZ3RoLTFdJiZuLnBvcCgpLHQ9bi5qb2luKCJcbiIpKSx0aGlzLnZhbHVlPXQsZS5wcmV2ZW50RGVmYXVsdCgpKX0sZT10aGlzLmVsVGV4dGFyZWEuc3R5bGUsZS53aWR0aD0iMTAwMDBweCIsZS5oZWlnaHQ9IjEwMDAwcHgiLGUub3ZlcmZsb3c9ImhpZGRlbiIsdGhpcy5lbERpdi5hcHBlbmRDaGlsZCh0aGlzLmVsVGV4dGFyZWEpLCJ1bmRlZmluZWQiIT10eXBlb2YgZS5vcGFjaXR5JiYoZS5vcGFjaXR5PTApKSx0aGlzLm9uS2V5RG93blJlZj10aGlzLm9uS2V5RG93bi5iaW5kKHRoaXMpLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm9uS2V5RG93blJlZiwhMSl9LHIucHJvdG90eXBlLm9uS2V5RG93bj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtyZXR1cm4gZS5zaGFkb3dSb290JiZlLnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudCYmKGU9ZS5zaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQpLFsiSU5QVVQiLCJTRUxFQ1QiLCJURVhUQVJFQSJdLmluZGV4T2YoZS5ub2RlTmFtZSk+LTF8fCJ0cnVlIj09PWUuY29udGVudEVkaXRhYmxlfXZhciBuPXRoaXMsbz0hMTtpZihlLm1ldGFLZXk/bz0hMDplLmN0cmxLZXkmJi0xPT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNYWMiKSYmKG89ITApLG8pe2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT10aGlzLmVsVGV4dGFyZWEmJigiIiE9PXRoaXMuZ2V0U2VsZWN0aW9uVGV4dCgpfHx0KCkpKXJldHVybjt0aGlzLnNlbGVjdE5vZGVUZXh0KHRoaXMuZWxUZXh0YXJlYSksc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT1uLmVsVGV4dGFyZWEmJm4uc2VsZWN0Tm9kZVRleHQobi5lbFRleHRhcmVhKX0sMCl9ZS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uRW5hYmxlZD09PSExfHwhb3x8NjchPT1lLmtleUNvZGUmJjg2IT09ZS5rZXlDb2RlJiY4OCE9PWUua2V5Q29kZXx8KDg4PT09ZS5rZXlDb2RlP3NldFRpbWVvdXQoZnVuY3Rpb24oKXtuLnRyaWdnZXJDdXQoZSl9LDApOjg2PT09ZS5rZXlDb2RlJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi50cmlnZ2VyUGFzdGUoZSl9LDApKX0sci5wcm90b3R5cGUuc2VsZWN0Tm9kZVRleHQ9ZnVuY3Rpb24oZSl7ZSYmZS5zZWxlY3QoKX0sci5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uVGV4dD1mdW5jdGlvbigpe3ZhciBlPSIiO3JldHVybiB3aW5kb3cuZ2V0U2VsZWN0aW9uP2U9d2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk6ZG9jdW1lbnQuc2VsZWN0aW9uJiYiQ29udHJvbCIhPT1kb2N1bWVudC5zZWxlY3Rpb24udHlwZSYmKGU9ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dCksZX0sci5wcm90b3R5cGUuY29weWFibGU9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlJiZ2b2lkIDA9PT1lLnRvU3RyaW5nKXRocm93IG5ldyBFcnJvcigiY29weWFibGUgcmVxdWlyZXMgc3RyaW5nIHBhcmFtZXRlciIpO3RoaXMuZWxUZXh0YXJlYS52YWx1ZT1lLHRoaXMuc2VsZWN0Tm9kZVRleHQodGhpcy5lbFRleHRhcmVhKX0sci5wcm90b3R5cGUub25DdXQ9ZnVuY3Rpb24oZSl7dGhpcy5jdXRDYWxsYmFja3MucHVzaChlKX0sci5wcm90b3R5cGUub25QYXN0ZT1mdW5jdGlvbihlKXt0aGlzLnBhc3RlQ2FsbGJhY2tzLnB1c2goZSl9LHIucHJvdG90eXBlLnJlbW92ZUNhbGxiYWNrPWZ1bmN0aW9uKGUpe3ZhciB0LG47Zm9yKHQ9MCxuPXRoaXMuY29weUNhbGxiYWNrcy5sZW5ndGg7bj50O3QrKylpZih0aGlzLmNvcHlDYWxsYmFja3NbdF09PT1lKXJldHVybiB0aGlzLmNvcHlDYWxsYmFja3Muc3BsaWNlKHQsMSksITA7Zm9yKHQ9MCxuPXRoaXMuY3V0Q2FsbGJhY2tzLmxlbmd0aDtuPnQ7dCsrKWlmKHRoaXMuY3V0Q2FsbGJhY2tzW3RdPT09ZSlyZXR1cm4gdGhpcy5jdXRDYWxsYmFja3Muc3BsaWNlKHQsMSksITA7Zm9yKHQ9MCxuPXRoaXMucGFzdGVDYWxsYmFja3MubGVuZ3RoO24+dDt0KyspaWYodGhpcy5wYXN0ZUNhbGxiYWNrc1t0XT09PWUpcmV0dXJuIHRoaXMucGFzdGVDYWxsYmFja3Muc3BsaWNlKHQsMSksITA7cmV0dXJuITF9LHIucHJvdG90eXBlLnRyaWdnZXJDdXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmN1dENhbGxiYWNrcyYmc2V0VGltZW91dChmdW5jdGlvbigpe2Zvcih2YXIgbj0wLG89dC5jdXRDYWxsYmFja3MubGVuZ3RoO28+bjtuKyspdC5jdXRDYWxsYmFja3Nbbl0oZSl9LDUwKX0sci5wcm90b3R5cGUudHJpZ2dlclBhc3RlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztuLnBhc3RlQ2FsbGJhY2tzJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zm9yKHZhciBvPXR8fG4uZWxUZXh0YXJlYS52YWx1ZSxyPTAsaT1uLnBhc3RlQ2FsbGJhY2tzLmxlbmd0aDtpPnI7cisrKW4ucGFzdGVDYWxsYmFja3Nbcl0obyxlKX0sNTApfSxyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5oYXNCZWVuRGVzdHJveWVkKCl8fDAhPT0tLXRoaXMucmVmQ291bnRlcnx8KHRoaXMuZWxEaXYmJnRoaXMuZWxEaXYucGFyZW50Tm9kZSYmKHRoaXMuZWxEaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsRGl2KSx0aGlzLmVsRGl2PW51bGwsdGhpcy5lbFRleHRhcmVhPW51bGwpLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLm9uS2V5RG93blJlZiksdGhpcy5vbktleURvd25SZWY9bnVsbCl9LHIucHJvdG90eXBlLmhhc0JlZW5EZXN0cm95ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5yZWZDb3VudGVyfX0se31dLGVzNmNvbGxlY3Rpb25zOltmdW5jdGlvbihlLHQsbil7LyohDQogKiBDb3B5cmlnaHQgKEMpIDIwMTEgYnkgQW5kcmVhIEdpYW1tYXJjaGksIEBXZWJSZWZsZWN0aW9uDQogKg0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0KICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCiAqDQogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQogKg0KICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQogKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLA0KICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTg0KICogVEhFIFNPRlRXQVJFLg0KICovDQohZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSx0KXtmdW5jdGlvbiBvKGUpe3JldHVybiB0aGlzJiZ0aGlzLmNvbnN0cnVjdG9yPT09bz8odGhpcy5fa2V5cz1bXSx0aGlzLl92YWx1ZXM9W10sdGhpcy5faXRwPVtdLHRoaXMub2JqZWN0T25seT10LHZvaWQoZSYmbi5jYWxsKHRoaXMsZSkpKTpuZXcgbyhlKX1yZXR1cm4gdHx8eShlLCJzaXplIix7Z2V0Om19KSxlLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGU9ZSxvfWZ1bmN0aW9uIG4oZSl7dGhpcy5hZGQ/ZS5mb3JFYWNoKHRoaXMuYWRkLHRoaXMpOmUuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLnNldChlWzBdLGVbMV0pfSx0aGlzKX1mdW5jdGlvbiBvKGUpe3JldHVybiB0aGlzLmhhcyhlKSYmKHRoaXMuX2tleXMuc3BsaWNlKHYsMSksdGhpcy5fdmFsdWVzLnNwbGljZSh2LDEpLHRoaXMuX2l0cC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Y8ZVswXSYmZVswXS0tfSkpLHY+LTF9ZnVuY3Rpb24gcihlKXtyZXR1cm4gdGhpcy5oYXMoZSk/dGhpcy5fdmFsdWVzW3ZdOnZvaWQgMH1mdW5jdGlvbiBpKGUsdCl7aWYodGhpcy5vYmplY3RPbmx5JiZ0IT09T2JqZWN0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdmFsdWUgdXNlZCBhcyB3ZWFrIGNvbGxlY3Rpb24ga2V5Iik7aWYodCE9dHx8MD09PXQpZm9yKHY9ZS5sZW5ndGg7di0tJiYhYihlW3ZdLHQpOyk7ZWxzZSB2PWUuaW5kZXhPZih0KTtyZXR1cm4gdj4tMX1mdW5jdGlvbiBzKGUpe3JldHVybiBpLmNhbGwodGhpcyx0aGlzLl92YWx1ZXMsZSl9ZnVuY3Rpb24gbChlKXtyZXR1cm4gaS5jYWxsKHRoaXMsdGhpcy5fa2V5cyxlKX1mdW5jdGlvbiBhKGUsdCl7cmV0dXJuIHRoaXMuaGFzKGUpP3RoaXMuX3ZhbHVlc1t2XT10OnRoaXMuX3ZhbHVlc1t0aGlzLl9rZXlzLnB1c2goZSktMV09dCx0aGlzfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHRoaXMuaGFzKGUpfHx0aGlzLl92YWx1ZXMucHVzaChlKSx0aGlzfWZ1bmN0aW9uIGMoKXt0aGlzLl92YWx1ZXMubGVuZ3RoPTB9ZnVuY3Rpb24gaCgpe3JldHVybiBnKHRoaXMuX2l0cCx0aGlzLl9rZXlzKX1mdW5jdGlvbiBkKCl7cmV0dXJuIGcodGhpcy5faXRwLHRoaXMuX3ZhbHVlcyl9ZnVuY3Rpb24gZigpe3JldHVybiBnKHRoaXMuX2l0cCx0aGlzLl9rZXlzLHRoaXMuX3ZhbHVlcyl9ZnVuY3Rpb24gcCgpe3JldHVybiBnKHRoaXMuX2l0cCx0aGlzLl92YWx1ZXMsdGhpcy5fdmFsdWVzKX1mdW5jdGlvbiBnKGUsdCxuKXt2YXIgbz1bMF0scj0hMTtyZXR1cm4gZS5wdXNoKG8pLHtuZXh0OmZ1bmN0aW9uKCl7dmFyIGkscz1vWzBdO3JldHVybiFyJiZzPHQubGVuZ3RoPyhpPW4/W3Rbc10sbltzXV06dFtzXSxvWzBdKyspOihyPSEwLGUuc3BsaWNlKGUuaW5kZXhPZihvKSwxKSkse2RvbmU6cix2YWx1ZTppfX19fWZ1bmN0aW9uIG0oKXtyZXR1cm4gdGhpcy5fdmFsdWVzLmxlbmd0aH1mdW5jdGlvbiB3KGUsdCl7Zm9yKHZhciBuPXRoaXMuZW50cmllcygpOzspe3ZhciBvPW4ubmV4dCgpO2lmKG8uZG9uZSlicmVhaztlLmNhbGwodCxvLnZhbHVlWzFdLG8udmFsdWVbMF0sdGhpcyl9fXZhciB2LHk9T2JqZWN0LmRlZmluZVByb3BlcnR5LGI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaXNOYU4oZSk/aXNOYU4odCk6ZT09PXR9OyJ1bmRlZmluZWQiPT10eXBlb2YgV2Vha01hcCYmKGUuV2Vha01hcD10KHsiZGVsZXRlIjpvLGNsZWFyOmMsZ2V0OnIsaGFzOmwsc2V0OmF9LCEwKSksInVuZGVmaW5lZCI9PXR5cGVvZiBNYXAmJihlLk1hcD10KHsiZGVsZXRlIjpvLGhhczpsLGdldDpyLHNldDphLGtleXM6aCx2YWx1ZXM6ZCxlbnRyaWVzOmYsZm9yRWFjaDp3LGNsZWFyOmN9KSksInVuZGVmaW5lZCI9PXR5cGVvZiBTZXQmJihlLlNldD10KHtoYXM6cyxhZGQ6dSwiZGVsZXRlIjpvLGNsZWFyOmMsa2V5czpkLHZhbHVlczpkLGVudHJpZXM6cCxmb3JFYWNoOnd9KSksInVuZGVmaW5lZCI9PXR5cGVvZiBXZWFrU2V0JiYoZS5XZWFrU2V0PXQoeyJkZWxldGUiOm8sYWRkOnUsY2xlYXI6YyxoYXM6c30sITApKX0oInVuZGVmaW5lZCIhPXR5cGVvZiBuJiYidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6d2luZG93KX0se31dLGpzb25wYXRjaDpbZnVuY3Rpb24oZSx0LG4pey8qIQ0KICogaHR0cHM6Ly9naXRodWIuY29tL1N0YXJjb3VudGVyLUphY2svSlNPTi1QYXRjaA0KICoganNvbi1wYXRjaC1kdXBsZXguanMgdmVyc2lvbjogMC41LjcNCiAqIChjKSAyMDEzIEpvYWNoaW0gV2VzdGVyDQogKiBNSVQgbGljZW5zZQ0KICovDQp2YXIgbyxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWV9Zm9yKHZhciBvIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShvKSYmKGVbb109dFtvXSk7ZS5wcm90b3R5cGU9bnVsbD09PXQ/T2JqZWN0LmNyZWF0ZSh0KToobi5wcm90b3R5cGU9dC5wcm90b3R5cGUsbmV3IG4pfSxpPUVycm9yOyFmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsbil7c3dpdGNoKHR5cGVvZiBlKXtjYXNlInVuZGVmaW5lZCI6Y2FzZSJib29sZWFuIjpjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOnJldHVybiBlPT09bjtjYXNlIm9iamVjdCI6aWYobnVsbD09PWUpcmV0dXJuIG51bGw9PT1uO2lmKFQoZSkpe2lmKCFUKG4pfHxlLmxlbmd0aCE9PW4ubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgbz0wLHI9ZS5sZW5ndGg7cj5vO28rKylpZighdChlW29dLG5bb10pKXJldHVybiExO3JldHVybiEwfXZhciBpPXkobikscz1pLmxlbmd0aDtpZih5KGUpLmxlbmd0aCE9PXMpcmV0dXJuITE7Zm9yKHZhciBvPTA7cz5vO28rKylpZighdChlW29dLG5bb10pKXJldHVybiExO3JldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIG4oZSl7cmV0dXJuLTE9PT1lLmluZGV4T2YoIi8iKSYmLTE9PT1lLmluZGV4T2YoIn4iKT9lOmUucmVwbGFjZSgvfi9nLCJ+MCIpLnJlcGxhY2UoL1wvL2csIn4xIil9ZnVuY3Rpb24gbyhlKXtmb3IodmFyIHQ9MCxuPVIubGVuZ3RoO24+dDt0KyspaWYoUlt0XS5vYmo9PT1lKXJldHVybiBSW3RdfWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49MCxvPWUub2JzZXJ2ZXJzLmxlbmd0aDtvPm47bisrKWlmKGUub2JzZXJ2ZXJzW25dLmNhbGxiYWNrPT09dClyZXR1cm4gZS5vYnNlcnZlcnNbbl0ub2JzZXJ2ZXJ9ZnVuY3Rpb24gbChlLHQpe2Zvcih2YXIgbj0wLG89ZS5vYnNlcnZlcnMubGVuZ3RoO28+bjtuKyspaWYoZS5vYnNlcnZlcnNbbl0ub2JzZXJ2ZXI9PT10KXJldHVybiB2b2lkIGUub2JzZXJ2ZXJzLnNwbGljZShuLDEpfWZ1bmN0aW9uIGEoZSx0KXt0LnVub2JzZXJ2ZSgpfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP0pTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZSkpOmV9ZnVuY3Rpb24gYyhlLHQpe3ZhciBuLHI9W10sYT1vKGUpO2lmKGE/bj1zKGEsdCk6KGE9bmV3IFMoZSksUi5wdXNoKGEpKSxuKXJldHVybiBuO2lmKG49e30sYS52YWx1ZT11KGUpLHQpe24uY2FsbGJhY2s9dCxuLm5leHQ9bnVsbDt2YXIgYz10aGlzLmludGVydmFsc3x8WzEwMCwxZTMsMWU0LDZlNF07aWYodm9pZCAwPT09Yy5wdXNoKXRocm93IG5ldyBpKCJqc29ucGF0Y2guaW50ZXJ2YWxzIG11c3QgYmUgYW4gYXJyYXkiKTt2YXIgZD0wLGY9ZnVuY3Rpb24oKXtoKG4pfSxwPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KG4ubmV4dCksbi5uZXh0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCksZD0wLG4ubmV4dD1zZXRUaW1lb3V0KGcsY1tkKytdKX0sMCl9LGc9ZnVuY3Rpb24oKXtmKCksZD09Yy5sZW5ndGgmJihkPWMubGVuZ3RoLTEpLG4ubmV4dD1zZXRUaW1lb3V0KGcsY1tkKytdKX07InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcj8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIscCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixwKSk6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hdHRhY2hFdmVudCgib25tb3VzZWRvd24iLHApLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hdHRhY2hFdmVudCgib25tb3VzZXVwIixwKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoRXZlbnQoIm9ua2V5ZG93biIscCkpKSxuLm5leHQ9c2V0VGltZW91dChnLGNbZCsrXSl9cmV0dXJuIG4ucGF0Y2hlcz1yLG4ub2JqZWN0PWUsbi51bm9ic2VydmU9ZnVuY3Rpb24oKXtoKG4pLGNsZWFyVGltZW91dChuLm5leHQpLGwoYSxuKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyPyh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixwKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIscCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHApKTooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRldGFjaEV2ZW50KCJvbm1vdXNlZG93biIscCksZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRldGFjaEV2ZW50KCJvbm1vdXNldXAiLHApLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kZXRhY2hFdmVudCgib25rZXlkb3duIixwKSkpfSxhLm9ic2VydmVycy5wdXNoKG5ldyBFKHQsbikpLG59ZnVuY3Rpb24gaChlKXtmb3IodmFyIHQsbj0wLG89Ui5sZW5ndGg7bz5uO24rKylpZihSW25dLm9iaj09PWUub2JqZWN0KXt0PVJbbl07YnJlYWt9ZCh0LnZhbHVlLGUub2JqZWN0LGUucGF0Y2hlcywiIiksZS5wYXRjaGVzLmxlbmd0aCYmcCh0LnZhbHVlLGUucGF0Y2hlcyk7dmFyIHI9ZS5wYXRjaGVzO3JldHVybiByLmxlbmd0aD4wJiYoZS5wYXRjaGVzPVtdLGUuY2FsbGJhY2smJmUuY2FsbGJhY2socikpLHJ9ZnVuY3Rpb24gZChlLHQsbyxyKXtmb3IodmFyIGk9eSh0KSxzPXkoZSksbD0hMSxhPSExLGM9cy5sZW5ndGgtMTtjPj0wO2MtLSl7dmFyIGg9c1tjXSxmPWVbaF07aWYodC5oYXNPd25Qcm9wZXJ0eShoKSl7dmFyIHA9dFtoXTsib2JqZWN0Ij09dHlwZW9mIGYmJm51bGwhPWYmJiJvYmplY3QiPT10eXBlb2YgcCYmbnVsbCE9cD9kKGYscCxvLHIrIi8iK24oaCkpOmYhPXAmJihsPSEwLG8ucHVzaCh7b3A6InJlcGxhY2UiLHBhdGg6cisiLyIrbihoKSx2YWx1ZTp1KHApfSkpfWVsc2Ugby5wdXNoKHtvcDoicmVtb3ZlIixwYXRoOnIrIi8iK24oaCl9KSxhPSEwfWlmKGF8fGkubGVuZ3RoIT1zLmxlbmd0aClmb3IodmFyIGM9MDtjPGkubGVuZ3RoO2MrKyl7dmFyIGg9aVtjXTtlLmhhc093blByb3BlcnR5KGgpfHxvLnB1c2goe29wOiJhZGQiLHBhdGg6cisiLyIrbihoKSx2YWx1ZTp1KHRbaF0pfSl9fWZ1bmN0aW9uIGYoZSl7Zm9yKHZhciB0LG49MCxvPWUubGVuZ3RoO28+bjspe3Q9ZS5jaGFyQ29kZUF0KG4pO3tpZighKHQ+PTQ4JiY1Nz49dCkpcmV0dXJuITE7bisrfX1yZXR1cm4hMH1mdW5jdGlvbiBwKGUsdCxuKXtmb3IodmFyIG8scixpPSExLHM9MCxsPXQubGVuZ3RoO2w+czspe289dFtzXSxzKys7Zm9yKHZhciBhPW8ucGF0aHx8IiIsdT1hLnNwbGl0KCIvIiksYz1lLGg9MSxkPXUubGVuZ3RoLHA9dm9pZCAwOzspe2lmKHI9dVtoXSxuJiZ2b2lkIDA9PT1wJiYodm9pZCAwPT09Y1tyXT9wPXUuc2xpY2UoMCxoKS5qb2luKCIvIik6aD09ZC0xJiYocD1vLnBhdGgpLHZvaWQgMCE9PXAmJnRoaXMudmFsaWRhdG9yKG8scy0xLGUscCkpLGgrKyx2b2lkIDA9PT1yJiZoPj1kKXtpPV9bby5vcF0uY2FsbChvLGMscixlKTticmVha31pZihUKGMpKXtpZigiLSI9PT1yKXI9Yy5sZW5ndGg7ZWxzZXtpZihuJiYhZihyKSl0aHJvdyBuZXcgTSgiRXhwZWN0ZWQgYW4gdW5zaWduZWQgYmFzZS0xMCBpbnRlZ2VyIHZhbHVlLCBtYWtpbmcgdGhlIG5ldyByZWZlcmVuY2VkIHZhbHVlIHRoZSBhcnJheSBlbGVtZW50IHdpdGggdGhlIHplcm8tYmFzZWQgaW5kZXgiLCJPUEVSQVRJT05fUEFUSF9JTExFR0FMX0FSUkFZX0lOREVYIixzLTEsby5wYXRoLG8pO3I9cGFyc2VJbnQociwxMCl9aWYoaD49ZCl7aWYobiYmImFkZCI9PT1vLm9wJiZyPmMubGVuZ3RoKXRocm93IG5ldyBNKCJUaGUgc3BlY2lmaWVkIGluZGV4IE1VU1QgTk9UIGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSIsIk9QRVJBVElPTl9WQUxVRV9PVVRfT0ZfQk9VTkRTIixzLTEsby5wYXRoLG8pO2k9Q1tvLm9wXS5jYWxsKG8sYyxyLGUpO2JyZWFrfX1lbHNlIGlmKHImJi0xIT1yLmluZGV4T2YoIn4iKSYmKHI9ci5yZXBsYWNlKC9+MS9nLCIvIikucmVwbGFjZSgvfjAvZywifiIpKSxoPj1kKXtpPWJbby5vcF0uY2FsbChvLGMscixlKTticmVha31jPWNbcl19fXJldHVybiBpfWZ1bmN0aW9uIGcoZSx0KXt2YXIgbj1bXTtyZXR1cm4gZChlLHQsbiwiIiksbn1mdW5jdGlvbiBtKGUpe2lmKHZvaWQgMD09PWUpcmV0dXJuITA7aWYoImFycmF5Ij09dHlwZW9mIGV8fCJvYmplY3QiPT10eXBlb2YgZSlmb3IodmFyIHQgaW4gZSlpZihtKGVbdF0pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHcodCxuLG8scil7aWYoIm9iamVjdCIhPXR5cGVvZiB0fHxudWxsPT09dHx8VCh0KSl0aHJvdyBuZXcgTSgiT3BlcmF0aW9uIGlzIG5vdCBhbiBvYmplY3QiLCJPUEVSQVRJT05fTk9UX0FOX09CSkVDVCIsbix0LG8pO2lmKCFiW3Qub3BdKXRocm93IG5ldyBNKCJPcGVyYXRpb24gYG9wYCBwcm9wZXJ0eSBpcyBub3Qgb25lIG9mIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiBSRkMtNjkwMiIsIk9QRVJBVElPTl9PUF9JTlZBTElEIixuLHQsbyk7aWYoInN0cmluZyIhPXR5cGVvZiB0LnBhdGgpdGhyb3cgbmV3IE0oIk9wZXJhdGlvbiBgcGF0aGAgcHJvcGVydHkgaXMgbm90IGEgc3RyaW5nIiwiT1BFUkFUSU9OX1BBVEhfSU5WQUxJRCIsbix0LG8pO2lmKCgibW92ZSI9PT10Lm9wfHwiY29weSI9PT10Lm9wKSYmInN0cmluZyIhPXR5cGVvZiB0LmZyb20pdGhyb3cgbmV3IE0oIk9wZXJhdGlvbiBgZnJvbWAgcHJvcGVydHkgaXMgbm90IHByZXNlbnQgKGFwcGxpY2FibGUgaW4gYG1vdmVgIGFuZCBgY29weWAgb3BlcmF0aW9ucykiLCJPUEVSQVRJT05fRlJPTV9SRVFVSVJFRCIsbix0LG8pO2lmKCgiYWRkIj09PXQub3B8fCJyZXBsYWNlIj09PXQub3B8fCJ0ZXN0Ij09PXQub3ApJiZ2b2lkIDA9PT10LnZhbHVlKXRocm93IG5ldyBNKCJPcGVyYXRpb24gYHZhbHVlYCBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudCAoYXBwbGljYWJsZSBpbiBgYWRkYCwgYHJlcGxhY2VgIGFuZCBgdGVzdGAgb3BlcmF0aW9ucykiLCJPUEVSQVRJT05fVkFMVUVfUkVRVUlSRUQiLG4sdCxvKTtpZigoImFkZCI9PT10Lm9wfHwicmVwbGFjZSI9PT10Lm9wfHwidGVzdCI9PT10Lm9wKSYmbSh0LnZhbHVlKSl0aHJvdyBuZXcgTSgiT3BlcmF0aW9uIGB2YWx1ZWAgcHJvcGVydHkgaXMgbm90IHByZXNlbnQgKGFwcGxpY2FibGUgaW4gYGFkZGAsIGByZXBsYWNlYCBhbmQgYHRlc3RgIG9wZXJhdGlvbnMpIiwiT1BFUkFUSU9OX1ZBTFVFX0NBTk5PVF9DT05UQUlOX1VOREVGSU5FRCIsbix0LG8pO2lmKG8paWYoImFkZCI9PXQub3Ape3ZhciBpPXQucGF0aC5zcGxpdCgiLyIpLmxlbmd0aCxzPXIuc3BsaXQoIi8iKS5sZW5ndGg7aWYoaSE9PXMrMSYmaSE9PXMpdGhyb3cgbmV3IE0oIkNhbm5vdCBwZXJmb3JtIGFuIGBhZGRgIG9wZXJhdGlvbiBhdCB0aGUgZGVzaXJlZCBwYXRoIiwiT1BFUkFUSU9OX1BBVEhfQ0FOTk9UX0FERCIsbix0LG8pfWVsc2UgaWYoInJlcGxhY2UiPT09dC5vcHx8InJlbW92ZSI9PT10Lm9wfHwiX2dldCI9PT10Lm9wKXtpZih0LnBhdGghPT1yKXRocm93IG5ldyBNKCJDYW5ub3QgcGVyZm9ybSB0aGUgb3BlcmF0aW9uIGF0IGEgcGF0aCB0aGF0IGRvZXMgbm90IGV4aXN0IiwiT1BFUkFUSU9OX1BBVEhfVU5SRVNPTFZBQkxFIixuLHQsbyl9ZWxzZSBpZigibW92ZSI9PT10Lm9wfHwiY29weSI9PT10Lm9wKXt2YXIgbD17b3A6Il9nZXQiLHBhdGg6dC5mcm9tLHZhbHVlOnZvaWQgMH0sYT1lLnZhbGlkYXRlKFtsXSxvKTtpZihhJiYiT1BFUkFUSU9OX1BBVEhfVU5SRVNPTFZBQkxFIj09PWEubmFtZSl0aHJvdyBuZXcgTSgiQ2Fubm90IHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBmcm9tIGEgcGF0aCB0aGF0IGRvZXMgbm90IGV4aXN0IiwiT1BFUkFUSU9OX0ZST01fVU5SRVNPTFZBQkxFIixuLHQsbyl9fWZ1bmN0aW9uIHYoZSx0KXt0cnl7aWYoIVQoZSkpdGhyb3cgbmV3IE0oIlBhdGNoIHNlcXVlbmNlIG11c3QgYmUgYW4gYXJyYXkiLCJTRVFVRU5DRV9OT1RfQU5fQVJSQVkiKTtpZih0KXQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0KSkscC5jYWxsKHRoaXMsdCxlLCEwKTtlbHNlIGZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRoaXMudmFsaWRhdG9yKGVbbl0sbil9Y2F0Y2gobyl7aWYobyBpbnN0YW5jZW9mIE0pcmV0dXJuIG87dGhyb3cgb319dmFyIHk9ZnVuY3Rpb24oZSl7aWYoVChlKSl7Zm9yKHZhciB0PW5ldyBBcnJheShlLmxlbmd0aCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09IiIrbjtyZXR1cm4gdH1pZihPYmplY3Qua2V5cylyZXR1cm4gT2JqZWN0LmtleXMoZSk7dmFyIHQ9W107Zm9yKHZhciBvIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShvKSYmdC5wdXNoKG8pO3JldHVybiB0fSxiPXthZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XT10aGlzLnZhbHVlLCEwfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZGVsZXRlIGVbdF0sITB9LHJlcGxhY2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XT10aGlzLnZhbHVlLCEwfSxtb3ZlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz17b3A6Il9nZXQiLHBhdGg6dGhpcy5mcm9tfTtyZXR1cm4gcChuLFtvXSkscChuLFt7b3A6InJlbW92ZSIscGF0aDp0aGlzLmZyb219XSkscChuLFt7b3A6ImFkZCIscGF0aDp0aGlzLnBhdGgsdmFsdWU6by52YWx1ZX1dKSwhMH0sY29weTpmdW5jdGlvbihlLHQsbil7dmFyIG89e29wOiJfZ2V0IixwYXRoOnRoaXMuZnJvbX07cmV0dXJuIHAobixbb10pLHAobixbe29wOiJhZGQiLHBhdGg6dGhpcy5wYXRoLHZhbHVlOm8udmFsdWV9XSksITB9LHRlc3Q6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdChlW25dLHRoaXMudmFsdWUpfSxfZ2V0OmZ1bmN0aW9uKGUsdCl7dGhpcy52YWx1ZT1lW3RdfX0sQz17YWRkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3BsaWNlKHQsMCx0aGlzLnZhbHVlKSwhMH0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3BsaWNlKHQsMSksITB9LHJlcGxhY2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XT10aGlzLnZhbHVlLCEwfSxtb3ZlOmIubW92ZSxjb3B5OmIuY29weSx0ZXN0OmIudGVzdCxfZ2V0OmIuX2dldH0sXz17YWRkOmZ1bmN0aW9uKGUpe18ucmVtb3ZlLmNhbGwodGhpcyxlKTtmb3IodmFyIHQgaW4gdGhpcy52YWx1ZSl0aGlzLnZhbHVlLmhhc093blByb3BlcnR5KHQpJiYoZVt0XT10aGlzLnZhbHVlW3RdKTtyZXR1cm4hMH0scmVtb3ZlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKWUuaGFzT3duUHJvcGVydHkodCkmJmIucmVtb3ZlLmNhbGwodGhpcyxlLHQpO3JldHVybiEwfSxyZXBsYWNlOmZ1bmN0aW9uKGUpe3JldHVybiBwKGUsW3tvcDoicmVtb3ZlIixwYXRoOnRoaXMucGF0aH1dKSxwKGUsW3tvcDoiYWRkIixwYXRoOnRoaXMucGF0aCx2YWx1ZTp0aGlzLnZhbHVlfV0pLCEwfSxtb3ZlOmIubW92ZSxjb3B5OmIuY29weSx0ZXN0OmZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnN0cmluZ2lmeShlKT09PUpTT04uc3RyaW5naWZ5KHRoaXMudmFsdWUpfSxfZ2V0OmZ1bmN0aW9uKGUpe3RoaXMudmFsdWU9ZX19LFI9W10sUz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5vYnNlcnZlcnM9W10sdGhpcy5vYmo9ZX1yZXR1cm4gZX0oKSxFPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3RoaXMuY2FsbGJhY2s9ZSx0aGlzLm9ic2VydmVyPXR9cmV0dXJuIGV9KCk7ZS51bm9ic2VydmU9YSxlLm9ic2VydmU9YyxlLmdlbmVyYXRlPWg7dmFyIFQ7VD1BcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucHVzaCYmIm51bWJlciI9PXR5cGVvZiBlLmxlbmd0aH0sZS5hcHBseT1wLGUuY29tcGFyZT1nO3ZhciBNPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuLG8scixpKXtlLmNhbGwodGhpcyx0KSx0aGlzLm1lc3NhZ2U9dCx0aGlzLm5hbWU9bix0aGlzLmluZGV4PW8sdGhpcy5vcGVyYXRpb249cix0aGlzLnRyZWU9aX1yZXR1cm4gcih0LGUpLHR9KGkpO2UuSnNvblBhdGNoRXJyb3I9TSxlLkVycm9yPU0sZS52YWxpZGF0b3I9dyxlLnZhbGlkYXRlPXZ9KG98fChvPXt9KSksInVuZGVmaW5lZCIhPXR5cGVvZiBuJiYobi5hcHBseT1vLmFwcGx5LG4ub2JzZXJ2ZT1vLm9ic2VydmUsbi51bm9ic2VydmU9by51bm9ic2VydmUsbi5nZW5lcmF0ZT1vLmdlbmVyYXRlLG4uY29tcGFyZT1vLmNvbXBhcmUsbi52YWxpZGF0ZT1vLnZhbGlkYXRlLG4udmFsaWRhdG9yPW8udmFsaWRhdG9yLG4uSnNvblBhdGNoRXJyb3I9by5Kc29uUGF0Y2hFcnJvcixuLkVycm9yPW8uRXJyb3IpfSx7fV0sbW9tZW50OltmdW5jdGlvbih0LG4sbyl7IWZ1bmN0aW9uKHQscil7Im9iamVjdCI9PXR5cGVvZiBvJiYidW5kZWZpbmVkIiE9dHlwZW9mIG4/bi5leHBvcnRzPXIoKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5hbWQ/ZShyKTp0Lm1vbWVudD1yKCl9KHRoaXMsZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZSgpe3JldHVybiBlby5hcHBseShudWxsLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbyhlKXtlbz1lfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheXx8IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBpKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZXx8IltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHMoZSx0KXt2YXIgbixvPVtdO2ZvcihuPTA7bjxlLmxlbmd0aDsrK24pby5wdXNoKHQoZVtuXSxuKSk7cmV0dXJuIG99ZnVuY3Rpb24gbChlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX1mdW5jdGlvbiBhKGUsdCl7Zm9yKHZhciBuIGluIHQpbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gbCh0LCJ0b1N0cmluZyIpJiYoZS50b1N0cmluZz10LnRvU3RyaW5nKSxsKHQsInZhbHVlT2YiKSYmKGUudmFsdWVPZj10LnZhbHVlT2YpLGV9ZnVuY3Rpb24gdShlLHQsbixvKXtyZXR1cm4gTGUoZSx0LG4sbywhMCkudXRjKCl9ZnVuY3Rpb24gYygpe3JldHVybntlbXB0eTohMSx1bnVzZWRUb2tlbnM6W10sdW51c2VkSW5wdXQ6W10sb3ZlcmZsb3c6LTIsY2hhcnNMZWZ0T3ZlcjowLG51bGxJbnB1dDohMSxpbnZhbGlkTW9udGg6bnVsbCxpbnZhbGlkRm9ybWF0OiExLHVzZXJJbnZhbGlkYXRlZDohMSxpc286ITF9fWZ1bmN0aW9uIGgoZSl7cmV0dXJuIG51bGw9PWUuX3BmJiYoZS5fcGY9YygpKSxlLl9wZn1mdW5jdGlvbiBkKGUpe2lmKG51bGw9PWUuX2lzVmFsaWQpe3ZhciB0PWgoZSk7ZS5faXNWYWxpZD0hKGlzTmFOKGUuX2QuZ2V0VGltZSgpKXx8ISh0Lm92ZXJmbG93PDApfHx0LmVtcHR5fHx0LmludmFsaWRNb250aHx8dC5pbnZhbGlkV2Vla2RheXx8dC5udWxsSW5wdXR8fHQuaW52YWxpZEZvcm1hdHx8dC51c2VySW52YWxpZGF0ZWQpLGUuX3N0cmljdCYmKGUuX2lzVmFsaWQ9ZS5faXNWYWxpZCYmMD09PXQuY2hhcnNMZWZ0T3ZlciYmMD09PXQudW51c2VkVG9rZW5zLmxlbmd0aCYmdm9pZCAwPT09dC5iaWdIb3VyKX1yZXR1cm4gZS5faXNWYWxpZH1mdW5jdGlvbiBmKGUpe3ZhciB0PXUoTmFOKTtyZXR1cm4gbnVsbCE9ZT9hKGgodCksZSk6aCh0KS51c2VySW52YWxpZGF0ZWQ9ITAsdH1mdW5jdGlvbiBwKGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIGcoZSx0KXt2YXIgbixvLHI7aWYocCh0Ll9pc0FNb21lbnRPYmplY3QpfHwoZS5faXNBTW9tZW50T2JqZWN0PXQuX2lzQU1vbWVudE9iamVjdCkscCh0Ll9pKXx8KGUuX2k9dC5faSkscCh0Ll9mKXx8KGUuX2Y9dC5fZikscCh0Ll9sKXx8KGUuX2w9dC5fbCkscCh0Ll9zdHJpY3QpfHwoZS5fc3RyaWN0PXQuX3N0cmljdCkscCh0Ll90em0pfHwoZS5fdHptPXQuX3R6bSkscCh0Ll9pc1VUQyl8fChlLl9pc1VUQz10Ll9pc1VUQykscCh0Ll9vZmZzZXQpfHwoZS5fb2Zmc2V0PXQuX29mZnNldCkscCh0Ll9wZil8fChlLl9wZj1oKHQpKSxwKHQuX2xvY2FsZSl8fChlLl9sb2NhbGU9dC5fbG9jYWxlKSx0by5sZW5ndGg+MClmb3IobiBpbiB0bylvPXRvW25dLHI9dFtvXSxwKHIpfHwoZVtvXT1yKTtyZXR1cm4gZX1mdW5jdGlvbiBtKHQpe2codGhpcyx0KSx0aGlzLl9kPW5ldyBEYXRlKG51bGwhPXQuX2Q/dC5fZC5nZXRUaW1lKCk6TmFOKSxubz09PSExJiYobm89ITAsZS51cGRhdGVPZmZzZXQodGhpcyksbm89ITEpfWZ1bmN0aW9uIHcoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBtfHxudWxsIT1lJiZudWxsIT1lLl9pc0FNb21lbnRPYmplY3R9ZnVuY3Rpb24gdihlKXtyZXR1cm4gMD5lP01hdGguY2VpbChlKTpNYXRoLmZsb29yKGUpfWZ1bmN0aW9uIHkoZSl7dmFyIHQ9K2Usbj0wO3JldHVybiAwIT09dCYmaXNGaW5pdGUodCkmJihuPXYodCkpLG59ZnVuY3Rpb24gYihlLHQsbil7dmFyIG8scj1NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCksaT1NYXRoLmFicyhlLmxlbmd0aC10Lmxlbmd0aCkscz0wO2ZvcihvPTA7cj5vO28rKykobiYmZVtvXSE9PXRbb118fCFuJiZ5KGVbb10pIT09eSh0W29dKSkmJnMrKztyZXR1cm4gcytpfWZ1bmN0aW9uIEModCl7ZS5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3M9PT0hMSYmInVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybigiRGVwcmVjYXRpb24gd2FybmluZzogIit0KX1mdW5jdGlvbiBfKGUsdCl7dmFyIG49ITA7cmV0dXJuIGEoZnVuY3Rpb24oKXtyZXR1cm4gbiYmKEMoZSsiXG5Bcmd1bWVudHM6ICIrQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsICIpKyJcbiIrKG5ldyBFcnJvcikuc3RhY2spLG49ITEpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0KX1mdW5jdGlvbiBSKGUsdCl7b29bZV18fChDKHQpLG9vW2VdPSEwKX1mdW5jdGlvbiBTKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRnVuY3Rpb258fCJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gRShlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBUKGUpe3ZhciB0LG47Zm9yKG4gaW4gZSl0PWVbbl0sUyh0KT90aGlzW25dPXQ6dGhpc1siXyIrbl09dDt0aGlzLl9jb25maWc9ZSx0aGlzLl9vcmRpbmFsUGFyc2VMZW5pZW50PW5ldyBSZWdFeHAodGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSsifCIrL1xkezEsMn0vLnNvdXJjZSl9ZnVuY3Rpb24gTShlLHQpe3ZhciBuLG89YSh7fSxlKTtmb3IobiBpbiB0KWwodCxuKSYmKEUoZVtuXSkmJkUodFtuXSk/KG9bbl09e30sYShvW25dLGVbbl0pLGEob1tuXSx0W25dKSk6bnVsbCE9dFtuXT9vW25dPXRbbl06ZGVsZXRlIG9bbl0pO3JldHVybiBvfWZ1bmN0aW9uIE8oZSl7bnVsbCE9ZSYmdGhpcy5zZXQoZSl9ZnVuY3Rpb24gayhlKXtyZXR1cm4gZT9lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgiXyIsIi0iKTplfWZ1bmN0aW9uIEgoZSl7Zm9yKHZhciB0LG4sbyxyLGk9MDtpPGUubGVuZ3RoOyl7Zm9yKHI9ayhlW2ldKS5zcGxpdCgiLSIpLHQ9ci5sZW5ndGgsbj1rKGVbaSsxXSksbj1uP24uc3BsaXQoIi0iKTpudWxsO3Q+MDspe2lmKG89RChyLnNsaWNlKDAsdCkuam9pbigiLSIpKSlyZXR1cm4gbztpZihuJiZuLmxlbmd0aD49dCYmYihyLG4sITApPj10LTEpYnJlYWs7dC0tfWkrK31yZXR1cm4gbnVsbH1mdW5jdGlvbiBEKGUpe3ZhciBvPW51bGw7aWYoIWlvW2VdJiYidW5kZWZpbmVkIiE9dHlwZW9mIG4mJm4mJm4uZXhwb3J0cyl0cnl7bz1yby5fYWJicix0KCIuL2xvY2FsZS8iK2UpLEEobyl9Y2F0Y2gocil7fXJldHVybiBpb1tlXX1mdW5jdGlvbiBBKGUsdCl7dmFyIG47cmV0dXJuIGUmJihuPXAodCk/TihlKTp4KGUsdCksbiYmKHJvPW4pKSxyby5fYWJicn1mdW5jdGlvbiB4KGUsdCl7cmV0dXJuIG51bGwhPT10Pyh0LmFiYnI9ZSxudWxsIT1pb1tlXT8oUigiZGVmaW5lTG9jYWxlT3ZlcnJpZGUiLCJ1c2UgbW9tZW50LnVwZGF0ZUxvY2FsZShsb2NhbGVOYW1lLCBjb25maWcpIHRvIGNoYW5nZSBhbiBleGlzdGluZyBsb2NhbGUuIG1vbWVudC5kZWZpbmVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGUiKSx0PU0oaW9bZV0uX2NvbmZpZyx0KSk6bnVsbCE9dC5wYXJlbnRMb2NhbGUmJihudWxsIT1pb1t0LnBhcmVudExvY2FsZV0/dD1NKGlvW3QucGFyZW50TG9jYWxlXS5fY29uZmlnLHQpOlIoInBhcmVudExvY2FsZVVuZGVmaW5lZCIsInNwZWNpZmllZCBwYXJlbnRMb2NhbGUgaXMgbm90IGRlZmluZWQgeWV0IikpLGlvW2VdPW5ldyBPKHQpLEEoZSksaW9bZV0pOihkZWxldGUgaW9bZV0sbnVsbCl9ZnVuY3Rpb24gUChlLHQpe2lmKG51bGwhPXQpe3ZhciBuO251bGwhPWlvW2VdJiYodD1NKGlvW2VdLl9jb25maWcsdCkpLG49bmV3IE8odCksbi5wYXJlbnRMb2NhbGU9aW9bZV0saW9bZV09bixBKGUpfWVsc2UgbnVsbCE9aW9bZV0mJihudWxsIT1pb1tlXS5wYXJlbnRMb2NhbGU/aW9bZV09aW9bZV0ucGFyZW50TG9jYWxlOm51bGwhPWlvW2VdJiZkZWxldGUgaW9bZV0pO3JldHVybiBpb1tlXX1mdW5jdGlvbiBOKGUpe3ZhciB0O2lmKGUmJmUuX2xvY2FsZSYmZS5fbG9jYWxlLl9hYmJyJiYoZT1lLl9sb2NhbGUuX2FiYnIpLCFlKXJldHVybiBybztpZighcihlKSl7aWYodD1EKGUpKXJldHVybiB0O2U9W2VdfXJldHVybiBIKGUpfWZ1bmN0aW9uIEwoKXtyZXR1cm4gT2JqZWN0LmtleXMoaW8pfWZ1bmN0aW9uIFcoZSx0KXt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7c29bbl09c29bbisicyJdPXNvW3RdPWV9ZnVuY3Rpb24gSShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/c29bZV18fHNvW2UudG9Mb3dlckNhc2UoKV06dm9pZCAwfWZ1bmN0aW9uIGooZSl7dmFyIHQsbixvPXt9O2ZvcihuIGluIGUpbChlLG4pJiYodD1JKG4pLHQmJihvW3RdPWVbbl0pKTtyZXR1cm4gb31mdW5jdGlvbiBWKHQsbil7cmV0dXJuIGZ1bmN0aW9uKG8pe3JldHVybiBudWxsIT1vPyhCKHRoaXMsdCxvKSxlLnVwZGF0ZU9mZnNldCh0aGlzLG4pLHRoaXMpOkYodGhpcyx0KX19ZnVuY3Rpb24gRihlLHQpe3JldHVybiBlLmlzVmFsaWQoKT9lLl9kWyJnZXQiKyhlLl9pc1VUQz8iVVRDIjoiIikrdF0oKTpOYU59ZnVuY3Rpb24gQihlLHQsbil7ZS5pc1ZhbGlkKCkmJmUuX2RbInNldCIrKGUuX2lzVVRDPyJVVEMiOiIiKSt0XShuKX1mdW5jdGlvbiB6KGUsdCl7dmFyIG47aWYoIm9iamVjdCI9PXR5cGVvZiBlKWZvcihuIGluIGUpdGhpcy5zZXQobixlW25dKTtlbHNlIGlmKGU9SShlKSxTKHRoaXNbZV0pKXJldHVybiB0aGlzW2VdKHQpO3JldHVybiB0aGlzfWZ1bmN0aW9uIFkoZSx0LG4pe3ZhciBvPSIiK01hdGguYWJzKGUpLHI9dC1vLmxlbmd0aCxpPWU+PTA7cmV0dXJuKGk/bj8iKyI6IiI6Ii0iKStNYXRoLnBvdygxMCxNYXRoLm1heCgwLHIpKS50b1N0cmluZygpLnN1YnN0cigxKStvfWZ1bmN0aW9uIFUoZSx0LG4sbyl7dmFyIHI9bzsic3RyaW5nIj09dHlwZW9mIG8mJihyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbb10oKX0pLGUmJihjb1tlXT1yKSx0JiYoY29bdFswXV09ZnVuY3Rpb24oKXtyZXR1cm4gWShyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0WzFdLHRbMl0pfSksbiYmKGNvW25dPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwoci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZSl9KX1mdW5jdGlvbiBHKGUpe3JldHVybiBlLm1hdGNoKC9cW1tcc1xTXS8pP2UucmVwbGFjZSgvXlxbfFxdJC9nLCIiKTplLnJlcGxhY2UoL1xcL2csIiIpfWZ1bmN0aW9uICQoZSl7dmFyIHQsbixvPWUubWF0Y2gobG8pO2Zvcih0PTAsbj1vLmxlbmd0aDtuPnQ7dCsrKWNvW29bdF1dP29bdF09Y29bb1t0XV06b1t0XT1HKG9bdF0pO3JldHVybiBmdW5jdGlvbihyKXt2YXIgaT0iIjtmb3IodD0wO24+dDt0KyspaSs9b1t0XWluc3RhbmNlb2YgRnVuY3Rpb24/b1t0XS5jYWxsKHIsZSk6b1t0XTtyZXR1cm4gaX19ZnVuY3Rpb24gWChlLHQpe3JldHVybiBlLmlzVmFsaWQoKT8odD1LKHQsZS5sb2NhbGVEYXRhKCkpLHVvW3RdPXVvW3RdfHwkKHQpLHVvW3RdKGUpKTplLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpfWZ1bmN0aW9uIEsoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiB0LmxvbmdEYXRlRm9ybWF0KGUpfHxlfXZhciBvPTU7Zm9yKGFvLmxhc3RJbmRleD0wO28+PTAmJmFvLnRlc3QoZSk7KWU9ZS5yZXBsYWNlKGFvLG4pLGFvLmxhc3RJbmRleD0wLG8tPTE7cmV0dXJuIGV9ZnVuY3Rpb24gcShlLHQsbil7a29bZV09Uyh0KT90OmZ1bmN0aW9uKGUsbyl7cmV0dXJuIGUmJm4/bjp0fX1mdW5jdGlvbiBaKGUsdCl7cmV0dXJuIGwoa28sZSk/a29bZV0odC5fc3RyaWN0LHQuX2xvY2FsZSk6bmV3IFJlZ0V4cChKKGUpKX1mdW5jdGlvbiBKKGUpe3JldHVybiBRKGUucmVwbGFjZSgiXFwiLCIiKS5yZXBsYWNlKC9cXChcWyl8XFwoXF0pfFxbKFteXF1cW10qKVxdfFxcKC4pL2csZnVuY3Rpb24oZSx0LG4sbyxyKXtyZXR1cm4gdHx8bnx8b3x8cn0pKX1mdW5jdGlvbiBRKGUpe3JldHVybiBlLnJlcGxhY2UoL1stXC9cXF4kKis/LigpfFtcXXt9XS9nLCJcXCQmIil9ZnVuY3Rpb24gZWUoZSx0KXt2YXIgbixvPXQ7Zm9yKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKSwibnVtYmVyIj09dHlwZW9mIHQmJihvPWZ1bmN0aW9uKGUsbil7blt0XT15KGUpfSksbj0wO248ZS5sZW5ndGg7bisrKUhvW2Vbbl1dPW99ZnVuY3Rpb24gdGUoZSx0KXtlZShlLGZ1bmN0aW9uKGUsbixvLHIpe28uX3c9by5fd3x8e30sdChlLG8uX3csbyxyKX0pfWZ1bmN0aW9uIG5lKGUsdCxuKXtudWxsIT10JiZsKEhvLGUpJiZIb1tlXSh0LG4uX2EsbixlKX1mdW5jdGlvbiBvZShlLHQpe3JldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhlLHQrMSwwKSkuZ2V0VVRDRGF0ZSgpfWZ1bmN0aW9uIHJlKGUsdCl7cmV0dXJuIHIodGhpcy5fbW9udGhzKT90aGlzLl9tb250aHNbZS5tb250aCgpXTp0aGlzLl9tb250aHNbVm8udGVzdCh0KT8iZm9ybWF0Ijoic3RhbmRhbG9uZSJdW2UubW9udGgoKV19ZnVuY3Rpb24gaWUoZSx0KXtyZXR1cm4gcih0aGlzLl9tb250aHNTaG9ydCk/dGhpcy5fbW9udGhzU2hvcnRbZS5tb250aCgpXTp0aGlzLl9tb250aHNTaG9ydFtWby50ZXN0KHQpPyJmb3JtYXQiOiJzdGFuZGFsb25lIl1bZS5tb250aCgpXX1mdW5jdGlvbiBzZShlLHQsbil7dmFyIG8scixpO2Zvcih0aGlzLl9tb250aHNQYXJzZXx8KHRoaXMuX21vbnRoc1BhcnNlPVtdLHRoaXMuX2xvbmdNb250aHNQYXJzZT1bXSx0aGlzLl9zaG9ydE1vbnRoc1BhcnNlPVtdKSxvPTA7MTI+bztvKyspe2lmKHI9dShbMmUzLG9dKSxuJiYhdGhpcy5fbG9uZ01vbnRoc1BhcnNlW29dJiYodGhpcy5fbG9uZ01vbnRoc1BhcnNlW29dPW5ldyBSZWdFeHAoIl4iK3RoaXMubW9udGhzKHIsIiIpLnJlcGxhY2UoIi4iLCIiKSsiJCIsImkiKSx0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW29dPW5ldyBSZWdFeHAoIl4iK3RoaXMubW9udGhzU2hvcnQociwiIikucmVwbGFjZSgiLiIsIiIpKyIkIiwiaSIpKSxufHx0aGlzLl9tb250aHNQYXJzZVtvXXx8KGk9Il4iK3RoaXMubW9udGhzKHIsIiIpKyJ8XiIrdGhpcy5tb250aHNTaG9ydChyLCIiKSx0aGlzLl9tb250aHNQYXJzZVtvXT1uZXcgUmVnRXhwKGkucmVwbGFjZSgiLiIsIiIpLCJpIikpLG4mJiJNTU1NIj09PXQmJnRoaXMuX2xvbmdNb250aHNQYXJzZVtvXS50ZXN0KGUpKXJldHVybiBvO2lmKG4mJiJNTU0iPT09dCYmdGhpcy5fc2hvcnRNb250aHNQYXJzZVtvXS50ZXN0KGUpKXJldHVybiBvO2lmKCFuJiZ0aGlzLl9tb250aHNQYXJzZVtvXS50ZXN0KGUpKXJldHVybiBvfX1mdW5jdGlvbiBsZShlLHQpe3ZhciBuO2lmKCFlLmlzVmFsaWQoKSlyZXR1cm4gZTtpZigic3RyaW5nIj09dHlwZW9mIHQpaWYoL15cZCskLy50ZXN0KHQpKXQ9eSh0KTtlbHNlIGlmKHQ9ZS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodCksIm51bWJlciIhPXR5cGVvZiB0KXJldHVybiBlO3JldHVybiBuPU1hdGgubWluKGUuZGF0ZSgpLG9lKGUueWVhcigpLHQpKSxlLl9kWyJzZXQiKyhlLl9pc1VUQz8iVVRDIjoiIikrIk1vbnRoIl0odCxuKSxlfWZ1bmN0aW9uIGFlKHQpe3JldHVybiBudWxsIT10PyhsZSh0aGlzLHQpLGUudXBkYXRlT2Zmc2V0KHRoaXMsITApLHRoaXMpOkYodGhpcywiTW9udGgiKX1mdW5jdGlvbiB1ZSgpe3JldHVybiBvZSh0aGlzLnllYXIoKSx0aGlzLm1vbnRoKCkpfWZ1bmN0aW9uIGNlKGUpe3JldHVybiB0aGlzLl9tb250aHNQYXJzZUV4YWN0PyhsKHRoaXMsIl9tb250aHNSZWdleCIpfHxkZS5jYWxsKHRoaXMpLGU/dGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl9tb250aHNTaG9ydFJlZ2V4KTp0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4JiZlP3RoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg6dGhpcy5fbW9udGhzU2hvcnRSZWdleH1mdW5jdGlvbiBoZShlKXtyZXR1cm4gdGhpcy5fbW9udGhzUGFyc2VFeGFjdD8obCh0aGlzLCJfbW9udGhzUmVnZXgiKXx8ZGUuY2FsbCh0aGlzKSxlP3RoaXMuX21vbnRoc1N0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1JlZ2V4KTp0aGlzLl9tb250aHNTdHJpY3RSZWdleCYmZT90aGlzLl9tb250aHNTdHJpY3RSZWdleDp0aGlzLl9tb250aHNSZWdleH1mdW5jdGlvbiBkZSgpe2Z1bmN0aW9uIGUoZSx0KXtyZXR1cm4gdC5sZW5ndGgtZS5sZW5ndGh9dmFyIHQsbixvPVtdLHI9W10saT1bXTtmb3IodD0wOzEyPnQ7dCsrKW49dShbMmUzLHRdKSxvLnB1c2godGhpcy5tb250aHNTaG9ydChuLCIiKSksci5wdXNoKHRoaXMubW9udGhzKG4sIiIpKSxpLnB1c2godGhpcy5tb250aHMobiwiIikpLGkucHVzaCh0aGlzLm1vbnRoc1Nob3J0KG4sIiIpKTtmb3Ioby5zb3J0KGUpLHIuc29ydChlKSxpLnNvcnQoZSksdD0wOzEyPnQ7dCsrKW9bdF09UShvW3RdKSxyW3RdPVEoclt0XSksaVt0XT1RKGlbdF0pO3RoaXMuX21vbnRoc1JlZ2V4PW5ldyBSZWdFeHAoIl4oIitpLmpvaW4oInwiKSsiKSIsImkiKSx0aGlzLl9tb250aHNTaG9ydFJlZ2V4PXRoaXMuX21vbnRoc1JlZ2V4LHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4PW5ldyBSZWdFeHAoIl4oIityLmpvaW4oInwiKSsiKSQiLCJpIiksdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleD1uZXcgUmVnRXhwKCJeKCIrby5qb2luKCJ8IikrIikkIiwiaSIpfWZ1bmN0aW9uIGZlKGUpe3ZhciB0LG49ZS5fYTtyZXR1cm4gbiYmLTI9PT1oKGUpLm92ZXJmbG93JiYodD1uW0FvXTwwfHxuW0FvXT4xMT9BbzpuW3hvXTwxfHxuW3hvXT5vZShuW0RvXSxuW0FvXSk/eG86bltQb108MHx8bltQb10+MjR8fDI0PT09bltQb10mJigwIT09bltOb118fDAhPT1uW0xvXXx8MCE9PW5bV29dKT9QbzpuW05vXTwwfHxuW05vXT41OT9ObzpuW0xvXTwwfHxuW0xvXT41OT9MbzpuW1dvXTwwfHxuW1dvXT45OTk/V286LTEsaChlKS5fb3ZlcmZsb3dEYXlPZlllYXImJihEbz50fHx0PnhvKSYmKHQ9eG8pLGgoZSkuX292ZXJmbG93V2Vla3MmJi0xPT09dCYmKHQ9SW8pLGgoZSkuX292ZXJmbG93V2Vla2RheSYmLTE9PT10JiYodD1qbyksaChlKS5vdmVyZmxvdz10KSxlfWZ1bmN0aW9uIHBlKGUpe3ZhciB0LG4sbyxyLGkscyxsPWUuX2ksYT1Vby5leGVjKGwpfHxHby5leGVjKGwpO2lmKGEpe2ZvcihoKGUpLmlzbz0hMCx0PTAsbj1Yby5sZW5ndGg7bj50O3QrKylpZihYb1t0XVsxXS5leGVjKGFbMV0pKXtyPVhvW3RdWzBdLG89WG9bdF1bMl0hPT0hMTticmVha31pZihudWxsPT1yKXJldHVybiB2b2lkKGUuX2lzVmFsaWQ9ITEpO2lmKGFbM10pe2Zvcih0PTAsbj1Lby5sZW5ndGg7bj50O3QrKylpZihLb1t0XVsxXS5leGVjKGFbM10pKXtpPShhWzJdfHwiICIpK0tvW3RdWzBdO2JyZWFrfWlmKG51bGw9PWkpcmV0dXJuIHZvaWQoZS5faXNWYWxpZD0hMSl9aWYoIW8mJm51bGwhPWkpcmV0dXJuIHZvaWQoZS5faXNWYWxpZD0hMSk7aWYoYVs0XSl7aWYoISRvLmV4ZWMoYVs0XSkpcmV0dXJuIHZvaWQoZS5faXNWYWxpZD0hMSk7cz0iWiJ9ZS5fZj1yKyhpfHwiIikrKHN8fCIiKSxrZShlKX1lbHNlIGUuX2lzVmFsaWQ9ITF9ZnVuY3Rpb24gZ2UodCl7dmFyIG49cW8uZXhlYyh0Ll9pKTtyZXR1cm4gbnVsbCE9PW4/dm9pZCh0Ll9kPW5ldyBEYXRlKCtuWzFdKSk6KHBlKHQpLHZvaWQodC5faXNWYWxpZD09PSExJiYoZGVsZXRlIHQuX2lzVmFsaWQsZS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayh0KSkpKX1mdW5jdGlvbiBtZShlLHQsbixvLHIsaSxzKXt2YXIgbD1uZXcgRGF0ZShlLHQsbixvLHIsaSxzKTtyZXR1cm4gMTAwPmUmJmU+PTAmJmlzRmluaXRlKGwuZ2V0RnVsbFllYXIoKSkmJmwuc2V0RnVsbFllYXIoZSksbH1mdW5jdGlvbiB3ZShlKXt2YXIgdD1uZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLGFyZ3VtZW50cykpO3JldHVybiAxMDA+ZSYmZT49MCYmaXNGaW5pdGUodC5nZXRVVENGdWxsWWVhcigpKSYmdC5zZXRVVENGdWxsWWVhcihlKSx0fWZ1bmN0aW9uIHZlKGUpe3JldHVybiB5ZShlKT8zNjY6MzY1fWZ1bmN0aW9uIHllKGUpe3JldHVybiBlJTQ9PT0wJiZlJTEwMCE9PTB8fGUlNDAwPT09MH1mdW5jdGlvbiBiZSgpe3JldHVybiB5ZSh0aGlzLnllYXIoKSl9ZnVuY3Rpb24gQ2UoZSx0LG4pe3ZhciBvPTcrdC1uLHI9KDcrd2UoZSwwLG8pLmdldFVUQ0RheSgpLXQpJTc7cmV0dXJuLXIrby0xfWZ1bmN0aW9uIF9lKGUsdCxuLG8scil7dmFyIGkscyxsPSg3K24tbyklNyxhPUNlKGUsbyxyKSx1PTErNyoodC0xKStsK2E7cmV0dXJuIDA+PXU/KGk9ZS0xLHM9dmUoaSkrdSk6dT52ZShlKT8oaT1lKzEscz11LXZlKGUpKTooaT1lLHM9dSkse3llYXI6aSxkYXlPZlllYXI6c319ZnVuY3Rpb24gUmUoZSx0LG4pe3ZhciBvLHIsaT1DZShlLnllYXIoKSx0LG4pLHM9TWF0aC5mbG9vcigoZS5kYXlPZlllYXIoKS1pLTEpLzcpKzE7cmV0dXJuIDE+cz8ocj1lLnllYXIoKS0xLG89cytTZShyLHQsbikpOnM+U2UoZS55ZWFyKCksdCxuKT8obz1zLVNlKGUueWVhcigpLHQsbikscj1lLnllYXIoKSsxKToocj1lLnllYXIoKSxvPXMpLHt3ZWVrOm8seWVhcjpyfX1mdW5jdGlvbiBTZShlLHQsbil7dmFyIG89Q2UoZSx0LG4pLHI9Q2UoZSsxLHQsbik7cmV0dXJuKHZlKGUpLW8rcikvN31mdW5jdGlvbiBFZShlLHQsbil7cmV0dXJuIG51bGwhPWU/ZTpudWxsIT10P3Q6bn1mdW5jdGlvbiBUZSh0KXt2YXIgbj1uZXcgRGF0ZShlLm5vdygpKTtyZXR1cm4gdC5fdXNlVVRDP1tuLmdldFVUQ0Z1bGxZZWFyKCksbi5nZXRVVENNb250aCgpLG4uZ2V0VVRDRGF0ZSgpXTpbbi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKV19ZnVuY3Rpb24gTWUoZSl7dmFyIHQsbixvLHIsaT1bXTtpZighZS5fZCl7Zm9yKG89VGUoZSksZS5fdyYmbnVsbD09ZS5fYVt4b10mJm51bGw9PWUuX2FbQW9dJiZPZShlKSxlLl9kYXlPZlllYXImJihyPUVlKGUuX2FbRG9dLG9bRG9dKSxlLl9kYXlPZlllYXI+dmUocikmJihoKGUpLl9vdmVyZmxvd0RheU9mWWVhcj0hMCksbj13ZShyLDAsZS5fZGF5T2ZZZWFyKSxlLl9hW0FvXT1uLmdldFVUQ01vbnRoKCksZS5fYVt4b109bi5nZXRVVENEYXRlKCkpLHQ9MDszPnQmJm51bGw9PWUuX2FbdF07Kyt0KWUuX2FbdF09aVt0XT1vW3RdO2Zvcig7Nz50O3QrKyllLl9hW3RdPWlbdF09bnVsbD09ZS5fYVt0XT8yPT09dD8xOjA6ZS5fYVt0XTsyND09PWUuX2FbUG9dJiYwPT09ZS5fYVtOb10mJjA9PT1lLl9hW0xvXSYmMD09PWUuX2FbV29dJiYoZS5fbmV4dERheT0hMCxlLl9hW1BvXT0wKSxlLl9kPShlLl91c2VVVEM/d2U6bWUpLmFwcGx5KG51bGwsaSksbnVsbCE9ZS5fdHptJiZlLl9kLnNldFVUQ01pbnV0ZXMoZS5fZC5nZXRVVENNaW51dGVzKCktZS5fdHptKSxlLl9uZXh0RGF5JiYoZS5fYVtQb109MjQpfX1mdW5jdGlvbiBPZShlKXt2YXIgdCxuLG8scixpLHMsbCxhO3Q9ZS5fdyxudWxsIT10LkdHfHxudWxsIT10Lld8fG51bGwhPXQuRT8oaT0xLHM9NCxuPUVlKHQuR0csZS5fYVtEb10sUmUoV2UoKSwxLDQpLnllYXIpLG89RWUodC5XLDEpLHI9RWUodC5FLDEpLCgxPnJ8fHI+NykmJihhPSEwKSk6KGk9ZS5fbG9jYWxlLl93ZWVrLmRvdyxzPWUuX2xvY2FsZS5fd2Vlay5kb3ksbj1FZSh0LmdnLGUuX2FbRG9dLFJlKFdlKCksaSxzKS55ZWFyKSxvPUVlKHQudywxKSxudWxsIT10LmQ/KHI9dC5kLCgwPnJ8fHI+NikmJihhPSEwKSk6bnVsbCE9dC5lPyhyPXQuZStpLCh0LmU8MHx8dC5lPjYpJiYoYT0hMCkpOnI9aSksMT5vfHxvPlNlKG4saSxzKT9oKGUpLl9vdmVyZmxvd1dlZWtzPSEwOm51bGwhPWE/aChlKS5fb3ZlcmZsb3dXZWVrZGF5PSEwOihsPV9lKG4sbyxyLGkscyksZS5fYVtEb109bC55ZWFyLGUuX2RheU9mWWVhcj1sLmRheU9mWWVhcil9ZnVuY3Rpb24ga2UodCl7aWYodC5fZj09PWUuSVNPXzg2MDEpcmV0dXJuIHZvaWQgcGUodCk7dC5fYT1bXSxoKHQpLmVtcHR5PSEwO3ZhciBuLG8scixpLHMsbD0iIit0Ll9pLGE9bC5sZW5ndGgsdT0wO2ZvcihyPUsodC5fZix0Ll9sb2NhbGUpLm1hdGNoKGxvKXx8W10sbj0wO248ci5sZW5ndGg7bisrKWk9cltuXSxvPShsLm1hdGNoKFooaSx0KSl8fFtdKVswXSxvJiYocz1sLnN1YnN0cigwLGwuaW5kZXhPZihvKSkscy5sZW5ndGg+MCYmaCh0KS51bnVzZWRJbnB1dC5wdXNoKHMpLGw9bC5zbGljZShsLmluZGV4T2Yobykrby5sZW5ndGgpLHUrPW8ubGVuZ3RoKSxjb1tpXT8obz9oKHQpLmVtcHR5PSExOmgodCkudW51c2VkVG9rZW5zLnB1c2goaSksbmUoaSxvLHQpKTp0Ll9zdHJpY3QmJiFvJiZoKHQpLnVudXNlZFRva2Vucy5wdXNoKGkpO2godCkuY2hhcnNMZWZ0T3Zlcj1hLXUsbC5sZW5ndGg+MCYmaCh0KS51bnVzZWRJbnB1dC5wdXNoKGwpLGgodCkuYmlnSG91cj09PSEwJiZ0Ll9hW1BvXTw9MTImJnQuX2FbUG9dPjAmJihoKHQpLmJpZ0hvdXI9dm9pZCAwKSx0Ll9hW1BvXT1IZSh0Ll9sb2NhbGUsdC5fYVtQb10sdC5fbWVyaWRpZW0pLE1lKHQpLGZlKHQpfWZ1bmN0aW9uIEhlKGUsdCxuKXt2YXIgbztyZXR1cm4gbnVsbD09bj90Om51bGwhPWUubWVyaWRpZW1Ib3VyP2UubWVyaWRpZW1Ib3VyKHQsbik6bnVsbCE9ZS5pc1BNPyhvPWUuaXNQTShuKSxvJiYxMj50JiYodCs9MTIpLG98fDEyIT09dHx8KHQ9MCksdCk6dH1mdW5jdGlvbiBEZShlKXt2YXIgdCxuLG8scixpO2lmKDA9PT1lLl9mLmxlbmd0aClyZXR1cm4gaChlKS5pbnZhbGlkRm9ybWF0PSEwLHZvaWQoZS5fZD1uZXcgRGF0ZShOYU4pKTtmb3Iocj0wO3I8ZS5fZi5sZW5ndGg7cisrKWk9MCx0PWcoe30sZSksbnVsbCE9ZS5fdXNlVVRDJiYodC5fdXNlVVRDPWUuX3VzZVVUQyksdC5fZj1lLl9mW3JdLGtlKHQpLGQodCkmJihpKz1oKHQpLmNoYXJzTGVmdE92ZXIsaSs9MTAqaCh0KS51bnVzZWRUb2tlbnMubGVuZ3RoLGgodCkuc2NvcmU9aSwobnVsbD09b3x8bz5pKSYmKG89aSxuPXQpKTthKGUsbnx8dCl9ZnVuY3Rpb24gQWUoZSl7aWYoIWUuX2Qpe3ZhciB0PWooZS5faSk7ZS5fYT1zKFt0LnllYXIsdC5tb250aCx0LmRheXx8dC5kYXRlLHQuaG91cix0Lm1pbnV0ZSx0LnNlY29uZCx0Lm1pbGxpc2Vjb25kXSxmdW5jdGlvbihlKXtyZXR1cm4gZSYmcGFyc2VJbnQoZSwxMCl9KSxNZShlKX19ZnVuY3Rpb24geGUoZSl7dmFyIHQ9bmV3IG0oZmUoUGUoZSkpKTtyZXR1cm4gdC5fbmV4dERheSYmKHQuYWRkKDEsImQiKSx0Ll9uZXh0RGF5PXZvaWQgMCksdH1mdW5jdGlvbiBQZShlKXt2YXIgdD1lLl9pLG49ZS5fZjtyZXR1cm4gZS5fbG9jYWxlPWUuX2xvY2FsZXx8TihlLl9sKSxudWxsPT09dHx8dm9pZCAwPT09biYmIiI9PT10P2Yoe251bGxJbnB1dDohMH0pOigic3RyaW5nIj09dHlwZW9mIHQmJihlLl9pPXQ9ZS5fbG9jYWxlLnByZXBhcnNlKHQpKSx3KHQpP25ldyBtKGZlKHQpKToocihuKT9EZShlKTpuP2tlKGUpOmkodCk/ZS5fZD10Ok5lKGUpLGQoZSl8fChlLl9kPW51bGwpLGUpKX1mdW5jdGlvbiBOZSh0KXt2YXIgbj10Ll9pO3ZvaWQgMD09PW4/dC5fZD1uZXcgRGF0ZShlLm5vdygpKTppKG4pP3QuX2Q9bmV3IERhdGUoK24pOiJzdHJpbmciPT10eXBlb2Ygbj9nZSh0KTpyKG4pPyh0Ll9hPXMobi5zbGljZSgwKSxmdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQoZSwxMCl9KSxNZSh0KSk6Im9iamVjdCI9PXR5cGVvZiBuP0FlKHQpOiJudW1iZXIiPT10eXBlb2Ygbj90Ll9kPW5ldyBEYXRlKG4pOmUuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sodCl9ZnVuY3Rpb24gTGUoZSx0LG4sbyxyKXt2YXIgaT17fTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBuJiYobz1uLG49dm9pZCAwKSxpLl9pc0FNb21lbnRPYmplY3Q9ITAsaS5fdXNlVVRDPWkuX2lzVVRDPXIsaS5fbD1uLGkuX2k9ZSxpLl9mPXQsaS5fc3RyaWN0PW8seGUoaSl9ZnVuY3Rpb24gV2UoZSx0LG4sbyl7cmV0dXJuIExlKGUsdCxuLG8sITEpfWZ1bmN0aW9uIEllKGUsdCl7dmFyIG4sbztpZigxPT09dC5sZW5ndGgmJnIodFswXSkmJih0PXRbMF0pLCF0Lmxlbmd0aClyZXR1cm4gV2UoKTtmb3Iobj10WzBdLG89MTtvPHQubGVuZ3RoOysrbyl0W29dLmlzVmFsaWQoKSYmIXRbb11bZV0obil8fChuPXRbb10pO3JldHVybiBufWZ1bmN0aW9uIGplKCl7dmFyIGU9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIEllKCJpc0JlZm9yZSIsZSl9ZnVuY3Rpb24gVmUoKXt2YXIgZT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gSWUoImlzQWZ0ZXIiLGUpfWZ1bmN0aW9uIEZlKGUpe3ZhciB0PWooZSksbj10LnllYXJ8fDAsbz10LnF1YXJ0ZXJ8fDAscj10Lm1vbnRofHwwLGk9dC53ZWVrfHwwLHM9dC5kYXl8fDAsbD10LmhvdXJ8fDAsYT10Lm1pbnV0ZXx8MCx1PXQuc2Vjb25kfHwwLGM9dC5taWxsaXNlY29uZHx8MDt0aGlzLl9taWxsaXNlY29uZHM9K2MrMWUzKnUrNmU0KmErMzZlNSpsLHRoaXMuX2RheXM9K3MrNyppLHRoaXMuX21vbnRocz0rciszKm8rMTIqbix0aGlzLl9kYXRhPXt9LHRoaXMuX2xvY2FsZT1OKCksdGhpcy5fYnViYmxlKCl9ZnVuY3Rpb24gQmUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBGZX1mdW5jdGlvbiB6ZShlLHQpe1UoZSwwLDAsZnVuY3Rpb24oKXt2YXIgZT10aGlzLnV0Y09mZnNldCgpLG49IisiO3JldHVybiAwPmUmJihlPS1lLG49Ii0iKSxuK1kofn4oZS82MCksMikrdCtZKH5+ZSU2MCwyKX0pfWZ1bmN0aW9uIFllKGUsdCl7dmFyIG49KHR8fCIiKS5tYXRjaChlKXx8W10sbz1uW24ubGVuZ3RoLTFdfHxbXSxyPShvKyIiKS5tYXRjaCh0cil8fFsiLSIsMCwwXSxpPSsoNjAqclsxXSkreShyWzJdKTtyZXR1cm4iKyI9PT1yWzBdP2k6LWl9ZnVuY3Rpb24gVWUodCxuKXt2YXIgbyxyO3JldHVybiBuLl9pc1VUQz8obz1uLmNsb25lKCkscj0odyh0KXx8aSh0KT8rdDorV2UodCkpLStvLG8uX2Quc2V0VGltZSgrby5fZCtyKSxlLnVwZGF0ZU9mZnNldChvLCExKSxvKTpXZSh0KS5sb2NhbCgpfWZ1bmN0aW9uIEdlKGUpe3JldHVybiAxNSotTWF0aC5yb3VuZChlLl9kLmdldFRpbWV6b25lT2Zmc2V0KCkvMTUpfWZ1bmN0aW9uICRlKHQsbil7dmFyIG8scj10aGlzLl9vZmZzZXR8fDA7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP251bGwhPXQ/KCJzdHJpbmciPT10eXBlb2YgdD90PVllKFRvLHQpOk1hdGguYWJzKHQpPDE2JiYodD02MCp0KSwhdGhpcy5faXNVVEMmJm4mJihvPUdlKHRoaXMpKSx0aGlzLl9vZmZzZXQ9dCx0aGlzLl9pc1VUQz0hMCxudWxsIT1vJiZ0aGlzLmFkZChvLCJtIiksciE9PXQmJighbnx8dGhpcy5fY2hhbmdlSW5Qcm9ncmVzcz9jdCh0aGlzLHJ0KHQtciwibSIpLDEsITEpOnRoaXMuX2NoYW5nZUluUHJvZ3Jlc3N8fCh0aGlzLl9jaGFuZ2VJblByb2dyZXNzPSEwLGUudXBkYXRlT2Zmc2V0KHRoaXMsITApLHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3M9bnVsbCkpLHRoaXMpOnRoaXMuX2lzVVRDP3I6R2UodGhpcyk6bnVsbCE9dD90aGlzOk5hTn1mdW5jdGlvbiBYZShlLHQpe3JldHVybiBudWxsIT1lPygic3RyaW5nIiE9dHlwZW9mIGUmJihlPS1lKSx0aGlzLnV0Y09mZnNldChlLHQpLHRoaXMpOi10aGlzLnV0Y09mZnNldCgpfWZ1bmN0aW9uIEtlKGUpe3JldHVybiB0aGlzLnV0Y09mZnNldCgwLGUpfWZ1bmN0aW9uIHFlKGUpe3JldHVybiB0aGlzLl9pc1VUQyYmKHRoaXMudXRjT2Zmc2V0KDAsZSksdGhpcy5faXNVVEM9ITEsZSYmdGhpcy5zdWJ0cmFjdChHZSh0aGlzKSwibSIpKSx0aGlzfWZ1bmN0aW9uIFplKCl7cmV0dXJuIHRoaXMuX3R6bT90aGlzLnV0Y09mZnNldCh0aGlzLl90em0pOiJzdHJpbmciPT10eXBlb2YgdGhpcy5faSYmdGhpcy51dGNPZmZzZXQoWWUoRW8sdGhpcy5faSkpLHRoaXN9ZnVuY3Rpb24gSmUoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpPyhlPWU/V2UoZSkudXRjT2Zmc2V0KCk6MCwodGhpcy51dGNPZmZzZXQoKS1lKSU2MD09PTApOiExfWZ1bmN0aW9uIFFlKCl7cmV0dXJuIHRoaXMudXRjT2Zmc2V0KCk+dGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpfHx0aGlzLnV0Y09mZnNldCgpPnRoaXMuY2xvbmUoKS5tb250aCg1KS51dGNPZmZzZXQoKX1mdW5jdGlvbiBldCgpe2lmKCFwKHRoaXMuX2lzRFNUU2hpZnRlZCkpcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDt2YXIgZT17fTtpZihnKGUsdGhpcyksZT1QZShlKSxlLl9hKXt2YXIgdD1lLl9pc1VUQz91KGUuX2EpOldlKGUuX2EpO3RoaXMuX2lzRFNUU2hpZnRlZD10aGlzLmlzVmFsaWQoKSYmYihlLl9hLHQudG9BcnJheSgpKT4wfWVsc2UgdGhpcy5faXNEU1RTaGlmdGVkPSExO3JldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWR9ZnVuY3Rpb24gdHQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/IXRoaXMuX2lzVVRDOiExfWZ1bmN0aW9uIG50KCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMuX2lzVVRDOiExfWZ1bmN0aW9uIG90KCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMuX2lzVVRDJiYwPT09dGhpcy5fb2Zmc2V0OiExfWZ1bmN0aW9uIHJ0KGUsdCl7dmFyIG4sbyxyLGk9ZSxzPW51bGw7cmV0dXJuIEJlKGUpP2k9e21zOmUuX21pbGxpc2Vjb25kcyxkOmUuX2RheXMsTTplLl9tb250aHN9OiJudW1iZXIiPT10eXBlb2YgZT8oaT17fSx0P2lbdF09ZTppLm1pbGxpc2Vjb25kcz1lKToocz1uci5leGVjKGUpKT8obj0iLSI9PT1zWzFdPy0xOjEsaT17eTowLGQ6eShzW3hvXSkqbixoOnkoc1tQb10pKm4sbTp5KHNbTm9dKSpuLHM6eShzW0xvXSkqbixtczp5KHNbV29dKSpufSk6KHM9b3IuZXhlYyhlKSk/KG49Ii0iPT09c1sxXT8tMToxLGk9e3k6aXQoc1syXSxuKSxNOml0KHNbM10sbiksdzppdChzWzRdLG4pLGQ6aXQoc1s1XSxuKSxoOml0KHNbNl0sbiksbTppdChzWzddLG4pLHM6aXQoc1s4XSxuKX0pOm51bGw9PWk/aT17fToib2JqZWN0Ij09dHlwZW9mIGkmJigiZnJvbSJpbiBpfHwidG8iaW4gaSkmJihyPWx0KFdlKGkuZnJvbSksV2UoaS50bykpLGk9e30saS5tcz1yLm1pbGxpc2Vjb25kcyxpLk09ci5tb250aHMpLG89bmV3IEZlKGkpLEJlKGUpJiZsKGUsIl9sb2NhbGUiKSYmKG8uX2xvY2FsZT1lLl9sb2NhbGUpLG99ZnVuY3Rpb24gaXQoZSx0KXt2YXIgbj1lJiZwYXJzZUZsb2F0KGUucmVwbGFjZSgiLCIsIi4iKSk7cmV0dXJuKGlzTmFOKG4pPzA6bikqdH1mdW5jdGlvbiBzdChlLHQpe3ZhciBuPXttaWxsaXNlY29uZHM6MCxtb250aHM6MH07cmV0dXJuIG4ubW9udGhzPXQubW9udGgoKS1lLm1vbnRoKCkrMTIqKHQueWVhcigpLWUueWVhcigpKSxlLmNsb25lKCkuYWRkKG4ubW9udGhzLCJNIikuaXNBZnRlcih0KSYmLS1uLm1vbnRocyxuLm1pbGxpc2Vjb25kcz0rdC0rZS5jbG9uZSgpLmFkZChuLm1vbnRocywiTSIpLG59ZnVuY3Rpb24gbHQoZSx0KXt2YXIgbjtyZXR1cm4gZS5pc1ZhbGlkKCkmJnQuaXNWYWxpZCgpPyh0PVVlKHQsZSksZS5pc0JlZm9yZSh0KT9uPXN0KGUsdCk6KG49c3QodCxlKSxuLm1pbGxpc2Vjb25kcz0tbi5taWxsaXNlY29uZHMsbi5tb250aHM9LW4ubW9udGhzKSxuKTp7bWlsbGlzZWNvbmRzOjAsbW9udGhzOjB9fWZ1bmN0aW9uIGF0KGUpe3JldHVybiAwPmU/LTEqTWF0aC5yb3VuZCgtMSplKTpNYXRoLnJvdW5kKGUpfWZ1bmN0aW9uIHV0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4sbyl7dmFyIHIsaTtyZXR1cm4gbnVsbD09PW98fGlzTmFOKCtvKXx8KFIodCwibW9tZW50KCkuIit0KyIocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuIit0KyIobnVtYmVyLCBwZXJpb2QpLiIpLGk9bixuPW8sbz1pKSxuPSJzdHJpbmciPT10eXBlb2Ygbj8rbjpuLHI9cnQobixvKSxjdCh0aGlzLHIsZSksdGhpc319ZnVuY3Rpb24gY3QodCxuLG8scil7dmFyIGk9bi5fbWlsbGlzZWNvbmRzLHM9YXQobi5fZGF5cyksbD1hdChuLl9tb250aHMpO3QuaXNWYWxpZCgpJiYocj1udWxsPT1yPyEwOnIsaSYmdC5fZC5zZXRUaW1lKCt0Ll9kK2kqbykscyYmQih0LCJEYXRlIixGKHQsIkRhdGUiKStzKm8pLGwmJmxlKHQsRih0LCJNb250aCIpK2wqbyksciYmZS51cGRhdGVPZmZzZXQodCxzfHxsKSl9ZnVuY3Rpb24gaHQoZSx0KXt2YXIgbj1lfHxXZSgpLG89VWUobix0aGlzKS5zdGFydE9mKCJkYXkiKSxyPXRoaXMuZGlmZihvLCJkYXlzIiwhMCksaT0tNj5yPyJzYW1lRWxzZSI6LTE+cj8ibGFzdFdlZWsiOjA+cj8ibGFzdERheSI6MT5yPyJzYW1lRGF5IjoyPnI/Im5leHREYXkiOjc+cj8ibmV4dFdlZWsiOiJzYW1lRWxzZSIscz10JiYoUyh0W2ldKT90W2ldKCk6dFtpXSk7cmV0dXJuIHRoaXMuZm9ybWF0KHN8fHRoaXMubG9jYWxlRGF0YSgpLmNhbGVuZGFyKGksdGhpcyxXZShuKSkpfWZ1bmN0aW9uIGR0KCl7cmV0dXJuIG5ldyBtKHRoaXMpfWZ1bmN0aW9uIGZ0KGUsdCl7dmFyIG49dyhlKT9lOldlKGUpO3JldHVybiB0aGlzLmlzVmFsaWQoKSYmbi5pc1ZhbGlkKCk/KHQ9SShwKHQpPyJtaWxsaXNlY29uZCI6dCksIm1pbGxpc2Vjb25kIj09PXQ/K3RoaXM+K246K248K3RoaXMuY2xvbmUoKS5zdGFydE9mKHQpKTohMX1mdW5jdGlvbiBwdChlLHQpe3ZhciBuPXcoZSk/ZTpXZShlKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJm4uaXNWYWxpZCgpPyh0PUkocCh0KT8ibWlsbGlzZWNvbmQiOnQpLCJtaWxsaXNlY29uZCI9PT10PytuPit0aGlzOit0aGlzLmNsb25lKCkuZW5kT2YodCk8K24pOiExfWZ1bmN0aW9uIGd0KGUsdCxuKXtyZXR1cm4gdGhpcy5pc0FmdGVyKGUsbikmJnRoaXMuaXNCZWZvcmUodCxuKX1mdW5jdGlvbiBtdChlLHQpe3ZhciBuLG89dyhlKT9lOldlKGUpO3JldHVybiB0aGlzLmlzVmFsaWQoKSYmby5pc1ZhbGlkKCk/KHQ9SSh0fHwibWlsbGlzZWNvbmQiKSwibWlsbGlzZWNvbmQiPT09dD8rdGhpcz09PStvOihuPStvLCt0aGlzLmNsb25lKCkuc3RhcnRPZih0KTw9biYmbjw9K3RoaXMuY2xvbmUoKS5lbmRPZih0KSkpOiExfWZ1bmN0aW9uIHd0KGUsdCl7cmV0dXJuIHRoaXMuaXNTYW1lKGUsdCl8fHRoaXMuaXNBZnRlcihlLHQpfWZ1bmN0aW9uIHZ0KGUsdCl7cmV0dXJuIHRoaXMuaXNTYW1lKGUsdCl8fHRoaXMuaXNCZWZvcmUoZSx0KX1mdW5jdGlvbiB5dChlLHQsbil7dmFyIG8scixpLHM7cmV0dXJuIHRoaXMuaXNWYWxpZCgpPyhvPVVlKGUsdGhpcyksby5pc1ZhbGlkKCk/KHI9NmU0KihvLnV0Y09mZnNldCgpLXRoaXMudXRjT2Zmc2V0KCkpLHQ9SSh0KSwieWVhciI9PT10fHwibW9udGgiPT09dHx8InF1YXJ0ZXIiPT09dD8ocz1idCh0aGlzLG8pLCJxdWFydGVyIj09PXQ/cy89MzoieWVhciI9PT10JiYocy89MTIpKTooaT10aGlzLW8scz0ic2Vjb25kIj09PXQ/aS8xZTM6Im1pbnV0ZSI9PT10P2kvNmU0OiJob3VyIj09PXQ/aS8zNmU1OiJkYXkiPT09dD8oaS1yKS84NjRlNToid2VlayI9PT10PyhpLXIpLzYwNDhlNTppKSxuP3M6dihzKSk6TmFOKTpOYU59ZnVuY3Rpb24gYnQoZSx0KXt2YXIgbixvLHI9MTIqKHQueWVhcigpLWUueWVhcigpKSsodC5tb250aCgpLWUubW9udGgoKSksaT1lLmNsb25lKCkuYWRkKHIsIm1vbnRocyIpO3JldHVybiAwPnQtaT8obj1lLmNsb25lKCkuYWRkKHItMSwibW9udGhzIiksbz0odC1pKS8oaS1uKSk6KG49ZS5jbG9uZSgpLmFkZChyKzEsIm1vbnRocyIpLG89KHQtaSkvKG4taSkpLC0ocitvKX1mdW5jdGlvbiBDdCgpe3JldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKCJlbiIpLmZvcm1hdCgiZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWloiKX1mdW5jdGlvbiBfdCgpe3ZhciBlPXRoaXMuY2xvbmUoKS51dGMoKTtyZXR1cm4gMDxlLnllYXIoKSYmZS55ZWFyKCk8PTk5OTk/UyhEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyk/dGhpcy50b0RhdGUoKS50b0lTT1N0cmluZygpOlgoZSwiWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXSIpOlgoZSwiWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdIil9ZnVuY3Rpb24gUnQodCl7dmFyIG49WCh0aGlzLHR8fGUuZGVmYXVsdEZvcm1hdCk7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQobil9ZnVuY3Rpb24gU3QoZSx0KXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJih3KGUpJiZlLmlzVmFsaWQoKXx8V2UoZSkuaXNWYWxpZCgpKT9ydCh7dG86dGhpcyxmcm9tOmV9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIXQpOnRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24gRXQoZSl7cmV0dXJuIHRoaXMuZnJvbShXZSgpLGUpfWZ1bmN0aW9uIFR0KGUsdCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiYodyhlKSYmZS5pc1ZhbGlkKCl8fFdlKGUpLmlzVmFsaWQoKSk/cnQoe2Zyb206dGhpcyx0bzplfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCF0KTp0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpfWZ1bmN0aW9uIE10KGUpe3JldHVybiB0aGlzLnRvKFdlKCksZSl9ZnVuY3Rpb24gT3QoZSl7dmFyIHQ7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fbG9jYWxlLl9hYmJyOih0PU4oZSksbnVsbCE9dCYmKHRoaXMuX2xvY2FsZT10KSx0aGlzKX1mdW5jdGlvbiBrdCgpe3JldHVybiB0aGlzLl9sb2NhbGV9ZnVuY3Rpb24gSHQoZSl7c3dpdGNoKGU9SShlKSl7Y2FzZSJ5ZWFyIjp0aGlzLm1vbnRoKDApO2Nhc2UicXVhcnRlciI6Y2FzZSJtb250aCI6dGhpcy5kYXRlKDEpO2Nhc2Uid2VlayI6Y2FzZSJpc29XZWVrIjpjYXNlImRheSI6dGhpcy5ob3VycygwKTtjYXNlImhvdXIiOnRoaXMubWludXRlcygwKTtjYXNlIm1pbnV0ZSI6dGhpcy5zZWNvbmRzKDApO2Nhc2Uic2Vjb25kIjp0aGlzLm1pbGxpc2Vjb25kcygwKX1yZXR1cm4id2VlayI9PT1lJiZ0aGlzLndlZWtkYXkoMCksImlzb1dlZWsiPT09ZSYmdGhpcy5pc29XZWVrZGF5KDEpLCJxdWFydGVyIj09PWUmJnRoaXMubW9udGgoMypNYXRoLmZsb29yKHRoaXMubW9udGgoKS8zKSksdGhpc31mdW5jdGlvbiBEdChlKXtyZXR1cm4gZT1JKGUpLHZvaWQgMD09PWV8fCJtaWxsaXNlY29uZCI9PT1lP3RoaXM6dGhpcy5zdGFydE9mKGUpLmFkZCgxLCJpc29XZWVrIj09PWU/IndlZWsiOmUpLnN1YnRyYWN0KDEsIm1zIil9ZnVuY3Rpb24gQXQoKXtyZXR1cm4rdGhpcy5fZC02ZTQqKHRoaXMuX29mZnNldHx8MCl9ZnVuY3Rpb24geHQoKXtyZXR1cm4gTWF0aC5mbG9vcigrdGhpcy8xZTMpfWZ1bmN0aW9uIFB0KCl7cmV0dXJuIHRoaXMuX29mZnNldD9uZXcgRGF0ZSgrdGhpcyk6dGhpcy5fZH1mdW5jdGlvbiBOdCgpe3ZhciBlPXRoaXM7cmV0dXJuW2UueWVhcigpLGUubW9udGgoKSxlLmRhdGUoKSxlLmhvdXIoKSxlLm1pbnV0ZSgpLGUuc2Vjb25kKCksZS5taWxsaXNlY29uZCgpXX1mdW5jdGlvbiBMdCgpe3ZhciBlPXRoaXM7cmV0dXJue3llYXJzOmUueWVhcigpLG1vbnRoczplLm1vbnRoKCksZGF0ZTplLmRhdGUoKSxob3VyczplLmhvdXJzKCksbWludXRlczplLm1pbnV0ZXMoKSxzZWNvbmRzOmUuc2Vjb25kcygpLG1pbGxpc2Vjb25kczplLm1pbGxpc2Vjb25kcygpfX1mdW5jdGlvbiBXdCgpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLnRvSVNPU3RyaW5nKCk6bnVsbH1mdW5jdGlvbiBJdCgpe3JldHVybiBkKHRoaXMpfWZ1bmN0aW9uIGp0KCl7cmV0dXJuIGEoe30saCh0aGlzKSl9ZnVuY3Rpb24gVnQoKXtyZXR1cm4gaCh0aGlzKS5vdmVyZmxvd31mdW5jdGlvbiBGdCgpe3JldHVybntpbnB1dDp0aGlzLl9pLGZvcm1hdDp0aGlzLl9mLGxvY2FsZTp0aGlzLl9sb2NhbGUsaXNVVEM6dGhpcy5faXNVVEMsc3RyaWN0OnRoaXMuX3N0cmljdH19ZnVuY3Rpb24gQnQoZSx0KXtVKDAsW2UsZS5sZW5ndGhdLDAsdCl9ZnVuY3Rpb24genQoZSl7cmV0dXJuICR0LmNhbGwodGhpcyxlLHRoaXMud2VlaygpLHRoaXMud2Vla2RheSgpLHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyx0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpfWZ1bmN0aW9uIFl0KGUpe3JldHVybiAkdC5jYWxsKHRoaXMsZSx0aGlzLmlzb1dlZWsoKSx0aGlzLmlzb1dlZWtkYXkoKSwxLDQpfWZ1bmN0aW9uIFV0KCl7cmV0dXJuIFNlKHRoaXMueWVhcigpLDEsNCl9ZnVuY3Rpb24gR3QoKXt2YXIgZT10aGlzLmxvY2FsZURhdGEoKS5fd2VlaztyZXR1cm4gU2UodGhpcy55ZWFyKCksZS5kb3csZS5kb3kpfWZ1bmN0aW9uICR0KGUsdCxuLG8scil7dmFyIGk7cmV0dXJuIG51bGw9PWU/UmUodGhpcyxvLHIpLnllYXI6KGk9U2UoZSxvLHIpLHQ+aSYmKHQ9aSksWHQuY2FsbCh0aGlzLGUsdCxuLG8scikpfWZ1bmN0aW9uIFh0KGUsdCxuLG8scil7dmFyIGk9X2UoZSx0LG4sbyxyKSxzPXdlKGkueWVhciwwLGkuZGF5T2ZZZWFyKTtyZXR1cm4gdGhpcy55ZWFyKHMuZ2V0VVRDRnVsbFllYXIoKSksdGhpcy5tb250aChzLmdldFVUQ01vbnRoKCkpLHRoaXMuZGF0ZShzLmdldFVUQ0RhdGUoKSksdGhpc31mdW5jdGlvbiBLdChlKXtyZXR1cm4gbnVsbD09ZT9NYXRoLmNlaWwoKHRoaXMubW9udGgoKSsxKS8zKTp0aGlzLm1vbnRoKDMqKGUtMSkrdGhpcy5tb250aCgpJTMpfWZ1bmN0aW9uIHF0KGUpe3JldHVybiBSZShlLHRoaXMuX3dlZWsuZG93LHRoaXMuX3dlZWsuZG95KS53ZWVrfWZ1bmN0aW9uIFp0KCl7cmV0dXJuIHRoaXMuX3dlZWsuZG93fWZ1bmN0aW9uIEp0KCl7cmV0dXJuIHRoaXMuX3dlZWsuZG95fWZ1bmN0aW9uIFF0KGUpe3ZhciB0PXRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7cmV0dXJuIG51bGw9PWU/dDp0aGlzLmFkZCg3KihlLXQpLCJkIil9ZnVuY3Rpb24gZW4oZSl7dmFyIHQ9UmUodGhpcywxLDQpLndlZWs7cmV0dXJuIG51bGw9PWU/dDp0aGlzLmFkZCg3KihlLXQpLCJkIil9ZnVuY3Rpb24gdG4oZSx0KXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/ZTppc05hTihlKT8oZT10LndlZWtkYXlzUGFyc2UoZSksIm51bWJlciI9PXR5cGVvZiBlP2U6bnVsbCk6cGFyc2VJbnQoZSwxMCl9ZnVuY3Rpb24gbm4oZSx0KXtyZXR1cm4gcih0aGlzLl93ZWVrZGF5cyk/dGhpcy5fd2Vla2RheXNbZS5kYXkoKV06dGhpcy5fd2Vla2RheXNbdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdCh0KT8iZm9ybWF0Ijoic3RhbmRhbG9uZSJdW2UuZGF5KCldfWZ1bmN0aW9uIG9uKGUpe3JldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0W2UuZGF5KCldfWZ1bmN0aW9uIHJuKGUpe3JldHVybiB0aGlzLl93ZWVrZGF5c01pbltlLmRheSgpXX1mdW5jdGlvbiBzbihlLHQsbil7dmFyIG8scixpO2Zvcih0aGlzLl93ZWVrZGF5c1BhcnNlfHwodGhpcy5fd2Vla2RheXNQYXJzZT1bXSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlPVtdLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZT1bXSx0aGlzLl9mdWxsV2Vla2RheXNQYXJzZT1bXSksbz0wOzc+bztvKyspe2lmKHI9V2UoWzJlMywxXSkuZGF5KG8pLG4mJiF0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtvXSYmKHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW29dPW5ldyBSZWdFeHAoIl4iK3RoaXMud2Vla2RheXMociwiIikucmVwbGFjZSgiLiIsIi4/IikrIiQiLCJpIiksdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW29dPW5ldyBSZWdFeHAoIl4iK3RoaXMud2Vla2RheXNTaG9ydChyLCIiKS5yZXBsYWNlKCIuIiwiLj8iKSsiJCIsImkiKSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlW29dPW5ldyBSZWdFeHAoIl4iK3RoaXMud2Vla2RheXNNaW4ociwiIikucmVwbGFjZSgiLiIsIi4/IikrIiQiLCJpIikpLHRoaXMuX3dlZWtkYXlzUGFyc2Vbb118fChpPSJeIit0aGlzLndlZWtkYXlzKHIsIiIpKyJ8XiIrdGhpcy53ZWVrZGF5c1Nob3J0KHIsIiIpKyJ8XiIrdGhpcy53ZWVrZGF5c01pbihyLCIiKSwNCnRoaXMuX3dlZWtkYXlzUGFyc2Vbb109bmV3IFJlZ0V4cChpLnJlcGxhY2UoIi4iLCIiKSwiaSIpKSxuJiYiZGRkZCI9PT10JiZ0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtvXS50ZXN0KGUpKXJldHVybiBvO2lmKG4mJiJkZGQiPT09dCYmdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW29dLnRlc3QoZSkpcmV0dXJuIG87aWYobiYmImRkIj09PXQmJnRoaXMuX21pbldlZWtkYXlzUGFyc2Vbb10udGVzdChlKSlyZXR1cm4gbztpZighbiYmdGhpcy5fd2Vla2RheXNQYXJzZVtvXS50ZXN0KGUpKXJldHVybiBvfX1mdW5jdGlvbiBsbihlKXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGwhPWU/dGhpczpOYU47dmFyIHQ9dGhpcy5faXNVVEM/dGhpcy5fZC5nZXRVVENEYXkoKTp0aGlzLl9kLmdldERheSgpO3JldHVybiBudWxsIT1lPyhlPXRuKGUsdGhpcy5sb2NhbGVEYXRhKCkpLHRoaXMuYWRkKGUtdCwiZCIpKTp0fWZ1bmN0aW9uIGFuKGUpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbnVsbCE9ZT90aGlzOk5hTjt2YXIgdD0odGhpcy5kYXkoKSs3LXRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyklNztyZXR1cm4gbnVsbD09ZT90OnRoaXMuYWRkKGUtdCwiZCIpfWZ1bmN0aW9uIHVuKGUpe3JldHVybiB0aGlzLmlzVmFsaWQoKT9udWxsPT1lP3RoaXMuZGF5KCl8fDc6dGhpcy5kYXkodGhpcy5kYXkoKSU3P2U6ZS03KTpudWxsIT1lP3RoaXM6TmFOfWZ1bmN0aW9uIGNuKGUpe3ZhciB0PU1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKCJkYXkiKS10aGlzLmNsb25lKCkuc3RhcnRPZigieWVhciIpKS84NjRlNSkrMTtyZXR1cm4gbnVsbD09ZT90OnRoaXMuYWRkKGUtdCwiZCIpfWZ1bmN0aW9uIGhuKCl7cmV0dXJuIHRoaXMuaG91cnMoKSUxMnx8MTJ9ZnVuY3Rpb24gZG4oZSx0KXtVKGUsMCwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSx0aGlzLm1pbnV0ZXMoKSx0KX0pfWZ1bmN0aW9uIGZuKGUsdCl7cmV0dXJuIHQuX21lcmlkaWVtUGFyc2V9ZnVuY3Rpb24gcG4oZSl7cmV0dXJuInAiPT09KGUrIiIpLnRvTG93ZXJDYXNlKCkuY2hhckF0KDApfWZ1bmN0aW9uIGduKGUsdCxuKXtyZXR1cm4gZT4xMT9uPyJwbSI6IlBNIjpuPyJhbSI6IkFNIn1mdW5jdGlvbiBtbihlLHQpe3RbV29dPXkoMWUzKigiMC4iK2UpKX1mdW5jdGlvbiB3bigpe3JldHVybiB0aGlzLl9pc1VUQz8iVVRDIjoiIn1mdW5jdGlvbiB2bigpe3JldHVybiB0aGlzLl9pc1VUQz8iQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUiOiIifWZ1bmN0aW9uIHluKGUpe3JldHVybiBXZSgxZTMqZSl9ZnVuY3Rpb24gYm4oKXtyZXR1cm4gV2UuYXBwbHkobnVsbCxhcmd1bWVudHMpLnBhcnNlWm9uZSgpfWZ1bmN0aW9uIENuKGUsdCxuKXt2YXIgbz10aGlzLl9jYWxlbmRhcltlXTtyZXR1cm4gUyhvKT9vLmNhbGwodCxuKTpvfWZ1bmN0aW9uIF9uKGUpe3ZhciB0PXRoaXMuX2xvbmdEYXRlRm9ybWF0W2VdLG49dGhpcy5fbG9uZ0RhdGVGb3JtYXRbZS50b1VwcGVyQ2FzZSgpXTtyZXR1cm4gdHx8IW4/dDoodGhpcy5fbG9uZ0RhdGVGb3JtYXRbZV09bi5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZyxmdW5jdGlvbihlKXtyZXR1cm4gZS5zbGljZSgxKX0pLHRoaXMuX2xvbmdEYXRlRm9ybWF0W2VdKX1mdW5jdGlvbiBSbigpe3JldHVybiB0aGlzLl9pbnZhbGlkRGF0ZX1mdW5jdGlvbiBTbihlKXtyZXR1cm4gdGhpcy5fb3JkaW5hbC5yZXBsYWNlKCIlZCIsZSl9ZnVuY3Rpb24gRW4oZSl7cmV0dXJuIGV9ZnVuY3Rpb24gVG4oZSx0LG4sbyl7dmFyIHI9dGhpcy5fcmVsYXRpdmVUaW1lW25dO3JldHVybiBTKHIpP3IoZSx0LG4sbyk6ci5yZXBsYWNlKC8lZC9pLGUpfWZ1bmN0aW9uIE1uKGUsdCl7dmFyIG49dGhpcy5fcmVsYXRpdmVUaW1lW2U+MD8iZnV0dXJlIjoicGFzdCJdO3JldHVybiBTKG4pP24odCk6bi5yZXBsYWNlKC8lcy9pLHQpfWZ1bmN0aW9uIE9uKGUsdCxuLG8pe3ZhciByPU4oKSxpPXUoKS5zZXQobyx0KTtyZXR1cm4gcltuXShpLGUpfWZ1bmN0aW9uIGtuKGUsdCxuLG8scil7aWYoIm51bWJlciI9PXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSxlPWV8fCIiLG51bGwhPXQpcmV0dXJuIE9uKGUsdCxuLHIpO3ZhciBpLHM9W107Zm9yKGk9MDtvPmk7aSsrKXNbaV09T24oZSxpLG4scik7cmV0dXJuIHN9ZnVuY3Rpb24gSG4oZSx0KXtyZXR1cm4ga24oZSx0LCJtb250aHMiLDEyLCJtb250aCIpfWZ1bmN0aW9uIERuKGUsdCl7cmV0dXJuIGtuKGUsdCwibW9udGhzU2hvcnQiLDEyLCJtb250aCIpfWZ1bmN0aW9uIEFuKGUsdCl7cmV0dXJuIGtuKGUsdCwid2Vla2RheXMiLDcsImRheSIpfWZ1bmN0aW9uIHhuKGUsdCl7cmV0dXJuIGtuKGUsdCwid2Vla2RheXNTaG9ydCIsNywiZGF5Iil9ZnVuY3Rpb24gUG4oZSx0KXtyZXR1cm4ga24oZSx0LCJ3ZWVrZGF5c01pbiIsNywiZGF5Iil9ZnVuY3Rpb24gTm4oKXt2YXIgZT10aGlzLl9kYXRhO3JldHVybiB0aGlzLl9taWxsaXNlY29uZHM9TXIodGhpcy5fbWlsbGlzZWNvbmRzKSx0aGlzLl9kYXlzPU1yKHRoaXMuX2RheXMpLHRoaXMuX21vbnRocz1Ncih0aGlzLl9tb250aHMpLGUubWlsbGlzZWNvbmRzPU1yKGUubWlsbGlzZWNvbmRzKSxlLnNlY29uZHM9TXIoZS5zZWNvbmRzKSxlLm1pbnV0ZXM9TXIoZS5taW51dGVzKSxlLmhvdXJzPU1yKGUuaG91cnMpLGUubW9udGhzPU1yKGUubW9udGhzKSxlLnllYXJzPU1yKGUueWVhcnMpLHRoaXN9ZnVuY3Rpb24gTG4oZSx0LG4sbyl7dmFyIHI9cnQodCxuKTtyZXR1cm4gZS5fbWlsbGlzZWNvbmRzKz1vKnIuX21pbGxpc2Vjb25kcyxlLl9kYXlzKz1vKnIuX2RheXMsZS5fbW9udGhzKz1vKnIuX21vbnRocyxlLl9idWJibGUoKX1mdW5jdGlvbiBXbihlLHQpe3JldHVybiBMbih0aGlzLGUsdCwxKX1mdW5jdGlvbiBJbihlLHQpe3JldHVybiBMbih0aGlzLGUsdCwtMSl9ZnVuY3Rpb24gam4oZSl7cmV0dXJuIDA+ZT9NYXRoLmZsb29yKGUpOk1hdGguY2VpbChlKX1mdW5jdGlvbiBWbigpe3ZhciBlLHQsbixvLHIsaT10aGlzLl9taWxsaXNlY29uZHMscz10aGlzLl9kYXlzLGw9dGhpcy5fbW9udGhzLGE9dGhpcy5fZGF0YTtyZXR1cm4gaT49MCYmcz49MCYmbD49MHx8MD49aSYmMD49cyYmMD49bHx8KGkrPTg2NGU1KmpuKEJuKGwpK3MpLHM9MCxsPTApLGEubWlsbGlzZWNvbmRzPWklMWUzLGU9dihpLzFlMyksYS5zZWNvbmRzPWUlNjAsdD12KGUvNjApLGEubWludXRlcz10JTYwLG49dih0LzYwKSxhLmhvdXJzPW4lMjQscys9dihuLzI0KSxyPXYoRm4ocykpLGwrPXIscy09am4oQm4ocikpLG89dihsLzEyKSxsJT0xMixhLmRheXM9cyxhLm1vbnRocz1sLGEueWVhcnM9byx0aGlzfWZ1bmN0aW9uIEZuKGUpe3JldHVybiA0ODAwKmUvMTQ2MDk3fWZ1bmN0aW9uIEJuKGUpe3JldHVybiAxNDYwOTcqZS80ODAwfWZ1bmN0aW9uIHpuKGUpe3ZhciB0LG4sbz10aGlzLl9taWxsaXNlY29uZHM7aWYoZT1JKGUpLCJtb250aCI9PT1lfHwieWVhciI9PT1lKXJldHVybiB0PXRoaXMuX2RheXMrby84NjRlNSxuPXRoaXMuX21vbnRocytGbih0KSwibW9udGgiPT09ZT9uOm4vMTI7c3dpdGNoKHQ9dGhpcy5fZGF5cytNYXRoLnJvdW5kKEJuKHRoaXMuX21vbnRocykpLGUpe2Nhc2Uid2VlayI6cmV0dXJuIHQvNytvLzYwNDhlNTtjYXNlImRheSI6cmV0dXJuIHQrby84NjRlNTtjYXNlImhvdXIiOnJldHVybiAyNCp0K28vMzZlNTtjYXNlIm1pbnV0ZSI6cmV0dXJuIDE0NDAqdCtvLzZlNDtjYXNlInNlY29uZCI6cmV0dXJuIDg2NDAwKnQrby8xZTM7Y2FzZSJtaWxsaXNlY29uZCI6cmV0dXJuIE1hdGguZmxvb3IoODY0ZTUqdCkrbztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biB1bml0ICIrZSl9fWZ1bmN0aW9uIFluKCl7cmV0dXJuIHRoaXMuX21pbGxpc2Vjb25kcys4NjRlNSp0aGlzLl9kYXlzK3RoaXMuX21vbnRocyUxMioyNTkyZTYrMzE1MzZlNip5KHRoaXMuX21vbnRocy8xMil9ZnVuY3Rpb24gVW4oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXMoZSl9fWZ1bmN0aW9uIEduKGUpe3JldHVybiBlPUkoZSksdGhpc1tlKyJzIl0oKX1mdW5jdGlvbiAkbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YVtlXX19ZnVuY3Rpb24gWG4oKXtyZXR1cm4gdih0aGlzLmRheXMoKS83KX1mdW5jdGlvbiBLbihlLHQsbixvLHIpe3JldHVybiByLnJlbGF0aXZlVGltZSh0fHwxLCEhbixlLG8pfWZ1bmN0aW9uIHFuKGUsdCxuKXt2YXIgbz1ydChlKS5hYnMoKSxyPXpyKG8uYXMoInMiKSksaT16cihvLmFzKCJtIikpLHM9enIoby5hcygiaCIpKSxsPXpyKG8uYXMoImQiKSksYT16cihvLmFzKCJNIikpLHU9enIoby5hcygieSIpKSxjPXI8WXIucyYmWyJzIixyXXx8MT49aSYmWyJtIl18fGk8WXIubSYmWyJtbSIsaV18fDE+PXMmJlsiaCJdfHxzPFlyLmgmJlsiaGgiLHNdfHwxPj1sJiZbImQiXXx8bDxZci5kJiZbImRkIixsXXx8MT49YSYmWyJNIl18fGE8WXIuTSYmWyJNTSIsYV18fDE+PXUmJlsieSJdfHxbInl5Iix1XTtyZXR1cm4gY1syXT10LGNbM109K2U+MCxjWzRdPW4sS24uYXBwbHkobnVsbCxjKX1mdW5jdGlvbiBabihlLHQpe3JldHVybiB2b2lkIDA9PT1ZcltlXT8hMTp2b2lkIDA9PT10P1lyW2VdOihZcltlXT10LCEwKX1mdW5jdGlvbiBKbihlKXt2YXIgdD10aGlzLmxvY2FsZURhdGEoKSxuPXFuKHRoaXMsIWUsdCk7cmV0dXJuIGUmJihuPXQucGFzdEZ1dHVyZSgrdGhpcyxuKSksdC5wb3N0Zm9ybWF0KG4pfWZ1bmN0aW9uIFFuKCl7dmFyIGUsdCxuLG89VXIodGhpcy5fbWlsbGlzZWNvbmRzKS8xZTMscj1Vcih0aGlzLl9kYXlzKSxpPVVyKHRoaXMuX21vbnRocyk7ZT12KG8vNjApLHQ9dihlLzYwKSxvJT02MCxlJT02MCxuPXYoaS8xMiksaSU9MTI7dmFyIHM9bixsPWksYT1yLHU9dCxjPWUsaD1vLGQ9dGhpcy5hc1NlY29uZHMoKTtyZXR1cm4gZD8oMD5kPyItIjoiIikrIlAiKyhzP3MrIlkiOiIiKSsobD9sKyJNIjoiIikrKGE/YSsiRCI6IiIpKyh1fHxjfHxoPyJUIjoiIikrKHU/dSsiSCI6IiIpKyhjP2MrIk0iOiIiKSsoaD9oKyJTIjoiIik6IlAwRCJ9dmFyIGVvLHRvPWUubW9tZW50UHJvcGVydGllcz1bXSxubz0hMSxvbz17fTtlLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncz0hMTt2YXIgcm8saW89e30sc289e30sbG89LyhcW1teXFtdKlxdKXwoXFwpPyhbSGhdbW0oc3MpP3xNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98V1tvfFddP3xRbz98WVlZWVlZfFlZWVlZfFlZWVl8WVl8Z2coZ2dnPyk/fEdHKEdHRz8pP3xlfEV8YXxBfGhoP3xISD98bW0/fHNzP3xTezEsOX18eHxYfHp6P3xaWj98LikvZyxhbz0vKFxbW15cW10qXF0pfChcXCk/KExUU3xMVHxMTD9MP0w/fGx7MSw0fSkvZyx1bz17fSxjbz17fSxobz0vXGQvLGZvPS9cZFxkLyxwbz0vXGR7M30vLGdvPS9cZHs0fS8sbW89L1srLV0/XGR7Nn0vLHdvPS9cZFxkPy8sdm89L1xkXGRcZFxkPy8seW89L1xkXGRcZFxkXGRcZD8vLGJvPS9cZHsxLDN9LyxDbz0vXGR7MSw0fS8sX289L1srLV0/XGR7MSw2fS8sUm89L1xkKy8sU289L1srLV0/XGQrLyxFbz0vWnxbKy1dXGRcZDo/XGRcZC9naSxUbz0vWnxbKy1dXGRcZCg/Ojo/XGRcZCk/L2dpLE1vPS9bKy1dP1xkKyhcLlxkezEsM30pPy8sT289L1swLTldKlsnYS16XHUwMEEwLVx1MDVGRlx1MDcwMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0rfFtcdTA2MDAtXHUwNkZGXC9dKyhccyo/W1x1MDYwMC1cdTA2RkZdKyl7MSwyfS9pLGtvPXt9LEhvPXt9LERvPTAsQW89MSx4bz0yLFBvPTMsTm89NCxMbz01LFdvPTYsSW89Nyxqbz04O1UoIk0iLFsiTU0iLDJdLCJNbyIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb250aCgpKzF9KSxVKCJNTU0iLDAsMCxmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubW9udGhzU2hvcnQodGhpcyxlKX0pLFUoIk1NTU0iLDAsMCxmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubW9udGhzKHRoaXMsZSl9KSxXKCJtb250aCIsIk0iKSxxKCJNIix3bykscSgiTU0iLHdvLGZvKSxxKCJNTU0iLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubW9udGhzU2hvcnRSZWdleChlKX0pLHEoIk1NTU0iLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubW9udGhzUmVnZXgoZSl9KSxlZShbIk0iLCJNTSJdLGZ1bmN0aW9uKGUsdCl7dFtBb109eShlKS0xfSksZWUoWyJNTU0iLCJNTU1NIl0sZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHI9bi5fbG9jYWxlLm1vbnRoc1BhcnNlKGUsbyxuLl9zdHJpY3QpO251bGwhPXI/dFtBb109cjpoKG4pLmludmFsaWRNb250aD1lfSk7dmFyIFZvPS9EW29EXT8oXFtbXlxbXF1dKlxdfFxzKykrTU1NTT8vLEZvPSJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyIi5zcGxpdCgiXyIpLEJvPSJKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYyIuc3BsaXQoIl8iKSx6bz1PbyxZbz1PbyxVbz0vXlxzKigoPzpbKy1dXGR7Nn18XGR7NH0pLSg/OlxkXGQtXGRcZHxXXGRcZC1cZHxXXGRcZHxcZFxkXGR8XGRcZCkpKD86KFR8ICkoXGRcZCg/OjpcZFxkKD86OlxkXGQoPzpbLixdXGQrKT8pPyk/KShbXCtcLV1cZFxkKD86Oj9cZFxkKT98XHMqWik/KT8vLEdvPS9eXHMqKCg/OlsrLV1cZHs2fXxcZHs0fSkoPzpcZFxkXGRcZHxXXGRcZFxkfFdcZFxkfFxkXGRcZHxcZFxkKSkoPzooVHwgKShcZFxkKD86XGRcZCg/OlxkXGQoPzpbLixdXGQrKT8pPyk/KShbXCtcLV1cZFxkKD86Oj9cZFxkKT98XHMqWik/KT8vLCRvPS9afFsrLV1cZFxkKD86Oj9cZFxkKT8vLFhvPVtbIllZWVlZWS1NTS1ERCIsL1srLV1cZHs2fS1cZFxkLVxkXGQvXSxbIllZWVktTU0tREQiLC9cZHs0fS1cZFxkLVxkXGQvXSxbIkdHR0ctW1ddV1ctRSIsL1xkezR9LVdcZFxkLVxkL10sWyJHR0dHLVtXXVdXIiwvXGR7NH0tV1xkXGQvLCExXSxbIllZWVktREREIiwvXGR7NH0tXGR7M30vXSxbIllZWVktTU0iLC9cZHs0fS1cZFxkLywhMV0sWyJZWVlZWVlNTUREIiwvWystXVxkezEwfS9dLFsiWVlZWU1NREQiLC9cZHs4fS9dLFsiR0dHR1tXXVdXRSIsL1xkezR9V1xkezN9L10sWyJHR0dHW1ddV1ciLC9cZHs0fVdcZHsyfS8sITFdLFsiWVlZWURERCIsL1xkezd9L11dLEtvPVtbIkhIOm1tOnNzLlNTU1MiLC9cZFxkOlxkXGQ6XGRcZFwuXGQrL10sWyJISDptbTpzcyxTU1NTIiwvXGRcZDpcZFxkOlxkXGQsXGQrL10sWyJISDptbTpzcyIsL1xkXGQ6XGRcZDpcZFxkL10sWyJISDptbSIsL1xkXGQ6XGRcZC9dLFsiSEhtbXNzLlNTU1MiLC9cZFxkXGRcZFxkXGRcLlxkKy9dLFsiSEhtbXNzLFNTU1MiLC9cZFxkXGRcZFxkXGQsXGQrL10sWyJISG1tc3MiLC9cZFxkXGRcZFxkXGQvXSxbIkhIbW0iLC9cZFxkXGRcZC9dLFsiSEgiLC9cZFxkL11dLHFvPS9eXC8/RGF0ZVwoKFwtP1xkKykvaTtlLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrPV8oIm1vbWVudCBjb25zdHJ1Y3Rpb24gZmFsbHMgYmFjayB0byBqcyBEYXRlLiBUaGlzIGlzIGRpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdXBjb21pbmcgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDA3IGZvciBtb3JlIGluZm8uIixmdW5jdGlvbihlKXtlLl9kPW5ldyBEYXRlKGUuX2krKGUuX3VzZVVUQz8iIFVUQyI6IiIpKX0pLFUoIlkiLDAsMCxmdW5jdGlvbigpe3ZhciBlPXRoaXMueWVhcigpO3JldHVybiA5OTk5Pj1lPyIiK2U6IisiK2V9KSxVKDAsWyJZWSIsMl0sMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLnllYXIoKSUxMDB9KSxVKDAsWyJZWVlZIiw0XSwwLCJ5ZWFyIiksVSgwLFsiWVlZWVkiLDVdLDAsInllYXIiKSxVKDAsWyJZWVlZWVkiLDYsITBdLDAsInllYXIiKSxXKCJ5ZWFyIiwieSIpLHEoIlkiLFNvKSxxKCJZWSIsd28sZm8pLHEoIllZWVkiLENvLGdvKSxxKCJZWVlZWSIsX28sbW8pLHEoIllZWVlZWSIsX28sbW8pLGVlKFsiWVlZWVkiLCJZWVlZWVkiXSxEbyksZWUoIllZWVkiLGZ1bmN0aW9uKHQsbil7bltEb109Mj09PXQubGVuZ3RoP2UucGFyc2VUd29EaWdpdFllYXIodCk6eSh0KX0pLGVlKCJZWSIsZnVuY3Rpb24odCxuKXtuW0RvXT1lLnBhcnNlVHdvRGlnaXRZZWFyKHQpfSksZWUoIlkiLGZ1bmN0aW9uKGUsdCl7dFtEb109cGFyc2VJbnQoZSwxMCl9KSxlLnBhcnNlVHdvRGlnaXRZZWFyPWZ1bmN0aW9uKGUpe3JldHVybiB5KGUpKyh5KGUpPjY4PzE5MDA6MmUzKX07dmFyIFpvPVYoIkZ1bGxZZWFyIiwhMSk7ZS5JU09fODYwMT1mdW5jdGlvbigpe307dmFyIEpvPV8oIm1vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTU0OCIsZnVuY3Rpb24oKXt2YXIgZT1XZS5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZlLmlzVmFsaWQoKT90aGlzPmU/dGhpczplOmYoKX0pLFFvPV8oIm1vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1pbiBpbnN0ZWFkLiBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTU0OCIsZnVuY3Rpb24oKXt2YXIgZT1XZS5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZlLmlzVmFsaWQoKT9lPnRoaXM/dGhpczplOmYoKX0pLGVyPWZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93P0RhdGUubm93KCk6K25ldyBEYXRlfTt6ZSgiWiIsIjoiKSx6ZSgiWloiLCIiKSxxKCJaIixUbykscSgiWloiLFRvKSxlZShbIloiLCJaWiJdLGZ1bmN0aW9uKGUsdCxuKXtuLl91c2VVVEM9ITAsbi5fdHptPVllKFRvLGUpfSk7dmFyIHRyPS8oW1wrXC1dfFxkXGQpL2dpO2UudXBkYXRlT2Zmc2V0PWZ1bmN0aW9uKCl7fTt2YXIgbnI9L14oXC0pPyg/OihcZCopWy4gXSk/KFxkKylcOihcZCspKD86XDooXGQrKVwuPyhcZHszfSk/XGQqKT8kLyxvcj0vXigtKT9QKD86KFswLTksLl0qKVkpPyg/OihbMC05LC5dKilNKT8oPzooWzAtOSwuXSopVyk/KD86KFswLTksLl0qKUQpPyg/OlQoPzooWzAtOSwuXSopSCk/KD86KFswLTksLl0qKU0pPyg/OihbMC05LC5dKilTKT8pPyQvO3J0LmZuPUZlLnByb3RvdHlwZTt2YXIgcnI9dXQoMSwiYWRkIiksaXI9dXQoLTEsInN1YnRyYWN0Iik7ZS5kZWZhdWx0Rm9ybWF0PSJZWVlZLU1NLUREVEhIOm1tOnNzWiI7dmFyIHNyPV8oIm1vbWVudCgpLmxhbmcoKSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgbW9tZW50KCkubG9jYWxlRGF0YSgpIHRvIGdldCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbi4gVXNlIG1vbWVudCgpLmxvY2FsZSgpIHRvIGNoYW5nZSBsYW5ndWFnZXMuIixmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLmxvY2FsZURhdGEoKTp0aGlzLmxvY2FsZShlKX0pO1UoMCxbImdnIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2Vla1llYXIoKSUxMDB9KSxVKDAsWyJHRyIsMl0sMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzb1dlZWtZZWFyKCklMTAwfSksQnQoImdnZ2ciLCJ3ZWVrWWVhciIpLEJ0KCJnZ2dnZyIsIndlZWtZZWFyIiksQnQoIkdHR0ciLCJpc29XZWVrWWVhciIpLEJ0KCJHR0dHRyIsImlzb1dlZWtZZWFyIiksVygid2Vla1llYXIiLCJnZyIpLFcoImlzb1dlZWtZZWFyIiwiR0ciKSxxKCJHIixTbykscSgiZyIsU28pLHEoIkdHIix3byxmbykscSgiZ2ciLHdvLGZvKSxxKCJHR0dHIixDbyxnbykscSgiZ2dnZyIsQ28sZ28pLHEoIkdHR0dHIixfbyxtbykscSgiZ2dnZ2ciLF9vLG1vKSx0ZShbImdnZ2ciLCJnZ2dnZyIsIkdHR0ciLCJHR0dHRyJdLGZ1bmN0aW9uKGUsdCxuLG8pe3Rbby5zdWJzdHIoMCwyKV09eShlKX0pLHRlKFsiZ2ciLCJHRyJdLGZ1bmN0aW9uKHQsbixvLHIpe25bcl09ZS5wYXJzZVR3b0RpZ2l0WWVhcih0KX0pLFUoIlEiLDAsIlFvIiwicXVhcnRlciIpLFcoInF1YXJ0ZXIiLCJRIikscSgiUSIsaG8pLGVlKCJRIixmdW5jdGlvbihlLHQpe3RbQW9dPTMqKHkoZSktMSl9KSxVKCJ3IixbInd3IiwyXSwid28iLCJ3ZWVrIiksVSgiVyIsWyJXVyIsMl0sIldvIiwiaXNvV2VlayIpLFcoIndlZWsiLCJ3IiksVygiaXNvV2VlayIsIlciKSxxKCJ3Iix3bykscSgid3ciLHdvLGZvKSxxKCJXIix3bykscSgiV1ciLHdvLGZvKSx0ZShbInciLCJ3dyIsIlciLCJXVyJdLGZ1bmN0aW9uKGUsdCxuLG8pe3Rbby5zdWJzdHIoMCwxKV09eShlKX0pO3ZhciBscj17ZG93OjAsZG95OjZ9O1UoIkQiLFsiREQiLDJdLCJEbyIsImRhdGUiKSxXKCJkYXRlIiwiRCIpLHEoIkQiLHdvKSxxKCJERCIsd28sZm8pLHEoIkRvIixmdW5jdGlvbihlLHQpe3JldHVybiBlP3QuX29yZGluYWxQYXJzZTp0Ll9vcmRpbmFsUGFyc2VMZW5pZW50fSksZWUoWyJEIiwiREQiXSx4byksZWUoIkRvIixmdW5jdGlvbihlLHQpe3RbeG9dPXkoZS5tYXRjaCh3bylbMF0sMTApfSk7dmFyIGFyPVYoIkRhdGUiLCEwKTtVKCJkIiwwLCJkbyIsImRheSIpLFUoImRkIiwwLDAsZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzTWluKHRoaXMsZSl9KSxVKCJkZGQiLDAsMCxmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNTaG9ydCh0aGlzLGUpfSksVSgiZGRkZCIsMCwwLGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5cyh0aGlzLGUpfSksVSgiZSIsMCwwLCJ3ZWVrZGF5IiksVSgiRSIsMCwwLCJpc29XZWVrZGF5IiksVygiZGF5IiwiZCIpLFcoIndlZWtkYXkiLCJlIiksVygiaXNvV2Vla2RheSIsIkUiKSxxKCJkIix3bykscSgiZSIsd28pLHEoIkUiLHdvKSxxKCJkZCIsT28pLHEoImRkZCIsT28pLHEoImRkZGQiLE9vKSx0ZShbImRkIiwiZGRkIiwiZGRkZCJdLGZ1bmN0aW9uKGUsdCxuLG8pe3ZhciByPW4uX2xvY2FsZS53ZWVrZGF5c1BhcnNlKGUsbyxuLl9zdHJpY3QpO251bGwhPXI/dC5kPXI6aChuKS5pbnZhbGlkV2Vla2RheT1lfSksdGUoWyJkIiwiZSIsIkUiXSxmdW5jdGlvbihlLHQsbixvKXt0W29dPXkoZSl9KTt2YXIgdXI9IlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Ii5zcGxpdCgiXyIpLGNyPSJTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQiLnNwbGl0KCJfIiksaHI9IlN1X01vX1R1X1dlX1RoX0ZyX1NhIi5zcGxpdCgiXyIpO1UoIkRERCIsWyJEREREIiwzXSwiREREbyIsImRheU9mWWVhciIpLFcoImRheU9mWWVhciIsIkRERCIpLHEoIkRERCIsYm8pLHEoIkREREQiLHBvKSxlZShbIkRERCIsIkREREQiXSxmdW5jdGlvbihlLHQsbil7bi5fZGF5T2ZZZWFyPXkoZSl9KSxVKCJIIixbIkhIIiwyXSwwLCJob3VyIiksVSgiaCIsWyJoaCIsMl0sMCxobiksVSgiaG1tIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm4iIitobi5hcHBseSh0aGlzKStZKHRoaXMubWludXRlcygpLDIpfSksVSgiaG1tc3MiLDAsMCxmdW5jdGlvbigpe3JldHVybiIiK2huLmFwcGx5KHRoaXMpK1kodGhpcy5taW51dGVzKCksMikrWSh0aGlzLnNlY29uZHMoKSwyKX0pLFUoIkhtbSIsMCwwLGZ1bmN0aW9uKCl7cmV0dXJuIiIrdGhpcy5ob3VycygpK1kodGhpcy5taW51dGVzKCksMil9KSxVKCJIbW1zcyIsMCwwLGZ1bmN0aW9uKCl7cmV0dXJuIiIrdGhpcy5ob3VycygpK1kodGhpcy5taW51dGVzKCksMikrWSh0aGlzLnNlY29uZHMoKSwyKX0pLGRuKCJhIiwhMCksZG4oIkEiLCExKSxXKCJob3VyIiwiaCIpLHEoImEiLGZuKSxxKCJBIixmbikscSgiSCIsd28pLHEoImgiLHdvKSxxKCJISCIsd28sZm8pLHEoImhoIix3byxmbykscSgiaG1tIix2bykscSgiaG1tc3MiLHlvKSxxKCJIbW0iLHZvKSxxKCJIbW1zcyIseW8pLGVlKFsiSCIsIkhIIl0sUG8pLGVlKFsiYSIsIkEiXSxmdW5jdGlvbihlLHQsbil7bi5faXNQbT1uLl9sb2NhbGUuaXNQTShlKSxuLl9tZXJpZGllbT1lfSksZWUoWyJoIiwiaGgiXSxmdW5jdGlvbihlLHQsbil7dFtQb109eShlKSxoKG4pLmJpZ0hvdXI9ITB9KSxlZSgiaG1tIixmdW5jdGlvbihlLHQsbil7dmFyIG89ZS5sZW5ndGgtMjt0W1BvXT15KGUuc3Vic3RyKDAsbykpLHRbTm9dPXkoZS5zdWJzdHIobykpLGgobikuYmlnSG91cj0hMH0pLGVlKCJobW1zcyIsZnVuY3Rpb24oZSx0LG4pe3ZhciBvPWUubGVuZ3RoLTQscj1lLmxlbmd0aC0yO3RbUG9dPXkoZS5zdWJzdHIoMCxvKSksdFtOb109eShlLnN1YnN0cihvLDIpKSx0W0xvXT15KGUuc3Vic3RyKHIpKSxoKG4pLmJpZ0hvdXI9ITB9KSxlZSgiSG1tIixmdW5jdGlvbihlLHQsbil7dmFyIG89ZS5sZW5ndGgtMjt0W1BvXT15KGUuc3Vic3RyKDAsbykpLHRbTm9dPXkoZS5zdWJzdHIobykpfSksZWUoIkhtbXNzIixmdW5jdGlvbihlLHQsbil7dmFyIG89ZS5sZW5ndGgtNCxyPWUubGVuZ3RoLTI7dFtQb109eShlLnN1YnN0cigwLG8pKSx0W05vXT15KGUuc3Vic3RyKG8sMikpLHRbTG9dPXkoZS5zdWJzdHIocikpfSk7dmFyIGRyPS9bYXBdXC4/bT9cLj8vaSxmcj1WKCJIb3VycyIsITApO1UoIm0iLFsibW0iLDJdLDAsIm1pbnV0ZSIpLFcoIm1pbnV0ZSIsIm0iKSxxKCJtIix3bykscSgibW0iLHdvLGZvKSxlZShbIm0iLCJtbSJdLE5vKTt2YXIgcHI9VigiTWludXRlcyIsITEpO1UoInMiLFsic3MiLDJdLDAsInNlY29uZCIpLFcoInNlY29uZCIsInMiKSxxKCJzIix3bykscSgic3MiLHdvLGZvKSxlZShbInMiLCJzcyJdLExvKTt2YXIgZ3I9VigiU2Vjb25kcyIsITEpO1UoIlMiLDAsMCxmdW5jdGlvbigpe3JldHVybn5+KHRoaXMubWlsbGlzZWNvbmQoKS8xMDApfSksVSgwLFsiU1MiLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm5+fih0aGlzLm1pbGxpc2Vjb25kKCkvMTApfSksVSgwLFsiU1NTIiwzXSwwLCJtaWxsaXNlY29uZCIpLFUoMCxbIlNTU1MiLDRdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMTAqdGhpcy5taWxsaXNlY29uZCgpfSksVSgwLFsiU1NTU1MiLDVdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMTAwKnRoaXMubWlsbGlzZWNvbmQoKX0pLFUoMCxbIlNTU1NTUyIsNl0sMCxmdW5jdGlvbigpe3JldHVybiAxZTMqdGhpcy5taWxsaXNlY29uZCgpfSksVSgwLFsiU1NTU1NTUyIsN10sMCxmdW5jdGlvbigpe3JldHVybiAxZTQqdGhpcy5taWxsaXNlY29uZCgpfSksVSgwLFsiU1NTU1NTU1MiLDhdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU1KnRoaXMubWlsbGlzZWNvbmQoKX0pLFUoMCxbIlNTU1NTU1NTUyIsOV0sMCxmdW5jdGlvbigpe3JldHVybiAxZTYqdGhpcy5taWxsaXNlY29uZCgpfSksVygibWlsbGlzZWNvbmQiLCJtcyIpLHEoIlMiLGJvLGhvKSxxKCJTUyIsYm8sZm8pLHEoIlNTUyIsYm8scG8pO3ZhciBtcjtmb3IobXI9IlNTU1MiO21yLmxlbmd0aDw9OTttcis9IlMiKXEobXIsUm8pO2Zvcihtcj0iUyI7bXIubGVuZ3RoPD05O21yKz0iUyIpZWUobXIsbW4pO3ZhciB3cj1WKCJNaWxsaXNlY29uZHMiLCExKTtVKCJ6IiwwLDAsInpvbmVBYmJyIiksVSgienoiLDAsMCwiem9uZU5hbWUiKTt2YXIgdnI9bS5wcm90b3R5cGU7dnIuYWRkPXJyLHZyLmNhbGVuZGFyPWh0LHZyLmNsb25lPWR0LHZyLmRpZmY9eXQsdnIuZW5kT2Y9RHQsdnIuZm9ybWF0PVJ0LHZyLmZyb209U3QsdnIuZnJvbU5vdz1FdCx2ci50bz1UdCx2ci50b05vdz1NdCx2ci5nZXQ9eix2ci5pbnZhbGlkQXQ9VnQsdnIuaXNBZnRlcj1mdCx2ci5pc0JlZm9yZT1wdCx2ci5pc0JldHdlZW49Z3QsdnIuaXNTYW1lPW10LHZyLmlzU2FtZU9yQWZ0ZXI9d3QsdnIuaXNTYW1lT3JCZWZvcmU9dnQsdnIuaXNWYWxpZD1JdCx2ci5sYW5nPXNyLHZyLmxvY2FsZT1PdCx2ci5sb2NhbGVEYXRhPWt0LHZyLm1heD1Rbyx2ci5taW49Sm8sdnIucGFyc2luZ0ZsYWdzPWp0LHZyLnNldD16LHZyLnN0YXJ0T2Y9SHQsdnIuc3VidHJhY3Q9aXIsdnIudG9BcnJheT1OdCx2ci50b09iamVjdD1MdCx2ci50b0RhdGU9UHQsdnIudG9JU09TdHJpbmc9X3QsdnIudG9KU09OPVd0LHZyLnRvU3RyaW5nPUN0LHZyLnVuaXg9eHQsdnIudmFsdWVPZj1BdCx2ci5jcmVhdGlvbkRhdGE9RnQsdnIueWVhcj1abyx2ci5pc0xlYXBZZWFyPWJlLHZyLndlZWtZZWFyPXp0LHZyLmlzb1dlZWtZZWFyPVl0LHZyLnF1YXJ0ZXI9dnIucXVhcnRlcnM9S3QsdnIubW9udGg9YWUsdnIuZGF5c0luTW9udGg9dWUsdnIud2Vlaz12ci53ZWVrcz1RdCx2ci5pc29XZWVrPXZyLmlzb1dlZWtzPWVuLHZyLndlZWtzSW5ZZWFyPUd0LHZyLmlzb1dlZWtzSW5ZZWFyPVV0LHZyLmRhdGU9YXIsdnIuZGF5PXZyLmRheXM9bG4sdnIud2Vla2RheT1hbix2ci5pc29XZWVrZGF5PXVuLHZyLmRheU9mWWVhcj1jbix2ci5ob3VyPXZyLmhvdXJzPWZyLHZyLm1pbnV0ZT12ci5taW51dGVzPXByLHZyLnNlY29uZD12ci5zZWNvbmRzPWdyLHZyLm1pbGxpc2Vjb25kPXZyLm1pbGxpc2Vjb25kcz13cix2ci51dGNPZmZzZXQ9JGUsdnIudXRjPUtlLHZyLmxvY2FsPXFlLHZyLnBhcnNlWm9uZT1aZSx2ci5oYXNBbGlnbmVkSG91ck9mZnNldD1KZSx2ci5pc0RTVD1RZSx2ci5pc0RTVFNoaWZ0ZWQ9ZXQsdnIuaXNMb2NhbD10dCx2ci5pc1V0Y09mZnNldD1udCx2ci5pc1V0Yz1vdCx2ci5pc1VUQz1vdCx2ci56b25lQWJicj13bix2ci56b25lTmFtZT12bix2ci5kYXRlcz1fKCJkYXRlcyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgZGF0ZSBpbnN0ZWFkLiIsYXIpLHZyLm1vbnRocz1fKCJtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQiLGFlKSx2ci55ZWFycz1fKCJ5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkIixabyksdnIuem9uZT1fKCJtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE3NzkiLFhlKTt2YXIgeXI9dnIsYnI9e3NhbWVEYXk6IltUb2RheSBhdF0gTFQiLG5leHREYXk6IltUb21vcnJvdyBhdF0gTFQiLG5leHRXZWVrOiJkZGRkIFthdF0gTFQiLGxhc3REYXk6IltZZXN0ZXJkYXkgYXRdIExUIixsYXN0V2VlazoiW0xhc3RdIGRkZGQgW2F0XSBMVCIsc2FtZUVsc2U6IkwifSxDcj17TFRTOiJoOm1tOnNzIEEiLExUOiJoOm1tIEEiLEw6Ik1NL0REL1lZWVkiLExMOiJNTU1NIEQsIFlZWVkiLExMTDoiTU1NTSBELCBZWVlZIGg6bW0gQSIsTExMTDoiZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQSJ9LF9yPSJJbnZhbGlkIGRhdGUiLFJyPSIlZCIsU3I9L1xkezEsMn0vLEVyPXtmdXR1cmU6ImluICVzIixwYXN0OiIlcyBhZ28iLHM6ImEgZmV3IHNlY29uZHMiLG06ImEgbWludXRlIixtbToiJWQgbWludXRlcyIsaDoiYW4gaG91ciIsaGg6IiVkIGhvdXJzIixkOiJhIGRheSIsZGQ6IiVkIGRheXMiLE06ImEgbW9udGgiLE1NOiIlZCBtb250aHMiLHk6ImEgeWVhciIseXk6IiVkIHllYXJzIn0sVHI9Ty5wcm90b3R5cGU7VHIuX2NhbGVuZGFyPWJyLFRyLmNhbGVuZGFyPUNuLFRyLl9sb25nRGF0ZUZvcm1hdD1DcixUci5sb25nRGF0ZUZvcm1hdD1fbixUci5faW52YWxpZERhdGU9X3IsVHIuaW52YWxpZERhdGU9Um4sVHIuX29yZGluYWw9UnIsVHIub3JkaW5hbD1TbixUci5fb3JkaW5hbFBhcnNlPVNyLFRyLnByZXBhcnNlPUVuLFRyLnBvc3Rmb3JtYXQ9RW4sVHIuX3JlbGF0aXZlVGltZT1FcixUci5yZWxhdGl2ZVRpbWU9VG4sVHIucGFzdEZ1dHVyZT1NbixUci5zZXQ9VCxUci5tb250aHM9cmUsVHIuX21vbnRocz1GbyxUci5tb250aHNTaG9ydD1pZSxUci5fbW9udGhzU2hvcnQ9Qm8sVHIubW9udGhzUGFyc2U9c2UsVHIuX21vbnRoc1JlZ2V4PVlvLFRyLm1vbnRoc1JlZ2V4PWhlLFRyLl9tb250aHNTaG9ydFJlZ2V4PXpvLFRyLm1vbnRoc1Nob3J0UmVnZXg9Y2UsVHIud2Vlaz1xdCxUci5fd2Vlaz1scixUci5maXJzdERheU9mWWVhcj1KdCxUci5maXJzdERheU9mV2Vlaz1adCxUci53ZWVrZGF5cz1ubixUci5fd2Vla2RheXM9dXIsVHIud2Vla2RheXNNaW49cm4sVHIuX3dlZWtkYXlzTWluPWhyLFRyLndlZWtkYXlzU2hvcnQ9b24sVHIuX3dlZWtkYXlzU2hvcnQ9Y3IsVHIud2Vla2RheXNQYXJzZT1zbixUci5pc1BNPXBuLFRyLl9tZXJpZGllbVBhcnNlPWRyLFRyLm1lcmlkaWVtPWduLEEoImVuIix7b3JkaW5hbFBhcnNlOi9cZHsxLDJ9KHRofHN0fG5kfHJkKS8sb3JkaW5hbDpmdW5jdGlvbihlKXt2YXIgdD1lJTEwLG49MT09PXkoZSUxMDAvMTApPyJ0aCI6MT09PXQ/InN0IjoyPT09dD8ibmQiOjM9PT10PyJyZCI6InRoIjtyZXR1cm4gZStufX0pLGUubGFuZz1fKCJtb21lbnQubGFuZyBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZSBpbnN0ZWFkLiIsQSksZS5sYW5nRGF0YT1fKCJtb21lbnQubGFuZ0RhdGEgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGVEYXRhIGluc3RlYWQuIixOKTt2YXIgTXI9TWF0aC5hYnMsT3I9VW4oIm1zIiksa3I9VW4oInMiKSxIcj1VbigibSIpLERyPVVuKCJoIiksQXI9VW4oImQiKSx4cj1VbigidyIpLFByPVVuKCJNIiksTnI9VW4oInkiKSxMcj0kbigibWlsbGlzZWNvbmRzIiksV3I9JG4oInNlY29uZHMiKSxJcj0kbigibWludXRlcyIpLGpyPSRuKCJob3VycyIpLFZyPSRuKCJkYXlzIiksRnI9JG4oIm1vbnRocyIpLEJyPSRuKCJ5ZWFycyIpLHpyPU1hdGgucm91bmQsWXI9e3M6NDUsbTo0NSxoOjIyLGQ6MjYsTToxMX0sVXI9TWF0aC5hYnMsR3I9RmUucHJvdG90eXBlO0dyLmFicz1ObixHci5hZGQ9V24sR3Iuc3VidHJhY3Q9SW4sR3IuYXM9em4sR3IuYXNNaWxsaXNlY29uZHM9T3IsR3IuYXNTZWNvbmRzPWtyLEdyLmFzTWludXRlcz1IcixHci5hc0hvdXJzPURyLEdyLmFzRGF5cz1BcixHci5hc1dlZWtzPXhyLEdyLmFzTW9udGhzPVByLEdyLmFzWWVhcnM9TnIsR3IudmFsdWVPZj1ZbixHci5fYnViYmxlPVZuLEdyLmdldD1HbixHci5taWxsaXNlY29uZHM9THIsR3Iuc2Vjb25kcz1XcixHci5taW51dGVzPUlyLEdyLmhvdXJzPWpyLEdyLmRheXM9VnIsR3Iud2Vla3M9WG4sR3IubW9udGhzPUZyLEdyLnllYXJzPUJyLEdyLmh1bWFuaXplPUpuLEdyLnRvSVNPU3RyaW5nPVFuLEdyLnRvU3RyaW5nPVFuLEdyLnRvSlNPTj1RbixHci5sb2NhbGU9T3QsR3IubG9jYWxlRGF0YT1rdCxHci50b0lzb1N0cmluZz1fKCJ0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKSIsUW4pLEdyLmxhbmc9c3IsVSgiWCIsMCwwLCJ1bml4IiksVSgieCIsMCwwLCJ2YWx1ZU9mIikscSgieCIsU28pLHEoIlgiLE1vKSxlZSgiWCIsZnVuY3Rpb24oZSx0LG4pe24uX2Q9bmV3IERhdGUoMWUzKnBhcnNlRmxvYXQoZSwxMCkpfSksZWUoIngiLGZ1bmN0aW9uKGUsdCxuKXtuLl9kPW5ldyBEYXRlKHkoZSkpfSksZS52ZXJzaW9uPSIyLjEyLjAiLG8oV2UpLGUuZm49eXIsZS5taW49amUsZS5tYXg9VmUsZS5ub3c9ZXIsZS51dGM9dSxlLnVuaXg9eW4sZS5tb250aHM9SG4sZS5pc0RhdGU9aSxlLmxvY2FsZT1BLGUuaW52YWxpZD1mLGUuZHVyYXRpb249cnQsZS5pc01vbWVudD13LGUud2Vla2RheXM9QW4sZS5wYXJzZVpvbmU9Ym4sZS5sb2NhbGVEYXRhPU4sZS5pc0R1cmF0aW9uPUJlLGUubW9udGhzU2hvcnQ9RG4sZS53ZWVrZGF5c01pbj1QbixlLmRlZmluZUxvY2FsZT14LGUudXBkYXRlTG9jYWxlPVAsZS5sb2NhbGVzPUwsZS53ZWVrZGF5c1Nob3J0PXhuLGUubm9ybWFsaXplVW5pdHM9SSxlLnJlbGF0aXZlVGltZVRocmVzaG9sZD1abixlLnByb3RvdHlwZT15cjt2YXIgJHI9ZTtyZXR1cm4gJHJ9KX0se31dLG51bWVyYWw6W2Z1bmN0aW9uKHQsbixvKXsvKiENCiAqIG51bWVyYWwuanMNCiAqIHZlcnNpb24gOiAxLjUuMw0KICogYXV0aG9yIDogQWRhbSBEcmFwZXINCiAqIGxpY2Vuc2UgOiBNSVQNCiAqIGh0dHA6Ly9hZGFtd2RyYXBlci5naXRodWIuY29tL051bWVyYWwtanMvDQogKi8NCihmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dGhpcy5fdmFsdWU9ZX1mdW5jdGlvbiBvKGUsdCxuLG8pe3ZhciByLGkscz1NYXRoLnBvdygxMCx0KTtyZXR1cm4gaT0obihlKnMpL3MpLnRvRml4ZWQodCksbyYmKHI9bmV3IFJlZ0V4cCgiMHsxLCIrbysifSQiKSxpPWkucmVwbGFjZShyLCIiKSksaX1mdW5jdGlvbiByKGUsdCxuKXt2YXIgbztyZXR1cm4gbz10LmluZGV4T2YoIiQiKT4tMT9zKGUsdCxuKTp0LmluZGV4T2YoIiUiKT4tMT9sKGUsdCxuKTp0LmluZGV4T2YoIjoiKT4tMT9hKGUsdCk6YyhlLl92YWx1ZSx0LG4pfWZ1bmN0aW9uIGkoZSx0KXt2YXIgbixvLHIsaSxzLGw9dCxhPVsiS0IiLCJNQiIsIkdCIiwiVEIiLCJQQiIsIkVCIiwiWkIiLCJZQiJdLGM9ITE7aWYodC5pbmRleE9mKCI6Iik+LTEpZS5fdmFsdWU9dSh0KTtlbHNlIGlmKHQ9PT12KWUuX3ZhbHVlPTA7ZWxzZXtmb3IoIi4iIT09bVt3XS5kZWxpbWl0ZXJzLmRlY2ltYWwmJih0PXQucmVwbGFjZSgvXC4vZywiIikucmVwbGFjZShtW3ddLmRlbGltaXRlcnMuZGVjaW1hbCwiLiIpKSxuPW5ldyBSZWdFeHAoIlteYS16QS1aXSIrbVt3XS5hYmJyZXZpYXRpb25zLnRob3VzYW5kKyIoPzpcXCl8KFxcIittW3ddLmN1cnJlbmN5LnN5bWJvbCsiKT8oPzpcXCkpPyk/JCIpLG89bmV3IFJlZ0V4cCgiW15hLXpBLVpdIittW3ddLmFiYnJldmlhdGlvbnMubWlsbGlvbisiKD86XFwpfChcXCIrbVt3XS5jdXJyZW5jeS5zeW1ib2wrIik/KD86XFwpKT8pPyQiKSxyPW5ldyBSZWdFeHAoIlteYS16QS1aXSIrbVt3XS5hYmJyZXZpYXRpb25zLmJpbGxpb24rIig/OlxcKXwoXFwiK21bd10uY3VycmVuY3kuc3ltYm9sKyIpPyg/OlxcKSk/KT8kIiksaT1uZXcgUmVnRXhwKCJbXmEtekEtWl0iK21bd10uYWJicmV2aWF0aW9ucy50cmlsbGlvbisiKD86XFwpfChcXCIrbVt3XS5jdXJyZW5jeS5zeW1ib2wrIik/KD86XFwpKT8pPyQiKSxzPTA7czw9YS5sZW5ndGgmJiEoYz10LmluZGV4T2YoYVtzXSk+LTE/TWF0aC5wb3coMTAyNCxzKzEpOiExKTtzKyspO2UuX3ZhbHVlPShjP2M6MSkqKGwubWF0Y2gobik/TWF0aC5wb3coMTAsMyk6MSkqKGwubWF0Y2gobyk/TWF0aC5wb3coMTAsNik6MSkqKGwubWF0Y2gocik/TWF0aC5wb3coMTAsOSk6MSkqKGwubWF0Y2goaSk/TWF0aC5wb3coMTAsMTIpOjEpKih0LmluZGV4T2YoIiUiKT4tMT8uMDE6MSkqKCh0LnNwbGl0KCItIikubGVuZ3RoK01hdGgubWluKHQuc3BsaXQoIigiKS5sZW5ndGgtMSx0LnNwbGl0KCIpIikubGVuZ3RoLTEpKSUyPzE6LTEpKk51bWJlcih0LnJlcGxhY2UoL1teMC05XC5dKy9nLCIiKSksZS5fdmFsdWU9Yz9NYXRoLmNlaWwoZS5fdmFsdWUpOmUuX3ZhbHVlfXJldHVybiBlLl92YWx1ZX1mdW5jdGlvbiBzKGUsdCxuKXt2YXIgbyxyLGk9dC5pbmRleE9mKCIkIikscz10LmluZGV4T2YoIigiKSxsPXQuaW5kZXhPZigiLSIpLGE9IiI7cmV0dXJuIHQuaW5kZXhPZigiICQiKT4tMT8oYT0iICIsdD10LnJlcGxhY2UoIiAkIiwiIikpOnQuaW5kZXhPZigiJCAiKT4tMT8oYT0iICIsdD10LnJlcGxhY2UoIiQgIiwiIikpOnQ9dC5yZXBsYWNlKCIkIiwiIikscj1jKGUuX3ZhbHVlLHQsbiksMT49aT9yLmluZGV4T2YoIigiKT4tMXx8ci5pbmRleE9mKCItIik+LTE/KHI9ci5zcGxpdCgiIiksbz0xLChzPml8fGw+aSkmJihvPTApLHIuc3BsaWNlKG8sMCxtW3ddLmN1cnJlbmN5LnN5bWJvbCthKSxyPXIuam9pbigiIikpOnI9bVt3XS5jdXJyZW5jeS5zeW1ib2wrYStyOnIuaW5kZXhPZigiKSIpPi0xPyhyPXIuc3BsaXQoIiIpLHIuc3BsaWNlKC0xLDAsYSttW3ddLmN1cnJlbmN5LnN5bWJvbCkscj1yLmpvaW4oIiIpKTpyPXIrYSttW3ddLmN1cnJlbmN5LnN5bWJvbCxyfWZ1bmN0aW9uIGwoZSx0LG4pe3ZhciBvLHI9IiIsaT0xMDAqZS5fdmFsdWU7cmV0dXJuIHQuaW5kZXhPZigiICUiKT4tMT8ocj0iICIsdD10LnJlcGxhY2UoIiAlIiwiIikpOnQ9dC5yZXBsYWNlKCIlIiwiIiksbz1jKGksdCxuKSxvLmluZGV4T2YoIikiKT4tMT8obz1vLnNwbGl0KCIiKSxvLnNwbGljZSgtMSwwLHIrIiUiKSxvPW8uam9pbigiIikpOm89bytyKyIlIixvfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9TWF0aC5mbG9vcihlLl92YWx1ZS82MC82MCksbj1NYXRoLmZsb29yKChlLl92YWx1ZS02MCp0KjYwKS82MCksbz1NYXRoLnJvdW5kKGUuX3ZhbHVlLTYwKnQqNjAtNjAqbik7cmV0dXJuIHQrIjoiKygxMD5uPyIwIituOm4pKyI6IisoMTA+bz8iMCIrbzpvKX1mdW5jdGlvbiB1KGUpe3ZhciB0PWUuc3BsaXQoIjoiKSxuPTA7cmV0dXJuIDM9PT10Lmxlbmd0aD8obis9NjAqTnVtYmVyKHRbMF0pKjYwLG4rPTYwKk51bWJlcih0WzFdKSxuKz1OdW1iZXIodFsyXSkpOjI9PT10Lmxlbmd0aCYmKG4rPTYwKk51bWJlcih0WzBdKSxuKz1OdW1iZXIodFsxXSkpLE51bWJlcihuKX1mdW5jdGlvbiBjKGUsdCxuKXt2YXIgcixpLHMsbCxhLHUsYz0hMSxoPSExLGQ9ITEsZj0iIixwPSExLGc9ITEseT0hMSxiPSExLEM9ITEsXz0iIixSPSIiLFM9TWF0aC5hYnMoZSksRT1bIkIiLCJLQiIsIk1CIiwiR0IiLCJUQiIsIlBCIiwiRUIiLCJaQiIsIllCIl0sVD0iIixNPSExO2lmKDA9PT1lJiZudWxsIT09dilyZXR1cm4gdjtpZih0LmluZGV4T2YoIigiKT4tMT8oYz0hMCx0PXQuc2xpY2UoMSwtMSkpOnQuaW5kZXhPZigiKyIpPi0xJiYoaD0hMCx0PXQucmVwbGFjZSgvXCsvZywiIikpLHQuaW5kZXhPZigiYSIpPi0xJiYocD10LmluZGV4T2YoImFLIik+PTAsZz10LmluZGV4T2YoImFNIik+PTAseT10LmluZGV4T2YoImFCIik+PTAsYj10LmluZGV4T2YoImFUIik+PTAsQz1wfHxnfHx5fHxiLHQuaW5kZXhPZigiIGEiKT4tMT8oZj0iICIsdD10LnJlcGxhY2UoIiBhIiwiIikpOnQ9dC5yZXBsYWNlKCJhIiwiIiksUz49TWF0aC5wb3coMTAsMTIpJiYhQ3x8Yj8oZis9bVt3XS5hYmJyZXZpYXRpb25zLnRyaWxsaW9uLGUvPU1hdGgucG93KDEwLDEyKSk6UzxNYXRoLnBvdygxMCwxMikmJlM+PU1hdGgucG93KDEwLDkpJiYhQ3x8eT8oZis9bVt3XS5hYmJyZXZpYXRpb25zLmJpbGxpb24sZS89TWF0aC5wb3coMTAsOSkpOlM8TWF0aC5wb3coMTAsOSkmJlM+PU1hdGgucG93KDEwLDYpJiYhQ3x8Zz8oZis9bVt3XS5hYmJyZXZpYXRpb25zLm1pbGxpb24sZS89TWF0aC5wb3coMTAsNikpOihTPE1hdGgucG93KDEwLDYpJiZTPj1NYXRoLnBvdygxMCwzKSYmIUN8fHApJiYoZis9bVt3XS5hYmJyZXZpYXRpb25zLnRob3VzYW5kLGUvPU1hdGgucG93KDEwLDMpKSksdC5pbmRleE9mKCJiIik+LTEpZm9yKHQuaW5kZXhPZigiIGIiKT4tMT8oXz0iICIsdD10LnJlcGxhY2UoIiBiIiwiIikpOnQ9dC5yZXBsYWNlKCJiIiwiIikscz0wO3M8PUUubGVuZ3RoO3MrKylpZihyPU1hdGgucG93KDEwMjQscyksaT1NYXRoLnBvdygxMDI0LHMrMSksZT49ciYmaT5lKXtfKz1FW3NdLHI+MCYmKGUvPXIpO2JyZWFrfXJldHVybiB0LmluZGV4T2YoIm8iKT4tMSYmKHQuaW5kZXhPZigiIG8iKT4tMT8oUj0iICIsdD10LnJlcGxhY2UoIiBvIiwiIikpOnQ9dC5yZXBsYWNlKCJvIiwiIiksUis9bVt3XS5vcmRpbmFsKGUpKSx0LmluZGV4T2YoIlsuXSIpPi0xJiYoZD0hMCx0PXQucmVwbGFjZSgiWy5dIiwiLiIpKSxsPWUudG9TdHJpbmcoKS5zcGxpdCgiLiIpWzBdLGE9dC5zcGxpdCgiLiIpWzFdLHU9dC5pbmRleE9mKCIsIiksYT8oYS5pbmRleE9mKCJbIik+LTE/KGE9YS5yZXBsYWNlKCJdIiwiIiksYT1hLnNwbGl0KCJbIiksVD1vKGUsYVswXS5sZW5ndGgrYVsxXS5sZW5ndGgsbixhWzFdLmxlbmd0aCkpOlQ9byhlLGEubGVuZ3RoLG4pLGw9VC5zcGxpdCgiLiIpWzBdLFQ9VC5zcGxpdCgiLiIpWzFdLmxlbmd0aD9tW3ddLmRlbGltaXRlcnMuZGVjaW1hbCtULnNwbGl0KCIuIilbMV06IiIsZCYmMD09PU51bWJlcihULnNsaWNlKDEpKSYmKFQ9IiIpKTpsPW8oZSxudWxsLG4pLGwuaW5kZXhPZigiLSIpPi0xJiYobD1sLnNsaWNlKDEpLE09ITApLHU+LTEmJihsPWwudG9TdHJpbmcoKS5yZXBsYWNlKC8oXGQpKD89KFxkezN9KSsoPyFcZCkpL2csIiQxIittW3ddLmRlbGltaXRlcnMudGhvdXNhbmRzKSksMD09PXQuaW5kZXhPZigiLiIpJiYobD0iIiksKGMmJk0/IigiOiIiKSsoIWMmJk0/Ii0iOiIiKSsoIU0mJmg/IisiOiIiKStsK1QrKFI/UjoiIikrKGY/ZjoiIikrKF8/XzoiIikrKGMmJk0/IikiOiIiKX1mdW5jdGlvbiBoKGUsdCl7bVtlXT10fWZ1bmN0aW9uIGQoZSl7dmFyIHQ9ZS50b1N0cmluZygpLnNwbGl0KCIuIik7cmV0dXJuIHQubGVuZ3RoPDI/MTpNYXRoLnBvdygxMCx0WzFdLmxlbmd0aCl9ZnVuY3Rpb24gZigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZChlKSxvPWQodCk7cmV0dXJuIG4+bz9uOm99LC0oMS8wKSl9dmFyIHAsZz0iMS41LjMiLG09e30sdz0iZW4iLHY9bnVsbCx5PSIwLDAiLGI9InVuZGVmaW5lZCIhPXR5cGVvZiBuJiZuLmV4cG9ydHM7cD1mdW5jdGlvbihlKXtyZXR1cm4gcC5pc051bWVyYWwoZSk/ZT1lLnZhbHVlKCk6MD09PWV8fCJ1bmRlZmluZWQiPT10eXBlb2YgZT9lPTA6TnVtYmVyKGUpfHwoZT1wLmZuLnVuZm9ybWF0KGUpKSxuZXcgdChOdW1iZXIoZSkpfSxwLnZlcnNpb249ZyxwLmlzTnVtZXJhbD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHR9LHAubGFuZ3VhZ2U9ZnVuY3Rpb24oZSx0KXtpZighZSlyZXR1cm4gdztpZihlJiYhdCl7aWYoIW1bZV0pdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGxhbmd1YWdlIDogIitlKTt3PWV9cmV0dXJuIXQmJm1bZV18fGgoZSx0KSxwfSxwLmxhbmd1YWdlRGF0YT1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gbVt3XTtpZighbVtlXSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbGFuZ3VhZ2UgOiAiK2UpO3JldHVybiBtW2VdfSxwLmxhbmd1YWdlKCJlbiIse2RlbGltaXRlcnM6e3Rob3VzYW5kczoiLCIsZGVjaW1hbDoiLiJ9LGFiYnJldmlhdGlvbnM6e3Rob3VzYW5kOiJrIixtaWxsaW9uOiJtIixiaWxsaW9uOiJiIix0cmlsbGlvbjoidCJ9LG9yZGluYWw6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSUxMDtyZXR1cm4gMT09PX5+KGUlMTAwLzEwKT8idGgiOjE9PT10PyJzdCI6Mj09PXQ/Im5kIjozPT09dD8icmQiOiJ0aCJ9LGN1cnJlbmN5OntzeW1ib2w6IiQifX0pLHAuemVyb0Zvcm1hdD1mdW5jdGlvbihlKXt2PSJzdHJpbmciPT10eXBlb2YgZT9lOm51bGx9LHAuZGVmYXVsdEZvcm1hdD1mdW5jdGlvbihlKXt5PSJzdHJpbmciPT10eXBlb2YgZT9lOiIwLjAifSxwLnZhbGlkYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG4sbyxyLGkscyxsLGEsdTtpZigic3RyaW5nIiE9dHlwZW9mIGUmJihlKz0iIixjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybigiTnVtZXJhbC5qczogVmFsdWUgaXMgbm90IHN0cmluZy4gSXQgaGFzIGJlZW4gY28tZXJjZWQgdG86ICIsZSkpLGU9ZS50cmltKCksIiI9PT1lKXJldHVybiExO2U9ZS5yZXBsYWNlKC9eWystXT8vLCIiKTt0cnl7YT1wLmxhbmd1YWdlRGF0YSh0KX1jYXRjaChjKXthPXAubGFuZ3VhZ2VEYXRhKHAubGFuZ3VhZ2UoKSl9cmV0dXJuIHI9YS5jdXJyZW5jeS5zeW1ib2wscz1hLmFiYnJldmlhdGlvbnMsbj1hLmRlbGltaXRlcnMuZGVjaW1hbCxvPSIuIj09PWEuZGVsaW1pdGVycy50aG91c2FuZHM/IlxcLiI6YS5kZWxpbWl0ZXJzLnRob3VzYW5kcyx1PWUubWF0Y2goL15bXlxkXC5cLF0rLyksbnVsbCE9PXUmJihlPWUuc3Vic3RyKDEpLHVbMF0hPT1yKT8hMToodT1lLm1hdGNoKC9bXlxkXSskLyksbnVsbCE9PXUmJihlPWUuc2xpY2UoMCwtMSksdVswXSE9PXMudGhvdXNhbmQmJnVbMF0hPT1zLm1pbGxpb24mJnVbMF0hPT1zLmJpbGxpb24mJnVbMF0hPT1zLnRyaWxsaW9uKT8hMTplLm1hdGNoKC9eXGQrJC8pPyEwOihsPW5ldyBSZWdFeHAobysiezJ9IiksZS5tYXRjaCgvW15cZC4sXS9nKT8hMTooaT1lLnNwbGl0KG4pLGkubGVuZ3RoPjI/ITE6aS5sZW5ndGg8Mj8hIWlbMF0ubWF0Y2goL15cZCsuKlxkJC8pJiYhaVswXS5tYXRjaChsKToiIj09PWlbMF0/IWlbMF0ubWF0Y2gobCkmJiEhaVsxXS5tYXRjaCgvXlxkKyQvKToxPT09aVswXS5sZW5ndGg/ISFpWzBdLm1hdGNoKC9eXGQrJC8pJiYhaVswXS5tYXRjaChsKSYmISFpWzFdLm1hdGNoKC9eXGQrJC8pOiEhaVswXS5tYXRjaCgvXlxkKy4qXGQkLykmJiFpWzBdLm1hdGNoKGwpJiYhIWlbMV0ubWF0Y2goL15cZCskLykpKSl9LCJmdW5jdGlvbiIhPXR5cGVvZiBBcnJheS5wcm90b3R5cGUucmVkdWNlJiYoQXJyYXkucHJvdG90eXBlLnJlZHVjZT1mdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtpZihudWxsPT09dGhpc3x8InVuZGVmaW5lZCI9PXR5cGVvZiB0aGlzKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5LnByb3RvdHlwZS5yZWR1Y2UgY2FsbGVkIG9uIG51bGwgb3IgdW5kZWZpbmVkIik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihlKyIgaXMgbm90IGEgZnVuY3Rpb24iKTt2YXIgbixvLHI9dGhpcy5sZW5ndGg+Pj4wLGk9ITE7Zm9yKDE8YXJndW1lbnRzLmxlbmd0aCYmKG89dCxpPSEwKSxuPTA7cj5uOysrbil0aGlzLmhhc093blByb3BlcnR5KG4pJiYoaT9vPWUobyx0aGlzW25dLG4sdGhpcyk6KG89dGhpc1tuXSxpPSEwKSk7aWYoIWkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpO3JldHVybiBvfSkscC5mbj10LnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gcCh0aGlzKX0sZm9ybWF0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIodGhpcyxlP2U6eSx2b2lkIDAhPT10P3Q6TWF0aC5yb3VuZCl9LHVuZm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpP2U6aSh0aGlzLGU/ZTp5KX0sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmFsdWV9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmFsdWV9LHNldDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fdmFsdWU9TnVtYmVyKGUpLHRoaXN9LGFkZDpmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCxvLHIpe3JldHVybiBlK24qdH12YXIgbj1mLmNhbGwobnVsbCx0aGlzLl92YWx1ZSxlKTtyZXR1cm4gdGhpcy5fdmFsdWU9W3RoaXMuX3ZhbHVlLGVdLnJlZHVjZSh0LDApL24sdGhpc30sc3VidHJhY3Q6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQsbyxyKXtyZXR1cm4gZS1uKnR9dmFyIG49Zi5jYWxsKG51bGwsdGhpcy5fdmFsdWUsZSk7cmV0dXJuIHRoaXMuX3ZhbHVlPVtlXS5yZWR1Y2UodCx0aGlzLl92YWx1ZSpuKS9uLHRoaXN9LG11bHRpcGx5OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSx0LG4sbyl7dmFyIHI9ZihlLHQpO3JldHVybiBlKnIqKHQqcikvKHIqcil9cmV0dXJuIHRoaXMuX3ZhbHVlPVt0aGlzLl92YWx1ZSxlXS5yZWR1Y2UodCwxKSx0aGlzfSxkaXZpZGU6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQsbixvKXt2YXIgcj1mKGUsdCk7cmV0dXJuIGUqci8odCpyKX1yZXR1cm4gdGhpcy5fdmFsdWU9W3RoaXMuX3ZhbHVlLGVdLnJlZHVjZSh0KSx0aGlzfSxkaWZmZXJlbmNlOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFicyhwKHRoaXMuX3ZhbHVlKS5zdWJ0cmFjdChlKS52YWx1ZSgpKX19LGImJihuLmV4cG9ydHM9cCksInVuZGVmaW5lZCI9PXR5cGVvZiBlbmRlciYmKHRoaXMubnVtZXJhbD1wKSwiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5hbWQmJmUoW10sZnVuY3Rpb24oKXtyZXR1cm4gcH0pfSkuY2FsbCh3aW5kb3cpfSx7fV0scGlrYWRheTpbZnVuY3Rpb24odCxuLG8pey8qIQ0KICogUGlrYWRheQ0KICoNCiAqIENvcHlyaWdodCDCqSAyMDE0IERhdmlkIEJ1c2hlbGwgfCBCU0QgJiBNSVQgbGljZW5zZSB8IGh0dHBzOi8vZ2l0aHViLmNvbS9kYnVzaGVsbC9QaWthZGF5DQogKi8NCiFmdW5jdGlvbihyLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgcztpZigib2JqZWN0Ij09dHlwZW9mIG8pe3RyeXtzPXQoIm1vbWVudCIpfWNhdGNoKGwpe31uLmV4cG9ydHM9aShzKX1lbHNlImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuYW1kP2UoZnVuY3Rpb24oZSl7dmFyIHQ9Im1vbWVudCI7dHJ5e3M9ZSh0KX1jYXRjaChuKXt9cmV0dXJuIGkocyl9KTpyLlBpa2FkYXk9aShyLm1vbWVudCl9KHRoaXMsZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBlLG49ISF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcixvPXdpbmRvdy5kb2N1bWVudCxyPXdpbmRvdy5zZXRUaW1lb3V0LGk9ZnVuY3Rpb24oZSx0LG8scil7bj9lLmFkZEV2ZW50TGlzdGVuZXIodCxvLCEhcik6ZS5hdHRhY2hFdmVudCgib24iK3Qsbyl9LHM9ZnVuY3Rpb24oZSx0LG8scil7bj9lLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxvLCEhcik6ZS5kZXRhY2hFdmVudCgib24iK3Qsbyl9LGw9ZnVuY3Rpb24oZSx0LG4pe3ZhciByO28uY3JlYXRlRXZlbnQ/KHI9by5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpLHIuaW5pdEV2ZW50KHQsITAsITEpLHI9eShyLG4pLGUuZGlzcGF0Y2hFdmVudChyKSk6by5jcmVhdGVFdmVudE9iamVjdCYmKHI9by5jcmVhdGVFdmVudE9iamVjdCgpLHI9eShyLG4pLGUuZmlyZUV2ZW50KCJvbiIrdCxyKSl9LGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0sdT1mdW5jdGlvbihlLHQpe3JldHVybi0xIT09KCIgIitlLmNsYXNzTmFtZSsiICIpLmluZGV4T2YoIiAiK3QrIiAiKX0sYz1mdW5jdGlvbihlLHQpe3UoZSx0KXx8KGUuY2xhc3NOYW1lPSIiPT09ZS5jbGFzc05hbWU/dDplLmNsYXNzTmFtZSsiICIrdCl9LGg9ZnVuY3Rpb24oZSx0KXtlLmNsYXNzTmFtZT1hKCgiICIrZS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKCIgIit0KyIgIiwiICIpKX0sZD1mdW5jdGlvbihlKXtyZXR1cm4vQXJyYXkvLnRlc3QoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKX0sZj1mdW5jdGlvbihlKXtyZXR1cm4vRGF0ZS8udGVzdChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpJiYhaXNOYU4oZS5nZXRUaW1lKCkpfSxwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0RGF5KCk7cmV0dXJuIDA9PT10fHw2PT09dH0sZz1mdW5jdGlvbihlKXtyZXR1cm4gZSU0PT09MCYmZSUxMDAhPT0wfHxlJTQwMD09PTB9LG09ZnVuY3Rpb24oZSx0KXtyZXR1cm5bMzEsZyhlKT8yOToyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV1bdF19LHc9ZnVuY3Rpb24oZSl7ZihlKSYmZS5zZXRIb3VycygwLDAsMCwwKX0sdj1mdW5jdGlvbihlLHQpe3JldHVybiBlLmdldFRpbWUoKT09PXQuZ2V0VGltZSgpfSx5PWZ1bmN0aW9uKGUsdCxuKXt2YXIgbyxyO2ZvcihvIGluIHQpcj12b2lkIDAhPT1lW29dLHImJiJvYmplY3QiPT10eXBlb2YgdFtvXSYmbnVsbCE9PXRbb10mJnZvaWQgMD09PXRbb10ubm9kZU5hbWU/Zih0W29dKT9uJiYoZVtvXT1uZXcgRGF0ZSh0W29dLmdldFRpbWUoKSkpOmQodFtvXSk/biYmKGVbb109dFtvXS5zbGljZSgwKSk6ZVtvXT15KHt9LHRbb10sbik6IW4mJnJ8fChlW29dPXRbb10pO3JldHVybiBlfSxiPWZ1bmN0aW9uKGUpe3JldHVybiBlLm1vbnRoPDAmJihlLnllYXItPU1hdGguY2VpbChNYXRoLmFicyhlLm1vbnRoKS8xMiksZS5tb250aCs9MTIpLGUubW9udGg+MTEmJihlLnllYXIrPU1hdGguZmxvb3IoTWF0aC5hYnMoZS5tb250aCkvMTIpLGUubW9udGgtPTEyKSxlfSxDPXtmaWVsZDpudWxsLGJvdW5kOnZvaWQgMCxwb3NpdGlvbjoiYm90dG9tIGxlZnQiLHJlcG9zaXRpb246ITAsZm9ybWF0OiJZWVlZLU1NLUREIixkZWZhdWx0RGF0ZTpudWxsLHNldERlZmF1bHREYXRlOiExLGZpcnN0RGF5OjAsbWluRGF0ZTpudWxsLG1heERhdGU6bnVsbCx5ZWFyUmFuZ2U6MTAsc2hvd1dlZWtOdW1iZXI6ITEsbWluWWVhcjowLG1heFllYXI6OTk5OSxtaW5Nb250aDp2b2lkIDAsbWF4TW9udGg6dm9pZCAwLHN0YXJ0UmFuZ2U6bnVsbCxlbmRSYW5nZTpudWxsLGlzUlRMOiExLHllYXJTdWZmaXg6IiIsc2hvd01vbnRoQWZ0ZXJZZWFyOiExLG51bWJlck9mTW9udGhzOjEsbWFpbkNhbGVuZGFyOiJsZWZ0Iixjb250YWluZXI6dm9pZCAwLGkxOG46e3ByZXZpb3VzTW9udGg6IlByZXZpb3VzIE1vbnRoIixuZXh0TW9udGg6Ik5leHQgTW9udGgiLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sd2Vla2RheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHdlZWtkYXlzU2hvcnQ6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXX0sdGhlbWU6bnVsbCxvblNlbGVjdDpudWxsLG9uT3BlbjpudWxsLG9uQ2xvc2U6bnVsbCxvbkRyYXc6bnVsbH0sXz1mdW5jdGlvbihlLHQsbil7Zm9yKHQrPWUuZmlyc3REYXk7dD49NzspdC09NztyZXR1cm4gbj9lLmkxOG4ud2Vla2RheXNTaG9ydFt0XTplLmkxOG4ud2Vla2RheXNbdF19LFI9ZnVuY3Rpb24oZSl7aWYoZS5pc0VtcHR5KXJldHVybic8dGQgY2xhc3M9ImlzLWVtcHR5Ij48L3RkPic7dmFyIHQ9W107cmV0dXJuIGUuaXNEaXNhYmxlZCYmdC5wdXNoKCJpcy1kaXNhYmxlZCIpLGUuaXNUb2RheSYmdC5wdXNoKCJpcy10b2RheSIpLGUuaXNTZWxlY3RlZCYmdC5wdXNoKCJpcy1zZWxlY3RlZCIpLGUuaXNJblJhbmdlJiZ0LnB1c2goImlzLWlucmFuZ2UiKSxlLmlzU3RhcnRSYW5nZSYmdC5wdXNoKCJpcy1zdGFydHJhbmdlIiksZS5pc0VuZFJhbmdlJiZ0LnB1c2goImlzLWVuZHJhbmdlIiksJzx0ZCBkYXRhLWRheT0iJytlLmRheSsnIiBjbGFzcz0iJyt0LmpvaW4oIiAiKSsnIj48YnV0dG9uIGNsYXNzPSJwaWthLWJ1dHRvbiBwaWthLWRheSIgdHlwZT0iYnV0dG9uIiBkYXRhLXBpa2EteWVhcj0iJytlLnllYXIrJyIgZGF0YS1waWthLW1vbnRoPSInK2UubW9udGgrJyIgZGF0YS1waWthLWRheT0iJytlLmRheSsnIj4nK2UuZGF5KyI8L2J1dHRvbj48L3RkPiJ9LFM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPW5ldyBEYXRlKG4sMCwxKSxyPU1hdGguY2VpbCgoKG5ldyBEYXRlKG4sdCxlKS1vKS84NjRlNStvLmdldERheSgpKzEpLzcpO3JldHVybic8dGQgY2xhc3M9InBpa2Etd2VlayI+JytyKyI8L3RkPiJ9LEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4iPHRyPiIrKHQ/ZS5yZXZlcnNlKCk6ZSkuam9pbigiIikrIjwvdHI+In0sVD1mdW5jdGlvbihlKXtyZXR1cm4iPHRib2R5PiIrZS5qb2luKCIiKSsiPC90Ym9keT4ifSxNPWZ1bmN0aW9uKGUpe3ZhciB0LG49W107Zm9yKGUuc2hvd1dlZWtOdW1iZXImJm4ucHVzaCgiPHRoPjwvdGg+IiksdD0wOzc+dDt0Kyspbi5wdXNoKCc8dGggc2NvcGU9ImNvbCI+PGFiYnIgdGl0bGU9IicrXyhlLHQpKyciPicrXyhlLHQsITApKyI8L2FiYnI+PC90aD4iKTtyZXR1cm4iPHRoZWFkPiIrKGUuaXNSVEw/bi5yZXZlcnNlKCk6bikuam9pbigiIikrIjwvdGhlYWQ+In0sTz1mdW5jdGlvbihlLHQsbixvLHIpe3ZhciBpLHMsbCxhLHUsYz1lLl9vLGg9bj09PWMubWluWWVhcixmPW49PT1jLm1heFllYXIscD0nPGRpdiBjbGFzcz0icGlrYS10aXRsZSI+JyxnPSEwLG09ITA7Zm9yKGw9W10saT0wOzEyPmk7aSsrKWwucHVzaCgnPG9wdGlvbiB2YWx1ZT0iJysobj09PXI/aS10OjEyK2ktdCkrJyInKyhpPT09bz8iIHNlbGVjdGVkIjoiIikrKGgmJmk8Yy5taW5Nb250aHx8ZiYmaT5jLm1heE1vbnRoPyJkaXNhYmxlZCI6IiIpKyI+IitjLmkxOG4ubW9udGhzW2ldKyI8L29wdGlvbj4iKTtmb3IoYT0nPGRpdiBjbGFzcz0icGlrYS1sYWJlbCI+JytjLmkxOG4ubW9udGhzW29dKyc8c2VsZWN0IGNsYXNzPSJwaWthLXNlbGVjdCBwaWthLXNlbGVjdC1tb250aCIgdGFiaW5kZXg9Ii0xIj4nK2wuam9pbigiIikrIjwvc2VsZWN0PjwvZGl2PiIsZChjLnllYXJSYW5nZSk/KGk9Yy55ZWFyUmFuZ2VbMF0scz1jLnllYXJSYW5nZVsxXSsxKTooaT1uLWMueWVhclJhbmdlLHM9MStuK2MueWVhclJhbmdlKSxsPVtdO3M+aSYmaTw9Yy5tYXhZZWFyO2krKylpPj1jLm1pblllYXImJmwucHVzaCgnPG9wdGlvbiB2YWx1ZT0iJytpKyciJysoaT09PW4/IiBzZWxlY3RlZCI6IiIpKyI+IitpKyI8L29wdGlvbj4iKTtyZXR1cm4gdT0nPGRpdiBjbGFzcz0icGlrYS1sYWJlbCI+JytuK2MueWVhclN1ZmZpeCsnPHNlbGVjdCBjbGFzcz0icGlrYS1zZWxlY3QgcGlrYS1zZWxlY3QteWVhciIgdGFiaW5kZXg9Ii0xIj4nK2wuam9pbigiIikrIjwvc2VsZWN0PjwvZGl2PiIscCs9Yy5zaG93TW9udGhBZnRlclllYXI/dSthOmErdSxoJiYoMD09PW98fGMubWluTW9udGg+PW8pJiYoZz0hMSksZiYmKDExPT09b3x8Yy5tYXhNb250aDw9bykmJihtPSExKSwwPT09dCYmKHArPSc8YnV0dG9uIGNsYXNzPSJwaWthLXByZXYnKyhnPyIiOiIgaXMtZGlzYWJsZWQiKSsnIiB0eXBlPSJidXR0b24iPicrYy5pMThuLnByZXZpb3VzTW9udGgrIjwvYnV0dG9uPiIpLHQ9PT1lLl9vLm51bWJlck9mTW9udGhzLTEmJihwKz0nPGJ1dHRvbiBjbGFzcz0icGlrYS1uZXh0JysobT8iIjoiIGlzLWRpc2FibGVkIikrJyIgdHlwZT0iYnV0dG9uIj4nK2MuaTE4bi5uZXh0TW9udGgrIjwvYnV0dG9uPiIpLHArPSI8L2Rpdj4ifSxrPWZ1bmN0aW9uKGUsdCl7cmV0dXJuJzx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwaWthLXRhYmxlIj4nK00oZSkrVCh0KSsiPC90YWJsZT4ifSxIPWZ1bmN0aW9uKHMpe3ZhciBsPXRoaXMsYT1sLmNvbmZpZyhzKTtsLl9vbk1vdXNlRG93bj1mdW5jdGlvbihlKXtpZihsLl92KXtlPWV8fHdpbmRvdy5ldmVudDt2YXIgdD1lLnRhcmdldHx8ZS5zcmNFbGVtZW50O2lmKHQpaWYodSh0LCJpcy1kaXNhYmxlZCIpfHwodSh0LCJwaWthLWJ1dHRvbiIpJiYhdSh0LCJpcy1lbXB0eSIpPyhsLnNldERhdGUobmV3IERhdGUodC5nZXRBdHRyaWJ1dGUoImRhdGEtcGlrYS15ZWFyIiksdC5nZXRBdHRyaWJ1dGUoImRhdGEtcGlrYS1tb250aCIpLHQuZ2V0QXR0cmlidXRlKCJkYXRhLXBpa2EtZGF5IikpKSxhLmJvdW5kJiZyKGZ1bmN0aW9uKCl7bC5oaWRlKCksYS5maWVsZCYmYS5maWVsZC5ibHVyKCl9LDEwMCkpOnUodCwicGlrYS1wcmV2Iik/bC5wcmV2TW9udGgoKTp1KHQsInBpa2EtbmV4dCIpJiZsLm5leHRNb250aCgpKSx1KHQsInBpa2Etc2VsZWN0IikpbC5fYz0hMDtlbHNle2lmKCFlLnByZXZlbnREZWZhdWx0KXJldHVybiBlLnJldHVyblZhbHVlPSExLCExO2UucHJldmVudERlZmF1bHQoKX19fSxsLl9vbkNoYW5nZT1mdW5jdGlvbihlKXtlPWV8fHdpbmRvdy5ldmVudDt2YXIgdD1lLnRhcmdldHx8ZS5zcmNFbGVtZW50O3QmJih1KHQsInBpa2Etc2VsZWN0LW1vbnRoIik/bC5nb3RvTW9udGgodC52YWx1ZSk6dSh0LCJwaWthLXNlbGVjdC15ZWFyIikmJmwuZ290b1llYXIodC52YWx1ZSkpfSxsLl9vbklucHV0Q2hhbmdlPWZ1bmN0aW9uKG4pe3ZhciBvO24uZmlyZWRCeSE9PWwmJih0PyhvPWUoYS5maWVsZC52YWx1ZSxhLmZvcm1hdCksbz1vJiZvLmlzVmFsaWQoKT9vLnRvRGF0ZSgpOm51bGwpOm89bmV3IERhdGUoRGF0ZS5wYXJzZShhLmZpZWxkLnZhbHVlKSksZihvKSYmbC5zZXREYXRlKG8pLGwuX3Z8fGwuc2hvdygpKX0sbC5fb25JbnB1dEZvY3VzPWZ1bmN0aW9uKCl7bC5zaG93KCl9LGwuX29uSW5wdXRDbGljaz1mdW5jdGlvbigpe2wuc2hvdygpfSxsLl9vbklucHV0Qmx1cj1mdW5jdGlvbigpe3ZhciBlPW8uYWN0aXZlRWxlbWVudDtkbyBpZih1KGUsInBpa2Etc2luZ2xlIikpcmV0dXJuO3doaWxlKGU9ZS5wYXJlbnROb2RlKTtsLl9jfHwobC5fYj1yKGZ1bmN0aW9uKCl7bC5oaWRlKCl9LDUwKSksbC5fYz0hMX0sbC5fb25DbGljaz1mdW5jdGlvbihlKXtlPWV8fHdpbmRvdy5ldmVudDt2YXIgdD1lLnRhcmdldHx8ZS5zcmNFbGVtZW50LG89dDtpZih0KXshbiYmdSh0LCJwaWthLXNlbGVjdCIpJiYodC5vbmNoYW5nZXx8KHQuc2V0QXR0cmlidXRlKCJvbmNoYW5nZSIsInJldHVybjsiKSxpKHQsImNoYW5nZSIsbC5fb25DaGFuZ2UpKSk7ZG8gaWYodShvLCJwaWthLXNpbmdsZSIpfHxvPT09YS50cmlnZ2VyKXJldHVybjt3aGlsZShvPW8ucGFyZW50Tm9kZSk7bC5fdiYmdCE9PWEudHJpZ2dlciYmbyE9PWEudHJpZ2dlciYmbC5oaWRlKCl9fSxsLmVsPW8uY3JlYXRlRWxlbWVudCgiZGl2IiksbC5lbC5jbGFzc05hbWU9InBpa2Etc2luZ2xlIisoYS5pc1JUTD8iIGlzLXJ0bCI6IiIpKyhhLnRoZW1lPyIgIithLnRoZW1lOiIiKSxpKGwuZWwsIm1vdXNlZG93biIsbC5fb25Nb3VzZURvd24sITApLGkobC5lbCwidG91Y2hlbmQiLGwuX29uTW91c2VEb3duLCEwKSxpKGwuZWwsImNoYW5nZSIsbC5fb25DaGFuZ2UpLGEuZmllbGQmJihhLmNvbnRhaW5lcj9hLmNvbnRhaW5lci5hcHBlbmRDaGlsZChsLmVsKTphLmJvdW5kP28uYm9keS5hcHBlbmRDaGlsZChsLmVsKTphLmZpZWxkLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGwuZWwsYS5maWVsZC5uZXh0U2libGluZyksaShhLmZpZWxkLCJjaGFuZ2UiLGwuX29uSW5wdXRDaGFuZ2UpLGEuZGVmYXVsdERhdGV8fCh0JiZhLmZpZWxkLnZhbHVlP2EuZGVmYXVsdERhdGU9ZShhLmZpZWxkLnZhbHVlLGEuZm9ybWF0KS50b0RhdGUoKTphLmRlZmF1bHREYXRlPW5ldyBEYXRlKERhdGUucGFyc2UoYS5maWVsZC52YWx1ZSkpLGEuc2V0RGVmYXVsdERhdGU9ITApKTt2YXIgYz1hLmRlZmF1bHREYXRlO2YoYyk/YS5zZXREZWZhdWx0RGF0ZT9sLnNldERhdGUoYywhMCk6bC5nb3RvRGF0ZShjKTpsLmdvdG9EYXRlKG5ldyBEYXRlKSxhLmJvdW5kPyh0aGlzLmhpZGUoKSxsLmVsLmNsYXNzTmFtZSs9IiBpcy1ib3VuZCIsaShhLnRyaWdnZXIsImNsaWNrIixsLl9vbklucHV0Q2xpY2spLGkoYS50cmlnZ2VyLCJmb2N1cyIsbC5fb25JbnB1dEZvY3VzKSxpKGEudHJpZ2dlciwiYmx1ciIsbC5fb25JbnB1dEJsdXIpKTp0aGlzLnNob3coKX07cmV0dXJuIEgucHJvdG90eXBlPXtjb25maWc6ZnVuY3Rpb24oZSl7dGhpcy5fb3x8KHRoaXMuX289eSh7fSxDLCEwKSk7dmFyIHQ9eSh0aGlzLl9vLGUsITApO3QuaXNSVEw9ISF0LmlzUlRMLHQuZmllbGQ9dC5maWVsZCYmdC5maWVsZC5ub2RlTmFtZT90LmZpZWxkOm51bGwsdC50aGVtZT0ic3RyaW5nIj09dHlwZW9mIHQudGhlbWUmJnQudGhlbWU/dC50aGVtZTpudWxsLHQuYm91bmQ9ISEodm9pZCAwIT09dC5ib3VuZD90LmZpZWxkJiZ0LmJvdW5kOnQuZmllbGQpLHQudHJpZ2dlcj10LnRyaWdnZXImJnQudHJpZ2dlci5ub2RlTmFtZT90LnRyaWdnZXI6dC5maWVsZCx0LmRpc2FibGVXZWVrZW5kcz0hIXQuZGlzYWJsZVdlZWtlbmRzLHQuZGlzYWJsZURheUZuPSJmdW5jdGlvbiI9PXR5cGVvZiB0LmRpc2FibGVEYXlGbj90LmRpc2FibGVEYXlGbjpudWxsO3ZhciBuPXBhcnNlSW50KHQubnVtYmVyT2ZNb250aHMsMTApfHwxO2lmKHQubnVtYmVyT2ZNb250aHM9bj40PzQ6bixmKHQubWluRGF0ZSl8fCh0Lm1pbkRhdGU9ITEpLGYodC5tYXhEYXRlKXx8KHQubWF4RGF0ZT0hMSksdC5taW5EYXRlJiZ0Lm1heERhdGUmJnQubWF4RGF0ZTx0Lm1pbkRhdGUmJih0Lm1heERhdGU9dC5taW5EYXRlPSExKSx0Lm1pbkRhdGUmJnRoaXMuc2V0TWluRGF0ZSh0Lm1pbkRhdGUpLHQubWF4RGF0ZSYmdGhpcy5zZXRNYXhEYXRlKHQubWF4RGF0ZSksZCh0LnllYXJSYW5nZSkpe3ZhciBvPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKS0xMDt0LnllYXJSYW5nZVswXT1wYXJzZUludCh0LnllYXJSYW5nZVswXSwxMCl8fG8sdC55ZWFyUmFuZ2VbMV09cGFyc2VJbnQodC55ZWFyUmFuZ2VbMV0sMTApfHxvfWVsc2UgdC55ZWFyUmFuZ2U9TWF0aC5hYnMocGFyc2VJbnQodC55ZWFyUmFuZ2UsMTApKXx8Qy55ZWFyUmFuZ2UsdC55ZWFyUmFuZ2U+MTAwJiYodC55ZWFyUmFuZ2U9MTAwKTtyZXR1cm4gdH0sdG9TdHJpbmc6ZnVuY3Rpb24obil7cmV0dXJuIGYodGhpcy5fZCk/dD9lKHRoaXMuX2QpLmZvcm1hdChufHx0aGlzLl9vLmZvcm1hdCk6dGhpcy5fZC50b0RhdGVTdHJpbmcoKToiIn0sZ2V0TW9tZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHQ/ZSh0aGlzLl9kKTpudWxsfSxzZXRNb21lbnQ6ZnVuY3Rpb24obixvKXt0JiZlLmlzTW9tZW50KG4pJiZ0aGlzLnNldERhdGUobi50b0RhdGUoKSxvKX0sZ2V0RGF0ZTpmdW5jdGlvbigpe3JldHVybiBmKHRoaXMuX2QpP25ldyBEYXRlKHRoaXMuX2QuZ2V0VGltZSgpKTpudWxsfSxzZXREYXRlOmZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuIHRoaXMuX2Q9bnVsbCx0aGlzLl9vLmZpZWxkJiYodGhpcy5fby5maWVsZC52YWx1ZT0iIixsKHRoaXMuX28uZmllbGQsImNoYW5nZSIse2ZpcmVkQnk6dGhpc30pKSx0aGlzLmRyYXcoKTtpZigic3RyaW5nIj09dHlwZW9mIGUmJihlPW5ldyBEYXRlKERhdGUucGFyc2UoZSkpKSxmKGUpKXt2YXIgbj10aGlzLl9vLm1pbkRhdGUsbz10aGlzLl9vLm1heERhdGU7ZihuKSYmbj5lP2U9bjpmKG8pJiZlPm8mJihlPW8pLHRoaXMuX2Q9bmV3IERhdGUoZS5nZXRUaW1lKCkpLHcodGhpcy5fZCksdGhpcy5nb3RvRGF0ZSh0aGlzLl9kKSx0aGlzLl9vLmZpZWxkJiYodGhpcy5fby5maWVsZC52YWx1ZT10aGlzLnRvU3RyaW5nKCksbCh0aGlzLl9vLmZpZWxkLCJjaGFuZ2UiLHtmaXJlZEJ5OnRoaXN9KSksdHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXMuX28ub25TZWxlY3R8fHRoaXMuX28ub25TZWxlY3QuY2FsbCh0aGlzLHRoaXMuZ2V0RGF0ZSgpKX19LGdvdG9EYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PSEwO2lmKGYoZSkpe2lmKHRoaXMuY2FsZW5kYXJzKXt2YXIgbj1uZXcgRGF0ZSh0aGlzLmNhbGVuZGFyc1swXS55ZWFyLHRoaXMuY2FsZW5kYXJzWzBdLm1vbnRoLDEpLG89bmV3IERhdGUodGhpcy5jYWxlbmRhcnNbdGhpcy5jYWxlbmRhcnMubGVuZ3RoLTFdLnllYXIsdGhpcy5jYWxlbmRhcnNbdGhpcy5jYWxlbmRhcnMubGVuZ3RoLTFdLm1vbnRoLDEpLHI9ZS5nZXRUaW1lKCk7by5zZXRNb250aChvLmdldE1vbnRoKCkrMSksby5zZXREYXRlKG8uZ2V0RGF0ZSgpLTEpLHQ9cjxuLmdldFRpbWUoKXx8by5nZXRUaW1lKCk8cn10JiYodGhpcy5jYWxlbmRhcnM9W3ttb250aDplLmdldE1vbnRoKCkseWVhcjplLmdldEZ1bGxZZWFyKCl9XSwicmlnaHQiPT09dGhpcy5fby5tYWluQ2FsZW5kYXImJih0aGlzLmNhbGVuZGFyc1swXS5tb250aCs9MS10aGlzLl9vLm51bWJlck9mTW9udGhzKSksdGhpcy5hZGp1c3RDYWxlbmRhcnMoKX19LGFkanVzdENhbGVuZGFyczpmdW5jdGlvbigpe3RoaXMuY2FsZW5kYXJzWzBdPWIodGhpcy5jYWxlbmRhcnNbMF0pO2Zvcih2YXIgZT0xO2U8dGhpcy5fby5udW1iZXJPZk1vbnRocztlKyspdGhpcy5jYWxlbmRhcnNbZV09Yih7bW9udGg6dGhpcy5jYWxlbmRhcnNbMF0ubW9udGgrZSx5ZWFyOnRoaXMuY2FsZW5kYXJzWzBdLnllYXJ9KTt0aGlzLmRyYXcoKX0sZ290b1RvZGF5OmZ1bmN0aW9uKCl7dGhpcy5nb3RvRGF0ZShuZXcgRGF0ZSl9LGdvdG9Nb250aDpmdW5jdGlvbihlKXtpc05hTihlKXx8KHRoaXMuY2FsZW5kYXJzWzBdLm1vbnRoPXBhcnNlSW50KGUsMTApLHRoaXMuYWRqdXN0Q2FsZW5kYXJzKCkpfSxuZXh0TW9udGg6ZnVuY3Rpb24oKXt0aGlzLmNhbGVuZGFyc1swXS5tb250aCsrLHRoaXMuYWRqdXN0Q2FsZW5kYXJzKCl9LHByZXZNb250aDpmdW5jdGlvbigpe3RoaXMuY2FsZW5kYXJzWzBdLm1vbnRoLS0sdGhpcy5hZGp1c3RDYWxlbmRhcnMoKX0sZ290b1llYXI6ZnVuY3Rpb24oZSl7aXNOYU4oZSl8fCh0aGlzLmNhbGVuZGFyc1swXS55ZWFyPXBhcnNlSW50KGUsMTApLHRoaXMuYWRqdXN0Q2FsZW5kYXJzKCkpfSxzZXRNaW5EYXRlOmZ1bmN0aW9uKGUpe3coZSksdGhpcy5fby5taW5EYXRlPWUsdGhpcy5fby5taW5ZZWFyPWUuZ2V0RnVsbFllYXIoKSx0aGlzLl9vLm1pbk1vbnRoPWUuZ2V0TW9udGgoKSx0aGlzLmRyYXcoKX0sc2V0TWF4RGF0ZTpmdW5jdGlvbihlKXt3KGUpLHRoaXMuX28ubWF4RGF0ZT1lLHRoaXMuX28ubWF4WWVhcj1lLmdldEZ1bGxZZWFyKCksdGhpcy5fby5tYXhNb250aD1lLmdldE1vbnRoKCksdGhpcy5kcmF3KCl9LHNldFN0YXJ0UmFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5fby5zdGFydFJhbmdlPWV9LHNldEVuZFJhbmdlOmZ1bmN0aW9uKGUpe3RoaXMuX28uZW5kUmFuZ2U9ZX0sZHJhdzpmdW5jdGlvbihlKXtpZih0aGlzLl92fHxlKXt2YXIgdD10aGlzLl9vLG49dC5taW5ZZWFyLG89dC5tYXhZZWFyLGk9dC5taW5Nb250aCxzPXQubWF4TW9udGgsbD0iIjt0aGlzLl95PD1uJiYodGhpcy5feT1uLCFpc05hTihpKSYmdGhpcy5fbTxpJiYodGhpcy5fbT1pKSksdGhpcy5feT49byYmKHRoaXMuX3k9bywhaXNOYU4ocykmJnRoaXMuX20+cyYmKHRoaXMuX209cykpO2Zvcih2YXIgYT0wO2E8dC5udW1iZXJPZk1vbnRoczthKyspbCs9JzxkaXYgY2xhc3M9InBpa2EtbGVuZGFyIj4nK08odGhpcyxhLHRoaXMuY2FsZW5kYXJzW2FdLnllYXIsdGhpcy5jYWxlbmRhcnNbYV0ubW9udGgsdGhpcy5jYWxlbmRhcnNbMF0ueWVhcikrdGhpcy5yZW5kZXIodGhpcy5jYWxlbmRhcnNbYV0ueWVhcix0aGlzLmNhbGVuZGFyc1thXS5tb250aCkrIjwvZGl2PiI7aWYodGhpcy5lbC5pbm5lckhUTUw9bCx0LmJvdW5kJiYiaGlkZGVuIiE9PXQuZmllbGQudHlwZSYmcihmdW5jdGlvbigpe3QudHJpZ2dlci5mb2N1cygpfSwxKSwiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fby5vbkRyYXcpe3ZhciB1PXRoaXM7cihmdW5jdGlvbigpe3UuX28ub25EcmF3LmNhbGwodSl9LDApfX19LGFkanVzdFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxzLGwsYSx1LGM7aWYoIXRoaXMuX28uY29udGFpbmVyKXtpZih0aGlzLmVsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZT10aGlzLl9vLnRyaWdnZXIsdD1lLG49dGhpcy5lbC5vZmZzZXRXaWR0aCxyPXRoaXMuZWwub2Zmc2V0SGVpZ2h0LGk9d2luZG93LmlubmVyV2lkdGh8fG8uZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLHM9d2luZG93LmlubmVySGVpZ2h0fHxvLmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsbD13aW5kb3cucGFnZVlPZmZzZXR8fG8uYm9keS5zY3JvbGxUb3B8fG8uZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpYz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9Yy5sZWZ0K3dpbmRvdy5wYWdlWE9mZnNldCx1PWMuYm90dG9tK3dpbmRvdy5wYWdlWU9mZnNldDtlbHNlIGZvcihhPXQub2Zmc2V0TGVmdCx1PXQub2Zmc2V0VG9wK3Qub2Zmc2V0SGVpZ2h0O3Q9dC5vZmZzZXRQYXJlbnQ7KWErPXQub2Zmc2V0TGVmdCx1Kz10Lm9mZnNldFRvcDsodGhpcy5fby5yZXBvc2l0aW9uJiZhK24+aXx8dGhpcy5fby5wb3NpdGlvbi5pbmRleE9mKCJyaWdodCIpPi0xJiZhLW4rZS5vZmZzZXRXaWR0aD4wKSYmKGE9YS1uK2Uub2Zmc2V0V2lkdGgpLCh0aGlzLl9vLnJlcG9zaXRpb24mJnUrcj5zK2x8fHRoaXMuX28ucG9zaXRpb24uaW5kZXhPZigidG9wIik+LTEmJnUtci1lLm9mZnNldEhlaWdodD4wKSYmKHU9dS1yLWUub2Zmc2V0SGVpZ2h0KSx0aGlzLmVsLnN0eWxlLmxlZnQ9YSsicHgiLHRoaXMuZWwuc3R5bGUudG9wPXUrInB4In19LHJlbmRlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX28sbz1uZXcgRGF0ZSxyPW0oZSx0KSxpPW5ldyBEYXRlKGUsdCwxKS5nZXREYXkoKSxzPVtdLGw9W107dyhvKSxuLmZpcnN0RGF5PjAmJihpLT1uLmZpcnN0RGF5LDA+aSYmKGkrPTcpKTtmb3IodmFyIGE9citpLHU9YTt1Pjc7KXUtPTc7YSs9Ny11O2Zvcih2YXIgYz0wLGg9MDthPmM7YysrKXt2YXIgZD1uZXcgRGF0ZShlLHQsMSsoYy1pKSksZz1mKHRoaXMuX2QpP3YoZCx0aGlzLl9kKTohMSx5PXYoZCxvKSxiPWk+Y3x8Yz49citpLEM9bi5zdGFydFJhbmdlJiZ2KG4uc3RhcnRSYW5nZSxkKSxfPW4uZW5kUmFuZ2UmJnYobi5lbmRSYW5nZSxkKSxUPW4uc3RhcnRSYW5nZSYmbi5lbmRSYW5nZSYmbi5zdGFydFJhbmdlPGQmJmQ8bi5lbmRSYW5nZSxNPW4ubWluRGF0ZSYmZDxuLm1pbkRhdGV8fG4ubWF4RGF0ZSYmZD5uLm1heERhdGV8fG4uZGlzYWJsZVdlZWtlbmRzJiZwKGQpfHxuLmRpc2FibGVEYXlGbiYmbi5kaXNhYmxlRGF5Rm4oZCksTz17ZGF5OjErKGMtaSksbW9udGg6dCx5ZWFyOmUsaXNTZWxlY3RlZDpnLGlzVG9kYXk6eSxpc0Rpc2FibGVkOk0saXNFbXB0eTpiLGlzU3RhcnRSYW5nZTpDLGlzRW5kUmFuZ2U6Xyxpc0luUmFuZ2U6VH07bC5wdXNoKFIoTykpLDc9PT0rK2gmJihuLnNob3dXZWVrTnVtYmVyJiZsLnVuc2hpZnQoUyhjLWksdCxlKSkscy5wdXNoKEUobCxuLmlzUlRMKSksbD1bXSxoPTApfXJldHVybiBrKG4scyl9LGlzVmlzaWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92fSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5fdnx8KGgodGhpcy5lbCwiaXMtaGlkZGVuIiksdGhpcy5fdj0hMCx0aGlzLmRyYXcoKSx0aGlzLl9vLmJvdW5kJiYoaShvLCJjbGljayIsdGhpcy5fb25DbGljayksdGhpcy5hZGp1c3RQb3NpdGlvbigpKSwiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fby5vbk9wZW4mJnRoaXMuX28ub25PcGVuLmNhbGwodGhpcykpfSxoaWRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fdjtlIT09ITEmJih0aGlzLl9vLmJvdW5kJiZzKG8sImNsaWNrIix0aGlzLl9vbkNsaWNrKSx0aGlzLmVsLnN0eWxlLnBvc2l0aW9uPSJzdGF0aWMiLHRoaXMuZWwuc3R5bGUubGVmdD0iYXV0byIsdGhpcy5lbC5zdHlsZS50b3A9ImF1dG8iLGModGhpcy5lbCwiaXMtaGlkZGVuIiksdGhpcy5fdj0hMSx2b2lkIDAhPT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fby5vbkNsb3NlJiZ0aGlzLl9vLm9uQ2xvc2UuY2FsbCh0aGlzKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmhpZGUoKSxzKHRoaXMuZWwsIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZURvd24sITApLHModGhpcy5lbCwidG91Y2hlbmQiLHRoaXMuX29uTW91c2VEb3duLCEwKSxzKHRoaXMuZWwsImNoYW5nZSIsdGhpcy5fb25DaGFuZ2UpLHRoaXMuX28uZmllbGQmJihzKHRoaXMuX28uZmllbGQsImNoYW5nZSIsdGhpcy5fb25JbnB1dENoYW5nZSksdGhpcy5fby5ib3VuZCYmKHModGhpcy5fby50cmlnZ2VyLCJjbGljayIsdGhpcy5fb25JbnB1dENsaWNrKSxzKHRoaXMuX28udHJpZ2dlciwiZm9jdXMiLHRoaXMuX29uSW5wdXRGb2N1cykscyh0aGlzLl9vLnRyaWdnZXIsImJsdXIiLHRoaXMuX29uSW5wdXRCbHVyKSkpLHRoaXMuZWwucGFyZW50Tm9kZSYmdGhpcy5lbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWwpfX0sSH0pfSx7bW9tZW50OiJtb21lbnQifV0semVyb2NsaXBib2FyZDpbZnVuY3Rpb24odCxuLG8pey8qIQ0KICogWmVyb0NsaXBib2FyZA0KICogVGhlIFplcm9DbGlwYm9hcmQgbGlicmFyeSBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBjb3B5IHRleHQgdG8gdGhlIGNsaXBib2FyZCB1c2luZyBhbiBpbnZpc2libGUgQWRvYmUgRmxhc2ggbW92aWUgYW5kIGEgSmF2YVNjcmlwdCBpbnRlcmZhY2UuDQogKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNCBKb24gUm9oYW4sIEphbWVzIE0uIEdyZWVuZQ0KICogTGljZW5zZWQgTUlUDQogKiBodHRwOi8vemVyb2NsaXBib2FyZC5vcmcvDQogKiB2Mi4yLjANCiAqLw0KIWZ1bmN0aW9uKHQsbyl7InVzZSBzdHJpY3QiO3ZhciByLGkscyxsPXQsYT1sLmRvY3VtZW50LHU9bC5uYXZpZ2F0b3IsYz1sLnNldFRpbWVvdXQsaD1sLmNsZWFyVGltZW91dCxkPWwuc2V0SW50ZXJ2YWwsZj1sLmNsZWFySW50ZXJ2YWwscD1sLmdldENvbXB1dGVkU3R5bGUsZz1sLmVuY29kZVVSSUNvbXBvbmVudCxtPWwuQWN0aXZlWE9iamVjdCx3PWwuRXJyb3Isdj1sLk51bWJlci5wYXJzZUludHx8bC5wYXJzZUludCx5PWwuTnVtYmVyLnBhcnNlRmxvYXR8fGwucGFyc2VGbG9hdCxiPWwuTnVtYmVyLmlzTmFOfHxsLmlzTmFOLEM9bC5EYXRlLm5vdyxfPWwuT2JqZWN0LmtleXMsUj1sLk9iamVjdC5kZWZpbmVQcm9wZXJ0eSxTPWwuT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxFPWwuQXJyYXkucHJvdG90eXBlLnNsaWNlLFQ9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbihlKXtyZXR1cm4gZX07aWYoImZ1bmN0aW9uIj09dHlwZW9mIGwud3JhcCYmImZ1bmN0aW9uIj09dHlwZW9mIGwudW53cmFwKXRyeXt2YXIgdD1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG49bC51bndyYXAodCk7MT09PXQubm9kZVR5cGUmJm4mJjE9PT1uLm5vZGVUeXBlJiYoZT1sLnVud3JhcCl9Y2F0Y2gobyl7fXJldHVybiBlfSgpLE09ZnVuY3Rpb24oZSl7cmV0dXJuIEUuY2FsbChlLDApfSxPPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxzLGw9TShhcmd1bWVudHMpLGE9bFswXXx8e307Zm9yKGU9MSx0PWwubGVuZ3RoO3Q+ZTtlKyspaWYobnVsbCE9KG49bFtlXSkpZm9yKHIgaW4gbilTLmNhbGwobixyKSYmKGk9YVtyXSxzPW5bcl0sYSE9PXMmJnMhPT1vJiYoYVtyXT1zKSk7cmV0dXJuIGF9LGs9ZnVuY3Rpb24oZSl7dmFyIHQsbixvLHI7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT1lfHwibnVtYmVyIj09dHlwZW9mIGUubm9kZVR5cGUpdD1lO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlLmxlbmd0aClmb3IodD1bXSxuPTAsbz1lLmxlbmd0aDtvPm47bisrKVMuY2FsbChlLG4pJiYodFtuXT1rKGVbbl0pKTtlbHNle3Q9e307Zm9yKHIgaW4gZSlTLmNhbGwoZSxyKSYmKHRbcl09ayhlW3JdKSl9cmV0dXJuIHR9LEg9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49e30sbz0wLHI9dC5sZW5ndGg7cj5vO28rKyl0W29daW4gZSYmKG5bdFtvXV09ZVt0W29dXSk7cmV0dXJuIG59LEQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtmb3IodmFyIG8gaW4gZSktMT09PXQuaW5kZXhPZihvKSYmKG5bb109ZVtvXSk7cmV0dXJuIG59LEE9ZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIHQgaW4gZSlTLmNhbGwoZSx0KSYmZGVsZXRlIGVbdF07cmV0dXJuIGV9LHg9ZnVuY3Rpb24oZSx0KXtpZihlJiYxPT09ZS5ub2RlVHlwZSYmZS5vd25lckRvY3VtZW50JiZ0JiYoMT09PXQubm9kZVR5cGUmJnQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50PT09ZS5vd25lckRvY3VtZW50fHw5PT09dC5ub2RlVHlwZSYmIXQub3duZXJEb2N1bWVudCYmdD09PWUub3duZXJEb2N1bWVudCkpZG97aWYoZT09PXQpcmV0dXJuITA7ZT1lLnBhcmVudE5vZGV9d2hpbGUoZSk7cmV0dXJuITF9LFA9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiZlJiYodD1lLnNwbGl0KCIjIilbMF0uc3BsaXQoIj8iKVswXSx0PWUuc2xpY2UoMCxlLmxhc3RJbmRleE9mKCIvIikrMSkpLHR9LE49ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJmUmJihuPWUubWF0Y2goL14oPzp8W146QF0qQHwuK1wpQCg/PWh0dHBbc10/fGZpbGUpfC4rP1xzKyg/OiBhdCB8QCkoPzpbXjpcKF0rICkqW1woXT8pKCg/Omh0dHBbc10/fGZpbGUpOlwvXC9bXC9dPy4rP1wvW146XCldKj8pKD86OlxkKykoPzo6XGQrKT8vKSxuJiZuWzFdP3Q9blsxXToobj1lLm1hdGNoKC9cKUAoKD86aHR0cFtzXT98ZmlsZSk6XC9cL1tcL10/Lis/XC9bXjpcKV0qPykoPzo6XGQrKSg/OjpcZCspPy8pLG4mJm5bMV0mJih0PW5bMV0pKSksdH0sTD1mdW5jdGlvbigpe3ZhciBlLHQ7dHJ5e3Rocm93IG5ldyB3fWNhdGNoKG4pe3Q9bn1yZXR1cm4gdCYmKGU9dC5zb3VyY2VVUkx8fHQuZmlsZU5hbWV8fE4odC5zdGFjaykpLGV9LFc9ZnVuY3Rpb24oKXt2YXIgZSx0LG47aWYoYS5jdXJyZW50U2NyaXB0JiYoZT1hLmN1cnJlbnRTY3JpcHQuc3JjKSlyZXR1cm4gZTtpZih0PWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLDE9PT10Lmxlbmd0aClyZXR1cm4gdFswXS5zcmN8fG87aWYoInJlYWR5U3RhdGUiaW4gdFswXSlmb3Iobj10Lmxlbmd0aDtuLS07KWlmKCJpbnRlcmFjdGl2ZSI9PT10W25dLnJlYWR5U3RhdGUmJihlPXRbbl0uc3JjKSlyZXR1cm4gZTtyZXR1cm4ibG9hZGluZyI9PT1hLnJlYWR5U3RhdGUmJihlPXRbdC5sZW5ndGgtMV0uc3JjKT9lOihlPUwoKSk/ZTpvfSxJPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKGU9ci5sZW5ndGg7ZS0tOyl7aWYoIShuPXJbZV0uc3JjKSl7dD1udWxsO2JyZWFrfWlmKG49UChuKSxudWxsPT10KXQ9bjtlbHNlIGlmKHQhPT1uKXt0PW51bGw7YnJlYWt9fXJldHVybiB0fHxvfSxqPWZ1bmN0aW9uKCl7dmFyIGU9UChXKCkpfHxJKCl8fCIiO3JldHVybiBlKyJaZXJvQ2xpcGJvYXJkLnN3ZiJ9LFY9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dC5vcGVuZXImJighIXQudG9wJiZ0IT10LnRvcHx8ISF0LnBhcmVudCYmdCE9dC5wYXJlbnQpfSgpLEY9e2JyaWRnZTpudWxsLHZlcnNpb246IjAuMC4wIixwbHVnaW5UeXBlOiJ1bmtub3duIixkaXNhYmxlZDpudWxsLG91dGRhdGVkOm51bGwsc2FuZGJveGVkOm51bGwsdW5hdmFpbGFibGU6bnVsbCxkZWdyYWRlZDpudWxsLGRlYWN0aXZhdGVkOm51bGwsb3ZlcmR1ZTpudWxsLHJlYWR5Om51bGx9LEI9IjExLjAuMCIsej17fSxZPXt9LFU9bnVsbCxHPTAsJD0wLFg9e3JlYWR5OiJGbGFzaCBjb21tdW5pY2F0aW9uIGlzIGVzdGFibGlzaGVkIixlcnJvcjp7ImZsYXNoLWRpc2FibGVkIjoiRmxhc2ggaXMgZGlzYWJsZWQgb3Igbm90IGluc3RhbGxlZC4gTWF5IGFsc28gYmUgYXR0ZW1wdGluZyB0byBydW4gRmxhc2ggaW4gYSBzYW5kYm94ZWQgaWZyYW1lLCB3aGljaCBpcyBpbXBvc3NpYmxlLiIsImZsYXNoLW91dGRhdGVkIjoiRmxhc2ggaXMgdG9vIG91dGRhdGVkIHRvIHN1cHBvcnQgWmVyb0NsaXBib2FyZCIsImZsYXNoLXNhbmRib3hlZCI6IkF0dGVtcHRpbmcgdG8gcnVuIEZsYXNoIGluIGEgc2FuZGJveGVkIGlmcmFtZSwgd2hpY2ggaXMgaW1wb3NzaWJsZSIsImZsYXNoLXVuYXZhaWxhYmxlIjoiRmxhc2ggaXMgdW5hYmxlIHRvIGNvbW11bmljYXRlIGJpZGlyZWN0aW9uYWxseSB3aXRoIEphdmFTY3JpcHQiLCJmbGFzaC1kZWdyYWRlZCI6IkZsYXNoIGlzIHVuYWJsZSB0byBwcmVzZXJ2ZSBkYXRhIGZpZGVsaXR5IHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIEphdmFTY3JpcHQiLCJmbGFzaC1kZWFjdGl2YXRlZCI6IkZsYXNoIGlzIHRvbyBvdXRkYXRlZCBmb3IgeW91ciBicm93c2VyIGFuZC9vciBpcyBjb25maWd1cmVkIGFzIGNsaWNrLXRvLWFjdGl2YXRlLlxuVGhpcyBtYXkgYWxzbyBtZWFuIHRoYXQgdGhlIFplcm9DbGlwYm9hcmQgU1dGIG9iamVjdCBjb3VsZCBub3QgYmUgbG9hZGVkLCBzbyBwbGVhc2UgY2hlY2sgeW91ciBgc3dmUGF0aGAgY29uZmlndXJhdGlvbiBhbmQvb3IgbmV0d29yayBjb25uZWN0aXZpdHkuXG5NYXkgYWxzbyBiZSBhdHRlbXB0aW5nIHRvIHJ1biBGbGFzaCBpbiBhIHNhbmRib3hlZCBpZnJhbWUsIHdoaWNoIGlzIGltcG9zc2libGUuIiwiZmxhc2gtb3ZlcmR1ZSI6IkZsYXNoIGNvbW11bmljYXRpb24gd2FzIGVzdGFibGlzaGVkIGJ1dCBOT1Qgd2l0aGluIHRoZSBhY2NlcHRhYmxlIHRpbWUgbGltaXQiLCJ2ZXJzaW9uLW1pc21hdGNoIjoiWmVyb0NsaXBib2FyZCBKUyB2ZXJzaW9uIG51bWJlciBkb2VzIG5vdCBtYXRjaCBaZXJvQ2xpcGJvYXJkIFNXRiB2ZXJzaW9uIG51bWJlciIsImNsaXBib2FyZC1lcnJvciI6IkF0IGxlYXN0IG9uZSBlcnJvciB3YXMgdGhyb3duIHdoaWxlIFplcm9DbGlwYm9hcmQgd2FzIGF0dGVtcHRpbmcgdG8gaW5qZWN0IHlvdXIgZGF0YSBpbnRvIHRoZSBjbGlwYm9hcmQiLCJjb25maWctbWlzbWF0Y2giOiJaZXJvQ2xpcGJvYXJkIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgbWF0Y2ggRmxhc2gncyByZWFsaXR5Iiwic3dmLW5vdC1mb3VuZCI6IlRoZSBaZXJvQ2xpcGJvYXJkIFNXRiBvYmplY3QgY291bGQgbm90IGJlIGxvYWRlZCwgc28gcGxlYXNlIGNoZWNrIHlvdXIgYHN3ZlBhdGhgIGNvbmZpZ3VyYXRpb24gYW5kL29yIG5ldHdvcmsgY29ubmVjdGl2aXR5In19LEs9WyJmbGFzaC11bmF2YWlsYWJsZSIsImZsYXNoLWRlZ3JhZGVkIiwiZmxhc2gtb3ZlcmR1ZSIsInZlcnNpb24tbWlzbWF0Y2giLCJjb25maWctbWlzbWF0Y2giLCJjbGlwYm9hcmQtZXJyb3IiXSxxPVsiZmxhc2gtZGlzYWJsZWQiLCJmbGFzaC1vdXRkYXRlZCIsImZsYXNoLXNhbmRib3hlZCIsImZsYXNoLXVuYXZhaWxhYmxlIiwiZmxhc2gtZGVncmFkZWQiLCJmbGFzaC1kZWFjdGl2YXRlZCIsImZsYXNoLW92ZXJkdWUiXSxaPW5ldyBSZWdFeHAoIl5mbGFzaC0oIitxLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9eZmxhc2gtLywiIil9KS5qb2luKCJ8IikrIikkIiksSj1uZXcgUmVnRXhwKCJeZmxhc2gtKCIrcS5zbGljZSgxKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXmZsYXNoLS8sIiIpfSkuam9pbigifCIpKyIpJCIpLFE9e3N3ZlBhdGg6aigpLHRydXN0ZWREb21haW5zOnQubG9jYXRpb24uaG9zdD9bdC5sb2NhdGlvbi5ob3N0XTpbXSxjYWNoZUJ1c3Q6ITAsZm9yY2VFbmhhbmNlZENsaXBib2FyZDohMSxmbGFzaExvYWRUaW1lb3V0OjNlNCxhdXRvQWN0aXZhdGU6ITAsYnViYmxlRXZlbnRzOiEwLGNvbnRhaW5lcklkOiJnbG9iYWwtemVyb2NsaXBib2FyZC1odG1sLWJyaWRnZSIsY29udGFpbmVyQ2xhc3M6Imdsb2JhbC16ZXJvY2xpcGJvYXJkLWNvbnRhaW5lciIsc3dmT2JqZWN0SWQ6Imdsb2JhbC16ZXJvY2xpcGJvYXJkLWZsYXNoLWJyaWRnZSIsaG92ZXJDbGFzczoiemVyb2NsaXBib2FyZC1pcy1ob3ZlciIsYWN0aXZlQ2xhc3M6Inplcm9jbGlwYm9hcmQtaXMtYWN0aXZlIixmb3JjZUhhbmRDdXJzb3I6ITEsdGl0bGU6bnVsbCx6SW5kZXg6OTk5OTk5OTk5fSxlZT1mdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lKWZvcih2YXIgdCBpbiBlKWlmKFMuY2FsbChlLHQpKWlmKC9eKD86Zm9yY2VIYW5kQ3Vyc29yfHRpdGxlfHpJbmRleHxidWJibGVFdmVudHMpJC8udGVzdCh0KSlRW3RdPWVbdF07ZWxzZSBpZihudWxsPT1GLmJyaWRnZSlpZigiY29udGFpbmVySWQiPT09dHx8InN3Zk9iamVjdElkIj09PXQpe2lmKCFnZShlW3RdKSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzcGVjaWZpZWQgYCIrdCsiYCB2YWx1ZSBpcyBub3QgdmFsaWQgYXMgYW4gSFRNTDQgRWxlbWVudCBJRCIpO1FbdF09ZVt0XX1lbHNlIFFbdF09ZVt0XTt7aWYoInN0cmluZyIhPXR5cGVvZiBlfHwhZSlyZXR1cm4gayhRKTtpZihTLmNhbGwoUSxlKSlyZXR1cm4gUVtlXX19LHRlPWZ1bmN0aW9uKCl7cmV0dXJuICRlKCkse2Jyb3dzZXI6SCh1LFsidXNlckFnZW50IiwicGxhdGZvcm0iLCJhcHBOYW1lIl0pLGZsYXNoOkQoRixbImJyaWRnZSJdKSx6ZXJvY2xpcGJvYXJkOnt2ZXJzaW9uOktlLnZlcnNpb24sY29uZmlnOktlLmNvbmZpZygpfX19LG5lPWZ1bmN0aW9uKCl7cmV0dXJuISEoRi5kaXNhYmxlZHx8Ri5vdXRkYXRlZHx8Ri5zYW5kYm94ZWR8fEYudW5hdmFpbGFibGV8fEYuZGVncmFkZWR8fEYuZGVhY3RpdmF0ZWQpfSxvZT1mdW5jdGlvbihlLHQpe3ZhciBuLGkscyxsPXt9O2lmKCJzdHJpbmciPT10eXBlb2YgZSYmZSlzPWUudG9Mb3dlckNhc2UoKS5zcGxpdCgvXHMrLyk7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGUmJmUmJiJ1bmRlZmluZWQiPT10eXBlb2YgdClmb3IobiBpbiBlKVMuY2FsbChlLG4pJiYic3RyaW5nIj09dHlwZW9mIG4mJm4mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW25dJiZLZS5vbihuLGVbbl0pO2lmKHMmJnMubGVuZ3RoKXtmb3Iobj0wLGk9cy5sZW5ndGg7aT5uO24rKyllPXNbbl0ucmVwbGFjZSgvXm9uLywiIiksbFtlXT0hMCx6W2VdfHwoeltlXT1bXSkseltlXS5wdXNoKHQpO2lmKGwucmVhZHkmJkYucmVhZHkmJktlLmVtaXQoe3R5cGU6InJlYWR5In0pLGwuZXJyb3Ipe2ZvcihuPTAsaT1xLmxlbmd0aDtpPm47bisrKWlmKEZbcVtuXS5yZXBsYWNlKC9eZmxhc2gtLywiIildPT09ITApe0tlLmVtaXQoe3R5cGU6ImVycm9yIixuYW1lOnFbbl19KTticmVha31yIT09byYmS2UudmVyc2lvbiE9PXImJktlLmVtaXQoe3R5cGU6ImVycm9yIixuYW1lOiJ2ZXJzaW9uLW1pc21hdGNoIixqc1ZlcnNpb246S2UudmVyc2lvbixzd2ZWZXJzaW9uOnJ9KX19cmV0dXJuIEtlfSxyZT1mdW5jdGlvbihlLHQpe3ZhciBuLG8scixpLHM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpaT1fKHopO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBlJiZlKWk9ZS5zcGxpdCgvXHMrLyk7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGUmJmUmJiJ1bmRlZmluZWQiPT10eXBlb2YgdClmb3IobiBpbiBlKVMuY2FsbChlLG4pJiYic3RyaW5nIj09dHlwZW9mIG4mJm4mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW25dJiZLZS5vZmYobixlW25dKTtpZihpJiZpLmxlbmd0aClmb3Iobj0wLG89aS5sZW5ndGg7bz5uO24rKylpZihlPWlbbl0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9eb24vLCIiKSxzPXpbZV0scyYmcy5sZW5ndGgpaWYodClmb3Iocj1zLmluZGV4T2YodCk7LTEhPT1yOylzLnNwbGljZShyLDEpLHI9cy5pbmRleE9mKHQscik7ZWxzZSBzLmxlbmd0aD0wO3JldHVybiBLZX0saWU9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHQ9InN0cmluZyI9PXR5cGVvZiBlJiZlP2soeltlXSl8fG51bGw6ayh6KX0sc2U9ZnVuY3Rpb24oZSl7dmFyIHQsbixvO3JldHVybiBlPW1lKGUpLGUmJiFSZShlKT8icmVhZHkiPT09ZS50eXBlJiZGLm92ZXJkdWU9PT0hMD9LZS5lbWl0KHt0eXBlOiJlcnJvciIsbmFtZToiZmxhc2gtb3ZlcmR1ZSJ9KToodD1PKHt9LGUpLENlLmNhbGwodGhpcyx0KSwiY29weSI9PT1lLnR5cGUmJihvPURlKFkpLG49by5kYXRhLFU9by5mb3JtYXRNYXApLG4pOnZvaWQgMH0sbGU9ZnVuY3Rpb24oKXt2YXIgZT1GLnNhbmRib3hlZDtpZigkZSgpLCJib29sZWFuIiE9dHlwZW9mIEYucmVhZHkmJihGLnJlYWR5PSExKSxGLnNhbmRib3hlZCE9PWUmJkYuc2FuZGJveGVkPT09ITApRi5yZWFkeT0hMSxLZS5lbWl0KHt0eXBlOiJlcnJvciIsbmFtZToiZmxhc2gtc2FuZGJveGVkIn0pO2Vsc2UgaWYoIUtlLmlzRmxhc2hVbnVzYWJsZSgpJiZudWxsPT09Ri5icmlkZ2Upe3ZhciB0PVEuZmxhc2hMb2FkVGltZW91dDsibnVtYmVyIj09dHlwZW9mIHQmJnQ+PTAmJihHPWMoZnVuY3Rpb24oKXsiYm9vbGVhbiIhPXR5cGVvZiBGLmRlYWN0aXZhdGVkJiYoRi5kZWFjdGl2YXRlZD0hMCksRi5kZWFjdGl2YXRlZD09PSEwJiZLZS5lbWl0KHt0eXBlOiJlcnJvciIsbmFtZToiZmxhc2gtZGVhY3RpdmF0ZWQifSl9LHQpKSxGLm92ZXJkdWU9ITEsa2UoKX19LGFlPWZ1bmN0aW9uKCl7S2UuY2xlYXJEYXRhKCksS2UuYmx1cigpLEtlLmVtaXQoImRlc3Ryb3kiKSxIZSgpLEtlLm9mZigpfSx1ZT1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmZSYmInVuZGVmaW5lZCI9PXR5cGVvZiB0KW49ZSxLZS5jbGVhckRhdGEoKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgZXx8IWUpcmV0dXJuO249e30sbltlXT10fWZvcih2YXIgbyBpbiBuKSJzdHJpbmciPT10eXBlb2YgbyYmbyYmUy5jYWxsKG4sbykmJiJzdHJpbmciPT10eXBlb2YgbltvXSYmbltvXSYmKFlbb109bltvXSl9LGNlPWZ1bmN0aW9uKGUpeyJ1bmRlZmluZWQiPT10eXBlb2YgZT8oQShZKSxVPW51bGwpOiJzdHJpbmciPT10eXBlb2YgZSYmUy5jYWxsKFksZSkmJmRlbGV0ZSBZW2VdfSxoZT1mdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGU/ayhZKToic3RyaW5nIj09dHlwZW9mIGUmJlMuY2FsbChZLGUpP1lbZV06dm9pZCAwfSxkZT1mdW5jdGlvbihlKXtpZihlJiYxPT09ZS5ub2RlVHlwZSl7aSYmKGplKGksUS5hY3RpdmVDbGFzcyksaSE9PWUmJmplKGksUS5ob3ZlckNsYXNzKSksaT1lLEllKGUsUS5ob3ZlckNsYXNzKTt2YXIgdD1lLmdldEF0dHJpYnV0ZSgidGl0bGUiKXx8US50aXRsZTtpZigic3RyaW5nIj09dHlwZW9mIHQmJnQpe3ZhciBuPU9lKEYuYnJpZGdlKTtuJiZuLnNldEF0dHJpYnV0ZSgidGl0bGUiLHQpfXZhciBvPVEuZm9yY2VIYW5kQ3Vyc29yPT09ITB8fCJwb2ludGVyIj09PVZlKGUsImN1cnNvciIpO1VlKG8pLFllKCl9fSxmZT1mdW5jdGlvbigpe3ZhciBlPU9lKEYuYnJpZGdlKTtlJiYoZS5yZW1vdmVBdHRyaWJ1dGUoInRpdGxlIiksZS5zdHlsZS5sZWZ0PSIwcHgiLGUuc3R5bGUudG9wPSItOTk5OXB4IixlLnN0eWxlLndpZHRoPSIxcHgiLGUuc3R5bGUuaGVpZ2h0PSIxcHgiKSxpJiYoamUoaSxRLmhvdmVyQ2xhc3MpLGplKGksUS5hY3RpdmVDbGFzcyksaT1udWxsKX0scGU9ZnVuY3Rpb24oKXtyZXR1cm4gaXx8bnVsbH0sZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiZlJiYvXltBLVphLXpdW0EtWmEtejAtOV86XC1cLl0qJC8udGVzdChlKX0sbWU9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoInN0cmluZyI9PXR5cGVvZiBlJiZlPyh0PWUsZT17fSk6Im9iamVjdCI9PXR5cGVvZiBlJiZlJiYic3RyaW5nIj09dHlwZW9mIGUudHlwZSYmZS50eXBlJiYodD1lLnR5cGUpLHQpe3Q9dC50b0xvd2VyQ2FzZSgpLCFlLnRhcmdldCYmKC9eKGNvcHl8YWZ0ZXJjb3B5fF9jbGljaykkLy50ZXN0KHQpfHwiZXJyb3IiPT09dCYmImNsaXBib2FyZC1lcnJvciI9PT1lLm5hbWUpJiYoZS50YXJnZXQ9cyksTyhlLHt0eXBlOnQsdGFyZ2V0OmUudGFyZ2V0fHxpfHxudWxsLHJlbGF0ZWRUYXJnZXQ6ZS5yZWxhdGVkVGFyZ2V0fHxudWxsLGN1cnJlbnRUYXJnZXQ6RiYmRi5icmlkZ2V8fG51bGwsdGltZVN0YW1wOmUudGltZVN0YW1wfHxDKCl8fG51bGx9KTt2YXIgbj1YW2UudHlwZV07cmV0dXJuImVycm9yIj09PWUudHlwZSYmZS5uYW1lJiZuJiYobj1uW2UubmFtZV0pLG4mJihlLm1lc3NhZ2U9biksInJlYWR5Ij09PWUudHlwZSYmTyhlLHt0YXJnZXQ6bnVsbCx2ZXJzaW9uOkYudmVyc2lvbn0pLCJlcnJvciI9PT1lLnR5cGUmJihaLnRlc3QoZS5uYW1lKSYmTyhlLHt0YXJnZXQ6bnVsbCxtaW5pbXVtVmVyc2lvbjpCfSksSi50ZXN0KGUubmFtZSkmJk8oZSx7dmVyc2lvbjpGLnZlcnNpb259KSksImNvcHkiPT09ZS50eXBlJiYoZS5jbGlwYm9hcmREYXRhPXtzZXREYXRhOktlLnNldERhdGEsY2xlYXJEYXRhOktlLmNsZWFyRGF0YX0pLCJhZnRlcmNvcHkiPT09ZS50eXBlJiYoZT1BZShlLFUpKSxlLnRhcmdldCYmIWUucmVsYXRlZFRhcmdldCYmKGUucmVsYXRlZFRhcmdldD13ZShlLnRhcmdldCkpLHZlKGUpfX0sd2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJkYXRhLWNsaXBib2FyZC10YXJnZXQiKTtyZXR1cm4gdD9hLmdldEVsZW1lbnRCeUlkKHQpOm51bGx9LHZlPWZ1bmN0aW9uKGUpe2lmKGUmJi9eXyg/OmNsaWNrfG1vdXNlKD86b3ZlcnxvdXR8ZG93bnx1cHxtb3ZlKSkkLy50ZXN0KGUudHlwZSkpe3ZhciB0PWUudGFyZ2V0LG49Il9tb3VzZW92ZXIiPT09ZS50eXBlJiZlLnJlbGF0ZWRUYXJnZXQ/ZS5yZWxhdGVkVGFyZ2V0Om8scj0iX21vdXNlb3V0Ij09PWUudHlwZSYmZS5yZWxhdGVkVGFyZ2V0P2UucmVsYXRlZFRhcmdldDpvLGk9RmUodCkscz1sLnNjcmVlbkxlZnR8fGwuc2NyZWVuWHx8MCx1PWwuc2NyZWVuVG9wfHxsLnNjcmVlbll8fDAsYz1hLmJvZHkuc2Nyb2xsTGVmdCthLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LGg9YS5ib2R5LnNjcm9sbFRvcCthLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsZD1pLmxlZnQrKCJudW1iZXIiPT10eXBlb2YgZS5fc3RhZ2VYP2UuX3N0YWdlWDowKSxmPWkudG9wKygibnVtYmVyIj09dHlwZW9mIGUuX3N0YWdlWT9lLl9zdGFnZVk6MCkscD1kLWMsZz1mLWgsbT1zK3Asdz11K2csdj0ibnVtYmVyIj09dHlwZW9mIGUubW92ZW1lbnRYP2UubW92ZW1lbnRYOjAseT0ibnVtYmVyIj09dHlwZW9mIGUubW92ZW1lbnRZP2UubW92ZW1lbnRZOjA7ZGVsZXRlIGUuX3N0YWdlWCxkZWxldGUgZS5fc3RhZ2VZLE8oZSx7c3JjRWxlbWVudDp0LGZyb21FbGVtZW50Om4sdG9FbGVtZW50OnIsc2NyZWVuWDptLHNjcmVlblk6dyxwYWdlWDpkLHBhZ2VZOmYsY2xpZW50WDpwLGNsaWVudFk6Zyx4OnAseTpnLG1vdmVtZW50WDp2LG1vdmVtZW50WTp5LG9mZnNldFg6MCxvZmZzZXRZOjAsbGF5ZXJYOjAsbGF5ZXJZOjB9KX1yZXR1cm4gZX0seWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmInN0cmluZyI9PXR5cGVvZiBlLnR5cGUmJmUudHlwZXx8IiI7cmV0dXJuIS9eKD86KD86YmVmb3JlKT9jb3B5fGRlc3Ryb3kpJC8udGVzdCh0KX0sYmU9ZnVuY3Rpb24oZSx0LG4sbyl7bz9jKGZ1bmN0aW9uKCl7ZS5hcHBseSh0LG4pfSwwKTplLmFwcGx5KHQsbil9LENlPWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS50eXBlKXt2YXIgdD15ZShlKSxuPXpbIioiXXx8W10sbz16W2UudHlwZV18fFtdLHI9bi5jb25jYXQobyk7aWYociYmci5sZW5ndGgpe3ZhciBpLHMsYSx1LGMsaD10aGlzO2ZvcihpPTAscz1yLmxlbmd0aDtzPmk7aSsrKWE9cltpXSx1PWgsInN0cmluZyI9PXR5cGVvZiBhJiYiZnVuY3Rpb24iPT10eXBlb2YgbFthXSYmKGE9bFthXSksIm9iamVjdCI9PXR5cGVvZiBhJiZhJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5oYW5kbGVFdmVudCYmKHU9YSxhPWEuaGFuZGxlRXZlbnQpLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYz1PKHt9LGUpLGJlKGEsdSxbY10sdCkpfXJldHVybiB0aGlzfX0sX2U9ZnVuY3Rpb24oZSl7dmFyIHQ9bnVsbDtyZXR1cm4oVj09PSExfHxlJiYiZXJyb3IiPT09ZS50eXBlJiZlLm5hbWUmJi0xIT09Sy5pbmRleE9mKGUubmFtZSkpJiYodD0hMSksdH0sUmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXR8fGl8fG51bGwsbj0ic3dmIj09PWUuX3NvdXJjZTtzd2l0Y2goZGVsZXRlIGUuX3NvdXJjZSxlLnR5cGUpe2Nhc2UiZXJyb3IiOnZhciBvPSJmbGFzaC1zYW5kYm94ZWQiPT09ZS5uYW1lfHxfZShlKTsiYm9vbGVhbiI9PXR5cGVvZiBvJiYoRi5zYW5kYm94ZWQ9byksLTEhPT1xLmluZGV4T2YoZS5uYW1lKT9PKEYse2Rpc2FibGVkOiJmbGFzaC1kaXNhYmxlZCI9PT1lLm5hbWUsb3V0ZGF0ZWQ6ImZsYXNoLW91dGRhdGVkIj09PWUubmFtZSx1bmF2YWlsYWJsZToiZmxhc2gtdW5hdmFpbGFibGUiPT09ZS5uYW1lLGRlZ3JhZGVkOiJmbGFzaC1kZWdyYWRlZCI9PT1lLm5hbWUsZGVhY3RpdmF0ZWQ6ImZsYXNoLWRlYWN0aXZhdGVkIj09PWUubmFtZSxvdmVyZHVlOiJmbGFzaC1vdmVyZHVlIj09PWUubmFtZSxyZWFkeTohMX0pOiJ2ZXJzaW9uLW1pc21hdGNoIj09PWUubmFtZSYmKHI9ZS5zd2ZWZXJzaW9uLE8oRix7ZGlzYWJsZWQ6ITEsb3V0ZGF0ZWQ6ITEsdW5hdmFpbGFibGU6ITEsZGVncmFkZWQ6ITEsZGVhY3RpdmF0ZWQ6ITEsb3ZlcmR1ZTohMSxyZWFkeTohMX0pKSx6ZSgpO2JyZWFrO2Nhc2UicmVhZHkiOnI9ZS5zd2ZWZXJzaW9uO3ZhciBsPUYuZGVhY3RpdmF0ZWQ9PT0hMDtPKEYse2Rpc2FibGVkOiExLG91dGRhdGVkOiExLHNhbmRib3hlZDohMSx1bmF2YWlsYWJsZTohMSxkZWdyYWRlZDohMSxkZWFjdGl2YXRlZDohMSxvdmVyZHVlOmwscmVhZHk6IWx9KSx6ZSgpO2JyZWFrO2Nhc2UiYmVmb3JlY29weSI6cz10O2JyZWFrO2Nhc2UiY29weSI6dmFyIGEsdSxjPWUucmVsYXRlZFRhcmdldDshWVsidGV4dC9odG1sIl0mJiFZWyJ0ZXh0L3BsYWluIl0mJmMmJih1PWMudmFsdWV8fGMub3V0ZXJIVE1MfHxjLmlubmVySFRNTCkmJihhPWMudmFsdWV8fGMudGV4dENvbnRlbnR8fGMuaW5uZXJUZXh0KT8oZS5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpLGUuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCJ0ZXh0L3BsYWluIixhKSx1IT09YSYmZS5jbGlwYm9hcmREYXRhLnNldERhdGEoInRleHQvaHRtbCIsdSkpOiFZWyJ0ZXh0L3BsYWluIl0mJmUudGFyZ2V0JiYoYT1lLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtY2xpcGJvYXJkLXRleHQiKSkmJihlLmNsaXBib2FyZERhdGEuY2xlYXJEYXRhKCksZS5jbGlwYm9hcmREYXRhLnNldERhdGEoInRleHQvcGxhaW4iLGEpKTticmVhaztjYXNlImFmdGVyY29weSI6U2UoZSksS2UuY2xlYXJEYXRhKCksdCYmdCE9PVdlKCkmJnQuZm9jdXMmJnQuZm9jdXMoKTticmVhaztjYXNlIl9tb3VzZW92ZXIiOktlLmZvY3VzKHQpLFEuYnViYmxlRXZlbnRzPT09ITAmJm4mJih0JiZ0IT09ZS5yZWxhdGVkVGFyZ2V0JiYheChlLnJlbGF0ZWRUYXJnZXQsdCkmJkVlKE8oe30sZSx7dHlwZToibW91c2VlbnRlciIsYnViYmxlczohMSxjYW5jZWxhYmxlOiExfSkpLEVlKE8oe30sZSx7dHlwZToibW91c2VvdmVyIn0pKSk7YnJlYWs7Y2FzZSJfbW91c2VvdXQiOktlLmJsdXIoKSxRLmJ1YmJsZUV2ZW50cz09PSEwJiZuJiYodCYmdCE9PWUucmVsYXRlZFRhcmdldCYmIXgoZS5yZWxhdGVkVGFyZ2V0LHQpJiZFZShPKHt9LGUse3R5cGU6Im1vdXNlbGVhdmUiLGJ1YmJsZXM6ITEsY2FuY2VsYWJsZTohMX0pKSxFZShPKHt9LGUse3R5cGU6Im1vdXNlb3V0In0pKSk7YnJlYWs7Y2FzZSJfbW91c2Vkb3duIjpJZSh0LFEuYWN0aXZlQ2xhc3MpLFEuYnViYmxlRXZlbnRzPT09ITAmJm4mJkVlKE8oe30sZSx7dHlwZTplLnR5cGUuc2xpY2UoMSl9KSk7YnJlYWs7Y2FzZSJfbW91c2V1cCI6amUodCxRLmFjdGl2ZUNsYXNzKSxRLmJ1YmJsZUV2ZW50cz09PSEwJiZuJiZFZShPKHt9LGUse3R5cGU6ZS50eXBlLnNsaWNlKDEpfSkpO2JyZWFrO2Nhc2UiX2NsaWNrIjpzPW51bGwsUS5idWJibGVFdmVudHM9PT0hMCYmbiYmRWUoTyh7fSxlLHt0eXBlOmUudHlwZS5zbGljZSgxKX0pKTticmVhaztjYXNlIl9tb3VzZW1vdmUiOlEuYnViYmxlRXZlbnRzPT09ITAmJm4mJkVlKE8oe30sZSx7dHlwZTplLnR5cGUuc2xpY2UoMSl9KSl9cmV0dXJuL15fKD86Y2xpY2t8bW91c2UoPzpvdmVyfG91dHxkb3dufHVwfG1vdmUpKSQvLnRlc3QoZS50eXBlKT8hMDp2b2lkIDB9LFNlPWZ1bmN0aW9uKGUpe2lmKGUuZXJyb3JzJiZlLmVycm9ycy5sZW5ndGg+MCl7dmFyIHQ9ayhlKTtPKHQse3R5cGU6ImVycm9yIixuYW1lOiJjbGlwYm9hcmQtZXJyb3IifSksZGVsZXRlIHQuc3VjY2VzcyxjKGZ1bmN0aW9uKCl7S2UuZW1pdCh0KX0sMCl9fSxFZT1mdW5jdGlvbihlKXtpZihlJiYic3RyaW5nIj09dHlwZW9mIGUudHlwZSYmZSl7dmFyIHQsbj1lLnRhcmdldHx8bnVsbCxvPW4mJm4ub3duZXJEb2N1bWVudHx8YSxyPXt2aWV3Om8uZGVmYXVsdFZpZXd8fGwsY2FuQnViYmxlOiEwLGNhbmNlbGFibGU6ITAsZGV0YWlsOiJjbGljayI9PT1lLnR5cGU/MTowLGJ1dHRvbjoibnVtYmVyIj09dHlwZW9mIGUud2hpY2g/ZS53aGljaC0xOiJudW1iZXIiPT10eXBlb2YgZS5idXR0b24/ZS5idXR0b246by5jcmVhdGVFdmVudD8wOjF9LGk9TyhyLGUpO24mJm8uY3JlYXRlRXZlbnQmJm4uZGlzcGF0Y2hFdmVudCYmKGk9W2kudHlwZSxpLmNhbkJ1YmJsZSxpLmNhbmNlbGFibGUsaS52aWV3LGkuZGV0YWlsLGkuc2NyZWVuWCxpLnNjcmVlblksaS5jbGllbnRYLGkuY2xpZW50WSxpLmN0cmxLZXksaS5hbHRLZXksaS5zaGlmdEtleSxpLm1ldGFLZXksaS5idXR0b24saS5yZWxhdGVkVGFyZ2V0XSx0PW8uY3JlYXRlRXZlbnQoIk1vdXNlRXZlbnRzIiksdC5pbml0TW91c2VFdmVudCYmKHQuaW5pdE1vdXNlRXZlbnQuYXBwbHkodCxpKSx0Ll9zb3VyY2U9ImpzIixuLmRpc3BhdGNoRXZlbnQodCkpKX19LFRlPWZ1bmN0aW9uKCl7dmFyIGU9US5mbGFzaExvYWRUaW1lb3V0O2lmKCJudW1iZXIiPT10eXBlb2YgZSYmZT49MCl7dmFyIHQ9TWF0aC5taW4oMWUzLGUvMTApLG49US5zd2ZPYmplY3RJZCsiX2ZhbGxiYWNrQ29udGVudCI7JD1kKGZ1bmN0aW9uKCl7dmFyIGU9YS5nZXRFbGVtZW50QnlJZChuKTtCZShlKSYmKHplKCksRi5kZWFjdGl2YXRlZD1udWxsLEtlLmVtaXQoe3R5cGU6ImVycm9yIixuYW1lOiJzd2Ytbm90LWZvdW5kIn0pKX0sdCl9fSxNZT1mdW5jdGlvbigpe3ZhciBlPWEuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuaWQ9US5jb250YWluZXJJZCxlLmNsYXNzTmFtZT1RLmNvbnRhaW5lckNsYXNzLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLmxlZnQ9IjBweCIsZS5zdHlsZS50b3A9Ii05OTk5cHgiLGUuc3R5bGUud2lkdGg9IjFweCIsZS5zdHlsZS5oZWlnaHQ9IjFweCIsZS5zdHlsZS56SW5kZXg9IiIrR2UoUS56SW5kZXgpLGV9LE9lPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lJiZlLnBhcmVudE5vZGU7dCYmIk9CSkVDVCI9PT10Lm5vZGVOYW1lJiZ0LnBhcmVudE5vZGU7KXQ9dC5wYXJlbnROb2RlO3JldHVybiB0fHxudWxsfSxrZT1mdW5jdGlvbigpe3ZhciBlLHQ9Ri5icmlkZ2Usbj1PZSh0KTtpZighdCl7dmFyIG89TGUobC5sb2NhdGlvbi5ob3N0LFEpLHI9Im5ldmVyIj09PW8/Im5vbmUiOiJhbGwiLGk9UGUoTyh7anNWZXJzaW9uOktlLnZlcnNpb259LFEpKSxzPVEuc3dmUGF0aCt4ZShRLnN3ZlBhdGgsUSk7bj1NZSgpO3ZhciB1PWEuY3JlYXRlRWxlbWVudCgiZGl2Iik7bi5hcHBlbmRDaGlsZCh1KSxhLmJvZHkuYXBwZW5kQ2hpbGQobik7dmFyIGM9YS5jcmVhdGVFbGVtZW50KCJkaXYiKSxoPSJhY3RpdmV4Ij09PUYucGx1Z2luVHlwZTtjLmlubmVySFRNTD0nPG9iamVjdCBpZD0iJytRLnN3Zk9iamVjdElkKyciIG5hbWU9IicrUS5zd2ZPYmplY3RJZCsnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiAnKyhoPydjbGFzc2lkPSJjbHNpZDpkMjdjZGI2ZS1hZTZkLTExY2YtOTZiOC00NDQ1NTM1NDAwMDAiJzondHlwZT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIGRhdGE9IicrcysnIicpKyI+IisoaD8nPHBhcmFtIG5hbWU9Im1vdmllIiB2YWx1ZT0iJytzKyciLz4nOiIiKSsnPHBhcmFtIG5hbWU9ImFsbG93U2NyaXB0QWNjZXNzIiB2YWx1ZT0iJytvKyciLz48cGFyYW0gbmFtZT0iYWxsb3dOZXR3b3JraW5nIiB2YWx1ZT0iJytyKyciLz48cGFyYW0gbmFtZT0ibWVudSIgdmFsdWU9ImZhbHNlIi8+PHBhcmFtIG5hbWU9Indtb2RlIiB2YWx1ZT0idHJhbnNwYXJlbnQiLz48cGFyYW0gbmFtZT0iZmxhc2h2YXJzIiB2YWx1ZT0iJytpKyciLz48ZGl2IGlkPSInK1Euc3dmT2JqZWN0SWQrJ19mYWxsYmFja0NvbnRlbnQiPiZuYnNwOzwvZGl2Pjwvb2JqZWN0PicsdD1jLmZpcnN0Q2hpbGQsYz1udWxsLFQodCkuWmVyb0NsaXBib2FyZD1LZSxuLnJlcGxhY2VDaGlsZCh0LHUpLFRlKCl9cmV0dXJuIHR8fCh0PWFbUS5zd2ZPYmplY3RJZF0sdCYmKGU9dC5sZW5ndGgpJiYodD10W2UtMV0pLCF0JiZuJiYodD1uLmZpcnN0Q2hpbGQpKSxGLmJyaWRnZT10fHxudWxsLHR9LEhlPWZ1bmN0aW9uKCl7dmFyIGU9Ri5icmlkZ2U7aWYoZSl7dmFyIHQ9T2UoZSk7dCYmKCJhY3RpdmV4Ij09PUYucGx1Z2luVHlwZSYmInJlYWR5U3RhdGUiaW4gZT8oZS5zdHlsZS5kaXNwbGF5PSJub25lIixmdW5jdGlvbiBuKCl7aWYoND09PWUucmVhZHlTdGF0ZSl7Zm9yKHZhciBvIGluIGUpImZ1bmN0aW9uIj09dHlwZW9mIGVbb10mJihlW29dPW51bGwpO2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfWVsc2UgYyhuLDEwKX0oKSk6KGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpKSksemUoKSxGLnJlYWR5PW51bGwsRi5icmlkZ2U9bnVsbCxGLmRlYWN0aXZhdGVkPW51bGwscj1vfX0sRGU9ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj17fTtpZigib2JqZWN0Ij09dHlwZW9mIGUmJmUpe2Zvcih2YXIgbyBpbiBlKWlmKG8mJlMuY2FsbChlLG8pJiYic3RyaW5nIj09dHlwZW9mIGVbb10mJmVbb10pc3dpdGNoKG8udG9Mb3dlckNhc2UoKSl7Y2FzZSJ0ZXh0L3BsYWluIjpjYXNlInRleHQiOmNhc2UiYWlyOnRleHQiOmNhc2UiZmxhc2g6dGV4dCI6dC50ZXh0PWVbb10sbi50ZXh0PW87YnJlYWs7Y2FzZSJ0ZXh0L2h0bWwiOmNhc2UiaHRtbCI6Y2FzZSJhaXI6aHRtbCI6Y2FzZSJmbGFzaDpodG1sIjp0Lmh0bWw9ZVtvXSxuLmh0bWw9bzticmVhaztjYXNlImFwcGxpY2F0aW9uL3J0ZiI6Y2FzZSJ0ZXh0L3J0ZiI6Y2FzZSJydGYiOmNhc2UicmljaHRleHQiOmNhc2UiYWlyOnJ0ZiI6Y2FzZSJmbGFzaDpydGYiOnQucnRmPWVbb10sbi5ydGY9b31yZXR1cm57ZGF0YTp0LGZvcm1hdE1hcDpufX19LEFlPWZ1bmN0aW9uKGUsdCl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHwhZXx8Im9iamVjdCIhPXR5cGVvZiB0fHwhdClyZXR1cm4gZTt2YXIgbj17fTtmb3IodmFyIG8gaW4gZSlpZihTLmNhbGwoZSxvKSlpZigiZXJyb3JzIj09PW8pe25bb109ZVtvXT9lW29dLnNsaWNlKCk6W107Zm9yKHZhciByPTAsaT1uW29dLmxlbmd0aDtpPnI7cisrKW5bb11bcl0uZm9ybWF0PXRbbltvXVtyXS5mb3JtYXRdfWVsc2UgaWYoInN1Y2Nlc3MiIT09byYmImRhdGEiIT09byluW29dPWVbb107ZWxzZXtuW29dPXt9O3ZhciBzPWVbb107Zm9yKHZhciBsIGluIHMpbCYmUy5jYWxsKHMsbCkmJlMuY2FsbCh0LGwpJiYobltvXVt0W2xdXT1zW2xdKX1yZXR1cm4gbn0seGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsPT10fHx0JiZ0LmNhY2hlQnVzdD09PSEwO3JldHVybiBuPygtMT09PWUuaW5kZXhPZigiPyIpPyI/IjoiJiIpKyJub0NhY2hlPSIrQygpOiIifSxQZT1mdW5jdGlvbihlKXt2YXIgdCxuLG8scixpPSIiLHM9W107aWYoZS50cnVzdGVkRG9tYWlucyYmKCJzdHJpbmciPT10eXBlb2YgZS50cnVzdGVkRG9tYWlucz9yPVtlLnRydXN0ZWREb21haW5zXToib2JqZWN0Ij09dHlwZW9mIGUudHJ1c3RlZERvbWFpbnMmJiJsZW5ndGgiaW4gZS50cnVzdGVkRG9tYWlucyYmKHI9ZS50cnVzdGVkRG9tYWlucykpLHImJnIubGVuZ3RoKWZvcih0PTAsbj1yLmxlbmd0aDtuPnQ7dCsrKWlmKFMuY2FsbChyLHQpJiZyW3RdJiYic3RyaW5nIj09dHlwZW9mIHJbdF0pe2lmKG89TmUoclt0XSksIW8pY29udGludWU7aWYoIioiPT09byl7cy5sZW5ndGg9MCxzLnB1c2gobyk7YnJlYWt9cy5wdXNoLmFwcGx5KHMsW28sIi8vIitvLGwubG9jYXRpb24ucHJvdG9jb2wrIi8vIitvXSl9cmV0dXJuIHMubGVuZ3RoJiYoaSs9InRydXN0ZWRPcmlnaW5zPSIrZyhzLmpvaW4oIiwiKSkpLGUuZm9yY2VFbmhhbmNlZENsaXBib2FyZD09PSEwJiYoaSs9KGk/IiYiOiIiKSsiZm9yY2VFbmhhbmNlZENsaXBib2FyZD10cnVlIiksInN0cmluZyI9PXR5cGVvZiBlLnN3Zk9iamVjdElkJiZlLnN3Zk9iamVjdElkJiYoaSs9KGk/IiYiOiIiKSsic3dmT2JqZWN0SWQ9IitnKGUuc3dmT2JqZWN0SWQpKSwic3RyaW5nIj09dHlwZW9mIGUuanNWZXJzaW9uJiZlLmpzVmVyc2lvbiYmKGkrPShpPyImIjoiIikrImpzVmVyc2lvbj0iK2coZS5qc1ZlcnNpb24pKSxpfSxOZT1mdW5jdGlvbihlKXtpZihudWxsPT1lfHwiIj09PWUpcmV0dXJuIG51bGw7aWYoZT1lLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKSwiIj09PWUpcmV0dXJuIG51bGw7dmFyIHQ9ZS5pbmRleE9mKCIvLyIpO2U9LTE9PT10P2U6ZS5zbGljZSh0KzIpO3ZhciBuPWUuaW5kZXhPZigiLyIpO3JldHVybiBlPS0xPT09bj9lOi0xPT09dHx8MD09PW4/bnVsbDplLnNsaWNlKDAsbiksZSYmIi5zd2YiPT09ZS5zbGljZSgtNCkudG9Mb3dlckNhc2UoKT9udWxsOmV8fG51bGx9LExlPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSl7dmFyIHQsbixvLHI9W107aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pLCJvYmplY3QiIT10eXBlb2YgZXx8IWV8fCJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGgpcmV0dXJuIHI7Zm9yKHQ9MCxuPWUubGVuZ3RoO24+dDt0KyspaWYoUy5jYWxsKGUsdCkmJihvPU5lKGVbdF0pKSl7aWYoIioiPT09byl7ci5sZW5ndGg9MCxyLnB1c2goIioiKTticmVha30tMT09PXIuaW5kZXhPZihvKSYmci5wdXNoKG8pfXJldHVybiByfTtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgbz1OZShuLnN3ZlBhdGgpO251bGw9PT1vJiYobz10KTt2YXIgcj1lKG4udHJ1c3RlZERvbWFpbnMpLGk9ci5sZW5ndGg7aWYoaT4wKXtpZigxPT09aSYmIioiPT09clswXSlyZXR1cm4iYWx3YXlzIjtpZigtMSE9PXIuaW5kZXhPZih0KSlyZXR1cm4gMT09PWkmJnQ9PT1vPyJzYW1lRG9tYWluIjoiYWx3YXlzIn1yZXR1cm4ibmV2ZXIifX0oKSxXZT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gYS5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe3JldHVybiBudWxsfX0sSWU9ZnVuY3Rpb24oZSx0KXt2YXIgbixvLHIsaT1bXTtpZigic3RyaW5nIj09dHlwZW9mIHQmJnQmJihpPXQuc3BsaXQoL1xzKy8pKSxlJiYxPT09ZS5ub2RlVHlwZSYmaS5sZW5ndGg+MClpZihlLmNsYXNzTGlzdClmb3Iobj0wLG89aS5sZW5ndGg7bz5uO24rKyllLmNsYXNzTGlzdC5hZGQoaVtuXSk7ZWxzZSBpZihlLmhhc093blByb3BlcnR5KCJjbGFzc05hbWUiKSl7Zm9yKHI9IiAiK2UuY2xhc3NOYW1lKyIgIixuPTAsbz1pLmxlbmd0aDtvPm47bisrKS0xPT09ci5pbmRleE9mKCIgIitpW25dKyIgIikmJihyKz1pW25dKyIgIik7ZS5jbGFzc05hbWU9ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9cmV0dXJuIGV9LGplPWZ1bmN0aW9uKGUsdCl7dmFyIG4sbyxyLGk9W107aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0JiYoaT10LnNwbGl0KC9ccysvKSksZSYmMT09PWUubm9kZVR5cGUmJmkubGVuZ3RoPjApaWYoZS5jbGFzc0xpc3QmJmUuY2xhc3NMaXN0Lmxlbmd0aD4wKWZvcihuPTAsbz1pLmxlbmd0aDtvPm47bisrKWUuY2xhc3NMaXN0LnJlbW92ZShpW25dKTtlbHNlIGlmKGUuY2xhc3NOYW1lKXtmb3Iocj0oIiAiK2UuY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1xyXG5cdF0vZywiICIpLG49MCxvPWkubGVuZ3RoO28+bjtuKyspcj1yLnJlcGxhY2UoIiAiK2lbbl0rIiAiLCIgIik7ZS5jbGFzc05hbWU9ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9cmV0dXJuIGV9LFZlPWZ1bmN0aW9uKGUsdCl7dmFyIG49cChlLG51bGwpLmdldFByb3BlcnR5VmFsdWUodCk7cmV0dXJuImN1cnNvciIhPT10fHxuJiYiYXV0byIhPT1ufHwiQSIhPT1lLm5vZGVOYW1lP246InBvaW50ZXIifSxGZT1mdW5jdGlvbihlKXt2YXIgdD17bGVmdDowLHRvcDowLHdpZHRoOjAsaGVpZ2h0OjB9O2lmKGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXt2YXIgbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89bC5wYWdlWE9mZnNldCxyPWwucGFnZVlPZmZzZXQsaT1hLmRvY3VtZW50RWxlbWVudC5jbGllbnRMZWZ0fHwwLHM9YS5kb2N1bWVudEVsZW1lbnQuY2xpZW50VG9wfHwwLHU9MCxjPTA7aWYoInJlbGF0aXZlIj09PVZlKGEuYm9keSwicG9zaXRpb24iKSl7dmFyIGg9YS5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9YS5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dT1oLmxlZnQtZC5sZWZ0fHwwLGM9aC50b3AtZC50b3B8fDB9dC5sZWZ0PW4ubGVmdCtvLWktdSx0LnRvcD1uLnRvcCtyLXMtYyx0LndpZHRoPSJ3aWR0aCJpbiBuP24ud2lkdGg6bi5yaWdodC1uLmxlZnQsdC5oZWlnaHQ9ImhlaWdodCJpbiBuP24uaGVpZ2h0Om4uYm90dG9tLW4udG9wfXJldHVybiB0fSxCZT1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4hMTt2YXIgdD1wKGUsbnVsbCksbj15KHQuaGVpZ2h0KT4wLG89eSh0LndpZHRoKT4wLHI9eSh0LnRvcCk+PTAsaT15KHQubGVmdCk+PTAscz1uJiZvJiZyJiZpLGw9cz9udWxsOkZlKGUpLGE9Im5vbmUiIT09dC5kaXNwbGF5JiYiY29sbGFwc2UiIT09dC52aXNpYmlsaXR5JiYoc3x8ISFsJiYobnx8bC5oZWlnaHQ+MCkmJihvfHxsLndpZHRoPjApJiYocnx8bC50b3A+PTApJiYoaXx8bC5sZWZ0Pj0wKSk7cmV0dXJuIGF9LHplPWZ1bmN0aW9uKCl7aChHKSxHPTAsZigkKSwkPTB9LFllPWZ1bmN0aW9uKCl7dmFyIGU7aWYoaSYmKGU9T2UoRi5icmlkZ2UpKSl7dmFyIHQ9RmUoaSk7TyhlLnN0eWxlLHt3aWR0aDp0LndpZHRoKyJweCIsaGVpZ2h0OnQuaGVpZ2h0KyJweCIsdG9wOnQudG9wKyJweCIsbGVmdDp0LmxlZnQrInB4Iix6SW5kZXg6IiIrR2UoUS56SW5kZXgpfSl9fSxVZT1mdW5jdGlvbihlKXtGLnJlYWR5PT09ITAmJihGLmJyaWRnZSYmImZ1bmN0aW9uIj09dHlwZW9mIEYuYnJpZGdlLnNldEhhbmRDdXJzb3I/Ri5icmlkZ2Uuc2V0SGFuZEN1cnNvcihlKTpGLnJlYWR5PSExKX0sR2U9ZnVuY3Rpb24oZSl7aWYoL14oPzphdXRvfGluaGVyaXQpJC8udGVzdChlKSlyZXR1cm4gZTt2YXIgdDtyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGV8fGIoZSk/InN0cmluZyI9PXR5cGVvZiBlJiYodD1HZSh2KGUsMTApKSk6dD1lLCJudW1iZXIiPT10eXBlb2YgdD90OiJhdXRvIn0sJGU9ZnVuY3Rpb24oZSl7dmFyIG4sbyxyLGk9Ri5zYW5kYm94ZWQscz1udWxsO2lmKGU9ZT09PSEwLFY9PT0hMSlzPSExO2Vsc2V7dHJ5e289dC5mcmFtZUVsZW1lbnR8fG51bGx9Y2F0Y2gobCl7cj17bmFtZTpsLm5hbWUsbWVzc2FnZTpsLm1lc3NhZ2V9fWlmKG8mJjE9PT1vLm5vZGVUeXBlJiYiSUZSQU1FIj09PW8ubm9kZU5hbWUpdHJ5e3M9by5oYXNBdHRyaWJ1dGUoInNhbmRib3giKX1jYXRjaChsKXtzPW51bGx9ZWxzZXt0cnl7bj1kb2N1bWVudC5kb21haW58fG51bGx9Y2F0Y2gobCl7bj1udWxsfShudWxsPT09bnx8ciYmIlNlY3VyaXR5RXJyb3IiPT09ci5uYW1lJiYvKF58W1xzXChcW0BdKXNhbmRib3goZXN8ZWR8aW5nfFtcc1wuLCFcKVxdQF18JCkvLnRlc3Qoci5tZXNzYWdlLnRvTG93ZXJDYXNlKCkpKSYmKHM9ITApfX1yZXR1cm4gRi5zYW5kYm94ZWQ9cyxpPT09c3x8ZXx8WGUobSksc30sWGU9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXt2YXIgdD1lLm1hdGNoKC9bXGRdKy9nKTtyZXR1cm4gdC5sZW5ndGg9Myx0LmpvaW4oIi4iKX1mdW5jdGlvbiBuKGUpe3JldHVybiEhZSYmKGU9ZS50b0xvd2VyQ2FzZSgpKSYmKC9eKHBlcGZsYXNocGxheWVyXC5kbGx8bGlicGVwZmxhc2hwbGF5ZXJcLnNvfHBlcHBlcmZsYXNocGxheWVyXC5wbHVnaW4pJC8udGVzdChlKXx8ImNocm9tZS5wbHVnaW4iPT09ZS5zbGljZSgtMTMpKX1mdW5jdGlvbiBvKGUpe2UmJihsPSEwLGUudmVyc2lvbiYmKGg9dChlLnZlcnNpb24pKSwhaCYmZS5kZXNjcmlwdGlvbiYmKGg9dChlLmRlc2NyaXB0aW9uKSksZS5maWxlbmFtZSYmKGM9bihlLmZpbGVuYW1lKSkpfXZhciByLGkscyxsPSExLGE9ITEsYz0hMSxoPSIiO2lmKHUucGx1Z2lucyYmdS5wbHVnaW5zLmxlbmd0aClyPXUucGx1Z2luc1siU2hvY2t3YXZlIEZsYXNoIl0sbyhyKSx1LnBsdWdpbnNbIlNob2Nrd2F2ZSBGbGFzaCAyLjAiXSYmKGw9ITAsaD0iMi4wLjAuMTEiKTtlbHNlIGlmKHUubWltZVR5cGVzJiZ1Lm1pbWVUeXBlcy5sZW5ndGgpcz11Lm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSxyPXMmJnMuZW5hYmxlZFBsdWdpbixvKHIpO2Vsc2UgaWYoInVuZGVmaW5lZCIhPXR5cGVvZiBlKXthPSEwO3RyeXtpPW5ldyBlKCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaC43IiksbD0hMCxoPXQoaS5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKSl9Y2F0Y2goZCl7dHJ5e2k9bmV3IGUoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSxsPSEwLGg9IjYuMC4yMSJ9Y2F0Y2goZil7dHJ5e2k9bmV3IGUoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIiksbD0hMCxoPXQoaS5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKSl9Y2F0Y2gocCl7YT0hMX19fX1GLmRpc2FibGVkPWwhPT0hMCxGLm91dGRhdGVkPWgmJnkoaCk8eShCKSxGLnZlcnNpb249aHx8IjAuMC4wIixGLnBsdWdpblR5cGU9Yz8icGVwcGVyIjphPyJhY3RpdmV4IjpsPyJuZXRzY2FwZSI6InVua25vd24ifTtYZShtKSwkZSghMCk7dmFyIEtlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBLZT92b2lkKCJmdW5jdGlvbiI9PXR5cGVvZiBLZS5fY3JlYXRlQ2xpZW50JiZLZS5fY3JlYXRlQ2xpZW50LmFwcGx5KHRoaXMsTShhcmd1bWVudHMpKSk6bmV3IEtlfTtSKEtlLCJ2ZXJzaW9uIix7dmFsdWU6IjIuMi4wIix3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pLEtlLmNvbmZpZz1mdW5jdGlvbigpe3JldHVybiBlZS5hcHBseSh0aGlzLE0oYXJndW1lbnRzKSl9LEtlLnN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRlLmFwcGx5KHRoaXMsTShhcmd1bWVudHMpKX0sS2UuaXNGbGFzaFVudXNhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIG5lLmFwcGx5KHRoaXMsTShhcmd1bWVudHMpKX0sS2Uub249ZnVuY3Rpb24oKXtyZXR1cm4gb2UuYXBwbHkodGhpcyxNKGFyZ3VtZW50cykpfSxLZS5vZmY9ZnVuY3Rpb24oKXtyZXR1cm4gcmUuYXBwbHkodGhpcyxNKGFyZ3VtZW50cykpfSxLZS5oYW5kbGVycz1mdW5jdGlvbigpe3JldHVybiBpZS5hcHBseSh0aGlzLE0oYXJndW1lbnRzKSl9LEtlLmVtaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gc2UuYXBwbHkodGhpcyxNKGFyZ3VtZW50cykpfSxLZS5jcmVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbGUuYXBwbHkodGhpcyxNKGFyZ3VtZW50cykpfSxLZS5kZXN0cm95PWZ1bmN0aW9uKCl7cmV0dXJuIGFlLmFwcGx5KHRoaXMsTShhcmd1bWVudHMpKX0sS2Uuc2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB1ZS5hcHBseSh0aGlzLE0oYXJndW1lbnRzKSl9LEtlLmNsZWFyRGF0YT1mdW5jdGlvbigpe3JldHVybiBjZS5hcHBseSh0aGlzLE0oYXJndW1lbnRzKSl9LEtlLmdldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gaGUuYXBwbHkodGhpcyxNKGFyZ3VtZW50cykpfSxLZS5mb2N1cz1LZS5hY3RpdmF0ZT1mdW5jdGlvbigpe3JldHVybiBkZS5hcHBseSh0aGlzLE0oYXJndW1lbnRzKSl9LEtlLmJsdXI9S2UuZGVhY3RpdmF0ZT1mdW5jdGlvbigpe3JldHVybiBmZS5hcHBseSh0aGlzLE0oYXJndW1lbnRzKSl9LEtlLmFjdGl2ZUVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gcGUuYXBwbHkodGhpcyxNKGFyZ3VtZW50cykpfTt2YXIgcWU9MCxaZT17fSxKZT0wLFFlPXt9LGV0PXt9O08oUSx7YXV0b0FjdGl2YXRlOiEwfSk7dmFyIHR0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5pZD0iIitxZSsrLFplW3QuaWRdPXtpbnN0YW5jZTp0LGVsZW1lbnRzOltdLGhhbmRsZXJzOnt9fSxlJiZ0LmNsaXAoZSksS2Uub24oIioiLGZ1bmN0aW9uKGUpe3JldHVybiB0LmVtaXQoZSl9KSxLZS5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXt0LmRlc3Ryb3koKX0pLEtlLmNyZWF0ZSgpfSxudD1mdW5jdGlvbihlLHQpe3ZhciBuLGkscyxsPXt9LGE9WmVbdGhpcy5pZF0sdT1hJiZhLmhhbmRsZXJzO2lmKCFhKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIGFkZCBuZXcgbGlzdGVuZXIocykgdG8gYSBkZXN0cm95ZWQgWmVyb0NsaXBib2FyZCBjbGllbnQgaW5zdGFuY2UiKTtpZigic3RyaW5nIj09dHlwZW9mIGUmJmUpcz1lLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xzKy8pO2Vsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiBlJiZlJiYidW5kZWZpbmVkIj09dHlwZW9mIHQpZm9yKG4gaW4gZSlTLmNhbGwoZSxuKSYmInN0cmluZyI9PXR5cGVvZiBuJiZuJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtuXSYmdGhpcy5vbihuLGVbbl0pO2lmKHMmJnMubGVuZ3RoKXtmb3Iobj0wLGk9cy5sZW5ndGg7aT5uO24rKyllPXNbbl0ucmVwbGFjZSgvXm9uLywiIiksbFtlXT0hMCx1W2VdfHwodVtlXT1bXSksdVtlXS5wdXNoKHQpO2lmKGwucmVhZHkmJkYucmVhZHkmJnRoaXMuZW1pdCh7dHlwZToicmVhZHkiLGNsaWVudDp0aGlzfSksbC5lcnJvcil7Zm9yKG49MCxpPXEubGVuZ3RoO2k+bjtuKyspaWYoRltxW25dLnJlcGxhY2UoL15mbGFzaC0vLCIiKV0pe3RoaXMuZW1pdCh7dHlwZToiZXJyb3IiLG5hbWU6cVtuXSxjbGllbnQ6dGhpc30pO2JyZWFrfXIhPT1vJiZLZS52ZXJzaW9uIT09ciYmdGhpcy5lbWl0KHt0eXBlOiJlcnJvciIsbmFtZToidmVyc2lvbi1taXNtYXRjaCIsanNWZXJzaW9uOktlLnZlcnNpb24sc3dmVmVyc2lvbjpyfSl9fXJldHVybiB0aGlzfSxvdD1mdW5jdGlvbihlLHQpe3ZhciBuLG8scixpLHMsbD1aZVt0aGlzLmlkXSxhPWwmJmwuaGFuZGxlcnM7aWYoIWEpcmV0dXJuIHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpaT1fKGEpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBlJiZlKWk9ZS5zcGxpdCgvXHMrLyk7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGUmJmUmJiJ1bmRlZmluZWQiPT10eXBlb2YgdClmb3IobiBpbiBlKVMuY2FsbChlLG4pJiYic3RyaW5nIj09dHlwZW9mIG4mJm4mJiJmdW5jdGlvbiI9PXR5cGVvZiBlW25dJiZ0aGlzLm9mZihuLGVbbl0pO2lmKGkmJmkubGVuZ3RoKWZvcihuPTAsbz1pLmxlbmd0aDtvPm47bisrKWlmKGU9aVtuXS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15vbi8sIiIpLHM9YVtlXSxzJiZzLmxlbmd0aClpZih0KWZvcihyPXMuaW5kZXhPZih0KTstMSE9PXI7KXMuc3BsaWNlKHIsMSkscj1zLmluZGV4T2YodCxyKTtlbHNlIHMubGVuZ3RoPTA7cmV0dXJuIHRoaXN9LHJ0PWZ1bmN0aW9uKGUpe3ZhciB0PW51bGwsbj1aZVt0aGlzLmlkXSYmWmVbdGhpcy5pZF0uaGFuZGxlcnM7cmV0dXJuIG4mJih0PSJzdHJpbmciPT10eXBlb2YgZSYmZT9uW2VdP25bZV0uc2xpY2UoMCk6W106ayhuKSksdH0saXQ9ZnVuY3Rpb24oZSl7aWYoY3QuY2FsbCh0aGlzLGUpKXsib2JqZWN0Ij09dHlwZW9mIGUmJmUmJiJzdHJpbmciPT10eXBlb2YgZS50eXBlJiZlLnR5cGUmJihlPU8oe30sZSkpO3ZhciB0PU8oe30sbWUoZSkse2NsaWVudDp0aGlzfSk7aHQuY2FsbCh0aGlzLHQpfXJldHVybiB0aGlzfSxzdD1mdW5jdGlvbihlKXtpZighWmVbdGhpcy5pZF0pdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gY2xpcCBlbGVtZW50KHMpIHRvIGEgZGVzdHJveWVkIFplcm9DbGlwYm9hcmQgY2xpZW50IGluc3RhbmNlIik7ZT1kdChlKTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihTLmNhbGwoZSx0KSYmZVt0XSYmMT09PWVbdF0ubm9kZVR5cGUpe2VbdF0uemNDbGlwcGluZ0lkPy0xPT09UWVbZVt0XS56Y0NsaXBwaW5nSWRdLmluZGV4T2YodGhpcy5pZCkmJlFlW2VbdF0uemNDbGlwcGluZ0lkXS5wdXNoKHRoaXMuaWQpOihlW3RdLnpjQ2xpcHBpbmdJZD0iemNDbGlwcGluZ0lkXyIrSmUrKyxRZVtlW3RdLnpjQ2xpcHBpbmdJZF09W3RoaXMuaWRdLFEuYXV0b0FjdGl2YXRlPT09ITAmJmZ0KGVbdF0pKTt2YXIgbj1aZVt0aGlzLmlkXSYmWmVbdGhpcy5pZF0uZWxlbWVudHM7LTE9PT1uLmluZGV4T2YoZVt0XSkmJm4ucHVzaChlW3RdKX1yZXR1cm4gdGhpc30sbHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9WmVbdGhpcy5pZF07aWYoIXQpcmV0dXJuIHRoaXM7dmFyIG4sbz10LmVsZW1lbnRzO2U9InVuZGVmaW5lZCI9PXR5cGVvZiBlP28uc2xpY2UoMCk6ZHQoZSk7Zm9yKHZhciByPWUubGVuZ3RoO3ItLTspaWYoUy5jYWxsKGUscikmJmVbcl0mJjE9PT1lW3JdLm5vZGVUeXBlKXtmb3Iobj0wOy0xIT09KG49by5pbmRleE9mKGVbcl0sbikpOylvLnNwbGljZShuLDEpO3ZhciBpPVFlW2Vbcl0uemNDbGlwcGluZ0lkXTtpZihpKXtmb3Iobj0wOy0xIT09KG49aS5pbmRleE9mKHRoaXMuaWQsbikpOylpLnNwbGljZShuLDEpOzA9PT1pLmxlbmd0aCYmKFEuYXV0b0FjdGl2YXRlPT09ITAmJnB0KGVbcl0pLGRlbGV0ZSBlW3JdLnpjQ2xpcHBpbmdJZCl9fXJldHVybiB0aGlzfSxhdD1mdW5jdGlvbigpe3ZhciBlPVplW3RoaXMuaWRdO3JldHVybiBlJiZlLmVsZW1lbnRzP2UuZWxlbWVudHMuc2xpY2UoMCk6W119LHV0PWZ1bmN0aW9uKCl7WmVbdGhpcy5pZF0mJih0aGlzLnVuY2xpcCgpLHRoaXMub2ZmKCksZGVsZXRlIFplW3RoaXMuaWRdKX0sY3Q9ZnVuY3Rpb24oZSl7aWYoIWV8fCFlLnR5cGUpcmV0dXJuITE7aWYoZS5jbGllbnQmJmUuY2xpZW50IT09dGhpcylyZXR1cm4hMTt2YXIgdD1aZVt0aGlzLmlkXSxuPXQmJnQuZWxlbWVudHMsbz0hIW4mJm4ubGVuZ3RoPjAscj0hZS50YXJnZXR8fG8mJi0xIT09bi5pbmRleE9mKGUudGFyZ2V0KSxpPWUucmVsYXRlZFRhcmdldCYmbyYmLTEhPT1uLmluZGV4T2YoZS5yZWxhdGVkVGFyZ2V0KSxzPWUuY2xpZW50JiZlLmNsaWVudD09PXRoaXM7cmV0dXJuISghdHx8IShyfHxpfHxzKSl9LGh0PWZ1bmN0aW9uKGUpe3ZhciB0PVplW3RoaXMuaWRdO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS50eXBlJiZ0KXt2YXIgbj15ZShlKSxvPXQmJnQuaGFuZGxlcnNbIioiXXx8W10scj10JiZ0LmhhbmRsZXJzW2UudHlwZV18fFtdLGk9by5jb25jYXQocik7aWYoaSYmaS5sZW5ndGgpe3ZhciBzLGEsdSxjLGgsZD10aGlzO2ZvcihzPTAsYT1pLmxlbmd0aDthPnM7cysrKXU9aVtzXSxjPWQsInN0cmluZyI9PXR5cGVvZiB1JiYiZnVuY3Rpb24iPT10eXBlb2YgbFt1XSYmKHU9bFt1XSksIm9iamVjdCI9PXR5cGVvZiB1JiZ1JiYiZnVuY3Rpb24iPT10eXBlb2YgdS5oYW5kbGVFdmVudCYmKGM9dSx1PXUuaGFuZGxlRXZlbnQpLCJmdW5jdGlvbiI9PXR5cGVvZiB1JiYoaD1PKHt9LGUpLGJlKHUsYyxbaF0sbikpfX19LGR0PWZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmKGU9W10pLCJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGg/W2VdOmV9LGZ0PWZ1bmN0aW9uKGUpe2lmKGUmJjE9PT1lLm5vZGVUeXBlKXt2YXIgdD1mdW5jdGlvbihlKXsoZXx8KGU9bC5ldmVudCkpJiYoImpzIiE9PWUuX3NvdXJjZSYmKGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpKSxkZWxldGUgZS5fc291cmNlKX0sbj1mdW5jdGlvbihuKXsobnx8KG49bC5ldmVudCkpJiYodChuKSxLZS5mb2N1cyhlKSl9O2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixuLCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0LCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHQsITEpLGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdCwhMSksZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHQsITEpLGV0W2UuemNDbGlwcGluZ0lkXT17bW91c2VvdmVyOm4sbW91c2VvdXQ6dCxtb3VzZWVudGVyOnQsbW91c2VsZWF2ZTp0LG1vdXNlbW92ZTp0fX19LHB0PWZ1bmN0aW9uKGUpe2lmKGUmJjE9PT1lLm5vZGVUeXBlKXt2YXIgdD1ldFtlLnpjQ2xpcHBpbmdJZF07aWYoIm9iamVjdCI9PXR5cGVvZiB0JiZ0KXtmb3IodmFyIG4sbyxyPVsibW92ZSIsImxlYXZlIiwiZW50ZXIiLCJvdXQiLCJvdmVyIl0saT0wLHM9ci5sZW5ndGg7cz5pO2krKyluPSJtb3VzZSIrcltpXSxvPXRbbl0sImZ1bmN0aW9uIj09dHlwZW9mIG8mJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLG8sITEpO2RlbGV0ZSBldFtlLnpjQ2xpcHBpbmdJZF19fX07S2UuX2NyZWF0ZUNsaWVudD1mdW5jdGlvbigpe3R0LmFwcGx5KHRoaXMsTShhcmd1bWVudHMpKX0sS2UucHJvdG90eXBlLm9uPWZ1bmN0aW9uKCl7cmV0dXJuIG50LmFwcGx5KHRoaXMsTShhcmd1bWVudHMpKX0sS2UucHJvdG90eXBlLm9mZj1mdW5jdGlvbigpe3JldHVybiBvdC5hcHBseSh0aGlzLE0oYXJndW1lbnRzKSl9LEtlLnByb3RvdHlwZS5oYW5kbGVycz1mdW5jdGlvbigpe3JldHVybiBydC5hcHBseSh0aGlzLE0oYXJndW1lbnRzKSl9LEtlLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKCl7cmV0dXJuIGl0LmFwcGx5KHRoaXMsTShhcmd1bWVudHMpKX0sS2UucHJvdG90eXBlLmNsaXA9ZnVuY3Rpb24oKXtyZXR1cm4gc3QuYXBwbHkodGhpcyxNKGFyZ3VtZW50cykpfSxLZS5wcm90b3R5cGUudW5jbGlwPWZ1bmN0aW9uKCl7cmV0dXJuIGx0LmFwcGx5KHRoaXMsTShhcmd1bWVudHMpKX0sS2UucHJvdG90eXBlLmVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIGF0LmFwcGx5KHRoaXMsTShhcmd1bWVudHMpKX0sS2UucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtyZXR1cm4gdXQuYXBwbHkodGhpcyxNKGFyZ3VtZW50cykpfSxLZS5wcm90b3R5cGUuc2V0VGV4dD1mdW5jdGlvbihlKXtpZighWmVbdGhpcy5pZF0pdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gc2V0IHBlbmRpbmcgY2xpcGJvYXJkIGRhdGEgZnJvbSBhIGRlc3Ryb3llZCBaZXJvQ2xpcGJvYXJkIGNsaWVudCBpbnN0YW5jZSIpO3JldHVybiBLZS5zZXREYXRhKCJ0ZXh0L3BsYWluIixlKSx0aGlzfSxLZS5wcm90b3R5cGUuc2V0SHRtbD1mdW5jdGlvbihlKXtpZighWmVbdGhpcy5pZF0pdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gc2V0IHBlbmRpbmcgY2xpcGJvYXJkIGRhdGEgZnJvbSBhIGRlc3Ryb3llZCBaZXJvQ2xpcGJvYXJkIGNsaWVudCBpbnN0YW5jZSIpO3JldHVybiBLZS5zZXREYXRhKCJ0ZXh0L2h0bWwiLGUpLHRoaXN9LEtlLnByb3RvdHlwZS5zZXRSaWNoVGV4dD1mdW5jdGlvbihlKXtpZighWmVbdGhpcy5pZF0pdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gc2V0IHBlbmRpbmcgY2xpcGJvYXJkIGRhdGEgZnJvbSBhIGRlc3Ryb3llZCBaZXJvQ2xpcGJvYXJkIGNsaWVudCBpbnN0YW5jZSIpO3JldHVybiBLZS5zZXREYXRhKCJhcHBsaWNhdGlvbi9ydGYiLGUpLHRoaXN9LEtlLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKCl7aWYoIVplW3RoaXMuaWRdKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIHNldCBwZW5kaW5nIGNsaXBib2FyZCBkYXRhIGZyb20gYSBkZXN0cm95ZWQgWmVyb0NsaXBib2FyZCBjbGllbnQgaW5zdGFuY2UiKTtyZXR1cm4gS2Uuc2V0RGF0YS5hcHBseSh0aGlzLE0oYXJndW1lbnRzKSksdGhpc30sS2UucHJvdG90eXBlLmNsZWFyRGF0YT1mdW5jdGlvbigpe2lmKCFaZVt0aGlzLmlkXSl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byBjbGVhciBwZW5kaW5nIGNsaXBib2FyZCBkYXRhIGZyb20gYSBkZXN0cm95ZWQgWmVyb0NsaXBib2FyZCBjbGllbnQgaW5zdGFuY2UiKTtyZXR1cm4gS2UuY2xlYXJEYXRhLmFwcGx5KHRoaXMsTShhcmd1bWVudHMpKSx0aGlzfSxLZS5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbigpe2lmKCFaZVt0aGlzLmlkXSl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byBnZXQgcGVuZGluZyBjbGlwYm9hcmQgZGF0YSBmcm9tIGEgZGVzdHJveWVkIFplcm9DbGlwYm9hcmQgY2xpZW50IGluc3RhbmNlIik7cmV0dXJuIEtlLmdldERhdGEuYXBwbHkodGhpcyxNKGFyZ3VtZW50cykpfSwiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5hbWQ/ZShmdW5jdGlvbigpe3JldHVybiBLZX0pOiJvYmplY3QiPT10eXBlb2YgbiYmbiYmIm9iamVjdCI9PXR5cGVvZiBuLmV4cG9ydHMmJm4uZXhwb3J0cz9uLmV4cG9ydHM9S2U6dC5aZXJvQ2xpcGJvYXJkPUtlfShmdW5jdGlvbigpe3JldHVybiB0aGlzfHx3aW5kb3d9KCkpfSx7fV19LHt9LFsyMyw2MSw2Myw2Miw2NCw4NSw4Niw4Nyw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4OCw4OSw5MCw5MSwxMDUsMTA2LDEwNywxMDgsOTQsOTUsOTYsOTcsOTgsOTksMzEsMzUsMzIsMzMsNDAsMzQsMzYsMzcsMzgsMzldKSgyMyl9KTs="></script>
<script src="data:application/x-javascript;base64,LyohIA0KICogbnVtZXJhbC5qcyBsYW5ndWFnZSBjb25maWd1cmF0aW9uDQogKiBsYW5ndWFnZSA6IGJlbGdpdW0tZHV0Y2ggKGJlLW5sKQ0KICogYXV0aG9yIDogRGlldGVyIEx1eXBhZXJ0IDogaHR0cHM6Ly9naXRodWIuY29tL21vZXJpa2kNCiAqLw0KKGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbGFuZ3VhZ2UgPSB7DQogICAgICAgIGRlbGltaXRlcnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kczogJyAnLA0KICAgICAgICAgICAgZGVjaW1hbCAgOiAnLCcNCiAgICAgICAgfSwNCiAgICAgICAgYWJicmV2aWF0aW9uczogew0KICAgICAgICAgICAgdGhvdXNhbmQgOiAnaycsDQogICAgICAgICAgICBtaWxsaW9uICA6ICcgbWxuJywNCiAgICAgICAgICAgIGJpbGxpb24gIDogJyBtbGQnLA0KICAgICAgICAgICAgdHJpbGxpb24gOiAnIGJsbicNCiAgICAgICAgfSwNCiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHsNCiAgICAgICAgICAgIHZhciByZW1haW5kZXIgPSBudW1iZXIgJSAxMDA7DQogICAgICAgICAgICByZXR1cm4gKG51bWJlciAhPT0gMCAmJiByZW1haW5kZXIgPD0gMSB8fCByZW1haW5kZXIgPT09IDggfHwgcmVtYWluZGVyID49IDIwKSA/ICdzdGUnIDogJ2RlJzsNCiAgICAgICAgfSwNCiAgICAgICAgY3VycmVuY3k6IHsNCiAgICAgICAgICAgIHN5bWJvbDogJ+KCrCAnDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdiZS1ubCcsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KLyohIA0KICogbnVtZXJhbC5qcyBsYW5ndWFnZSBjb25maWd1cmF0aW9uDQogKiBsYW5ndWFnZSA6IHNpbXBsaWZpZWQgY2hpbmVzZQ0KICogYXV0aG9yIDogYmFkcGx1bSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYWRwbHVtDQogKi8NCihmdW5jdGlvbiAoKSB7DQogICAgdmFyIGxhbmd1YWdlID0gew0KICAgICAgICBkZWxpbWl0ZXJzOiB7DQogICAgICAgICAgICB0aG91c2FuZHM6ICcsJywNCiAgICAgICAgICAgIGRlY2ltYWw6ICcuJw0KICAgICAgICB9LA0KICAgICAgICBhYmJyZXZpYXRpb25zOiB7DQogICAgICAgICAgICB0aG91c2FuZDogJ+WNgycsDQogICAgICAgICAgICBtaWxsaW9uOiAn55m+5LiHJywNCiAgICAgICAgICAgIGJpbGxpb246ICfljYHkur8nLA0KICAgICAgICAgICAgdHJpbGxpb246ICflhYYnDQogICAgICAgIH0sDQogICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHsNCiAgICAgICAgICAgIHJldHVybiAnLic7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICfCpScNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvLyBOb2RlDQogICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGFuZ3VhZ2U7DQogICAgfQ0KICAgIC8vIEJyb3dzZXINCiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5udW1lcmFsICYmIHRoaXMubnVtZXJhbC5sYW5ndWFnZSkgew0KICAgICAgICB0aGlzLm51bWVyYWwubGFuZ3VhZ2UoJ2NocycsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KDQovKiENCiAqIG51bWVyYWwuanMgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbg0KICogbGFuZ3VhZ2UgOiBjemVjaCAoY3MpDQogKiBhdXRob3IgOiBBbmF0b2xpIFBhcGlyb3Zza2kgOiBodHRwczovL2dpdGh1Yi5jb20vYXBhcGlyb3Zza2kNCiAqLw0KKGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbGFuZ3VhZ2UgPSB7DQogICAgICAgIGRlbGltaXRlcnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kczogJyAnLA0KICAgICAgICAgICAgZGVjaW1hbDogJywnDQogICAgICAgIH0sDQogICAgICAgIGFiYnJldmlhdGlvbnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kOiAndGlzLicsDQogICAgICAgICAgICBtaWxsaW9uOiAnbWlsLicsDQogICAgICAgICAgICBiaWxsaW9uOiAnYicsDQogICAgICAgICAgICB0cmlsbGlvbjogJ3QnDQogICAgICAgIH0sDQogICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHJldHVybiAnLic7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICdLxI0nDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdjcycsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KDQovKiEgDQogKiBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCiAqIGxhbmd1YWdlIDogZGFuaXNoIGRlbm1hcmsgKGRrKQ0KICogYXV0aG9yIDogTWljaGFlbCBTdG9yZ2FhcmQgOiBodHRwczovL2dpdGh1Yi5jb20vbXN0b3JnYWFyZA0KICovDQooZnVuY3Rpb24gKCkgew0KICAgIHZhciBsYW5ndWFnZSA9IHsNCiAgICAgICAgZGVsaW1pdGVyczogew0KICAgICAgICAgICAgdGhvdXNhbmRzOiAnLicsDQogICAgICAgICAgICBkZWNpbWFsOiAnLCcNCiAgICAgICAgfSwNCiAgICAgICAgYWJicmV2aWF0aW9uczogew0KICAgICAgICAgICAgdGhvdXNhbmQ6ICdrJywNCiAgICAgICAgICAgIG1pbGxpb246ICdtaW8nLA0KICAgICAgICAgICAgYmlsbGlvbjogJ21pYScsDQogICAgICAgICAgICB0cmlsbGlvbjogJ2InDQogICAgICAgIH0sDQogICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHsNCiAgICAgICAgICAgIHJldHVybiAnLic7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICdES0snDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdkYS1kaycsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KLyohIA0KICogbnVtZXJhbC5qcyBsYW5ndWFnZSBjb25maWd1cmF0aW9uDQogKiBsYW5ndWFnZSA6IEdlcm1hbiBpbiBTd2l0emVybGFuZCAoZGUtY2gpDQogKiBhdXRob3IgOiBNaWNoYWVsIFBpZWZlbCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9waWVmZWwgKGJhc2VkIG9uIHdvcmsgZnJvbSBNYXJjbyBLcmFnZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5reSkNCiAqLyANCihmdW5jdGlvbiAoKSB7DQogICAgdmFyIGxhbmd1YWdlID0gew0KICAgICAgICBkZWxpbWl0ZXJzOiB7DQogICAgICAgICAgICB0aG91c2FuZHM6ICcgJywNCiAgICAgICAgICAgIGRlY2ltYWw6ICcsJw0KICAgICAgICB9LA0KICAgICAgICBhYmJyZXZpYXRpb25zOiB7DQogICAgICAgICAgICB0aG91c2FuZDogJ2snLA0KICAgICAgICAgICAgbWlsbGlvbjogJ20nLA0KICAgICAgICAgICAgYmlsbGlvbjogJ2InLA0KICAgICAgICAgICAgdHJpbGxpb246ICd0Jw0KICAgICAgICB9LA0KICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7DQogICAgICAgICAgICByZXR1cm4gJy4nOw0KICAgICAgICB9LA0KICAgICAgICBjdXJyZW5jeTogew0KICAgICAgICAgICAgc3ltYm9sOiAnQ0hGJw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8vIE5vZGUNCiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBsYW5ndWFnZTsNCiAgICB9DQogICAgLy8gQnJvd3Nlcg0KICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm51bWVyYWwgJiYgdGhpcy5udW1lcmFsLmxhbmd1YWdlKSB7DQogICAgICAgIHRoaXMubnVtZXJhbC5sYW5ndWFnZSgnZGUtY2gnLCBsYW5ndWFnZSk7DQogICAgfQ0KfSgpKTsNCi8qISANCiAqIG51bWVyYWwuanMgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbg0KICogbGFuZ3VhZ2UgOiBHZXJtYW4gKGRlKSDigJMgZ2VuZXJhbGx5IHVzZWZ1bCBpbiBHZXJtYW55LCBBdXN0cmlhLCBMdXhlbWJvdXJnLCBCZWxnaXVtDQogKiBhdXRob3IgOiBNYXJjbyBLcmFnZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5reQ0KICovDQooZnVuY3Rpb24gKCkgew0KICAgIHZhciBsYW5ndWFnZSA9IHsNCiAgICAgICAgZGVsaW1pdGVyczogew0KICAgICAgICAgICAgdGhvdXNhbmRzOiAnICcsDQogICAgICAgICAgICBkZWNpbWFsOiAnLCcNCiAgICAgICAgfSwNCiAgICAgICAgYWJicmV2aWF0aW9uczogew0KICAgICAgICAgICAgdGhvdXNhbmQ6ICdrJywNCiAgICAgICAgICAgIG1pbGxpb246ICdtJywNCiAgICAgICAgICAgIGJpbGxpb246ICdiJywNCiAgICAgICAgICAgIHRyaWxsaW9uOiAndCcNCiAgICAgICAgfSwNCiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikgew0KICAgICAgICAgICAgcmV0dXJuICcuJzsNCiAgICAgICAgfSwNCiAgICAgICAgY3VycmVuY3k6IHsNCiAgICAgICAgICAgIHN5bWJvbDogJ+KCrCcNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvLyBOb2RlDQogICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGFuZ3VhZ2U7DQogICAgfQ0KICAgIC8vIEJyb3dzZXINCiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5udW1lcmFsICYmIHRoaXMubnVtZXJhbC5sYW5ndWFnZSkgew0KICAgICAgICB0aGlzLm51bWVyYWwubGFuZ3VhZ2UoJ2RlJywgbGFuZ3VhZ2UpOw0KICAgIH0NCn0oKSk7DQovKiEgDQogKiBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCiAqIGxhbmd1YWdlIDogZW5nbGlzaCB1bml0ZWQga2luZ2RvbSAodWspDQogKiBhdXRob3IgOiBEYW4gUmlzdGljIDogaHR0cHM6Ly9naXRodWIuY29tL2RyaXN0aWMNCiAqLw0KKGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbGFuZ3VhZ2UgPSB7DQogICAgICAgIGRlbGltaXRlcnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kczogJywnLA0KICAgICAgICAgICAgZGVjaW1hbDogJy4nDQogICAgICAgIH0sDQogICAgICAgIGFiYnJldmlhdGlvbnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kOiAnaycsDQogICAgICAgICAgICBtaWxsaW9uOiAnbScsDQogICAgICAgICAgICBiaWxsaW9uOiAnYicsDQogICAgICAgICAgICB0cmlsbGlvbjogJ3QnDQogICAgICAgIH0sDQogICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHsNCiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTA7DQogICAgICAgICAgICByZXR1cm4gKH5+IChudW1iZXIgJSAxMDAgLyAxMCkgPT09IDEpID8gJ3RoJyA6DQogICAgICAgICAgICAgICAgKGIgPT09IDEpID8gJ3N0JyA6DQogICAgICAgICAgICAgICAgKGIgPT09IDIpID8gJ25kJyA6DQogICAgICAgICAgICAgICAgKGIgPT09IDMpID8gJ3JkJyA6ICd0aCc7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICfCoycNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvLyBOb2RlDQogICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGFuZ3VhZ2U7DQogICAgfQ0KICAgIC8vIEJyb3dzZXINCiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5udW1lcmFsICYmIHRoaXMubnVtZXJhbC5sYW5ndWFnZSkgew0KICAgICAgICB0aGlzLm51bWVyYWwubGFuZ3VhZ2UoJ2VuLWdiJywgbGFuZ3VhZ2UpOw0KICAgIH0NCn0oKSk7DQovKiEgDQogKiBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCiAqIGxhbmd1YWdlIDogc3BhbmlzaCBTcGFpbg0KICogYXV0aG9yIDogSGVybmFuIEdhcmNpYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oZ2FyY2lhDQogKi8NCihmdW5jdGlvbiAoKSB7DQogICAgdmFyIGxhbmd1YWdlID0gew0KICAgICAgICBkZWxpbWl0ZXJzOiB7DQogICAgICAgICAgICB0aG91c2FuZHM6ICcuJywNCiAgICAgICAgICAgIGRlY2ltYWw6ICcsJw0KICAgICAgICB9LA0KICAgICAgICBhYmJyZXZpYXRpb25zOiB7DQogICAgICAgICAgICB0aG91c2FuZDogJ2snLA0KICAgICAgICAgICAgbWlsbGlvbjogJ21tJywNCiAgICAgICAgICAgIGJpbGxpb246ICdiJywNCiAgICAgICAgICAgIHRyaWxsaW9uOiAndCcNCiAgICAgICAgfSwNCiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikgew0KICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMDsNCiAgICAgICAgICAgIHJldHVybiAoYiA9PT0gMSB8fCBiID09PSAzKSA/ICdlcicgOg0KICAgICAgICAgICAgICAgIChiID09PSAyKSA/ICdkbycgOg0KICAgICAgICAgICAgICAgICAgICAoYiA9PT0gNyB8fCBiID09PSAwKSA/ICdtbycgOg0KICAgICAgICAgICAgICAgICAgICAgICAgKGIgPT09IDgpID8gJ3ZvJyA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGIgPT09IDkpID8gJ25vJyA6ICd0byc7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICfigqwnDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdlcycsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KDQovKiEgDQogKiBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCiAqIGxhbmd1YWdlIDogc3BhbmlzaA0KICogYXV0aG9yIDogSGVybmFuIEdhcmNpYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oZ2FyY2lhDQogKi8NCihmdW5jdGlvbiAoKSB7DQogICAgdmFyIGxhbmd1YWdlID0gew0KICAgICAgICBkZWxpbWl0ZXJzOiB7DQogICAgICAgICAgICB0aG91c2FuZHM6ICcuJywNCiAgICAgICAgICAgIGRlY2ltYWw6ICcsJw0KICAgICAgICB9LA0KICAgICAgICBhYmJyZXZpYXRpb25zOiB7DQogICAgICAgICAgICB0aG91c2FuZDogJ2snLA0KICAgICAgICAgICAgbWlsbGlvbjogJ21tJywNCiAgICAgICAgICAgIGJpbGxpb246ICdiJywNCiAgICAgICAgICAgIHRyaWxsaW9uOiAndCcNCiAgICAgICAgfSwNCiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikgew0KICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMDsNCiAgICAgICAgICAgIHJldHVybiAoYiA9PT0gMSB8fCBiID09PSAzKSA/ICdlcicgOg0KICAgICAgICAgICAgICAgIChiID09PSAyKSA/ICdkbycgOg0KICAgICAgICAgICAgICAgIChiID09PSA3IHx8IGIgPT09IDApID8gJ21vJyA6IA0KCQkoYiA9PT0gOCkgPyAndm8nIDoNCgkJKGIgPT09IDkpID8gJ25vJyA6ICd0byc7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICckJw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8vIE5vZGUNCiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBsYW5ndWFnZTsNCiAgICB9DQogICAgLy8gQnJvd3Nlcg0KICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm51bWVyYWwgJiYgdGhpcy5udW1lcmFsLmxhbmd1YWdlKSB7DQogICAgICAgIHRoaXMubnVtZXJhbC5sYW5ndWFnZSgnZXMnLCBsYW5ndWFnZSk7DQogICAgfQ0KfSgpKTsNCg0KLyohIA0KICogbnVtZXJhbC5qcyBsYW5ndWFnZSBjb25maWd1cmF0aW9uDQogKiBsYW5ndWFnZSA6IEVzdG9uaWFuDQogKiBhdXRob3IgOiBJbGxpbWFyIFRhbWJlayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYWd1bGthDQogKg0KICogTm90ZTogaW4gRXN0b25pYW4sIGFiYnJldmlhdGlvbnMgYXJlIGFsd2F5cyBzZXBhcmF0ZWQNCiAqIGZyb20gbnVtYmVycyB3aXRoIGEgc3BhY2UNCiAqLw0KKGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbGFuZ3VhZ2UgPSB7DQogICAgICAgIGRlbGltaXRlcnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kczogJyAnLA0KICAgICAgICAgICAgZGVjaW1hbDogJywnDQogICAgICAgIH0sDQogICAgICAgIGFiYnJldmlhdGlvbnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kOiAnIHR1aCcsDQogICAgICAgICAgICBtaWxsaW9uOiAnIG1sbicsDQogICAgICAgICAgICBiaWxsaW9uOiAnIG1sZCcsDQogICAgICAgICAgICB0cmlsbGlvbjogJyB0cmwnDQogICAgICAgIH0sDQogICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHsNCiAgICAgICAgICAgIHJldHVybiAnLic7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICfigqwnDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdldCcsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KDQovKiEgDQogKiBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCiAqIGxhbmd1YWdlIDogRmlubmlzaA0KICogYXV0aG9yIDogU2FtaSBTYWFkYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYW1pdGhlYmVyYmVyDQogKi8NCihmdW5jdGlvbiAoKSB7DQogICAgdmFyIGxhbmd1YWdlID0gew0KICAgICAgICBkZWxpbWl0ZXJzOiB7DQogICAgICAgICAgICB0aG91c2FuZHM6ICcgJywNCiAgICAgICAgICAgIGRlY2ltYWw6ICcsJw0KICAgICAgICB9LA0KICAgICAgICBhYmJyZXZpYXRpb25zOiB7DQogICAgICAgICAgICB0aG91c2FuZDogJ2snLA0KICAgICAgICAgICAgbWlsbGlvbjogJ00nLA0KICAgICAgICAgICAgYmlsbGlvbjogJ0cnLA0KICAgICAgICAgICAgdHJpbGxpb246ICdUJw0KICAgICAgICB9LA0KICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7DQogICAgICAgICAgICByZXR1cm4gJy4nOw0KICAgICAgICB9LA0KICAgICAgICBjdXJyZW5jeTogew0KICAgICAgICAgICAgc3ltYm9sOiAn4oKsJw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8vIE5vZGUNCiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBsYW5ndWFnZTsNCiAgICB9DQogICAgLy8gQnJvd3Nlcg0KICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm51bWVyYWwgJiYgdGhpcy5udW1lcmFsLmxhbmd1YWdlKSB7DQogICAgICAgIHRoaXMubnVtZXJhbC5sYW5ndWFnZSgnZmknLCBsYW5ndWFnZSk7DQogICAgfQ0KfSgpKTsNCg0KLyohDQogKiBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCiAqIGxhbmd1YWdlIDogZnJlbmNoIChDYW5hZGEpIChmci1DQSkNCiAqIGF1dGhvciA6IEzDqW8gUmVuYXVkLUFsbGFpcmUgOiBodHRwczovL2dpdGh1Yi5jb20vcmVuYXVkbGVvDQogKi8NCihmdW5jdGlvbiAoKSB7DQogICAgdmFyIGxhbmd1YWdlID0gew0KICAgICAgICBkZWxpbWl0ZXJzOiB7DQogICAgICAgICAgICB0aG91c2FuZHM6ICcgJywNCiAgICAgICAgICAgIGRlY2ltYWw6ICcsJw0KICAgICAgICB9LA0KICAgICAgICBhYmJyZXZpYXRpb25zOiB7DQogICAgICAgICAgICB0aG91c2FuZDogJ2snLA0KICAgICAgICAgICAgbWlsbGlvbjogJ00nLA0KICAgICAgICAgICAgYmlsbGlvbjogJ0cnLA0KICAgICAgICAgICAgdHJpbGxpb246ICdUJw0KICAgICAgICB9LA0KICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikgew0KICAgICAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gMSA/ICdlcicgOiAnZSc7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICckJw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8vIE5vZGUNCiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBsYW5ndWFnZTsNCiAgICB9DQogICAgLy8gQnJvd3Nlcg0KICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm51bWVyYWwgJiYgdGhpcy5udW1lcmFsLmxhbmd1YWdlKSB7DQogICAgICAgIHRoaXMubnVtZXJhbC5sYW5ndWFnZSgnZnItQ0EnLCBsYW5ndWFnZSk7DQogICAgfQ0KfSgpKTsNCi8qISANCiAqIG51bWVyYWwuanMgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbg0KICogbGFuZ3VhZ2UgOiBmcmVuY2ggKGZyLWNoKQ0KICogYXV0aG9yIDogQWRhbSBEcmFwZXIgOiBodHRwczovL2dpdGh1Yi5jb20vYWRhbXdkcmFwZXINCiAqLw0KKGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbGFuZ3VhZ2UgPSB7DQogICAgICAgIGRlbGltaXRlcnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kczogJ1wnJywNCiAgICAgICAgICAgIGRlY2ltYWw6ICcuJw0KICAgICAgICB9LA0KICAgICAgICBhYmJyZXZpYXRpb25zOiB7DQogICAgICAgICAgICB0aG91c2FuZDogJ2snLA0KICAgICAgICAgICAgbWlsbGlvbjogJ20nLA0KICAgICAgICAgICAgYmlsbGlvbjogJ2InLA0KICAgICAgICAgICAgdHJpbGxpb246ICd0Jw0KICAgICAgICB9LA0KICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikgew0KICAgICAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gMSA/ICdlcicgOiAnZSc7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICdDSEYnDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdmci1jaCcsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KDQovKiEgDQogKiBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCiAqIGxhbmd1YWdlIDogZnJlbmNoIChmcikNCiAqIGF1dGhvciA6IEFkYW0gRHJhcGVyIDogaHR0cHM6Ly9naXRodWIuY29tL2FkYW13ZHJhcGVyDQogKi8NCihmdW5jdGlvbiAoKSB7DQogICAgdmFyIGxhbmd1YWdlID0gew0KICAgICAgICBkZWxpbWl0ZXJzOiB7DQogICAgICAgICAgICB0aG91c2FuZHM6ICcgJywNCiAgICAgICAgICAgIGRlY2ltYWw6ICcsJw0KICAgICAgICB9LA0KICAgICAgICBhYmJyZXZpYXRpb25zOiB7DQogICAgICAgICAgICB0aG91c2FuZDogJ2snLA0KICAgICAgICAgICAgbWlsbGlvbjogJ20nLA0KICAgICAgICAgICAgYmlsbGlvbjogJ2InLA0KICAgICAgICAgICAgdHJpbGxpb246ICd0Jw0KICAgICAgICB9LA0KICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikgew0KICAgICAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gMSA/ICdlcicgOiAnZSc7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICfigqwnDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdmcicsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KLyohDQogKiBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCiAqIGxhbmd1YWdlIDogSHVuZ2FyaWFuIChodSkNCiAqIGF1dGhvciA6IFBldGVyIEJha29uZHkgOiBodHRwczovL2dpdGh1Yi5jb20vcGJha29uZHkNCiAqLw0KKGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbGFuZ3VhZ2UgPSB7DQogICAgICAgIGRlbGltaXRlcnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kczogJyAnLA0KICAgICAgICAgICAgZGVjaW1hbDogJywnDQogICAgICAgIH0sDQogICAgICAgIGFiYnJldmlhdGlvbnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kOiAnRScsICAvLyBlemVyDQogICAgICAgICAgICBtaWxsaW9uOiAnTScsICAgLy8gbWlsbGnDsw0KICAgICAgICAgICAgYmlsbGlvbjogJ01yZCcsIC8vIG1pbGxpw6FyZA0KICAgICAgICAgICAgdHJpbGxpb246ICdUJyAgIC8vIHRyaWxsacOzDQogICAgICAgIH0sDQogICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHsNCiAgICAgICAgICAgIHJldHVybiAnLic7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICcgRnQnDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdodScsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KLyohIA0KICogbnVtZXJhbC5qcyBsYW5ndWFnZSBjb25maWd1cmF0aW9uDQogKiBsYW5ndWFnZSA6IGl0YWxpYW4gSXRhbHkgKGl0KQ0KICogYXV0aG9yIDogR2lhY29tbyBUcm9tYmkgOiBodHRwOi8vY2lucXVlcHVudGkuaXQNCiAqLw0KKGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbGFuZ3VhZ2UgPSB7DQogICAgICAgIGRlbGltaXRlcnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kczogJy4nLA0KICAgICAgICAgICAgZGVjaW1hbDogJywnDQogICAgICAgIH0sDQogICAgICAgIGFiYnJldmlhdGlvbnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kOiAnbWlsYScsDQogICAgICAgICAgICBtaWxsaW9uOiAnbWlsJywNCiAgICAgICAgICAgIGJpbGxpb246ICdiJywNCiAgICAgICAgICAgIHRyaWxsaW9uOiAndCcNCiAgICAgICAgfSwNCiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikgew0KICAgICAgICAgICAgcmV0dXJuICfCuic7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICfigqwnDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdpdCcsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KLyohIA0KICogbnVtZXJhbC5qcyBsYW5ndWFnZSBjb25maWd1cmF0aW9uDQogKiBsYW5ndWFnZSA6IGphcGFuZXNlDQogKiBhdXRob3IgOiB0ZXBwZWlzIDogaHR0cHM6Ly9naXRodWIuY29tL3RlcHBlaXMNCiAqLw0KKGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbGFuZ3VhZ2UgPSB7DQogICAgICAgIGRlbGltaXRlcnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kczogJywnLA0KICAgICAgICAgICAgZGVjaW1hbDogJy4nDQogICAgICAgIH0sDQogICAgICAgIGFiYnJldmlhdGlvbnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kOiAn5Y2DJywNCiAgICAgICAgICAgIG1pbGxpb246ICfnmb7kuIcnLA0KICAgICAgICAgICAgYmlsbGlvbjogJ+WNgeWEhCcsDQogICAgICAgICAgICB0cmlsbGlvbjogJ+WFhicNCiAgICAgICAgfSwNCiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikgew0KICAgICAgICAgICAgcmV0dXJuICcuJzsNCiAgICAgICAgfSwNCiAgICAgICAgY3VycmVuY3k6IHsNCiAgICAgICAgICAgIHN5bWJvbDogJ8KlJw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIC8vIE5vZGUNCiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBsYW5ndWFnZTsNCiAgICB9DQogICAgLy8gQnJvd3Nlcg0KICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm51bWVyYWwgJiYgdGhpcy5udW1lcmFsLmxhbmd1YWdlKSB7DQogICAgICAgIHRoaXMubnVtZXJhbC5sYW5ndWFnZSgnamEnLCBsYW5ndWFnZSk7DQogICAgfQ0KfSgpKTsNCg0KLyohIA0KICogbnVtZXJhbC5qcyBsYW5ndWFnZSBjb25maWd1cmF0aW9uDQogKiBsYW5ndWFnZSA6IG5ldGhlcmxhbmRzLWR1dGNoIChubC1ubCkNCiAqIGF1dGhvciA6IERhdmUgQ2xheXRvbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZlZHgNCiAqLw0KKGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbGFuZ3VhZ2UgPSB7DQogICAgICAgIGRlbGltaXRlcnM6IHsNCiAgICAgICAgICAgIHRob3VzYW5kczogJy4nLA0KICAgICAgICAgICAgZGVjaW1hbCAgOiAnLCcNCiAgICAgICAgfSwNCiAgICAgICAgYWJicmV2aWF0aW9uczogew0KICAgICAgICAgICAgdGhvdXNhbmQgOiAnaycsDQogICAgICAgICAgICBtaWxsaW9uICA6ICdtbG4nLA0KICAgICAgICAgICAgYmlsbGlvbiAgOiAnbXJkJywNCiAgICAgICAgICAgIHRyaWxsaW9uIDogJ2JsbicNCiAgICAgICAgfSwNCiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHsNCiAgICAgICAgICAgIHZhciByZW1haW5kZXIgPSBudW1iZXIgJSAxMDA7DQogICAgICAgICAgICByZXR1cm4gKG51bWJlciAhPT0gMCAmJiByZW1haW5kZXIgPD0gMSB8fCByZW1haW5kZXIgPT09IDggfHwgcmVtYWluZGVyID49IDIwKSA/ICdzdGUnIDogJ2RlJzsNCiAgICAgICAgfSwNCiAgICAgICAgY3VycmVuY3k6IHsNCiAgICAgICAgICAgIHN5bWJvbDogJ+KCrCAnDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdubC1ubCcsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KLyohIA0KICogbnVtZXJhbC5qcyBsYW5ndWFnZSBjb25maWd1cmF0aW9uDQogKiBsYW5ndWFnZSA6IHBvbGlzaCAocGwpDQogKiBhdXRob3IgOiBEb21pbmlrIEJ1bGFqIDogaHR0cHM6Ly9naXRodWIuY29tL2RvbWluaWtidWxhag0KICovDQooZnVuY3Rpb24gKCkgew0KICAgIHZhciBsYW5ndWFnZSA9IHsNCiAgICAgICAgZGVsaW1pdGVyczogew0KICAgICAgICAgICAgdGhvdXNhbmRzOiAnICcsDQogICAgICAgICAgICBkZWNpbWFsOiAnLCcNCiAgICAgICAgfSwNCiAgICAgICAgYWJicmV2aWF0aW9uczogew0KICAgICAgICAgICAgdGhvdXNhbmQ6ICd0eXMuJywNCiAgICAgICAgICAgIG1pbGxpb246ICdtbG4nLA0KICAgICAgICAgICAgYmlsbGlvbjogJ21sZCcsDQogICAgICAgICAgICB0cmlsbGlvbjogJ2JsbicNCiAgICAgICAgfSwNCiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikgew0KICAgICAgICAgICAgcmV0dXJuICcuJzsNCiAgICAgICAgfSwNCiAgICAgICAgY3VycmVuY3k6IHsNCiAgICAgICAgICAgIHN5bWJvbDogJ1BMTicNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvLyBOb2RlDQogICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGFuZ3VhZ2U7DQogICAgfQ0KICAgIC8vIEJyb3dzZXINCiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5udW1lcmFsICYmIHRoaXMubnVtZXJhbC5sYW5ndWFnZSkgew0KICAgICAgICB0aGlzLm51bWVyYWwubGFuZ3VhZ2UoJ3BsJywgbGFuZ3VhZ2UpOw0KICAgIH0NCn0oKSk7DQovKiEgDQogKiBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCiAqIGxhbmd1YWdlIDogcG9ydHVndWVzZSBicmF6aWwgKHB0LWJyKQ0KICogYXV0aG9yIDogUmFtaXJvIFZhcmFuZGFzIEpyIDogaHR0cHM6Ly9naXRodWIuY29tL3JhbWlyb3Zqcg0KICovDQooZnVuY3Rpb24gKCkgew0KICAgIHZhciBsYW5ndWFnZSA9IHsNCiAgICAgICAgZGVsaW1pdGVyczogew0KICAgICAgICAgICAgdGhvdXNhbmRzOiAnLicsDQogICAgICAgICAgICBkZWNpbWFsOiAnLCcNCiAgICAgICAgfSwNCiAgICAgICAgYWJicmV2aWF0aW9uczogew0KICAgICAgICAgICAgdGhvdXNhbmQ6ICdtaWwnLA0KICAgICAgICAgICAgbWlsbGlvbjogJ21pbGjDtWVzJywNCiAgICAgICAgICAgIGJpbGxpb246ICdiJywNCiAgICAgICAgICAgIHRyaWxsaW9uOiAndCcNCiAgICAgICAgfSwNCiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikgew0KICAgICAgICAgICAgcmV0dXJuICfCuic7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICdSJCcNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvLyBOb2RlDQogICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGFuZ3VhZ2U7DQogICAgfQ0KICAgIC8vIEJyb3dzZXINCiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5udW1lcmFsICYmIHRoaXMubnVtZXJhbC5sYW5ndWFnZSkgew0KICAgICAgICB0aGlzLm51bWVyYWwubGFuZ3VhZ2UoJ3B0LWJyJywgbGFuZ3VhZ2UpOw0KICAgIH0NCn0oKSk7DQovKiEgDQogKiBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCiAqIGxhbmd1YWdlIDogcG9ydHVndWVzZSAocHQtcHQpDQogKiBhdXRob3IgOiBEaW9nbyBSZXNlbmRlIDogaHR0cHM6Ly9naXRodWIuY29tL2RyZXNlbmRlDQogKi8NCihmdW5jdGlvbiAoKSB7DQogICAgdmFyIGxhbmd1YWdlID0gew0KICAgICAgICBkZWxpbWl0ZXJzOiB7DQogICAgICAgICAgICB0aG91c2FuZHM6ICcgJywNCiAgICAgICAgICAgIGRlY2ltYWw6ICcsJw0KICAgICAgICB9LA0KICAgICAgICBhYmJyZXZpYXRpb25zOiB7DQogICAgICAgICAgICB0aG91c2FuZDogJ2snLA0KICAgICAgICAgICAgbWlsbGlvbjogJ20nLA0KICAgICAgICAgICAgYmlsbGlvbjogJ2InLA0KICAgICAgICAgICAgdHJpbGxpb246ICd0Jw0KICAgICAgICB9LA0KICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikgew0KICAgICAgICAgICAgcmV0dXJuICfCuic7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICfigqwnDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdwdC1wdCcsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KDQovLyBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCi8vIGxhbmd1YWdlIDogUnVzc2lhbiBmb3IgdGhlIFVrcmFpbmUgKHJ1LVVBKQ0KLy8gYXV0aG9yIDogQW5hdG9saSBQYXBpcm92c2tpIDogaHR0cHM6Ly9naXRodWIuY29tL2FwYXBpcm92c2tpDQooZnVuY3Rpb24gKCkgew0KICAgIHZhciBsYW5ndWFnZSA9IHsNCiAgICAgICAgZGVsaW1pdGVyczogew0KICAgICAgICAgICAgdGhvdXNhbmRzOiAnICcsDQogICAgICAgICAgICBkZWNpbWFsOiAnLCcNCiAgICAgICAgfSwNCiAgICAgICAgYWJicmV2aWF0aW9uczogew0KICAgICAgICAgICAgdGhvdXNhbmQ6ICfRgtGL0YEuJywNCiAgICAgICAgICAgIG1pbGxpb246ICfQvNC70L0nLA0KICAgICAgICAgICAgYmlsbGlvbjogJ2InLA0KICAgICAgICAgICAgdHJpbGxpb246ICd0Jw0KICAgICAgICB9LA0KICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAvLyBub3QgaWRlYWwsIGJ1dCBzaW5jZSBpbiBSdXNzaWFuIGl0IGNhbiB0YWtlbiBvbiANCiAgICAgICAgICAgIC8vIGRpZmZlcmVudCBmb3JtcyAobWFzY3VsaW5lLCBmZW1pbmluZSwgbmV1dGVyKQ0KICAgICAgICAgICAgLy8gdGhpcyBpcyBhbGwgd2UgY2FuIGRvDQogICAgICAgICAgICByZXR1cm4gJy4nOyANCiAgICAgICAgfSwNCiAgICAgICAgY3VycmVuY3k6IHsNCiAgICAgICAgICAgIHN5bWJvbDogJ1x1MjBCNCcNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvLyBOb2RlDQogICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGFuZ3VhZ2U7DQogICAgfQ0KICAgIC8vIEJyb3dzZXINCiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5udW1lcmFsICYmIHRoaXMubnVtZXJhbC5sYW5ndWFnZSkgew0KICAgICAgICB0aGlzLm51bWVyYWwubGFuZ3VhZ2UoJ3J1LVVBJywgbGFuZ3VhZ2UpOw0KICAgIH0NCn0oKSk7DQoNCi8qISANCiAqIG51bWVyYWwuanMgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbg0KICogbGFuZ3VhZ2UgOiBydXNzaWFuIChydSkNCiAqIGF1dGhvciA6IEFuYXRvbGkgUGFwaXJvdnNraSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFwaXJvdnNraQ0KICovDQooZnVuY3Rpb24gKCkgew0KICAgIHZhciBsYW5ndWFnZSA9IHsNCiAgICAgICAgZGVsaW1pdGVyczogew0KICAgICAgICAgICAgdGhvdXNhbmRzOiAnICcsDQogICAgICAgICAgICBkZWNpbWFsOiAnLCcNCiAgICAgICAgfSwNCiAgICAgICAgYWJicmV2aWF0aW9uczogew0KICAgICAgICAgICAgdGhvdXNhbmQ6ICfRgtGL0YEuJywNCiAgICAgICAgICAgIG1pbGxpb246ICfQvNC70L0nLA0KICAgICAgICAgICAgYmlsbGlvbjogJ2InLA0KICAgICAgICAgICAgdHJpbGxpb246ICd0Jw0KICAgICAgICB9LA0KICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAvLyBub3QgaWRlYWwsIGJ1dCBzaW5jZSBpbiBSdXNzaWFuIGl0IGNhbiB0YWtlbiBvbiANCiAgICAgICAgICAgIC8vIGRpZmZlcmVudCBmb3JtcyAobWFzY3VsaW5lLCBmZW1pbmluZSwgbmV1dGVyKQ0KICAgICAgICAgICAgLy8gdGhpcyBpcyBhbGwgd2UgY2FuIGRvDQogICAgICAgICAgICByZXR1cm4gJy4nOyANCiAgICAgICAgfSwNCiAgICAgICAgY3VycmVuY3k6IHsNCiAgICAgICAgICAgIHN5bWJvbDogJ9GA0YPQsS4nDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCdydScsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KDQovKiENCiAqIG51bWVyYWwuanMgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbg0KICogbGFuZ3VhZ2UgOiBzbG92YWsgKHNrKQ0KICogYXV0aG9yIDogQWhtZWQgQWwgSGFmb3VkaCA6IGh0dHA6Ly93d3cuZnJlZXZpc2lvbi5zaw0KICovDQooZnVuY3Rpb24gKCkgew0KICAgIHZhciBsYW5ndWFnZSA9IHsNCiAgICAgICAgZGVsaW1pdGVyczogew0KICAgICAgICAgICAgdGhvdXNhbmRzOiAnICcsDQogICAgICAgICAgICBkZWNpbWFsOiAnLCcNCiAgICAgICAgfSwNCiAgICAgICAgYWJicmV2aWF0aW9uczogew0KICAgICAgICAgICAgdGhvdXNhbmQ6ICd0aXMuJywNCiAgICAgICAgICAgIG1pbGxpb246ICdtaWwuJywNCiAgICAgICAgICAgIGJpbGxpb246ICdiJywNCiAgICAgICAgICAgIHRyaWxsaW9uOiAndCcNCiAgICAgICAgfSwNCiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgcmV0dXJuICcuJzsNCiAgICAgICAgfSwNCiAgICAgICAgY3VycmVuY3k6IHsNCiAgICAgICAgICAgIHN5bWJvbDogJ+KCrCcNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvLyBOb2RlDQogICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGFuZ3VhZ2U7DQogICAgfQ0KICAgIC8vIEJyb3dzZXINCiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5udW1lcmFsICYmIHRoaXMubnVtZXJhbC5sYW5ndWFnZSkgew0KICAgICAgICB0aGlzLm51bWVyYWwubGFuZ3VhZ2UoJ3NrJywgbGFuZ3VhZ2UpOw0KICAgIH0NCn0oKSk7DQoNCi8qISANCiAqIG51bWVyYWwuanMgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbg0KICogbGFuZ3VhZ2UgOiB0aGFpICh0aCkNCiAqIGF1dGhvciA6IFNhdGhpdCBKaXR0YW51cGF0IDogaHR0cHM6Ly9naXRodWIuY29tL2pvam9zYXRpDQogKi8NCihmdW5jdGlvbiAoKSB7DQogICAgdmFyIGxhbmd1YWdlID0gew0KICAgICAgICBkZWxpbWl0ZXJzOiB7DQogICAgICAgICAgICB0aG91c2FuZHM6ICcsJywNCiAgICAgICAgICAgIGRlY2ltYWw6ICcuJw0KICAgICAgICB9LA0KICAgICAgICBhYmJyZXZpYXRpb25zOiB7DQogICAgICAgICAgICB0aG91c2FuZDogJ+C4nuC4seC4mScsDQogICAgICAgICAgICBtaWxsaW9uOiAn4Lil4LmJ4Liy4LiZJywNCiAgICAgICAgICAgIGJpbGxpb246ICfguJ7guLHguJnguKXguYnguLLguJknLA0KICAgICAgICAgICAgdHJpbGxpb246ICfguKXguYnguLLguJnguKXguYnguLLguJknDQogICAgICAgIH0sDQogICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHsNCiAgICAgICAgICAgIHJldHVybiAnLic7DQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICfguL8nDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCd0aCcsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KDQovKiEgDQogKiBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCiAqIGxhbmd1YWdlIDogdHVya2lzaCAodHIpDQogKiBhdXRob3IgOiBFY21lbCBFcmNhbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9lY21lbCwgRXJoYW4gR3VuZG9nYW4gOiBodHRwczovL2dpdGh1Yi5jb20vZXJoYW5ndW5kb2dhbiwgQnVyYWsgWWnEn2l0IEtheWE6IGh0dHBzOi8vZ2l0aHViLmNvbS9CWUsNCiAqLw0KKGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgc3VmZml4ZXMgPSB7DQogICAgICAgICAgICAxOiAnXCdpbmNpJywNCiAgICAgICAgICAgIDU6ICdcJ2luY2knLA0KICAgICAgICAgICAgODogJ1wnaW5jaScsDQogICAgICAgICAgICA3MDogJ1wnaW5jaScsDQogICAgICAgICAgICA4MDogJ1wnaW5jaScsDQoNCiAgICAgICAgICAgIDI6ICdcJ25jaScsDQogICAgICAgICAgICA3OiAnXCduY2knLA0KICAgICAgICAgICAgMjA6ICdcJ25jaScsDQogICAgICAgICAgICA1MDogJ1wnbmNpJywNCg0KICAgICAgICAgICAgMzogJ1wnw7xuY8O8JywNCiAgICAgICAgICAgIDQ6ICdcJ8O8bmPDvCcsDQogICAgICAgICAgICAxMDA6ICdcJ8O8bmPDvCcsDQoNCiAgICAgICAgICAgIDY6ICdcJ25jxLEnLA0KDQogICAgICAgICAgICA5OiAnXCd1bmN1JywNCiAgICAgICAgICAgIDEwOiAnXCd1bmN1JywNCiAgICAgICAgICAgIDMwOiAnXCd1bmN1JywNCg0KICAgICAgICAgICAgNjA6ICdcJ8SxbmPEsScsDQogICAgICAgICAgICA5MDogJ1wnxLFuY8SxJw0KICAgICAgICB9LA0KICAgICAgICBsYW5ndWFnZSA9IHsNCiAgICAgICAgICAgIGRlbGltaXRlcnM6IHsNCiAgICAgICAgICAgICAgICB0aG91c2FuZHM6ICcuJywNCiAgICAgICAgICAgICAgICBkZWNpbWFsOiAnLCcNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBhYmJyZXZpYXRpb25zOiB7DQogICAgICAgICAgICAgICAgdGhvdXNhbmQ6ICdiaW4nLA0KICAgICAgICAgICAgICAgIG1pbGxpb246ICdtaWx5b24nLA0KICAgICAgICAgICAgICAgIGJpbGxpb246ICdtaWx5YXInLA0KICAgICAgICAgICAgICAgIHRyaWxsaW9uOiAndHJpbHlvbicNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7DQogICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkgeyAgLy8gc3BlY2lhbCBjYXNlIGZvciB6ZXJvDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnXCfEsW5jxLEnOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsDQogICAgICAgICAgICAgICAgICAgIGIgPSBudW1iZXIgJSAxMDAgLSBhLA0KICAgICAgICAgICAgICAgICAgICBjID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7DQoNCiAgICAgICAgICAgICAgcmV0dXJuIHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdIHx8IHN1ZmZpeGVzW2NdOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICAgICAgc3ltYm9sOiAnXHUyMEJBJw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCd0cicsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0KDQovLyBudW1lcmFsLmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24NCi8vIGxhbmd1YWdlIDogVWtyYWluaWFuIGZvciB0aGUgVWtyYWluZSAodWstVUEpDQovLyBhdXRob3IgOiBNaWNoYWVsIFBpZWZlbCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9waWVmZWwgKHdpdGggaGVscCBmcm9tIFRldHlhbmEgS3V6bWVua28pDQooZnVuY3Rpb24gKCkgew0KICAgIHZhciBsYW5ndWFnZSA9IHsNCiAgICAgICAgZGVsaW1pdGVyczogew0KICAgICAgICAgICAgdGhvdXNhbmRzOiAnICcsDQogICAgICAgICAgICBkZWNpbWFsOiAnLCcNCiAgICAgICAgfSwNCiAgICAgICAgYWJicmV2aWF0aW9uczogew0KICAgICAgICAgICAgdGhvdXNhbmQ6ICfRgtC40YEuJywNCiAgICAgICAgICAgIG1pbGxpb246ICfQvNC70L0nLA0KICAgICAgICAgICAgYmlsbGlvbjogJ9C80LvRgNC0JywNCiAgICAgICAgICAgIHRyaWxsaW9uOiAn0LHQu9C9Jw0KICAgICAgICB9LA0KICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAvLyBub3QgaWRlYWwsIGJ1dCBzaW5jZSBpbiBVa3JhaW5pYW4gaXQgY2FuIHRha2VuIG9uIA0KICAgICAgICAgICAgLy8gZGlmZmVyZW50IGZvcm1zIChtYXNjdWxpbmUsIGZlbWluaW5lLCBuZXV0ZXIpDQogICAgICAgICAgICAvLyB0aGlzIGlzIGFsbCB3ZSBjYW4gZG8NCiAgICAgICAgICAgIHJldHVybiAnJzsgDQogICAgICAgIH0sDQogICAgICAgIGN1cnJlbmN5OiB7DQogICAgICAgICAgICBzeW1ib2w6ICdcdTIwQjQnDQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgLy8gTm9kZQ0KICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgew0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxhbmd1YWdlOw0KICAgIH0NCiAgICAvLyBCcm93c2VyDQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubnVtZXJhbCAmJiB0aGlzLm51bWVyYWwubGFuZ3VhZ2UpIHsNCiAgICAgICAgdGhpcy5udW1lcmFsLmxhbmd1YWdlKCd1ay1VQScsIGxhbmd1YWdlKTsNCiAgICB9DQp9KCkpOw0K"></script>
<script src="data:application/x-javascript;base64,LyoNCmNocm9tYS5qcyAtIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgY29sb3IgY29udmVyc2lvbnMNCg0KQ29weXJpZ2h0IChjKSAyMDExLTIwMTUsIEdyZWdvciBBaXNjaA0KQWxsIHJpZ2h0cyByZXNlcnZlZC4NCg0KUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQptb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCg0KMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzDQogICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCg0KMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQoNCjMuIFRoZSBuYW1lIEdyZWdvciBBaXNjaCBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzDQogICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiDQpBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQpJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUNCkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEdSRUdPUiBBSVNDSCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULA0KSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsDQpCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQ0KT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcNCk5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwNCkVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQoNCiovDQooZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHUsdix3LHgseSx6LEEsQixDLEQsRSxGLEcsSCxJLEosSyxMLE0sTixPLFAsUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sYWEsYmEsY2EsZGEsZWEsZmEsZ2EsaGEsaWEsamEsa2EsbGEsbWEsbmEsb2EscGEscWEscmEsc2EsdGEsdWEsdmEsd2EseGEseWEsemE9W10uc2xpY2U7dWE9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlO2ZvcihhPXt9LGU9IkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBVbmRlZmluZWQgTnVsbCIuc3BsaXQoIiAiKSxkPTAsYj1lLmxlbmd0aDtiPmQ7ZCsrKWM9ZVtkXSxhWyJbb2JqZWN0ICIrYysiXSJdPWMudG9Mb3dlckNhc2UoKTtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM7cmV0dXJuIGM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGIpLGFbY118fCJvYmplY3QifX0oKSxTPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbD09YiYmKGI9MCksbnVsbD09YyYmKGM9MSksYj5hJiYoYT1iKSxhPmMmJihhPWMpLGF9LHZhPWZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aD49Mz9bXS5zbGljZS5jYWxsKGEpOmFbMF19LHQ9ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSkzPmI/KGFbYl08MCYmKGFbYl09MCksYVtiXT4yNTUmJihhW2JdPTI1NSkpOjM9PT1iJiYoYVtiXTwwJiYoYVtiXT0wKSxhW2JdPjEmJihhW2JdPTEpKTtyZXR1cm4gYX0sZD1NYXRoLlBJLHBhPU1hdGgucm91bmQsdz1NYXRoLmNvcyxCPU1hdGguZmxvb3IsXz1NYXRoLnBvdyxUPU1hdGgubG9nLHJhPU1hdGguc2luLHNhPU1hdGguc3FydCxtPU1hdGguYXRhbjIsVz1NYXRoLm1heCxsPU1hdGguYWJzLGc9MipkLGU9ZC8zLGI9ZC8xODAsZj0xODAvZCxzPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c1swXWluc3RhbmNlb2YgYT9hcmd1bWVudHNbMF06ZnVuY3Rpb24oYSxiLGMpe2MucHJvdG90eXBlPWEucHJvdG90eXBlO3ZhciBkPW5ldyBjLGU9YS5hcHBseShkLGIpO3JldHVybiBPYmplY3QoZSk9PT1lP2U6ZH0oYSxhcmd1bWVudHMsZnVuY3Rpb24oKXt9KX0saz1bXSwidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmbnVsbCE9PW1vZHVsZSYmbnVsbCE9bW9kdWxlLmV4cG9ydHMmJihtb2R1bGUuZXhwb3J0cz1zKSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBzfSk6KG9hPSJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cyYmbnVsbCE9PWV4cG9ydHM/ZXhwb3J0czp0aGlzLG9hLmNocm9tYT1zKSxzLnZlcnNpb249IjEuMS4xIixqPXt9LGg9W10saT0hMSxhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3ZhciBhLGIsYyxkLGUsZixnLGssbDtmb3IoZj10aGlzLGI9W10saz0wLGQ9YXJndW1lbnRzLmxlbmd0aDtkPms7aysrKWE9YXJndW1lbnRzW2tdLG51bGwhPWEmJmIucHVzaChhKTtpZihnPWJbYi5sZW5ndGgtMV0sbnVsbCE9altnXSlmLl9yZ2I9dChqW2ddKHZhKGIuc2xpY2UoMCwtMSkpKSk7ZWxzZXtmb3IoaXx8KGg9aC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIucC1hLnB9KSxpPSEwKSxsPTAsZT1oLmxlbmd0aDtlPmwmJihjPWhbbF0sIShnPWMudGVzdC5hcHBseShjLGIpKSk7bCsrKTtnJiYoZi5fcmdiPXQoaltnXS5hcHBseShqLGIpKSl9bnVsbD09Zi5fcmdiJiZjb25zb2xlLndhcm4oInVua25vd24gZm9ybWF0OiAiK2IpLG51bGw9PWYuX3JnYiYmKGYuX3JnYj1bMCwwLDBdKSwzPT09Zi5fcmdiLmxlbmd0aCYmZi5fcmdiLnB1c2goMSl9cmV0dXJuIGEucHJvdG90eXBlLmFscGhhPWZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9yZ2JbM109YSx0aGlzKTp0aGlzLl9yZ2JbM119LGEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSgpfSxhfSgpLHMuX2lucHV0PWoscy5icmV3ZXI9cT17T3JSZDpbIiNmZmY3ZWMiLCIjZmVlOGM4IiwiI2ZkZDQ5ZSIsIiNmZGJiODQiLCIjZmM4ZDU5IiwiI2VmNjU0OCIsIiNkNzMwMWYiLCIjYjMwMDAwIiwiIzdmMDAwMCJdLFB1QnU6WyIjZmZmN2ZiIiwiI2VjZTdmMiIsIiNkMGQxZTYiLCIjYTZiZGRiIiwiIzc0YTljZiIsIiMzNjkwYzAiLCIjMDU3MGIwIiwiIzA0NWE4ZCIsIiMwMjM4NTgiXSxCdVB1OlsiI2Y3ZmNmZCIsIiNlMGVjZjQiLCIjYmZkM2U2IiwiIzllYmNkYSIsIiM4Yzk2YzYiLCIjOGM2YmIxIiwiIzg4NDE5ZCIsIiM4MTBmN2MiLCIjNGQwMDRiIl0sT3JhbmdlczpbIiNmZmY1ZWIiLCIjZmVlNmNlIiwiI2ZkZDBhMiIsIiNmZGFlNmIiLCIjZmQ4ZDNjIiwiI2YxNjkxMyIsIiNkOTQ4MDEiLCIjYTYzNjAzIiwiIzdmMjcwNCJdLEJ1R246WyIjZjdmY2ZkIiwiI2U1ZjVmOSIsIiNjY2VjZTYiLCIjOTlkOGM5IiwiIzY2YzJhNCIsIiM0MWFlNzYiLCIjMjM4YjQ1IiwiIzAwNmQyYyIsIiMwMDQ0MWIiXSxZbE9yQnI6WyIjZmZmZmU1IiwiI2ZmZjdiYyIsIiNmZWUzOTEiLCIjZmVjNDRmIiwiI2ZlOTkyOSIsIiNlYzcwMTQiLCIjY2M0YzAyIiwiIzk5MzQwNCIsIiM2NjI1MDYiXSxZbEduOlsiI2ZmZmZlNSIsIiNmN2ZjYjkiLCIjZDlmMGEzIiwiI2FkZGQ4ZSIsIiM3OGM2NzkiLCIjNDFhYjVkIiwiIzIzODQ0MyIsIiMwMDY4MzciLCIjMDA0NTI5Il0sUmVkczpbIiNmZmY1ZjAiLCIjZmVlMGQyIiwiI2ZjYmJhMSIsIiNmYzkyNzIiLCIjZmI2YTRhIiwiI2VmM2IyYyIsIiNjYjE4MWQiLCIjYTUwZjE1IiwiIzY3MDAwZCJdLFJkUHU6WyIjZmZmN2YzIiwiI2ZkZTBkZCIsIiNmY2M1YzAiLCIjZmE5ZmI1IiwiI2Y3NjhhMSIsIiNkZDM0OTciLCIjYWUwMTdlIiwiIzdhMDE3NyIsIiM0OTAwNmEiXSxHcmVlbnM6WyIjZjdmY2Y1IiwiI2U1ZjVlMCIsIiNjN2U5YzAiLCIjYTFkOTliIiwiIzc0YzQ3NiIsIiM0MWFiNWQiLCIjMjM4YjQ1IiwiIzAwNmQyYyIsIiMwMDQ0MWIiXSxZbEduQnU6WyIjZmZmZmQ5IiwiI2VkZjhiMSIsIiNjN2U5YjQiLCIjN2ZjZGJiIiwiIzQxYjZjNCIsIiMxZDkxYzAiLCIjMjI1ZWE4IiwiIzI1MzQ5NCIsIiMwODFkNTgiXSxQdXJwbGVzOlsiI2ZjZmJmZCIsIiNlZmVkZjUiLCIjZGFkYWViIiwiI2JjYmRkYyIsIiM5ZTlhYzgiLCIjODA3ZGJhIiwiIzZhNTFhMyIsIiM1NDI3OGYiLCIjM2YwMDdkIl0sR25CdTpbIiNmN2ZjZjAiLCIjZTBmM2RiIiwiI2NjZWJjNSIsIiNhOGRkYjUiLCIjN2JjY2M0IiwiIzRlYjNkMyIsIiMyYjhjYmUiLCIjMDg2OGFjIiwiIzA4NDA4MSJdLEdyZXlzOlsiI2ZmZmZmZiIsIiNmMGYwZjAiLCIjZDlkOWQ5IiwiI2JkYmRiZCIsIiM5Njk2OTYiLCIjNzM3MzczIiwiIzUyNTI1MiIsIiMyNTI1MjUiLCIjMDAwMDAwIl0sWWxPclJkOlsiI2ZmZmZjYyIsIiNmZmVkYTAiLCIjZmVkOTc2IiwiI2ZlYjI0YyIsIiNmZDhkM2MiLCIjZmM0ZTJhIiwiI2UzMWExYyIsIiNiZDAwMjYiLCIjODAwMDI2Il0sUHVSZDpbIiNmN2Y0ZjkiLCIjZTdlMWVmIiwiI2Q0YjlkYSIsIiNjOTk0YzciLCIjZGY2NWIwIiwiI2U3Mjk4YSIsIiNjZTEyNTYiLCIjOTgwMDQzIiwiIzY3MDAxZiJdLEJsdWVzOlsiI2Y3ZmJmZiIsIiNkZWViZjciLCIjYzZkYmVmIiwiIzllY2FlMSIsIiM2YmFlZDYiLCIjNDI5MmM2IiwiIzIxNzFiNSIsIiMwODUxOWMiLCIjMDgzMDZiIl0sUHVCdUduOlsiI2ZmZjdmYiIsIiNlY2UyZjAiLCIjZDBkMWU2IiwiI2E2YmRkYiIsIiM2N2E5Y2YiLCIjMzY5MGMwIiwiIzAyODE4YSIsIiMwMTZjNTkiLCIjMDE0NjM2Il0sU3BlY3RyYWw6WyIjOWUwMTQyIiwiI2Q1M2U0ZiIsIiNmNDZkNDMiLCIjZmRhZTYxIiwiI2ZlZTA4YiIsIiNmZmZmYmYiLCIjZTZmNTk4IiwiI2FiZGRhNCIsIiM2NmMyYTUiLCIjMzI4OGJkIiwiIzVlNGZhMiJdLFJkWWxHbjpbIiNhNTAwMjYiLCIjZDczMDI3IiwiI2Y0NmQ0MyIsIiNmZGFlNjEiLCIjZmVlMDhiIiwiI2ZmZmZiZiIsIiNkOWVmOGIiLCIjYTZkOTZhIiwiIzY2YmQ2MyIsIiMxYTk4NTAiLCIjMDA2ODM3Il0sUmRCdTpbIiM2NzAwMWYiLCIjYjIxODJiIiwiI2Q2NjA0ZCIsIiNmNGE1ODIiLCIjZmRkYmM3IiwiI2Y3ZjdmNyIsIiNkMWU1ZjAiLCIjOTJjNWRlIiwiIzQzOTNjMyIsIiMyMTY2YWMiLCIjMDUzMDYxIl0sUGlZRzpbIiM4ZTAxNTIiLCIjYzUxYjdkIiwiI2RlNzdhZSIsIiNmMWI2ZGEiLCIjZmRlMGVmIiwiI2Y3ZjdmNyIsIiNlNmY1ZDAiLCIjYjhlMTg2IiwiIzdmYmM0MSIsIiM0ZDkyMjEiLCIjMjc2NDE5Il0sUFJHbjpbIiM0MDAwNGIiLCIjNzYyYTgzIiwiIzk5NzBhYiIsIiNjMmE1Y2YiLCIjZTdkNGU4IiwiI2Y3ZjdmNyIsIiNkOWYwZDMiLCIjYTZkYmEwIiwiIzVhYWU2MSIsIiMxYjc4MzciLCIjMDA0NDFiIl0sUmRZbEJ1OlsiI2E1MDAyNiIsIiNkNzMwMjciLCIjZjQ2ZDQzIiwiI2ZkYWU2MSIsIiNmZWUwOTAiLCIjZmZmZmJmIiwiI2UwZjNmOCIsIiNhYmQ5ZTkiLCIjNzRhZGQxIiwiIzQ1NzViNCIsIiMzMTM2OTUiXSxCckJHOlsiIzU0MzAwNSIsIiM4YzUxMGEiLCIjYmY4MTJkIiwiI2RmYzI3ZCIsIiNmNmU4YzMiLCIjZjVmNWY1IiwiI2M3ZWFlNSIsIiM4MGNkYzEiLCIjMzU5NzhmIiwiIzAxNjY1ZSIsIiMwMDNjMzAiXSxSZEd5OlsiIzY3MDAxZiIsIiNiMjE4MmIiLCIjZDY2MDRkIiwiI2Y0YTU4MiIsIiNmZGRiYzciLCIjZmZmZmZmIiwiI2UwZTBlMCIsIiNiYWJhYmEiLCIjODc4Nzg3IiwiIzRkNGQ0ZCIsIiMxYTFhMWEiXSxQdU9yOlsiIzdmM2IwOCIsIiNiMzU4MDYiLCIjZTA4MjE0IiwiI2ZkYjg2MyIsIiNmZWUwYjYiLCIjZjdmN2Y3IiwiI2Q4ZGFlYiIsIiNiMmFiZDIiLCIjODA3M2FjIiwiIzU0Mjc4OCIsIiMyZDAwNGIiXSxTZXQyOlsiIzY2YzJhNSIsIiNmYzhkNjIiLCIjOGRhMGNiIiwiI2U3OGFjMyIsIiNhNmQ4NTQiLCIjZmZkOTJmIiwiI2U1YzQ5NCIsIiNiM2IzYjMiXSxBY2NlbnQ6WyIjN2ZjOTdmIiwiI2JlYWVkNCIsIiNmZGMwODYiLCIjZmZmZjk5IiwiIzM4NmNiMCIsIiNmMDAyN2YiLCIjYmY1YjE3IiwiIzY2NjY2NiJdLFNldDE6WyIjZTQxYTFjIiwiIzM3N2ViOCIsIiM0ZGFmNGEiLCIjOTg0ZWEzIiwiI2ZmN2YwMCIsIiNmZmZmMzMiLCIjYTY1NjI4IiwiI2Y3ODFiZiIsIiM5OTk5OTkiXSxTZXQzOlsiIzhkZDNjNyIsIiNmZmZmYjMiLCIjYmViYWRhIiwiI2ZiODA3MiIsIiM4MGIxZDMiLCIjZmRiNDYyIiwiI2IzZGU2OSIsIiNmY2NkZTUiLCIjZDlkOWQ5IiwiI2JjODBiZCIsIiNjY2ViYzUiLCIjZmZlZDZmIl0sRGFyazI6WyIjMWI5ZTc3IiwiI2Q5NWYwMiIsIiM3NTcwYjMiLCIjZTcyOThhIiwiIzY2YTYxZSIsIiNlNmFiMDIiLCIjYTY3NjFkIiwiIzY2NjY2NiJdLFBhaXJlZDpbIiNhNmNlZTMiLCIjMWY3OGI0IiwiI2IyZGY4YSIsIiMzM2EwMmMiLCIjZmI5YTk5IiwiI2UzMWExYyIsIiNmZGJmNmYiLCIjZmY3ZjAwIiwiI2NhYjJkNiIsIiM2YTNkOWEiLCIjZmZmZjk5IiwiI2IxNTkyOCJdLFBhc3RlbDI6WyIjYjNlMmNkIiwiI2ZkY2RhYyIsIiNjYmQ1ZTgiLCIjZjRjYWU0IiwiI2U2ZjVjOSIsIiNmZmYyYWUiLCIjZjFlMmNjIiwiI2NjY2NjYyJdLFBhc3RlbDE6WyIjZmJiNGFlIiwiI2IzY2RlMyIsIiNjY2ViYzUiLCIjZGVjYmU0IiwiI2ZlZDlhNiIsIiNmZmZmY2MiLCIjZTVkOGJkIiwiI2ZkZGFlYyIsIiNmMmYyZjIiXX0sd2E9e2luZGlnbzoiIzRiMDA4MiIsZ29sZDoiI2ZmZDcwMCIsaG90cGluazoiI2ZmNjliNCIsZmlyZWJyaWNrOiIjYjIyMjIyIixpbmRpYW5yZWQ6IiNjZDVjNWMiLHllbGxvdzoiI2ZmZmYwMCIsbWlzdHlyb3NlOiIjZmZlNGUxIixkYXJrb2xpdmVncmVlbjoiIzU1NmIyZiIsb2xpdmU6IiM4MDgwMDAiLGRhcmtzZWFncmVlbjoiIzhmYmM4ZiIscGluazoiI2ZmYzBjYiIsdG9tYXRvOiIjZmY2MzQ3IixsaWdodGNvcmFsOiIjZjA4MDgwIixvcmFuZ2VyZWQ6IiNmZjQ1MDAiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixsaW1lOiIjMDBmZjAwIixwYWxlZ3JlZW46IiM5OGZiOTgiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGdyZWVueWVsbG93OiIjYWRmZjJmIixidXJseXdvb2Q6IiNkZWI4ODciLHNlYXNoZWxsOiIjZmZmNWVlIixtZWRpdW1zcHJpbmdncmVlbjoiIzAwZmE5YSIsZnVjaHNpYToiI2ZmMDBmZiIscGFwYXlhd2hpcDoiI2ZmZWZkNSIsYmxhbmNoZWRhbG1vbmQ6IiNmZmViY2QiLGNoYXJ0cmV1c2U6IiM3ZmZmMDAiLGRpbWdyYXk6IiM2OTY5NjkiLGJsYWNrOiIjMDAwMDAwIixwZWFjaHB1ZmY6IiNmZmRhYjkiLHNwcmluZ2dyZWVuOiIjMDBmZjdmIixhcXVhbWFyaW5lOiIjN2ZmZmQ0Iix3aGl0ZToiI2ZmZmZmZiIsb3JhbmdlOiIjZmZhNTAwIixsaWdodHNhbG1vbjoiI2ZmYTA3YSIsZGFya3NsYXRlZ3JheToiIzJmNGY0ZiIsYnJvd246IiNhNTJhMmEiLGl2b3J5OiIjZmZmZmYwIixkb2RnZXJibHVlOiIjMWU5MGZmIixwZXJ1OiIjY2Q4NTNmIixsYXduZ3JlZW46IiM3Y2ZjMDAiLGNob2NvbGF0ZToiI2QyNjkxZSIsY3JpbXNvbjoiI2RjMTQzYyIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGRhcmtncmV5OiIjYTlhOWE5IixsaWdodHNlYWdyZWVuOiIjMjBiMmFhIixjeWFuOiIjMDBmZmZmIixtaW50Y3JlYW06IiNmNWZmZmEiLHNpbHZlcjoiI2MwYzBjMCIsYW50aXF1ZXdoaXRlOiIjZmFlYmQ3IixtZWRpdW1vcmNoaWQ6IiNiYTU1ZDMiLHNreWJsdWU6IiM4N2NlZWIiLGdyYXk6IiM4MDgwODAiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGdvbGRlbnJvZDoiI2RhYTUyMCIsZGFya2dyZWVuOiIjMDA2NDAwIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZGFya3Zpb2xldDoiIzk0MDBkMyIsZGFya2dyYXk6IiNhOWE5YTkiLG1vY2Nhc2luOiIjZmZlNGI1IixzYWRkbGVicm93bjoiIzhiNDUxMyIsZ3JleToiIzgwODA4MCIsZGFya3NsYXRlYmx1ZToiIzQ4M2Q4YiIsbGlnaHRza3libHVlOiIjODdjZWZhIixsaWdodHBpbms6IiNmZmI2YzEiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsc2xhdGVncmV5OiIjNzA4MDkwIixyZWQ6IiNmZjAwMDAiLGRlZXBwaW5rOiIjZmYxNDkzIixsaW1lZ3JlZW46IiMzMmNkMzIiLGRhcmttYWdlbnRhOiIjOGIwMDhiIixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwbHVtOiIjZGRhMGRkIix0dXJxdW9pc2U6IiM0MGUwZDAiLGxpZ2h0Z3JleToiI2QzZDNkMyIsbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IiNmYWZhZDIiLGRhcmtnb2xkZW5yb2Q6IiNiODg2MGIiLGxhdmVuZGVyOiIjZTZlNmZhIixtYXJvb246IiM4MDAwMDAiLHllbGxvd2dyZWVuOiIjOWFjZDMyIixzYW5keWJyb3duOiIjZjRhNDYwIix0aGlzdGxlOiIjZDhiZmQ4Iix2aW9sZXQ6IiNlZTgyZWUiLG5hdnk6IiMwMDAwODAiLG1hZ2VudGE6IiNmZjAwZmYiLGRpbWdyZXk6IiM2OTY5NjkiLHRhbjoiI2QyYjQ4YyIscm9zeWJyb3duOiIjYmM4ZjhmIixvbGl2ZWRyYWI6IiM2YjhlMjMiLGJsdWU6IiMwMDAwZmYiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsaG9uZXlkZXc6IiNmMGZmZjAiLGNvcm5mbG93ZXJibHVlOiIjNjQ5NWVkIixzbGF0ZWJsdWU6IiM2YTVhY2QiLGxpbmVuOiIjZmFmMGU2IixkYXJrYmx1ZToiIzAwMDA4YiIscG93ZGVyYmx1ZToiI2IwZTBlNiIsc2VhZ3JlZW46IiMyZThiNTciLGRhcmtraGFraToiI2JkYjc2YiIsc25vdzoiI2ZmZmFmYSIsc2llbm5hOiIjYTA1MjJkIixtZWRpdW1ibHVlOiIjMDAwMGNkIixyb3lhbGJsdWU6IiM0MTY5ZTEiLGxpZ2h0Y3lhbjoiI2UwZmZmZiIsZ3JlZW46IiMwMDgwMDAiLG1lZGl1bXB1cnBsZToiIzkzNzBkYiIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixjb3Juc2lsazoiI2ZmZjhkYyIscGFsZXR1cnF1b2lzZToiI2FmZWVlZSIsYmlzcXVlOiIjZmZlNGM0IixzbGF0ZWdyYXk6IiM3MDgwOTAiLGRhcmtjeWFuOiIjMDA4YjhiIixraGFraToiI2YwZTY4YyIsd2hlYXQ6IiNmNWRlYjMiLHRlYWw6IiMwMDgwODAiLGRhcmtvcmNoaWQ6IiM5OTMyY2MiLGRlZXBza3libHVlOiIjMDBiZmZmIixzYWxtb246IiNmYTgwNzIiLGRhcmtyZWQ6IiM4YjAwMDAiLHN0ZWVsYmx1ZToiIzQ2ODJiNCIscGFsZXZpb2xldHJlZDoiI2RiNzA5MyIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGFsaWNlYmx1ZToiI2YwZjhmZiIsbGlnaHRzbGF0ZWdyZXk6IiM3Nzg4OTkiLGxpZ2h0Z3JlZW46IiM5MGVlOTAiLG9yY2hpZDoiI2RhNzBkNiIsZ2FpbnNib3JvOiIjZGNkY2RjIixtZWRpdW1zZWFncmVlbjoiIzNjYjM3MSIsbGlnaHRncmF5OiIjZDNkM2QzIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLGxlbW9uY2hpZmZvbjoiI2ZmZmFjZCIsY2FkZXRibHVlOiIjNWY5ZWEwIixsaWdodHllbGxvdzoiI2ZmZmZlMCIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsY29yYWw6IiNmZjdmNTAiLHB1cnBsZToiIzgwMDA4MCIsYXF1YToiIzAwZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIsbWVkaXVtc2xhdGVibHVlOiIjN2I2OGVlIixkYXJrb3JhbmdlOiIjZmY4YzAwIixtZWRpdW1hcXVhbWFyaW5lOiIjNjZjZGFhIixkYXJrc2FsbW9uOiIjZTk5NjdhIixiZWlnZToiI2Y1ZjVkYyIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYXp1cmU6IiNmMGZmZmYiLGxpZ2h0c3RlZWxibHVlOiIjYjBjNGRlIixvbGRsYWNlOiIjZmRmNWU2IixyZWJlY2NhcHVycGxlOiIjNjYzMzk5In0scy5jb2xvcnM9dj13YSxOPWZ1bmN0aW9uKCl7dmFyIGEsYixkLGUsZixnLGgsaSxqO3JldHVybiBiPXZhKGFyZ3VtZW50cyksZj1iWzBdLGE9YlsxXSxkPWJbMl0saT0oZisxNikvMTE2LGg9aXNOYU4oYSk/aTppK2EvNTAwLGo9aXNOYU4oZCk/aTppLWQvMjAwLGk9Yy5ZbipPKGkpLGg9Yy5YbipPKGgpLGo9Yy5abipPKGopLGc9eWEoMy4yNDA0NTQyKmgtMS41MzcxMzg1KmktLjQ5ODUzMTQqaiksZT15YSgtLjk2OTI2NipoKzEuODc2MDEwOCppKy4wNDE1NTYqaiksZD15YSguMDU1NjQzNCpoLS4yMDQwMjU5KmkrMS4wNTcyMjUyKmopLGc9UyhnLDAsMjU1KSxlPVMoZSwwLDI1NSksZD1TKGQsMCwyNTUpLFtnLGUsZCxiLmxlbmd0aD4zP2JbM106MV19LHlhPWZ1bmN0aW9uKGEpe3JldHVybiBwYSgyNTUqKC4wMDMwND49YT8xMi45MiphOjEuMDU1Kl8oYSwxLzIuNCktLjA1NSkpfSxPPWZ1bmN0aW9uKGEpe3JldHVybiBhPmMudDE/YSphKmE6Yy50MiooYS1jLnQwKX0sYz17S246MTgsWG46Ljk1MDQ3LFluOjEsWm46MS4wODg4Myx0MDouMTM3OTMxMDM0LHQxOi4yMDY4OTY1NTIsdDI6LjEyODQxODU1LHQzOi4wMDg4NTY0NTJ9LGdhPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGcsaDtyZXR1cm4gZD12YShhcmd1bWVudHMpLGM9ZFswXSxiPWRbMV0sYT1kWzJdLGU9bGEoYyxiLGEpLGY9ZVswXSxnPWVbMV0saD1lWzJdLFsxMTYqZy0xNiw1MDAqKGYtZyksMjAwKihnLWgpXX0sbWE9ZnVuY3Rpb24oYSl7cmV0dXJuKGEvPTI1NSk8PS4wNDA0NT9hLzEyLjkyOl8oKGErLjA1NSkvMS4wNTUsMi40KX0seGE9ZnVuY3Rpb24oYSl7cmV0dXJuIGE+Yy50Mz9fKGEsMS8zKTphL2MudDIrYy50MH0sbGE9ZnVuY3Rpb24oKXt2YXIgYSxiLGQsZSxmLGcsaDtyZXR1cm4gZT12YShhcmd1bWVudHMpLGQ9ZVswXSxiPWVbMV0sYT1lWzJdLGQ9bWEoZCksYj1tYShiKSxhPW1hKGEpLGY9eGEoKC40MTI0NTY0KmQrLjM1NzU3NjEqYisuMTgwNDM3NSphKS9jLlhuKSxnPXhhKCguMjEyNjcyOSpkKy43MTUxNTIyKmIrLjA3MjE3NSphKS9jLlluKSxoPXhhKCguMDE5MzMzOSpkKy4xMTkxOTIqYisuOTUwMzA0MSphKS9jLlpuKSxbZixnLGhdfSxzLmxhYj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihhLGIsYyl7Yy5wcm90b3R5cGU9YS5wcm90b3R5cGU7dmFyIGQ9bmV3IGMsZT1hLmFwcGx5KGQsYik7cmV0dXJuIE9iamVjdChlKT09PWU/ZTpkfShhLHphLmNhbGwoYXJndW1lbnRzKS5jb25jYXQoWyJsYWIiXSksZnVuY3Rpb24oKXt9KX0sai5sYWI9TixhLnByb3RvdHlwZS5sYWI9ZnVuY3Rpb24oKXtyZXR1cm4gZ2EodGhpcy5fcmdiKX0sbj1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsO3JldHVybiBhPWZ1bmN0aW9uKCl7dmFyIGIsYyxkO2ZvcihkPVtdLGM9MCxiPWEubGVuZ3RoO2I+YztjKyspZT1hW2NdLGQucHVzaChzKGUpKTtyZXR1cm4gZH0oKSwyPT09YS5sZW5ndGg/KGo9ZnVuY3Rpb24oKXt2YXIgYixjLGQ7Zm9yKGQ9W10sYz0wLGI9YS5sZW5ndGg7Yj5jO2MrKyllPWFbY10sZC5wdXNoKGUubGFiKCkpO3JldHVybiBkfSgpLGY9alswXSxnPWpbMV0sYj1mdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiBjPWZ1bmN0aW9uKCl7dmFyIGMsZDtmb3IoZD1bXSxiPWM9MDsyPj1jO2I9KytjKWQucHVzaChmW2JdK2EqKGdbYl0tZltiXSkpO3JldHVybiBkfSgpLHMubGFiLmFwcGx5KHMsYyl9KTozPT09YS5sZW5ndGg/KGs9ZnVuY3Rpb24oKXt2YXIgYixjLGQ7Zm9yKGQ9W10sYz0wLGI9YS5sZW5ndGg7Yj5jO2MrKyllPWFbY10sZC5wdXNoKGUubGFiKCkpO3JldHVybiBkfSgpLGY9a1swXSxnPWtbMV0saD1rWzJdLGI9ZnVuY3Rpb24oYSl7dmFyIGIsYztyZXR1cm4gYz1mdW5jdGlvbigpe3ZhciBjLGQ7Zm9yKGQ9W10sYj1jPTA7Mj49YztiPSsrYylkLnB1c2goKDEtYSkqKDEtYSkqZltiXSsyKigxLWEpKmEqZ1tiXSthKmEqaFtiXSk7cmV0dXJuIGR9KCkscy5sYWIuYXBwbHkocyxjKX0pOjQ9PT1hLmxlbmd0aD8obD1mdW5jdGlvbigpe3ZhciBiLGMsZDtmb3IoZD1bXSxjPTAsYj1hLmxlbmd0aDtiPmM7YysrKWU9YVtjXSxkLnB1c2goZS5sYWIoKSk7cmV0dXJuIGR9KCksZj1sWzBdLGc9bFsxXSxoPWxbMl0saT1sWzNdLGI9ZnVuY3Rpb24oYSl7dmFyIGIsYztyZXR1cm4gYz1mdW5jdGlvbigpe3ZhciBjLGQ7Zm9yKGQ9W10sYj1jPTA7Mj49YztiPSsrYylkLnB1c2goKDEtYSkqKDEtYSkqKDEtYSkqZltiXSszKigxLWEpKigxLWEpKmEqZ1tiXSszKigxLWEpKmEqYSpoW2JdK2EqYSphKmlbYl0pO3JldHVybiBkfSgpLHMubGFiLmFwcGx5KHMsYyl9KTo1PT09YS5sZW5ndGgmJihjPW4oYS5zbGljZSgwLDMpKSxkPW4oYS5zbGljZSgyLDUpKSxiPWZ1bmN0aW9uKGEpe3JldHVybi41PmE/YygyKmEpOmQoMiooYS0uNSkpfSksYn0scy5iZXppZXI9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGI9bihhKSxiLnNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHMuc2NhbGUoYil9LGJ9LHMuY3ViZWhlbGl4PWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsaCxpO3JldHVybiBudWxsPT1hJiYoYT0zMDApLG51bGw9PWImJihiPS0xLjUpLG51bGw9PWMmJihjPTEpLG51bGw9PWQmJihkPTEpLG51bGw9PWUmJihlPVswLDFdKSxoPWVbMV0tZVswXSxmPTAsaT1mdW5jdGlvbihpKXt2YXIgaixrLGwsbSxuLG8scCxxLHI7cmV0dXJuIGo9ZyooKGErMTIwKS8zNjArYippKSxwPV8oZVswXStoKmksZCksbz0wIT09Zj9jWzBdK2kqZjpjLGs9bypwKigxLXApLzIsbT13KGopLHI9cmEoaikscT1wK2sqKC0uMTQ4NjEqbSsxLjc4Mjc3KnIpLG49cCtrKigtLjI5MjI3Km0tLjkwNjQ5KnIpLGw9cCsxLjk3Mjk0KmsqbSxzKHQoWzI1NSpxLDI1NSpuLDI1NSpsXSkpfSxpLnN0YXJ0PWZ1bmN0aW9uKGIpe3JldHVybiBudWxsPT1iP2E6KGE9YixpKX0saS5yb3RhdGlvbnM9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/YjooYj1hLGkpfSxpLmdhbW1hPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP2Q6KGQ9YSxpKX0saS5odWU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/YzooYz1hLCJhcnJheSI9PT11YShjKT8oZj1jWzFdLWNbMF0sMD09PWYmJihjPWNbMV0pKTpmPTAsaSl9LGkubGlnaHRuZXNzPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP2U6KGU9YSwiYXJyYXkiPT09dWEoZSk/KGg9ZVsxXS1lWzBdLDA9PT1oJiYoZT1lWzFdKSk6aD0wLGkpfSxpLnNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHMuc2NhbGUoaSl9LGkuaHVlKGMpLGl9LHMucmFuZG9tPWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGU7Zm9yKGM9IjAxMjM0NTY3ODlhYmNkZWYiLGI9IiMiLGQ9ZT0wOzY+ZTtkPSsrZSliKz1jLmNoYXJBdChCKDE2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gbmV3IGEoYil9LGoucmdiPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7Yj12YShhcmd1bWVudHMpLGM9W107Zm9yKGEgaW4gYilkPWJbYV0sYy5wdXNoKGQpO3JldHVybiBjfSxzLnJnYj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihhLGIsYyl7Yy5wcm90b3R5cGU9YS5wcm90b3R5cGU7dmFyIGQ9bmV3IGMsZT1hLmFwcGx5KGQsYik7cmV0dXJuIE9iamVjdChlKT09PWU/ZTpkfShhLHphLmNhbGwoYXJndW1lbnRzKS5jb25jYXQoWyJyZ2IiXSksZnVuY3Rpb24oKXt9KX0sYS5wcm90b3R5cGUucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JnYi5zbGljZSgwLDMpfSxhLnByb3RvdHlwZS5yZ2JhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JnYn0saC5wdXNoKHtwOjE1LHRlc3Q6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGI9dmEoYXJndW1lbnRzKSwiYXJyYXkiPT09dWEoYikmJjM9PT1iLmxlbmd0aD8icmdiIjo0PT09Yi5sZW5ndGgmJiJudW1iZXIiPT09dWEoYlszXSkmJmJbM10+PTAmJmJbM108PTE/InJnYiI6dm9pZCAwfX0pLEM9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnO2lmKGEubWF0Y2goL14jPyhbQS1GYS1mMC05XXs2fXxbQS1GYS1mMC05XXszfSkkLykpcmV0dXJuKDQ9PT1hLmxlbmd0aHx8Nz09PWEubGVuZ3RoKSYmKGE9YS5zdWJzdHIoMSkpLDM9PT1hLmxlbmd0aCYmKGE9YS5zcGxpdCgiIiksYT1hWzBdK2FbMF0rYVsxXSthWzFdK2FbMl0rYVsyXSksZz1wYXJzZUludChhLDE2KSxlPWc+PjE2LGQ9Zz4+OCYyNTUsYz0yNTUmZyxbZSxkLGMsMV07aWYoYS5tYXRjaCgvXiM/KFtBLUZhLWYwLTldezh9KSQvKSlyZXR1cm4gOT09PWEubGVuZ3RoJiYoYT1hLnN1YnN0cigxKSksZz1wYXJzZUludChhLDE2KSxlPWc+PjI0JjI1NSxkPWc+PjE2JjI1NSxjPWc+PjgmMjU1LGI9cGEoKDI1NSZnKS8yNTUqMTAwKS8xMDAsW2UsZCxjLGJdO2lmKG51bGwhPWouY3NzJiYoZj1qLmNzcyhhKSkpcmV0dXJuIGY7dGhyb3cidW5rbm93biBjb2xvcjogIithfSxjYT1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaCxpO3JldHVybiBudWxsPT1iJiYoYj0icmdiIiksZz1hWzBdLGU9YVsxXSxkPWFbMl0sYz1hWzNdLGk9Zzw8MTZ8ZTw8OHxkLGg9IjAwMDAwMCIraS50b1N0cmluZygxNiksaD1oLnN1YnN0cihoLmxlbmd0aC02KSxmPSIwIitwYSgyNTUqYykudG9TdHJpbmcoMTYpLGY9Zi5zdWJzdHIoZi5sZW5ndGgtMiksIiMiK2Z1bmN0aW9uKCl7c3dpdGNoKGIudG9Mb3dlckNhc2UoKSl7Y2FzZSJyZ2JhIjpyZXR1cm4gaCtmO2Nhc2UiYXJnYiI6cmV0dXJuIGYraDtkZWZhdWx0OnJldHVybiBofX0oKX0sai5oZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIEMoYSl9LHMuaGV4PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEsYixjKXtjLnByb3RvdHlwZT1hLnByb3RvdHlwZTt2YXIgZD1uZXcgYyxlPWEuYXBwbHkoZCxiKTtyZXR1cm4gT2JqZWN0KGUpPT09ZT9lOmR9KGEsemEuY2FsbChhcmd1bWVudHMpLmNvbmNhdChbImhleCJdKSxmdW5jdGlvbigpe30pfSxhLnByb3RvdHlwZS5oZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEmJihhPSJyZ2IiKSxjYSh0aGlzLl9yZ2IsYSl9LGgucHVzaCh7cDoxMCx0ZXN0OmZ1bmN0aW9uKGEpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aCYmInN0cmluZyI9PT11YShhKT8iaGV4Ijp2b2lkIDB9fSksRj1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG47aWYoYT12YShhcmd1bWVudHMpLGU9YVswXSxrPWFbMV0sZz1hWzJdLDA9PT1rKWk9ZD1iPTI1NSpnO2Vsc2V7Zm9yKG49WzAsMCwwXSxjPVswLDAsMF0sbT0uNT5nP2cqKDErayk6ZytrLWcqayxsPTIqZy1tLGUvPTM2MCxuWzBdPWUrMS8zLG5bMV09ZSxuWzJdPWUtMS8zLGY9aD0wOzI+PWg7Zj0rK2gpbltmXTwwJiYobltmXSs9MSksbltmXT4xJiYobltmXS09MSksNipuW2ZdPDE/Y1tmXT1sKzYqKG0tbCkqbltmXToyKm5bZl08MT9jW2ZdPW06MypuW2ZdPDI/Y1tmXT1sKyhtLWwpKigyLzMtbltmXSkqNjpjW2ZdPWw7aj1bcGEoMjU1KmNbMF0pLHBhKDI1NSpjWzFdKSxwYSgyNTUqY1syXSldLGk9alswXSxkPWpbMV0sYj1qWzJdfXJldHVybiBhLmxlbmd0aD4zP1tpLGQsYixhWzNdXTpbaSxkLGJdfSxlYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaDtyZXR1cm4gdm9pZCAwIT09YSYmYS5sZW5ndGg+PTMmJihnPWEsYT1nWzBdLGI9Z1sxXSxjPWdbMl0pLGEvPTI1NSxiLz0yNTUsYy89MjU1LGY9TWF0aC5taW4oYSxiLGMpLFc9TWF0aC5tYXgoYSxiLGMpLGU9KFcrZikvMixXPT09Zj8oaD0wLGQ9TnVtYmVyLk5hTik6aD0uNT5lPyhXLWYpLyhXK2YpOihXLWYpLygyLVctZiksYT09PVc/ZD0oYi1jKS8oVy1mKTpiPT09Vz9kPTIrKGMtYSkvKFctZik6Yz09PVcmJihkPTQrKGEtYikvKFctZikpLGQqPTYwLDA+ZCYmKGQrPTM2MCksW2QsaCxlXX0scy5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oYSxiLGMpe2MucHJvdG90eXBlPWEucHJvdG90eXBlO3ZhciBkPW5ldyBjLGU9YS5hcHBseShkLGIpO3JldHVybiBPYmplY3QoZSk9PT1lP2U6ZH0oYSx6YS5jYWxsKGFyZ3VtZW50cykuY29uY2F0KFsiaHNsIl0pLGZ1bmN0aW9uKCl7fSl9LGouaHNsPUYsYS5wcm90b3R5cGUuaHNsPWZ1bmN0aW9uKCl7cmV0dXJuIGVhKHRoaXMuX3JnYil9LEc9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHI7aWYoYT12YShhcmd1bWVudHMpLGU9YVswXSxwPWFbMV0scj1hWzJdLHIqPTI1NSwwPT09cClpPWQ9Yj1yO2Vsc2Ugc3dpdGNoKDM2MD09PWUmJihlPTApLGU+MzYwJiYoZS09MzYwKSwwPmUmJihlKz0zNjApLGUvPTYwLGY9QihlKSxjPWUtZixnPXIqKDEtcCksaD1yKigxLXAqYykscT1yKigxLXAqKDEtYykpLGYpe2Nhc2UgMDpqPVtyLHEsZ10saT1qWzBdLGQ9alsxXSxiPWpbMl07YnJlYWs7Y2FzZSAxOms9W2gscixnXSxpPWtbMF0sZD1rWzFdLGI9a1syXTticmVhaztjYXNlIDI6bD1bZyxyLHFdLGk9bFswXSxkPWxbMV0sYj1sWzJdO2JyZWFrO2Nhc2UgMzptPVtnLGgscl0saT1tWzBdLGQ9bVsxXSxiPW1bMl07YnJlYWs7Y2FzZSA0Om49W3EsZyxyXSxpPW5bMF0sZD1uWzFdLGI9blsyXTticmVhaztjYXNlIDU6bz1bcixnLGhdLGk9b1swXSxkPW9bMV0sYj1vWzJdfXJldHVybiBpPXBhKGkpLGQ9cGEoZCksYj1wYShiKSxbaSxkLGIsYS5sZW5ndGg+Mz9hWzNdOjFdfSxmYT1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnLGgsaTtyZXR1cm4gZz12YShhcmd1bWVudHMpLGY9Z1swXSxjPWdbMV0sYT1nWzJdLGU9TWF0aC5taW4oZixjLGEpLFc9TWF0aC5tYXgoZixjLGEpLGI9Vy1lLGk9Vy8yNTUsMD09PVc/KGQ9TnVtYmVyLk5hTixoPTApOihoPWIvVyxmPT09VyYmKGQ9KGMtYSkvYiksYz09PVcmJihkPTIrKGEtZikvYiksYT09PVcmJihkPTQrKGYtYykvYiksZCo9NjAsMD5kJiYoZCs9MzYwKSksW2QsaCxpXX0scy5oc3Y9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oYSxiLGMpe2MucHJvdG90eXBlPWEucHJvdG90eXBlO3ZhciBkPW5ldyBjLGU9YS5hcHBseShkLGIpO3JldHVybiBPYmplY3QoZSk9PT1lP2U6ZH0oYSx6YS5jYWxsKGFyZ3VtZW50cykuY29uY2F0KFsiaHN2Il0pLGZ1bmN0aW9uKCl7fSl9LGouaHN2PUcsYS5wcm90b3R5cGUuaHN2PWZ1bmN0aW9uKCl7cmV0dXJuIGZhKHRoaXMuX3JnYil9LFo9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkO3JldHVybiJudW1iZXIiPT09dWEoYSkmJmE+PTAmJjE2Nzc3MjE1Pj1hPyhkPWE+PjE2LGM9YT4+OCYyNTUsYj0yNTUmYSxbZCxjLGIsMV0pOihjb25zb2xlLndhcm4oInVua25vd24gbnVtIGNvbG9yOiAiK2EpLFswLDAsMCwxXSl9LGphPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7cmV0dXJuIGQ9dmEoYXJndW1lbnRzKSxjPWRbMF0sYj1kWzFdLGE9ZFsyXSwoYzw8MTYpKyhiPDw4KSthfSxzLm51bT1mdW5jdGlvbihiKXtyZXR1cm4gbmV3IGEoYiwibnVtIil9LGEucHJvdG90eXBlLm51bT1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YSYmKGE9InJnYiIpLGphKHRoaXMuX3JnYixhKX0sai5udW09WixoLnB1c2goe3A6MTAsdGVzdDpmdW5jdGlvbihhKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGgmJiJudW1iZXIiPT09dWEoYSkmJmE+PTAmJjE2Nzc3MjE1Pj1hPyJudW0iOnZvaWQgMH19KSx4PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGk7aWYoYT1hLnRvTG93ZXJDYXNlKCksbnVsbCE9cy5jb2xvcnMmJnMuY29sb3JzW2FdKXJldHVybiBDKHMuY29sb3JzW2FdKTtpZihmPWEubWF0Y2goL3JnYlwoXHMqKFwtP1xkKyksXHMqKFwtP1xkKylccyosXHMqKFwtP1xkKylccypcKS8pKXtmb3IoaD1mLnNsaWNlKDEsNCksZT1nPTA7Mj49ZztlPSsrZyloW2VdPStoW2VdO2hbM109MX1lbHNlIGlmKGY9YS5tYXRjaCgvcmdiYVwoXHMqKFwtP1xkKyksXHMqKFwtP1xkKylccyosXHMqKFwtP1xkKylccyosXHMqKFswMV18WzAxXT9cLlxkKylcKS8pKWZvcihoPWYuc2xpY2UoMSw1KSxlPWk9MDszPj1pO2U9KytpKWhbZV09K2hbZV07ZWxzZSBpZihmPWEubWF0Y2goL3JnYlwoXHMqKFwtP1xkKyg/OlwuXGQrKT8pJSxccyooXC0/XGQrKD86XC5cZCspPyklXHMqLFxzKihcLT9cZCsoPzpcLlxkKyk/KSVccypcKS8pKXtmb3IoaD1mLnNsaWNlKDEsNCksZT1iPTA7Mj49YjtlPSsrYiloW2VdPXBhKDIuNTUqaFtlXSk7aFszXT0xfWVsc2UgaWYoZj1hLm1hdGNoKC9yZ2JhXChccyooXC0/XGQrKD86XC5cZCspPyklLFxzKihcLT9cZCsoPzpcLlxkKyk/KSVccyosXHMqKFwtP1xkKyg/OlwuXGQrKT8pJVxzKixccyooWzAxXXxbMDFdP1wuXGQrKVwpLykpe2ZvcihoPWYuc2xpY2UoMSw1KSxlPWM9MDsyPj1jO2U9KytjKWhbZV09cGEoMi41NSpoW2VdKTtoWzNdPStoWzNdfWVsc2UoZj1hLm1hdGNoKC9oc2xcKFxzKihcLT9cZCsoPzpcLlxkKyk/KSxccyooXC0/XGQrKD86XC5cZCspPyklXHMqLFxzKihcLT9cZCsoPzpcLlxkKyk/KSVccypcKS8pKT8oZD1mLnNsaWNlKDEsNCksZFsxXSo9LjAxLGRbMl0qPS4wMSxoPUYoZCksaFszXT0xKTooZj1hLm1hdGNoKC9oc2xhXChccyooXC0/XGQrKD86XC5cZCspPyksXHMqKFwtP1xkKyg/OlwuXGQrKT8pJVxzKixccyooXC0/XGQrKD86XC5cZCspPyklXHMqLFxzKihbMDFdfFswMV0/XC5cZCspXCkvKSkmJihkPWYuc2xpY2UoMSw0KSxkWzFdKj0uMDEsZFsyXSo9LjAxLGg9RihkKSxoWzNdPStmWzRdKTtyZXR1cm4gaH0sYmE9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGI9YVszXTwxPyJyZ2JhIjoicmdiIiwicmdiIj09PWI/YisiKCIrYS5zbGljZSgwLDMpLm1hcChwYSkuam9pbigiLCIpKyIpIjoicmdiYSI9PT1iP2IrIigiK2Euc2xpY2UoMCwzKS5tYXAocGEpLmpvaW4oIiwiKSsiLCIrYVszXSsiKSI6dm9pZCAwfSxuYT1mdW5jdGlvbihhKXtyZXR1cm4gcGEoMTAwKmEpLzEwMH0sRT1mdW5jdGlvbihhLGIpe3ZhciBjO3JldHVybiBjPTE+Yj8iaHNsYSI6ImhzbCIsYVswXT1uYShhWzBdfHwwKSxhWzFdPW5hKDEwMCphWzFdKSsiJSIsYVsyXT1uYSgxMDAqYVsyXSkrIiUiLCJoc2xhIj09PWMmJihhWzNdPWIpLGMrIigiK2Euam9pbigiLCIpKyIpIn0sai5jc3M9ZnVuY3Rpb24oYSl7cmV0dXJuIHgoYSl9LHMuY3NzPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEsYixjKXtjLnByb3RvdHlwZT1hLnByb3RvdHlwZTt2YXIgZD1uZXcgYyxlPWEuYXBwbHkoZCxiKTtyZXR1cm4gT2JqZWN0KGUpPT09ZT9lOmR9KGEsemEuY2FsbChhcmd1bWVudHMpLmNvbmNhdChbImNzcyJdKSxmdW5jdGlvbigpe30pfSxhLnByb3RvdHlwZS5jc3M9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEmJihhPSJyZ2IiKSwicmdiIj09PWEuc2xpY2UoMCwzKT9iYSh0aGlzLl9yZ2IpOiJoc2wiPT09YS5zbGljZSgwLDMpP0UodGhpcy5oc2woKSx0aGlzLmFscGhhKCkpOnZvaWQgMH0sai5uYW1lZD1mdW5jdGlvbihhKXtyZXR1cm4gQyh3YVthXSl9LGgucHVzaCh7cDoyMCx0ZXN0OmZ1bmN0aW9uKGEpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aCYmbnVsbCE9d2FbYV0/Im5hbWVkIjp2b2lkIDB9fSksYS5wcm90b3R5cGUubmFtZT1mdW5jdGlvbihhKXt2YXIgYixjO2FyZ3VtZW50cy5sZW5ndGgmJih3YVthXSYmKHRoaXMuX3JnYj1DKHdhW2FdKSksdGhpcy5fcmdiWzNdPTEpLGI9dGhpcy5oZXgoKTtmb3IoYyBpbiB3YSlpZihiPT09d2FbY10pcmV0dXJuIGM7cmV0dXJuIGJ9LFA9ZnVuY3Rpb24oKXt2YXIgYSxjLGQsZTtyZXR1cm4gZT12YShhcmd1bWVudHMpLGQ9ZVswXSxhPWVbMV0sYz1lWzJdLGMqPWIsW2QsdyhjKSphLHJhKGMpKmFdfSxRPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGcsaCxpLGosaztyZXR1cm4gYz12YShhcmd1bWVudHMpLGg9Y1swXSxlPWNbMV0sZz1jWzJdLGo9UChoLGUsZyksYT1qWzBdLGI9alsxXSxkPWpbMl0saz1OKGEsYixkKSxpPWtbMF0sZj1rWzFdLGQ9a1syXSxbUyhpLDAsMjU1KSxTKGYsMCwyNTUpLFMoZCwwLDI1NSksYy5sZW5ndGg+Mz9jWzNdOjFdfSxNPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxnO3JldHVybiBnPXZhKGFyZ3VtZW50cyksZT1nWzBdLGE9Z1sxXSxiPWdbMl0sYz1zYShhKmErYipiKSxkPShtKGIsYSkqZiszNjApJTM2MCwwPT09cGEoMWU0KmMpJiYoZD1OdW1iZXIuTmFOKSxbZSxjLGRdfSxoYT1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnO3JldHVybiBmPXZhKGFyZ3VtZW50cyksZT1mWzBdLGM9ZlsxXSxiPWZbMl0sZz1nYShlLGMsYiksZD1nWzBdLGE9Z1sxXSxiPWdbMl0sTShkLGEsYil9LHMubGNoPWZ1bmN0aW9uKCl7dmFyIGI7cmV0dXJuIGI9dmEoYXJndW1lbnRzKSxuZXcgYShiLCJsY2giKX0scy5oY2w9ZnVuY3Rpb24oKXt2YXIgYjtyZXR1cm4gYj12YShhcmd1bWVudHMpLG5ldyBhKGIsImhjbCIpfSxqLmxjaD1RLGouaGNsPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7cmV0dXJuIGQ9dmEoYXJndW1lbnRzKSxiPWRbMF0sYT1kWzFdLGM9ZFsyXSxRKFtjLGEsYl0pfSxhLnByb3RvdHlwZS5sY2g9ZnVuY3Rpb24oKXtyZXR1cm4gaGEodGhpcy5fcmdiKX0sYS5wcm90b3R5cGUuaGNsPWZ1bmN0aW9uKCl7cmV0dXJuIGhhKHRoaXMuX3JnYikucmV2ZXJzZSgpfSxhYT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGo7cmV0dXJuIG51bGw9PWEmJihhPSJyZ2IiKSxpPXZhKGFyZ3VtZW50cyksaD1pWzBdLGU9aVsxXSxiPWlbMl0saC89MjU1LGUvPTI1NSxiLz0yNTUsZj0xLU1hdGgubWF4KGgsTWF0aC5tYXgoZSxiKSksZD0xPmY/MS8oMS1mKTowLGM9KDEtaC1mKSpkLGc9KDEtZS1mKSpkLGo9KDEtYi1mKSpkLFtjLGcsaixmXX0sdT1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnLGgsaTtyZXR1cm4gYj12YShhcmd1bWVudHMpLGQ9YlswXSxnPWJbMV0saT1iWzJdLGY9YlszXSxhPWIubGVuZ3RoPjQ/Yls0XToxLDE9PT1mP1swLDAsMCxhXTooaD1kPj0xPzA6cGEoMjU1KigxLWQpKigxLWYpKSxlPWc+PTE/MDpwYSgyNTUqKDEtZykqKDEtZikpLGM9aT49MT8wOnBhKDI1NSooMS1pKSooMS1mKSksW2gsZSxjLGFdKX0sai5jbXlrPWZ1bmN0aW9uKCl7cmV0dXJuIHUodmEoYXJndW1lbnRzKSl9LHMuY215az1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihhLGIsYyl7Yy5wcm90b3R5cGU9YS5wcm90b3R5cGU7dmFyIGQ9bmV3IGMsZT1hLmFwcGx5KGQsYik7cmV0dXJuIE9iamVjdChlKT09PWU/ZTpkfShhLHphLmNhbGwoYXJndW1lbnRzKS5jb25jYXQoWyJjbXlrIl0pLGZ1bmN0aW9uKCl7fSl9LGEucHJvdG90eXBlLmNteWs9ZnVuY3Rpb24oKXtyZXR1cm4gYWEodGhpcy5fcmdiKX0sai5nbD1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU7Zm9yKGQ9ZnVuY3Rpb24oKXt2YXIgYSxjO2E9dmEoYXJndW1lbnRzKSxjPVtdO2ZvcihiIGluIGEpZT1hW2JdLGMucHVzaChlKTtyZXR1cm4gY30uYXBwbHkodGhpcyxhcmd1bWVudHMpLGE9Yz0wOzI+PWM7YT0rK2MpZFthXSo9MjU1O3JldHVybiBkfSxzLmdsPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEsYixjKXtjLnByb3RvdHlwZT1hLnByb3RvdHlwZTt2YXIgZD1uZXcgYyxlPWEuYXBwbHkoZCxiKTtyZXR1cm4gT2JqZWN0KGUpPT09ZT9lOmR9KGEsemEuY2FsbChhcmd1bWVudHMpLmNvbmNhdChbImdsIl0pLGZ1bmN0aW9uKCl7fSl9LGEucHJvdG90eXBlLmdsPWZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIGE9dGhpcy5fcmdiLFthWzBdLzI1NSxhWzFdLzI1NSxhWzJdLzI1NSxhWzNdXX0saWE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBkPXZhKGFyZ3VtZW50cyksYT1kWzBdLGI9ZFsxXSxjPWRbMl0sYT1VKGEpLGI9VShiKSxjPVUoYyksLjIxMjYqYSsuNzE1MipiKy4wNzIyKmN9LFU9ZnVuY3Rpb24oYSl7cmV0dXJuIGEvPTI1NSwuMDM5Mjg+PWE/YS8xMi45MjpfKChhKy4wNTUpLzEuMDU1LDIuNCl9LGs9W10sSD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGcsaDtmb3IobnVsbD09YyYmKGM9LjUpLG51bGw9PWQmJihkPSJyZ2IiKSwib2JqZWN0IiE9PXVhKGEpJiYoYT1zKGEpKSwib2JqZWN0IiE9PXVhKGIpJiYoYj1zKGIpKSxnPTAsZj1rLmxlbmd0aDtmPmc7ZysrKWlmKGU9a1tnXSxkPT09ZVswXSl7aD1lWzFdKGEsYixjLGQpO2JyZWFrfWlmKG51bGw9PWgpdGhyb3ciY29sb3IgbW9kZSAiK2QrIiBpcyBub3Qgc3VwcG9ydGVkIjtyZXR1cm4gaC5hbHBoYShhLmFscGhhKCkrYyooYi5hbHBoYSgpLWEuYWxwaGEoKSkpLGh9LHMuaW50ZXJwb2xhdGU9SCxhLnByb3RvdHlwZS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEgodGhpcyxhLGIsYyl9LHMubWl4PUgsYS5wcm90b3R5cGUubWl4PWEucHJvdG90eXBlLmludGVycG9sYXRlLEw9ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGYsZztyZXR1cm4gZj1iLl9yZ2IsZz1jLl9yZ2IsbmV3IGEoZlswXStkKihnWzBdLWZbMF0pLGZbMV0rZCooZ1sxXS1mWzFdKSxmWzJdK2QqKGdbMl0tZlsyXSksZSl9LGsucHVzaChbInJnYiIsTF0pLGEucHJvdG90eXBlLmx1bWluYW5jZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmO3JldHVybiBudWxsPT1iJiYoYj0icmdiIiksYXJndW1lbnRzLmxlbmd0aD8oMD09PWE/dGhpcy5fcmdiPVswLDAsMCx0aGlzLl9yZ2JbM11dOjE9PT1hP3RoaXMuX3JnYj1bMjU1LDI1NSwyNTUsdGhpcy5fcmdiWzNdXTooZD0xZS03LGU9MjAsZj1mdW5jdGlvbihjLGcpe3ZhciBoLGk7cmV0dXJuIGk9Yy5pbnRlcnBvbGF0ZShnLC41LGIpLGg9aS5sdW1pbmFuY2UoKSxNYXRoLmFicyhhLWgpPGR8fCFlLS0/aTpoPmE/ZihjLGkpOmYoaSxnKX0sYz1pYSh0aGlzLl9yZ2IpLHRoaXMuX3JnYj0oYz5hP2YocygiYmxhY2siKSx0aGlzKTpmKHRoaXMscygid2hpdGUiKSkpLnJnYmEoKSksdGhpcyk6aWEodGhpcy5fcmdiKX0sdGE9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU7cmV0dXJuIGU9YS8xMDAsNjY+ZT8oZD0yNTUsYz0tMTU1LjI1NDg1NTYyNzA5MTc5LS40NDU5Njk1MDQ2OTU3OTEzMyooYz1lLTIpKzEwNC40OTIxNjE5OTM5Mzg4OCpUKGMpLGI9MjA+ZT8wOi0yNTQuNzY5MzUxODQxMjA5MDIrLjgyNzQwOTYwNjQwMDczOTUqKGI9ZS0xMCkrMTE1LjY3OTk0NDAxMDY2MTQ3KlQoYikpOihkPTM1MS45NzY5MDU2NjgwNTY5MysuMTE0MjA2NDUzNzg0MTY1KihkPWUtNTUpLTQwLjI1MzY2MzA5MzMyMTI3KlQoZCksYz0zMjUuNDQ5NDEyNTcxMTk3NCsuMDc5NDM0NTY1MzY2NjIzNDIqKGM9ZS01MCktMjguMDg1Mjk2MzUwNzk1NypUKGMpLGI9MjU1KSx0KFtkLGMsYl0pfSxrYT1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnLGgsaTtmb3IoZz12YShhcmd1bWVudHMpLGY9Z1swXSxjPWdbMV0sYT1nWzJdLGU9MWUzLGQ9NGU0LGI9LjQ7ZC1lPmI7KWk9LjUqKGQrZSksaD10YShpKSxoWzJdL2hbMF0+PWEvZj9kPWk6ZT1pO3JldHVybiBwYShpKX0scy50ZW1wZXJhdHVyZT1zLmtlbHZpbj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihhLGIsYyl7Yy5wcm90b3R5cGU9YS5wcm90b3R5cGU7dmFyIGQ9bmV3IGMsZT1hLmFwcGx5KGQsYik7cmV0dXJuIE9iamVjdChlKT09PWU/ZTpkfShhLHphLmNhbGwoYXJndW1lbnRzKS5jb25jYXQoWyJ0ZW1wZXJhdHVyZSJdKSxmdW5jdGlvbigpe30pfSxqLnRlbXBlcmF0dXJlPWoua2VsdmluPWouSz10YSxhLnByb3RvdHlwZS50ZW1wZXJhdHVyZT1mdW5jdGlvbigpe3JldHVybiBrYSh0aGlzLl9yZ2IpfSxhLnByb3RvdHlwZS5rZWx2aW49YS5wcm90b3R5cGUudGVtcGVyYXR1cmUscy5jb250cmFzdD1mdW5jdGlvbihiLGMpe3ZhciBkLGUsZixnO3JldHVybigic3RyaW5nIj09PShmPXVhKGIpKXx8Im51bWJlciI9PT1mKSYmKGI9bmV3IGEoYikpLCgic3RyaW5nIj09PShnPXVhKGMpKXx8Im51bWJlciI9PT1nKSYmKGM9bmV3IGEoYykpLGQ9Yi5sdW1pbmFuY2UoKSxlPWMubHVtaW5hbmNlKCksZD5lPyhkKy4wNSkvKGUrLjA1KTooZSsuMDUpLyhkKy4wNSl9LGEucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGc7cmV0dXJuIGQ9dGhpcyxmPWEuc3BsaXQoIi4iKSxlPWZbMF0sYj1mWzFdLGc9ZFtlXSgpLGI/KGM9ZS5pbmRleE9mKGIpLGM+LTE/Z1tjXTpjb25zb2xlLndhcm4oInVua25vd24gY2hhbm5lbCAiK2IrIiBpbiBtb2RlICIrZSkpOmd9LGEucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaDtpZihlPXRoaXMsZz1hLnNwbGl0KCIuIiksZj1nWzBdLGM9Z1sxXSxjKWlmKGg9ZVtmXSgpLGQ9Zi5pbmRleE9mKGMpLGQ+LTEpaWYoInN0cmluZyI9PT11YShiKSlzd2l0Y2goYi5jaGFyQXQoMCkpe2Nhc2UiKyI6aFtkXSs9K2I7YnJlYWs7Y2FzZSItIjpoW2RdKz0rYjticmVhaztjYXNlIioiOmhbZF0qPStiLnN1YnN0cigxKTticmVhaztjYXNlIi8iOmhbZF0vPStiLnN1YnN0cigxKTticmVhaztkZWZhdWx0OmhbZF09K2J9ZWxzZSBoW2RdPWI7ZWxzZSBjb25zb2xlLndhcm4oInVua25vd24gY2hhbm5lbCAiK2MrIiBpbiBtb2RlICIrZik7ZWxzZSBoPWI7cmV0dXJuIGUuX3JnYj1zKGgsZikuYWxwaGEoZS5hbHBoYSgpKS5fcmdiLGV9LGEucHJvdG90eXBlLmRhcmtlbj1mdW5jdGlvbihhKXt2YXIgYixkO3JldHVybiBudWxsPT1hJiYoYT0xKSxkPXRoaXMsYj1kLmxhYigpLGJbMF0tPWMuS24qYSxzLmxhYihiKS5hbHBoYShkLmFscGhhKCkpfSxhLnByb3RvdHlwZS5icmlnaHRlbj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YSYmKGE9MSksdGhpcy5kYXJrZW4oLWEpfSxhLnByb3RvdHlwZS5kYXJrZXI9YS5wcm90b3R5cGUuZGFya2VuLGEucHJvdG90eXBlLmJyaWdodGVyPWEucHJvdG90eXBlLmJyaWdodGVuLGEucHJvdG90eXBlLnNhdHVyYXRlPWZ1bmN0aW9uKGEpe3ZhciBiLGQ7cmV0dXJuIG51bGw9PWEmJihhPTEpLGQ9dGhpcyxiPWQubGNoKCksYlsxXSs9YSpjLktuLGJbMV08MCYmKGJbMV09MCkscy5sY2goYikuYWxwaGEoZC5hbHBoYSgpKX0sYS5wcm90b3R5cGUuZGVzYXR1cmF0ZT1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YSYmKGE9MSksdGhpcy5zYXR1cmF0ZSgtYSl9LGEucHJvdG90eXBlLnByZW11bHRpcGx5PWZ1bmN0aW9uKCl7dmFyIGEsYjtyZXR1cm4gYj10aGlzLnJnYigpLGE9dGhpcy5hbHBoYSgpLHMoYlswXSphLGJbMV0qYSxiWzJdKmEsYSl9LG89ZnVuY3Rpb24oYSxiLGMpe2lmKCFvW2NdKXRocm93InVua25vd24gYmxlbmQgbW9kZSAiK2M7cmV0dXJuIG9bY10oYSxiKX0scD1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXt2YXIgZCxlO3JldHVybiBkPXMoYykucmdiKCksZT1zKGIpLnJnYigpLHMoYShkLGUpLCJyZ2IiKX19LEE9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dmFyIGQsZSxmO2ZvcihmPVtdLGQ9ZT0wOzM+PWU7ZD0rK2UpZltkXT1hKGJbZF0sY1tkXSk7cmV0dXJuIGZ9fSxZPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGF9LFg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSpiLzI1NX0seT1mdW5jdGlvbihhLGIpe3JldHVybiBhPmI/YjphfSxSPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE+Yj9hOmJ9LHFhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIDI1NSooMS0oMS1hLzI1NSkqKDEtYi8yNTUpKX0sJD1mdW5jdGlvbihhLGIpe3JldHVybiAxMjg+Yj8yKmEqYi8yNTU6MjU1KigxLTIqKDEtYS8yNTUpKigxLWIvMjU1KSl9LHI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMjU1KigxLSgxLWIvMjU1KS8oYS8yNTUpKX0sej1mdW5jdGlvbihhLGIpe3JldHVybiAyNTU9PT1hPzI1NTooYT0yNTUqKGIvMjU1KS8oMS1hLzI1NSksYT4yNTU/MjU1OmEpfSxvLm5vcm1hbD1wKEEoWSkpLG8ubXVsdGlwbHk9cChBKFgpKSxvLnNjcmVlbj1wKEEocWEpKSxvLm92ZXJsYXk9cChBKCQpKSxvLmRhcmtlbj1wKEEoeSkpLG8ubGlnaHRlbj1wKEEoUikpLG8uZG9kZ2U9cChBKHopKSxvLmJ1cm49cChBKHIpKSxzLmJsZW5kPW8scy5hbmFseXplPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlO2ZvcihkPXttaW46TnVtYmVyLk1BWF9WQUxVRSxtYXg6LTEqTnVtYmVyLk1BWF9WQUxVRSxzdW06MCx2YWx1ZXM6W10sY291bnQ6MH0sYz0wLGI9YS5sZW5ndGg7Yj5jO2MrKyllPWFbY10sbnVsbD09ZXx8aXNOYU4oZSl8fChkLnZhbHVlcy5wdXNoKGUpLGQuc3VtKz1lLGU8ZC5taW4mJihkLm1pbj1lKSxlPmQubWF4JiYoZC5tYXg9ZSksZC5jb3VudCs9MSk7cmV0dXJuIGQuZG9tYWluPVtkLm1pbixkLm1heF0sZC5saW1pdHM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcy5saW1pdHMoZCxhLGIpfSxkfSxzLnNjYWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIsdCx1LHYsdyx4O3JldHVybiBrPSJyZ2IiLGw9cygiI2NjYyIpLHA9MCxoPSExLGc9WzAsMV0sbz1bXSxuPVswLDBdLGM9ITEsZT1bXSxtPSExLGo9MCxpPTEsZj0hMSxkPXt9LHc9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGYsZyxoLGk7aWYobnVsbD09YSYmKGE9WyIjZmZmIiwiIzAwMCJdKSxudWxsIT1hJiYic3RyaW5nIj09PXVhKGEpJiZudWxsIT0obnVsbCE9KGY9cy5icmV3ZXIpP2ZbYV06dm9pZCAwKSYmKGE9cy5icmV3ZXJbYV0pLCJhcnJheSI9PT11YShhKSl7Zm9yKGE9YS5zbGljZSgwKSxiPWQ9MCxnPWEubGVuZ3RoLTE7Zz49MD9nPj1kOmQ+PWc7Yj1nPj0wPysrZDotLWQpYz1hW2JdLCJzdHJpbmciPT09dWEoYykmJihhW2JdPXMoYykpO2ZvcihvLmxlbmd0aD0wLGI9aT0wLGg9YS5sZW5ndGgtMTtoPj0wP2g+PWk6aT49aDtiPWg+PTA/KytpOi0taSlvLnB1c2goYi8oYS5sZW5ndGgtMSkpfXJldHVybiB2KCksZT1hfSx0PWZ1bmN0aW9uKGEpe3ZhciBiLGQ7aWYobnVsbCE9Yyl7Zm9yKGQ9Yy5sZW5ndGgtMSxiPTA7ZD5iJiZhPj1jW2JdOyliKys7cmV0dXJuIGItMX1yZXR1cm4gMH0seD1mdW5jdGlvbihhKXtyZXR1cm4gYX0scT1mdW5jdGlvbihhKXt2YXIgYixkLGUsZixnO3JldHVybiBnPWEsYy5sZW5ndGg+MiYmKGY9Yy5sZW5ndGgtMSxiPXQoYSksZT1jWzBdKyhjWzFdLWNbMF0pKigwKy41KnApLGQ9Y1tmLTFdKyhjW2ZdLWNbZi0xXSkqKDEtLjUqcCksZz1qKyhjW2JdKy41KihjW2IrMV0tY1tiXSktZSkvKGQtZSkqKGktaikpLGd9LHU9ZnVuY3Rpb24oYSxiKXt2YXIgZixnLGgsbSxwLHEscix1O2lmKG51bGw9PWImJihiPSExKSxpc05hTihhKSlyZXR1cm4gbDtpZihiP3U9YTpjJiZjLmxlbmd0aD4yPyhmPXQoYSksdT1mLyhjLmxlbmd0aC0yKSx1PW5bMF0rdSooMS1uWzBdLW5bMV0pKTppIT09aj8odT0oYS1qKS8oaS1qKSx1PW5bMF0rdSooMS1uWzBdLW5bMV0pLHU9TWF0aC5taW4oMSxNYXRoLm1heCgwLHUpKSk6dT0xLGJ8fCh1PXgodSkpLG09TWF0aC5mbG9vcigxZTQqdSksZFttXSlnPWRbbV07ZWxzZXtpZigiYXJyYXkiPT09dWEoZSkpZm9yKGg9cD0wLHI9by5sZW5ndGgtMTtyPj0wP3I+PXA6cD49cjtoPXI+PTA/KytwOi0tcCl7aWYocT1vW2hdLHE+PXUpe2c9ZVtoXTticmVha31pZih1Pj1xJiZoPT09by5sZW5ndGgtMSl7Zz1lW2hdO2JyZWFrfWlmKHU+cSYmdTxvW2grMV0pe3U9KHUtcSkvKG9baCsxXS1xKSxnPXMuaW50ZXJwb2xhdGUoZVtoXSxlW2grMV0sdSxrKTticmVha319ZWxzZSJmdW5jdGlvbiI9PT11YShlKSYmKGc9ZSh1KSk7ZFttXT1nfXJldHVybiBnfSx2PWZ1bmN0aW9uKCl7cmV0dXJuIGQ9e319LHcoYSkscj1mdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYj1zKHUoYSkpLG0mJmJbbV0/YlttXSgpOmJ9LHIuY2xhc3Nlcz1mdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbnVsbCE9YT8oImFycmF5Ij09PXVhKGEpPyhjPWEsZz1bYVswXSxhW2EubGVuZ3RoLTFdXSk6KGI9cy5hbmFseXplKGcpLGM9MD09PWE/W2IubWluLGIubWF4XTpzLmxpbWl0cyhiLCJlIixhKSkscik6Y30sci5kb21haW49ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGYsaCxrLGw7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGc7aWYoaj1hWzBdLGk9YVthLmxlbmd0aC0xXSxvPVtdLGQ9ZS5sZW5ndGgsYS5sZW5ndGg9PT1kJiZqIT09aSlmb3IoaD0wLGY9YS5sZW5ndGg7Zj5oO2grKyljPWFbaF0sby5wdXNoKChjLWopLyhpLWopKTtlbHNlIGZvcihiPWw9MCxrPWQtMTtrPj0wP2s+PWw6bD49aztiPWs+PTA/KytsOi0tbClvLnB1c2goYi8oZC0xKSk7cmV0dXJuIGc9W2osaV0scn0sci5tb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPWEsdigpLHIpOmt9LHIucmFuZ2U9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdyhhLGIpLHJ9LHIub3V0PWZ1bmN0aW9uKGEpe3JldHVybiBtPWEscn0sci5zcHJlYWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9YSxyKTpwfSxyLmNvcnJlY3RMaWdodG5lc3M9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEmJihhPSEwKSxmPWEsdigpLHg9Zj9mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGo7Zm9yKGI9dSgwLCEwKS5sYWIoKVswXSxjPXUoMSwhMCkubGFiKClbMF0saD1iPmMsZD11KGEsITApLmxhYigpWzBdLGY9YisoYy1iKSphLGU9ZC1mLGk9MCxqPTEsZz0yMDtNYXRoLmFicyhlKT4uMDEmJmctLT4wOykhZnVuY3Rpb24oKXtyZXR1cm4gaCYmKGUqPS0xKSwwPmU/KGk9YSxhKz0uNSooai1hKSk6KGo9YSxhKz0uNSooaS1hKSksZD11KGEsITApLmxhYigpWzBdLGU9ZC1mfSgpO3JldHVybiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYX0scn0sci5wYWRkaW5nPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hPygibnVtYmVyIj09PXVhKGEpJiYoYT1bYSxhXSksbj1hLHIpOm59LHIuY29sb3JzPWZ1bmN0aW9uKCl7dmFyIGIsZCxlLGYsaCxpLGosayxsO2lmKGY9MCxoPSJoZXgiLDE9PT1hcmd1bWVudHMubGVuZ3RoJiYoInN0cmluZyI9PT11YShhcmd1bWVudHNbMF0pP2g9YXJndW1lbnRzWzBdOmY9YXJndW1lbnRzWzBdKSwyPT09YXJndW1lbnRzLmxlbmd0aCYmKGY9YXJndW1lbnRzWzBdLGg9YXJndW1lbnRzWzFdKSxmKXJldHVybiBkPWdbMF0sYj1nWzFdLWQsZnVuY3Rpb24oKXtqPVtdO2Zvcih2YXIgYT0wO2Y+PTA/Zj5hOmE+ZjtmPj0wP2ErKzphLS0pai5wdXNoKGEpO3JldHVybiBqfS5hcHBseSh0aGlzKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIHIoZCthLyhmLTEpKmIpW2hdKCl9KTtpZihhPVtdLGs9W10sYyYmYy5sZW5ndGg+Milmb3IoZT1sPTEsaT1jLmxlbmd0aDtpPj0xP2k+bDpsPmk7ZT1pPj0xPysrbDotLWwpay5wdXNoKC41KihjW2UtMV0rY1tlXSkpO2Vsc2Ugaz1nO3JldHVybiBrLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gcihhKVtoXSgpfSl9LHJ9LG51bGw9PXMuc2NhbGVzJiYocy5zY2FsZXM9e30pLHMuc2NhbGVzLmNvb2w9ZnVuY3Rpb24oKXtyZXR1cm4gcy5zY2FsZShbcy5oc2woMTgwLDEsLjkpLHMuaHNsKDI1MCwuNywuNCldKX0scy5zY2FsZXMuaG90PWZ1bmN0aW9uKCl7cmV0dXJuIHMuc2NhbGUoWyIjMDAwIiwiI2YwMCIsIiNmZjAiLCIjZmZmIl0sWzAsLjI1LC43NSwxXSkubW9kZSgicmdiIil9LHMuYW5hbHl6ZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGo7aWYoaD17bWluOk51bWJlci5NQVhfVkFMVUUsbWF4Oi0xKk51bWJlci5NQVhfVkFMVUUsc3VtOjAsdmFsdWVzOltdLGNvdW50OjB9LG51bGw9PWMmJihjPWZ1bmN0aW9uKCl7cmV0dXJuITB9KSxkPWZ1bmN0aW9uKGEpe251bGw9PWF8fGlzTmFOKGEpfHwoaC52YWx1ZXMucHVzaChhKSxoLnN1bSs9YSxhPGgubWluJiYoaC5taW49YSksYT5oLm1heCYmKGgubWF4PWEpLGguY291bnQrPTEpfSxqPWZ1bmN0aW9uKGEsZSl7cmV0dXJuIGMoYSxlKT9kKG51bGwhPWImJiJmdW5jdGlvbiI9PT11YShiKT9iKGEpOm51bGwhPWImJiJzdHJpbmciPT09dWEoYil8fCJudW1iZXIiPT09dWEoYik/YVtiXTphKTp2b2lkIDB9LCJhcnJheSI9PT11YShhKSlmb3IoZz0wLGY9YS5sZW5ndGg7Zj5nO2crKylpPWFbZ10saihpKTtlbHNlIGZvcihlIGluIGEpaT1hW2VdLGooaSxlKTtyZXR1cm4gaC5kb21haW49W2gubWluLGgubWF4XSxoLmxpbWl0cz1mdW5jdGlvbihhLGIpe3JldHVybiBzLmxpbWl0cyhoLGEsYil9LGh9LHMubGltaXRzPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrLG0sbixvLHAscSxyLHQsdSx2LHcseCx5LHosQSxDLEQsRSxGLEcsSCxJLEosSyxMLE0sTixPLFAsUSxSLFMsVSxWLFgsWSxaLCQsYWEsYmEsY2EsZGEsZWEsZmEsZ2EsaGEsaWEsamE7aWYobnVsbD09YiYmKGI9ImVxdWFsIiksbnVsbD09YyYmKGM9NyksImFycmF5Ij09PXVhKGEpJiYoYT1zLmFuYWx5emUoYSkpLEU9YS5taW4sVz1hLm1heCxmYT1hLnN1bSxpYT1hLnZhbHVlcy5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEtYn0pLEM9W10sImMiPT09Yi5zdWJzdHIoMCwxKSYmKEMucHVzaChFKSxDLnB1c2goVykpLCJlIj09PWIuc3Vic3RyKDAsMSkpe2ZvcihDLnB1c2goRSkseT1LPTEsTz1jLTE7Tz49MT9PPj1LOks+PU87eT1PPj0xPysrSzotLUspQy5wdXNoKEUreS9jKihXLUUpKTtDLnB1c2goVyl9ZWxzZSBpZigibCI9PT1iLnN1YnN0cigwLDEpKXtpZigwPj1FKXRocm93IkxvZ2FyaXRobWljIHNjYWxlcyBhcmUgb25seSBwb3NzaWJsZSBmb3IgdmFsdWVzID4gMCI7Zm9yKEY9TWF0aC5MT0cxMEUqVChFKSxEPU1hdGguTE9HMTBFKlQoVyksQy5wdXNoKEUpLHk9amE9MSxQPWMtMTtQPj0xP1A+PWphOmphPj1QO3k9UD49MT8rK2phOi0tamEpQy5wdXNoKF8oMTAsRit5L2MqKEQtRikpKTtDLnB1c2goVyl9ZWxzZSBpZigicSI9PT1iLnN1YnN0cigwLDEpKXtmb3IoQy5wdXNoKEUpLHk9ZD0xLFg9Yy0xO1g+PTE/WD49ZDpkPj1YO3k9WD49MT8rK2Q6LS1kKUw9aWEubGVuZ3RoKnkvYyxNPUIoTCksTT09PUw/Qy5wdXNoKGlhW01dKTooTj1MLU0sQy5wdXNoKGlhW01dKk4raWFbTSsxXSooMS1OKSkpO0MucHVzaChXKX1lbHNlIGlmKCJrIj09PWIuc3Vic3RyKDAsMSkpe2ZvcihIPWlhLmxlbmd0aCxyPW5ldyBBcnJheShIKSx3PW5ldyBBcnJheShjKSxlYT0hMCxJPTAsdT1udWxsLHU9W10sdS5wdXNoKEUpLHk9ZT0xLFk9Yy0xO1k+PTE/WT49ZTplPj1ZO3k9WT49MT8rK2U6LS1lKXUucHVzaChFK3kvYyooVy1FKSk7Zm9yKHUucHVzaChXKTtlYTspe2Zvcih6PWY9MCxaPWMtMTtaPj0wP1o+PWY6Zj49Wjt6PVo+PTA/KytmOi0tZil3W3pdPTA7Zm9yKHk9Zz0wLCQ9SC0xOyQ+PTA/JD49ZzpnPj0kO3k9JD49MD8rK2c6LS1nKXtmb3IoaGE9aWFbeV0sRz1OdW1iZXIuTUFYX1ZBTFVFLHo9aD0wLGFhPWMtMTthYT49MD9hYT49aDpoPj1hYTt6PWFhPj0wPysraDotLWgpeD1sKHVbel0taGEpLEc+eCYmKEc9eCx0PXopO3dbdF0rKyxyW3ldPXR9Zm9yKEo9bmV3IEFycmF5KGMpLHo9aT0wLGJhPWMtMTtiYT49MD9iYT49aTppPj1iYTt6PWJhPj0wPysraTotLWkpSlt6XT1udWxsO2Zvcih5PWo9MCxjYT1ILTE7Y2E+PTA/Y2E+PWo6aj49Y2E7eT1jYT49MD8rK2o6LS1qKXY9clt5XSxudWxsPT09Slt2XT9KW3ZdPWlhW3ldOkpbdl0rPWlhW3ldO2Zvcih6PWs9MCxkYT1jLTE7ZGE+PTA/ZGE+PWs6az49ZGE7ej1kYT49MD8rK2s6LS1rKUpbel0qPTEvd1t6XTtmb3IoZWE9ITEsej1tPTAsUT1jLTE7UT49MD9RPj1tOm0+PVE7ej1RPj0wPysrbTotLW0paWYoSlt6XSE9PXVbeV0pe2VhPSEwO2JyZWFrfXU9SixJKyssST4yMDAmJihlYT0hMSl9Zm9yKEE9e30sej1uPTAsUj1jLTE7Uj49MD9SPj1uOm4+PVI7ej1SPj0wPysrbjotLW4pQVt6XT1bXTtmb3IoeT1vPTAsUz1ILTE7Uz49MD9TPj1vOm8+PVM7eT1TPj0wPysrbzotLW8pdj1yW3ldLEFbdl0ucHVzaChpYVt5XSk7Zm9yKGdhPVtdLHo9cD0wLFU9Yy0xO1U+PTA/VT49cDpwPj1VO3o9VT49MD8rK3A6LS1wKWdhLnB1c2goQVt6XVswXSksZ2EucHVzaChBW3pdW0Fbel0ubGVuZ3RoLTFdKTtmb3IoZ2E9Z2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLWJ9KSxDLnB1c2goZ2FbMF0pLHk9cT0xLFY9Z2EubGVuZ3RoLTE7Vj49cTt5PXErPTIpaXNOYU4oZ2FbeV0pfHxDLnB1c2goZ2FbeV0pfXJldHVybiBDfSxEPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmLGgsaTtyZXR1cm4gZD12YShhcmd1bWVudHMpLGE9ZFswXSxiPWRbMV0sYz1kWzJdLGEvPTM2MCwxLzM+YT8oZj0oMS1iKS8zLGk9KDErYip3KGcqYSkvdyhlLWcqYSkpLzMsaD0xLShmK2kpKToyLzM+YT8oYS09MS8zLGk9KDEtYikvMyxoPSgxK2IqdyhnKmEpL3coZS1nKmEpKS8zLGY9MS0oaStoKSk6KGEtPTIvMyxoPSgxLWIpLzMsZj0oMStiKncoZyphKS93KGUtZyphKSkvMyxpPTEtKGgrZikpLGk9UyhjKmkqMyksaD1TKGMqaCozKSxmPVMoYypmKjMpLFsyNTUqaSwyNTUqaCwyNTUqZixkLmxlbmd0aD4zP2RbM106MV19LGRhPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGgsaTtyZXR1cm4gaD12YShhcmd1bWVudHMpLGY9aFswXSxiPWhbMV0sYT1oWzJdLGc9MipNYXRoLlBJLGYvPTI1NSxiLz0yNTUsYS89MjU1LGU9TWF0aC5taW4oZixiLGEpLGQ9KGYrYithKS8zLGk9MS1lL2QsMD09PWk/Yz0wOihjPShmLWIrKGYtYSkpLzIsYy89TWF0aC5zcXJ0KChmLWIpKihmLWIpKyhmLWEpKihiLWEpKSxjPU1hdGguYWNvcyhjKSxhPmImJihjPWctYyksYy89ZyksWzM2MCpjLGksZF19LHMuaHNpPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEsYixjKXtjLnByb3RvdHlwZT1hLnByb3RvdHlwZTt2YXIgZD1uZXcgYyxlPWEuYXBwbHkoZCxiKTtyZXR1cm4gT2JqZWN0KGUpPT09ZT9lOmR9KGEsemEuY2FsbChhcmd1bWVudHMpLmNvbmNhdChbImhzaSJdKSxmdW5jdGlvbigpe30pfSxqLmhzaT1ELGEucHJvdG90eXBlLmhzaT1mdW5jdGlvbigpe3JldHVybiBkYSh0aGlzLl9yZ2IpfSxJPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxO3JldHVybiJoc2wiPT09ZD8ocD1hLmhzbCgpLHE9Yi5oc2woKSk6ImhzdiI9PT1kPyhwPWEuaHN2KCkscT1iLmhzdigpKToiaHNpIj09PWQ/KHA9YS5oc2koKSxxPWIuaHNpKCkpOigibGNoIj09PWR8fCJoY2wiPT09ZCkmJihkPSJoY2wiLHA9YS5oY2woKSxxPWIuaGNsKCkpLCJoIj09PWQuc3Vic3RyKDAsMSkmJihnPXBbMF0sbj1wWzFdLGo9cFsyXSxoPXFbMF0sbz1xWzFdLGs9cVsyXSksaXNOYU4oZyl8fGlzTmFOKGgpP2lzTmFOKGcpP2lzTmFOKGgpP2Y9TnVtYmVyLk5hTjooZj1oLDEhPT1qJiYwIT09anx8ImhzdiI9PT1kfHwobT1vKSk6KGY9ZywxIT09ayYmMCE9PWt8fCJoc3YiPT09ZHx8KG09bikpOihlPWg+ZyYmaC1nPjE4MD9oLShnKzM2MCk6Zz5oJiZnLWg+MTgwP2grMzYwLWc6aC1nLGY9ZytjKmUpLG51bGw9PW0mJihtPW4rYyooby1uKSksaT1qK2MqKGstaiksbD1zW2RdKGYsbSxpKX0saz1rLmNvbmNhdChmdW5jdGlvbigpe3ZhciBhLGIsYyxkO2ZvcihjPVsiaHN2IiwiaHNsIiwiaHNpIiwiaGNsIiwibGNoIl0sZD1bXSxiPTAsYT1jLmxlbmd0aDthPmI7YisrKVY9Y1tiXSxkLnB1c2goW1YsSV0pO3JldHVybiBkfSgpKSxLPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGY7cmV0dXJuIGU9YS5udW0oKSxmPWIubnVtKCkscy5udW0oZSsoZi1lKSpjLCJudW0iKX0say5wdXNoKFsibnVtIixLXSksSj1mdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGg7cmV0dXJuIGc9Yi5sYWIoKSxoPWMubGFiKCksZj1uZXcgYShnWzBdK2QqKGhbMF0tZ1swXSksZ1sxXStkKihoWzFdLWdbMV0pLGdbMl0rZCooaFsyXS1nWzJdKSxlKTsNCn0say5wdXNoKFsibGFiIixKXSl9KS5jYWxsKHRoaXMpOw=="></script>
<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2Mi4yLjEgfCAoYykgalF1ZXJ5IEZvdW5kYXRpb24gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8NCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWEuZG9jdW1lbnQsZT1jLnNsaWNlLGY9Yy5jb25jYXQsZz1jLnB1c2gsaD1jLmluZGV4T2YsaT17fSxqPWkudG9TdHJpbmcsaz1pLmhhc093blByb3BlcnR5LGw9e30sbT0iMi4yLjEiLG49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IG4uZm4uaW5pdChhLGIpfSxvPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZyxwPS9eLW1zLS8scT0vLShbXGRhLXpdKS9naSxyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX07bi5mbj1uLnByb3RvdHlwZT17anF1ZXJ5Om0sY29uc3RydWN0b3I6bixzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hPzA+YT90aGlzW2ErdGhpcy5sZW5ndGhdOnRoaXNbYV06ZS5jYWxsKHRoaXMpfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSl7dmFyIGI9bi5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksYSk7cmV0dXJuIGIucHJldk9iamVjdD10aGlzLGIuY29udGV4dD10aGlzLmNvbnRleHQsYn0sZWFjaDpmdW5jdGlvbihhKXtyZXR1cm4gbi5lYWNoKHRoaXMsYSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOmcsc29ydDpjLnNvcnQsc3BsaWNlOmMuc3BsaWNlfSxuLmV4dGVuZD1uLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnPWFyZ3VtZW50c1swXXx8e30saD0xLGk9YXJndW1lbnRzLmxlbmd0aCxqPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBnJiYoaj1nLGc9YXJndW1lbnRzW2hdfHx7fSxoKyspLCJvYmplY3QiPT10eXBlb2YgZ3x8bi5pc0Z1bmN0aW9uKGcpfHwoZz17fSksaD09PWkmJihnPXRoaXMsaC0tKTtpPmg7aCsrKWlmKG51bGwhPShhPWFyZ3VtZW50c1toXSkpZm9yKGIgaW4gYSljPWdbYl0sZD1hW2JdLGchPT1kJiYoaiYmZCYmKG4uaXNQbGFpbk9iamVjdChkKXx8KGU9bi5pc0FycmF5KGQpKSk/KGU/KGU9ITEsZj1jJiZuLmlzQXJyYXkoYyk/YzpbXSk6Zj1jJiZuLmlzUGxhaW5PYmplY3QoYyk/Yzp7fSxnW2JdPW4uZXh0ZW5kKGosZixkKSk6dm9pZCAwIT09ZCYmKGdbYl09ZCkpO3JldHVybiBnfSxuLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisobStNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0sbm9vcDpmdW5jdGlvbigpe30saXNGdW5jdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4iZnVuY3Rpb24iPT09bi50eXBlKGEpfSxpc0FycmF5OkFycmF5LmlzQXJyYXksaXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3ZhciBiPWEmJmEudG9TdHJpbmcoKTtyZXR1cm4hbi5pc0FycmF5KGEpJiZiLXBhcnNlRmxvYXQoYikrMT49MH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtyZXR1cm4ib2JqZWN0IiE9PW4udHlwZShhKXx8YS5ub2RlVHlwZXx8bi5pc1dpbmRvdyhhKT8hMTphLmNvbnN0cnVjdG9yJiYhay5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIik/ITE6ITB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aVtqLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihhKXt2YXIgYixjPWV2YWw7YT1uLnRyaW0oYSksYSYmKDE9PT1hLmluZGV4T2YoInVzZSBzdHJpY3QiKT8oYj1kLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGIudGV4dD1hLGQuaGVhZC5hcHBlbmRDaGlsZChiKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpKTpjKGEpKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTA7aWYocyhhKSl7Zm9yKGM9YS5sZW5ndGg7Yz5kO2QrKylpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoZCBpbiBhKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zy5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsPT1iPy0xOmguY2FsbChiLGEsYyl9LG1lcmdlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPStiLmxlbmd0aCxkPTAsZT1hLmxlbmd0aDtjPmQ7ZCsrKWFbZSsrXT1iW2RdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGc9MCxoPVtdO2lmKHMoYSkpZm9yKGQ9YS5sZW5ndGg7ZD5nO2crKyllPWIoYVtnXSxnLGMpLG51bGwhPWUmJmgucHVzaChlKTtlbHNlIGZvcihnIGluIGEpZT1iKGFbZ10sZyxjKSxudWxsIT1lJiZoLnB1c2goZSk7cmV0dXJuIGYuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihjPWFbYl0sYj1hLGE9Yyksbi5pc0Z1bmN0aW9uKGEpPyhkPWUuY2FsbChhcmd1bWVudHMsMiksZj1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsZC5jb25jYXQoZS5jYWxsKGFyZ3VtZW50cykpKX0sZi5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGYpOnZvaWQgMH0sbm93OkRhdGUubm93LHN1cHBvcnQ6bH0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihuLmZuW1N5bWJvbC5pdGVyYXRvcl09Y1tTeW1ib2wuaXRlcmF0b3JdKSxuLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7aVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBzKGEpe3ZhciBiPSEhYSYmImxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPW4udHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iPT09Y3x8bi5pc1dpbmRvdyhhKT8hMToiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgdD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PSJzaXp6bGUiKzEqbmV3IERhdGUsdj1hLmRvY3VtZW50LHc9MCx4PTAseT1nYSgpLHo9Z2EoKSxBPWdhKCksQj1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09YiYmKGw9ITApLDB9LEM9MTw8MzEsRD17fS5oYXNPd25Qcm9wZXJ0eSxFPVtdLEY9RS5wb3AsRz1FLnB1c2gsSD1FLnB1c2gsST1FLnNsaWNlLEo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LEs9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixMPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixNPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTj0iXFxbIitMKyIqKCIrTSsiKSg/OiIrTCsiKihbKl4kfCF+XT89KSIrTCsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK00rIikpfCkiK0wrIipcXF0iLE89IjooIitNKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitOKyIpKil8LiopXFwpfCkiLFA9bmV3IFJlZ0V4cChMKyIrIiwiZyIpLFE9bmV3IFJlZ0V4cCgiXiIrTCsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitMKyIrJCIsImciKSxSPW5ldyBSZWdFeHAoIl4iK0wrIiosIitMKyIqIiksUz1uZXcgUmVnRXhwKCJeIitMKyIqKFs+K35dfCIrTCsiKSIrTCsiKiIpLFQ9bmV3IFJlZ0V4cCgiPSIrTCsiKihbXlxcXSdcIl0qPykiK0wrIipcXF0iLCJnIiksVT1uZXcgUmVnRXhwKE8pLFY9bmV3IFJlZ0V4cCgiXiIrTSsiJCIpLFc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrTSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitNKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitNKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrTiksUFNFVURPOm5ldyBSZWdFeHAoIl4iK08pLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTCsiKig/OihbKy1dfCkiK0wrIiooXFxkKyl8KSkiK0wrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0srIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitMKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0wrIiooKD86LVxcZCk/XFxkKikiK0wrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFg9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxZPS9eaFxkJC9pLFo9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLCQ9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxfPS9bK35dLyxhYT0vJ3xcXC9nLGJhPW5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIrTCsiP3woIitMKyIpfC4pIiwiaWciKSxjYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9IjB4IitiLTY1NTM2O3JldHVybiBkIT09ZHx8Yz9iOjA+ZD9TdHJpbmcuZnJvbUNoYXJDb2RlKGQrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUoZD4+MTB8NTUyOTYsMTAyMyZkfDU2MzIwKX0sZGE9ZnVuY3Rpb24oKXttKCl9O3RyeXtILmFwcGx5KEU9SS5jYWxsKHYuY2hpbGROb2Rlcyksdi5jaGlsZE5vZGVzKSxFW3YuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGVhKXtIPXthcHBseTpFLmxlbmd0aD9mdW5jdGlvbihhLGIpe0cuYXBwbHkoYSxJLmNhbGwoYikpfTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGQ9MDt3aGlsZShhW2MrK109YltkKytdKTthLmxlbmd0aD1jLTF9fX1mdW5jdGlvbiBmYShhLGIsZCxlKXt2YXIgZixoLGosayxsLG8scixzLHc9YiYmYi5vd25lckRvY3VtZW50LHg9Yj9iLm5vZGVUeXBlOjk7aWYoZD1kfHxbXSwic3RyaW5nIiE9dHlwZW9mIGF8fCFhfHwxIT09eCYmOSE9PXgmJjExIT09eClyZXR1cm4gZDtpZighZSYmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLHApKXtpZigxMSE9PXgmJihvPSQuZXhlYyhhKSkpaWYoZj1vWzFdKXtpZig5PT09eCl7aWYoIShqPWIuZ2V0RWxlbWVudEJ5SWQoZikpKXJldHVybiBkO2lmKGouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNlIGlmKHcmJihqPXcuZ2V0RWxlbWVudEJ5SWQoZikpJiZ0KGIsaikmJmouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNle2lmKG9bMl0pcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChmPW9bM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gSC5hcHBseShkLGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmKSksZH1pZihjLnFzYSYmIUFbYSsiICJdJiYoIXF8fCFxLnRlc3QoYSkpKXtpZigxIT09eCl3PWIscz1hO2Vsc2UgaWYoIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpeyhrPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9rPWsucmVwbGFjZShhYSwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIsaz11KSxyPWcoYSksaD1yLmxlbmd0aCxsPVYudGVzdChrKT8iIyIrazoiW2lkPSciK2srIiddIjt3aGlsZShoLS0pcltoXT1sKyIgIitxYShyW2hdKTtzPXIuam9pbigiLCIpLHc9Xy50ZXN0KGEpJiZvYShiLnBhcmVudE5vZGUpfHxifWlmKHMpdHJ5e3JldHVybiBILmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHMpKSxkfWNhdGNoKHkpe31maW5hbGx5e2s9PT11JiZiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShRLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBnYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaGEoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBpYShhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWEoYil9Y2F0Y2goYyl7cmV0dXJuITF9ZmluYWxseXtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGx9fWZ1bmN0aW9uIGphKGEsYil7dmFyIGM9YS5zcGxpdCgifCIpLGU9Yy5sZW5ndGg7d2hpbGUoZS0tKWQuYXR0ckhhbmRsZVtjW2VdXT1ifWZ1bmN0aW9uIGthKGEsYil7dmFyIGM9YiYmYSxkPWMmJjE9PT1hLm5vZGVUeXBlJiYxPT09Yi5ub2RlVHlwZSYmKH5iLnNvdXJjZUluZGV4fHxDKS0ofmEuc291cmNlSW5kZXh8fEMpO2lmKGQpcmV0dXJuIGQ7aWYoYyl3aGlsZShjPWMubmV4dFNpYmxpbmcpaWYoYz09PWIpcmV0dXJuLTE7cmV0dXJuIGE/MTotMX1mdW5jdGlvbiBsYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1jJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBtYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09Y3x8ImJ1dHRvbiI9PT1jKSYmYi50eXBlPT09YX19ZnVuY3Rpb24gbmEoYSl7cmV0dXJuIGhhKGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLGhhKGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKFtdLGMubGVuZ3RoLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWNbZT1mW2ddXSYmKGNbZV09IShkW2VdPWNbZV0pKX0pfSl9ZnVuY3Rpb24gb2EoYSl7cmV0dXJuIGEmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmYX1jPWZhLnN1cHBvcnQ9e30sZj1mYS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGI/IkhUTUwiIT09Yi5ub2RlTmFtZTohMX0sbT1mYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89bi5kb2N1bWVudEVsZW1lbnQscD0hZihuKSwoZT1uLmRlZmF1bHRWaWV3KSYmZS50b3AhPT1lJiYoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixkYSwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib251bmxvYWQiLGRhKSksYy5hdHRyaWJ1dGVzPWlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmNsYXNzTmFtZT0iaSIsIWEuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLGMuZ2V0RWxlbWVudHNCeVRhZ05hbWU9aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQobi5jcmVhdGVDb21tZW50KCIiKSksIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxjLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9Wi50ZXN0KG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksYy5nZXRCeUlkPWlhKGZ1bmN0aW9uKGEpe3JldHVybiBvLmFwcGVuZENoaWxkKGEpLmlkPXUsIW4uZ2V0RWxlbWVudHNCeU5hbWV8fCFuLmdldEVsZW1lbnRzQnlOYW1lKHUpLmxlbmd0aH0pLGMuZ2V0QnlJZD8oZC5maW5kLklEPWZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRCeUlkJiZwKXt2YXIgYz1iLmdldEVsZW1lbnRCeUlkKGEpO3JldHVybiBjP1tjXTpbXX19LGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9fSk6KGRlbGV0ZSBkLmZpbmQuSUQsZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGJhLGNhKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSksZC5maW5kLlRBRz1jLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGEsYil7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk6Yy5xc2E/Yi5xdWVyeVNlbGVjdG9yQWxsKGEpOnZvaWQgMH06ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9MCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk7aWYoIioiPT09YSl7d2hpbGUoYz1mW2UrK10pMT09PWMubm9kZVR5cGUmJmQucHVzaChjKTtyZXR1cm4gZH1yZXR1cm4gZn0sZC5maW5kLkNMQVNTPWMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oYSxiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmcD9iLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYSk6dm9pZCAwfSxyPVtdLHE9W10sKGMucXNhPVoudGVzdChuLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGlhKGZ1bmN0aW9uKGEpe28uYXBwZW5kQ2hpbGQoYSkuaW5uZXJIVE1MPSI8YSBpZD0nIit1KyInPjwvYT48c2VsZWN0IGlkPSciK3UrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK0wrIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK0wrIiooPzp2YWx1ZXwiK0srIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit1KyItXSIpLmxlbmd0aHx8cS5wdXNoKCJ+PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHEucHVzaCgiOmNoZWNrZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit1KyIrKiIpLmxlbmd0aHx8cS5wdXNoKCIuIy4rWyt+XSIpfSksaWEoZnVuY3Rpb24oYSl7dmFyIGI9bi5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmcS5wdXNoKCJuYW1lIitMKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fHEucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxxLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9Wi50ZXN0KHM9by5tYXRjaGVzfHxvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8by5tb3pNYXRjaGVzU2VsZWN0b3J8fG8ub01hdGNoZXNTZWxlY3Rvcnx8by5tc01hdGNoZXNTZWxlY3RvcikpJiZpYShmdW5jdGlvbihhKXtjLmRpc2Nvbm5lY3RlZE1hdGNoPXMuY2FsbChhLCJkaXYiKSxzLmNhbGwoYSwiW3MhPScnXTp4Iiksci5wdXNoKCIhPSIsTyl9KSxxPXEubGVuZ3RoJiZuZXcgUmVnRXhwKHEuam9pbigifCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbigifCIpKSxiPVoudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fFoudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PW58fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09bnx8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9KKGssYSktSihrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGU9YS5wYXJlbnROb2RlLGY9Yi5wYXJlbnROb2RlLGc9W2FdLGg9W2JdO2lmKCFlfHwhZilyZXR1cm4gYT09PW4/LTE6Yj09PW4/MTplPy0xOmY/MTprP0ooayxhKS1KKGssYik6MDtpZihlPT09ZilyZXR1cm4ga2EoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpZy51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSloLnVuc2hpZnQoYyk7d2hpbGUoZ1tkXT09PWhbZF0pZCsrO3JldHVybiBkP2thKGdbZF0saFtkXSk6Z1tkXT09PXY/LTE6aFtkXT09PXY/MTowfSxuKTpufSxmYS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGZhKGEsbnVsbCxudWxsLGIpfSxmYS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksYj1iLnJlcGxhY2UoVCwiPSckMSddIiksYy5tYXRjaGVzU2VsZWN0b3ImJnAmJiFBW2IrIiAiXSYmKCFyfHwhci50ZXN0KGIpKSYmKCFxfHwhcS50ZXN0KGIpKSl0cnl7dmFyIGQ9cy5jYWxsKGEsYik7aWYoZHx8Yy5kaXNjb25uZWN0ZWRNYXRjaHx8YS5kb2N1bWVudCYmMTEhPT1hLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiBkfWNhdGNoKGUpe31yZXR1cm4gZmEoYixuLG51bGwsW2FdKS5sZW5ndGg+MH0sZmEuY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksdChhLGIpfSxmYS5hdHRyPWZ1bmN0aW9uKGEsYil7KGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpO3ZhciBlPWQuYXR0ckhhbmRsZVtiLnRvTG93ZXJDYXNlKCldLGY9ZSYmRC5jYWxsKGQuYXR0ckhhbmRsZSxiLnRvTG93ZXJDYXNlKCkpP2UoYSxiLCFwKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PWY/ZjpjLmF0dHJpYnV0ZXN8fCFwP2EuZ2V0QXR0cmlidXRlKGIpOihmPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmYuc3BlY2lmaWVkP2YudmFsdWU6bnVsbH0sZmEuZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfSxmYS51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe3ZhciBiLGQ9W10sZT0wLGY9MDtpZihsPSFjLmRldGVjdER1cGxpY2F0ZXMsaz0hYy5zb3J0U3RhYmxlJiZhLnNsaWNlKDApLGEuc29ydChCKSxsKXt3aGlsZShiPWFbZisrXSliPT09YVtmXSYmKGU9ZC5wdXNoKGYpKTt3aGlsZShlLS0pYS5zcGxpY2UoZFtlXSwxKX1yZXR1cm4gaz1udWxsLGF9LGU9ZmEuZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYixjPSIiLGQ9MCxmPWEubm9kZVR5cGU7aWYoZil7aWYoMT09PWZ8fDk9PT1mfHwxMT09PWYpe2lmKCJzdHJpbmciPT10eXBlb2YgYS50ZXh0Q29udGVudClyZXR1cm4gYS50ZXh0Q29udGVudDtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpYys9ZShhKX1lbHNlIGlmKDM9PT1mfHw0PT09ZilyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSB3aGlsZShiPWFbZCsrXSljKz1lKGIpO3JldHVybiBjfSxkPWZhLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmhhLG1hdGNoOlcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0ucmVwbGFjZShiYSxjYSksYVszXT0oYVszXXx8YVs0XXx8YVs1XXx8IiIpLnJlcGxhY2UoYmEsY2EpLCJ+PSI9PT1hWzJdJiYoYVszXT0iICIrYVszXSsiICIpLGEuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09YVsxXS5zbGljZSgwLDMpPyhhWzNdfHxmYS5lcnJvcihhWzBdKSxhWzRdPSsoYVs0XT9hWzVdKyhhWzZdfHwxKToyKigiZXZlbiI9PT1hWzNdfHwib2RkIj09PWFbM10pKSxhWzVdPSsoYVs3XSthWzhdfHwib2RkIj09PWFbM10pKTphWzNdJiZmYS5lcnJvcihhWzBdKSxhfSxQU0VVRE86ZnVuY3Rpb24oYSl7dmFyIGIsYz0hYVs2XSYmYVsyXTtyZXR1cm4gVy5DSElMRC50ZXN0KGFbMF0pP251bGw6KGFbM10/YVsyXT1hWzRdfHxhWzVdfHwiIjpjJiZVLnRlc3QoYykmJihiPWcoYywhMCkpJiYoYj1jLmluZGV4T2YoIikiLGMubGVuZ3RoLWIpLWMubGVuZ3RoKSYmKGFbMF09YVswXS5zbGljZSgwLGIpLGFbMl09Yy5zbGljZSgwLGIpKSxhLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGJhLGNhKS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWE/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9fSxDTEFTUzpmdW5jdGlvbihhKXt2YXIgYj15W2ErIiAiXTtyZXR1cm4gYnx8KGI9bmV3IFJlZ0V4cCgiKF58IitMKyIpIithKyIoIitMKyJ8JCkiKSkmJnkoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi50ZXN0KCJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWUmJmEuY2xhc3NOYW1lfHwidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXt2YXIgZT1mYS5hdHRyKGQsYSk7cmV0dXJuIG51bGw9PWU/IiE9Ij09PWI6Yj8oZSs9IiIsIj0iPT09Yj9lPT09YzoiIT0iPT09Yj9lIT09YzoiXj0iPT09Yj9jJiYwPT09ZS5pbmRleE9mKGMpOiIqPSI9PT1iP2MmJmUuaW5kZXhPZihjKT4tMToiJD0iPT09Yj9jJiZlLnNsaWNlKC1jLmxlbmd0aCk9PT1jOiJ+PSI9PT1iPygiICIrZS5yZXBsYWNlKFAsIiAiKSsiICIpLmluZGV4T2YoYyk+LTE6Inw9Ij09PWI/ZT09PWN8fGUuc2xpY2UoMCxjLmxlbmd0aCsxKT09PWMrIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9Im50aCIhPT1hLnNsaWNlKDAsMyksZz0ibGFzdCIhPT1hLnNsaWNlKC00KSxoPSJvZi10eXBlIj09PWI7cmV0dXJuIDE9PT1kJiYwPT09ZT9mdW5jdGlvbihhKXtyZXR1cm4hIWEucGFyZW50Tm9kZX06ZnVuY3Rpb24oYixjLGkpe3ZhciBqLGssbCxtLG4sbyxwPWYhPT1nPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIscT1iLnBhcmVudE5vZGUscj1oJiZiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkscz0haSYmIWgsdD0hMTtpZihxKXtpZihmKXt3aGlsZShwKXttPWI7d2hpbGUobT1tW3BdKWlmKGg/bS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bS5ub2RlVHlwZSlyZXR1cm4hMTtvPXA9Im9ubHkiPT09YSYmIW8mJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYobz1bZz9xLmZpcnN0Q2hpbGQ6cS5sYXN0Q2hpbGRdLGcmJnMpe209cSxsPW1bdV18fChtW3VdPXt9KSxrPWxbbS51bmlxdWVJRF18fChsW20udW5pcXVlSURdPXt9KSxqPWtbYV18fFtdLG49alswXT09PXcmJmpbMV0sdD1uJiZqWzJdLG09biYmcS5jaGlsZE5vZGVzW25dO3doaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKDE9PT1tLm5vZGVUeXBlJiYrK3QmJm09PT1iKXtrW2FdPVt3LG4sdF07YnJlYWt9fWVsc2UgaWYocyYmKG09YixsPW1bdV18fChtW3VdPXt9KSxrPWxbbS51bmlxdWVJRF18fChsW20udW5pcXVlSURdPXt9KSxqPWtbYV18fFtdLG49alswXT09PXcmJmpbMV0sdD1uKSx0PT09ITEpd2hpbGUobT0rK24mJm0mJm1bcF18fCh0PW49MCl8fG8ucG9wKCkpaWYoKGg/bS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bS5ub2RlVHlwZSkmJisrdCYmKHMmJihsPW1bdV18fChtW3VdPXt9KSxrPWxbbS51bmlxdWVJRF18fChsW20udW5pcXVlSURdPXt9KSxrW2FdPVt3LHRdKSxtPT09YikpYnJlYWs7cmV0dXJuIHQtPWUsdD09PWR8fHQlZD09PTAmJnQvZD49MH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQucHNldWRvc1thXXx8ZC5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGZhLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGVbdV0/ZShiKTplLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/aGEoZnVuY3Rpb24oYSxjKXt2YXIgZCxmPWUoYSxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSlkPUooYSxmW2ddKSxhW2RdPSEoY1tkXT1mW2ddKX0pOmZ1bmN0aW9uKGEpe3JldHVybiBlKGEsMCxjKX0pOmV9fSxwc2V1ZG9zOntub3Q6aGEoZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxkPWgoYS5yZXBsYWNlKFEsIiQxIikpO3JldHVybiBkW3VdP2hhKGZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmLGc9ZChhLG51bGwsZSxbXSksaD1hLmxlbmd0aDt3aGlsZShoLS0pKGY9Z1toXSkmJihhW2hdPSEoYltoXT1mKSl9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLGJbMF09bnVsbCwhYy5wb3AoKX19KSxoYXM6aGEoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBmYShhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShiYSxjYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aGEoZnVuY3Rpb24oYSl7cmV0dXJuIFYudGVzdChhfHwiIil8fGZhLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKGJhLGNhKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGIpe3ZhciBjO2RvIGlmKGM9cD9iLmxhbmc6Yi5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGIuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIGM9Yy50b0xvd2VyQ2FzZSgpLGM9PT1hfHwwPT09Yy5pbmRleE9mKGErIi0iKTt3aGlsZSgoYj1iLnBhcmVudE5vZGUpJiYxPT09Yi5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEubG9jYXRpb24mJmEubG9jYXRpb24uaGFzaDtyZXR1cm4gYyYmYy5zbGljZSgxKT09PWIuaWR9LHJvb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1vfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW4uYWN0aXZlRWxlbWVudCYmKCFuLmhhc0ZvY3VzfHxuLmhhc0ZvY3VzKCkpJiYhIShhLnR5cGV8fGEuaHJlZnx8fmEudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYhIWEuY2hlY2tlZHx8Im9wdGlvbiI9PT1iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWlmKGEubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gWS50ZXN0KGEubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gWC50ZXN0KGEubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWEudHlwZSYmKG51bGw9PShiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1iLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpuYShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6bmEoZnVuY3Rpb24oYSxiKXtyZXR1cm5bYi0xXX0pLGVxOm5hKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5bMD5jP2MrYjpjXX0pLGV2ZW46bmEoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxvZGQ6bmEoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxsdDpuYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0Om5hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGQucHNldWRvcy5udGg9ZC5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWQucHNldWRvc1tiXT1sYShiKTtmb3IoYiBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWQucHNldWRvc1tiXT1tYShiKTtmdW5jdGlvbiBwYSgpe31wYS5wcm90b3R5cGU9ZC5maWx0ZXJzPWQucHNldWRvcyxkLnNldEZpbHRlcnM9bmV3IHBhLGc9ZmEudG9rZW5pemU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXpbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1SLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9Uy5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShRLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9V1tnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2ZhLmVycm9yKGEpOnooYSxpKS5zbGljZSgwKX07ZnVuY3Rpb24gcWEoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aCxkPSIiO2M+YjtiKyspZCs9YVtiXS52YWx1ZTtyZXR1cm4gZH1mdW5jdGlvbiByYShhLGIsYyl7dmFyIGQ9Yi5kaXIsZT1jJiYicGFyZW50Tm9kZSI9PT1kLGY9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxmKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpcmV0dXJuIGEoYixjLGYpfTpmdW5jdGlvbihiLGMsZyl7dmFyIGgsaSxqLGs9W3csZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihqPWJbdV18fChiW3VdPXt9KSxpPWpbYi51bmlxdWVJRF18fChqW2IudW5pcXVlSURdPXt9KSwoaD1pW2RdKSYmaFswXT09PXcmJmhbMV09PT1mKXJldHVybiBrWzJdPWhbMl07aWYoaVtkXT1rLGtbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiBzYShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB0YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWZhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB1YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHZhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXZhKGQpKSxlJiYhZVt1XSYmKGU9dmEoZSxmKSksaGEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dGEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6dWEocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXVhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9KKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj11YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SC5hcHBseShnLHIpfSl9ZnVuY3Rpb24gd2EoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1yYShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9cmEoZnVuY3Rpb24oYSl7cmV0dXJuIEooYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2Y+aTtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bcmEoc2EobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHZhKGk+MSYmc2EobSksaT4xJiZxYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFEsIiQxIiksYyxlPmkmJndhKGEuc2xpY2UoaSxlKSksZj5lJiZ3YShhPWEuc2xpY2UoZSkpLGY+ZSYmcWEoYSkpfW0ucHVzaChjKX1yZXR1cm4gc2EobSl9ZnVuY3Rpb24geGEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbyxxLHI9MCxzPSIwIix0PWYmJltdLHU9W10sdj1qLHg9Znx8ZSYmZC5maW5kLlRBRygiKiIsaykseT13Kz1udWxsPT12PzE6TWF0aC5yYW5kb20oKXx8LjEsej14Lmxlbmd0aDtmb3IoayYmKGo9Zz09PW58fGd8fGspO3MhPT16JiZudWxsIT0obD14W3NdKTtzKyspe2lmKGUmJmwpe289MCxnfHxsLm93bmVyRG9jdW1lbnQ9PT1ufHwobShsKSxoPSFwKTt3aGlsZShxPWFbbysrXSlpZihxKGwsZ3x8bixoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXkpfWMmJigobD0hcSYmbCkmJnItLSxmJiZ0LnB1c2gobCkpfWlmKHIrPXMsYyYmcyE9PXIpe289MDt3aGlsZShxPWJbbysrXSlxKHQsdSxnLGgpO2lmKGYpe2lmKHI+MCl3aGlsZShzLS0pdFtzXXx8dVtzXXx8KHVbc109Ri5jYWxsKGkpKTt1PXVhKHUpfUguYXBwbHkoaSx1KSxrJiYhZiYmdS5sZW5ndGg+MCYmcitiLmxlbmd0aD4xJiZmYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz15LGo9diksdH07cmV0dXJuIGM/aGEoZik6Zn1yZXR1cm4gaD1mYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9d2EoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHhhKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1mYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGUsZil7dmFyIGksaixrLGwsbSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG89IWYmJmcoYT1uLnNlbGVjdG9yfHxhKTtpZihlPWV8fFtdLDE9PT1vLmxlbmd0aCl7aWYoaj1vWzBdPW9bMF0uc2xpY2UoMCksai5sZW5ndGg+MiYmIklEIj09PShrPWpbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJnAmJmQucmVsYXRpdmVbalsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGsubWF0Y2hlc1swXS5yZXBsYWNlKGJhLGNhKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO24mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGouc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9Vy5uZWVkc0NvbnRleHQudGVzdChhKT8wOmoubGVuZ3RoO3doaWxlKGktLSl7aWYoaz1qW2ldLGQucmVsYXRpdmVbbD1rLnR5cGVdKWJyZWFrO2lmKChtPWQuZmluZFtsXSkmJihmPW0oay5tYXRjaGVzWzBdLnJlcGxhY2UoYmEsY2EpLF8udGVzdChqWzBdLnR5cGUpJiZvYShiLnBhcmVudE5vZGUpfHxiKSkpe2lmKGouc3BsaWNlKGksMSksYT1mLmxlbmd0aCYmcWEoaiksIWEpcmV0dXJuIEguYXBwbHkoZSxmKSxlO2JyZWFrfX19cmV0dXJuKG58fGgoYSxvKSkoZixiLCFwLGUsIWJ8fF8udGVzdChhKSYmb2EoYi5wYXJlbnROb2RlKXx8YiksZX0sYy5zb3J0U3RhYmxlPXUuc3BsaXQoIiIpLnNvcnQoQikuam9pbigiIik9PT11LGMuZGV0ZWN0RHVwbGljYXRlcz0hIWwsbSgpLGMuc29ydERldGFjaGVkPWlhKGZ1bmN0aW9uKGEpe3JldHVybiAxJmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24obi5jcmVhdGVFbGVtZW50KCJkaXYiKSl9KSxpYShmdW5jdGlvbihhKXtyZXR1cm4gYS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxqYSgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphLmdldEF0dHJpYnV0ZShiLCJ0eXBlIj09PWIudG9Mb3dlckNhc2UoKT8xOjIpfSksYy5hdHRyaWJ1dGVzJiZpYShmdW5jdGlvbihhKXtyZXR1cm4gYS5pbm5lckhUTUw9IjxpbnB1dC8+IixhLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxqYSgidmFsdWUiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY3x8ImlucHV0IiE9PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT92b2lkIDA6YS5kZWZhdWx0VmFsdWV9KSxpYShmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8amEoSyxmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOmFbYl09PT0hMD9iLnRvTG93ZXJDYXNlKCk6KGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZC5zcGVjaWZpZWQ/ZC52YWx1ZTpudWxsfSksZmF9KGEpO24uZmluZD10LG4uZXhwcj10LnNlbGVjdG9ycyxuLmV4cHJbIjoiXT1uLmV4cHIucHNldWRvcyxuLnVuaXF1ZVNvcnQ9bi51bmlxdWU9dC51bmlxdWVTb3J0LG4udGV4dD10LmdldFRleHQsbi5pc1hNTERvYz10LmlzWE1MLG4uY29udGFpbnM9dC5jb250YWluczt2YXIgdT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT12b2lkIDAhPT1jO3doaWxlKChhPWFbYl0pJiY5IT09YS5ub2RlVHlwZSlpZigxPT09YS5ub2RlVHlwZSl7aWYoZSYmbihhKS5pcyhjKSlicmVhaztkLnB1c2goYSl9cmV0dXJuIGR9LHY9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9LHc9bi5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx4PS9ePChbXHctXSspXHMqXC8/Pig/OjxcL1wxPnwpJC8seT0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHooYSxiLGMpe2lmKG4uaXNGdW5jdGlvbihiKSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYoeS50ZXN0KGIpKXJldHVybiBuLmZpbHRlcihiLGEsYyk7Yj1uLmZpbHRlcihiLGEpfXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gaC5jYWxsKGIsYSk+LTEhPT1jfSl9bi5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bi5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTpuLmZpbmQubWF0Y2hlcyhhLG4uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbi5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz10aGlzLmxlbmd0aCxkPVtdLGU9dGhpcztpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG4oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtjPmI7YisrKWlmKG4uY29udGFpbnMoZVtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2M+YjtiKyspbi5maW5kKGEsZVtiXSxkKTtyZXR1cm4gZD10aGlzLnB1c2hTdGFjayhjPjE/bi51bmlxdWUoZCk6ZCksZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxkfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHoodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHoodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXoodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJncudGVzdChhKT9uKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIEEsQj0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEM9bi5mbi5pbml0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZSxmO2lmKCFhKXJldHVybiB0aGlzO2lmKGM9Y3x8QSwic3RyaW5nIj09dHlwZW9mIGEpe2lmKGU9IjwiPT09YVswXSYmIj4iPT09YVthLmxlbmd0aC0xXSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTpCLmV4ZWMoYSksIWV8fCFlWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8YykuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoZVsxXSl7aWYoYj1iIGluc3RhbmNlb2Ygbj9iWzBdOmIsbi5tZXJnZSh0aGlzLG4ucGFyc2VIVE1MKGVbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6ZCwhMCkpLHgudGVzdChlWzFdKSYmbi5pc1BsYWluT2JqZWN0KGIpKWZvcihlIGluIGIpbi5pc0Z1bmN0aW9uKHRoaXNbZV0pP3RoaXNbZV0oYltlXSk6dGhpcy5hdHRyKGUsYltlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGY9ZC5nZXRFbGVtZW50QnlJZChlWzJdKSxmJiZmLnBhcmVudE5vZGUmJih0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZiksdGhpcy5jb250ZXh0PWQsdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTpuLmlzRnVuY3Rpb24oYSk/dm9pZCAwIT09Yy5yZWFkeT9jLnJlYWR5KGEpOmEobik6KHZvaWQgMCE9PWEuc2VsZWN0b3ImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCksbi5tYWtlQXJyYXkoYSx0aGlzKSl9O0MucHJvdG90eXBlPW4uZm4sQT1uKGQpO3ZhciBEPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEU9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07bi5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYj1uKGEsdGhpcyksYz1iLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MDtjPmE7YSsrKWlmKG4uY29udGFpbnModGhpcyxiW2FdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9MCxlPXRoaXMubGVuZ3RoLGY9W10sZz13LnRlc3QoYSl8fCJzdHJpbmciIT10eXBlb2YgYT9uKGEsYnx8dGhpcy5jb250ZXh0KTowO2U+ZDtkKyspZm9yKGM9dGhpc1tkXTtjJiZjIT09YjtjPWMucGFyZW50Tm9kZSlpZihjLm5vZGVUeXBlPDExJiYoZz9nLmluZGV4KGMpPi0xOjE9PT1jLm5vZGVUeXBlJiZuLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGMsYSkpKXtmLnB1c2goYyk7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYubGVuZ3RoPjE/bi51bmlxdWVTb3J0KGYpOmYpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT8ic3RyaW5nIj09dHlwZW9mIGE/aC5jYWxsKG4oYSksdGhpc1swXSk6aC5jYWxsKHRoaXMsYS5qcXVlcnk/YVswXTphKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnB1c2hTdGFjayhuLnVuaXF1ZVNvcnQobi5tZXJnZSh0aGlzLmdldCgpLG4oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRihhLGIpe3doaWxlKChhPWFbYl0pJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiB1KGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdShhLCJwYXJlbnROb2RlIixjKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gRihhLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBGKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiB1KGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHUoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHUoYSwibmV4dFNpYmxpbmciLGMpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB1KGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiB2KChhLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gdihhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYS5jb250ZW50RG9jdW1lbnR8fG4ubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPW4ubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9bi5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKEVbYV18fG4udW5pcXVlU29ydChlKSxELnRlc3QoYSkmJmUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgRz0vXFMrL2c7ZnVuY3Rpb24gSChhKXt2YXIgYj17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRyl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/SChhKTpuLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmPVtdLGc9W10saD0tMSxpPWZ1bmN0aW9uKCl7Zm9yKGU9YS5vbmNlLGQ9Yj0hMDtnLmxlbmd0aDtoPS0xKXtjPWcuc2hpZnQoKTt3aGlsZSgrK2g8Zi5sZW5ndGgpZltoXS5hcHBseShjWzBdLGNbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2UmJihoPWYubGVuZ3RoLGM9ITEpfWEubWVtb3J5fHwoYz0hMSksYj0hMSxlJiYoZj1jP1tdOiIiKX0saj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIGYmJihjJiYhYiYmKGg9Zi5sZW5ndGgtMSxnLnB1c2goYykpLGZ1bmN0aW9uIGQoYil7bi5lYWNoKGIsZnVuY3Rpb24oYixjKXtuLmlzRnVuY3Rpb24oYyk/YS51bmlxdWUmJmouaGFzKGMpfHxmLnB1c2goYyk6YyYmYy5sZW5ndGgmJiJzdHJpbmciIT09bi50eXBlKGMpJiZkKGMpfSl9KGFyZ3VtZW50cyksYyYmIWImJmkoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIG4uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxiKXt2YXIgYzt3aGlsZSgoYz1uLmluQXJyYXkoYixmLGMpKT4tMSlmLnNwbGljZShjLDEpLGg+PWMmJmgtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9uLmluQXJyYXkoYSxmKT4tMTpmLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBmJiYoZj1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBlPWc9W10sZj1jPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWZ9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZT1nPVtdLGN8fChmPWM9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhZX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZXx8KGM9Y3x8W10sYz1bYSxjLnNsaWNlP2Muc2xpY2UoKTpjXSxnLnB1c2goYyksYnx8aSgpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGouZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFkfX07cmV0dXJuIGp9LG4uZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1bWyJyZXNvbHZlIiwiZG9uZSIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixuLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVqZWN0ZWQiXSxbIm5vdGlmeSIsInByb2dyZXNzIixuLkNhbGxiYWNrcygibWVtb3J5IildXSxjPSJwZW5kaW5nIixkPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7cmV0dXJuIG4uRGVmZXJyZWQoZnVuY3Rpb24oYyl7bi5lYWNoKGIsZnVuY3Rpb24oYixmKXt2YXIgZz1uLmlzRnVuY3Rpb24oYVtiXSkmJmFbYl07ZVtmWzFdXShmdW5jdGlvbigpe3ZhciBhPWcmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2EucHJvbWlzZSgpLnByb2dyZXNzKGMubm90aWZ5KS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCk6Y1tmWzBdKyJXaXRoIl0odGhpcz09PWQ/Yy5wcm9taXNlKCk6dGhpcyxnP1thXTphcmd1bWVudHMpfSl9KSxhPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/bi5leHRlbmQoYSxkKTpkfX0sZT17fTtyZXR1cm4gZC5waXBlPWQudGhlbixuLmVhY2goYixmdW5jdGlvbihhLGYpe3ZhciBnPWZbMl0saD1mWzNdO2RbZlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtjPWh9LGJbMV5hXVsyXS5kaXNhYmxlLGJbMl1bMl0ubG9jayksZVtmWzBdXT1mdW5jdGlvbigpe3JldHVybiBlW2ZbMF0rIldpdGgiXSh0aGlzPT09ZT9kOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWUuY2FsbChhcmd1bWVudHMpLGQ9Yy5sZW5ndGgsZj0xIT09ZHx8YSYmbi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZDowLGc9MT09PWY/YTpuLkRlZmVycmVkKCksaD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9lLmNhbGwoYXJndW1lbnRzKTpkLGM9PT1pP2cubm90aWZ5V2l0aChiLGMpOi0tZnx8Zy5yZXNvbHZlV2l0aChiLGMpfX0saSxqLGs7aWYoZD4xKWZvcihpPW5ldyBBcnJheShkKSxqPW5ldyBBcnJheShkKSxrPW5ldyBBcnJheShkKTtkPmI7YisrKWNbYl0mJm4uaXNGdW5jdGlvbihjW2JdLnByb21pc2UpP2NbYl0ucHJvbWlzZSgpLnByb2dyZXNzKGgoYixqLGkpKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KTotLWY7cmV0dXJuIGZ8fGcucmVzb2x2ZVdpdGgoayxjKSxnLnByb21pc2UoKX19KTt2YXIgSTtuLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBuLnJlYWR5LnByb21pc2UoKS5kb25lKGEpLHRoaXN9LG4uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP24ucmVhZHlXYWl0Kys6bi5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpeyhhPT09ITA/LS1uLnJlYWR5V2FpdDpuLmlzUmVhZHkpfHwobi5pc1JlYWR5PSEwLGEhPT0hMCYmLS1uLnJlYWR5V2FpdD4wfHwoSS5yZXNvbHZlV2l0aChkLFtuXSksbi5mbi50cmlnZ2VySGFuZGxlciYmKG4oZCkudHJpZ2dlckhhbmRsZXIoInJlYWR5IiksbihkKS5vZmYoInJlYWR5IikpKSl9fSk7ZnVuY3Rpb24gSigpe2QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSiksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixKKSxuLnJlYWR5KCl9bi5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGIpe3JldHVybiBJfHwoST1uLkRlZmVycmVkKCksImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09ZC5yZWFkeVN0YXRlJiYhZC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/YS5zZXRUaW1lb3V0KG4ucmVhZHkpOihkLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEopLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSikpKSxJLnByb21pc2UoYil9LG4ucmVhZHkucHJvbWlzZSgpO3ZhciBLPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1uLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYylLKGEsYixoLGNbaF0sITAsZixnKX1lbHNlIGlmKHZvaWQgMCE9PWQmJihlPSEwLG4uaXNGdW5jdGlvbihkKXx8KGc9ITApLGomJihnPyhiLmNhbGwoYSxkKSxiPW51bGwpOihqPWIsYj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChuKGEpLGMpfSkpLGIpKWZvcig7aT5oO2grKyliKGFbaF0sYyxnP2Q6ZC5jYWxsKGFbaF0saCxiKGFbaF0sYykpKTtyZXR1cm4gZT9hOmo/Yi5jYWxsKGEpOmk/YihhWzBdLGMpOmZ9LEw9ZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfHw5PT09YS5ub2RlVHlwZXx8ISthLm5vZGVUeXBlfTtmdW5jdGlvbiBNKCl7dGhpcy5leHBhbmRvPW4uZXhwYW5kbytNLnVpZCsrfU0udWlkPTEsTS5wcm90b3R5cGU9e3JlZ2lzdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8e307cmV0dXJuIGEubm9kZVR5cGU/YVt0aGlzLmV4cGFuZG9dPWM6T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdGhpcy5leHBhbmRvLHt2YWx1ZTpjLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGFbdGhpcy5leHBhbmRvXX0sY2FjaGU6ZnVuY3Rpb24oYSl7aWYoIUwoYSkpcmV0dXJue307dmFyIGI9YVt0aGlzLmV4cGFuZG9dO3JldHVybiBifHwoYj17fSxMKGEpJiYoYS5ub2RlVHlwZT9hW3RoaXMuZXhwYW5kb109YjpPYmplY3QuZGVmaW5lUHJvcGVydHkoYSx0aGlzLmV4cGFuZG8se3ZhbHVlOmIsY29uZmlndXJhYmxlOiEwfSkpKSxifSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9dGhpcy5jYWNoZShhKTtpZigic3RyaW5nIj09dHlwZW9mIGIpZVtiXT1jO2Vsc2UgZm9yKGQgaW4gYillW2RdPWJbZF07cmV0dXJuIGV9LGdldDpmdW5jdGlvbihhLGIpe3JldHVybiB2b2lkIDA9PT1iP3RoaXMuY2FjaGUoYSk6YVt0aGlzLmV4cGFuZG9dJiZhW3RoaXMuZXhwYW5kb11bYl19LGFjY2VzczpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIHZvaWQgMD09PWJ8fGImJiJzdHJpbmciPT10eXBlb2YgYiYmdm9pZCAwPT09Yz8oZD10aGlzLmdldChhLGIpLHZvaWQgMCE9PWQ/ZDp0aGlzLmdldChhLG4uY2FtZWxDYXNlKGIpKSk6KHRoaXMuc2V0KGEsYixjKSx2b2lkIDAhPT1jP2M6Yil9LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWFbdGhpcy5leHBhbmRvXTtpZih2b2lkIDAhPT1mKXtpZih2b2lkIDA9PT1iKXRoaXMucmVnaXN0ZXIoYSk7ZWxzZXtuLmlzQXJyYXkoYik/ZD1iLmNvbmNhdChiLm1hcChuLmNhbWVsQ2FzZSkpOihlPW4uY2FtZWxDYXNlKGIpLGIgaW4gZj9kPVtiLGVdOihkPWUsZD1kIGluIGY/W2RdOmQubWF0Y2goRyl8fFtdKSksYz1kLmxlbmd0aDt3aGlsZShjLS0pZGVsZXRlIGZbZFtjXV19KHZvaWQgMD09PWJ8fG4uaXNFbXB0eU9iamVjdChmKSkmJihhLm5vZGVUeXBlP2FbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGFbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGEpe3ZhciBiPWFbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09YiYmIW4uaXNFbXB0eU9iamVjdChiKX19O3ZhciBOPW5ldyBNLE89bmV3IE0sUD0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLFE9L1tBLVpdL2c7ZnVuY3Rpb24gUihhLGIsYyl7dmFyIGQ7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpaWYoZD0iZGF0YS0iK2IucmVwbGFjZShRLCItJCYiKS50b0xvd2VyQ2FzZSgpLGM9YS5nZXRBdHRyaWJ1dGUoZCksInN0cmluZyI9PXR5cGVvZiBjKXt0cnl7Yz0idHJ1ZSI9PT1jPyEwOiJmYWxzZSI9PT1jPyExOiJudWxsIj09PWM/bnVsbDorYysiIj09PWM/K2M6UC50ZXN0KGMpP24ucGFyc2VKU09OKGMpOmN9Y2F0Y2goZSl7fU8uc2V0KGEsYixjKTsNCn1lbHNlIGM9dm9pZCAwO3JldHVybiBjfW4uZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiBPLmhhc0RhdGEoYSl8fE4uaGFzRGF0YShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIE8uYWNjZXNzKGEsYixjKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe08ucmVtb3ZlKGEsYil9LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gTi5hY2Nlc3MoYSxiLGMpfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe04ucmVtb3ZlKGEsYil9fSksbi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzWzBdLGc9ZiYmZi5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWEpe2lmKHRoaXMubGVuZ3RoJiYoZT1PLmdldChmKSwxPT09Zi5ub2RlVHlwZSYmIU4uZ2V0KGYsImhhc0RhdGFBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW4uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLFIoZixkLGVbZF0pKSk7Ti5zZXQoZiwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGV9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBhP3RoaXMuZWFjaChmdW5jdGlvbigpe08uc2V0KHRoaXMsYSl9KTpLKHRoaXMsZnVuY3Rpb24oYil7dmFyIGMsZDtpZihmJiZ2b2lkIDA9PT1iKXtpZihjPU8uZ2V0KGYsYSl8fE8uZ2V0KGYsYS5yZXBsYWNlKFEsIi0kJiIpLnRvTG93ZXJDYXNlKCkpLHZvaWQgMCE9PWMpcmV0dXJuIGM7aWYoZD1uLmNhbWVsQ2FzZShhKSxjPU8uZ2V0KGYsZCksdm9pZCAwIT09YylyZXR1cm4gYztpZihjPVIoZixkLHZvaWQgMCksdm9pZCAwIT09YylyZXR1cm4gY31lbHNlIGQ9bi5jYW1lbENhc2UoYSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9Ty5nZXQodGhpcyxkKTtPLnNldCh0aGlzLGQsYiksYS5pbmRleE9mKCItIik+LTEmJnZvaWQgMCE9PWMmJk8uc2V0KHRoaXMsYSxiKX0pfSxudWxsLGIsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtPLnJlbW92ZSh0aGlzLGEpfSl9fSksbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYT8oYj0oYnx8ImZ4IikrInF1ZXVlIixkPU4uZ2V0KGEsYiksYyYmKCFkfHxuLmlzQXJyYXkoYyk/ZD1OLmFjY2VzcyhhLGIsbi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W10pOnZvaWQgMH0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1uLnF1ZXVlKGEsYiksZD1jLmxlbmd0aCxlPWMuc2hpZnQoKSxmPW4uX3F1ZXVlSG9va3MoYSxiKSxnPWZ1bmN0aW9uKCl7bi5kZXF1ZXVlKGEsYil9OyJpbnByb2dyZXNzIj09PWUmJihlPWMuc2hpZnQoKSxkLS0pLGUmJigiZngiPT09YiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGYuc3RvcCxlLmNhbGwoYSxnLGYpKSwhZCYmZiYmZi5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGEsYil7dmFyIGM9YisicXVldWVIb29rcyI7cmV0dXJuIE4uZ2V0KGEsYyl8fE4uYWNjZXNzKGEsYyx7ZW1wdHk6bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7Ti5yZW1vdmUoYSxbYisicXVldWUiLGNdKX0pfSl9fSksbi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT0iZngiLGMtLSksYXJndW1lbnRzLmxlbmd0aDxjP24ucXVldWUodGhpc1swXSxhKTp2b2lkIDA9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9bi5xdWV1ZSh0aGlzLGEsYik7bi5fcXVldWVIb29rcyh0aGlzLGEpLCJmeCI9PT1hJiYiaW5wcm9ncmVzcyIhPT1jWzBdJiZuLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRlcXVldWUodGhpcyxhKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0xLGU9bi5EZWZlcnJlZCgpLGY9dGhpcyxnPXRoaXMubGVuZ3RoLGg9ZnVuY3Rpb24oKXstLWR8fGUucmVzb2x2ZVdpdGgoZixbZl0pfTsic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGE9YXx8ImZ4Ijt3aGlsZShnLS0pYz1OLmdldChmW2ddLGErInF1ZXVlSG9va3MiKSxjJiZjLmVtcHR5JiYoZCsrLGMuZW1wdHkuYWRkKGgpKTtyZXR1cm4gaCgpLGUucHJvbWlzZShiKX19KTt2YXIgUz0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxUPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitTKyIpKFthLXolXSopJCIsImkiKSxVPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sVj1mdW5jdGlvbihhLGIpe3JldHVybiBhPWJ8fGEsIm5vbmUiPT09bi5jc3MoYSwiZGlzcGxheSIpfHwhbi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl9O2Z1bmN0aW9uIFcoYSxiLGMsZCl7dmFyIGUsZj0xLGc9MjAsaD1kP2Z1bmN0aW9uKCl7cmV0dXJuIGQuY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIG4uY3NzKGEsYiwiIil9LGk9aCgpLGo9YyYmY1szXXx8KG4uY3NzTnVtYmVyW2JdPyIiOiJweCIpLGs9KG4uY3NzTnVtYmVyW2JdfHwicHgiIT09aiYmK2kpJiZULmV4ZWMobi5jc3MoYSxiKSk7aWYoayYma1szXSE9PWope2o9anx8a1szXSxjPWN8fFtdLGs9K2l8fDE7ZG8gZj1mfHwiLjUiLGsvPWYsbi5zdHlsZShhLGIsaytqKTt3aGlsZShmIT09KGY9aCgpL2kpJiYxIT09ZiYmLS1nKX1yZXR1cm4gYyYmKGs9K2t8fCtpfHwwLGU9Y1sxXT9rKyhjWzFdKzEpKmNbMl06K2NbMl0sZCYmKGQudW5pdD1qLGQuc3RhcnQ9ayxkLmVuZD1lKSksZX12YXIgWD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxZPS88KFtcdzotXSspLyxaPS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSwkPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07JC5vcHRncm91cD0kLm9wdGlvbiwkLnRib2R5PSQudGZvb3Q9JC5jb2xncm91cD0kLmNhcHRpb249JC50aGVhZCwkLnRoPSQudGQ7ZnVuY3Rpb24gXyhhLGIpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGw/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6W107cmV0dXJuIHZvaWQgMD09PWJ8fGImJm4ubm9kZU5hbWUoYSxiKT9uLm1lcmdlKFthXSxjKTpjfWZ1bmN0aW9uIGFhKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKU4uc2V0KGFbY10sImdsb2JhbEV2YWwiLCFifHxOLmdldChiW2NdLCJnbG9iYWxFdmFsIikpfXZhciBiYT0vPHwmIz9cdys7LztmdW5jdGlvbiBjYShhLGIsYyxkLGUpe2Zvcih2YXIgZixnLGgsaSxqLGssbD1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxtPVtdLG89MCxwPWEubGVuZ3RoO3A+bztvKyspaWYoZj1hW29dLGZ8fDA9PT1mKWlmKCJvYmplY3QiPT09bi50eXBlKGYpKW4ubWVyZ2UobSxmLm5vZGVUeXBlP1tmXTpmKTtlbHNlIGlmKGJhLnRlc3QoZikpe2c9Z3x8bC5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxoPShZLmV4ZWMoZil8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksaT0kW2hdfHwkLl9kZWZhdWx0LGcuaW5uZXJIVE1MPWlbMV0rbi5odG1sUHJlZmlsdGVyKGYpK2lbMl0saz1pWzBdO3doaWxlKGstLSlnPWcubGFzdENoaWxkO24ubWVyZ2UobSxnLmNoaWxkTm9kZXMpLGc9bC5maXJzdENoaWxkLGcudGV4dENvbnRlbnQ9IiJ9ZWxzZSBtLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShmKSk7bC50ZXh0Q29udGVudD0iIixvPTA7d2hpbGUoZj1tW28rK10paWYoZCYmbi5pbkFycmF5KGYsZCk+LTEpZSYmZS5wdXNoKGYpO2Vsc2UgaWYoaj1uLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxnPV8obC5hcHBlbmRDaGlsZChmKSwic2NyaXB0IiksaiYmYWEoZyksYyl7az0wO3doaWxlKGY9Z1trKytdKVoudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBsfSFmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGI9YS5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtjLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYy5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksYi5hcHBlbmRDaGlsZChjKSxsLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYi5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLGwubm9DbG9uZUNoZWNrZWQ9ISFiLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZX0oKTt2YXIgZGE9L15rZXkvLGVhPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxmYT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gZ2EoKXtyZXR1cm4hMH1mdW5jdGlvbiBoYSgpe3JldHVybiExfWZ1bmN0aW9uIGlhKCl7dHJ5e3JldHVybiBkLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1mdW5jdGlvbiBqYShhLGIsYyxkLGUsZil7dmFyIGcsaDtpZigib2JqZWN0Ij09dHlwZW9mIGIpeyJzdHJpbmciIT10eXBlb2YgYyYmKGQ9ZHx8YyxjPXZvaWQgMCk7Zm9yKGggaW4gYilqYShhLGgsYyxkLGJbaF0sZik7cmV0dXJuIGF9aWYobnVsbD09ZCYmbnVsbD09ZT8oZT1jLGQ9Yz12b2lkIDApOm51bGw9PWUmJigic3RyaW5nIj09dHlwZW9mIGM/KGU9ZCxkPXZvaWQgMCk6KGU9ZCxkPWMsYz12b2lkIDApKSxlPT09ITEpZT1oYTtlbHNlIGlmKCFlKXJldHVybiBhO3JldHVybiAxPT09ZiYmKGc9ZSxlPWZ1bmN0aW9uKGEpe3JldHVybiBuKCkub2ZmKGEpLGcuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmd1aWQ9Zy5ndWlkfHwoZy5ndWlkPW4uZ3VpZCsrKSksYS5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5hZGQodGhpcyxiLGUsZCxjKX0pfW4uZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9Ti5nZXQoYSk7aWYocil7Yy5oYW5kbGVyJiYoZj1jLGM9Zi5oYW5kbGVyLGU9Zi5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoaT1yLmV2ZW50cyl8fChpPXIuZXZlbnRzPXt9KSwoZz1yLmhhbmRsZSl8fChnPXIuaGFuZGxlPWZ1bmN0aW9uKGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgbiYmbi5ldmVudC50cmlnZ2VyZWQhPT1iLnR5cGU/bi5ldmVudC5kaXNwYXRjaC5hcHBseShhLGFyZ3VtZW50cyk6dm9pZCAwfSksYj0oYnx8IiIpLm1hdGNoKEcpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWg9ZmEuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8mJihsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZT9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8byxsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30saz1uLmV4dGVuZCh7dHlwZTpvLG9yaWdUeXBlOnEsZGF0YTpkLGhhbmRsZXI6YyxndWlkOmMuZ3VpZCxzZWxlY3RvcjplLG5lZWRzQ29udGV4dDplJiZuLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoZSksbmFtZXNwYWNlOnAuam9pbigiLiIpfSxmKSwobT1pW29dKXx8KG09aVtvXT1bXSxtLmRlbGVnYXRlQ291bnQ9MCxsLnNldHVwJiZsLnNldHVwLmNhbGwoYSxkLHAsZykhPT0hMXx8YS5hZGRFdmVudExpc3RlbmVyJiZhLmFkZEV2ZW50TGlzdGVuZXIobyxnKSksbC5hZGQmJihsLmFkZC5jYWxsKGEsayksay5oYW5kbGVyLmd1aWR8fChrLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP20uc3BsaWNlKG0uZGVsZWdhdGVDb3VudCsrLDAsayk6bS5wdXNoKGspLG4uZXZlbnQuZ2xvYmFsW29dPSEwKX19LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbyxwLHEscj1OLmhhc0RhdGEoYSkmJk4uZ2V0KGEpO2lmKHImJihpPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEcpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9ZmEuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8pe2w9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShkP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLG09aVtvXXx8W10saD1oWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGc9Zj1tLmxlbmd0aDt3aGlsZShmLS0paz1tW2ZdLCFlJiZxIT09ay5vcmlnVHlwZXx8YyYmYy5ndWlkIT09ay5ndWlkfHxoJiYhaC50ZXN0KGsubmFtZXNwYWNlKXx8ZCYmZCE9PWsuc2VsZWN0b3ImJigiKioiIT09ZHx8IWsuc2VsZWN0b3IpfHwobS5zcGxpY2UoZiwxKSxrLnNlbGVjdG9yJiZtLmRlbGVnYXRlQ291bnQtLSxsLnJlbW92ZSYmbC5yZW1vdmUuY2FsbChhLGspKTtnJiYhbS5sZW5ndGgmJihsLnRlYXJkb3duJiZsLnRlYXJkb3duLmNhbGwoYSxwLHIuaGFuZGxlKSE9PSExfHxuLnJlbW92ZUV2ZW50KGEsbyxyLmhhbmRsZSksZGVsZXRlIGlbb10pfWVsc2UgZm9yKG8gaW4gaSluLmV2ZW50LnJlbW92ZShhLG8rYltqXSxjLGQsITApO24uaXNFbXB0eU9iamVjdChpKSYmTi5yZW1vdmUoYSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1uLmV2ZW50LmZpeChhKTt2YXIgYixjLGQsZixnLGg9W10saT1lLmNhbGwoYXJndW1lbnRzKSxqPShOLmdldCh0aGlzLCJldmVudHMiKXx8e30pW2EudHlwZV18fFtdLGs9bi5ldmVudC5zcGVjaWFsW2EudHlwZV18fHt9O2lmKGlbMF09YSxhLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWsucHJlRGlzcGF0Y2h8fGsucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGEpIT09ITEpe2g9bi5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYSxqKSxiPTA7d2hpbGUoKGY9aFtiKytdKSYmIWEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7YS5jdXJyZW50VGFyZ2V0PWYuZWxlbSxjPTA7d2hpbGUoKGc9Zi5oYW5kbGVyc1tjKytdKSYmIWEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkoIWEucm5hbWVzcGFjZXx8YS5ybmFtZXNwYWNlLnRlc3QoZy5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWcsYS5kYXRhPWcuZGF0YSxkPSgobi5ldmVudC5zcGVjaWFsW2cub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxnLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1kJiYoYS5yZXN1bHQ9ZCk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8aXNOYU4oYS5idXR0b24pfHxhLmJ1dHRvbjwxKSlmb3IoO2khPT10aGlzO2k9aS5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1pLm5vZGVUeXBlJiYoaS5kaXNhYmxlZCE9PSEwfHwiY2xpY2siIT09YS50eXBlKSl7Zm9yKGQ9W10sYz0wO2g+YztjKyspZj1iW2NdLGU9Zi5zZWxlY3RvcisiICIsdm9pZCAwPT09ZFtlXSYmKGRbZV09Zi5uZWVkc0NvbnRleHQ/bihlLHRoaXMpLmluZGV4KGkpPi0xOm4uZmluZChlLHRoaXMsbnVsbCxbaV0pLmxlbmd0aCksZFtlXSYmZC5wdXNoKGYpO2QubGVuZ3RoJiZnLnB1c2goe2VsZW06aSxoYW5kbGVyczpkfSl9cmV0dXJuIGg8Yi5sZW5ndGgmJmcucHVzaCh7ZWxlbTp0aGlzLGhhbmRsZXJzOmIuc2xpY2UoaCl9KSxnfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGV0YWlsIGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWEud2hpY2gmJihhLndoaWNoPW51bGwhPWIuY2hhckNvZGU/Yi5jaGFyQ29kZTpiLmtleUNvZGUpLGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnPWIuYnV0dG9uO3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihjPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGQsZT1jLmRvY3VtZW50RWxlbWVudCxmPWMuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxmJiZmLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGYmJmYuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxmJiZmLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxmJiZmLmNsaWVudFRvcHx8MCkpLGEud2hpY2h8fHZvaWQgMD09PWd8fChhLndoaWNoPTEmZz8xOjImZz8zOjQmZz8yOjApLGF9fSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVtuLmV4cGFuZG9dKXJldHVybiBhO3ZhciBiLGMsZSxmPWEudHlwZSxnPWEsaD10aGlzLmZpeEhvb2tzW2ZdO2h8fCh0aGlzLmZpeEhvb2tzW2ZdPWg9ZWEudGVzdChmKT90aGlzLm1vdXNlSG9va3M6ZGEudGVzdChmKT90aGlzLmtleUhvb2tzOnt9KSxlPWgucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoaC5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBuLkV2ZW50KGcpLGI9ZS5sZW5ndGg7d2hpbGUoYi0tKWM9ZVtiXSxhW2NdPWdbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9ZCksMz09PWEudGFyZ2V0Lm5vZGVUeXBlJiYoYS50YXJnZXQ9YS50YXJnZXQucGFyZW50Tm9kZSksaC5maWx0ZXI/aC5maWx0ZXIoYSxnKTphfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyE9PWlhKCkmJnRoaXMuZm9jdXM/KHRoaXMuZm9jdXMoKSwhMSk6dm9pZCAwfSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1pYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2smJm4ubm9kZU5hbWUodGhpcywiaW5wdXQiKT8odGhpcy5jbGljaygpLCExKTp2b2lkIDB9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe3JldHVybiBuLm5vZGVOYW1lKGEudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihhKXt2b2lkIDAhPT1hLnJlc3VsdCYmYS5vcmlnaW5hbEV2ZW50JiYoYS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWEucmVzdWx0KX19fX0sbi5yZW1vdmVFdmVudD1mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/Z2E6aGEpOnRoaXMudHlwZT1hLGImJm4uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG4ubm93KCksdm9pZCh0aGlzW24uZXhwYW5kb109ITApKTpuZXcgbi5FdmVudChhLGIpfSxuLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6bi5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6aGEsaXNQcm9wYWdhdGlvblN0b3BwZWQ6aGEsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6aGEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Z2EsYSYmYS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1nYSxhJiZhLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1nYSxhJiZhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxuLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQiLHBvaW50ZXJlbnRlcjoicG9pbnRlcm92ZXIiLHBvaW50ZXJsZWF2ZToicG9pbnRlcm91dCJ9LGZ1bmN0aW9uKGEsYil7bi5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYyxkPXRoaXMsZT1hLnJlbGF0ZWRUYXJnZXQsZj1hLmhhbmRsZU9iajtyZXR1cm4oIWV8fGUhPT1kJiYhbi5jb250YWlucyhkLGUpKSYmKGEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YiksY319fSksbi5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBqYSh0aGlzLGEsYixjLGQpfSxvbmU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGphKHRoaXMsYSxiLGMsZCwxKX0sb2ZmOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXJldHVybiBkPWEuaGFuZGxlT2JqLG4oYS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGQubmFtZXNwYWNlP2Qub3JpZ1R5cGUrIi4iK2QubmFtZXNwYWNlOmQub3JpZ1R5cGUsZC5zZWxlY3RvcixkLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXtmb3IoZSBpbiBhKXRoaXMub2ZmKGUsYixhW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4oYj09PSExfHwiZnVuY3Rpb24iPT10eXBlb2YgYikmJihjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9aGEpLHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9fSk7dmFyIGthPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzotXSspW14+XSopXC8+L2dpLGxhPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLG1hPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLG5hPS9edHJ1ZVwvKC4qKS8sb2E9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIHBhKGEsYil7cmV0dXJuIG4ubm9kZU5hbWUoYSwidGFibGUiKSYmbi5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBxYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2EudHlwZSxhfWZ1bmN0aW9uIHJhKGEpe3ZhciBiPW5hLmV4ZWMoYS50eXBlKTtyZXR1cm4gYj9hLnR5cGU9YlsxXTphLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGF9ZnVuY3Rpb24gc2EoYSxiKXt2YXIgYyxkLGUsZixnLGgsaSxqO2lmKDE9PT1iLm5vZGVUeXBlKXtpZihOLmhhc0RhdGEoYSkmJihmPU4uYWNjZXNzKGEpLGc9Ti5zZXQoYixmKSxqPWYuZXZlbnRzKSl7ZGVsZXRlIGcuaGFuZGxlLGcuZXZlbnRzPXt9O2ZvcihlIGluIGopZm9yKGM9MCxkPWpbZV0ubGVuZ3RoO2Q+YztjKyspbi5ldmVudC5hZGQoYixlLGpbZV1bY10pfU8uaGFzRGF0YShhKSYmKGg9Ty5hY2Nlc3MoYSksaT1uLmV4dGVuZCh7fSxoKSxPLnNldChiLGkpKX19ZnVuY3Rpb24gdGEoYSxiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PWMmJlgudGVzdChhLnR5cGUpP2IuY2hlY2tlZD1hLmNoZWNrZWQ6KCJpbnB1dCI9PT1jfHwidGV4dGFyZWEiPT09YykmJihiLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gdWEoYSxiLGMsZCl7Yj1mLmFwcGx5KFtdLGIpO3ZhciBlLGcsaCxpLGosayxtPTAsbz1hLmxlbmd0aCxwPW8tMSxxPWJbMF0scj1uLmlzRnVuY3Rpb24ocSk7aWYocnx8bz4xJiYic3RyaW5nIj09dHlwZW9mIHEmJiFsLmNoZWNrQ2xvbmUmJm1hLnRlc3QocSkpcmV0dXJuIGEuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1hLmVxKGUpO3ImJihiWzBdPXEuY2FsbCh0aGlzLGUsZi5odG1sKCkpKSx1YShmLGIsYyxkKX0pO2lmKG8mJihlPWNhKGIsYVswXS5vd25lckRvY3VtZW50LCExLGEsZCksZz1lLmZpcnN0Q2hpbGQsMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgmJihlPWcpLGd8fGQpKXtmb3IoaD1uLm1hcChfKGUsInNjcmlwdCIpLHFhKSxpPWgubGVuZ3RoO28+bTttKyspaj1lLG0hPT1wJiYoaj1uLmNsb25lKGosITAsITApLGkmJm4ubWVyZ2UoaCxfKGosInNjcmlwdCIpKSksYy5jYWxsKGFbbV0saixtKTtpZihpKWZvcihrPWhbaC5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxuLm1hcChoLHJhKSxtPTA7aT5tO20rKylqPWhbbV0sWi50ZXN0KGoudHlwZXx8IiIpJiYhTi5hY2Nlc3MoaiwiZ2xvYmFsRXZhbCIpJiZuLmNvbnRhaW5zKGssaikmJihqLnNyYz9uLl9ldmFsVXJsJiZuLl9ldmFsVXJsKGouc3JjKTpuLmdsb2JhbEV2YWwoai50ZXh0Q29udGVudC5yZXBsYWNlKG9hLCIiKSkpfXJldHVybiBhfWZ1bmN0aW9uIHZhKGEsYixjKXtmb3IodmFyIGQsZT1iP24uZmlsdGVyKGIsYSk6YSxmPTA7bnVsbCE9KGQ9ZVtmXSk7ZisrKWN8fDEhPT1kLm5vZGVUeXBlfHxuLmNsZWFuRGF0YShfKGQpKSxkLnBhcmVudE5vZGUmJihjJiZuLmNvbnRhaW5zKGQub3duZXJEb2N1bWVudCxkKSYmYWEoXyhkLCJzY3JpcHQiKSksZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpKTtyZXR1cm4gYX1uLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGthLCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jbG9uZU5vZGUoITApLGk9bi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSk7aWYoIShsLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxuLmlzWE1MRG9jKGEpKSlmb3IoZz1fKGgpLGY9XyhhKSxkPTAsZT1mLmxlbmd0aDtlPmQ7ZCsrKXRhKGZbZF0sZ1tkXSk7aWYoYilpZihjKWZvcihmPWZ8fF8oYSksZz1nfHxfKGgpLGQ9MCxlPWYubGVuZ3RoO2U+ZDtkKyspc2EoZltkXSxnW2RdKTtlbHNlIHNhKGEsaCk7cmV0dXJuIGc9XyhoLCJzY3JpcHQiKSxnLmxlbmd0aD4wJiZhYShnLCFpJiZfKGEsInNjcmlwdCIpKSxofSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZCxlPW4uZXZlbnQuc3BlY2lhbCxmPTA7dm9pZCAwIT09KGM9YVtmXSk7ZisrKWlmKEwoYykpe2lmKGI9Y1tOLmV4cGFuZG9dKXtpZihiLmV2ZW50cylmb3IoZCBpbiBiLmV2ZW50cyllW2RdP24uZXZlbnQucmVtb3ZlKGMsZCk6bi5yZW1vdmVFdmVudChjLGQsYi5oYW5kbGUpO2NbTi5leHBhbmRvXT12b2lkIDB9Y1tPLmV4cGFuZG9dJiYoY1tPLmV4cGFuZG9dPXZvaWQgMCl9fX0pLG4uZm4uZXh0ZW5kKHtkb21NYW5pcDp1YSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHZhKHRoaXMsYSwhMCl9LHJlbW92ZTpmdW5jdGlvbihhKXtyZXR1cm4gdmEodGhpcyxhKX0sdGV4dDpmdW5jdGlvbihhKXtyZXR1cm4gSyh0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hP24udGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpeygxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSkmJih0aGlzLnRleHRDb250ZW50PWEpfSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHVhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj1wYSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdWEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXBhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdWEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdWEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKykxPT09YS5ub2RlVHlwZSYmKG4uY2xlYW5EYXRhKF8oYSwhMSkpLGEudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGw9PWE/ITE6YSxiPW51bGw9PWI/YTpiLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG4uY2xvbmUodGhpcyxhLGIpfSl9LGh0bWw6ZnVuY3Rpb24oYSl7cmV0dXJuIEsodGhpcyxmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdfHx7fSxjPTAsZD10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1hJiYxPT09Yi5ub2RlVHlwZSlyZXR1cm4gYi5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYhbGEudGVzdChhKSYmISRbKFkuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9bi5odG1sUHJlZmlsdGVyKGEpO3RyeXtmb3IoO2Q+YztjKyspYj10aGlzW2NdfHx7fSwxPT09Yi5ub2RlVHlwZSYmKG4uY2xlYW5EYXRhKF8oYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1bXTtyZXR1cm4gdWEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5wYXJlbnROb2RlO24uaW5BcnJheSh0aGlzLGEpPDAmJihuLmNsZWFuRGF0YShfKHRoaXMpKSxjJiZjLnJlcGxhY2VDaGlsZChiLHRoaXMpKX0sYSl9fSksbi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtuLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPVtdLGU9bihhKSxmPWUubGVuZ3RoLTEsaD0wO2Y+PWg7aCsrKWM9aD09PWY/dGhpczp0aGlzLmNsb25lKCEwKSxuKGVbaF0pW2JdKGMpLGcuYXBwbHkoZCxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZCl9fSk7dmFyIHdhLHhhPXtIVE1MOiJibG9jayIsQk9EWToiYmxvY2sifTtmdW5jdGlvbiB5YShhLGIpe3ZhciBjPW4oYi5jcmVhdGVFbGVtZW50KGEpKS5hcHBlbmRUbyhiLmJvZHkpLGQ9bi5jc3MoY1swXSwiZGlzcGxheSIpO3JldHVybiBjLmRldGFjaCgpLGR9ZnVuY3Rpb24gemEoYSl7dmFyIGI9ZCxjPXhhW2FdO3JldHVybiBjfHwoYz15YShhLGIpLCJub25lIiE9PWMmJmN8fCh3YT0od2F8fG4oIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKSkuYXBwZW5kVG8oYi5kb2N1bWVudEVsZW1lbnQpLGI9d2FbMF0uY29udGVudERvY3VtZW50LGIud3JpdGUoKSxiLmNsb3NlKCksYz15YShhLGIpLHdhLmRldGFjaCgpKSx4YVthXT1jKSxjfXZhciBBYT0vXm1hcmdpbi8sQmE9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxDYT1mdW5jdGlvbihiKXt2YXIgYz1iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGMmJmMub3BlbmVyfHwoYz1hKSxjLmdldENvbXB1dGVkU3R5bGUoYil9LERhPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZz17fTtmb3IoZiBpbiBiKWdbZl09YS5zdHlsZVtmXSxhLnN0eWxlW2ZdPWJbZl07ZT1jLmFwcGx5KGEsZHx8W10pO2ZvcihmIGluIGIpYS5zdHlsZVtmXT1nW2ZdO3JldHVybiBlfSxFYT1kLmRvY3VtZW50RWxlbWVudDshZnVuY3Rpb24oKXt2YXIgYixjLGUsZixnPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksaD1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKGguc3R5bGUpe2guc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixoLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsbC5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWguc3R5bGUuYmFja2dyb3VuZENsaXAsZy5zdHlsZS5jc3NUZXh0PSJib3JkZXI6MDt3aWR0aDo4cHg7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4O3BhZGRpbmc6MDttYXJnaW4tdG9wOjFweDtwb3NpdGlvbjphYnNvbHV0ZSIsZy5hcHBlbmRDaGlsZChoKTtmdW5jdGlvbiBpKCl7aC5zdHlsZS5jc3NUZXh0PSItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jazttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3RvcDoxJTt3aWR0aDo1MCUiLGguaW5uZXJIVE1MPSIiLEVhLmFwcGVuZENoaWxkKGcpO3ZhciBkPWEuZ2V0Q29tcHV0ZWRTdHlsZShoKTtiPSIxJSIhPT1kLnRvcCxmPSIycHgiPT09ZC5tYXJnaW5MZWZ0LGM9IjRweCI9PT1kLndpZHRoLGguc3R5bGUubWFyZ2luUmlnaHQ9IjUwJSIsZT0iNHB4Ij09PWQubWFyZ2luUmlnaHQsRWEucmVtb3ZlQ2hpbGQoZyl9bi5leHRlbmQobCx7cGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBpKCksYn0sYm94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09YyYmaSgpLGN9LHBpeGVsTWFyZ2luUmlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09YyYmaSgpLGV9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1jJiZpKCksZn0scmVsaWFibGVNYXJnaW5SaWdodDpmdW5jdGlvbigpe3ZhciBiLGM9aC5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtyZXR1cm4gYy5zdHlsZS5jc3NUZXh0PWguc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjAiLGMuc3R5bGUubWFyZ2luUmlnaHQ9Yy5zdHlsZS53aWR0aD0iMCIsaC5zdHlsZS53aWR0aD0iMXB4IixFYS5hcHBlbmRDaGlsZChnKSxiPSFwYXJzZUZsb2F0KGEuZ2V0Q29tcHV0ZWRTdHlsZShjKS5tYXJnaW5SaWdodCksRWEucmVtb3ZlQ2hpbGQoZyksaC5yZW1vdmVDaGlsZChjKSxifX0pfX0oKTtmdW5jdGlvbiBGYShhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fENhKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLCIiIT09ZyYmdm9pZCAwIT09Z3x8bi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl8fChnPW4uc3R5bGUoYSxiKSksYyYmIWwucGl4ZWxNYXJnaW5SaWdodCgpJiZCYS50ZXN0KGcpJiZBYS50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpLHZvaWQgMCE9PWc/ZysiIjpnfWZ1bmN0aW9uIEdhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3JldHVybiBhKCk/dm9pZCBkZWxldGUgdGhpcy5nZXQ6KHRoaXMuZ2V0PWIpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fXZhciBIYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sSWE9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LEphPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxLYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdLExhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gTWEoYSl7aWYoYSBpbiBMYSlyZXR1cm4gYTt2YXIgYj1hWzBdLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPUthLmxlbmd0aDt3aGlsZShjLS0paWYoYT1LYVtjXStiLGEgaW4gTGEpcmV0dXJuIGF9ZnVuY3Rpb24gTmEoYSxiLGMpe3ZhciBkPVQuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMl0tKGN8fDApKSsoZFszXXx8InB4Iik6Yn1mdW5jdGlvbiBPYShhLGIsYyxkLGUpe2Zvcih2YXIgZj1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT1iPzE6MCxnPTA7ND5mO2YrPTIpIm1hcmdpbiI9PT1jJiYoZys9bi5jc3MoYSxjK1VbZl0sITAsZSkpLGQ/KCJjb250ZW50Ij09PWMmJihnLT1uLmNzcyhhLCJwYWRkaW5nIitVW2ZdLCEwLGUpKSwibWFyZ2luIiE9PWMmJihnLT1uLmNzcyhhLCJib3JkZXIiK1VbZl0rIldpZHRoIiwhMCxlKSkpOihnKz1uLmNzcyhhLCJwYWRkaW5nIitVW2ZdLCEwLGUpLCJwYWRkaW5nIiE9PWMmJihnKz1uLmNzcyhhLCJib3JkZXIiK1VbZl0rIldpZHRoIiwhMCxlKSkpO3JldHVybiBnfWZ1bmN0aW9uIFBhKGIsYyxlKXt2YXIgZj0hMCxnPSJ3aWR0aCI9PT1jP2Iub2Zmc2V0V2lkdGg6Yi5vZmZzZXRIZWlnaHQsaD1DYShiKSxpPSJib3JkZXItYm94Ij09PW4uY3NzKGIsImJveFNpemluZyIsITEsaCk7aWYoZC5tc0Z1bGxzY3JlZW5FbGVtZW50JiZhLnRvcCE9PWEmJmIuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJihnPU1hdGgucm91bmQoMTAwKmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbY10pKSwwPj1nfHxudWxsPT1nKXtpZihnPUZhKGIsYyxoKSwoMD5nfHxudWxsPT1nKSYmKGc9Yi5zdHlsZVtjXSksQmEudGVzdChnKSlyZXR1cm4gZztmPWkmJihsLmJveFNpemluZ1JlbGlhYmxlKCl8fGc9PT1iLnN0eWxlW2NdKSxnPXBhcnNlRmxvYXQoZyl8fDB9cmV0dXJuIGcrT2EoYixjLGV8fChpPyJib3JkZXIiOiJjb250ZW50IiksZixoKSsicHgifWZ1bmN0aW9uIFFhKGEsYil7Zm9yKHZhciBjLGQsZSxmPVtdLGc9MCxoPWEubGVuZ3RoO2g+ZztnKyspZD1hW2ddLGQuc3R5bGUmJihmW2ddPU4uZ2V0KGQsIm9sZGRpc3BsYXkiKSxjPWQuc3R5bGUuZGlzcGxheSxiPyhmW2ddfHwibm9uZSIhPT1jfHwoZC5zdHlsZS5kaXNwbGF5PSIiKSwiIj09PWQuc3R5bGUuZGlzcGxheSYmVihkKSYmKGZbZ109Ti5hY2Nlc3MoZCwib2xkZGlzcGxheSIsemEoZC5ub2RlTmFtZSkpKSk6KGU9VihkKSwibm9uZSI9PT1jJiZlfHxOLnNldChkLCJvbGRkaXNwbGF5IixlP2M6bi5jc3MoZCwiZGlzcGxheSIpKSkpO2ZvcihnPTA7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGImJiJub25lIiE9PWQuc3R5bGUuZGlzcGxheSYmIiIhPT1kLnN0eWxlLmRpc3BsYXl8fChkLnN0eWxlLmRpc3BsYXk9Yj9mW2ddfHwiIjoibm9uZSIpKTtyZXR1cm4gYX1uLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUZhKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ImNzc0Zsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7cmV0dXJuIGI9bi5jc3NQcm9wc1toXXx8KG4uY3NzUHJvcHNbaF09TWEoaCl8fGgpLGc9bi5jc3NIb29rc1tiXXx8bi5jc3NIb29rc1toXSx2b2lkIDA9PT1jP2cmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTppW2JdOihmPXR5cGVvZiBjLCJzdHJpbmciPT09ZiYmKGU9VC5leGVjKGMpKSYmZVsxXSYmKGM9VyhhLGIsZSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIj09PWYmJihjKz1lJiZlWzNdfHwobi5jc3NOdW1iZXJbaF0/IiI6InB4IikpLGwuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PWN8fDAhPT1iLmluZGV4T2YoImJhY2tncm91bmQiKXx8KGlbYl09ImluaGVyaXQiKSxnJiYic2V0ImluIGcmJnZvaWQgMD09PShjPWcuc2V0KGEsYyxkKSl8fChpW2JdPWMpKSx2b2lkIDApfX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPU1hKGgpfHxoKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGMpKSx2b2lkIDA9PT1lJiYoZT1GYShhLGIsZCkpLCJub3JtYWwiPT09ZSYmYiBpbiBKYSYmKGU9SmFbYl0pLCIiPT09Y3x8Yz8oZj1wYXJzZUZsb2F0KGUpLGM9PT0hMHx8aXNGaW5pdGUoZik/Znx8MDplKTplfX0pLG4uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBjP0hhLnRlc3Qobi5jc3MoYSwiZGlzcGxheSIpKSYmMD09PWEub2Zmc2V0V2lkdGg/RGEoYSxJYSxmdW5jdGlvbigpe3JldHVybiBQYShhLGIsZCl9KTpQYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGY9ZCYmQ2EoYSksZz1kJiZPYShhLGIsZCwiYm9yZGVyLWJveCI9PT1uLmNzcyhhLCJib3hTaXppbmciLCExLGYpLGYpO3JldHVybiBnJiYoZT1ULmV4ZWMoYykpJiYicHgiIT09KGVbM118fCJweCIpJiYoYS5zdHlsZVtiXT1jLGM9bi5jc3MoYSxiKSksTmEoYSxjLGcpfX19KSxuLmNzc0hvb2tzLm1hcmdpbkxlZnQ9R2EobC5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj8ocGFyc2VGbG9hdChGYShhLCJtYXJnaW5MZWZ0IikpfHxhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtRGEoYSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4Ijp2b2lkIDB9KSxuLmNzc0hvb2tzLm1hcmdpblJpZ2h0PUdhKGwucmVsaWFibGVNYXJnaW5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment