<!-- 
Tutorial: https://9elements.com/blog/css-border-radius/ 
Demo: https://9elements.github.io/fancy-border-radius/full-control.html#13.6.25.10-78.90.90.90-.
Author: @supremebeing09 https://twitter.com/supremebeing09

-->

<div class="generator" id="box">
  <div class="generator__shape generator__shape--8v" id="shape"></div>
  <span class="generator__handle generator__handle--8v generator__handle--second" id="leftBottom"></span>
  <span class="generator__handle generator__handle--8v generator__handle--third" id="topRight"></span>
  <span class="generator__handle generator__handle--8v generator__handle--fourth" id="rightBottom"></span>
  <span class="generator__handle generator__handle--8v generator__handle--fourth" id="bottomRight"></span>
  <span class="generator__handle generator__handle--8v" id="left"></span>
  <span class="generator__handle generator__handle--8v" id="top"></span>
  <span class="generator__handle generator__handle--8v generator__handle--third" id="right"></span>
  <span class="generator__handle generator__handle--8v generator__handle--second" id="bottom"></span>

</div>
<div class="output">
  <div class="output__label">border-radius:</div>
  <div class="input-group">
    <span type="text" class="output__code" id="code">
      10% 10% 10% 10% / 10% 10% 10% 10%
    </span>
    <button class="output__button" id="copy">copy</button>
  </div>
</div>
<div class="advanced">
  <div class="advanced__switch">
    <input class="advanced__check" type="checkbox" id="enable-advanced">
    <label class="advanced__trigger" for="enable-advanced">Custom size:
      <span></span>
    </label>
  </div>
  <div class="advanced__settings" id="dimension-input">
    <div class="input-group">
      <label for="width">Width:</label>
      <input id="width" type="number" min="5" max="2000" value="300" />
    </div>
    <div class="input-group">
      <label for="height">Height:</label>
      <input id="height" type="number" min="5" max="2000" value="300" />
    </div>
  </div>
</div>
</div>
<div id="clipboard_copied"></div>

<div class="tutorials">
  <a href="#" target="_blank">
    <svg t="1696988571607" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4422" width="200" height="200">
      <path d="M924.8 576.64v-115.2c12.8-13.44 13.44-26.88 12.8-34.56-3.2-30.08-36.48-42.24-47.36-46.72-79.36-30.08-226.56-89.6-307.84-122.88-49.28-24.32-65.28-19.84-113.28-0.64-12.8 5.12-224.64 83.84-306.56 117.76-44.8 18.56-51.2 46.08-51.2 61.44 0 25.6 17.92 48.64 50.56 62.08L259.84 537.6v257.28l8.32 8.32c3.84 3.84 91.52 92.16 252.16 92.16 150.4 0 236.16-88.96 240-92.8l7.68-8.32V540.16l36.48-15.36-1.28 52.48-29.44 49.28 88.96 84.48 98.56-85.76-36.48-48.64zM710.4 771.2c-22.4 18.56-88.96 67.2-190.08 67.2-111.36 0-179.84-48.64-202.88-67.2V561.28l144.64 58.88h0.64c46.08 17.28 81.28 16 125.44-3.2l122.24-51.84v206.08z m154.24-138.24l-17.92-16.64 13.44-22.4 2.56-102.4c4.48-14.08-0.64-25.6-8.32-32-7.68-7.04-21.76-11.52-36.48-2.56L565.12 563.84c-30.08 13.44-49.92 14.08-81.92 2.56l-298.88-121.6c-7.68-3.2-12.16-6.4-14.08-8.96 1.92-1.92 6.4-5.12 14.72-8.96 81.92-33.92 302.72-116.48 305.28-117.12h0.64c38.4-15.36 38.4-15.36 67.2-0.64l1.92 0.64c80.64 32.64 226.56 92.16 307.2 122.88v163.2l16 21.12-18.56 16z" p-id="4423"></path>
    </svg>
  </a>

</div>
@layer reset, base,forms, dmeo;

@layer demo {
  @import "https://fonts.googleapis.com/css?family=M+PLUS+Rounded+1c:400,800|Ubuntu+Mono";
  .container {
    min-height: calc(100vh - 2rem);
    padding-top: 2rem;
    display: flex;
    flex-direction: column;
    align-items: stretch;
    justify-content: space-evenly;
    overflow: hidden;
    position: relative;
  }
  .container::before,
  .container::after {
    content: "";
    width: 70vmax;
    height: 70vmax;
    position: absolute;
    background: rgba(255, 255, 255, 0.07);
    left: -20vmin;
    top: -20vmin;
    animation: morph 15s linear infinite alternate, spin 20s linear infinite;
    z-index: 1;
    will-change: border-radius, transform;
    transform-origin: 55% 55%;
    pointer-events: none;
  }
  .container::after {
    width: 70vmin;
    height: 70vmin;
    left: auto;
    right: -10vmin;
    top: auto;
    bottom: 0;
    animation: morph 10s linear infinite alternate,
      spin 26s linear infinite reverse;
    transform-origin: 20% 20%;
  }
  .generator {
    width: 60vmin;
    height: 60vmin;
    border: 2px dashed rgba(255, 255, 255, 0.4);
    position: relative;
    z-index: 3;
    margin-left: auto;
    margin-right: auto;
  }
  @media screen and (min-width: 31.875rem) {
    .generator {
      width: 50vmin;
      height: 50vmin;
    }
  }
  .generator__shape {
    width: 100%;
    height: 100%;
    background: #f09;
    background-image: linear-gradient(45deg, #3023ae 0%, #f09 100%);
    border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
    box-shadow: -10vmin 10vmin 0 rgba(255, 255, 255, 0.07);
  }
  .generator__shape--8v {
    border-radius: 10%;
    background-image: linear-gradient(
        -225deg,
        #fff 0%,
        rgba(255, 255, 255, 0) 40%,
        rgba(0, 255, 255, 0) 60%,
        cyan 100%
      ),
      linear-gradient(45deg, #3023ae 0%, #f09 100%);
  }
  .generator__handle {
    display: block;
    position: absolute;
    cursor: pointer;
    width: 2.5rem;
    height: 2.5rem;
  }
  .generator__handle:before {
    content: "";
    position: absolute;
    width: 1rem;
    height: 1rem;
    left: 0.75rem;
    top: 0.75rem;
    background: #fff;
    border: 2px solid #002;
    transition: box-shadow 0.2s ease-out;
    will-change: box-shadow;
  }
  .generator__handle--second:before {
    background: #3023ae;
    border: 2px solid #fff;
  }
  .generator__handle--third:before {
    background: #f09;
    border: 2px solid #fff;
  }
  .generator__handle--fourth:before {
    background: #0ff;
  }
  .generator__handle--8v.active:before,
  .generator__handle--8v:hover:before {
    box-shadow: 0 0 0 4px #fff;
    border: 2px solid #002;
  }
  .generator__handle:not(.generator__handle--8v).active:before,
  .generator__handle:not(.generator__handle--8v):hover:before {
    background: #0ff;
    box-shadow: 0 0 0 4px #fff;
    border: 2px solid #002;
  }
  .generator #top {
    top: -1.25rem;
    left: 30%;
    transform: translateX(-50%);
  }
  .generator #top.generator__handle--8v {
    left: 10%;
  }
  .generator #bottom {
    bottom: -1.25rem;
    left: 30%;
    transform: translateX(-50%);
  }
  .generator #bottom.generator__handle--8v {
    left: 10%;
  }
  .generator #left {
    left: -1.25rem;
    top: 30%;
    transform: translateY(-50%);
  }
  .generator #left.generator__handle--8v {
    top: 10%;
  }
  .generator #right {
    right: -1.25rem;
    top: 30%;
    transform: translateY(-50%);
  }
  .generator #right.generator__handle--8v {
    top: 10%;
  }
  .generator #topRight {
    top: -1.25rem;
    left: 90%;
    transform: translateX(-50%);
  }
  .generator #bottomRight {
    bottom: -1.25rem;
    left: 90%;
    transform: translateX(-50%);
  }
  .generator #leftBottom {
    left: -1.25rem;
    top: 90%;
    transform: translateY(-50%);
  }
  .generator #rightBottom {
    right: -1.25rem;
    top: 90%;
    transform: translateY(-50%);
  }
  .output {
    width: 90%;
    text-align: left;
    margin-top: 1.5em;
    font-size: 1.125rem;
    line-height: 1.5;
    margin-left: auto;
    margin-right: auto;
  }
  .output__label {
    flex: 0 0 auto;
    margin-bottom: 0.5em;
    margin-right: 1em;
    color: rgba(255, 255, 255, 0.9);
  }
  .output__code {
    display: block;
    font-family: "Ubuntu Mono", monospace;
    flex-grow: 1;
    color: #002;
    background: #ccc;
    padding: 0.5em 0.625em;
    border-radius: 2px;
    margin-bottom: 0.5em;
  }
  .output__button {
    display: block;
    border-radius: 2px;
    background: #f09;
    border: none;
    color: rgba(255, 255, 255, 0.9);
    padding: 0.5em 1em;
    font-weight: bold;
    width: 100%;
    transition: background 0.3s ease-out;
    will-change: background;
    cursor: pointer;
  }
  .output__button:hover {
    background: #3023ae;
  }
  @media screen and (min-width: 30.875rem) {
    .output {
      font-size: 1.25rem;
    }
    .output__code {
      border-radius: 2px 0 0 2px;
      flex-grow: 1;
      margin-bottom: 0;
    }
    .output__button {
      flex-shrink: 1;
      border-radius: 0 2px 2px 0;
      width: auto;
      text-transform: uppercase;
      letter-spacing: 0.1em;
    }
  }
  @media screen and (min-width: 43rem) {
    .output {
      display: flex;
      justify-content: stretch;
      align-items: baseline;
      max-width: 39rem;
    }
  }
  .advanced {
    width: 90%;
    max-width: 39rem;
    text-align: left;
    margin: 0.5em auto;
    position: relative;
    z-index: 5;
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: rgba(255, 255, 255, 0.9);
  }
  @media screen and (min-width: 560px) {
    .advanced {
      font-size: 1.25rem;
    }
  }
  .advanced__switch {
    padding: 0.5em 0;
    flex-shrink: 0;
    margin-bottom: 0.5em;
  }
  .advanced__settings {
    display: none;
  }
  .advanced__settings.visible {
    display: flex;
    justify-content: space-between;
    flex-direction: column;
  }
  @media screen and (min-width: 31.25rem) {
    .advanced__settings.visible {
      flex-direction: row;
    }
  }
  .advanced__check {
    visibility: hidden;
    width: 0;
    height: 0;
    display: block;
    border: none;
  }
  .advanced .input-group {
    align-items: center;
    margin-left: 1em;
    margin-bottom: 0.5em;
    justify-content: space-between;
    display: flex;
  }
  .advanced .input-group label {
    display: block;
    margin-right: 0.5em;
  }
  .advanced .input-group input[type="number"] {
    width: 4.5rem;
  }
  .advanced__check:checked + .advanced__trigger span:after {
    background: #f09;
    left: 1.15em;
    border-radius: 37% 63% 55% 45% / 25% 50% 50% 75%;
  }
  .advanced__trigger {
    display: block;
    line-height: 1;
    cursor: pointer;
  }
  .advanced__trigger span {
    display: inline-block;
    width: 2em;
    height: 1em;
    border-radius: 0.5em;
    background: rgba(255, 255, 255, 0.8);
    vertical-align: bottom;
    position: relative;
  }
  @media screen and (min-width: 43rem) {
    .advanced__trigger span {
      margin-left: 2rem;
    }
  }
  .advanced__trigger span:after {
    content: "";
    position: absolute;
    width: 0.7em;
    height: 0.7em;
    border-radius: 50% 56% 29% 70% / 50% 73% 38% 50%;
    background: #002;
    position: absolute;
    left: 0.15em;
    top: 0.15em;
    transition: left 0.3s ease-out, background 0.3s ease-out,
      border-radius 0.4s ease-in-out;
  }
  .input-group input {
    border-radius: 2px;
    border: none;
    background: #fff;
    font-family: "Ubuntu Mono", monospace;
    color: #002;
    padding: 0.5em 0.625em;
  }
  @media screen and (min-width: 30.85rem) {
    .input-group {
      display: flex;
      align-items: stretch;
      flex-grow: 1;
      margin-bottom: 0;
    }
  }
  .company-link {
    z-index: 200;
    width: 14em;
    position: relative;
    display: flex;
    flex-direction: column;
    padding: 0.5em 1em 0.75em;
    margin: 2em auto;
    margin-bottom: 1rem;
    background: rgba(255, 255, 255, 0.15);
    border: 1px solid #f09;
    color: #fff;
    font-size: 1rem;
    text-align: center;
    text-decoration: none;
  }
  .company-link:hover {
    background: rgba(255, 255, 255, 0.3);
  }
  .company-link__label {
    margin-bottom: 0.5em;
  }
  @media screen and (min-width: 62rem) and (orientation: landscape) {
    .company-link {
      margin: 0;
      position: absolute;
      top: 7%;
      right: 1rem;
    }
  }
  @media screen and (min-width: 82rem) and (orientation: landscape) {
    .company-link {
      left: 75%;
    }
  }

  .generator {
    margin-top: 20px;
  }
}

@layer reset {
  * {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }
}

@layer base {
  body {
    width: 100vw;
    min-height: 100vh;
    font-family: "Exo", "Bungee Shade", cursive, Arial, sans-serif;
    background: hsl(185.03deg 29.72% 30.91%);
    color-scheme: dark only;
    color: #fff;
    display: grid;
    place-content: center;

    padding: 1rem;
    gap: 2rem;
    &::before {
      --line: hsl(0 0% 95% / 0.15);
      --size: 60px;
      content: "";
      height: 100vh;
      width: 100vw;
      position: fixed;
      background: linear-gradient(
            90deg,
            var(--line) 1px,
            transparent 1px var(--size)
          )
          50% 50% / var(--size) var(--size),
        linear-gradient(var(--line) 1px, transparent 1px var(--size)) 50% 50% /
          var(--size) var(--size);
      mask: linear-gradient(-15deg, transparent 30%, white);
      top: 0;
      transform-style: flat;
      pointer-events: none;
      z-index: -1;
    }
  }

  .tutorials {
    position: fixed;
    bottom: 1rem;
    right: 1rem;
    z-index: 9999;
    width: 64px;
    aspect-ratio: 1;
    border-radius: 50%;
    background: #3f517e;
    padding: 0.5rem;
    display: grid;
    place-content: center;
    transition: all 0.28s linear;

    &:hover {
      background: #4161b2;
    }

    & svg {
      display: block;
      width: 100%;
      height: 100%;
      filter: invert(1);
    }
  }
  @media (prefers-reduced-motion: reduce) {
    *,
    ::before,
    ::after {
      animation-delay: -1ms !important;
      animation-duration: 1ms !important;
      animation-iteration-count: 1 !important;
      background-attachment: initial !important;
      scroll-behavior: auto !important;
      transition-duration: 0s !important;
      transition-delay: 0s !important;
    }
  }

  button {
    overflow: visible;
  }
  button,
  select {
    text-transform: none;
  }
  button,
  html input[type="button"],
  input[type="reset"],
  input[type="submit"] {
    -webkit-appearance: button;
    cursor: pointer;
  }
  button[disabled],
  html input[disabled] {
    cursor: default;
  }
  button::-moz-focus-inner,
  input::-moz-focus-inner {
    border: 0;
    padding: 0;
  }
  input {
    line-height: normal;
  }
  input[type="checkbox"],
  input[type="radio"] {
    box-sizing: border-box;
    padding: 0;
  }
  input[type="number"]::-webkit-inner-spin-button,
  input[type="number"]::-webkit-outer-spin-button {
    height: auto;
  }
  input[type="search"] {
    -webkit-appearance: textfield;
    box-sizing: content-box;
  }
  input[type="search"]::-webkit-search-cancel-button,
  input[type="search"]::-webkit-search-decoration {
    -webkit-appearance: none;
  }
  @keyframes morph {
    0% {
      border-radius: 40% 60% 60% 40% / 70% 30% 70% 30%;
    }
    100% {
      border-radius: 40% 60%;
    }
  }
  @keyframes spin {
    to {
      transform: rotate(1turn);
    }
  }
}
!(function (t) {
  var e = {};
  function n(o) {
    if (e[o]) return e[o].exports;
    var i = (e[o] = { i: o, l: !1, exports: {} });
    return t[o].call(i.exports, i, i.exports, n), (i.l = !0), i.exports;
  }
  (n.m = t),
    (n.c = e),
    (n.d = function (t, e, o) {
      n.o(t, e) || Object.defineProperty(t, e, { enumerable: !0, get: o });
    }),
    (n.r = function (t) {
      "undefined" != typeof Symbol &&
        Symbol.toStringTag &&
        Object.defineProperty(t, Symbol.toStringTag, { value: "Module" }),
        Object.defineProperty(t, "__esModule", { value: !0 });
    }),
    (n.t = function (t, e) {
      if ((1 & e && (t = n(t)), 8 & e)) return t;
      if (4 & e && "object" == typeof t && t && t.__esModule) return t;
      var o = Object.create(null);
      if (
        (n.r(o),
        Object.defineProperty(o, "default", { enumerable: !0, value: t }),
        2 & e && "string" != typeof t)
      )
        for (var i in t)
          n.d(
            o,
            i,
            function (e) {
              return t[e];
            }.bind(null, i)
          );
      return o;
    }),
    (n.n = function (t) {
      var e =
        t && t.__esModule
          ? function () {
              return t.default;
            }
          : function () {
              return t;
            };
      return n.d(e, "a", e), e;
    }),
    (n.o = function (t, e) {
      return Object.prototype.hasOwnProperty.call(t, e);
    }),
    (n.p = "http://localhost:8080/dist/"),
    n((n.s = 11));
})([
  function (t, e) {
    var n;
    n = (function () {
      return this;
    })();
    try {
      n = n || new Function("return this")();
    } catch (t) {
      "object" == typeof window && (n = window);
    }
    t.exports = n;
  },
  function (t, e, n) {
    t.exports = n(7);
  },
  function (t, e, n) {
    var o = n(3);
    "string" == typeof o && (o = [[t.i, o, ""]]);
    var i = { hmr: !0, transform: void 0, insertInto: void 0 };
    n(5)(o, i);
    o.locals && (t.exports = o.locals);
  },
  function (t, e, n) {
    (t.exports = n(4)(!1)).push([
      t.i,
      'html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@keyframes morph{0%{border-radius:40% 60% 60% 40% / 70% 30% 70% 30%}100%{border-radius:40% 60%}}@keyframes spin{to{transform:rotate(1turn)}}*,*:before,*:after{box-sizing:border-box}html,body{background:#002;color:white;font-family:\'M PLUS Rounded 1c\', sans-serif;overflow-x:hidden}.alert{position:fixed;left:50%;top:30%;transform:translate(-50%, 0);color:#002;font-size:1.5rem;pointer-events:none;z-index:100;padding:1em;background:rgba(255,255,255,0.8);border-radius:0.5em;white-space:nowrap}.footer{background:rgba(255,255,255,0.15);min-height:2rem;text-align:center;color:rgba(255,255,255,0.6);font-size:0.875rem;line-height:1.2rem;padding:0.4rem 0}.footer__heart{padding:0 0.125em;color:#3023AE}.footer a{text-decoration:none;color:rgba(255,255,255,0.8)}.footer a:hover{text-decoration:underline}.header{margin:0 0 1rem;text-align:center;position:relative;z-index:10}.header__links{margin:0.5em auto 0;padding-top:0.25em;max-width:26.75rem;border-top:1px solid rgba(255,255,255,0.5)}.header__links a{font-size:0.75rem;color:#f09;text-decoration:none;padding:0 0.5rem;opacity:0.8;transition:opacity 0.3s ease-out;white-space:nowrap}.header__links a svg{width:1.35em;height:1.35em;display:inline-block;fill:#fff;vertical-align:-0.3em;margin-top:-0.125rem}.header__links a:hover{opacity:1}@media screen and (min-width: 33rem){.header__links{margin-top:1em;padding-top:0.5em}.header__links a{font-size:0.875rem}}h1{text-transform:uppercase;font-size:1.5rem;color:rgba(255,255,255,0.8);line-height:1;margin:0 0 0.125em;letter-spacing:0.01em;text-align:center}@media screen and (min-height: 36.25rem) and (min-width: 25rem){h1{font-size:2rem}}.container{min-height:calc(100vh - 2rem);padding-top:2rem;display:flex;flex-direction:column;align-items:stretch;justify-content:space-evenly;overflow:hidden;position:relative}.container::before,.container::after{content:"";width:70vmax;height:70vmax;position:absolute;background:rgba(255,255,255,0.07);left:-20vmin;top:-20vmin;animation:morph 15s linear infinite alternate, spin 20s linear infinite;z-index:1;will-change:border-radius, transform;transform-origin:55% 55%;pointer-events:none}.container::after{width:70vmin;height:70vmin;left:auto;right:-10vmin;top:auto;bottom:0;animation:morph 10s linear infinite alternate, spin 26s linear infinite reverse;transform-origin:20% 20%}.generator{width:60vmin;height:60vmin;border:2px dashed rgba(255,255,255,0.4);position:relative;z-index:3;margin-left:auto;margin-right:auto}@media screen and (min-width: 31.875rem){.generator{width:50vmin;height:50vmin}}.generator__shape{width:100%;height:100%;background:#f09;background-image:linear-gradient(45deg, #3023AE 0%, #f09 100%);border-radius:30% 70% 70% 30% / 30% 30% 70% 70%;box-shadow:-10vmin 10vmin 0 rgba(255,255,255,0.07)}.generator__shape--8v{border-radius:10%;background-image:linear-gradient(-225deg, #fff 0%, rgba(255,255,255,0) 40%, rgba(0,255,255,0) 60%, cyan 100%),linear-gradient(45deg, #3023AE 0%, #f09 100%)}.generator__handle{display:block;position:absolute;cursor:pointer;width:2.5rem;height:2.5rem}.generator__handle:before{content:"";position:absolute;width:1rem;height:1rem;left:.75rem;top:.75rem;background:#fff;border:2px solid #002;transition:box-shadow 0.2s ease-out;will-change:box-shadow}.generator__handle--second:before{background:#3023AE;border:2px solid #fff}.generator__handle--third:before{background:#f09;border:2px solid #fff}.generator__handle--fourth:before{background:#0ff}.generator__handle--8v.active:before,.generator__handle--8v:hover:before{box-shadow:0 0 0 4px #FFF;border:2px solid #002}.generator__handle:not(.generator__handle--8v).active:before,.generator__handle:not(.generator__handle--8v):hover:before{background:#0ff;box-shadow:0 0 0 4px #FFF;border:2px solid #002}.generator #top{top:-1.25rem;left:30%;transform:translateX(-50%)}.generator #top.generator__handle--8v{left:10%}.generator #bottom{bottom:-1.25rem;left:30%;transform:translateX(-50%)}.generator #bottom.generator__handle--8v{left:10%}.generator #left{left:-1.25rem;top:30%;transform:translateY(-50%)}.generator #left.generator__handle--8v{top:10%}.generator #right{right:-1.25rem;top:30%;transform:translateY(-50%)}.generator #right.generator__handle--8v{top:10%}.generator #topRight{top:-1.25rem;left:90%;transform:translateX(-50%)}.generator #bottomRight{bottom:-1.25rem;left:90%;transform:translateX(-50%)}.generator #leftBottom{left:-1.25rem;top:90%;transform:translateY(-50%)}.generator #rightBottom{right:-1.25rem;top:90%;transform:translateY(-50%)}.output{width:90%;text-align:left;margin-top:1.5em;font-size:1.125rem;line-height:1.5;margin-left:auto;margin-right:auto}.output__label{flex:0 0 auto;margin-bottom:0.5em;margin-right:1em;color:rgba(255,255,255,0.9)}.output__code{display:block;font-family:\'Ubuntu Mono\', monospace;flex-grow:1;color:#002;background:#ccc;padding:0.5em 0.625em;border-radius:2px;margin-bottom:0.5em}.output__button{display:block;border-radius:2px;background:#f09;border:none;color:rgba(255,255,255,0.9);padding:0.5em 1em;font-weight:bold;width:100%;transition:background 0.3s ease-out;will-change:background;cursor:pointer}.output__button:hover{background:#3023AE}@media screen and (min-width: 30.875rem){.output{font-size:1.25rem}.output__code{border-radius:2px 0 0 2px;flex-grow:1;margin-bottom:0}.output__button{flex-shrink:1;border-radius:0 2px 2px 0;width:auto;text-transform:uppercase;letter-spacing:0.1em}}@media screen and (min-width: 43rem){.output{display:flex;justify-content:stretch;align-items:baseline;max-width:39rem}}.advanced{width:90%;max-width:39rem;text-align:left;margin:0.5em auto;position:relative;z-index:5;display:flex;justify-content:space-between;align-items:center;color:rgba(255,255,255,0.9)}@media screen and (min-width: 560px){.advanced{font-size:1.25rem}}.advanced__switch{padding:0.5em 0;flex-shrink:0;margin-bottom:0.5em}.advanced__settings{display:none}.advanced__settings.visible{display:flex;justify-content:space-between;flex-direction:column}@media screen and (min-width: 31.25rem){.advanced__settings.visible{flex-direction:row}}.advanced__check{visibility:hidden;width:0;height:0;display:block;border:none}.advanced .input-group{align-items:center;margin-left:1em;margin-bottom:0.5em;justify-content:space-between;display:flex}.advanced .input-group label{display:block;margin-right:0.5em}.advanced .input-group input[type="number"]{width:4.5rem}.advanced__check:checked+.advanced__trigger span:after{background:#f09;left:1.15em;border-radius:37% 63% 55% 45% / 25% 50% 50% 75%}.advanced__trigger{display:block;line-height:1;cursor:pointer}.advanced__trigger span{display:inline-block;width:2em;height:1em;border-radius:0.5em;background:rgba(255,255,255,0.8);vertical-align:bottom;position:relative}@media screen and (min-width: 43rem){.advanced__trigger span{margin-left:2rem}}.advanced__trigger span:after{content:"";position:absolute;width:0.7em;height:0.7em;border-radius:50% 56% 29% 70% / 50% 73% 38% 50%;background:#002;position:absolute;left:0.15em;top:0.15em;transition:left 0.3s ease-out, background 0.3s ease-out, border-radius 0.4s ease-in-out}.input-group input{border-radius:2px;border:none;background:#fff;font-family:\'Ubuntu Mono\', monospace;color:#002;padding:0.5em 0.625em}@media screen and (min-width: 30.85rem){.input-group{display:flex;align-items:stretch;flex-grow:1;margin-bottom:0}}.company-link{z-index:200;width:14em;position:relative;display:flex;flex-direction:column;padding:0.5em 1em 0.75em;margin:2em auto;margin-bottom:1rem;background:rgba(255,255,255,0.15);border:1px solid #f09;color:#fff;font-size:1rem;text-align:center;text-decoration:none}.company-link:hover{background:rgba(255,255,255,0.3)}.company-link__label{margin-bottom:0.5em}@media screen and (min-width: 62rem) and (orientation: landscape){.company-link{margin:0;position:absolute;top:7%;right:1rem}}@media screen and (min-width: 82rem) and (orientation: landscape){.company-link{left:75%}}\n',
      ""
    ]);
  },
  function (t, e) {
    t.exports = function (t) {
      var e = [];
      return (
        (e.toString = function () {
          return this.map(function (e) {
            var n = (function (t, e) {
              var n = t[1] || "",
                o = t[3];
              if (!o) return n;
              if (e && "function" == typeof btoa) {
                var i =
                    ((a = o),
                    "/*# sourceMappingURL=data:application/json;charset=utf-8;base64," +
                      btoa(unescape(encodeURIComponent(JSON.stringify(a)))) +
                      " */"),
                  r = o.sources.map(function (t) {
                    return "/*# sourceURL=" + o.sourceRoot + t + " */";
                  });
                return [n].concat(r).concat([i]).join("\n");
              }
              var a;
              return [n].join("\n");
            })(e, t);
            return e[2] ? "@media " + e[2] + "{" + n + "}" : n;
          }).join("");
        }),
        (e.i = function (t, n) {
          "string" == typeof t && (t = [[null, t, ""]]);
          for (var o = {}, i = 0; i < this.length; i++) {
            var r = this[i][0];
            "number" == typeof r && (o[r] = !0);
          }
          for (i = 0; i < t.length; i++) {
            var a = t[i];
            ("number" == typeof a[0] && o[a[0]]) ||
              (n && !a[2]
                ? (a[2] = n)
                : n && (a[2] = "(" + a[2] + ") and (" + n + ")"),
              e.push(a));
          }
        }),
        e
      );
    };
  },
  function (t, e, n) {
    var o,
      i,
      r = {},
      a =
        ((o = function () {
          return window && document && document.all && !window.atob;
        }),
        function () {
          return void 0 === i && (i = o.apply(this, arguments)), i;
        }),
      s = function (t, e) {
        return e ? e.querySelector(t) : document.querySelector(t);
      },
      c = (function (t) {
        var e = {};
        return function (t, n) {
          if ("function" == typeof t) return t();
          if (void 0 === e[t]) {
            var o = s.call(this, t, n);
            if (
              window.HTMLIFrameElement &&
              o instanceof window.HTMLIFrameElement
            )
              try {
                o = o.contentDocument.head;
              } catch (t) {
                o = null;
              }
            e[t] = o;
          }
          return e[t];
        };
      })(),
      u = null,
      l = 0,
      d = [],
      f = n(6);
    function h(t, e) {
      for (var n = 0; n < t.length; n++) {
        var o = t[n],
          i = r[o.id];
        if (i) {
          i.refs++;
          for (var a = 0; a < i.parts.length; a++) i.parts[a](o.parts[a]);
          for (; a < o.parts.length; a++) i.parts.push(y(o.parts[a], e));
        } else {
          var s = [];
          for (a = 0; a < o.parts.length; a++) s.push(y(o.parts[a], e));
          r[o.id] = { id: o.id, refs: 1, parts: s };
        }
      }
    }
    function p(t, e) {
      for (var n = [], o = {}, i = 0; i < t.length; i++) {
        var r = t[i],
          a = e.base ? r[0] + e.base : r[0],
          s = { css: r[1], media: r[2], sourceMap: r[3] };
        o[a] ? o[a].parts.push(s) : n.push((o[a] = { id: a, parts: [s] }));
      }
      return n;
    }
    function m(t, e) {
      var n = c(t.insertInto);
      if (!n)
        throw new Error(
          "Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid."
        );
      var o = d[d.length - 1];
      if ("top" === t.insertAt)
        o
          ? o.nextSibling
            ? n.insertBefore(e, o.nextSibling)
            : n.appendChild(e)
          : n.insertBefore(e, n.firstChild),
          d.push(e);
      else if ("bottom" === t.insertAt) n.appendChild(e);
      else {
        if ("object" != typeof t.insertAt || !t.insertAt.before)
          throw new Error(
            "[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n"
          );
        var i = c(t.insertAt.before, n);
        n.insertBefore(e, i);
      }
    }
    function g(t) {
      if (null === t.parentNode) return !1;
      t.parentNode.removeChild(t);
      var e = d.indexOf(t);
      e >= 0 && d.splice(e, 1);
    }
    function b(t) {
      var e = document.createElement("style");
      if (
        (void 0 === t.attrs.type && (t.attrs.type = "text/css"),
        void 0 === t.attrs.nonce)
      ) {
        var o = (function () {
          0;
          return n.nc;
        })();
        o && (t.attrs.nonce = o);
      }
      return v(e, t.attrs), m(t, e), e;
    }
    function v(t, e) {
      Object.keys(e).forEach(function (n) {
        t.setAttribute(n, e[n]);
      });
    }
    function y(t, e) {
      var n, o, i, r;
      if (e.transform && t.css) {
        if (
          !(r =
            "function" == typeof e.transform
              ? e.transform(t.css)
              : e.transform.default(t.css))
        )
          return function () {};
        t.css = r;
      }
      if (e.singleton) {
        var a = l++;
        (n = u || (u = b(e))),
          (o = _.bind(null, n, a, !1)),
          (i = _.bind(null, n, a, !0));
      } else
        t.sourceMap &&
        "function" == typeof URL &&
        "function" == typeof URL.createObjectURL &&
        "function" == typeof URL.revokeObjectURL &&
        "function" == typeof Blob &&
        "function" == typeof btoa
          ? ((n = (function (t) {
              var e = document.createElement("link");
              return (
                void 0 === t.attrs.type && (t.attrs.type = "text/css"),
                (t.attrs.rel = "stylesheet"),
                v(e, t.attrs),
                m(t, e),
                e
              );
            })(e)),
            (o = E.bind(null, n, e)),
            (i = function () {
              g(n), n.href && URL.revokeObjectURL(n.href);
            }))
          : ((n = b(e)),
            (o = k.bind(null, n)),
            (i = function () {
              g(n);
            }));
      return (
        o(t),
        function (e) {
          if (e) {
            if (
              e.css === t.css &&
              e.media === t.media &&
              e.sourceMap === t.sourceMap
            )
              return;
            o((t = e));
          } else i();
        }
      );
    }
    t.exports = function (t, e) {
      if ("undefined" != typeof DEBUG && DEBUG && "object" != typeof document)
        throw new Error(
          "The style-loader cannot be used in a non-browser environment"
        );
      ((e = e || {}).attrs = "object" == typeof e.attrs ? e.attrs : {}),
        e.singleton || "boolean" == typeof e.singleton || (e.singleton = a()),
        e.insertInto || (e.insertInto = "head"),
        e.insertAt || (e.insertAt = "bottom");
      var n = p(t, e);
      return (
        h(n, e),
        function (t) {
          for (var o = [], i = 0; i < n.length; i++) {
            var a = n[i];
            (s = r[a.id]).refs--, o.push(s);
          }
          t && h(p(t, e), e);
          for (i = 0; i < o.length; i++) {
            var s;
            if (0 === (s = o[i]).refs) {
              for (var c = 0; c < s.parts.length; c++) s.parts[c]();
              delete r[s.id];
            }
          }
        }
      );
    };
    var w,
      x =
        ((w = []),
        function (t, e) {
          return (w[t] = e), w.filter(Boolean).join("\n");
        });
    function _(t, e, n, o) {
      var i = n ? "" : o.css;
      if (t.styleSheet) t.styleSheet.cssText = x(e, i);
      else {
        var r = document.createTextNode(i),
          a = t.childNodes;
        a[e] && t.removeChild(a[e]),
          a.length ? t.insertBefore(r, a[e]) : t.appendChild(r);
      }
    }
    function k(t, e) {
      var n = e.css,
        o = e.media;
      if ((o && t.setAttribute("media", o), t.styleSheet))
        t.styleSheet.cssText = n;
      else {
        for (; t.firstChild; ) t.removeChild(t.firstChild);
        t.appendChild(document.createTextNode(n));
      }
    }
    function E(t, e, n) {
      var o = n.css,
        i = n.sourceMap,
        r = void 0 === e.convertToAbsoluteUrls && i;
      (e.convertToAbsoluteUrls || r) && (o = f(o)),
        i &&
          (o +=
            "\n/*# sourceMappingURL=data:application/json;base64," +
            btoa(unescape(encodeURIComponent(JSON.stringify(i)))) +
            " */");
      var a = new Blob([o], { type: "text/css" }),
        s = t.href;
      (t.href = URL.createObjectURL(a)), s && URL.revokeObjectURL(s);
    }
  },
  function (t, e) {
    t.exports = function (t) {
      var e = "undefined" != typeof window && window.location;
      if (!e) throw new Error("fixUrls requires window.location");
      if (!t || "string" != typeof t) return t;
      var n = e.protocol + "//" + e.host,
        o = n + e.pathname.replace(/\/[^\/]*$/, "/");
      return t.replace(
        /url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,
        function (t, e) {
          var i,
            r = e
              .trim()
              .replace(/^"(.*)"$/, function (t, e) {
                return e;
              })
              .replace(/^'(.*)'$/, function (t, e) {
                return e;
              });
          return /^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(r)
            ? t
            : ((i =
                0 === r.indexOf("//")
                  ? r
                  : 0 === r.indexOf("/")
                  ? n + r
                  : o + r.replace(/^\.\//, "")),
              "url(" + JSON.stringify(i) + ")");
        }
      );
    };
  },
  function (t, e, n) {
    (function (t, n) {
      !(function () {
        "use strict";
        function e(t) {
          var e = this.constructor;
          return this.then(
            function (n) {
              return e.resolve(t()).then(function () {
                return n;
              });
            },
            function (n) {
              return e.resolve(t()).then(function () {
                return e.reject(n);
              });
            }
          );
        }
        function o(t) {
          return !(!t || void 0 === t.length);
        }
        function i() {}
        function r(t) {
          if (!(this instanceof r))
            throw new TypeError("Promises must be constructed via new");
          if ("function" != typeof t) throw new TypeError("not a function");
          (this._state = 0),
            (this._handled = !1),
            (this._value = void 0),
            (this._deferreds = []),
            l(t, this);
        }
        function a(t, e) {
          for (; 3 === t._state; ) t = t._value;
          0 !== t._state
            ? ((t._handled = !0),
              r._immediateFn(function () {
                var n = 1 === t._state ? e.onFulfilled : e.onRejected;
                if (null !== n) {
                  var o;
                  try {
                    o = n(t._value);
                  } catch (t) {
                    return void c(e.promise, t);
                  }
                  s(e.promise, o);
                } else (1 === t._state ? s : c)(e.promise, t._value);
              }))
            : t._deferreds.push(e);
        }
        function s(t, e) {
          try {
            if (e === t)
              throw new TypeError("A promise cannot be resolved with itself.");
            if (e && ("object" == typeof e || "function" == typeof e)) {
              var n = e.then;
              if (e instanceof r)
                return (t._state = 3), (t._value = e), void u(t);
              if ("function" == typeof n)
                return void l(
                  (function (t, e) {
                    return function () {
                      t.apply(e, arguments);
                    };
                  })(n, e),
                  t
                );
            }
            (t._state = 1), (t._value = e), u(t);
          } catch (e) {
            c(t, e);
          }
        }
        function c(t, e) {
          (t._state = 2), (t._value = e), u(t);
        }
        function u(t) {
          2 === t._state &&
            0 === t._deferreds.length &&
            r._immediateFn(function () {
              t._handled || r._unhandledRejectionFn(t._value);
            });
          for (var e = 0, n = t._deferreds.length; n > e; e++)
            a(t, t._deferreds[e]);
          t._deferreds = null;
        }
        function l(t, e) {
          var n = !1;
          try {
            t(
              function (t) {
                n || ((n = !0), s(e, t));
              },
              function (t) {
                n || ((n = !0), c(e, t));
              }
            );
          } catch (t) {
            if (n) return;
            (n = !0), c(e, t);
          }
        }
        var d = setTimeout;
        (r.prototype.catch = function (t) {
          return this.then(null, t);
        }),
          (r.prototype.then = function (t, e) {
            var n = new this.constructor(i);
            return (
              a(
                this,
                new (function (t, e, n) {
                  (this.onFulfilled = "function" == typeof t ? t : null),
                    (this.onRejected = "function" == typeof e ? e : null),
                    (this.promise = n);
                })(t, e, n)
              ),
              n
            );
          }),
          (r.prototype.finally = e),
          (r.all = function (t) {
            return new r(function (e, n) {
              function i(t, o) {
                try {
                  if (o && ("object" == typeof o || "function" == typeof o)) {
                    var s = o.then;
                    if ("function" == typeof s)
                      return void s.call(
                        o,
                        function (e) {
                          i(t, e);
                        },
                        n
                      );
                  }
                  (r[t] = o), 0 == --a && e(r);
                } catch (t) {
                  n(t);
                }
              }
              if (!o(t))
                return n(new TypeError("Promise.all accepts an array"));
              var r = Array.prototype.slice.call(t);
              if (0 === r.length) return e([]);
              for (var a = r.length, s = 0; r.length > s; s++) i(s, r[s]);
            });
          }),
          (r.resolve = function (t) {
            return t && "object" == typeof t && t.constructor === r
              ? t
              : new r(function (e) {
                  e(t);
                });
          }),
          (r.reject = function (t) {
            return new r(function (e, n) {
              n(t);
            });
          }),
          (r.race = function (t) {
            return new r(function (e, n) {
              if (!o(t))
                return n(new TypeError("Promise.race accepts an array"));
              for (var i = 0, a = t.length; a > i; i++)
                r.resolve(t[i]).then(e, n);
            });
          }),
          (r._immediateFn =
            ("function" == typeof t &&
              function (e) {
                t(e);
              }) ||
            function (t) {
              d(t, 0);
            }),
          (r._unhandledRejectionFn = function (t) {
            void 0 !== console &&
              console &&
              console.warn("Possible Unhandled Promise Rejection:", t);
          });
        var f = (function () {
          if ("undefined" != typeof self) return self;
          if ("undefined" != typeof window) return window;
          if (void 0 !== n) return n;
          throw Error("unable to locate global object");
        })();
        "Promise" in f
          ? f.Promise.prototype.finally || (f.Promise.prototype.finally = e)
          : (f.Promise = r);
      })(),
        (function (t) {
          "use strict";
          function e(t, e, n, o) {
            return new (n || (n = Promise))(function (i, r) {
              function a(t) {
                try {
                  c(o.next(t));
                } catch (t) {
                  r(t);
                }
              }
              function s(t) {
                try {
                  c(o.throw(t));
                } catch (t) {
                  r(t);
                }
              }
              function c(t) {
                t.done
                  ? i(t.value)
                  : new n(function (e) {
                      e(t.value);
                    }).then(a, s);
              }
              c((o = o.apply(t, e || [])).next());
            });
          }
          function n(t, e) {
            var n,
              o,
              i,
              r,
              a = {
                label: 0,
                sent: function () {
                  if (1 & i[0]) throw i[1];
                  return i[1];
                },
                trys: [],
                ops: []
              };
            return (
              (r = { next: s(0), throw: s(1), return: s(2) }),
              "function" == typeof Symbol &&
                (r[Symbol.iterator] = function () {
                  return this;
                }),
              r
            );
            function s(r) {
              return function (s) {
                return (function (r) {
                  if (n) throw new TypeError("Generator is already executing.");
                  for (; a; )
                    try {
                      if (
                        ((n = 1),
                        o &&
                          (i =
                            2 & r[0]
                              ? o.return
                              : r[0]
                              ? o.throw || ((i = o.return) && i.call(o), 0)
                              : o.next) &&
                          !(i = i.call(o, r[1])).done)
                      )
                        return i;
                      switch (((o = 0), i && (r = [2 & r[0], i.value]), r[0])) {
                        case 0:
                        case 1:
                          i = r;
                          break;
                        case 4:
                          return a.label++, { value: r[1], done: !1 };
                        case 5:
                          a.label++, (o = r[1]), (r = [0]);
                          continue;
                        case 7:
                          (r = a.ops.pop()), a.trys.pop();
                          continue;
                        default:
                          if (
                            !(i = (i = a.trys).length > 0 && i[i.length - 1]) &&
                            (6 === r[0] || 2 === r[0])
                          ) {
                            a = 0;
                            continue;
                          }
                          if (
                            3 === r[0] &&
                            (!i || (r[1] > i[0] && r[1] < i[3]))
                          ) {
                            a.label = r[1];
                            break;
                          }
                          if (6 === r[0] && a.label < i[1]) {
                            (a.label = i[1]), (i = r);
                            break;
                          }
                          if (i && a.label < i[2]) {
                            (a.label = i[2]), a.ops.push(r);
                            break;
                          }
                          i[2] && a.ops.pop(), a.trys.pop();
                          continue;
                      }
                      r = e.call(t, a);
                    } catch (t) {
                      (r = [6, t]), (o = 0);
                    } finally {
                      n = i = 0;
                    }
                  if (5 & r[0]) throw r[1];
                  return { value: r[0] ? r[1] : void 0, done: !0 };
                })([r, s]);
              };
            }
          }
          var o = ["text/plain", "text/html"],
            i = function () {
              (console.warn || console.log).call(arguments);
            }.bind(console, "[clipboard-polyfill]"),
            r = !0,
            a = (function () {
              function t() {
                this.m = {};
              }
              return (
                (t.prototype.setData = function (t, e) {
                  r &&
                    -1 === o.indexOf(t) &&
                    i(
                      "Unknown data type: " + t,
                      "Call clipboard.suppressWarnings() to suppress this warning."
                    ),
                    (this.m[t] = e);
                }),
                (t.prototype.getData = function (t) {
                  return this.m[t];
                }),
                (t.prototype.forEach = function (t) {
                  for (var e in this.m) t(this.m[e], e);
                }),
                t
              );
            })(),
            s = function (t) {},
            c = !0,
            u = function () {
              (console.warn || console.log).apply(console, arguments);
            }.bind("[clipboard-polyfill]"),
            l = "text/plain";
          function d(t) {
            s = t;
          }
          function f() {
            (c = !1), (r = !1);
          }
          function h(t) {
            return e(this, void 0, void 0, function () {
              var e;
              return n(this, function (n) {
                if (
                  (c &&
                    !t.getData(l) &&
                    u(
                      "clipboard.write() was called without a `text/plain` data type. On some platforms, this may result in an empty clipboard. Call clipboard.suppressWarnings() to suppress this warning."
                    ),
                  I())
                ) {
                  if (
                    (function (t) {
                      var e = t.getData(l);
                      if (void 0 !== e)
                        return window.clipboardData.setData("Text", e);
                      throw new Error("No `text/plain` value was specified.");
                    })(t)
                  )
                    return [2];
                  throw new Error(
                    "Copying failed, possibly because the user rejected it."
                  );
                }
                if (x(t)) return s("regular execCopy worked"), [2];
                if (navigator.userAgent.indexOf("Edge") > -1)
                  return s('UA "Edge" => assuming success'), [2];
                if (_(document.body, t))
                  return s("copyUsingTempSelection worked"), [2];
                if (
                  (function (t) {
                    var e = document.createElement("div");
                    e.setAttribute(
                      "style",
                      "-webkit-user-select: text !important"
                    ),
                      (e.textContent = "temporary element"),
                      document.body.appendChild(e);
                    var n = _(e, t);
                    return document.body.removeChild(e), n;
                  })(t)
                )
                  return s("copyUsingTempElem worked"), [2];
                if (
                  void 0 !== (e = t.getData(l)) &&
                  (function (t) {
                    s("copyTextUsingDOM");
                    var e = document.createElement("div");
                    e.setAttribute(
                      "style",
                      "-webkit-user-select: text !important"
                    );
                    var n = e;
                    e.attachShadow &&
                      (s("Using shadow DOM."),
                      (n = e.attachShadow({ mode: "open" })));
                    var o = document.createElement("span");
                    (o.innerText = t),
                      n.appendChild(o),
                      document.body.appendChild(e),
                      k(o);
                    var i = document.execCommand("copy");
                    return E(), document.body.removeChild(e), i;
                  })(e)
                )
                  return s("copyTextUsingDOM worked"), [2];
                throw new Error("Copy command failed.");
              });
            });
          }
          function p(t) {
            return e(this, void 0, void 0, function () {
              return n(this, function (e) {
                return navigator.clipboard && navigator.clipboard.writeText
                  ? (s("Using `navigator.clipboard.writeText()`."),
                    [2, navigator.clipboard.writeText(t)])
                  : [2, h(T(t))];
              });
            });
          }
          function m() {
            return e(this, void 0, void 0, function () {
              var t;
              return n(this, function (e) {
                switch (e.label) {
                  case 0:
                    return (t = T), [4, g()];
                  case 1:
                    return [2, t.apply(void 0, [e.sent()])];
                }
              });
            });
          }
          function g() {
            return e(this, void 0, void 0, function () {
              return n(this, function (t) {
                if (navigator.clipboard && navigator.clipboard.readText)
                  return (
                    s("Using `navigator.clipboard.readText()`."),
                    [2, navigator.clipboard.readText()]
                  );
                if (I()) return s("Reading text using IE strategy."), [2, R()];
                throw new Error("Read is not supported in your browser.");
              });
            });
          }
          var b = !1;
          function v() {
            b ||
              (c &&
                u(
                  'The deprecated default object of `clipboard-polyfill` was called. Please switch to `import * as clipboard from "clipboard-polyfill"` and see https://github.com/lgarron/clipboard-polyfill/issues/101 for more info.'
                ),
              (b = !0));
          }
          var y = {
              DT: a,
              setDebugLog: function (t) {
                return v(), d(t);
              },
              suppressWarnings: function () {
                return v(), f();
              },
              write: function (t) {
                return e(this, void 0, void 0, function () {
                  return n(this, function (e) {
                    return v(), [2, h(t)];
                  });
                });
              },
              writeText: function (t) {
                return e(this, void 0, void 0, function () {
                  return n(this, function (e) {
                    return v(), [2, p(t)];
                  });
                });
              },
              read: function () {
                return e(this, void 0, void 0, function () {
                  return n(this, function (t) {
                    return v(), [2, m()];
                  });
                });
              },
              readText: function () {
                return e(this, void 0, void 0, function () {
                  return n(this, function (t) {
                    return v(), [2, g()];
                  });
                });
              }
            },
            w = function () {
              this.success = !1;
            };
          function x(t) {
            var e = new w(),
              n = function (t, e, n) {
                s("listener called"),
                  (t.success = !0),
                  e.forEach(function (e, o) {
                    var i = n.clipboardData;
                    i.setData(o, e),
                      o === l &&
                        i.getData(o) !== e &&
                        (s("setting text/plain failed"), (t.success = !1));
                  }),
                  n.preventDefault();
              }.bind(this, e, t);
            document.addEventListener("copy", n);
            try {
              document.execCommand("copy");
            } finally {
              document.removeEventListener("copy", n);
            }
            return e.success;
          }
          function _(t, e) {
            k(t);
            var n = x(e);
            return E(), n;
          }
          function k(t) {
            var e = document.getSelection();
            if (e) {
              var n = document.createRange();
              n.selectNodeContents(t), e.removeAllRanges(), e.addRange(n);
            }
          }
          function E() {
            var t = document.getSelection();
            t && t.removeAllRanges();
          }
          function T(t) {
            var e = new a();
            return e.setData(l, t), e;
          }
          function I() {
            return (
              "undefined" == typeof ClipboardEvent &&
              void 0 !== window.clipboardData &&
              void 0 !== window.clipboardData.setData
            );
          }
          function R() {
            return e(this, void 0, void 0, function () {
              var t;
              return n(this, function (e) {
                if ("" === (t = window.clipboardData.getData("Text")))
                  throw new Error(
                    "Empty clipboard or could not read plain text from clipboard"
                  );
                return [2, t];
              });
            });
          }
          (t.DT = a),
            (t.default = y),
            (t.read = m),
            (t.readText = g),
            (t.setDebugLog = d),
            (t.suppressWarnings = f),
            (t.write = h),
            (t.writeText = p),
            Object.defineProperty(t, "__esModule", { value: !0 });
        })(e);
    }.call(this, n(8).setImmediate, n(0)));
  },
  function (t, e, n) {
    (function (t) {
      var o =
          (void 0 !== t && t) || ("undefined" != typeof self && self) || window,
        i = Function.prototype.apply;
      function r(t, e) {
        (this._id = t), (this._clearFn = e);
      }
      (e.setTimeout = function () {
        return new r(i.call(setTimeout, o, arguments), clearTimeout);
      }),
        (e.setInterval = function () {
          return new r(i.call(setInterval, o, arguments), clearInterval);
        }),
        (e.clearTimeout = e.clearInterval = function (t) {
          t && t.close();
        }),
        (r.prototype.unref = r.prototype.ref = function () {}),
        (r.prototype.close = function () {
          this._clearFn.call(o, this._id);
        }),
        (e.enroll = function (t, e) {
          clearTimeout(t._idleTimeoutId), (t._idleTimeout = e);
        }),
        (e.unenroll = function (t) {
          clearTimeout(t._idleTimeoutId), (t._idleTimeout = -1);
        }),
        (e._unrefActive = e.active = function (t) {
          clearTimeout(t._idleTimeoutId);
          var e = t._idleTimeout;
          e >= 0 &&
            (t._idleTimeoutId = setTimeout(function () {
              t._onTimeout && t._onTimeout();
            }, e));
        }),
        n(9),
        (e.setImmediate =
          ("undefined" != typeof self && self.setImmediate) ||
          (void 0 !== t && t.setImmediate) ||
          (this && this.setImmediate)),
        (e.clearImmediate =
          ("undefined" != typeof self && self.clearImmediate) ||
          (void 0 !== t && t.clearImmediate) ||
          (this && this.clearImmediate));
    }.call(this, n(0)));
  },
  function (t, e, n) {
    (function (t, e) {
      !(function (t, n) {
        "use strict";
        if (!t.setImmediate) {
          var o,
            i,
            r,
            a,
            s,
            c = 1,
            u = {},
            l = !1,
            d = t.document,
            f = Object.getPrototypeOf && Object.getPrototypeOf(t);
          (f = f && f.setTimeout ? f : t),
            "[object process]" === {}.toString.call(t.process)
              ? (o = function (t) {
                  e.nextTick(function () {
                    p(t);
                  });
                })
              : !(function () {
                  if (t.postMessage && !t.importScripts) {
                    var e = !0,
                      n = t.onmessage;
                    return (
                      (t.onmessage = function () {
                        e = !1;
                      }),
                      t.postMessage("", "*"),
                      (t.onmessage = n),
                      e
                    );
                  }
                })()
              ? t.MessageChannel
                ? (((r = new MessageChannel()).port1.onmessage = function (t) {
                    p(t.data);
                  }),
                  (o = function (t) {
                    r.port2.postMessage(t);
                  }))
                : d && "onreadystatechange" in d.createElement("script")
                ? ((i = d.documentElement),
                  (o = function (t) {
                    var e = d.createElement("script");
                    (e.onreadystatechange = function () {
                      p(t),
                        (e.onreadystatechange = null),
                        i.removeChild(e),
                        (e = null);
                    }),
                      i.appendChild(e);
                  }))
                : (o = function (t) {
                    setTimeout(p, 0, t);
                  })
              : ((a = "setImmediate$" + Math.random() + "$"),
                (s = function (e) {
                  e.source === t &&
                    "string" == typeof e.data &&
                    0 === e.data.indexOf(a) &&
                    p(+e.data.slice(a.length));
                }),
                t.addEventListener
                  ? t.addEventListener("message", s, !1)
                  : t.attachEvent("onmessage", s),
                (o = function (e) {
                  t.postMessage(a + e, "*");
                })),
            (f.setImmediate = function (t) {
              "function" != typeof t && (t = new Function("" + t));
              for (
                var e = new Array(arguments.length - 1), n = 0;
                n < e.length;
                n++
              )
                e[n] = arguments[n + 1];
              var i = { callback: t, args: e };
              return (u[c] = i), o(c), c++;
            }),
            (f.clearImmediate = h);
        }
        function h(t) {
          delete u[t];
        }
        function p(t) {
          if (l) setTimeout(p, 0, t);
          else {
            var e = u[t];
            if (e) {
              l = !0;
              try {
                !(function (t) {
                  var e = t.callback,
                    n = t.args;
                  switch (n.length) {
                    case 0:
                      e();
                      break;
                    case 1:
                      e(n[0]);
                      break;
                    case 2:
                      e(n[0], n[1]);
                      break;
                    case 3:
                      e(n[0], n[1], n[2]);
                      break;
                    default:
                      e.apply(void 0, n);
                  }
                })(e);
              } finally {
                h(t), (l = !1);
              }
            }
          }
        }
      })("undefined" == typeof self ? (void 0 === t ? this : t) : self);
    }.call(this, n(0), n(10)));
  },
  function (t, e) {
    var n,
      o,
      i = (t.exports = {});
    function r() {
      throw new Error("setTimeout has not been defined");
    }
    function a() {
      throw new Error("clearTimeout has not been defined");
    }
    function s(t) {
      if (n === setTimeout) return setTimeout(t, 0);
      if ((n === r || !n) && setTimeout)
        return (n = setTimeout), setTimeout(t, 0);
      try {
        return n(t, 0);
      } catch (e) {
        try {
          return n.call(null, t, 0);
        } catch (e) {
          return n.call(this, t, 0);
        }
      }
    }
    !(function () {
      try {
        n = "function" == typeof setTimeout ? setTimeout : r;
      } catch (t) {
        n = r;
      }
      try {
        o = "function" == typeof clearTimeout ? clearTimeout : a;
      } catch (t) {
        o = a;
      }
    })();
    var c,
      u = [],
      l = !1,
      d = -1;
    function f() {
      l &&
        c &&
        ((l = !1), c.length ? (u = c.concat(u)) : (d = -1), u.length && h());
    }
    function h() {
      if (!l) {
        var t = s(f);
        l = !0;
        for (var e = u.length; e; ) {
          for (c = u, u = []; ++d < e; ) c && c[d].run();
          (d = -1), (e = u.length);
        }
        (c = null),
          (l = !1),
          (function (t) {
            if (o === clearTimeout) return clearTimeout(t);
            if ((o === a || !o) && clearTimeout)
              return (o = clearTimeout), clearTimeout(t);
            try {
              o(t);
            } catch (e) {
              try {
                return o.call(null, t);
              } catch (e) {
                return o.call(this, t);
              }
            }
          })(t);
      }
    }
    function p(t, e) {
      (this.fun = t), (this.array = e);
    }
    function m() {}
    (i.nextTick = function (t) {
      var e = new Array(arguments.length - 1);
      if (arguments.length > 1)
        for (var n = 1; n < arguments.length; n++) e[n - 1] = arguments[n];
      u.push(new p(t, e)), 1 !== u.length || l || s(h);
    }),
      (p.prototype.run = function () {
        this.fun.apply(null, this.array);
      }),
      (i.title = "browser"),
      (i.browser = !0),
      (i.env = {}),
      (i.argv = []),
      (i.version = ""),
      (i.versions = {}),
      (i.on = m),
      (i.addListener = m),
      (i.once = m),
      (i.off = m),
      (i.removeListener = m),
      (i.removeAllListeners = m),
      (i.emit = m),
      (i.prependListener = m),
      (i.prependOnceListener = m),
      (i.listeners = function (t) {
        return [];
      }),
      (i.binding = function (t) {
        throw new Error("process.binding is not supported");
      }),
      (i.cwd = function () {
        return "/";
      }),
      (i.chdir = function (t) {
        throw new Error("process.chdir is not supported");
      }),
      (i.umask = function () {
        return 0;
      });
  },
  function (t, e, n) {
    "use strict";
    n.r(e);
    n(2);
    var o = n(1),
      i = n.n(o);
    function r(t, e) {
      if (!(t instanceof e))
        throw new TypeError("Cannot call a class as a function");
    }
    function a(t, e) {
      for (var n = 0; n < e.length; n++) {
        var o = e[n];
        (o.enumerable = o.enumerable || !1),
          (o.configurable = !0),
          "value" in o && (o.writable = !0),
          Object.defineProperty(t, o.key, o);
      }
    }
    var s = (function () {
      function t() {
        var e = this,
          n =
            arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
          o = n.shapeElemId,
          i = void 0 === o ? "shape" : o,
          a = n.generatorElemId,
          s = void 0 === a ? "code" : a,
          c = n.copyCodeId,
          u = void 0 === c ? "copy" : c,
          l = n.copiedCodeId,
          d = void 0 === l ? "clipboard_copied" : l,
          f = n.boxContainerId,
          h = void 0 === f ? "box" : f,
          p = n.widthInputId,
          m = void 0 === p ? "width" : p,
          g = n.heightInputId,
          b = void 0 === g ? "height" : g,
          v = n.enableAdvancedId,
          y = void 0 === v ? "enable-advanced" : v,
          w = n.initState,
          x = void 0 === w ? null : w,
          _ = n.moveableElems;
        r(this, t),
          (this.generatorElem = document.getElementById(s)),
          (this.shapeElem = document.getElementById(i)),
          (this.copiedCode = document.getElementById(d)),
          (this.boxContainer = document.getElementById(h)),
          (this.widthInput = document.getElementById(m)),
          (this.heightInput = document.getElementById(b)),
          (this.widthInput.onchange = function () {
            e.updateState(e.widthInput.value, "width");
          }),
          (this.heightInput.onchange = function () {
            e.updateState(e.heightInput.value, "height");
          }),
          (this.enableAdvanced = document.getElementById(y)),
          (this.enableAdvanced.onclick = this.enableAdvancedOnClick.bind(this)),
          this.initState(x),
          this.initAdvanced(),
          (this.handles = this.initHandles(_)),
          (document.getElementById(u).onclick = this.setClipboard.bind(this));
      }
      var e, n, o;
      return (
        (e = t),
        (o = [
          {
            key: "loadUrlParams",
            value: function (t) {
              var e,
                n = /#(\d\d?|100)\.(\d\d?|100)\.(\d\d?|100)\.(\d\d?|100)-(?:(\d\d?|100)\.(\d\d?|100)\.(\d\d?|100)\.(\d\d?|100))?-(\d*).(\d*)/gm,
                o = [
                  "left",
                  "top",
                  "right",
                  "bottom",
                  "leftBottom",
                  "topRight",
                  "rightBottom",
                  "bottomRight",
                  "height",
                  "width"
                ],
                i = {};
              if (!n.test(t)) return null;
              for (n.lastIndex = 0; null !== (e = n.exec(t)); )
                e.forEach(function (t, e) {
                  0 != e && (i[o[e - 1]] = t);
                });
              return i;
            }
          }
        ]),
        (n = [
          {
            key: "initHandles",
            value: function (t) {
              throw new Error("You have to implement the method initHandles!");
            }
          },
          {
            key: "updateBorderRadius",
            value: function () {
              throw new Error(
                "You have to implement the method updateBorderRadius!"
              );
            }
          },
          {
            key: "initState",
            value: function (t) {
              throw new Error("You have to implement the method initState!");
            }
          },
          {
            key: "initAdvanced",
            value: function () {
              "" !== this.state.width &&
                "" !== this.state.height &&
                ((this.enableAdvanced.checked = !0),
                document
                  .getElementById("dimension-input")
                  .classList.add("visible"));
            }
          },
          {
            key: "enableAdvancedOnClick",
            value: function (t) {
              this.enableAdvanced.checked
                ? (document
                    .getElementById("dimension-input")
                    .classList.add("visible"),
                  (this.state.width = this.boxContainer.offsetWidth),
                  (this.state.height = this.boxContainer.offsetHeight),
                  this.updateUI())
                : (document
                    .getElementById("dimension-input")
                    .classList.remove("visible"),
                  this.updateState("", "width"),
                  this.updateState("", "height"),
                  (this.boxContainer.style.height = ""),
                  (this.boxContainer.style.width = ""));
            }
          },
          {
            key: "setClipboard",
            value: function () {
              var t = this;
              i.a.writeText(this.generatorElem.innerHTML).then(
                function () {
                  t.copiedCode.innerHTML =
                    '<div class="alert">Copied to clipboard 👍</div>';
                },
                function () {
                  t.copiedCode.innerHTML =
                    '<div class="alert">💔 Not Supported</div>';
                }
              ),
                setTimeout(function () {
                  t.copiedCode.innerHTML = "";
                }, 2e3);
            }
          },
          {
            key: "setUrlHash",
            value: function (t) {
              window.history && "pushState" in window.history
                ? history.pushState(null, null, "#" + t)
                : (window.location.hash = t);
            }
          },
          {
            key: "updateState",
            value: function (t, e) {
              (this.state[e] = t), this.updateUI();
            }
          },
          {
            key: "updateUI",
            value: function () {
              this.updateBorderRadius(), this.updateBox();
            }
          },
          {
            key: "updateBox",
            value: function () {
              if (this.enableAdvanced.checked) {
                var t = "" == this.state.height ? "" : this.state.height + "px",
                  e = "" == this.state.width ? "" : this.state.width + "px";
                (this.boxContainer.style.height = t),
                  (this.boxContainer.style.width = e),
                  (this.heightInput.value = this.state.height),
                  (this.widthInput.value = this.state.width);
              }
            }
          },
          {
            key: "saveUrlParams",
            value: function () {
              throw new Error(
                "You have to implement the method saveUrlParams!"
              );
            }
          }
        ]) && a(e.prototype, n),
        o && a(e, o),
        t
      );
    })();
    function c(t, e) {
      if (!(t instanceof e))
        throw new TypeError("Cannot call a class as a function");
    }
    function u(t, e) {
      for (var n = 0; n < e.length; n++) {
        var o = e[n];
        (o.enumerable = o.enumerable || !1),
          (o.configurable = !0),
          "value" in o && (o.writable = !0),
          Object.defineProperty(t, o.key, o);
      }
    }
    var l = (function () {
      function t(e, n) {
        var o =
            arguments.length > 2 && void 0 !== arguments[2]
              ? arguments[2]
              : "x",
          i =
            arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 30,
          r =
            arguments.length > 4 && void 0 !== arguments[4]
              ? arguments[4]
              : function () {};
        c(this, t),
          (this.axis = o),
          (this.pos = i),
          (this.elem = e),
          (this.onChange = n),
          (this.onDragEnd = r),
          (this.elem.onmousedown = this.dragMouseDown.bind(this)),
          (this.elem.ontouchstart = this.dragMouseDown.bind(this)),
          this.setInitPos(i),
          this.onChange(this.pos, this.elem.id);
      }
      var e, n, o;
      return (
        (e = t),
        (n = [
          {
            key: "dragMouseDown",
            value: function (t) {
              (t = t || window.event).preventDefault(),
                (this.currentSpan = t.target),
                this.currentSpan.classList.add("active"),
                (document.onmouseup = this.closeDragElement.bind(this)),
                (document.ontouchend = this.closeDragElement.bind(this)),
                (document.onmousemove = this.elementDrag.bind(this)),
                (document.ontouchmove = this.elementDrag.bind(this));
            }
          },
          {
            key: "elementDrag",
            value: function (t) {
              if (
                ((t = t || window.event),
                "undefined" != typeof TouchEvent && t instanceof TouchEvent)
              ) {
                var e = t.changedTouches[0];
                this.setPos(e.clientX, e.clientY);
              } else this.setPos(t.clientX, t.clientY);
            }
          },
          {
            key: "setInitPos",
            value: function (t) {
              "x" == this.axis
                ? (this.elem.style.left = t + "%")
                : (this.elem.style.top = t + "%");
            }
          },
          {
            key: "setPos",
            value: function (t, e) {
              var n = this.elem.parentNode.getBoundingClientRect();
              "x" == this.axis
                ? ((this.pos = this.valBetween(
                    ((100 * (t - 5 - n.left).toFixed(0)) / n.width).toFixed(0),
                    0,
                    100
                  )),
                  (this.elem.style.left = this.pos + "%"))
                : ((this.pos = this.valBetween(
                    ((100 * (e - 5 - n.top).toFixed(0)) / n.height).toFixed(0),
                    0,
                    100
                  )),
                  (this.elem.style.top = this.pos + "%")),
                this.onChange(this.pos, this.elem.id);
            }
          },
          {
            key: "closeDragElement",
            value: function () {
              this.currentSpan.classList.remove("active"),
                this.onDragEnd(),
                (document.onmouseup = null),
                (document.onmousemove = null),
                (document.ontouchend = null),
                (document.ontouchmove = null);
            }
          },
          {
            key: "valBetween",
            value: function (t, e, n) {
              return Math.min(n, Math.max(e, t));
            }
          }
        ]) && u(e.prototype, n),
        o && u(e, o),
        t
      );
    })();
    function d(t) {
      return (d =
        "function" == typeof Symbol && "symbol" == typeof Symbol.iterator
          ? function (t) {
              return typeof t;
            }
          : function (t) {
              return t &&
                "function" == typeof Symbol &&
                t.constructor === Symbol &&
                t !== Symbol.prototype
                ? "symbol"
                : typeof t;
            })(t);
    }
    function f(t, e) {
      if (!(t instanceof e))
        throw new TypeError("Cannot call a class as a function");
    }
    function h(t, e) {
      for (var n = 0; n < e.length; n++) {
        var o = e[n];
        (o.enumerable = o.enumerable || !1),
          (o.configurable = !0),
          "value" in o && (o.writable = !0),
          Object.defineProperty(t, o.key, o);
      }
    }
    function p(t, e) {
      return !e || ("object" !== d(e) && "function" != typeof e)
        ? (function (t) {
            if (void 0 === t)
              throw new ReferenceError(
                "this hasn't been initialised - super() hasn't been called"
              );
            return t;
          })(t)
        : e;
    }
    function m() {
      if ("undefined" == typeof Reflect || !Reflect.construct) return !1;
      if (Reflect.construct.sham) return !1;
      if ("function" == typeof Proxy) return !0;
      try {
        return (
          Date.prototype.toString.call(
            Reflect.construct(Date, [], function () {})
          ),
          !0
        );
      } catch (t) {
        return !1;
      }
    }
    function g(t) {
      return (g = Object.setPrototypeOf
        ? Object.getPrototypeOf
        : function (t) {
            return t.__proto__ || Object.getPrototypeOf(t);
          })(t);
    }
    function b(t, e) {
      return (b =
        Object.setPrototypeOf ||
        function (t, e) {
          return (t.__proto__ = e), t;
        })(t, e);
    }
    var v = (function (t) {
        !(function (t, e) {
          if ("function" != typeof e && null !== e)
            throw new TypeError(
              "Super expression must either be null or a function"
            );
          (t.prototype = Object.create(e && e.prototype, {
            constructor: { value: t, writable: !0, configurable: !0 }
          })),
            e && b(t, e);
        })(a, t);
        var e,
          n,
          o,
          i,
          r =
            ((e = a),
            function () {
              var t,
                n = g(e);
              if (m()) {
                var o = g(this).constructor;
                t = Reflect.construct(n, arguments, o);
              } else t = n.apply(this, arguments);
              return p(this, t);
            });
        function a() {
          return f(this, a), r.apply(this, arguments);
        }
        return (
          (n = a),
          (o = [
            {
              key: "initState",
              value: function (t) {
                this.state =
                  null == t
                    ? {
                        left: 10,
                        right: 10,
                        top: 10,
                        bottom: 10,
                        leftBottom: 90,
                        rightBottom: 90,
                        topRight: 90,
                        bottomRight: 90,
                        width: "",
                        height: "",
                        advancedMode: !1
                      }
                    : t;
              }
            },
            {
              key: "initHandles",
              value: function (t) {
                return {
                  left: new l(
                    t.left,
                    this.updateState.bind(this),
                    "y",
                    this.state.left,
                    this.saveUrlParams.bind(this)
                  ),
                  right: new l(
                    t.right,
                    this.updateState.bind(this),
                    "y",
                    this.state.right,
                    this.saveUrlParams.bind(this)
                  ),
                  top: new l(
                    t.top,
                    this.updateState.bind(this),
                    "x",
                    this.state.top,
                    this.saveUrlParams.bind(this)
                  ),
                  bottom: new l(
                    t.bottom,
                    this.updateState.bind(this),
                    "x",
                    this.state.bottom,
                    this.saveUrlParams.bind(this)
                  ),
                  leftBottom: new l(
                    t.leftBottom,
                    this.updateState.bind(this),
                    "y",
                    this.state.leftBottom,
                    this.saveUrlParams.bind(this)
                  ),
                  rightBottom: new l(
                    t.rightBottom,
                    this.updateState.bind(this),
                    "y",
                    this.state.rightBottom,
                    this.saveUrlParams.bind(this)
                  ),
                  topRight: new l(
                    t.topRight,
                    this.updateState.bind(this),
                    "x",
                    this.state.topRight,
                    this.saveUrlParams.bind(this)
                  ),
                  bottomRight: new l(
                    t.bottomRight,
                    this.updateState.bind(this),
                    "x",
                    this.state.bottomRight,
                    this.saveUrlParams.bind(this)
                  )
                };
              }
            },
            {
              key: "updateBorderRadius",
              value: function () {
                var t = this.state.top + "% ";
                (t += 100 - this.state.topRight + "% "),
                  (t += 100 - this.state.bottomRight + "% "),
                  (t += this.state.bottom + "% / "),
                  (t += this.state.left + "% "),
                  (t += this.state.right + "% "),
                  (t += 100 - this.state.rightBottom + "% "),
                  (t += 100 - this.state.leftBottom + "% "),
                  (this.shapeElem.style["border-radius"] = t),
                  (this.generatorElem.innerHTML = t);
              }
            },
            {
              key: "saveUrlParams",
              value: function () {
                var t = this.state,
                  e = t.left,
                  n = t.top,
                  o = t.right,
                  i = t.bottom,
                  r = t.width,
                  a = t.height,
                  s = t.leftBottom,
                  c = t.topRight,
                  u = t.rightBottom,
                  l = t.bottomRight,
                  d = ""
                    .concat(e, ".")
                    .concat(n, ".")
                    .concat(o, ".")
                    .concat(i, "-")
                    .concat(s, ".")
                    .concat(c, ".")
                    .concat(u, ".")
                    .concat(l, "-")
                    .concat(a, ".")
                    .concat(r);
                this.setUrlHash(d);
              }
            }
          ]) && h(n.prototype, o),
          i && h(n, i),
          a
        );
      })(s),
      y = {
        left: document.getElementById("left"),
        right: document.getElementById("right"),
        bottom: document.getElementById("bottom"),
        top: document.getElementById("top"),
        leftBottom: document.getElementById("leftBottom"),
        rightBottom: document.getElementById("rightBottom"),
        bottomRight: document.getElementById("bottomRight"),
        topRight: document.getElementById("topRight")
      },
      w = v.loadUrlParams(window.location.href);
    new v({ moveableElems: y, initState: w });
  }
]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY2xpcGJvYXJkLXBvbHlmaWxsL2J1aWxkL2NsaXBib2FyZC1wb2x5ZmlsbC5wcm9taXNlLmpzIiwid2VicGFjazovLy8uL3NyYy9zY3NzL21haW4uc2Nzcz83YWIwIiwid2VicGFjazovLy8uL3NyYy9zY3NzL21haW4uc2NzcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL3VybHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NsaXBib2FyZC1wb2x5ZmlsbC9kaXN0L2NsaXBib2FyZC1wb2x5ZmlsbC5wcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2pzL2FkanVzdGFibGVfYm94LmpzIiwid2VicGFjazovLy8uL3NyYy9qcy9tb3ZhYmxlLmpzIiwid2VicGFjazovLy8uL3NyYy9qcy9mdWxsX2NvbnRyb2xfYm94LmpzIiwid2VicGFjazovLy8uL3NyYy9pbmRleDh2LmpzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiZyIsInRoaXMiLCJGdW5jdGlvbiIsImUiLCJ3aW5kb3ciLCJjb250ZW50Iiwib3B0aW9ucyIsInRyYW5zZm9ybSIsInVuZGVmaW5lZCIsImxvY2FscyIsInB1c2giLCJ1c2VTb3VyY2VNYXAiLCJsaXN0IiwidG9TdHJpbmciLCJtYXAiLCJpdGVtIiwiY3NzTWFwcGluZyIsImJ0b2EiLCJzb3VyY2VNYXBwaW5nIiwic291cmNlTWFwIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJKU09OIiwic3RyaW5naWZ5Iiwic291cmNlVVJMcyIsInNvdXJjZXMiLCJzb3VyY2UiLCJzb3VyY2VSb290IiwiY29uY2F0Iiwiam9pbiIsImNzc1dpdGhNYXBwaW5nVG9TdHJpbmciLCJtZWRpYVF1ZXJ5IiwiYWxyZWFkeUltcG9ydGVkTW9kdWxlcyIsImxlbmd0aCIsImlkIiwiZm4iLCJtZW1vIiwic3R5bGVzSW5Eb20iLCJpc09sZElFIiwiZG9jdW1lbnQiLCJhbGwiLCJhdG9iIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJnZXRUYXJnZXQiLCJ0YXJnZXQiLCJwYXJlbnQiLCJxdWVyeVNlbGVjdG9yIiwiZ2V0RWxlbWVudCIsInN0eWxlVGFyZ2V0IiwiSFRNTElGcmFtZUVsZW1lbnQiLCJjb250ZW50RG9jdW1lbnQiLCJoZWFkIiwic2luZ2xldG9uIiwic2luZ2xldG9uQ291bnRlciIsInN0eWxlc0luc2VydGVkQXRUb3AiLCJmaXhVcmxzIiwiYWRkU3R5bGVzVG9Eb20iLCJzdHlsZXMiLCJkb21TdHlsZSIsInJlZnMiLCJqIiwicGFydHMiLCJhZGRTdHlsZSIsImxpc3RUb1N0eWxlcyIsIm5ld1N0eWxlcyIsImJhc2UiLCJwYXJ0IiwiY3NzIiwibWVkaWEiLCJpbnNlcnRTdHlsZUVsZW1lbnQiLCJzdHlsZSIsImluc2VydEludG8iLCJFcnJvciIsImxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wIiwiaW5zZXJ0QXQiLCJuZXh0U2libGluZyIsImluc2VydEJlZm9yZSIsImFwcGVuZENoaWxkIiwiZmlyc3RDaGlsZCIsImJlZm9yZSIsInJlbW92ZVN0eWxlRWxlbWVudCIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsImlkeCIsImluZGV4T2YiLCJzcGxpY2UiLCJjcmVhdGVTdHlsZUVsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYXR0cnMiLCJ0eXBlIiwibm9uY2UiLCJnZXROb25jZSIsImFkZEF0dHJzIiwiZWwiLCJrZXlzIiwiZm9yRWFjaCIsInNldEF0dHJpYnV0ZSIsIm9iaiIsInVwZGF0ZSIsInJlbW92ZSIsInJlc3VsdCIsImRlZmF1bHQiLCJzdHlsZUluZGV4IiwiYXBwbHlUb1NpbmdsZXRvblRhZyIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsInJldm9rZU9iamVjdFVSTCIsIkJsb2IiLCJsaW5rIiwicmVsIiwiY3JlYXRlTGlua0VsZW1lbnQiLCJ1cGRhdGVMaW5rIiwiaHJlZiIsImFwcGx5VG9UYWciLCJuZXdPYmoiLCJERUJVRyIsIm5ld0xpc3QiLCJtYXlSZW1vdmUiLCJ0ZXh0U3RvcmUiLCJyZXBsYWNlVGV4dCIsImluZGV4IiwicmVwbGFjZW1lbnQiLCJmaWx0ZXIiLCJCb29sZWFuIiwic3R5bGVTaGVldCIsImNzc1RleHQiLCJjc3NOb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJjaGlsZE5vZGVzIiwiYXV0b0ZpeFVybHMiLCJjb252ZXJ0VG9BYnNvbHV0ZVVybHMiLCJibG9iIiwib2xkU3JjIiwibG9jYXRpb24iLCJiYXNlVXJsIiwicHJvdG9jb2wiLCJob3N0IiwiY3VycmVudERpciIsInBhdGhuYW1lIiwicmVwbGFjZSIsImZ1bGxNYXRjaCIsIm9yaWdVcmwiLCJuZXdVcmwiLCJ1bnF1b3RlZE9yaWdVcmwiLCJ0cmltIiwiJDEiLCJ0ZXN0IiwiY29uc3RydWN0b3IiLCJ0aGVuIiwicmVzb2x2ZSIsInJlamVjdCIsIlR5cGVFcnJvciIsIl9zdGF0ZSIsIl9oYW5kbGVkIiwiX3ZhbHVlIiwiX2RlZmVycmVkcyIsIl9pbW1lZGlhdGVGbiIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsImEiLCJwcm9taXNlIiwidSIsIl91bmhhbmRsZWRSZWplY3Rpb25GbiIsImYiLCJzZXRUaW1lb3V0IiwiY2F0Y2giLCJmaW5hbGx5IiwiQXJyYXkiLCJzbGljZSIsInJhY2UiLCJzZXRJbW1lZGlhdGUiLCJjb25zb2xlIiwid2FybiIsInNlbGYiLCJnbG9iYWwiLCJQcm9taXNlIiwibmV4dCIsInRocm93IiwiZG9uZSIsImxhYmVsIiwic2VudCIsInRyeXMiLCJvcHMiLCJyZXR1cm4iLCJpdGVyYXRvciIsInBvcCIsImxvZyIsInNldERhdGEiLCJnZXREYXRhIiwiY2xpcGJvYXJkRGF0YSIsIngiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJfIiwiYm9keSIsInRleHRDb250ZW50IiwiYXR0YWNoU2hhZG93IiwiaW5uZXJUZXh0IiwiVCIsImV4ZWNDb21tYW5kIiwiRSIsImgiLCJjbGlwYm9hcmQiLCJ3cml0ZVRleHQiLCJEIiwidiIsInkiLCJyZWFkVGV4dCIsIkMiLCJ3IiwiYiIsIkRUIiwic2V0RGVidWdMb2ciLCJzdXBwcmVzc1dhcm5pbmdzIiwid3JpdGUiLCJyZWFkIiwic3VjY2VzcyIsInByZXZlbnREZWZhdWx0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJnZXRTZWxlY3Rpb24iLCJjcmVhdGVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwiQ2xpcGJvYXJkRXZlbnQiLCJUaW1lb3V0IiwiY2xlYXJGbiIsIl9pZCIsIl9jbGVhckZuIiwic2NvcGUiLCJjbGVhclRpbWVvdXQiLCJzZXRJbnRlcnZhbCIsImNsZWFySW50ZXJ2YWwiLCJ0aW1lb3V0IiwiY2xvc2UiLCJ1bnJlZiIsInJlZiIsImVucm9sbCIsIm1zZWNzIiwiX2lkbGVUaW1lb3V0SWQiLCJfaWRsZVRpbWVvdXQiLCJ1bmVucm9sbCIsIl91bnJlZkFjdGl2ZSIsImFjdGl2ZSIsIl9vblRpbWVvdXQiLCJjbGVhckltbWVkaWF0ZSIsInJlZ2lzdGVySW1tZWRpYXRlIiwiaHRtbCIsImNoYW5uZWwiLCJtZXNzYWdlUHJlZml4Iiwib25HbG9iYWxNZXNzYWdlIiwibmV4dEhhbmRsZSIsInRhc2tzQnlIYW5kbGUiLCJjdXJyZW50bHlSdW5uaW5nQVRhc2siLCJkb2MiLCJhdHRhY2hUbyIsImdldFByb3RvdHlwZU9mIiwicHJvY2VzcyIsImhhbmRsZSIsIm5leHRUaWNrIiwicnVuSWZQcmVzZW50IiwicG9zdE1lc3NhZ2UiLCJpbXBvcnRTY3JpcHRzIiwicG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyIsIm9sZE9uTWVzc2FnZSIsIm9ubWVzc2FnZSIsImNhblVzZVBvc3RNZXNzYWdlIiwiTWVzc2FnZUNoYW5uZWwiLCJwb3J0MSIsImV2ZW50IiwiZGF0YSIsInBvcnQyIiwiZG9jdW1lbnRFbGVtZW50Iiwic2NyaXB0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwiTWF0aCIsInJhbmRvbSIsImF0dGFjaEV2ZW50IiwiY2FsbGJhY2siLCJhcmdzIiwidGFzayIsInJ1biIsImNhY2hlZFNldFRpbWVvdXQiLCJjYWNoZWRDbGVhclRpbWVvdXQiLCJkZWZhdWx0U2V0VGltb3V0IiwiZGVmYXVsdENsZWFyVGltZW91dCIsInJ1blRpbWVvdXQiLCJmdW4iLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImRyYWluUXVldWUiLCJsZW4iLCJtYXJrZXIiLCJydW5DbGVhclRpbWVvdXQiLCJJdGVtIiwiYXJyYXkiLCJub29wIiwidGl0bGUiLCJicm93c2VyIiwiZW52IiwiYXJndiIsInZlcnNpb24iLCJ2ZXJzaW9ucyIsIm9uIiwiYWRkTGlzdGVuZXIiLCJvbmNlIiwib2ZmIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJlbWl0IiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImxpc3RlbmVycyIsImJpbmRpbmciLCJjd2QiLCJjaGRpciIsImRpciIsInVtYXNrIiwiQWRqdXN0YWJsZUJveCIsInNoYXBlRWxlbUlkIiwiZ2VuZXJhdG9yRWxlbUlkIiwiY29weUNvZGVJZCIsImNvcGllZENvZGVJZCIsImJveENvbnRhaW5lcklkIiwid2lkdGhJbnB1dElkIiwiaGVpZ2h0SW5wdXRJZCIsImVuYWJsZUFkdmFuY2VkSWQiLCJpbml0U3RhdGUiLCJtb3ZlYWJsZUVsZW1zIiwiZ2VuZXJhdG9yRWxlbSIsImdldEVsZW1lbnRCeUlkIiwic2hhcGVFbGVtIiwiY29waWVkQ29kZSIsImJveENvbnRhaW5lciIsIndpZHRoSW5wdXQiLCJoZWlnaHRJbnB1dCIsIm9uY2hhbmdlIiwidXBkYXRlU3RhdGUiLCJlbmFibGVBZHZhbmNlZCIsIm9uY2xpY2siLCJlbmFibGVBZHZhbmNlZE9uQ2xpY2siLCJpbml0QWR2YW5jZWQiLCJoYW5kbGVzIiwiaW5pdEhhbmRsZXMiLCJzZXRDbGlwYm9hcmQiLCJ1cmwiLCJyZWdleCIsInBhcmFtc1RvQXR0cmlidXRlIiwiYXR0cmlidXRlcyIsImxhc3RJbmRleCIsImV4ZWMiLCJtYXRjaCIsImdyb3VwSW5kZXgiLCJzdGF0ZSIsIndpZHRoIiwiaGVpZ2h0IiwiY2hlY2tlZCIsImNsYXNzTGlzdCIsImFkZCIsIm9mZnNldFdpZHRoIiwib2Zmc2V0SGVpZ2h0IiwidXBkYXRlVUkiLCJpbm5lckhUTUwiLCJoYXNoIiwiaGlzdG9yeSIsInB1c2hTdGF0ZSIsInZhbCIsInVwZGF0ZUJvcmRlclJhZGl1cyIsInVwZGF0ZUJveCIsInN0eWxlSGVpZ2h0Iiwic3R5bGVXaWR0aCIsIk1vdmFibGUiLCJlbGVtIiwib25DaGFuZ2UiLCJheGlzIiwiaW5pdFBvc2l0aW9uIiwib25EcmFnRW5kIiwicG9zIiwib25tb3VzZWRvd24iLCJkcmFnTW91c2VEb3duIiwib250b3VjaHN0YXJ0Iiwic2V0SW5pdFBvcyIsImN1cnJlbnRTcGFuIiwib25tb3VzZXVwIiwiY2xvc2VEcmFnRWxlbWVudCIsIm9udG91Y2hlbmQiLCJvbm1vdXNlbW92ZSIsImVsZW1lbnREcmFnIiwib250b3VjaG1vdmUiLCJUb3VjaEV2ZW50IiwidG91Y2hvYmoiLCJjaGFuZ2VkVG91Y2hlcyIsInNldFBvcyIsImNsaWVudFgiLCJjbGllbnRZIiwibGVmdCIsInRvcCIsIl9wb3NYIiwiX3Bvc1kiLCJib3hSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidmFsQmV0d2VlbiIsInRvRml4ZWQiLCJtaW4iLCJtYXgiLCJGdWxsQ29udHJvbEJveCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdEJvdHRvbSIsInJpZ2h0Qm90dG9tIiwidG9wUmlnaHQiLCJib3R0b21SaWdodCIsImFkdmFuY2VkTW9kZSIsInNhdmVVcmxQYXJhbXMiLCJicmQiLCJzZXRVcmxIYXNoIiwibW92YWJsZXMiLCJwYXJhbXMiLCJsb2FkVXJsUGFyYW1zIl0sIm1hcHBpbmdzIjoiYUFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUFLZkYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9C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TixZQUFjQyxFQUFkLFlBQXFCVSxFQUFyQixZQUE4QkMsRUFBOUIsWUFBd0NDLEVBQXhDLFlBQXNERSxFQUF0RCxZQUFrRUQsRUFBbEUsWUFBaUZFLEVBQWpGLFlBQWdHeEQsRUFBaEcsWUFBMEdELEdBQ2xIdFcsS0FBS21hLFdBQVdwRCxRLDhCQTdDd0I3QyxHQ0F4Q2tHLEVBQVcsQ0FDYnJCLEtBQU16VyxTQUFTd1MsZUFBZSxRQUM5QjRFLE1BQU9wWCxTQUFTd1MsZUFBZSxTQUMvQjZFLE9BQVFyWCxTQUFTd1MsZUFBZSxVQUNoQ2tFLElBQUsxVyxTQUFTd1MsZUFBZSxPQUM3QjhFLFdBQVl0WCxTQUFTd1MsZUFBZSxjQUNwQytFLFlBQWF2WCxTQUFTd1MsZUFBZSxlQUNyQ2lGLFlBQWF6WCxTQUFTd1MsZUFBZSxlQUNyQ2dGLFNBQVV4WCxTQUFTd1MsZUFBZSxhQUVoQ3VGLEVBQVNaLEVBQWVhLGNBQWNuYSxPQUFPa0ksU0FBU3JCLE1BQzlDLElBQUl5UyxFQUFlLENBQUM3RSxjQUFld0YsRUFBVXpGLFVBQVcwRiIsImZpbGUiOiJtYWluOHYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9kaXN0L1wiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTEpO1xuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vZGlzdC9jbGlwYm9hcmQtcG9seWZpbGwucHJvbWlzZVwiKVxuIiwiXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzIS4uLy4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL21haW4uc2Nzc1wiKTtcblxuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cbnZhciB0cmFuc2Zvcm07XG52YXIgaW5zZXJ0SW50bztcblxuXG5cbnZhciBvcHRpb25zID0ge1wiaG1yXCI6dHJ1ZX1cblxub3B0aW9ucy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbm9wdGlvbnMuaW5zZXJ0SW50byA9IHVuZGVmaW5lZDtcblxudmFyIHVwZGF0ZSA9IHJlcXVpcmUoXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzXCIpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscztcblxuaWYobW9kdWxlLmhvdCkge1xuXHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWFpbi5zY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanMhLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWFpbi5zY3NzXCIpO1xuXG5cdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cblx0XHR2YXIgbG9jYWxzID0gKGZ1bmN0aW9uKGEsIGIpIHtcblx0XHRcdHZhciBrZXksIGlkeCA9IDA7XG5cblx0XHRcdGZvcihrZXkgaW4gYSkge1xuXHRcdFx0XHRpZighYiB8fCBhW2tleV0gIT09IGJba2V5XSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRpZHgrKztcblx0XHRcdH1cblxuXHRcdFx0Zm9yKGtleSBpbiBiKSBpZHgtLTtcblxuXHRcdFx0cmV0dXJuIGlkeCA9PT0gMDtcblx0XHR9KGNvbnRlbnQubG9jYWxzLCBuZXdDb250ZW50LmxvY2FscykpO1xuXG5cdFx0aWYoIWxvY2FscykgdGhyb3cgbmV3IEVycm9yKCdBYm9ydGluZyBDU1MgSE1SIGR1ZSB0byBjaGFuZ2VkIGNzcy1tb2R1bGVzIGxvY2Fscy4nKTtcblxuXHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0fSk7XG5cblx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59IiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKShmYWxzZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJodG1se2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJX1ib2R5e21hcmdpbjowfWFydGljbGUsYXNpZGUsZGV0YWlscyxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsaGVhZGVyLGhncm91cCxtYWluLG1lbnUsbmF2LHNlY3Rpb24sc3VtbWFyeXtkaXNwbGF5OmJsb2NrfWF1ZGlvLGNhbnZhcyxwcm9ncmVzcyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1hdWRpbzpub3QoW2NvbnRyb2xzXSl7ZGlzcGxheTpub25lO2hlaWdodDowfVtoaWRkZW5dLHRlbXBsYXRle2Rpc3BsYXk6bm9uZX1he2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9YTphY3RpdmUsYTpob3ZlcntvdXRsaW5lOjB9YWJiclt0aXRsZV17Ym9yZGVyLWJvdHRvbToxcHggZG90dGVkfWIsc3Ryb25ne2ZvbnQtd2VpZ2h0OmJvbGR9ZGZue2ZvbnQtc3R5bGU6aXRhbGljfWgxe2ZvbnQtc2l6ZToyZW07bWFyZ2luOjAuNjdlbSAwfW1hcmt7YmFja2dyb3VuZDojZmYwO2NvbG9yOiMwMDB9c21hbGx7Zm9udC1zaXplOjgwJX1zdWIsc3Vwe2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1zdXB7dG9wOi0wLjVlbX1zdWJ7Ym90dG9tOi0wLjI1ZW19aW1ne2JvcmRlcjowfXN2Zzpub3QoOnJvb3Qpe292ZXJmbG93OmhpZGRlbn1maWd1cmV7bWFyZ2luOjFlbSA0MHB4fWhye2JveC1zaXppbmc6Y29udGVudC1ib3g7aGVpZ2h0OjB9cHJle292ZXJmbG93OmF1dG99Y29kZSxrYmQscHJlLHNhbXB7Zm9udC1mYW1pbHk6bW9ub3NwYWNlLCBtb25vc3BhY2U7Zm9udC1zaXplOjFlbX1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2NvbG9yOmluaGVyaXQ7Zm9udDppbmhlcml0O21hcmdpbjowfWJ1dHRvbntvdmVyZmxvdzp2aXNpYmxlfWJ1dHRvbixzZWxlY3R7dGV4dC10cmFuc2Zvcm06bm9uZX1idXR0b24saHRtbCBpbnB1dFt0eXBlPVxcXCJidXR0b25cXFwiXSxpbnB1dFt0eXBlPVxcXCJyZXNldFxcXCJdLGlucHV0W3R5cGU9XFxcInN1Ym1pdFxcXCJdey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247Y3Vyc29yOnBvaW50ZXJ9YnV0dG9uW2Rpc2FibGVkXSxodG1sIGlucHV0W2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsaW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjA7cGFkZGluZzowfWlucHV0e2xpbmUtaGVpZ2h0Om5vcm1hbH1pbnB1dFt0eXBlPVxcXCJjaGVja2JveFxcXCJdLGlucHV0W3R5cGU9XFxcInJhZGlvXFxcIl17Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MH1pbnB1dFt0eXBlPVxcXCJudW1iZXJcXFwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixpbnB1dFt0eXBlPVxcXCJudW1iZXJcXFwiXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b31pbnB1dFt0eXBlPVxcXCJzZWFyY2hcXFwiXXstd2Via2l0LWFwcGVhcmFuY2U6dGV4dGZpZWxkO2JveC1zaXppbmc6Y29udGVudC1ib3h9aW5wdXRbdHlwZT1cXFwic2VhcmNoXFxcIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24saW5wdXRbdHlwZT1cXFwic2VhcmNoXFxcIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9ZmllbGRzZXR7Ym9yZGVyOjFweCBzb2xpZCAjYzBjMGMwO21hcmdpbjowIDJweDtwYWRkaW5nOjAuMzVlbSAwLjYyNWVtIDAuNzVlbX1sZWdlbmR7Ym9yZGVyOjA7cGFkZGluZzowfXRleHRhcmVhe292ZXJmbG93OmF1dG99b3B0Z3JvdXB7Zm9udC13ZWlnaHQ6Ym9sZH10YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MH10ZCx0aHtwYWRkaW5nOjB9QGtleWZyYW1lcyBtb3JwaHswJXtib3JkZXItcmFkaXVzOjQwJSA2MCUgNjAlIDQwJSAvIDcwJSAzMCUgNzAlIDMwJX0xMDAle2JvcmRlci1yYWRpdXM6NDAlIDYwJX19QGtleWZyYW1lcyBzcGlue3Rve3RyYW5zZm9ybTpyb3RhdGUoMXR1cm4pfX0qLCo6YmVmb3JlLCo6YWZ0ZXJ7Ym94LXNpemluZzpib3JkZXItYm94fWh0bWwsYm9keXtiYWNrZ3JvdW5kOiMwMDI7Y29sb3I6d2hpdGU7Zm9udC1mYW1pbHk6J00gUExVUyBSb3VuZGVkIDFjJywgc2Fucy1zZXJpZjtvdmVyZmxvdy14OmhpZGRlbn0uYWxlcnR7cG9zaXRpb246Zml4ZWQ7bGVmdDo1MCU7dG9wOjMwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsIDApO2NvbG9yOiMwMDI7Zm9udC1zaXplOjEuNXJlbTtwb2ludGVyLWV2ZW50czpub25lO3otaW5kZXg6MTAwO3BhZGRpbmc6MWVtO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjgpO2JvcmRlci1yYWRpdXM6MC41ZW07d2hpdGUtc3BhY2U6bm93cmFwfS5mb290ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpO21pbi1oZWlnaHQ6MnJlbTt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuNik7Zm9udC1zaXplOjAuODc1cmVtO2xpbmUtaGVpZ2h0OjEuMnJlbTtwYWRkaW5nOjAuNHJlbSAwfS5mb290ZXJfX2hlYXJ0e3BhZGRpbmc6MCAwLjEyNWVtO2NvbG9yOiMzMDIzQUV9LmZvb3RlciBhe3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC44KX0uZm9vdGVyIGE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uaGVhZGVye21hcmdpbjowIDAgMXJlbTt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjEwfS5oZWFkZXJfX2xpbmtze21hcmdpbjowLjVlbSBhdXRvIDA7cGFkZGluZy10b3A6MC4yNWVtO21heC13aWR0aDoyNi43NXJlbTtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuNSl9LmhlYWRlcl9fbGlua3MgYXtmb250LXNpemU6MC43NXJlbTtjb2xvcjojZjA5O3RleHQtZGVjb3JhdGlvbjpub25lO3BhZGRpbmc6MCAwLjVyZW07b3BhY2l0eTowLjg7dHJhbnNpdGlvbjpvcGFjaXR5IDAuM3MgZWFzZS1vdXQ7d2hpdGUtc3BhY2U6bm93cmFwfS5oZWFkZXJfX2xpbmtzIGEgc3Zne3dpZHRoOjEuMzVlbTtoZWlnaHQ6MS4zNWVtO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZpbGw6I2ZmZjt2ZXJ0aWNhbC1hbGlnbjotMC4zZW07bWFyZ2luLXRvcDotMC4xMjVyZW19LmhlYWRlcl9fbGlua3MgYTpob3ZlcntvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMzNyZW0pey5oZWFkZXJfX2xpbmtze21hcmdpbi10b3A6MWVtO3BhZGRpbmctdG9wOjAuNWVtfS5oZWFkZXJfX2xpbmtzIGF7Zm9udC1zaXplOjAuODc1cmVtfX1oMXt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Zm9udC1zaXplOjEuNXJlbTtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuOCk7bGluZS1oZWlnaHQ6MTttYXJnaW46MCAwIDAuMTI1ZW07bGV0dGVyLXNwYWNpbmc6MC4wMWVtO3RleHQtYWxpZ246Y2VudGVyfUBtZWRpYSBzY3JlZW4gYW5kIChtaW4taGVpZ2h0OiAzNi4yNXJlbSkgYW5kIChtaW4td2lkdGg6IDI1cmVtKXtoMXtmb250LXNpemU6MnJlbX19LmNvbnRhaW5lcnttaW4taGVpZ2h0OmNhbGMoMTAwdmggLSAycmVtKTtwYWRkaW5nLXRvcDoycmVtO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6c3RyZXRjaDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtZXZlbmx5O292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0uY29udGFpbmVyOjpiZWZvcmUsLmNvbnRhaW5lcjo6YWZ0ZXJ7Y29udGVudDpcXFwiXFxcIjt3aWR0aDo3MHZtYXg7aGVpZ2h0Ojcwdm1heDtwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC4wNyk7bGVmdDotMjB2bWluO3RvcDotMjB2bWluO2FuaW1hdGlvbjptb3JwaCAxNXMgbGluZWFyIGluZmluaXRlIGFsdGVybmF0ZSwgc3BpbiAyMHMgbGluZWFyIGluZmluaXRlO3otaW5kZXg6MTt3aWxsLWNoYW5nZTpib3JkZXItcmFkaXVzLCB0cmFuc2Zvcm07dHJhbnNmb3JtLW9yaWdpbjo1NSUgNTUlO3BvaW50ZXItZXZlbnRzOm5vbmV9LmNvbnRhaW5lcjo6YWZ0ZXJ7d2lkdGg6NzB2bWluO2hlaWdodDo3MHZtaW47bGVmdDphdXRvO3JpZ2h0Oi0xMHZtaW47dG9wOmF1dG87Ym90dG9tOjA7YW5pbWF0aW9uOm1vcnBoIDEwcyBsaW5lYXIgaW5maW5pdGUgYWx0ZXJuYXRlLCBzcGluIDI2cyBsaW5lYXIgaW5maW5pdGUgcmV2ZXJzZTt0cmFuc2Zvcm0tb3JpZ2luOjIwJSAyMCV9LmdlbmVyYXRvcnt3aWR0aDo2MHZtaW47aGVpZ2h0OjYwdm1pbjtib3JkZXI6MnB4IGRhc2hlZCByZ2JhKDI1NSwyNTUsMjU1LDAuNCk7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDozO21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMzEuODc1cmVtKXsuZ2VuZXJhdG9ye3dpZHRoOjUwdm1pbjtoZWlnaHQ6NTB2bWlufX0uZ2VuZXJhdG9yX19zaGFwZXt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6I2YwOTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCg0NWRlZywgIzMwMjNBRSAwJSwgI2YwOSAxMDAlKTtib3JkZXItcmFkaXVzOjMwJSA3MCUgNzAlIDMwJSAvIDMwJSAzMCUgNzAlIDcwJTtib3gtc2hhZG93Oi0xMHZtaW4gMTB2bWluIDAgcmdiYSgyNTUsMjU1LDI1NSwwLjA3KX0uZ2VuZXJhdG9yX19zaGFwZS0tOHZ7Ym9yZGVyLXJhZGl1czoxMCU7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoLTIyNWRlZywgI2ZmZiAwJSwgcmdiYSgyNTUsMjU1LDI1NSwwKSA0MCUsIHJnYmEoMCwyNTUsMjU1LDApIDYwJSwgY3lhbiAxMDAlKSxsaW5lYXItZ3JhZGllbnQoNDVkZWcsICMzMDIzQUUgMCUsICNmMDkgMTAwJSl9LmdlbmVyYXRvcl9faGFuZGxle2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7Y3Vyc29yOnBvaW50ZXI7d2lkdGg6Mi41cmVtO2hlaWdodDoyLjVyZW19LmdlbmVyYXRvcl9faGFuZGxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFwiO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFyZW07aGVpZ2h0OjFyZW07bGVmdDouNzVyZW07dG9wOi43NXJlbTtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjJweCBzb2xpZCAjMDAyO3RyYW5zaXRpb246Ym94LXNoYWRvdyAwLjJzIGVhc2Utb3V0O3dpbGwtY2hhbmdlOmJveC1zaGFkb3d9LmdlbmVyYXRvcl9faGFuZGxlLS1zZWNvbmQ6YmVmb3Jle2JhY2tncm91bmQ6IzMwMjNBRTtib3JkZXI6MnB4IHNvbGlkICNmZmZ9LmdlbmVyYXRvcl9faGFuZGxlLS10aGlyZDpiZWZvcmV7YmFja2dyb3VuZDojZjA5O2JvcmRlcjoycHggc29saWQgI2ZmZn0uZ2VuZXJhdG9yX19oYW5kbGUtLWZvdXJ0aDpiZWZvcmV7YmFja2dyb3VuZDojMGZmfS5nZW5lcmF0b3JfX2hhbmRsZS0tOHYuYWN0aXZlOmJlZm9yZSwuZ2VuZXJhdG9yX19oYW5kbGUtLTh2OmhvdmVyOmJlZm9yZXtib3gtc2hhZG93OjAgMCAwIDRweCAjRkZGO2JvcmRlcjoycHggc29saWQgIzAwMn0uZ2VuZXJhdG9yX19oYW5kbGU6bm90KC5nZW5lcmF0b3JfX2hhbmRsZS0tOHYpLmFjdGl2ZTpiZWZvcmUsLmdlbmVyYXRvcl9faGFuZGxlOm5vdCguZ2VuZXJhdG9yX19oYW5kbGUtLTh2KTpob3ZlcjpiZWZvcmV7YmFja2dyb3VuZDojMGZmO2JveC1zaGFkb3c6MCAwIDAgNHB4ICNGRkY7Ym9yZGVyOjJweCBzb2xpZCAjMDAyfS5nZW5lcmF0b3IgI3RvcHt0b3A6LTEuMjVyZW07bGVmdDozMCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9LmdlbmVyYXRvciAjdG9wLmdlbmVyYXRvcl9faGFuZGxlLS04dntsZWZ0OjEwJX0uZ2VuZXJhdG9yICNib3R0b217Ym90dG9tOi0xLjI1cmVtO2xlZnQ6MzAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfS5nZW5lcmF0b3IgI2JvdHRvbS5nZW5lcmF0b3JfX2hhbmRsZS0tOHZ7bGVmdDoxMCV9LmdlbmVyYXRvciAjbGVmdHtsZWZ0Oi0xLjI1cmVtO3RvcDozMCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9LmdlbmVyYXRvciAjbGVmdC5nZW5lcmF0b3JfX2hhbmRsZS0tOHZ7dG9wOjEwJX0uZ2VuZXJhdG9yICNyaWdodHtyaWdodDotMS4yNXJlbTt0b3A6MzAlO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfS5nZW5lcmF0b3IgI3JpZ2h0LmdlbmVyYXRvcl9faGFuZGxlLS04dnt0b3A6MTAlfS5nZW5lcmF0b3IgI3RvcFJpZ2h0e3RvcDotMS4yNXJlbTtsZWZ0OjkwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX0uZ2VuZXJhdG9yICNib3R0b21SaWdodHtib3R0b206LTEuMjVyZW07bGVmdDo5MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9LmdlbmVyYXRvciAjbGVmdEJvdHRvbXtsZWZ0Oi0xLjI1cmVtO3RvcDo5MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9LmdlbmVyYXRvciAjcmlnaHRCb3R0b217cmlnaHQ6LTEuMjVyZW07dG9wOjkwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0ub3V0cHV0e3dpZHRoOjkwJTt0ZXh0LWFsaWduOmxlZnQ7bWFyZ2luLXRvcDoxLjVlbTtmb250LXNpemU6MS4xMjVyZW07bGluZS1oZWlnaHQ6MS41O21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99Lm91dHB1dF9fbGFiZWx7ZmxleDowIDAgYXV0bzttYXJnaW4tYm90dG9tOjAuNWVtO21hcmdpbi1yaWdodDoxZW07Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwLjkpfS5vdXRwdXRfX2NvZGV7ZGlzcGxheTpibG9jaztmb250LWZhbWlseTonVWJ1bnR1IE1vbm8nLCBtb25vc3BhY2U7ZmxleC1ncm93OjE7Y29sb3I6IzAwMjtiYWNrZ3JvdW5kOiNjY2M7cGFkZGluZzowLjVlbSAwLjYyNWVtO2JvcmRlci1yYWRpdXM6MnB4O21hcmdpbi1ib3R0b206MC41ZW19Lm91dHB1dF9fYnV0dG9ue2Rpc3BsYXk6YmxvY2s7Ym9yZGVyLXJhZGl1czoycHg7YmFja2dyb3VuZDojZjA5O2JvcmRlcjpub25lO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC45KTtwYWRkaW5nOjAuNWVtIDFlbTtmb250LXdlaWdodDpib2xkO3dpZHRoOjEwMCU7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDAuM3MgZWFzZS1vdXQ7d2lsbC1jaGFuZ2U6YmFja2dyb3VuZDtjdXJzb3I6cG9pbnRlcn0ub3V0cHV0X19idXR0b246aG92ZXJ7YmFja2dyb3VuZDojMzAyM0FFfUBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDMwLjg3NXJlbSl7Lm91dHB1dHtmb250LXNpemU6MS4yNXJlbX0ub3V0cHV0X19jb2Rle2JvcmRlci1yYWRpdXM6MnB4IDAgMCAycHg7ZmxleC1ncm93OjE7bWFyZ2luLWJvdHRvbTowfS5vdXRwdXRfX2J1dHRvbntmbGV4LXNocmluazoxO2JvcmRlci1yYWRpdXM6MCAycHggMnB4IDA7d2lkdGg6YXV0bzt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6MC4xZW19fUBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQzcmVtKXsub3V0cHV0e2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3RyZXRjaDthbGlnbi1pdGVtczpiYXNlbGluZTttYXgtd2lkdGg6MzlyZW19fS5hZHZhbmNlZHt3aWR0aDo5MCU7bWF4LXdpZHRoOjM5cmVtO3RleHQtYWxpZ246bGVmdDttYXJnaW46MC41ZW0gYXV0bztwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjU7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuOSl9QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTYwcHgpey5hZHZhbmNlZHtmb250LXNpemU6MS4yNXJlbX19LmFkdmFuY2VkX19zd2l0Y2h7cGFkZGluZzowLjVlbSAwO2ZsZXgtc2hyaW5rOjA7bWFyZ2luLWJvdHRvbTowLjVlbX0uYWR2YW5jZWRfX3NldHRpbmdze2Rpc3BsYXk6bm9uZX0uYWR2YW5jZWRfX3NldHRpbmdzLnZpc2libGV7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn1AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAzMS4yNXJlbSl7LmFkdmFuY2VkX19zZXR0aW5ncy52aXNpYmxle2ZsZXgtZGlyZWN0aW9uOnJvd319LmFkdmFuY2VkX19jaGVja3t2aXNpYmlsaXR5OmhpZGRlbjt3aWR0aDowO2hlaWdodDowO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyOm5vbmV9LmFkdmFuY2VkIC5pbnB1dC1ncm91cHthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWxlZnQ6MWVtO21hcmdpbi1ib3R0b206MC41ZW07anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47ZGlzcGxheTpmbGV4fS5hZHZhbmNlZCAuaW5wdXQtZ3JvdXAgbGFiZWx7ZGlzcGxheTpibG9jazttYXJnaW4tcmlnaHQ6MC41ZW19LmFkdmFuY2VkIC5pbnB1dC1ncm91cCBpbnB1dFt0eXBlPVxcXCJudW1iZXJcXFwiXXt3aWR0aDo0LjVyZW19LmFkdmFuY2VkX19jaGVjazpjaGVja2VkKy5hZHZhbmNlZF9fdHJpZ2dlciBzcGFuOmFmdGVye2JhY2tncm91bmQ6I2YwOTtsZWZ0OjEuMTVlbTtib3JkZXItcmFkaXVzOjM3JSA2MyUgNTUlIDQ1JSAvIDI1JSA1MCUgNTAlIDc1JX0uYWR2YW5jZWRfX3RyaWdnZXJ7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDoxO2N1cnNvcjpwb2ludGVyfS5hZHZhbmNlZF9fdHJpZ2dlciBzcGFue2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjJlbTtoZWlnaHQ6MWVtO2JvcmRlci1yYWRpdXM6MC41ZW07YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuOCk7dmVydGljYWwtYWxpZ246Ym90dG9tO3Bvc2l0aW9uOnJlbGF0aXZlfUBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQzcmVtKXsuYWR2YW5jZWRfX3RyaWdnZXIgc3BhbnttYXJnaW4tbGVmdDoycmVtfX0uYWR2YW5jZWRfX3RyaWdnZXIgc3BhbjphZnRlcntjb250ZW50OlxcXCJcXFwiO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjAuN2VtO2hlaWdodDowLjdlbTtib3JkZXItcmFkaXVzOjUwJSA1NiUgMjklIDcwJSAvIDUwJSA3MyUgMzglIDUwJTtiYWNrZ3JvdW5kOiMwMDI7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowLjE1ZW07dG9wOjAuMTVlbTt0cmFuc2l0aW9uOmxlZnQgMC4zcyBlYXNlLW91dCwgYmFja2dyb3VuZCAwLjNzIGVhc2Utb3V0LCBib3JkZXItcmFkaXVzIDAuNHMgZWFzZS1pbi1vdXR9LmlucHV0LWdyb3VwIGlucHV0e2JvcmRlci1yYWRpdXM6MnB4O2JvcmRlcjpub25lO2JhY2tncm91bmQ6I2ZmZjtmb250LWZhbWlseTonVWJ1bnR1IE1vbm8nLCBtb25vc3BhY2U7Y29sb3I6IzAwMjtwYWRkaW5nOjAuNWVtIDAuNjI1ZW19QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMzAuODVyZW0pey5pbnB1dC1ncm91cHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6c3RyZXRjaDtmbGV4LWdyb3c6MTttYXJnaW4tYm90dG9tOjB9fS5jb21wYW55LWxpbmt7ei1pbmRleDoyMDA7d2lkdGg6MTRlbTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3BhZGRpbmc6MC41ZW0gMWVtIDAuNzVlbTttYXJnaW46MmVtIGF1dG87bWFyZ2luLWJvdHRvbToxcmVtO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjE1KTtib3JkZXI6MXB4IHNvbGlkICNmMDk7Y29sb3I6I2ZmZjtmb250LXNpemU6MXJlbTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZX0uY29tcGFueS1saW5rOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjMpfS5jb21wYW55LWxpbmtfX2xhYmVse21hcmdpbi1ib3R0b206MC41ZW19QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNjJyZW0pIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSl7LmNvbXBhbnktbGlua3ttYXJnaW46MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NyU7cmlnaHQ6MXJlbX19QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogODJyZW0pIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSl7LmNvbXBhbnktbGlua3tsZWZ0Ojc1JX19XFxuXCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIiwiLypcblx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcblx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbi8vIGNzcyBiYXNlIGNvZGUsIGluamVjdGVkIGJ5IHRoZSBjc3MtbG9hZGVyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHVzZVNvdXJjZU1hcCkge1xuXHR2YXIgbGlzdCA9IFtdO1xuXG5cdC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcblx0bGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuXHRcdFx0dmFyIGNvbnRlbnQgPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0sIHVzZVNvdXJjZU1hcCk7XG5cdFx0XHRpZihpdGVtWzJdKSB7XG5cdFx0XHRcdHJldHVybiBcIkBtZWRpYSBcIiArIGl0ZW1bMl0gKyBcIntcIiArIGNvbnRlbnQgKyBcIn1cIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBjb250ZW50O1xuXHRcdFx0fVxuXHRcdH0pLmpvaW4oXCJcIik7XG5cdH07XG5cblx0Ly8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3Rcblx0bGlzdC5pID0gZnVuY3Rpb24obW9kdWxlcywgbWVkaWFRdWVyeSkge1xuXHRcdGlmKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKVxuXHRcdFx0bW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgXCJcIl1dO1xuXHRcdHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpZCA9IHRoaXNbaV1bMF07XG5cdFx0XHRpZih0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcblx0XHR9XG5cdFx0Zm9yKGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGl0ZW0gPSBtb2R1bGVzW2ldO1xuXHRcdFx0Ly8gc2tpcCBhbHJlYWR5IGltcG9ydGVkIG1vZHVsZVxuXHRcdFx0Ly8gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgMTAwJSBwZXJmZWN0IGZvciB3ZWlyZCBtZWRpYSBxdWVyeSBjb21iaW5hdGlvbnNcblx0XHRcdC8vICB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IG1lZGlhIHF1ZXJpZXMuXG5cdFx0XHQvLyAgSSBob3BlIHRoaXMgd2lsbCBuZXZlciBvY2N1ciAoSGV5IHRoaXMgd2F5IHdlIGhhdmUgc21hbGxlciBidW5kbGVzKVxuXHRcdFx0aWYodHlwZW9mIGl0ZW1bMF0gIT09IFwibnVtYmVyXCIgfHwgIWFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcblx0XHRcdFx0aWYobWVkaWFRdWVyeSAmJiAhaXRlbVsyXSkge1xuXHRcdFx0XHRcdGl0ZW1bMl0gPSBtZWRpYVF1ZXJ5O1xuXHRcdFx0XHR9IGVsc2UgaWYobWVkaWFRdWVyeSkge1xuXHRcdFx0XHRcdGl0ZW1bMl0gPSBcIihcIiArIGl0ZW1bMl0gKyBcIikgYW5kIChcIiArIG1lZGlhUXVlcnkgKyBcIilcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaXN0LnB1c2goaXRlbSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gbGlzdDtcbn07XG5cbmZ1bmN0aW9uIGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSwgdXNlU291cmNlTWFwKSB7XG5cdHZhciBjb250ZW50ID0gaXRlbVsxXSB8fCAnJztcblx0dmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuXHRpZiAoIWNzc01hcHBpbmcpIHtcblx0XHRyZXR1cm4gY29udGVudDtcblx0fVxuXG5cdGlmICh1c2VTb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicpIHtcblx0XHR2YXIgc291cmNlTWFwcGluZyA9IHRvQ29tbWVudChjc3NNYXBwaW5nKTtcblx0XHR2YXIgc291cmNlVVJMcyA9IGNzc01hcHBpbmcuc291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuXHRcdFx0cmV0dXJuICcvKiMgc291cmNlVVJMPScgKyBjc3NNYXBwaW5nLnNvdXJjZVJvb3QgKyBzb3VyY2UgKyAnICovJ1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIFtjb250ZW50XS5jb25jYXQoc291cmNlVVJMcykuY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbignXFxuJyk7XG5cdH1cblxuXHRyZXR1cm4gW2NvbnRlbnRdLmpvaW4oJ1xcbicpO1xufVxuXG4vLyBBZGFwdGVkIGZyb20gY29udmVydC1zb3VyY2UtbWFwIChNSVQpXG5mdW5jdGlvbiB0b0NvbW1lbnQoc291cmNlTWFwKSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuXHR2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKTtcblx0dmFyIGRhdGEgPSAnc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsJyArIGJhc2U2NDtcblxuXHRyZXR1cm4gJy8qIyAnICsgZGF0YSArICcgKi8nO1xufVxuIiwiLypcblx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcblx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cblxudmFyIHN0eWxlc0luRG9tID0ge307XG5cbnZhclx0bWVtb2l6ZSA9IGZ1bmN0aW9uIChmbikge1xuXHR2YXIgbWVtbztcblxuXHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdGlmICh0eXBlb2YgbWVtbyA9PT0gXCJ1bmRlZmluZWRcIikgbWVtbyA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0cmV0dXJuIG1lbW87XG5cdH07XG59O1xuXG52YXIgaXNPbGRJRSA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuXHQvLyBUZXN0IGZvciBJRSA8PSA5IGFzIHByb3Bvc2VkIGJ5IEJyb3dzZXJoYWNrc1xuXHQvLyBAc2VlIGh0dHA6Ly9icm93c2VyaGFja3MuY29tLyNoYWNrLWU3MWQ4NjkyZjY1MzM0MTczZmVlNzE1YzIyMmNiODA1XG5cdC8vIFRlc3RzIGZvciBleGlzdGVuY2Ugb2Ygc3RhbmRhcmQgZ2xvYmFscyBpcyB0byBhbGxvdyBzdHlsZS1sb2FkZXJcblx0Ly8gdG8gb3BlcmF0ZSBjb3JyZWN0bHkgaW50byBub24tc3RhbmRhcmQgZW52aXJvbm1lbnRzXG5cdC8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2stY29udHJpYi9zdHlsZS1sb2FkZXIvaXNzdWVzLzE3N1xuXHRyZXR1cm4gd2luZG93ICYmIGRvY3VtZW50ICYmIGRvY3VtZW50LmFsbCAmJiAhd2luZG93LmF0b2I7XG59KTtcblxudmFyIGdldFRhcmdldCA9IGZ1bmN0aW9uICh0YXJnZXQsIHBhcmVudCkge1xuICBpZiAocGFyZW50KXtcbiAgICByZXR1cm4gcGFyZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcbiAgfVxuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xufTtcblxudmFyIGdldEVsZW1lbnQgPSAoZnVuY3Rpb24gKGZuKSB7XG5cdHZhciBtZW1vID0ge307XG5cblx0cmV0dXJuIGZ1bmN0aW9uKHRhcmdldCwgcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgcGFzc2luZyBmdW5jdGlvbiBpbiBvcHRpb25zLCB0aGVuIHVzZSBpdCBmb3IgcmVzb2x2ZSBcImhlYWRcIiBlbGVtZW50LlxuICAgICAgICAgICAgICAgIC8vIFVzZWZ1bCBmb3IgU2hhZG93IFJvb3Qgc3R5bGUgaS5lXG4gICAgICAgICAgICAgICAgLy8ge1xuICAgICAgICAgICAgICAgIC8vICAgaW5zZXJ0SW50bzogZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNmb29cIikuc2hhZG93Um9vdCB9XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHR2YXIgc3R5bGVUYXJnZXQgPSBnZXRUYXJnZXQuY2FsbCh0aGlzLCB0YXJnZXQsIHBhcmVudCk7XG5cdFx0XHQvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuXHRcdFx0aWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG5cdFx0XHRcdFx0Ly8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcblx0XHRcdFx0XHRzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuXHRcdFx0XHR9IGNhdGNoKGUpIHtcblx0XHRcdFx0XHRzdHlsZVRhcmdldCA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuXHRcdH1cblx0XHRyZXR1cm4gbWVtb1t0YXJnZXRdXG5cdH07XG59KSgpO1xuXG52YXIgc2luZ2xldG9uID0gbnVsbDtcbnZhclx0c2luZ2xldG9uQ291bnRlciA9IDA7XG52YXJcdHN0eWxlc0luc2VydGVkQXRUb3AgPSBbXTtcblxudmFyXHRmaXhVcmxzID0gcmVxdWlyZShcIi4vdXJsc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihsaXN0LCBvcHRpb25zKSB7XG5cdGlmICh0eXBlb2YgREVCVUcgIT09IFwidW5kZWZpbmVkXCIgJiYgREVCVUcpIHtcblx0XHRpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRcIik7XG5cdH1cblxuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRvcHRpb25zLmF0dHJzID0gdHlwZW9mIG9wdGlvbnMuYXR0cnMgPT09IFwib2JqZWN0XCIgPyBvcHRpb25zLmF0dHJzIDoge307XG5cblx0Ly8gRm9yY2Ugc2luZ2xlLXRhZyBzb2x1dGlvbiBvbiBJRTYtOSwgd2hpY2ggaGFzIGEgaGFyZCBsaW1pdCBvbiB0aGUgIyBvZiA8c3R5bGU+XG5cdC8vIHRhZ3MgaXQgd2lsbCBhbGxvdyBvbiBhIHBhZ2Vcblx0aWYgKCFvcHRpb25zLnNpbmdsZXRvbiAmJiB0eXBlb2Ygb3B0aW9ucy5zaW5nbGV0b24gIT09IFwiYm9vbGVhblwiKSBvcHRpb25zLnNpbmdsZXRvbiA9IGlzT2xkSUUoKTtcblxuXHQvLyBCeSBkZWZhdWx0LCBhZGQgPHN0eWxlPiB0YWdzIHRvIHRoZSA8aGVhZD4gZWxlbWVudFxuICAgICAgICBpZiAoIW9wdGlvbnMuaW5zZXJ0SW50bykgb3B0aW9ucy5pbnNlcnRJbnRvID0gXCJoZWFkXCI7XG5cblx0Ly8gQnkgZGVmYXVsdCwgYWRkIDxzdHlsZT4gdGFncyB0byB0aGUgYm90dG9tIG9mIHRoZSB0YXJnZXRcblx0aWYgKCFvcHRpb25zLmluc2VydEF0KSBvcHRpb25zLmluc2VydEF0ID0gXCJib3R0b21cIjtcblxuXHR2YXIgc3R5bGVzID0gbGlzdFRvU3R5bGVzKGxpc3QsIG9wdGlvbnMpO1xuXG5cdGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucyk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSAobmV3TGlzdCkge1xuXHRcdHZhciBtYXlSZW1vdmUgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcblx0XHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXG5cdFx0XHRkb21TdHlsZS5yZWZzLS07XG5cdFx0XHRtYXlSZW1vdmUucHVzaChkb21TdHlsZSk7XG5cdFx0fVxuXG5cdFx0aWYobmV3TGlzdCkge1xuXHRcdFx0dmFyIG5ld1N0eWxlcyA9IGxpc3RUb1N0eWxlcyhuZXdMaXN0LCBvcHRpb25zKTtcblx0XHRcdGFkZFN0eWxlc1RvRG9tKG5ld1N0eWxlcywgb3B0aW9ucyk7XG5cdFx0fVxuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBtYXlSZW1vdmUubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBkb21TdHlsZSA9IG1heVJlbW92ZVtpXTtcblxuXHRcdFx0aWYoZG9tU3R5bGUucmVmcyA9PT0gMCkge1xuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSBkb21TdHlsZS5wYXJ0c1tqXSgpO1xuXG5cdFx0XHRcdGRlbGV0ZSBzdHlsZXNJbkRvbVtkb21TdHlsZS5pZF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufTtcblxuZnVuY3Rpb24gYWRkU3R5bGVzVG9Eb20gKHN0eWxlcywgb3B0aW9ucykge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXG5cdFx0aWYoZG9tU3R5bGUpIHtcblx0XHRcdGRvbVN0eWxlLnJlZnMrKztcblxuXHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKGl0ZW0ucGFydHNbal0pO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IoOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRkb21TdHlsZS5wYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHBhcnRzID0gW107XG5cblx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdHBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xuXHRcdFx0fVxuXG5cdFx0XHRzdHlsZXNJbkRvbVtpdGVtLmlkXSA9IHtpZDogaXRlbS5pZCwgcmVmczogMSwgcGFydHM6IHBhcnRzfTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gbGlzdFRvU3R5bGVzIChsaXN0LCBvcHRpb25zKSB7XG5cdHZhciBzdHlsZXMgPSBbXTtcblx0dmFyIG5ld1N0eWxlcyA9IHt9O1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBpdGVtID0gbGlzdFtpXTtcblx0XHR2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcblx0XHR2YXIgY3NzID0gaXRlbVsxXTtcblx0XHR2YXIgbWVkaWEgPSBpdGVtWzJdO1xuXHRcdHZhciBzb3VyY2VNYXAgPSBpdGVtWzNdO1xuXHRcdHZhciBwYXJ0ID0ge2NzczogY3NzLCBtZWRpYTogbWVkaWEsIHNvdXJjZU1hcDogc291cmNlTWFwfTtcblxuXHRcdGlmKCFuZXdTdHlsZXNbaWRdKSBzdHlsZXMucHVzaChuZXdTdHlsZXNbaWRdID0ge2lkOiBpZCwgcGFydHM6IFtwYXJ0XX0pO1xuXHRcdGVsc2UgbmV3U3R5bGVzW2lkXS5wYXJ0cy5wdXNoKHBhcnQpO1xuXHR9XG5cblx0cmV0dXJuIHN0eWxlcztcbn1cblxuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50IChvcHRpb25zLCBzdHlsZSkge1xuXHR2YXIgdGFyZ2V0ID0gZ2V0RWxlbWVudChvcHRpb25zLmluc2VydEludG8pXG5cblx0aWYgKCF0YXJnZXQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydEludG8nIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcblx0fVxuXG5cdHZhciBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCA9IHN0eWxlc0luc2VydGVkQXRUb3Bbc3R5bGVzSW5zZXJ0ZWRBdFRvcC5sZW5ndGggLSAxXTtcblxuXHRpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJ0b3BcIikge1xuXHRcdGlmICghbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3ApIHtcblx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoc3R5bGUsIHRhcmdldC5maXJzdENoaWxkKTtcblx0XHR9IGVsc2UgaWYgKGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wLm5leHRTaWJsaW5nKSB7XG5cdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG5cdFx0fVxuXHRcdHN0eWxlc0luc2VydGVkQXRUb3AucHVzaChzdHlsZSk7XG5cdH0gZWxzZSBpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJib3R0b21cIikge1xuXHRcdHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwib2JqZWN0XCIgJiYgb3B0aW9ucy5pbnNlcnRBdC5iZWZvcmUpIHtcblx0XHR2YXIgbmV4dFNpYmxpbmcgPSBnZXRFbGVtZW50KG9wdGlvbnMuaW5zZXJ0QXQuYmVmb3JlLCB0YXJnZXQpO1xuXHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoc3R5bGUsIG5leHRTaWJsaW5nKTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJbU3R5bGUgTG9hZGVyXVxcblxcbiBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgJ2luc2VydEF0JyAoJ29wdGlvbnMuaW5zZXJ0QXQnKSBmb3VuZC5cXG4gTXVzdCBiZSAndG9wJywgJ2JvdHRvbScsIG9yIE9iamVjdC5cXG4gKGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvc3R5bGUtbG9hZGVyI2luc2VydGF0KVxcblwiKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQgKHN0eWxlKSB7XG5cdGlmIChzdHlsZS5wYXJlbnROb2RlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cdHN0eWxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGUpO1xuXG5cdHZhciBpZHggPSBzdHlsZXNJbnNlcnRlZEF0VG9wLmluZGV4T2Yoc3R5bGUpO1xuXHRpZihpZHggPj0gMCkge1xuXHRcdHN0eWxlc0luc2VydGVkQXRUb3Auc3BsaWNlKGlkeCwgMSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50IChvcHRpb25zKSB7XG5cdHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblxuXHRpZihvcHRpb25zLmF0dHJzLnR5cGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdG9wdGlvbnMuYXR0cnMudHlwZSA9IFwidGV4dC9jc3NcIjtcblx0fVxuXG5cdGlmKG9wdGlvbnMuYXR0cnMubm9uY2UgPT09IHVuZGVmaW5lZCkge1xuXHRcdHZhciBub25jZSA9IGdldE5vbmNlKCk7XG5cdFx0aWYgKG5vbmNlKSB7XG5cdFx0XHRvcHRpb25zLmF0dHJzLm5vbmNlID0gbm9uY2U7XG5cdFx0fVxuXHR9XG5cblx0YWRkQXR0cnMoc3R5bGUsIG9wdGlvbnMuYXR0cnMpO1xuXHRpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGUpO1xuXG5cdHJldHVybiBzdHlsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGlua0VsZW1lbnQgKG9wdGlvbnMpIHtcblx0dmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcblxuXHRpZihvcHRpb25zLmF0dHJzLnR5cGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdG9wdGlvbnMuYXR0cnMudHlwZSA9IFwidGV4dC9jc3NcIjtcblx0fVxuXHRvcHRpb25zLmF0dHJzLnJlbCA9IFwic3R5bGVzaGVldFwiO1xuXG5cdGFkZEF0dHJzKGxpbmssIG9wdGlvbnMuYXR0cnMpO1xuXHRpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgbGluayk7XG5cblx0cmV0dXJuIGxpbms7XG59XG5cbmZ1bmN0aW9uIGFkZEF0dHJzIChlbCwgYXR0cnMpIHtcblx0T2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXHRcdGVsLnNldEF0dHJpYnV0ZShrZXksIGF0dHJzW2tleV0pO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9uY2UoKSB7XG5cdGlmICh0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRyZXR1cm4gX193ZWJwYWNrX25vbmNlX187XG59XG5cbmZ1bmN0aW9uIGFkZFN0eWxlIChvYmosIG9wdGlvbnMpIHtcblx0dmFyIHN0eWxlLCB1cGRhdGUsIHJlbW92ZSwgcmVzdWx0O1xuXG5cdC8vIElmIGEgdHJhbnNmb3JtIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLCBydW4gaXQgb24gdGhlIGNzc1xuXHRpZiAob3B0aW9ucy50cmFuc2Zvcm0gJiYgb2JqLmNzcykge1xuXHQgICAgcmVzdWx0ID0gdHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nXG5cdFx0ID8gb3B0aW9ucy50cmFuc2Zvcm0ob2JqLmNzcykgXG5cdFx0IDogb3B0aW9ucy50cmFuc2Zvcm0uZGVmYXVsdChvYmouY3NzKTtcblxuXHQgICAgaWYgKHJlc3VsdCkge1xuXHQgICAgXHQvLyBJZiB0cmFuc2Zvcm0gcmV0dXJucyBhIHZhbHVlLCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBjc3MuXG5cdCAgICBcdC8vIFRoaXMgYWxsb3dzIHJ1bm5pbmcgcnVudGltZSB0cmFuc2Zvcm1hdGlvbnMgb24gdGhlIGNzcy5cblx0ICAgIFx0b2JqLmNzcyA9IHJlc3VsdDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICBcdC8vIElmIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gcmV0dXJucyBhIGZhbHN5IHZhbHVlLCBkb24ndCBhZGQgdGhpcyBjc3MuXG5cdCAgICBcdC8vIFRoaXMgYWxsb3dzIGNvbmRpdGlvbmFsIGxvYWRpbmcgb2YgY3NzXG5cdCAgICBcdHJldHVybiBmdW5jdGlvbigpIHtcblx0ICAgIFx0XHQvLyBub29wXG5cdCAgICBcdH07XG5cdCAgICB9XG5cdH1cblxuXHRpZiAob3B0aW9ucy5zaW5nbGV0b24pIHtcblx0XHR2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcblxuXHRcdHN0eWxlID0gc2luZ2xldG9uIHx8IChzaW5nbGV0b24gPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucykpO1xuXG5cdFx0dXBkYXRlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlLCBzdHlsZUluZGV4LCBmYWxzZSk7XG5cdFx0cmVtb3ZlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlLCBzdHlsZUluZGV4LCB0cnVlKTtcblxuXHR9IGVsc2UgaWYgKFxuXHRcdG9iai5zb3VyY2VNYXAgJiZcblx0XHR0eXBlb2YgVVJMID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgVVJMLmNyZWF0ZU9iamVjdFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIFVSTC5yZXZva2VPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxuXHRcdHR5cGVvZiBCbG9iID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRcdHN0eWxlID0gY3JlYXRlTGlua0VsZW1lbnQob3B0aW9ucyk7XG5cdFx0dXBkYXRlID0gdXBkYXRlTGluay5iaW5kKG51bGwsIHN0eWxlLCBvcHRpb25zKTtcblx0XHRyZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGUpO1xuXG5cdFx0XHRpZihzdHlsZS5ocmVmKSBVUkwucmV2b2tlT2JqZWN0VVJMKHN0eWxlLmhyZWYpO1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0c3R5bGUgPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG5cdFx0dXBkYXRlID0gYXBwbHlUb1RhZy5iaW5kKG51bGwsIHN0eWxlKTtcblx0XHRyZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGUpO1xuXHRcdH07XG5cdH1cblxuXHR1cGRhdGUob2JqKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlU3R5bGUgKG5ld09iaikge1xuXHRcdGlmIChuZXdPYmopIHtcblx0XHRcdGlmIChcblx0XHRcdFx0bmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJlxuXHRcdFx0XHRuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJlxuXHRcdFx0XHRuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR1cGRhdGUob2JqID0gbmV3T2JqKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVtb3ZlKCk7XG5cdFx0fVxuXHR9O1xufVxuXG52YXIgcmVwbGFjZVRleHQgPSAoZnVuY3Rpb24gKCkge1xuXHR2YXIgdGV4dFN0b3JlID0gW107XG5cblx0cmV0dXJuIGZ1bmN0aW9uIChpbmRleCwgcmVwbGFjZW1lbnQpIHtcblx0XHR0ZXh0U3RvcmVbaW5kZXhdID0gcmVwbGFjZW1lbnQ7XG5cblx0XHRyZXR1cm4gdGV4dFN0b3JlLmZpbHRlcihCb29sZWFuKS5qb2luKCdcXG4nKTtcblx0fTtcbn0pKCk7XG5cbmZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcgKHN0eWxlLCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcblx0dmFyIGNzcyA9IHJlbW92ZSA/IFwiXCIgOiBvYmouY3NzO1xuXG5cdGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7XG5cdFx0c3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gcmVwbGFjZVRleHQoaW5kZXgsIGNzcyk7XG5cdH0gZWxzZSB7XG5cdFx0dmFyIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpO1xuXHRcdHZhciBjaGlsZE5vZGVzID0gc3R5bGUuY2hpbGROb2RlcztcblxuXHRcdGlmIChjaGlsZE5vZGVzW2luZGV4XSkgc3R5bGUucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xuXG5cdFx0aWYgKGNoaWxkTm9kZXMubGVuZ3RoKSB7XG5cdFx0XHRzdHlsZS5pbnNlcnRCZWZvcmUoY3NzTm9kZSwgY2hpbGROb2Rlc1tpbmRleF0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdHlsZS5hcHBlbmRDaGlsZChjc3NOb2RlKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gYXBwbHlUb1RhZyAoc3R5bGUsIG9iaikge1xuXHR2YXIgY3NzID0gb2JqLmNzcztcblx0dmFyIG1lZGlhID0gb2JqLm1lZGlhO1xuXG5cdGlmKG1lZGlhKSB7XG5cdFx0c3R5bGUuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgbWVkaWEpXG5cdH1cblxuXHRpZihzdHlsZS5zdHlsZVNoZWV0KSB7XG5cdFx0c3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuXHR9IGVsc2Uge1xuXHRcdHdoaWxlKHN0eWxlLmZpcnN0Q2hpbGQpIHtcblx0XHRcdHN0eWxlLnJlbW92ZUNoaWxkKHN0eWxlLmZpcnN0Q2hpbGQpO1xuXHRcdH1cblxuXHRcdHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxpbmsgKGxpbmssIG9wdGlvbnMsIG9iaikge1xuXHR2YXIgY3NzID0gb2JqLmNzcztcblx0dmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG5cblx0Lypcblx0XHRJZiBjb252ZXJ0VG9BYnNvbHV0ZVVybHMgaXNuJ3QgZGVmaW5lZCwgYnV0IHNvdXJjZW1hcHMgYXJlIGVuYWJsZWRcblx0XHRhbmQgdGhlcmUgaXMgbm8gcHVibGljUGF0aCBkZWZpbmVkIHRoZW4gbGV0cyB0dXJuIGNvbnZlcnRUb0Fic29sdXRlVXJsc1xuXHRcdG9uIGJ5IGRlZmF1bHQuICBPdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgY29udmVydFRvQWJzb2x1dGVVcmxzIG9wdGlvblxuXHRcdGRpcmVjdGx5XG5cdCovXG5cdHZhciBhdXRvRml4VXJscyA9IG9wdGlvbnMuY29udmVydFRvQWJzb2x1dGVVcmxzID09PSB1bmRlZmluZWQgJiYgc291cmNlTWFwO1xuXG5cdGlmIChvcHRpb25zLmNvbnZlcnRUb0Fic29sdXRlVXJscyB8fCBhdXRvRml4VXJscykge1xuXHRcdGNzcyA9IGZpeFVybHMoY3NzKTtcblx0fVxuXG5cdGlmIChzb3VyY2VNYXApIHtcblx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNjYwMzg3NVxuXHRcdGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpICsgXCIgKi9cIjtcblx0fVxuXG5cdHZhciBibG9iID0gbmV3IEJsb2IoW2Nzc10sIHsgdHlwZTogXCJ0ZXh0L2Nzc1wiIH0pO1xuXG5cdHZhciBvbGRTcmMgPSBsaW5rLmhyZWY7XG5cblx0bGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuXHRpZihvbGRTcmMpIFVSTC5yZXZva2VPYmplY3RVUkwob2xkU3JjKTtcbn1cbiIsIlxuLyoqXG4gKiBXaGVuIHNvdXJjZSBtYXBzIGFyZSBlbmFibGVkLCBgc3R5bGUtbG9hZGVyYCB1c2VzIGEgbGluayBlbGVtZW50IHdpdGggYSBkYXRhLXVyaSB0b1xuICogZW1iZWQgdGhlIGNzcyBvbiB0aGUgcGFnZS4gVGhpcyBicmVha3MgYWxsIHJlbGF0aXZlIHVybHMgYmVjYXVzZSBub3cgdGhleSBhcmUgcmVsYXRpdmUgdG8gYVxuICogYnVuZGxlIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgcGFnZS5cbiAqXG4gKiBPbmUgc29sdXRpb24gaXMgdG8gb25seSB1c2UgZnVsbCB1cmxzLCBidXQgdGhhdCBtYXkgYmUgaW1wb3NzaWJsZS5cbiAqXG4gKiBJbnN0ZWFkLCB0aGlzIGZ1bmN0aW9uIFwiZml4ZXNcIiB0aGUgcmVsYXRpdmUgdXJscyB0byBiZSBhYnNvbHV0ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcGFnZSBsb2NhdGlvbi5cbiAqXG4gKiBBIHJ1ZGltZW50YXJ5IHRlc3Qgc3VpdGUgaXMgbG9jYXRlZCBhdCBgdGVzdC9maXhVcmxzLmpzYCBhbmQgY2FuIGJlIHJ1biB2aWEgdGhlIGBucG0gdGVzdGAgY29tbWFuZC5cbiAqXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzKSB7XG4gIC8vIGdldCBjdXJyZW50IGxvY2F0aW9uXG4gIHZhciBsb2NhdGlvbiA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmxvY2F0aW9uO1xuXG4gIGlmICghbG9jYXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaXhVcmxzIHJlcXVpcmVzIHdpbmRvdy5sb2NhdGlvblwiKTtcbiAgfVxuXG5cdC8vIGJsYW5rIG9yIG51bGw/XG5cdGlmICghY3NzIHx8IHR5cGVvZiBjc3MgIT09IFwic3RyaW5nXCIpIHtcblx0ICByZXR1cm4gY3NzO1xuICB9XG5cbiAgdmFyIGJhc2VVcmwgPSBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3Q7XG4gIHZhciBjdXJyZW50RGlyID0gYmFzZVVybCArIGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1xcL1teXFwvXSokLywgXCIvXCIpO1xuXG5cdC8vIGNvbnZlcnQgZWFjaCB1cmwoLi4uKVxuXHQvKlxuXHRUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBqdXN0IGEgd2F5IHRvIHJlY3Vyc2l2ZWx5IG1hdGNoIGJyYWNrZXRzIHdpdGhpblxuXHRhIHN0cmluZy5cblxuXHQgL3VybFxccypcXCggID0gTWF0Y2ggb24gdGhlIHdvcmQgXCJ1cmxcIiB3aXRoIGFueSB3aGl0ZXNwYWNlIGFmdGVyIGl0IGFuZCB0aGVuIGEgcGFyZW5zXG5cdCAgICggID0gU3RhcnQgYSBjYXB0dXJpbmcgZ3JvdXBcblx0ICAgICAoPzogID0gU3RhcnQgYSBub24tY2FwdHVyaW5nIGdyb3VwXG5cdCAgICAgICAgIFteKShdICA9IE1hdGNoIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSBwYXJlbnRoZXNlc1xuXHQgICAgICAgICB8ICA9IE9SXG5cdCAgICAgICAgIFxcKCAgPSBNYXRjaCBhIHN0YXJ0IHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAoPzogID0gU3RhcnQgYW5vdGhlciBub24tY2FwdHVyaW5nIGdyb3Vwc1xuXHQgICAgICAgICAgICAgICAgIFteKShdKyAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICB8ICA9IE9SXG5cdCAgICAgICAgICAgICAgICAgXFwoICA9IE1hdGNoIGEgc3RhcnQgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICAgICAgW14pKF0qICA9IE1hdGNoIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgICAgIFxcKSAgPSBNYXRjaCBhIGVuZCBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgKSAgPSBFbmQgR3JvdXBcbiAgICAgICAgICAgICAgKlxcKSA9IE1hdGNoIGFueXRoaW5nIGFuZCB0aGVuIGEgY2xvc2UgcGFyZW5zXG4gICAgICAgICAgKSAgPSBDbG9zZSBub24tY2FwdHVyaW5nIGdyb3VwXG4gICAgICAgICAgKiAgPSBNYXRjaCBhbnl0aGluZ1xuICAgICAgICkgID0gQ2xvc2UgY2FwdHVyaW5nIGdyb3VwXG5cdCBcXCkgID0gTWF0Y2ggYSBjbG9zZSBwYXJlbnNcblxuXHQgL2dpICA9IEdldCBhbGwgbWF0Y2hlcywgbm90IHRoZSBmaXJzdC4gIEJlIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqL1xuXHR2YXIgZml4ZWRDc3MgPSBjc3MucmVwbGFjZSgvdXJsXFxzKlxcKCgoPzpbXikoXXxcXCgoPzpbXikoXSt8XFwoW14pKF0qXFwpKSpcXCkpKilcXCkvZ2ksIGZ1bmN0aW9uKGZ1bGxNYXRjaCwgb3JpZ1VybCkge1xuXHRcdC8vIHN0cmlwIHF1b3RlcyAoaWYgdGhleSBleGlzdClcblx0XHR2YXIgdW5xdW90ZWRPcmlnVXJsID0gb3JpZ1VybFxuXHRcdFx0LnRyaW0oKVxuXHRcdFx0LnJlcGxhY2UoL15cIiguKilcIiQvLCBmdW5jdGlvbihvLCAkMSl7IHJldHVybiAkMTsgfSlcblx0XHRcdC5yZXBsYWNlKC9eJyguKiknJC8sIGZ1bmN0aW9uKG8sICQxKXsgcmV0dXJuICQxOyB9KTtcblxuXHRcdC8vIGFscmVhZHkgYSBmdWxsIHVybD8gbm8gY2hhbmdlXG5cdFx0aWYgKC9eKCN8ZGF0YTp8aHR0cDpcXC9cXC98aHR0cHM6XFwvXFwvfGZpbGU6XFwvXFwvXFwvfFxccyokKS9pLnRlc3QodW5xdW90ZWRPcmlnVXJsKSkge1xuXHRcdCAgcmV0dXJuIGZ1bGxNYXRjaDtcblx0XHR9XG5cblx0XHQvLyBjb252ZXJ0IHRoZSB1cmwgdG8gYSBmdWxsIHVybFxuXHRcdHZhciBuZXdVcmw7XG5cblx0XHRpZiAodW5xdW90ZWRPcmlnVXJsLmluZGV4T2YoXCIvL1wiKSA9PT0gMCkge1xuXHRcdCAgXHQvL1RPRE86IHNob3VsZCB3ZSBhZGQgcHJvdG9jb2w/XG5cdFx0XHRuZXdVcmwgPSB1bnF1b3RlZE9yaWdVcmw7XG5cdFx0fSBlbHNlIGlmICh1bnF1b3RlZE9yaWdVcmwuaW5kZXhPZihcIi9cIikgPT09IDApIHtcblx0XHRcdC8vIHBhdGggc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIHVybFxuXHRcdFx0bmV3VXJsID0gYmFzZVVybCArIHVucXVvdGVkT3JpZ1VybDsgLy8gYWxyZWFkeSBzdGFydHMgd2l0aCAnLydcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gcGF0aCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gY3VycmVudCBkaXJlY3Rvcnlcblx0XHRcdG5ld1VybCA9IGN1cnJlbnREaXIgKyB1bnF1b3RlZE9yaWdVcmwucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpOyAvLyBTdHJpcCBsZWFkaW5nICcuLydcblx0XHR9XG5cblx0XHQvLyBzZW5kIGJhY2sgdGhlIGZpeGVkIHVybCguLi4pXG5cdFx0cmV0dXJuIFwidXJsKFwiICsgSlNPTi5zdHJpbmdpZnkobmV3VXJsKSArIFwiKVwiO1xuXHR9KTtcblxuXHQvLyBzZW5kIGJhY2sgdGhlIGZpeGVkIGNzc1xuXHRyZXR1cm4gZml4ZWRDc3M7XG59O1xuIiwiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6ZSgpfSgwLGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdCh0KXt2YXIgZT10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24obil7cmV0dXJuIGUucmVzb2x2ZSh0KCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gbn0pfSxmdW5jdGlvbihuKXtyZXR1cm4gZS5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBlLnJlamVjdChuKX0pfSl9ZnVuY3Rpb24gZSh0KXtyZXR1cm4hKCF0fHx2b2lkIDA9PT10Lmxlbmd0aCl9ZnVuY3Rpb24gbigpe31mdW5jdGlvbiByKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9taXNlcyBtdXN0IGJlIGNvbnN0cnVjdGVkIHZpYSBuZXdcIik7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKFwibm90IGEgZnVuY3Rpb25cIik7dGhpcy5fc3RhdGU9MCx0aGlzLl9oYW5kbGVkPSExLHRoaXMuX3ZhbHVlPXZvaWQgMCx0aGlzLl9kZWZlcnJlZHM9W10sYyh0LHRoaXMpfWZ1bmN0aW9uIG8odCxlKXtmb3IoOzM9PT10Ll9zdGF0ZTspdD10Ll92YWx1ZTswIT09dC5fc3RhdGU/KHQuX2hhbmRsZWQ9ITAsci5faW1tZWRpYXRlRm4oZnVuY3Rpb24oKXt2YXIgbj0xPT09dC5fc3RhdGU/ZS5vbkZ1bGZpbGxlZDplLm9uUmVqZWN0ZWQ7aWYobnVsbCE9PW4pe3ZhciByO3RyeXtyPW4odC5fdmFsdWUpfWNhdGNoKHQpe3JldHVybiB2b2lkIGEoZS5wcm9taXNlLHQpfWkoZS5wcm9taXNlLHIpfWVsc2UoMT09PXQuX3N0YXRlP2k6YSkoZS5wcm9taXNlLHQuX3ZhbHVlKX0pKTp0Ll9kZWZlcnJlZHMucHVzaChlKX1mdW5jdGlvbiBpKHQsZSl7dHJ5e2lmKGU9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoXCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLlwiKTtpZihlJiYoXCJvYmplY3RcIj09dHlwZW9mIGV8fFwiZnVuY3Rpb25cIj09dHlwZW9mIGUpKXt2YXIgbj1lLnRoZW47aWYoZSBpbnN0YW5jZW9mIHIpcmV0dXJuIHQuX3N0YXRlPTMsdC5fdmFsdWU9ZSx2b2lkIHUodCk7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgbilyZXR1cm4gdm9pZCBjKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dC5hcHBseShlLGFyZ3VtZW50cyl9fShuLGUpLHQpfXQuX3N0YXRlPTEsdC5fdmFsdWU9ZSx1KHQpfWNhdGNoKGUpe2EodCxlKX19ZnVuY3Rpb24gYSh0LGUpe3QuX3N0YXRlPTIsdC5fdmFsdWU9ZSx1KHQpfWZ1bmN0aW9uIHUodCl7Mj09PXQuX3N0YXRlJiYwPT09dC5fZGVmZXJyZWRzLmxlbmd0aCYmci5faW1tZWRpYXRlRm4oZnVuY3Rpb24oKXt0Ll9oYW5kbGVkfHxyLl91bmhhbmRsZWRSZWplY3Rpb25Gbih0Ll92YWx1ZSl9KTtmb3IodmFyIGU9MCxuPXQuX2RlZmVycmVkcy5sZW5ndGg7bj5lO2UrKylvKHQsdC5fZGVmZXJyZWRzW2VdKTt0Ll9kZWZlcnJlZHM9bnVsbH1mdW5jdGlvbiBjKHQsZSl7dmFyIG49ITE7dHJ5e3QoZnVuY3Rpb24odCl7bnx8KG49ITAsaShlLHQpKX0sZnVuY3Rpb24odCl7bnx8KG49ITAsYShlLHQpKX0pfWNhdGNoKHQpe2lmKG4pcmV0dXJuO249ITAsYShlLHQpfX12YXIgZj1zZXRUaW1lb3V0O3IucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4obnVsbCx0KX0sci5wcm90b3R5cGUudGhlbj1mdW5jdGlvbih0LGUpe3ZhciByPW5ldyB0aGlzLmNvbnN0cnVjdG9yKG4pO3JldHVybiBvKHRoaXMsbmV3IGZ1bmN0aW9uKHQsZSxuKXt0aGlzLm9uRnVsZmlsbGVkPVwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dDpudWxsLHRoaXMub25SZWplY3RlZD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2U6bnVsbCx0aGlzLnByb21pc2U9bn0odCxlLHIpKSxyfSxyLnByb3RvdHlwZS5maW5hbGx5PXQsci5hbGw9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKG4scil7ZnVuY3Rpb24gbyh0LGUpe3RyeXtpZihlJiYoXCJvYmplY3RcIj09dHlwZW9mIGV8fFwiZnVuY3Rpb25cIj09dHlwZW9mIGUpKXt2YXIgdT1lLnRoZW47aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdSlyZXR1cm4gdm9pZCB1LmNhbGwoZSxmdW5jdGlvbihlKXtvKHQsZSl9LHIpfWlbdF09ZSwwPT0tLWEmJm4oaSl9Y2F0Y2godCl7cih0KX19aWYoIWUodCkpcmV0dXJuIHIobmV3IFR5cGVFcnJvcihcIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXlcIikpO3ZhciBpPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpO2lmKDA9PT1pLmxlbmd0aClyZXR1cm4gbihbXSk7Zm9yKHZhciBhPWkubGVuZ3RoLHU9MDtpLmxlbmd0aD51O3UrKylvKHUsaVt1XSl9KX0sci5yZXNvbHZlPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3Rvcj09PXI/dDpuZXcgcihmdW5jdGlvbihlKXtlKHQpfSl9LHIucmVqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcihmdW5jdGlvbihlLG4pe24odCl9KX0sci5yYWNlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcihmdW5jdGlvbihuLG8pe2lmKCFlKHQpKXJldHVybiBvKG5ldyBUeXBlRXJyb3IoXCJQcm9taXNlLnJhY2UgYWNjZXB0cyBhbiBhcnJheVwiKSk7Zm9yKHZhciBpPTAsYT10Lmxlbmd0aDthPmk7aSsrKXIucmVzb2x2ZSh0W2ldKS50aGVuKG4sbyl9KX0sci5faW1tZWRpYXRlRm49XCJmdW5jdGlvblwiPT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZmdW5jdGlvbih0KXtzZXRJbW1lZGlhdGUodCl9fHxmdW5jdGlvbih0KXtmKHQsMCl9LHIuX3VuaGFuZGxlZFJlamVjdGlvbkZuPWZ1bmN0aW9uKHQpe3ZvaWQgMCE9PWNvbnNvbGUmJmNvbnNvbGUmJmNvbnNvbGUud2FybihcIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjpcIix0KX07dmFyIHM9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZilyZXR1cm4gc2VsZjtpZihcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93KXJldHVybiB3aW5kb3c7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbClyZXR1cm4gZ2xvYmFsO3Rocm93IEVycm9yKFwidW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0XCIpfSgpO1wiUHJvbWlzZVwiaW4gcz9zLlByb21pc2UucHJvdG90eXBlLmZpbmFsbHl8fChzLlByb21pc2UucHJvdG90eXBlLmZpbmFsbHk9dCk6cy5Qcm9taXNlPXJ9KSxmdW5jdGlvbih0LGUpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP2UoZXhwb3J0cyk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJleHBvcnRzXCJdLGUpOmUoKHQ9dHx8c2VsZikuY2xpcGJvYXJkPXt9KX0odGhpcyxmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBlKHQsZSxuLHIpe3JldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKGZ1bmN0aW9uKG8saSl7ZnVuY3Rpb24gYSh0KXt0cnl7YyhyLm5leHQodCkpfWNhdGNoKHQpe2kodCl9fWZ1bmN0aW9uIHUodCl7dHJ5e2Moci50aHJvdyh0KSl9Y2F0Y2godCl7aSh0KX19ZnVuY3Rpb24gYyh0KXt0LmRvbmU/byh0LnZhbHVlKTpuZXcgbihmdW5jdGlvbihlKXtlKHQudmFsdWUpfSkudGhlbihhLHUpfWMoKHI9ci5hcHBseSh0LGV8fFtdKSkubmV4dCgpKX0pfWZ1bmN0aW9uIG4odCxlKXt2YXIgbixyLG8saSxhPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZigxJm9bMF0pdGhyb3cgb1sxXTtyZXR1cm4gb1sxXX0sdHJ5czpbXSxvcHM6W119O3JldHVybiBpPXtuZXh0OnUoMCksdGhyb3c6dSgxKSxyZXR1cm46dSgyKX0sXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiYoaVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxpO2Z1bmN0aW9uIHUoaSl7cmV0dXJuIGZ1bmN0aW9uKHUpe3JldHVybiBmdW5jdGlvbihpKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO2Zvcig7YTspdHJ5e2lmKG49MSxyJiYobz0yJmlbMF0/ci5yZXR1cm46aVswXT9yLnRocm93fHwoKG89ci5yZXR1cm4pJiZvLmNhbGwociksMCk6ci5uZXh0KSYmIShvPW8uY2FsbChyLGlbMV0pKS5kb25lKXJldHVybiBvO3N3aXRjaChyPTAsbyYmKGk9WzImaVswXSxvLnZhbHVlXSksaVswXSl7Y2FzZSAwOmNhc2UgMTpvPWk7YnJlYWs7Y2FzZSA0OnJldHVybiBhLmxhYmVsKysse3ZhbHVlOmlbMV0sZG9uZTohMX07Y2FzZSA1OmEubGFiZWwrKyxyPWlbMV0saT1bMF07Y29udGludWU7Y2FzZSA3Omk9YS5vcHMucG9wKCksYS50cnlzLnBvcCgpO2NvbnRpbnVlO2RlZmF1bHQ6aWYoIShvPShvPWEudHJ5cykubGVuZ3RoPjAmJm9bby5sZW5ndGgtMV0pJiYoNj09PWlbMF18fDI9PT1pWzBdKSl7YT0wO2NvbnRpbnVlfWlmKDM9PT1pWzBdJiYoIW98fGlbMV0+b1swXSYmaVsxXTxvWzNdKSl7YS5sYWJlbD1pWzFdO2JyZWFrfWlmKDY9PT1pWzBdJiZhLmxhYmVsPG9bMV0pe2EubGFiZWw9b1sxXSxvPWk7YnJlYWt9aWYobyYmYS5sYWJlbDxvWzJdKXthLmxhYmVsPW9bMl0sYS5vcHMucHVzaChpKTticmVha31vWzJdJiZhLm9wcy5wb3AoKSxhLnRyeXMucG9wKCk7Y29udGludWV9aT1lLmNhbGwodCxhKX1jYXRjaCh0KXtpPVs2LHRdLHI9MH1maW5hbGx5e249bz0wfWlmKDUmaVswXSl0aHJvdyBpWzFdO3JldHVybnt2YWx1ZTppWzBdP2lbMV06dm9pZCAwLGRvbmU6ITB9fShbaSx1XSl9fX12YXIgcj1bXCJ0ZXh0L3BsYWluXCIsXCJ0ZXh0L2h0bWxcIl07dmFyIG89ZnVuY3Rpb24oKXsoY29uc29sZS53YXJufHxjb25zb2xlLmxvZykuY2FsbChhcmd1bWVudHMpfS5iaW5kKGNvbnNvbGUsXCJbY2xpcGJvYXJkLXBvbHlmaWxsXVwiKSxpPSEwO3ZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMubT17fX1yZXR1cm4gdC5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0LGUpe2kmJi0xPT09ci5pbmRleE9mKHQpJiZvKFwiVW5rbm93biBkYXRhIHR5cGU6IFwiK3QsXCJDYWxsIGNsaXBib2FyZC5zdXBwcmVzc1dhcm5pbmdzKCkgdG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nLlwiKSx0aGlzLm1bdF09ZX0sdC5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tW3RdfSx0LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzLm0pdCh0aGlzLm1bZV0sZSl9LHR9KCksdT1mdW5jdGlvbih0KXt9LGM9ITA7dmFyIGY9ZnVuY3Rpb24oKXsoY29uc29sZS53YXJufHxjb25zb2xlLmxvZykuYXBwbHkoY29uc29sZSxhcmd1bWVudHMpfS5iaW5kKFwiW2NsaXBib2FyZC1wb2x5ZmlsbF1cIikscz1cInRleHQvcGxhaW5cIjtmdW5jdGlvbiBsKHQpe3U9dH1mdW5jdGlvbiBkKCl7Yz0hMSxpPSExfWZ1bmN0aW9uIHAodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIG4odGhpcyxmdW5jdGlvbihuKXtpZihjJiYhdC5nZXREYXRhKHMpJiZmKFwiY2xpcGJvYXJkLndyaXRlKCkgd2FzIGNhbGxlZCB3aXRob3V0IGEgYHRleHQvcGxhaW5gIGRhdGEgdHlwZS4gT24gc29tZSBwbGF0Zm9ybXMsIHRoaXMgbWF5IHJlc3VsdCBpbiBhbiBlbXB0eSBjbGlwYm9hcmQuIENhbGwgY2xpcGJvYXJkLnN1cHByZXNzV2FybmluZ3MoKSB0byBzdXBwcmVzcyB0aGlzIHdhcm5pbmcuXCIpLGooKSl7aWYoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXRhKHMpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIHdpbmRvdy5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJUZXh0XCIsZSk7dGhyb3cgbmV3IEVycm9yKFwiTm8gYHRleHQvcGxhaW5gIHZhbHVlIHdhcyBzcGVjaWZpZWQuXCIpfSh0KSlyZXR1cm5bMl07dGhyb3cgbmV3IEVycm9yKFwiQ29weWluZyBmYWlsZWQsIHBvc3NpYmx5IGJlY2F1c2UgdGhlIHVzZXIgcmVqZWN0ZWQgaXQuXCIpfWlmKHgodCkpcmV0dXJuIHUoXCJyZWd1bGFyIGV4ZWNDb3B5IHdvcmtlZFwiKSxbMl07aWYobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiRWRnZVwiKT4tMSlyZXR1cm4gdSgnVUEgXCJFZGdlXCIgPT4gYXNzdW1pbmcgc3VjY2VzcycpLFsyXTtpZihfKGRvY3VtZW50LmJvZHksdCkpcmV0dXJuIHUoXCJjb3B5VXNpbmdUZW1wU2VsZWN0aW9uIHdvcmtlZFwiKSxbMl07aWYoZnVuY3Rpb24odCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtlLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsXCItd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0ICFpbXBvcnRhbnRcIiksZS50ZXh0Q29udGVudD1cInRlbXBvcmFyeSBlbGVtZW50XCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgbj1fKGUsdCk7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksbn0odCkpcmV0dXJuIHUoXCJjb3B5VXNpbmdUZW1wRWxlbSB3b3JrZWRcIiksWzJdO2lmKHZvaWQgMCE9PShlPXQuZ2V0RGF0YShzKSkmJmZ1bmN0aW9uKHQpe3UoXCJjb3B5VGV4dFVzaW5nRE9NXCIpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLFwiLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dCAhaW1wb3J0YW50XCIpO3ZhciBuPWU7ZS5hdHRhY2hTaGFkb3cmJih1KFwiVXNpbmcgc2hhZG93IERPTS5cIiksbj1lLmF0dGFjaFNoYWRvdyh7bW9kZTpcIm9wZW5cIn0pKTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtyLmlubmVyVGV4dD10LG4uYXBwZW5kQ2hpbGQociksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKSxUKHIpO3ZhciBvPWRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtyZXR1cm4gRSgpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksb30oZSkpcmV0dXJuIHUoXCJjb3B5VGV4dFVzaW5nRE9NIHdvcmtlZFwiKSxbMl07dGhyb3cgbmV3IEVycm9yKFwiQ29weSBjb21tYW5kIGZhaWxlZC5cIil9KX0pfWZ1bmN0aW9uIGgodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZCYmbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQ/KHUoXCJVc2luZyBgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoKWAuXCIpLFsyLG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHQpXSk6WzIscChEKHQpKV19KX0pfWZ1bmN0aW9uIHYoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gbih0aGlzLGZ1bmN0aW9uKGUpe3N3aXRjaChlLmxhYmVsKXtjYXNlIDA6cmV0dXJuIHQ9RCxbNCx5KCldO2Nhc2UgMTpyZXR1cm5bMix0LmFwcGx5KHZvaWQgMCxbZS5zZW50KCldKV19fSl9KX1mdW5jdGlvbiB5KCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcyxmdW5jdGlvbih0KXtpZihuYXZpZ2F0b3IuY2xpcGJvYXJkJiZuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KXJldHVybiB1KFwiVXNpbmcgYG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKWAuXCIpLFsyLG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKV07aWYoaigpKXJldHVybiB1KFwiUmVhZGluZyB0ZXh0IHVzaW5nIElFIHN0cmF0ZWd5LlwiKSxbMixDKCldO3Rocm93IG5ldyBFcnJvcihcIlJlYWQgaXMgbm90IHN1cHBvcnRlZCBpbiB5b3VyIGJyb3dzZXIuXCIpfSl9KX12YXIgbT0hMTtmdW5jdGlvbiB3KCl7bXx8KGMmJmYoJ1RoZSBkZXByZWNhdGVkIGRlZmF1bHQgb2JqZWN0IG9mIGBjbGlwYm9hcmQtcG9seWZpbGxgIHdhcyBjYWxsZWQuIFBsZWFzZSBzd2l0Y2ggdG8gYGltcG9ydCAqIGFzIGNsaXBib2FyZCBmcm9tIFwiY2xpcGJvYXJkLXBvbHlmaWxsXCJgIGFuZCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2xnYXJyb24vY2xpcGJvYXJkLXBvbHlmaWxsL2lzc3Vlcy8xMDEgZm9yIG1vcmUgaW5mby4nKSxtPSEwKX12YXIgYj17RFQ6YSxzZXREZWJ1Z0xvZzpmdW5jdGlvbih0KXtyZXR1cm4gdygpLGwodCl9LHN1cHByZXNzV2FybmluZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdygpLGQoKX0sd3JpdGU6ZnVuY3Rpb24odCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdygpLFsyLHAodCldfSl9KX0sd3JpdGVUZXh0OmZ1bmN0aW9uKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBuKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIHcoKSxbMixoKHQpXX0pfSl9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gbih0aGlzLGZ1bmN0aW9uKHQpe3JldHVybiB3KCksWzIsdigpXX0pfSl9LHJlYWRUZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcyxmdW5jdGlvbih0KXtyZXR1cm4gdygpLFsyLHkoKV19KX0pfX0sZz1mdW5jdGlvbigpe3RoaXMuc3VjY2Vzcz0hMX07ZnVuY3Rpb24geCh0KXt2YXIgZT1uZXcgZyxuPWZ1bmN0aW9uKHQsZSxuKXt1KFwibGlzdGVuZXIgY2FsbGVkXCIpLHQuc3VjY2Vzcz0hMCxlLmZvckVhY2goZnVuY3Rpb24oZSxyKXt2YXIgbz1uLmNsaXBib2FyZERhdGE7by5zZXREYXRhKHIsZSkscj09PXMmJm8uZ2V0RGF0YShyKSE9PWUmJih1KFwic2V0dGluZyB0ZXh0L3BsYWluIGZhaWxlZFwiKSx0LnN1Y2Nlc3M9ITEpfSksbi5wcmV2ZW50RGVmYXVsdCgpfS5iaW5kKHRoaXMsZSx0KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29weVwiLG4pO3RyeXtkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIil9ZmluYWxseXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29weVwiLG4pfXJldHVybiBlLnN1Y2Nlc3N9ZnVuY3Rpb24gXyh0LGUpe1QodCk7dmFyIG49eChlKTtyZXR1cm4gRSgpLG59ZnVuY3Rpb24gVCh0KXt2YXIgZT1kb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtpZihlKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVSYW5nZSgpO24uc2VsZWN0Tm9kZUNvbnRlbnRzKHQpLGUucmVtb3ZlQWxsUmFuZ2VzKCksZS5hZGRSYW5nZShuKX19ZnVuY3Rpb24gRSgpe3ZhciB0PWRvY3VtZW50LmdldFNlbGVjdGlvbigpO3QmJnQucmVtb3ZlQWxsUmFuZ2VzKCl9ZnVuY3Rpb24gRCh0KXt2YXIgZT1uZXcgYTtyZXR1cm4gZS5zZXREYXRhKHMsdCksZX1mdW5jdGlvbiBqKCl7cmV0dXJuXCJ1bmRlZmluZWRcIj09dHlwZW9mIENsaXBib2FyZEV2ZW50JiZ2b2lkIDAhPT13aW5kb3cuY2xpcGJvYXJkRGF0YSYmdm9pZCAwIT09d2luZG93LmNsaXBib2FyZERhdGEuc2V0RGF0YX1mdW5jdGlvbiBDKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIG4odGhpcyxmdW5jdGlvbihlKXtpZihcIlwiPT09KHQ9d2luZG93LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcIlRleHRcIikpKXRocm93IG5ldyBFcnJvcihcIkVtcHR5IGNsaXBib2FyZCBvciBjb3VsZCBub3QgcmVhZCBwbGFpbiB0ZXh0IGZyb20gY2xpcGJvYXJkXCIpO3JldHVyblsyLHRdfSl9KX10LkRUPWEsdC5kZWZhdWx0PWIsdC5yZWFkPXYsdC5yZWFkVGV4dD15LHQuc2V0RGVidWdMb2c9bCx0LnN1cHByZXNzV2FybmluZ3M9ZCx0LndyaXRlPXAsdC53cml0ZVRleHQ9aCxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xpcGJvYXJkLXBvbHlmaWxsLnByb21pc2UuanMubWFwXG4iLCJ2YXIgc2NvcGUgPSAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwpIHx8XG4gICAgICAgICAgICAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZikgfHxcbiAgICAgICAgICAgIHdpbmRvdztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbi8vIE9uIHNvbWUgZXhvdGljIGVudmlyb25tZW50cywgaXQncyBub3QgY2xlYXIgd2hpY2ggb2JqZWN0IGBzZXRpbW1lZGlhdGVgIHdhc1xuLy8gYWJsZSB0byBpbnN0YWxsIG9udG8uICBTZWFyY2ggZWFjaCBwb3NzaWJpbGl0eSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbi8vIGBzZXRpbW1lZGlhdGVgIGxpYnJhcnkuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5zZXRJbW1lZGlhdGUpO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLmNsZWFySW1tZWRpYXRlKTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCB1bmRlZmluZWQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEhhbmRsZSA9IDE7IC8vIFNwZWMgc2F5cyBncmVhdGVyIHRoYW4gemVyb1xuICAgIHZhciB0YXNrc0J5SGFuZGxlID0ge307XG4gICAgdmFyIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gICAgdmFyIHJlZ2lzdGVySW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBDYWxsYmFjayBjYW4gZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYWxsYmFjayA9IG5ldyBGdW5jdGlvbihcIlwiICsgY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgLy8gQ29weSBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDFdO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgYW5kIHJlZ2lzdGVyIHRoZSB0YXNrXG4gICAgICB2YXIgdGFzayA9IHsgY2FsbGJhY2s6IGNhbGxiYWNrLCBhcmdzOiBhcmdzIH07XG4gICAgICB0YXNrc0J5SGFuZGxlW25leHRIYW5kbGVdID0gdGFzaztcbiAgICAgIHJlZ2lzdGVySW1tZWRpYXRlKG5leHRIYW5kbGUpO1xuICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW4odGFzaykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICAgICAgICB2YXIgYXJncyA9IHRhc2suYXJncztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bih0YXNrKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5JZlByZXNlbnQoaGFuZGxlKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuVXNlUG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYGdsb2JhbC5wb3N0TWVzc2FnZWAgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFuZCBjYW4ndCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAgIGlmIChnbG9iYWwucG9zdE1lc3NhZ2UgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb2xkT25NZXNzYWdlID0gZ2xvYmFsLm9ubWVzc2FnZTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKFwiXCIsIFwiKlwiKTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBvbGRPbk1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcblxuICAgICAgICB2YXIgbWVzc2FnZVByZWZpeCA9IFwic2V0SW1tZWRpYXRlJFwiICsgTWF0aC5yYW5kb20oKSArIFwiJFwiO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KCtldmVudC5kYXRhLnNsaWNlKG1lc3NhZ2VQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHN1cHBvcnRlZCwgd2Ugc2hvdWxkIGF0dGFjaCB0byB0aGUgcHJvdG90eXBlIG9mIGdsb2JhbCwgc2luY2UgdGhhdCBpcyB3aGVyZSBzZXRUaW1lb3V0IGV0IGFsLiBsaXZlLlxuICAgIHZhciBhdHRhY2hUbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsKTtcbiAgICBhdHRhY2hUbyA9IGF0dGFjaFRvICYmIGF0dGFjaFRvLnNldFRpbWVvdXQgPyBhdHRhY2hUbyA6IGdsb2JhbDtcblxuICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgZS5nLiBicm93c2VyaWZ5IGVudmlyb25tZW50cy5cbiAgICBpZiAoe30udG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiKSB7XG4gICAgICAgIC8vIEZvciBOb2RlLmpzIGJlZm9yZSAwLjlcbiAgICAgICAgaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoY2FuVXNlUG9zdE1lc3NhZ2UoKSkge1xuICAgICAgICAvLyBGb3Igbm9uLUlFMTAgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAvLyBGb3Igd2ViIHdvcmtlcnMsIHdoZXJlIHN1cHBvcnRlZFxuICAgICAgICBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChkb2MgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkge1xuICAgICAgICAvLyBGb3IgSUUgNuKAkzhcbiAgICAgICAgaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUby5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGU7XG4gICAgYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcbn0odHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgPyB0eXBlb2YgZ2xvYmFsID09PSBcInVuZGVmaW5lZFwiID8gdGhpcyA6IGdsb2JhbCA6IHNlbGYpKTtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCJpbXBvcnQgY2xpcGJvYXJkIGZyb20gJ2NsaXBib2FyZC1wb2x5ZmlsbC9idWlsZC9jbGlwYm9hcmQtcG9seWZpbGwucHJvbWlzZSdcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFkanVzdGFibGVCb3gge1xuICBjb25zdHJ1Y3RvciAoe1xuICAgIHNoYXBlRWxlbUlkID0gJ3NoYXBlJyxcbiAgICBnZW5lcmF0b3JFbGVtSWQgPSAnY29kZScsXG4gICAgY29weUNvZGVJZCA9ICdjb3B5JyxcbiAgICBjb3BpZWRDb2RlSWQgPSAnY2xpcGJvYXJkX2NvcGllZCcsXG4gICAgYm94Q29udGFpbmVySWQgPSAnYm94JyxcbiAgICB3aWR0aElucHV0SWQgPSAnd2lkdGgnLFxuICAgIGhlaWdodElucHV0SWQgPSAnaGVpZ2h0JyxcbiAgICBlbmFibGVBZHZhbmNlZElkID0gJ2VuYWJsZS1hZHZhbmNlZCcsXG4gICAgaW5pdFN0YXRlID0gbnVsbCxcbiAgICBtb3ZlYWJsZUVsZW1zIH1cbiAgICA9IHt9KSB7XG4gICAgdGhpcy5nZW5lcmF0b3JFbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2VuZXJhdG9yRWxlbUlkKVxuICAgIHRoaXMuc2hhcGVFbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2hhcGVFbGVtSWQpXG4gICAgdGhpcy5jb3BpZWRDb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29waWVkQ29kZUlkKVxuICAgIHRoaXMuYm94Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYm94Q29udGFpbmVySWQpXG4gICAgdGhpcy53aWR0aElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2lkdGhJbnB1dElkKVxuICAgIHRoaXMuaGVpZ2h0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoZWlnaHRJbnB1dElkKVxuICAgIHRoaXMud2lkdGhJbnB1dC5vbmNoYW5nZSA9ICgpID0+IHsgdGhpcy51cGRhdGVTdGF0ZSh0aGlzLndpZHRoSW5wdXQudmFsdWUsICd3aWR0aCcpIH1cbiAgICB0aGlzLmhlaWdodElucHV0Lm9uY2hhbmdlID0gKCkgPT4geyB0aGlzLnVwZGF0ZVN0YXRlKHRoaXMuaGVpZ2h0SW5wdXQudmFsdWUsICdoZWlnaHQnKSB9XG4gICAgdGhpcy5lbmFibGVBZHZhbmNlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVuYWJsZUFkdmFuY2VkSWQpXG4gICAgdGhpcy5lbmFibGVBZHZhbmNlZC5vbmNsaWNrID0gdGhpcy5lbmFibGVBZHZhbmNlZE9uQ2xpY2suYmluZCh0aGlzKVxuICAgIHRoaXMuaW5pdFN0YXRlKGluaXRTdGF0ZSlcbiAgICB0aGlzLmluaXRBZHZhbmNlZCgpXG4gICAgdGhpcy5oYW5kbGVzID0gdGhpcy5pbml0SGFuZGxlcyhtb3ZlYWJsZUVsZW1zKVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvcHlDb2RlSWQpLm9uY2xpY2sgPSB0aGlzLnNldENsaXBib2FyZC5iaW5kKHRoaXMpXG4gIH1cbiAgaW5pdEhhbmRsZXMgKG1vdmVhYmxlRWxlbXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUgbWV0aG9kIGluaXRIYW5kbGVzIScpXG4gIH1cbiAgdXBkYXRlQm9yZGVyUmFkaXVzICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUgbWV0aG9kIHVwZGF0ZUJvcmRlclJhZGl1cyEnKVxuICB9XG4gIGluaXRTdGF0ZSAoc3RhdGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUgbWV0aG9kIGluaXRTdGF0ZSEnKVxuICB9XG4gIGluaXRBZHZhbmNlZCAoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUud2lkdGggIT09ICcnICYmIHRoaXMuc3RhdGUuaGVpZ2h0ICE9PSAnJykge1xuICAgICAgdGhpcy5lbmFibGVBZHZhbmNlZC5jaGVja2VkID0gdHJ1ZVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpbWVuc2lvbi1pbnB1dCcpLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKVxuICAgIH1cbiAgfVxuICBlbmFibGVBZHZhbmNlZE9uQ2xpY2sgKGUpIHtcbiAgICBpZiAodGhpcy5lbmFibGVBZHZhbmNlZC5jaGVja2VkKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGltZW5zaW9uLWlucHV0JykuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpXG4gICAgICB0aGlzLnN0YXRlLndpZHRoID0gdGhpcy5ib3hDb250YWluZXIub2Zmc2V0V2lkdGhcbiAgICAgIHRoaXMuc3RhdGUuaGVpZ2h0ID0gdGhpcy5ib3hDb250YWluZXIub2Zmc2V0SGVpZ2h0XG4gICAgICB0aGlzLnVwZGF0ZVVJKClcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpbWVuc2lvbi1pbnB1dCcpLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKVxuICAgICAgdGhpcy51cGRhdGVTdGF0ZSgnJywgJ3dpZHRoJylcbiAgICAgIHRoaXMudXBkYXRlU3RhdGUoJycsICdoZWlnaHQnKVxuICAgICAgdGhpcy5ib3hDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJydcbiAgICAgIHRoaXMuYm94Q29udGFpbmVyLnN0eWxlLndpZHRoID0gJydcbiAgICB9XG4gIH1cblxuICBzZXRDbGlwYm9hcmQgKCkge1xuICAgIGNsaXBib2FyZC53cml0ZVRleHQodGhpcy5nZW5lcmF0b3JFbGVtLmlubmVySFRNTCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmNvcGllZENvZGUuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJhbGVydFwiPkNvcGllZCB0byBjbGlwYm9hcmQg8J+RjTwvZGl2PidcbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLmNvcGllZENvZGUuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJhbGVydFwiPvCfkpQgTm90IFN1cHBvcnRlZDwvZGl2PidcbiAgICB9KVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb3BpZWRDb2RlLmlubmVySFRNTCA9ICcnXG4gICAgfVxuICAgICAgLCAyMDAwKVxuICB9XG4gIHNldFVybEhhc2ggKGhhc2gpIHtcbiAgICBpZiAod2luZG93Lmhpc3RvcnkgJiYgJ3B1c2hTdGF0ZScgaW4gd2luZG93Lmhpc3RvcnkpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsICcjJyArIGhhc2gpXG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaGFzaFxuICAgIH1cbiAgfVxuICB1cGRhdGVTdGF0ZSAodmFsLCBrZXkpIHtcbiAgICB0aGlzLnN0YXRlW2tleV0gPSB2YWxcbiAgICB0aGlzLnVwZGF0ZVVJKClcbiAgfVxuICB1cGRhdGVVSSAoKSB7XG4gICAgdGhpcy51cGRhdGVCb3JkZXJSYWRpdXMoKVxuICAgIHRoaXMudXBkYXRlQm94KClcbiAgfVxuICB1cGRhdGVCb3ggKCkge1xuICAgIGlmICghdGhpcy5lbmFibGVBZHZhbmNlZC5jaGVja2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbGV0IHN0eWxlSGVpZ2h0ID0gdGhpcy5zdGF0ZS5oZWlnaHQgPT0gJycgPyAnJyA6IHRoaXMuc3RhdGUuaGVpZ2h0ICsgJ3B4J1xuICAgIGxldCBzdHlsZVdpZHRoID0gdGhpcy5zdGF0ZS53aWR0aCA9PSAnJyA/ICcnIDogdGhpcy5zdGF0ZS53aWR0aCArICdweCdcbiAgICB0aGlzLmJveENvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBzdHlsZUhlaWdodFxuICAgIHRoaXMuYm94Q29udGFpbmVyLnN0eWxlLndpZHRoID0gc3R5bGVXaWR0aFxuICAgIHRoaXMuaGVpZ2h0SW5wdXQudmFsdWUgPSB0aGlzLnN0YXRlLmhlaWdodFxuICAgIHRoaXMud2lkdGhJbnB1dC52YWx1ZSA9IHRoaXMuc3RhdGUud2lkdGhcbiAgfVxuICBzYXZlVXJsUGFyYW1zICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUgbWV0aG9kIHNhdmVVcmxQYXJhbXMhJylcbiAgfVxuICBzdGF0aWMgbG9hZFVybFBhcmFtcyAodXJsKSB7XG4gICAgY29uc3QgcmVnZXggPSAvIyhcXGRcXGQ/fDEwMClcXC4oXFxkXFxkP3wxMDApXFwuKFxcZFxcZD98MTAwKVxcLihcXGRcXGQ/fDEwMCktKD86KFxcZFxcZD98MTAwKVxcLihcXGRcXGQ/fDEwMClcXC4oXFxkXFxkP3wxMDApXFwuKFxcZFxcZD98MTAwKSk/LShcXGQqKS4oXFxkKikvZ21cbiAgICBsZXQgcGFyYW1zVG9BdHRyaWJ1dGUgPSBbJ2xlZnQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0Qm90dG9tJywgJ3RvcFJpZ2h0JywgJ3JpZ2h0Qm90dG9tJywgJ2JvdHRvbVJpZ2h0JywgJ2hlaWdodCcsICd3aWR0aCddXG4gICAgbGV0IGF0dHJpYnV0ZXMgPSB7fVxuICAgIGxldCBtXG4gICAgaWYgKCFyZWdleC50ZXN0KHVybCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHJlZ2V4Lmxhc3RJbmRleCA9IDBcbiAgICB3aGlsZSAoKG0gPSByZWdleC5leGVjKHVybCkpICE9PSBudWxsKSB7XG4gICAgICBtLmZvckVhY2goKG1hdGNoLCBncm91cEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChncm91cEluZGV4ICE9IDApIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzW3BhcmFtc1RvQXR0cmlidXRlW2dyb3VwSW5kZXggLSAxXV0gPSBtYXRjaFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlc1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBNb3ZhYmxlIHtcbiAgY29uc3RydWN0b3IgKGVsZW0sIG9uQ2hhbmdlLCBheGlzID0gJ3gnLCBpbml0UG9zaXRpb24gPSAzMCwgb25EcmFnRW5kID0gKCkgPT4ge30pIHtcbiAgICB0aGlzLmF4aXMgPSBheGlzXG4gICAgdGhpcy5wb3MgPSBpbml0UG9zaXRpb25cbiAgICB0aGlzLmVsZW0gPSBlbGVtXG5cbiAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2VcbiAgICB0aGlzLm9uRHJhZ0VuZCA9IG9uRHJhZ0VuZFxuICAgIHRoaXMuZWxlbS5vbm1vdXNlZG93biA9IHRoaXMuZHJhZ01vdXNlRG93bi5iaW5kKHRoaXMpXG4gICAgdGhpcy5lbGVtLm9udG91Y2hzdGFydCA9IHRoaXMuZHJhZ01vdXNlRG93bi5iaW5kKHRoaXMpXG4gICAgdGhpcy5zZXRJbml0UG9zKGluaXRQb3NpdGlvbilcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMucG9zLCB0aGlzLmVsZW0uaWQpXG4gIH1cbiAgZHJhZ01vdXNlRG93biAoZSkge1xuICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudFxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIHRoaXMuY3VycmVudFNwYW4gPSBlLnRhcmdldFxuICAgIHRoaXMuY3VycmVudFNwYW4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJylcblxuICAgIGRvY3VtZW50Lm9ubW91c2V1cCA9IHRoaXMuY2xvc2VEcmFnRWxlbWVudC5iaW5kKHRoaXMpXG4gICAgZG9jdW1lbnQub250b3VjaGVuZCA9IHRoaXMuY2xvc2VEcmFnRWxlbWVudC5iaW5kKHRoaXMpXG5cbiAgICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IHRoaXMuZWxlbWVudERyYWcuYmluZCh0aGlzKVxuICAgIGRvY3VtZW50Lm9udG91Y2htb3ZlID0gdGhpcy5lbGVtZW50RHJhZy5iaW5kKHRoaXMpXG4gIH1cbiAgZWxlbWVudERyYWcgKGUpIHtcbiAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnRcbiAgICBpZiAodHlwZW9mIFRvdWNoRXZlbnQgIT09ICd1bmRlZmluZWQnICYmIGUgaW5zdGFuY2VvZiBUb3VjaEV2ZW50KSB7XG4gICAgICB2YXIgdG91Y2hvYmogPSBlLmNoYW5nZWRUb3VjaGVzWzBdIC8vIGZpcnN0IGZpbmdlclxuICAgICAgdGhpcy5zZXRQb3ModG91Y2hvYmouY2xpZW50WCwgdG91Y2hvYmouY2xpZW50WSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRQb3MoZS5jbGllbnRYLCBlLmNsaWVudFkpXG4gICAgfVxuICB9XG4gIHNldEluaXRQb3MocG9zKSB7XG4gICAgaWYgKHRoaXMuYXhpcyA9PSAneCcpIHtcbiAgICAgIHRoaXMuZWxlbS5zdHlsZS5sZWZ0ID0gcG9zICsgJyUnXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbS5zdHlsZS50b3AgPSBwb3MgKyAnJSdcbiAgICB9XG4gIH1cbiAgc2V0UG9zIChfcG9zWCwgX3Bvc1kpIHtcbiAgICBsZXQgYm94UmVjdCA9IHRoaXMuZWxlbS5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgaWYgKHRoaXMuYXhpcyA9PSAneCcpIHtcbiAgICAgIHRoaXMucG9zID0gdGhpcy52YWxCZXR3ZWVuKCgoX3Bvc1ggLSA1IC0gYm94UmVjdFsnbGVmdCddKS50b0ZpeGVkKDApICogMTAwIC8gYm94UmVjdFsnd2lkdGgnXSkudG9GaXhlZCgwKSwgMCwgMTAwKVxuICAgICAgdGhpcy5lbGVtLnN0eWxlLmxlZnQgPSB0aGlzLnBvcyArICclJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBvcyA9IHRoaXMudmFsQmV0d2VlbigoKF9wb3NZIC0gNSAtIGJveFJlY3RbJ3RvcCddKS50b0ZpeGVkKDApICogMTAwIC8gYm94UmVjdFsnaGVpZ2h0J10pLnRvRml4ZWQoMCksIDAsIDEwMClcbiAgICAgIHRoaXMuZWxlbS5zdHlsZS50b3AgPSB0aGlzLnBvcyArICclJ1xuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMucG9zLCB0aGlzLmVsZW0uaWQpXG4gIH1cblxuICBjbG9zZURyYWdFbGVtZW50ICgpIHtcbiAgICB0aGlzLmN1cnJlbnRTcGFuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpXG4gICAgdGhpcy5vbkRyYWdFbmQoKVxuICAgIGRvY3VtZW50Lm9ubW91c2V1cCA9IG51bGxcbiAgICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IG51bGxcbiAgICBkb2N1bWVudC5vbnRvdWNoZW5kID0gbnVsbFxuICAgIGRvY3VtZW50Lm9udG91Y2htb3ZlID0gbnVsbFxuICB9XG5cbiAgdmFsQmV0d2VlbiAodiwgbWluLCBtYXgpIHtcbiAgICByZXR1cm4gKE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCB2KSkpXG4gIH1cbn0iLCJpbXBvcnQgQWRqdXN0YWJsZUJveCBmcm9tICcuL2FkanVzdGFibGVfYm94J1xuaW1wb3J0IE1vdmFibGUgZnJvbSAnLi9tb3ZhYmxlJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGdWxsQ29udHJvbEJveCBleHRlbmRzIEFkanVzdGFibGVCb3gge1xuICBpbml0U3RhdGUgKHN0YXRlKSB7XG4gICAgbGV0IGRlZmF1bHRTdGF0ZSA9IHtcbiAgICAgIGxlZnQ6IDEwLFxuICAgICAgcmlnaHQ6IDEwLFxuICAgICAgdG9wOiAxMCxcbiAgICAgIGJvdHRvbTogMTAsXG4gICAgICBsZWZ0Qm90dG9tOiA5MCxcbiAgICAgIHJpZ2h0Qm90dG9tOiA5MCxcbiAgICAgIHRvcFJpZ2h0OiA5MCxcbiAgICAgIGJvdHRvbVJpZ2h0OiA5MCxcbiAgICAgIHdpZHRoOiAnJyxcbiAgICAgIGhlaWdodDogJycsXG4gICAgICBhZHZhbmNlZE1vZGU6IGZhbHNlXG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSA9PSBudWxsID8gZGVmYXVsdFN0YXRlIDogc3RhdGVcbiAgfVxuXG4gIGluaXRIYW5kbGVzIChtb3ZlYWJsZUVsZW1zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IG5ldyBNb3ZhYmxlKG1vdmVhYmxlRWxlbXMubGVmdCwgdGhpcy51cGRhdGVTdGF0ZS5iaW5kKHRoaXMpLCAneScsIHRoaXMuc3RhdGUubGVmdCwgdGhpcy5zYXZlVXJsUGFyYW1zLmJpbmQodGhpcykpLFxuICAgICAgcmlnaHQ6IG5ldyBNb3ZhYmxlKG1vdmVhYmxlRWxlbXMucmlnaHQsIHRoaXMudXBkYXRlU3RhdGUuYmluZCh0aGlzKSwgJ3knLCB0aGlzLnN0YXRlLnJpZ2h0LCB0aGlzLnNhdmVVcmxQYXJhbXMuYmluZCh0aGlzKSksXG4gICAgICB0b3A6IG5ldyBNb3ZhYmxlKG1vdmVhYmxlRWxlbXMudG9wLCB0aGlzLnVwZGF0ZVN0YXRlLmJpbmQodGhpcyksICd4JywgdGhpcy5zdGF0ZS50b3AsIHRoaXMuc2F2ZVVybFBhcmFtcy5iaW5kKHRoaXMpKSxcbiAgICAgIGJvdHRvbTogbmV3IE1vdmFibGUobW92ZWFibGVFbGVtcy5ib3R0b20sIHRoaXMudXBkYXRlU3RhdGUuYmluZCh0aGlzKSwgJ3gnLCB0aGlzLnN0YXRlLmJvdHRvbSwgdGhpcy5zYXZlVXJsUGFyYW1zLmJpbmQodGhpcykpLFxuICAgICAgbGVmdEJvdHRvbTogbmV3IE1vdmFibGUobW92ZWFibGVFbGVtcy5sZWZ0Qm90dG9tLCB0aGlzLnVwZGF0ZVN0YXRlLmJpbmQodGhpcyksICd5JywgdGhpcy5zdGF0ZS5sZWZ0Qm90dG9tLCB0aGlzLnNhdmVVcmxQYXJhbXMuYmluZCh0aGlzKSksXG4gICAgICByaWdodEJvdHRvbTogbmV3IE1vdmFibGUobW92ZWFibGVFbGVtcy5yaWdodEJvdHRvbSwgdGhpcy51cGRhdGVTdGF0ZS5iaW5kKHRoaXMpLCAneScsIHRoaXMuc3RhdGUucmlnaHRCb3R0b20sIHRoaXMuc2F2ZVVybFBhcmFtcy5iaW5kKHRoaXMpKSxcbiAgICAgIHRvcFJpZ2h0OiBuZXcgTW92YWJsZShtb3ZlYWJsZUVsZW1zLnRvcFJpZ2h0LCB0aGlzLnVwZGF0ZVN0YXRlLmJpbmQodGhpcyksICd4JywgdGhpcy5zdGF0ZS50b3BSaWdodCwgdGhpcy5zYXZlVXJsUGFyYW1zLmJpbmQodGhpcykpLFxuICAgICAgYm90dG9tUmlnaHQ6IG5ldyBNb3ZhYmxlKG1vdmVhYmxlRWxlbXMuYm90dG9tUmlnaHQsIHRoaXMudXBkYXRlU3RhdGUuYmluZCh0aGlzKSwgJ3gnLCB0aGlzLnN0YXRlLmJvdHRvbVJpZ2h0LCB0aGlzLnNhdmVVcmxQYXJhbXMuYmluZCh0aGlzKSlcbiAgICB9XG4gIH1cbiAgdXBkYXRlQm9yZGVyUmFkaXVzICgpIHtcbiAgICB2YXIgYnJkID0gdGhpcy5zdGF0ZS50b3AgKyAnJSAnXG4gICAgYnJkICs9ICgxMDAgLSB0aGlzLnN0YXRlLnRvcFJpZ2h0KSArICclICdcbiAgICBicmQgKz0gKDEwMCAtIHRoaXMuc3RhdGUuYm90dG9tUmlnaHQpICsgJyUgJ1xuICAgIGJyZCArPSB0aGlzLnN0YXRlLmJvdHRvbSArICclIC8gJ1xuICAgIGJyZCArPSB0aGlzLnN0YXRlLmxlZnQgKyAnJSAnXG4gICAgYnJkICs9IHRoaXMuc3RhdGUucmlnaHQgKyAnJSAnXG4gICAgYnJkICs9ICgxMDAgLSB0aGlzLnN0YXRlLnJpZ2h0Qm90dG9tKSArICclICdcbiAgICBicmQgKz0gKDEwMCAtIHRoaXMuc3RhdGUubGVmdEJvdHRvbSkgKyAnJSAnXG4gICAgdGhpcy5zaGFwZUVsZW0uc3R5bGVbJ2JvcmRlci1yYWRpdXMnXSA9IGJyZFxuICAgIHRoaXMuZ2VuZXJhdG9yRWxlbS5pbm5lckhUTUwgPSBicmRcbiAgfVxuICBzYXZlVXJsUGFyYW1zICgpIHtcbiAgICBjb25zdCB7IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgd2lkdGgsIGhlaWdodCwgbGVmdEJvdHRvbSwgdG9wUmlnaHQsIHJpZ2h0Qm90dG9tLCBib3R0b21SaWdodCB9ID0gdGhpcy5zdGF0ZVxuICAgIGxldCBoYXNoID0gYCR7bGVmdH0uJHt0b3B9LiR7cmlnaHR9LiR7Ym90dG9tfS0ke2xlZnRCb3R0b219LiR7dG9wUmlnaHR9LiR7cmlnaHRCb3R0b219LiR7Ym90dG9tUmlnaHR9LSR7aGVpZ2h0fS4ke3dpZHRofWBcbiAgICB0aGlzLnNldFVybEhhc2goaGFzaClcbiAgfVxufVxuIiwiaW1wb3J0ICcuL3Njc3MvbWFpbi5zY3NzJ1xuaW1wb3J0IEZ1bGxDb250cm9sQm94IGZyb20gXCIuL2pzL2Z1bGxfY29udHJvbF9ib3hcIjtcblxudmFyIG1vdmFibGVzID0ge1xuICBsZWZ0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGVmdCcpLFxuICByaWdodDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JpZ2h0JyksXG4gIGJvdHRvbTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdHRvbScpLFxuICB0b3A6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3AnKSxcbiAgbGVmdEJvdHRvbTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlZnRCb3R0b20nKSxcbiAgcmlnaHRCb3R0b206IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyaWdodEJvdHRvbScpLFxuICBib3R0b21SaWdodDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdHRvbVJpZ2h0JyksXG4gIHRvcFJpZ2h0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9wUmlnaHQnKVxufVxubGV0IHBhcmFtcyA9IEZ1bGxDb250cm9sQm94LmxvYWRVcmxQYXJhbXMod2luZG93LmxvY2F0aW9uLmhyZWYpXG52YXIgbXlCb3ggPSBuZXcgRnVsbENvbnRyb2xCb3goe21vdmVhYmxlRWxlbXM6IG1vdmFibGVzLCBpbml0U3RhdGU6IHBhcmFtc30pXG4iXSwic291cmNlUm9vdCI6IiJ9

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.